diff --git a/.devcontainer/Dockerfile b/.devcontainer/Dockerfile index b8ea001f..71bd7c8f 100644 --- a/.devcontainer/Dockerfile +++ b/.devcontainer/Dockerfile @@ -21,17 +21,6 @@ RUN curl https://mise.run | sh RUN apt-get update -# Install rvm (https://rvm.io/rvm/install#install-gpg-keys) -RUN gpg --keyserver keyserver.ubuntu.com --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB -RUN curl -sSL https://get.rvm.io | bash -s stable -RUN echo 'source /usr/local/rvm/scripts/rvm' >> /etc/bash.bashrc - -# Install Ruby, Bundler, and dependencies -COPY .ruby-version .ruby-version -COPY Gemfile Gemfile -COPY Gemfile.lock Gemfile.lock -RUN /bin/bash -l -c 'rvm install $(cat .ruby-version | tr -d "\n") && gem install bundler && bundle install' - # Install Python dependencies COPY .devcontainer/requirements.txt .devcontainer/requirements.txt RUN python -m pip install --upgrade pip diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 9930eed2..f36d0833 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,29 +1,30 @@ -{ - "name": "compiler.la", - "dockerComposeFile": "docker-compose.yaml", - "service": "site", - "workspaceFolder": "/home/compiler/site", - "remoteEnv": { - "MISE_TRUSTED_CONFIG_PATHS": "${containerEnv:PATH}:/home/compiler/site" - }, - "postAttachCommand": ["/bin/bash", ".devcontainer/postAttach.sh"], - "customizations": { - "vscode": { - "settings": { - "terminal.integrated.defaultProfile.linux": "bash", - "terminal.integrated.profiles.linux": { - "bash": { - "path": "/bin/bash" - } - } - }, - "extensions": [ - "eamodio.gitlens", - "esbenp.prettier-vscode", - "mhutchie.git-graph", - "redhat.vscode-xml", - "Shopify.theme-check-vscode" - ] - } - } -} +{ + "name": "compiler.la", + "dockerComposeFile": "docker-compose.yaml", + "service": "site", + "workspaceFolder": "/home/compiler/site", + "remoteEnv": { + "MISE_TRUSTED_CONFIG_PATHS": "${containerEnv:PATH}:/home/compiler/site" + }, + "postAttachCommand": ["/bin/bash", ".devcontainer/postAttach.sh"], + "customizations": { + "vscode": { + "settings": { + "terminal.integrated.defaultProfile.linux": "bash", + "terminal.integrated.profiles.linux": { + "bash": { + "path": "/bin/bash" + } + } + }, + "extensions": [ + "eamodio.gitlens", + "esbenp.prettier-vscode", + "mhutchie.git-graph", + "redhat.vscode-xml", + "Shopify.theme-check-vscode", + "tombi-toml.tombi" + ] + } + } +} diff --git a/.github/dependabot.yml b/.github/dependabot.yml index c2e9e819..26aa4070 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -5,8 +5,8 @@ version: 2 updates: - - package-ecosystem: "bundler" # See documentation for possible values - directory: "/" # Location of Gemfile + - package-ecosystem: "npm" # See documentation for possible values + directory: "/" # Location of package.json schedule: interval: "daily" commit-message: diff --git a/.gitignore b/.gitignore index fb5808e0..29b24cad 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,4 @@ _site .DS_Store -.jekyll-cache -.jekyll-metadata -.sass-cache node_modules vendor diff --git a/.node-version b/.node-version new file mode 100644 index 00000000..b832e400 --- /dev/null +++ b/.node-version @@ -0,0 +1 @@ +24.16.0 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 003b2487..6ad3caff 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -24,11 +24,11 @@ repos: args: ["--unsafe"] - id: check-added-large-files - # # TODO: we'll enable this after an initial autoformatting run is complete - # - repo: https://github.com/JoC0de/pre-commit-prettier - # rev: v3.8.1 - # hooks: - # - id: prettier - # types_or: [css, html, liquid, markdown, yaml] - # # it would be ideal to run this on 'pre-commit' too. we just havent figured out how to do it yet - # stages: [commit-msg] + - repo: https://github.com/JoC0de/pre-commit-prettier + rev: v3.8.3 + hooks: + - id: prettier + additional_dependencies: + - prettier@3.8.3 + - "@shopify/prettier-plugin-liquid@1.10.3" + types_or: [css, html, javascript, json, liquid, markdown, yaml] diff --git a/.prettierrc b/.prettierrc deleted file mode 100644 index 6360b5d4..00000000 --- a/.prettierrc +++ /dev/null @@ -1,6 +0,0 @@ -{ - "tabWidth": 2, - "useTabs": false, - "printWidth": 130, - "plugins": ["@shopify/prettier-plugin-liquid"] -} diff --git a/.prettierrc.js b/.prettierrc.js new file mode 100644 index 00000000..8e57a62c --- /dev/null +++ b/.prettierrc.js @@ -0,0 +1,14 @@ +// if the plugin was ESM compatible, we could use await import('@shopify/prettier-plugin-liquid') instead of shimming in require +// https://stackoverflow.com/questions/69099763/referenceerror-require-is-not-defined-in-es-module-scope-you-can-use-import-in +import { createRequire } from "module"; +const require = createRequire(import.meta.url); + +// Allow Prettier in .pre-commit-config.yaml to find plugins. +// https://stackoverflow.com/questions/78708497/prettier-plugins-not-found-with-pre-commit +// https://github.com/prettier/prettier/issues/15085 +const config = { + plugins: [require.resolve("@shopify/prettier-plugin-liquid")], + printWidth: 130, +}; + +export default config; diff --git a/.ruby-version b/.ruby-version deleted file mode 100644 index 4f5e6973..00000000 --- a/.ruby-version +++ /dev/null @@ -1 +0,0 @@ -3.4.5 diff --git a/.vscode/settings.json b/.vscode/settings.json index ff3e5fc5..71d0a8ba 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -6,5 +6,33 @@ "files.insertFinalNewline": true, "files.trimFinalNewlines": true, "files.trimTrailingWhitespace": true, - "editor.tabSize": 2 + "editor.tabSize": 2, + // The below language-specific overrides must be listed separately in order to + // guarantee that they will win out over other places they might be set. + // See: https://github.com/prettier/prettier-vscode#default-formatter + // and: https://code.visualstudio.com/docs/configure/settings#_note-about-multiple-language-specific-settings + "[css]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[html]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[javascript]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[json]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[jsonc]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[liquid]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[markdown]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + }, + "[yaml]": { + "editor.defaultFormatter": "esbenp.prettier-vscode" + } } diff --git a/.vscode/tasks.json b/.vscode/tasks.json index 5ffb0122..7dd95426 100644 --- a/.vscode/tasks.json +++ b/.vscode/tasks.json @@ -1,47 +1,41 @@ { - // See https://go.microsoft.com/fwlink/?LinkId=733558 - // for the documentation about the tasks.json format - "version": "2.0.0", - "tasks": [ - { - "label": "Jekyll: Build Dev", - "detail": "jekyll serve --force_polling --livereload", - "type": "shell", - "linux": { - "command": "bundle exec jekyll serve --force_polling --livereload" - }, - "group": { - "kind": "build", - "isDefault": true - }, - "presentation": { - "echo": true, - "reveal": "always", - "focus": false, - "panel": "shared", - "showReuseMessage": true, - "clear": false - } - }, - { - "label": "Jekyll: Build Dev with Drafts", - "detail": "jekyll serve --force_polling --livereload --drafts", - "type": "shell", - "linux": { - "command": "bundle exec jekyll serve --force_polling --livereload --drafts" - }, - "group": { - "kind": "build", - "isDefault": true - }, - "presentation": { - "echo": true, - "reveal": "always", - "focus": false, - "panel": "shared", - "showReuseMessage": true, - "clear": false - } - } - ] + // See https://go.microsoft.com/fwlink/?LinkId=733558 + // for the documentation about the tasks.json format + "version": "2.0.0", + "tasks": [ + { + "label": "11ty: Serve", + "type": "shell", + "command": ["npm", "start"], + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared", + "showReuseMessage": true, + "clear": false + } + }, + { + "label": "11ty: Build", + "type": "shell", + "command": ["npm", "run", "build"], + "group": { + "kind": "build", + "isDefault": true + }, + "presentation": { + "echo": true, + "reveal": "always", + "focus": false, + "panel": "shared", + "showReuseMessage": true, + "clear": false + } + } + ] } diff --git a/Gemfile b/Gemfile deleted file mode 100644 index 8a5c2723..00000000 --- a/Gemfile +++ /dev/null @@ -1,6 +0,0 @@ -source "https://rubygems.org" - -gem "bigdecimal", "~> 3.2.2" -gem "jekyll", "~> 4.4.1" -gem "jekyll-feed" -gem "jekyll-sass-converter", "2.2.0" diff --git a/Gemfile.lock b/Gemfile.lock deleted file mode 100644 index 31f82619..00000000 --- a/Gemfile.lock +++ /dev/null @@ -1,83 +0,0 @@ -GEM - remote: https://rubygems.org/ - specs: - addressable (2.8.7) - public_suffix (>= 2.0.2, < 7.0) - base64 (0.2.0) - bigdecimal (3.2.2) - colorator (1.1.0) - concurrent-ruby (1.3.5) - csv (3.3.2) - em-websocket (0.5.3) - eventmachine (>= 0.12.9) - http_parser.rb (~> 0) - eventmachine (1.2.7) - ffi (1.17.1) - forwardable-extended (2.6.0) - http_parser.rb (0.8.0) - i18n (1.14.7) - concurrent-ruby (~> 1.0) - jekyll (4.4.1) - addressable (~> 2.4) - base64 (~> 0.2) - colorator (~> 1.0) - csv (~> 3.0) - em-websocket (~> 0.5) - i18n (~> 1.0) - jekyll-sass-converter (>= 2.0, < 4.0) - jekyll-watch (~> 2.0) - json (~> 2.6) - kramdown (~> 2.3, >= 2.3.1) - kramdown-parser-gfm (~> 1.0) - liquid (~> 4.0) - mercenary (~> 0.3, >= 0.3.6) - pathutil (~> 0.9) - rouge (>= 3.0, < 5.0) - safe_yaml (~> 1.0) - terminal-table (>= 1.8, < 4.0) - webrick (~> 1.7) - jekyll-feed (0.17.0) - jekyll (>= 3.7, < 5.0) - jekyll-sass-converter (2.2.0) - sassc (> 2.0.1, < 3.0) - jekyll-watch (2.2.1) - listen (~> 3.0) - json (2.9.1) - kramdown (2.5.1) - rexml (>= 3.3.9) - kramdown-parser-gfm (1.1.0) - kramdown (~> 2.0) - liquid (4.0.4) - listen (3.9.0) - rb-fsevent (~> 0.10, >= 0.10.3) - rb-inotify (~> 0.9, >= 0.9.10) - mercenary (0.4.0) - pathutil (0.16.2) - forwardable-extended (~> 2.6) - public_suffix (6.0.1) - rb-fsevent (0.11.2) - rb-inotify (0.11.1) - ffi (~> 1.0) - rexml (3.4.0) - rouge (4.5.1) - safe_yaml (1.0.5) - sassc (2.4.0) - ffi (~> 1.9) - terminal-table (3.0.2) - unicode-display_width (>= 1.1.1, < 3) - unicode-display_width (2.6.0) - webrick (1.9.1) - -PLATFORMS - aarch64-linux - x86_64-linux - x86_64-linux-musl - -DEPENDENCIES - bigdecimal (~> 3.2.2) - jekyll (~> 4.4.1) - jekyll-feed - jekyll-sass-converter (= 2.2.0) - -BUNDLED WITH - 2.4.13 diff --git a/README.md b/README.md index 2f8d03d7..1771dcb9 100644 --- a/README.md +++ b/README.md @@ -9,34 +9,33 @@ Deployed via [Netlify](https://www.netlify.com) We have a Figma file with the current designs, broken into the following sections/pages: -| Section | Description | -| ------- | ------------ | -| [🎨 Styleguide](https://www.figma.com/file/2gq3WJFdRFDefyHcgFMUGt/Current-compiler.la?node-id=0%3A1) | Colors, typography, and visual assets | -| [❖ Components](https://www.figma.com/file/2gq3WJFdRFDefyHcgFMUGt/Current-compiler.la?node-id=2%3A2) | Reusable design elements like buttons, navbar, etc. | -| [🏗 Information architecture](https://www.figma.com/file/2gq3WJFdRFDefyHcgFMUGt/Current-compiler.la?node-id=2%3A3) | Mocks of the actual pages, with Flows | +| Section | Description | +| ------------------------------------------------------------------------------------------------------------------ | --------------------------------------------------- | +| [🎨 Styleguide](https://www.figma.com/file/2gq3WJFdRFDefyHcgFMUGt/Current-compiler.la?node-id=0%3A1) | Colors, typography, and visual assets | +| [❖ Components](https://www.figma.com/file/2gq3WJFdRFDefyHcgFMUGt/Current-compiler.la?node-id=2%3A2) | Reusable design elements like buttons, navbar, etc. | +| [🏗 Information architecture](https://www.figma.com/file/2gq3WJFdRFDefyHcgFMUGt/Current-compiler.la?node-id=2%3A3) | Mocks of the actual pages, with Flows | We also have 2 Prototypes/Flows that demonstrate navigation and usage of the site: -| Flow | Description | -| ------- | ------------ | -| [🏠 Homepage](https://www.figma.com/proto/2gq3WJFdRFDefyHcgFMUGt/Current-compiler.la?page-id=2%3A3&node-id=8%3A59&viewport=646%2C299%2C0.21&scaling=min-zoom&starting-point-node-id=8%3A59&show-proto-sidebar=1) | Starting on the homepage https://compiler.la | +| Flow | Description | +| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------- | +| [🏠 Homepage](https://www.figma.com/proto/2gq3WJFdRFDefyHcgFMUGt/Current-compiler.la?page-id=2%3A3&node-id=8%3A59&viewport=646%2C299%2C0.21&scaling=min-zoom&starting-point-node-id=8%3A59&show-proto-sidebar=1) | Starting on the homepage https://compiler.la | | [💼 Jobs](https://www.figma.com/proto/2gq3WJFdRFDefyHcgFMUGt/Current-compiler.la?page-id=2%3A3&node-id=10%3A101&viewport=646%2C299%2C0.21&scaling=min-zoom&starting-point-node-id=10%3A101&show-proto-sidebar=1) | Starting on the Jobs listing page https://compiler.la/jobs | ## Development ### Running a local instance -This is a [Jekyll][jekyll] static site. Development is done within a container-based environment using [VS Code with devcontainers](#vs-code-with-devcontainers). This repository includes a [`.devcontainer/devcontainer.json`](devcontainer-config-file) file that configures remote container development. +This is an [11ty][11ty] static site. Development is done within a container-based environment using [VS Code with devcontainers](#vs-code-with-devcontainers). This repository includes a [`.devcontainer/devcontainer.json`](devcontainer-config-file) file that configures remote container development. -Once inside the devcontainer in VS Code, you can press `Ctrl/Cmd+Shift+B` to run the `Jekyll: Build Dev` [task](https://code.visualstudio.com/docs/editor/tasks) defined in [`.vscode/tasks.json`][vscode-task-config-file], which builds the site and starts the Jekyll development server. The site will then be running at . Auto rebuild/reload will be active and will watch the site files for changes. - -> To run the blog in drafts-mode, run `Jekyll: Bulid Dev with Drafts` +Once inside the devcontainer in VS Code, you can press `Ctrl/Cmd+Shift+B` to run the `11ty: Serve` [task](https://code.visualstudio.com/docs/editor/tasks) defined in [`.vscode/tasks.json`][vscode-task-config-file], which builds the site and starts the 11ty development server. The site will then be running at . Auto rebuild/reload will be active and will watch the site files for changes. ## VS Code with devcontainers ### Install the `Remote - Containers` extension [VS Code][vscode] can be used together with Docker via the [Remote - Containers][vscode-containers] extension to enable a container-based development environment. + ### Open the repository with VS Code With the [Remote - Containers][vscode-containers] extension enabled, open the folder containing this repository inside Visual @@ -59,7 +58,7 @@ To close out of the container and re-open the directory locally in Visual Studio 1. Type `Remote-Containers` to filter the commands 1. Select `Reopen Locally` -[jekyll]: https://jekyllrb.com +[11ty]: https://www.11ty.dev/ [devcontainer-config-file]: https://github.com/compilerla/compiler.la/blob/main/.devcontainer/devcontainer.json [vscode-task-config-file]: https://github.com/compilerla/compiler.la/blob/main/.vscode/tasks.json [vscode]: https://code.visualstudio.com/ diff --git a/_config.yml b/_config.yml deleted file mode 100644 index dee82c57..00000000 --- a/_config.yml +++ /dev/null @@ -1,20 +0,0 @@ -collections: - jobs: - output: true - permalink: /:collection/:name - posts: - output: true - permalink: /blog/:year/:title:output_ext -description: | - Software built by humans, for humans, in LA. - Compiler is a woman-owned software consultancy that’s passionate about making - government tech solutions easy-to-use and accessible for all. -feed: - path: /blog/feed.xml -plugins: - - jekyll-feed -source: ./src -# title is used by jekyll-feed when generating the blog Atom feed -# it isn't currently used elsewhere -title: Compiler’s Blog -url: https://compiler.la diff --git a/eleventy.config.js b/eleventy.config.js new file mode 100644 index 00000000..e5c59dcc --- /dev/null +++ b/eleventy.config.js @@ -0,0 +1,57 @@ +import { feedPlugin } from "@11ty/eleventy-plugin-rss"; + +import feed from "./src/_data/feed.json" with { type: "json" }; + +const byTitle = (a, b) => a.data.title.localeCompare(b.data.title); + +export default async function (eleventyConfig) { + eleventyConfig.setInputDirectory("src"); + eleventyConfig.setLayoutsDirectory("_layouts"); + + eleventyConfig.addPassthroughCopy("src/styles/"); + eleventyConfig.addWatchTarget("src/styles/"); + + // Keeps the same directory structure. + eleventyConfig + .addPassthroughCopy("src/_redirects") + .addPassthroughCopy("src/favicon.ico") + .addPassthroughCopy("**/*.jpg") + .addPassthroughCopy("**/*.jpeg") + .addPassthroughCopy("**/*.png") + .addPassthroughCopy("**/*.svg"); + + eleventyConfig.addPassthroughCopy("src/assets/"); + + eleventyConfig.addCollection("jobs", (collectionsApi) => { + return collectionsApi.getFilteredByGlob("src/jobs/*.md").sort(byTitle); + }); + + // ensure draft blog posts are omitted from the RSS feed + eleventyConfig.addCollection("publishedPosts", (collectionsApi) => { + return collectionsApi.getFilteredByTag("posts").filter((post) => !post.data.draft); + }); + + // draft blog posts are rendered locally, but not in production builds + eleventyConfig.addPreprocessor("drafts", "*", (data, content) => { + if (data.draft) { + data.title = `${data.title} (draft)`; + } + + if (data.draft && process.env.ELEVENTY_RUN_MODE === "build") { + return false; + } + }); + + // RSS feed - example https://github.com/11ty/eleventy-base-blog/ + eleventyConfig.addPlugin(feedPlugin, { + type: "atom", + outputPath: feed.outputPath, + collection: { limit: 20, name: "publishedPosts" }, + metadata: { + base: feed.base, + language: "en", + subtitle: feed.subtitle, + title: feed.title, + }, + }); +} diff --git a/mise.toml b/mise.toml index 6ea5a7e1..02406ced 100644 --- a/mise.toml +++ b/mise.toml @@ -1,2 +1,3 @@ -[tools] -node = "24" +[settings] +# https://github.com/jdx/mise/discussions/4345 +idiomatic_version_file_enable_tools = ["node"] diff --git a/netlify.toml b/netlify.toml new file mode 100644 index 00000000..1ffcdb08 --- /dev/null +++ b/netlify.toml @@ -0,0 +1,2 @@ +[build] +command = "npm run build" diff --git a/package-lock.json b/package-lock.json index 3c2ec01d..62d851b3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,8 +10,9 @@ "license": "AGPL-3.0-or-later", "devDependencies": { "@11ty/eleventy": "^3.0.0", + "@11ty/eleventy-plugin-rss": "^3.0.0", "@shopify/prettier-plugin-liquid": "^1.10.2", - "prettier": "^3.8.1" + "prettier": "^3.8.3" } }, "node_modules/@11ty/dependency-tree": { @@ -38,45 +39,45 @@ } }, "node_modules/@11ty/eleventy": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-3.1.2.tgz", - "integrity": "sha512-IcsDlbXnBf8cHzbM1YBv3JcTyLB35EK88QexmVyFdVJVgUU6bh9g687rpxryJirHzo06PuwnYaEEdVZQfIgRGg==", + "version": "3.1.6", + "resolved": "https://registry.npmjs.org/@11ty/eleventy/-/eleventy-3.1.6.tgz", + "integrity": "sha512-ZlSiR1PLdS2lv7TelBgWAhcvMiLNZkPBlLEb+lh7kGYZ+Mk0bo9qcYgVsewvw9W7Em0RH3wd01h5fAstNDh0zA==", "dev": true, "license": "MIT", "dependencies": { - "@11ty/dependency-tree": "^4.0.0", - "@11ty/dependency-tree-esm": "^2.0.0", + "@11ty/dependency-tree": "^4.0.2", + "@11ty/dependency-tree-esm": "^2.0.4", "@11ty/eleventy-dev-server": "^2.0.8", - "@11ty/eleventy-plugin-bundle": "^3.0.6", + "@11ty/eleventy-plugin-bundle": "^3.0.7", "@11ty/eleventy-utils": "^2.0.7", "@11ty/lodash-custom": "^4.17.21", - "@11ty/posthtml-urls": "^1.0.1", - "@11ty/recursive-copy": "^4.0.2", + "@11ty/posthtml-urls": "^1.0.3", + "@11ty/recursive-copy": "^4.0.4", "@sindresorhus/slugify": "^2.2.1", "bcp-47-normalize": "^2.3.0", "chokidar": "^3.6.0", - "debug": "^4.4.1", + "debug": "^4.4.3", "dependency-graph": "^1.0.0", "entities": "^6.0.1", "filesize": "^10.1.6", "gray-matter": "^4.0.3", "iso-639-1": "^3.1.5", - "js-yaml": "^4.1.0", + "js-yaml": "^4.1.1", "kleur": "^4.1.5", - "liquidjs": "^10.21.1", - "luxon": "^3.6.1", - "markdown-it": "^14.1.0", + "liquidjs": "^10.27.0", + "luxon": "^3.7.2", + "markdown-it": "^14.2.0", "minimist": "^1.2.8", - "moo": "^0.5.2", + "moo": "0.5.2", "node-retrieve-globals": "^6.0.1", "nunjucks": "^3.2.4", - "picomatch": "^4.0.2", + "picomatch": "^4.0.4", "please-upgrade-node": "^3.2.0", - "posthtml": "^0.16.6", + "posthtml": "^0.16.7", "posthtml-match-helper": "^2.0.3", - "semver": "^7.7.2", - "slugify": "^1.6.6", - "tinyglobby": "^0.2.14" + "semver": "^7.8.1", + "slugify": "^1.6.9", + "tinyglobby": "^0.2.16" }, "bin": { "eleventy": "cmd.cjs" @@ -139,75 +140,37 @@ "url": "https://opencollective.com/11ty" } }, - "node_modules/@11ty/eleventy-utils": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-2.0.7.tgz", - "integrity": "sha512-6QE+duqSQ0GY9rENXYb4iPR4AYGdrFpqnmi59tFp9VrleOl0QSh8VlBr2yd6dlhkdtj7904poZW5PvGr9cMiJQ==", + "node_modules/@11ty/eleventy-plugin-rss": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-plugin-rss/-/eleventy-plugin-rss-3.0.0.tgz", + "integrity": "sha512-kKW4DcR57xAyRx0e8gNhKh56ahHVEaAj8/TuXQDnw+B46ig2bWADJAlyj/GdV37IG5ja9dZ4SgKZrs/CHz6YWQ==", "dev": true, "license": "MIT", - "engines": { - "node": ">=18" + "dependencies": { + "@11ty/eleventy-utils": "^2.0.7", + "@11ty/posthtml-urls": "^1.0.2", + "debug": "^4.4.3", + "posthtml": "^0.16.7" }, "funding": { "type": "opencollective", "url": "https://opencollective.com/11ty" } }, - "node_modules/@11ty/eleventy/node_modules/linkify-it": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", - "integrity": "sha512-5aHCbzQRADcdP+ATqnDuhhJ/MRIqDkZX5pyjFHRRysS8vZ5AbqGEoFIb6pYHPZ+L/OC2Lc+xT8uHVVR5CAK/wQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "uc.micro": "^2.0.0" - } - }, - "node_modules/@11ty/eleventy/node_modules/markdown-it": { - "version": "14.1.1", - "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.1.tgz", - "integrity": "sha512-BuU2qnTti9YKgK5N+IeMubp14ZUKUUw7yeJbkjtosvHiP0AZ5c8IAgEMk79D0eC8F23r4Ac/q8cAIFdm2FtyoA==", + "node_modules/@11ty/eleventy-utils": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@11ty/eleventy-utils/-/eleventy-utils-2.0.7.tgz", + "integrity": "sha512-6QE+duqSQ0GY9rENXYb4iPR4AYGdrFpqnmi59tFp9VrleOl0QSh8VlBr2yd6dlhkdtj7904poZW5PvGr9cMiJQ==", "dev": true, "license": "MIT", - "dependencies": { - "argparse": "^2.0.1", - "entities": "^4.4.0", - "linkify-it": "^5.0.0", - "mdurl": "^2.0.0", - "punycode.js": "^2.3.1", - "uc.micro": "^2.1.0" - }, - "bin": { - "markdown-it": "bin/markdown-it.mjs" - } - }, - "node_modules/@11ty/eleventy/node_modules/markdown-it/node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "dev": true, - "license": "BSD-2-Clause", "engines": { - "node": ">=0.12" + "node": ">=18" }, "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" + "type": "opencollective", + "url": "https://opencollective.com/11ty" } }, - "node_modules/@11ty/eleventy/node_modules/mdurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", - "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@11ty/eleventy/node_modules/uc.micro": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", - "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", - "dev": true, - "license": "MIT" - }, "node_modules/@11ty/lodash-custom": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/@11ty/lodash-custom/-/lodash-custom-4.17.21.tgz", @@ -223,9 +186,9 @@ } }, "node_modules/@11ty/posthtml-urls": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@11ty/posthtml-urls/-/posthtml-urls-1.0.2.tgz", - "integrity": "sha512-0vaV3Wt0surZ+oS1VdKKe0axeeupuM+l7W/Z866WFQwF+dGg2Tc/nmhk/5l74/Y55P8KyImnLN9CdygNw2huHg==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@11ty/posthtml-urls/-/posthtml-urls-1.0.3.tgz", + "integrity": "sha512-1YvhnkaNlFnnJic1rBMWmTC2adbuy+JQiBfl1Hecr1Wjjik1pQZmGyk/eC9zKX/FQv52s2Nht1Gi/UwhYqrBeg==", "dev": true, "license": "MIT", "dependencies": { @@ -239,15 +202,15 @@ } }, "node_modules/@11ty/recursive-copy": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/@11ty/recursive-copy/-/recursive-copy-4.0.3.tgz", - "integrity": "sha512-SX48BTLEGX8T/OsKWORsHAAeiDsbFl79Oa/0Wg/mv/d27b7trCVZs7fMHvpSgDvZz/fZqx5rDk8+nx5oyT7xBw==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/@11ty/recursive-copy/-/recursive-copy-4.0.4.tgz", + "integrity": "sha512-oI7m8pa7/IAU/3lqRU9vjBbs20iKFo7x+1K9kT3aVira6scc1X9MjBdgLCHzLJeJ7iB6wydioA+kr9/qPnvmlQ==", "dev": true, "license": "ISC", "dependencies": { "errno": "^1.0.0", "junk": "^3.1.0", - "maximatch": "^0.1.0", + "minimatch": "^3.1.5", "slash": "^3.0.0" }, "engines": { @@ -266,9 +229,9 @@ } }, "node_modules/@shopify/prettier-plugin-liquid": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/@shopify/prettier-plugin-liquid/-/prettier-plugin-liquid-1.10.2.tgz", - "integrity": "sha512-yzC+6bJemVnrEgddztLuX5I7zSoRrxXgS5j7BVS6HzVs9sMf8Fx+bdIEDkKu4bBBBKSzuen1SLVfq9u3z9L1wQ==", + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/@shopify/prettier-plugin-liquid/-/prettier-plugin-liquid-1.10.3.tgz", + "integrity": "sha512-MSI3e3+EksyrkeP4Mk7WnZkySterxukyi7U1pPLUIVaE2zhxLIMEDLA2Ew7fFFNNQ0P2FXF0nzqk+aN/Hi2/IA==", "dev": true, "license": "MIT", "dependencies": { @@ -379,49 +342,6 @@ "dev": true, "license": "Python-2.0" }, - "node_modules/array-differ": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", - "integrity": "sha512-LeZY+DZDRnvP7eMuQ6LHfCzUGxAAIViUBliK24P3hWXL6y4SortgR6Nim6xrkfSLlmH0+k+9NYNwVC2s53ZrYQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "license": "MIT", - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arrify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", - "integrity": "sha512-3CYzex9M9FGQjCGMGyi6/31c8GJbgb0qGyrx5HWxPd0aCwh4cB2YjMb2Xf9UuoogrMrlO9cTqnB5rI5GHZTcUA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/asap": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", @@ -492,9 +412,9 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.13", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.13.tgz", - "integrity": "sha512-9ZLprWS6EENmhEOpjCYW2c8VkmOvckIJZfkr7rBW6dObmfgJ/L1GpSYW5Hpo9lDz4D1+n0Ckz8rU7FwHDQiG/w==", + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.15.tgz", + "integrity": "sha512-EwOCDEex4quD37XhqM3omwtMoJjr//isUZz1JopUNWms+4Z2ViyM/k1YIRePpoVNnQhENnxtFjLaxNHrT7xIUg==", "dev": true, "license": "MIT", "dependencies": { @@ -1201,10 +1121,30 @@ "isobject": "^2.0.0" } }, + "node_modules/linkify-it": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.1.tgz", + "integrity": "sha512-wVoTjP4Q6R0NW5hiZkVJaFZPWgtXfoGF+6LucL3/FtiNjmcHhYjEr5f1Kqjirc1nBW07J/ZuRFumqr2oqccEWg==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], + "license": "MIT", + "dependencies": { + "uc.micro": "^2.0.0" + } + }, "node_modules/liquidjs": { - "version": "10.25.3", - "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.25.3.tgz", - "integrity": "sha512-csoJtC6yTfkUlwy+QKm0tRbFoz5cnzly1ugFvBBDWXA4Oo8ul31hOHDEZVzG93q8YaxRIQ909GFuow8d/q1v2Q==", + "version": "10.27.0", + "resolved": "https://registry.npmjs.org/liquidjs/-/liquidjs-10.27.0.tgz", + "integrity": "sha512-tw/OA59K7aIBlMKIrKlumr37fiZUheShVHXY8cVctWisgY1p9mc5hreOvlreoS0wTiwlWk14Ya7305c2a/Cg5w==", "dev": true, "license": "MIT", "dependencies": { @@ -1239,22 +1179,54 @@ "node": ">=12" } }, - "node_modules/maximatch": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/maximatch/-/maximatch-0.1.0.tgz", - "integrity": "sha512-9ORVtDUFk4u/NFfo0vG/ND/z7UQCVZBL539YW0+U1I7H1BkZwizcPx5foFv7LCPcBnm2U6RjFnQOsIvN4/Vm2A==", + "node_modules/markdown-it": { + "version": "14.2.0", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.2.0.tgz", + "integrity": "sha512-1TGiQiJVRQ3NPmZH6sx5Cfnmg6GQm9jvC1ch4TK511NjSJvjzKLzn5pPfZRNZkRPZP0HqCioSndqH8v2nRaWVQ==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/markdown-it" + } + ], "license": "MIT", "dependencies": { - "array-differ": "^1.0.0", - "array-union": "^1.0.1", - "arrify": "^1.0.0", - "minimatch": "^3.0.0" + "argparse": "^2.0.1", + "entities": "^4.4.0", + "linkify-it": "^5.0.1", + "mdurl": "^2.0.0", + "punycode.js": "^2.3.1", + "uc.micro": "^2.1.0" }, + "bin": { + "markdown-it": "bin/markdown-it.mjs" + } + }, + "node_modules/markdown-it/node_modules/entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", + "dev": true, + "license": "BSD-2-Clause", "engines": { - "node": ">=0.10.0" + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" } }, + "node_modules/mdurl": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-2.0.0.tgz", + "integrity": "sha512-Lf+9+2r+Tdp5wXDXC4PcIBjTDtq4UKjCPMQhKIuzpJNW0b96kVqSwW0bT7FhRSfmAiFYgP+SCRvdrDozfh0U5w==", + "dev": true, + "license": "MIT" + }, "node_modules/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", @@ -1329,9 +1301,9 @@ } }, "node_modules/moo": { - "version": "0.5.3", - "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.3.tgz", - "integrity": "sha512-m2fmM2dDm7GZQsY7KK2cme8agi+AAljILjQnof7p1ZMDe6dQ4bdnSMx0cPppudoeNv5hEFQirN6u+O4fDE0IWA==", + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/moo/-/moo-0.5.2.tgz", + "integrity": "sha512-iSAJLHYKnX41mKcJKjqvnAN9sf0LMDTXDEvFv+ffuRR9a1MIuXLjMNL6EsnDHSkKLTWNqQQ5uo61P4EbU4NU+Q==", "dev": true, "license": "BSD-3-Clause" }, @@ -1524,9 +1496,9 @@ } }, "node_modules/prettier": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.1.tgz", - "integrity": "sha512-UOnG6LftzbdaHZcKoPFtOcCKztrQ57WkHDeRD9t/PTQtmT0NHSeWWepj6pS0z/N7+08BHFDQVUrfmfMRcZwbMg==", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", "dev": true, "license": "MIT", "bin": { @@ -1607,9 +1579,9 @@ } }, "node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.3.tgz", + "integrity": "sha512-wnilbGyMxzbY7dNOl7jpKbLSjcfeweJWU5j4+u5qW+6/wuGD9KzIGOyZnQVSBM9E7DtWaaH3CyHkppYrKYoxwg==", "dev": true, "license": "ISC", "bin": { @@ -1671,9 +1643,9 @@ } }, "node_modules/slugify": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.6.tgz", - "integrity": "sha512-h+z7HKHYXj6wJU+AnS/+IH8Uh9fdcX1Lrhg1/VMdf9PwoBQXFcXiAdsy2tSK0P6gKwJLXp02r90ahUCqHk9rrw==", + "version": "1.6.9", + "resolved": "https://registry.npmjs.org/slugify/-/slugify-1.6.9.tgz", + "integrity": "sha512-vZ7rfeehZui7wQs438JXBckYLkIIdfHOXsaVEUMyS5fHo1483l1bMdo0EDSWYclY0yZKFOipDy4KHuKs6ssvdg==", "dev": true, "license": "MIT", "engines": { @@ -1721,14 +1693,14 @@ } }, "node_modules/tinyglobby": { - "version": "0.2.15", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", - "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -1760,6 +1732,13 @@ "node": ">=0.6" } }, + "node_modules/uc.micro": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-2.1.0.tgz", + "integrity": "sha512-ARDJmphmdvUk6Glw7y9DQ2bFkKBHwQHLi2lsaH6PPmz/Ka9sFOBsBluozhDltWmnv9u/cF6Rt87znRTPV+yp/A==", + "dev": true, + "license": "MIT" + }, "node_modules/unpipe": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", @@ -1778,9 +1757,9 @@ "license": "MIT" }, "node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "version": "8.21.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.21.0.tgz", + "integrity": "sha512-Vsp28b7DRcimFQvrqu2Wek3z1iYxDCWqHYB8Qsnk/S4RfaCQzPGPyBNuVjJV3cd6UiKtUtp6sNM77gWvzcCH+g==", "dev": true, "license": "MIT", "engines": { diff --git a/package.json b/package.json index 649c3cdc..6fa00a75 100644 --- a/package.json +++ b/package.json @@ -3,16 +3,19 @@ "version": "2.0.0", "description": "Software built by humans, for humans, in LA", "author": "Compiler", - "license": "AGPL-3.0-or-later", "type": "module", + "license": "Apache-2.0", "private": true, "devDependencies": { "@11ty/eleventy": "^3.0.0", + "@11ty/eleventy-plugin-rss": "^3.0.0", "@shopify/prettier-plugin-liquid": "^1.10.2", - "prettier": "^3.8.1" + "prettier": "^3.8.3" }, "scripts": { "build": "npx @11ty/eleventy", - "start": "npx @11ty/eleventy --serve" + "start": "npx @11ty/eleventy --serve", + "lint:check": "npx prettier --check .", + "lint:fix": "npx prettier --write ." } } diff --git a/src/.git-blame-ignore-revs b/src/.git-blame-ignore-revs new file mode 100644 index 00000000..cd8ff453 --- /dev/null +++ b/src/.git-blame-ignore-revs @@ -0,0 +1,2 @@ +# prettier + shopify liquid plugin +f74b2955db9232856cbe56c870b3dfb5db413f7d diff --git a/src/404.html b/src/404.html index 2724d526..8a02a137 100644 --- a/src/404.html +++ b/src/404.html @@ -1,17 +1,16 @@ --- -layout: default +permalink: /404.html ---
-
- -

