├── .devcontainer.json ├── .editorconfig ├── .github └── workflows │ └── deploy-website.yaml ├── .gitignore ├── .prettierignore ├── .prettierrc ├── Dockerfile ├── LICENSE ├── README.md ├── assets ├── code-sample.md ├── showcase-items.json └── vala-hero-next.svg ├── config.toml ├── content ├── _index.cs.md ├── _index.fr.md ├── _index.md ├── _index.pt_BR.md ├── _index.ru.md ├── _index.zh_CN.md ├── about │ ├── index.cs.md │ ├── index.fr.md │ ├── index.md │ ├── index.pt_BR.md │ ├── index.ru.md │ └── index.zh_CN.md ├── blog │ ├── _index.md │ ├── c-off-ramp.md │ ├── planet-gnome.md │ ├── vala-0-56.md │ └── valabot.md └── vala-hero.png ├── docker-compose.yml ├── docs ├── 1-overview.md ├── 2-structure.md ├── 3-pages.md ├── 4-styling.md ├── 5-potential-issues.md └── CONTRIBUTING.md ├── sass └── css │ ├── _base.scss │ ├── _reset.scss │ ├── _typography.scss │ ├── blog-post.scss │ ├── blog.scss │ ├── components │ ├── _cta.scss │ ├── _feature.scss │ ├── _footer.scss │ ├── _global.scss │ ├── _header-nav.scss │ ├── _post-preview.scss │ └── _showcase.scss │ ├── global.scss │ ├── index.scss │ └── utils │ ├── _container.scss │ └── _index.scss ├── static ├── CNAME ├── android-icon-144x144.png ├── android-icon-192x192.png ├── android-icon-36x36.png ├── android-icon-48x48.png ├── android-icon-72x72.png ├── android-icon-96x96.png ├── apple-icon-114x114.png ├── apple-icon-120x120.png ├── apple-icon-144x144.png ├── apple-icon-152x152.png ├── apple-icon-180x180.png ├── apple-icon-57x57.png ├── apple-icon-60x60.png ├── apple-icon-72x72.png ├── apple-icon-76x76.png ├── apple-icon-precomposed.png ├── apple-icon.png ├── browserconfig.xml ├── css │ ├── syntax-theme-dark.css │ └── syntax-theme-light.css ├── favicon-16x16.png ├── favicon-32x32.png ├── favicon-96x96.png ├── favicon.ico ├── fonts │ ├── Inter-Black.woff │ ├── Inter-Black.woff2 │ ├── Inter-Bold.woff │ ├── Inter-Bold.woff2 │ ├── Inter-ExtraBold.woff │ ├── Inter-ExtraBold.woff2 │ ├── Inter-ExtraLight.woff │ ├── Inter-ExtraLight.woff2 │ ├── Inter-Light.woff │ ├── Inter-Light.woff2 │ ├── Inter-Medium.woff │ ├── Inter-Medium.woff2 │ ├── Inter-Regular.woff │ ├── Inter-Regular.woff2 │ ├── Inter-SemiBold.woff │ ├── Inter-SemiBold.woff2 │ ├── Inter-Thin.woff │ ├── Inter-Thin.woff2 │ └── Inter-roman.var.woff2 ├── humans.txt ├── icons │ ├── showcase │ │ ├── crown.svg │ │ ├── dino.svg │ │ ├── monitor.svg │ │ ├── textsnatcher.svg │ │ ├── timeshift.png │ │ ├── tuba.svg │ │ └── workbench.svg │ └── spritemap.svg ├── img │ ├── showcase │ │ ├── crown.png │ │ ├── dino.png │ │ ├── monitor.png │ │ ├── textsnatcher.png │ │ ├── timeshift.png │ │ ├── tuba.png │ │ └── workbench.png │ └── vala-hero-wide.png ├── js │ └── global.js ├── manifest.json ├── ms-icon-144x144.png ├── ms-icon-150x150.png ├── ms-icon-310x310.png └── ms-icon-70x70.png ├── syntaxes └── vala.sublime-syntax └── templates ├── 404.html ├── anchor-link.html ├── base.html ├── blog-post.html ├── blog.html ├── index.html ├── macros ├── blog.html ├── body.html ├── head.html └── icon.html ├── page.html ├── partials ├── blog │ └── latest_blog_posts.html ├── community.html ├── features.html ├── footer.html ├── showcase.html ├── usages.html └── versions.html └── shortcodes └── predefined_cta_stack.html /.devcontainer.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Zola Dev Container", 3 | "build": { "dockerFile": "Dockerfile" }, 4 | "forwardPorts": [1111], 5 | "workspaceFolder": "/app", 6 | "mounts": ["source=.", "target=/app", "type=bind", "consistency=cached"], 7 | "appPort": [1111], 8 | "remoteUser": "vscode" 9 | } 10 | -------------------------------------------------------------------------------- /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | trim_trailing_whitespace = true 9 | insert_final_newline = true 10 | 11 | [js] 12 | indent_size = 4 13 | -------------------------------------------------------------------------------- /.github/workflows/deploy-website.yaml: -------------------------------------------------------------------------------- 1 | on: 2 | push: 3 | branches: main 4 | name: Build and deploy GH Pages 5 | jobs: 6 | build: 7 | runs-on: ubuntu-latest 8 | if: github.ref == 'refs/heads/main' 9 | steps: 10 | - name: checkout 11 | uses: actions/checkout@v2 12 | - name: build_and_deploy 13 | uses: shalzz/zola-deploy-action@master 14 | env: 15 | # Target branch 16 | PAGES_BRANCH: gh-pages 17 | # Provide personal access token 18 | TOKEN: ${{ secrets.TOKEN }} 19 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | public/ 2 | *~ 3 | processed_images 4 | -------------------------------------------------------------------------------- /.prettierignore: -------------------------------------------------------------------------------- 1 | public 2 | *.html -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "semi": false, 3 | "singleQuote": true 4 | } -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM alpine:latest 2 | 3 | # Install zola 4 | RUN apk add zola 5 | 6 | # Set the working directory 7 | WORKDIR /app 8 | 9 | # Copy the application files to the container 10 | COPY . /app 11 | 12 | # Expose 1111 to the host's 1111 port 13 | EXPOSE 1111 14 | 15 | # Define the command to run the application 16 | CMD ["zola", "serve", "--interface", "0.0.0.0", "--base-url", "/"] -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Vala on the Web 2 | 3 | Website of the Vala programming language. View the website here: https://vala.dev 4 | 5 | You can contribute to the new documentation website here: https://github.com/vala-lang/vala-docs 6 | 7 | ## Reporting bugs and requesting features 8 | 9 | Feel free to [create a new issue](https://github.com/vala-lang/vala-www/issues/new/choose) or [participate in an existing one](https://github.com/vala-lang/vala-www/issues) 10 | 11 | ## System Requirements 12 | 13 | - [Zola](https://www.getzola.org) (Version 0.19.1 or higher) 14 | 15 | ## Getting started 16 | 17 | First, start the development server: 18 | 19 | ```sh 20 | zola serve 21 | ``` 22 | 23 | Then you should be able to access the website on your browser by navigating to: [http://127.0.0.1:1111](http://127.0.0.1:1111). 24 | 25 | You can edit the index page by modifying `templates/index.html`. The rest of the pages are defined in `content`. 26 | 27 | ## Translations 28 | 29 | 1. Fork this repository 30 | 2. Work on the translations. The translation strings are in `config.toml`. You can use these resources for help: 31 | - https://www.getzola.org/documentation/content/multilingual/ 32 | - https://www.getzola.org/documentation/templates/pages-sections/ 33 | 3. For markdown pages (pages in `/content` where the content is written in markdown), you need to create a new markdown file for the translated version e.g. `page-name.{language_code}.md`. 34 | 4. Add your language to the `lang_map` macro in `templates/macros/body.html` 35 | 5. Create a pull request with the changes you've made 36 | 37 | **Important Notes:** 38 | 39 | - You must translate the About page and the Home page 40 | - To translate strings in `config.toml` phrase by phrase, copy and paste the original English translations then replace each phrase over time. 41 | - Feel free to ask for help. You can ask in the issue you created or on the [discussions page](https://www.github.com/vala-www/discussions). 42 | 43 | ## Adding new blog posts 44 | 45 | 1. Inside the `content/blog` directory: create a new markdown file that ends in `.md`, add [front matter](https://www.getzola.org/documentation/content/page/#front-matter) to the file then write the rest of your post below the front matter. 46 | 2. Create a pull request with the changes you've made. 47 | 48 | Note: 49 | 50 | For more information, check out the ["pages" section of the contributor guide](docs/3-pages.md). 51 | 52 | ## Website Documentation 53 | 54 | Check out the [contributor guide](docs/CONTRIBUTING.md) to learn more about how this website works. 55 | 56 | ## Credits 57 | 58 | Various people have contributed to this website in some way and, more people will also help with the project over time. 59 | 60 | The Contributors section in the GitHub repository doesn't tell the whole story. There's a file called `humans.txt` (available in [/static/humans.txt](/static/humans.txt)) where contributor details can be added. 61 | 62 | Feel free to request for your details to be added or add them yourself if you have contributed to this project in any way. This is available for anyone to see if they visit: https://vala.dev/humans.txt. 63 | 64 | You can find out more about humans.txt at: https://humanstxt.org/. 65 | 66 | ## Additional Resources 67 | 68 | - [Zola Documentation](https://www.getzola.org/documentation/getting-started/overview/) 69 | - [Tera Documentation](https://keats.github.io/tera/) 70 | - [MDN Web Docs](https://developer.mozilla.org) 71 | -------------------------------------------------------------------------------- /assets/code-sample.md: -------------------------------------------------------------------------------- 1 | ```vala 2 | // ExampleApp.vala 3 | 4 | public class ExampleApp : Gtk.Application { 5 | public ExampleApp () { 6 | Object (application_id: "com.example.App"); 7 | } 8 | 9 | public override void activate () { 10 | var win = new Gtk.ApplicationWindow (this); 11 | 12 | var btn = new Gtk.Button.with_label ("Hello World"); 13 | btn.clicked.connect (win.close); 14 | 15 | win.child = btn; 16 | win.present (); 17 | } 18 | 19 | public static int main (string[] args) { 20 | var app = new ExampleApp (); 21 | return app.run (args); 22 | } 23 | } 24 | 25 | // Compile command (requires gtk4 package to be installed): 26 | // valac --pkg gtk4 ExampleApp.vala 27 | ``` 28 | -------------------------------------------------------------------------------- /assets/showcase-items.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "name": "Tuba", 4 | "icon_path": "icons/showcase/tuba.svg", 5 | "url": "https://tuba.geopjr.dev/", 6 | "screenshot_path": "/img/showcase/tuba.png", 7 | "description": "Browse the Fediverse" 8 | }, 9 | { 10 | "name": "Workbench", 11 | "icon_path": "icons/showcase/workbench.svg", 12 | "url": "https://apps.gnome.org/Workbench/", 13 | "screenshot_path": "/img/showcase/workbench.png", 14 | "description": "Learn and prototype with Vala and other GNOME technologies" 15 | }, 16 | { 17 | "name": "Dino", 18 | "icon_path": "icons/showcase/dino.svg", 19 | "url": "https://dino.im/", 20 | "screenshot_path": "/img/showcase/dino.png", 21 | "description": "A modern open-source chat client for the desktop. Focuses on providing a clean and reliable Jabber/XMPP experience while having your privacy in mind." 22 | }, 23 | { 24 | "name": "Monitor", 25 | "icon_path": "icons/showcase/monitor.svg", 26 | "url": "https://github.com/stsdc/monitor", 27 | "screenshot_path": "/img/showcase/monitor.png", 28 | "description": "Manage processes and monitor system resources" 29 | }, 30 | { 31 | "name": "TextSnatcher", 32 | "icon_path": "icons/showcase/textsnatcher.svg", 33 | "url": "https://github.com/RajSolai/TextSnatcher", 34 | "screenshot_path": "/img/showcase/textsnatcher.png", 35 | "description": "Copy Text from Images with ease, Perform OCR operations in seconds." 36 | }, 37 | { 38 | "name": "Timeshift", 39 | "icon_path": "icons/showcase/timeshift.png", 40 | "url": "https://github.com/linuxmint/timeshift", 41 | "screenshot_path": "/img/showcase/timeshift.png", 42 | "description": "System restore tool for Linux. Creates filesystem snapshots using rsync+hardlinks, or BTRFS snapshots." 43 | }, 44 | { 45 | "name": "Crown", 46 | "icon_path": "icons/showcase/crown.svg", 47 | "url": "https://www.crownengine.org", 48 | "screenshot_path": "/img/showcase/crown.png", 49 | "description": "Crown is a complete and cross-platform game engine designed for flexibility, performance, and fast-iterations." 50 | } 51 | ] 52 | -------------------------------------------------------------------------------- /assets/vala-hero-next.svg: -------------------------------------------------------------------------------- 1 | 2 | 18 | 37 | Artboard 39 | 41 | 47 | 50 | 57 | 63 | 68 | 73 | 74 | 77 | 84 | 90 | 95 | 100 | 101 | 104 | 111 | 117 | 122 | 127 | 128 | 131 | 138 | 144 | 149 | 154 | 155 | 158 | 165 | 171 | 176 | 181 | 182 | 189 | 195 | 200 | 206 | 208 | 211 | 214 | 215 | 216 | 217 | 223 | 226 | 235 | 238 | 241 | 244 | 247 | 248 | 250 | 251 | 255 | 259 | 265 | 269 | 270 | 274 | 280 | 284 | 285 | 289 | 295 | 299 | 300 | 304 | 310 | 314 | 315 | 319 | 325 | 329 | 330 | 331 | 336 | 339 | 342 | 345 | 348 | 349 | 350 | 351 | 353 | 354 | 356 | Artboard 357 | 358 | 359 | 360 | 361 | -------------------------------------------------------------------------------- /content/_index.cs.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Programovací jazyk Vala" 3 | template = "index.html" 4 | description = "Vala je objektově orientovaný programovací jazyk s vlastním kompilátorem, který generuje kód v jazyce C a používá typový systém GObject." 5 | insert_anchor_links = "right" 6 | +++ 7 | -------------------------------------------------------------------------------- /content/_index.fr.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Vala Programming Language" 3 | template = "index.html" 4 | description = "Vala est un langage de programmation orienté objet avec un compilateur qui génère du code C et utilise le système de type GObject." 5 | insert_anchor_links= "right" 6 | +++ 7 | -------------------------------------------------------------------------------- /content/_index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Vala Programming Language" 3 | template = "index.html" 4 | description = "Vala is an object-oriented programming language with a self-hosting compiler that generates C code and uses the GObject type system." 5 | insert_anchor_links= "right" 6 | +++ 7 | 8 | 9 | -------------------------------------------------------------------------------- /content/_index.pt_BR.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "A Linguagem de Programação Vala" 3 | template = "index.html" 4 | description = "Vala é uma linguagem de programação orientada a objetos com compilador embutido, que gera código C e usa o sistema de tipos GObject." 5 | insert_anchor_links= "right" 6 | +++ 7 | 8 | 9 | -------------------------------------------------------------------------------- /content/_index.ru.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Язык программирования Vala" 3 | template = "index.html" 4 | description = "Vala - это объектно-ориентированный язык программирования с самодостаточным компилятором, который генерирует код Cи и использует систему типов GObject." 5 | insert_anchor_links= "right" 6 | +++ 7 | 8 | -------------------------------------------------------------------------------- /content/_index.zh_CN.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Vala编程语言" 3 | template = "index.html" 4 | description = "Vala 是一种面向对象的编程语言,由自举编译器产生 C 语言代码并使用 GObject 类型系统。" 5 | insert_anchor_links= "right" 6 | +++ 7 | 8 | 9 | -------------------------------------------------------------------------------- /content/about/index.cs.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "O jazyce Vala" 3 | template = "page.html" 4 | insert_anchor_links = "right" 5 | lang = "cs" 6 | description = "Vala je objektově orientovaný programovací jazyk s vlastním kompilátorem, který generuje kód v jazyce C a používá typový systém GObject." 7 | +++ 8 | 9 |

O jazyce Vala

10 | 11 | ## Co je Vala? 12 | 13 | Vala je objektově orientovaný programovací jazyk s vlastním kompilátorem, který generuje kód v jazyce C a používá typový systém GObject. 14 | 15 | Vala podporuje moderní jazykové funkce, jako jsou: 16 | 17 | - Rozhraní 18 | - Vlastnosti 19 | - Signály 20 | - Konstrukce Foreach 21 | - Výrazy lambda 22 | - Odvozování typu pro místní proměnné 23 | - Generické typy 24 | - Ne-nullové typy 25 | - Asistovanou správu paměti 26 | - Zacházení s výjimkami 27 | - Typové moduly (pluginy) 28 | 29 | ## Jakým jazykem je Vala? 30 | 31 | ### Produktivní 32 | 33 | S Valou můžete začít pracovat rychle díky praktickým funkcím, jako jsou lambda výrazy, zpracování výjimek, rozhraní a generika. 34 | 35 | ### Výkonný 36 | 37 | Kód Vala se zkompiluje na plně nativní binární soubory. 38 | 39 | ### Staticky typovaný 40 | 41 | Vala vám pomůže psát typově bezpečný kód bez zbytečných slov, a to díky odvozování typů. 42 | 43 | ### Integrativní 44 | 45 | Vala je navržena tak, aby umožňovala přístup k existujícím knihovnám jazyka C, zejména ke knihovnám založeným na GObject, bez nutnosti runtime vazeb. Vše, co je potřeba k použití knihovny s Valou, je soubor API obsahující deklarace tříd a metod v syntaxi Vala. Vala v současné době obsahuje vazby pro GLib a GTK+ a mnoho dalších z platformy GNOME. 46 | 47 | Vala lze použít k vytváření knihoven také v jazyce C. 48 | 49 | ### Známý 50 | 51 | Syntaxe jazyka Vala je inspirována jazyky C# a Java, takže pokud jste některý z nich používali, snadno se přizpůsobíte psaní kódu jazyka Vala. 52 | 53 | {{ predefined_cta_stack() }} 54 | -------------------------------------------------------------------------------- /content/about/index.fr.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "À propos de Vala" 3 | template = "page.html" 4 | insert_anchor_links = "right" 5 | lang = "fr" 6 | description = "Vala est un langage de programmation orienté objet avec un compilateur qui génère du code C et utilise le système de type GObject." 7 | +++ 8 | 9 |

