+
+Issues with this website can be reported through its [GitHub project](https://github.com/flatpak/flatpak.github.io/issues).
+
+## Flatpak History
+
+
+
August 2007
+
Alexander Larsson releases Glick, his first app bundling framework
+
+
November 2011
+
Glick 2 is released, a modernized version of the first Glick framework
+
+
July 2012
+
"GNOME OS" session held at GUADEC, includes initial planning for a new app bundling format
+
+
September 2012
+
Alexander Larsson releases experimental "bundler" framework
+
+
January 2013
+
"Linux Apps" proposal discussed at the GNOME Developer Experience hackfest, Brussels
+
+
December 2014
+
Work begins on xdg-app, which later becomes Flatpak
+
+
March 2015
+
xdg-app 0.1 released, the very first version of Flatpak
+
+
December 2015
+
GNOME's "Software" gains the ability to install xdg-app applications
+
+
May 2016
+
xdg-app renamed to Flatpak, 0.6.0 released; accompanying press release included endorsements by Red Hat, Endless Computers and Collabora
+
+
June 2016
+
Work on desktop portals security framework begins
+
+
June 2016
+
LibreOffice is the first major application to adopt Flatpak for publishing on Linux
+
+
July 2016
+
GTK+ 3.21.4 released with initial support for the portals framework
+
+
August 2016
+
Endless OS 3.0 released, the first publicly available OS to use Flatpak by default. Adoption of Flatpak by Apertis IVI also becomes public knowledge.
+
+
November 2016
+
ClearLinux announces their adoption of Flatpak
+
+
December 2016
+
Flatpak 0.8.0 released, the start of the first stable series with long-term support
+
+
May 2017
+
Initial soft launch of Flathub hosting service
+
+
May 2017
+
KDE Plasma 5.10 released with initial support for portals
+
+
October 2017
+
Flatpak 0.10.0 released, marking the start of the second supported stable release series
+
+
October 2017
+
KDE Plasma 5.11 released, "Discover" gains the ability to install Flatpak apps
+
+
October 2017
+
GIMP adopts Flatpak to publish on Linux
+
+
November 2017
+
Linux Mint 18.3 released, includes out of the box Flatpak integration
+
+
August 2018
+
Flatpak 1.0 released, the first release in a new stable series, with major new features; Flathub beta period ends; Freedesktop runtime 18.08 released with new support period policy
+
+
September 2018
+
KDE introduces the KDE Testing Applications Flatpak repository; commit
+
+
December 2019
+
elementary OS 5.1 Hera released, includes out of the box Flatpak integration
+
+
April 2020
+
Mozilla adopts Flatpak to publish Firefox on Linux
+
+
April 2020
+
System76 releases Pop!_OS 20.04, includes out of the box Flatpak integration
+
+
October 2021
+
1Password adopts Flatpak to publish on Linux
+
+
February 2022
+
Valve releases the Steam Deck; a handheld video game console with out of the box Flatpak and Flathub integration
+
+
February 2022
+
OBS Studio adopts Flatpak to publish on Linux
+
+
May 2022
+
Red Hat Enterprise Linux Workstation 9 released, includes out of the box Flatpak integration
Purism introduces Flatpak and the PureOS Flatpak repository; announcement
+
+
April 2023
+
Valve adopts portals for the popular Steam application
+
+
May 2023
+
Flathub offers more than 2000 apps and celebrates 1B total downloads
+
+
October 2023
+
Discord adopts Flatpak to publish on Linux
+
+
January 2024
+
Flathub surpasses one million active users
+
+
July 2024
+
Flathub reaches 2 billion total downloads
+
+
January 2025
+
Flatpak 1.16.0 released, the first stable release in over two years, packed with new features and improvements
+
+
December 2025
+
Flathub closes the year with 438 million downloads, 21.6% year-over-year growth, and over 3,200 apps available
+
diff --git a/content/blog-posts.md b/content/blog-posts.md
new file mode 100644
index 00000000..6c89abab
--- /dev/null
+++ b/content/blog-posts.md
@@ -0,0 +1,203 @@
++++
+title = "Blog Posts"
+description = "Blog posts about Flatpak"
+aliases = ["/blog-posts.html"]
++++
+
+If you know of a blog post that isn't listed, please [file an issue](https://github.com/flatpak/flatpak.github.io/issues/new) so we can add it!
+
+## 2026
+
+[**Sebastian Wick: Improving the Flatpak Graphics Drivers Situation**](https://blog.sebastianwick.net/posts/flatpak-graphics-drivers/)
+January 2026
+
+
+
+## 2025
+
+[**Georges Stavracas: Flatpak 1.16 is out!**](https://feaneron.com/2025/01/14/flatpak-1-16-is-out/)
+January 2025
+
+[**Sebastian Wick: Testing with Portals**](https://blog.sebastianwick.net/posts/testing-with-portals/)
+2025
+
+## 2024
+
+[**Cassidy James Blaede: 2 Billion Downloads & Other Milestones from 2024 So Far**](https://docs.flathub.org/blog/2-billion-downloads-2024/)
+August 2024
+
+## 2022
+
+[**Hubert Figuière: RTKit, portals, and Pipewire**](https://www.figuiere.net/hub/wlog/rtkit-portal-pipewire/)
+August 2022
+
+[**Will Thompson: How many Flathub apps reuse other package formats?**](https://blogs.gnome.org/wjjt/2022/06/14/how-many-flathub-apps-reuse-other-package-formats/)
+June 2022
+
+[**Jakub Steiner: Flatpak Brand Refresh**](https://blog.jimmac.eu/2022/flatpak-refresh/)
+June 2022
+
+[**Martín Abente Lahaye: Flatseal 1.8.0**](https://blogs.gnome.org/tchx84/2022/05/31/flatseal-1-8-0/)
+May 2022
+
+[**Will Thompson: Evince, Flatpak, and GTK print previews**](https://blogs.gnome.org/wjjt/2022/05/30/evince-flatpak-and-gtk-print-previews/)
+May 2022
+
+[**TheEvilSkeleton: Response to "Flatpak Is Not the Future"**](https://theevilskeleton.gitlab.io/2022/05/16/response-to-flatpak-is-not-the-future.html)
+May 2022
+
+[**Jan Grulich: How to use Libportal/libportal-qt**](https://jgrulich.cz/2022/02/10/how-to-use-libportal-libportal-qt/)
+February 2022
+
+## 2021
+
+[**Phaedrus Leeds: A Quick PSA on Writing Portal-friendly Application Code**](https://blogs.gnome.org/mwleeds/2021/12/03/a-quick-psa-on-writing-portal-friendly-application-code/)
+December 2021
+
+[**Will Thompson: On Flatpak disk usage and deduplication**](https://blogs.gnome.org/wjjt/2021/11/24/on-flatpak-disk-usage-and-deduplication/)
+November 2021
+
+[**Martín Abente Lahaye: Flatseal 1.7.5**](https://blogs.gnome.org/tchx84/2021/11/20/flatseal-1-7-5/)
+November 2021
+
+[**Peter Hutterer: Flatpak portals - how do they work?**](https://who-t.blogspot.com/2021/08/flatpak-portals-how-do-they-work.html)
+September 2021
+
+[**Lionir Deadman: Flathub, runtimes and stats**](https://thelion.website/flathub-runtimes-and-stats/)
+June 2021
+
+[**Martín Abente Lahaye: Flatseal 1.7.0**](https://blogs.gnome.org/tchx84/2021/04/23/flatseal-1-7-0/)
+April 2021
+
+[**TheEvilSkeleton: Response to flatkill.org**](https://theevilskeleton.gitlab.io/2021/02/11/response-to-flatkill-org.html)
+February 2021
+
+[**Phaedrus Leeds: Cleaning Up Unused Flatpak Runtimes**](https://blogs.gnome.org/mwleeds/2021/01/11/cleaning-up-unused-flatpak-runtimes/)
+January 2021
+
+## 2020
+
+[**Alexander Larsson: Scaling Flathub 100x**](https://blogs.gnome.org/alexl/2020/11/20/scaling-flathub/)
+November 2020
+
+[**Alexander Larsson: Compatibility in a sandboxed world**](https://blogs.gnome.org/alexl/2020/08/11/compatibility-in-a-sandboxed-world/)
+August 2020
+
+[**Martín Abente Lahaye: Flatseal 1.6.0**](https://blogs.gnome.org/tchx84/2020/06/26/flatseal-1-6-0-and-beyond/)
+June 2020
+
+[**Hubert Figuière: Getting a stack trace with debug symbols out of a flatpak**](https://www.figuiere.net/technotes/notes/tn001/)
+June 2020
+
+[**Alexander Larsson: Putting container updates on a diet**](https://blogs.gnome.org/alexl/2020/05/13/putting-container-updates-on-a-diet/)
+May 2020
+
+## 2019
+
+[**Matthias Clasen: More on Flatpak Updates**](https://blogs.gnome.org/mclasen/2019/12/19/9100/)
+December 2019
+
+[**TingPing: Hardening Flatpak Permissions Over Time**](https://blog.tingping.se/2019/10/06/hardening-flatpak-permissions.html)
+October 2019
+
+[**Matthias Clasen: Some Flatpak Updates**](https://blogs.gnome.org/mclasen/2019/10/03/some-flatpak-updates/)
+October 2019
+
+[**Robert McQueen: Flathub, brought to you by...**](https://ramcq.net/2019/08/12/flathub-brought-to-you-by/)
+August 2019
+
+[**Matthias Clasen: Settings, in a Sandbox World**](https://blogs.gnome.org/mclasen/2019/07/12/settings-in-a-sandbox-world/)
+July 2019
+
+[**Christian Hergert: Flatpaking Terminals**](https://blogs.gnome.org/chergert/2019/04/25/flatpaking-terminals/)
+April 2019
+
+[**Alexander Larsson: Introducing flat-manager**](https://blogs.gnome.org/alexl/2019/03/19/introducing-flat-manager/)
+March 2019
+
+[**Alexander Larsson: Changes in Flathub land**](https://blogs.gnome.org/alexl/2019/02/19/changes-in-flathub-land/)
+February 2019
+
+[**Matthias Clasen: What's New in Flatpak 1.2**](https://blogs.gnome.org/mclasen/2019/01/28/whats-new-in-flatpak-1-2/)
+January 2019
+
+## 2018
+
+[**Matthias Clasen: Flatpak Commandline Design**](https://blogs.gnome.org/mclasen/2018/12/19/flatpak-commandline-design/)
+December 2018
+
+[**Matthias Clasen: An Update on Flatpak Updates**](https://blogs.gnome.org/mclasen/2018/11/26/an-update-on-flatpak-updates/)
+November 2018
+
+[**Robert McQueen: Flatpak, sandboxes and security**](https://ramcq.net/2018/10/15/flatpak-sandbox-security/)
+October 2018
+
+[**Alexander Larsson: Moving away from the 1.6 freedesktop runtime**](https://blogs.gnome.org/alexl/2018/10/11/moving-away-from-the-1-6-freedesktop-runtime/)
+October 2018
+
+[**Matthias Clasen: Flatpak, After 1.0**](https://blogs.gnome.org/mclasen/2018/10/08/flatpak-after-1-0/)
+October 2018
+
+[**Alexander Larsson: Flatpak on windows**](https://blogs.gnome.org/alexl/2018/09/17/flatpak-on-windows/)
+September 2018
+
+[**Matthias Clasen: On Flatpak Dependencies**](https://blogs.gnome.org/mclasen/2018/09/07/on-flatpak-dependencies/)
+September 2018
+
+[**Matthias Clasen: About Flatpak Installations**](https://blogs.gnome.org/mclasen/2018/08/26/about-flatpak-installations/)
+August 2018
+
+[**Alexander Larsson: Kick-starting the revolution 1.0**](https://blogs.gnome.org/alexl/2018/08/21/kick-starting-the-revolution-1-0/)
+August 2018
+
+[**Alexander Larsson: The birth of a new runtime**](https://blogs.gnome.org/alexl/2018/08/10/the-birth-of-a-new-runtime/)
+August 2018
+
+[**Matthias Clasen: Flatpak Portal Experiments**](https://blogs.gnome.org/mclasen/2018/08/03/flatpak-portal-experiments/)
+August 2018
+
+[**Matthias Clasen: Flatpak - A Look Behind the Portal**](https://blogs.gnome.org/mclasen/2018/07/19/flatpak-a-look-behind-the-portal/)
+July 2018
+
+[**Matthias Clasen: The Flatpak BoF at GUADEC**](https://blogs.gnome.org/mclasen/2018/07/14/the-flatpak-bof-at-guadec/)
+July 2018
+
+[**Matthias Clasen: Flatpak, Making Contribution Easy**](https://blogs.gnome.org/mclasen/2018/07/07/flatpak-making-contribution-easy/)
+July 2018
+
+[**Matthias Clasen: Flatpak in Detail, Part 3**](https://blogs.gnome.org/mclasen/2018/07/02/flatpak-in-detail-part-3/)
+July 2018
+
+[**Alexander Larsson: Flatpak - a history**](https://blogs.gnome.org/alexl/2018/06/20/flatpak-a-history/)
+June 2018
+
+[**Matthias Clasen: Flatpak in Detail, Part 2**](https://blogs.gnome.org/mclasen/2018/06/19/flatpak-in-detail-part-2/)
+June 2018
+
+[**Matthias Clasen: Flatpak in Detail**](https://blogs.gnome.org/mclasen/2018/06/13/flatpak-in-detail/)
+June 2018
+
+[**Alexander Larsson: Flatpak inception**](https://blogs.gnome.org/alexl/2018/04/27/flatpak-inception/)
+April 2018
+
+[**TingPing: Flatpaking application plugins**](https://blog.tingping.se/2018/03/18/flatpaking-plugins.html)
+March 2018
+
+[**PointestStick: Flatpak support in Discover**](https://pointieststick.com/2018/01/13/flatpak-support-in-discover/)
+January 2018
+
+## 2017
+
+[**TingPing: Status of emulators Flatpak'd**](https://blog.tingping.se/2017/10/31/flatpaked-emulators.html)
+October 2017
+
+[**Alexander Larsson: On application sizes and bloat in flatpak**](https://blogs.gnome.org/alexl/2017/10/02/on-application-sizes-and-bloat-in-flatpak/)
+October 2017
+
+## 2016
+
+[**Simon McVittie: Flatpak in Debian**](http://smcv.pseudorandom.co.uk/2016/flatpak/)
+June 2016
+
+[**Simon McVittie: GNOME Developer Experience hackfest: xdg-app + Debian**](https://smcv.pseudorandom.co.uk/2016/xdg-app/)
+January 2016
diff --git a/content/faq.md b/content/faq.md
new file mode 100644
index 00000000..8ab41617
--- /dev/null
+++ b/content/faq.md
@@ -0,0 +1,61 @@
++++
+title = "Frequently Asked Questions"
+description = "FAQ about the Flatpak project."
+aliases = ["/faq.html"]
++++
+
+### Why the name Flatpak?
+
+IKEA is a world-wide known brand whose success was partly built upon having developed and refined the idea of flatpacking their furniture, which allowed them huge cost savings and efficiencies compared to their competitors. So when we needed a new name for the packaging technology that had been developed by Alex Larsson, a native Swede, we thought that Flatpak would both be a nice play on his nationality and pay homage to the success of IKEA and at the same time send a strong signal about how revolutionary we thought this new packaging technology could be for the Linux desktop.
+
+### What is the origin of the Flatpak technology?
+
+Flatpak is a technology that brings together many of the lessons learned by its creator Alexander Larsson during his long tenure as a Linux desktop developer and having spent time inside Red Hat working on container technologies. Flatpak builds upon existing technologies such as cgroups, namespaces, bind mounts and seccomp in the Linux kernel, OSTree from [Project Atomic](http://www.projectatomic.io/) and the OCI format that is developed by the [Open Container Initiative](https://www.opencontainers.org/). It has also spawned new technologies such as Bubblewrap which is shared between Flatpak and Project Atomic.
+
+### Is Flatpak tied to GNOME?
+
+No. While Flatpak has been developed by people with a long involvement in the GNOME community it is not tied to any desktop. In fact, it was designed with the explicit goal of allowing it to build applications using any library stack or programming language an application author might want.
+
+### Is Flatpak tied to Fedora?
+
+No. In fact, Flatpak and even [Flathub](https://flathub.org) are enabled by default on Endless OS and Linux Mint. The people developing Flatpak have a long history in contributing to and building Linux distributions like Debian, Fedora, and others, and solving the problems that arise when shipping applications for these platforms. Flatpak was built to be distribution agnostic and allow deployment on any Linux operating system out there.
+
+### Is Flatpak tied to Linux?
+
+Yes. We are explicitly using many features of the linux kernel (bind mounts, namespaces, seccomp, etc) to create the sandbox that Flatpak apps are running in. It may be possible to use equivalent technologies on other kernels, but that would be a non-trivial amount of work, and we don't consider this one of our priorities.
+
+### Is Flatpak tied to systemd?
+
+No. Versions of Flatpak before 0.6.10 relied on systemd for cgroups setup, but this is no longer required.
+
+### Is Flatpak the same as xdg-app?
+
+Yes, while xdg-app was a fine name to use during development we wanted something with wider appeal and more sparkle to it than xdg-app could provide. So as part of formally launching Flatpak as ready for use we decided to pick a more accessible and fun name.
+
+### Is Flatpak a container technology?
+
+It can be, but it doesn't have to be. Since a desktop application would require quite extensive changes in order to be usable when run inside a container you will likely see Flatpak mostly deployed as a convenient library bundling technology early on, with the sandboxing or containerization being phased in over time for most applications. In general though we try to avoid using the term container when speaking about Flatpak as it tends to cause comparisons with Docker and rkt, comparisons which quickly stop making technical sense due to the very different problem spaces these technologies try to address. And thus we prefer using the term sandboxing.
+
+### How does Flatpak relate to freedesktop.org technologies such as desktop files and AppStream metadata?
+
+These standards are incorporated as mandatory parts in the Flatpak definition. By relying on these standards we are building on years of investment and support under Linux.
+
+### Can Flatpak be used on servers too?
+
+Flatpak is designed to run inside a desktop session and relies on certain session services, such as a D-Bus session bus and, optionally, a systemd `--user` instance. This makes Flatpak not a good match for a server.
+
+However, the build features of Flatpak run fine outside a session, so you can build things on a server.
+
+### Is Flatpak compatible with other desktop isolation frameworks?
+
+In general unprivileged container systems can't stack, because anything running inside the sandbox does not have the necessary privileges to set up a sandbox, nor does it have the ability to raise its privileges in any way. For instance, Firejail can never work inside Flatpak, because it is setuid. That being said, using multiple sandboxing frameworks at once does not really make anything more secure, so there is little point in trying to nest things like that.
+
+It is certainly possible for Flatpak and Flatpak applications to coexist with applications that are packaged in other ways, on the same host system.
+
+### Are there any IDEs that support Flatpak?
+
+Yes! Version 3.22.4 and newer of [Builder](https://apps.gnome.org/Builder/) includes support for `flatpak-builder` manifests. This ensures your project is built using your selected Flatpak runtime and any external dependencies. Support for running your application inside Flatpak is also supported. By developing your application within the exact same environment as your users you can squash those "Works for me" bugs before they reach your users!
+
+### Can I host my Flatpak app on GitHub?
+
+Flatpak repositories can't (currently) be put on GitHub in a convenient way. As an alternative, you can create a single-file bundle, and put that up on GitHub as a "release." Note that bundles have some drawbacks, compared to a repository. Another option you have is to get your app on [Flathub](https://flathub.org/) which will allow your users to get updates.
diff --git a/content/presentations.md b/content/presentations.md
new file mode 100644
index 00000000..96c9693f
--- /dev/null
+++ b/content/presentations.md
@@ -0,0 +1,166 @@
++++
+title = "Presentations & Articles"
+description = "Presentations and articles about Flatpak"
+aliases = ["/presentations.html"]
++++
+
+If you know of a presentation or article that isn't listed, please [file an issue](https://github.com/flatpak/flatpak.github.io/issues/new) so we can add it!
+
+## 2026
+
+[**Sebastian Wick: Flatpak and Portals: A Status Update**](https://www.youtube.com/watch?v=Zt4cUf_AgUg)
+Linux App Summit, Berlin, Germany, May 2026
+
+[**Adrian Vovk & Sebastian Wick: The next generation of Flatpak and Portals**](https://www.youtube.com/live/1AXBfsiaQNk?t=16197)
+Linux App Summit, Berlin, Germany, May 2026
+
+
+## 2025
+
+[**Sebastian Wick: The Future of Flatpak**](https://www.youtube.com/watch?v=3HkYJ7M119I)
+Linux App Summit, Tirana, Albania, April 2025
+
+[**Jordan Petridis: Flathub: A paradigm shift for distributing applications**](https://www.youtube.com/watch?v=NxOH4wJkfLY)
+Linux App Summit, Tirana, Albania, April 2025
+
+[**Shipping Flatpak applications with an image based system**](https://cfp.all-systems-go.io/all-systems-go-2025/talk/98W9EX/)
+All Systems Go!, October 2025
+
+[**Joe Brockmeier: The future of Flatpak**](https://lwn.net/Articles/1020571/)
+LWN.net, May 2025
+
+## 2023
+
+[**Richard Brown: What could go wrong? I was wrong about Flatpak, AppImage, and Snap**](https://www.youtube.com/watch?v=4WuYGcs0t6I)
+FOSDEM, Brussels, Belgium, February 2023
+
+[**Bartłomiej Piotrowski: Flathub in 2023: Revolutionizing the Linux App Ecosystem**](https://conf.linuxappsummit.org/event/5/contributions/173/)
+Linux App Summit, Brno, Czech Republic, April 2023
+
+## 2021
+
+[**Will Thompson: Automate your Flatpak manifest updates today**](https://www.youtube.com/watch?v=c_dG_ngnJk4)
+Linux App Summit, May 2021
+
+[**Jan Beran: Making flatpaks from Fedora RPMs**](https://www.youtube.com/watch?v=IuxHidCdbPo)
+Linux App Summit, May 2021
+
+[**Valentin David: Freedesktop SDK on RISC-V**](https://www.youtube.com/watch?v=INTbqkck258)
+Linux App Summit, May 2021
+
+## 2020
+
+[**Alexander Larsson: Flatpak, an introduction (Lightning Talk)**](https://www.youtube.com/watch?v=0yeXTounX3E)
+Linux App Summit, November 2020
+
+[**Bartłomiej Piotrowski: Flathub: The State of the Union**](https://www.youtube.com/watch?v=IqHEx-Lug8k)
+Linux App Summit, November 2020
+
+[**Felipe Borges: Application sandboxing with Flatpak Portals**](https://www.youtube.com/watch?v=3rCIEzfZw1I)
+DevConf.CZ, Brno, Czechia, January 2020
+
+## 2019
+
+[**Robert McQueen: Building an app store with Flathub**](https://www.youtube.com/watch?v=ZGAfYP3OiAI)
+Linux App Summit, Barcelona, Spain, November 2019
+
+[**Alexander Larsson: Maintaining a Flatpak Repository**](https://www.youtube.com/watch?v=q-_fKWby0ds&list=PLkmRdYgttscEuv9v2-H9P5FBj8-td_Nri&index=24)
+GUADEC, Thessaloniki, Greece, August 2019
+
+[**Valentin David, Adam Jones: Freedesktop-sdk Status Update and Future Plans**](https://www.youtube.com/watch?v=ky-inEefWpE&list=PLkmRdYgttscEuv9v2-H9P5FBj8-td_Nri&index=20)
+GUADEC, Thessaloniki, Greece, August 2019
+
+[**Richard Brown: Help, I'm Falling in Love with Flatpak**](https://www.youtube.com/watch?v=7p4y9Meyy0M&list=PLkmRdYgttscEuv9v2-H9P5FBj8-td_Nri&index=12)
+GUADEC, Thessaloniki, Greece, August 2019
+
+[**Matthias Clasen: Portals - Principles and Practice**](https://www.youtube.com/watch?v=bIzJyp8sb70&list=PLkmRdYgttscEuv9v2-H9P5FBj8-td_Nri&index=9)
+GUADEC, Thessaloniki, Greece, August 2019
+
+[**Owen Taylor: Flatpaks in Fedora - an update**](https://www.youtube.com/watch?v=mpCXK6PqvDk)
+DevConf.CZ, Brno, Czechia, January 2019
+
+[**Jiří Janoušek: Fight Linux fragmentation with Flatpak**](https://www.youtube.com/watch?v=_ZmgdnhvjvM)
+DevConf.CZ, Brno, Czechia, January 2019
+
+[**Felipe Borges: Running virtual machines in the Flatpak sandbox**](https://www.youtube.com/watch?v=EdrSJMKikUM)
+DevConf.CZ, Brno, Czechia, January 2019
+
+[**Kukuh Syafaat: LibreOffice Flatpak, Snap and AppImage**](https://wiki.documentfoundation.org/File:AsiaCon2019_Kukuh_Syafaat.pdf)
+LibreOffice Asia Conference 2019, Tokyo, Japan, May 2019
+
+## 2018
+
+[**Jiří Janoušek: Why and How I Switched to Flatpak**](https://www.youtube.com/watch?v=OuySHov0gdA)
+LinuxDays, Prague, Czechia, October 2018
+
+[**Alexander Larsson: Flatpak - a technical walk-through**](https://people.gnome.org/~alexl/presentations/all-systems-go-2018.pdf)
+All Systems Go! Berlin, Germany, September 2018
+
+[**Robert McQueen & Jorge García: Flathub, app store and build service for flatpak apps**](https://www.youtube.com/watch?v=Hga20qlyknw)
+GUADEC, Almeria, Spain, July 2018
+
+[**Adam Jones & Valentin David: Freedesktop SDK: the future of Linux runtimes**](https://www.youtube.com/watch?v=rhEzTQg_LEk)
+GUADEC, Almeria, Spain, July 2018
+
+[**Matthew Leeds: P2P Distribution of Flatpaks and OSTrees**](https://www.youtube.com/watch?v=SIPOfPv1z1s)
+GUADEC, Almeria, Spain, July 2018
+
+[**Owen Taylor: A distribution approach to building Flatpaks**](https://www.youtube.com/watch?v=EbvxZa2Blgs)
+DevConf.CZ, Brno, Czechia, January 2018
+
+[**Robert McQueen: Desktop OS of the future: ostree + flatpak**](https://www.youtube.com/watch?v=FcykFHJEDUU)
+DevConf.CZ, Brno, Czechia, January 2018
+
+[**Alexander Larsson: Flatpaking your app for fame and fortune**](https://www.youtube.com/watch?v=SBWGwwrGR8M)
+DevConf.CZ, Brno, Czechia, January 2018
+
+[**Kukuh Syafaat: openSUSE Leap & Flatpak**](https://events.opensuse.org/conferences/summitasia18/program/proposals/2005)
+openSUSE.Asia Summit 2018, Taipei, Taiwan, August 2018
+
+## 2017
+
+[**Alexander Larsson: Taking back the apps from the distributions**](https://www.youtube.com/watch?v=IUA38lvb_tM)
+LAS GNOME, October 2016, Portland, USA
+
+[**Jorge Garcia: Building a Flatpak based app store**](https://www.youtube.com/watch?v=MFue217zmyk)
+GUADEC, August 2017, Manchester, UK
+
+[**Jan Grulich & Martin Bříza: Flatpak and KDE & the state of Qt integration in GNOME**](https://www.youtube.com/watch?v=U8zlbXYTN2U)
+GUADEC, August 2017, Manchester, UK
+
+[**Richard Brown: Resurrecting Dinosaurs - what could possibly go wrong?**](https://www.youtube.com/watch?v=RPblTKt4Klo)
+GUADEC, August 2017, Manchester, UK
+
+[**Simon McVittie: Flatpak and Debian**](https://www.collabora.com/news-and-blog/blog/2017/08/17/debconf-17-flatpak-and-debian/)
+Debconf, August 2017, Montreal, Canada
+
+[**Linux Magazine: Flatpak and snap**](http://www.linux-magazine.com/Online/Features/Universal-Package-Formats-and-How-They-Differ)
+June 2017
+
+[**Mario Sanchez Prada & Richard Hughes: The future of linux application distribution**](https://speakerdeck.com/mariospr/the-future-of-linux-application-distribution-ostree-flatpak-and-gnome-software)
+March 2017, Samsung Research, Staines, UK
+
+[**Alexander Larsson: Flatpak: Apps on the linux desktops**](https://www.youtube.com/watch?v=xIjxNtIwcBA)
+foss-north 2017, Gothenburg, Sweden
+
+[**Matthias Clasen: Flatpak – A new way to distribute applications**](https://mclasen.fedorapeople.org/devconf-flatpak.pdf)
+January 2017, devconf.cz, Brno, Czech Republic
+
+[**Kukuh Syafaat: Flatpak & AppImage Usage on openSUSE. Which One Suitable for openSUSE Users?**](https://events.opensuse.org/conferences/summitasia17/program/proposals/1502)
+openSUSE.Asia Summit 2017, October 2017, Chofu, Tokyo, Japan
+
+## 2016
+
+[**Alexander Larsson: Flatpak status update and future plans**](https://www.youtube.com/watch?v=G1OFcNQ5Fw8)
+GUADEC, August 2016, Karlsruhe, Germany
+
+[**Fedora Magazine: Explore Flatpak in Fedora 24**](https://fedoramagazine.org/explore-flatpak-fedora-24/)
+June 2016
+
+[**Jens Petersen: Generic standalone linux app packages**](https://www.slideshare.net/JensPetersen2/flatpak-introdiction)
+FUDCon APAC 2016, Phnom Penh, Cambodia
+
+## 2015
+
+[**Christian Hergert: Flatpak, the easiest, fastest, and safest software distribution platform**](https://www.socallinuxexpo.org/scale/15x/presentations/flatpak-easiest-fastest-and-safest-software-distribution-platform)
+SCALE 2015, Pasadena, USA
diff --git a/content/press/2016-06-21-flatpak-released.md b/content/press/2016-06-21-flatpak-released.md
new file mode 100644
index 00000000..7fa0f19f
--- /dev/null
+++ b/content/press/2016-06-21-flatpak-released.md
@@ -0,0 +1,57 @@
++++
+title = "Announcing Flatpak – Next Generation Linux Applications"
+date = 2016-06-21
+description = "Stockholm, Sweden – 21st June 2016 – The development team behind Flatpak is excited to announce the general availability of their new framework for desktop applications on Linux."
+template = "press-page.html"
+aliases = ["/press/2016-06-21-flatpak-released.html"]
++++
+
+Stockholm, Sweden – 21st June 2016 – The development team behind Flatpak is excited to announce the general availability of their new framework for desktop applications on Linux. Previously named xdg-app, [Flatpak is available on a range of major Linux distributions](http://flatpak.org/getting.html).
+
+## Build once, run anywhere
+
+The Linux desktop has long been held back by platform fragmentation. This has been a burden on developers, and creates a high barrier to entry for third party application developers. Flatpak aims to change all that. From the very start its primary goal has been to allow the same application to run across a myriad of Linux distributions and operating systems. In doing so, it greatly increases the number of users that application developers can easily reach.
+
+Speaking about the goals behind Flatpak, Alexander Larsson, its lead developer, said: "Application developers on Linux have always been prevented from having a direct relationship with their users. With Flatpak we're aiming to change that, so developers know exactly what their users are getting. With this launch we are making that goal a reality."
+
+Flatpak has been available for a range of Linux distributions for several weeks. It allows application developers to build against a series of stable platforms (known as runtimes), as well as to bundle libraries directly within their applications. Flatpak is also standards compliant, offering support for the [Open Container Initiative](https://www.opencontainers.org/) specification.
+
+A growing range of applications are already available as Flatpaks, including LibreOffice, the GIMP, InkScape, MyPaint, Darktable, and a large number of stock GNOME applications. Linux desktops are also adopting Flatpak. A fully functional GNOME runtime has been available since March: this allows application developers to build and distribute Flatpaks using the GNOME development stack. Work on a similar runtime for KDE is proceeding.
+
+Not only does Flatpak provide cross-distribution installation, but it also allows forward compatibility. Michael Meeks, Director of [The Document Foundation](https://www.documentfoundation.org/), said: "Until now, building a LibreOffice that works for every Linux user has involved some horrible compromises caused by the need to build our binaries on an ancient Linux version to get good forward compatibility. Flatpak will enable us (as a Linux ISV) to distribute a better LibreOffice, with up-to-date dependencies and a platform that can run on many systems. I'm excited to see that happen."
+
+## Security first
+
+Another area where the Linux desktop has been weak is security: it has never had a viable model for isolating applications, or for gatekeeping access to user data. This is another area where Flatpak aims to upset the status quo. To this end, it has been built from the ground up with security in mind.
+
+Flatpak apps are sandboxed. From within the sandbox, the only things the app can "see" are itself and a limited set of libraries and operating system interfaces. This effectively isolates apps from each other as well as from the host system and makes it much harder for applications to steal user data or exploit one another.
+
+Initial Flatpak releases have concentrated on application building, distribution and installation, and while the foundations of sandboxing are in place, there are still missing pieces. "The next major Flatpak release will be all about sandboxing", says Larsson. "Application authors will see a much more complete set of interfaces for interacting with the operating system from within a sandbox."
+
+Another major part of this work is the widescale move towards the Wayland display server on Linux. X11 is inherently insecure, which makes it impossible to sandbox applications that are using it. In that sense, the growing maturity of Wayland complements Flatpak's emergence, and paves the way for much more complete security model for Linux distributions.
+
+## Background to Flatpak
+
+[](/img/CC-BY-SA-4.0-Garrett-LeSage.jpg)
+
+Flatpak is the brainchild of Alexander Larsson, Principal Software Engineer at Red Hat. Larsson has been working in the Linux desktop space for 18 years. He was the principal author of GVfs (GNOME's Virtual Filesystem) and has done critical work on Docker, the SPICE protocol, the Gecko rendering engine, GLib and GTK+. He has considerable experience in the area of application bundling.
+
+Flatpak builds on several cutting edge technologies. Under the hood, it makes significant use of [OSTree](https://ostree.readthedocs.org), which can be described as "Git for large binaries". This provides much of the functionality for hosting software repositories. It also makes Flatpak extremely efficient: applications and libraries that are installed with Flatpak are de-duplicated, saving disk space; "static deltas" reduce the size of downloads for software updates.
+
+For sandboxing, Flatpak makes use of the [Bubblewrap](https://github.com/projectatomic/bubblewrap) utility, as well as several Linux kernel features (such as cgroups and namespaces), which helps to make it portable across distributions.
+
+## Rapid community growth and adoption
+
+It is well known that Fedora is making plans around Flatpak. Commenting on Flatpak, Christian F.K. Schaller (Senior Manager at Red Hat and member of the Fedora Workstation Working Group) stated: "The Fedora Workstation team are very excited about Flatpak and the prospects it brings for making the Linux desktop easier to develop for. We plan to continue supporting this effort going forward and help advocate it to a wider audience."
+
+There is also interest from other parties. One early adopter of Flatpak is [Endless Computers](https://endlessm.com/). Speaking about the launch of Flatpak, Jonathan Blandford (VP of Software Engineering at Endless) said: "The Flatpak launch represents a major milestone in providing a unified context for Linux developers. At Endless, we're proud to be a part of this movement and have fully embraced Flatpak by readily converting all of our applications for our upcoming release and continuing to build new Flatpak apps. We encourage others to do so as well in what we hope to be a revolution among Linux app creation and adoption."
+
+
+
+Other distributions are showing interest, as well as other Free Software companies. Simon McVittie is Senior Software Engineer at Collabora and a Debian developer, and is himself looking to Flatpak: "Bringing Flatpak technology into Debian enables us to run applications in a predictable environment with their most suitable library stack, without compromising the base OS's stability and flexibility. Flatpak also retains the ability to deploy security updates, making it a significant enhancement for the many Debian-based desktop and embedded distributions, both in the community and in commercial products."
+
+One reason for the increasing interest in Flatpak is due to its adaptability and the fact that it is a genuinely upstream project. It can be used and adapted as part of downstream and bespoke solutions, is hosted on Freedesktop.org and Github, and is licensed with the LGPL, with no copyright assignment or contributor license agreement required.
+
+Larsson is obviously pleased by the momentum behind Flatpak. "It's exciting to see the growing interest in what we are doing, as developers realise the possibilities of the technology," he said.
+
+More information about Flatpak can be found on [flatpak.org](http://flatpak.org/).
diff --git a/content/press/2018-08-20-flatpak-1.0.md b/content/press/2018-08-20-flatpak-1.0.md
new file mode 100644
index 00000000..40ce438f
--- /dev/null
+++ b/content/press/2018-08-20-flatpak-1.0.md
@@ -0,0 +1,31 @@
++++
+title = "Flatpak 1.0 Released, Ready for Prime Time"
+date = 2018-08-20
+description = "Flatpak, the Linux desktop app distribution framework, reached an important milestone with the release of its 1.0 version."
+template = "press-page.html"
+aliases = ["/press/2018-08-20-flatpak-1.0.html"]
++++
+
+
+
+**Stockholm, Sweden, 20 August 2018**: Flatpak, the Linux desktop app distribution framework, reached an important milestone today, with the release of its 1.0 version.
+
+For those who don't know, once an app has been built as a Flatpak, it can be installed on virtually any Linux distribution. This model is designed to make Linux a more attractive option for desktop app developers, and provides developers with a more stable platform on which to build and develop.
+
+Discussing the release, Flatpak's lead developer, Alexander Larsson, has said: "A lot of work has gone into Flatpak 1.0 and we're confident that it's ready for wider use. Flatpak's goal has always been to revolutionize the Linux ecosystem and this is an important step towards that." A 1.0 release generally marks the point at which software has become "feature complete", so the fact that the developers are calling this a 1.0 is significant. But what does it mean in practice?
+
+Flatpak 1.0 comes with a collection of new features that application developers can take advantage of. Developers can mark versions of their apps as end of life, to indicate when they are no longer supported. There's a new mechanism for apps to restart themselves. The command line interface has had a raft of improvements, including new commands and options.
+
+Furthermore, Flatpak has matured since its last major stable release in October 2017. The new version promises to be faster and more reliable. There's also been some internal tidying up and reorganization. (This isn't so interesting to users and app developers, but it makes Flatpak that bit easier to integrate with your favorite Linux distro.)
+
+However, some of the biggest changes have been in the Flatpak ecosystem. To coincide with the release of Flatpak 1.0, the Flatpak developers are also taking the beta label off their Flathub service. Flathub is the central store for Flatpak apps. It is both a repository that can be used by Linux desktops, and a [website that users can use to browse and install apps](https://flathub.org/). It had a quiet, soft launch back in May 2017 and has seen rapid growth in the number of apps and users since then.
+
+Flathub has become a major feature for developers, as LibreOffice's Stephan Bergmann made clear: "Flatpak has come a long way since we first started using it; nowadays we can type a trivial command to get the latest LibreOffice 6.1 built and published on Flathub automatically. What keeps impressing me is the breadth and depth of the bug reports we receive for the LibreOffice Flatpak version. It shows that people are using it in all kinds of scenarios."
+
+Another significant development in the Flatpak ecosystem relates to their "runtimes" — the platforms that applications are built and run against. The main "Freedesktop" runtime that is used by most Flatpak apps is having a major release to coincide with the Flatpak 1.0. This 18.08 release has a new lifecycle policy, which includes a regular release schedule and guarantees for support periods and security updates. This gives Flatpak's app platforms a similar level of support to commercial operating system offerings.
+
+Flatpak's developers also point to other areas where the framework has matured. Their [developer documentation](https://docs.flatpak.org/en/latest/) has been rewritten and is much more complete. Flatpak's website also includes [tutorials for setting up Flatpak on a lot more Linux distributions](https://flatpak.org/setup/).
+
+The big question is what this means for the Linux landscape. Last November, Linux Mint, one of the larger Linux distributions, started using Flatpak by default, and Fedora is planning to start building its own Flatpaks very soon. It might just be that a tipping point has been reached.
+
+*This press release, including all content and media, can be freely used and modified without the need for attribution.*
diff --git a/content/press/_index.md b/content/press/_index.md
new file mode 100644
index 00000000..c7e7aef8
--- /dev/null
+++ b/content/press/_index.md
@@ -0,0 +1,8 @@
++++
+title = "Press"
+description = "Press information about Flatpak"
+template = "press.html"
+sort_by = "date"
+generate_feeds = true
+aliases = ["/press.html"]
++++
diff --git a/data/apps.toml b/data/apps.toml
new file mode 100644
index 00000000..934349bb
--- /dev/null
+++ b/data/apps.toml
@@ -0,0 +1,59 @@
+[[apps]]
+name = "Telegram"
+id = "org.telegram.desktop"
+icon = "img/apps/org.telegram.desktop.png"
+
+[[apps]]
+name = "Slack"
+id = "com.slack.Slack"
+icon = "img/apps/com.slack.Slack.png"
+
+[[apps]]
+name = "Inkscape"
+id = "org.inkscape.Inkscape"
+icon = "img/apps/org.inkscape.Inkscape.png"
+
+[[apps]]
+name = "Spotify"
+id = "com.spotify.Client"
+icon = "img/apps/com.spotify.Client.png"
+
+[[apps]]
+name = "Steam"
+id = "com.valvesoftware.Steam"
+icon = "img/apps/com.valvesoftware.Steam.png"
+
+[[apps]]
+name = "GIMP"
+id = "org.gimp.GIMP"
+icon = "img/apps/org.gimp.GIMP.png"
+
+[[apps]]
+name = "Firefox"
+id = "org.mozilla.firefox"
+icon = "img/apps/org.mozilla.firefox.png"
+
+[[apps]]
+name = "Kdenlive"
+id = "org.kde.kdenlive"
+icon = "img/apps/org.kde.kdenlive.png"
+
+[[apps]]
+name = "Skype"
+id = "com.skype.Client"
+icon = "img/apps/com.skype.Client.png"
+
+[[apps]]
+name = "VLC"
+id = "org.videolan.VLC"
+icon = "img/apps/org.videolan.VLC.png"
+
+[[apps]]
+name = "Blender"
+id = "org.blender.Blender"
+icon = "img/apps/org.blender.Blender.png"
+
+[[apps]]
+name = "Podman Desktop"
+id = "io.podman_desktop.PodmanDesktop"
+icon = "img/apps/io.podman_desktop.PodmanDesktop.png"
diff --git a/data/apps.yml b/data/apps.yml
deleted file mode 100644
index edb9eab5..00000000
--- a/data/apps.yml
+++ /dev/null
@@ -1,121 +0,0 @@
-- name: "Telegram"
- id: "org.telegram.desktop"
- ref: "app/org.telegram.desktop/x86_64/stable"
- summary: "Desktop messenger"
- color: "#6DA9D6"
- featured: "yes"
- "flatpakref": "https://dl.flathub.org/repo/appstream/org.telegram.desktop.flatpakref"
- icons:
- "128": "https://dl.flathub.org/repo/appstream/x86_64/icons/128x128/org.telegram.desktop.png"
- "64": "https://dl.flathub.org/repo/appstream/x86_64/icons/64x64/org.telegram.desktop.png"
-
-- name: "Slack"
- id: "com.slack.Slack"
- ref: "app/com.slack.Slack/x86_64/stable"
- summary: "Chat with your team"
- color: "#C5BFB5"
- "flatpakref": "https://dl.flathub.org/repo/appstream/com.slack.Slack.flatpakref"
- icons:
- "128": "https://dl.flathub.org/repo/appstream/x86_64/icons/128x128/com.slack.Slack.png"
- "64": "https://dl.flathub.org/repo/appstream/x86_64/icons/64x64/com.slack.Slack.png"
-
-- name: "Inkscape"
- id: "org.inkscape.Inkscape"
- ref: "app/org.inkscape.Inkscape/x86_64/stable"
- summary: "Vector graphics editor"
- color: "#C5BFB5"
- "flatpakref": "https://dl.flathub.org/repo/appstream/org.inkscape.Inkscape.flatpakref"
- icons:
- "128": "https://dl.flathub.org/repo/appstream/x86_64/icons/128x128/org.inkscape.Inkscape.png"
- "64": "https://dl.flathub.org/repo/appstream/x86_64/icons/64x64/org.inkscape.Inkscape.png"
-
-- name: "Spotify"
- id: "com.spotify.Client"
- ref: "app/com.spotify.Client/x86_64/stable"
- summary: "Online music streaming service"
- color: "#1DC558"
- "flatpakref": "https://dl.flathub.org/repo/appstream/com.spotify.Client.flatpakref"
- icons:
- "128": "https://dl.flathub.org/repo/appstream/x86_64/icons/128x128/com.spotify.Client.png"
- "64": "https://dl.flathub.org/repo/appstream/x86_64/icons/64x64/com.spotify.Client.png"
-
-- name: "Steam"
- id: "com.valvesoftware.Steam"
- ref: "app/com.valvesoftware.Steam/x86_64/stable"
- summary: "Manage and play games distributed by Steam"
- featured: "yes"
- color: "#7C8699"
- "flatpakref": "https://dl.flathub.org/repo/appstream/com.valvesoftware.Steam.flatpakref"
- icons:
- "128": "https://dl.flathub.org/repo/appstream/x86_64/icons/128x128/com.valvesoftware.Steam.png"
- "64": "https://dl.flathub.org/repo/appstream/x86_64/icons/64x64/com.valvesoftware.Steam.png"
-
-- name: "GIMP"
- id: "org.gimp.GIMP"
- ref: "app/org.gimp.GIMP/x86_64/stable"
- summary: "Create images and edit photographs"
- color: "#837E77"
- "flatpakref": "https://dl.flathub.org/repo/appstream/org.gimp.GIMP.flatpakref"
- icons:
- "128": "https://dl.flathub.org/repo/appstream/x86_64/icons/128x128/org.gimp.GIMP.png"
- "64": "https://dl.flathub.org/repo/appstream/x86_64/icons/64x64/org.gimp.GIMP.png"
-
-- name: "Firefox"
- id: "org.mozilla.firefox"
- ref: "app/org.mozilla.firefox/x86_64/stable"
- summary: "Fast, Private & Safe Web Browser"
- color: "#FFEF42"
- "flatpakref": "https://dl.flathub.org/repo/appstream/org.mozilla.firefox.flatpakref"
- icons:
- "128": "https://dl.flathub.org/repo/appstream/x86_64/icons/128x128/org.mozilla.firefox.png"
- "64": "https://dl.flathub.org/repo/appstream/x86_64/icons/64x64/org.mozilla.firefox.png"
-
-- name: "Kdenlive"
- id: "org.kde.kdenlive"
- ref: "app/org.kde.kdenlive/x86_64/stable"
- summary: "Video editor"
- color: "#8596C6"
- "flatpakref": "https://dl.flathub.org/repo/appstream/org.kde.kdenlive.flatpakref"
- icons:
- "128": "https://dl.flathub.org/repo/appstream/x86_64/icons/128x128/org.kde.kdenlive.png"
- "64": "https://dl.flathub.org/repo/appstream/x86_64/icons/64x64/org.kde.kdenlive.png"
-
-- name: "Skype"
- id: "com.skype.Client"
- ref: "app/com.skype.Client/x86_64/stable"
- summary: "Call and message Skype users"
- color: "#C5BFB5"
- "flatpakref": "https://dl.flathub.org/repo/appstream/com.skype.Client.flatpakref"
- icons:
- "128": "https://dl.flathub.org/repo/appstream/x86_64/icons/128x128/com.skype.Client.png"
- "64": "https://dl.flathub.org/repo/appstream/x86_64/icons/64x64/com.skype.Client.png"
-
-- name: "VLC"
- id: "org.videolan.VLC"
- ref: "app/org.videolan.VLC/x86_64/stable"
- summary: "Open-source multimedia player"
- color: "#DB946C"
- "flatpakref": "https://dl.flathub.org/repo/appstream/org.videolan.VLC.flatpakref"
- icons:
- "128": "https://dl.flathub.org/repo/appstream/x86_64/icons/128x128/org.videolan.VLC.png"
- "64": "https://dl.flathub.org/repo/appstream/x86_64/icons/64x64/org.videolan.VLC.png"
-
-- name: "Blender"
- id: "org.blender.Blender"
- ref: "app/org.blender.Blender/x86_64/stable"
- summary: "3D modelling and animation"
- color: "#D89C7F"
- "flatpakref": "https://dl.flathub.org/repo/appstream/com.slack.Slack.flatpakref"
- icons:
- "128": "https://dl.flathub.org/repo/appstream/x86_64/icons/128x128/org.blender.Blender.png"
- "64": "https://dl.flathub.org/repo/appstream/x86_64/icons/64x64/org.blender.Blender.png"
-
-- name: "Podman Desktop"
- id: "io.podman_desktop.PodmanDesktop"
- ref: "app/io.podman_desktop.PodmanDesktop/x86_64/stable"
- summary: "Manage Podman and other container engines from a single UI and tray"
- color: "#A337D4"
- "flatpakref": "https://dl.flathub.org/repo/appstream/io.podman_desktop.PodmanDesktop.flatpakref"
- icons:
- "128": "https://dl.flathub.org/repo/appstream/x86_64/icons/128x128/io.podman_desktop.PodmanDesktop.png"
- "64": "https://dl.flathub.org/repo/appstream/x86_64/icons/64x64/io.podman_desktop.PodmanDesktop.png"
diff --git a/data/distro.yml b/data/distro.yml
deleted file mode 100644
index 4ad209e1..00000000
--- a/data/distro.yml
+++ /dev/null
@@ -1,521 +0,0 @@
-- name: Ubuntu
- logo: "ubuntu.svg"
- steps:
- - name: Install Flatpak
- text: "
-
To install Flatpak on Ubuntu 18.10 (Cosmic Cuttlefish) or later, open the Terminal app and run:
Note: Ubuntu distributes GNOME Software as a Snap in versions 20.04 to 23.04, and replaced it with App Center in 23.10 and newer—neither of which support installing Flatpak apps. Installing the Flatpak plugin will also install a deb version of GNOME Software, resulting in two "Software" apps being installed at the same time on Ubuntu 20.04 to 23.04, and a single new "Software" app on Ubuntu 23.10 and newer.
Flatpak is installed by default on Fedora Workstation, Fedora Silverblue, and Fedora Kinoite. To get started, all you need to do is enable Flathub, which is the best way to get Flatpak apps. Flathub is pre-configured as a part of the Third-Party Repositories. Alternatively, you can download and install the Flathub repository file.
The above links should work on the default GNOME and KDE Fedora installations, but if they fail for some reason you can manually add the Flathub remote by running:
Flatpak is installed by default on Manjaro 20 or higher.
-
To enable its support, navigate to the Software Manager (Add/Remove Programs)
-
Click on the triple line menu [or dots depending on the Desktop Environment] on the right, in the drop down menu select "Preferences"
-
Navigate to the "Flatpak" tab and slide the toggle to Enable Flatpak support (it is also possible to enable checking for updates, which is recommended).
'
- - name: Restart
- text: '
-
To complete setup, restart your system. Now all you have to do is install apps!
Flatpak applications can be installed on ChromeOS with the Crostini Linux compatibility layer. This is not available for all ChromeOS devices, so you should ensure your device is compatible before proceeding. A list of compatible devices is maintained here.
- steps:
- - name: Enable Linux support
- text: '
-
Navigate to chrome://os-settings, and scroll down to Developers and turn on Linux development environment. ChromeOS will take some time downloading and installing Linux.
'
- - name: Start a Linux terminal
- text: '
-
Press the Search/Launcher key, type "Terminal", and launch the Terminal app.
'
- - name: Install Flatpak
- text: '
-
To install Flatpak, run the following in the terminal:
To complete setup, restart Linux. You can do this by right-clicking terminal, and then clicking "Shut down Linux". Now all you have to do is install apps!
'
-
-- name: Red Hat Enterprise Linux
- logo: "redhat.svg"
- introduction: >
-
Flatpak is installed by default on Red Hat Enterprise Linux Workstation 9 and newer. To get started, all you need to do is enable Flathub, which is the best way to get Flatpak apps. Just download and install the Flathub repository file.
-
To install Flatpak on Red Hat Enterprise Linux Workstation 8 or older, run the following in a terminal:
The above links should work on the default Red Hat Enterprise Linux Workstation 9 installation, but if they fail for some reason you can manually add the Flathub remote by running:
- flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo
-
-- name: Linux Mint
- logo: "mint.svg"
- introduction: >
-
Flatpak support is built into Linux Mint 18.3 and newer—no setup required!
Flatpak is available in the default repositories of all currently maintained openSUSE Leap and openSUSE Tumbleweed versions.
-
If you prefer a graphical installation, you can install Flatpak using a "1-click installer" from software.opensuse.org. If your distribution version is not shown by default, click Show under Unsupported distributions category and then select from the list.
-
Alternatively, install Flatpak from the command line using Zypper:
Flatpak is installed by default on Rocky Linux 8 and newer, when installed with a software selection that includes GNOME (Server with GUI, Workstation). If you are using such a system, you may skip this step. To install Flatpak on Rocky Linux, run the following in a terminal:
Flatpak is installed by default on CentOS Stream 8 and newer, when using GNOME. To get started, all you need to do is enable Flathub, which is the best way to get Flatpak apps. Just download and install the Flathub repository file.
Flatpak is installed by default on AlmaLinux 8 and newer, when using GNOME. To get started, all you need to do is enable Flathub, which is the best way to get Flatpak apps. Just download and install the Flathub repository file.
Flatpak can be installed from the community repository. Run the following in a terminal:
- doas apk add flatpak"
- - name: Install the Software Flatpak plugin
- text: "
-
You can install the Flatpak plugin for either the GNOME Software (since v3.13) or KDE Discover (since v3.11), making it possible to install apps without needing the command line. To install, for GNOME Software run:
- doas apk add gnome-software-plugin-flatpak
-
For KDE Discover run:
- doas apk add discover-backend-flatpak"
- - name: Add the Flathub repository
- text: '
-
Flathub is the best place to get Flatpak apps. To enable it, download and install the Flathub repository file or run:
Flatpak support is built into OpenMandriva for all actively supported versions, starting from the stable/fixed release 'Rock 5.0', through the development release 'Cooker', and ending with the rolling release 'ROME'.
-
Flatpak comes with the pre-configured Flathub repository.
elementary OS 5.1 and newer comes with Flatpak support out of the box. For non-curated apps, head to Flathub to install any app using the big "Install" button, and open the downloaded `.flatpakref` file with Sideload.
-
Note: After installing one app from a remote like Flathub, all other apps from that remote will also automatically show up in AppCenter.
Flatpak is installed by default on PureOS. To get started, all you need to do is enable Flathub, which is the best way to get Flatpak apps. Just download and install the Flathub repository file.
To complete setup, restart your system. Now all you have to do is install apps!
'
-
-- name: MX Linux
- logo: "mxlinux.svg"
- steps:
- - name: Enable Flatpak through the Software Manager
- text: '
-
Flatpak support is built in from MX 18 and later. It is only required to activate the Flathub repository following these instructions:
-
Open MX Package Installer (open the menu and look in MX Tools), select the "Flatpaks" tab, to activate the repository you will need to enter the root password.
'
- - name: Restart
- text: '
-
To complete setup, restart your system. Now all you have to do is install apps!
To complete setup, restart your system. Now all you have to do is install apps!
-
Note: graphical installation of Flatpak apps may not be possible with Slackware.
'
diff --git a/data/menu.toml b/data/menu.toml
new file mode 100644
index 00000000..1616ef7b
--- /dev/null
+++ b/data/menu.toml
@@ -0,0 +1,37 @@
+[[items]]
+title = "Get Setup ↗"
+url = "https://flathub.org/setup"
+external = true
+topnav = true
+
+[[items]]
+title = "Browse Apps ↗"
+url = "https://flathub.org/"
+external = true
+
+[[items]]
+title = "Developer Guide ↗"
+url = "https://docs.flatpak.org/"
+external = true
+
+[[items]]
+title = "FAQ"
+url = "faq"
+
+[[items]]
+title = "Blog Posts"
+url = "blog-posts"
+
+[[items]]
+title = "Presentations & Articles"
+url = "presentations"
+
+[[items]]
+title = "About"
+url = "about"
+topnav = true
+
+[[items]]
+title = "Press"
+url = "press"
+topnav = true
diff --git a/data/menu.yml b/data/menu.yml
deleted file mode 100644
index ab0958b3..00000000
--- a/data/menu.yml
+++ /dev/null
@@ -1,23 +0,0 @@
-- title: Get Setup
- link: "/setup/"
- onlyfooter: true
-- title: Browse Apps ↗
- link: "https://flathub.org/"
- onlyfooter: true
-- title: Developer guide ↗
- link: "https://docs.flatpak.org/"
- onlyfooter: true
-- title: FAQ
- link: "/faq.html"
- onlyfooter: true
-- title: Presentations & Articles
- link: "/presentations.html"
- onlyfooter: true
-- title: Blog Posts
- link: "/blog-posts.html"
- onlyfooter: true
-- title: About Us & Contact
- link: "/about.html"
-- title: Press
- link: "/press.html"
- onlyfooter: true
diff --git a/data/site.yml b/data/site.yml
deleted file mode 100644
index 1812dc01..00000000
--- a/data/site.yml
+++ /dev/null
@@ -1,22 +0,0 @@
-name: Flatpak
-domain: https://flatpak.org
-punchline: The Future of Application Distribution
-
-## If unspecified, timezone defaults to UTC
-## For more TZs, see the top of:
-## https://github.com/rails/rails/blob/master/activesupport/lib/active_support/values/time_zone.rb
-#timezone: Berlin
-#timezone: America/New_York
-#timezone: Eastern Time (US & Canada)
-
-
-# Global meta tags on each page <>
-# To have page-specific tags added, please add a YAML list to "tags:"
-# in that page's frontmatter block (the part at the top between ---)
-keywords:
- - xdgapp
- - xdg
- - zapp
- - flatpack
- - flatpak
-
diff --git a/nginx.conf b/nginx.conf
index 5234d22d..236a1d73 100644
--- a/nginx.conf
+++ b/nginx.conf
@@ -44,12 +44,11 @@ server {
server_name _;
root /srv/http/;
- try_files $uri $uri/ $uri.html =404;
+ try_files $uri $uri/index.html $uri.html =404;
error_page 404 /404.html;
absolute_redirect off;
- rewrite ^/setup/(.*)/ https://flatpak.org/setup/$1;
-
+ # External redirects (cannot be handled by Zola aliases)
location /apps.html {
return 301 https://flathub.org/;
}
@@ -58,10 +57,6 @@ server {
return 301 http://docs.flatpak.org/en/latest/;
}
- location /getting.html {
- return 301 /setup/;
- }
-
location /hello-world.html {
return 301 http://docs.flatpak.org/en/latest/getting-started.html;
}
@@ -70,6 +65,14 @@ server {
return 301 http://docs.flatpak.org/en/latest/available-runtimes.html;
}
+ # Blog posts page removed — redirect to homepage
+ location /blog-posts.html {
+ return 301 /;
+ }
+ location /blog-posts/ {
+ return 301 /;
+ }
+
# Some flatpak images are compressed SVG files. Skip compressing
# them again but tell clients that they're already compressed since
# many browsers don't know that svgz is compressed.
diff --git a/source/404.html.haml b/source/404.html.haml
deleted file mode 100644
index 967260ac..00000000
--- a/source/404.html.haml
+++ /dev/null
@@ -1,13 +0,0 @@
----
-title: Flatpak—page not found
-description: 404 Page not Found
----
-
-%section#notfound
- .container
- .row
- .col-lg-5.col-lg-offset-4
- %p
- = partial "404.svg"
- %p.centered
- Sorry, that page can't be found.
diff --git a/source/_footer.haml b/source/_footer.haml
deleted file mode 100644
index fb0f091a..00000000
--- a/source/_footer.haml
+++ /dev/null
@@ -1,38 +0,0 @@
-%section#footer.bg-black
- .container
- .row
- .col-lg-3.col-lg-offset-1.col-sm-3.hidden-xs
- %a.navbar-brand.page-scroll{:href => "#page-top"}
- =partial "logo.svg"
- %ul.col-lg-7.col-lg-offset-0.col-sm-8.col-sm-offset-0.col-xs-7.col-xs-offset-2
- %li.toplevel
- = link_to "Home", "/index.html"
- - data.menu.each do |i|
- %li.toplevel
- /id links on index page
- - if (current_page.path == 'index.html')
- = link_to i.title, i.link, :class => "page-scroll"
- - else
- - if (i.link.match('^#'))
- = "#{i.title}"
- - else
- = link_to i.title, i.link, :class => "page-scroll"
- - if !i.submenu.nil?
- %ul
- - i.submenu.each do |j|
- %li
- = link_to j.title, j.link, :class => "page-scroll"
- .col-lg-1.col-sm-1.col-xs-1
-
- =partial "twitter.svg"
-
- :css
- #twitterbird path { transition: fill 400ms ease-in-out; }
- #twitterbird path:hover { fill: #fff !important; }
- .col-lg-1.col-sm-1.col-xs-1
-
- =partial "mastodon.svg"
-
- :css
- #mastodonlogo path { transition: fill 400ms ease-in-out; }
- #mastodonlogo path:hover { fill: #fff !important; }
diff --git a/source/_graph.svg b/source/_graph.svg
deleted file mode 100644
index 65bd37e8..00000000
--- a/source/_graph.svg
+++ /dev/null
@@ -1,709 +0,0 @@
-
-
diff --git a/source/_logo.svg b/source/_logo.svg
deleted file mode 100644
index 8c113579..00000000
--- a/source/_logo.svg
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/source/_mastodon.svg b/source/_mastodon.svg
deleted file mode 100644
index dec86e3e..00000000
--- a/source/_mastodon.svg
+++ /dev/null
@@ -1,40 +0,0 @@
-
-
diff --git a/source/_navigation.haml b/source/_navigation.haml
deleted file mode 100644
index 7df06139..00000000
--- a/source/_navigation.haml
+++ /dev/null
@@ -1,17 +0,0 @@
-#bs-example-navbar-collapse-1.collapse.navbar-collapse
- %ul.nav.navbar-nav.navbar-right
- -if (current_page.path == 'index.html')
- - data.menu.each do |i|
- -if (!i.onlyfooter)
- %li
- = link_to i.title, i.link, :class => "page-scroll"
- -else
- - data.menu.each do |i|
- -if (!i.onlyfooter)
- - if i.link.match('^#').nil?
- %li
- = link_to i.title, i.link, :class => "page-scroll"
- - else
- %li
- = "#{i.title}"
- / /.navbar-collapse
diff --git a/source/_twitter.svg b/source/_twitter.svg
deleted file mode 100644
index 10c6f887..00000000
--- a/source/_twitter.svg
+++ /dev/null
@@ -1,25 +0,0 @@
-
-
diff --git a/source/about.html.haml b/source/about.html.haml
deleted file mode 100644
index a8cac871..00000000
--- a/source/about.html.haml
+++ /dev/null
@@ -1,160 +0,0 @@
----
-title: Flatpak—the future of application distribution
-description: About Flatpak
----
-
-%section#about
- .container
- .row
- .col-lg-8.col-lg-offset-2
- %h1.section-heading.text-center About Us
- %hr.primary
- %p
- Flatpak is developed by an independent community, made up of contributors, volunteers and supporting organizations. It is a true upstream open source project, dedicated to providing technology and services that can be used by all, with no vendor lock-in. We have strong links to other Free Software projects, including the Freedesktop project.
- %p
- All our code is freely available, with no contributor agreement required. Volunteers and contributing organizations are welcome, as equal partners.
- .row
- .col-lg-8.col-lg-offset-2
- %h1.section-heading.text-center Contact
- %hr.primary
- .row
- .col-lg-2.col-xs-4.col-lg-offset-4
- .right.toneddown Mailing list
- .col-lg-4.col-xs-8
- =link_to "flatpak at lists.freedesktop.org", "https://lists.freedesktop.org/mailman/listinfo/flatpak"
- .row
- .col-lg-4.col-xs-2.col-lg-offset-2
- .right.toneddown Private mailing list for security issues
- .col-lg-4.col-xs-8
- =link_to "flatpak-security at lists.freedesktop.org", "https://lists.freedesktop.org/mailman/listinfo/flatpak-security"
- .row
- .col-lg-2.col-xs-4.col-lg-offset-4
- .right.toneddown Matrix
- .col-lg-4.col-xs-8
- =link_to "#flatpak on Matrix.org", "https://matrix.to/#/#flatpak:matrix.org"
- .row
- .col-lg-2.col-xs-4.col-lg-offset-4
- .right.toneddown GitHub
- .col-lg-4.col-xs-8
- =link_to "github.com/flatpak", "https://github.com/flatpak"
- .row.largegap
- .col-lg-8.col-lg-offset-2
- %p
- Issues with this website can be reported through its
- = succeed "." do
- =link_to "GitHub project", "https://github.com/flatpak/flatpak.github.io/issues"#
- .row.largegap
- .col-lg-8.col-lg-offset-2
- %h1.section-heading.text-center Flatpak History
- %hr.primary
- .timeline.mediumgap
- .date August 2007
- .description
- Alexander Larsson releases Glick, his first app bundling framework
- .date November 2011
- .description
- Glick 2 is released, a modernized version of the first Glick framework
- .date July 2012
- .decription
- “GNOME OS” session held at GUADEC, includes initial planning for a new app bundling format
- .date September 2012
- .description
- Alexander Larsson releases experimental “bundler” framework
- .date January 2013
- .description
- “Linux Apps” proposal discussed at the GNOME Developer Experience hackfest, Brussels
- .date December 2014
- .description
- Work begins on xdg-app, which later becomes Flatpak
- .date March 2015
- .descripton
- xdg-app 0.1 released, the very first version of Flatpak
- .date December 2015
- .description
- GNOME's “Software” gains the ability to install xdg-app applications
- .date May 2016
- .description
- xdg-app renamed to Flatpak, 0.6.0 released;
- = succeed " included endorsements by Red Hat, Endless Computers and Collabora" do
- =link_to "accompanying press release", "https://flatpak.org/press/2016-06-21-flatpak-released.html"
- .date June 2016
- .description
- Work on desktop portals security framework begins
- .date June 2016
- .description
- LibreOffice is the first major application to adopt Flatpak for publishing on Linux
- .date July 2016
- .description
- GTK+ 3.21.4 released with initial support for the portals framework
- .date August 2016
- .description
- Endless OS 3.0 released, the first publicly available OS to use Flatpak by default. Adoption of Flatpak by Apertis IVI also becomes public knowledge.
- .date November 2016
- .description
- ClearLinux announces their adoption of Flatpak
- .date December 2016
- .description
- Flatpak 0.8.0 released, the start of the first stable series with long-term support
- .date May 2017
- .description
- Initial soft launch of Flathub hosting service
- .date May 2017
- .description
- KDE Plasma 5.10 released with initial support for portals
- .date October 2017
- .description
- Flatpak 0.10.0 released, marking the start of the second supported stable release series
- .date October 2017
- .description
- KDE Plasma 5.11 released, “Discover” gains the ability to install Flatpak apps
- .date October 2017
- .description
- GIMP adopts Flatpak to publish on Linux
- .date November 2017
- .description
- Linux Mint 18.3 released, includes out of the box Flatpak integration
- .date August 2018
- .description
- Flatpak 1.0 released, the first release in a new stable series, with major new features; Flathub beta period ends; Freedesktop runtime 18.08 released with new support period policy
- .date September 2018
- .description
- KDE introduces the KDE Testing Applications Flatpak repository;
- =link_to "commit", "https://invent.kde.org/packaging/flatpak-kde-applications/-/commit/2d759a0d601942c3cf3a1d6a562942da543f7f83"
- .date December 2019
- .description
- elementary OS 5.1 Hera released, includes out of the box Flatpak integration
- .date April 2020
- .description
- Mozilla adopts Flatpak to publish Firefox on Linux
- .date April 2020
- .description
- System76 releases Pop!_OS 20.04, includes out of the box Flatpak integration
- .date October 2021
- .description
- 1Password adopts Flatpak to publish on Linux
- .date Febuary 2022
- .description
- Valve releases the Steam Deck; a handheld video game console with out of the box Flatpak and Flathub integration
- .date Febuary 2022
- .description
- OBS Studio adopts Flatpak to publish on Linux
- .date May 2022
- .description
- Red Hat Enterprise Linux Workstation 9 released, includes out of the box Flatpak integration
- .date October 2022
- .description
- Flathub introduces verified status;
- =link_to "commit", "https://github.com/flathub/website/commit/5aae6b759b15ae26c155a0c8c18f13ca0da29ee3"
- .date April 2023
- .description
- Purism introduces Flatpak and the PureOS Flatpak repository;
- =link_to "announcement", "https://puri.sm/posts/introducing-flatpaks-on-pureos/"
- .date April 2023
- .description
- Valve adopts portals for the popular Steam application
- .date May 2023
- .description
- Flathub offers more than 2000 apps and celebrates 1B total downloads
- .date October 2023
- .description
- Discord adopts Flatpak to publish on Linux
diff --git a/source/blog-posts.html.haml.markdown b/source/blog-posts.html.haml.markdown
deleted file mode 100644
index 3d8b5fcd..00000000
--- a/source/blog-posts.html.haml.markdown
+++ /dev/null
@@ -1,216 +0,0 @@
----
-title: Blog Posts
-description: Blog posts about Flatpak
----
-
-:markdown
-
- # Blog Posts
-
-
-
- If you know of a blog post that isn't listed, please [file an issue](https://github.com/flatpak/flatpak.github.io/issues/new) so we can add it!
-
- ## 2024
-
- [**Cassidy James Blaede: 2 Billion Downloads & Other Milestones from 2024 So Far**](https://docs.flathub.org/blog/2-billion-downloads-2024/)
- August 2024
-
- ## 2022
-
- [**Hubert Figuière: RTKit, portals, and Pipewire**](https://www.figuiere.net/hub/wlog/rtkit-portal-pipewire/)
- August 2022
-
- [**Will Thompson: How many Flathub apps reuse other package formats?**](https://blogs.gnome.org/wjjt/2022/06/14/how-many-flathub-apps-reuse-other-package-formats/)
- June 2022
-
- [**Jakub Steiner: Flatpak Brand Refresh**](https://blog.jimmac.eu/2022/flatpak-refresh/)
- June 2022
-
- [**Martín Abente Lahaye: Flatseal 1.8.0**](https://blogs.gnome.org/tchx84/2022/05/31/flatseal-1-8-0/)
- May 2022
-
- [**Will Thompson: Evince, Flatpak, and GTK print previews**](https://blogs.gnome.org/wjjt/2022/05/30/evince-flatpak-and-gtk-print-previews/)
- May 2022
-
- [**TheEvilSkeleton: Response to "Flatpak Is Not the Future"**](https://theevilskeleton.gitlab.io/2022/05/16/response-to-flatpak-is-not-the-future.html)
- May 2022
-
- [**Jan Grulich: How to use Libportal/libportal-qt**](https://jgrulich.cz/2022/02/10/how-to-use-libportal-libportal-qt/)
- February 2022
-
- ## 2021
-
- [**Phaedrus Leeds: A Quick PSA on Writing Portal-friendly Application Code**](https://blogs.gnome.org/mwleeds/2021/12/03/a-quick-psa-on-writing-portal-friendly-application-code/)
- December 2021
-
- [**Will Thompson: On Flatpak disk usage and deduplication**](https://blogs.gnome.org/wjjt/2021/11/24/on-flatpak-disk-usage-and-deduplication/)
- November 2021
-
- [**Martín Abente Lahaye: Flatseal 1.7.5**](https://blogs.gnome.org/tchx84/2021/11/20/flatseal-1-7-5/)
- November 2021
-
- [**Peter Hutterer: Flatpak portals - how do they work?**](https://who-t.blogspot.com/2021/08/flatpak-portals-how-do-they-work.html)
- September 2021
-
- [**Lionir Deadman: Flathub, runtimes and stats**](https://thelion.website/flathub-runtimes-and-stats/)
- June 2021
-
- [**Martín Abente Lahaye: Flatseal 1.7.0**](https://blogs.gnome.org/tchx84/2021/04/23/flatseal-1-7-0/)
- April 2021
-
- [**TheEvilSkeleton: Response to flatkill.org**](https://theevilskeleton.gitlab.io/2021/02/11/response-to-flatkill-org.html)
- February 2021
-
- [**Phaedrus Leeds: Cleaning Up Unused Flatpak Runtimes**](https://blogs.gnome.org/mwleeds/2021/01/11/cleaning-up-unused-flatpak-runtimes/)
- January 2021
-
- ## 2020
-
- [**Alexander Larsson: Scaling Flathub 100x**](https://blogs.gnome.org/alexl/2020/11/20/scaling-flathub/)
- November 2020
-
- [**Alexander Larsson: Compatibility in a sandboxed world**](https://blogs.gnome.org/alexl/2020/08/11/compatibility-in-a-sandboxed-world/)
- August 2020
-
- [**Martín Abente Lahaye: Flatseal 1.6.0**](https://blogs.gnome.org/tchx84/2020/06/26/flatseal-1-6-0-and-beyond/)
- June 2020
-
- [**Hubert Figuière: Getting a stack trace with debug symbols out of a flatpak**](https://www.figuiere.net/technotes/notes/tn001/)
- June 2020
-
- [**Alexander Larsson: Putting container updates on a diet**](https://blogs.gnome.org/alexl/2020/05/13/putting-container-updates-on-a-diet/)
- May 2020
-
- ## 2019
-
- [**Matthias Clasen: More on Flatpak Updates**](https://blogs.gnome.org/mclasen/2019/12/19/9100/)
- December 2019
-
- [**TingPing: Hardening Flatpak Permissions Over Time**](https://blog.tingping.se/2019/10/06/hardening-flatpak-permissions.html)
- October 2019
-
- [**Matthias Clasen: Some Flatpak Updates**](https://blogs.gnome.org/mclasen/2019/10/03/some-flatpak-updates/)
- October 2019
-
- [**Robert McQueen: Flathub, brought to you by...**](https://ramcq.net/2019/08/12/flathub-brought-to-you-by/)
- August 2019
-
- [**Matthias Clasen: Settings, in a Sandbox World**](https://blogs.gnome.org/mclasen/2019/07/12/settings-in-a-sandbox-world/)
- July 2019
-
- [**Christian Hergert: Flatpaking Terminals**](https://blogs.gnome.org/chergert/2019/04/25/flatpaking-terminals/)
- April 2019
-
- [**Alexander Larsson: Introducing flat-manager**](https://blogs.gnome.org/alexl/2019/03/19/introducing-flat-manager/)
- March 2019
-
- [**Alexander Larsson: Changes in Flathub land**](https://blogs.gnome.org/alexl/2019/02/19/changes-in-flathub-land/)
- February 2019
-
- [**Matthias Clasen: What's New in Flatpak 1.2**](https://blogs.gnome.org/mclasen/2019/01/28/whats-new-in-flatpak-1-2/)
- January 2019
-
- ## 2018
-
- [**Matthias Clasen: Flatpak Commandline Design**](https://blogs.gnome.org/mclasen/2018/12/19/flatpak-commandline-design/)
- December 2018
-
- [**Matthias Clasen: An Update on Flatpak Updates**](https://blogs.gnome.org/mclasen/2018/11/26/an-update-on-flatpak-updates/)
- November 2018
-
- [**Robert McQueen: Flatpak, sandboxes and security**](https://ramcq.net/2018/10/15/flatpak-sandbox-security/)
- October 2018
-
- [**Alexander Larsson: Moving away from the 1.6 freedesktop runtime**](https://blogs.gnome.org/alexl/2018/10/11/moving-away-from-the-1-6-freedesktop-runtime/)
- October 2018
-
- [**Matthias Clasen: Flatpak, After 1.0**](https://blogs.gnome.org/mclasen/2018/10/08/flatpak-after-1-0/)
- October 2018
-
- [**Alexander Larsson: Flatpak on windows**](https://blogs.gnome.org/alexl/2018/09/17/flatpak-on-windows/)
- September 2018
-
- [**Matthias Clasen: On Flatpak Dependencies**](https://blogs.gnome.org/mclasen/2018/09/07/on-flatpak-dependencies/)
- September 2018
-
- [**Matthias Clasen: About Flatpak Installations**](https://blogs.gnome.org/mclasen/2018/08/26/about-flatpak-installations/)
- August 2018
-
- [**TingPing: Using host Nvidia driver with Flatpak**](https://blog.tingping.se/2018/08/26/flatpak-host-extensions.html)
- August 2018
-
- [**Alexander Larsson: Kick-starting the revolution 1.0**](https://blogs.gnome.org/alexl/2018/08/21/kick-starting-the-revolution-1-0/)
- August 2018
-
- [**TingPing: Easier Flatpak manifest editing with VSCode**](https://blog.tingping.se/2018/08/19/flatpak-schema.html)
- August 2018
-
- [**Alexander Larsson: The birth of a new runtime**](https://blogs.gnome.org/alexl/2018/08/10/the-birth-of-a-new-runtime/)
- August 2018
-
- [**Matthias Clasen: Flatpak Portal Experiments**](https://blogs.gnome.org/mclasen/2018/08/03/flatpak-portal-experiments/)
- August 2018
-
- [**Matthias Clasen: Flatpak - A Look Behind the Portal**](https://blogs.gnome.org/mclasen/2018/07/19/flatpak-a-look-behind-the-portal/)
- July 2018
-
- [**Matthias Clasen: The Flatpak BoF at GUADEC**](https://blogs.gnome.org/mclasen/2018/07/14/the-flatpak-bof-at-guadec/)
- July 2018
-
- [**Matthias Clasen: Flatpak, Making Contribution Easy**](https://blogs.gnome.org/mclasen/2018/07/07/flatpak-making-contribution-easy/)
- July 2018
-
- [**Matthias Clasen: Flatpak in Detail, Part 3**](https://blogs.gnome.org/mclasen/2018/07/02/flatpak-in-detail-part-3/)
- July 2018
-
- [**Alexander Larsson: Flatpak - a history**](https://blogs.gnome.org/alexl/2018/06/20/flatpak-a-history/)
- June 2018
-
- [**Matthias Clasen: Flatpak in Detail, Part 2**](https://blogs.gnome.org/mclasen/2018/06/19/flatpak-in-detail-part-2/)
- June 2018
-
- [**Matthias Clasen: Flatpak in Detail**](https://blogs.gnome.org/mclasen/2018/06/13/flatpak-in-detail/)
- June 2018
-
- [**Alexander Larsson: Flatpak inception**](https://blogs.gnome.org/alexl/2018/04/27/flatpak-inception/)
- April 2018
-
- [**TingPing: Flatpaking application plugins**](https://blog.tingping.se/2018/03/18/flatpaking-plugins.html)
- March 2018
-
- [**PointestStick: Flatpak support in Discover**](https://pointieststick.com/2018/01/13/flatpak-support-in-discover/)
- January 2018
-
- ## 2017
-
- [**TingPing: Status of emulators Flatpak'd**](https://blog.tingping.se/2017/10/31/flatpaked-emulators.html)
- October 2017
-
- [**Alexander Larsson: On application sizes and bloat in flatpak**](https://blogs.gnome.org/alexl/2017/10/02/on-application-sizes-and-bloat-in-flatpak/)
- October 2017
-
- [**Simon McVittie: DebConf 17: Flatpak and Debian**](http://smcv.pseudorandom.co.uk/2017/flatpak_and_debian/)
- August 2017
-
- [**Robert McQueen: Welcome, Flathub!**](https://ramcq.net/2017/07/29/welcome-flathub/)
- July 2017
-
- [**TingPing: Flatpak now supports themes**](https://blog.tingping.se/2017/05/11/flatpak-theming.html)
- May 2017
-
- [**Simon McVittie: GTK hackfest 2017: D-Bus communication with containers**](http://smcv.pseudorandom.co.uk/2017/dbus_and_containers/)
- March 2017
-
- [**Matthias Clasen: Debugging a Flatpak Application**](https://blogs.gnome.org/mclasen/2017/01/20/debugging-a-flatpak-application/)
- January 2017
-
- ## 2016
-
- [**Simon McVittie: Flatpak in Debian**](http://smcv.pseudorandom.co.uk/2016/flatpak/)
- June 2016
-
- [**Simon McVittie: GNOME Developer Experience hackfest: xdg-app + Debian**](https://smcv.pseudorandom.co.uk/2016/xdg-app/)
- January 2016
-
-
diff --git a/source/distro-template.html.haml b/source/distro-template.html.haml
deleted file mode 100644
index a8425d2a..00000000
--- a/source/distro-template.html.haml
+++ /dev/null
@@ -1,24 +0,0 @@
----
-title: Flatpak—the future of application distribution
-description: #{locals[:name]} Quick Setup
----
-
-%section#setup
- .container
- .row
- .col-lg-10.col-lg-offset-1
- %h1.centered
- = locals[:name]
- Quick Setup
- %p.centered
- Follow these simple steps to start using Flatpak
-
- .row.largegap
- .col-lg-12
- %ol.distrotut
- - if locals[:introduction]
- = locals[:introduction]
- - Array(locals[:steps]).each_with_index do |step, i|
- %li
- %h2= step[:name]
- %p= step[:text]
\ No newline at end of file
diff --git a/source/faq.html.haml.markdown b/source/faq.html.haml.markdown
deleted file mode 100644
index ab7da3f3..00000000
--- a/source/faq.html.haml.markdown
+++ /dev/null
@@ -1,98 +0,0 @@
----
-title: Flatpak Frequently Asked Questions
-description: FAQ about the Flatpak project.
----
-
-:markdown
-
- # Frequently Asked Questions
-
-
-
- ### Why the name Flatpak?
-
- IKEA is a world-wide known brand whose success was partly built upon having developed and refined the idea of flatpacking
- their furniture, which allowed them huge cost savings and efficiencies compared to their competitors. So when we needed
- a new name for the packaging technology that had been developed by Alex Larsson, a native Swede, we thought that Flatpak would
- both be a nice play on his nationality and pay homage to the success of IKEA and at the same time send a strong signal
- about how revolutionary we thought this new packaging technology could be for the Linux desktop.
-
- ### What is the origin of the Flatpak technology?
-
- Flatpak is a technology that brings together many of the lessons learned by its creator Alexander Larsson during his long tenure
- as a Linux desktop developer and having spent time inside Red Hat working on container technologies. Flatpak builds upon existing
- technologies such as cgroups, namespaces, bind mounts and seccomp in the Linux kernel, OSTree from [Project Atomic](http://www.projectatomic.io/)
- and the OCI format that is developed by the [Open Container Initiative](https://www.opencontainers.org/).
- It has also spawned new technologies such as Bubblewrap which is shared between Flatpak and Project Atomic.
-
- ### Is Flatpak tied to GNOME?
-
- No. While Flatpak has been developed by people with a long involvement in the GNOME community it is not tied
- to any desktop. In fact, it was designed with the explicit goal of allowing it to build applications using any library stack or
- programming language an application author might want.
-
- ### Is Flatpak tied to Fedora?
-
- No. In fact, Flatpak and even [Flathub](https://flathub.org) are enabled by default on Endless OS and Linux Mint.
- The people developing Flatpak have a long history in contributing to and building Linux distributions like Debian,
- Fedora, and others, and solving the problems that arise when shipping applications for these platforms. Flatpak
- was built to be distribution agnostic and allow deployment on any Linux operating system out there.
-
- ### Is Flatpak tied to Linux?
-
- Yes. We are explicitly using many features of the linux kernel (bind mounts, namespaces, seccomp, etc) to create the sandbox that
- Flatpak apps are running in. It may be possible to use equivalent technologies on other kernels, but that would be a non-trivial
- amount of work, and we don’t consider this one of our priorities.
-
- ### Is Flatpak tied to systemd?
-
- No. Versions of Flatpak before 0.6.10 relied on systemd for cgroups setup, but this is no longer required.
-
- ### Is Flatpak the same as xdg-app?
-
- Yes, while xdg-app was a fine name to use during development we wanted something with wider appeal and more sparkle
- to it than xdg-app could provide. So as part of formally launching Flatpak as ready for use we decided to pick a more accessible
- and fun name.
-
- ### Is Flatpak a container technology?
-
- It can be, but it doesn’t have to be. Since a desktop application would require quite extensive changes in order to
- be usable when run inside a container you will likely see Flatpak mostly deployed as a convenient library bundling technology
- early on, with the sandboxing or containerization being phased in over time for most applications. In general though we
- try to avoid using the term container when speaking about Flatpak as it tends to cause comparisons with Docker and rkt,
- comparisons which quickly stop making technical sense due to the very different problem spaces these technologies
- try to address. And thus we prefer using the term sandboxing.
-
- ### How does Flatpak relate to freedesktop.org technologies such as desktop files and AppStream metadata?
-
- These standards are incorporated as mandatory parts in the Flatpak definition. By relying on these standards
- we are building on years of investment and support under Linux.
-
- ### Can Flatpak be used on servers too?
-
- Flatpak is designed to run inside a desktop session and relies on certain session services, such as a D-Bus session bus
- and, optionally, a systemd `--user` instance. This makes Flatpak not a good match for a server.
-
- However, the build features of Flatpak run fine outside a session, so you can build things on a server.
-
- ### Is Flatpak compatible with other desktop isolation frameworks?
-
- In general unprivileged container systems can’t stack, because anything running inside the sandbox does not have the necessary privileges to set up a sandbox, nor does it have the ability to raise its privileges in any way. For instance, Firejail can never work inside Flatpak, because it is setuid. That being said, using multiple sandboxing frameworks at once does not really make anything more secure, so there is little point in trying to nest things like that.
-
- It is certainly possible for Flatpak and Flatpak applications to coexist with applications that are packaged in other ways, on the same host system.
-
- ### Are there any IDEs that support Flatpak?
-
- Yes!
-
- Version 3.22.4 and newer of [Builder](https://apps.gnome.org/Builder/) includes support for `flatpak-builder` manifests. This ensures your project is built using your selected Flatpak runtime and any external dependencies. Support for running your application inside Flatpak is also supported. By developing your application within the exact same environment as your users you can squash those “Works for me” bugs before they reach your users!
-
- ### Can I host my Flatpak app on GitHub?
-
- Flatpak repositories can’t (currently) be put on GitHub in a convenient way.
- As an alternative, you can create a single-file bundle, and put that up on GitHub
- as a “release.” Note that bundles have some drawbacks, compared to a repository.
- Another option you have is to get your app on [Flathub](https://flathub.org/)
- which will allow your users to get updates.
-
-
diff --git a/source/fonts/Inter.var.woff2 b/source/fonts/Inter.var.woff2
deleted file mode 100644
index 365eedc5..00000000
Binary files a/source/fonts/Inter.var.woff2 and /dev/null differ
diff --git a/source/img/apple-touch-icon.svg b/source/img/apple-touch-icon.svg
deleted file mode 100644
index b3415397..00000000
--- a/source/img/apple-touch-icon.svg
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
diff --git a/source/img/container.webp b/source/img/container.webp
deleted file mode 100644
index 7bce53ed..00000000
Binary files a/source/img/container.webp and /dev/null differ
diff --git a/source/img/delivery_truck.original.png b/source/img/delivery_truck.original.png
deleted file mode 100644
index bf792872..00000000
Binary files a/source/img/delivery_truck.original.png and /dev/null differ
diff --git a/source/img/delivery_truck2.original.png b/source/img/delivery_truck2.original.png
deleted file mode 100644
index ff4a3701..00000000
Binary files a/source/img/delivery_truck2.original.png and /dev/null differ
diff --git a/source/img/delivery_truck2.png b/source/img/delivery_truck2.png
deleted file mode 100644
index 86770c34..00000000
Binary files a/source/img/delivery_truck2.png and /dev/null differ
diff --git a/source/img/distro/almalinux.svg b/source/img/distro/almalinux.svg
deleted file mode 100644
index b2e050ae..00000000
--- a/source/img/distro/almalinux.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
diff --git a/source/img/distro/alpine.svg b/source/img/distro/alpine.svg
deleted file mode 100644
index 6b43c64e..00000000
--- a/source/img/distro/alpine.svg
+++ /dev/null
@@ -1,276 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/altlinux-dark.svg b/source/img/distro/altlinux-dark.svg
deleted file mode 100644
index affd52c5..00000000
--- a/source/img/distro/altlinux-dark.svg
+++ /dev/null
@@ -1,17 +0,0 @@
-
diff --git a/source/img/distro/altlinux.svg b/source/img/distro/altlinux.svg
deleted file mode 100644
index de3d97ab..00000000
--- a/source/img/distro/altlinux.svg
+++ /dev/null
@@ -1,16 +0,0 @@
-
diff --git a/source/img/distro/arch.svg b/source/img/distro/arch.svg
deleted file mode 100644
index c4d13f3e..00000000
--- a/source/img/distro/arch.svg
+++ /dev/null
@@ -1,228 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/centos.svg b/source/img/distro/centos.svg
deleted file mode 100644
index 1a3f9f10..00000000
--- a/source/img/distro/centos.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/source/img/distro/chrome-os.svg b/source/img/distro/chrome-os.svg
deleted file mode 100644
index 9aad7bba..00000000
--- a/source/img/distro/chrome-os.svg
+++ /dev/null
@@ -1,838 +0,0 @@
-
-
diff --git a/source/img/distro/crystallinux.svg b/source/img/distro/crystallinux.svg
deleted file mode 100644
index 6f4c9263..00000000
--- a/source/img/distro/crystallinux.svg
+++ /dev/null
@@ -1,5 +0,0 @@
-
-
diff --git a/source/img/distro/debian.svg b/source/img/distro/debian.svg
deleted file mode 100644
index 30329f47..00000000
--- a/source/img/distro/debian.svg
+++ /dev/null
@@ -1,154 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/deepin.svg b/source/img/distro/deepin.svg
deleted file mode 100644
index 9738f0e1..00000000
--- a/source/img/distro/deepin.svg
+++ /dev/null
@@ -1,123 +0,0 @@
-
-
diff --git a/source/img/distro/elementary-os-dark.svg b/source/img/distro/elementary-os-dark.svg
deleted file mode 100644
index f845c32d..00000000
--- a/source/img/distro/elementary-os-dark.svg
+++ /dev/null
@@ -1,102 +0,0 @@
-
-
diff --git a/source/img/distro/elementary-os.svg b/source/img/distro/elementary-os.svg
deleted file mode 100644
index f86f1141..00000000
--- a/source/img/distro/elementary-os.svg
+++ /dev/null
@@ -1,102 +0,0 @@
-
-
diff --git a/source/img/distro/endeavouros-dark.svg b/source/img/distro/endeavouros-dark.svg
deleted file mode 100644
index 5e6482be..00000000
--- a/source/img/distro/endeavouros-dark.svg
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
diff --git a/source/img/distro/endeavouros.svg b/source/img/distro/endeavouros.svg
deleted file mode 100644
index 24c7ea25..00000000
--- a/source/img/distro/endeavouros.svg
+++ /dev/null
@@ -1,96 +0,0 @@
-
-
diff --git a/source/img/distro/endless.svg b/source/img/distro/endless.svg
deleted file mode 100644
index 7ef91b0a..00000000
--- a/source/img/distro/endless.svg
+++ /dev/null
@@ -1,82 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/fedora.svg b/source/img/distro/fedora.svg
deleted file mode 100644
index d789e9eb..00000000
--- a/source/img/distro/fedora.svg
+++ /dev/null
@@ -1,53 +0,0 @@
-
-
diff --git a/source/img/distro/gentoo.svg b/source/img/distro/gentoo.svg
deleted file mode 100644
index 7c382cf1..00000000
--- a/source/img/distro/gentoo.svg
+++ /dev/null
@@ -1,231 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/guix-dark.svg b/source/img/distro/guix-dark.svg
deleted file mode 100644
index bf36ebcc..00000000
--- a/source/img/distro/guix-dark.svg
+++ /dev/null
@@ -1,177 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/guix.svg b/source/img/distro/guix.svg
deleted file mode 100644
index 9b9e8f6f..00000000
--- a/source/img/distro/guix.svg
+++ /dev/null
@@ -1,177 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/kdeneon.svg b/source/img/distro/kdeneon.svg
deleted file mode 100644
index 5068c338..00000000
--- a/source/img/distro/kdeneon.svg
+++ /dev/null
@@ -1,176 +0,0 @@
-
-
diff --git a/source/img/distro/kubuntu.svg b/source/img/distro/kubuntu.svg
deleted file mode 100644
index 6aa4feaf..00000000
--- a/source/img/distro/kubuntu.svg
+++ /dev/null
@@ -1,101 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/mageia.svg b/source/img/distro/mageia.svg
deleted file mode 100644
index 060b1c4d..00000000
--- a/source/img/distro/mageia.svg
+++ /dev/null
@@ -1,316 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/manjaro.svg b/source/img/distro/manjaro.svg
deleted file mode 100644
index e7774b7e..00000000
--- a/source/img/distro/manjaro.svg
+++ /dev/null
@@ -1,93 +0,0 @@
-
-
diff --git a/source/img/distro/mint.svg b/source/img/distro/mint.svg
deleted file mode 100644
index ed8950e5..00000000
--- a/source/img/distro/mint.svg
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/mxlinux.svg b/source/img/distro/mxlinux.svg
deleted file mode 100644
index e15d9046..00000000
--- a/source/img/distro/mxlinux.svg
+++ /dev/null
@@ -1,81 +0,0 @@
-
-
diff --git a/source/img/distro/nixos.svg b/source/img/distro/nixos.svg
deleted file mode 100644
index 19e3a619..00000000
--- a/source/img/distro/nixos.svg
+++ /dev/null
@@ -1,518 +0,0 @@
-
-
diff --git a/source/img/distro/openmandriva.svg b/source/img/distro/openmandriva.svg
deleted file mode 100644
index 5992d10c..00000000
--- a/source/img/distro/openmandriva.svg
+++ /dev/null
@@ -1,90 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/opensuse.svg b/source/img/distro/opensuse.svg
deleted file mode 100644
index d93730a0..00000000
--- a/source/img/distro/opensuse.svg
+++ /dev/null
@@ -1,131 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/pardus.svg b/source/img/distro/pardus.svg
deleted file mode 100644
index 5fece936..00000000
--- a/source/img/distro/pardus.svg
+++ /dev/null
@@ -1,170 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/pisi-dark.svg b/source/img/distro/pisi-dark.svg
deleted file mode 100644
index 7555bc0d..00000000
--- a/source/img/distro/pisi-dark.svg
+++ /dev/null
@@ -1,306 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/pisi.svg b/source/img/distro/pisi.svg
deleted file mode 100644
index 05dc0259..00000000
--- a/source/img/distro/pisi.svg
+++ /dev/null
@@ -1,306 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/pop-os.svg b/source/img/distro/pop-os.svg
deleted file mode 100644
index 0d06a7dd..00000000
--- a/source/img/distro/pop-os.svg
+++ /dev/null
@@ -1,98 +0,0 @@
-
-
diff --git a/source/img/distro/pureos-dark.svg b/source/img/distro/pureos-dark.svg
deleted file mode 100644
index 9c3a67cf..00000000
--- a/source/img/distro/pureos-dark.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
diff --git a/source/img/distro/pureos.svg b/source/img/distro/pureos.svg
deleted file mode 100644
index 70cd1caf..00000000
--- a/source/img/distro/pureos.svg
+++ /dev/null
@@ -1,52 +0,0 @@
-
-
diff --git a/source/img/distro/raspberry-pi-os.svg b/source/img/distro/raspberry-pi-os.svg
deleted file mode 100644
index ac958e5c..00000000
--- a/source/img/distro/raspberry-pi-os.svg
+++ /dev/null
@@ -1,89 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/redhat.svg b/source/img/distro/redhat.svg
deleted file mode 100644
index 7e6715e6..00000000
--- a/source/img/distro/redhat.svg
+++ /dev/null
@@ -1,97 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/rockylinux.svg b/source/img/distro/rockylinux.svg
deleted file mode 100644
index 58f22104..00000000
--- a/source/img/distro/rockylinux.svg
+++ /dev/null
@@ -1,3 +0,0 @@
-
diff --git a/source/img/distro/salix.svg b/source/img/distro/salix.svg
deleted file mode 100644
index 9de77679..00000000
--- a/source/img/distro/salix.svg
+++ /dev/null
@@ -1,65 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/slackware.svg b/source/img/distro/slackware.svg
deleted file mode 100644
index ccea5803..00000000
--- a/source/img/distro/slackware.svg
+++ /dev/null
@@ -1,157 +0,0 @@
-
-
-
\ No newline at end of file
diff --git a/source/img/distro/solus.svg b/source/img/distro/solus.svg
deleted file mode 100644
index 059974fe..00000000
--- a/source/img/distro/solus.svg
+++ /dev/null
@@ -1,331 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/sulinos.svg b/source/img/distro/sulinos.svg
deleted file mode 100644
index bcf430bd..00000000
--- a/source/img/distro/sulinos.svg
+++ /dev/null
@@ -1,251 +0,0 @@
-
-
-
-
diff --git a/source/img/distro/ubuntu.svg b/source/img/distro/ubuntu.svg
deleted file mode 100644
index f5e18550..00000000
--- a/source/img/distro/ubuntu.svg
+++ /dev/null
@@ -1,9 +0,0 @@
-
diff --git a/source/img/distro/vanillaos.svg b/source/img/distro/vanillaos.svg
deleted file mode 100644
index b56a6dca..00000000
--- a/source/img/distro/vanillaos.svg
+++ /dev/null
@@ -1,321 +0,0 @@
-
-
diff --git a/source/img/distro/void-dark.svg b/source/img/distro/void-dark.svg
deleted file mode 100644
index e59fbc84..00000000
--- a/source/img/distro/void-dark.svg
+++ /dev/null
@@ -1,137 +0,0 @@
-
-
diff --git a/source/img/distro/void.svg b/source/img/distro/void.svg
deleted file mode 100644
index 734cdfec..00000000
--- a/source/img/distro/void.svg
+++ /dev/null
@@ -1,87 +0,0 @@
-
-
diff --git a/source/img/distro/zorin-os.svg b/source/img/distro/zorin-os.svg
deleted file mode 100644
index 4445744f..00000000
--- a/source/img/distro/zorin-os.svg
+++ /dev/null
@@ -1,71 +0,0 @@
-
-
diff --git a/source/img/download.original.svg b/source/img/download.original.svg
deleted file mode 100644
index 6f9de522..00000000
--- a/source/img/download.original.svg
+++ /dev/null
@@ -1,57 +0,0 @@
-
-
diff --git a/source/img/download.svg b/source/img/download.svg
deleted file mode 100644
index 7b03bc26..00000000
--- a/source/img/download.svg
+++ /dev/null
@@ -1 +0,0 @@
-
\ No newline at end of file
diff --git a/source/img/endless-apps.original.png b/source/img/endless-apps.original.png
deleted file mode 100644
index 6b87d055..00000000
Binary files a/source/img/endless-apps.original.png and /dev/null differ
diff --git a/source/img/logo.svgz b/source/img/logo.svgz
deleted file mode 100644
index 55a22751..00000000
Binary files a/source/img/logo.svgz and /dev/null differ
diff --git a/source/index.html.haml b/source/index.html.haml
deleted file mode 100644
index e80210b9..00000000
--- a/source/index.html.haml
+++ /dev/null
@@ -1,132 +0,0 @@
----
-title: Flatpak—the future of application distribution
-description: The days of chasing multiple Linux distributions are over. Standalone apps for Linux are here!
----
-
-%section.imagebanner
- .container
- .row.largegap
- .col-lg-10.col-lg-offset-1
- %h1.section-heading
- The future of apps on Linux
-
-%section#appsplash.bg-secondary
- .container
- .row
- .col-sm-6.col-sm-offset-1
- %h3
- Start using Flatpak and install from a growing collection of apps
- .appgrid
- - 0.upto(6) do |i|
- - if data.apps[i].icons["128"]
- .icon.featured{:style => "background-image: url(#{data.apps[i].icons['128']})"}
- - elsif data.apps[i].icons["64"]
- .icon{:style => "background-image: url(#{data.apps[i].icons['64']})"}
- .col-sm-4.col-sm-offset-1.centered
- %a#quicksetupbtn.btn-default.btn.btn-xl.page-scroll{:href => "/setup"} Get set up
-
- %p.small.mediumgap
- Already set up? Head over to
- = link_to "Flathub", "https://flathub.org"
- to install apps.
-
-
-
-%section.bg-primary-neutral
- .container
- .row.centered
- .col-sm-10.col-sm-offset-1
- %iframe.full{'width'=>'100%', 'src'=>'https://www.youtube.com/embed/jDVCITRWGgs', 'frameborder'=>'0', 'allowfullscreen'=>'true'}
- =link_to 'Flatpak 1.0', 'https://youtu.be/jDVCITRWGgs'
- .row.centered
- .col-sm-6.col-sm-offset-3
- %h2 A new world for application developers
- %p Flatpak changes app distribution for the better. Advantages include:
- .row.largegap
- .col-sm-5.col-sm-offset-1
- %h4 Build for every distro
- %p Create one app and distribute it to the entire Linux desktop market.
- .col-sm-5
- %h4 Stable platforms
- %p Runtimes provide platforms of common libraries that you can depend on.
- .row
- .col-sm-5.col-sm-offset-1
- %h4 Consistent environments
- %p Develop and test your application in an environment that’s identical to the one users have.
- .col-sm-5
- %h4 Full control over dependencies
- %p Flatpak makes it easy to bundle your own libraries as part of your app.
- .row
- .col-sm-5.col-sm-offset-1
- %h4 Easy build tools
- %p
- Flatpak’s build tools are simple and easy to use, and come with a
- =link_to 'full set of documentation.', 'https://docs.flatpak.org/'
- .col-sm-5
- %h4 Future-proof builds
- %p Flatpak apps continue to be compatible with new versions of Linux distributions.
- .row
- .col-sm-5.col-sm-offset-1
- %h4 Distribution made easy
- %p
- Make your app available to a rapidly growing audience of Flatpak users, with
- =link_to 'Flathub.', 'https://flathub.org/'
- .col-sm-5
- %h4 An independent project
- %p Flatpak is developed by an independent community, with no lock-in to a single vendor.
- .row.largegap
- .col-sm-6.col-sm-offset-4
- %a.btn.btn-default.btn-xl.page-scroll{:href => "https://docs.flatpak.org/en/latest/getting-started.html"} 5 minute tutorial
- %a.btn.btn-primary.btn-xl.page-scroll{:href => "https://docs.flatpak.org/en/latest/"} Developer guide
-
-%section#devsplash.bg-secondary
- .container
- .row.largegap
- .col-sm-5.col-sm-offset-1
- %h3
- Flatpak can be used with a total of
- = data.distro.count
- distros
- %p
- See the
- = link_to "complete list.", "/setup"
- .col-sm-6
- .distrogrid
- - 0.upto(4) do |i|
- .icon{:style => "background-image: url(/img/distro/#{data.distro[i].logo})"}
-
-%section.bg-primary
- .container
- .row.centered
- .col-sm-6.col-sm-offset-3
- %h2 What people are saying about Flatpak
- .row.largegap
- .col-sm-5.col-sm-offset-1
- %blockquote
- %p
- Bringing Flatpak technology into Debian enables us to run applications in a predictable environment with their most suitable library stack, without compromising the base OS's stability and flexibility.
- .author
- %em Simon McVittie
- .title Senior Software Engineer, Collabora
- .col-sm-5
- %blockquote
- %p
- At Endless, we’re proud to be a part of this movement and have fully embraced Flatpak by readily converting all of our applications for our upcoming release and continuing to build new Flatpak apps.
- .author
- %em Jonathan Blandford
- .title VP of Software Engineering, Endless
- .row
- .col-sm-5.col-sm-offset-1
- %blockquote
- %p
- The Fedora Workstation team are very excited about Flatpak and the prospects it brings for making the Linux desktop easier to develop for. We plan to continue supporting this effort going forward.
- .author
- %em Christian F.K. Schaller
- .title Senior Manager, Red Hat
- .col-sm-5
- %blockquote
- %p
- Flatpak will enable us (as a Linux ISV) to distribute a better LibreOffice, with up-to-date dependencies and a platform that can run on many systems. I’m excited to see that happen.
- .author
- %em Michael Meeks
- .title Director, The Document Foundation
diff --git a/source/javascripts/all.js b/source/javascripts/all.js
deleted file mode 100644
index 01fc3fe3..00000000
--- a/source/javascripts/all.js
+++ /dev/null
@@ -1,41 +0,0 @@
-/*!
- * Start Bootstrap - Creative Bootstrap Theme (http://startbootstrap.com)
- * Code licensed under the Apache License v2.0.
- * For details, see http://www.apache.org/licenses/LICENSE-2.0.
- */
-
-(function($) {
- "use strict"; // Start of use strict
-
- // jQuery for page scrolling feature - requires jQuery Easing plugin
- $('body').on('click', 'a.page-scroll', function(event) {
- var $anchor = $(this);
- $('html, body').stop().animate({
- scrollTop: ($($anchor.attr('href')).offset().top - 80)
- }, 1250, 'easeInOutExpo');
- //event.preventDefault();
- });
-
- // Highlight the top nav as scrolling occurs
- $('body').scrollspy({
- target: '.navbar-fixed-top',
- offset: 51
- })
-
- // Closes the Responsive Menu on Menu Item Click
- $('.navbar-collapse ul li a').click(function() {
- $('.navbar-toggle:visible').click();
- });
-
- // Offset for Main Navigation
- $('#mainNav').affix({
- offset: {
- top: 100
- }
- })
-
- $('#toc').on('click', 'a', function(event) {
- $(this).addClass('page-scroll');
- });
-
-})(jQuery); // End of use strict
diff --git a/source/javascripts/bootstrap.js b/source/javascripts/bootstrap.js
deleted file mode 100644
index 01fbbcba..00000000
--- a/source/javascripts/bootstrap.js
+++ /dev/null
@@ -1,2363 +0,0 @@
-/*!
- * Bootstrap v3.3.6 (http://getbootstrap.com)
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under the MIT license
- */
-
-if (typeof jQuery === 'undefined') {
- throw new Error('Bootstrap\'s JavaScript requires jQuery')
-}
-
-+function ($) {
- 'use strict';
- var version = $.fn.jquery.split(' ')[0].split('.')
- if ((version[0] < 2 && version[1] < 9) || (version[0] == 1 && version[1] == 9 && version[2] < 1) || (version[0] > 2)) {
- throw new Error('Bootstrap\'s JavaScript requires jQuery version 1.9.1 or higher, but lower than version 3')
- }
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: transition.js v3.3.6
- * http://getbootstrap.com/javascript/#transitions
- * ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // CSS TRANSITION SUPPORT (Shoutout: http://www.modernizr.com/)
- // ============================================================
-
- function transitionEnd() {
- var el = document.createElement('bootstrap')
-
- var transEndEventNames = {
- WebkitTransition : 'webkitTransitionEnd',
- MozTransition : 'transitionend',
- OTransition : 'oTransitionEnd otransitionend',
- transition : 'transitionend'
- }
-
- for (var name in transEndEventNames) {
- if (el.style[name] !== undefined) {
- return { end: transEndEventNames[name] }
- }
- }
-
- return false // explicit for ie8 ( ._.)
- }
-
- // http://blog.alexmaccaw.com/css-transitions
- $.fn.emulateTransitionEnd = function (duration) {
- var called = false
- var $el = this
- $(this).one('bsTransitionEnd', function () { called = true })
- var callback = function () { if (!called) $($el).trigger($.support.transition.end) }
- setTimeout(callback, duration)
- return this
- }
-
- $(function () {
- $.support.transition = transitionEnd()
-
- if (!$.support.transition) return
-
- $.event.special.bsTransitionEnd = {
- bindType: $.support.transition.end,
- delegateType: $.support.transition.end,
- handle: function (e) {
- if ($(e.target).is(this)) return e.handleObj.handler.apply(this, arguments)
- }
- }
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: alert.js v3.3.6
- * http://getbootstrap.com/javascript/#alerts
- * ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // ALERT CLASS DEFINITION
- // ======================
-
- var dismiss = '[data-dismiss="alert"]'
- var Alert = function (el) {
- $(el).on('click', dismiss, this.close)
- }
-
- Alert.VERSION = '3.3.6'
-
- Alert.TRANSITION_DURATION = 150
-
- Alert.prototype.close = function (e) {
- var $this = $(this)
- var selector = $this.attr('data-target')
-
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
- }
-
- var $parent = $(selector)
-
- if (e) e.preventDefault()
-
- if (!$parent.length) {
- $parent = $this.closest('.alert')
- }
-
- $parent.trigger(e = $.Event('close.bs.alert'))
-
- if (e.isDefaultPrevented()) return
-
- $parent.removeClass('in')
-
- function removeElement() {
- // detach from parent, fire event then clean up data
- $parent.detach().trigger('closed.bs.alert').remove()
- }
-
- $.support.transition && $parent.hasClass('fade') ?
- $parent
- .one('bsTransitionEnd', removeElement)
- .emulateTransitionEnd(Alert.TRANSITION_DURATION) :
- removeElement()
- }
-
-
- // ALERT PLUGIN DEFINITION
- // =======================
-
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.alert')
-
- if (!data) $this.data('bs.alert', (data = new Alert(this)))
- if (typeof option == 'string') data[option].call($this)
- })
- }
-
- var old = $.fn.alert
-
- $.fn.alert = Plugin
- $.fn.alert.Constructor = Alert
-
-
- // ALERT NO CONFLICT
- // =================
-
- $.fn.alert.noConflict = function () {
- $.fn.alert = old
- return this
- }
-
-
- // ALERT DATA-API
- // ==============
-
- $(document).on('click.bs.alert.data-api', dismiss, Alert.prototype.close)
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: button.js v3.3.6
- * http://getbootstrap.com/javascript/#buttons
- * ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // BUTTON PUBLIC CLASS DEFINITION
- // ==============================
-
- var Button = function (element, options) {
- this.$element = $(element)
- this.options = $.extend({}, Button.DEFAULTS, options)
- this.isLoading = false
- }
-
- Button.VERSION = '3.3.6'
-
- Button.DEFAULTS = {
- loadingText: 'loading...'
- }
-
- Button.prototype.setState = function (state) {
- var d = 'disabled'
- var $el = this.$element
- var val = $el.is('input') ? 'val' : 'html'
- var data = $el.data()
-
- state += 'Text'
-
- if (data.resetText == null) $el.data('resetText', $el[val]())
-
- // push to event loop to allow forms to submit
- setTimeout($.proxy(function () {
- $el[val](data[state] == null ? this.options[state] : data[state])
-
- if (state == 'loadingText') {
- this.isLoading = true
- $el.addClass(d).attr(d, d)
- } else if (this.isLoading) {
- this.isLoading = false
- $el.removeClass(d).removeAttr(d)
- }
- }, this), 0)
- }
-
- Button.prototype.toggle = function () {
- var changed = true
- var $parent = this.$element.closest('[data-toggle="buttons"]')
-
- if ($parent.length) {
- var $input = this.$element.find('input')
- if ($input.prop('type') == 'radio') {
- if ($input.prop('checked')) changed = false
- $parent.find('.active').removeClass('active')
- this.$element.addClass('active')
- } else if ($input.prop('type') == 'checkbox') {
- if (($input.prop('checked')) !== this.$element.hasClass('active')) changed = false
- this.$element.toggleClass('active')
- }
- $input.prop('checked', this.$element.hasClass('active'))
- if (changed) $input.trigger('change')
- } else {
- this.$element.attr('aria-pressed', !this.$element.hasClass('active'))
- this.$element.toggleClass('active')
- }
- }
-
-
- // BUTTON PLUGIN DEFINITION
- // ========================
-
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.button')
- var options = typeof option == 'object' && option
-
- if (!data) $this.data('bs.button', (data = new Button(this, options)))
-
- if (option == 'toggle') data.toggle()
- else if (option) data.setState(option)
- })
- }
-
- var old = $.fn.button
-
- $.fn.button = Plugin
- $.fn.button.Constructor = Button
-
-
- // BUTTON NO CONFLICT
- // ==================
-
- $.fn.button.noConflict = function () {
- $.fn.button = old
- return this
- }
-
-
- // BUTTON DATA-API
- // ===============
-
- $(document)
- .on('click.bs.button.data-api', '[data-toggle^="button"]', function (e) {
- var $btn = $(e.target)
- if (!$btn.hasClass('btn')) $btn = $btn.closest('.btn')
- Plugin.call($btn, 'toggle')
- if (!($(e.target).is('input[type="radio"]') || $(e.target).is('input[type="checkbox"]'))) e.preventDefault()
- })
- .on('focus.bs.button.data-api blur.bs.button.data-api', '[data-toggle^="button"]', function (e) {
- $(e.target).closest('.btn').toggleClass('focus', /^focus(in)?$/.test(e.type))
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: carousel.js v3.3.6
- * http://getbootstrap.com/javascript/#carousel
- * ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // CAROUSEL CLASS DEFINITION
- // =========================
-
- var Carousel = function (element, options) {
- this.$element = $(element)
- this.$indicators = this.$element.find('.carousel-indicators')
- this.options = options
- this.paused = null
- this.sliding = null
- this.interval = null
- this.$active = null
- this.$items = null
-
- this.options.keyboard && this.$element.on('keydown.bs.carousel', $.proxy(this.keydown, this))
-
- this.options.pause == 'hover' && !('ontouchstart' in document.documentElement) && this.$element
- .on('mouseenter.bs.carousel', $.proxy(this.pause, this))
- .on('mouseleave.bs.carousel', $.proxy(this.cycle, this))
- }
-
- Carousel.VERSION = '3.3.6'
-
- Carousel.TRANSITION_DURATION = 600
-
- Carousel.DEFAULTS = {
- interval: 5000,
- pause: 'hover',
- wrap: true,
- keyboard: true
- }
-
- Carousel.prototype.keydown = function (e) {
- if (/input|textarea/i.test(e.target.tagName)) return
- switch (e.which) {
- case 37: this.prev(); break
- case 39: this.next(); break
- default: return
- }
-
- e.preventDefault()
- }
-
- Carousel.prototype.cycle = function (e) {
- e || (this.paused = false)
-
- this.interval && clearInterval(this.interval)
-
- this.options.interval
- && !this.paused
- && (this.interval = setInterval($.proxy(this.next, this), this.options.interval))
-
- return this
- }
-
- Carousel.prototype.getItemIndex = function (item) {
- this.$items = item.parent().children('.item')
- return this.$items.index(item || this.$active)
- }
-
- Carousel.prototype.getItemForDirection = function (direction, active) {
- var activeIndex = this.getItemIndex(active)
- var willWrap = (direction == 'prev' && activeIndex === 0)
- || (direction == 'next' && activeIndex == (this.$items.length - 1))
- if (willWrap && !this.options.wrap) return active
- var delta = direction == 'prev' ? -1 : 1
- var itemIndex = (activeIndex + delta) % this.$items.length
- return this.$items.eq(itemIndex)
- }
-
- Carousel.prototype.to = function (pos) {
- var that = this
- var activeIndex = this.getItemIndex(this.$active = this.$element.find('.item.active'))
-
- if (pos > (this.$items.length - 1) || pos < 0) return
-
- if (this.sliding) return this.$element.one('slid.bs.carousel', function () { that.to(pos) }) // yes, "slid"
- if (activeIndex == pos) return this.pause().cycle()
-
- return this.slide(pos > activeIndex ? 'next' : 'prev', this.$items.eq(pos))
- }
-
- Carousel.prototype.pause = function (e) {
- e || (this.paused = true)
-
- if (this.$element.find('.next, .prev').length && $.support.transition) {
- this.$element.trigger($.support.transition.end)
- this.cycle(true)
- }
-
- this.interval = clearInterval(this.interval)
-
- return this
- }
-
- Carousel.prototype.next = function () {
- if (this.sliding) return
- return this.slide('next')
- }
-
- Carousel.prototype.prev = function () {
- if (this.sliding) return
- return this.slide('prev')
- }
-
- Carousel.prototype.slide = function (type, next) {
- var $active = this.$element.find('.item.active')
- var $next = next || this.getItemForDirection(type, $active)
- var isCycling = this.interval
- var direction = type == 'next' ? 'left' : 'right'
- var that = this
-
- if ($next.hasClass('active')) return (this.sliding = false)
-
- var relatedTarget = $next[0]
- var slideEvent = $.Event('slide.bs.carousel', {
- relatedTarget: relatedTarget,
- direction: direction
- })
- this.$element.trigger(slideEvent)
- if (slideEvent.isDefaultPrevented()) return
-
- this.sliding = true
-
- isCycling && this.pause()
-
- if (this.$indicators.length) {
- this.$indicators.find('.active').removeClass('active')
- var $nextIndicator = $(this.$indicators.children()[this.getItemIndex($next)])
- $nextIndicator && $nextIndicator.addClass('active')
- }
-
- var slidEvent = $.Event('slid.bs.carousel', { relatedTarget: relatedTarget, direction: direction }) // yes, "slid"
- if ($.support.transition && this.$element.hasClass('slide')) {
- $next.addClass(type)
- $next[0].offsetWidth // force reflow
- $active.addClass(direction)
- $next.addClass(direction)
- $active
- .one('bsTransitionEnd', function () {
- $next.removeClass([type, direction].join(' ')).addClass('active')
- $active.removeClass(['active', direction].join(' '))
- that.sliding = false
- setTimeout(function () {
- that.$element.trigger(slidEvent)
- }, 0)
- })
- .emulateTransitionEnd(Carousel.TRANSITION_DURATION)
- } else {
- $active.removeClass('active')
- $next.addClass('active')
- this.sliding = false
- this.$element.trigger(slidEvent)
- }
-
- isCycling && this.cycle()
-
- return this
- }
-
-
- // CAROUSEL PLUGIN DEFINITION
- // ==========================
-
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.carousel')
- var options = $.extend({}, Carousel.DEFAULTS, $this.data(), typeof option == 'object' && option)
- var action = typeof option == 'string' ? option : options.slide
-
- if (!data) $this.data('bs.carousel', (data = new Carousel(this, options)))
- if (typeof option == 'number') data.to(option)
- else if (action) data[action]()
- else if (options.interval) data.pause().cycle()
- })
- }
-
- var old = $.fn.carousel
-
- $.fn.carousel = Plugin
- $.fn.carousel.Constructor = Carousel
-
-
- // CAROUSEL NO CONFLICT
- // ====================
-
- $.fn.carousel.noConflict = function () {
- $.fn.carousel = old
- return this
- }
-
-
- // CAROUSEL DATA-API
- // =================
-
- var clickHandler = function (e) {
- var href
- var $this = $(this)
- var $target = $($this.attr('data-target') || (href = $this.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '')) // strip for ie7
- if (!$target.hasClass('carousel')) return
- var options = $.extend({}, $target.data(), $this.data())
- var slideIndex = $this.attr('data-slide-to')
- if (slideIndex) options.interval = false
-
- Plugin.call($target, options)
-
- if (slideIndex) {
- $target.data('bs.carousel').to(slideIndex)
- }
-
- e.preventDefault()
- }
-
- $(document)
- .on('click.bs.carousel.data-api', '[data-slide]', clickHandler)
- .on('click.bs.carousel.data-api', '[data-slide-to]', clickHandler)
-
- $(window).on('load', function () {
- $('[data-ride="carousel"]').each(function () {
- var $carousel = $(this)
- Plugin.call($carousel, $carousel.data())
- })
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: collapse.js v3.3.6
- * http://getbootstrap.com/javascript/#collapse
- * ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // COLLAPSE PUBLIC CLASS DEFINITION
- // ================================
-
- var Collapse = function (element, options) {
- this.$element = $(element)
- this.options = $.extend({}, Collapse.DEFAULTS, options)
- this.$trigger = $('[data-toggle="collapse"][href="#' + element.id + '"],' +
- '[data-toggle="collapse"][data-target="#' + element.id + '"]')
- this.transitioning = null
-
- if (this.options.parent) {
- this.$parent = this.getParent()
- } else {
- this.addAriaAndCollapsedClass(this.$element, this.$trigger)
- }
-
- if (this.options.toggle) this.toggle()
- }
-
- Collapse.VERSION = '3.3.6'
-
- Collapse.TRANSITION_DURATION = 350
-
- Collapse.DEFAULTS = {
- toggle: true
- }
-
- Collapse.prototype.dimension = function () {
- var hasWidth = this.$element.hasClass('width')
- return hasWidth ? 'width' : 'height'
- }
-
- Collapse.prototype.show = function () {
- if (this.transitioning || this.$element.hasClass('in')) return
-
- var activesData
- var actives = this.$parent && this.$parent.children('.panel').children('.in, .collapsing')
-
- if (actives && actives.length) {
- activesData = actives.data('bs.collapse')
- if (activesData && activesData.transitioning) return
- }
-
- var startEvent = $.Event('show.bs.collapse')
- this.$element.trigger(startEvent)
- if (startEvent.isDefaultPrevented()) return
-
- if (actives && actives.length) {
- Plugin.call(actives, 'hide')
- activesData || actives.data('bs.collapse', null)
- }
-
- var dimension = this.dimension()
-
- this.$element
- .removeClass('collapse')
- .addClass('collapsing')[dimension](0)
- .attr('aria-expanded', true)
-
- this.$trigger
- .removeClass('collapsed')
- .attr('aria-expanded', true)
-
- this.transitioning = 1
-
- var complete = function () {
- this.$element
- .removeClass('collapsing')
- .addClass('collapse in')[dimension]('')
- this.transitioning = 0
- this.$element
- .trigger('shown.bs.collapse')
- }
-
- if (!$.support.transition) return complete.call(this)
-
- var scrollSize = $.camelCase(['scroll', dimension].join('-'))
-
- this.$element
- .one('bsTransitionEnd', $.proxy(complete, this))
- .emulateTransitionEnd(Collapse.TRANSITION_DURATION)[dimension](this.$element[0][scrollSize])
- }
-
- Collapse.prototype.hide = function () {
- if (this.transitioning || !this.$element.hasClass('in')) return
-
- var startEvent = $.Event('hide.bs.collapse')
- this.$element.trigger(startEvent)
- if (startEvent.isDefaultPrevented()) return
-
- var dimension = this.dimension()
-
- this.$element[dimension](this.$element[dimension]())[0].offsetHeight
-
- this.$element
- .addClass('collapsing')
- .removeClass('collapse in')
- .attr('aria-expanded', false)
-
- this.$trigger
- .addClass('collapsed')
- .attr('aria-expanded', false)
-
- this.transitioning = 1
-
- var complete = function () {
- this.transitioning = 0
- this.$element
- .removeClass('collapsing')
- .addClass('collapse')
- .trigger('hidden.bs.collapse')
- }
-
- if (!$.support.transition) return complete.call(this)
-
- this.$element
- [dimension](0)
- .one('bsTransitionEnd', $.proxy(complete, this))
- .emulateTransitionEnd(Collapse.TRANSITION_DURATION)
- }
-
- Collapse.prototype.toggle = function () {
- this[this.$element.hasClass('in') ? 'hide' : 'show']()
- }
-
- Collapse.prototype.getParent = function () {
- return $(this.options.parent)
- .find('[data-toggle="collapse"][data-parent="' + this.options.parent + '"]')
- .each($.proxy(function (i, element) {
- var $element = $(element)
- this.addAriaAndCollapsedClass(getTargetFromTrigger($element), $element)
- }, this))
- .end()
- }
-
- Collapse.prototype.addAriaAndCollapsedClass = function ($element, $trigger) {
- var isOpen = $element.hasClass('in')
-
- $element.attr('aria-expanded', isOpen)
- $trigger
- .toggleClass('collapsed', !isOpen)
- .attr('aria-expanded', isOpen)
- }
-
- function getTargetFromTrigger($trigger) {
- var href
- var target = $trigger.attr('data-target')
- || (href = $trigger.attr('href')) && href.replace(/.*(?=#[^\s]+$)/, '') // strip for ie7
-
- return $(target)
- }
-
-
- // COLLAPSE PLUGIN DEFINITION
- // ==========================
-
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.collapse')
- var options = $.extend({}, Collapse.DEFAULTS, $this.data(), typeof option == 'object' && option)
-
- if (!data && options.toggle && /show|hide/.test(option)) options.toggle = false
- if (!data) $this.data('bs.collapse', (data = new Collapse(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- var old = $.fn.collapse
-
- $.fn.collapse = Plugin
- $.fn.collapse.Constructor = Collapse
-
-
- // COLLAPSE NO CONFLICT
- // ====================
-
- $.fn.collapse.noConflict = function () {
- $.fn.collapse = old
- return this
- }
-
-
- // COLLAPSE DATA-API
- // =================
-
- $(document).on('click.bs.collapse.data-api', '[data-toggle="collapse"]', function (e) {
- var $this = $(this)
-
- if (!$this.attr('data-target')) e.preventDefault()
-
- var $target = getTargetFromTrigger($this)
- var data = $target.data('bs.collapse')
- var option = data ? 'toggle' : $this.data()
-
- Plugin.call($target, option)
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: dropdown.js v3.3.6
- * http://getbootstrap.com/javascript/#dropdowns
- * ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // DROPDOWN CLASS DEFINITION
- // =========================
-
- var backdrop = '.dropdown-backdrop'
- var toggle = '[data-toggle="dropdown"]'
- var Dropdown = function (element) {
- $(element).on('click.bs.dropdown', this.toggle)
- }
-
- Dropdown.VERSION = '3.3.6'
-
- function getParent($this) {
- var selector = $this.attr('data-target')
-
- if (!selector) {
- selector = $this.attr('href')
- selector = selector && /#[A-Za-z]/.test(selector) && selector.replace(/.*(?=#[^\s]*$)/, '') // strip for ie7
- }
-
- var $parent = selector && $(selector)
-
- return $parent && $parent.length ? $parent : $this.parent()
- }
-
- function clearMenus(e) {
- if (e && e.which === 3) return
- $(backdrop).remove()
- $(toggle).each(function () {
- var $this = $(this)
- var $parent = getParent($this)
- var relatedTarget = { relatedTarget: this }
-
- if (!$parent.hasClass('open')) return
-
- if (e && e.type == 'click' && /input|textarea/i.test(e.target.tagName) && $.contains($parent[0], e.target)) return
-
- $parent.trigger(e = $.Event('hide.bs.dropdown', relatedTarget))
-
- if (e.isDefaultPrevented()) return
-
- $this.attr('aria-expanded', 'false')
- $parent.removeClass('open').trigger($.Event('hidden.bs.dropdown', relatedTarget))
- })
- }
-
- Dropdown.prototype.toggle = function (e) {
- var $this = $(this)
-
- if ($this.is('.disabled, :disabled')) return
-
- var $parent = getParent($this)
- var isActive = $parent.hasClass('open')
-
- clearMenus()
-
- if (!isActive) {
- if ('ontouchstart' in document.documentElement && !$parent.closest('.navbar-nav').length) {
- // if mobile we use a backdrop because click events don't delegate
- $(document.createElement('div'))
- .addClass('dropdown-backdrop')
- .insertAfter($(this))
- .on('click', clearMenus)
- }
-
- var relatedTarget = { relatedTarget: this }
- $parent.trigger(e = $.Event('show.bs.dropdown', relatedTarget))
-
- if (e.isDefaultPrevented()) return
-
- $this
- .trigger('focus')
- .attr('aria-expanded', 'true')
-
- $parent
- .toggleClass('open')
- .trigger($.Event('shown.bs.dropdown', relatedTarget))
- }
-
- return false
- }
-
- Dropdown.prototype.keydown = function (e) {
- if (!/(38|40|27|32)/.test(e.which) || /input|textarea/i.test(e.target.tagName)) return
-
- var $this = $(this)
-
- e.preventDefault()
- e.stopPropagation()
-
- if ($this.is('.disabled, :disabled')) return
-
- var $parent = getParent($this)
- var isActive = $parent.hasClass('open')
-
- if (!isActive && e.which != 27 || isActive && e.which == 27) {
- if (e.which == 27) $parent.find(toggle).trigger('focus')
- return $this.trigger('click')
- }
-
- var desc = ' li:not(.disabled):visible a'
- var $items = $parent.find('.dropdown-menu' + desc)
-
- if (!$items.length) return
-
- var index = $items.index(e.target)
-
- if (e.which == 38 && index > 0) index-- // up
- if (e.which == 40 && index < $items.length - 1) index++ // down
- if (!~index) index = 0
-
- $items.eq(index).trigger('focus')
- }
-
-
- // DROPDOWN PLUGIN DEFINITION
- // ==========================
-
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.dropdown')
-
- if (!data) $this.data('bs.dropdown', (data = new Dropdown(this)))
- if (typeof option == 'string') data[option].call($this)
- })
- }
-
- var old = $.fn.dropdown
-
- $.fn.dropdown = Plugin
- $.fn.dropdown.Constructor = Dropdown
-
-
- // DROPDOWN NO CONFLICT
- // ====================
-
- $.fn.dropdown.noConflict = function () {
- $.fn.dropdown = old
- return this
- }
-
-
- // APPLY TO STANDARD DROPDOWN ELEMENTS
- // ===================================
-
- $(document)
- .on('click.bs.dropdown.data-api', clearMenus)
- .on('click.bs.dropdown.data-api', '.dropdown form', function (e) { e.stopPropagation() })
- .on('click.bs.dropdown.data-api', toggle, Dropdown.prototype.toggle)
- .on('keydown.bs.dropdown.data-api', toggle, Dropdown.prototype.keydown)
- .on('keydown.bs.dropdown.data-api', '.dropdown-menu', Dropdown.prototype.keydown)
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: modal.js v3.3.6
- * http://getbootstrap.com/javascript/#modals
- * ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // MODAL CLASS DEFINITION
- // ======================
-
- var Modal = function (element, options) {
- this.options = options
- this.$body = $(document.body)
- this.$element = $(element)
- this.$dialog = this.$element.find('.modal-dialog')
- this.$backdrop = null
- this.isShown = null
- this.originalBodyPad = null
- this.scrollbarWidth = 0
- this.ignoreBackdropClick = false
-
- if (this.options.remote) {
- this.$element
- .find('.modal-content')
- .load(this.options.remote, $.proxy(function () {
- this.$element.trigger('loaded.bs.modal')
- }, this))
- }
- }
-
- Modal.VERSION = '3.3.6'
-
- Modal.TRANSITION_DURATION = 300
- Modal.BACKDROP_TRANSITION_DURATION = 150
-
- Modal.DEFAULTS = {
- backdrop: true,
- keyboard: true,
- show: true
- }
-
- Modal.prototype.toggle = function (_relatedTarget) {
- return this.isShown ? this.hide() : this.show(_relatedTarget)
- }
-
- Modal.prototype.show = function (_relatedTarget) {
- var that = this
- var e = $.Event('show.bs.modal', { relatedTarget: _relatedTarget })
-
- this.$element.trigger(e)
-
- if (this.isShown || e.isDefaultPrevented()) return
-
- this.isShown = true
-
- this.checkScrollbar()
- this.setScrollbar()
- this.$body.addClass('modal-open')
-
- this.escape()
- this.resize()
-
- this.$element.on('click.dismiss.bs.modal', '[data-dismiss="modal"]', $.proxy(this.hide, this))
-
- this.$dialog.on('mousedown.dismiss.bs.modal', function () {
- that.$element.one('mouseup.dismiss.bs.modal', function (e) {
- if ($(e.target).is(that.$element)) that.ignoreBackdropClick = true
- })
- })
-
- this.backdrop(function () {
- var transition = $.support.transition && that.$element.hasClass('fade')
-
- if (!that.$element.parent().length) {
- that.$element.appendTo(that.$body) // don't move modals dom position
- }
-
- that.$element
- .show()
- .scrollTop(0)
-
- that.adjustDialog()
-
- if (transition) {
- that.$element[0].offsetWidth // force reflow
- }
-
- that.$element.addClass('in')
-
- that.enforceFocus()
-
- var e = $.Event('shown.bs.modal', { relatedTarget: _relatedTarget })
-
- transition ?
- that.$dialog // wait for modal to slide in
- .one('bsTransitionEnd', function () {
- that.$element.trigger('focus').trigger(e)
- })
- .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
- that.$element.trigger('focus').trigger(e)
- })
- }
-
- Modal.prototype.hide = function (e) {
- if (e) e.preventDefault()
-
- e = $.Event('hide.bs.modal')
-
- this.$element.trigger(e)
-
- if (!this.isShown || e.isDefaultPrevented()) return
-
- this.isShown = false
-
- this.escape()
- this.resize()
-
- $(document).off('focusin.bs.modal')
-
- this.$element
- .removeClass('in')
- .off('click.dismiss.bs.modal')
- .off('mouseup.dismiss.bs.modal')
-
- this.$dialog.off('mousedown.dismiss.bs.modal')
-
- $.support.transition && this.$element.hasClass('fade') ?
- this.$element
- .one('bsTransitionEnd', $.proxy(this.hideModal, this))
- .emulateTransitionEnd(Modal.TRANSITION_DURATION) :
- this.hideModal()
- }
-
- Modal.prototype.enforceFocus = function () {
- $(document)
- .off('focusin.bs.modal') // guard against infinite focus loop
- .on('focusin.bs.modal', $.proxy(function (e) {
- if (this.$element[0] !== e.target && !this.$element.has(e.target).length) {
- this.$element.trigger('focus')
- }
- }, this))
- }
-
- Modal.prototype.escape = function () {
- if (this.isShown && this.options.keyboard) {
- this.$element.on('keydown.dismiss.bs.modal', $.proxy(function (e) {
- e.which == 27 && this.hide()
- }, this))
- } else if (!this.isShown) {
- this.$element.off('keydown.dismiss.bs.modal')
- }
- }
-
- Modal.prototype.resize = function () {
- if (this.isShown) {
- $(window).on('resize.bs.modal', $.proxy(this.handleUpdate, this))
- } else {
- $(window).off('resize.bs.modal')
- }
- }
-
- Modal.prototype.hideModal = function () {
- var that = this
- this.$element.hide()
- this.backdrop(function () {
- that.$body.removeClass('modal-open')
- that.resetAdjustments()
- that.resetScrollbar()
- that.$element.trigger('hidden.bs.modal')
- })
- }
-
- Modal.prototype.removeBackdrop = function () {
- this.$backdrop && this.$backdrop.remove()
- this.$backdrop = null
- }
-
- Modal.prototype.backdrop = function (callback) {
- var that = this
- var animate = this.$element.hasClass('fade') ? 'fade' : ''
-
- if (this.isShown && this.options.backdrop) {
- var doAnimate = $.support.transition && animate
-
- this.$backdrop = $(document.createElement('div'))
- .addClass('modal-backdrop ' + animate)
- .appendTo(this.$body)
-
- this.$element.on('click.dismiss.bs.modal', $.proxy(function (e) {
- if (this.ignoreBackdropClick) {
- this.ignoreBackdropClick = false
- return
- }
- if (e.target !== e.currentTarget) return
- this.options.backdrop == 'static'
- ? this.$element[0].focus()
- : this.hide()
- }, this))
-
- if (doAnimate) this.$backdrop[0].offsetWidth // force reflow
-
- this.$backdrop.addClass('in')
-
- if (!callback) return
-
- doAnimate ?
- this.$backdrop
- .one('bsTransitionEnd', callback)
- .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
- callback()
-
- } else if (!this.isShown && this.$backdrop) {
- this.$backdrop.removeClass('in')
-
- var callbackRemove = function () {
- that.removeBackdrop()
- callback && callback()
- }
- $.support.transition && this.$element.hasClass('fade') ?
- this.$backdrop
- .one('bsTransitionEnd', callbackRemove)
- .emulateTransitionEnd(Modal.BACKDROP_TRANSITION_DURATION) :
- callbackRemove()
-
- } else if (callback) {
- callback()
- }
- }
-
- // these following methods are used to handle overflowing modals
-
- Modal.prototype.handleUpdate = function () {
- this.adjustDialog()
- }
-
- Modal.prototype.adjustDialog = function () {
- var modalIsOverflowing = this.$element[0].scrollHeight > document.documentElement.clientHeight
-
- this.$element.css({
- paddingLeft: !this.bodyIsOverflowing && modalIsOverflowing ? this.scrollbarWidth : '',
- paddingRight: this.bodyIsOverflowing && !modalIsOverflowing ? this.scrollbarWidth : ''
- })
- }
-
- Modal.prototype.resetAdjustments = function () {
- this.$element.css({
- paddingLeft: '',
- paddingRight: ''
- })
- }
-
- Modal.prototype.checkScrollbar = function () {
- var fullWindowWidth = window.innerWidth
- if (!fullWindowWidth) { // workaround for missing window.innerWidth in IE8
- var documentElementRect = document.documentElement.getBoundingClientRect()
- fullWindowWidth = documentElementRect.right - Math.abs(documentElementRect.left)
- }
- this.bodyIsOverflowing = document.body.clientWidth < fullWindowWidth
- this.scrollbarWidth = this.measureScrollbar()
- }
-
- Modal.prototype.setScrollbar = function () {
- var bodyPad = parseInt((this.$body.css('padding-right') || 0), 10)
- this.originalBodyPad = document.body.style.paddingRight || ''
- if (this.bodyIsOverflowing) this.$body.css('padding-right', bodyPad + this.scrollbarWidth)
- }
-
- Modal.prototype.resetScrollbar = function () {
- this.$body.css('padding-right', this.originalBodyPad)
- }
-
- Modal.prototype.measureScrollbar = function () { // thx walsh
- var scrollDiv = document.createElement('div')
- scrollDiv.className = 'modal-scrollbar-measure'
- this.$body.append(scrollDiv)
- var scrollbarWidth = scrollDiv.offsetWidth - scrollDiv.clientWidth
- this.$body[0].removeChild(scrollDiv)
- return scrollbarWidth
- }
-
-
- // MODAL PLUGIN DEFINITION
- // =======================
-
- function Plugin(option, _relatedTarget) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.modal')
- var options = $.extend({}, Modal.DEFAULTS, $this.data(), typeof option == 'object' && option)
-
- if (!data) $this.data('bs.modal', (data = new Modal(this, options)))
- if (typeof option == 'string') data[option](_relatedTarget)
- else if (options.show) data.show(_relatedTarget)
- })
- }
-
- var old = $.fn.modal
-
- $.fn.modal = Plugin
- $.fn.modal.Constructor = Modal
-
-
- // MODAL NO CONFLICT
- // =================
-
- $.fn.modal.noConflict = function () {
- $.fn.modal = old
- return this
- }
-
-
- // MODAL DATA-API
- // ==============
-
- $(document).on('click.bs.modal.data-api', '[data-toggle="modal"]', function (e) {
- var $this = $(this)
- var href = $this.attr('href')
- var $target = $($this.attr('data-target') || (href && href.replace(/.*(?=#[^\s]+$)/, ''))) // strip for ie7
- var option = $target.data('bs.modal') ? 'toggle' : $.extend({ remote: !/#/.test(href) && href }, $target.data(), $this.data())
-
- if ($this.is('a')) e.preventDefault()
-
- $target.one('show.bs.modal', function (showEvent) {
- if (showEvent.isDefaultPrevented()) return // only register focus restorer if modal will actually get shown
- $target.one('hidden.bs.modal', function () {
- $this.is(':visible') && $this.trigger('focus')
- })
- })
- Plugin.call($target, option, this)
- })
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: tooltip.js v3.3.6
- * http://getbootstrap.com/javascript/#tooltip
- * Inspired by the original jQuery.tipsy by Jason Frame
- * ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // TOOLTIP PUBLIC CLASS DEFINITION
- // ===============================
-
- var Tooltip = function (element, options) {
- this.type = null
- this.options = null
- this.enabled = null
- this.timeout = null
- this.hoverState = null
- this.$element = null
- this.inState = null
-
- this.init('tooltip', element, options)
- }
-
- Tooltip.VERSION = '3.3.6'
-
- Tooltip.TRANSITION_DURATION = 150
-
- Tooltip.DEFAULTS = {
- animation: true,
- placement: 'top',
- selector: false,
- template: '
',
- trigger: 'hover focus',
- title: '',
- delay: 0,
- html: false,
- container: false,
- viewport: {
- selector: 'body',
- padding: 0
- }
- }
-
- Tooltip.prototype.init = function (type, element, options) {
- this.enabled = true
- this.type = type
- this.$element = $(element)
- this.options = this.getOptions(options)
- this.$viewport = this.options.viewport && $($.isFunction(this.options.viewport) ? this.options.viewport.call(this, this.$element) : (this.options.viewport.selector || this.options.viewport))
- this.inState = { click: false, hover: false, focus: false }
-
- if (this.$element[0] instanceof document.constructor && !this.options.selector) {
- throw new Error('`selector` option must be specified when initializing ' + this.type + ' on the window.document object!')
- }
-
- var triggers = this.options.trigger.split(' ')
-
- for (var i = triggers.length; i--;) {
- var trigger = triggers[i]
-
- if (trigger == 'click') {
- this.$element.on('click.' + this.type, this.options.selector, $.proxy(this.toggle, this))
- } else if (trigger != 'manual') {
- var eventIn = trigger == 'hover' ? 'mouseenter' : 'focusin'
- var eventOut = trigger == 'hover' ? 'mouseleave' : 'focusout'
-
- this.$element.on(eventIn + '.' + this.type, this.options.selector, $.proxy(this.enter, this))
- this.$element.on(eventOut + '.' + this.type, this.options.selector, $.proxy(this.leave, this))
- }
- }
-
- this.options.selector ?
- (this._options = $.extend({}, this.options, { trigger: 'manual', selector: '' })) :
- this.fixTitle()
- }
-
- Tooltip.prototype.getDefaults = function () {
- return Tooltip.DEFAULTS
- }
-
- Tooltip.prototype.getOptions = function (options) {
- options = $.extend({}, this.getDefaults(), this.$element.data(), options)
-
- if (options.delay && typeof options.delay == 'number') {
- options.delay = {
- show: options.delay,
- hide: options.delay
- }
- }
-
- return options
- }
-
- Tooltip.prototype.getDelegateOptions = function () {
- var options = {}
- var defaults = this.getDefaults()
-
- this._options && $.each(this._options, function (key, value) {
- if (defaults[key] != value) options[key] = value
- })
-
- return options
- }
-
- Tooltip.prototype.enter = function (obj) {
- var self = obj instanceof this.constructor ?
- obj : $(obj.currentTarget).data('bs.' + this.type)
-
- if (!self) {
- self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
- $(obj.currentTarget).data('bs.' + this.type, self)
- }
-
- if (obj instanceof $.Event) {
- self.inState[obj.type == 'focusin' ? 'focus' : 'hover'] = true
- }
-
- if (self.tip().hasClass('in') || self.hoverState == 'in') {
- self.hoverState = 'in'
- return
- }
-
- clearTimeout(self.timeout)
-
- self.hoverState = 'in'
-
- if (!self.options.delay || !self.options.delay.show) return self.show()
-
- self.timeout = setTimeout(function () {
- if (self.hoverState == 'in') self.show()
- }, self.options.delay.show)
- }
-
- Tooltip.prototype.isInStateTrue = function () {
- for (var key in this.inState) {
- if (this.inState[key]) return true
- }
-
- return false
- }
-
- Tooltip.prototype.leave = function (obj) {
- var self = obj instanceof this.constructor ?
- obj : $(obj.currentTarget).data('bs.' + this.type)
-
- if (!self) {
- self = new this.constructor(obj.currentTarget, this.getDelegateOptions())
- $(obj.currentTarget).data('bs.' + this.type, self)
- }
-
- if (obj instanceof $.Event) {
- self.inState[obj.type == 'focusout' ? 'focus' : 'hover'] = false
- }
-
- if (self.isInStateTrue()) return
-
- clearTimeout(self.timeout)
-
- self.hoverState = 'out'
-
- if (!self.options.delay || !self.options.delay.hide) return self.hide()
-
- self.timeout = setTimeout(function () {
- if (self.hoverState == 'out') self.hide()
- }, self.options.delay.hide)
- }
-
- Tooltip.prototype.show = function () {
- var e = $.Event('show.bs.' + this.type)
-
- if (this.hasContent() && this.enabled) {
- this.$element.trigger(e)
-
- var inDom = $.contains(this.$element[0].ownerDocument.documentElement, this.$element[0])
- if (e.isDefaultPrevented() || !inDom) return
- var that = this
-
- var $tip = this.tip()
-
- var tipId = this.getUID(this.type)
-
- this.setContent()
- $tip.attr('id', tipId)
- this.$element.attr('aria-describedby', tipId)
-
- if (this.options.animation) $tip.addClass('fade')
-
- var placement = typeof this.options.placement == 'function' ?
- this.options.placement.call(this, $tip[0], this.$element[0]) :
- this.options.placement
-
- var autoToken = /\s?auto?\s?/i
- var autoPlace = autoToken.test(placement)
- if (autoPlace) placement = placement.replace(autoToken, '') || 'top'
-
- $tip
- .detach()
- .css({ top: 0, left: 0, display: 'block' })
- .addClass(placement)
- .data('bs.' + this.type, this)
-
- this.options.container ? $tip.appendTo(this.options.container) : $tip.insertAfter(this.$element)
- this.$element.trigger('inserted.bs.' + this.type)
-
- var pos = this.getPosition()
- var actualWidth = $tip[0].offsetWidth
- var actualHeight = $tip[0].offsetHeight
-
- if (autoPlace) {
- var orgPlacement = placement
- var viewportDim = this.getPosition(this.$viewport)
-
- placement = placement == 'bottom' && pos.bottom + actualHeight > viewportDim.bottom ? 'top' :
- placement == 'top' && pos.top - actualHeight < viewportDim.top ? 'bottom' :
- placement == 'right' && pos.right + actualWidth > viewportDim.width ? 'left' :
- placement == 'left' && pos.left - actualWidth < viewportDim.left ? 'right' :
- placement
-
- $tip
- .removeClass(orgPlacement)
- .addClass(placement)
- }
-
- var calculatedOffset = this.getCalculatedOffset(placement, pos, actualWidth, actualHeight)
-
- this.applyPlacement(calculatedOffset, placement)
-
- var complete = function () {
- var prevHoverState = that.hoverState
- that.$element.trigger('shown.bs.' + that.type)
- that.hoverState = null
-
- if (prevHoverState == 'out') that.leave(that)
- }
-
- $.support.transition && this.$tip.hasClass('fade') ?
- $tip
- .one('bsTransitionEnd', complete)
- .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
- complete()
- }
- }
-
- Tooltip.prototype.applyPlacement = function (offset, placement) {
- var $tip = this.tip()
- var width = $tip[0].offsetWidth
- var height = $tip[0].offsetHeight
-
- // manually read margins because getBoundingClientRect includes difference
- var marginTop = parseInt($tip.css('margin-top'), 10)
- var marginLeft = parseInt($tip.css('margin-left'), 10)
-
- // we must check for NaN for ie 8/9
- if (isNaN(marginTop)) marginTop = 0
- if (isNaN(marginLeft)) marginLeft = 0
-
- offset.top += marginTop
- offset.left += marginLeft
-
- // $.fn.offset doesn't round pixel values
- // so we use setOffset directly with our own function B-0
- $.offset.setOffset($tip[0], $.extend({
- using: function (props) {
- $tip.css({
- top: Math.round(props.top),
- left: Math.round(props.left)
- })
- }
- }, offset), 0)
-
- $tip.addClass('in')
-
- // check to see if placing tip in new offset caused the tip to resize itself
- var actualWidth = $tip[0].offsetWidth
- var actualHeight = $tip[0].offsetHeight
-
- if (placement == 'top' && actualHeight != height) {
- offset.top = offset.top + height - actualHeight
- }
-
- var delta = this.getViewportAdjustedDelta(placement, offset, actualWidth, actualHeight)
-
- if (delta.left) offset.left += delta.left
- else offset.top += delta.top
-
- var isVertical = /top|bottom/.test(placement)
- var arrowDelta = isVertical ? delta.left * 2 - width + actualWidth : delta.top * 2 - height + actualHeight
- var arrowOffsetPosition = isVertical ? 'offsetWidth' : 'offsetHeight'
-
- $tip.offset(offset)
- this.replaceArrow(arrowDelta, $tip[0][arrowOffsetPosition], isVertical)
- }
-
- Tooltip.prototype.replaceArrow = function (delta, dimension, isVertical) {
- this.arrow()
- .css(isVertical ? 'left' : 'top', 50 * (1 - delta / dimension) + '%')
- .css(isVertical ? 'top' : 'left', '')
- }
-
- Tooltip.prototype.setContent = function () {
- var $tip = this.tip()
- var title = this.getTitle()
-
- $tip.find('.tooltip-inner')[this.options.html ? 'html' : 'text'](title)
- $tip.removeClass('fade in top bottom left right')
- }
-
- Tooltip.prototype.hide = function (callback) {
- var that = this
- var $tip = $(this.$tip)
- var e = $.Event('hide.bs.' + this.type)
-
- function complete() {
- if (that.hoverState != 'in') $tip.detach()
- that.$element
- .removeAttr('aria-describedby')
- .trigger('hidden.bs.' + that.type)
- callback && callback()
- }
-
- this.$element.trigger(e)
-
- if (e.isDefaultPrevented()) return
-
- $tip.removeClass('in')
-
- $.support.transition && $tip.hasClass('fade') ?
- $tip
- .one('bsTransitionEnd', complete)
- .emulateTransitionEnd(Tooltip.TRANSITION_DURATION) :
- complete()
-
- this.hoverState = null
-
- return this
- }
-
- Tooltip.prototype.fixTitle = function () {
- var $e = this.$element
- if ($e.attr('title') || typeof $e.attr('data-original-title') != 'string') {
- $e.attr('data-original-title', $e.attr('title') || '').attr('title', '')
- }
- }
-
- Tooltip.prototype.hasContent = function () {
- return this.getTitle()
- }
-
- Tooltip.prototype.getPosition = function ($element) {
- $element = $element || this.$element
-
- var el = $element[0]
- var isBody = el.tagName == 'BODY'
-
- var elRect = el.getBoundingClientRect()
- if (elRect.width == null) {
- // width and height are missing in IE8, so compute them manually; see https://github.com/twbs/bootstrap/issues/14093
- elRect = $.extend({}, elRect, { width: elRect.right - elRect.left, height: elRect.bottom - elRect.top })
- }
- var elOffset = isBody ? { top: 0, left: 0 } : $element.offset()
- var scroll = { scroll: isBody ? document.documentElement.scrollTop || document.body.scrollTop : $element.scrollTop() }
- var outerDims = isBody ? { width: $(window).width(), height: $(window).height() } : null
-
- return $.extend({}, elRect, scroll, outerDims, elOffset)
- }
-
- Tooltip.prototype.getCalculatedOffset = function (placement, pos, actualWidth, actualHeight) {
- return placement == 'bottom' ? { top: pos.top + pos.height, left: pos.left + pos.width / 2 - actualWidth / 2 } :
- placement == 'top' ? { top: pos.top - actualHeight, left: pos.left + pos.width / 2 - actualWidth / 2 } :
- placement == 'left' ? { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left - actualWidth } :
- /* placement == 'right' */ { top: pos.top + pos.height / 2 - actualHeight / 2, left: pos.left + pos.width }
-
- }
-
- Tooltip.prototype.getViewportAdjustedDelta = function (placement, pos, actualWidth, actualHeight) {
- var delta = { top: 0, left: 0 }
- if (!this.$viewport) return delta
-
- var viewportPadding = this.options.viewport && this.options.viewport.padding || 0
- var viewportDimensions = this.getPosition(this.$viewport)
-
- if (/right|left/.test(placement)) {
- var topEdgeOffset = pos.top - viewportPadding - viewportDimensions.scroll
- var bottomEdgeOffset = pos.top + viewportPadding - viewportDimensions.scroll + actualHeight
- if (topEdgeOffset < viewportDimensions.top) { // top overflow
- delta.top = viewportDimensions.top - topEdgeOffset
- } else if (bottomEdgeOffset > viewportDimensions.top + viewportDimensions.height) { // bottom overflow
- delta.top = viewportDimensions.top + viewportDimensions.height - bottomEdgeOffset
- }
- } else {
- var leftEdgeOffset = pos.left - viewportPadding
- var rightEdgeOffset = pos.left + viewportPadding + actualWidth
- if (leftEdgeOffset < viewportDimensions.left) { // left overflow
- delta.left = viewportDimensions.left - leftEdgeOffset
- } else if (rightEdgeOffset > viewportDimensions.right) { // right overflow
- delta.left = viewportDimensions.left + viewportDimensions.width - rightEdgeOffset
- }
- }
-
- return delta
- }
-
- Tooltip.prototype.getTitle = function () {
- var title
- var $e = this.$element
- var o = this.options
-
- title = $e.attr('data-original-title')
- || (typeof o.title == 'function' ? o.title.call($e[0]) : o.title)
-
- return title
- }
-
- Tooltip.prototype.getUID = function (prefix) {
- do prefix += ~~(Math.random() * 1000000)
- while (document.getElementById(prefix))
- return prefix
- }
-
- Tooltip.prototype.tip = function () {
- if (!this.$tip) {
- this.$tip = $(this.options.template)
- if (this.$tip.length != 1) {
- throw new Error(this.type + ' `template` option must consist of exactly 1 top-level element!')
- }
- }
- return this.$tip
- }
-
- Tooltip.prototype.arrow = function () {
- return (this.$arrow = this.$arrow || this.tip().find('.tooltip-arrow'))
- }
-
- Tooltip.prototype.enable = function () {
- this.enabled = true
- }
-
- Tooltip.prototype.disable = function () {
- this.enabled = false
- }
-
- Tooltip.prototype.toggleEnabled = function () {
- this.enabled = !this.enabled
- }
-
- Tooltip.prototype.toggle = function (e) {
- var self = this
- if (e) {
- self = $(e.currentTarget).data('bs.' + this.type)
- if (!self) {
- self = new this.constructor(e.currentTarget, this.getDelegateOptions())
- $(e.currentTarget).data('bs.' + this.type, self)
- }
- }
-
- if (e) {
- self.inState.click = !self.inState.click
- if (self.isInStateTrue()) self.enter(self)
- else self.leave(self)
- } else {
- self.tip().hasClass('in') ? self.leave(self) : self.enter(self)
- }
- }
-
- Tooltip.prototype.destroy = function () {
- var that = this
- clearTimeout(this.timeout)
- this.hide(function () {
- that.$element.off('.' + that.type).removeData('bs.' + that.type)
- if (that.$tip) {
- that.$tip.detach()
- }
- that.$tip = null
- that.$arrow = null
- that.$viewport = null
- })
- }
-
-
- // TOOLTIP PLUGIN DEFINITION
- // =========================
-
- function Plugin(option) {
- return this.each(function () {
- var $this = $(this)
- var data = $this.data('bs.tooltip')
- var options = typeof option == 'object' && option
-
- if (!data && /destroy|hide/.test(option)) return
- if (!data) $this.data('bs.tooltip', (data = new Tooltip(this, options)))
- if (typeof option == 'string') data[option]()
- })
- }
-
- var old = $.fn.tooltip
-
- $.fn.tooltip = Plugin
- $.fn.tooltip.Constructor = Tooltip
-
-
- // TOOLTIP NO CONFLICT
- // ===================
-
- $.fn.tooltip.noConflict = function () {
- $.fn.tooltip = old
- return this
- }
-
-}(jQuery);
-
-/* ========================================================================
- * Bootstrap: popover.js v3.3.6
- * http://getbootstrap.com/javascript/#popovers
- * ========================================================================
- * Copyright 2011-2015 Twitter, Inc.
- * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE)
- * ======================================================================== */
-
-
-+function ($) {
- 'use strict';
-
- // POPOVER PUBLIC CLASS DEFINITION
- // ===============================
-
- var Popover = function (element, options) {
- this.init('popover', element, options)
- }
-
- if (!$.fn.tooltip) throw new Error('Popover requires tooltip.js')
-
- Popover.VERSION = '3.3.6'
-
- Popover.DEFAULTS = $.extend({}, $.fn.tooltip.Constructor.DEFAULTS, {
- placement: 'right',
- trigger: 'click',
- content: '',
- template: '