Something’s missing!

-
-
-

The page you’re looking for doesn’t exist or was removed. We suggest you - go back home.

- +
+ +

Something’s missing!

+
+
+

The page you’re looking for doesn’t exist or was removed. We suggest you go back home.

+ +
diff --git a/src/_data/certs.json b/src/_data/certs.json new file mode 100644 index 00000000..c40031b6 --- /dev/null +++ b/src/_data/certs.json @@ -0,0 +1,22 @@ +[ + { + "name": "Certifications", + "values": [ + "Disadvantaged Business Enterprise 49643", + "State of California Small Business 2020432", + "City of Los Angeles (SBE, EBE, VSBE, SBE (Proprietary), LBE, LSE, WBE) 2020432", + "County of Los Angeles WBE, LSBE 091460, CBE 091685" + ] + }, + { + "name": "Contract Vehicles", + "values": ["CMAS 3-21-11-1021", "TDDC MSA 5-22-70-25-341"] + }, + { + "name": "NAICS Codes", + "values": [ + "541511 - Custom Computer Programming Services (Primary)", + "518210 - Data Processing, Hosting, and Related Services" + ] + } +] diff --git a/src/_data/certs.yml b/src/_data/certs.yml deleted file mode 100644 index 24bf9b81..00000000 --- a/src/_data/certs.yml +++ /dev/null @@ -1,16 +0,0 @@ -- name: Certifications - values: - - Disadvantaged Business Enterprise 49643 - - State of California Small Business 2020432 - - City of Los Angeles (SBE, EBE, VSBE, SBE (Proprietary), LBE, LSE, WBE) 2020432 - - County of Los Angeles WBE, LSBE 091460, CBE 091685 - -- name: Contract Vehicles - values: - - CMAS 3-21-11-1021 - - TDDC MSA 5-22-70-25-341 - -- name: NAICS Codes - values: - - 541511 - Custom Computer Programming Services (Primary) - - 518210 - Data Processing, Hosting, and Related Services diff --git a/src/_data/featured_work.json b/src/_data/featured_work.json new file mode 100644 index 00000000..6da12a0a --- /dev/null +++ b/src/_data/featured_work.json @@ -0,0 +1,42 @@ +[ + { + "title": "Customer Success Strategy", + "description": "Implemented a new Customer Success program, including setting up a Customer Relationship Management (CRM) platform and assigning Account Managers to work with California Transit Agencies.", + "outcome": "Launched a tiered system to provide 189 California transit agencies with a Customer Success Account Manager after successfully demoing a cohort program. CRM activity increased by 62% in 2023.", + "tags": ["Project management", "Program development"] + }, + { + "title": "Operational Data Standard (ODS)", + "description": "Convened the Operational Data Standards (ODS) working group to draft ODS v1, an open standard for describing scheduled transit operations by building on GTFS to include personnel and non-revenue service data.", + "outcome": "Five vendors are capable of reading or writing ODS feeds in their software offerings. This standard is available to transit agencies to improve their scheduled transit operations. ODS v2 is in development.", + "tags": ["Data standards development"] + }, + { + "title": "Data + Donuts", + "image": "/assets/our_work/datadonuts.png", + "image_alt_text": "An image of a logo containing a donut, where the top half displays a pie chart, and the words “Data plus sign Donuts.", + "description": "In collaboration with government partners, Compiler produced and managed monthly community events, Data + Donuts since 2017. Past speakers have included technology and policy leaders from LA Metro, California Department of Technology (CDT), the Southern California Association of Governments (SCAG), and Caltrans.", + "outcome": "Successfully relaunched Data + Donuts in person after the pandemic in June 2023. We have been hosting events ever since and livestreaming them for a larger audience for those who don’t want to attend in person.", + "tags": ["Project Management"] + }, + { + "title": "Benefits", + "image": "/assets/our_work/benefits.png", + "image_alt_text": "An image showing the home screen of a website called Cal-ITP Benefits, where a hand is holding a credit card using a contactless payment reader.", + "description": "Designed and developed a web application that allows transit riders to digitally verify their identity, check their eligibility for reduced transit fares, and enroll their credit or debit card to automatically receive a reduced fare on transit when they tap-to-pay.", + "outcome": "Monterey-Salinas Transit (MST) was the first transit operator in California to adopt the Benefits app in 2022. Santa Barbara Metropolitan Transit District (SBMTD) launched in 2023, and several more operators are expected to launch in 2024. The app supports benefits enrollment for older adults, veterans, and CalFresh cardholders. Future enrollment options include Medicare cardholders and persons with disabilities.", + "tags": ["Project Management", "Human-centered Design", "Software Development"] + }, + { + "title": "Upgrade Scenario Planning Model (SPM)", + "description": "Collaborated with a diverse team to update and enhance the SPM transportation model by developing database queries and a user interface for SCAG.", + "outcome": "Increased the efficiency of a PostGIS spatial query processing millions of geographic points by 70%, allowing end users to receive faster feedback and a friendlier user experience for faster data analysis.", + "tags": ["Software Development", "Human-centered Design"] + }, + { + "title": "Product Schedule", + "description": "Managed a research project to evaluate how well scheduling software solutions met the needs of small and rural California transit agencies. Research included conducting 30+ hours of onsite interviews with 4 agencies.", + "outcome": "Delivered a research report to Caltrans summarizing research results and recommending actionable next steps to solution providers and Caltrans to provide agencies with vital scheduling resources.", + "tags": ["Project Management", "Program Development"] + } +] diff --git a/src/_data/featured_work.yml b/src/_data/featured_work.yml deleted file mode 100644 index 51508656..00000000 --- a/src/_data/featured_work.yml +++ /dev/null @@ -1,48 +0,0 @@ -- title: Customer Success Strategy - description: | - Implemented a new Customer Success program, including setting up a Customer Relationship Management (CRM) platform and assigning Account Managers to work with California Transit Agencies. - outcome: | - Launched a tiered system to provide 189 California transit agencies with a Customer Success Account Manager after successfully demoing a cohort program. CRM activity increased by 62% in 2023. - tags: - - Project management - - Program development - -- title: Operational Data Standard (ODS) - description: | - Convened the Operational Data Standards (ODS) working group to draft ODS v1, an open standard for describing scheduled transit operations by building on GTFS to include personnel and non-revenue service data. - outcome: | - Five vendors are capable of reading or writing ODS feeds in their software offerings. This standard is available to transit agencies to improve their scheduled transit operations. ODS v2 is in development. - tags: - - Data standards development - -- title: Data + Donuts - image: /assets/our_work/datadonuts.png - image_alt_text: An image of a logo containing a donut, where the top half displays a pie chart, and the words “Data plus sign Donuts.” - description: In collaboration with government partners, Compiler produced and managed monthly community events, Data + Donuts since 2017. Past speakers have included technology and policy leaders from LA Metro, California Department of Technology (CDT), the Southern California Association of Governments (SCAG), and Caltrans. - outcome: Successfully relaunched Data + Donuts in person after the pandemic in June 2023. We have been hosting events ever since and livestreaming them for a larger audience for those who don’t want to attend in person. - tags: - - Project Management - -- title: Benefits - image: /assets/our_work/benefits.png - image_alt_text: An image showing the home screen of a website called Cal-ITP Benefits, where a hand is holding a credit card using a contactless payment reader. - description: Designed and developed a web application that allows transit riders to digitally verify their identity, check their eligibility for reduced transit fares, and enroll their credit or debit card to automatically receive a reduced fare on transit when they tap-to-pay. - outcome: Monterey-Salinas Transit (MST) was the first transit operator in California to adopt the Benefits app in 2022. Santa Barbara Metropolitan Transit District (SBMTD) launched in 2023, and several more operators are expected to launch in 2024. The app supports benefits enrollment for older adults, veterans, and CalFresh cardholders. Future enrollment options include Medicare cardholders and persons with disabilities. - tags: - - Project Management - - Human-centered Design - - Software Development - -- title: Upgrade Scenario Planning Model (SPM) - description: Collaborated with a diverse team to update and enhance the SPM transportation model by developing database queries and a user interface for SCAG. - outcome: Increased the efficiency of a PostGIS spatial query processing millions of geographic points by 70%, allowing end users to receive faster feedback and a friendlier user experience for faster data analysis. - tags: - - Software Development - - Human-centered Design - -- title: Product Schedule - description: Managed a research project to evaluate how well scheduling software solutions met the needs of small and rural California transit agencies. Research included conducting 30+ hours of onsite interviews with 4 agencies. - outcome: Delivered a research report to Caltrans summarizing research results and recommending actionable next steps to solution providers and Caltrans to provide agencies with vital scheduling resources. - tags: - - Project Management - - Program Development diff --git a/src/_data/feed.json b/src/_data/feed.json new file mode 100644 index 00000000..d60c421d --- /dev/null +++ b/src/_data/feed.json @@ -0,0 +1,6 @@ +{ + "base": "https://compiler.la/blog/", + "outputPath": "/blog/feed.xml", + "title": "Compiler’s Blog", + "subtitle": "Software built by humans, for humans, in LA. Compiler is a woman-owned software consultancy that’s passionate about making government tech solutions easy-to-use and accessible for all." +} diff --git a/src/_data/services.json b/src/_data/services.json new file mode 100644 index 00000000..cc5b9da9 --- /dev/null +++ b/src/_data/services.json @@ -0,0 +1,27 @@ +[ + { + "name": "Software development", + "id": "software-development", + "description": "Agile web application development and support with data publishing needs and tools for data analysts." + }, + { + "name": "Human-centered design", + "id": "human-centered-design", + "description": "User-centered design that incorporates accessibility requirements and multiple language support." + }, + { + "name": "Data Standards development", + "id": "data-standards-development", + "description": "Collaborate with agencies and stakeholders to create equity and transparency through developing standards." + }, + { + "name": "Project management", + "id": "project-management", + "description": "Ensure timely and efficient delivery of project goals and objectives." + }, + { + "name": "Program development", + "id": "program-development", + "description": "Build teams and services from the ground up within the government." + } +] diff --git a/src/_data/services.yml b/src/_data/services.yml deleted file mode 100644 index b8ff9761..00000000 --- a/src/_data/services.yml +++ /dev/null @@ -1,19 +0,0 @@ -- name: Software development - id: software-development - description: Agile web application development and support with data publishing needs and tools for data analysts. - -- name: Human-centered design - id: human-centered-design - description: User-centered design that incorporates accessibility requirements and multiple language support. - -- name: Data Standards development - id: data-standards-development - description: Collaborate with agencies and stakeholders to create equity and transparency through developing standards. - -- name: Project management - id: project-management - description: Ensure timely and efficient delivery of project goals and objectives. - -- name: Program development - id: program-development - description: Build teams and services from the ground up within the government. diff --git a/src/_data/team.json b/src/_data/team.json new file mode 100644 index 00000000..8ec83df6 --- /dev/null +++ b/src/_data/team.json @@ -0,0 +1,92 @@ +[ + { + "name": "Adam Linder", + "title": "Account Manager", + "image": "adam-linder.png" + }, + { + "name": "Andy Walker", + "title": "Product Manager", + "image": "andy-walker.png" + }, + { + "name": "Angela Tran", + "title": "Senior Software Engineer", + "image": "angela-tran.png" + }, + { + "name": "Anthony Rollins", + "title": "Managing Partner", + "image": "anthony-rollins.png" + }, + { + "name": "Christine Bath", + "title": "Senior UI/UX Designer", + "image": "christine-bath.png" + }, + { + "name": "John Gravois", + "title": "Senior Software Engineer", + "image": "john-gravois.png" + }, + { + "name": "Kegan Maher", + "title": "Managing Partner", + "image": "kegan-maher.png" + }, + { + "name": "Laney Mangan", + "title": "Associate Consultant, Customer Support Specialist", + "image": "laney-mangan.png" + }, + { + "name": "Leela Singh", + "title": "Senior Project Manager", + "image": "leela-singh.png" + }, + { + "name": "Luis Alvergue", + "title": "Senior Software Engineer", + "image": "luis-alvergue.png" + }, + { + "name": "Marie Araneta", + "title": "Account Manager", + "image": "marie-araneta.png" + }, + { + "name": "Milo Green", + "title": "Executive Assistant, Business Development", + "image": "milo-green.png" + }, + { + "name": "Nina Dinh", + "title": "Account Manager", + "image": "nina-dinh.png" + }, + { + "name": "Olivia Ramacier", + "title": "Associate Researcher, Customer Success Specialist", + "image": "olivia-ramacier.png" + }, + { + "name": "Scott Cranfill", + "title": "Senior Software Engineer", + "image": "scott-cranfill.png" + }, + { + "name": "Scott Frazier", + "title": "Managing Partner", + "image": "scott-frazier.png" + }, + { + "name": "Shelby Miller", + "title": "Managing Partner", + "image": "shelby-miller.png" + }, + { + "name": "Vyki Englert", + "title": "Managing Partner", + "image": "vyki-englert.png" + } +] diff --git a/src/_data/team.yml b/src/_data/team.yml deleted file mode 100644 index 84620753..00000000 --- a/src/_data/team.yml +++ /dev/null @@ -1,71 +0,0 @@ -- name: Adam Linder - title: Account Manager - image: "adam-linder.png" - -- name: Andy Walker - title: Product Manager - image: "andy-walker.png" - -- name: Angela Tran - title: Senior Software Engineer - image: "angela-tran.png" - -- name: Anthony Rollins - title: Managing Partner - image: "anthony-rollins.png" - -- name: Christine Bath - title: Senior UI/UX Designer - image: "christine-bath.png" - -- name: John Gravois - title: Senior Software Engineer - image: "john-gravois.png" - -- name: Kegan Maher - title: Managing Partner - image: "kegan-maher.png" - -- name: Laney Mangan - title: Associate Consultant, Customer Support Specialist - image: "laney-mangan.png" - -- name: Leela Singh - title: Senior Project Manager - image: "leela-singh.png" - -- name: Luis Alvergue - title: Senior Software Engineer - image: "luis-alvergue.png" - -- name: Marie Araneta - title: Account Manager - image: "marie-araneta.png" - -- name: Milo Green - title: Executive Assistant, Business Development - image: "milo-green.png" - -- name: Nina Dinh - title: Account Manager - image: "nina-dinh.png" - -- name: Olivia Ramacier - title: Associate Researcher, Customer Success Specialist - image: "olivia-ramacier.png" - -- name: Scott Cranfill - title: Senior Software Engineer - image: "scott-cranfill.png" - -- name: Scott Frazier - title: Managing Partner - image: "scott-frazier.png" - -- name: Shelby Miller - title: Managing Partner - image: "shelby-miller.png" - -- name: Vyki Englert - title: Managing Partner - image: "vyki-englert.png" diff --git a/src/_includes/certs.html b/src/_includes/certs.html index 087bb3bd..ecab18ff 100644 --- a/src/_includes/certs.html +++ b/src/_includes/certs.html @@ -1,10 +1,10 @@ -{% for cert in site.data.certs %} +{% for cert in certs %}
-