À propos de Vala

10 | 11 | ## Qu'est-ce que Vala ? 12 | 13 | Vala est un langage de programmation orienté objet avec un compilateur qui génère du code C et utilise le système de type GObject. 14 | 15 | 16 | Vala prend en charge les fonctionnalités de langage moderne telles que : 17 | 18 | - Interfaces 19 | - Properties 20 | - Signals 21 | - Foreach statements 22 | - Lambda expressions 23 | - Type inferencing for local variables 24 | - Generics 25 | - Non-null types 26 | - Assisted memory management 27 | - Exception handling 28 | - Type modules (Plugins) 29 | 30 | ## Quel genre de langue est Vala? 31 | 32 | ### Productif 33 | 34 | Avec Vala, vous pouvez être opérationnel rapidement, grâce à des fonctionnalités pratiques telles que les expressions lambda, la gestion des exceptions, les interfaces et les génériques. 35 | 36 | ### Performant 37 | 38 | Le code Vala se compile en binaires entièrement natifs. 39 | 40 | ### Statically-Typed 41 | 42 | Vala vous aide à écrire du code de type sécurisé sans verbosité, grâce à l'inférence de type. 43 | 44 | ### Integrative 45 | 46 | Vala est conçu pour permettre l'accès aux bibliothèques C existantes, en particulier les bibliothèques basées sur GObject, sans avoir besoin de liaisons d'exécution. Tout ce qui est nécessaire pour utiliser une bibliothèque avec Vala est un fichier vapi, contenant les déclarations de classe et de méthode dans la syntaxe Vala. Vala est actuellement livré avec des liaisons pour GLib et GTK + et bien d'autres de la plate-forme GNOME. 47 | 48 | Vala peut également être utilisé pour créer des bibliothèques C. 49 | 50 | ### Familiar 51 | 52 | La syntaxe de Vala est inspirée de C # et Java, donc si vous avez utilisé l'un ou l'autre, vous vous adapterez de manière transparente à l'écriture de code Vala. 53 | 54 | {{ predefined_cta_stack() }} 55 | -------------------------------------------------------------------------------- /content/about/index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "About Vala" 3 | template = "page.html" 4 | insert_anchor_links = "right" 5 | description = "Vala is an object-oriented programming language with a self-hosting compiler that generates C code and uses the GObject type system." 6 | +++ 7 | 8 |

About Vala

9 | 10 | ## What is Vala? 11 | 12 | Vala is an object-oriented programming language with a self-hosting compiler that generates C code and uses the GObject type system. 13 | 14 | Vala supports modern language features such as: 15 | 16 | - Interfaces 17 | - Properties 18 | - Signals 19 | - Foreach statements 20 | - Lambda expressions 21 | - Type inferencing for local variables 22 | - Generics 23 | - Non-null types 24 | - Assisted memory management 25 | - Exception handling 26 | - Type modules (Plugins) 27 | 28 | ## What kind of language is Vala? 29 | 30 | ### Productive 31 | 32 | With Vala, you can get up and running quickly, thanks to convenient features like lambda expressions, exception handling, interfaces and generics. 33 | 34 | ### Performant 35 | 36 | Vala code compiles down to fully native binaries. 37 | 38 | ### Statically-Typed 39 | 40 | Vala helps you write type-safe code without the verbosity, thanks to type inference. 41 | 42 | ### Integrative 43 | 44 | Vala is designed to allow access to existing C libraries, especially GObject-based libraries, without the need for runtime bindings. All that is needed to use a library with Vala is an API file, containing the class and method declarations in Vala syntax. Vala currently comes with bindings for GLib and GTK+ and many others from the GNOME Platform. 45 | 46 | Vala can also be used to create C libraries too. 47 | 48 | ### Familiar 49 | 50 | The syntax of Vala is inspired by C# and Java, so if you have used either of those, you'll seamlessly adapt to writing Vala code. 51 | 52 | {{ predefined_cta_stack() }} 53 | -------------------------------------------------------------------------------- /content/about/index.pt_BR.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Sobre o Vala" 3 | template = "page.html" 4 | insert_anchor_links = "right" 5 | description = "Vala é uma linguagem de programação orientada a objetos com compilador embutido, que gera código C e usa o sistema de tipos GObject." 6 | +++ 7 | 8 |

Sobre o Vala

9 | 10 | ## O que é Vala? 11 | 12 | Vala é uma linguagem de programação orientada a objetos com compilador embutido, que gera código C e usa o sistema de tipos GObject. 13 | 14 | Vala suporta funcionalidades de linguagens de programação moderna, como: 15 | 16 | - Interfaces 17 | - Propriedades 18 | - Sinais 19 | - Declaração Foreach 20 | - Expressões Lambda 21 | - Inferência de tipo para variáveis locais 22 | - Programação genérica 23 | - Tipos Non-null 24 | - Gerenciamento de memória assistido 25 | - Tratamento de exceção 26 | - Módulos (Plugins) 27 | 28 | ## Que tipo de linguagem é Vala? 29 | 30 | ### Produtiva 31 | 32 | Com Vala, você pode entrar em operação rapidamente, graças a funcionalidades convenientes como expressões lambda, tratamento de exceção, interfaces e programação genérica. 33 | 34 | ### Performante 35 | 36 | Código Vala compila para binários inteiramente nativos. 37 | 38 | ### Estaticamente-Tipada 39 | 40 | Vala te ajuda a escrever código de tipagem segura, sem verbosidade, graças à inferência de tipos. 41 | 42 | ### Integrativo 43 | 44 | Vala é projetada para permitir acesso a bibliotecas C existentes, especialmente bibliotecas baseadas em GObject, sem a necessidade de bindings em tempo de execução. Tudo o que é necessário para usar uma biblioteca com Vala é um arquivo API, contendo as declarações de classe e método na sintaxe Vala. Vala atualmente vem com bindings para GLib e GTK+ e muitos outros para a Plataforma GNOME. 45 | 46 | Vala também pode ser utilizada para criar bibliotecas C. 47 | 48 | ### Familiar 49 | 50 | A sintaxe de Vala é inspirada em C# e Java, de modo que se você já usou alguma delas, você se adaptará perfeitamente à escrita de código Vala. 51 | 52 | {{ predefined_cta_stack() }} 53 | -------------------------------------------------------------------------------- /content/about/index.ru.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "О Vala" 3 | template = "page.html" 4 | insert_anchor_links = "right" 5 | description = "Vala - это объектно-ориентированный язык программирования с самодостаточным компилятором, который генерирует код Cи и использует систему типов GObject." 6 | +++ 7 | 8 |

О Vala

9 | 10 | ## Что такое Vala? 11 | 12 | Vala - это объектно-ориентированный язык программирования с самодостаточным компилятором, который генерирует код Cи и использует систему типов GObject. 13 | 14 | Vala поддерживает современные языковые функции, такие как: 15 | 16 | - Интерфейсы 17 | - Свойства 18 | - Сигналы 19 | - Foreach 20 | - Лямбда-выражения 21 | - Вывод типа для локальных переменных 22 | - Дженерики 23 | - Ненулевые типы 24 | - Лёгкое управление памятью 25 | - Обработка исключений 26 | - Типы модулей (плагины) 27 | 28 | ## Почему Vala? 29 | 30 | ### Производительный 31 | 32 | С Vala вы можете быстро приступить к работе благодаря таким удобным функциям, как лямбда-выражения, обработка исключений, интерфейсы и дженерики. 33 | 34 | ### Быстрый 35 | 36 | Код Vala компилируется в полностью нативные двоичные файлы. 37 | 38 | ### Статически типизированный 39 | 40 | Vala помогает вам писать безопасный код без хлопот, благодаря выводу типов. 41 | 42 | ### Интегрированный 43 | 44 | Vala предназначен для обеспечения доступа к существующим библиотекам Cи, особенно к библиотекам на основе GObject, без необходимости привязок во время выполнения. Все, что необходимо для использования библиотеки Vala - это файл API, содержащий объявления классов и методов в синтаксисе Vala. В настоящее время Vala поставляется с привязками для GLib и GTK+ и многими другими библиотеками с платформы GNOME. 45 | 46 | Vala также можно использовать для создания библиотек языка Си. 47 | 48 | ### Знакомый 49 | 50 | Синтаксис Vala вдохновлен C# и Java, поэтому, если вы использовали любой из них, вы с легкостью адаптируетесь к написанию кода на Vala. 51 | 52 | {{ predefined_cta_stack() }} 53 | -------------------------------------------------------------------------------- /content/about/index.zh_CN.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "关于 Vala" 3 | template = "page.html" 4 | lang = "zh_CN" 5 | insert_anchor_links = "right" 6 | description = "Vala 是一种面向对象的编程语言,具有自托管编译器,可生成 C 代码并使用 GObject 类型系统。" 7 | +++ 8 | 9 |

关于 Vala

