diff --git a/.github/workflows/deploy-site.yml b/.github/workflows/deploy-site.yml
index 41b7848..0ac4e6d 100644
--- a/.github/workflows/deploy-site.yml
+++ b/.github/workflows/deploy-site.yml
@@ -36,7 +36,7 @@ jobs:
- name: Upload artifact
uses: actions/upload-pages-artifact@v2
with:
- path: './site'
+ path: "./site"
- name: Deploy to GitHub Pages
id: deployment
uses: actions/deploy-pages@v2
diff --git a/Dockerfile b/Dockerfile
index 71d044a..9f2e6b0 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -2,7 +2,7 @@ FROM node:20-alpine3.17
RUN apk add zola
RUN npm install -g npm@10.1.0
-RUN yarn add tailwindcss@latest @tailwindcss/typography
+RUN yarn add tailwindcss@latest @tailwindcss/typography preline@latest
CMD ["zola"]
ENTRYPOINT [ "zola" ]
diff --git a/Makefile b/Makefile
index 17f6cb1..2b87e05 100644
--- a/Makefile
+++ b/Makefile
@@ -34,13 +34,15 @@ docker-publish: docker-build
### SITE ################################################################
#############################################################################
-build: docker-build tailwind-build clean
+zola-build: clean
@echo " >> Building site ..."
docker run \
-u "$(UID):$(GID)" -v $(PWD):$(MOUNT_DIR) --workdir $(MOUNT_DIR) $(DOCKER_FQN) \
build -o $(PUBLISH_DIR)
-serve: docker-build
+build: zola-build docker-build tailwind-build
+
+serve: tailwind-build docker-build
@echo " >> Running site ..."
@docker run \
-p 8080:8080 -p 1024:1024 \
@@ -109,15 +111,14 @@ spell-suggest:
TAILWIND_BASE = styles
TAILWIND_INPUT = $(TAILWIND_BASE)/site.css
TAILWIND_OUTPUT = static/css/site.css
+JS_OUTPUT = static/js/
-tailwind-setup: tailwind.config.js $(TAILWIND_BASE)/components
+tailwind-setup: tailwind.config.js $(JS_OUTPUT)/preline.js
-$(TAILWIND_BASE)/components:
- mkdir -p $(TAILWIND_BASE) && \
- cd $(TAILWIND_BASE) && \
- git clone git@github.com:merakiui/merakiui.git && \
- mv merakiui/components merakiui/assets . && \
- rm -rf merakiui
+$(JS_OUTPUT)/preline.js:
+ ID=$$(docker create $(DOCKER_FQN)) && \
+ docker cp $$ID:/node_modules/preline/dist/preline.js $(TAILWIND_BASE)/ && \
+ docker rm -v $$ID
tailwind.config.js:
docker run -it \
@@ -131,4 +132,5 @@ tailwind-build:
-v $(PWD):$(MOUNT_DIR) --workdir $(MOUNT_DIR) \
--entrypoint npx \
$(DOCKER_FQN) \
- tailwindcss -i $(TAILWIND_INPUT) -o $(TAILWIND_OUTPUT)
+ tailwindcss -i $(TAILWIND_INPUT) -o $(TAILWIND_OUTPUT) --minify
+ cp $(TAILWIND_BASE)/*.js $(JS_OUTPUT)
diff --git a/README.md b/README.md
index ac0ebe5..642a213 100644
--- a/README.md
+++ b/README.md
@@ -6,9 +6,7 @@ Visit lfe.io!
## Contributing
-Feel free to open a ticket
-or fork the site and submit a
-pull request.
+Feel free to [open a ticket](https://github.com/lfe/lfe.github.io/issues/new) or fork the site and submit a [pull request](https://github.com/lfe/lfe.github.io/pulls).
Note that the entire site content is driven with Markdown files -- *including* the metadata sections of those files!
@@ -54,3 +52,23 @@ You may want to check the spelling first, though:
```shell
make spell-check
```
+
+## Publishing to Staging
+
+The staging site is hosted in [another LFE repo](), and thus requires a custom remote URL to be added to your local git clone:
+
+```shell
+git remote add staging git@github.com:lfe/site-staging.git
+```
+
+With that in place, you can push your branch to that repo with:
+
+```shell
+git push staging
+```
+
+If you are pushing to a branch that is not the current default in staging, you'll want to change the default to your branch here:
+*
+
+The Github Actions for deploying the site is set to only trigger on the `main` branch, so you'll want to manually kick off a deploy, when you're ready (the "Run workflow" drop-down at the top):
+*
diff --git a/config.toml b/config.toml
index 0437d9a..eeff3cd 100644
--- a/config.toml
+++ b/config.toml
@@ -17,3 +17,10 @@ internal_level = "warn"
[extra]
# Put all your custom config variables here
+
+[extra.download]
+
+repository = "https://github.com/lfe/lfe"
+prior_release = "2.0.1"
+current_release = "2.1.2"
+pre_release = "refs/heads/develop"
diff --git a/content/_index.md b/content/_index.md
index 82d55d2..a9faeb6 100644
--- a/content/_index.md
+++ b/content/_index.md
@@ -72,15 +72,6 @@ What's "FOCAL"?
See?!
'''
-### Download Section ######################################
-
-[extra.download]
-
-repository = "https://github.com/lfe/lfe"
-prior_release = "2.0.1"
-current_release = "2.1.2"
-pre_release = "refs/heads/develop"
-
### Code Excerpts #########################################
[extra.excerpts]
@@ -339,68 +330,56 @@ title = "LFE Features"
[extra.features.erlang]
-title = '''
-
-
-Core Erlang Foundation
-'''
+title = "Core Erlang Foundation"
+icon = ""
content = '''
-All the benefits of Erlang with none of the Prolog:
+All the benefits of Erlang with none of the Prolog.
+
* No global data
* No mutable data
* Pattern matching and guards
* Compiler and interpreter
* Hot upgrading of deployed code
* The [Banarama of languages](https://www.youtube.com/watch?v=rRbY3TMUcgQ)
-
'''
link_text = "Learn More"
link_url = "#"
[extra.features.lisp]
-title = '''
-
-
-Alien Technology
-'''
+title = "Alien Technology"
+icon = ""
content = '''
It is an established fact that John McCarthy shared alien tech with the world in 1958 when he introduced us to Lisp. We continue that great tradition.
+
* Functions and variables with separate namespaces (LFE is a Lisp-2)
* Low-hygiene Macros
* Homoiconicity
* In-REPL Function and macro definitions
-
'''
link_text = "Learn More"
link_url = "#"
[extra.features.otp]
-title = '''
-
-
-[Utterly Terrifying](https://www.youtube.com/watch?v=rRbY3TMUcgQ)
-'''
+title = "[Utterly Terrifying](https://www.youtube.com/watch?v=rRbY3TMUcgQ)"
+icon = ""
content = '''
-The ability to generate distributed applications and full releases in mere minutes:
+The ability to generate distributed applications and full releases in mere minutes.
+
* Fault-tolerant
* Massively scalable
* Extreme Concurrency
* Soft real-time
* Open. Telecom. Platform.
-
'''
link_text = "Learn More"
link_url = "#"
[extra.features.lab]
-title = '''
-
-
-Language Lab
-'''
+title = "Language Lab"
+icon = ""
content = '''
The mad-scientist powers of a Lisp combined with the efficiency of the Actor Model and Erlang's light-weight processes.
@@ -418,8 +397,8 @@ link_url = "#"
[extra.buildit]
-title = '''
- Build It with LFE
+title = ' Build It with LFE'
+content = '''
'''
[extra.buildit.scripts]
@@ -430,8 +409,6 @@ In addition to all the heavy-duty power that LFE gets for free, by virtue of
the Erlang VM, you can also create small, easy-to-write one-off
`main` scripts, `lfescript`s, and even escripts -- either as a single file
or with additional modules to help organise those larger scripts.
-
-
'''
link_text = "Learn More"
link_url = "https://lfe.io/reference/lfe-rebar3/current/command-ref/projects/main.html"
@@ -455,10 +432,6 @@ content = '''
You can take advantage of OTP with LFE in mere seconds, creating fault-tolerant
applications with built-in process monitoring and supervision trees, so you
`gen_server`s (and all the other `behaviour`s, too) never go down.
-
-
-
-
'''
link_text = "Learn More"
link_url = "https://lfe.io/reference/lfe-rebar3/current/command-ref/projects/app.html"
@@ -471,10 +444,6 @@ When your LFE prototype is ready for the big-time, you can run it with all the
[sophisticated machinery](https://adoptingerlang.org/docs/production/releases/)
of an OTP release. In fact, you don't have to wait:
start your prototype as a release, with zero pain and all of the benefit.
-
-
-
-
'''
link_text = "Learn More"
link_url = "https://lfe.io/reference/lfe-rebar3/current/command-ref/projects/release.html"
@@ -504,82 +473,122 @@ TBD
[extra.books]
title = "Books"
+content = ""
+link_text = "View all books"
+link_url = "https://lfe.io/books/"
[extra.books.lfe_tutorial]
title = "The LFE Tutorial"
-content = '''
-[img-src]: https://lfe.io/books/tutorial/images/cover.jpg
+authors = "Robert Virding & Duncan McGreggor"
+cover = '''
+[img-src]: https://cnbbooks.github.io/lfe-tutorial/images/cover.jpg
[img-link]: https://lfe.io/books/tutorial/
[![lfe-tutorial][img-src]][img-link]
'''
+description = '''An LFE version of the classic 'Erlang Tutorial'
+'''
link_text = "Read Now"
link_url = "https://lfe.io/books/tutorial/"
[extra.books.casting_spels]
title = "Casting SPELs in LFE"
-content = '''
+authors = "Duncan McGreggor & Conrad Barski"
+cover = '''
[img-src]: https://lfe.io/books/casting-spels/images/cover.jpg
[img-link]: https://lfe.io/books/casting-spels/
[![casting-spels][img-src]][img-link]
'''
+description = '''Build a text-based adventure game in LFE!
+'''
link_text = "Read Now"
link_url = "https://lfe.io/books/casting-spels/"
[extra.books.quick_start]
title = "LFE Quick-Start"
-content = '''
+authors = "Duncan McGreggor"
+cover = '''
[img-src]: https://lfe.io/books/rebar3-quick-start/images/cover.jpg
[img-link]: https://lfe.io/books/rebar3-quick-start/
[![casting-spels][img-src]][img-link]
'''
+description = '''Get started with LFE using the `rebar3_lfe` project tooling plugin
+'''
link_text = "Read Now"
link_url = "https://lfe.io/books/rebar3-quick-start/"
[extra.books.rebar3]
title = "`rebar3_lfe` Command Reference"
-content = '''
+authors = "Duncan McGreggor"
+cover = '''
[img-src]: https://lfe.io/reference/lfe-rebar3/current/images/cover.jpg
[img-link]: https://lfe.io/reference/lfe-rebar3/
[![rebar3_lfe command reference][img-src]][img-link]
'''
+description = '''A helpful source of information for those who would like to take more advantage of the features provided by the `rebar3_lfe` plugin.
+'''
link_text = "Read Now"
link_url = "https://lfe.io/reference/lfe-rebar3/"
[extra.books.styleguide]
-title = "The LFE Style Guide"
-content = '''
+title = "The LFE Style Guide"
+authors = "Duncan McGreggor"
+cover = '''
[img-src]: https://lfe.io/books/style-guide/images/cover.jpg
[img-link]: https://lfe.io/books/style-guide/
[![The LFE Style Guide][img-src]][img-link]
'''
+description = '''Guidelines assembled from the Erlang and Lisp communities
+ '''
link_text = "Read Now"
link_url = "https://lfe.io/books/style-guide/"
[extra.books.sicp]
-title = "SICP The LFE Edition"
-content = '''
+title = "SICP: The LFE Edition"
+authors = "Gerald Sussman, Harold Abelson, & Duncan McGreggor"
+cover = '''
[img-src]: https://lfe.io/books/sicp/images/cover.jpg
[img-link]: https://lfe.io/books/sicp/
[![sicp][img-src]][img-link]
'''
+description = '''An LFE 'port' of the classic Scheme text
Note that, while the first section of the book is complete, the remaining sections have not been completed
+'''
link_text = "Read Now"
link_url = "https://lfe.io/books/sicp/"
+[extra.books.chineual]
+
+title = "LFE Chineual"
+authors = "Duncan McGreggor & Robert Virding"
+cover = '''
+[img-src]: https://cnbbooks.github.io/lfe-manual/images/cover.jpg
+[img-link]: https://lfe.io/books/chinenual/
+
+[![sicp][img-src]][img-link]
+'''
+description = '''A work in progress, this book aims to eventually be the complete manual for LFE
+'''
+link_text = "Read Now"
+link_url = "https://cnbbooks.github.io/lfe-manual/current/"
+
### Select Videos Section #################################
[extra.videos]
title = "Videos"
+content = ""
[extra.videos.ecu2016]
-title = "EUC 2016 Stockholm LFE: A Real Lisp in the Erlang Ecosystem Robert Virding"
+service_name = "YouTube"
+venue = "EUC 2016 Stockholm"
+title = "LFE: A Real Lisp in the Erlang Ecosystem"
+speaker = "Robert Virding"
content = '''
[img-src]: /images/EUC-2016-LFE.png
[img-link]: https://www.youtube.com/watch?v=x2ysisqgd2g
@@ -587,10 +596,15 @@ content = '''
'''
link_text = "Watch Now"
link_url = "https://www.youtube.com/watch?v=x2ysisqgd2g"
+channel_text = "Visit Channel"
+channel_url = "https://www.youtube.com/@ErlangSolutions"
[extra.videos.efsf2014]
-title = "Erlang Factory 2014 LFE from 0 to 120kph... in 45 Minutes Duncan McGreggor"
+service_name = "YouTube"
+venue = "Erlang Factory 2014"
+title = "LFE from 0 to 120kph... in 45 Minutes"
+speaker = "Duncan McGreggor"
content = '''
[img-src]: /images/EFSF-2014-LFE.png
[img-link]: https://www.youtube.com/watch?v=Dgbm3BRmzuI
@@ -598,10 +612,15 @@ content = '''
'''
link_text = "Watch Now"
link_url = "https://www.youtube.com/watch?v=Dgbm3BRmzuI"
+channel_text = "Visit Channel"
+channel_url = "https://www.youtube.com/@ErlangSolutions"
[extra.videos.efsf2017]
-title = "Erlang Factory 2017 Lisp Machine Flavors for LFE on OTP Robert Virding"
+service_name = "YouTube"
+venue = "Erlang Factory 2017"
+title = "Lisp Machine Flavors for LFE on OTP"
+speaker = "Robert Virding"
content = '''
[img-src]: /images/EFSF-2017-LFE.png
[img-link]: https://www.youtube.com/watch?v=AcehOqbwhPk
@@ -609,23 +628,19 @@ content = '''
'''
link_text = "Watch Now"
link_url = "https://www.youtube.com/watch?v=AcehOqbwhPk"
-
+channel_text = "Visit Channel"
+channel_url = "https://www.youtube.com/@ErlangSolutions"
### Final Callout-1 Section ###############################
[extra.callout1]
-title = " Join us on Discord!"
-content = '''
-
-To join the LFE conversations on Discord:
-
-* [https://discord.gg/Uf3PszVHtF](https://discord.gg/Uf3PszVHtF)
-'''
+title = " Join us on Discord!"
+content = "https://discord.gg/Uf3PszVHtF"
### Final Callout-2 Section ###############################
[extra.callout2]
-title = "Give yourself to the Lisp-side of the Force!"
+title = "Give yourself to the Lisp side of the Force!"
content = '''
[img-src]: /images/xkcd-lisp-cycles.png
[img-link]: http://xkcd.com/297/
@@ -635,12 +650,12 @@ content = '''
### Sponsors Section ###############################
[extra.sponsors]
-title = "A special thanks to our sponsor:"
+title = "A special thanks to our sponsors:"
-[extra.sponsors.billo]
+[extra.sponsors.tbd]
content = '''
-[img-src]: /images/billo-logo.png
-[img-link]: http://billo.systems
+[img-src]: /images/sponsor-logo.png
+[img-link]: http://sponsor.url
[![sponsor][img-src]][img-link]
'''
+++
diff --git a/content/about.md b/content/about.md
index c6e9f2f..86d2409 100644
--- a/content/about.md
+++ b/content/about.md
@@ -7,11 +7,11 @@ long_title = "About LFE"
long_description = "A small bit of background on the programming language."
+++
-# The Language
+## The Language
LFE is a Lisp-2+ written for the Erlang VM, providing 100% compatibility with Core Erlang. It is a proper, functional dialect of Lisp with a REPL and macros, as well as features inherited from Erlang, such as pattern pattern matching. Importantly, LFE boasts seamless interoperability with Erlang and the BEAM ecosystem of libraries. It not only has been used in stable production applications since 2015, it has also been employed by start-ups as their differentiating tech. LFE is flexible enough to be everything from your go-to scripting solution to your preferred syntax for massively scalable, soft-real time services.
-# A Short History
+## A Short History
While it is well-known the Robert Virding released the very first version of it in 2008, there was a little more initial whimsy associated with the decision to write the LFE programming language:
@@ -26,6 +26,6 @@ While it is well-known the Robert Virding released the very first version of it
> * I like implementing languages.
> * I also thought it would be a fun problem to solve. It contains many different parts and is quite open ended.
-# Its Creator
+## Its Creator
Robert Virding is one of the co-inventors of Erlang and was an early member of the Ericsson Computer Science Lab. He took part in the original system design and contributed much of the original libraries, as well as to the current compiler. He has always been interested in the design of languages and their implementation, particularly functional and logic languages. Robert has created several different languages in Erlang and on the Erlang system, which have had various levels of adoption around the world. He has also worked as an entrepreneur, having been one of the co-founders of one of the first Erlang startups (Bluetail). Additionally, Robert spent a number of years at the Swedish Defence Materiel Administration (FMV) Modelling and Simulations Group. He co-authored the first book on Erlang, published by Prentice-Hall, is now Principal Language Expert at Erlang Solutions Ltd., and is regularly invited to teach and present throughout the world.
diff --git a/content/community.md b/content/community.md
index 92cc097..19139e2 100644
--- a/content/community.md
+++ b/content/community.md
@@ -5,35 +5,52 @@ in_search_index = true
[extra]
long_title = "Community Resources"
long_description = "The LFE community is small but passionate; we are firm believers in the Erlang VM and OTP, usually as a result of having suffered greatly in their absence and knowing incredible strengths. Most of all, though, we have a deep appreciation for the aesthetics, usefulness, and raw power of LISP. This is where you will find us."
+
+++
-# Social Media
+## [Social Media](#social-media)
+
+ [LFE](https://fosstodon.org/web/@lfe) on Mastodon
+
+ Dedicated [LFE Slack workspace](https://lfe.slack.com/) (get an invite [here](https://erlef.org/slack-invite/lfe))
+
+ There's also an LFE channel on the official [Erlang Slack workspace](https://erlanger.slack.com) (get an invite [here](https://erlef.org/slack-invite/erlanger))
+
+ [LFE](https://www.linkedin.com/groups/5175516/)
+
+ [ErlangLisp](https://twitter.com/ErlangLisp)
+
+
+## [Traditional Media](#traditional-media)
+
+ The [LFE mail list](http://groups.google.com/group/lisp-flavoured-erlang) (Google group)
+
+ The `#erlang-lisp` channel on [Libera.chat](https://web.libera.chat/) (you'll need to [register your nick](https://libera.chat/guides/registration))
+
+ The [LFE Blog](https://blog.lfe.io)
+
+ [LFE on Wikipedia](https://en.wikipedia.org/wiki/LFE_(programming_language))
+
+## [Videos](#videos)
+
+ [LFE YouTube channel](https://www.youtube.com/channel/UCagyRA_kj8wCrfd-PLd5MaA/playlists)
+
+ Old [LFE YouTube channel](https://www.youtube.com/channel/UCrHLs2pNgg6DMsJXOiiBLcg/playlists)
+
+## [Repos, Code, & Container Images](#repos-code-container-images)
+
+ The [official LFE code repository](https://github.com/lfe/lfe)
-* [LFE](https://fosstodon.org/web/@lfe) on Mastodon
-* Dedicated [LFE Slack workspace](https://lfe.slack.com/) (get an invite [here](https://erlef.org/slack-invite/lfe))
-* There's also an LFE channel on the official [Erlang Slack workspace](https://erlanger.slack.com) (get an invite [here](https://erlef.org/slack-invite/erlanger))
-* [LFE](https://www.linkedin.com/groups/5175516/)
-* [ErlangLisp](https://twitter.com/ErlangLisp)
- * A Twitter [LFE list](https://twitter.com/i/lists/187981555) maintained by [@rvirding](https://twitter.com/rvirding)
- * A Twitter [Lisp list](https://twitter.com/i/lists/102271198) maintained by [@ErlangLisp](https://twitter.com/ErlangLisp)
+ The [lfe Github org](https://github.com/lfe) (docs, site, repo mirror, additional Docker support)
-# Traditional Media
+ The [lfex Github org](https://github.com/lfex) (LFE community libraries)
-* The [LFE mail list](http://groups.google.com/group/lisp-flavoured-erlang) (Google group)
-* The `#erlang-lisp` channel on [Libera.chat](https://web.libera.chat/) (you'll need to [register your nick](https://libera.chat/guides/registration))
-* The [LFE Blog](https://blog.lfe.io)
-* [LFE on Wikipedia](https://en.wikipedia.org/wiki/LFE_(programming_language))
+ The [lfe-rebar3 Github org](https://github.com/lfe-rebar3) (LFE rebar3 plugins)
-# Videos
+ [LFE on Rosetta Code](http://rosettacode.org/wiki/Category:LFE)
-* [LFE YouTube channel](https://www.youtube.com/channel/UCagyRA_kj8wCrfd-PLd5MaA/playlists)
-* Old [LFE YouTube channel](https://www.youtube.com/channel/UCrHLs2pNgg6DMsJXOiiBLcg/playlists)
+ A large collection of [LFE Docker images](https://hub.docker.com/u/lfex/)
-# Repos, Code, & Container Images
+
+
-* The [official LFE code repository](https://github.com/lfe/lfe)
-* The [lfe Github org](https://github.com/lfe) (docs, site, repo mirror, additional Docker support)
-* The [lfex Github org](https://github.com/lfex) (LFE community libraries)
-* The [lfe-rebar3 Github org](https://github.com/lfe-rebar3) (LFE rebar3 plugins)
-* [LFE on Rosetta Code](http://rosettacode.org/wiki/Category:LFE)
-* A large collection of [LFE Docker images](https://hub.docker.com/u/lfex/)
diff --git a/content/design/layout-home.md b/content/design/layout-home.md
deleted file mode 100644
index c538964..0000000
--- a/content/design/layout-home.md
+++ /dev/null
@@ -1,590 +0,0 @@
-+++
-title = "Site Design : Layout : Home"
-template = "design/layout-home.html"
-in_search_index = true
-
-[extra]
-long_title = "Site Design : Layout : Home"
-long_description = "The website for LFE, the Erlang community's own Lisp."
-
-### Title Section #########################################
-
-logo_image = "/images/LFE-logo-abbr-6.2.png"
-sitetagline = "MACLISP and supervision trees are all that anyone needs."
-
-#### Important!
-####
-#### The LFE landing page is a complex arrangement of various widgets
-#### which each need to pull their data from specific variables defined
-#### in this [extra] section of the Zola config.
-####
-#### Due to this wild variety on the home page, the actual Markdown
-#### content for this file isn't used; it's the metadata that fills
-#### all the home page widgets.
-####
-#### To make this easier to read, the variables have been grouped with
-#### their sections via comment dividers below.
-
-### Quotes ################################################
-
-quotes = '''
-LFE is a proper Lisp, 100% compatible with Core Erlang and able to take full
-advantage of OTP.
-
-Light-weight, massive concurrency.
-Fault tolerance.
-Continuous operation with no downtime.
-Full distributed systems.
-Asynchronous communication.
-Process isolation.
-Soft real-time.
-
-Immutable data.
-Fixed set of data types.
-Pattern matching.
-Functional programming language.
-Support for modules.
-No global data.
-
-Runs efficiently on the BEAM.
-Seamless Erlang interop, including the ecosystem of Erlang libraries.
-'''
-
-### Download Section ######################################
-
-[extra.download]
-
-repository = "https://github.com/lfe/lfe"
-stable_version = "1.2.1"
-unstable_version = "1.3"
-
-### Code Excerpts #########################################
-
-[extra.excerpts]
-
-[extra.excerpts.repl]
-
-name = "REPL"
-id = "repl"
-code_old = '''
-```text
-Erlang/OTP 23 [erts-11.0] [source] [64-bit] [smp:16:16] [ds:16:16:10] [async...
-
- ..-~.~_~---..
- ( \\ ) | A Lisp-2+ on the Erlang VM
- |`-.._/_\\_.-': | Type (help) for usage info.
- | g |_ \ |
- | n | | | Docs: http://docs.lfe.io/
- | a / / | Source: http://github.com/lfe/lfe
- \ l |_/ |
- \ r / | LFE v1.3-dev (abort with ^G)
- `-E___.-'
-
-lfe>
-
-```
-'''
-code = '''
-
-'''
-desc = '''
-LFE comes with a powerful REPL, supporting interactive development
-(including writing macros!) as well as running scripts or even evaluating
-arbitrary LFE code via the command line.
-'''
-
-[extra.excerpts.simple_types]
-
-name = "Simple Types"
-id = "core-types"
-code = '''
-```lisp
-lfe> (== 42 #b101010)
-true
-
-lfe> (integer_to_list 42 2)
-"101010"
-
-lfe> #\a
-97
-
-lfe> "regular string"
-"regular string"
-
-lfe> #"binary string"
-#"binary string"
-```
-'''
-desc = '''
-Note that in LFE and Erlang a string is really just a list of integers;
-there is no "string" type. There is, however, an "atom" type in LFE; this would be analogous to the Lisp symbol. For example, `'my-atom`, or if the atom has spaces in it, `'|my atom|`.
-'''
-
-[extra.excerpts.compound_types]
-
-name = "Compound Types"
-id = "data-struct"
-code = '''
-```lisp
-;; Lists
-lfe> '(a b c 1 2 5)
-(a b c 1 2 5)
-
-;; Tuples
-lfe> #("element 1" 2 elem-3)
-#("element 1" 2 elem-3)
-
-;; Maps
-lfe> #m(key1 "value 1"
- "key 2" value-2)
-#M("key 2" value-2 key1 "value 1")
-
-
-```
-'''
-desc = '''
-In LFE lists are like they are in a Lisp (except they also include
-strings). Additionally, LFE has tuples (Lisp vectors) and maps
-(Lisp has tables). LFE has property lists, dicts, and ordered dicts
-from Erlang, supported via additional libraries.
-'''
-
-[extra.excerpts.records]
-
-name = "Records"
-id = "records"
-code = '''
-```lisp
-;; Defining a record automatically generates a set of
-;; useful functions for that particular record.
-lfe> (defrecord person
- name
- address
- age)
-set-person-age
-
-;; Use the generated record constructor:
-lfe> (make-person name "Ford Prefect"
- address "Betelgeuse Seven"
- age 234))
-#(person "Ford Prefect" "Betelgeuse Seven" 234)
-
-```
-'''
-desc = '''
-Like all data in LFE, records can be pattern-matched. Pattern matching
-on record field names and data in function arguments is an extremely powerful
-capability provided to developers.
-'''
-
-[extra.excerpts.funcs]
-
-name = "Functions"
-id = "funcs"
-code = '''
-```lisp
-;; A recursive function with pattern matching:
-lfe> (defun ackermann
- ((0 n) (+ n 1))
- ((m 0) (ackermann (- m 1) 1))
- ((m n) (ackermann (- m 1)
- (ackermann m (- n 1)))))
-
-;; Call the function
-lfe> (ackermann 3 4)
-125
-
-;; Apply the function
-lfe> (funcall #'ackermann/2 3 4))
-125
-```
-'''
-desc = '''
-As well as supporting the standard Lisp syntax for `defun`,
-LFE functions support pattern matching in arguments, allowing you to create
-concise, expressive, and elegant code.
-'''
-
-[extra.excerpts.macros]
-
-name = "Macros"
-id = "macros"
-code = '''
-```lisp
-;; LFE and Erlang do not support n-arity functions, but
-;; you can write a Lisp macro to get around that :-)
-(defmacro mean args
- `(/ (lists:sum ,args)
- ,(length args)))
-
-;; Use the macro with different numbers of arguments:
-lfe> (mean 1)
-1.0
-lfe> (mean 1 2)
-1.5
-lfe> (mean 1 2 3 4 5 6 42 108)
-21.375
-
-```
-'''
-desc = '''
-LFE macros are unhygenic, but with scoped variables. There is no `gensym` in
-LFE due to this being unsafe in long-lived, distributed code (LFE supports
-sharing code with remote nodes). With the exception of running in the REPL,
-macros are only compile-time.
-'''
-
-[extra.excerpts.erlang_interop]
-
-name = "Erlang Interop"
-id = "erl"
-code = '''
-```lisp
-lfe> (lists:reverse
- (erlang:integer_to_list
- (lists:foldl #'*/2 1 '(1 2 3 4))))
-"42"
-
-lfe> (supervisor:which_children 'kernel_sup)
-(#(logger_sup #Pid<0.70.0> supervisor (logger_sup))
- #(kernel_safe_sup #Pid<0.69.0> supervisor (kernel))
- #(kernel_refc #Pid<0.68.0> worker (kernel_refc))
- #(kernel_config #Pid<0.67.0> worker (kernel_config))
- #(user #Pid<0.63.0> supervisor (user_sup))
- #(standard_error #Pid<0.61.0> supervisor (standard_error))
- #(erl_signal_server #Pid<0.60.0> worker dynamic)
- ...)
-```
-'''
-desc = '''
-Here we have two examples of directly calling Erlang functions
-from LFE. First, we're "folding" (a.k.a "reducing") over a list
-of items, multiplying them by the accumulated value, and then further
-transforming using other Erlang functions. Then we are calling an
-Erlang function to get information about a particular supervision tree.
-'''
-
-[extra.excerpts.otp]
-
-name = "OTP"
-id = "otp"
-code = '''
-```lisp
-(defmodule server
- (behaviour gen_server)
- (export
- (start_link 0)
- (stop 0)
- ...))
-
-(defun handle_call
- (('amount _caller state-data)
- `#(reply ,state-data ,state-data))
- (('stop _caller state-data)
- `#(stop shutdown ok state-data))
- ((message _caller state-data)
- `#(reply ,(unknown-command) ,state-data)))
-```
-'''
-desc = '''
-OTP is what you use when you need to create industrial grade applications
-and services; there's nothing quite like it in the programming world. As
-such, it has inspired countless imitations in a great many other programming
-languages.
-'''
-
-### Summary ###############################################
-
-[extra.summary]
-
-content = '''
-LFE is not a casual Lisp. It's a Lisp for those who want to build distributed
- applications -- like the Erlang software that powers 40% of the world's telecommunications.
-'''
-link_text = "Learn More"
-link_url = "#"
-
-### Why LFE? Section ######################################
-
-[extra.whylfe]
-
-### Features Section ######################################
-
-[extra.features]
-title = "LFE Features"
-
-[extra.features.erlang]
-
-title = '''
-
-
-Core Erlang Foundation
-'''
-content = '''
-All the benefits of Erlang with none of the Prolog:
-* No global data
-* No mutable data
-* Pattern matching and guards
-* Compiler and interpreter
-* Hot upgrading of deployed code
-* The [Banarama of languages](https://www.youtube.com/watch?v=rRbY3TMUcgQ)
-
-'''
-link_text = "Learn More"
-link_url = "#"
-
-[extra.features.lisp]
-
-title = '''
-
-
-Alien Technology
-'''
-content = '''
-It is an established fact that John McCarthy shared alien tech with the world in 1958 when he introduced us to Lisp. We continue that great tradition.
-* Functions and variables with separate namespaces (LFE is a Lisp-2)
-* Low-hygiene Macros
-* Homoiconicity
-* In-REPL Function and macro definitions
-
-'''
-link_text = "Learn More"
-link_url = "#"
-
-[extra.features.otp]
-
-title = '''
-
-
-[Utterly Terrifying](https://www.youtube.com/watch?v=rRbY3TMUcgQ)
-'''
-content = '''
-The ability to generate distributed applications and full releases in mere minutes:
-* Fault-tolerant
-* Massively scalable
-* Extreme Concurrency
-* Soft real-time
-* Open. Telecom. Platform.
-
-'''
-link_text = "Learn More"
-link_url = "#"
-
-[extra.features.lab]
-
-title = '''
-
-
-Language Lab
-'''
-content = '''
-The mad-scientist powers of a Lisp combined with the efficiency of the Actor Model and Erlang's light-weight processes.
-
-* Experiment with creating distributed systems in new ways.
-* Create DSLs on-demand.
-* Take advantage of 1000s of cores without having to change your code.
-* Easily write your own compilers.
-'''
-link_text = "Learn More"
-link_url = "#"
-
-### News Section ##########################################
-
-### What You Can Build Section ############################
-
-[extra.buildit]
-
-title = "Build It with LFE"
-
-[extra.buildit.scripts]
-
-title = "Scripts"
-content = '''
-`main` scripts, `lfescript`s, escripts
-'''
-link_text = "Learn More"
-link_url = "#"
-
-[extra.buildit.libraries]
-
-title = "Stand-alone Libraries"
-content = '''
-TBD
-'''
-link_text = "Learn More"
-link_url = "#"
-
-[extra.buildit.apps]
-
-title = "OTP Applications"
-content = '''
-TBD
-'''
-link_text = "Learn More"
-link_url = "#"
-
-[extra.buildit.releases]
-
-title = "OTP Releases"
-content = '''
-TBD
-'''
-link_text = "Learn More"
-link_url = "#"
-
-### News Section ##########################################
-
-[extra.news]
-
-title = "News Items"
-
-[extra.news.news1]
-
-title = "TBD"
-content = '''
-TBD
-'''
-
-[extra.news.news2]
-
-title = "TBD"
-content = '''
-TBD
-'''
-
-### Select Books Section ##################################
-
-[extra.books]
-
-title = "Books"
-
-[extra.books.lfe_tutorial]
-
-title = "The LFE Tutorial"
-content = '''
-[img-src]: http://lfe.io/books/tutorial/images/cover.jpg
-[img-link]: http://lfe.io/books/tutorial/
-[![lfe-tutorial][img-src]][img-link]
-'''
-link_text = "Read Now"
-link_url = "http://lfe.io/books/tutorial/"
-
-[extra.books.casting_spels]
-
-title = "Casting SPELs in LFE"
-content = '''
-[img-src]: http://lfe.io/books/casting-spels/images/cover.jpg
-[img-link]: http://lfe.io/books/casting-spels/
-[![casting-spels][img-src]][img-link]
-'''
-link_text = "Read Now"
-link_url = "http://lfe.io/books/casting-spels/"
-
-[extra.books.quick_start]
-
-title = "LFE Quick-Start"
-content = '''
-[img-src]: http://lfe.io/books/rebar3-quick-start/images/cover.jpg
-[img-link]: http://lfe.io/books/rebar3-quick-start/
-[![casting-spels][img-src]][img-link]
-'''
-link_text = "Read Now"
-link_url = "http://lfe.io/books/rebar3-quick-start/"
-
-[extra.books.rebar3]
-
-title = "`rebar3_lfe` Command Reference"
-content = '''
-[img-src]: https://lfe.io/reference/lfe-rebar3/current/images/cover.jpg
-[img-link]: https://lfe.io/reference/lfe-rebar3/
-[![rebar3_lfe command reference][img-src]][img-link]
-'''
-link_text = "Read Now"
-link_url = "https://lfe.io/reference/lfe-rebar3/"
-
-[extra.books.unknown]
-
-title = ""
-content = '''
-[img-src]:
-[img-link]:
-[![XXX][img-src]][img-link]
-'''
-link_text = "Read Now"
-link_url = ""
-
-[extra.books.sicp]
-
-title = "SICP The LFE Edition"
-content = '''
-[img-src]: http://lfe.io/books/sicp/images/cover.jpg
-[img-link]: http://lfe.io/books/sicp/
-[![sicp][img-src]][img-link]
-'''
-link_text = "Read Now"
-link_url = "http://lfe.io/books/sicp/"
-
-### Select Videos Section #################################
-
-[extra.videos]
-
-title = "Videos"
-
-[extra.videos.ecu2016]
-
-title = "EUC 2016 Stockholm LFE: A Real Lisp in the Erlang Ecosystem Robert Virding"
-content = '''
-[img-src]: /images/EUC-2016-LFE.png
-[img-link]: https://www.youtube.com/watch?v=x2ysisqgd2g
-[![LFE EUC 2016][img-src]][img-link]
-'''
-link_text = "Watch Now"
-link_url = "https://www.youtube.com/watch?v=x2ysisqgd2g"
-
-[extra.videos.efsf2014]
-
-title = "Erlang Factory 2014 LFE from 0 to 120kph... in 45 Minutes Duncan McGreggor"
-content = '''
-[img-src]: /images/EFSF-2014-LFE.png
-[img-link]: https://www.youtube.com/watch?v=Dgbm3BRmzuI
-[![LFE EFSF 2014][img-src]][img-link]
-'''
-link_text = "Watch Now"
-link_url = "https://www.youtube.com/watch?v=Dgbm3BRmzuI"
-
-[extra.videos.efsf2017]
-
-title = "Erlang Factory 2017 Lisp Machine Flavors for LFE on OTP Robert Virding"
-content = '''
-[img-src]: /images/EFSF-2017-LFE.png
-[img-link]: https://www.youtube.com/watch?v=AcehOqbwhPk
-[![LFE EFSF 2017][img-src]][img-link]
-'''
-link_text = "Watch Now"
-link_url = "https://www.youtube.com/watch?v=AcehOqbwhPk"
-
-
-### Final Callout-1 Section ###############################
-
-[extra.callout1]
-title = " Join us on Slack!"
-content = '''
-
-To request an invite for the LFE Slack workspace, follow this link:
-
-* [https://lfe-slack.herokuapp.com/](https://lfe-slack.herokuapp.com/)
-'''
-
-### Final Callout-2 Section ###############################
-
-[extra.callout2]
-title = "Give yourself to the Lisp-side of the Force!"
-content = '''
-[img-src]: /images/xkcd-lisp-cycles.png
-[img-link]: http://xkcd.com/297/
-[![call-out content][img-src]][img-link]
-'''
-
-+++
-
-Layout for the home page.
diff --git a/content/design/widgets.md b/content/design/widgets.md
deleted file mode 100644
index c52a329..0000000
--- a/content/design/widgets.md
+++ /dev/null
@@ -1,15 +0,0 @@
-+++
-title = "Site Design : Widgets"
-template = "design/widgets.html"
-
-[extra]
-long_title = "Site Design : Widgets"
-long_description = ""
-
-[extra.page]
-title = "Site Design : Widgets"
-description = ""
-
-+++
-
-Bootstrap widget reference for the site design/styles.
diff --git a/content/learn.md b/content/learn.md
index ebcf4ef..65244ba 100644
--- a/content/learn.md
+++ b/content/learn.md
@@ -8,8 +8,6 @@ long_description = "Learning LFE must be taken in two tracks: learning the synta
+++
-# LFE
-
## [Quick Start Guides](#quick-start-guides)
[Quick Start with rebar3](https://lfe.io/books/rebar3-quick-start/) - This will get you up and running with LFE, requiring _only_ that you have a modern Erlang installed (version 21+) and `rebar3`.
@@ -32,39 +30,38 @@ Once you've learned the syntax and the underlying principles of the Erlang VM, y
[The community](/community) will be an invaluable resource in your journey of learning, to be sure to stop in whatever medium makes you happy, say "hi" and ask us lots of questions!
-# Erlang
+
+## Erlang
There are some phenomenal materials available for a self-paced Erlang/OTP education. Some of the classics are given below. For those with bigger budgets, remember that formal training is also an option! (In fact, there are not only classes offered for Erlang, but also LFE ...)
-## The Language
+### The Language
[Learn You Some Erlang for Great Good!](https://learnyousomeerlang.com/) - Probably one of the best (and _definitely_ the most fun) books available for learning Erlang. (Also available [in print](https://nostarch.com/erlang).)
-## OTP
+### OTP
[Designing for Scalability with Erlang/OTP](https://www.oreilly.com/library/view/designing-for-scalability/9781449361556/) - The thinking person's OTP book: where to go when you really want to understand OTP.
[Erlang and OTP in Action](https://www.manning.com/books/erlang-and-otp-in-action) - This book is another fantastic resource, building up an OTP application piece at a time as you move through the chapters.
-## In Production
+### In Production
Once you've learned how to write Erlang/LFE/OTP applications, is time to get them into production, and you'll find the following invaluable references for that:
* [Adopting Erlang](https://adoptingerlang.org/) - _"Adopting Erlang is an ongoing effort to gather all the resources that will help you use Erlang in a business. The booksite is divided in three sections focusing particularly on Erlang/OTP’s higher level concepts in the current open source ecosystem, how to use it in production (while setting up a pipeline for continuous development and delivery), and how to build a team when you’re starting from scratch."_
* [Stuff Goes Bad - Erlang in Anger](https://erlang-in-anger.com/) - _"This book intends to be a little guide about how to be the Erlang medic in a time of war. It is first and foremost a collection of tips and tricks to help understand where failures come from, and a dictionary of different code snippets and practices that helped developers debug production systems that were built in Erlang."_
-# Lisp Arcana
+## Lisp Arcana
In the event that you want to dive deeper into the world of Lisp itself, there are several excellent texts to explore.
-## Lisp Internals
+### Lisp Internals
* [Lisp in Small Pieces](https://www.cambridge.org/core/books/lisp-in-small-pieces/66FD2BE3EDDDC68CA87D652C82CF849E) - _"This is a comprehensive account of the semantics and the implementation of the whole Lisp family of languages, namely Lisp, Scheme and related dialects. It describes 11 interpreters and 2 compilers, including very recent techniques of interpretation and compilation."_
-
* [Let Over Lambda—50 Years of Lisp](https://letoverlambda.com/) - _"Starting with the fundamentals, it describes the most advanced features of the most advanced language: COMMON LISP. The point of this book is to expose you to ideas that you might otherwise never be exposed to. This book is about macros, that is programs that write programs. Macros are what make lisp the greatest programming language in the world. When used properly, macros enable amazing feats of abstraction, programmer productivity, and code efficiency and security that are unheard of elsewhere. Macros let you do things you simply cannot do in other languages."_
-## Lisp Reference
+### Lisp Reference
* [Common Lisp HyperSpec](http://www.lispworks.com/documentation/HyperSpec/Front/Contents.htm) - This is the definitive reference manual for the Common Lisp standard. The LFE core contributors have made nearly constant reference (and deference) to this document in the course of implementing features in LFE.
-
* [The Moonual](http://www.softwarepreservation.org/projects/LISP/MIT/Moon-MACLISP_Reference_Manual-Apr_08_1974.pdf) - This is a bit of computing history that not many are aware of: the manual for [MACLISP](https://en.wikipedia.org/wiki/Maclisp) written by David Moon. This is of interest to LFE developers due to the influence it has had upon the design and development of LFE. LFE actually derives most of it Lisp nature due to the experiences Robert Virding had as a physics PhD student who programmed in MACLISP on university machines. Even since then, we have constantly referenced the Moonual, almost as much as the Common Lisp HyperSpec (and in some cases, more!). It is of particular interest that the MAC project at MIT not only gave birth to MACLISP, but also [MACSYMA](https://en.wikipedia.org/wiki/Macsyma) (originally written in MACLISP, since ported to Common Lisp) which significantly influenced the development of Mathematica.
diff --git a/content/plan/_index.md b/content/plan/_index.md
index ee781ed..4f98cad 100644
--- a/content/plan/_index.md
+++ b/content/plan/_index.md
@@ -18,10 +18,8 @@ Find out what's going on for the developers in the community
* [oubiwann](/plan/oubiwann)
* [yurrriq](/plan/yurrriq)
-
Wnat to share what you're working on? Add your .plan!
-
[//]: ---Named-Links---
[screenie-src]: /images/lfe-dotplan-screen.png
diff --git a/content/use.md b/content/use.md
index 481e825..7361868 100644
--- a/content/use.md
+++ b/content/use.md
@@ -8,8 +8,6 @@ long_description = "LFE may be used as a shell, for scripting; as a development
+++
-# LFE
-
## The REPL
As you get to know LFE, you'll find that you'll do a lot of your prototyping in the REPL. There are three primary ways you can do this:
@@ -49,7 +47,7 @@ There is a newer version of the docs site whose development has been stalled. Th
* [docs.lfe.io/dev/](https://docs.lfe.io/dev/index.html)
-# Erlang
+## Erlang
[Erlang Run-Time System Application (ERTS) Reference Manual](http://erlang.org/doc/apps/erts/index.html) - As an LFE programmer, this is one of the most powerful reference resources you can have at your fingertips. Once you get to the point to where you are ready to build production-ready applications, this will be a constant companion. In particular:
@@ -65,7 +63,7 @@ If you will be interfacing with other languages, then these resources will be of
* The [Ports and Port Drivers](https://erlang.org/doc/reference_manual/ports.html) reference and the [Erlang Interop/Ports User Guide](http://erlang.org/doc/tutorial/c_port.html)
* The [Jinterface package](http://erlang.org/doc/apps/jinterface/jinterface_users_guide.html) and the [Jinterface Reference Manual](http://erlang.org/doc/apps/jinterface/index.html)
-# rebar3
+## rebar3
One of the things you might find yourself needing is specialised `rebar3` plugins for your various LFE projects. You may write these in either Erlang or LFE (or, in fact, any BEAM language that has a `rebar3` compiler). There are a ton of good resources on the rebar3 project site, including:
diff --git a/sass/bootstrap-grid.scss b/sass/bootstrap-grid.scss
deleted file mode 100755
index 30f5f23..0000000
--- a/sass/bootstrap-grid.scss
+++ /dev/null
@@ -1,29 +0,0 @@
-/*!
- * Bootstrap Grid v4.5.0 (https://getbootstrap.com/)
- * Copyright 2011-2020 The Bootstrap Authors
- * Copyright 2011-2020 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-html {
- box-sizing: border-box;
- -ms-overflow-style: scrollbar;
-}
-
-*,
-*::before,
-*::after {
- box-sizing: inherit;
-}
-
-@import "bootstrap/functions";
-@import "bootstrap/variables";
-
-@import "bootstrap/mixins/breakpoints";
-@import "bootstrap/mixins/grid-framework";
-@import "bootstrap/mixins/grid";
-
-@import "bootstrap/grid";
-@import "bootstrap/utilities/display";
-@import "bootstrap/utilities/flex";
-@import "bootstrap/utilities/spacing";
diff --git a/sass/bootstrap-reboot.scss b/sass/bootstrap-reboot.scss
deleted file mode 100755
index 4a192bd..0000000
--- a/sass/bootstrap-reboot.scss
+++ /dev/null
@@ -1,12 +0,0 @@
-/*!
- * Bootstrap Reboot v4.5.0 (https://getbootstrap.com/)
- * Copyright 2011-2020 The Bootstrap Authors
- * Copyright 2011-2020 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * Forked from Normalize.css, licensed MIT (https://github.com/necolas/normalize.css/blob/master/LICENSE.md)
- */
-
-@import "bootstrap/functions";
-@import "bootstrap/variables";
-@import "bootstrap/mixins";
-@import "bootstrap/reboot";
diff --git a/sass/bootstrap.scss b/sass/bootstrap.scss
deleted file mode 100755
index baca8c3..0000000
--- a/sass/bootstrap.scss
+++ /dev/null
@@ -1,44 +0,0 @@
-/*!
- * Bootstrap v4.5.0 (https://getbootstrap.com/)
- * Copyright 2011-2020 The Bootstrap Authors
- * Copyright 2011-2020 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- */
-
-@import "bootstrap/functions";
-@import "bootstrap/variables";
-@import "bootstrap/mixins";
-@import "bootstrap/root";
-@import "bootstrap/reboot";
-@import "bootstrap/type";
-@import "bootstrap/images";
-@import "bootstrap/code";
-@import "bootstrap/grid";
-@import "bootstrap/tables";
-@import "bootstrap/forms";
-@import "bootstrap/buttons";
-@import "bootstrap/transitions";
-@import "bootstrap/dropdown";
-@import "bootstrap/button-group";
-@import "bootstrap/input-group";
-@import "bootstrap/custom-forms";
-@import "bootstrap/nav";
-@import "bootstrap/navbar";
-@import "bootstrap/card";
-@import "bootstrap/breadcrumb";
-@import "bootstrap/pagination";
-@import "bootstrap/badge";
-@import "bootstrap/jumbotron";
-@import "bootstrap/alert";
-@import "bootstrap/progress";
-@import "bootstrap/media";
-@import "bootstrap/list-group";
-@import "bootstrap/close";
-@import "bootstrap/toasts";
-@import "bootstrap/modal";
-@import "bootstrap/tooltip";
-@import "bootstrap/popover";
-@import "bootstrap/carousel";
-@import "bootstrap/spinners";
-@import "bootstrap/utilities";
-@import "bootstrap/print";
diff --git a/sass/bootstrap/_alert.scss b/sass/bootstrap/_alert.scss
deleted file mode 100755
index da2a98a..0000000
--- a/sass/bootstrap/_alert.scss
+++ /dev/null
@@ -1,51 +0,0 @@
-//
-// Base styles
-//
-
-.alert {
- position: relative;
- padding: $alert-padding-y $alert-padding-x;
- margin-bottom: $alert-margin-bottom;
- border: $alert-border-width solid transparent;
- @include border-radius($alert-border-radius);
-}
-
-// Headings for larger alerts
-.alert-heading {
- // Specified to prevent conflicts of changing $headings-color
- color: inherit;
-}
-
-// Provide class for links that match alerts
-.alert-link {
- font-weight: $alert-link-font-weight;
-}
-
-
-// Dismissible alerts
-//
-// Expand the right padding and account for the close button's positioning.
-
-.alert-dismissible {
- padding-right: $close-font-size + $alert-padding-x * 2;
-
- // Adjust close link position
- .close {
- position: absolute;
- top: 0;
- right: 0;
- padding: $alert-padding-y $alert-padding-x;
- color: inherit;
- }
-}
-
-
-// Alternate styles
-//
-// Generate contextual modifier classes for colorizing the alert.
-
-@each $color, $value in $theme-colors {
- .alert-#{$color} {
- @include alert-variant(theme-color-level($color, $alert-bg-level), theme-color-level($color, $alert-border-level), theme-color-level($color, $alert-color-level));
- }
-}
diff --git a/sass/bootstrap/_badge.scss b/sass/bootstrap/_badge.scss
deleted file mode 100755
index 42c5d08..0000000
--- a/sass/bootstrap/_badge.scss
+++ /dev/null
@@ -1,54 +0,0 @@
-// Base class
-//
-// Requires one of the contextual, color modifier classes for `color` and
-// `background-color`.
-
-.badge {
- display: inline-block;
- padding: $badge-padding-y $badge-padding-x;
- @include font-size($badge-font-size);
- font-weight: $badge-font-weight;
- line-height: 1;
- text-align: center;
- white-space: nowrap;
- vertical-align: baseline;
- @include border-radius($badge-border-radius);
- @include transition($badge-transition);
-
- @at-root a#{&} {
- @include hover-focus() {
- text-decoration: none;
- }
- }
-
- // Empty badges collapse automatically
- &:empty {
- display: none;
- }
-}
-
-// Quick fix for badges in buttons
-.btn .badge {
- position: relative;
- top: -1px;
-}
-
-// Pill badges
-//
-// Make them extra rounded with a modifier to replace v3's badges.
-
-.badge-pill {
- padding-right: $badge-pill-padding-x;
- padding-left: $badge-pill-padding-x;
- @include border-radius($badge-pill-border-radius);
-}
-
-// Colors
-//
-// Contextual variations (linked badges get darker on :hover).
-
-@each $color, $value in $theme-colors {
- .badge-#{$color} {
- @include badge-variant($value);
- }
-}
diff --git a/sass/bootstrap/_breadcrumb.scss b/sass/bootstrap/_breadcrumb.scss
deleted file mode 100755
index a0cf7e2..0000000
--- a/sass/bootstrap/_breadcrumb.scss
+++ /dev/null
@@ -1,44 +0,0 @@
-.breadcrumb {
- display: flex;
- flex-wrap: wrap;
- padding: $breadcrumb-padding-y $breadcrumb-padding-x;
- margin-bottom: $breadcrumb-margin-bottom;
- @include font-size($breadcrumb-font-size);
- list-style: none;
- background-color: $breadcrumb-bg;
- @include border-radius($breadcrumb-border-radius);
-}
-
-.breadcrumb-item {
- display: flex;
-
- // The separator between breadcrumbs (by default, a forward-slash: "/")
- + .breadcrumb-item {
- padding-left: $breadcrumb-item-padding;
-
- &::before {
- display: inline-block; // Suppress underlining of the separator in modern browsers
- padding-right: $breadcrumb-item-padding;
- color: $breadcrumb-divider-color;
- content: escape-svg($breadcrumb-divider);
- }
- }
-
- // IE9-11 hack to properly handle hyperlink underlines for breadcrumbs built
- // without `
`s. The `::before` pseudo-element generates an element
- // *within* the .breadcrumb-item and thereby inherits the `text-decoration`.
- //
- // To trick IE into suppressing the underline, we give the pseudo-element an
- // underline and then immediately remove it.
- + .breadcrumb-item:hover::before {
- text-decoration: underline;
- }
- // stylelint-disable-next-line no-duplicate-selectors
- + .breadcrumb-item:hover::before {
- text-decoration: none;
- }
-
- &.active {
- color: $breadcrumb-active-color;
- }
-}
diff --git a/sass/bootstrap/_button-group.scss b/sass/bootstrap/_button-group.scss
deleted file mode 100755
index da02d79..0000000
--- a/sass/bootstrap/_button-group.scss
+++ /dev/null
@@ -1,163 +0,0 @@
-// stylelint-disable selector-no-qualifying-type
-
-// Make the div behave like a button
-.btn-group,
-.btn-group-vertical {
- position: relative;
- display: inline-flex;
- vertical-align: middle; // match .btn alignment given font-size hack above
-
- > .btn {
- position: relative;
- flex: 1 1 auto;
-
- // Bring the hover, focused, and "active" buttons to the front to overlay
- // the borders properly
- @include hover() {
- z-index: 1;
- }
- &:focus,
- &:active,
- &.active {
- z-index: 1;
- }
- }
-}
-
-// Optional: Group multiple button groups together for a toolbar
-.btn-toolbar {
- display: flex;
- flex-wrap: wrap;
- justify-content: flex-start;
-
- .input-group {
- width: auto;
- }
-}
-
-.btn-group {
- // Prevent double borders when buttons are next to each other
- > .btn:not(:first-child),
- > .btn-group:not(:first-child) {
- margin-left: -$btn-border-width;
- }
-
- // Reset rounded corners
- > .btn:not(:last-child):not(.dropdown-toggle),
- > .btn-group:not(:last-child) > .btn {
- @include border-right-radius(0);
- }
-
- > .btn:not(:first-child),
- > .btn-group:not(:first-child) > .btn {
- @include border-left-radius(0);
- }
-}
-
-// Sizing
-//
-// Remix the default button sizing classes into new ones for easier manipulation.
-
-.btn-group-sm > .btn { @extend .btn-sm; }
-.btn-group-lg > .btn { @extend .btn-lg; }
-
-
-//
-// Split button dropdowns
-//
-
-.dropdown-toggle-split {
- padding-right: $btn-padding-x * .75;
- padding-left: $btn-padding-x * .75;
-
- &::after,
- .dropup &::after,
- .dropright &::after {
- margin-left: 0;
- }
-
- .dropleft &::before {
- margin-right: 0;
- }
-}
-
-.btn-sm + .dropdown-toggle-split {
- padding-right: $btn-padding-x-sm * .75;
- padding-left: $btn-padding-x-sm * .75;
-}
-
-.btn-lg + .dropdown-toggle-split {
- padding-right: $btn-padding-x-lg * .75;
- padding-left: $btn-padding-x-lg * .75;
-}
-
-
-// The clickable button for toggling the menu
-// Set the same inset shadow as the :active state
-.btn-group.show .dropdown-toggle {
- @include box-shadow($btn-active-box-shadow);
-
- // Show no shadow for `.btn-link` since it has no other button styles.
- &.btn-link {
- @include box-shadow(none);
- }
-}
-
-
-//
-// Vertical button groups
-//
-
-.btn-group-vertical {
- flex-direction: column;
- align-items: flex-start;
- justify-content: center;
-
- > .btn,
- > .btn-group {
- width: 100%;
- }
-
- > .btn:not(:first-child),
- > .btn-group:not(:first-child) {
- margin-top: -$btn-border-width;
- }
-
- // Reset rounded corners
- > .btn:not(:last-child):not(.dropdown-toggle),
- > .btn-group:not(:last-child) > .btn {
- @include border-bottom-radius(0);
- }
-
- > .btn:not(:first-child),
- > .btn-group:not(:first-child) > .btn {
- @include border-top-radius(0);
- }
-}
-
-
-// Checkbox and radio options
-//
-// In order to support the browser's form validation feedback, powered by the
-// `required` attribute, we have to "hide" the inputs via `clip`. We cannot use
-// `display: none;` or `visibility: hidden;` as that also hides the popover.
-// Simply visually hiding the inputs via `opacity` would leave them clickable in
-// certain cases which is prevented by using `clip` and `pointer-events`.
-// This way, we ensure a DOM element is visible to position the popover from.
-//
-// See https://github.com/twbs/bootstrap/pull/12794 and
-// https://github.com/twbs/bootstrap/pull/14559 for more information.
-
-.btn-group-toggle {
- > .btn,
- > .btn-group > .btn {
- margin-bottom: 0; // Override default `