{{ cert.name }}

-
    - {% for value in cert.values %} -
  • {{ value }}
  • - {% endfor %} -
+

{{ cert.name }}

+
    + {% for value in cert.values %} +
  • {{ value }}
  • + {% endfor %} +
{% endfor %} diff --git a/src/_includes/job-json.html b/src/_includes/job-json.html deleted file mode 100644 index ecf962de..00000000 --- a/src/_includes/job-json.html +++ /dev/null @@ -1,13 +0,0 @@ -{% comment %} - -{% endcomment %} -{%- if include.job -%} -{ title:"{{ include.job.title }}", type:"{{ include.job.type }}", open_date:"{{ include.job.open_date }}", close_date:"{{ include.job.close_date }}", url:"{{ include.job.url }}" } -{%- else -%} -[ - {% assign sorted_jobs = (site.jobs | sort: "title") %} - {% for job in sorted_jobs -%} - { title:"{{ job.title }}", type:"{{ job.type }}", open_date:"{{ job.open_date }}", close_date:"{{ job.close_date }}", url:"{{ job.url }}" }, - {% endfor %} -] -{%- endif -%} diff --git a/src/_includes/ready-to-work.html b/src/_includes/ready-to-work.liquid similarity index 61% rename from src/_includes/ready-to-work.html rename to src/_includes/ready-to-work.liquid index 98baddba..21a1c0b6 100644 --- a/src/_includes/ready-to-work.html +++ b/src/_includes/ready-to-work.liquid @@ -1,9 +1,10 @@
- {% assign h3-text = "Ready to work together?" %} {% if include.h3-class %} -

{{h3-text}}

+ {% assign h3-text = 'Ready to work together?' %} + {% if h3-class %} +

{{ h3-text }}

{% else %} -

{{h3-text}}

+

{{ h3-text }}

{% endif %} Contact us
diff --git a/src/_layouts/blog_post.html b/src/_layouts/blog_post.html deleted file mode 100644 index 9ba9654b..00000000 --- a/src/_layouts/blog_post.html +++ /dev/null @@ -1,28 +0,0 @@ ---- -layout: default ---- -
- Back -
- -
-
-
-

{{ page.title }}

- {{ page.subtitle }} - By {{ page.author }} - -
-
-
-
-
- {{ content }} -
-
-
-
- - diff --git a/src/_layouts/blog_post.liquid b/src/_layouts/blog_post.liquid new file mode 100644 index 00000000..43d7fdd6 --- /dev/null +++ b/src/_layouts/blog_post.liquid @@ -0,0 +1,28 @@ +--- +layout: default +--- +
+ Back +
+ +
+
+
+

{{ title }}