10 | 11 | ## 什么是 Vala? 12 | 13 | Vala 是一种面向对象的编程语言,具有自托管编译器,可生成 C 代码并使用 GObject 类型系统。 14 | 15 | Vala 支持现代语言特性,例如: 16 | 17 | - 接口 18 | - 属性 19 | - 信号 20 | - Foreach 语句 21 | - Lambda 表达式 22 | - 局部变量的类型推断 23 | - 泛型 24 | - 非空(Non-null)类型 25 | - 辅助内存管理 26 | - 异常处理 27 | - 类型模块(插件) 28 | 29 | ## Vala 是什么语言? 30 | 31 | ### 高效 32 | 33 | 使用 Vala,您可以快速启动并运行,这要归功于 lambda 表达式、异常处理、接口和泛型等方便的功能。 34 | 35 | ### 高性能 36 | 37 | Vala 代码编译成完全原生的二进制文件。 38 | 39 | ### 静态类型 40 | 41 | 由于类型推断,Vala 可以帮助您编写类型安全的代码而不会冗长。 42 | 43 | ### 整合 44 | 45 | Vala 旨在允许访问现有的 C 库,尤其是基于 GObject 的库,而无需运行时绑定。 使用带有 Vala 的库所需的全部是一个 API 文件,其中包含 Vala 语法中的类和方法声明。 Vala 当前附带了 GLib 和 GTK+ 以及 GNOME 平台的许多其他绑定。 46 | 47 | Vala 也可以用来创建 C 库。 48 | 49 | ### 熟悉 50 | 51 | Vala 的语法受到 C# 和 Java 的启发,因此如果您使用过其中任何一个,您将无缝地适应编写 Vala 代码。 52 | 53 | {{ predefined_cta_stack() }} 54 | -------------------------------------------------------------------------------- /content/blog/_index.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Blog" 3 | template = "blog.html" 4 | description = "Welcome to the Vala Blog" 5 | page_template = "blog-post.html" 6 | sort_by = "date" 7 | paginate_by = 10 8 | paginate_path = "page" 9 | insert_anchor_links = "right" 10 | +++ 11 | 12 | -------------------------------------------------------------------------------- /content/blog/planet-gnome.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "print(\"Hello Planet GNOME\");" 3 | date = "2023-10-11" 4 | description="Posts from the Vala blog are now appearing on Planet GNOME!" 5 | 6 | [extra] 7 | authors = ["Lorenz Wildberg"] 8 | +++ 9 | 10 | Hello to all of you reading [Planet GNOME](https://planet.gnome.org/) right now! This is the first post from the [Vala Blog](https://vala.dev/blog/) now appearing in the big wide world of GNOME. 11 | 12 | Big thanks to the Planet GNOME team and Felipe Borges for making this possible! 13 | 14 | This blog is operated by the Vala project and we are posting here once in a while about new Vala releases, noteworthy changes like new features and how to use them, interesting projects using Vala and their experience with it and other stuff related to the Vala programming language. 15 | 16 | If you have an idea to write about something that fits one of the categories above, reach out to us and we are sure eventually a great article will be released! (Talk to us [here](https://vala.dev/#community)) 17 | 18 | Stay tuned for the next posts coming out! :) 19 | -------------------------------------------------------------------------------- /content/blog/vala-0-56.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "Vala 0.56" 3 | date = "2022-03-18" 4 | description="Here's what's new in Vala release version 0.56" 5 | 6 | [extra] 7 | authors = ["Lorenz Wildberg"] 8 | +++ 9 | 10 | After 4 months of work we are proud to announce a new release of Vala. This time it contains lots of new language features and advancements and of course also the usual bug fixes and binding updates. 11 | 12 | ## Asynchronous Main Function 13 | 14 | With the new release the main function can now be defined as `async`. This has multiple advantages. For example is it now possible to call asynchronous functions with `yield`: 15 | 16 | ```vala 17 | async int main (string[] args) { 18 | string dir = args.length == 2 ? args[1] : "."; 19 | var file = File.new_for_commandline_arg (dir); 20 | try { 21 | FileEnumerator enumerator = 22 | yield file.enumerate_children_async ( 23 | "standard::*,time::*", 24 | FileQueryInfoFlags.NOFOLLOW_SYMLINKS 25 | ); 26 | List children = 27 | yield enumerator.next_files_async (int.MAX); 28 | print ("total %lu\n", children.length ()); 29 | foreach (var info in children) { 30 | // 31 | print ("%26s %24s %10"+int64.FORMAT+" B %s\n", 32 | info.get_content_type (), 33 | info.get_access_date_time ().to_string (), 34 | info.get_size (), 35 | info.get_name ()); 36 | } 37 | } catch (Error e) { 38 | printerr ("failed to enumerate files - %s\n", e.message); 39 | return 1; 40 | } 41 | return 0; 42 | } 43 | ``` 44 | In main blocks (experimental feature that allows it to write code in a file without putting in a main function) invoking functions with `yield` is also supported by making the main block automatically asynchronous. 45 | 46 | Merge Request [#226](https://gitlab.gnome.org/GNOME/vala/-/merge_requests/226) 47 | 48 | ## Nested functions 49 | 50 | A simple but very useful feature is to be able to nest functions inside of other functions or methods. These functions are then only visible to the code in the function that contains the nested one. But on the other way the code in the nested function has access to variables in the upper method. Actually they are only lambdas assigned to a local variable. 51 | 52 | Use cases are to structure very complicated functions into multiple smaller ones, without exposing them publicly. In this example the same asynchronous callback is used for two invocations, in which you otherwise would use lambdas: 53 | 54 | ```vala 55 | void write_streams (OutputStream stream1, OutputStream stream2, uint8[] data) { 56 | void nested_function (Object object_source, AsyncResult result) { 57 | OutputStream stream = object_source as OutputStream; 58 | try { 59 | ssize_t size = stream.write_async.finish (result); 60 | stdout.printf (@"Written $size bytes\n"); 61 | } catch (Error e) { 62 | stderr.printf ("Error writing to stream: %s", e.message); 63 | } 64 | } 65 | 66 | stream1.write_async (data, nested_function); 67 | stream2.write_async (data, nested_function); 68 | } 69 | 70 | ``` 71 | 72 | Merge Request [#203](https://gitlab.gnome.org/GNOME/vala/-/merge_requests/203) 73 | 74 | ## Redesign of error and warning output 75 | 76 | If programming errors are outputted at compile time in a pretty way and provide as much information as possible, they massively help and speed up finding the mistakes and correcting them. In the new release this part got an update. Look at the differences yourself: 77 | 78 | Before Vala 0.56: 79 | 80 | ```vala 81 | int foo = bar(); 82 | ^^^ 83 | ``` 84 | 85 | Vala 0.56: 86 | 87 | ```vala 88 | 2 | int foo = bar(); 89 | | ^~~ 90 | 91 | ``` 92 | 93 | What looks better? :) 94 | 95 | Issue [#764](https://gitlab.gnome.org/GNOME/vala/-/issues/764) 96 | 97 | ## Dynamic invocation of Signals 98 | 99 | Libraries using the GObject type system are providing usually documentation about their API so other languages can use them. However sometimes some parts are missing. With the `dynamic` keyword an object can be treated as not having all properties or signals specified and they can be accessed dynamically without checking: 100 | 101 | ```vala 102 | dynamic Gst.Element appsink = Gst.ElementFactory.make ("appsink", "my_src"); 103 | appsink.max_buffers = 0; 104 | appsink.eos.connect (on_eos); 105 | Gst.Sample? res = appsink.pull_sample.emit (); 106 | 107 | ``` 108 | 109 | As you can see, signals are now also callable with `.emit ()`. This is necessary to differentiate between a method or a dynamic signal. But this syntax can be also used with non-dynamic variables if wanted. 110 | 111 | Merge Request [#227](https://gitlab.gnome.org/GNOME/vala/-/merge_requests/227) 112 | 113 | ## Partial classes 114 | 115 | In rare cases, if a class is so huge and complex, it can be now split up into multiple pieces even into multiple files. All parts of the class only need the partial keyword in front of it. 116 | 117 | ```vala 118 | public partial class Foo : Object { 119 | public double bar { get; set; } 120 | } 121 | 122 | public partial class Foo : Initable { 123 | public virtual bool init (Cancellable? cancellable = null) { 124 | stdout.printf ("hello!\n"); 125 | this.bar = 0.56; 126 | return true; 127 | } 128 | } 129 | 130 | ``` 131 | 132 | Merge Request [#200](https://gitlab.gnome.org/GNOME/vala/-/merge_requests/200) 133 | 134 | ## Length-type for Arrays 135 | 136 | The length of an array is usually specified by an 32bit integer. However in some cases, especially in bindings to other libaries, sometimes the length of an array is given by a different type of integer. We now have support for that: 137 | 138 | ```vala 139 | string[] list = new string[10:uint8]; 140 | ``` 141 | 142 | Issue [#607](https://gitlab.gnome.org/GNOME/vala/-/issues/607) 143 | 144 | ## Foreach support on Glib.Sequence and Glib.Array 145 | 146 | This small change will be a big improvement for users of these data structures. Instead of manually looping with for, they are now ready to be used with a foreach loop over the items in the sequence or array. 147 | 148 | Merge Request [#234](https://gitlab.gnome.org/GNOME/vala/-/merge_requests/234) 149 | 150 | ## New Bindings 151 | 152 | A bunch of new bindings to libraries got added this release. Here is a list: 153 | 154 | 155 | - libsoup is now also available in version 3.0 and webkit2gtk in version 4.1 and 5.0 so you can start porting you Vala apps to the new releases of these libraries 156 | - linux-media can now be used from Vala. There were also lots of more additions and fixes in other linux kernel interface bindings. 157 | - During the port of the gnome-desktop library it was splitted up into gnome-desktop-4, gnome-rr-4 and gnome-bg-4. They are all now available to use in your new app. 158 | - The GLib vapi was updated to version 2.72, including the new Signal- and BindingGroups and DebugController 159 | 160 | ## GNOME Getting started tutorial 161 | 162 | The GNOME developer documentation has besides other stuff a excellent section on getting started with GTK and app development. Most of the [tutorials](https://developer.gnome.org/documentation/tutorials.html) there have now code examples in Vala. So read it and write your first Vala application! :) 163 | 164 | ## Vala Flatpak Sdk Extension 165 | 166 | You can find on flathub now the `org.freedesktop.Sdk.Extension.vala` Extension. It contains the Vala compiler, language server and more tooling. You can use it either for compiling your Vala app, or if you need for example the language server at runtime, like an IDE. Instructions can be found at the [flathub repository](https://github.com/flathub/org.freedesktop.Sdk.Extension.vala). 167 | 168 | ## Google Summer of Code 169 | 170 | We have proposed a project idea for the Google Summer of Code for working on Vala. If you are interested, check out the [project ideas page](https://discourse.gnome.org/t/gsoc-2022-project-ideas/8931#add-support-for-the-latest-gir-attributes-and-gi-docgen-formatting-to-valadoc-15) on GNOME discourse. 171 | 172 | --- 173 | 174 | You are always invited to join our matrix chat [#vala:gnome.org](https://matrix.to/#/#_gimpnet_#vala:gnome.org) and ask questions about Vala or how to contribute. Until then, have a nice time and build great apps with Vala! 175 | -------------------------------------------------------------------------------- /content/blog/valabot.md: -------------------------------------------------------------------------------- 1 | +++ 2 | title = "ValaBot: an AI coding assistant fine-tuned for Vala" 3 | date = "2024-05-09" 4 | description="An AI coding assistant fine-tuned for Vala and Gtk" 5 | 6 | [extra] 7 | authors = ["Sam Cowen"] 8 | +++ 9 | 10 | ## Enhancing AI Coding Assistants for Vala Developers 11 | 12 | As a programmer, I've been impressed by AI coding assistants like GitHub Copilot and Codeium, which have significantly boosted my productivity. These tools excel at reducing disruptive interruptions, saving time on typing, and often completing lines of code accurately. However, I've encountered limitations with Copilot while working with the Vala programming language. Its suggestions often get muddled with similar languages like Java and C#, and it lacks training on the more common Vala libraries. 13 | 14 | Like many other developers, I'm also dissatisfied with the dominance of Github Copilot and that open source code has been monetized without attribution or consideration for the original authors (some of whom now pay for the service). 15 | 16 | This challenge inspired me to enhance the Copilot concept by creating an AI coding assistant that is finely tuned to provide a viable and superior alternative that caters for the specific needs of Vala developers. I began with an open-source Large Language Model that had been trained on source code - the powerful Deepseek Coder 6.7b model. This model has been trained from scratch by Deepseek AI on 2 trillion tokens sourced from GitHub. Deepseek Coder significantly outperforms other open-source coding models, such as Codellama. 17 | 18 | I chose the Deepseekcoder-6.7b-base model as the foundation for fine-tuning because of its great benchmark performance and also because it was trained on Java and C# – languages syntactically close to Vala. This allowed me to build upon its existing capabilities and adapt it to the specific needs of Vala. 19 | 20 | ## Fine-Tuning for Vala 21 | 22 | I fine-tuned the model on Vala programming language datasets. This involved downloading as many Vala projects as I could find from GitHub, extracting the Vala source files, and splitting them into ~40 line segments. I then used Llama3 to create logical and predictable "holes" in each segment, which were then used to create the FIM (fill-in-the-middle) dataset. This data preparation process took 96 hours of GPU time using my quad-RX6800 machine over a weekend. The resulting dataset was cleaned to remove non-code elements, such as license headers, and personal identifiable information. 23 | 24 | ## The Training 25 | 26 | The fine-tuning process took 10 hours on an RTX 3090. The result was a LoRA, which was merged back into the base model, converted to GGUF, and quantized to q8_0, which is the format required by TabbyML. 27 | 28 | ## The Result 29 | 30 | The outcome was a model that is more helpful and productive for Vala-related projects. By fine-tuning Deepseek Coder, I was able to create a more accurate and effective AI coding assistant that understands the nuances of the Vala programming language. The model is hosted on Huggingface (). It can be used in VSCode, VIM, and other popular IDEs with TabbyML. The complete instructions, training scripts, and dataset are available on GitHub (). 31 | 32 | ## Licensing and Fair Use 33 | 34 | As a project rooted in the principles of Free and Open-Source Software (FOSS), I believe in promoting freedom, community, and sharing knowledge. To facilitate collaboration and innovation, I've made the following resources publicly available: 35 | 36 | * The fine-tuned model weights are hosted on Hugging Face for anyone to access and utilize in a TabbyML or other deployment. 37 | * The training scripts and dataset preparation process are open-sourced on GitHub, providing a transparent and reproducible framework for others to build upon. 38 | * A comprehensive list of repositories used during the fine-tuning process is available on GitHub, ensuring that contributors and users can easily identify and explore the sources that made this project possible. 39 | 40 | I hope that this openness will pave the way for further advancements and refinements, ultimately benefiting the Vala developer community as a whole. 41 | 42 | ## Conclusion 43 | 44 | In this blog post, I've shared my experience with fine-tuning the Deepseek Coder for the Vala programming language, demonstrating how targeted adjustments can significantly enhance AI coding assistants. This project is just the beginning. I aim to continue developing models specifically optimized for Vala to support the Vala developer community. With the release of new base models, such as CodeQwen 7B, there are exciting possibilities for further advancements. Through this work, I hope to highlight the potential of AI fine-tuning in creating more effective coding assistants and inspire others to explore the possibilities of AI-assisted coding. 45 | 46 | Get started with ValaBot here: 47 | -------------------------------------------------------------------------------- /content/vala-hero.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/content/vala-hero.png -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | services: 3 | man: 4 | build: . 5 | image: vala-website 6 | ports: 7 | - "1111:1111" 8 | volumes: 9 | - .:/app -------------------------------------------------------------------------------- /docs/1-overview.md: -------------------------------------------------------------------------------- 1 | # Overview 2 | 3 | ## Website Goals 4 | 5 | - Be Vala's offical presence on the internet 6 | - Advertise Vala in an attractive way 7 | - Encourage people to learn Vala 8 | - Increase the amount of traffic to Vala's source code repository 9 | - Provide an open space for the community to produce Vala content with creative freedom 10 | 11 | ## Codebase Goals 12 | 13 | - Be as accessible as possible to contributors - Make it easy as possible for new people to contribute to the website. 14 | - Long-term maintainablitliy - Even after a long period of time, contributing to the website should still be a fast and seamless experience 15 | 16 | ## Technical Details 17 | 18 | - The website is a static site and is generated using [Zola](https://www.getzola.org/) 19 | - Extremely fast (written in Rust) 20 | - Is a single binary with no dependencies (Very simple to install) 21 | - Pages templates are powered by the [Tera templating engine](https://keats.github.io/tera/) 22 | - Page content is written using the [CommonMark](https://commonmark.org/) implementation of [markdown](https://daringfireball.net/projects/markdown/) 23 | - Markdown files are human readable 24 | - Simple syntax 25 | - Well-documented 26 | - [Sass](https://sass-lang.com/) is used for preprocessed styles: 27 | - Spliting styles across so that it's easier to make changes to specific places. 28 | - Taking advantage of preprocessing (calculations and variable substitutions during builds etc.) 29 | - Note: As of 2022-06-28, Zola uses libsass internally which doesn't support the latest Sass features 30 | - The rest of the site uses the standard trio of [HTML](https://developer.mozilla.org/en-US/docs/Web/HTML), [CSS](https://developer.mozilla.org/en-US/docs/Web/CSS) and [JavaScript](https://developer.mozilla.org/en-US/docs/Web/JavaScript) 31 | 32 | 33 | ## Using Different Technologies 34 | 35 | The solution was picked for the website in order to achieve the [codebase goals](#codebase-goals). 36 | 37 | If you feel like there are better tools out there that can be used to achieve these goals, feel free to suggest them. 38 | -------------------------------------------------------------------------------- /docs/2-structure.md: -------------------------------------------------------------------------------- 1 | # Structure 2 | 3 | ## Directories 4 | 5 | - `.github` - GitHub-specific data is stored here like the [GitHub Pages Zola deploy action](https://github.com/shalzz/zola-deploy-action). 6 | - `assets/` - Files that aren't deployed with the website but are used to generate pages in the website. 7 | - `content/` - Here's where the content of pages is written with Markdown. Sections are defined here tohttps://github.com/shalzz/zola-deploy-action). There are more about this available here: https://www.getzola.org/documentation/content/overview/ 8 | - `blog/` - Vala Blog content. All the blog posts are stored under here. 9 | - `about/` - About page contnet. 10 | - `docs/` - The directory where this guide you are reading is under. 11 | - `sass/` - Where sass code is stored. The `css/` folder inside there is intentional as it copies the sass output straight to the `static/` folder. 12 | - `css/components/` - Contains files used to style small, specific parts of markup used across the entire site. 13 | - `css/utils/` - Utilties to be used in other sass files. 14 | - `static/` - Here are the assets stored that will be deployed with the website. The files in the root of the static folder will be located in the root of the website when deployed. 15 | - `./` - (The root). The favicon, platform icons and `manifest.json` file for the website is stored here. 16 | - `css/` - CSS files are stored here. There are also generated syntax stylesheets stored here with the pattern: "syntax-theme.{color-scheme}.css". If you change the highlighting theme settings in Zola, you may need to remove these first to see the changes. 17 | - `fonts/` - There is one variable font named `Inter-roman.var.woff2`. The rest of the files are all Inter fonts for different font weights if a browser doesn't support variable fonts. We use both `.woff` and `.woff2` fonts for better browser compatibility. 18 | - `icons/` - spritemap (containing icons used throughout the website) and showcase icons are stored here 19 | - `showcase/` - Showcase icons 20 | - `img/` - These are generic images used in the website. `vala-hero-wide.png` is used in link embeds and `vala-hero` is the default image used for posts on the website. 21 | - `js/` - JavaScript files used in the website. 22 | - `syntaxes/` - Custom syntaxes that aren't included with [Zola's built-in syntax highlighter](https://www.getzola.org/documentation/content/syntax-highlighting/) are stored here. Note: Vala's syntax can be added to Zola by default by creating an issue in the [Zola repo](https://github.com/getzola/zola) 23 | - `templates/` - This is where the majority of markup of the website is written using Tera. Templates are explained in detail here: https://www.getzola.org/documentation/templates/overview/ 24 | - `macros` - Contains files that with macros that generate markup based in data you pass in when you call them. 25 | - `partials` - Similar to `macros` but only a file can be a partial. There can't be multiple partials in one file and you can't pass in data when including the partial to your template. 26 | - `shortcodes` - Markdown or tera temlpate code that is called from your content markdown. 27 | 28 | ## Root files 29 | 30 | - **`config.toml`** - Configuration file for Zola. Features The site's URL, markdown settings and custom variables. More information about this file is availble here: https://www.getzola.org/documentation/getting-started/configuration/ 31 | - `.editorconfig` - Cross-editor settings for keeping consistent formatting. 32 | - `.gitignore` - Defines files and directories that git should ignore. 33 | - `.prettierignore` - Defines files and directories that prettier should ignore. 34 | - `.prettierrc` - Defines overrides for how prettier should format code in this repository. 35 | - `LICENSE` - The website's license information. 36 | - `README.md` - The repository's README file. The first file we expect people to read to understand the repository. The contents of this file may be shown in this repository's page in codeforges such as GitHub, GitLab, etc. 37 | -------------------------------------------------------------------------------- /docs/3-pages.md: -------------------------------------------------------------------------------- 1 | # Pages 2 | 3 | ## Creating pages 4 | 5 | ### Strategy 6 | 7 | If your page is structured like a post (e.g About page, blog posts, etc), you should opt create the majority of the content in markdown under its own directory under `content/` and use an existing template. Only create a new template if an existsing one doesn't meet your needs or can't be modified to fit your needs. 8 | 9 | For pages that making heavy use of HTML, macros and/or partials, you should make create the majority of the content in the template itself like how the home page was made (index.html). 10 | You will still need create a markdown file for it in order to set up the front matter. You just don't need to write any markdown inside of it. 11 | 12 | ### Sections 13 | 14 | Sections have pages under its directory. See `content/blog/_index.md` for an example of them. A section's index page is named `_index.md`. 15 | 16 | ### Pages 17 | 18 | Pages can either have a unique name under a section's directory e.g `content/blog/vala-0.56.md` or be named `index.md`. If named `index.md`, they will have the same URL as the path they are under. The latter option is useful for creating one-off page like the about page (`content/about/index.md`). 19 | 20 | By default, all pages are under the root section which is the website's index page (`content/_index.md`). 21 | 22 | ### Using Components 23 | 24 | There are two types of components you can create: 25 | 26 | 1. Partials - Don't let you pass data in. 1 file = 1 partial. 27 | 2. Macros - Allow you to pass data in. Muliple macros can exist in one file. 28 | 29 | It's up to you how you to decide to use these types of components to build up these pages. Each type has its advantages and disadvantages. 30 | 31 | ### Metadata 32 | 33 | A macros in `head.html` called `og_data` and `og_data_with_image` take care of this for you. It handles the creates the Open Graph tags and adds the description meta tag for you. It's recommended that you assign the parameters to the page/sections's variables in templates you make. 34 | 35 | #### Front Matter 36 | 37 | In all pages make sure that you fill in contain the following fields: 38 | - `title` 39 | - `date` (In the format of YYYY-MM-DD) 40 | - `description` 41 | 42 | These are used when displaying the in link embeds. 43 | 44 | ## Blog 45 | 46 | ### Blog Front Matter 47 | 48 | As well as the [fields to include when creating pages in general](#front-matter), if the article is written from the context of a single person or group of people, you also should inlcude the `extra.authors` field with an array of strings (containg names). 49 | 50 | Filling the `extra.authors` field **is not** mandatory though. By default, the author will be set to "The Vala Team" 51 | 52 | These are used when displaying the posts across the site and also in link embeds. 53 | 54 | ### Blog Post Titles 55 | 56 | You don't need to create a `

` in your markdown content. The value you have set in the `title` field of the front matter will be used in a `