+ {{ subtitle }} + By {{ author }} + +
+
+
+
+
+ {{ content }} +
+
+
+
+ + diff --git a/src/_layouts/default.html b/src/_layouts/default.html deleted file mode 100644 index 2fdf2674..00000000 --- a/src/_layouts/default.html +++ /dev/null @@ -1,94 +0,0 @@ - - - - - {% if layout.title_prefix %} - {% assign title = layout.title_prefix | append: " " | append: page.title %} - {% else if page.title %} - {% assign title = page.title %} - - {% endif %} - - {{ title | default: "Compiler"}} - - - - {% if page.description %} - - {% endif %} - {% if page.date %} - - {% endif %} - {% if page.author %} - - {% endif %} - - - - - - - - {% feed_meta %} - - - - - - - - - - - - - - - - -
- {% include nav.html %} -
- -
- {{ content }} -
- - - - - diff --git a/src/_layouts/default.liquid b/src/_layouts/default.liquid new file mode 100644 index 00000000..fcf9e470 --- /dev/null +++ b/src/_layouts/default.liquid @@ -0,0 +1,102 @@ + + + + {% if title_prefix %} + {% assign title = title_prefix | append: title %} + {% endif %} + + {{ title }} + + + + + + {% if date %} + + {% endif %} + {% if author %} + + {% endif %} + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ {% include 'nav.html' %} +
+ +
+ {{ content }} +
+ + + + diff --git a/src/_layouts/job_post.html b/src/_layouts/job_post.html deleted file mode 100644 index d71359f0..00000000 --- a/src/_layouts/job_post.html +++ /dev/null @@ -1,71 +0,0 @@ ---- -layout: default -title_prefix: "Jobs with Compiler:" ---- - -
-
-

{{ page.title }}{% if page.type %} ({{ page.type }}){% endif %}

- - {{ content }} - - {% if page.apply_link %} -

- - Apply Now - -

- {% endif %} - -

- - In keeping with our beliefs and goals, no employee or applicant will face - discrimination or harassment based on race, color, ancestry, national - origin, religion, education, age, gender identity, sexual orientation, - marital domestic partner status, familial status, disability status, or - veteran status. - -

-

- - We will consider for employment qualified applicants with arrest and - conviction records. - - #banthebox - - -

- - -
-
- - - diff --git a/src/_layouts/job_post.liquid b/src/_layouts/job_post.liquid new file mode 100644 index 00000000..05d61161 --- /dev/null +++ b/src/_layouts/job_post.liquid @@ -0,0 +1,71 @@ +--- +layout: default +--- +
+
+

+ {{ title -}} + {%- if type %} ({{ type }}){% endif %} +

+ + {{ content }} + + {% if apply_link %} +

+ + Apply Now + +

+ {% endif %} + +

+ + In keeping with our beliefs and goals, no employee or applicant will face discrimination or harassment based on race, + color, ancestry, national origin, religion, education, age, gender identity, sexual orientation, marital domestic partner + status, familial status, disability status, or veteran status. + +

+

+ + We will consider for employment qualified applicants with arrest and conviction records. + + #banthebox + + +

+ + +
+
+ + + diff --git a/src/_layouts/redirected.html b/src/_layouts/redirected.html deleted file mode 100644 index 891e2261..00000000 --- a/src/_layouts/redirected.html +++ /dev/null @@ -1,18 +0,0 @@ ---- ---- - - - - - - - - - - -

Redirecting...

- Click here if you are not redirected. - - - - diff --git a/src/_redirects b/src/_redirects new file mode 100644 index 00000000..6016c553 --- /dev/null +++ b/src/_redirects @@ -0,0 +1,2 @@ +/capabilities /assets/Compiler-Capabilities-Statement.pdf +/retreat https://app.clickup.com/8631512/v/dc/87d6r-2241/87d6r-63214 diff --git a/src/about.html b/src/about.html deleted file mode 100644 index d7aca777..00000000 --- a/src/about.html +++ /dev/null @@ -1,174 +0,0 @@ ---- -layout: default -description: We build open-source, human-centered, secure, agile solutions to support the delivery of government services that increase equity of opportunity. ---- - -
- -
- -
-
-
-
-
-
-
-
-
-
-
- What we’ve been up to -

Recent work

-
-
- Customer Success strategy -

Implemented new Customer Success program for California Integrated Travel Project (Cal-ITP)

-
-
- Benefits application -

Developed Cal-ITP Benefits, a digital tool allowing transit riders to verify their eligibility for a reduced fare and attach the discount to their bank card, so they automatically get their discount when tapping-to-pay.

-
-
- Open data standards -

Convened the Operational Data Standards (ODS) working group and drafted ODS v1. Drafted the Mobility Data Interoperability Principles (MDIP), a public sector-led coalition to build support for interoperable technology in the mobility industry.

-
-
-
- - Illustration of a bicycle - -
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
- Our philosophy -
-
-

Empower government workers

-

Through service design, human-centered policy, and intentional technology choices, we make government services equitable and accessible for all.

-
-
-
    -
  • First and always inclusive
  • -
  • Be excellent to each other
  • -
  • Focus on frontline workers
  • -
  • Open and honest engagement
  • -
  • Public services built to last
  • -
-
-
-
-
-
- -
-
-
-
- Testimonial -
-
-

Compiler is a world-class team and an excellent choice for software development services.

-

—Jeremy Dalton, VP Mobility Xentrans and Technical Project Manager for Cal-ITP

-
-
-
-
-
-
-
-
-
-
-
- -
-
-
- Who we are -

Meet the team

- We’re a small team of remote workers who believe and advocate for better public services -
-
-
-
-
- {% for member in site.data.team %} -
-
- Watercolor illustration of {{member.name}} -
-

{{ member.name }}

-

{{ member.title }}

-
- {% endfor %} -
-
-
-
-
- - - -
-
-

Team illustrations by @worksofharte

-
-
-
- -
-
- {% include ready-to-work.html h3-class="text-dark" %} -
-
- - diff --git a/src/about.liquid b/src/about.liquid new file mode 100644 index 00000000..e92978d6 --- /dev/null +++ b/src/about.liquid @@ -0,0 +1,196 @@ +
+
+
+ About Us +

We make government services accessible for all

+

+ At Compiler we’re dedicated to building open-source, human-centered, secure, solutions to support the delivery of + government services that increase equity of opportunity. +

+ Read our Capabilities Statement +
+ + Illustration of a bus + +
+
+ +
+
+
+
+
+
+
+
+
+
+
+ What we’ve been up to +

Recent work

+
+
+ Customer Success strategy +

Implemented new Customer Success program for California Integrated Travel Project (Cal-ITP)

+
+
+ Benefits application +

+ Developed Cal-ITP Benefits, a digital tool allowing + transit riders to verify their eligibility for a reduced fare and attach the discount to their bank card, so they + automatically get their discount when tapping-to-pay. +

+
+
+ Open data standards +

+ Convened the Operational Data Standards (ODS) working group + and drafted ODS v1. Drafted the + Mobility Data Interoperability Principles (MDIP), a public sector-led coalition to build support for interoperable technology in the mobility industry. +

+
+
+
+ + Illustration of a bicycle + +
+
+
+ +
+
+
+
+
+
+
+
+
+
+
+
+ Our philosophy +
+
+

Empower government workers

+

+ Through service design, human-centered policy, and intentional technology choices, we make government services + equitable and accessible for all. +

+
+
+
    +
  • First and always inclusive
  • +
  • Be excellent to each other
  • +
  • Focus on frontline workers
  • +
  • Open and honest engagement
  • +
  • Public services built to last
  • +
+
+
+
+
+
+ +
+
+
+
+ Testimonial +
+
+

Compiler is a world-class team and an excellent choice for software development services.

+

+ —Jeremy Dalton, VP Mobility Xentrans and Technical Project Manager for Cal-ITP +

+
+
+
+
+
+
+
+
+
+
+
+ +
+
+
+ Who we are +

Meet the team

+ We’re a small team of remote workers who believe and advocate for better public services +
+
+
+
+
+ {% for member in team %} +
+
+ Watercolor illustration of {{member.name}} +
+

{{ member.name }}

+

{{ member.title }}

+
+ {% endfor %} +
+
+
+
+
+ + + +
+
+

+ Team illustrations by @worksofharte +

+
+
+
+ +
+
{% include 'ready-to-work', h3-class: 'text-dark' %}
+
+ + diff --git a/src/blog.html b/src/blog.liquid similarity index 51% rename from src/blog.html rename to src/blog.liquid index 430ff0b7..a7ba2e38 100644 --- a/src/blog.html +++ b/src/blog.liquid @@ -1,31 +1,33 @@ --- -layout: default description: An inside look at Compiler’s internal projects, interests and our client projects. title: Compiler’s Blog --- -
Blog

Our blog

- An inside look at Compiler’s internal projects, interests and our client projects. + An inside look at Compiler’s internal projects, interests and our client projects. A group photograph of many members of the Compiler team at a winery in California. + alt="A group photograph of many members of the Compiler team at a winery in California." + >
- {% for post in site.posts %} + {% for post in collections.posts reversed %} {% endfor %}
diff --git a/src/_drafts/2023-09-01-first-post.md b/src/blog/2023-09-01-first-post.md similarity index 74% rename from src/_drafts/2023-09-01-first-post.md rename to src/blog/2023-09-01-first-post.md index 6bd6cb66..e1ecbadd 100644 --- a/src/_drafts/2023-09-01-first-post.md +++ b/src/blog/2023-09-01-first-post.md @@ -1,15 +1,16 @@ --- -layout: blog_post title: "How to write a Compiler blog post" subtitle: "Follow these instructions to learn how to write a blog post, include images, blockquotes and more." description: "Follow these instructions to learn how to write a blog post, include images, blockquotes and more." author: Laney Mangan excerpt: "Learn how to write a blog post, include images, blockquotes and more." -date: 2023-09-24 19:03:13 +0200 +date: 2023-09-24T19:03:13+0200 categories: compiler +draft: true --- ## First thing’s first + ##### Let’s imagine you have a subheader paired with this section Before you start drafting your post, make sure you get your post filename and [front matter](https://jekyllrb.com/docs/front-matter/) together. @@ -39,17 +40,16 @@ categories: compiler You can copy and paste the code snippet above to the top of your post. You will have to change some of the values, and this table will show you what key/value pairs to change, and what to keep the same: -| Key | Value | notes | -| ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------- | -| `layout` | `blog_post` | required - do not change | -| `title` | Appears on post page. Come up with your own. | required | -| `subtitle` | Appears on post page. Come up with your own. | optional | -| `description` | Appears on social media, Slack link previews. | required -| `author` | Your Name | First and last name. Can include multiple people, like "Laney Mangan and Olivia Ramacier" | -| `excerpt` | Appears on main blog page. Come up with your own. | required | -| `date` | 2023-09-01 19:03:13 +0200 | if it’s in the future, it won’t be published | -| `categories` | compiler | required | - +| Key | Value | notes | +| ------------- | ------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| `layout` | `blog_post` | required - do not change | +| `title` | Appears on post page. Come up with your own. | required | +| `subtitle` | Appears on post page. Come up with your own. | optional | +| `description` | Appears on social media, Slack link previews. | required | +| `author` | Your Name | First and last name. Can include multiple people, like "Laney Mangan and Olivia Ramacier" | +| `excerpt` | Appears on main blog page. Come up with your own. | required | +| `date` | 2023-09-01 19:03:13 +0200 | if it’s in the future, it won’t be published | +| `categories` | compiler | required |

It can be difficult to write a succinct title and/or subtitle. Feel free to ask an editor for help. @@ -59,9 +59,10 @@ Once you’ve written the front matter, you’re ready to dive into the main par If this is your first time writing for the web, you will need to take a few minutes to familiarize yourself [Markdown syntax](https://www.markdownguide.org/basic-syntax/). Don’t worry - you do not need to memorize it or understand all of it. You only need what you will be using. -What writing in Markdown entails is writing a bit of code. Instead of using a graphical content editor like you are used to in Google Docs or your e-mail composer, you will have to write a bit of code to make a word **bold** (like this: `**bold**`) or *italics* (like this: `_italics_`). Developers tend to like writing in Markdown, because it allows people to write and format without having to use a mouse and click on icons. The resulting files tend to be easier to store and display on the web as well. +What writing in Markdown entails is writing a bit of code. Instead of using a graphical content editor like you are used to in Google Docs or your e-mail composer, you will have to write a bit of code to make a word **bold** (like this: `**bold**`) or _italics_ (like this: `_italics_`). Developers tend to like writing in Markdown, because it allows people to write and format without having to use a mouse and click on icons. The resulting files tend to be easier to store and display on the web as well. Here is a short but comprehensive list of the Markdown you may need for your post, aside from bolding and italicizing: + - **Section titles** - Using [the `##` syntax](https://www.markdownguide.org/basic-syntax/#headings). (It’s a good practice to always have at least 2.) - **Section sub-titles** - Using [the `###` syntax](https://www.markdownguide.org/basic-syntax/#headings). (It’s a good practice to always have at least 2. You cannot have a sub-title without a section title.) - **One blockquote** - Using [`>` syntax](https://www.markdownguide.org/basic-syntax/#blockquotes-1). diff --git a/src/_posts/2023-12-13-gift-guide.md b/src/blog/2023-12-13-gift-guide.md similarity index 98% rename from src/_posts/2023-12-13-gift-guide.md rename to src/blog/2023-12-13-gift-guide.md index b29cfc20..d3a64ea8 100644 --- a/src/_posts/2023-12-13-gift-guide.md +++ b/src/blog/2023-12-13-gift-guide.md @@ -1,18 +1,19 @@ --- -layout: blog_post title: "Compiler’s 2023 Holiday Gift Guide" subtitle: "Searching for that perfect gift for the public service enthusiast in your life? Compiler’s got you covered! Here is this year’s round-up of our favorite transit-related gift ideas.

P.S. If you didn’t make the holiday cut off this year, we think these make great gifts year-round!

" description: "Searching for that perfect gift for the public service enthusiast in your life? Compiler’s got you covered!" author: Compiler Staff excerpt: "Eight of our favorite transit-related goodies" -date: 2023-12-15 19:03:13 +0200 +date: 2023-12-15T19:03:13+0200 categories: - compiler --- ## [1. Light Rail Snow Globe Ornament](https://shop.metro.net/collections/holiday-shop/products/light-rail-snow-globe-ornaments) + Whoever says “I have enough ornaments, I don’t need any more” is lying! They’re lying. They want more. And they absolutely want one with an adorable little train chugging her way through a winter wonderland. (If they weren’t lying, and they don’t want this, please send it to us). +
## [2. NYC MTA Token T-shirt](https://onlyny.com/collections/tees/products/mta-token-t-shirt?variant=40202854039636) -For 3 years I lived down the block from the shop that sells these shirts, and I somehow never bought one. At the time I called it willpower but now I call it regret. * places order * + +For 3 years I lived down the block from the shop that sells these shirts, and I somehow never bought one. At the time I called it willpower but now I call it regret. _ places order _ +
## [3. Go Metro Map Mug](https://shop.metro.net/collections/best-sellers/products/go-metro-map-mug) + For the person in your life who can never seem to remember when to make their transfer. As for when new lines are added? Put it on eBay and call it “retro”. Then suggest your friend get a boring ol’ non-mug map. +
An image of a white mug with an illustration of a Los Angeles Metro light rail map.
An image of a white mug with an illustration of a Los Angeles Metro light rail map. Photograph courtesy of Metro.
## [4. The People’s Transit Poster](https://transit.supply/collections/prints/products/san-francisco-the-peoples-transit-print) + Growing up my grandma had a poster like this but instead of railcars, it was dogs. My cousins and I would play a game where we’d all pick out our favorite one (and then pretend we were those dogs - but let’s pretend I didn’t just tell you that). That game is so much harder with this poster. Which one is my favorite, you ask? 1887! No, 1939! No, 1969. It’s too hard!! Pop this baby in a frame and you’re guaranteed to win “best gift” at the SF white elephant party this year. +
An image of a poster with 16 railcars with the date they were made underneath and the text “The People's Transit”
An image of a poster with 16 railcars with the date they were made underneath and the text “The People's Transit”. Photograph courtesy of Transit Supply.
## [5. Public Transit is Bussin’ T-Shirt](https://www.raygunsite.com/products/public-transit-is-bussin) + For that teenager in your life who thinks taking the train is “high-key cheugy”. Maybe this will change their mind. They might not get the pun right away, but baby steps, amirite?? +
An image of a t-shirt that says “Public Transit is Bussin'”
An image of a t-shirt that says “Public Transit is Bussin'”. Photograph courtesy of Raygun.
## [6. NYC Parks T-shirt](https://onlyny.com/collections/tees/products/nyc-parks-logo-t-shirt-1?variant=40115599802452) + Not exactly transit-related but let’s face it, this shirt is just plain cute and that’s that. We love parks and that’s that. +
An image of a t-shirt with a maple leaf and the text “City of New York Parks & Recreation”
An image of a t-shirt with a maple leaf and the text “City of New York Parks & Recreation”. Photograph courtesy of OnlyNY.
## [7. Massachusetts Bay Transportation Authority Ring](https://www.etsy.com/listing/1084779169/massachusetts-bay-transportation?click_key=64ea237715a3dbd3437ea84b096768bbf6321f2c%3A1084779169&click_sum=ac5bc353&ref=user_profile&frs=1) + I suggest you wear one of these token rings and every time you fist bump someone make a loud beeping noise to let them know they can now board the train. No? Ok fine, but this is still an awesome ring that from a distance looks like a beautiful, vintage band but up close you realize is an absolute relic. +
An image of an MA transit token that has been made into a ring
An image of an MA transit token that has been made into a ring. Photograph courtesy of CoinRingandForgeCo via Etsy.
## [8. NYC Real-Time Subway Clock](https://www.etsy.com/listing/1290166234/nyc-realtime-subway-clock?click_key=b6b30f8f57cd4ba10f3bbc3ed29088e5aed6b156%3A1290166234&click_sum=98c95a73&ref=user_profile&frs=1&sts=1) + Idea: hang this in your living room and set it to all your friends' preferred lines to make sure your holiday party lasts until the last possible minute. Idea: hang this in your bedroom to ensure you get as many possible zzz’s before rolling out your door and down the subway stairs. Idea: hang this in your kitchen to give you peace of mind that you can enjoy your coffee without missing your train, or more realistically, so you can throw back your burning hot espresso when you look up and realize the L is 1 minute away. Idea: buy this. +
An image of a mahogany RealTime Subway Clock with LED screen displaying status of 2 subway lines
An image of a mahogany RealTime Subway Clock with LED screen displaying status of 2 subway lines. Photograph courtesy of NookWoodworking via Etsy.
diff --git a/src/_posts/2023-12-23-welcome.md b/src/blog/2023-12-23-welcome.md similarity index 75% rename from src/_posts/2023-12-23-welcome.md rename to src/blog/2023-12-23-welcome.md index 7d9c66b2..3c8672f7 100644 --- a/src/_posts/2023-12-23-welcome.md +++ b/src/blog/2023-12-23-welcome.md @@ -1,11 +1,10 @@ --- -layout: blog_post title: "Welcome to the Compiler blog!" subtitle: "What you can expect from our blog" description: "What you can expect from our blog" author: Angela Tran excerpt: "A quick introduction" -date: 2023-12-14 00:00:00 +0000 +date: 2023-12-14T00:00:00+0000 categories: - compiler --- @@ -16,5 +15,5 @@ In the near future, you’ll be seeing long- and short-form blog posts from us s
Photograph of the Compiler team on the 6th Street Bridge in Downtown Los Angeles during their May 2023 Retreat. -
{{ "The Compiler team on the 6th Street Bridge in Downtown Los Angeles during their May 2023 Retreat. Photograph by [Lex Ryan](https://www.lexryan.co/)" | markdownify }}
+
"The Compiler team on the 6th Street Bridge in Downtown Los Angeles during their May 2023 Retreat. Photograph by Lex Ryan
diff --git a/src/_posts/2024-01-24-devcontainer-platform-agnostic-team.md b/src/blog/2024-01-24-devcontainer-platform-agnostic-team.md similarity index 99% rename from src/_posts/2024-01-24-devcontainer-platform-agnostic-team.md rename to src/blog/2024-01-24-devcontainer-platform-agnostic-team.md index 9e2775b1..a4cc170f 100644 --- a/src/_posts/2024-01-24-devcontainer-platform-agnostic-team.md +++ b/src/blog/2024-01-24-devcontainer-platform-agnostic-team.md @@ -1,11 +1,10 @@ --- -layout: blog_post title: "How to support a platform-agnostic engineering team with VS Code Dev Containers" subtitle: "Learn from the Compiler Engineering team, which has been using VS Code Dev Containers daily across Windows, Linux and Mac on all of their projects." description: "Learn from the Compiler Engineering team, which has been using VS Code Dev Containers daily across Windows, Linux and Mac on all of their projects." author: Machiko Yasuda excerpt: "Learn from the Compiler Engineering team, which has been using VS Code Dev Containers daily across Windows, Linux and Mac on all of their projects." -date: 2024-01-24 00:00:00 +0200 +date: 2024-01-24T00:00:00+0200 categories: - compiler - engineering @@ -50,7 +49,6 @@ Although I was nervous about joining a team without other Mac engineers and usin For a more basic step-by-step tutorial, refer to the official [VS Code Dev Containers tutorial](https://code.visualstudio.com/docs/devcontainers/tutorial) and the official [development container spec](https://containers.dev/overview). For more technical detail on Compiler’s specific implementation of Dev Containers for the Benefits application, refer to the application documentation on [Docker dynamic ports](https://docs.calitp.org/benefits/development/docker-dynamic-ports/) and [working with Dev Containers](https://docs.calitp.org/benefits/development/). - ## Benefits of a platform-agnostic team The benefits of having all engineers running and writing code from the same containerized environment and using the same code editor are quite clear: Less configuration headache when one engineer’s local environment has a seemingly un-replicable bug. But as I learned as I kept working on the Compiler team, I could see even more benefits of having this kind of environment supporting a team that has engineers using all major operating platforms. diff --git a/src/_posts/2024-03-11-transportation-round-up.md b/src/blog/2024-03-11-transportation-round-up.md similarity index 96% rename from src/_posts/2024-03-11-transportation-round-up.md rename to src/blog/2024-03-11-transportation-round-up.md index 3b55bda3..3d52b0ff 100644 --- a/src/_posts/2024-03-11-transportation-round-up.md +++ b/src/blog/2024-03-11-transportation-round-up.md @@ -1,5 +1,4 @@ --- -layout: blog_post title: "The Compiler Team's Transportation Round-up" subtitle: "Our favorite transit stories from the past year" description: "Our favorite transit stories from the past year" @@ -17,13 +16,11 @@ people through their lives. So, like I said, we think public transportation is i frustrating, sometimes surprising, often exciting, and at times, an all-around adventure. So, we took some time to reflect on our most notable transit adventures from the past year. Read on for a few of the Compiler team's recent travel stories. - ## Watercolor illustration of Jessica Sullivan Jess I took my two COVID babies on public transit for the first time! We took a round-trip journey on the San Diego trolley to Old Town and enjoyed a really amazing sunset over Mission Bay on the way home. They thought it was the coolest "choo choo" in the world. - ## Watercolor illustration of Machiko Yasuda Machiko I love taking the Hollywood Bowl Park & Ride bus - I took it exactly four times last year during the summer Bowl season. @@ -41,11 +38,9 @@ They started phasing in new cars in 2018, and the primary line I ride has had a the last few years, so I never quite knew if I would be riding an old or new car until it showed up. I was very excited when the last new car was put into service. And it looks like BART managed to complete this project well under budget! Kudos to them! - ## Watercolor illustration of Shelby Miller Shelby -*Remember when we said public transportation can occasionally be frustrating–yeah. Transit fails are also worth reminiscing on.* - +_Remember when we said public transportation can occasionally be frustrating–yeah. Transit fails are also worth reminiscing on._ In July, I got on the wrong bus multiple times in LA, and once ended up in maybe Chinatown? I gave up and called a Lyft. I also, at one point, was on the phone with our colleague Kegan while literally running to catch the (wrong) DASH bus at the big train station. @@ -74,10 +69,11 @@ we converted the roomette from seats to a bed. His stroller just fit on the top ready for bedtime. ## Watercolor illustration of Vyki Englert Vyki -**Last but not least, welcome to *Vyki’s Taiwan Corner*** -*Vyki spent some time last year traveling through Taiwan by bike, train, and bus. She collected a list of her favorite aspects of -Taiwan transportation so that we can all be inspired.* +**Last but not least, welcome to _Vyki’s Taiwan Corner_** + +_Vyki spent some time last year traveling through Taiwan by bike, train, and bus. She collected a list of her favorite aspects of +Taiwan transportation so that we can all be inspired._ - The local and local express trains show which stops they will make on an LED signboard - Automatic Books Stop! Like a mini fully automated library vending machine in the transit station diff --git a/src/_posts/2024-03-22-Civic-Tech-Career-Resources.md b/src/blog/2024-03-22-Civic-Tech-Career-Resources.md similarity index 94% rename from src/_posts/2024-03-22-Civic-Tech-Career-Resources.md rename to src/blog/2024-03-22-Civic-Tech-Career-Resources.md index 31b53326..b22ec25c 100644 --- a/src/_posts/2024-03-22-Civic-Tech-Career-Resources.md +++ b/src/blog/2024-03-22-Civic-Tech-Career-Resources.md @@ -1,5 +1,4 @@ --- -layout: blog_post title: "Civic Tech Career Resources" subtitle: "Our most used resources for navigating a career in Civic Tech" description: "Our most used resources for navigating a career in Civic Tech" @@ -21,7 +20,8 @@ post. We hope to publish an updated version as part of each round of hiring. Below we’ve outlined some of our favorite agencies, companies, and resources to help you navigate a career in this nascent industry. -## Job Boards that lean toward civic tech ## +## Job Boards that lean toward civic tech + [LA2050.org/jobs](https://la2050.org/jobs): This job board is fantastic. It focuses on jobs in the greater Los Angeles region. [Tech Jobs for Good](https://techjobsforgood.com/): We’ve hired more than one candidate from this niche job board, it’s one of the only ones we currently pay to post on. You can also follow their account on [LinkedIn](https://www.linkedin.com/company/tech-jobs-for-good/). @@ -39,6 +39,7 @@ Below we’ve outlined some of our favorite agencies, companies, and resources t [WTS International Jobs Board](https://careers.wtsinternational.org/jobseekers/): Non-profit organization dedicated to advancing women in transportation. ## Apprenticeships + If you’re new to your career –especially if you’re a recent college or boot camp graduate– apprenticeship programs might be an excellent fit for you. Here are a few that we know of... @@ -51,11 +52,13 @@ camp graduate– apprenticeship programs might be an excellent fit for you. Here [Federal Transit Administration Diversity in Federal Transit Internship Program (DFT)](https://twc.edu/programs/FTA.DFT) ## Fellowships + We keep a running [list of fellowships that are offered within the civic tech](https://docs.google.com/spreadsheets/d/1VpYIEC7MhA_6VVORk5S9CDuccx_tEvFVefeDTilenXQ/edit#gid=0) -space. *Please note we only track the name and URL and some of these programs -may not be active.* +space. _Please note we only track the name and URL and some of these programs +may not be active._ ## For-profit Civic Tech Companies / Consultancies + [DataMade](https://datamade.us/): Chicago-based, lots of experience in working with criminal justice data and journalists. [Jemurai](https://jemurai.com/): A security firm with a delightful bunch of humans, in our experience. @@ -109,11 +112,11 @@ and human-centered design. The most famous of these is probably the federal team 18F, but states, counties, and cities are starting to launch their own. Below is a list of some of our favorites. -*Note: federal jobs you often have to put together a federal resume which can easily +_Note: federal jobs you often have to put together a federal resume which can easily run 20 pages and take you a few weeks to assemble; there are really great instructions on 18F’s website. If you’re interested, start working on that resume now -- when jobs get posted they are usually only open for a few days -and that’s not enough time for you to put your resume in the necessary format.* +and that’s not enough time for you to put your resume in the necessary format._ [18F](https://18f.gsa.gov/join/) @@ -139,7 +142,6 @@ and that’s not enough time for you to put your resume in the necessary format. [Colorado Digital Service](https://oit.colorado.gov/colorado-digital-service) - ## Canada Don’t forget to check out our friends up north! @@ -166,7 +168,8 @@ you submit your application or they will auto-reject your application. [State of CA: CalCareers](https://www.calcareers.ca.gov/): This site has so many jobs! You can create an account and get really specific email notifications sent to you when a position opens that you might be qualified for or within an agency you might be excited about working with. - - CalCareers is confusing to learn how to navigate – [ODI has a really good guide](https://innovation.ca.gov/join-us/applying-civil-service-job/ ) to the state application process. + +- CalCareers is confusing to learn how to navigate – [ODI has a really good guide](https://innovation.ca.gov/join-us/applying-civil-service-job/) to the state application process. [Government Jobs](https://www.governmentjobs.com/): Private syndicate of gov jobs. @@ -175,15 +178,16 @@ Private syndicate of gov jobs. Syndicate of most federal jobs. ## Public Transit Agencies + **US Department of Transportation**: This [USAjobs.gov link filters for jobs at DOT](https://dot.usajobs.gov/search/results/?d=TD&p=1) -**Federal Transit Administration** *(“FTA is one of 10 modal agencies of the US Department -of Transportation”)* +**Federal Transit Administration** _(“FTA is one of 10 modal agencies of the US Department +of Transportation”)_ + - Find jobs by searching USA Jobs - Sign up for email notifications via the [Transportation Diversity Council’s (TDC)](https://tdc-ntl.org/blog/category/job-postings/) website. - Check out the [FTA’s job website](https://www.transit.dot.gov/jobs) for more information on applying for jobs and links to early career programs - [FTA has several early career programs](https://www.transit.dot.gov/about/jobs/early-career-programs) - -***And, of course, [sign up for notifications to hear when Compiler is hiring again.](https://share.hsforms.com/1yPW2aSteQS6VTeGDEyFq9gqq0e7)*** +**_And, of course, [sign up for notifications to hear when Compiler is hiring again.](https://share.hsforms.com/1yPW2aSteQS6VTeGDEyFq9gqq0e7)_** diff --git a/src/_posts/2024-04-12-open-source-development.md b/src/blog/2024-04-12-open-source-development.md similarity index 99% rename from src/_posts/2024-04-12-open-source-development.md rename to src/blog/2024-04-12-open-source-development.md index 71084d31..04682aea 100644 --- a/src/_posts/2024-04-12-open-source-development.md +++ b/src/blog/2024-04-12-open-source-development.md @@ -1,11 +1,10 @@ --- -layout: blog_post title: "Driving Progress: The Crucial Role of Open Source in Public Transportation Technology" subtitle: description: "Learn from the Compiler Team about the benefits of open source development" author: Milo Green excerpt: "Learn from the Compiler Team about the benefits of open source" -date: 2024-04-12 00:00:00 +0200 +date: 2024-04-12T00:00:00+0200 categories: - compiler - engineering diff --git a/src/_posts/2024-05-17-Parental-Leave-Policy.md b/src/blog/2024-05-17-Parental-Leave-Policy.md similarity index 97% rename from src/_posts/2024-05-17-Parental-Leave-Policy.md rename to src/blog/2024-05-17-Parental-Leave-Policy.md index 5f6e83ea..5d9eba66 100644 --- a/src/_posts/2024-05-17-Parental-Leave-Policy.md +++ b/src/blog/2024-05-17-Parental-Leave-Policy.md @@ -1,11 +1,10 @@ --- -layout: blog_post title: "Creating Compiler's Parental Leave Policy" subtitle: "How a small, scrappy, California-based LLC created parental leave and wage replacement policies for its remote, multi-state team." description: "How a small, scrappy, California-based LLC created parental leave and wage replacement policies for its remote, multi-state team." author: Shelby Miller excerpt: "How a small, scrappy, California-based LLC created parental leave and wage replacement policies for its remote, multi-state team." -date: 2024-05-17 19:03:13 +0200 +date: 2024-05-17T19:03:13+0200 categories: - compiler --- @@ -21,7 +20,6 @@ The week before I started the job, I bewilderedly looked down at two lines on a
Photograph by CM Creative.
- Unsure if the pregnancy would last, I started the job and kept my pregnancy quiet. Weeks later, more confident that “yep, we’re having another baby,” I nervously told Vyki on a video call. Her response? “Whoa! You said you wanted another baby! Okay, your next major assignment is to write Compiler’s parental leave policy!” And thus began a two-year, eye-opening, mind-boggling, rewarding endeavor. Compiler is a California-based LLC. By the end of 2021, it was only 5 employees large, thus not making it a “covered employer” under FMLA, the federal Family Medical Leave Act that is commonly, and incorrectly, thought to be how parental leave is provided to Americans. First, FMLA provides job-protected, unpaid wages. Not receiving wages is unacceptable for most people, so FMLA isn’t a solution. Second, “employees are eligible for leave if they have worked for their employer for at least 12 months” – oops, not me! And third, employees “work at a location where the company employs 50 or more employees within 75 miles.” Again, Compiler had 5 employees in three states, so FMLA would not extend to our employees for multiple reasons. @@ -39,6 +37,7 @@ Fortunately, Compiler is a member of a PEO (professional employer organization). After reading multiple sample policies and language from SHRM, the PEO, and elsewhere, I took my favorite parts from each and patched them together to create Compiler’s first draft of a parental leave policy. Of highest importance was, and is: There be no tenure requirement; leave and wage replacement be available immediately to all full-time employees + - Offer the same parental leave benefits to everyone, regardless of where they live. Identify the state with the requirements friendliest to the employee, and apply them to all employees - Leave be at least 12 weeks long, the amount of time as the “fourth trimester” - Provide at least 50% of the employee’s regular wages during the course of the leave @@ -56,19 +55,17 @@ Compiler and I verbally agreed to the above parental leave scenario, and I went
Photograph provided by Shelby Miller.
- At this time, Compiler provided non-contributory (i.e. the company pays the premium) STDI to all employees. A reason for doing so was “this can help the birthing parent (and anyone else experiencing a short-term disability) with wage replacement in addition to what Compiler will pay as part of the parental leave because we know we can’t yet pay 100% of the employee’s wages.” All full-time employees receive non-contributory STDI and LTDI as soon as they’re hired – no tenure requirement. Do you see that’s a common theme for us? Waiting for benefits stinks. The patched-together first draft of the parental leave policy was dusted off, and Compiler’s fourth Managing Partner, Scott Frazier (also a parent!), joined the effort to finalize the policy. In March 2023, we accomplished two major milestones: 1) the draft was shared with Compiler’s employees, along with an invitation to review and provide input, and 2) the draft was sent to Compiler’s California-based attorneys for their feedback. Through the Spring and Summer, Scott and I traded emails and calls with the attorneys. They needed to know how many employees Compiler had in each state so they could determine which state requirements Compiler must legally abide by. It was determined that California’s policies were the most family- and employee-friendly and, therefore, all employees would receive those benefits. The way to do this was to create three separate policies, rather than one, so that Compiler’s policies mimicked the setup of California’s three policies (Pregnancy Disability Leave, California Family Rights Act, and Disability Insurance and/or Paid Family Leave). - ->Compiler’s three policies are: ->- Pregnancy Disability Leave and Accommodation ->- Parental Leave (AKA Baby Bonding Leave) ->- Wage Replacement During Pregnancy Disability Leave and/or Parental Bonding Leave (AKA Wage Replacement) - +> Compiler’s three policies are: +> +> - Pregnancy Disability Leave and Accommodation +> - Parental Leave (AKA Baby Bonding Leave) +> - Wage Replacement During Pregnancy Disability Leave and/or Parental Bonding Leave (AKA Wage Replacement) The three-policy approach was unexpected and unlike the sample policies I read and the drafts proposed. But in speaking with our attorneys, I began to understand the reasoning. The three policies complement one another, and when either of Compiler’s Leave policies are utilized by an employee, the Wage Replacement automatically kicks in. diff --git a/src/_posts/2024-06-14-Tales-From-TCamp.md b/src/blog/2024-06-14-Tales-From-TCamp.md similarity index 97% rename from src/_posts/2024-06-14-Tales-From-TCamp.md rename to src/blog/2024-06-14-Tales-From-TCamp.md index d33b4301..b0d76cc8 100644 --- a/src/_posts/2024-06-14-Tales-From-TCamp.md +++ b/src/blog/2024-06-14-Tales-From-TCamp.md @@ -1,11 +1,10 @@ --- -layout: blog_post title: "Tales from Transportation Camp" subtitle: "The Compiler Team's key takeaways from UCLA's 2024 Transportation Camp LA." description: "The Compiler Team's key takeaways from UCLA's 2024 Transportation Camp LA." author: Vyki Englert, Scott Frazier, Nina Dinh, Marie Araneta excerpt: "The Compiler Team's key takeaways from UCLA's 2024 Transportation Camp LA." -date: 2024-06-13 19:03:13 +0200 +date: 2024-06-13T19:03:13+0200 categories: - compiler --- @@ -22,10 +21,11 @@ I was enticed by the title alone because I have always sensed there was a need f I hoped to hear ideas from others and I certainly did! Two that really aligned with me: + - Data on the walkability of the area. I like seeing how long the walk will take me from point A to B, but the experience of that walk varies greatly depending on how -maintained the sidewalk is, if cars are going at high speeds next to me, or if the lighting is poor. + maintained the sidewalk is, if cars are going at high speeds next to me, or if the lighting is poor. - Better detouring capability; apps like Google and Transit have a hard time accounting for detours. If I hop off the rail, it tends to assume I want to walk the rest of -the way even though that may not be the most efficient route. + the way even though that may not be the most efficient route. I enjoyed hearing about Metro’s goal to consolidate their apps, and this session was a way to brainstorm. It was cool meeting the folks creating Catenary maps as well! @@ -62,6 +62,7 @@ We started with the assumption that TDM is good and that one of the best example Santa Monica’s program gives employers and developers an outcome-based goal for reducing single-occupancy vehicles. Together we workshopped: + - Challenges: this is really wonky, how do you get folks excited about it? - Strategy + Tactics: tie TDM to a successful car-free Olympics, find new champions for TDM on the City Council who can get it agendized - Potential allies: Move LA, Parking Reform Network, Investing in Place, LA28 diff --git a/src/_posts/2024-09-20-employee-spotlight-angela.md b/src/blog/2024-09-20-employee-spotlight-angela.md similarity index 99% rename from src/_posts/2024-09-20-employee-spotlight-angela.md rename to src/blog/2024-09-20-employee-spotlight-angela.md index 48471724..7538debe 100644 --- a/src/_posts/2024-09-20-employee-spotlight-angela.md +++ b/src/blog/2024-09-20-employee-spotlight-angela.md @@ -1,11 +1,10 @@ --- -layout: blog_post title: "Employee Spotlight: Angela" subtitle: "Get to know our Compiler team member, Angela Tran." description: "Get to know our Compiler team member, Angela Tran." author: Laney Mangan and Angela Tran excerpt: "Get to know our Compiler team member, Angela Tran." -date: 2024-12-20 00:00:00 +0000 +date: 2024-12-20T00:00:00+0000 categories: - compiler --- diff --git a/src/_posts/2024-11-01-static-sites-at-compiler.md b/src/blog/2024-11-01-static-sites-at-compiler.md similarity index 99% rename from src/_posts/2024-11-01-static-sites-at-compiler.md rename to src/blog/2024-11-01-static-sites-at-compiler.md index dd13e21b..786cc912 100644 --- a/src/_posts/2024-11-01-static-sites-at-compiler.md +++ b/src/blog/2024-11-01-static-sites-at-compiler.md @@ -1,11 +1,10 @@ --- -layout: blog_post title: "How Compiler Approaches Static Sites" subtitle: "Learn how the Engineering team combines older and reliable static site frameworks with new build tools and an open source approach to craft memorable and functional content-driven sites." description: "Learn how the Engineering team combines older and reliable static site frameworks with new build tools and an open source approach to craft memorable and functional content-driven sites." author: Machiko Yasuda excerpt: "Learn how the Engineering team combines older and reliable static site frameworks with new build tools and an open source approach to craft memorable and functional content-driven sites." -date: 2024-12-3 00:00:00 +0200 +date: 2024-12-03T00:00:00+0200 categories: - compiler - engineering diff --git a/src/_posts/2025-08-08-employee-spotlight-adam.md b/src/blog/2025-08-08-employee-spotlight-adam.md similarity index 99% rename from src/_posts/2025-08-08-employee-spotlight-adam.md rename to src/blog/2025-08-08-employee-spotlight-adam.md index 02e7a845..25f2c7c5 100644 --- a/src/_posts/2025-08-08-employee-spotlight-adam.md +++ b/src/blog/2025-08-08-employee-spotlight-adam.md @@ -1,11 +1,10 @@ --- -layout: blog_post title: "Employee Spotlight: Adam" subtitle: "Get to know our Compiler team member, Adam Linder." description: "Get to know our Compiler team member, Adam Linder." author: Laney Mangan and Adam Linder excerpt: "Get to know our Compiler team member, Adam Linder." -date: 2025-08-08 00:00:00 +0000 +date: 2025-08-08T00:00:00+0000 categories: - compiler --- diff --git a/src/_posts/2025-12-12-case-study-cdt.md b/src/blog/2025-12-12-case-study-cdt.md similarity index 99% rename from src/_posts/2025-12-12-case-study-cdt.md rename to src/blog/2025-12-12-case-study-cdt.md index ae2d4fbe..7d1c6d08 100644 --- a/src/_posts/2025-12-12-case-study-cdt.md +++ b/src/blog/2025-12-12-case-study-cdt.md @@ -1,11 +1,10 @@ --- -layout: blog_post title: "Case Study: Strengthening California’s Digital Disaster Recovery" subtitle: "Supporting the California Department of Technology During the 2025 Wildfire Emergency" description: "Supporting the California Department of Technology During the 2025 Wildfire Emergency" author: Milo Green excerpt: "Supporting the California Department of Technology During the 2025 Wildfire Emergency" -date: 2025-12-15 00:00:00 +0000 +date: 2025-12-15T00:00:00+0000 categories: - compiler --- diff --git a/src/_posts/2026-04-03-remix-case-study.md b/src/blog/2026-04-03-remix-case-study.md similarity index 99% rename from src/_posts/2026-04-03-remix-case-study.md rename to src/blog/2026-04-03-remix-case-study.md index df1405bb..4941c134 100644 --- a/src/_posts/2026-04-03-remix-case-study.md +++ b/src/blog/2026-04-03-remix-case-study.md @@ -1,11 +1,10 @@ --- -layout: blog_post title: "How Compiler Research Transformed Scheduling for Smaller Transit Agencies" subtitle: "Learn how Compiler transformed smaller transit agency scheduling with a research-backed pilot of Remix by Via." description: "Learn how Compiler transformed smaller transit agency scheduling with a research-backed pilot of Remix by Via." author: Laney Mangan excerpt: "Learn how Compiler transformed smaller transit agency scheduling with a research-backed pilot of Remix by Via." -date: 2026-04-03 00:00:00 +0000 +date: 2026-04-03T00:00:00+0000 categories: - compiler --- diff --git a/src/_posts/2026-04-30-content-localization.md b/src/blog/2026-04-30-content-localization.md similarity index 99% rename from src/_posts/2026-04-30-content-localization.md rename to src/blog/2026-04-30-content-localization.md index 1507d0dc..f65bc1c6 100644 --- a/src/_posts/2026-04-30-content-localization.md +++ b/src/blog/2026-04-30-content-localization.md @@ -5,7 +5,7 @@ subtitle: "Translation alone isn’t enough–discover how Compiler bridges the description: "Translation alone isn’t enough–discover how Compiler bridges the gap between translated and truly usable content with localization that reflects the reality of what people need." author: Vyki Englert excerpt: "Translation alone isn’t enough–discover how Compiler bridges the gap between translated and truly usable content with localization that reflects the reality of what people need." -date: 2026-05-29 00:00:00 +0000 +date: 2026-05-29T00:00:00+0000 categories: - compiler --- diff --git a/src/blog/blog.11tydata.js b/src/blog/blog.11tydata.js new file mode 100644 index 00000000..6193000f --- /dev/null +++ b/src/blog/blog.11tydata.js @@ -0,0 +1,8 @@ +// /blog/:year/:slug/ +const permalink = ({ page: { date, fileSlug } }) => `/blog/${date.getFullYear()}/${fileSlug}/`; + +export default { + layout: "blog_post", + permalink, + tags: ["posts"], +}; diff --git a/src/capabilities.html b/src/capabilities.html deleted file mode 100644 index 86f801dd..00000000 --- a/src/capabilities.html +++ /dev/null @@ -1,4 +0,0 @@ ---- -layout: redirected -redirect_to: /assets/Compiler-Capabilities-Statement.pdf ---- diff --git a/src/index.html b/src/index.html index fbbc40fb..0a4548f0 100644 --- a/src/index.html +++ b/src/index.html @@ -1,19 +1,17 @@ ---- -layout: default -description: We build open-source, human-centered, secure, agile solutions to support the delivery of government services that increase equity of opportunity. ---- -
-
-
- -