` that is part of the blog post template. 57 | 58 | ## Home Page 59 | 60 | ### Updating The Showcase Items 61 | 62 | The showcase is rendered from a partial in `templates/partials/showcase.html`. 63 | 64 | The actual data used to add each item to the showcase is in `assets/showcase-items.json`. 65 | 66 | It's an array where each item is an JSON object with the following fields: 67 | 68 | - `name` - Name of the item 69 | - `icon_path` - Where the icon is relative to the website's repository. 70 | - `url` - Where the user goes whe they click on the item 71 | 72 | Here's an example: 73 | 74 | ```json 75 | [ 76 | { 77 | "name": "elementary OS", 78 | "icon_path": "icons/showcase/elementary.svg", 79 | "url": "https://elementary.io/" 80 | }, 81 | { 82 | "name": "GNOME Boxes", 83 | "icon_path": "icons/showcase/gnome-boxes.svg", 84 | "url": "https://apps.gnome.org/en-GB/app/org.gnome.Boxes/" 85 | }, 86 | { 87 | "name": "Planner", 88 | "icon_path": "icons/showcase/planner.svg", 89 | "url": "https://useplanner.com/" 90 | }, 91 | { 92 | "name": "Starfish", 93 | "icon_path": "icons/showcase/starfish.svg", 94 | "url": "https://appcenter.elementary.io/hr.from.josipantolis.starfish/" 95 | }, 96 | { 97 | "name": "BirdFont", 98 | "icon_path": "icons/showcase/birdfont.svg", 99 | "url": "https://birdfont.org/" 100 | }, 101 | { 102 | "name": "Peek", 103 | "icon_path": "icons/showcase/peek.svg", 104 | "url": "https://github.com/phw/peek" 105 | } 106 | ] 107 | ``` 108 | 109 | --- 110 | 111 | ## Related Resouces 112 | 113 | - https://www.getzola.org/documentation/content/overview/ 114 | - https://www.getzola.org/documentation/templates/overview/ 115 | -------------------------------------------------------------------------------- /docs/4-styling.md: -------------------------------------------------------------------------------- 1 | # Styling 2 | 3 | Sass files are stored under the `sass/` directory with the`.scss` file extension. 4 | 5 | ## Coding Style 6 | 7 | - When writing Sass, try to use as little of Sass' features as possible. Avoiding these features keeps the codebase simple and makes it easier to maintain. 8 | 9 | ## Tips 10 | 11 | - If you feel like you're writing a lot of Sass in one file, it's a good hint that you should split the code up into multiple files 12 | - Rely on the [cascade](https://developer.mozilla.org/en-US/docs/Web/CSS/Cascade). It will help keep your rule names simple. 13 | - Add comments to rules/property changes that perform changes that can't be inferred from the properties being changed. 14 | - When you have multiple related files, move them under a new directory to keep things organised and tidy. 15 | -------------------------------------------------------------------------------- /docs/5-potential-issues.md: -------------------------------------------------------------------------------- 1 | # Potential Issues 2 | 3 | ## New site deployment doesn't work correctly after domain changes 4 | 5 | Check if the value of the `base_url` field in `config.toml` is set matches the new domain. 6 | -------------------------------------------------------------------------------- /docs/CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # Contributor Guide 2 | 3 | Please make sure that you are following the [GitHub Community Guidelines](https://docs.github.com/en/site-policy/github-terms/github-community-guidelines). 4 | 5 | The easiest ways to contribute are to: [create a new issue](https://github.com/vala-lang/vala-www/issues/new/choose) or participate in [discussions](https://github.com/vala-lang/vala-www/discussions). 6 | 7 | If you would like to contribute code, please try to do the following: 8 | 9 | 1. Fork the project 10 | 2. Create a new branch to solve a particular issue (or multiple issues if they are small or closely related). 11 | 3. When you are ready to submit the code, make a pull request to the `main` branch. 12 | 4. Try to [reference issues](https://docs.github.com/en/issues/tracking-your-work-with-issues/linking-a-pull-request-to-an-issue) so they can be automatically closed when the changes merged into the `main` branch. 13 | 5. Make your pull request a draft if you think that there's needs to be regular feedback on the code as it's being developed. 14 | 15 | Pushing to the `main` branch will also deploy the website. 16 | 17 | ## Table of Contents 18 | 19 | 1. [Overview](./1-overview.md) 20 | 2. [Structure](./2-structure.md) 21 | 3. [Pages](./3-pages.md) 22 | 4. [Styling](./4-styling.md) 23 | 5. [Potential Issues](./5-potential-issues.md) 24 | -------------------------------------------------------------------------------- /sass/css/_base.scss: -------------------------------------------------------------------------------- 1 | :root { 2 | --accent-color: #a56de2; 3 | --accent-color-light-2: #e4c6fa; 4 | --accent-color-light-1: #cd9ef7; 5 | --accent-color-dark-1: #7239b3; 6 | --accent-color-dark-2: #452981; 7 | --brim-background-color: #{var(--accent-color-dark-1)}; 8 | --brim-link-color: white; 9 | --brim-link-hover-color: #{var(--accent-color-light-2)}; 10 | --card-border-color: #d4d4d4; 11 | --secondary-cta-background: #fafafa; 12 | --label-text-color: #555761; 13 | --foreground-color: #1a1a1a; 14 | --background-color: white; 15 | --inline-code-background-color: #d4d4d4; 16 | --focus-outline-color: #{var(--accent-color)}; 17 | --code-block-copy-button-color: #1a1a1a; 18 | } 19 | 20 | html { 21 | scroll-behavior: smooth; 22 | } 23 | 24 | /* 25 | Keyboard focus styles with fallback for older browsers 26 | Source: https://css-tricks.com/focus-visible-and-backwards-compatibility/ 27 | */ 28 | 29 | :focus { 30 | outline: solid 2px var(--focus-outline-color); 31 | } 32 | 33 | :focus:not(:focus-visible) { 34 | outline: none; 35 | } 36 | 37 | :focus-visible { 38 | outline: solid 2px var(--focus-outline-color); 39 | } 40 | 41 | body { 42 | display: flex; 43 | flex-direction: column; 44 | background-color: var(--background-color); 45 | color: var(--foreground-color); 46 | font-family: 'Inter', Arial, Helvetica, sans-serif; 47 | height: 100%; 48 | min-height: calc(100vh + env(safe-area-inset-bottom)); 49 | line-height: 1.4; 50 | font-size: 16px; 51 | } 52 | 53 | @supports (font-variation-settings: normal) { 54 | body { 55 | font-family: 'Inter Variable', Arial, Helvetica, sans-serif; 56 | } 57 | } 58 | 59 | body > div { 60 | flex: 1 1 0%; 61 | } 62 | 63 | .container.error-404 { 64 | display: flex; 65 | align-items: center; 66 | justify-content: center; 67 | padding-top: 4rem; 68 | padding-bottom: 4rem; 69 | } 70 | 71 | main { 72 | display: flex; 73 | overflow-x: auto; 74 | text-align: center; 75 | flex-direction: column; 76 | } 77 | 78 | article, 79 | section { 80 | width: 100%; 81 | text-align: left; 82 | max-width: 43.75rem; 83 | } 84 | 85 | section { 86 | padding: 2rem 0; 87 | } 88 | 89 | section .prose { 90 | max-width: 700px; 91 | text-align: left; 92 | margin: 0 auto; 93 | } 94 | 95 | section:last-of-type { 96 | padding-bottom: 0; 97 | } 98 | 99 | section > section { 100 | max-width: 43.75rem; 101 | margin: 0 auto; 102 | text-align: left; 103 | padding: 0.25rem 0; 104 | } 105 | 106 | section > section:last-of-type { 107 | padding-bottom: 1rem; 108 | } 109 | 110 | section > a:last-child { 111 | margin-top: 2rem; 112 | display: inline-block; 113 | text-align: center; 114 | } 115 | 116 | section.standalone { 117 | padding-top: 0; 118 | padding-bottom: 0; 119 | } 120 | 121 | h1, 122 | h2, 123 | h3, 124 | h4, 125 | h5, 126 | h6 { 127 | color: var(--foreground-color); 128 | margin-top: 0.85em; 129 | margin-bottom: 1rem; 130 | } 131 | 132 | h1 .zola-anchor, 133 | h2 .zola-anchor, 134 | h3 .zola-anchor, 135 | h4 .zola-anchor, 136 | h5 .zola-anchor, 137 | h6 .zola-anchor { 138 | visibility: hidden; 139 | } 140 | 141 | h1:hover .zola-anchor, 142 | h1:focus .zola-anchor, 143 | h2:hover .zola-anchor, 144 | h2:focus .zola-anchor, 145 | h3:hover .zola-anchor, 146 | h3:focus .zola-anchor, 147 | h4:hover .zola-anchor, 148 | h4:focus .zola-anchor, 149 | h5:hover .zola-anchor, 150 | h5:focus .zola-anchor, 151 | h6:hover .zola-anchor, 152 | h6:focus .zola-anchor { 153 | visibility: visible; 154 | } 155 | 156 | h1 { 157 | font-size: 3rem; 158 | letter-spacing: -0.04rem; 159 | font-weight: $font-weight-semi-bold; 160 | font-variation-settings: 'wght' $font-weight-semi-bold; 161 | } 162 | 163 | h2 { 164 | font-size: 2rem; 165 | font-weight: $font-weight-semi-bold; 166 | letter-spacing: -0.05rem; 167 | font-variation-settings: 'wght' $font-weight-semi-bold; 168 | } 169 | 170 | h3 { 171 | font-size: 1.5rem; 172 | font-weight: $font-weight-medium; 173 | letter-spacing: -0.003125rem; 174 | } 175 | 176 | p { 177 | margin-top: 1rem; 178 | margin-bottom: 1rem; 179 | } 180 | 181 | ul { 182 | list-style-type: none; 183 | padding: 0; 184 | } 185 | 186 | a { 187 | transition: color 0.3s ease; 188 | color: var(--accent-color-dark-1); 189 | word-wrap: break-word; 190 | } 191 | 192 | a:hover, 193 | a:focus, 194 | a:active { 195 | color: var(--accent-color-dark-2); 196 | } 197 | 198 | .zola-anchor { 199 | margin-left: 0.5rem; 200 | } 201 | 202 | ul li a { 203 | display: inline-flex; 204 | align-items: center; 205 | } 206 | 207 | time { 208 | display: block; 209 | } 210 | 211 | .social-links { 212 | margin-bottom: 0; 213 | } 214 | 215 | .social-links li { 216 | margin-top: 0.5rem; 217 | } 218 | 219 | .social-links li:first-child { 220 | margin-top: 0; 221 | } 222 | 223 | ul li a svg { 224 | transition: fill 0.3s ease; 225 | width: 1.25rem; 226 | height: 1.25rem; 227 | margin-right: 0.5rem; 228 | fill: var(--accent-color-dark-1); 229 | } 230 | 231 | ul li a:hover svg, 232 | ul li a:focus svg { 233 | fill: var(--accent-color-dark-2); 234 | } 235 | 236 | article ul { 237 | list-style-type: disc; 238 | padding-left: 2rem; 239 | } 240 | 241 | article ul li { 242 | margin-top: 0.5rem; 243 | } 244 | 245 | article ul li:first-child { 246 | margin-top: 0; 247 | } 248 | 249 | article img, 250 | iframe, 251 | picture { 252 | width: 100%; 253 | height: auto; 254 | } 255 | 256 | iframe { 257 | min-height: 200px; 258 | } 259 | 260 | pre { 261 | padding: 1rem; 262 | border-radius: 4px; 263 | overflow: auto; 264 | text-align: left; 265 | border: 1px solid #d4d4d4; 266 | } 267 | 268 | // The line numbers already provide some kind of left/right padding 269 | pre[data-linenos] { 270 | // padding: 1rem ; 271 | padding-top: 1rem; 272 | padding-bottom: 1rem; 273 | padding-right: 1rem; 274 | padding-left: 0; 275 | } 276 | pre table td { 277 | padding: 0; 278 | } 279 | // The line number cells 280 | pre table td:nth-of-type(1) { 281 | text-align: center; 282 | user-select: none; 283 | padding-left: 2rem; 284 | padding-right: 1rem; 285 | text-align: left; 286 | } 287 | pre mark { 288 | // If you want your highlights to take the full width. 289 | display: block; 290 | // The default background colour of a mark is bright yellow 291 | background-color: rgba(254, 252, 232, 0.9); 292 | } 293 | pre table { 294 | width: 100%; 295 | border-collapse: collapse; 296 | } 297 | 298 | code { 299 | border-radius: 4px; 300 | background-color: var(--inline-code-background-color); 301 | padding: 0.125rem 0.25rem; 302 | } 303 | 304 | pre code { 305 | border-radius: 0; 306 | background: none; 307 | padding: 0; 308 | } 309 | 310 | .code-block-wrapper { 311 | position: relative; 312 | max-width: 45rem; 313 | } 314 | 315 | .code-copier { 316 | display: flex; 317 | border: 0; 318 | justify-content: center; 319 | align-items: center; 320 | position: absolute; 321 | padding: 1rem; 322 | bottom: 0; 323 | right: 0; 324 | width: auto; 325 | height: auto; 326 | background: transparent; 327 | } 328 | 329 | // On home page, button is slightly lower than usual 330 | main > .code-block-wrapper .code-copier { 331 | bottom: 1rem; 332 | } 333 | 334 | .code-copier svg { 335 | transition: opacity 0.3s ease; 336 | width: 1.5rem; 337 | height: 1.5rem; 338 | fill: var(--code-block-copy-button-color); 339 | opacity: 0.3; 340 | } 341 | 342 | .code-copier:hover svg { 343 | opacity: 1; 344 | } 345 | 346 | .code-copier:active svg { 347 | opacity: 0.3; 348 | } 349 | 350 | #bypass-block { 351 | --focus-outline-color: white; 352 | transition: none; 353 | position: absolute; 354 | word-wrap: normal; 355 | top: 0; 356 | left: -999px; 357 | width: 1px; 358 | height: 1px; 359 | text-align: center; 360 | font-size: 2rem; 361 | z-index: -2; 362 | background: var(--vala-gradient); 363 | color: black; // When off-screen, it contrasts with the body background 364 | padding: 1rem; 365 | } 366 | 367 | #bypass-block:focus, 368 | #bypass-block:focus-visible { 369 | opacity: 1; 370 | z-index: 999; 371 | display: block; 372 | width: 100%; 373 | height: auto; 374 | left: auto; 375 | background: var(--accent-color-dark-1); 376 | color: white; // To create contrast with the background 377 | } 378 | 379 | @media (prefers-color-scheme: dark) { 380 | :root { 381 | --foreground-color: white; 382 | --background-color: #1a1a1a; 383 | --card-border-color: #333333; 384 | --inline-code-background-color: #333333; 385 | --secondary-cta-background: #333333; 386 | --code-block-copy-button-color: #fafafa; 387 | --label-text-color: #d4d4d4; 388 | } 389 | 390 | #bypass-block { 391 | color: white; // When off-screen, it contrasts with the body background 392 | } 393 | 394 | a { 395 | color: var(--accent-color-light-1); 396 | } 397 | 398 | a:hover, 399 | a:focus, 400 | a:active { 401 | color: var(--accent-color); 402 | } 403 | 404 | ul li a svg { 405 | fill: var(--accent-color-light-1); 406 | } 407 | 408 | ul li a:hover svg, 409 | ul li a:focus svg { 410 | fill: var(--accent-color); 411 | } 412 | 413 | pre { 414 | border: 1px solid #333333; 415 | } 416 | } 417 | 418 | @media (prefers-reduced-motion: reduce) { 419 | html { 420 | scroll-behavior: auto; 421 | } 422 | } 423 | 424 | @media (min-width: 500px) { 425 | iframe { 426 | min-height: 300px; 427 | } 428 | } 429 | 430 | @media (min-width: 740px) { 431 | section > section:last-of-type { 432 | padding-bottom: 2rem; 433 | } 434 | } 435 | 436 | @media (min-width: 800px) { 437 | main { 438 | align-items: center; 439 | } 440 | } 441 | -------------------------------------------------------------------------------- /sass/css/_reset.scss: -------------------------------------------------------------------------------- 1 | /*! modern-normalize v1.1.0 | MIT License | https://github.com/sindresorhus/modern-normalize */ 2 | 3 | /* 4 | Document 5 | ======== 6 | */ 7 | 8 | /** 9 | Use a better box model (opinionated). 10 | */ 11 | 12 | *, 13 | ::before, 14 | ::after { 15 | box-sizing: border-box; 16 | } 17 | 18 | /** 19 | 1. Correct the line height in all browsers. 20 | 2. Prevent adjustments of font size after orientation changes in iOS. 21 | 3. Use a more readable tab size (opinionated). 22 | */ 23 | 24 | html { 25 | line-height: 1.15; /* 1 */ 26 | -webkit-text-size-adjust: 100%; /* 2 */ 27 | -moz-tab-size: 4; /* 3 */ 28 | tab-size: 4; /* 3 */ 29 | } 30 | 31 | /* 32 | Sections 33 | ======== 34 | */ 35 | 36 | /** 37 | 1. Remove the margin in all browsers. 38 | 2. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) 39 | */ 40 | 41 | body { 42 | margin: 0; /* 1 */ 43 | font-family: 44 | system-ui, 45 | -apple-system, /* Firefox supports this but not yet `system-ui` */ 46 | 'Segoe UI', 47 | Roboto, 48 | Helvetica, 49 | Arial, 50 | sans-serif, 51 | 'Apple Color Emoji', 52 | 'Segoe UI Emoji'; /* 2 */ 53 | } 54 | 55 | /* 56 | Grouping content 57 | ================ 58 | */ 59 | 60 | /** 61 | 1. Add the correct height in Firefox. 62 | 2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) 63 | */ 64 | 65 | hr { 66 | height: 0; /* 1 */ 67 | color: inherit; /* 2 */ 68 | } 69 | 70 | /* 71 | Text-level semantics 72 | ==================== 73 | */ 74 | 75 | /** 76 | Add the correct text decoration in Chrome, Edge, and Safari. 77 | */ 78 | 79 | abbr[title] { 80 | text-decoration: underline dotted; 81 | } 82 | 83 | /** 84 | Add the correct font weight in Edge and Safari. 85 | */ 86 | 87 | b, 88 | strong { 89 | font-weight: bolder; 90 | } 91 | 92 | /** 93 | 1. Improve consistency of default fonts in all browsers. (https://github.com/sindresorhus/modern-normalize/issues/3) 94 | 2. Correct the odd 'em' font sizing in all browsers. 95 | */ 96 | 97 | code, 98 | kbd, 99 | samp, 100 | pre { 101 | font-family: 102 | ui-monospace, 103 | SFMono-Regular, 104 | Consolas, 105 | 'Liberation Mono', 106 | Menlo, 107 | monospace; /* 1 */ 108 | font-size: 1em; /* 2 */ 109 | } 110 | 111 | /** 112 | Add the correct font size in all browsers. 113 | */ 114 | 115 | small { 116 | font-size: 80%; 117 | } 118 | 119 | /** 120 | Prevent 'sub' and 'sup' elements from affecting the line height in all browsers. 121 | */ 122 | 123 | sub, 124 | sup { 125 | font-size: 75%; 126 | line-height: 0; 127 | position: relative; 128 | vertical-align: baseline; 129 | } 130 | 131 | sub { 132 | bottom: -0.25em; 133 | } 134 | 135 | sup { 136 | top: -0.5em; 137 | } 138 | 139 | /* 140 | Tabular data 141 | ============ 142 | */ 143 | 144 | /** 145 | 1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) 146 | 2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) 147 | */ 148 | 149 | table { 150 | text-indent: 0; /* 1 */ 151 | border-color: inherit; /* 2 */ 152 | } 153 | 154 | /* 155 | Forms 156 | ===== 157 | */ 158 | 159 | /** 160 | 1. Change the font styles in all browsers. 161 | 2. Remove the margin in Firefox and Safari. 162 | */ 163 | 164 | button, 165 | input, 166 | optgroup, 167 | select, 168 | textarea { 169 | font-family: inherit; /* 1 */ 170 | font-size: 100%; /* 1 */ 171 | line-height: 1.15; /* 1 */ 172 | margin: 0; /* 2 */ 173 | } 174 | 175 | /** 176 | Remove the inheritance of text transform in Edge and Firefox. 177 | */ 178 | 179 | button, 180 | select { 181 | text-transform: none; 182 | } 183 | 184 | /** 185 | Correct the inability to style clickable types in iOS and Safari. 186 | */ 187 | 188 | button, 189 | [type='button'], 190 | [type='reset'], 191 | [type='submit'] { 192 | -webkit-appearance: button; 193 | } 194 | 195 | /** 196 | Remove the inner border and padding in Firefox. 197 | */ 198 | 199 | ::-moz-focus-inner { 200 | border-style: none; 201 | padding: 0; 202 | } 203 | 204 | /** 205 | Restore the focus styles unset by the previous rule. 206 | */ 207 | 208 | :-moz-focusring { 209 | outline: 1px dotted ButtonText; 210 | } 211 | 212 | /** 213 | Remove the additional ':invalid' styles in Firefox. 214 | See: https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737 215 | */ 216 | 217 | :-moz-ui-invalid { 218 | box-shadow: none; 219 | } 220 | 221 | /** 222 | Remove the padding so developers are not caught out when they zero out 'fieldset' elements in all browsers. 223 | */ 224 | 225 | legend { 226 | padding: 0; 227 | } 228 | 229 | /** 230 | Add the correct vertical alignment in Chrome and Firefox. 231 | */ 232 | 233 | progress { 234 | vertical-align: baseline; 235 | } 236 | 237 | /** 238 | Correct the cursor style of increment and decrement buttons in Safari. 239 | */ 240 | 241 | ::-webkit-inner-spin-button, 242 | ::-webkit-outer-spin-button { 243 | height: auto; 244 | } 245 | 246 | /** 247 | 1. Correct the odd appearance in Chrome and Safari. 248 | 2. Correct the outline style in Safari. 249 | */ 250 | 251 | [type='search'] { 252 | -webkit-appearance: textfield; /* 1 */ 253 | outline-offset: -2px; /* 2 */ 254 | } 255 | 256 | /** 257 | Remove the inner padding in Chrome and Safari on macOS. 258 | */ 259 | 260 | ::-webkit-search-decoration { 261 | -webkit-appearance: none; 262 | } 263 | 264 | /** 265 | 1. Correct the inability to style clickable types in iOS and Safari. 266 | 2. Change font properties to 'inherit' in Safari. 267 | */ 268 | 269 | ::-webkit-file-upload-button { 270 | -webkit-appearance: button; /* 1 */ 271 | font: inherit; /* 2 */ 272 | } 273 | 274 | /* 275 | Interactive 276 | =========== 277 | */ 278 | 279 | /* 280 | Add the correct display in Chrome and Safari. 281 | */ 282 | 283 | summary { 284 | display: list-item; 285 | } 286 | -------------------------------------------------------------------------------- /sass/css/_typography.scss: -------------------------------------------------------------------------------- 1 | /* 2 | * TODO: Reduce to only font-weights and files actually being used in the site. 3 | */ 4 | 5 | $font-weight-thin: 100; 6 | $font-weight-extra-light: 200; 7 | $font-weight-light: 300; 8 | $font-weight-regular: 400; 9 | $font-weight-medium: 500; 10 | $font-weight-semi-bold: 600; 11 | $font-weight-bold: 700; 12 | $font-weight-extra-bold: 800; 13 | $font-weight-black: 900; 14 | 15 | @font-face { 16 | font-family: 'Inter'; 17 | font-style: normal; 18 | font-weight: $font-weight-thin; 19 | font-display: swap; 20 | src: url("/fonts/Inter-Thin.woff2") format("woff2"), 21 | url("/fonts/Inter-Thin.woff") format("woff"); 22 | } 23 | 24 | @font-face { 25 | font-family: 'Inter'; 26 | font-style: normal; 27 | font-weight: $font-weight-extra-light; 28 | font-display: swap; 29 | src: url("/fonts/Inter-ExtraLight.woff2") format("woff2"), 30 | url("/fonts/Inter-ExtraLight.woff") format("woff"); 31 | } 32 | 33 | @font-face { 34 | font-family: 'Inter'; 35 | font-style: normal; 36 | font-weight: $font-weight-light; 37 | font-display: swap; 38 | src: url("/fonts/Inter-Light.woff2") format("woff2"), 39 | url("/fonts/Inter-Light.woff") format("woff"); 40 | } 41 | 42 | @font-face { 43 | font-family: 'Inter'; 44 | font-style: normal; 45 | font-weight: $font-weight-regular; 46 | font-display: swap; 47 | src: url("/fonts/Inter-Regular.woff2") format("woff2"), 48 | url("/fonts/Inter-Regular.woff") format("woff"); 49 | } 50 | 51 | @font-face { 52 | font-family: 'Inter'; 53 | font-style: normal; 54 | font-weight: $font-weight-medium; 55 | font-display: swap; 56 | src: url("/fonts/Inter-Medium.woff2") format("woff2"), 57 | url("/fonts/Inter-Medium.woff") format("woff"); 58 | } 59 | 60 | @font-face { 61 | font-family: 'Inter'; 62 | font-style: normal; 63 | font-weight: $font-weight-semi-bold; 64 | font-display: swap; 65 | src: url("/fonts/Inter-SemiBold.woff2") format("woff2"), 66 | url("/fonts/Inter-SemiBold.woff") format("woff"); 67 | } 68 | 69 | @font-face { 70 | font-family: 'Inter'; 71 | font-style: normal; 72 | font-weight: $font-weight-bold; 73 | font-display: swap; 74 | src: url("/fonts/Inter-Bold.woff2") format("woff2"), 75 | url("/fonts/Inter-Bold.woff") format("woff"); 76 | } 77 | 78 | @font-face { 79 | font-family: 'Inter'; 80 | font-style: normal; 81 | font-weight: $font-weight-extra-bold; 82 | font-display: swap; 83 | src: url("/fonts/Inter-ExtraBold.woff2") format("woff2"), 84 | url("/fonts/Inter-ExtraBold.woff") format("woff"); 85 | } 86 | 87 | @font-face { 88 | font-family: 'Inter'; 89 | font-style: normal; 90 | font-weight: $font-weight-black; 91 | font-display: swap; 92 | src: url("/fonts/Inter-Black.woff2") format("woff2"), 93 | url("/fonts/Inter-Black.woff") format("woff"); 94 | } 95 | 96 | @font-face { 97 | font-family: 'Inter Variable'; 98 | font-weight: $font-weight-thin $font-weight-black; 99 | font-display: swap; 100 | font-style: normal; 101 | font-named-instance: 'Regular'; 102 | src: url("/fonts/Inter-roman.var.woff2") format("woff2"); 103 | } 104 | -------------------------------------------------------------------------------- /sass/css/blog-post.scss: -------------------------------------------------------------------------------- 1 | article.blog-post > header { 2 | margin-bottom: 1.5rem; 3 | } 4 | 5 | article.blog-post > header h1 { 6 | margin-bottom: 0; 7 | } 8 | 9 | article.blog-post > header p { 10 | margin-top: 0; 11 | margin-bottom: 0.5rem; 12 | font-size: 1.25rem; 13 | } 14 | 15 | article.blog-post > header span { 16 | font-weight: 500; 17 | display: block; 18 | } 19 | -------------------------------------------------------------------------------- /sass/css/blog.scss: -------------------------------------------------------------------------------- 1 | .blog-posts li { 2 | margin-top: 2rem; 3 | } 4 | 5 | .blog-posts li:first-child { 6 | margin-top: 0; 7 | } 8 | 9 | .blog-posts h2 { 10 | margin-top: 0; 11 | margin-bottom: 0; 12 | } 13 | 14 | .blog-posts p { 15 | margin-top: 1rem; 16 | margin-bottom: 0; 17 | } 18 | 19 | .blog-posts .author { 20 | font-weight: 500; 21 | } 22 | -------------------------------------------------------------------------------- /sass/css/components/_cta.scss: -------------------------------------------------------------------------------- 1 | .cta-stack { 2 | display: flex; 3 | flex-direction: column; 4 | width: 100%; 5 | text-align: center; 6 | justify-content: center; 7 | padding: 2rem 0; 8 | } 9 | 10 | .cta-stack a { 11 | --focus-outline-color: black; 12 | transition: background 0.3s ease; 13 | display: inline-flex; 14 | align-items: center; 15 | justify-content: center; 16 | background: var(--accent-color-dark-1); 17 | font-weight: 500; 18 | font-size: 1.25rem; 19 | text-align: center; 20 | color: white; 21 | border-radius: 8px; 22 | padding: 1.5rem 1rem; 23 | text-decoration: none; 24 | margin-top: 1rem; 25 | flex: 1 1 0%; 26 | width: 100%; 27 | } 28 | 29 | .cta-stack a:hover, 30 | .cta-stack a:focus { 31 | background: #8b55c9; 32 | } 33 | 34 | .cta-stack a:first-child { 35 | margin-top: 0; 36 | } 37 | 38 | .cta-stack a:last-child { 39 | --focus-outline-color: var(--accent-color); 40 | background: var(--secondary-cta-background); 41 | color: var(--foreground-color); 42 | border: solid 2px var(--card-border-color); 43 | } 44 | 45 | .cta-stack a:last-child:hover, 46 | .cta-stack a:last-child:focus { 47 | background: #eeeeee; 48 | } 49 | 50 | @media (min-width: 800px) { 51 | .cta-stack { 52 | flex-direction: row; 53 | } 54 | 55 | .cta-stack a { 56 | margin-top: 0; 57 | margin-left: 1.5rem; 58 | flex: 0 1 auto; 59 | width: 100%; 60 | max-width: 20rem; 61 | } 62 | 63 | .cta-stack a:first-child { 64 | margin-left: 0; 65 | } 66 | } 67 | 68 | @media (prefers-color-scheme: dark) { 69 | .cta-stack a { 70 | --focus-outline-color: white; 71 | } 72 | 73 | .cta-stack a:last-child:hover, 74 | .cta-stack a:last-child:focus { 75 | background: #4d4d4d; 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /sass/css/components/_feature.scss: -------------------------------------------------------------------------------- 1 | .features { 2 | display: flex; 3 | flex-direction: column; 4 | align-items: center; 5 | max-width: 500px; 6 | margin-left: auto; 7 | margin-right: auto; 8 | } 9 | 10 | .features > div { 11 | border: 1px solid var(--card-border-color); 12 | border-radius: 0.75rem; 13 | padding: 1.5rem 1.25rem 2.5rem 1.25rem; 14 | text-align: left; 15 | width: 100%; 16 | } 17 | 18 | .features > :first-child { 19 | margin-top: 0; 20 | } 21 | 22 | .features > * { 23 | margin-top: 2rem; 24 | } 25 | 26 | /* 27 | Same styling as a

since a

element can't be used 28 | a inside
element: https://html.spec.whatwg.org/multipage/grouping-content.html#the-dt-element 29 | */ 30 | .features dt { 31 | @extend h3; 32 | margin-top: 0; 33 | } 34 | 35 | .features dt > div { 36 | display: flex; 37 | align-items: center; 38 | flex-direction: row; 39 | } 40 | 41 | .features dt svg { 42 | height: 1.5rem; 43 | width: 1.5rem; 44 | fill: var(--accent-color-dark-1); 45 | margin-right: 0.75rem; 46 | } 47 | 48 | .features dd { 49 | margin-left: 0; 50 | margin-top: 1rem; 51 | } 52 | 53 | @media (min-width: 1000px) { 54 | .features { 55 | flex-direction: row; 56 | justify-content: center; 57 | align-items: stretch; 58 | max-width: none; 59 | } 60 | 61 | .features > :first-child { 62 | margin-left: 0; 63 | } 64 | 65 | .features > div { 66 | width: 375px; 67 | } 68 | 69 | .features > * { 70 | margin-top: 0; 71 | margin-left: 1.5rem; 72 | max-width: 25rem; 73 | } 74 | } 75 | 76 | @media (prefers-color-scheme: dark) { 77 | .features dt svg { 78 | fill: var(--accent-color); 79 | } 80 | } 81 | -------------------------------------------------------------------------------- /sass/css/components/_footer.scss: -------------------------------------------------------------------------------- 1 | footer { 2 | --foreground-color: white; 3 | --focus-outline-color: white; 4 | position: sticky; 5 | color: var(--foreground-color); 6 | background: var(--brim-background-color); 7 | padding-top: 1.5rem; 8 | padding-bottom: 1rem; 9 | padding-left: 1rem; 10 | padding-right: 1rem; 11 | 12 | @supports (padding: env(safe-area-inset-left)) { 13 | padding-left: calc(1rem + env(safe-area-inset-left)); 14 | padding-right: calc(1rem + env(safe-area-inset-right)); 15 | padding-bottom: calc(1rem + env(safe-area-inset-bottom)); 16 | } 17 | 18 | // `unquote()` is used to force `max()` function to be parsed by 19 | // plain CSS only. Doesn't currently work without `unquote()` in Zola's version of Sass. 20 | // Source: https://sass-lang.com/documentation/values/calculations#min-and-max 21 | @supports (padding: max(0px)) { 22 | padding-left: unquote("max(1rem, env(safe-area-inset-left))"); 23 | padding-right: unquote("max(1rem, env(safe-area-inset-right))"); 24 | padding-bottom: unquote("max(1rem, env(safe-area-inset-bottom))"); 25 | } 26 | } 27 | 28 | footer > div { 29 | max-width: 43.75rem; 30 | } 31 | 32 | footer a { 33 | display: inline-block; 34 | color: var(--brim-link-color); 35 | } 36 | 37 | footer a:hover, 38 | footer a:focus { 39 | color: var(--brim-link-hover-color); 40 | } 41 | 42 | @media (min-width: 700px) { 43 | footer { 44 | padding-top: 2rem; 45 | padding-left: 2rem; 46 | padding-right: 2rem; 47 | padding-bottom: calc(1.5rem); 48 | 49 | @supports (padding: env(safe-area-inset-left)) { 50 | padding-left: calc(2rem + env(safe-area-inset-left)); 51 | padding-right: calc(2rem + env(safe-area-inset-right)); 52 | padding-bottom: calc(1.5rem + env(safe-area-inset-bottom)); 53 | } 54 | 55 | // `unquote()` is used to force `max()` function to be parsed by 56 | // plain CSS only. Doesn't currently work without `unquote()` in Zola's version of Sass. 57 | // Source: https://sass-lang.com/documentation/values/calculations#min-and-max 58 | @supports (padding: max(0)) { 59 | padding-left: unquote("max(2rem, env(safe-area-inset-left))"); 60 | padding-right: unquote("max(2rem, env(safe-area-inset-right))"); 61 | padding-bottom: unquote("max(1.5rem, env(safe-area-inset-bottom))"); 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /sass/css/components/_global.scss: -------------------------------------------------------------------------------- 1 | @import 'header-nav'; 2 | @import 'feature'; 3 | @import 'cta'; 4 | @import 'footer'; 5 | -------------------------------------------------------------------------------- /sass/css/components/_header-nav.scss: -------------------------------------------------------------------------------- 1 | body > header { 2 | --foreground-color: white; 3 | --focus-outline-color: white; 4 | width: 100%; 5 | background: var(--brim-background-color); 6 | display: block; 7 | color: var(--foreground-color); 8 | } 9 | 10 | body > header > div { 11 | @extend %container; 12 | padding-top: 1.5rem; 13 | padding-bottom: 1.5rem; 14 | } 15 | 16 | body > header nav { 17 | display: grid; 18 | align-items: center; 19 | grid-template-columns: 1fr auto auto; 20 | } 21 | 22 | /* Align better with Vala Logo */ 23 | body > header nav ul, 24 | body > header nav > :last-child { 25 | margin-left: 0.25rem; 26 | } 27 | 28 | body > header nav ul { 29 | grid-area: 2 / 1 / auto / -1; 30 | flex: 1 0 auto; 31 | display: flex; 32 | gap: 1rem; 33 | flex-wrap: wrap; 34 | text-align: center; 35 | justify-content: center; 36 | margin-block: 0; 37 | margin-left: 0.25rem; 38 | } 39 | 40 | body > header nav > :first-child svg { 41 | transition: fill 0.3s ease; 42 | fill: white; 43 | width: 4rem; 44 | height: 1.6rem; 45 | } 46 | 47 | body > header nav > :first-child a:hover svg, 48 | body > header nav > :first-child a:focus svg { 49 | fill: var(--accent-color-light-1); 50 | } 51 | 52 | body > header a { 53 | display: block; 54 | color: var(--brim-link-color); 55 | text-decoration: none; 56 | } 57 | 58 | body > header a:hover, 59 | body > header a:focus { 60 | color: var(--brim-link-hover-color); 61 | } 62 | 63 | body > header nav > :last-child { 64 | grid-row: 1; 65 | grid-column-end: -2; 66 | } 67 | 68 | .menu-toggle { 69 | display: none; 70 | grid-column-end: -1; 71 | padding: 0.3rem; 72 | aspect-ratio: 1; 73 | align-items: center; 74 | justify-content: center; 75 | background: none; 76 | border: none; 77 | // border-radius: 0.3rem; 78 | cursor: pointer; 79 | } 80 | 81 | .hamburger { 82 | --hamburger-color: var(--brim-link-color); 83 | display: block; 84 | position: relative; 85 | height: 0.125rem; 86 | width: 1.5rem; 87 | background-color: var(--hamburger-color); 88 | transition: all 0.2s ease; 89 | 90 | &::before, 91 | &::after { 92 | content: ''; 93 | position: absolute; 94 | inset: 0; 95 | background-color: var(--hamburger-color); 96 | transition: all 0.2s ease; 97 | } 98 | 99 | &::before { 100 | transform: translateY(-300%); 101 | } 102 | &::after { 103 | transform: translateY(300%); 104 | } 105 | 106 | &.open { 107 | background-color: transparent; 108 | &::before { 109 | transform: rotate(45deg); 110 | } 111 | &::after { 112 | transform: rotate(-45deg); 113 | } 114 | } 115 | } 116 | 117 | .menu-toggle:hover, 118 | .menu-toggle:focus { 119 | border-color: var(--brim-link-hover-color); 120 | } 121 | 122 | .menu-toggle:hover .hamburger, 123 | .menu-toggle:focus .hamburger { 124 | --hamburger-color: var(--brim-link-hover-color); 125 | } 126 | 127 | .navbar-button { 128 | display: inline-block; 129 | background-image: linear-gradient(180deg, #8c57c8 0%, #7c4bb5 100%); 130 | border-radius: 100vmax; 131 | box-shadow: 0 0.125em 0.3em #0003; 132 | padding: 0.3em 1.2em; 133 | } 134 | 135 | @media (max-width: 56.25rem) { 136 | body > header nav > :last-child { 137 | margin-inline: 1rem; 138 | } 139 | 140 | body:not(.js-enabled) > header nav ul { 141 | margin: 2rem 0 0 0; 142 | } 143 | 144 | body.js-enabled > header nav ul { 145 | display: block; 146 | text-align: left; 147 | margin-block: 0px; 148 | overflow-y: hidden; 149 | max-height: 0; 150 | transition: max-height 0.2s ease; 151 | 152 | li { 153 | margin-top: 1rem; 154 | } 155 | li:first-child { 156 | margin-top: 2rem; 157 | } 158 | } 159 | 160 | body.js-enabled > header nav ul:not(.open):focus, 161 | body.js-enabled > header nav ul:not(.open):focus-visible { 162 | outline: none; 163 | } 164 | 165 | body.js-enabled .menu-toggle { 166 | display: flex; 167 | } 168 | } 169 | 170 | @media (min-width: 56.25rem) { 171 | body > header { 172 | margin: auto 0; 173 | } 174 | 175 | body > header a { 176 | display: inline-block; 177 | } 178 | 179 | body > header > div { 180 | padding-top: 0.75rem; 181 | padding-bottom: 0.75rem; 182 | } 183 | 184 | body > header nav { 185 | display: flex; 186 | align-items: center; 187 | } 188 | 189 | body > header nav > :first-child, 190 | body > header nav > :last-child { 191 | flex: 0 1 20%; 192 | } 193 | 194 | body > header nav > :last-child { 195 | text-align: right; 196 | 197 | } 198 | 199 | body > header nav ul, 200 | body > header nav :last-child { 201 | margin-left: 0rem; 202 | } 203 | } 204 | -------------------------------------------------------------------------------- /sass/css/components/_post-preview.scss: -------------------------------------------------------------------------------- 1 | .post-previews { 2 | display: flex; 3 | text-align: left; 4 | flex-direction: column; 5 | margin: 0 auto; 6 | } 7 | 8 | .post-preview { 9 | width: 100%; 10 | border: 1px solid var(--card-border-color); 11 | border-radius: 0.75rem; 12 | margin-top: 2rem; 13 | text-decoration: none; 14 | color: var(--foreground-color); 15 | } 16 | 17 | .post-preview:hover, 18 | .post-preview:focus { 19 | color: var(--accent-color-dark-1); 20 | } 21 | 22 | .post-preview:first-child { 23 | margin-top: 0; 24 | } 25 | 26 | .post-preview img { 27 | width: 100%; 28 | border-radius: 0.75rem 0.75rem 0 0; 29 | } 30 | 31 | .post-preview > div { 32 | padding: 0.5rem 0.75rem 1rem 0.75rem; 33 | } 34 | 35 | .post-preview > div > div { 36 | font-weight: 500; 37 | font-size: 1.25rem; 38 | letter-spacing: -0.003125rem; 39 | } 40 | 41 | .post-preview date { 42 | display: block; 43 | margin-top: 0.5rem; 44 | color: var(--label-text-color); 45 | font-size: 1rem; 46 | } 47 | 48 | @media (min-width: 400px) { 49 | .post-previews { 50 | align-items: center; 51 | } 52 | .post-preview { 53 | max-width: 25rem; 54 | } 55 | } 56 | 57 | @media (min-width: 900px) { 58 | .post-previews { 59 | flex-direction: row; 60 | justify-content: center; 61 | align-items: stretch; 62 | } 63 | 64 | .post-preview { 65 | margin-top: 0; 66 | margin-left: 1.5rem; 67 | } 68 | } 69 | 70 | @media (prefers-color-scheme: dark) { 71 | .post-preview:hover, 72 | .post-preview:focus { 73 | color: var(--accent-color); 74 | } 75 | } 76 | -------------------------------------------------------------------------------- /sass/css/components/_showcase.scss: -------------------------------------------------------------------------------- 1 | .showcase { 2 | display: grid; 3 | grid-template-columns: 1f; 4 | max-width: 43.75rem; 5 | margin: 0 auto; 6 | row-gap: 2.5rem; 7 | } 8 | 9 | .showcase li { 10 | display: inline-flex; 11 | flex-direction: column; 12 | flex: 1 1 0%; 13 | } 14 | 15 | .showcase .image-frame { 16 | display: flex; 17 | justify-content: center; 18 | align-items: center; 19 | height: auto; 20 | background-color: #f2f2f2; 21 | border-radius: 4px; 22 | } 23 | 24 | .showcase .image-frame img { 25 | width: 100%; 26 | height: 100%; 27 | max-width: 100%; 28 | max-height: 25rem; 29 | border-radius: 4px; 30 | object-fit: contain; 31 | } 32 | .showcase li a, 33 | .showcase .title { 34 | transition: color 0.3s ease; 35 | } 36 | 37 | .showcase .title { 38 | font-weight: 500; 39 | font-variation-settings: 'wght' 500; 40 | font-size: 1.5rem; 41 | color: var(--foreground-color); 42 | } 43 | 44 | .showcase li a { 45 | display: block; 46 | flex: 1 1 0%; 47 | flex-direction: column; 48 | text-decoration: none; 49 | color: var(--label-text-color); 50 | font-size: 1rem; 51 | width: 100%; 52 | border-radius: 4px; 53 | } 54 | 55 | .showcase li a:hover, 56 | .showcase li a:focus, 57 | .showcase li a:hover .title, 58 | .showcase li a:focus .title { 59 | color: var(--accent-color-dark-1); 60 | } 61 | 62 | .showcase li a img { 63 | width: 5rem; 64 | height: 5rem; 65 | margin-right: 0; 66 | border-radius: 4px; 67 | flex: none; 68 | } 69 | 70 | .showcase .info { 71 | display: flex; 72 | margin-top: 2rem; 73 | } 74 | 75 | .showcase .text-info { 76 | display: flex; 77 | flex-direction: column; 78 | text-align: left; 79 | margin-left: 1rem; 80 | } 81 | 82 | .showcase .text-info p { 83 | margin-top: 0.5rem; 84 | margin-bottom: 0; 85 | } 86 | 87 | @media (prefers-color-scheme: dark) { 88 | .showcase li a:hover, 89 | .showcase li a:focus, 90 | .showcase li a:hover .title, 91 | .showcase li a:focus .title { 92 | color: var(--accent-color); 93 | } 94 | 95 | .showcase .image-frame { 96 | background-color: #2a2a2a; 97 | } 98 | } 99 | -------------------------------------------------------------------------------- /sass/css/global.scss: -------------------------------------------------------------------------------- 1 | @import 'typography'; 2 | @import 'reset'; 3 | @import 'base'; 4 | @import 'utils'; 5 | @import 'components/global'; 6 | -------------------------------------------------------------------------------- /sass/css/index.scss: -------------------------------------------------------------------------------- 1 | body > header.extended { 2 | clip-path: polygon(0 0, 100% 0, 100% calc(100% - 4vw), 0 100%); 3 | padding: 0 0 30vh 0; 4 | } 5 | 6 | body > header.extended h1 { 7 | text-align: center; 8 | margin-top: 5rem; 9 | display: block; 10 | } 11 | 12 | main { 13 | margin-top: -40vh; 14 | /* Gives enough space for code example's shadow to spread */ 15 | padding-top: 10vh; 16 | } 17 | 18 | main > pre, 19 | main > pre + p { 20 | max-width: 45rem; 21 | } 22 | 23 | main > pre { 24 | position: relative; 25 | } 26 | 27 | section { 28 | text-align: center; 29 | max-width: none; 30 | } 31 | 32 | h1 { 33 | font-weight: 300; 34 | font-variation-settings: 'wght' 300; 35 | } 36 | 37 | @media (min-width: 800px) { 38 | main > pre { 39 | border: 0; 40 | box-shadow: 0px 4px 20px 10px rgba(0, 0, 0, 0.12); 41 | } 42 | } 43 | 44 | @media (min-width: 800px) and (prefers-color-scheme: dark) { 45 | main > pre { 46 | box-shadow: 0px 4px 20px 10px rgba(0, 0, 0, 0.3); 47 | } 48 | } 49 | 50 | @import 'components/post-preview'; 51 | @import 'components/showcase'; 52 | -------------------------------------------------------------------------------- /sass/css/utils/_container.scss: -------------------------------------------------------------------------------- 1 | $container-max-width: 76.25rem; 2 | 3 | .container, %container { 4 | display: block; 5 | margin: 0 auto; 6 | padding-left: 1rem; 7 | padding-right: 1rem; 8 | 9 | @supports (padding: env(safe-area-inset-left)) { 10 | padding-left: calc(1rem + env(safe-area-inset-left)); 11 | padding-right: calc(1rem + env(safe-area-inset-right)); 12 | } 13 | 14 | // `unquote()` is used to force `max()` function to be parsed by 15 | // plain CSS only. Doesn't currently work without `unquote()` in Zola's version of Sass. 16 | // Source: https://sass-lang.com/documentation/values/calculations#min-and-max 17 | @supports (padding: max(0px)) { 18 | padding-left: unquote("max(1rem, env(safe-area-inset-left))"); 19 | padding-right: unquote("max(1rem, env(safe-area-inset-right))"); 20 | } 21 | 22 | max-width: $container-max-width; 23 | width: 100%; 24 | 25 | @media (min-width: 700px) { 26 | padding-left: 2rem; 27 | padding-right: 2rem; 28 | 29 | @supports (padding: env(safe-area-inset-left)) { 30 | padding-left: calc(2rem + env(safe-area-inset-left)); 31 | padding-right: calc(2rem + env(safe-area-inset-right)); 32 | } 33 | 34 | // `unquote()` is used to force `max()` function to be parsed by 35 | // plain CSS only. Doesn't currently work without `unquote()` in Zola's version of Sass. 36 | // Source: https://sass-lang.com/documentation/values/calculations#min-and-max 37 | @supports (padding: max(0)) { 38 | padding-left: unquote("max(2rem, env(safe-area-inset-left))"); 39 | padding-right: unquote("max(2rem, env(safe-area-inset-right))"); 40 | } 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /sass/css/utils/_index.scss: -------------------------------------------------------------------------------- 1 | @import 'container'; 2 | -------------------------------------------------------------------------------- /static/CNAME: -------------------------------------------------------------------------------- 1 | vala.dev 2 | -------------------------------------------------------------------------------- /static/android-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/android-icon-144x144.png -------------------------------------------------------------------------------- /static/android-icon-192x192.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/android-icon-192x192.png -------------------------------------------------------------------------------- /static/android-icon-36x36.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/android-icon-36x36.png -------------------------------------------------------------------------------- /static/android-icon-48x48.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/android-icon-48x48.png -------------------------------------------------------------------------------- /static/android-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/android-icon-72x72.png -------------------------------------------------------------------------------- /static/android-icon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/android-icon-96x96.png -------------------------------------------------------------------------------- /static/apple-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/apple-icon-114x114.png -------------------------------------------------------------------------------- /static/apple-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/apple-icon-120x120.png -------------------------------------------------------------------------------- /static/apple-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/apple-icon-144x144.png -------------------------------------------------------------------------------- /static/apple-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/apple-icon-152x152.png -------------------------------------------------------------------------------- /static/apple-icon-180x180.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/apple-icon-180x180.png -------------------------------------------------------------------------------- /static/apple-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/apple-icon-57x57.png -------------------------------------------------------------------------------- /static/apple-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/apple-icon-60x60.png -------------------------------------------------------------------------------- /static/apple-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/apple-icon-72x72.png -------------------------------------------------------------------------------- /static/apple-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/apple-icon-76x76.png -------------------------------------------------------------------------------- /static/apple-icon-precomposed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/apple-icon-precomposed.png -------------------------------------------------------------------------------- /static/apple-icon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/apple-icon.png -------------------------------------------------------------------------------- /static/browserconfig.xml: -------------------------------------------------------------------------------- 1 | 2 | #ffffff -------------------------------------------------------------------------------- /static/css/syntax-theme-dark.css: -------------------------------------------------------------------------------- 1 | /* 2 | * theme "OneHalfLight" generated by syntect 3 | */ 4 | 5 | .z-code { 6 | color: #dcdfe4; 7 | background-color: #282c34; 8 | } 9 | 10 | .z-comment { 11 | color: #5c6370; 12 | } 13 | .z-variable.z-parameter.z-function { 14 | color: #dcdfe4; 15 | } 16 | .z-keyword { 17 | color: #c678dd; 18 | } 19 | .z-variable { 20 | color: #e06c75; 21 | } 22 | .z-entity.z-name.z-function, .z-meta.z-require, .z-support.z-function.z-any-method { 23 | color: #61afef; 24 | } 25 | .z-support.z-class, .z-entity.z-name.z-class, .z-entity.z-name.z-type.z-class { 26 | color: #e5c07b; 27 | } 28 | .z-meta.z-class { 29 | color: #e5c07b; 30 | } 31 | .z-keyword.z-other.z-special-method { 32 | color: #61afef; 33 | } 34 | .z-storage { 35 | color: #c678dd; 36 | } 37 | .z-support.z-function { 38 | color: #61afef; 39 | } 40 | .z-string { 41 | color: #98c379; 42 | } 43 | .z-constant.z-numeric { 44 | color: #e5c07b; 45 | } 46 | .z-none { 47 | color: #e5c07b; 48 | } 49 | .z-none { 50 | color: #e5c07b; 51 | } 52 | .z-constant { 53 | color: #e5c07b; 54 | } 55 | .z-entity.z-name.z-tag { 56 | color: #e06c75; 57 | } 58 | .z-entity.z-other.z-attribute-name { 59 | color: #e5c07b; 60 | } 61 | .z-entity.z-other.z-attribute-name.z-id, .z-punctuation.z-definition.z-entity { 62 | color: #e5c07b; 63 | } 64 | .z-meta.z-selector { 65 | color: #c678dd; 66 | } 67 | .z-markup.z-heading .z-punctuation.z-definition.z-heading, .z-entity.z-name.z-section { 68 | color: #61afef; 69 | } 70 | .z-markup.z-bold, .z-punctuation.z-definition.z-bold { 71 | color: #c678dd; 72 | } 73 | .z-markup.z-italic, .z-punctuation.z-definition.z-italic { 74 | color: #c678dd; 75 | } 76 | .z-markup.z-raw.z-inline { 77 | color: #98c379; 78 | } 79 | .z-meta.z-link { 80 | color: #98c379; 81 | } 82 | .z-markup.z-quote { 83 | color: #98c379; 84 | } 85 | .z-source.z-java .z-meta.z-class.z-java .z-meta.z-method.z-java { 86 | color: #dcdfe4; 87 | } 88 | .z-source.z-java .z-meta.z-class.z-java .z-meta.z-class.z-body.z-java { 89 | color: #dcdfe4; 90 | } 91 | .z-source.z-js .z-meta.z-function.z-js .z-variable.z-parameter.z-function.z-js { 92 | color: #e06c75; 93 | } 94 | .z-source.z-js .z-variable.z-other.z-readwrite.z-js { 95 | color: #e06c75; 96 | } 97 | .z-source.z-js .z-variable.z-other.z-object.z-js { 98 | color: #dcdfe4; 99 | } 100 | .z-source.z-js .z-meta.z-function-call.z-method.z-js .z-variable.z-other.z-readwrite.z-js { 101 | color: #e06c75; 102 | } 103 | .z-source.z-js .z-meta.z-block.z-js .z-variable.z-other.z-readwrite.z-js { 104 | color: #e06c75; 105 | } 106 | .z-source.z-js .z-meta.z-block.z-js .z-variable.z-other.z-object.z-js { 107 | color: #dcdfe4; 108 | } 109 | .z-source.z-js .z-meta.z-block.z-js .z-meta.z-function-call.z-method.z-js .z-variable.z-other.z-readwrite.z-js { 110 | color: #dcdfe4; 111 | } 112 | .z-source.z-js .z-meta.z-function-call.z-method.z-js .z-variable.z-function.z-js { 113 | color: #dcdfe4; 114 | } 115 | .z-source.z-js .z-meta.z-property.z-object.z-js .z-entity.z-name.z-function.z-js { 116 | color: #61afef; 117 | } 118 | .z-source.z-js .z-support.z-constant.z-prototype.z-js { 119 | color: #dcdfe4; 120 | } 121 | .z-markup.z-inserted { 122 | color: #98c379; 123 | } 124 | .z-markup.z-deleted { 125 | color: #e06c75; 126 | } 127 | .z-markup.z-changed { 128 | color: #e5c07b; 129 | } 130 | .z-string.z-regexp { 131 | color: #98c379; 132 | } 133 | .z-constant.z-character.z-escape { 134 | color: #56b6c2; 135 | } 136 | .z-invalid.z-illegal { 137 | color: #dcdfe4; 138 | background-color: #e06c75; 139 | } 140 | .z-invalid.z-broken { 141 | color: #dcdfe4; 142 | background-color: #e5c07b; 143 | } 144 | .z-invalid.z-deprecated { 145 | color: #dcdfe4; 146 | background-color: #e5c07b; 147 | } 148 | .z-invalid.z-unimplemented { 149 | color: #dcdfe4; 150 | background-color: #c678dd; 151 | } 152 | -------------------------------------------------------------------------------- /static/css/syntax-theme-light.css: -------------------------------------------------------------------------------- 1 | /* 2 | * theme "OneHalfLight" generated by syntect 3 | */ 4 | 5 | .z-code { 6 | color: #383a42; 7 | background-color: #fafafa; 8 | } 9 | 10 | .z-comment { 11 | color: #a0a1a7; 12 | } 13 | .z-variable.z-parameter.z-function { 14 | color: #383a42; 15 | } 16 | .z-keyword { 17 | color: #a626a4; 18 | } 19 | .z-variable { 20 | color: #e45649; 21 | } 22 | .z-entity.z-name.z-function, .z-meta.z-require, .z-support.z-function.z-any-method { 23 | color: #0184bc; 24 | } 25 | .z-support.z-class, .z-entity.z-name.z-class, .z-entity.z-name.z-type.z-class { 26 | color: #c18401; 27 | } 28 | .z-meta.z-class { 29 | color: #c18401; 30 | } 31 | .z-keyword.z-other.z-special-method { 32 | color: #0184bc; 33 | } 34 | .z-storage { 35 | color: #a626a4; 36 | } 37 | .z-support.z-function { 38 | color: #0184bc; 39 | } 40 | .z-string { 41 | color: #50a14f; 42 | } 43 | .z-constant.z-numeric { 44 | color: #c18401; 45 | } 46 | .z-none { 47 | color: #c18401; 48 | } 49 | .z-none { 50 | color: #c18401; 51 | } 52 | .z-constant { 53 | color: #c18401; 54 | } 55 | .z-entity.z-name.z-tag { 56 | color: #e45649; 57 | } 58 | .z-entity.z-other.z-attribute-name { 59 | color: #c18401; 60 | } 61 | .z-entity.z-other.z-attribute-name.z-id, .z-punctuation.z-definition.z-entity { 62 | color: #c18401; 63 | } 64 | .z-meta.z-selector { 65 | color: #a626a4; 66 | } 67 | .z-markup.z-heading .z-punctuation.z-definition.z-heading, .z-entity.z-name.z-section { 68 | color: #0184bc; 69 | } 70 | .z-markup.z-bold, .z-punctuation.z-definition.z-bold { 71 | color: #a626a4; 72 | } 73 | .z-markup.z-italic, .z-punctuation.z-definition.z-italic { 74 | color: #a626a4; 75 | } 76 | .z-markup.z-raw.z-inline { 77 | color: #50a14f; 78 | } 79 | .z-meta.z-link { 80 | color: #50a14f; 81 | } 82 | .z-markup.z-quote { 83 | color: #50a14f; 84 | } 85 | .z-source.z-java .z-meta.z-class.z-java .z-meta.z-method.z-java { 86 | color: #383a42; 87 | } 88 | .z-source.z-java .z-meta.z-class.z-java .z-meta.z-class.z-body.z-java { 89 | color: #383a42; 90 | } 91 | .z-source.z-js .z-meta.z-function.z-js .z-variable.z-parameter.z-function.z-js { 92 | color: #e45649; 93 | } 94 | .z-source.z-js .z-variable.z-other.z-readwrite.z-js { 95 | color: #e45649; 96 | } 97 | .z-source.z-js .z-variable.z-other.z-object.z-js { 98 | color: #383a42; 99 | } 100 | .z-source.z-js .z-meta.z-function-call.z-method.z-js .z-variable.z-other.z-readwrite.z-js { 101 | color: #e45649; 102 | } 103 | .z-source.z-js .z-meta.z-block.z-js .z-variable.z-other.z-readwrite.z-js { 104 | color: #e45649; 105 | } 106 | .z-source.z-js .z-meta.z-block.z-js .z-variable.z-other.z-object.z-js { 107 | color: #383a42; 108 | } 109 | .z-source.z-js .z-meta.z-block.z-js .z-meta.z-function-call.z-method.z-js .z-variable.z-other.z-readwrite.z-js { 110 | color: #383a42; 111 | } 112 | .z-source.z-js .z-meta.z-function-call.z-method.z-js .z-variable.z-function.z-js { 113 | color: #383a42; 114 | } 115 | .z-source.z-js .z-meta.z-property.z-object.z-js .z-entity.z-name.z-function.z-js { 116 | color: #0184bc; 117 | } 118 | .z-source.z-js .z-support.z-constant.z-prototype.z-js { 119 | color: #383a42; 120 | } 121 | .z-markup.z-inserted { 122 | color: #98c379; 123 | } 124 | .z-markup.z-deleted { 125 | color: #e06c75; 126 | } 127 | .z-markup.z-changed { 128 | color: #e5c07b; 129 | } 130 | .z-string.z-regexp { 131 | color: #50a14f; 132 | } 133 | .z-constant.z-character.z-escape { 134 | color: #0997b3; 135 | } 136 | .z-invalid.z-illegal { 137 | color: #fafafa; 138 | background-color: #e06c75; 139 | } 140 | .z-invalid.z-broken { 141 | color: #fafafa; 142 | background-color: #e5c07b; 143 | } 144 | .z-invalid.z-deprecated { 145 | color: #fafafa; 146 | background-color: #e5c07b; 147 | } 148 | .z-invalid.z-unimplemented { 149 | color: #fafafa; 150 | background-color: #c678dd; 151 | } 152 | -------------------------------------------------------------------------------- /static/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/favicon-16x16.png -------------------------------------------------------------------------------- /static/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/favicon-32x32.png -------------------------------------------------------------------------------- /static/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/favicon-96x96.png -------------------------------------------------------------------------------- /static/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/favicon.ico -------------------------------------------------------------------------------- /static/fonts/Inter-Black.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-Black.woff -------------------------------------------------------------------------------- /static/fonts/Inter-Black.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-Black.woff2 -------------------------------------------------------------------------------- /static/fonts/Inter-Bold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-Bold.woff -------------------------------------------------------------------------------- /static/fonts/Inter-Bold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-Bold.woff2 -------------------------------------------------------------------------------- /static/fonts/Inter-ExtraBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-ExtraBold.woff -------------------------------------------------------------------------------- /static/fonts/Inter-ExtraBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-ExtraBold.woff2 -------------------------------------------------------------------------------- /static/fonts/Inter-ExtraLight.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-ExtraLight.woff -------------------------------------------------------------------------------- /static/fonts/Inter-ExtraLight.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-ExtraLight.woff2 -------------------------------------------------------------------------------- /static/fonts/Inter-Light.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-Light.woff -------------------------------------------------------------------------------- /static/fonts/Inter-Light.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-Light.woff2 -------------------------------------------------------------------------------- /static/fonts/Inter-Medium.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-Medium.woff -------------------------------------------------------------------------------- /static/fonts/Inter-Medium.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-Medium.woff2 -------------------------------------------------------------------------------- /static/fonts/Inter-Regular.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-Regular.woff -------------------------------------------------------------------------------- /static/fonts/Inter-Regular.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-Regular.woff2 -------------------------------------------------------------------------------- /static/fonts/Inter-SemiBold.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-SemiBold.woff -------------------------------------------------------------------------------- /static/fonts/Inter-SemiBold.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-SemiBold.woff2 -------------------------------------------------------------------------------- /static/fonts/Inter-Thin.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-Thin.woff -------------------------------------------------------------------------------- /static/fonts/Inter-Thin.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-Thin.woff2 -------------------------------------------------------------------------------- /static/fonts/Inter-roman.var.woff2: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/fonts/Inter-roman.var.woff2 -------------------------------------------------------------------------------- /static/humans.txt: -------------------------------------------------------------------------------- 1 | /* TEAM */ 2 | Project Lead: Colin Kiama 3 | Contact: colinkiama [at] gmail.com 4 | Twitter: @colinkiama 5 | GitHub: @colinkiama 6 | 7 | Designer: Radjeep Signha 8 | Contact: rajdeepsingha [at] icloud.com 9 | Mastodon: @Suzie97@mastodon.social 10 | 11 | /* THANKS */ 12 | FR Translator: Hydral, Jordan Nathan 13 | GitLab: https://gitlab.com/hydrasho 14 | 15 | CS Translator: Vojtěch Perník 16 | GitLab: https://gitlab.com/pervoj 17 | 18 | RU Translator: Neagiry, Ivan Repyakh 19 | Discord: KanaSenpai#2026 20 | Telegram: @neagiry 21 | 22 | PT_BR Translator: Cárlisson Galdino 23 | Github: @carlisson 24 | 25 | Code Contributor: Marko Sivrić (Marki) 26 | Contact: markosivric3 [at] gmail.com 27 | Github: @Marki2019 28 | Twitter: @marki2019 29 | From: Čapljina, Bosnia & Herzegovina 30 | 31 | /* SITE */ 32 | Last update: 2022/09/17 33 | Language: English / French / Russian / Czech 34 | Doctype: HTML5 35 | IDE: Sublime Text, Visual Studio Code, Vim, Figma 36 | -------------------------------------------------------------------------------- /static/icons/showcase/crown.svg: -------------------------------------------------------------------------------- 1 | 2 | image/svg+xml 18 | 27 | 28 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | -------------------------------------------------------------------------------- /static/icons/showcase/dino.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /static/icons/showcase/textsnatcher.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 17 | 38 | 42 | 43 | 45 | 48 | 52 | 56 | 57 | 63 | 66 | 70 | 74 | 75 | 78 | 82 | 86 | 87 | 90 | 94 | 98 | 99 | 108 | 118 | 128 | 138 | 147 | 155 | 160 | 166 | 171 | 176 | 182 | 183 | 191 | 196 | 202 | 207 | 212 | 218 | 219 | 227 | 232 | 238 | 243 | 248 | 254 | 255 | 263 | 268 | 274 | 279 | 284 | 290 | 291 | 299 | 303 | 304 | 305 | 309 | 318 | 327 | 334 | 343 | 347 | 351 | 357 | 361 | 365 | Textsn. 376 | 999-999-999-009 387 | 555-555-555-005 398 | No, 99, Some City,Some Country 414 | TextxxxxxxxSnatcherxxxused to xxxread text &numbers inximages xxxx using xxxxxtesseract xOCR programsupports mu-ltiple lan-guage :) 480 | 488 | 489 | 490 | -------------------------------------------------------------------------------- /static/icons/showcase/timeshift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/icons/showcase/timeshift.png -------------------------------------------------------------------------------- /static/icons/showcase/workbench.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | -------------------------------------------------------------------------------- /static/icons/spritemap.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | > 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | -------------------------------------------------------------------------------- /static/img/showcase/crown.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/img/showcase/crown.png -------------------------------------------------------------------------------- /static/img/showcase/dino.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/img/showcase/dino.png -------------------------------------------------------------------------------- /static/img/showcase/monitor.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/img/showcase/monitor.png -------------------------------------------------------------------------------- /static/img/showcase/textsnatcher.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/img/showcase/textsnatcher.png -------------------------------------------------------------------------------- /static/img/showcase/timeshift.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/img/showcase/timeshift.png -------------------------------------------------------------------------------- /static/img/showcase/tuba.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/img/showcase/tuba.png -------------------------------------------------------------------------------- /static/img/showcase/workbench.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/img/showcase/workbench.png -------------------------------------------------------------------------------- /static/img/vala-hero-wide.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/img/vala-hero-wide.png -------------------------------------------------------------------------------- /static/js/global.js: -------------------------------------------------------------------------------- 1 | // add class to tell CSS that JS is enabled 2 | document.body.classList.add('js-enabled'); 3 | 4 | // Nav bar logic 5 | const toggle = document.querySelector('.menu-toggle'); 6 | const hamburger = toggle.querySelector('.hamburger'); 7 | const menu = document.querySelector('body > header nav ul'); 8 | 9 | toggle.addEventListener('click', () => { 10 | menu.classList.toggle('open'); 11 | if (menu.classList.contains('open')) { 12 | menu.style.maxHeight = menu.scrollHeight + 'px'; 13 | hamburger.classList.add('open'); 14 | } else { 15 | menu.style.maxHeight = null; 16 | hamburger.classList.remove('open'); 17 | } 18 | }); 19 | 20 | let codeBlocks = document.body.querySelectorAll('pre[class^="language"]'); 21 | 22 | for (let i = 0; i < codeBlocks.length; i++) { 23 | let wrapperDiv = document.createElement('div') 24 | wrapperDiv.classList.add('code-block-wrapper'); 25 | 26 | let codeBlock = codeBlocks[i]; 27 | let codeBlockParent = codeBlock.parentElement; 28 | codeBlockParent.replaceChild(wrapperDiv, codeBlock); 29 | 30 | wrapperDiv.appendChild(codeBlock); 31 | 32 | let copyButton = createCopyButton(); 33 | wrapperDiv.insertAdjacentElement('beforeend', copyButton); 34 | 35 | copyButton.addEventListener('click', (e) => { 36 | let stringToCopy = ""; 37 | 38 | let codeLines = codeBlock.querySelectorAll('table tr td:nth-child(2)'); 39 | if (codeLines.length > 0) { 40 | for (let j = 0; j < codeLines.length; j++) { 41 | let codeLine = codeLines[j].textContent; 42 | stringToCopy += codeLine; 43 | } 44 | } else { 45 | // There are no line numbers. Just copy the text content from the 46 | // `` element. 47 | let codeElement = codeBlock.querySelector('code'); 48 | if (!codeElement) { 49 | return; 50 | } 51 | 52 | stringToCopy += codeElement.textContent; 53 | } 54 | 55 | copyTextToClipboard(stringToCopy); 56 | }); 57 | } 58 | 59 | function createCopyButton() { 60 | let useElement = document.createElement('USE'); 61 | useElement.setAttribute("href", "/icons/spritemap.svg#sprite-copy"); 62 | 63 | let svgElement = document.createElement('SVG'); 64 | svgElement.appendChild(useElement); 65 | 66 | let copyButton = document.createElement('button'); 67 | copyButton.classList.add('code-copier'); 68 | copyButton.setAttribute('aria-label', 'Copy'); 69 | copyButton.setAttribute('title', 'Copy'); 70 | copyButton.innerHTML = svgElement.outerHTML; 71 | 72 | return copyButton; 73 | } 74 | 75 | // Async + Fallback method of copying to the clipboard 76 | // Source: https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript/30810322#30810322 77 | function fallbackCopyTextToClipboard(text) { 78 | var textArea = document.createElement("textarea"); 79 | textArea.value = text; 80 | document.body.appendChild(textArea); 81 | textArea.focus(); 82 | textArea.select(); 83 | 84 | try { 85 | document.execCommand("copy"); 86 | } catch (err) { 87 | console.error("Fallback: Oops, unable to copy", err); 88 | } 89 | 90 | document.body.removeChild(textArea); 91 | } 92 | 93 | function copyTextToClipboard(text) { 94 | if (!navigator.clipboard) { 95 | fallbackCopyTextToClipboard(text); 96 | return; 97 | } 98 | 99 | navigator.clipboard.writeText(text).then( 100 | function() { 101 | }, 102 | function(err) { 103 | console.error("Async: Could not copy text: ", err); 104 | } 105 | ); 106 | } 107 | -------------------------------------------------------------------------------- /static/manifest.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Vala", 3 | "theme_color": "#7239b3", 4 | "icons": [ 5 | { 6 | "src": "\/android-icon-36x36.png", 7 | "sizes": "36x36", 8 | "type": "image\/png", 9 | "density": "0.75" 10 | }, 11 | { 12 | "src": "\/android-icon-48x48.png", 13 | "sizes": "48x48", 14 | "type": "image\/png", 15 | "density": "1.0" 16 | }, 17 | { 18 | "src": "\/android-icon-72x72.png", 19 | "sizes": "72x72", 20 | "type": "image\/png", 21 | "density": "1.5" 22 | }, 23 | { 24 | "src": "\/android-icon-96x96.png", 25 | "sizes": "96x96", 26 | "type": "image\/png", 27 | "density": "2.0" 28 | }, 29 | { 30 | "src": "\/android-icon-144x144.png", 31 | "sizes": "144x144", 32 | "type": "image\/png", 33 | "density": "3.0" 34 | }, 35 | { 36 | "src": "\/android-icon-192x192.png", 37 | "sizes": "192x192", 38 | "type": "image\/png", 39 | "density": "4.0" 40 | } 41 | ] 42 | } 43 | -------------------------------------------------------------------------------- /static/ms-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/ms-icon-144x144.png -------------------------------------------------------------------------------- /static/ms-icon-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/ms-icon-150x150.png -------------------------------------------------------------------------------- /static/ms-icon-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/ms-icon-310x310.png -------------------------------------------------------------------------------- /static/ms-icon-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/vala-lang/vala-www/ec9b2a809f78945eaf218fb77ae91f9d5489b494/static/ms-icon-70x70.png -------------------------------------------------------------------------------- /templates/404.html: -------------------------------------------------------------------------------- 1 | {% import "macros/head.html" as head_macros %} 2 | {% import "macros/body.html" as body_macros %} 3 | {% import "macros/icon.html" as icon_macros %} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | {# Link tags with the media attributes are loaded when needed (depends on the media query) #} 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | {{ trans(key="bypass_block", lang=lang) }} 37 | 38 | {{ body_macros::header() }} 39 | 40 |
41 |
42 |

{{ trans(key="page_not_found", lang=lang) }}

43 |

{{ trans(key="page_not_found_description", lang=lang) }}

44 | {{ trans(key="go_home", lang=lang) }} 45 |
46 |
47 | 48 | {% include "partials/footer.html" %} 49 | 50 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /templates/anchor-link.html: -------------------------------------------------------------------------------- 1 | # 2 | -------------------------------------------------------------------------------- /templates/base.html: -------------------------------------------------------------------------------- 1 | {% import "macros/head.html" as head_macros %} 2 | {% import "macros/body.html" as body_macros %} 3 | {% import "macros/icon.html" as icon_macros %} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | {# Link tags with the media attributes are loaded when needed (depends on the media query) #} 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | {% block rss %} 34 | 35 | {% endblock %} 36 | 37 | {% block head %} 38 | {% endblock head %} 39 | 40 | 41 | {{ trans(key="bypass_block", lang=lang) }} 42 | 43 | {% block top_level_header %} 44 | {{ body_macros::header() }} 45 | {% endblock %} 46 | 47 |
48 |
49 | {% block main_content %} {% endblock %} 50 |
51 |
52 | 53 | {% include "partials/footer.html" %} 54 | 55 | {% block body_end %} {% endblock %} 56 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /templates/blog-post.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% import "macros/blog.html" as blog_macros %} 3 | {% block head %} 4 | {{ page.title }} 5 | {{ head_macros::article_og_data(article=page) }} 6 | 7 | {% endblock head %} 8 | 9 | {% block main_content %} 10 |
11 |
12 |

{{ page.title }}

13 |

{{ page.description }}

14 | {{ blog_macros::get_authors(page=page) }} 15 | 16 | Blog 17 |
18 | {{ page.content|safe }} 19 |
20 | {% endblock %} 21 | -------------------------------------------------------------------------------- /templates/blog.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% import "macros/head.html" as head_macros %} 3 | {% import "macros/blog.html" as blog_macros %} 4 | {% block head %} 5 | {{ section.title }} 6 | {{ head_macros::og_data(title=section.title, description=section.description) }} 7 | 8 | {% endblock head %} 9 | 10 | {% block main_content %} 11 |
12 |

Blog

13 |
    14 |
  • 15 | {% for post in paginator.pages %} 16 |

    {{ post.title }}

    17 |

    {{ post.description }}

    18 | 19 | {{ blog_macros::get_authors(page=post) }} 20 | 21 | 22 | {% endfor %} 23 |
  • 24 |
25 |
26 | 27 | 35 | 36 | {% endblock %} 37 | -------------------------------------------------------------------------------- /templates/index.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | {% import "macros/blog.html" as blog_macros %} 3 | {% import "macros/head.html" as head_macros %} 4 | 5 | {% block head %} 6 | {{ section.title }} 7 | 8 | 9 | 10 | {% for lang_code, _ in config.languages %} 11 | {% if lang_code != config.default_language %} 12 | 13 | {% endif %} 14 | {% endfor %} 15 | 16 | {% if lang != config.default_language %} 17 | 18 | {% endif %} 19 | 20 | 21 | {{ head_macros::og_data(title=section.title, description=section.description) }} 22 | 23 | {% endblock %} 24 | 25 | {% block top_level_header %} 26 | {% set heading = "

" ~ trans(key="tagline", lang=lang) ~ "

"|trim %} 27 | {{ body_macros::header(type="extended", extended_content=heading) }} 28 | {% endblock %} 29 | 30 | {% block main_content %} 31 | {{ load_data(path="assets/code-sample.md") | markdown(inline=true)|safe }} 32 | 33 | {{ body_macros::cta_stack(primary_content=trans(key='get_started', lang=lang), primary_href=config.extra.tutorial_url, secondary_content=trans(key='view_source_code', lang=lang), secondary_href=config.extra.language_source_code_url) }} 34 | 35 |
36 | {% include "partials/features.html" %} 37 |
38 | 39 |
40 | {% include "partials/usages.html" %} 41 |
42 | 43 |
44 | {% include "partials/blog/latest_blog_posts.html" %} 45 |
46 | 47 |
48 | {% include "partials/versions.html" %} 49 |
50 | 51 |
52 | {% include "partials/showcase.html" %} 53 |
54 | 55 |
56 | {% include "partials/community.html" %} 57 |
58 | 59 | {{ body_macros::cta_stack(primary_content=trans(key='get_started', lang=lang), primary_href=config.extra.tutorial_url, secondary_content=trans(key='view_source_code', lang=lang), secondary_href=config.extra.language_source_code_url) }} 60 | 61 | {% endblock %} 62 | 63 | 64 | {% block body_end %} 65 | {% endblock %} 66 | -------------------------------------------------------------------------------- /templates/macros/blog.html: -------------------------------------------------------------------------------- 1 | {% macro get_authors(page) %} 2 | {% if page.extra.authors %} 3 | {% for author in page.extra.authors %} 4 | {{ author }}{%- if not loop.last -%}, {% endif -%} 5 | {% endfor %} 6 | {% else %} 7 | The Vala Team 8 | {% endif %} 9 | {% endmacro %} 10 | -------------------------------------------------------------------------------- /templates/macros/body.html: -------------------------------------------------------------------------------- 1 | {% import "macros/icon.html" as icon_macros %} 2 | 3 | {% macro header(type="standard", extended_content="") %} 4 | {% set classes = [] %} 5 | 6 | {% if type == "extended" %} 7 | {% set classes = classes|concat(with=type) %} 8 | {% endif %} 9 | 10 | 0 %} class="{{ classes|join(sep=' ') }}"{% endif %}> 11 |
12 | 33 | {%- if type == "extended" %} 34 | {{ extended_content|safe }} 35 | {% endif %} 36 |
37 | 38 | 39 | {% endmacro %} 40 | 41 | {% macro cta_stack(primary_content, primary_href, secondary_content, secondary_href) %} 42 |
43 | {{ primary_content }} 44 | 45 | {% if secondary_content and secondary_href %} 46 | {{ secondary_content }} 47 | {% endif %} 48 |
49 | {% endmacro %} 50 | 51 | {% macro lang_map(lang_code) %} 52 | {% if lang_code == 'en' %} 53 | English 54 | {% elif lang_code == 'cs' %} 55 | Čeština 56 | {% elif lang_code == 'fr' %} 57 | Français 58 | {% elif lang_code == 'pt_BR' %} 59 | Português Brasileiro 60 | {% elif lang_code == 'ru' %} 61 | Русский 62 | {% elif lang_code == 'zh_CN' %} 63 | 简体中文 64 | {% endif %} 65 | {% endmacro %} 66 | -------------------------------------------------------------------------------- /templates/macros/head.html: -------------------------------------------------------------------------------- 1 | {% import "macros/blog.html" as blog_macros %} 2 | 3 | {% macro og_data(title, description) %} 4 | {{ head_macros::og_data_with_image (title=title, description=description, image_url='') }} 5 | {% endmacro %} 6 | 7 | {% macro og_data_with_image(title, description, image_url) %} 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | {%- if image_url|trim == '' %} 18 | {% set image_url = get_url(path="img/vala-hero-wide.png") %} 19 | {% endif %} 20 | 21 | {% endmacro %} 22 | 23 | {% macro article_og_data(article) %} 24 | {{ head_macros::og_data(title=article.title, description=article.description)}} 25 | {% if article.date %} 26 | 27 | {% endif %} 28 | 29 | {% if article.updated %} 30 | 31 | {% endif %} 32 | 33 | {% set article_section_object = get_section(path=article.ancestors|last) %} 34 | {% set article_section = article_section_object.title %} 35 | 36 | {% endmacro %} 37 | 38 | {% macro article_og_data_width_image(article, image_url='') %} 39 | {{ head_macros::og_data_with_image(title=article.title, description=article.description, image_url=image_url)}} 40 | {% if article.date %} 41 | 42 | {% endif %} 43 | 44 | {% if article.updated %} 45 | 46 | {% endif %} 47 | 48 | {% set article_section_object = get_section(path=article.ancestors|last) %} 49 | {% set article_section = article_section_object.title %} 50 | 51 | {% endmacro %} 52 | -------------------------------------------------------------------------------- /templates/macros/icon.html: -------------------------------------------------------------------------------- 1 | {% macro vala_text() %} 2 | 3 | {{ trans(key="home", lang=lang) }} 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | {% endmacro %} 14 | 15 | {% macro sprite_icon(name, label="", aria_hidden=true) %} 16 | 17 | 18 | {% set spritemap_path = "icons/spritemap.svg#sprite-" ~ name ~ "" %} 19 | 20 | 21 | 22 | {% endmacro %} 23 | -------------------------------------------------------------------------------- /templates/page.html: -------------------------------------------------------------------------------- 1 | {% extends "base.html" %} 2 | 3 | {% block head %} 4 | {{ page.title }} 5 | 6 | 7 | 8 | {% for lang_code, _ in config.languages %} 9 | {% if lang_code != config.default_language %} 10 | 11 | {% endif %} 12 | {% endfor %} 13 | 14 | {% if lang != config.default_language %} 15 | 16 | {% endif %} 17 | 18 | 19 | {{ head_macros::article_og_data(article=page) }} 20 | {% endblock head %} 21 | 22 | {% block main_content %} 23 |
24 | {{ page.content|safe }} 25 |
26 | {% endblock %} 27 | -------------------------------------------------------------------------------- /templates/partials/blog/latest_blog_posts.html: -------------------------------------------------------------------------------- 1 | {# Shows previews of the latest 3 posts in the blog #} 2 | {% set blog_section = get_section(path="blog/_index.md") %} 3 | {% set small_image = resize_image(path="vala-hero.png", width=426, height=240 ) %} 4 | 5 |

{{ trans(key='whats_new', lang=lang) }}

6 |
7 | {% for post in blog_section.pages %} 8 | {% if loop.index0 == 3 %} 9 | {% break %} 10 | {% endif %} 11 | 12 | 13 | {{ trans(key='default_image_description', lang=lang) }} 14 |
15 |
{{ post.title }}
16 | {{ blog_macros::get_authors(page=post) }} 17 | 18 |
19 |
20 | {% endfor %} 21 |
22 | {{ trans(key='view_blog', lang=lang) }} 23 | -------------------------------------------------------------------------------- /templates/partials/community.html: -------------------------------------------------------------------------------- 1 | {% import "macros/icon.html" as icon_macros %} 2 | 3 |

{{ trans(key='community', lang=lang) }}

4 |
5 |
6 |
7 |
8 | {{ icon_macros::sprite_icon(name="discourse") }} 9 | {{ trans(key='forums', lang=lang) }} 10 |
11 |
12 |
{{ trans(key='forums_description', lang=lang) }}
13 |
{{ trans(key='discourse_forums', lang=lang) }}
14 |
15 |
16 |
17 |
18 | {{ icon_macros::sprite_icon(name="matrix") }} 19 | {{ trans(key='internals_chat', lang=lang) }} 20 |
21 |
22 |
{{ trans(key='internals_chat_description', lang=lang) }}
23 |
{{ trans(key='matrix_room', lang=lang) }}
24 |
25 |
26 |
27 |
28 | {{ icon_macros::sprite_icon(name="discord") }} 29 | {{ trans(key='community_server', lang=lang) }} 30 |
31 |
32 |
{{ trans(key='community_server_description', lang=lang) }}
33 |
{{ trans(key='discord_server', lang=lang) }}
34 |
35 |
36 | 37 |

{{ trans(key='social_media', lang=lang) }}

38 | 47 | -------------------------------------------------------------------------------- /templates/partials/features.html: -------------------------------------------------------------------------------- 1 |

{{ trans(key='why_vala', lang=lang) }}

2 |
3 |
4 |
5 |
6 | {{ icon_macros::sprite_icon(name="gears") }} 7 | {{ trans(key="productivity", lang=lang) }} 8 |
9 |
10 |
{{ trans(key="productivity_description", lang=lang)|safe }}
11 |
12 |
13 |
14 |
15 | {{ icon_macros::sprite_icon(name="rocket") }} 16 | {{ trans(key="performance", lang=lang) }} 17 |
18 |
19 |
{{ trans(key="performance_description", lang=lang) }}
20 |
21 |
22 |
23 |
24 | {{ icon_macros::sprite_icon(name="open-source") }} 25 | {{ trans(key="open_source", lang=lang) }} 26 |
27 |
28 |
{{ trans(key="open_source_description", lang=lang) }}
29 |
{{ trans(key="tooling_documentation", lang=lang) }}
30 |
31 |
32 | {{ trans(key="learn_more_about_vala", lang=lang) }} 33 | -------------------------------------------------------------------------------- /templates/partials/footer.html: -------------------------------------------------------------------------------- 1 | {% import "macros/body.html" as body_macros %} 2 | 3 | 16 | 17 | -------------------------------------------------------------------------------- /templates/partials/showcase.html: -------------------------------------------------------------------------------- 1 | {% set showcase_data = load_data(path="/assets/showcase-items.json", type="json") %} 2 | 3 |

{{ trans(key='showcase', lang=lang) }}

4 | 31 | {{ trans(key='view_more_vala_projects', lang=lang) }} 32 | -------------------------------------------------------------------------------- /templates/partials/usages.html: -------------------------------------------------------------------------------- 1 |

{{ trans(key='what_can_you_build', lang=lang) }}

2 |
3 |
4 |
5 |
6 | {{ icon_macros::sprite_icon(name="gui-app") }} 7 | {{ trans(key="gui_applications", lang=lang) }} 8 |
9 |
10 |
{{ trans(key="gui_applications_description", lang=lang) }}
11 |
12 | 20 |
21 |
22 |
23 |
24 |
25 | {{ icon_macros::sprite_icon(name="terminal") }} 26 | {{ trans(key="command_line_programs", lang=lang) }} 27 | 28 |
29 |
30 |
{{ trans(key="command_line_programs_description", lang=lang) }}
31 |
32 |
33 |
34 |
35 | {{ icon_macros::sprite_icon(name="library") }} 36 | {{ trans(key="libraries", lang=lang) }} 37 |
38 |
39 |
{{ trans(key="libraries_description", lang=lang) }}
40 |
41 |
42 | -------------------------------------------------------------------------------- /templates/partials/versions.html: -------------------------------------------------------------------------------- 1 |

{{ trans(key='current_versions', lang=lang) }}

2 | 15 | {{ trans(key='install_how', lang=lang) }} 16 | -------------------------------------------------------------------------------- /templates/shortcodes/predefined_cta_stack.html: -------------------------------------------------------------------------------- 1 | {% import "macros/body.html" as body_macros %} 2 | 3 | {{ body_macros::cta_stack(primary_content=trans(key="get_started", lang=lang), primary_href=config.extra.tutorial_url, secondary_content=trans(key="view_source_code", lang=lang), secondary_href=config.extra.language_source_code_url) }} 4 | --------------------------------------------------------------------------------