Software built by humans, for humans, in LA

-
-
-

Compiler is a woman-owned software consultancy that’s passionate about making government tech solutions easy-to-use and accessible for all

- -
+
+
+ +

Software built by humans, for humans, in LA

+
+

+ Compiler is a woman-owned software consultancy that’s passionate about making government tech solutions easy-to-use and + accessible for all +

+ +
+
diff --git a/src/jobs.11tydata.js b/src/jobs.11tydata.js new file mode 100644 index 00000000..d6e5d249 --- /dev/null +++ b/src/jobs.11tydata.js @@ -0,0 +1,10 @@ +export default { + eleventyComputed: { + // Return a simplified version of the collection + jobs: (data) => + data.collections.jobs.map((item) => { + const { title, type, open_date, close_date } = item.data; + return { title, type, open_date, close_date, url: item.url }; + }), + }, +}; diff --git a/src/jobs.html b/src/jobs.html deleted file mode 100644 index a9d87551..00000000 --- a/src/jobs.html +++ /dev/null @@ -1,78 +0,0 @@ ---- -layout: default -title: Jobs with Compiler ---- - -
-
- Careers -

Compiler is a woman-owned software consultancy that’s passionate about making government tech solutions - accessible for all.

- -

Open roles

-
    - -

    Past roles

    -
      - -

      - Missed a past opportunity? Subscribe to our mailing list, as we - are always looking for great candidates. -

      -
      -
      - - - diff --git a/src/jobs.liquid b/src/jobs.liquid new file mode 100644 index 00000000..31a3b582 --- /dev/null +++ b/src/jobs.liquid @@ -0,0 +1,79 @@ +--- +title: Jobs with Compiler +--- +
      +
      + Careers +

      + Compiler is a woman-owned software consultancy that’s passionate about making government tech solutions accessible for all. +

      + +

      Open roles

      +
        + +

        Past roles

        +
          + +

          + Missed a past opportunity? Subscribe to our mailing + list, as we are always looking for great candidates. +

          +
          +
          + + + diff --git a/src/_jobs/associate-consultant-scheduling-coordinator.md b/src/jobs/associate-consultant-scheduling-coordinator.md similarity index 99% rename from src/_jobs/associate-consultant-scheduling-coordinator.md rename to src/jobs/associate-consultant-scheduling-coordinator.md index 56131ce6..ea2930fc 100644 --- a/src/_jobs/associate-consultant-scheduling-coordinator.md +++ b/src/jobs/associate-consultant-scheduling-coordinator.md @@ -1,5 +1,4 @@ --- -layout: job_post title: Associate Consultant, Scheduling Coordinator open_date: 2022-05-01 close_date: 2022-05-13 diff --git a/src/_jobs/creative-project-manager.md b/src/jobs/creative-project-manager.md similarity index 99% rename from src/_jobs/creative-project-manager.md rename to src/jobs/creative-project-manager.md index 40a0c565..f6a14d46 100644 --- a/src/_jobs/creative-project-manager.md +++ b/src/jobs/creative-project-manager.md @@ -1,5 +1,4 @@ --- -layout: job_post title: Consultant, Creative Services Project Manager open_date: 2021-05-01 close_date: 2021-05-15 diff --git a/src/_jobs/customer-success-account-manager.md b/src/jobs/customer-success-account-manager.md similarity index 99% rename from src/_jobs/customer-success-account-manager.md rename to src/jobs/customer-success-account-manager.md index ed62cad8..1077e9f4 100644 --- a/src/_jobs/customer-success-account-manager.md +++ b/src/jobs/customer-success-account-manager.md @@ -1,5 +1,4 @@ --- -layout: job_post title: Associate Consultant, Customer Success Account Manager open_date: 2024-01-24 close_date: 2024-02-07 diff --git a/src/_jobs/executive-assistant.md b/src/jobs/executive-assistant.md similarity index 99% rename from src/_jobs/executive-assistant.md rename to src/jobs/executive-assistant.md index eb83e22a..fa0f54cc 100644 --- a/src/_jobs/executive-assistant.md +++ b/src/jobs/executive-assistant.md @@ -1,5 +1,4 @@ --- -layout: job_post title: Executive Assistant Business Development open_date: 2022-12-02 close_date: 2023-01-17 diff --git a/src/_jobs/illustrator.md b/src/jobs/illustrator.md similarity index 99% rename from src/_jobs/illustrator.md rename to src/jobs/illustrator.md index b79f71cf..4634320e 100644 --- a/src/_jobs/illustrator.md +++ b/src/jobs/illustrator.md @@ -1,5 +1,4 @@ --- -layout: job_post title: Illustrator open_date: 2025-11-06 close_date: 2025-11-13 diff --git a/src/jobs/jobs.json b/src/jobs/jobs.json new file mode 100644 index 00000000..acdee779 --- /dev/null +++ b/src/jobs/jobs.json @@ -0,0 +1,4 @@ +{ + "layout": "job_post", + "title_prefix": "Jobs with Compiler: " +} diff --git a/src/_jobs/product-manager.md b/src/jobs/product-manager.md similarity index 99% rename from src/_jobs/product-manager.md rename to src/jobs/product-manager.md index 3673beda..bab67e61 100644 --- a/src/_jobs/product-manager.md +++ b/src/jobs/product-manager.md @@ -1,5 +1,4 @@ --- -layout: job_post title: Senior Consultant, Product Manager open_date: 2023-02-27 close_date: 2023-03-12 diff --git a/src/_jobs/project-manager.md b/src/jobs/project-manager.md similarity index 94% rename from src/_jobs/project-manager.md rename to src/jobs/project-manager.md index b93e318a..f8d78c23 100644 --- a/src/_jobs/project-manager.md +++ b/src/jobs/project-manager.md @@ -1,5 +1,4 @@ --- -layout: job_post title: Project Manager open_date: 2024-07-11 close_date: 2024-07-23 @@ -13,8 +12,7 @@ Our team specializes in building software applications around data for operation Our clients have included: City of Los Angeles, City of West Hollywood, CicLAvia, LA2050, Caltrans, County of Los Angeles, and the California Community Foundation. -**About PeMS:** The Caltrans Performance Measurement System (PeMS) application is a [multi-tier web application](https://pems.dot.ca.gov){:target="\_blank"} -that runs on a real-time transportation data warehouse. The traffic data displayed on the map is collected in real-time from over 39,000 individual detectors. These sensors span the freeway system across all major metropolitan areas of the State of California. PeMS is also an Archived Data User Service (ADUS) that provides over ten years of data for historical analysis. It integrates a wide variety of information from Caltrans and other local agency systems. +**About PeMS:** The Caltrans Performance Measurement System (PeMS) application is a [multi-tier web application](https://pems.dot.ca.gov) that runs on a real-time transportation data warehouse. The traffic data displayed on the map is collected in real-time from over 39,000 individual detectors. These sensors span the freeway system across all major metropolitan areas of the State of California. PeMS is also an Archived Data User Service (ADUS) that provides over ten years of data for historical analysis. It integrates a wide variety of information from Caltrans and other local agency systems. Compiler is expected to design, develop, and deploy upgraded functions to the PeMS web application. Upon project completion, Compiler is expected to hand over all source code with documentation to Caltrans. diff --git a/src/_jobs/software-engineer.md b/src/jobs/software-engineer.md similarity index 99% rename from src/_jobs/software-engineer.md rename to src/jobs/software-engineer.md index 1e4fe385..a044ba01 100644 --- a/src/_jobs/software-engineer.md +++ b/src/jobs/software-engineer.md @@ -1,5 +1,4 @@ --- -layout: job_post title: Senior Software Engineer open_date: 2025-06-17 close_date: 2025-06-30 diff --git a/src/_jobs/ux-ui-designer-researcher.md b/src/jobs/ux-ui-designer-researcher.md similarity index 99% rename from src/_jobs/ux-ui-designer-researcher.md rename to src/jobs/ux-ui-designer-researcher.md index f1cfaf21..4423409e 100644 --- a/src/_jobs/ux-ui-designer-researcher.md +++ b/src/jobs/ux-ui-designer-researcher.md @@ -1,5 +1,4 @@ --- -layout: job_post title: Senior Consultant, UX/UI Designer and Researcher open_date: 2024-04-03 close_date: 2024-04-12 diff --git a/src/_jobs/ux-ui-designer.md b/src/jobs/ux-ui-designer.md similarity index 99% rename from src/_jobs/ux-ui-designer.md rename to src/jobs/ux-ui-designer.md index dd64837e..69f4970b 100644 --- a/src/_jobs/ux-ui-designer.md +++ b/src/jobs/ux-ui-designer.md @@ -1,5 +1,4 @@ --- -layout: job_post title: Senior UX/UI Designer open_date: 2025-07-01 close_date: 2025-07-14 diff --git a/src/our-work.html b/src/our-work.liquid similarity index 79% rename from src/our-work.html rename to src/our-work.liquid index 5a4abc59..3898048a 100644 --- a/src/our-work.html +++ b/src/our-work.liquid @@ -1,8 +1,6 @@ --- -layout: default title: Our Work --- -
          @@ -16,19 +14,21 @@

          Building solutions that empower government services

          Capabilities Statement + href="/capabilities" + >Capabilities Statement
          -
          -
          -
          -
          -
          -
          -
          +
          +
          +
          +
          +
          +
          +
          @@ -38,7 +38,7 @@

          Our services

          - {% for service in site.data.services %} + {% for service in services %}

          @@ -55,7 +56,8 @@

          id="collapse-{{ service.id }}" class="accordion-collapse collapse" aria-labelledby="our-services-{{ service.id }}" - data-bs-parent="#our-services-accordion"> + data-bs-parent="#our-services-accordion" + >
          {{ service.description }}

          @@ -68,17 +70,17 @@

          - +
          -
          -
          -
          -
          -
          -
          -
          +
          +
          +
          +
          +
          +
          +

          @@ -95,29 +97,29 @@

          Featured work

          - {% for featured_work in site.data.featured_work limit: 2 %} + {% for work in featured_work limit: 2 %}
          - {% if featured_work.tags %} + {% if work.tags %}
          - {% for tag in featured_work.tags %} + {% for tag in work.tags %}
          {% endfor %}
          {% endif %} -

          {{ featured_work.title }}

          +

          {{ work.title }}

          -

          {{ featured_work.description }}

          +

          {{ work.description }}

          Outcome

          -

          {{ featured_work.outcome }}

          +

          {{ work.outcome }}

          @@ -126,34 +128,35 @@

          Outcome

          - {% for featured_work in site.data.featured_work limit: 2 offset: 2 %} + {% for work in featured_work limit: 2 offset: 2 %} {% if forloop.index0 == 0 %} - {% assign class = "col" %} + {% assign class = 'col' %} {% else %} - {% assign class = "col collapseMore collapse" %} + {% assign class = 'col collapseMore collapse' %} {% endif %}
          {{ featured_work.image_alt_text }} + alt="{{ work.image_alt_text }}" + >
          - {% if featured_work.tags %} + {% if work.tags %}
          - {% for tag in featured_work.tags %} + {% for tag in work.tags %}
          {% endfor %}
          {% endif %} -

          {{ featured_work.title }}

          -

          {{ featured_work.description }}

          +

          {{ work.title }}

          +

          {{ work.description }}

          Outcome

          -

          {{ featured_work.outcome }}

          +

          {{ work.outcome }}

          @@ -161,29 +164,29 @@

          Outcome

          - {% for featured_work in site.data.featured_work limit: 2 offset: 4 %} + {% for work in featured_work limit: 2 offset: 4 %}
          - {% if featured_work.tags %} + {% if work.tags %}
          - {% for tag in featured_work.tags %} + {% for tag in work.tags %}
          {% endfor %}
          {% endif %} -

          {{ featured_work.title }}

          +

          {{ work.title }}

          -

          {{ featured_work.description }}

          +

          {{ work.description }}

          Outcome

          -

          {{ featured_work.outcome }}

          +

          {{ work.outcome }}

          @@ -200,7 +203,8 @@

          Outcome

          role="button" aria-expanded="false" aria-label="Toggle projects" - aria-controls="collapseMore"> + aria-controls="collapseMore" + >
          @@ -225,13 +229,13 @@

          -
          -
          -
          -
          -
          -
          -
          +
          +
          +
          +
          +
          +
          +
          -
          {% include ready-to-work.html %}
          +
          {% include 'ready-to-work' %}
          diff --git a/src/retreat.html b/src/retreat.html deleted file mode 100644 index dfae6451..00000000 --- a/src/retreat.html +++ /dev/null @@ -1,4 +0,0 @@ ---- -layout: redirected -redirect_to: https://app.clickup.com/8631512/v/dc/87d6r-2241/87d6r-63214 ---- diff --git a/src/src.11tydata.json b/src/src.11tydata.json new file mode 100644 index 00000000..e4fabd73 --- /dev/null +++ b/src/src.11tydata.json @@ -0,0 +1,5 @@ +{ + "description": "We build open-source, human-centered, secure, agile solutions to support the delivery of government services that increase equity of opportunity.", + "layout": "default", + "title": "Compiler" +} diff --git a/src/styles/base.css b/src/styles/base.css index 20bb97d2..f4092d85 100644 --- a/src/styles/base.css +++ b/src/styles/base.css @@ -1,108 +1,111 @@ @import url("./nav.css"); :root { - --white: #FFFFFF; - --text-black: #1C1C1C; - --text-grey: #BEBEBE; - --brand-primary-green: #88B440; - --brand-primary-black: #1C1C1C; - --brand-primary-cyan: #51B1C7; - --brand-scale-gray-2: #BBBBBB; - --brand-scale-gray-3: #878787; - --brand-scale-gray-4: #545454; - --brand-scale-green-1: #E7F0D9; - --bs-primary: #88B440; /* Use with .text-primary */ - --bs-primary-rgb: 136, 180, 64; - --bs-secondary: #51B1C7; /* Use with .text-secondary */ - --bs-secondary-rgb: 81, 177, 199; - --bs-info: #BEBEBE; /* Use with .text-info */ - --bs-info-rgb: 190,190,190; - --bs-success: #DCEFF4; /* Use with .bg-success */ - --bs-success-rgb: 220, 239, 244; - --bs-light: #545454; /* Use with .border-light above Footer - /brand/scales/gray/4 */ - --bs-light-rgb: 84, 84, 84; - --bs-dark: #1C1C1C; /* Use with .border-dark for About */ - --bs-dark-rgb: 28, 28, 28; - --bs-font-sans-serif: "Roboto", system-ui,-apple-system,"Segoe UI","Helvetica Neue","Noto Sans","Liberation Sans",Arial,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji"; - --bs-font-monospace: "Source Code Pro",monospace; - --focus-box-shadow: 0 0 0 calc(2.5rem / 16) var(--brand-primary-black), 0 0 0 calc(4rem / 16) var(--brand-primary-green); - --bs-border-radius: calc(14rem / 16); /* For team illos */ + --white: #ffffff; + --text-black: #1c1c1c; + --text-grey: #bebebe; + --brand-primary-green: #88b440; + --brand-primary-black: #1c1c1c; + --brand-primary-cyan: #51b1c7; + --brand-scale-gray-2: #bbbbbb; + --brand-scale-gray-3: #878787; + --brand-scale-gray-4: #545454; + --brand-scale-green-1: #e7f0d9; + --bs-primary: #88b440; /* Use with .text-primary */ + --bs-primary-rgb: 136, 180, 64; + --bs-secondary: #51b1c7; /* Use with .text-secondary */ + --bs-secondary-rgb: 81, 177, 199; + --bs-info: #bebebe; /* Use with .text-info */ + --bs-info-rgb: 190, 190, 190; + --bs-success: #dceff4; /* Use with .bg-success */ + --bs-success-rgb: 220, 239, 244; + --bs-light: #545454; /* Use with .border-light above Footer - /brand/scales/gray/4 */ + --bs-light-rgb: 84, 84, 84; + --bs-dark: #1c1c1c; /* Use with .border-dark for About */ + --bs-dark-rgb: 28, 28, 28; + --bs-font-sans-serif: + "Roboto", system-ui, -apple-system, "Segoe UI", "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, + "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + --bs-font-monospace: "Source Code Pro", monospace; + --focus-box-shadow: 0 0 0 calc(2.5rem / 16) var(--brand-primary-black), 0 0 0 calc(4rem / 16) var(--brand-primary-green); + --bs-border-radius: calc(14rem / 16); /* For team illos */ } body { - background-color: var(--brand-primary-black); - color: var(--white); - font-family: var(--bs-font-sans-serif); - font-weight: 400; + background-color: var(--brand-primary-black); + color: var(--white); + font-family: var(--bs-font-sans-serif); + font-weight: 400; } .container-fluid { - --bs-gutter-x: 2rem; /* 32px total gutters, 16px on each side */ + --bs-gutter-x: 2rem; /* 32px total gutters, 16px on each side */ } @media (min-width: 992px) { - .container-fluid { - --bs-gutter-x: 3rem; /* 48px total gutters, 24px on each side */ - } + .container-fluid { + --bs-gutter-x: 3rem; /* 48px total gutters, 24px on each side */ + } } @media (min-width: 1920px) { - .container-fluid { - max-width: 1320px; - } + .container-fluid { + max-width: 1320px; + } } :root { - --main-container-first-row-vertical-margin: 104px; + --main-container-first-row-vertical-margin: 104px; } @media (min-width: 992px) { - :root { - --main-container-first-row-vertical-margin: 114px; - } + :root { + --main-container-first-row-vertical-margin: 114px; + } } main.container-fluid > .row:first-child { - margin: var(--main-container-first-row-vertical-margin) 0; + margin: var(--main-container-first-row-vertical-margin) 0; } p, li { - line-height: 140%; + line-height: 140%; } a { - color: var(--brand-primary-green); - text-decoration: underline; - transition: 250ms; - font-weight: 500; + color: var(--brand-primary-green); + text-decoration: underline; + transition: 250ms; + font-weight: 500; } a:hover:not(.btn) { - color: var(--brand-primary-green); - text-decoration: none; + color: var(--brand-primary-green); + text-decoration: none; } a:focus:not(.btn) { - outline: none; - text-decoration: none; - box-shadow: var(--focus-box-shadow); + outline: none; + text-decoration: none; + box-shadow: var(--focus-box-shadow); } .bg-white a { - color: var(--brand-primary-black); + color: var(--brand-primary-black); } .bg-white a:hover:not(.btn) { - color: var(--brand-primary-black); + color: var(--brand-primary-black); } .bg-white a:focus:not(.btn) { - outline: none; - box-shadow: 0 0 0 calc(2.5rem / 16) var(--white), 0 0 0 calc(4rem / 16) var(--brand-primary-black); + outline: none; + box-shadow: + 0 0 0 calc(2.5rem / 16) var(--white), + 0 0 0 calc(4rem / 16) var(--brand-primary-black); } - /*#region Font Family */ .font-monospace, @@ -115,12 +118,12 @@ h3, .h3, h4, .h4 { - font-family: var(--bs-font-monospace); - letter-spacing: 0; + font-family: var(--bs-font-monospace); + letter-spacing: 0; } .sans-serif { - font-family: var(--bs-font-sans-serif); + font-family: var(--bs-font-sans-serif); } /*#endregion */ @@ -128,94 +131,93 @@ h4, /* Headlines + Non-headline type */ :root { - --h1-font-size: calc(40rem / 16); - --h1-line-height: 120%; - --h2-font-size: calc(32rem / 16); - --h3-font-size: calc(24rem / 16); - --h-sm-font-size: calc(20rem / 16); - --h-sm-font-weight: 700; - --h-sm-line-height: 130%; - --xs-line-height: 140%; - --blockquote-font-size: calc(18rem / 16); - --blockquote-line-height: 120%; - --blockquote-margin: calc(40rem / 16); + --h1-font-size: calc(40rem / 16); + --h1-line-height: 120%; + --h2-font-size: calc(32rem / 16); + --h3-font-size: calc(24rem / 16); + --h-sm-font-size: calc(20rem / 16); + --h-sm-font-weight: 700; + --h-sm-line-height: 130%; + --xs-line-height: 140%; + --blockquote-font-size: calc(18rem / 16); + --blockquote-line-height: 120%; + --blockquote-margin: calc(40rem / 16); } @media (min-width: 992px) { - :root { - --h1-font-size: calc(48rem / 16); - --h2-font-size: calc(40rem / 16); - --h3-font-size: calc(32rem / 16); - --h-sm-font-size: calc(24rem / 16); - --h-sm-font-weight: 800; - --h-sm-line-height: 120%; - --xs-line-height: 130%; - --blockquote-font-size: calc(20rem / 16); - --blockquote-line-height: 140%; - --blockquote-margin: calc(56rem / 16); - } + :root { + --h1-font-size: calc(48rem / 16); + --h2-font-size: calc(40rem / 16); + --h3-font-size: calc(32rem / 16); + --h-sm-font-size: calc(24rem / 16); + --h-sm-font-weight: 800; + --h-sm-line-height: 120%; + --xs-line-height: 130%; + --blockquote-font-size: calc(20rem / 16); + --blockquote-line-height: 140%; + --blockquote-margin: calc(56rem / 16); + } } - h1 { - font-size: var(--h1-font-size); - font-weight: 700; - line-height: var(--h1-line-height); - letter-spacing: 0; - margin: 0; + font-size: var(--h1-font-size); + font-weight: 700; + line-height: var(--h1-line-height); + letter-spacing: 0; + margin: 0; } h2, .h2 { - font-size: var(--h2-font-size); - font-weight: 700; - line-height: 120%; - margin: 0; + font-size: var(--h2-font-size); + font-weight: 700; + line-height: 120%; + margin: 0; } h3, .h3, .posting h2, .blog_post h2 { - font-size: var(--h3-font-size); - font-weight: 700; - line-height: 120%; - margin-top: calc(40rem / 16); - margin-bottom: 1rem; + font-size: var(--h3-font-size); + font-weight: 700; + line-height: 120%; + margin-top: calc(40rem / 16); + margin-bottom: 1rem; } h4, .h4 { - font-size: 1rem !important; - font-weight: 600; - line-height: 130%; + font-size: 1rem !important; + font-weight: 600; + line-height: 130%; } .h-sm { - font-size: var(--h-sm-font-size); - font-weight: var(--h-sm-font-weight); - line-height: var(--h-sm-line-height); + font-size: var(--h-sm-font-size); + font-weight: var(--h-sm-font-weight); + line-height: var(--h-sm-line-height); } .secondary-sans-serif-xs { - font-family: var(--bs-font-sans-serif); - font-size: 1rem; - font-style: normal; - font-weight: 500; - line-height: var(--xs-line-height) + font-family: var(--bs-font-sans-serif); + font-size: 1rem; + font-style: normal; + font-weight: 500; + line-height: var(--xs-line-height); } blockquote { - border-left: 0.5rem solid var(--brand-primary-green); - padding: 0.5rem 0 0.5rem 0.5rem; - margin: var(--blockquote-margin) 0; + border-left: 0.5rem solid var(--brand-primary-green); + padding: 0.5rem 0 0.5rem 0.5rem; + margin: var(--blockquote-margin) 0; } blockquote p { - font-family: var(--bs-font-monospace); - font-size: var(--blockquote-font-size); - font-weight: 800; - line-height: var(--blockquote-line-height); + font-family: var(--bs-font-monospace); + font-size: var(--blockquote-font-size); + font-weight: 800; + line-height: var(--blockquote-line-height); } /*#endregion */ @@ -223,249 +225,254 @@ blockquote p { /* Accordions */ .accordion { - --bs-accordion-active-bg: var(--brand-scale-green-1); - --bs-accordion-border-color: var(--brand-scale-gray-2); - --bs-accordion-active-color: var(--text-black); + --bs-accordion-active-bg: var(--brand-scale-green-1); + --bs-accordion-border-color: var(--brand-scale-gray-2); + --bs-accordion-active-color: var(--text-black); - /* override the fill color */ - --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231c1c1c'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e") + /* override the fill color */ + --bs-accordion-btn-active-icon: url("data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='%231c1c1c'%3e%3cpath fill-rule='evenodd' d='M1.646 4.646a.5.5 0 0 1 .708 0L8 10.293l5.646-5.647a.5.5 0 0 1 .708.708l-6 6a.5.5 0 0 1-.708 0l-6-6a.5.5 0 0 1 0-.708z'/%3e%3c/svg%3e"); } .accordion-button { - --bs-accordion-btn-focus-border-color: var(--brand-primary-green); - --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(136, 180, 64, 1); + --bs-accordion-btn-focus-border-color: var(--brand-primary-green); + --bs-accordion-btn-focus-box-shadow: 0 0 0 0.25rem rgba(136, 180, 64, 1); } -.accordion-item, .accordion-button { - border-radius: 0 !important; +.accordion-item, +.accordion-button { + border-radius: 0 !important; } /* Buttons */ :root { - --button-primary-default: var(--brand-primary-green); - --button-primary-hover: #A6D15F; - --button-primary-active: #698A31; - --button-primary-focus: var(--brand-primary-green); - --button-primary-disabled: #BBB; - --button-outline-hover-bg: #2F440C; - --button-outline-hover-border: var(--brand-primary-green); - --button-outline-active-bg: #213008; - --button-outline-disabled-bg: transparent; + --button-primary-default: var(--brand-primary-green); + --button-primary-hover: #a6d15f; + --button-primary-active: #698a31; + --button-primary-focus: var(--brand-primary-green); + --button-primary-disabled: #bbb; + --button-outline-hover-bg: #2f440c; + --button-outline-hover-border: var(--brand-primary-green); + --button-outline-active-bg: #213008; + --button-outline-disabled-bg: transparent; } .btn { - --bs-btn-padding-x: calc(1rem - 1px); - --bs-btn-padding-y: calc(1rem - 1px); - --bs-btn-font-family: var(--bs-font-monospace); - --bs-btn-font-size: 1rem; - --bs-btn-font-weight: 700; - --bs-btn-line-height: 1; - --bs-btn-border-width: calc(1rem / 16); - --bs-btn-border-radius: 0; - --bs-btn-box-shadow: none; - --bs-btn-disabled-opacity: 1; - --bs-btn-focus-box-shadow: var(--focus-box-shadow); + --bs-btn-padding-x: calc(1rem - 1px); + --bs-btn-padding-y: calc(1rem - 1px); + --bs-btn-font-family: var(--bs-font-monospace); + --bs-btn-font-size: 1rem; + --bs-btn-font-weight: 700; + --bs-btn-line-height: 1; + --bs-btn-border-width: calc(1rem / 16); + --bs-btn-border-radius: 0; + --bs-btn-box-shadow: none; + --bs-btn-disabled-opacity: 1; + --bs-btn-focus-box-shadow: var(--focus-box-shadow); } .btn-primary { - --bs-btn-color: var(--brand-primary-black); - --bs-btn-bg: var(--button-primary-default); - --bs-btn-border-color: var(--button-primary-default); - --bs-btn-hover-color: var(--brand-primary-black); - --bs-btn-hover-bg: var(--button-primary-hover); - --bs-btn-hover-border-color: var(--button-primary-hover); - --bs-btn-focus-shadow-rgb: 49,132,253; - --bs-btn-active-color: var(--brand-primary-black); - --bs-btn-active-bg: var(--button-primary-active); - --bs-btn-active-border-color: var(--button-primary-active); - --bs-btn-active-shadow: inset 0 calc(3rem / 16) calc(5rem / 16) rgba(0, 0, 0, 0.125); - --bs-btn-disabled-color: var(--brand-primary-black); - --bs-btn-disabled-bg: var(--button-primary-disabled); - --bs-btn-disabled-border-color: var(--button-primary-disabled); + --bs-btn-color: var(--brand-primary-black); + --bs-btn-bg: var(--button-primary-default); + --bs-btn-border-color: var(--button-primary-default); + --bs-btn-hover-color: var(--brand-primary-black); + --bs-btn-hover-bg: var(--button-primary-hover); + --bs-btn-hover-border-color: var(--button-primary-hover); + --bs-btn-focus-shadow-rgb: 49, 132, 253; + --bs-btn-active-color: var(--brand-primary-black); + --bs-btn-active-bg: var(--button-primary-active); + --bs-btn-active-border-color: var(--button-primary-active); + --bs-btn-active-shadow: inset 0 calc(3rem / 16) calc(5rem / 16) rgba(0, 0, 0, 0.125); + --bs-btn-disabled-color: var(--brand-primary-black); + --bs-btn-disabled-bg: var(--button-primary-disabled); + --bs-btn-disabled-border-color: var(--button-primary-disabled); } .btn-outline-primary { - --bs-btn-color: var(--white); - --bs-btn-bg: transparent; - --bs-btn-border-color: var(--button-primary-default); - --bs-btn-hover-color: var(--white); - --bs-btn-hover-bg: var(--button-outline-hover-bg); - --bs-btn-hover-border-color: var(--button-outline-hover-border); - --bs-btn-active-color: var(--white); - --bs-btn-active-bg:var(--button-outline-active-bg); - --bs-btn-active-border-color: var(--button-outline-hover-border); - --bs-btn-active-shadow: none; - --bs-btn-disabled-color: var(--button-primary-disabled); - --bs-btn-disabled-bg: var(--button-outline-disabled-bg); - --bs-btn-disabled-border-color: var(--button-primary-disabled); - --bs-gradient: none; + --bs-btn-color: var(--white); + --bs-btn-bg: transparent; + --bs-btn-border-color: var(--button-primary-default); + --bs-btn-hover-color: var(--white); + --bs-btn-hover-bg: var(--button-outline-hover-bg); + --bs-btn-hover-border-color: var(--button-outline-hover-border); + --bs-btn-active-color: var(--white); + --bs-btn-active-bg: var(--button-outline-active-bg); + --bs-btn-active-border-color: var(--button-outline-hover-border); + --bs-btn-active-shadow: none; + --bs-btn-disabled-color: var(--button-primary-disabled); + --bs-btn-disabled-bg: var(--button-outline-disabled-bg); + --bs-btn-disabled-border-color: var(--button-primary-disabled); + --bs-gradient: none; } .btn-primary:focus, .btn-primary:focus-visible, .btn-outline-primary:focus, .btn-outline-primary:focus-visible { - background-color: var(--bs-btn-bg); - border-color: var(--bs-btn-border-color); + background-color: var(--bs-btn-bg); + border-color: var(--bs-btn-border-color); } @media (max-width: 991px) { - .btn { - width: 100%; - } + .btn { + width: 100%; + } } .bg-white .btn-primary { - --bs-btn-focus-box-shadow: 0 0 0 calc(2.5rem / 16) var(--white), 0 0 0 calc(4rem / 16) var(--brand-primary-green); + --bs-btn-focus-box-shadow: 0 0 0 calc(2.5rem / 16) var(--white), 0 0 0 calc(4rem / 16) var(--brand-primary-green); } -.btn-collapse[aria-expanded='false']::before { - content: "See more"; +.btn-collapse[aria-expanded="false"]::before { + content: "See more"; } -.btn-collapse[aria-expanded='true']::before { - content: "See less"; +.btn-collapse[aria-expanded="true"]::before { + content: "See less"; } -.btn-collapse-projects[aria-expanded='false']::before { - content: "See more projects"; +.btn-collapse-projects[aria-expanded="false"]::before { + content: "See more projects"; } -.btn-collapse-projects[aria-expanded='true']::before { - content: "See fewer projects"; +.btn-collapse-projects[aria-expanded="true"]::before { + content: "See fewer projects"; } /* Pills */ .pill { - font-size: 0.75rem; - font-family: var(--bs-font-monospace); - font-weight: 600; - line-height: 120%; - letter-spacing: 0.075rem; - text-transform: uppercase; - color: var(--white); - border: calc(0.2rem / 16) solid var(--white); - border-radius: 0.25rem; - padding: 0.25rem 0.5rem; + font-size: 0.75rem; + font-family: var(--bs-font-monospace); + font-weight: 600; + line-height: 120%; + letter-spacing: 0.075rem; + text-transform: uppercase; + color: var(--white); + border: calc(0.2rem / 16) solid var(--white); + border-radius: 0.25rem; + padding: 0.25rem 0.5rem; } .pill-tag { - font-weight: 800; - color: var(--brand-primary-black); - background-color: var(--button-primary-default); + font-weight: 800; + color: var(--brand-primary-black); + background-color: var(--button-primary-default); } /* Header */ header { - padding: calc(13rem / 16) 0; + padding: calc(13rem / 16) 0; } /* Footer */ .social-media-icon, .social-media-icon i { - width: calc(24rem / 16); - height: calc(24rem / 16); + width: calc(24rem / 16); + height: calc(24rem / 16); } @media (min-width: 992px) { - .social-media-icon, - .social-media-icon i { - width: calc(32rem / 16); - height: calc(32rem / 16); - } + .social-media-icon, + .social-media-icon i { + width: calc(32rem / 16); + height: calc(32rem / 16); + } } .social-media-icon i { - transition: 250ms; - -webkit-mask-size: cover; - mask-size: cover; - background-color: var(--white); - display: inline-block; + transition: 250ms; + -webkit-mask-size: cover; + mask-size: cover; + background-color: var(--white); + display: inline-block; } .social-media-icon:hover i, -.social-media-icon:focus i{ - background-color: var(--brand-scale-gray-3); +.social-media-icon:focus i { + background-color: var(--brand-scale-gray-3); } .social-media-icon .github { - -webkit-mask-image: url(/assets/social_media/github.svg); - mask-image: url(/assets/social_media/github.svg); + -webkit-mask-image: url(/assets/social_media/github.svg); + mask-image: url(/assets/social_media/github.svg); } .social-media-icon .linkedin { - -webkit-mask-image: url(/assets/social_media/linkedin.svg); - mask-image: url(/assets/social_media/linkedin.svg); + -webkit-mask-image: url(/assets/social_media/linkedin.svg); + mask-image: url(/assets/social_media/linkedin.svg); } .brandmark { - width: calc(136.898rem / 16); + width: calc(136.898rem / 16); } @media (min-width: 992px) { - .brandmark { - width: calc(181.676rem / 16); - } + .brandmark { + width: calc(181.676rem / 16); + } } /* Utility Classes */ .fw-boldest { - font-weight: 800; + font-weight: 800; } -.bg-w-100 { /* Full-width background color, goes beyond gutter */ - margin: 0 calc(var(--bs-gutter-x) * -.5); - padding: 0 calc(var(--bs-gutter-x) * .5); +.bg-w-100 { + /* Full-width background color, goes beyond gutter */ + margin: 0 calc(var(--bs-gutter-x) * -0.5); + padding: 0 calc(var(--bs-gutter-x) * 0.5); } .bg-brand-scale-green-1 { - background: var(--brand-scale-green-1); + background: var(--brand-scale-green-1); } -.border-100 { /* Full-width border, goes beyond gutter */ - margin: 0 calc(var(--bs-gutter-x) * -.5); - padding: 0; +.border-100 { + /* Full-width border, goes beyond gutter */ + margin: 0 calc(var(--bs-gutter-x) * -0.5); + padding: 0; } .border-half { - --bs-border-width: 0.5px; + --bs-border-width: 0.5px; } .border-black { - --bs-border-color: #000; + --bs-border-color: #000; } -.fs-7 { /* Font size smaller than 1rem */ - font-size: calc(14rem / 16) !important; +.fs-7 { + /* Font size smaller than 1rem */ + font-size: calc(14rem / 16) !important; } .fs-8 { - font-size: calc(12rem / 16) !important; - letter-spacing: 1.2px !important; + font-size: calc(12rem / 16) !important; + letter-spacing: 1.2px !important; } -.fine-print { /* Font size smaller than 1rem */ - font-size: calc(12rem / 16) !important; +.fine-print { + /* Font size smaller than 1rem */ + font-size: calc(12rem / 16) !important; } .fw-500 { - font-weight: 500; + font-weight: 500; } .fw-boldest { - font-weight: 800; + font-weight: 800; } .list-circle { - background: url(/assets/illustrations/circle.svg) no-repeat left center; - padding: 0.5rem 0 0.5rem 2.4rem; - list-style: none; - margin: 0; + background: url(/assets/illustrations/circle.svg) no-repeat left center; + padding: 0.5rem 0 0.5rem 2.4rem; + list-style: none; + margin: 0; } @media screen and (min-width: 992px) { @@ -484,236 +491,238 @@ header { /* About */ -@-webkit-keyframes move-left -{ - 27.27%, 45.45% { - right: 60%; - } - 63.63%, 100% { - right: calc(100vw + 62px); - } -} -@keyframes move-left -{ - 27.27%, 45.45% { - right: 60%; - } - 63.63%, 100% { - right: calc(100vw + 62px); - } +@-webkit-keyframes move-left { + 27.27%, + 45.45% { + right: 60%; + } + 63.63%, + 100% { + right: calc(100vw + 62px); + } +} +@keyframes move-left { + 27.27%, + 45.45% { + right: 60%; + } + 63.63%, + 100% { + right: calc(100vw + 62px); + } } .animate-bus { - right: -62px; - bottom: calc(-1 * var(--main-container-first-row-vertical-margin)); - position: absolute; - -webkit-animation: move-left 22s linear infinite; - animation: move-left 22s linear infinite; + right: -62px; + bottom: calc(-1 * var(--main-container-first-row-vertical-margin)); + position: absolute; + -webkit-animation: move-left 22s linear infinite; + animation: move-left 22s linear infinite; } .animate-bus img, .animate-bike img { - -webkit-transition: all 1s linear; - -moz-transition: all 1s linear; - -o-transition: all 1s linear; - -ms-transition: all 1s linear; - transition: all 1s linear; - transition-duration: 1s; -} - -@-webkit-keyframes move-right -{ - 0% { - left: -8%; - } - 80% { - left: 100%; - } - 100% { - left: 120%; - } -} - -@keyframes move-right -{ - 0% { - left: -8%; - } - 80% { - left: 100%; - } - 100% { - left: 120%; - } + -webkit-transition: all 1s linear; + -moz-transition: all 1s linear; + -o-transition: all 1s linear; + -ms-transition: all 1s linear; + transition: all 1s linear; + transition-duration: 1s; } -.animate-bike { +@-webkit-keyframes move-right { + 0% { + left: -8%; + } + 80% { left: 100%; - bottom: 0; - position: absolute; - -webkit-animation: move-right 24s linear infinite, + } + 100% { + left: 120%; + } +} + +@keyframes move-right { + 0% { + left: -8%; + } + 80% { + left: 100%; + } + 100% { + left: 120%; + } +} + +.animate-bike { + left: 100%; + bottom: 0; + position: absolute; + -webkit-animation: + move-right 24s linear infinite, delay-animation 8s linear infinite; - animation: move-right 24s linear infinite, + animation: + move-right 24s linear infinite, delay-animation 8s linear infinite; - animation-delay: 3s; - -webkit-animation-delay: 3s; + animation-delay: 3s; + -webkit-animation-delay: 3s; } @media (prefers-reduced-motion: reduce) { - .animate-bus, - .animate-bike { - animation: none; - } + .animate-bus, + .animate-bike { + animation: none; + } - .animate-bus { - right: 0 !important; - } + .animate-bus { + right: 0 !important; + } - .animate-bike { - left: 0 !important; - } + .animate-bike { + left: 0 !important; + } } /* Blog */ @media (max-width: 992px) { - .blog.row { - --bs-gutter-x: 0; - } + .blog.row { + --bs-gutter-x: 0; + } } .post-preview { - margin-top: calc(80rem / 16); + margin-top: calc(80rem / 16); } .post-preview:first-of-type { - margin-top: calc(48rem / 16); + margin-top: calc(48rem / 16); } @media (min-width: 992px) { - .post-preview, - .post-preview:first-of-type { - margin-top: calc(10rem / 16)x; - } + .post-preview, + .post-preview:first-of-type { + margin-top: calc(10rem / 16) x; + } } .post-title:hover, .post-title:focus { - text-decoration: none !important; + text-decoration: none !important; } .back-row { - padding-top: 0.5rem; - padding-bottom: calc(12rem / 16); - letter-spacing: 1.2px; + padding-top: 0.5rem; + padding-bottom: calc(12rem / 16); + letter-spacing: 1.2px; } .back-row a:before { - content: " "; - margin-right: 0.5rem; - vertical-align: sub; - display: inline-block; - width: 0.5rem; - height: calc(12rem / 16); + content: " "; + margin-right: 0.5rem; + vertical-align: sub; + display: inline-block; + width: 0.5rem; + height: calc(12rem / 16); } .back-row a:before { - background: no-repeat url("/assets/blog/go-back.svg"); - background-size: contain; + background: no-repeat url("/assets/blog/go-back.svg"); + background-size: contain; } .back-row:last-of-type a:before { - background: var(--brand-primary-green); - mask-image: url("/assets/blog/go-back.svg"), linear-gradient(transparent, transparent); - mask-position: center center; - -webkit-mask-image: url("/assets/blog/go-back.svg"), linear-gradient(transparent, transparent); - -webkit-mask-position: center center; + background: var(--brand-primary-green); + mask-image: url("/assets/blog/go-back.svg"), linear-gradient(transparent, transparent); + mask-position: center center; + -webkit-mask-image: url("/assets/blog/go-back.svg"), linear-gradient(transparent, transparent); + -webkit-mask-position: center center; } @media (max-width: 992px) { - :root { - --blog-post-h2-padding-top: 3.5rem; - } - .blog_post .blog_wrapper { - padding-bottom: calc(56rem / 16) !important; - } + :root { + --blog-post-h2-padding-top: 3.5rem; + } + .blog_post .blog_wrapper { + padding-bottom: calc(56rem / 16) !important; + } } @media (min-width: 992px) { - :root { - --blog-post-h2-padding-top: 3.5rem; - } - .blog_post .blog_wrapper { - padding-bottom: calc(120rem / 16) !important; - } + :root { + --blog-post-h2-padding-top: 3.5rem; + } + .blog_post .blog_wrapper { + padding-bottom: calc(120rem / 16) !important; + } } .blog_post h2 { - padding: var(--blog-post-h2-padding-top) 0 2rem 0; + padding: var(--blog-post-h2-padding-top) 0 2rem 0; } .blog_post p + h2, .blog_wrapper p:first-child:not(li > p) { - padding-top: 56px; + padding-top: 56px; } .blog_post h3 { - font-family: var(--bs-font-monospace); - font-size: 1rem; - font-style: normal; - font-weight: 700; - line-height: var(--xs-line-height) + font-family: var(--bs-font-monospace); + font-size: 1rem; + font-style: normal; + font-weight: 700; + line-height: var(--xs-line-height); } .blog_post h5 { - font-family: var(--bs-font-sans-serif); - font-size: 0.875rem; - font-weight: 500; - color: var(--brand-scale-gray-4); - margin: -1.5rem 0 1.5rem 0; - line-height: 1; + font-family: var(--bs-font-sans-serif); + font-size: 0.875rem; + font-weight: 500; + color: var(--brand-scale-gray-4); + margin: -1.5rem 0 1.5rem 0; + line-height: 1; } .blog_post p:not(:last-child) { - margin-bottom: 1.5rem; + margin-bottom: 1.5rem; } .blog_post p:last-child:not(li p) { - margin-bottom: 0; + margin-bottom: 0; } .blog_post .language-plaintext code { - font-weight: 700; - margin: 2.5rem 0; + font-weight: 700; + margin: 2.5rem 0; } .blog_post img { - max-width: 100%; - max-height: 100%; + max-width: 100%; + max-height: 100%; } .blog_post figcaption { - font-size: calc(14rem / 16); - font-weight: 500; - line-height: 150%; - color: var(--brand-scale-gray-4); - margin-bottom: 1.5rem; + font-size: calc(14rem / 16); + font-weight: 500; + line-height: 150%; + color: var(--brand-scale-gray-4); + margin-bottom: 1.5rem; } .blog_post table { - margin: 0 1.5rem; + margin: 0 1.5rem; } .blog_post table td, .blog_post table th { - padding: 0.75rem; - display: table-cell; + padding: 0.75rem; + display: table-cell; } /* Our Work */ .sign { - position: absolute; - right: 0; - bottom: 0; + position: absolute; + right: 0; + bottom: 0; } diff --git a/src/styles/nav.css b/src/styles/nav.css index 0a7340ca..cdb9479e 100644 --- a/src/styles/nav.css +++ b/src/styles/nav.css @@ -1,67 +1,71 @@ /* Header */ header { - padding: calc(13rem / 16) 0; + padding: calc(13rem / 16) 0; } /* Nav */ :root { - --modal-header-padding: 0 1rem; + --modal-header-padding: 0 1rem; } @media (min-width: 992px) { - :root { - --modal-header-padding: 0 calc(24rem / 16); - } + :root { + --modal-header-padding: 0 calc(24rem / 16); + } } .modal-header { - padding: var(--modal-header-padding); - height: calc(72rem / 16); /* Match header height */ + padding: var(--modal-header-padding); + height: calc(72rem / 16); /* Match header height */ } .navbar { - --bs-navbar-padding-y: 0; + --bs-navbar-padding-y: 0; } .navbar-toggler-icon { - width: calc(32rem / 16); - height: calc(24rem / 16); - background-image: url('data:image/svg+xml,'); + width: calc(32rem / 16); + height: calc(24rem / 16); + background-image: url('data:image/svg+xml,'); } .navbar-toggler-icon:hover { - background-image: url('data:image/svg+xml,'); + background-image: url('data:image/svg+xml,'); } .btn-close { - color: var(--white); - background: transparent url('data:image/svg+xml,') center/2rem auto no-repeat; - width: 2rem; - height: 2rem; + color: var(--white); + background: transparent + url('data:image/svg+xml,') + center/2rem auto no-repeat; + width: 2rem; + height: 2rem; } .btn-close:hover { - background: transparent url('data:image/svg+xml,') center/2rem auto no-repeat; + background: transparent + url('data:image/svg+xml,') + center/2rem auto no-repeat; } .navbar-toggler:focus, .btn-close:focus { - outline: 1px solid var(--brand-primary-green) !important; - outline-offset: .25rem !important; - box-shadow: none !important; + outline: 1px solid var(--brand-primary-green) !important; + outline-offset: 0.25rem !important; + box-shadow: none !important; } .modal-content { - background-color: var(--text-black); + background-color: var(--text-black); } .nav-footer-pattern { - background-image: url("/assets/illustrations/footer.svg"); - background-repeat: repeat-x; - width: 100vw; - height: calc(116rem / 16); - opacity: 20%; - margin: 0; + background-image: url("/assets/illustrations/footer.svg"); + background-repeat: repeat-x; + width: 100vw; + height: calc(116rem / 16); + opacity: 20%; + margin: 0; }