diff --git a/.env.example b/.env.example index 9bf2717b..9583bb09 100644 --- a/.env.example +++ b/.env.example @@ -1 +1,19 @@ -PRISMIC_ACCESS_TOKEN=MC5YOG9mQmhFQUFDWUFtVGVY.77-977-977-977-9JzDvv73vv73vv73vv70h77-9fO-_ve-_vTNeYe-_ve-_ve-_vWHvv71vfzFA77-977-9Re-_ve-_vQ +PUBLIC_STORYBLOK_TOKEN= + +AWS_S3_BUCKET= +AWS_REGION=eu-west-3 +AWS_ACCESS_KEY_ID= +AWS_SECRET_ACCESS_KEY= +AWS_SES_FROM_ADDRESS="Significa (local) " +AWS_DYNAMODB_TABLE= + +NOTION_TOKEN= +NOTION_DB_LEADS= +NOTION_DB_CANDIDATES= +NOTION_DB_CONTACTS= + +BYPASS_TOKEN= + +VITE_HTTPS_ENABLED=true + +SESSION_SECRET_KEY= \ No newline at end of file diff --git a/.eslintignore b/.eslintignore new file mode 100644 index 00000000..a90d777b --- /dev/null +++ b/.eslintignore @@ -0,0 +1,16 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example + +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock + +# generated types +bloks.d.ts \ No newline at end of file diff --git a/.eslintrc.cjs b/.eslintrc.cjs new file mode 100644 index 00000000..eaf19f56 --- /dev/null +++ b/.eslintrc.cjs @@ -0,0 +1,20 @@ +module.exports = { + root: true, + parser: '@typescript-eslint/parser', + extends: ['eslint:recommended', 'plugin:@typescript-eslint/recommended', 'prettier'], + plugins: ['svelte3', '@typescript-eslint'], + ignorePatterns: ['*.cjs'], + overrides: [{ files: ['*.svelte'], processor: 'svelte3/svelte3' }], + settings: { + 'svelte3/typescript': () => require('typescript') + }, + parserOptions: { + sourceType: 'module', + ecmaVersion: 2020 + }, + env: { + browser: true, + es2017: true, + node: true + } +}; diff --git a/.eslintrc.json b/.eslintrc.json deleted file mode 100644 index 2721c407..00000000 --- a/.eslintrc.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "extends": [ - "@significa", - "@significa/eslint-config/react" - ], - "env": { - "jest/globals": true - }, - "rules": { - "@typescript-eslint/no-explicit-any": "off", - "@typescript-eslint/interface-name-prefix": "off", - "@typescript-eslint/no-use-before-define": "off", - "@typescript-eslint/camelcase": "off", - "@typescript-eslint/no-empty-function": "off", - "@typescript-eslint/no-empty-interface": "off", - "@typescript-eslint/ban-ts-ignore": "off", - "prettier/prettier": [ - "off" - ] - } -} \ No newline at end of file diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS deleted file mode 100644 index a4e8bf40..00000000 --- a/.github/CODEOWNERS +++ /dev/null @@ -1,4 +0,0 @@ -# CODEOWNERS -# -# These users are in charge of the code and reviewing proccess -* @pbrandone @danilowoz diff --git a/.github/workflows/ci-cd.yaml b/.github/workflows/ci-cd.yaml new file mode 100644 index 00000000..f14dd1ef --- /dev/null +++ b/.github/workflows/ci-cd.yaml @@ -0,0 +1,29 @@ +name: CI/CD + +on: + push: + branches: + - main + pull_request: + release: + types: + - published + workflow_dispatch: + +jobs: + ci-cd: + name: CI/CD + permissions: + contents: read + packages: read + deployments: write + uses: significa/actions/.github/workflows/vercel-app.yaml@vercel-deployment-alias + with: + npm_scope: '@significa' + install_registry_url: 'https://npm.pkg.github.com/' + staging_domain: ${{ vars.STAGING_DOMAIN }} + production_domain: ${{ vars.PRODUCTION_DOMAIN }} + secrets: + VERCEL_TOKEN: ${{ secrets.VERCEL_TOKEN }} + VERCEL_ORG_ID: ${{ secrets.VERCEL_ORG_ID }} + VERCEL_PROJECT_ID: ${{ secrets.VERCEL_PROJECT_ID }} diff --git a/.github/workflows/deploy-preview.yml b/.github/workflows/deploy-preview.yml deleted file mode 100644 index aadcaeb6..00000000 --- a/.github/workflows/deploy-preview.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Deploy Preview - -on: pull_request - -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - - name: Cache npm - uses: actions/cache@v1 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Install - run: npm ci - - - name: Build - run: PRISMIC_ACCESS_TOKEN=${{ secrets.PRISMIC_ACCESS_TOKEN }} PATH_PREFIX=preview/${{ github.event.number }} npm run build -- --prefix-paths - - - name: Deploy - if: success() - uses: jakejarvis/s3-sync-action@master - with: - args: --delete - env: - AWS_S3_BUCKET: significa.dev - AWS_ACCESS_KEY_ID: ${{ secrets.DEPLOY_PREVIEW_KEY }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.DEPLOY_PREVIEW_SECRET }} - AWS_REGION: 'us-west-1' - SOURCE_DIR: 'public' - DEST_DIR: preview/${{ github.event.number }} - - - name: Deploy message - if: success() - uses: unsplash/comment-on-pr@master - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - msg: | - Deploy preview ready! - https://significa.dev/preview/${{ github.event.number }} - built from ${{ github.sha }} diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml deleted file mode 100644 index 6a0d86ba..00000000 --- a/.github/workflows/deploy.yml +++ /dev/null @@ -1,44 +0,0 @@ -name: Deploy to Production - -on: - repository_dispatch: - push: - branches: - - master - -jobs: - deploy: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v1 - - - name: Cache npm - uses: actions/cache@v1 - with: - path: ~/.npm - key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} - restore-keys: | - ${{ runner.os }}-node- - - - name: Install - run: npm ci - - - name: Build - run: PRISMIC_ACCESS_TOKEN=${{ secrets.PRISMIC_ACCESS_TOKEN }} npm run build - - - name: Deploy - if: success() - run: npm run deploy - env: - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} - - - name: Cloudfront invalidation - if: success() - uses: chetan/invalidate-cloudfront-action@master - env: - DISTRIBUTION: ${{ secrets.PRODUCTION_CLOUDFRONT }} - PATHS: '/*' - AWS_REGION: 'eu-west-1' - AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }} - AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }} diff --git a/.github/workflows/update-email-templates.yaml b/.github/workflows/update-email-templates.yaml new file mode 100644 index 00000000..5e364abd --- /dev/null +++ b/.github/workflows/update-email-templates.yaml @@ -0,0 +1,46 @@ +name: Update email templates + +on: + workflow_dispatch: + repository_dispatch: + schedule: + - cron: '0 11 * * 2' # Every tuesday at 11am UTC + +jobs: + update-templates: + runs-on: ubuntu-latest + timeout-minutes: 5 + permissions: + contents: write + packages: read + pull-requests: write + + steps: + - uses: actions/checkout@v3 + + - uses: actions/setup-node@v3 + with: + node-version-file: '.nvmrc' + cache: npm + scope: '@significa' + registry-url: 'https://npm.pkg.github.com/' + + - name: Install dependencies + run: npm ci + + - name: Update email templates + env: + MAILCHIMP_API_KEY: ${{ secrets.MAILCHIMP_API_KEY }} + run: ./scripts/update-email-templates.sh + + - name: Create Pull Request + uses: peter-evans/create-pull-request@v5 + with: + branch: ci/update-email-templates + commit-message: 'ci: updated email templates' + delete-branch: true + title: 'CI: auto updated email templates' + body: | + Updated email templates from Mailchimp. + + Before merging, please make sure that the plaintext versions of the emails still make sense. diff --git a/.gitignore b/.gitignore index 066ef513..8e2da1f7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,76 +1,14 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -yarn.lock - -# Runtime data -pids -*.pid -*.seed -*.pid.lock - -# Directory for instrumented libs generated by jscoverage/JSCover -lib-cov - -# Coverage directory used by tools like istanbul -coverage - -# nyc test coverage -.nyc_output - -# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) -.grunt - -# Bower dependency directory (https://bower.io/) -bower_components - -# node-waf configuration -.lock-wscript - -# Compiled binary addons (http://nodejs.org/api/addons.html) -build/Release - -# Dependency directories -node_modules/ -jspm_packages/ - -# Typescript v1 declaration files -typings/ - -# Optional npm cache directory -.npm - -# Optional eslint cache -.eslintcache - -# Optional REPL history -.node_repl_history - -# Output of 'npm pack' -*.tgz - -# dotenv environment variables file -.env - -# gatsby files -.cache/ -public - -# Mac files .DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +vite.config.js.timestamp-* +vite.config.ts.timestamp-* -# Yarn -yarn-error.log -.pnp/ -.pnp.js -# Yarn Integrity file -.yarn-integrity +.vercel -# functions -build -build.zip -build.tar -build.tar.gz +static/sitemap.xml \ No newline at end of file diff --git a/.husky/pre-commit b/.husky/pre-commit new file mode 100755 index 00000000..d24fdfc6 --- /dev/null +++ b/.husky/pre-commit @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npx lint-staged diff --git a/.husky/pre-push b/.husky/pre-push new file mode 100755 index 00000000..879e9351 --- /dev/null +++ b/.husky/pre-push @@ -0,0 +1,4 @@ +#!/usr/bin/env sh +. "$(dirname -- "$0")/_/husky.sh" + +npm run test diff --git a/.huskyrc.json b/.huskyrc.json deleted file mode 100644 index 06b9e03e..00000000 --- a/.huskyrc.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "hooks": { - "pre-commit": "lint-staged", - "pre-push": "npm run validate && npm run test", - "commit-msg": "commitlint -E HUSKY_GIT_PARAMS" - } -} diff --git a/.lintstagedrc b/.lintstagedrc new file mode 100644 index 00000000..de733830 --- /dev/null +++ b/.lintstagedrc @@ -0,0 +1,3 @@ +{ + "*.{js,ts,json,svelte}": ["eslint", "prettier --write"] +} diff --git a/.npmrc b/.npmrc new file mode 100644 index 00000000..0b6632fc --- /dev/null +++ b/.npmrc @@ -0,0 +1,3 @@ +//npm.pkg.github.com/:_authToken=${GITHUB_AUTH_TOKEN} +@significa:registry=https://npm.pkg.github.com/ +engine-strict=true \ No newline at end of file diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..25bf17fc --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +18 \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 00000000..38972655 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,13 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example + +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 00000000..206e0429 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,9 @@ +{ + "useTabs": false, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], + "pluginSearchDirs": ["."], + "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] +} diff --git a/.prettierrc.js b/.prettierrc.js deleted file mode 100644 index ab1c688a..00000000 --- a/.prettierrc.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("@significa/prettier-config"); \ No newline at end of file diff --git a/.vscode/extensions.json b/.vscode/extensions.json new file mode 100644 index 00000000..febc2af1 --- /dev/null +++ b/.vscode/extensions.json @@ -0,0 +1,4 @@ +{ + "recommendations": ["svelte.svelte-vscode", "phoenisx.cssvar"], + "unwantedRecommendations": [] +} diff --git a/.vscode/settings.json b/.vscode/settings.json index 65c3b200..27281fd4 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,23 +1,12 @@ { + "cssvar.files": ["src/**/*.css", "node_modules/@significa/svelte-ui/dist/**/*.css"], + "cssvar.ignore": [], + "files.associations": { + "*.css": "tailwindcss" + }, + "editor.formatOnSave": true, "editor.codeActionsOnSave": { "source.fixAll": true }, - "eslint.enable": true, - "editor.gotoLocation.multipleDefinitions": "goto", - "editor.gotoLocation.multipleImplementations": "goto", - "editor.formatOnPaste": false, - "editor.formatOnSave": true, - "typescript.updateImportsOnFileMove.enabled": "always", - "typescript.tsdk": "node_modules/typescript/lib", - "files.exclude": { - "**/.git": true, - "**/.svn": true, - "**/.hg": true, - "**/CVS": true, - "**/.DS_Store": true, - "**/Thumbs.db": true, - "**/node_modules": true - } - // Eventually I would like to turn this on - // "typescript.preferences.importModuleSpecifier": "auto", -} \ No newline at end of file + "eslint.validate": ["svelte"] +} diff --git a/LICENSE b/LICENSE deleted file mode 100644 index f288702d..00000000 --- a/LICENSE +++ /dev/null @@ -1,674 +0,0 @@ - GNU GENERAL PUBLIC LICENSE - Version 3, 29 June 2007 - - Copyright (C) 2007 Free Software Foundation, Inc. - Everyone is permitted to copy and distribute verbatim copies - of this license document, but changing it is not allowed. - - Preamble - - The GNU General Public License is a free, copyleft license for -software and other kinds of works. - - The licenses for most software and other practical works are designed -to take away your freedom to share and change the works. By contrast, -the GNU General Public License is intended to guarantee your freedom to -share and change all versions of a program--to make sure it remains free -software for all its users. We, the Free Software Foundation, use the -GNU General Public License for most of our software; it applies also to -any other work released this way by its authors. You can apply it to -your programs, too. - - When we speak of free software, we are referring to freedom, not -price. Our General Public Licenses are designed to make sure that you -have the freedom to distribute copies of free software (and charge for -them if you wish), that you receive source code or can get it if you -want it, that you can change the software or use pieces of it in new -free programs, and that you know you can do these things. - - To protect your rights, we need to prevent others from denying you -these rights or asking you to surrender the rights. Therefore, you have -certain responsibilities if you distribute copies of the software, or if -you modify it: responsibilities to respect the freedom of others. - - For example, if you distribute copies of such a program, whether -gratis or for a fee, you must pass on to the recipients the same -freedoms that you received. You must make sure that they, too, receive -or can get the source code. And you must show them these terms so they -know their rights. - - Developers that use the GNU GPL protect your rights with two steps: -(1) assert copyright on the software, and (2) offer you this License -giving you legal permission to copy, distribute and/or modify it. - - For the developers' and authors' protection, the GPL clearly explains -that there is no warranty for this free software. For both users' and -authors' sake, the GPL requires that modified versions be marked as -changed, so that their problems will not be attributed erroneously to -authors of previous versions. - - Some devices are designed to deny users access to install or run -modified versions of the software inside them, although the manufacturer -can do so. This is fundamentally incompatible with the aim of -protecting users' freedom to change the software. The systematic -pattern of such abuse occurs in the area of products for individuals to -use, which is precisely where it is most unacceptable. Therefore, we -have designed this version of the GPL to prohibit the practice for those -products. If such problems arise substantially in other domains, we -stand ready to extend this provision to those domains in future versions -of the GPL, as needed to protect the freedom of users. - - Finally, every program is threatened constantly by software patents. -States should not allow patents to restrict development and use of -software on general-purpose computers, but in those that do, we wish to -avoid the special danger that patents applied to a free program could -make it effectively proprietary. To prevent this, the GPL assures that -patents cannot be used to render the program non-free. - - The precise terms and conditions for copying, distribution and -modification follow. - - TERMS AND CONDITIONS - - 0. Definitions. - - "This License" refers to version 3 of the GNU General Public License. - - "Copyright" also means copyright-like laws that apply to other kinds of -works, such as semiconductor masks. - - "The Program" refers to any copyrightable work licensed under this -License. Each licensee is addressed as "you". "Licensees" and -"recipients" may be individuals or organizations. - - To "modify" a work means to copy from or adapt all or part of the work -in a fashion requiring copyright permission, other than the making of an -exact copy. The resulting work is called a "modified version" of the -earlier work or a work "based on" the earlier work. - - A "covered work" means either the unmodified Program or a work based -on the Program. - - To "propagate" a work means to do anything with it that, without -permission, would make you directly or secondarily liable for -infringement under applicable copyright law, except executing it on a -computer or modifying a private copy. Propagation includes copying, -distribution (with or without modification), making available to the -public, and in some countries other activities as well. - - To "convey" a work means any kind of propagation that enables other -parties to make or receive copies. Mere interaction with a user through -a computer network, with no transfer of a copy, is not conveying. - - An interactive user interface displays "Appropriate Legal Notices" -to the extent that it includes a convenient and prominently visible -feature that (1) displays an appropriate copyright notice, and (2) -tells the user that there is no warranty for the work (except to the -extent that warranties are provided), that licensees may convey the -work under this License, and how to view a copy of this License. If -the interface presents a list of user commands or options, such as a -menu, a prominent item in the list meets this criterion. - - 1. Source Code. - - The "source code" for a work means the preferred form of the work -for making modifications to it. "Object code" means any non-source -form of a work. - - A "Standard Interface" means an interface that either is an official -standard defined by a recognized standards body, or, in the case of -interfaces specified for a particular programming language, one that -is widely used among developers working in that language. - - The "System Libraries" of an executable work include anything, other -than the work as a whole, that (a) is included in the normal form of -packaging a Major Component, but which is not part of that Major -Component, and (b) serves only to enable use of the work with that -Major Component, or to implement a Standard Interface for which an -implementation is available to the public in source code form. A -"Major Component", in this context, means a major essential component -(kernel, window system, and so on) of the specific operating system -(if any) on which the executable work runs, or a compiler used to -produce the work, or an object code interpreter used to run it. - - The "Corresponding Source" for a work in object code form means all -the source code needed to generate, install, and (for an executable -work) run the object code and to modify the work, including scripts to -control those activities. However, it does not include the work's -System Libraries, or general-purpose tools or generally available free -programs which are used unmodified in performing those activities but -which are not part of the work. For example, Corresponding Source -includes interface definition files associated with source files for -the work, and the source code for shared libraries and dynamically -linked subprograms that the work is specifically designed to require, -such as by intimate data communication or control flow between those -subprograms and other parts of the work. - - The Corresponding Source need not include anything that users -can regenerate automatically from other parts of the Corresponding -Source. - - The Corresponding Source for a work in source code form is that -same work. - - 2. Basic Permissions. - - All rights granted under this License are granted for the term of -copyright on the Program, and are irrevocable provided the stated -conditions are met. This License explicitly affirms your unlimited -permission to run the unmodified Program. The output from running a -covered work is covered by this License only if the output, given its -content, constitutes a covered work. This License acknowledges your -rights of fair use or other equivalent, as provided by copyright law. - - You may make, run and propagate covered works that you do not -convey, without conditions so long as your license otherwise remains -in force. You may convey covered works to others for the sole purpose -of having them make modifications exclusively for you, or provide you -with facilities for running those works, provided that you comply with -the terms of this License in conveying all material for which you do -not control copyright. Those thus making or running the covered works -for you must do so exclusively on your behalf, under your direction -and control, on terms that prohibit them from making any copies of -your copyrighted material outside their relationship with you. - - Conveying under any other circumstances is permitted solely under -the conditions stated below. Sublicensing is not allowed; section 10 -makes it unnecessary. - - 3. Protecting Users' Legal Rights From Anti-Circumvention Law. - - No covered work shall be deemed part of an effective technological -measure under any applicable law fulfilling obligations under article -11 of the WIPO copyright treaty adopted on 20 December 1996, or -similar laws prohibiting or restricting circumvention of such -measures. - - When you convey a covered work, you waive any legal power to forbid -circumvention of technological measures to the extent such circumvention -is effected by exercising rights under this License with respect to -the covered work, and you disclaim any intention to limit operation or -modification of the work as a means of enforcing, against the work's -users, your or third parties' legal rights to forbid circumvention of -technological measures. - - 4. Conveying Verbatim Copies. - - You may convey verbatim copies of the Program's source code as you -receive it, in any medium, provided that you conspicuously and -appropriately publish on each copy an appropriate copyright notice; -keep intact all notices stating that this License and any -non-permissive terms added in accord with section 7 apply to the code; -keep intact all notices of the absence of any warranty; and give all -recipients a copy of this License along with the Program. - - You may charge any price or no price for each copy that you convey, -and you may offer support or warranty protection for a fee. - - 5. Conveying Modified Source Versions. - - You may convey a work based on the Program, or the modifications to -produce it from the Program, in the form of source code under the -terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified - it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is - released under this License and any conditions added under section - 7. This requirement modifies the requirement in section 4 to - "keep intact all notices". - - c) You must license the entire work, as a whole, under this - License to anyone who comes into possession of a copy. This - License will therefore apply, along with any applicable section 7 - additional terms, to the whole of the work, and all its parts, - regardless of how they are packaged. This License gives no - permission to license the work in any other way, but it does not - invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display - Appropriate Legal Notices; however, if the Program has interactive - interfaces that do not display Appropriate Legal Notices, your - work need not make them do so. - - A compilation of a covered work with other separate and independent -works, which are not by their nature extensions of the covered work, -and which are not combined with it such as to form a larger program, -in or on a volume of a storage or distribution medium, is called an -"aggregate" if the compilation and its resulting copyright are not -used to limit the access or legal rights of the compilation's users -beyond what the individual works permit. Inclusion of a covered work -in an aggregate does not cause this License to apply to the other -parts of the aggregate. - - 6. Conveying Non-Source Forms. - - You may convey a covered work in object code form under the terms -of sections 4 and 5, provided that you also convey the -machine-readable Corresponding Source under the terms of this License, -in one of these ways: - - a) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by the - Corresponding Source fixed on a durable physical medium - customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product - (including a physical distribution medium), accompanied by a - written offer, valid for at least three years and valid for as - long as you offer spare parts or customer support for that product - model, to give anyone who possesses the object code either (1) a - copy of the Corresponding Source for all the software in the - product that is covered by this License, on a durable physical - medium customarily used for software interchange, for a price no - more than your reasonable cost of physically performing this - conveying of source, or (2) access to copy the - Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the - written offer to provide the Corresponding Source. This - alternative is allowed only occasionally and noncommercially, and - only if you received the object code with such an offer, in accord - with subsection 6b. - - d) Convey the object code by offering access from a designated - place (gratis or for a charge), and offer equivalent access to the - Corresponding Source in the same way through the same place at no - further charge. You need not require recipients to copy the - Corresponding Source along with the object code. If the place to - copy the object code is a network server, the Corresponding Source - may be on a different server (operated by you or a third party) - that supports equivalent copying facilities, provided you maintain - clear directions next to the object code saying where to find the - Corresponding Source. Regardless of what server hosts the - Corresponding Source, you remain obligated to ensure that it is - available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided - you inform other peers where the object code and Corresponding - Source of the work are being offered to the general public at no - charge under subsection 6d. - - A separable portion of the object code, whose source code is excluded -from the Corresponding Source as a System Library, need not be -included in conveying the object code work. - - A "User Product" is either (1) a "consumer product", which means any -tangible personal property which is normally used for personal, family, -or household purposes, or (2) anything designed or sold for incorporation -into a dwelling. In determining whether a product is a consumer product, -doubtful cases shall be resolved in favor of coverage. For a particular -product received by a particular user, "normally used" refers to a -typical or common use of that class of product, regardless of the status -of the particular user or of the way in which the particular user -actually uses, or expects or is expected to use, the product. A product -is a consumer product regardless of whether the product has substantial -commercial, industrial or non-consumer uses, unless such uses represent -the only significant mode of use of the product. - - "Installation Information" for a User Product means any methods, -procedures, authorization keys, or other information required to install -and execute modified versions of a covered work in that User Product from -a modified version of its Corresponding Source. The information must -suffice to ensure that the continued functioning of the modified object -code is in no case prevented or interfered with solely because -modification has been made. - - If you convey an object code work under this section in, or with, or -specifically for use in, a User Product, and the conveying occurs as -part of a transaction in which the right of possession and use of the -User Product is transferred to the recipient in perpetuity or for a -fixed term (regardless of how the transaction is characterized), the -Corresponding Source conveyed under this section must be accompanied -by the Installation Information. But this requirement does not apply -if neither you nor any third party retains the ability to install -modified object code on the User Product (for example, the work has -been installed in ROM). - - The requirement to provide Installation Information does not include a -requirement to continue to provide support service, warranty, or updates -for a work that has been modified or installed by the recipient, or for -the User Product in which it has been modified or installed. Access to a -network may be denied when the modification itself materially and -adversely affects the operation of the network or violates the rules and -protocols for communication across the network. - - Corresponding Source conveyed, and Installation Information provided, -in accord with this section must be in a format that is publicly -documented (and with an implementation available to the public in -source code form), and must require no special password or key for -unpacking, reading or copying. - - 7. Additional Terms. - - "Additional permissions" are terms that supplement the terms of this -License by making exceptions from one or more of its conditions. -Additional permissions that are applicable to the entire Program shall -be treated as though they were included in this License, to the extent -that they are valid under applicable law. If additional permissions -apply only to part of the Program, that part may be used separately -under those permissions, but the entire Program remains governed by -this License without regard to the additional permissions. - - When you convey a copy of a covered work, you may at your option -remove any additional permissions from that copy, or from any part of -it. (Additional permissions may be written to require their own -removal in certain cases when you modify the work.) You may place -additional permissions on material, added by you to a covered work, -for which you have or can give appropriate copyright permission. - - Notwithstanding any other provision of this License, for material you -add to a covered work, you may (if authorized by the copyright holders of -that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the - terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or - author attributions in that material or in the Appropriate Legal - Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or - requiring that modified versions of such material be marked in - reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or - authors of the material; or - - e) Declining to grant rights under trademark law for use of some - trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that - material by anyone who conveys the material (or modified versions of - it) with contractual assumptions of liability to the recipient, for - any liability that these contractual assumptions directly impose on - those licensors and authors. - - All other non-permissive additional terms are considered "further -restrictions" within the meaning of section 10. If the Program as you -received it, or any part of it, contains a notice stating that it is -governed by this License along with a term that is a further -restriction, you may remove that term. If a license document contains -a further restriction but permits relicensing or conveying under this -License, you may add to a covered work material governed by the terms -of that license document, provided that the further restriction does -not survive such relicensing or conveying. - - If you add terms to a covered work in accord with this section, you -must place, in the relevant source files, a statement of the -additional terms that apply to those files, or a notice indicating -where to find the applicable terms. - - Additional terms, permissive or non-permissive, may be stated in the -form of a separately written license, or stated as exceptions; -the above requirements apply either way. - - 8. Termination. - - You may not propagate or modify a covered work except as expressly -provided under this License. Any attempt otherwise to propagate or -modify it is void, and will automatically terminate your rights under -this License (including any patent licenses granted under the third -paragraph of section 11). - - However, if you cease all violation of this License, then your -license from a particular copyright holder is reinstated (a) -provisionally, unless and until the copyright holder explicitly and -finally terminates your license, and (b) permanently, if the copyright -holder fails to notify you of the violation by some reasonable means -prior to 60 days after the cessation. - - Moreover, your license from a particular copyright holder is -reinstated permanently if the copyright holder notifies you of the -violation by some reasonable means, this is the first time you have -received notice of violation of this License (for any work) from that -copyright holder, and you cure the violation prior to 30 days after -your receipt of the notice. - - Termination of your rights under this section does not terminate the -licenses of parties who have received copies or rights from you under -this License. If your rights have been terminated and not permanently -reinstated, you do not qualify to receive new licenses for the same -material under section 10. - - 9. Acceptance Not Required for Having Copies. - - You are not required to accept this License in order to receive or -run a copy of the Program. Ancillary propagation of a covered work -occurring solely as a consequence of using peer-to-peer transmission -to receive a copy likewise does not require acceptance. However, -nothing other than this License grants you permission to propagate or -modify any covered work. These actions infringe copyright if you do -not accept this License. Therefore, by modifying or propagating a -covered work, you indicate your acceptance of this License to do so. - - 10. Automatic Licensing of Downstream Recipients. - - Each time you convey a covered work, the recipient automatically -receives a license from the original licensors, to run, modify and -propagate that work, subject to this License. You are not responsible -for enforcing compliance by third parties with this License. - - An "entity transaction" is a transaction transferring control of an -organization, or substantially all assets of one, or subdividing an -organization, or merging organizations. If propagation of a covered -work results from an entity transaction, each party to that -transaction who receives a copy of the work also receives whatever -licenses to the work the party's predecessor in interest had or could -give under the previous paragraph, plus a right to possession of the -Corresponding Source of the work from the predecessor in interest, if -the predecessor has it or can get it with reasonable efforts. - - You may not impose any further restrictions on the exercise of the -rights granted or affirmed under this License. For example, you may -not impose a license fee, royalty, or other charge for exercise of -rights granted under this License, and you may not initiate litigation -(including a cross-claim or counterclaim in a lawsuit) alleging that -any patent claim is infringed by making, using, selling, offering for -sale, or importing the Program or any portion of it. - - 11. Patents. - - A "contributor" is a copyright holder who authorizes use under this -License of the Program or a work on which the Program is based. The -work thus licensed is called the contributor's "contributor version". - - A contributor's "essential patent claims" are all patent claims -owned or controlled by the contributor, whether already acquired or -hereafter acquired, that would be infringed by some manner, permitted -by this License, of making, using, or selling its contributor version, -but do not include claims that would be infringed only as a -consequence of further modification of the contributor version. For -purposes of this definition, "control" includes the right to grant -patent sublicenses in a manner consistent with the requirements of -this License. - - Each contributor grants you a non-exclusive, worldwide, royalty-free -patent license under the contributor's essential patent claims, to -make, use, sell, offer for sale, import and otherwise run, modify and -propagate the contents of its contributor version. - - In the following three paragraphs, a "patent license" is any express -agreement or commitment, however denominated, not to enforce a patent -(such as an express permission to practice a patent or covenant not to -sue for patent infringement). To "grant" such a patent license to a -party means to make such an agreement or commitment not to enforce a -patent against the party. - - If you convey a covered work, knowingly relying on a patent license, -and the Corresponding Source of the work is not available for anyone -to copy, free of charge and under the terms of this License, through a -publicly available network server or other readily accessible means, -then you must either (1) cause the Corresponding Source to be so -available, or (2) arrange to deprive yourself of the benefit of the -patent license for this particular work, or (3) arrange, in a manner -consistent with the requirements of this License, to extend the patent -license to downstream recipients. "Knowingly relying" means you have -actual knowledge that, but for the patent license, your conveying the -covered work in a country, or your recipient's use of the covered work -in a country, would infringe one or more identifiable patents in that -country that you have reason to believe are valid. - - If, pursuant to or in connection with a single transaction or -arrangement, you convey, or propagate by procuring conveyance of, a -covered work, and grant a patent license to some of the parties -receiving the covered work authorizing them to use, propagate, modify -or convey a specific copy of the covered work, then the patent license -you grant is automatically extended to all recipients of the covered -work and works based on it. - - A patent license is "discriminatory" if it does not include within -the scope of its coverage, prohibits the exercise of, or is -conditioned on the non-exercise of one or more of the rights that are -specifically granted under this License. You may not convey a covered -work if you are a party to an arrangement with a third party that is -in the business of distributing software, under which you make payment -to the third party based on the extent of your activity of conveying -the work, and under which the third party grants, to any of the -parties who would receive the covered work from you, a discriminatory -patent license (a) in connection with copies of the covered work -conveyed by you (or copies made from those copies), or (b) primarily -for and in connection with specific products or compilations that -contain the covered work, unless you entered into that arrangement, -or that patent license was granted, prior to 28 March 2007. - - Nothing in this License shall be construed as excluding or limiting -any implied license or other defenses to infringement that may -otherwise be available to you under applicable patent law. - - 12. No Surrender of Others' Freedom. - - If conditions are imposed on you (whether by court order, agreement or -otherwise) that contradict the conditions of this License, they do not -excuse you from the conditions of this License. If you cannot convey a -covered work so as to satisfy simultaneously your obligations under this -License and any other pertinent obligations, then as a consequence you may -not convey it at all. For example, if you agree to terms that obligate you -to collect a royalty for further conveying from those to whom you convey -the Program, the only way you could satisfy both those terms and this -License would be to refrain entirely from conveying the Program. - - 13. Use with the GNU Affero General Public License. - - Notwithstanding any other provision of this License, you have -permission to link or combine any covered work with a work licensed -under version 3 of the GNU Affero General Public License into a single -combined work, and to convey the resulting work. The terms of this -License will continue to apply to the part which is the covered work, -but the special requirements of the GNU Affero General Public License, -section 13, concerning interaction through a network will apply to the -combination as such. - - 14. Revised Versions of this License. - - The Free Software Foundation may publish revised and/or new versions of -the GNU General Public License from time to time. Such new versions will -be similar in spirit to the present version, but may differ in detail to -address new problems or concerns. - - Each version is given a distinguishing version number. If the -Program specifies that a certain numbered version of the GNU General -Public License "or any later version" applies to it, you have the -option of following the terms and conditions either of that numbered -version or of any later version published by the Free Software -Foundation. If the Program does not specify a version number of the -GNU General Public License, you may choose any version ever published -by the Free Software Foundation. - - If the Program specifies that a proxy can decide which future -versions of the GNU General Public License can be used, that proxy's -public statement of acceptance of a version permanently authorizes you -to choose that version for the Program. - - Later license versions may give you additional or different -permissions. However, no additional obligations are imposed on any -author or copyright holder as a result of your choosing to follow a -later version. - - 15. Disclaimer of Warranty. - - THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY -APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT -HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY -OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, -THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM -IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF -ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - - 16. Limitation of Liability. - - IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING -WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS -THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY -GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE -USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF -DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD -PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), -EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF -SUCH DAMAGES. - - 17. Interpretation of Sections 15 and 16. - - If the disclaimer of warranty and limitation of liability provided -above cannot be given local legal effect according to their terms, -reviewing courts shall apply local law that most closely approximates -an absolute waiver of all civil liability in connection with the -Program, unless a warranty or assumption of liability accompanies a -copy of the Program in return for a fee. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -state the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. - - You should have received a copy of the GNU General Public License - along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - - If the program does terminal interaction, make it output a short -notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, your program's commands -might be different; for a GUI interface, you would use an "about box". - - You should also get your employer (if you work as a programmer) or school, -if any, to sign a "copyright disclaimer" for the program, if necessary. -For more information on this, and how to apply and follow the GNU GPL, see -. - - The GNU General Public License does not permit incorporating your program -into proprietary programs. If your program is a subroutine library, you -may consider it more useful to permit linking proprietary applications with -the library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. But first, please read -. diff --git a/README.md b/README.md index 125f951a..efd6e55e 100644 --- a/README.md +++ b/README.md @@ -1,41 +1,43 @@ -logo - -![](https://github.com/significa/significa.co/workflows/Deploy%20to%20Production/badge.svg) +# Significa website This is the repo for [Significa's website](https://significa.co/), our very own presence on the web. -![cover](https://user-images.githubusercontent.com/17513388/71968850-8cfb7c80-31fd-11ea-830a-771f2d97be13.png) +## Contributing -## significa.co +### Requirements -Project built with Gatsby. You can find more information on available scripts at https://www.gatsbyjs.org/. +- Set a GitHub Classic Personal Access Token (PAT) with read access to packages (`packages:read`) + in your shell with the name `GITHUB_AUTH_TOKEN`. -### Start up the project +- Get the `.env` using [1password-secrets](https://github.com/significa/1password-secrets/): + `1password-secrets local pull`. -Start a local development server at http://localhost:8000/ +- Install the node version specified in the `.nvmrc` file + (using your favourite nodeversion manager). -```sh -npm run develop -``` +- Install the dependencies with `npm install` (or `npm ci` for a frozen lockfile). -### Build +### Development -Make a new build to `/public` folder +- Start the development server: `npm run dev` +- Auto format the code: `npm run format` -```sh -npm run build -``` +### Testing and linting -### Validate codebase +- `npm run validate` +- `npm run test` -Run prettier, eslint, typescript and jest to validate codebase +# Deployment and release -```sh -npm run validate -``` +The staging branch is bounded to the `main` branch, create a PR against it for a new feature. -## Lambda functions +To deploy a new production version, create a semver release in GitHub +(prefixed with `v`, for example: `vX.X.X`). -Available at [significa.co-functions](https://github.com/significa/significa.co-functions) +To create a hotfixes: -[![Significa footer](https://user-images.githubusercontent.com/17513388/71971185-fc736b00-3201-11ea-9678-090b6b6a0b3f.png)](https://significa.co) +- Check-out to the latest release `git checkout vX.X.X`; +- Create a new branch `git checkout -b hotfix/XXXX`; +- Create a PR to `main`, get approval, and merge it; +- Create a new release based on your hotfix branch. + Use `release/xxx` branches to batch fixes together. diff --git a/__mocks__/$app/stores.ts b/__mocks__/$app/stores.ts new file mode 100644 index 00000000..07275cfb --- /dev/null +++ b/__mocks__/$app/stores.ts @@ -0,0 +1,52 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { readable } from 'svelte/store'; +import type * as stores from '$app/stores'; +import type { Navigation, Page } from '@sveltejs/kit'; + +export const mockStores = (config: { page?: Partial } = {}) => { + const getStores: typeof stores.getStores = () => { + const navigating = readable(null); + const page = readable({ + url: new URL('http://localhost'), + params: { path: '' }, + route: { + id: null + }, + form: {}, + status: 200, + error: null, + data: {} as any, + ...config.page + }); + const updated = { subscribe: readable(false).subscribe, check: async () => false }; + + return { navigating, page, updated }; + }; + + const page: typeof stores.page = { + subscribe(fn) { + return getStores().page.subscribe(fn); + } + }; + + const navigating: typeof stores.navigating = { + subscribe(fn) { + return getStores().navigating.subscribe(fn); + } + }; + const updated: typeof stores.updated = { + subscribe(fn) { + return getStores().updated.subscribe(fn); + }, + check: async () => false + }; + + return { + page, + navigating, + updated + }; +}; + +const { page, navigating, updated } = mockStores(); +export { page, navigating, updated }; diff --git a/__mocks__/fileMock.js b/__mocks__/fileMock.js deleted file mode 100644 index 0e56c5b5..00000000 --- a/__mocks__/fileMock.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = 'test-file-stub' diff --git a/assets.d.ts b/assets.d.ts deleted file mode 100644 index 107627e5..00000000 --- a/assets.d.ts +++ /dev/null @@ -1,5 +0,0 @@ -declare module '*.woff' -declare module '*.woff2' -declare module '*.svg' -declare module '*.png' -declare module '*.mp4' diff --git a/commitlint.config.js b/commitlint.config.js deleted file mode 100644 index 62023cca..00000000 --- a/commitlint.config.js +++ /dev/null @@ -1,3 +0,0 @@ -// see all rules: https://github.com/conventional-changelog/commitlint/blob/master/docs/reference-rules.md - -module.exports = { extends: ['@commitlint/config-conventional'] } diff --git a/components.198185.json b/components.198185.json new file mode 100644 index 00000000..e25e1273 --- /dev/null +++ b/components.198185.json @@ -0,0 +1,3627 @@ +{ + "components": [ + { + "name": "about-page", + "display_name": null, + "created_at": "2023-03-03T15:54:31.120Z", + "updated_at": "2023-04-26T13:15:53.912Z", + "id": 3521679, + "schema": { + "page_title": { + "type": "text", + "pos": 0 + }, + "physics_blocks": { + "type": "bloks", + "pos": 1, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": [ + "physics-balloon-card", + "physics-rectangle-card", + "physics-input", + "physics-sticker" + ] + }, + "about_title1": { + "type": "text", + "pos": 2 + }, + "about_title2": { + "type": "text", + "pos": 3 + }, + "about_description": { + "type": "textarea", + "pos": 4 + }, + "timeline": { + "type": "bloks", + "pos": 5, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["timeline-section"] + }, + "values_title1": { + "type": "text", + "pos": 6 + }, + "values_title2": { + "type": "text", + "pos": 7 + }, + "values_description": { + "type": "textarea", + "pos": 8 + }, + "values": { + "type": "bloks", + "pos": 9, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["value"], + "minimum": 3, + "maximum": 3 + }, + "testimonials_title1": { + "type": "text", + "pos": 10 + }, + "testimonials_title2": { + "type": "text", + "pos": 11 + }, + "testimonials_cta_label": { + "type": "text", + "pos": 12 + }, + "testimonials_cta_link": { + "type": "multilink", + "pos": 13, + "force_link_scope": false, + "link_scope": "" + }, + "testimonials": { + "type": "bloks", + "pos": 14, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["richtext-testimonial"] + }, + "clients_title": { + "type": "text", + "pos": 15 + }, + "clients": { + "type": "bloks", + "pos": 16, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["client-logo"] + }, + "office_title1": { + "type": "text", + "key": "office_title", + "pos": 17 + }, + "office_title2": { + "type": "text", + "pos": 18 + }, + "office_description": { + "type": "textarea", + "pos": 19 + }, + "office_cards": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["notepad_card", "photo_card"], + "minimum": 6, + "maximum": 6, + "pos": 20 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "about-page", + "component_group_uuid": "78726ff5-00c6-4ddb-bfef-551b83977e54", + "color": null, + "icon": null, + "component_group_name": "Pages" + }, + { + "name": "awards_entry", + "display_name": null, + "created_at": "2023-05-04T08:53:34.816Z", + "updated_at": "2023-05-11T09:14:10.069Z", + "id": 3924078, + "schema": { + "image": { + "type": "asset", + "filetypes": ["images"], + "pos": 0 + }, + "label": { + "type": "text", + "pos": 1 + }, + "name": { + "type": "text", + "pos": 2 + }, + "project": { + "type": "text", + "pos": 3 + }, + "link_text": { + "type": "text", + "pos": 4 + }, + "link": { + "type": "multilink", + "pos": 5 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "awards_entry", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "benefits-entry", + "display_name": null, + "created_at": "2023-04-21T09:26:11.845Z", + "updated_at": "2023-05-11T11:21:55.451Z", + "id": 3857099, + "schema": { + "image": { + "type": "asset", + "pos": 1, + "filetypes": ["images"] + }, + "title": { + "type": "text", + "pos": 2 + }, + "description": { + "type": "text", + "pos": 3 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "benefits-entry", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "blog-index", + "display_name": null, + "created_at": "2023-03-15T11:28:33.845Z", + "updated_at": "2023-03-15T11:28:33.845Z", + "id": 3586372, + "schema": {}, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "blog-index", + "component_group_uuid": "78726ff5-00c6-4ddb-bfef-551b83977e54", + "color": null, + "icon": null, + "component_group_name": "Pages" + }, + { + "name": "blog-post", + "display_name": null, + "created_at": "2023-02-15T13:03:53.849Z", + "updated_at": "2023-05-11T20:13:46.340Z", + "id": 3442347, + "schema": { + "cover": { + "type": "asset", + "filetypes": ["images"], + "asset_folder_id": 212285, + "required": false + }, + "intro": { + "type": "textarea", + "required": true + }, + "author": { + "type": "option", + "use_uuid": true, + "required": true, + "source": "internal_stories", + "filter_content_type": ["team-member"] + }, + "tab-9a5d9933-3840-42d8-aa24-d87e83a9eb5d": { + "display_name": "Content", + "keys": ["body"], + "pos": 0, + "type": "tab" + }, + "tab-c1b66206-334d-4470-a996-ca9aa074e23c": { + "display_name": "SEO", + "keys": ["seo_title", "seo_description", "seo_og_image"], + "pos": 0, + "type": "tab" + }, + "seo_title": { + "type": "text" + }, + "seo_description": { + "type": "text" + }, + "seo_og_image": { + "type": "asset", + "filetypes": ["images"], + "asset_folder_id": 212285 + }, + "body": { + "type": "richtext", + "restrict_type": "groups", + "restrict_components": true, + "component_group_whitelist": [ + "76b6a3af-a1fa-4ffe-b980-52a2da9245ca", + "1ef77ef8-466a-4b74-a076-f4554004e128" + ], + "customize_toolbar": true, + "toolbar": [ + "bold", + "italic", + "strike", + "underline", + "inlinecode", + "paragraph", + "h2", + "h3", + "list", + "olist", + "quote", + "hrule", + "link", + "blok", + "h4" + ] + } + }, + "image": "//a.storyblok.com/f/198185/x/f51edbf69b/screenshot-2023-03-22-at-11-49-53.png", + "preview_field": null, + "is_root": true, + "preview_tmpl": null, + "is_nestable": false, + "all_presets": [], + "preset_id": null, + "real_name": "blog-post", + "component_group_uuid": "a8397001-eca6-4f46-8edb-833d6924db9f", + "color": "#fbce41", + "icon": "block-text-img-t-l", + "component_group_name": "Content Types" + }, + { + "name": "canvas-checklist", + "display_name": null, + "created_at": "2023-05-02T10:44:42.656Z", + "updated_at": "2023-05-02T13:42:38.832Z", + "id": 3914196, + "schema": { + "title": { + "type": "text", + "pos": 0 + }, + "items": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["canvas-checklist-item"], + "maximum": 8, + "pos": 1 + }, + "top": { + "type": "number", + "default_value": "0" + }, + "left": { + "type": "number", + "default_value": "0" + }, + "rotate": { + "type": "number", + "default_value": "0" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "canvas-checklist", + "component_group_uuid": "3c80dc73-98c3-4c97-a2b2-44541c933f72", + "color": null, + "icon": null, + "component_group_name": "Canvas" + }, + { + "name": "canvas-checklist-item", + "display_name": null, + "created_at": "2023-05-02T10:44:58.838Z", + "updated_at": "2023-05-02T11:20:15.386Z", + "id": 3914197, + "schema": { + "text": { + "type": "text", + "pos": 1 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "canvas-checklist-item", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "canvas-egg", + "display_name": null, + "created_at": "2023-05-09T07:51:24.871Z", + "updated_at": "2023-05-09T09:54:36.783Z", + "id": 3943360, + "schema": { + "top": { + "type": "number" + }, + "left": { + "type": "number" + }, + "rotate": { + "type": "number" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "canvas-egg", + "component_group_uuid": "3c80dc73-98c3-4c97-a2b2-44541c933f72", + "color": null, + "icon": null, + "component_group_name": "Canvas" + }, + { + "name": "canvas-egg-hatching", + "display_name": null, + "created_at": "2023-05-09T15:20:36.052Z", + "updated_at": "2023-05-09T15:20:58.595Z", + "id": 3946110, + "schema": { + "top": { + "type": "number" + }, + "left": { + "type": "number" + }, + "rotate": { + "type": "number" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "canvas-egg-hatching", + "component_group_uuid": "3c80dc73-98c3-4c97-a2b2-44541c933f72", + "color": null, + "icon": null, + "component_group_name": "Canvas" + }, + { + "name": "canvas-group", + "display_name": null, + "created_at": "2023-04-19T14:57:33.541Z", + "updated_at": "2023-05-09T15:22:02.381Z", + "id": 3845878, + "schema": { + "width": { + "type": "number", + "pos": 0, + "default_value": "240" + }, + "height": { + "type": "number", + "pos": 1, + "default_value": "240" + }, + "top": { + "type": "number", + "decimals": 0, + "pos": 2, + "default_value": "0", + "description": "0 is approximately the vertical center of the canvas" + }, + "left": { + "type": "number", + "decimals": 0, + "pos": 3, + "default_value": "0", + "description": "0 is approximately the horizontal center of the canvas" + }, + "items": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": [ + "canvas-checklist", + "canvas-media", + "canvas-talk-balloon", + "canvas-team", + "canvas-yellow-sticker", + "timeline-arrow", + "timeline-text", + "canvas-tictactoe", + "canvas-tarot", + "canvas-plant", + "canvas-egg", + "canvas-egg-hatching" + ], + "pos": 4, + "component_group_whitelist": [] + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "canvas-group", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "canvas-media", + "display_name": null, + "created_at": "2023-05-02T14:13:42.055Z", + "updated_at": "2023-05-11T17:30:02.479Z", + "id": 3915336, + "schema": { + "image": { + "type": "asset", + "filetypes": ["images", "videos"], + "description": "Photo or video. Video will play once on click.", + "asset_folder_id": 235349, + "pos": 0 + }, + "width": { + "type": "number", + "pos": 1, + "default_value": "100", + "description": "If media is a Video please provide its dimensions" + }, + "height": { + "type": "number", + "pos": 2, + "description": "If media is a Video please provide its dimensions", + "default_value": "100" + }, + "border": { + "type": "boolean", + "default_value": true, + "pos": 3 + }, + "top": { + "type": "number", + "required": true, + "default_value": "0", + "decimals": 0, + "pos": 4 + }, + "left": { + "type": "number", + "decimals": 0, + "default_value": "0", + "required": true, + "pos": 5 + }, + "scale": { + "type": "number", + "default_value": "1", + "decimals": 2, + "description": "Between 0 and 1", + "pos": 6 + }, + "rotate": { + "type": "number", + "default_value": "0", + "decimals": 0, + "pos": 7 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": "{{image(options.image.filename)/}}", + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "canvas-media", + "component_group_uuid": "3c80dc73-98c3-4c97-a2b2-44541c933f72", + "color": null, + "icon": null, + "component_group_name": "Canvas" + }, + { + "name": "canvas-plant", + "display_name": null, + "created_at": "2023-05-09T07:22:26.974Z", + "updated_at": "2023-05-09T14:10:59.819Z", + "id": 3943234, + "schema": { + "plant": { + "type": "option", + "use_uuid": true + }, + "top": { + "type": "number" + }, + "left": { + "type": "number" + }, + "rotate": { + "type": "number" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "canvas-plant", + "component_group_uuid": "3c80dc73-98c3-4c97-a2b2-44541c933f72", + "color": null, + "icon": null, + "component_group_name": "Canvas" + }, + { + "name": "canvas-talk-balloon", + "display_name": null, + "created_at": "2023-04-21T11:10:59.947Z", + "updated_at": "2023-04-21T11:23:40.749Z", + "id": 3857957, + "schema": { + "position": { + "type": "option", + "use_uuid": true, + "options": [ + { + "_uid": "053e2f45-072e-432f-8865-5f168571b358", + "name": "Left", + "value": "left" + }, + { + "_uid": "f097330e-798c-485a-bc94-0ae110165f48", + "value": "right", + "name": "Right" + } + ], + "exclude_empty_option": true, + "default_value": "right", + "pos": 0 + }, + "text": { + "type": "textarea", + "pos": 1 + }, + "top": { + "type": "number", + "pos": 2 + }, + "left": { + "type": "number", + "use_uuid": true, + "pos": 3 + }, + "rotate": { + "type": "number", + "pos": 4 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "canvas-talk-balloon", + "component_group_uuid": "3c80dc73-98c3-4c97-a2b2-44541c933f72", + "color": null, + "icon": null, + "component_group_name": "Canvas" + }, + { + "name": "canvas-tarot", + "display_name": null, + "created_at": "2023-05-08T08:28:31.521Z", + "updated_at": "2023-05-09T14:06:47.049Z", + "id": 3938071, + "schema": { + "image": { + "type": "option", + "use_uuid": true, + "options": [ + { + "_uid": "d35d369e-df2f-46f4-94ac-fba00e58c0a5", + "name": "sun", + "value": "sun" + }, + { + "_uid": "cbbca55b-0f45-4f36-aa36-036b59bb38f9", + "value": "moon", + "name": "moon" + } + ], + "exclude_empty_option": true + }, + "text": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["canvas-tarot-text"] + }, + "top": { + "type": "number" + }, + "left": { + "type": "number" + }, + "rotate": { + "type": "number" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "canvas-tarot", + "component_group_uuid": "3c80dc73-98c3-4c97-a2b2-44541c933f72", + "color": null, + "icon": null, + "component_group_name": "Canvas" + }, + { + "name": "canvas-tarot-text", + "display_name": null, + "created_at": "2023-05-08T08:31:41.841Z", + "updated_at": "2023-05-08T08:31:55.015Z", + "id": 3938093, + "schema": { + "text": { + "type": "text" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "canvas-tarot-text", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "canvas-team", + "display_name": null, + "created_at": "2023-04-20T15:57:09.434Z", + "updated_at": "2023-05-05T15:38:19.709Z", + "id": 3853263, + "schema": { + "team": { + "type": "option", + "use_uuid": true, + "source": "internal", + "datasource_slug": "teams", + "exclude_empty_option": true + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "canvas-team", + "component_group_uuid": "3c80dc73-98c3-4c97-a2b2-44541c933f72", + "color": null, + "icon": null, + "component_group_name": "Canvas" + }, + { + "name": "canvas-tictactoe", + "display_name": null, + "created_at": "2023-05-03T13:09:31.502Z", + "updated_at": "2023-05-03T13:11:22.873Z", + "id": 3919751, + "schema": { + "top": { + "type": "number", + "default_value": "0" + }, + "left": { + "type": "number", + "default_value": "0" + }, + "rotate": { + "type": "number", + "description": "", + "default_value": "0" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "canvas-tictactoe", + "component_group_uuid": "3c80dc73-98c3-4c97-a2b2-44541c933f72", + "color": null, + "icon": null, + "component_group_name": "Canvas" + }, + { + "name": "canvas-yellow-sticker", + "display_name": null, + "created_at": "2023-04-20T14:56:50.671Z", + "updated_at": "2023-04-20T15:06:26.358Z", + "id": 3853042, + "schema": { + "text": { + "type": "textarea" + }, + "top": { + "type": "number" + }, + "left": { + "type": "number" + }, + "rotate": { + "type": "number", + "max_value": 360, + "min_value": -360 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "canvas-yellow-sticker", + "component_group_uuid": "3c80dc73-98c3-4c97-a2b2-44541c933f72", + "color": null, + "icon": null, + "component_group_name": "Canvas" + }, + { + "name": "career", + "display_name": null, + "created_at": "2023-03-23T13:12:20.312Z", + "updated_at": "2023-04-06T15:46:23.809Z", + "id": 3647314, + "schema": { + "cover": { + "type": "asset", + "pos": 0, + "filetypes": ["images"] + }, + "body": { + "type": "richtext", + "customize_toolbar": true, + "toolbar": [ + "blok", + "bold", + "list", + "inlinecode", + "h2", + "h3", + "h4", + "hrule", + "italic", + "link", + "olist", + "paragraph", + "quote", + "strike", + "underline" + ], + "restrict_type": "groups", + "restrict_components": true, + "component_group_whitelist": [ + "76b6a3af-a1fa-4ffe-b980-52a2da9245ca", + "1ef77ef8-466a-4b74-a076-f4554004e128" + ], + "pos": 1 + }, + "seo_title": { + "type": "text", + "pos": 2 + }, + "seo_description": { + "type": "text", + "pos": 3 + }, + "seo_og_image": { + "type": "asset", + "filetypes": ["images"], + "pos": 4 + }, + "tab-0df1eb17-e1de-4dfd-92cb-c73b4839beec": { + "display_name": "SEO", + "keys": ["seo_title", "seo_description", "seo_og_image"], + "pos": 5, + "type": "tab" + } + }, + "image": null, + "preview_field": null, + "is_root": true, + "preview_tmpl": null, + "is_nestable": false, + "all_presets": [], + "preset_id": null, + "real_name": "career", + "component_group_uuid": "a8397001-eca6-4f46-8edb-833d6924db9f", + "color": null, + "icon": null, + "component_group_name": "Content Types" + }, + { + "name": "careers-page", + "display_name": null, + "created_at": "2023-04-19T14:55:51.954Z", + "updated_at": "2023-04-21T09:28:18.507Z", + "id": 3845873, + "schema": { + "page_title": { + "type": "text", + "key": "page_title", + "pos": 0 + }, + "canvas": { + "type": "section", + "pos": 1, + "keys": ["canvas_items", "canvas_height", "canvas_width"] + }, + "canvas_width": { + "type": "number", + "default_value": "3000", + "pos": 2 + }, + "canvas_height": { + "type": "number", + "default_value": "3000", + "pos": 3 + }, + "canvas_items": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["canvas-group"], + "key": "canvas", + "pos": 4 + }, + "careers_title1": { + "type": "text", + "key": "careers_title1", + "pos": 5 + }, + "careers_title2": { + "type": "text", + "key": "careers_title2", + "pos": 6 + }, + "careers_description": { + "type": "textarea", + "key": "careers_description", + "pos": 7 + }, + "open_positions_title": { + "type": "text" + }, + "open_positions_description": { + "type": "text" + }, + "images": { + "type": "multiasset", + "filetypes": ["images"] + }, + "benefits_title": { + "type": "text" + }, + "benefits_description": { + "type": "text" + }, + "benefits": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["benefits-entry"] + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "careers-page", + "component_group_uuid": "78726ff5-00c6-4ddb-bfef-551b83977e54", + "color": null, + "icon": null, + "component_group_name": "Pages" + }, + { + "name": "client", + "display_name": null, + "created_at": "2023-02-15T13:54:34.423Z", + "updated_at": "2023-03-03T12:08:04.296Z", + "id": 3442784, + "schema": { + "catech_labs": { + "type": "text", + "display_name": "Catech Labs" + } + }, + "image": null, + "preview_field": null, + "is_root": true, + "preview_tmpl": null, + "is_nestable": false, + "all_presets": [], + "preset_id": null, + "real_name": "client", + "component_group_uuid": "f789ade7-9cf4-4fd4-b95a-56b2cbe5844f", + "color": null, + "icon": null, + "component_group_name": "Configuration" + }, + { + "name": "client-logo", + "display_name": null, + "created_at": "2023-04-11T13:27:27.785Z", + "updated_at": "2023-04-12T13:16:39.209Z", + "id": 3785709, + "schema": { + "light_mode": { + "type": "asset", + "filetypes": ["images"], + "asset_folder_id": 228928 + }, + "dark_mode": { + "type": "asset", + "filetypes": ["images"], + "asset_folder_id": 228928 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "client-logo", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "column", + "display_name": null, + "created_at": "2023-02-16T10:38:00.191Z", + "updated_at": "2023-03-02T17:04:33.780Z", + "id": 3446784, + "schema": { + "content": { + "type": "richtext", + "required": true, + "customize_toolbar": true, + "toolbar": [ + "bold", + "italic", + "strike", + "underline", + "inlinecode", + "paragraph", + "h2", + "list", + "olist", + "link", + "blok", + "h3", + "h4" + ], + "restrict_type": "groups", + "restrict_components": true, + "component_group_whitelist": [ + "76b6a3af-a1fa-4ffe-b980-52a2da9245ca", + "1ef77ef8-466a-4b74-a076-f4554004e128" + ] + }, + "sticky": { + "type": "boolean" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "column", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "comparison", + "display_name": null, + "created_at": "2023-02-16T10:41:06.792Z", + "updated_at": "2023-03-22T11:05:45.912Z", + "id": 3446841, + "schema": { + "width": { + "type": "option", + "use_uuid": true, + "options": [ + { + "_uid": "09c4789f-7865-4984-a89d-1a2265eaa19b", + "name": "narrow", + "value": "narrow" + }, + { + "_uid": "74631241-0230-4d78-8227-27ade9bc272c", + "value": "medium", + "name": "medium" + }, + { + "_uid": "741db3c8-b251-4aa3-a839-231ad0a98590", + "value": "wide", + "name": "wide" + } + ], + "default_value": "narrow" + }, + "image_a": { + "type": "asset", + "filetypes": ["images"], + "required": true + }, + "image_b": { + "type": "asset", + "filetypes": ["images"], + "required": true + } + }, + "image": "//a.storyblok.com/f/198185/x/8514279d68/screenshot-2023-03-22-at-11-05-27.png", + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "comparison", + "component_group_uuid": "76b6a3af-a1fa-4ffe-b980-52a2da9245ca", + "color": "#fbce41", + "icon": "block-table", + "component_group_name": "Blocks & Rich Text" + }, + { + "name": "configuration", + "display_name": null, + "created_at": "2023-03-13T17:47:31.124Z", + "updated_at": "2023-03-14T11:00:46.181Z", + "id": 3575812, + "schema": { + "primary_navigation": { + "type": "options", + "source": "internal_stories", + "max_options": "3" + }, + "call_to_action": { + "type": "bloks", + "minimum": 1, + "maximum": 1, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["link"] + }, + "footer": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["footer-column-internal", "footer-column-external"] + } + }, + "image": null, + "preview_field": null, + "is_root": true, + "preview_tmpl": null, + "is_nestable": false, + "all_presets": [], + "preset_id": null, + "real_name": "configuration", + "component_group_uuid": "f789ade7-9cf4-4fd4-b95a-56b2cbe5844f", + "color": null, + "icon": null, + "component_group_name": "Configuration" + }, + { + "name": "contacts-page", + "display_name": null, + "created_at": "2023-03-03T13:47:28.940Z", + "updated_at": "2023-04-27T10:01:47.940Z", + "id": 3521049, + "schema": { + "page_title1": { + "type": "text" + }, + "page_title2": { + "type": "text" + }, + "form_support_text": { + "type": "textarea" + }, + "gallery": { + "type": "bloks", + "minimum": 6, + "maximum": 6, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["notepad_card", "photo_card"] + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "contacts-page", + "component_group_uuid": "78726ff5-00c6-4ddb-bfef-551b83977e54", + "color": null, + "icon": null, + "component_group_name": "Pages" + }, + { + "name": "deliverable", + "display_name": null, + "created_at": "2023-02-15T13:54:14.804Z", + "updated_at": "2023-02-15T13:54:14.804Z", + "id": 3442781, + "schema": {}, + "image": null, + "preview_field": null, + "is_root": true, + "preview_tmpl": null, + "is_nestable": false, + "all_presets": [], + "preset_id": null, + "real_name": "deliverable", + "component_group_uuid": "f789ade7-9cf4-4fd4-b95a-56b2cbe5844f", + "color": null, + "icon": null, + "component_group_name": "Configuration" + }, + { + "name": "deliverables_entry", + "display_name": null, + "created_at": "2023-05-04T15:01:16.651Z", + "updated_at": "2023-05-04T15:01:35.645Z", + "id": 3926730, + "schema": { + "icon": { + "type": "asset", + "filetypes": ["images"] + }, + "title": { + "type": "text" + }, + "description": { + "type": "text" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "deliverables_entry", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "footer-column-external", + "display_name": "Footer external links", + "created_at": "2023-03-14T10:59:53.399Z", + "updated_at": "2023-03-14T11:00:16.441Z", + "id": 3579925, + "schema": { + "title": { + "type": "text" + }, + "links": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["link"] + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "Footer external links", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "footer-column-internal", + "display_name": "Footer internal links", + "created_at": "2023-03-13T17:50:36.332Z", + "updated_at": "2023-03-14T10:59:40.056Z", + "id": 3575813, + "schema": { + "title": { + "type": "text" + }, + "links": { + "type": "options", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["link"], + "source": "internal_stories" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "Footer internal links", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "get-a-quote-page", + "display_name": null, + "created_at": "2023-03-03T13:47:17.251Z", + "updated_at": "2023-03-30T13:34:06.557Z", + "id": 3521048, + "schema": { + "title": { + "type": "text" + }, + "subtitle": { + "type": "text" + }, + "timezone_text": { + "type": "richtext", + "customize_toolbar": true, + "toolbar": ["paragraph", "bold"] + }, + "steps_title": { + "type": "text" + }, + "steps_subtitle": { + "type": "text" + }, + "steps": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["get-a-quote-step"] + }, + "images": { + "type": "multiasset", + "filetypes": ["images"] + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "get-a-quote-page", + "component_group_uuid": "78726ff5-00c6-4ddb-bfef-551b83977e54", + "color": null, + "icon": null, + "component_group_name": "Pages" + }, + { + "name": "get-a-quote-step", + "display_name": null, + "created_at": "2023-03-30T13:32:36.241Z", + "updated_at": "2023-03-30T13:32:44.359Z", + "id": 3704710, + "schema": { + "title": { + "type": "text" + }, + "description": { + "type": "text" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "get-a-quote-step", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "handbook", + "display_name": null, + "created_at": "2023-02-15T13:50:12.113Z", + "updated_at": "2023-05-04T09:09:12.330Z", + "id": 3442773, + "schema": { + "cover": { + "type": "asset", + "filetypes": ["images"], + "asset_folder_id": 212287, + "key": "cover", + "pos": 0 + }, + "tagline": { + "type": "text", + "key": "tagline", + "pos": 1 + }, + "intro": { + "type": "textarea", + "key": "intro", + "pos": 2 + }, + "tab-6a37f9e9-5fe6-4268-a3e4-7fd4ed252cc0": { + "display_name": "Content", + "keys": ["body"], + "pos": 3, + "type": "tab", + "key": "tab-6a37f9e9-5fe6-4268-a3e4-7fd4ed252cc0" + }, + "tab-40ff5487-8b8b-40db-afae-1c64b4705bbc": { + "display_name": "SEO", + "keys": ["seo_title", "seo_description", "seo_og_image"], + "pos": 4, + "type": "tab", + "key": "tab-40ff5487-8b8b-40db-afae-1c64b4705bbc" + }, + "body": { + "type": "richtext", + "restrict_type": "groups", + "restrict_components": true, + "component_group_whitelist": [ + "76b6a3af-a1fa-4ffe-b980-52a2da9245ca", + "1ef77ef8-466a-4b74-a076-f4554004e128" + ], + "customize_toolbar": true, + "toolbar": [ + "bold", + "italic", + "strike", + "underline", + "inlinecode", + "paragraph", + "h2", + "list", + "olist", + "quote", + "link", + "hrule", + "blok", + "h3", + "h4" + ], + "key": "body", + "pos": 5 + }, + "seo_title": { + "type": "text", + "key": "seo_title", + "pos": 6 + }, + "seo_description": { + "type": "text", + "key": "seo_description", + "pos": 7 + }, + "seo_og_image": { + "type": "asset", + "filetypes": ["images"], + "asset_folder_id": 212287, + "key": "seo_og_image", + "pos": 8 + }, + "draft": { + "type": "boolean", + "key": "coming_soon", + "pos": 9, + "default_value": true + } + }, + "image": null, + "preview_field": null, + "is_root": true, + "preview_tmpl": null, + "is_nestable": false, + "all_presets": [], + "preset_id": null, + "real_name": "handbook", + "component_group_uuid": "a8397001-eca6-4f46-8edb-833d6924db9f", + "color": null, + "icon": null, + "component_group_name": "Content Types" + }, + { + "name": "home-about-link", + "display_name": null, + "created_at": "2023-04-10T15:09:32.455Z", + "updated_at": "2023-04-10T15:10:13.125Z", + "id": 3776794, + "schema": { + "title": { + "type": "text", + "pos": 0 + }, + "description": { + "type": "text", + "pos": 1 + }, + "link_label": { + "type": "text", + "pos": 2 + }, + "link": { + "type": "multilink", + "pos": 3 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "home-about-link", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "home-page", + "display_name": null, + "created_at": "2023-03-03T14:59:15.465Z", + "updated_at": "2023-05-11T14:55:55.388Z", + "id": 3521503, + "schema": { + "small_highlights": { + "type": "options", + "pos": 0, + "maximum": 4, + "source": "internal_stories", + "max_options": "4", + "key": "small_highlights", + "filter_content_type": ["career", "project", "handbook", "blog-post"] + }, + "showreel": { + "type": "asset", + "filetypes": ["videos"], + "pos": 1, + "key": "showreel" + }, + "showreel_cover": { + "type": "asset", + "pos": 2, + "filetypes": ["images"], + "required": true + }, + "showreel_button_theme": { + "type": "option", + "pos": 3, + "use_uuid": true, + "options": [ + { + "_uid": "8cf2eb43-ab0b-4001-827d-a254aa307732", + "name": "light", + "value": "light" + }, + { + "_uid": "af618c15-3a92-4db2-ac22-09fa4c09d4ad", + "value": "dark", + "name": "dark" + } + ], + "default_value": "light" + }, + "showreel_button_label": { + "type": "text", + "pos": 4, + "key": "showreel_button_label" + }, + "work_title": { + "type": "text", + "pos": 5, + "key": "work_title" + }, + "projects": { + "type": "options", + "pos": 6, + "source": "internal_stories", + "filter_content_type": ["project"], + "key": "projects" + }, + "services_title1": { + "type": "text", + "pos": 7 + }, + "services_title2": { + "type": "text", + "pos": 8 + }, + "services_description": { + "type": "textarea", + "pos": 9 + }, + "services_cta_label": { + "type": "text", + "pos": 10 + }, + "services_cta_link": { + "type": "multilink", + "pos": 11 + }, + "about_title1": { + "type": "text", + "key": "about_title1", + "pos": 12 + }, + "about_title2": { + "type": "text", + "key": "about_title2", + "pos": 13 + }, + "about_description": { + "type": "textarea", + "key": "about_description", + "pos": 14 + }, + "about_physics_cards": { + "type": "bloks", + "pos": 15, + "required": false, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": [ + "physics-balloon-card", + "physics-input", + "physics-rectangle-card", + "physics-sticker" + ], + "key": "about_physics_cards" + }, + "about_link": { + "type": "bloks", + "maximum": 1, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["link"], + "key": "about_link", + "pos": 16 + }, + "about_links": { + "type": "bloks", + "pos": 17, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["home-about-link"], + "maximum": 3, + "minimum": 3, + "key": "about_links" + }, + "testimonials_title1": { + "type": "text", + "key": "testimonials_title1", + "pos": 18 + }, + "testimonials_title2": { + "type": "text", + "key": "testimonials_title2", + "pos": 19 + }, + "testimonials_cta_label": { + "type": "text", + "pos": 20, + "key": "testimonials_cta_label" + }, + "testimonials_cta_link": { + "type": "multilink", + "pos": 21, + "key": "testimonials_cta" + }, + "testimonials": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["richtext-testimonial"], + "maximum": 5, + "minimum": 5, + "key": "testimonials", + "pos": 22 + }, + "blog_title1": { + "type": "text", + "pos": 23, + "key": "blog_title1" + }, + "blog_title2": { + "type": "text", + "pos": 24, + "key": "blog_title2" + }, + "handbook_title": { + "type": "text", + "pos": 25, + "key": "handbook_title" + }, + "handbook_description": { + "type": "textarea", + "pos": 26, + "key": "handbook_description" + }, + "handbook_cta_text": { + "type": "text", + "pos": 27 + }, + "handbook_cta_link": { + "type": "multilink", + "pos": 28 + }, + "careers_title": { + "type": "text", + "pos": 29 + }, + "careers_button_label": { + "type": "text", + "pos": 30, + "key": "careers_button_label" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "home-page", + "component_group_uuid": "78726ff5-00c6-4ddb-bfef-551b83977e54", + "color": null, + "icon": null, + "component_group_name": "Pages" + }, + { + "name": "image", + "display_name": null, + "created_at": "2023-02-16T10:44:18.022Z", + "updated_at": "2023-03-29T15:31:23.095Z", + "id": 3446843, + "schema": { + "width": { + "type": "option", + "use_uuid": true, + "options": [ + { + "_uid": "21223c72-b154-419e-9c95-4f9f315daa20", + "name": "narrow", + "value": "narrow" + }, + { + "_uid": "0fb0b1a6-0346-435e-b19e-045bd2336322", + "value": "medium", + "name": "medium" + }, + { + "_uid": "086d0252-87fa-4d75-96ca-509fd1e58d95", + "value": "wide", + "name": "wide" + }, + { + "_uid": "9f31e72a-4f9d-4281-8fb7-31af0c3b7eae", + "value": "full", + "name": "full" + } + ], + "default_value": "narrow" + }, + "image": { + "type": "asset", + "filetypes": ["images"], + "required": true + }, + "expandable": { + "type": "boolean" + } + }, + "image": "//a.storyblok.com/f/198185/x/94b8136fef/screenshot-2023-03-22-at-10-39-48.png", + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "image", + "component_group_uuid": "76b6a3af-a1fa-4ffe-b980-52a2da9245ca", + "color": "#fbce41", + "icon": "block-image", + "component_group_name": "Blocks & Rich Text" + }, + { + "name": "image-grid", + "display_name": null, + "created_at": "2023-02-16T10:48:55.079Z", + "updated_at": "2023-03-22T11:07:18.021Z", + "id": 3446857, + "schema": { + "width": { + "type": "option", + "use_uuid": true, + "options": [ + { + "_uid": "c19bc13b-7acd-4264-ac2c-d422e29c98dd", + "name": "medium", + "value": "medium" + }, + { + "_uid": "a7b8ee30-ad4a-41ff-b8c7-7c4941d49942", + "value": "wide", + "name": "wide" + } + ], + "default_value": "medium", + "pos": 0 + }, + "density": { + "type": "option", + "use_uuid": true, + "pos": 1, + "options": [ + { + "_uid": "6faf660e-45a8-4082-8833-258876b72ded", + "name": "regular", + "value": "regular" + }, + { + "_uid": "7f0ed7cf-5d96-439d-9f28-7d0b7ab43c9d", + "value": "loose", + "name": "loose" + }, + { + "_uid": "dd009e3f-1416-477d-826e-1736ce6492de", + "value": "tight", + "name": "tight" + } + ], + "default_value": "regular" + }, + "images": { + "type": "multiasset", + "filetypes": ["images"], + "required": true, + "pos": 2 + }, + "expandable": { + "type": "boolean", + "pos": 3 + } + }, + "image": "//a.storyblok.com/f/198185/x/3f50615bdf/screenshot-2023-03-22-at-11-06-57.png", + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "image-grid", + "component_group_uuid": "76b6a3af-a1fa-4ffe-b980-52a2da9245ca", + "color": "#fbce41", + "icon": "block-1-2block", + "component_group_name": "Blocks & Rich Text" + }, + { + "name": "link", + "display_name": null, + "created_at": "2023-02-15T13:51:55.247Z", + "updated_at": "2023-02-15T13:52:44.426Z", + "id": 3442775, + "schema": { + "label": { + "type": "text" + }, + "link": { + "type": "multilink" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "link", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "notepad_card", + "display_name": null, + "created_at": "2023-04-11T13:32:29.435Z", + "updated_at": "2023-04-11T13:32:35.750Z", + "id": 3785715, + "schema": { + "text": { + "type": "textarea" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "notepad_card", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "page", + "display_name": null, + "created_at": "2023-03-03T13:41:50.937Z", + "updated_at": "2023-05-11T20:13:31.271Z", + "id": 3520995, + "schema": { + "page": { + "type": "bloks", + "restrict_type": "groups", + "restrict_components": true, + "component_whitelist": [], + "component_group_whitelist": ["78726ff5-00c6-4ddb-bfef-551b83977e54"], + "maximum": 1 + }, + "tab-b1b4aa1b-2d5c-436e-ac16-09e30b9de047": { + "display_name": "SEO", + "keys": ["seo_title", "seo_description", "seo_og_image", "change_frequency", "priority"], + "pos": 0, + "type": "tab" + }, + "seo_title": { + "type": "text", + "required": false + }, + "seo_description": { + "type": "text", + "required": false + }, + "seo_og_image": { + "type": "asset", + "filetypes": ["images"] + }, + "change_frequency": { + "type": "option", + "use_uuid": true, + "datasource_slug": "sitemap-frequencies", + "description": "The frequency with which the page is expected to change.\n\n1. Always\nThese page types are constantly changing and will include index pages on major news publications, Google News, stock market data, and social bookmarking categories.\n\n2. Hourly\nThese pages update every hour and will also include major news publications as well as weather services and forums.\n\n3. Daily\nPages updated on average once per day and include things like blog posts, smaller web forum pages, message boards, and classified ads.\n\n4. Weekly\nUpdates typically occur once per week, these pages will include website directories, product pricing pages, and smaller blogs.\n\n5. Monthly\nThese are updated once per month, give or take, and include category pages, FAQs, and sometimes Help Desk articles that change slightly. Refer to the section above for guidelines on what is considered to be a change frequency trigger.\n\n6. Yearly\nUpdates on these pages happen on an annual basis and are typically your contact page, “About” page, login pages, and registration pages.\n\n7. Never\nAs the name suggests, these pages never ever get updates. These are really old blog posts, press releases, notifications about updates that never need updating, and completely static pages.", + "options": [ + { + "_uid": "1dfa2d4f-d7af-4d1c-8793-b00914cddbea", + "name": "Always", + "value": "always" + }, + { + "_uid": "a5852b8e-d940-47e6-9e79-dd7df19e371f", + "value": "hourly", + "name": "Hourly" + }, + { + "_uid": "3be82f32-a5c1-4ef5-81c3-37420b912bef", + "value": "daily", + "name": "Daily" + }, + { + "_uid": "cdf021ab-fbe8-42b5-ad49-c9503c2bb8eb", + "value": "weekly", + "name": "Weekly" + }, + { + "_uid": "ab61e280-e6f6-431b-88ae-8cfa9496d886", + "value": "monthly", + "name": "Monthly" + }, + { + "_uid": "55420da8-6f32-4ce7-9c6c-36507a68a3bd", + "value": "yearly", + "name": "Yearly" + }, + { + "_uid": "a89df366-da55-46af-88c2-e2f87d3ee61d", + "value": "never", + "name": "Never" + } + ] + }, + "priority": { + "type": "number", + "description": "The priority of the page relative to other pages on your site, where 0.1 is the lowest priority and 1.0 is the highest priority.\n\n1.0-0.8\nHomepage, product information, landing pages.\n\n0.7-0.4\nNews articles, some weather services, blog posts, pages that no site would be complete without.\n\n0.3-0.0\nFAQs, outdated info, old press releases, completely static pages that are still relevant enough to keep from deleting entirely.", + "decimals": 1 + } + }, + "image": null, + "preview_field": null, + "is_root": true, + "preview_tmpl": null, + "is_nestable": false, + "all_presets": [], + "preset_id": null, + "real_name": "page", + "component_group_uuid": "a8397001-eca6-4f46-8edb-833d6924db9f", + "color": null, + "icon": null, + "component_group_name": "Content Types" + }, + { + "name": "photo_card", + "display_name": null, + "created_at": "2023-04-11T13:32:46.022Z", + "updated_at": "2023-04-11T13:32:54.059Z", + "id": 3785716, + "schema": { + "photo": { + "type": "asset", + "filetypes": ["images"] + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "photo_card", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "physics-balloon-card", + "display_name": null, + "created_at": "2023-04-14T10:39:02.963Z", + "updated_at": "2023-04-14T10:40:57.966Z", + "id": 3811407, + "schema": { + "text": { + "type": "text" + }, + "theme": { + "type": "option", + "use_uuid": true, + "options": [ + { + "_uid": "a8bfea41-7627-4d4b-af01-db12024bf481", + "name": "Inverted", + "value": "inverted" + }, + { + "_uid": "d583af0e-d1a5-453a-aaeb-28352fc53d00", + "value": "panel", + "name": "Panel" + }, + { + "_uid": "e16413f1-8f0c-464e-8943-7ccab0576906", + "value": "offset", + "name": "Offset" + }, + { + "_uid": "7f18d192-5d34-43e2-97eb-1a8cfd106646", + "value": "yellow", + "name": "Yellow" + } + ], + "exclude_empty_option": true + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "physics-balloon-card", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "physics-input", + "display_name": null, + "created_at": "2023-04-17T15:13:53.017Z", + "updated_at": "2023-04-17T15:14:00.636Z", + "id": 3830600, + "schema": { + "placeholder": { + "type": "text" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "physics-input", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "physics-rectangle-card", + "display_name": null, + "created_at": "2023-04-14T10:37:48.156Z", + "updated_at": "2023-04-14T10:38:41.658Z", + "id": 3811406, + "schema": { + "text": { + "type": "text" + }, + "theme": { + "type": "option", + "use_uuid": true, + "options": [ + { + "_uid": "5d003831-5961-497c-9d37-f50dcde94d9c", + "name": "Transparent", + "value": "transparent" + }, + { + "_uid": "4c81fbe7-1760-41d3-846c-e318af0e802f", + "value": "yellow", + "name": "Yellow" + } + ], + "exclude_empty_option": true + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "physics-rectangle-card", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "physics-sticker", + "display_name": null, + "created_at": "2023-04-26T13:15:00.766Z", + "updated_at": "2023-04-26T16:25:36.409Z", + "id": 3889837, + "schema": { + "photo": { + "type": "asset", + "filetypes": ["images"], + "asset_folder_id": 234280 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "physics-sticker", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "project", + "display_name": null, + "created_at": "2023-02-15T13:07:44.621Z", + "updated_at": "2023-05-11T14:28:26.097Z", + "id": 3442356, + "schema": { + "cover": { + "type": "asset", + "filetypes": ["images"], + "asset_folder_id": 212286, + "pos": 0 + }, + "reel": { + "type": "asset", + "pos": 1, + "filetypes": ["videos"] + }, + "reel_button": { + "type": "section", + "pos": 2, + "keys": ["reel_button_theme", "reel_button_label"] + }, + "reel_button_theme": { + "type": "option", + "use_uuid": true, + "pos": 3, + "options": [ + { + "_uid": "ed9c0d33-e7d4-42de-a790-9adfca55481a", + "name": "light", + "value": "light" + }, + { + "_uid": "c7dafaf8-2b0c-4a28-b797-d51018a5d995", + "value": "dark", + "name": "dark" + } + ], + "default_value": "light", + "description": "", + "display_name": "Reel Button Theme (optional)" + }, + "reel_button_label": { + "type": "text", + "pos": 4, + "display_name": "Reel Button Label (optional)" + }, + "thumbnail": { + "type": "multiasset", + "filetypes": ["images"], + "required": true, + "asset_folder_id": 212286, + "pos": 5 + }, + "tagline": { + "type": "text", + "required": true, + "pos": 6 + }, + "intro": { + "type": "textarea", + "required": true, + "pos": 7 + }, + "team": { + "type": "options", + "source": "internal_stories", + "filter_content_type": ["team-member"], + "pos": 8 + }, + "client": { + "type": "text", + "use_uuid": true, + "source": "internal_stories", + "filter_content_type": ["client"], + "pos": 9 + }, + "deliverables": { + "type": "textarea", + "source": "internal_stories", + "filter_content_type": ["deliverable"], + "pos": 10 + }, + "services": { + "type": "textarea", + "source": "internal_stories", + "filter_content_type": ["service"], + "pos": 11 + }, + "links": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["link"], + "pos": 12 + }, + "recognitions": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["recognition"], + "pos": 13 + }, + "tab-734adeb1-00ef-48e6-aa53-a3001ad39201": { + "display_name": "Content", + "keys": ["body"], + "pos": 14, + "type": "tab" + }, + "body": { + "type": "richtext", + "restrict_type": "groups", + "restrict_components": true, + "component_group_whitelist": [ + "76b6a3af-a1fa-4ffe-b980-52a2da9245ca", + "1ef77ef8-466a-4b74-a076-f4554004e128" + ], + "customize_toolbar": true, + "toolbar": [ + "bold", + "italic", + "strike", + "underline", + "inlinecode", + "paragraph", + "h2", + "h3", + "list", + "olist", + "quote", + "hrule", + "link", + "blok", + "h4" + ], + "pos": 15 + }, + "tab-451d56bd-d365-4df0-8a61-2007b8b22aa9": { + "display_name": "SEO", + "keys": ["seo_title", "seo_description", "seo_og_image"], + "pos": 16, + "type": "tab" + }, + "seo_title": { + "type": "text", + "pos": 17 + }, + "seo_description": { + "type": "text", + "pos": 18 + }, + "seo_og_image": { + "type": "asset", + "filetypes": ["images"], + "asset_folder_id": 212286, + "pos": 19 + } + }, + "image": null, + "preview_field": null, + "is_root": true, + "preview_tmpl": null, + "is_nestable": false, + "all_presets": [], + "preset_id": null, + "real_name": "project", + "component_group_uuid": "a8397001-eca6-4f46-8edb-833d6924db9f", + "color": null, + "icon": null, + "component_group_name": "Content Types" + }, + { + "name": "projects-index", + "display_name": null, + "created_at": "2023-04-06T13:42:56.259Z", + "updated_at": "2023-04-06T13:42:56.259Z", + "id": 3757617, + "schema": {}, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "projects-index", + "component_group_uuid": "78726ff5-00c6-4ddb-bfef-551b83977e54", + "color": null, + "icon": null, + "component_group_name": "Pages" + }, + { + "name": "recognition", + "display_name": null, + "created_at": "2023-03-07T16:21:33.212Z", + "updated_at": "2023-03-07T16:22:20.232Z", + "id": 3541187, + "schema": { + "label": { + "type": "text", + "required": true + }, + "title": { + "type": "text", + "required": true + }, + "image": { + "type": "asset", + "filetypes": ["images"], + "required": true, + "asset_folder_id": 216885 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "recognition", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "richtext-box", + "display_name": null, + "created_at": "2023-02-16T10:59:09.847Z", + "updated_at": "2023-03-22T11:57:22.918Z", + "id": 3446937, + "schema": { + "layout": { + "type": "option", + "pos": 0, + "use_uuid": true, + "options": [ + { + "_uid": "77851a5e-c1cf-4f53-9dc3-bc76145ada99", + "name": "horizontal", + "value": "horizontal" + }, + { + "_uid": "a54e64de-6281-4cb3-b443-8fa31dcf0a39", + "value": "vertical", + "name": "vertical" + } + ], + "default_value": "horizontal" + }, + "image": { + "type": "asset", + "pos": 1, + "filetypes": ["images"] + }, + "title": { + "type": "text", + "pos": 2 + }, + "text": { + "type": "text", + "pos": 3 + }, + "link": { + "type": "bloks", + "pos": 4, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["link"], + "maximum": 1 + } + }, + "image": "//a.storyblok.com/f/198185/x/a05298ccf4/screenshot-2023-03-22-at-11-57-07.png", + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "richtext-box", + "component_group_uuid": "1ef77ef8-466a-4b74-a076-f4554004e128", + "color": "#fbce41", + "icon": "block-text-img-l", + "component_group_name": "Rich Text" + }, + { + "name": "richtext-code-block", + "display_name": null, + "created_at": "2023-02-24T17:31:53.338Z", + "updated_at": "2023-03-22T11:49:12.650Z", + "id": 3486021, + "schema": { + "language": { + "type": "option", + "pos": 0, + "use_uuid": true, + "options": [ + { + "_uid": "01edce3b-33b2-445f-b8a7-1af6c9ae99b9", + "value": "html", + "name": "html" + }, + { + "_uid": "d4151cd8-a329-4e23-bb55-1f4fefa3536c", + "value": "javascript", + "name": "javascript" + }, + { + "_uid": "17431de1-74ac-426f-8697-5fb458f8073f", + "value": "css", + "name": "css" + }, + { + "_uid": "21f9eef8-79fa-4029-a6b8-9462d5c6175c", + "name": "typescript", + "value": "typescript" + }, + { + "_uid": "c48c2f8a-6de6-4ea0-a8f5-0ed0a208348d", + "value": "svelte", + "name": "svelte" + }, + { + "_uid": "ae4795e0-7645-4873-8a82-1980d806121b", + "value": "elixir", + "name": "elixir" + }, + { + "_uid": "5d1c8c32-ff4c-45f6-8c40-ac5997cc1479", + "value": "bash", + "name": "bash" + }, + { + "_uid": "68fbe6f0-3799-47df-88a1-56f6e0834a5d", + "value": "clike", + "name": "c-like" + } + ] + }, + "line_numbers": { + "type": "boolean", + "default_value": true, + "pos": 1 + }, + "line_numbers_start": { + "type": "number", + "pos": 2, + "default_value": "1" + }, + "highlighted_lines": { + "type": "text", + "pos": 3, + "description": "- A single number refers to the line with that number.\n- Ranges are denoted by two numbers, separated with a hyphen (-).\n- Multiple line numbers or ranges are separated by commas.\n- Whitespace is allowed anywhere and will be stripped off." + }, + "code": { + "type": "textarea", + "pos": 4 + } + }, + "image": "//a.storyblok.com/f/198185/x/9c902dcb18/screenshot-2023-03-22-at-11-48-51.png", + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "richtext-code-block", + "component_group_uuid": "1ef77ef8-466a-4b74-a076-f4554004e128", + "color": "#fbce41", + "icon": "block-text-img-c", + "component_group_name": "Rich Text" + }, + { + "name": "richtext-testimonial", + "display_name": null, + "created_at": "2023-02-16T10:51:32.577Z", + "updated_at": "2023-03-22T11:45:25.997Z", + "id": 3446858, + "schema": { + "photo": { + "type": "asset", + "pos": 0, + "filetypes": ["images"] + }, + "name": { + "type": "text", + "pos": 1, + "required": true + }, + "position": { + "type": "text", + "pos": 2 + }, + "testimonial": { + "type": "textarea", + "pos": 3, + "required": true + } + }, + "image": "//a.storyblok.com/f/198185/x/0ac321ed98/screenshot-2023-03-22-at-11-44-55.png", + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "richtext-testimonial", + "component_group_uuid": "1ef77ef8-466a-4b74-a076-f4554004e128", + "color": "#fbce41", + "icon": "block-text-l", + "component_group_name": "Rich Text" + }, + { + "name": "root", + "display_name": null, + "created_at": "2023-03-03T12:10:42.589Z", + "updated_at": "2023-03-03T12:10:44.808Z", + "id": 3520419, + "schema": { + "catech_labs": { + "type": "text", + "display_name": "Catech Labs" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "root", + "component_group_uuid": null, + "color": null, + "icon": null + }, + { + "name": "service", + "display_name": null, + "created_at": "2023-02-15T13:54:22.743Z", + "updated_at": "2023-02-15T13:54:22.743Z", + "id": 3442782, + "schema": {}, + "image": null, + "preview_field": null, + "is_root": true, + "preview_tmpl": null, + "is_nestable": false, + "all_presets": [], + "preset_id": null, + "real_name": "service", + "component_group_uuid": "f789ade7-9cf4-4fd4-b95a-56b2cbe5844f", + "color": null, + "icon": null, + "component_group_name": "Configuration" + }, + { + "name": "services_deppartment", + "display_name": null, + "created_at": "2023-05-04T10:55:05.274Z", + "updated_at": "2023-05-04T11:00:55.665Z", + "id": 3924768, + "schema": { + "title": { + "type": "text", + "pos": 0 + }, + "entry": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["services_group_entry"], + "pos": 2 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "services_deppartment", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "services_entry", + "display_name": null, + "created_at": "2023-05-04T10:52:21.360Z", + "updated_at": "2023-05-04T10:52:32.373Z", + "id": 3924755, + "schema": { + "label": { + "type": "text" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "services_entry", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "services_group_entry", + "display_name": null, + "created_at": "2023-05-04T10:53:28.541Z", + "updated_at": "2023-05-04T10:53:55.547Z", + "id": 3924760, + "schema": { + "title": { + "type": "text" + }, + "list": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["services_entry"] + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "services_group_entry", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "services-page", + "display_name": null, + "created_at": "2023-05-04T08:50:50.568Z", + "updated_at": "2023-05-11T15:02:32.576Z", + "id": 3924074, + "schema": { + "page_title1": { + "type": "text", + "pos": 0 + }, + "page_title2": { + "type": "text", + "pos": 1 + }, + "timeline": { + "type": "bloks", + "pos": 2, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["service-timeline-row"] + }, + "awards_title": { + "type": "text", + "pos": 3 + }, + "awards_description": { + "type": "text", + "pos": 4 + }, + "awards": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["awards_entry"], + "pos": 5 + }, + "showreel": { + "type": "asset", + "filetypes": ["videos"], + "pos": 6 + }, + "showreel_button_label": { + "type": "text", + "pos": 7 + }, + "services_title": { + "type": "text", + "pos": 8 + }, + "services_subtitle": { + "type": "text", + "pos": 9 + }, + "services_description": { + "type": "text", + "pos": 10 + }, + "services": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["services_deppartment"], + "pos": 11 + }, + "deliverables_title": { + "type": "text", + "pos": 12 + }, + "deliverables_subtitle": { + "type": "text", + "pos": 13 + }, + "deliverables": { + "type": "bloks", + "pos": 14, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["deliverables_entry"] + }, + "testimonials_title1": { + "type": "text", + "pos": 15 + }, + "testimonials_title2": { + "type": "text", + "pos": 16 + }, + "testimonials_cta_label": { + "type": "text", + "pos": 17 + }, + "testimonials_cta_link": { + "type": "multilink", + "pos": 18 + }, + "testimonials": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["richtext-testimonial"], + "minimum": 5, + "maximum": 5, + "pos": 19 + }, + "clients_title": { + "type": "text", + "pos": 20 + }, + "clients": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "default_value": "", + "component_whitelist": ["client-logo"], + "pos": 21 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "services-page", + "component_group_uuid": "78726ff5-00c6-4ddb-bfef-551b83977e54", + "color": null, + "icon": null, + "component_group_name": "Pages" + }, + { + "name": "service-timeline-cell", + "display_name": null, + "created_at": "2023-05-04T12:45:26.410Z", + "updated_at": "2023-05-08T16:01:26.703Z", + "id": 3925566, + "schema": { + "label": { + "type": "text", + "pos": 0 + }, + "before_light": { + "type": "asset", + "filetypes": ["images"], + "pos": 1, + "asset_folder_id": 235888 + }, + "before_dark": { + "type": "asset", + "filetypes": ["images"], + "pos": 2, + "asset_folder_id": 235888 + }, + "after_light": { + "type": "asset", + "filetypes": ["images"], + "pos": 3, + "asset_folder_id": 235888 + }, + "after_dark": { + "type": "asset", + "filetypes": ["images"], + "pos": 4, + "asset_folder_id": 235888 + }, + "decoration": { + "type": "section", + "pos": 5, + "keys": ["decoration_light", "decoration_dark"] + }, + "decoration_light": { + "type": "asset", + "pos": 6, + "description": "Optional image to be above the cell with custom asset", + "filetypes": ["images"], + "asset_folder_id": 235888 + }, + "decoration_dark": { + "type": "asset", + "pos": 7, + "description": "Optional image to be above the cell with custom asset", + "filetypes": ["images"], + "asset_folder_id": 235888 + }, + "left_offset": { + "type": "number", + "default_value": "", + "min_value": 0, + "description": "px", + "pos": 8 + }, + "throw_confetti": { + "type": "boolean", + "pos": 9 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "service-timeline-cell", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "service-timeline-row", + "display_name": null, + "created_at": "2023-05-04T12:51:29.190Z", + "updated_at": "2023-05-04T12:51:49.994Z", + "id": 3925598, + "schema": { + "title": { + "type": "text" + }, + "subrows": { + "type": "bloks", + "maximum": 2, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["service-timeline-subrow"] + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "service-timeline-row", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "service-timeline-subrow", + "display_name": null, + "created_at": "2023-05-04T12:51:01.890Z", + "updated_at": "2023-05-04T12:51:14.713Z", + "id": 3925597, + "schema": { + "cells": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["service-timeline-cell"] + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "service-timeline-subrow", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "static-page", + "display_name": null, + "created_at": "2023-03-03T13:43:24.273Z", + "updated_at": "2023-03-07T15:40:14.043Z", + "id": 3520996, + "schema": { + "body": { + "type": "richtext", + "customize_toolbar": true, + "toolbar": [ + "bold", + "strike", + "italic", + "inlinecode", + "underline", + "paragraph", + "h2", + "h3", + "h4", + "list", + "olist", + "hrule", + "link", + "blok", + "h1" + ], + "restrict_type": "groups", + "restrict_components": true, + "component_group_whitelist": [ + "76b6a3af-a1fa-4ffe-b980-52a2da9245ca", + "1ef77ef8-466a-4b74-a076-f4554004e128" + ] + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "static-page", + "component_group_uuid": "78726ff5-00c6-4ddb-bfef-551b83977e54", + "color": null, + "icon": null, + "component_group_name": "Pages" + }, + { + "name": "team-member", + "display_name": null, + "created_at": "2023-02-15T10:55:16.832Z", + "updated_at": "2023-04-12T13:16:05.856Z", + "id": 3441652, + "schema": { + "photo": { + "type": "asset", + "pos": 0, + "filetypes": ["images"], + "asset_folder_id": 212283 + }, + "egg": { + "type": "asset", + "pos": 1, + "filetypes": ["images"], + "asset_folder_id": 212284 + }, + "position": { + "type": "text", + "pos": 2 + }, + "team": { + "type": "option", + "pos": 3, + "use_uuid": true, + "source": "internal", + "datasource_slug": "teams" + }, + "bio": { + "type": "textarea", + "pos": 4 + }, + "links": { + "type": "bloks", + "pos": 5, + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["team-member-link"] + }, + "is_active": { + "type": "boolean", + "pos": 6 + } + }, + "image": null, + "preview_field": null, + "is_root": true, + "preview_tmpl": null, + "is_nestable": false, + "all_presets": [], + "preset_id": null, + "real_name": "team-member", + "component_group_uuid": "a8397001-eca6-4f46-8edb-833d6924db9f", + "color": null, + "icon": null, + "component_group_name": "Content Types" + }, + { + "name": "team-member-link", + "display_name": null, + "created_at": "2023-02-15T11:55:00.748Z", + "updated_at": "2023-02-16T10:25:48.383Z", + "id": 3441976, + "schema": { + "type": { + "type": "option", + "pos": 0, + "use_uuid": true, + "options": [ + { + "_uid": "2ab25d18-069a-4ac6-9279-e87dddc60ea6", + "value": "website", + "name": "Website" + }, + { + "_uid": "ec187cbd-f548-466e-9b19-c931fc0d0ebe", + "name": "Twitter", + "value": "twitter" + }, + { + "_uid": "2fa36342-00e9-4e9b-b892-06f3a43656fe", + "value": "dribbble", + "name": "Dribbble" + }, + { + "_uid": "513c843c-f633-4637-a451-bbb526e4e680", + "value": "github", + "name": "Github" + }, + { + "_uid": "79bbfa16-98fe-4bb8-a6f7-3b83cd7c23d3", + "value": "behance", + "name": "Behance" + }, + { + "_uid": "f5086f92-8a3c-4dc1-94cd-3d1a73082c09", + "value": "readcv", + "name": "Read.CV" + }, + { + "_uid": "cb9e4ab8-2922-480a-b752-19d5150f04bc", + "value": "instagram", + "name": "Instagram" + }, + { + "_uid": "171ce19b-8812-4d4c-9394-fcb7e2098892", + "value": "facebook", + "name": "Facebook" + }, + { + "_uid": "0aa82982-de4a-4bad-99ea-43eae3c5286d", + "value": "linkedin", + "name": "Linkedin" + }, + { + "_uid": "ccd13057-b257-455d-8e4e-f276e4e2789f", + "value": "other", + "name": "Other" + } + ] + }, + "link": { + "type": "text", + "pos": 1 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "team-member-link", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "timeline-arrow", + "display_name": null, + "created_at": "2023-04-12T14:24:11.523Z", + "updated_at": "2023-04-21T13:25:55.540Z", + "id": 3795710, + "schema": { + "variant": { + "type": "option", + "use_uuid": true, + "options": [ + { + "_uid": "c6e3dd43-d4e6-40f6-8ff9-4c53fcef3c6c", + "name": "one", + "value": "one" + }, + { + "_uid": "750d1125-ba97-4ad4-9bd0-0066a4bd9cc3", + "value": "two", + "name": "two" + }, + { + "_uid": "0a543fe1-ccdd-4f2e-89f7-bba9829934d4", + "value": "three", + "name": "three" + }, + { + "_uid": "edc629f8-34ae-4080-ac31-5c7a88d2ead9", + "value": "four", + "name": "four" + }, + { + "_uid": "dc5263af-5ee8-4d85-a6fb-28baaabfff85", + "value": "five", + "name": "five" + } + ], + "default_value": "one", + "required": true, + "pos": 0 + }, + "flip": { + "type": "boolean", + "pos": 1 + }, + "top": { + "type": "number", + "decimals": 0, + "default_value": "0", + "required": true, + "pos": 2 + }, + "left": { + "type": "number", + "required": true, + "default_value": "0", + "decimals": 0, + "pos": 3 + }, + "scale": { + "type": "number", + "default_value": "1", + "decimals": 2, + "description": "Between 0 and 1", + "pos": 4 + }, + "rotate": { + "type": "number", + "decimals": 0, + "default_value": "0", + "pos": 5 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "timeline-arrow", + "component_group_uuid": "3c80dc73-98c3-4c97-a2b2-44541c933f72", + "color": null, + "icon": null, + "component_group_name": "Canvas" + }, + { + "name": "timeline-image", + "display_name": null, + "created_at": "2023-04-12T14:25:57.635Z", + "updated_at": "2023-05-10T17:05:29.001Z", + "id": 3795713, + "schema": { + "image": { + "type": "asset", + "filetypes": ["images"], + "description": "Hello" + }, + "border": { + "type": "boolean", + "default_value": true + }, + "top": { + "type": "number", + "required": true, + "default_value": "0", + "decimals": 0 + }, + "left": { + "type": "number", + "decimals": 0, + "default_value": "0", + "required": true + }, + "scale": { + "type": "number", + "default_value": "1", + "decimals": 2, + "description": "Between 0 and 1" + }, + "rotate": { + "type": "number", + "default_value": "0", + "decimals": 0 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": "{{image(options.image.filename)/}}", + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "timeline-image", + "component_group_uuid": "3c80dc73-98c3-4c97-a2b2-44541c933f72", + "color": null, + "icon": null, + "component_group_name": "Canvas" + }, + { + "name": "timeline-section", + "display_name": null, + "created_at": "2023-04-12T14:19:35.765Z", + "updated_at": "2023-04-12T20:56:46.026Z", + "id": 3795691, + "schema": { + "items": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["timeline-arrow", "timeline-image", "timeline-text"] + }, + "width": { + "type": "number", + "required": true, + "default_value": "400", + "decimals": 0, + "steps": 20 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "timeline-section", + "component_group_uuid": "3c80dc73-98c3-4c97-a2b2-44541c933f72", + "color": null, + "icon": null, + "component_group_name": "Canvas" + }, + { + "name": "timeline-text", + "display_name": null, + "created_at": "2023-04-12T14:20:49.471Z", + "updated_at": "2023-04-12T20:32:38.915Z", + "id": 3795700, + "schema": { + "text": { + "type": "text", + "pos": 0 + }, + "link": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["link"], + "pos": 1 + }, + "width": { + "type": "number", + "pos": 2, + "required": true, + "default_value": "240", + "description": "e.g.: 140, 160, 200, 240", + "decimals": 0 + }, + "top": { + "type": "number", + "pos": 3, + "required": true, + "decimals": 0, + "default_value": "0" + }, + "left": { + "type": "number", + "pos": 4, + "decimals": 0, + "required": true, + "default_value": "0" + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "timeline-text", + "component_group_uuid": "3c80dc73-98c3-4c97-a2b2-44541c933f72", + "color": null, + "icon": null, + "component_group_name": "Canvas" + }, + { + "name": "two-columns", + "display_name": null, + "created_at": "2023-02-16T10:36:21.986Z", + "updated_at": "2023-03-22T11:58:52.491Z", + "id": 3446779, + "schema": { + "width": { + "type": "option", + "use_uuid": true, + "pos": 0, + "options": [ + { + "_uid": "4bf5bcfc-393c-45b1-b2e1-56754e88541c", + "name": "wide", + "value": "wide" + } + ], + "default_value": "wide" + }, + "columns": { + "type": "bloks", + "restrict_type": "", + "restrict_components": true, + "component_whitelist": ["column-media", "column"], + "minimum": 2, + "maximum": 2, + "required": true, + "pos": 1 + } + }, + "image": "//a.storyblok.com/f/198185/x/c5f0ceead4/screenshot-2023-03-22-at-11-58-36.png", + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "two-columns", + "component_group_uuid": "76b6a3af-a1fa-4ffe-b980-52a2da9245ca", + "color": "#fbce41", + "icon": "block-text-img-r-l", + "component_group_name": "Blocks & Rich Text" + }, + { + "name": "value", + "display_name": null, + "created_at": "2023-04-11T13:24:04.277Z", + "updated_at": "2023-04-26T17:05:26.948Z", + "id": 3785697, + "schema": { + "illustration": { + "type": "option", + "pos": 0, + "use_uuid": true, + "options": [ + { + "_uid": "500fc43f-2461-44a0-b1bd-650e4b346617", + "name": "People", + "value": "people" + }, + { + "_uid": "7f8ebaf6-7f62-4a46-9ddf-162d6d43ab4a", + "value": "teamwork", + "name": "Teamwork" + }, + { + "_uid": "23d20c73-3882-43f4-96d1-c2f3b6aa6aa7", + "value": "aspiration", + "name": "Aspiration" + } + ], + "exclude_empty_option": true, + "default_value": "people", + "required": true + }, + "title": { + "type": "text", + "pos": 1 + }, + "description": { + "type": "text", + "pos": 2 + } + }, + "image": null, + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "value", + "component_group_uuid": "a0e45743-888c-44ef-a39f-0d8b7b6defa3", + "color": null, + "icon": null, + "component_group_name": "Single" + }, + { + "name": "video", + "display_name": null, + "created_at": "2023-02-16T10:45:31.449Z", + "updated_at": "2023-03-22T11:51:33.816Z", + "id": 3446844, + "schema": { + "width": { + "type": "option", + "use_uuid": true, + "options": [ + { + "_uid": "a7e24af2-5955-4073-b377-2d7dddd7a214", + "name": "narrow", + "value": "narrow" + }, + { + "_uid": "eddd9e84-89a5-4601-a1a6-4c317217ffab", + "value": "medium", + "name": "medium" + }, + { + "_uid": "0ca8defa-4c48-4bdb-b418-28a055077cf0", + "value": "wide", + "name": "wide" + }, + { + "_uid": "37b7e980-d92c-4b9f-a090-df22248c0fcc", + "value": "full", + "name": "full" + } + ], + "default_value": "medium" + }, + "video": { + "type": "asset", + "filetypes": ["videos"], + "required": true + }, + "loop": { + "type": "boolean", + "default_value": true + }, + "autoplay": { + "type": "boolean", + "default_value": true + }, + "controls": { + "type": "boolean" + } + }, + "image": "//a.storyblok.com/f/198185/x/d53670833a/screenshot-2023-03-22-at-11-50-59.png", + "preview_field": null, + "is_root": false, + "preview_tmpl": null, + "is_nestable": true, + "all_presets": [], + "preset_id": null, + "real_name": "video", + "component_group_uuid": "76b6a3af-a1fa-4ffe-b980-52a2da9245ca", + "color": "#fbce41", + "icon": "block-text-img-c", + "component_group_name": "Blocks & Rich Text" + } + ] +} diff --git a/content/footer.yml b/content/footer.yml deleted file mode 100644 index 3b5ab29c..00000000 --- a/content/footer.yml +++ /dev/null @@ -1,45 +0,0 @@ -- title: Contact # Do not change this title, because it's hard-coded - type: column - items: - - label: hello@significa.co - link: mailto:hello@significa.co - - label: (+351) 226 001 751 - link: tel:00351226001751 - -- title: Who we are - type: column - items: - - label: About - link: /about - - label: Careers - link: /careers - - label: Contact - link: /contact - -- title: Things we do - type: column - items: - - label: Showcase - link: /showcase - - label: Services - link: /services - - label: Handbook - link: /handbook - - label: Blog - link: /blog - - label: Labs - link: /labs - -- title: Follow us - type: social - items: - - label: github - link: https://github.com/significa/ - - label: dribbble - link: https://dribbble.com/significa/ - - label: behance - link: https://behance.net/significa/ - - label: medium - link: https://medium.com/significa/ - - label: instagram - link: https://instagram.com/significadotco/ diff --git a/content/menu.yml b/content/menu.yml deleted file mode 100644 index b52852aa..00000000 --- a/content/menu.yml +++ /dev/null @@ -1,14 +0,0 @@ -- label: Showcase - link: /showcase - -- label: Services - link: /services - -- label: About - link: /about - -- label: Blog - link: /blog - -- label: Contact - link: /contact diff --git a/content/pages/about/about-1.png b/content/pages/about/about-1.png deleted file mode 100755 index eca56bdb..00000000 Binary files a/content/pages/about/about-1.png and /dev/null differ diff --git a/content/pages/about/about-2.png b/content/pages/about/about-2.png deleted file mode 100755 index 737bf533..00000000 Binary files a/content/pages/about/about-2.png and /dev/null differ diff --git a/content/pages/about/about-3.png b/content/pages/about/about-3.png deleted file mode 100755 index 9e42596e..00000000 Binary files a/content/pages/about/about-3.png and /dev/null differ diff --git a/content/pages/about/about-4.png b/content/pages/about/about-4.png deleted file mode 100755 index 09877eec..00000000 Binary files a/content/pages/about/about-4.png and /dev/null differ diff --git a/content/pages/about/about-5.png b/content/pages/about/about-5.png deleted file mode 100755 index 6081650a..00000000 Binary files a/content/pages/about/about-5.png and /dev/null differ diff --git a/content/pages/about/about-6.png b/content/pages/about/about-6.png deleted file mode 100644 index a2cd6142..00000000 Binary files a/content/pages/about/about-6.png and /dev/null differ diff --git a/content/pages/about/about-7.png b/content/pages/about/about-7.png deleted file mode 100755 index 813fa6d3..00000000 Binary files a/content/pages/about/about-7.png and /dev/null differ diff --git a/content/pages/about/about.yml b/content/pages/about/about.yml deleted file mode 100644 index 5bbc60aa..00000000 --- a/content/pages/about/about.yml +++ /dev/null @@ -1,149 +0,0 @@ -seo: - title: About - description: Every little secret about your favourite designers and developers. - -hero: - title: Design-led strategies that impact people’s life. - photos: - - image: about-1.png - alt: Office 1 - - image: about-2.png - alt: Office 2 - - image: about-3.png - alt: Office 3 - -content: - title: Tools should adapt to the user, not the other way around. - text: | - The same way tools were invented that allowed farmers to work on an upright position, digital products should have its user as their main concern. They should, somehow, improve people's life by having a good sense of the problem it solves, who is it solving it for and, above all, how it is solved. - Only, there's some peculiarities to digital products. Things can get really complex, really quickly, and a pragmatic, synthetic and clear vision is essential to be able to create something that, after all, is meant to be used. Emotions also have a big role to play and developing clear and beautiful aesthetics is of the utmost importance to create a pleasant environment in which the user actually enjoys the time spent in it. In the end, we're all suckers for beautiful things that just work™ - -global: - image: ./about-4.png - title: We’re global - text: Solid communication, iteration and prototyping allows us to work alongside clients from all around the world. We have a big office in Porto, Portugal that allows us to host project workshops, brainstorming sessions and work side by side with you and your team. Just like being neighbours, you can drop by for some eggs, anytime. We also travel regularly to do the exact same thing with the added bonus of getting to know new places! - - cities: - - BCN - - PAR - - HKG - - VLL - - LIS - - LON - - TUL - - DUS - - ORD - - BKK - - SYD - - HAM - - FLN - - SFO - - BER - - LAX - - AMS - - BSB - - ZRH - - LAS - - OTP - - ONT - -careers: - title: Life here, in the heart of Porto. - text: | - We spend a great deal of our days at work, so why not make it interesting? With a friendly and laid back environment you get all the perks to ensure a creative and productive day. Want to find out more about what's it like working here? Take a look at our careers page. - - link: /careers - linkText: More on Careers - photos: - - image: about-5.png - alt: Office 5 - - image: about-6.png - alt: Office 6 - - image: about-7.png - alt: Office 7 - -team: - title: An omelette is made of eggs. - text: Ours has {team_count}. - - list: - - name: Ana Fernandes - role: Project Manager - - - name: Alec Norton - role: Project Manager - - - name: André Furtado - role: Creative Director - - - name: Caio Arias - role: Designer - - - name: Catarina Silva - role: Office Manager - - - name: Elisa Sampaio - role: Designer - - - name: Estepheny Abreu - role: Designer - - - name: Filipe Almeida - role: Lead Designer - - - name: Francisco Marques - role: Lead Developer - - - name: Frederico Jesus - role: Designer - - - name: Guilherme Oliveira - role: Back-end Developer - - - name: Joaquim Rosa - role: Front-end Developer - - - name: João Ribeiro - role: Front-end Developer - - - name: Joel Ferreira - role: Back-end Developer - - - name: Manuel Melo - role: Designer - - - name: Mariana Gomes - role: Product Manager / Designer - - - name: Márcio Pinto - role: Full-stack Developer - - - name: Michelle Meinert - role: Front-End Developer - - - name: Pedro Brandão - role: Founder / CEO - - - name: Rui Ferreira - role: Project Manager - - - name: Ricardo Reis - role: Front-End Developer - - - name: Rita Café - role: Designer - - - name: Rui Sereno - role: Business Development - - - name: Teresa Vilar Araújo - role: Interface Designer - - - name: Thomas Gouveia Lopes - role: Front-end Developer - -cta: - title: From inception to launch. - text: Get to know our process a little better. - link: /services - linkText: View our Services diff --git a/content/pages/careers/careers-bottom-1@2x.png b/content/pages/careers/careers-bottom-1@2x.png deleted file mode 100755 index 2b1a23f8..00000000 Binary files a/content/pages/careers/careers-bottom-1@2x.png and /dev/null differ diff --git a/content/pages/careers/careers-bottom-2@2x.png b/content/pages/careers/careers-bottom-2@2x.png deleted file mode 100755 index a451c51a..00000000 Binary files a/content/pages/careers/careers-bottom-2@2x.png and /dev/null differ diff --git a/content/pages/careers/careers-bottom-3@2x.png b/content/pages/careers/careers-bottom-3@2x.png deleted file mode 100755 index 6f1a2f93..00000000 Binary files a/content/pages/careers/careers-bottom-3@2x.png and /dev/null differ diff --git a/content/pages/careers/careers-bottom-4@2x.png b/content/pages/careers/careers-bottom-4@2x.png deleted file mode 100755 index 5f84b54c..00000000 Binary files a/content/pages/careers/careers-bottom-4@2x.png and /dev/null differ diff --git a/content/pages/careers/careers-bottom-5@2x.png b/content/pages/careers/careers-bottom-5@2x.png deleted file mode 100755 index 15a25a30..00000000 Binary files a/content/pages/careers/careers-bottom-5@2x.png and /dev/null differ diff --git a/content/pages/careers/careers-middle-1@2x.png b/content/pages/careers/careers-middle-1@2x.png deleted file mode 100755 index a61c2aa8..00000000 Binary files a/content/pages/careers/careers-middle-1@2x.png and /dev/null differ diff --git a/content/pages/careers/careers-middle-2@2x.png b/content/pages/careers/careers-middle-2@2x.png deleted file mode 100755 index daee80f5..00000000 Binary files a/content/pages/careers/careers-middle-2@2x.png and /dev/null differ diff --git a/content/pages/careers/careers-middle-3@2x.png b/content/pages/careers/careers-middle-3@2x.png deleted file mode 100755 index e51edfe6..00000000 Binary files a/content/pages/careers/careers-middle-3@2x.png and /dev/null differ diff --git a/content/pages/careers/careers-middle-4@2x.png b/content/pages/careers/careers-middle-4@2x.png deleted file mode 100755 index 293ace84..00000000 Binary files a/content/pages/careers/careers-middle-4@2x.png and /dev/null differ diff --git a/content/pages/careers/careers-middle-5@2x.png b/content/pages/careers/careers-middle-5@2x.png deleted file mode 100755 index 09a0bcc2..00000000 Binary files a/content/pages/careers/careers-middle-5@2x.png and /dev/null differ diff --git a/content/pages/careers/careers-middle-6@2x.png b/content/pages/careers/careers-middle-6@2x.png deleted file mode 100755 index 8c3119d0..00000000 Binary files a/content/pages/careers/careers-middle-6@2x.png and /dev/null differ diff --git a/content/pages/careers/careers-top-1@2x.png b/content/pages/careers/careers-top-1@2x.png deleted file mode 100644 index 7636b4b4..00000000 Binary files a/content/pages/careers/careers-top-1@2x.png and /dev/null differ diff --git a/content/pages/careers/careers-top-2@2x.png b/content/pages/careers/careers-top-2@2x.png deleted file mode 100755 index 7cbf5583..00000000 Binary files a/content/pages/careers/careers-top-2@2x.png and /dev/null differ diff --git a/content/pages/careers/careers-top-3@2x.png b/content/pages/careers/careers-top-3@2x.png deleted file mode 100755 index b9e32106..00000000 Binary files a/content/pages/careers/careers-top-3@2x.png and /dev/null differ diff --git a/content/pages/careers/careers-top-4@2x.png b/content/pages/careers/careers-top-4@2x.png deleted file mode 100755 index de686d48..00000000 Binary files a/content/pages/careers/careers-top-4@2x.png and /dev/null differ diff --git a/content/pages/careers/careers.yml b/content/pages/careers/careers.yml deleted file mode 100644 index 49a7da5f..00000000 --- a/content/pages/careers/careers.yml +++ /dev/null @@ -1,187 +0,0 @@ -seo: - title: Careers - description: Significa is hiring! Join our team of talented designers & developers. - -hero: - title: | - Drop by for some eggs. - Anytime. - images: - - ./careers-top-1@2x.png - - ./careers-top-2@2x.png - - ./careers-top-3@2x.png - - ./careers-top-4@2x.png - -about: - title: What defines us - - sections: - - title: Macro Management - text: We value your independence and give you freedom to be creative at your own (s)pace. - - - title: Friendly workplace - text: An exciting and peaceful environment that can hopefully feel like home. - - - title: Horizontal Hierarchy - text: Your decisions are essential as we empower teamwork and collaboration. - - - title: T-shaped People - text: An interdisciplinary creative team ready for any challenge. - - cta: - link: /about - linkText: More on us - - images: - - image: ./careers-middle-1@2x.png - alt: A day at Significa - - - image: ./careers-middle-2@2x.png - alt: A day at Significa - - - image: ./careers-middle-3@2x.png - alt: A day at Significa - - - image: ./careers-middle-4@2x.png - alt: A day at Significa - - - image: ./careers-middle-5@2x.png - alt: A day at Significa - - - image: ./careers-middle-6@2x.png - alt: A day at Significa - -adayatsignifica: - top: - - image: ./careers-middle-1@2x.png - alt: A day at Significa - - - image: ./careers-middle-2@2x.png - alt: A day at Significa - - - image: ./careers-middle-3@2x.png - alt: A day at Significa - - - image: ./careers-middle-4@2x.png - alt: A day at Significa - - - image: ./careers-middle-5@2x.png - alt: A day at Significa - - - image: ./careers-middle-6@2x.png - alt: A day at Significa - - bottom: - - image: ./careers-bottom-1@2x.png - alt: A day at Significa - - - image: ./careers-bottom-2@2x.png - alt: A day at Significa - - - image: ./careers-bottom-3@2x.png - alt: A day at Significa - - - image: ./careers-bottom-4@2x.png - alt: A day at Significa - - - image: ./careers-bottom-5@2x.png - alt: A day at Significa - -perks: - title: Perky perks. - - list: - - title: Fresh Fruit & Soup - text: An apple a day keeps the doctor away. We have apples. - egg: fruit - - - title: Health Insurance - text: Out of apples? We have health insurance for you and your kids. - egg: health - - - title: Unlimited learning stipend - text: Courses, conferences or anything to help your little grey cells. - egg: learning - - - title: Daily Food Allowance - text: No one can work with an empty stomach! Right? - egg: food - - - title: In-house Arcade - text: Get ready for some lunch time friendly rivalries! - egg: arcade - - - title: Annual company retreat - text: We sing, we dance, we bond. Then we’ll do it again next year. - egg: retreat - - - title: Every equipment you need - text: Unless it’s a lazer beam gun, we’ve got you covered! - egg: equipment - - - title: Flexible hours & location - text: You’re accountable for your work. That’s pretty much it! - egg: flexible - - images: - - image: ./careers-bottom-1@2x.png - alt: A day at Significa - - - image: ./careers-bottom-2@2x.png - alt: A day at Significa - - - image: ./careers-bottom-3@2x.png - alt: A day at Significa - - - image: ./careers-bottom-4@2x.png - alt: A day at Significa - - - image: ./careers-bottom-5@2x.png - alt: A day at Significa - -positions: - title: | - Are you a good fit? - Check our open positions! - - defaultPosition: - position: Nothing for you here? - tagline: Anyway, if you think you could still be a good fit, feel free to self apply. - - errors: - global: Oh noes! Something went wrong. Please try again or contact us via another channel. - nameRequired: Please type your name or make something up. - emailRequired: It's hard to get back to you without an address. - emailInvalid: This doesn't feel right... Please check your address. - messageRequired: Dont feel like writing? - uploadError: Could not upload your file. Please try again. - uploadSizeError: File too big to handle. Maybe sending a shareable link in the message? - - form: - title: Application form - - name: - label: Your name - placeholder: How should we call you? - email: - label: Your email - placeholder: Your email address - portfolio: - label: Portfolio link - placeholder: https://yourportfolio.com/ - message: - label: Your message - placeholder: About you (300 characters max) - attachment: - label: Attach cv / portfolio - submit: - label: Apply - - success: - title: | - Thank you! - We'll be in touch shortly. - subtitle: | - You should have received an email just now. - If not, please go back and check the inputed email address! - back: Back to careers diff --git a/content/pages/contact/bottom-left@2x.png b/content/pages/contact/bottom-left@2x.png deleted file mode 100644 index bab6c5bc..00000000 Binary files a/content/pages/contact/bottom-left@2x.png and /dev/null differ diff --git a/content/pages/contact/bottom-right@2x.png b/content/pages/contact/bottom-right@2x.png deleted file mode 100644 index 2bc05cb3..00000000 Binary files a/content/pages/contact/bottom-right@2x.png and /dev/null differ diff --git a/content/pages/contact/center@2x.png b/content/pages/contact/center@2x.png deleted file mode 100644 index 34756009..00000000 Binary files a/content/pages/contact/center@2x.png and /dev/null differ diff --git a/content/pages/contact/contact.yml b/content/pages/contact/contact.yml deleted file mode 100644 index a66cd1b5..00000000 --- a/content/pages/contact/contact.yml +++ /dev/null @@ -1,77 +0,0 @@ -seo: - title: Contacts - description: Got a project of your own? Say hello to the people of Significa! - -title: | - Hello there! - How can we help you? -subtitle: | - If you want to apply for an open position, - please do so on our -link: careers page -page: /careers - -contacts: - title: General contacts - columns: - - title: Say - mail: hello@significa.co - phone: (+351) 226 001 751 - - - title: Marketing - mail: marketing@significa.co - phone: (+351) 226 001 751 - - - title: Porto Office - address1: Rua da Torrinha 154 - address2: 4050-609 Porto, Portugal - -matters: - title: We’re always on the lookout for something that matters. - text: Passionate projects with bigger-than-themselves goals have a special place here at Significa. - more: | - We all have the urge to do something more and make a dent in some of the world's most pressing issues. - In every project we keep it real and adapt to budget but, on these special cases, we're willing to go the extra mile to make sure your project gets what it deserves. - interested: We're particularly interested in Agriculture, Environment, Animal Welfare, and Privacy & Human Rights - photos: - center: ./center@2x.png - topLeft: ./top-left@2x.png - topRight: ./top-right@2x.png - bottomLeft: ./bottom-left@2x.png - bottomRight: ./bottom-right@2x.png - -errors: - global: Oh noes! Something went wrong. Please try again later or contact us via our other contacts below. - nameRequired: Jaqen H'ghar? Please type your name or make something up. - emailRequired: It's hard to get back to you without an address. - emailInvalid: This doesn't feel right... Please check your address. - messageRequired: Dont feel like writing? You can check our alternative contacts below. - uploadError: Could not upload your file. Please try again. - uploadSizeError: File too big to handle. Maybe sending a shareable link in the message? - -form: - name: - label: Your name - placeholder: How should we call you? - email: - label: Your email - placeholder: Your email address - budget: - label: Budget (optional) - placeholder: Do you have a fixed budget? - message: - label: Your message - placeholder: What's on your mind? - attachment: - label: Attachment - submit: - label: Send - -success: - title: | - Thank you! - We'll be in touch shortly. - subtitle: | - You should have received an email just now. - If not, please go back and check the inputed email address! - back: Back to form diff --git a/content/pages/contact/top-left@2x.png b/content/pages/contact/top-left@2x.png deleted file mode 100644 index f4976054..00000000 Binary files a/content/pages/contact/top-left@2x.png and /dev/null differ diff --git a/content/pages/contact/top-right@2x.png b/content/pages/contact/top-right@2x.png deleted file mode 100644 index 40fd707a..00000000 Binary files a/content/pages/contact/top-right@2x.png and /dev/null differ diff --git a/content/pages/home/home-1.png b/content/pages/home/home-1.png deleted file mode 100755 index c81df448..00000000 Binary files a/content/pages/home/home-1.png and /dev/null differ diff --git a/content/pages/home/home-2.png b/content/pages/home/home-2.png deleted file mode 100755 index 64d3b91e..00000000 Binary files a/content/pages/home/home-2.png and /dev/null differ diff --git a/content/pages/home/home-3.png b/content/pages/home/home-3.png deleted file mode 100755 index c723bdfe..00000000 Binary files a/content/pages/home/home-3.png and /dev/null differ diff --git a/content/pages/home/home.yml b/content/pages/home/home.yml deleted file mode 100644 index 34cb5502..00000000 --- a/content/pages/home/home.yml +++ /dev/null @@ -1,49 +0,0 @@ -headline: Your go-to digital agency -tagline: Significa is a digital design-led agency mainly focused on Product Development. - -services: - title: We build digital products - text: | - Having a design-led approach to what we do defines who we are. We take on products from inception to launch, from business model to people's pocket, from wireframe to continuous deployment. - columns: - - title: Strategy - items: - - UX research - - Business strategy - - Brand strategy - - Product strategy - - Product management - - title: Product design - items: - - User experience - - User interface - - Brand development - - Illustration - - Motion & Video - - title: Development - items: - - Front-end engineering - - Web-app development - - Native app development - - Development operations - cta: View services - link: /services - -fromTheBlog: - title: What's new on Significa Blog - cta: Open Blog - link: /blog - -careers: - title: | - Drop by, - we're hiring. - text: | - We are an open-minded, open-hearted team that loves the thrill of creating exciting new projects. - Drop us a line if you’re passionate and talented to do everything you set your mind to. - cta: View careers - link: /careers - photos: - - home-1.png - - home-2.png - - home-3.png diff --git a/content/pages/labsPage/labs.yml b/content/pages/labsPage/labs.yml deleted file mode 100644 index 20bfc62f..00000000 --- a/content/pages/labsPage/labs.yml +++ /dev/null @@ -1,6 +0,0 @@ -seo: - title: Labs - description: What Significa has to say about the world. Or free goodies. - -title: Omelette du Fromage -subtitle: Yes, it’s a Dexter’s Laboratory reference. diff --git a/content/pages/legal/legal.md b/content/pages/legal/legal.md deleted file mode 100644 index 6d3f0872..00000000 --- a/content/pages/legal/legal.md +++ /dev/null @@ -1,199 +0,0 @@ ---- -title: Legal ---- - -## Dispute information - -In case of dispute the consumer may resort to an Alternative Dispute Resolution Entity: - -CICAP – Tribunal Arbitral de Consumo -Rua Damião de Góis, 31, Loja 6, -4050-225, Porto -+351 22 550 83 49 / +351 22 502 97 -cicap@cicap.pt - -More information at [consumidor.pt](https://www.consumidor.pt) - -## Privacy Policy - -### Introduction - -At Significa (Significa, Lda.) we are committed to fair practices that protect and respect your privacy. We want you to tell you how we use and protect your personal information. This includes informing you of your rights regarding your personal information that we hold. To make this notice easy to find, we make our policies available on every page of this website. - -### Laws, Regulations and Supervisory Authority. - -This Privacy Policy is governed by the laws of Portugal without regard to its conflict of laws provision. You consent to the exclusive jurisdiction of the courts in connection with any action or dispute arising between the parties under or in connection with this Privacy Policy. - -### The laws that govern personal data in Portugal are: - -- REGULATION (EU) 2016/679 OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL of 27 April 2016 on the protection of natural persons with regard to the processing of personal data and on the free movement of such data, and repealing Directive 95/46/EC (General Data Protection Regulation) (“GDPR”). -- Lei n.º 67/98 de 26 de Outubro, LEI DA PROTECÇÃO DE DADOS PESSOAIS. - -The independent authority that upholds information rights in the public interest in Portugal is the Comissão Nacional de Protecção de Dados (the “CNPD”). Further information can be found at [https://www.cnpd.pt](https://www.cnpd.pt). - -### Who is Significa? - -Significa, Lda. -Registered address: Casa do Soto, 4540- 226 Burgo, Arouca, Portugal -Company VAT Number PT513884556 -Email: [office@significa.co](mailto:office@significa.co) -Website: [https://significa.co](https://significa.co) - -### Information we may collect from you - -Significa may collect information from you because we have a legal reason (allowed by law or under contract) to collect the information, or because you have consented for us to do so for a specific purpose. - -### Information you give us - -You may give us information about you with your consent, including, but not limited to: - -- By filling in a form or sending us an email. -- Participating in our member communities. -- Applying for a job at Significa. - -This information may be personal or related to your business or employment history. You may give us information for legal reasons, such as to enter into a contract with us, when you are buying services from us, or when you are taking a job at Significa. - -### Information we collect about you - -If you visit our website we may automatically collect information about you, for example: - -- Technical information. -- IP addresses. -- Information about what type of device you use to connect to our website. - What parts of our website you click on and how long you look at our website. - -### Information we receive from other sources - -We may receive information about you if you use any of the other websites we operate, any other services we provide, or from our business partners instructed to collect information on their behalf. - -We also work with third parties (including, for example, business partners, subcontractors in technical, payment and delivery services, advertising networks, analytics providers, search information providers) and may receive information about you from them as part of the service we provide, or for legal reasons. - -### Why does Significa collect personal information? - -Significa collects information for some or all of the following reasons: - -- To provide services to you upon your request. -- To provide information about products or services you have shown interest in purchasing within a reasonable time afterwards. -- To provide information to you about products or services you have purchased from us, our partners, or related products or services. -- To employ you or consider you for employment. -- To provide services to you under contract. -- For legal reasons, for example, if you have entered into a contract with us. - -### What legal basis does Significa have for processing my information? - -Significa may legally process the information we have about you for any of the following reasons: - -- We have a contract with you. -- You have given us permission to do so. -- We must provide services to a customer. -- To comply with the law. - -### How long will you keep my personal information? - -Significa will not retain your personal information for longer than required. We will keep your personal information: - -- For as long as required by law. -- Until we no longer have a valid reason for keeping it. -- Until you request us to stop using it. - -We may keep just enough of your personal information to ensure that we comply with your requests not use your personal information or comply with your right to erasure. For example, we must keep your request to be erased even if it includes your personal data until such time as you are no longer our customer. - -If you have questions about our Data Retention Policy, please contact: [office@significa.co](mailto:office@significa.co). - -### Where we store your personal data - -Significa is incorporated in Portugal. We primarily store and process your personal data in the EU. Any data may be transferred from time to time to our offices or personnel, or to third parties, located throughout the world, and may be viewed and hosted anywhere in the world, including countries that may not have laws of general applicability regulating the use and transfer of such data. To the fullest extent allowed by applicable law, by using any of the above, you voluntarily consent to the trans-border transfer and hosting of such information. - -Some examples of reasons your data may be processed outside of the EEA include: - -- Technical support services. -- Customer support services. - -If your personal data cannot be processed within the EEA, we will: - -- Comply with all other data protection principles. -- Where possible, be to a country that is on the list of the EU Commission's countries that provide adequate protections for the rights and freedoms of data subjects. -- If the transfer is to the United States of America, we will use reasonable endeavours to make sure they participate in the Privacy Shield program. -- Make sure we have assessed the adequacy of protection in all other cases. - -### Is the information collected through the service secure? - -We take precautions to protect the security of your information. We have physical, electronic, and managerial procedures to help safeguard, prevent unauthorised access, maintain data security, and correctly use your information. However, neither people nor security systems are foolproof, including encryption systems. In addition, people can commit intentional crimes, make mistakes or fail to follow policies. Therefore, while we use reasonable efforts to protect your personal information, we cannot guarantee its absolute security. If applicable law imposes any non-disclaimable duty to protect your personal information, you agree that intentional misconduct will be the standards used to measure our compliance with that duty. - -### Who might Significa share your information with? - -Significa may share anonymised data not linked to any personal identification information with third parties, either because you have consented to allow us to do so or for contractual or legal reasons. For example, we may share your personal information with: -Subcontractors and third parties for the purpose of the performance of a contract that we hold with them or that we hold with you. -With third parties because you have given consent. - -Other reasons Significa may share your personal information with a third party – Significa will share your personal data with third parties for the following reasons: - -- If Significa must comply with a legal obligation. -- To enforce or apply our Website Terms of Use or other agreements. -- To protect the rights, property, or safety of Significa, our clients or others. - -### Your Rights - -Significa will respect your legal rights to your data. Below are the rights that you have under law, and what Significa does to protect those rights: - -- The right to be informed: Significa is publishing this Privacy Policy to keep you informed as to what we do with your personal information. We strive to be transparent about how we use your data. -- The right to access: You have the right to access your information. Please contact Significa’s Data Protection Officer at [office@significa.co](mailto:office@significa.co) if you wish to access the personal information Significa holds about you. -- The right to rectification: If the information Significa holds about you is inaccurate or not complete, you have the right to ask us to rectify it. If that data has been passed to a third party with your consent or for legal reasons, then we must also ask them to rectify the data. Please contact our Data Protection Officer if you need us to rectify your information: [office@significa.co](mailto:office@significa.co). -- The right to erasure: This is sometimes called ‘the right to be forgotten’. If you want Significa to erase all your personal data and we do not have a legal reason to continue to process and hold it, please contact our Data Protection Officer: [office@significa.co](mailto:office@significa.co) -- The right to restrict processing: You have the right to ask Significa to restrict how we process your data. This means we are permitted to store the data but not further process it. We keep just enough data to make sure we respect your request in the future. If you want Us to restrict processing of your data, please contact our Data Protection Officer: [office@significa.co](mailto:office@significa.co) -- The right to data portability: Significa must allow you to obtain and reuse your personal data for your own purposes across services in a safe and secure way without this affecting the usability of your data. Please contact our Data Protection Officer if you want information on how to port your data elsewhere: [office@significa.co](mailto:office@significa.co). This right only applies to personal data that you have provided to us as the Data Controller. The data must be held by us by consent or for the performance of a contract. -- The right to object: You have the right to object to Significa processing your data even if it is based on our legitimate interests, the exercise of official authority, direct marketing (including data aggregation), and processing for the purposeless of statistics. If you wish to object please contact our Data Protection Officer: [office@significa.co](mailto:office@significa.co) -- The right to withdraw consent: If you have given us your consent to process your data but change your mind later, you have the right to withdraw your consent at any time, and Significa must stop processing your data. If you want to withdraw your consent, please contact our Data Protection Officer: [office@significa.co](mailto:office@significa.co) -- The right to complain to a Supervisory Authority: You have the right to complain to the CNPD if you feel that Significa has not responded to your requests to solve a problem. You can find their contact details here: [https://www.cnpd.pt](https://www.cnpd.pt) - -### Cookies - -Cookies are used to collect information about how visitors use our site and interact with us. We use the information to compile reports and to help us improve the site. The cookies collect information in an anonymous form, including the number of visitors to the site, where visitors have come to the site and the pages they visited. - -Cookies we use at Significa: - -- Google Analytics: \_ga, \_gid. Used to distinguish users. Expire in 24 months and is renewed if and when the user comes back to our website. [Click here for an overview of privacy at Google](https://www.google.com/analytics/learn/privacy.html). -- Crisp chatbot: Used to distinguish users. Expire in 6 months and is renewed if and when the user comes back to our website and loads the chatbot. [Click here for an overview of privacy at Crisp](https://crisp.chat/en/privacy/). - -Please note that third parties (including, for example, advertising networks and providers of external services like web traffic analysis services) may also use cookies, over which we have no control. These cookies are likely to be analytical/performance cookies or targeting cookies. - -You may block cookies by activating the setting on your browser that allows you to refuse the setting of all or some cookies. Please find the instructions below to learn more: - -Internet Explorer: - -1. Click on Tools > Internet Options in the main toolbar. -1. Select the Privacy tab to view your settings. -1. Move the slider to the level of privacy you prefer. - -Google Chrome: - -1. Click the spanner icon in the top right-hand corner of the browser and select Settings from the drop-down menu. -1. Click on Show advanced settings at the bottom of the page. -1. Select Content Settings under the Privacy heading. -1. Manage your preferred cookies settings from this page. - -Safari (Mac Only): - -1. Click on Safari in the toolbar, then select Preferences from the drop-down menu. -1. Click Privacy to view cookie preferences (note: Safari blocks third-party cookies by default). - -The term "Do Not Track" refers to a HTTP header offered by certain web browsers to request that websites refrain from tracking the user. We take action when possible in response to Do Not Track requests. - -For further information regarding cookies, please visit -[www.allaboutcookies.org](www.allaboutcookies.org) - -### Links to Other Websites - -Our website may contain links to and from websites of our partners, suppliers and other third parties. We have no control over the content or links displayed on these sites. If you follow a link to any of these websites, please note that these websites may have their own privacy policies and that we do not accept any responsibility or liability for any such policies. Please check these policies, where available, before you submit any personal data to these websites. - -### Children - -Significa does not believe its website or marketing content is appealing to children, nor is it directed at children under 13. Significa does not knowingly collect personally identifiable data from persons under the age of 13. - -### Changes to Our Privacy Policy - -Significa has the discretion to update this privacy policy at any time. Any such changes will be posted here and, where appropriate, notified to you in writing. We advise you to check back frequently to see any updates or changes. - ---- - -_Last Updated: May 3, 2019_ diff --git a/content/pages/notFound/notFound.yml b/content/pages/notFound/notFound.yml deleted file mode 100644 index f0bac1ef..00000000 --- a/content/pages/notFound/notFound.yml +++ /dev/null @@ -1,10 +0,0 @@ -seo: - title: Page not found - -title: 404 -text: It seems you're lost. - -prePlay: Doesn’t mean you can’t -play: enjoy a great song. -stop: stop a great song. -linkText: Take me home diff --git a/content/pages/services/services.yml b/content/pages/services/services.yml deleted file mode 100644 index cb251545..00000000 --- a/content/pages/services/services.yml +++ /dev/null @@ -1,68 +0,0 @@ -seo: - title: Services - description: What we do and how we do it here at Significa. - -hero: - title: A design-led agency focused on Product Development. - text: | - At Significa we take on products from inception to launch, from business model to people's pocket, from wireframe to continuous deployment. - We pride ourselves in loving what we do as we take on complex problems and come up with elegant and simple solutions. - services: - - title: Strategy - items: - - UX Research - - Business Strategy - - Brand Strategy - - Product Strategy - - Product Management - - Project Management - - title: Product Design - items: - - User Experience - - User Interface - - Brand Development - - Illustration - - Motion & Video - - title: Software Development - items: - - Front-end Engineering - - Web-app Development - - Native app Development - - Development Operations - - Backend Development - -strategy: - title: Strategy - text: | - No one understands your business better than you, so, before starting anything, we get to know you. We make sure no stone is left unturned and no question is left unanswered so that, in the end, everyone is in the same page with a clear route on what's our goals and what's expected. - -design: - title: Product Design - text: | - We do shiny & beautiful things. We know emotions are a big part of everyone's experience & we don't take them for granted. You know that first impact when you're using something you really like and go like "oh, I love this!"? That's what we're aiming for. - -development: - title: Software Development - text: | - There's an obsession with detail when it comes to developing what's envisioned and that’s why we’ve adopted some of the industry's best practices for Code Review, Quality Assurance & Continuous Deployment. React is our true workhorse and our unquestionable tool of choice to develop almost anything. - -network: - title: Our Network - text: We’ve partnered up with some amazing people to bring tech-led and security-led ways of thinking into Significa's melting pot. - companies: - - name: coletiv - title: Software Development - text: Software tailored to your needs with a transparent and industry-tested development process. - url: https://coletiv.com/ - prettyUrl: coletiv.com - - name: adamant - title: Cyber Security - text: Adamant focuses 100% on cyber and information security, keeping up with the rapid evolution of this field. - url: https://adamantsec.com/ - prettyUrl: adamantsec.com - -cta: - title: Have a project of your own? - text: Small or big, we've got you covered! - link: /contact - linkText: Get in touch! diff --git a/content/pages/showcase/showcase.yml b/content/pages/showcase/showcase.yml deleted file mode 100644 index 9038901d..00000000 --- a/content/pages/showcase/showcase.yml +++ /dev/null @@ -1,9 +0,0 @@ -seo: - title: Showcase - description: The most recent projects made by Significa. - -cta: - title: Have a project of your own? - text: Small or big, we've got you covered! - link: /contact - linkText: Get in touch! diff --git a/gatsby-browser.js b/gatsby-browser.js deleted file mode 100644 index 21493977..00000000 --- a/gatsby-browser.js +++ /dev/null @@ -1,34 +0,0 @@ -/* eslint-disable react/prop-types */ -/** - * Implement Gatsby's Browser APIs in this file. - * - * See: https://www.gatsbyjs.org/docs/browser-apis/ - */ - -/** - * If we need to prevent the common elements (e.g. Header, Footer) from - * being re-rendered in any path, wrap each page with the layout - */ - -import * as React from 'react' -import { Provider } from './src/components/Header' -import { - PrismicPreviewProvider, -} from 'gatsby-plugin-prismic-previews' - -import { linkResolver } from './src/utils/linkResolver' - -export const wrapRootElement = ({ element, props }) => ( - - - {element} - - -) \ No newline at end of file diff --git a/gatsby-config.js b/gatsby-config.js deleted file mode 100644 index b7493172..00000000 --- a/gatsby-config.js +++ /dev/null @@ -1,105 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const pkg = require('./package.json') -const linkResolver = require('./src/utils/linkResolver') - -require('dotenv').config() - -module.exports = { - pathPrefix: process.env.PATH_PREFIX, - siteMetadata: { - title: pkg.title, - description: pkg.description, - author: '@significadesign', - keywords: pkg.keywords, - siteUrl: pkg.siteUrl, - }, - plugins: [ - // SEO things - 'gatsby-plugin-react-helmet', - `gatsby-plugin-sitemap`, - `gatsby-plugin-robots-txt`, - { - resolve: `gatsby-plugin-canonical-urls`, - options: { - siteUrl: pkg.siteUrl, - }, - }, - { - resolve: `gatsby-plugin-google-analytics`, - options: { - trackingId: 'UA-67282841-1', - anonymize: true, - respectDNT: true, - }, - }, - // End SEO - { - resolve: 'gatsby-source-filesystem', - options: { - name: 'images', - path: `${__dirname}/src/assets/images`, - }, - }, - { - resolve: 'gatsby-source-filesystem', - options: { - name: 'content', - path: `${__dirname}/content`, - }, - }, - { - resolve: 'gatsby-plugin-prismic-previews', - options: { - repositoryName: 'significa', - accessToken: process.env.PRISMIC_ACCESS_TOKEN, - linkResolver: require('./src/utils/linkResolver'), - }, - }, - { - resolve: 'gatsby-source-prismic', - options: { - repositoryName: 'significa', - accessToken: process.env.PRISMIC_ACCESS_TOKEN, - linkResolver: (doc) => linkResolver(doc), - schemas: { - blog_author: require('./schemas/blog_author.json'), - blog_post: require('./schemas/blog_post.json'), - handbook_chapter: require('./schemas/handbook_chapter.json'), - handbook: require('./schemas/handbook.json'), - lab_entry: require('./schemas/lab_entry.json'), - position: require('./schemas/position.json'), - project: require('./schemas/project.json'), - }, - lang: '*', - }, - }, - 'gatsby-transformer-yaml', - 'gatsby-plugin-typescript', - 'gatsby-plugin-styled-components', - 'gatsby-transformer-sharp', - `gatsby-transformer-remark`, - `gatsby-plugin-image`, - `gatsby-plugin-sharp`, - { - resolve: 'gatsby-plugin-manifest', - options: { - name: 'gatsby-starter-default', - short_name: 'starter', - start_url: '/', - background_color: '#0154FF', - theme_color: '#0154FF', - display: 'minimal-ui', - icon: 'src/assets/images/icon.png', // This path is relative to the root of the site. - }, - }, - { - resolve: `gatsby-plugin-s3`, - options: { - bucketName: `significa.co`, - region: `eu-west-1`, - protocol: `https`, - hostname: `significa.co`, - }, - }, - ], -} diff --git a/gatsby-node.js b/gatsby-node.js deleted file mode 100644 index 1d5bf4fe..00000000 --- a/gatsby-node.js +++ /dev/null @@ -1,170 +0,0 @@ -/* eslint-disable @typescript-eslint/no-var-requires */ -const path = require('path') - -const slugify = require('@sindresorhus/slugify') - -/** Creating alias in webpack config */ -exports.onCreateWebpackConfig = ({ actions }) => { - actions.setWebpackConfig({ - resolve: { - alias: { - '@theme': path.resolve(__dirname, 'src/theme'), - }, - extensions: ['.ts', '.tsx'], - }, - }) -} - -exports.createPages = async ({ graphql, actions }) => { - const { createPage, createRedirect } = actions - - /** - * Redirects - */ - createRedirect({ - fromPath: '/studio', - toPath: '/about', - isPermanent: true, - redirectInBrowser: true, - }) - - createRedirect({ - fromPath: '/enquiry', - toPath: '/contact', - isPermanent: true, - redirectInBrowser: true, - }) - - createRedirect({ - fromPath: '/work', - toPath: '/showcase', - isPermanent: true, - redirectInBrowser: true, - }) - - createRedirect({ - fromPath: '/labs/css-only-slider', - toPath: '/labs', - isPermanent: true, - redirectInBrowser: true, - }) - - /** - * Projects - */ - const projects = await graphql(` - { - allPrismicProject { - nodes { - uid - _previewable - } - } - } - `) - projects.data.allPrismicProject.nodes.forEach(({ uid }) => { - createPage({ - path: `/showcase/${uid}`, - component: path.resolve('./src/templates/project.tsx'), - context: { uid }, - }) - }) - - /** - * Handbook - */ - const chapters = await graphql(` - { - allPrismicHandbookChapter { - nodes { - uid - _previewable - } - } - } - `) - chapters.data.allPrismicHandbookChapter.nodes.forEach(({ uid }) => { - createPage({ - path: `/handbook/${uid}`, - component: path.resolve(`./src/templates/handbook.tsx`), - context: { uid }, - }) - }) - - /** - * Positions - */ - const positions = await graphql(` - { - allPrismicPosition { - nodes { - uid - _previewable - } - } - } - `) - positions.data.allPrismicPosition.nodes.forEach(({ uid }) => { - createPage({ - path: `/careers/${uid}`, - component: path.resolve(`./src/templates/position.tsx`), - context: { uid }, - }) - }) - - /** - * Blog - */ - - // Posts - const posts = await graphql(` - { - allPrismicBlogPost { - nodes { - uid - data { - category - } - _previewable - } - } - } - `) - posts.data.allPrismicBlogPost.nodes.forEach(({ uid }) => { - createPage({ - path: `/blog/${uid}`, - component: path.resolve(`./src/templates/blog-post.tsx`), - context: { uid }, - }) - }) - - // categories - posts.data.allPrismicBlogPost.nodes.forEach(({ data: { category } }) => { - const slugifyCategory = slugify(category) - createPage({ - path: `/blog/category/${slugifyCategory}`, - component: path.resolve(`./src/templates/blog-category.tsx`), - context: { category }, - }) - }) - - // Authors - // TODO: uncomment when templates/blog-author.tsx is ready - - // const authors = await graphql(` - // { - // allPrismicBlogAuthor { - // nodes { - // uid - // } - // } - // } - // `) - // authors.data.allPrismicBlogAuthor.nodes.forEach(({ uid }) => { - // createPage({ - // path: `/blog/author/${uid}`, - // component: path.resolve(`./src/templates/blog-author.tsx`), - // context: { uid }, - // }) - // }) -} diff --git a/gatsby-ssr.js b/gatsby-ssr.js deleted file mode 100644 index 4d78881c..00000000 --- a/gatsby-ssr.js +++ /dev/null @@ -1,46 +0,0 @@ -import React from 'react' -import { Provider } from './src/components/Header' -import { - PrismicPreviewProvider, -} from 'gatsby-plugin-prismic-previews' - -import { linkResolver } from './src/utils/linkResolver' - -const CRISP_ID = '1d94ab70-6906-4198-a006-16144d4c8065' - -const onRenderBody = ({ setHeadComponents }) => { - if (process.env.NODE_ENV === 'development') { - return null - } - - const scriptInnerHTML = - `window.$crisp=[];window.CRISP_WEBSITE_ID="${CRISP_ID}";` + - `(function(){d=document;s=d.createElement("script");` + - `s.src="https://client.crisp.chat/l.js";` + - `s.async=1;` + - `d.getElementsByTagName("head")[0].appendChild(s);})();` - - return setHeadComponents([ - + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/src/assets/404.mp4 b/src/assets/404.mp4 deleted file mode 100644 index 40d3e810..00000000 Binary files a/src/assets/404.mp4 and /dev/null differ diff --git a/src/assets/404.svg b/src/assets/404.svg new file mode 100644 index 00000000..27b73376 --- /dev/null +++ b/src/assets/404.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/Adamant.tsx b/src/assets/Adamant.tsx deleted file mode 100644 index beb1b02a..00000000 --- a/src/assets/Adamant.tsx +++ /dev/null @@ -1,11 +0,0 @@ -import React from 'react' - -const Adamant = () => ( - - - - - -) - -export default Adamant diff --git a/src/assets/Coletiv.tsx b/src/assets/Coletiv.tsx deleted file mode 100644 index 2e83b9de..00000000 --- a/src/assets/Coletiv.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react' - -const Coletiv = () => ( - - - - - - -) - -export default Coletiv diff --git a/src/assets/back.svg b/src/assets/back.svg new file mode 100644 index 00000000..bc6f2138 --- /dev/null +++ b/src/assets/back.svg @@ -0,0 +1,172 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/eggHatching/eggHatching=01.svg b/src/assets/eggHatching/eggHatching=01.svg new file mode 100644 index 00000000..52c9b35a --- /dev/null +++ b/src/assets/eggHatching/eggHatching=01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/eggHatching/eggHatching=02.svg b/src/assets/eggHatching/eggHatching=02.svg new file mode 100644 index 00000000..49e96b88 --- /dev/null +++ b/src/assets/eggHatching/eggHatching=02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/eggHatching/eggHatching=03.svg b/src/assets/eggHatching/eggHatching=03.svg new file mode 100644 index 00000000..8b0e01ea --- /dev/null +++ b/src/assets/eggHatching/eggHatching=03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/eggHatching/eggHatching=04.svg b/src/assets/eggHatching/eggHatching=04.svg new file mode 100644 index 00000000..78c25bb6 --- /dev/null +++ b/src/assets/eggHatching/eggHatching=04.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/eggHatching/eggHatching=05.svg b/src/assets/eggHatching/eggHatching=05.svg new file mode 100644 index 00000000..f31e0472 --- /dev/null +++ b/src/assets/eggHatching/eggHatching=05.svg @@ -0,0 +1,122 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/eggs/egg=01.svg b/src/assets/eggs/egg=01.svg new file mode 100644 index 00000000..7cc60cc6 --- /dev/null +++ b/src/assets/eggs/egg=01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/eggs/egg=02.svg b/src/assets/eggs/egg=02.svg new file mode 100644 index 00000000..4b32458a --- /dev/null +++ b/src/assets/eggs/egg=02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/eggs/egg=03.svg b/src/assets/eggs/egg=03.svg new file mode 100644 index 00000000..dc8da0a9 --- /dev/null +++ b/src/assets/eggs/egg=03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/eggs/egg=04.svg b/src/assets/eggs/egg=04.svg new file mode 100644 index 00000000..c6e2d474 --- /dev/null +++ b/src/assets/eggs/egg=04.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/eggs/egg=05.svg b/src/assets/eggs/egg=05.svg new file mode 100644 index 00000000..241c64b9 --- /dev/null +++ b/src/assets/eggs/egg=05.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/eggs/egg=06.svg b/src/assets/eggs/egg=06.svg new file mode 100644 index 00000000..cf436849 --- /dev/null +++ b/src/assets/eggs/egg=06.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/eggs/egg=07.svg b/src/assets/eggs/egg=07.svg new file mode 100644 index 00000000..c9460811 --- /dev/null +++ b/src/assets/eggs/egg=07.svg @@ -0,0 +1,56 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/eggs/egg=08.svg b/src/assets/eggs/egg=08.svg new file mode 100644 index 00000000..8db91f0b --- /dev/null +++ b/src/assets/eggs/egg=08.svg @@ -0,0 +1,54 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/images/blog-logo.png b/src/assets/images/blog-logo.png deleted file mode 100644 index 8ff047f7..00000000 Binary files a/src/assets/images/blog-logo.png and /dev/null differ diff --git a/src/assets/images/icon.png b/src/assets/images/icon.png deleted file mode 100644 index a2b277e8..00000000 Binary files a/src/assets/images/icon.png and /dev/null differ diff --git a/src/assets/images/opengraphDefault.png b/src/assets/images/opengraphDefault.png deleted file mode 100644 index 677c3f9d..00000000 Binary files a/src/assets/images/opengraphDefault.png and /dev/null differ diff --git a/src/assets/images/twittercard.png b/src/assets/images/twittercard.png deleted file mode 100644 index 002ed540..00000000 Binary files a/src/assets/images/twittercard.png and /dev/null differ diff --git a/src/assets/moon.svg b/src/assets/moon.svg new file mode 100644 index 00000000..4035dd91 --- /dev/null +++ b/src/assets/moon.svg @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/assets/nobita-small.svg b/src/assets/nobita-small.svg new file mode 100644 index 00000000..1bd26df6 --- /dev/null +++ b/src/assets/nobita-small.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/plants/state=01.svg b/src/assets/plants/state=01.svg new file mode 100644 index 00000000..d54f35de --- /dev/null +++ b/src/assets/plants/state=01.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/plants/state=02.svg b/src/assets/plants/state=02.svg new file mode 100644 index 00000000..d8a76198 --- /dev/null +++ b/src/assets/plants/state=02.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/plants/state=03.svg b/src/assets/plants/state=03.svg new file mode 100644 index 00000000..d60a070f --- /dev/null +++ b/src/assets/plants/state=03.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/plants/state=04.svg b/src/assets/plants/state=04.svg new file mode 100644 index 00000000..eac28f79 --- /dev/null +++ b/src/assets/plants/state=04.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/chicken.svg b/src/assets/stickers/chicken.svg new file mode 100644 index 00000000..87a702af --- /dev/null +++ b/src/assets/stickers/chicken.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/cocktail.svg b/src/assets/stickers/cocktail.svg new file mode 100644 index 00000000..1eddf66e --- /dev/null +++ b/src/assets/stickers/cocktail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/diamond.svg b/src/assets/stickers/diamond.svg new file mode 100644 index 00000000..894f768b --- /dev/null +++ b/src/assets/stickers/diamond.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/draw.svg b/src/assets/stickers/draw.svg new file mode 100644 index 00000000..951b6cc0 --- /dev/null +++ b/src/assets/stickers/draw.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/duck.svg b/src/assets/stickers/duck.svg new file mode 100644 index 00000000..0d9f5f43 --- /dev/null +++ b/src/assets/stickers/duck.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/floater.svg b/src/assets/stickers/floater.svg new file mode 100644 index 00000000..428014c5 --- /dev/null +++ b/src/assets/stickers/floater.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/fried-egg.svg b/src/assets/stickers/fried-egg.svg new file mode 100644 index 00000000..7e42a86c --- /dev/null +++ b/src/assets/stickers/fried-egg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/globe.svg b/src/assets/stickers/globe.svg new file mode 100644 index 00000000..be904be9 --- /dev/null +++ b/src/assets/stickers/globe.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/hand.svg b/src/assets/stickers/hand.svg new file mode 100644 index 00000000..bdfa37b6 --- /dev/null +++ b/src/assets/stickers/hand.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/hat.svg b/src/assets/stickers/hat.svg new file mode 100644 index 00000000..9356eb7b --- /dev/null +++ b/src/assets/stickers/hat.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/ice-cream.svg b/src/assets/stickers/ice-cream.svg new file mode 100644 index 00000000..8d215fd9 --- /dev/null +++ b/src/assets/stickers/ice-cream.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/laptop.svg b/src/assets/stickers/laptop.svg new file mode 100644 index 00000000..9daa3bec --- /dev/null +++ b/src/assets/stickers/laptop.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/mail.svg b/src/assets/stickers/mail.svg new file mode 100644 index 00000000..996e1b3d --- /dev/null +++ b/src/assets/stickers/mail.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/meditate.svg b/src/assets/stickers/meditate.svg new file mode 100644 index 00000000..454bf15a --- /dev/null +++ b/src/assets/stickers/meditate.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/music.svg b/src/assets/stickers/music.svg new file mode 100644 index 00000000..0628ee09 --- /dev/null +++ b/src/assets/stickers/music.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/pawhighfive.svg b/src/assets/stickers/pawhighfive.svg new file mode 100644 index 00000000..6aa355e8 --- /dev/null +++ b/src/assets/stickers/pawhighfive.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/plane.svg b/src/assets/stickers/plane.svg new file mode 100644 index 00000000..ae0bac34 --- /dev/null +++ b/src/assets/stickers/plane.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/prize.svg b/src/assets/stickers/prize.svg new file mode 100644 index 00000000..a5170326 --- /dev/null +++ b/src/assets/stickers/prize.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/rubik.svg b/src/assets/stickers/rubik.svg new file mode 100644 index 00000000..e0130e33 --- /dev/null +++ b/src/assets/stickers/rubik.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/tie.svg b/src/assets/stickers/tie.svg new file mode 100644 index 00000000..59e85820 --- /dev/null +++ b/src/assets/stickers/tie.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/walrus.svg b/src/assets/stickers/walrus.svg new file mode 100644 index 00000000..c63b6c86 --- /dev/null +++ b/src/assets/stickers/walrus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/stickers/yolo.svg b/src/assets/stickers/yolo.svg new file mode 100644 index 00000000..a89a58c5 --- /dev/null +++ b/src/assets/stickers/yolo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/sun.svg b/src/assets/sun.svg new file mode 100644 index 00000000..4c8b37b1 --- /dev/null +++ b/src/assets/sun.svg @@ -0,0 +1,152 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/components/About/Careers/index.tsx b/src/components/About/Careers/index.tsx deleted file mode 100644 index 6372c35a..00000000 --- a/src/components/About/Careers/index.tsx +++ /dev/null @@ -1,77 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import { GatsbyImage, IGatsbyImageData } from 'gatsby-plugin-image' -import * as React from 'react' - -import { Theme } from '@theme' - -import { textByLine } from '../../../utils/textByLine' -import { RightContent } from '../../UI' -import * as S from './styled' - -interface ICareers { - aboutYaml: { - careers: { - title: string - text: string - link: string - linkText: string - photos: Array<{ - alt: string - image: { childImageSharp: { gatsbyImageData: IGatsbyImageData } } - }> - } - } -} - -const Careers = () => { - const { - aboutYaml: { careers }, - }: ICareers = useStaticQuery(query) - - return ( - - - - {textByLine(careers.text).map(e => ( - {e} - ))} - {careers.linkText} - - - - {careers.photos.map(({ image, alt }) => ( - - - - ))} - - - - ) -} - -export default Careers - -export const query = graphql` - query AboutCareersQuery { - aboutYaml { - careers { - title - text - link - linkText - photos { - alt - image { - childImageSharp { - gatsbyImageData - } - } - } - } - } - } -` diff --git a/src/components/About/Careers/styled.ts b/src/components/About/Careers/styled.ts deleted file mode 100644 index 255742c8..00000000 --- a/src/components/About/Careers/styled.ts +++ /dev/null @@ -1,46 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import * as UI from '../../UI' - -export const Wrapper = styled.div` - background: ${({ theme }) => theme.colors.background}; - border-top: 1px solid; - padding-bottom: 7.5em; - - ${media.small} { - padding-bottom: 2em; - } -` - -export const Text = styled(UI.Text)` - margin-bottom: 1em; -` - -export const Gallery = styled(UI.Container)` - display: grid; - grid-template-columns: repeat(3, 1fr); - grid-gap: 5em; - - ${media.large} { - grid-gap: 3em; - } - - ${media.medium} { - grid-gap: 1.5em; - grid-template-columns: repeat(2, 1fr); - } -` - -export const ImgHolder = styled.div` - ${media.medium} { - &:last-child { - display: none; - } - } -` - -export const ArrowLink = styled(UI.ArrowLink)` - margin-top: 3em; -` diff --git a/src/components/About/Content/index.tsx b/src/components/About/Content/index.tsx deleted file mode 100644 index b3cf276e..00000000 --- a/src/components/About/Content/index.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import React from 'react' - -import { textByLine } from '../../../utils/textByLine' -import { RightContent } from '../../UI' -import * as S from './styled' - -interface IContent { - aboutYaml: { - content: { - title: string - text: string - } - } -} - -const Content = () => { - const { - aboutYaml: { content }, - }: IContent = useStaticQuery(query) - - return ( - - {textByLine(content.text).map(e => ( - {e} - ))} - - ) -} - -export default Content - -export const query = graphql` - query AboutContentQuery { - aboutYaml { - content { - title - text - } - } - } -` diff --git a/src/components/About/Content/styled.ts b/src/components/About/Content/styled.ts deleted file mode 100644 index b1e53f04..00000000 --- a/src/components/About/Content/styled.ts +++ /dev/null @@ -1,9 +0,0 @@ -import styled from 'styled-components' - -import { Text as BaseText } from '../../UI' - -export const Text = styled(BaseText)` - &:not(:last-child) { - margin-bottom: 1em; - } -` diff --git a/src/components/About/Global/WorldMap/index.tsx b/src/components/About/Global/WorldMap/index.tsx deleted file mode 100644 index b0cdf776..00000000 --- a/src/components/About/Global/WorldMap/index.tsx +++ /dev/null @@ -1,143 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import * as React from 'react' -import { useCallback, useEffect, useState } from 'react' - -import * as S from './styled' -import worldMapSource from './world-map.svg' - -interface IPanel { - current: string - old: string -} - -const TIME_LETTER = 100 -const TIME_RANDOM_CITY = 6000 - -const template = (city: string) => `OPO>${city}` -const initialState = () => - new Array(7).fill(' ').map((_, index) => { - const randomLetter = char[Math.floor(Math.random() * char.length)] - - if (index === 3) { - return { current: '>', old: '>' } - } - - return { current: randomLetter, old: '0' } - }) - -const WorldMap = () => { - const { - aboutYaml: { - global: { cities }, - }, - } = useStaticQuery(query) - - const [splitFlap, setSplitFlap] = useState(initialState()) - const [currentCity, setCurrentCity] = useState( - template(cities[Math.floor(Math.random() * cities.length)]) - ) - - // - // Pass through all letters - // - const flipPanel = useCallback( - (curr: IPanel[]) => { - const splittedCity = currentCity.split('') - const newSorted = curr.map(({ current }, index) => { - if (current === splittedCity[index]) { - return { current, old: current } - } - - const indexChart = (char.indexOf(current) + 1) % char.length - - return { current: char[indexChart], old: current } - }) - - return setSplitFlap(newSorted) - }, - [currentCity] - ) - - // - // Random city - // - const randomCity = useCallback(() => { - const city = cities[Math.floor(Math.random() * cities.length)] - setCurrentCity(template(city)) - setSplitFlap(initialState()) - }, [cities]) - - // - // Call to update the letters - // - useEffect(() => { - const interval = setTimeout(() => flipPanel(splitFlap), TIME_LETTER) - - return () => clearInterval(interval) - }, [currentCity, flipPanel, splitFlap]) - - // Init - useEffect(() => { - randomCity() - const interval = setInterval(randomCity, TIME_RANDOM_CITY) - - return () => clearInterval(interval) - }, [randomCity]) - - return ( - - - - - {splitFlap.map(({ current }, index) => ( - - -
{current}
-
-
- ))} -
-
- ) -} - -export default WorldMap - -export const query = graphql` - query AboutMapQuery { - aboutYaml { - global { - cities - } - } - } -` - -const char = [ - 'A', - 'B', - 'C', - 'D', - 'E', - 'F', - 'G', - 'H', - 'I', - 'J', - 'K', - 'L', - 'M', - 'N', - 'O', - 'P', - 'Q', - 'R', - 'S', - 'T', - 'U', - 'V', - 'W', - 'X', - 'Y', - 'Z', -] diff --git a/src/components/About/Global/WorldMap/styled.ts b/src/components/About/Global/WorldMap/styled.ts deleted file mode 100644 index 6596e2b1..00000000 --- a/src/components/About/Global/WorldMap/styled.ts +++ /dev/null @@ -1,126 +0,0 @@ -import styled, { css } from 'styled-components' - -import { media, colors } from '@theme' - -export const MapWrapper = styled.div` - padding-top: 4em; - position: relative; - - margin-bottom: -4em; - - ${media.medium} { - margin-bottom: -2em; - } - - ${media.small} { - margin-bottom: 0; - } -` - -export const MapImg = styled.img` - width: 100%; -` - -export const BasePanel = styled.div` - position: absolute; - box-sizing: border-box; - - top: 50%; - left: 50%; - transform: translate(-50%, -25%); - - background: ${colors.lightBlack}; - padding: 0.5em; - border-radius: 6px; - display: inline-flex; - - ${media.small} { - width: calc((3rem * 3) + (1rem * 2)); - flex-wrap: wrap; - } -` - -export const Panel = styled.div` - background: ${({ theme }) => theme.colors.background}; - color: ${({ theme }) => theme.colors.foreground}; - box-sizing: border-box; - position: relative; - transform: perspective(600px); - overflow: hidden; - - display: inline-flex; - align-items: center; - justify-content: center; - - font-weight: bold; - font-size: 4em; - - width: 5rem; - height: 6rem; - border-radius: 2px; - - &:after { - content: ''; - display: block; - width: 100%; - border: 1px solid ${colors.lightBlack}; - position: absolute; - top: calc(50% + 1px); - z-index: 99; - } - - &:not(:last-child) { - margin-right: 0.5rem; - } - - &:nth-child(4) { - div > div { - margin-top: -0.05em; - } - } - - ${media.large} { - font-size: 3em; - - width: 4rem; - height: 5rem; - } - - ${media.medium} { - font-size: 2.5em; - - width: 3rem; - height: 4rem; - } - - ${media.small} { - &:nth-child(4) { - display: none; - } - - &:nth-child(3), - &:last-child { - margin-right: 0; - } - - &:nth-child(1), - &:nth-child(2), - &:nth-child(3) { - margin-bottom: 0.5rem; - } - } -` - -export const HalfPanel = styled.div<{ position: string }>` - ${({ theme, position }) => { - const isTop = position === 'top' - - return css` - position: ${isTop ? 'absolute' : 'relative'}; - background: ${isTop ? theme.colors.background : 'transparent'}; - overflow: hidden; - width: 100%; - text-align: center; - ` - }} -` diff --git a/src/components/About/Global/WorldMap/world-map.svg b/src/components/About/Global/WorldMap/world-map.svg deleted file mode 100644 index b6e46908..00000000 --- a/src/components/About/Global/WorldMap/world-map.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/src/components/About/Global/index.tsx b/src/components/About/Global/index.tsx deleted file mode 100644 index 61c779f5..00000000 --- a/src/components/About/Global/index.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import { IGatsbyImageData } from 'gatsby-plugin-image' -import React from 'react' - -import { Theme } from '@theme' - -import WorldMap from './WorldMap' -import * as S from './styled' - -interface IGlobal { - aboutYaml: { - global: { - title: string - text: string - cities: string[] - image: { - childImageSharp: { gatsbyImageData: IGatsbyImageData } - } - } - } -} - -const Global = () => { - const { - aboutYaml: { global: data }, - }: IGlobal = useStaticQuery(query) - - return ( - - - - - - - - - - - {data.title} - {data.text} - - - - - - - ) -} - -export default Global - -export const query = graphql` - query AboutGlobalQuery { - aboutYaml { - global { - image { - childImageSharp { - gatsbyImageData - } - } - title - text - } - } - } -` diff --git a/src/components/About/Global/styled.ts b/src/components/About/Global/styled.ts deleted file mode 100644 index d7013689..00000000 --- a/src/components/About/Global/styled.ts +++ /dev/null @@ -1,57 +0,0 @@ -import { GatsbyImage } from 'gatsby-plugin-image' -import styled from 'styled-components' - -import { media } from '@theme' - -import { - Text as BaseText, - Title as BaseTitle, - Container as BaseContainer, -} from '../../UI' - -export const Wrapper = styled.div` - background-color: ${({ theme }) => theme.colors.background}; -` - -export const Container = styled(BaseContainer)`` - -export const TextContent = styled.div` - max-width: 38rem; - margin: 0 auto; - margin-top: 10em; - - ${media.medium} { - margin-top: 7em; - } - - ${media.small} { - margin-top: 5em; - } -` - -export const ImageContainer = styled.div` - position: relative; - - &:before { - content: ''; - display: block; - position: absolute; - left: 0; - height: 50%; - width: 100%; - top: -1px; - background-color: white; - } -` - -export const ImageHolder = styled(BaseContainer)` - position: relative; -` - -export const Img = styled(GatsbyImage)`` - -export const Title = styled(BaseTitle)` - margin-bottom: 0.5em; -` - -export const Text = styled(BaseText)`` diff --git a/src/components/About/Services/index.tsx b/src/components/About/Services/index.tsx deleted file mode 100644 index 829a5f99..00000000 --- a/src/components/About/Services/index.tsx +++ /dev/null @@ -1,32 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import * as React from 'react' - -import { CallToAction } from '../../UI' - -const Services = () => { - const { aboutYaml } = useStaticQuery(query) - - return ( - - ) -} - -export default Services - -export const query = graphql` - query AboutCtaQuery { - aboutYaml { - cta { - title - text - link - linkText - } - } - } -` diff --git a/src/components/About/Team/index.tsx b/src/components/About/Team/index.tsx deleted file mode 100644 index 4757d06d..00000000 --- a/src/components/About/Team/index.tsx +++ /dev/null @@ -1,65 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import * as React from 'react' - -import * as T from '../../UI/Typography' -import * as S from './styled' - -interface ITeam { - aboutYaml: { - team: { - title: string - text: string - list: Array<{ - name: string - role: string - }> - } - } -} - -const Team = () => { - const { - aboutYaml: { team }, - }: ITeam = useStaticQuery(query) - - const amountTeamMembers = team.list.length - - const orderTeamNameByAlphabet = team.list.sort((a, b) => - a.name.localeCompare(b.name) - ) - - return ( - - {team.title} - - {team.text.replace('{team_count}', String(amountTeamMembers))} - - - - {orderTeamNameByAlphabet.map(e => ( - - {e.name} - {e.role} - - ))} - - - ) -} - -export default Team - -export const query = graphql` - query AboutTeamQuery { - aboutYaml { - team { - title - text - list { - name - role - } - } - } - } -` diff --git a/src/components/About/Team/styled.ts b/src/components/About/Team/styled.ts deleted file mode 100644 index 45e405e0..00000000 --- a/src/components/About/Team/styled.ts +++ /dev/null @@ -1,38 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { - Text as BaseText, - Title as BaseTitle, - Container as BaseContainer, -} from '../../UI' - -export const TeamWrapper = styled(BaseContainer)` - text-align: center; - padding-top: 7em; - - ${media.medium} { - padding-top: 3em; - } -` - -export const Title = styled(BaseTitle)` - margin-bottom: 0.5rem; -` - -export const Text = styled(BaseText)`` - -export const TeamList = styled.ul` - display: grid; - grid-template-columns: repeat(auto-fit, minmax(15em, 1fr)); - grid-gap: 3em; - - margin-top: 7em; - - ${media.medium} { - margin-top: 3em; - } -` - -export const TeamItem = styled.li`` diff --git a/src/components/About/Top/index.tsx b/src/components/About/Top/index.tsx deleted file mode 100644 index 1f82fdf6..00000000 --- a/src/components/About/Top/index.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import { GatsbyImage, IGatsbyImageData } from 'gatsby-plugin-image' -import React from 'react' - -import * as S from './styled' - -interface ITop { - aboutYaml: { - hero: { - title: string - photos: Array<{ - alt: string - image: { gatsbyImageData: IGatsbyImageData } - }> - } - } -} - -const Top = () => { - const { - aboutYaml: { hero: data }, - }: ITop = useStaticQuery(query) - - return ( - <> - - {data.title} - - - {data.photos.map(({ image, alt }) => ( - - - - ))} - - - ) -} - -export default Top - -export const query = graphql` - query AboutHeroQuery { - aboutYaml { - hero { - title - photos { - alt - image { - childImageSharp { - gatsbyImageData(placeholder: NONE, layout: CONSTRAINED) - } - } - } - } - } - } -` diff --git a/src/components/About/Top/styled.ts b/src/components/About/Top/styled.ts deleted file mode 100644 index edc74ea0..00000000 --- a/src/components/About/Top/styled.ts +++ /dev/null @@ -1,49 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { Container, Display as BaseDisplay } from '../../UI' - -export const TopWrapper = styled(Container)` - text-align: left; - - margin-top: 7.5rem; - margin-bottom: 7.5em; - - ${media.small} { - margin-top: 5em; - margin-bottom: 5em; - } -` - -export const Display = styled(BaseDisplay)` - margin-bottom: 0.5rem; - max-width: 32rem; -` - -export const Gallery = styled(Container)` - display: grid; - grid-template-columns: repeat(3, 1fr); - grid-gap: 5em; - - ${media.large} { - grid-gap: 3em; - } - - ${media.medium} { - grid-gap: 1.5em; - grid-template-columns: repeat(2, 1fr); - } - - ${media.small} { - grid-template: auto / 1fr; - } -` - -export const ImgHolder = styled.div` - ${media.medium} { - &:last-child { - display: none; - } - } -` diff --git a/src/components/About/index.ts b/src/components/About/index.ts deleted file mode 100644 index ab520f57..00000000 --- a/src/components/About/index.ts +++ /dev/null @@ -1,6 +0,0 @@ -export { default as Top } from './Top' -export { default as Content } from './Content' -export { default as Global } from './Global' -export { default as Careers } from './Careers' -export { default as Team } from './Team' -export { default as Services } from './Services' diff --git a/src/components/Blog/AuthorBox/AuthorBox.tsx b/src/components/Blog/AuthorBox/AuthorBox.tsx deleted file mode 100644 index 4b69e19a..00000000 --- a/src/components/Blog/AuthorBox/AuthorBox.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import React, { ReactNode } from 'react' - -import Image from '../../PrismicImage' -import { Author } from '../types' -import * as S from './styled' - -const AuthorBox: React.FC<{ - author: Author - compact?: boolean - children?: ReactNode -}> = ({ author, compact = false, children }) => { - return ( - - {author.profile_pic && ( - - {author.profile_pic.alt} - - )} - -
- {compact ? ( - <> - - {author.name} - {children} - - - ) : ( - <> - {author.name} - {author.position} - - )} -
-
- ) -} - -export default AuthorBox diff --git a/src/components/Blog/AuthorBox/styled.ts b/src/components/Blog/AuthorBox/styled.ts deleted file mode 100644 index e91fad4a..00000000 --- a/src/components/Blog/AuthorBox/styled.ts +++ /dev/null @@ -1,59 +0,0 @@ -import styled from 'styled-components' - -import { Label as LabelBase, Small } from '../../UI' - -export const Wrap = styled.div` - display: flex; - align-items: center; -` - -type Size = 'small' | 'regular' - -const setFontSizeBase = ({ size }: { size: Size }) => { - if (size === 'small') { - return '.47rem' - } - - return '1rem' -} - -export const ImageBox = styled.div<{ size: Size }>` - font-size: ${setFontSizeBase}; - width: 100%; - min-width: 2.5em; - max-width: 2.5em; - min-height: 2.5em; - max-height: 2.5em; - border-radius: 2.5em; - overflow: hidden; - margin-right: 1em; - - .gatsby-image-wrapper, - img { - height: 2.5em; - width: 2.5em; - } -` - -export const Text = styled(Small)` - line-height: 1.4; - display: block; -` - -export const Label = styled(LabelBase)` - display: flex; - line-height: 1.4; - - span { - margin: 0 0.3em; - } - - a { - color: inherit; - transition: color ${({ theme }) => theme.transitions.ease()}; - - &:hover { - color: ${({ theme: { colors } }) => colors.foreground}; - } - } -` diff --git a/src/components/Blog/AuthorSection/AuthorSection.tsx b/src/components/Blog/AuthorSection/AuthorSection.tsx deleted file mode 100644 index 658aded5..00000000 --- a/src/components/Blog/AuthorSection/AuthorSection.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import React from 'react' - -import { Author } from '../types' -import * as S from './styled' - -const AuthorSection: React.FC<{ content: Author }> = ({ content }) => { - return ( - - {content.profile_pic && ( - - )} - - - -
- {content.name} - - {content.position} @ Significa - -
-
- - - - - {content.social_links.map(({ social, link }) => { - return ( - - ) - })} - -
-
- ) -} - -export default AuthorSection diff --git a/src/components/Blog/AuthorSection/styled.ts b/src/components/Blog/AuthorSection/styled.ts deleted file mode 100644 index cde3f098..00000000 --- a/src/components/Blog/AuthorSection/styled.ts +++ /dev/null @@ -1,83 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { Content as ContentFromBlog } from '../../../templates/blog-post.styled' -import Img from '../../PrismicImage' -import { Title as BaseTitle, Text } from '../../UI' -import SocialBase from '../../UI/Social' - -export const Wrapper = styled.div` - display: flex; -` - -export const Content = styled.div` - flex: 1; -` - -export const Header = styled.div` - margin-bottom: 1.3em; - justify-content: space-between; - display: flex; - - ${media.small} { - display: block; - } -` - -export const Image = styled(Img)` - width: 9.7em; - height: 9.7em; - border-radius: 9.7em; - margin-right: 2.2em; - - ${media.small} { - margin-top: 0.3em; - margin-right: 1em; - min-width: 3.6em; - width: 3.6em; - height: 3.6em; - } -` - -export const Title = styled(BaseTitle)`` - -export const Description = styled(Text)`` - -export const Socials = styled.div` - display: flex; - align-items: center; - - ${media.small} { - margin-top: 1.3em; - margin-left: calc(-1em - 3.6em); - } -` - -export const SocialLink = styled(SocialBase)` - width: 20px; - height: 20px; - display: inline-block; - overflow: hidden; - opacity: 1; - - align-items: center; - justify-content: center; - display: inline-flex; - - &:not(:first-child) { - margin-left: 1.3em; - } - - &:hover { - opacity: 0.7; - } -` - -export const FormatContent = styled(ContentFromBlog)` - margin-left: 0; - - ${media.small} { - margin-left: calc(-1em - 3.6em); - } -` diff --git a/src/components/Blog/Breadcrumbs/Breadcrumbs.tsx b/src/components/Blog/Breadcrumbs/Breadcrumbs.tsx deleted file mode 100644 index d44eb84f..00000000 --- a/src/components/Blog/Breadcrumbs/Breadcrumbs.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import React from 'react' - -import { Container } from '../../UI' -import * as S from './styled' - -interface Props { - paths: Array<{ link: string; text: string }> -} - -const Breadcrumbs: React.FC = ({ paths = [] }) => { - return ( - - - {paths.map(path => { - return ( - - {path.text} - - ) - })} - - - ) -} - -export default Breadcrumbs diff --git a/src/components/Blog/Breadcrumbs/styled.ts b/src/components/Blog/Breadcrumbs/styled.ts deleted file mode 100644 index 7785252b..00000000 --- a/src/components/Blog/Breadcrumbs/styled.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Link } from 'gatsby' -import styled from 'styled-components' - -import { Text } from '../../UI' - -export const Wrapper = styled.div` - background: ${({ theme: { colors } }) => colors.background}; - white-space: nowrap; - overflow-x: auto; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - - &:after { - content: ''; - display: block; - border-bottom: 1px solid ${({ theme: { colors } }) => colors.subtle}; - position: absolute; - left: 0; - bottom: -1px; - right: 0; - } -` - -export const Item = styled(Text).attrs({ as: Link })<{ to: string }>` - padding-bottom: 0.6em; - display: inline-block; - - color: ${({ theme: { colors } }) => colors.secondary}; - transition: color ${({ theme }) => theme.transitions.ease()}; - - &:not(:last-child):after { - content: ''; - display: inline-block; - width: 7px; - height: 7px; - border-top: 2px solid ${({ theme: { colors } }) => colors.secondary}50; - border-right: 2px solid ${({ theme: { colors } }) => colors.secondary}50; - - margin-left: 0.3em; - margin-right: 0.7em; - transform: rotate(45deg) translateY(-2px); - } - - &:hover, - &:last-child { - color: ${({ theme: { colors } }) => colors.foreground}; - } - - &:last-child { - margin-right: 1em; - } -` diff --git a/src/components/Blog/Card/Card.tsx b/src/components/Blog/Card/Card.tsx deleted file mode 100644 index a8ce008b..00000000 --- a/src/components/Blog/Card/Card.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import slugify from '@sindresorhus/slugify' -import { Link } from 'gatsby' -import React from 'react' - -import formatDate from '../../../utils/formatDate' -import linkResolver from '../../../utils/linkResolver' -import AuthorBox from '../AuthorBox/AuthorBox' -import { BlogPost } from '../types' -import * as S from './styled' - -const Card: React.FC<{ post: BlogPost }> = ({ post }) => { - const slugifyCategory = slugify(post.data.category) - const categoryMeta = { type: 'blog_category', uid: slugifyCategory } - - const postLink = linkResolver(post) - - return ( - - - - - - - - - {post.data.title} - {post.data.teaser} - - - - - - {/* render as children */} - · - {post.data.category} - · - {formatDate(post.data.date)} - - - ) -} - -export default Card diff --git a/src/components/Blog/Card/styled.ts b/src/components/Blog/Card/styled.ts deleted file mode 100644 index b318b1eb..00000000 --- a/src/components/Blog/Card/styled.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { GatsbyImage } from 'gatsby-plugin-image' -import styled from 'styled-components' - -import { media } from '@theme' - -import { SmallTitle, Text } from '../../UI' - -export const Article = styled.article` - margin-bottom: 4em; -` - -export const Image = styled(GatsbyImage)` - margin-bottom: 1.3em; - overflow: hidden; - - img { - /* Gatsby Image has a inline transition rule */ - transition: all ${({ theme }) => theme.transitions.ease()} !important; - } -` - -export const Title = styled(SmallTitle)` - transition: opacity ${({ theme }) => theme.transitions.ease()}; -` - -export const Description = styled(Text)` - margin: 0.4em 0 0.9em; - transition: opacity ${({ theme }) => theme.transitions.ease()}; -` - -export const Content = styled.div` - will-change: opacity; -` - -export const HoverHint = styled.div` - ${media.hover} { - &:hover ${Image} img { - transform: scale(1.02); - } - - &:hover ${Title}, &:hover ${Description} { - opacity: 0.6; - } - } -` diff --git a/src/components/Blog/Categories/Categories.tsx b/src/components/Blog/Categories/Categories.tsx deleted file mode 100644 index 834152e9..00000000 --- a/src/components/Blog/Categories/Categories.tsx +++ /dev/null @@ -1,71 +0,0 @@ -import slugify from '@sindresorhus/slugify' -import { graphql, useStaticQuery } from 'gatsby' -import React from 'react' - -import linkResolver from '../../../utils/linkResolver' -import { BlogPost } from '../types' -import * as S from './styled' - -type CategoryList = Array<{ - name: string - type: 'blog_category' - uid: string -}> - -interface Prop { - allPrismicBlogPost: { - edges: Array<{ node: BlogPost }> - } -} - -const CategoriesTab: React.FC = () => { - const data = useStaticQuery(query) - const posts = data.allPrismicBlogPost.edges - - const categories: CategoryList = posts.reduce((acc: CategoryList, curr) => { - const alreadyIn = - acc.findIndex(e => e.name === curr.node.data.category) !== -1 - - if (!alreadyIn) { - acc.push({ - name: curr.node.data.category, - type: 'blog_category', - uid: slugify(curr.node.data.category), - }) - } - - return acc - }, []) - - return ( - - - Blog - - {categories.map((item, index) => { - return ( - - {item.name} - - ) - })} - - - ) -} - -export const query = graphql` - query BlogCategoriesQuery { - allPrismicBlogPost(sort: { fields: data___category, order: ASC }) { - edges { - node { - data { - category - } - } - } - } - } -` - -export default CategoriesTab diff --git a/src/components/Blog/Categories/styled.ts b/src/components/Blog/Categories/styled.ts deleted file mode 100644 index da7ef7fe..00000000 --- a/src/components/Blog/Categories/styled.ts +++ /dev/null @@ -1,41 +0,0 @@ -import { Link } from 'gatsby' -import styled from 'styled-components' - -import { Text, Container as BaseContainer } from '../../UI' - -export const Wrapper = styled.div` - background: ${({ theme: { colors } }) => colors.background}; - white-space: nowrap; - overflow-x: auto; - overflow-y: hidden; - -webkit-overflow-scrolling: touch; - - &:after { - content: ''; - display: block; - border-bottom: 1px solid ${({ theme: { colors } }) => colors.subtle}; - position: absolute; - left: 0; - bottom: 0; - right: 0; - } -` - -export const Container = styled(BaseContainer)` - position: relative; - z-index: 2; - margin-bottom: 1px; -` - -export const Item = styled(Text).attrs({ as: Link })<{ to: string }>` - margin-right: 1.5em; - padding-bottom: 0.6em; - display: inline-block; - border-bottom: 1px solid ${({ theme: { colors } }) => colors.subtle}; - margin-bottom: -1px; - - &[aria-current='page'] { - color: ${({ theme: { colors } }) => colors.brand}; - border-bottom: 1px solid ${({ theme: { colors } }) => colors.brand}; - } -` diff --git a/src/components/Blog/Hero/Hero.tsx b/src/components/Blog/Hero/Hero.tsx deleted file mode 100644 index cb6d41f6..00000000 --- a/src/components/Blog/Hero/Hero.tsx +++ /dev/null @@ -1,56 +0,0 @@ -import slugify from '@sindresorhus/slugify' -import { Link } from 'gatsby' -import React from 'react' - -import formatDate from '../../../utils/formatDate' -import linkResolver from '../../../utils/linkResolver' -import { ArrowLink } from '../../UI' -import AuthorBox from '../AuthorBox/AuthorBox' -import { BlogPost } from '../types' -import * as S from './styled' - -const Hero: React.FC<{ post: BlogPost }> = ({ post }) => { - const slugifyCategory = slugify(post.data.category) - const categoryMeta = { type: 'blog_category', uid: slugifyCategory } - - const postLink = linkResolver(post) - - return ( - - - - - - - - - {post.data.title} - - - {post.data.teaser} - - - - - - - {/* render as children */} - · - {post.data.category} - · - {formatDate(post.data.date)} - - - - Read more - - - - ) -} - -export default Hero diff --git a/src/components/Blog/Hero/styled.ts b/src/components/Blog/Hero/styled.ts deleted file mode 100644 index c4133a6e..00000000 --- a/src/components/Blog/Hero/styled.ts +++ /dev/null @@ -1,90 +0,0 @@ -import { GatsbyImage } from 'gatsby-plugin-image' -import styled from 'styled-components' - -import { media } from '@theme' - -import { SmallTitle, Text } from '../../UI' - -export const Image = styled(GatsbyImage)` - width: 100%; -` - -export const Content = styled.div` - background: ${({ theme: { colors } }) => colors.background}; - padding-top: 2.5em; - padding-right: 2.5em; - max-width: 66%; - - transform: translateY(-50%); - - ${media.medium} { - transform: translateY(-40%); - max-width: 100%; - - padding-top: 1.5em; - padding-right: 1.5em; - padding-left: 1.5em; - - margin-left: 1.5em; - margin-right: 1.5em; - } -` - -export const Column = styled.div` - display: flex; - margin-bottom: 2.2em; - - > * { - width: 50%; - } - - ${media.large} { - display: block; - - > * { - width: 100%; - } - } -` - -export const Title = styled(SmallTitle)` - padding-right: 0; - - ${media.large} { - padding-right: 16px; - } -` - -export const Description = styled(Text)` - padding-top: 0.2em; -` - -export const Detail = styled.div` - display: flex; - align-items: center; - padding-right: 0; - - ${media.large} { - display: block; - margin-bottom: 2em; - padding-right: 16px; - } -` - -export const Article = styled.article` - margin-top: 3.9em; - margin-bottom: -3.9em; - - margin-left: 0; - margin-right: 0; - - ${media.medium} { - margin-left: -1.5em; - margin-right: -1.5em; - } - - a { - color: inherit; - display: block; - } -` diff --git a/src/components/Blog/List/List.tsx b/src/components/Blog/List/List.tsx deleted file mode 100644 index cf4bf76f..00000000 --- a/src/components/Blog/List/List.tsx +++ /dev/null @@ -1,36 +0,0 @@ -import React, { ReactNode, useRef } from 'react' - -import useMeasure from '../../../hooks/useMeasure' -import Card from '../Card/Card' -import { BlogPost } from '../types' -import * as S from './styled' - -const ThumbHolder: React.FC<{ children: ReactNode }> = ({ children }) => { - const ref = useRef(null) - const { height } = useMeasure(ref, 'article') - const rowSpan = Math.ceil(height / 4) - - return ( -
- {children} -
- ) -} - -const BlogList: React.FC<{ posts: Array<{ node: BlogPost }> }> = ({ - posts, -}) => { - return ( - - {posts.map(({ node }) => { - return ( - - - - ) - })} - - ) -} - -export default BlogList diff --git a/src/components/Blog/List/styled.ts b/src/components/Blog/List/styled.ts deleted file mode 100644 index 92cb4bba..00000000 --- a/src/components/Blog/List/styled.ts +++ /dev/null @@ -1,15 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -export const Container = styled.div` - margin-top: 3.9em; - display: grid; - grid-template-columns: 1fr 1fr; - - grid-column-gap: 3rem; - - ${media.medium} { - grid-template-columns: 1fr; - } -` diff --git a/src/components/Blog/types.ts b/src/components/Blog/types.ts deleted file mode 100644 index 82b0cf83..00000000 --- a/src/components/Blog/types.ts +++ /dev/null @@ -1,68 +0,0 @@ -import { IGatsbyImageData } from 'gatsby-plugin-image' - -export interface AuthorSocial { - link: string - social: - | 'Behance' - | 'Github' - | 'Dribbble' - | 'Instagram' - | 'Professional email' - | 'Personal website' -} - -export interface Author { - name: string - position: string - description: { - html: string - } - profile_pic: { - alt: string - url: string - gatsbyImageData: IGatsbyImageData - } - social_links: AuthorSocial[] -} - -export interface BlogPost { - uid: string - type: string - - data: { - meta_title: string - meta_description: string - listed: boolean - meta_image_share: { - alt: string - url: string - fixed: { - src: string - } - } - - date: string - - title: string - teaser: string - author: { - url: string - document: { - data: Author - } - } - category: string - - tags: Array<{ tag: string }> - hero: { - alt: string - url: string - gatsbyImageData: IGatsbyImageData - } - - content: { - html: string - raw: object - } - } -} diff --git a/src/components/Careers/ADayAtSignifica/SunAndLogo/index.tsx b/src/components/Careers/ADayAtSignifica/SunAndLogo/index.tsx deleted file mode 100644 index 69a1fca0..00000000 --- a/src/components/Careers/ADayAtSignifica/SunAndLogo/index.tsx +++ /dev/null @@ -1,162 +0,0 @@ -import React, { - useCallback, - useContext, - useEffect, - useRef, - useState, -} from 'react' - -import { ThemeContext } from '@theme' - -import * as S from './styled' - -type ThemeType = 'light' | 'dark' - -const SUN_START_RADIUS = 5 -const SUN_END_RADIUS = 13 - -const SunAndLogo = () => { - const { updateTheme } = useContext(ThemeContext) - - // Refs for the sun and sun path - const pathRef = useRef(null) - const circleRef = useRef(null) - - const [currentTheme, setCurrentTheme] = useState('light') - const [shouldAnimate, setShouldAnimate] = useState(true) - - // When our local state theme changes, we need to update the theme context - useEffect(() => { - updateTheme(currentTheme) - }, [currentTheme, updateTheme]) - - // Toggle handler to change between themes - const handleToggle = useCallback(() => { - if (!circleRef.current) { - return null - } - - const circleX = circleRef.current.cx.baseVal.value - const isNightNow = currentTheme === 'dark' - - circleRef.current.setAttribute( - 'cx', - String(isNightNow ? circleX + 22 : circleX - 22) - ) - return setCurrentTheme(isNightNow ? 'light' : 'dark') - }, [currentTheme]) - - const handleScroll = useCallback(() => { - if (!pathRef.current || !circleRef.current) { - return null - } - - const pathBounding = pathRef.current.getBoundingClientRect() - // get distance from path in center of window to window top - const pathToTop = (pathBounding.top - window.outerHeight / 2) * -1 - const pathHeight = pathBounding.height - const percentage = (pathToTop * 100) / pathHeight - - // get the percentage of how much of the path is visible to the center of the window (capped between 0 and 100) - const pathPercentageInView = Math.max(Math.min(percentage, 100), 0) / 100 - - const pathLength = pathRef.current.getTotalLength() - const pathPercentage = pathLength * pathPercentageInView - const circleCoordinates = pathRef.current.getPointAtLength(pathPercentage) - - pathRef.current.style.strokeDasharray = pathLength.toString() - pathRef.current.style.strokeDashoffset = ( - pathLength - pathPercentage - ).toString() - - const radiusDiff = SUN_END_RADIUS - SUN_START_RADIUS - circleRef.current.setAttribute( - 'r', - String(SUN_START_RADIUS + pathPercentageInView * radiusDiff) - ) - circleRef.current.setAttribute('cx', String(circleCoordinates.x)) - circleRef.current.setAttribute('cy', String(circleCoordinates.y)) - - if (pathPercentageInView >= 1) { - setCurrentTheme('dark') - return setShouldAnimate(false) - } - - return null - }, []) - - // Add a scroll listener to make the sun move - useEffect(() => { - if (shouldAnimate) { - handleScroll() - window.addEventListener('scroll', handleScroll) - } - - return () => window.removeEventListener('scroll', handleScroll) - }, [handleScroll, shouldAnimate]) - - return ( - - - - - - - - - - - - - - - - - - - - ) -} - -export default SunAndLogo diff --git a/src/components/Careers/ADayAtSignifica/SunAndLogo/styled.ts b/src/components/Careers/ADayAtSignifica/SunAndLogo/styled.ts deleted file mode 100644 index 6af3b79a..00000000 --- a/src/components/Careers/ADayAtSignifica/SunAndLogo/styled.ts +++ /dev/null @@ -1,52 +0,0 @@ -import styled, { css } from 'styled-components' - -export const Toggle = styled.g` - cursor: pointer; - - rect { - opacity: 0; - transition: opacity ${({ theme }) => theme.transitions.ease()}; - } -` - -export const Path = styled.g`` - -export const Sun = styled.circle`` - -export const Logo = styled.path`` - -export const LittleCircle = styled.circle` - stroke: ${({ theme }) => theme.colors.foreground}; - fill: ${({ theme }) => theme.colors.background}; -` - -interface ISvgProps { - animationEnded: boolean -} - -export const Svg = styled.svg` - transform: translate3d(0, 0, 0); - width: 100%; - overflow: visible; - pointer-events: ${({ animationEnded }: ISvgProps) => - animationEnded ? 'default' : 'none'}; - - ${({ animationEnded }) => - animationEnded && - css` - ${Toggle} { - rect { - opacity: 0.1; - } - } - - ${Path} { - display: none; - } - - ${Sun} { - transition: cx ${({ theme }) => theme.transitions.cubic()}; - transition-delay: 100ms; - } - `} -` diff --git a/src/components/Careers/ADayAtSignifica/index.tsx b/src/components/Careers/ADayAtSignifica/index.tsx deleted file mode 100644 index a7558a1b..00000000 --- a/src/components/Careers/ADayAtSignifica/index.tsx +++ /dev/null @@ -1,105 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import { IGatsbyImageData } from 'gatsby-plugin-image' -import React, { useRef } from 'react' - -import useMeasure from '../../../hooks/useMeasure' -import SunAndLogo from './SunAndLogo' -import * as S from './styled' - -interface IGallery { - alt: string - image: { - childImageSharp: { - gatsbyImageData: IGatsbyImageData - } - } -} - -interface ICareersPerks { - careersYaml: { - adayatsignifica: { - top: IGallery[] - bottom: IGallery[] - } - } -} - -const Perks: React.FC = () => { - const { - careersYaml: { adayatsignifica }, - }: ICareersPerks = useStaticQuery(careersADayAtSignificaQuery) - - const outerRef = useRef(null) - const { width } = useMeasure(outerRef) - - return ( -
- - - - {adayatsignifica.top.map( - ({ image: { childImageSharp }, alt }, i) => { - return ( - - ) - } - )} - - - {width >= 768 && ( - - - - )} - - - {width >= 768 && ( - - {adayatsignifica.bottom.map( - ({ image: { childImageSharp }, alt }, i) => { - return ( - - ) - } - )} - - )} - -
- ) -} - -const careersADayAtSignificaQuery = graphql` - query CareersADayAtSignificaQuery { - careersYaml { - adayatsignifica { - top { - alt - image { - childImageSharp { - gatsbyImageData(placeholder: NONE, layout: CONSTRAINED) - } - } - } - bottom { - alt - image { - childImageSharp { - gatsbyImageData(placeholder: NONE, layout: CONSTRAINED) - } - } - } - } - } - } -` - -export default Perks diff --git a/src/components/Careers/ADayAtSignifica/styled.ts b/src/components/Careers/ADayAtSignifica/styled.ts deleted file mode 100644 index 15a56644..00000000 --- a/src/components/Careers/ADayAtSignifica/styled.ts +++ /dev/null @@ -1,166 +0,0 @@ -import { GatsbyImage } from 'gatsby-plugin-image' -import styled from 'styled-components' - -import { media } from '@theme' - -import { Container } from '../../UI' - -export const Wrapper = styled(Container)` - margin-top: 12em; - - ${media.large} { - margin-top: 3em; - } -` - -export const RelativeWrapper = styled.div` - position: relative; - padding-bottom: 20vw; - margin-bottom: 10vw; - - ${media.medium} { - padding-bottom: 0; - } -` - -export const Day = styled.div` - position: absolute; - z-index: 100; - bottom: 0; - left: 0; - width: 100%; -` - -const Gallery = styled.div` - display: grid; - grid-template: repeat(2, 1fr) / repeat(8, 1fr); - grid-gap: 5em; - - ${media.large} { - grid-gap: 2em; - } - - ${media.medium} { - grid-template: repeat(2, 15em) / repeat(2, 1fr); - } - - ${media.small} { - grid-gap: 1.5em; - grid-template-columns: 1fr; - } -` - -export const TopGallery = styled(Gallery)` - grid-template: 4fr 5fr / repeat(8, 1fr); -` - -export const BottomGallery = styled(Gallery)`` - -export const TopImage = styled(GatsbyImage)` - &:nth-child(1) { - margin-left: 5em; - margin-top: 10em; - grid-column-end: span 2; - } - - &:nth-child(2) { - grid-column-end: span 2; - } - - &:nth-child(3) { - grid-column-end: span 3; - margin-top: 5em; - } - - &:nth-child(4) { - grid-column-end: span 3; - margin-bottom: 5em; - } - - &:nth-child(5) { - grid-column-end: span 3; - } - - &:nth-child(6) { - grid-column-end: span 2; - margin-bottom: 10em; - } - - ${media.large} { - &:nth-child(1) { - margin-left: 2em; - margin-top: 3em; - } - - &:nth-child(3) { - margin-top: 2em; - } - - &:nth-child(4) { - margin-bottom: 2em; - } - - &:nth-child(6) { - margin-bottom: 3em; - } - } - - ${media.medium} { - &:nth-child(1n) { - margin: 0; - grid-column-end: span 1; - } - - &:nth-child(3n - 2) { - display: none; - } - - &:nth-child(2) { - margin-left: 3em; - } - - &:nth-child(3) { - margin-top: 5em; - margin-right: 3em; - } - - &:nth-child(6) { - margin-bottom: 3em; - } - } - - ${media.small} { - &:nth-child(1n) { - margin: 0; - } - - &:nth-child(2n) { - display: none; - } - } -` - -export const BottomImage = styled(GatsbyImage)` - &:nth-child(1) { - margin-top: 5em; - grid-column-end: span 3; - } - - &:nth-child(2) { - grid-column-end: span 3; - } - - &:nth-child(3) { - margin-top: 5em; - grid-column-end: span 2; - } - - &:nth-child(4) { - margin-bottom: 5em; - grid-column: 2 / span 3; - } - - &:nth-child(5) { - grid-column-end: span 3; - } -` diff --git a/src/components/Careers/About/index.tsx b/src/components/Careers/About/index.tsx deleted file mode 100644 index 7f7dd5e3..00000000 --- a/src/components/Careers/About/index.tsx +++ /dev/null @@ -1,64 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import React from 'react' - -import { RightContent } from '../../UI/Layout' -import * as S from './styled' - -interface ISection { - title: string - text: string -} - -interface ICareersAbout { - careersYaml: { - about: { - title: string - sections: ISection[] - cta: { link: string; linkText: string } - } - } -} - -const About: React.FC = () => { - const { - careersYaml: { about }, - }: ICareersAbout = useStaticQuery(careersAboutQuery) - - const renderSection = ({ title, text }: ISection) => ( - - {title} - {text} - - ) - - return ( - - <> - {about.sections.map(renderSection)} - - {about.cta.linkText} - - - - ) -} - -const careersAboutQuery = graphql` - query CareersAboutQuery { - careersYaml { - about { - title - sections { - title - text - } - cta { - link - linkText - } - } - } - } -` - -export default About diff --git a/src/components/Careers/About/styled.tsx b/src/components/Careers/About/styled.tsx deleted file mode 100644 index 412ab5c6..00000000 --- a/src/components/Careers/About/styled.tsx +++ /dev/null @@ -1,35 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { ArrowLink as BaseArrowLink, Big, Text } from '../../UI' - -export const ArrowLink = styled(BaseArrowLink)`` - -export const SectionWrapper = styled.div` - display: flex; - flex-wrap: wrap; -` - -export const Section = styled.div` - box-sizing: border-box; - width: 50%; - padding-right: 3em; - - ${media.large} { - width: 100%; - padding-right: 0; - } -` - -export const SectionTitle = styled(Big)` - margin-bottom: 0.5rem; -` - -export const SectionText = styled(Text)` - margin-bottom: 3em; - - ${media.small} { - margin-bottom: 2em; - } -` diff --git a/src/components/Careers/FormPosition/Success/index.tsx b/src/components/Careers/FormPosition/Success/index.tsx deleted file mode 100644 index 200fd325..00000000 --- a/src/components/Careers/FormPosition/Success/index.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import { useStaticQuery, graphql } from 'gatsby' -import React from 'react' - -import { textByLine } from '../../../../utils/textByLine' -import * as S from './styled' - -interface ISuccessProps { - goBack: () => void -} - -interface ISuccessData { - careersYaml: { - positions: { - success: { - title: string - subtitle: string - back: string - } - } - } -} - -const Success: React.FC = ({ goBack }) => { - const { careersYaml: data }: ISuccessData = useStaticQuery( - positionFormSuccessQuery - ) - - return ( - - {textByLine(data.positions.success.title).map((line, key) => ( - {line} - ))} - {textByLine(data.positions.success.subtitle).map((line, key) => ( - {line} - ))} - - - {data.positions.success.back} - - - ) -} - -const positionFormSuccessQuery = graphql` - query positionFormSuccessQuery { - careersYaml { - positions { - success { - title - subtitle - back - } - } - } - } -` - -export default Success diff --git a/src/components/Careers/FormPosition/Success/styled.ts b/src/components/Careers/FormPosition/Success/styled.ts deleted file mode 100644 index fcd68a93..00000000 --- a/src/components/Careers/FormPosition/Success/styled.ts +++ /dev/null @@ -1,30 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { Container, Display, Text as BaseText, ArrowLink } from '../../../UI' - -export const Wrapper = styled(Container)` - max-width: 38em; - - margin-top: 7.5em; - margin-bottom: 12.5em; - - ${media.medium} { - margin-top: 5em; - margin-bottom: 7em; - } -` - -export const Title = styled(Display)`` -export const Text = styled(BaseText)` - &:first-of-type { - margin-top: 0.5rem; - } -` - -export const Button = styled(ArrowLink).attrs({ - reverse: true, -})` - margin-top: 2rem; -` diff --git a/src/components/Careers/FormPosition/index.tsx b/src/components/Careers/FormPosition/index.tsx deleted file mode 100644 index c853e67e..00000000 --- a/src/components/Careers/FormPosition/index.tsx +++ /dev/null @@ -1,236 +0,0 @@ -import axios from 'axios' -import { graphql, useStaticQuery } from 'gatsby' -import React, { useState } from 'react' - -import { Theme } from '@theme' - -import { MAIL_REGEX } from '../../../constants' -import useFileUpload from '../../../hooks/useFileUpload' -import useForm from '../../../hooks/useForm' -import { RightContent } from '../../UI/Layout' -import Success from './Success' -import * as S from './styled' - -interface IValues { - [key: string]: string | number | boolean -} - -interface IErrors { - [key: string]: string -} - -const Form: React.FC<{ position: string }> = ({ position }) => { - const { - careersYaml: { positions: data }, - }: IPositionSubmit = useStaticQuery(positionFormQuery) - // Main status state - const [submitted, setSubmitted] = useState(false) - - // FileUpload - const { - upload, - cancel, - pending: filePending, - fileUrl, - error: fileError, - } = useFileUpload({ - errors: { - upload: data.errors.uploadError, - fileSize: data.errors.uploadSizeError, - }, - }) - - // Form - const [form, fields] = useForm({ - initialValues: { - name: '', - email: '', - budget: '', - message: '', - }, - validate, - handleSubmit: values => handleSubmit(values, fileUrl), - }) - - // HandleSubmit - function handleSubmit(values: IValues, attachment: string) { - const body = fileUrl - ? { ...values, position, attachment } - : { ...values, position } - return axios - .post('https://api.significa.co/career', body) - .then(() => { - setSubmitted(true) - }) - .catch(() => { - return { global: data.errors.global } - }) - } - - // Validate - function validate(values: IValues) { - const errors: IErrors = {} - - if (!values.name) { - errors.name = data.errors.nameRequired - } - - if (!values.email) { - errors.email = data.errors.emailRequired - } else if ( - typeof values.email === 'string' && - !MAIL_REGEX.test(values.email) - ) { - errors.email = data.errors.emailInvalid - } - - if (!values.message) { - errors.message = data.errors.messageRequired - } - - return errors - } - - return ( - - - {submitted ? ( - setSubmitted(false)} /> - ) : ( - - {form.errors.global && {form.errors.global}} - -
- - - - - - - - {data.form.submit.label} - - - -
- )} -
-
- ) -} - -interface IPositionSubmit { - careersYaml: { - positions: { - errors: { - global: string - nameRequired: string - emailRequired: string - emailInvalid: string - messageRequired: string - uploadError: string - uploadSizeError: string - } - - form: { - title: string - name: { - label: string - placeholder: string - } - email: { - label: string - placeholder: string - } - portfolio: { - label: string - placeholder: string - } - message: { - label: string - placeholder: string - } - attachment: { - label: string - } - submit: { - label: string - } - } - } - } -} - -const positionFormQuery = graphql` - query positionFormQuery { - careersYaml { - positions { - errors { - global - nameRequired - emailRequired - emailInvalid - messageRequired - uploadError - uploadSizeError - } - form { - title - name { - label - placeholder - } - email { - label - placeholder - } - portfolio { - label - placeholder - } - message { - label - placeholder - } - attachment { - label - } - submit { - label - } - } - } - } - } -` - -export default Form diff --git a/src/components/Careers/FormPosition/styled.tsx b/src/components/Careers/FormPosition/styled.tsx deleted file mode 100644 index 60d006c0..00000000 --- a/src/components/Careers/FormPosition/styled.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { - Input as BaseInput, - Textarea as BaseTextarea, - Button as BaseButton, - FileInput as BaseFileInput, - Display, - Text as BaseText, -} from '../../UI' - -interface IWrapper { - isSubmitting: boolean -} -export const Wrapper = styled.div` - background: ${({ theme }) => theme.colors.background}; - border-top: 1px solid ${({ theme }) => theme.colors.background}; - border-bottom: 1px solid ${({ theme }) => theme.colors.background}; - transition: opacity ${({ theme }) => theme.transitions.ease()}; - pointer-events: ${({ isSubmitting }: IWrapper) => - isSubmitting ? 'none' : 'default'}; -` - -export const Title = styled(Display)`` -export const Text = styled(BaseText)` - margin-top: 0.5rem; -` -export const Error = styled(BaseText)` - color: ${({ theme }) => theme.colors.error}; - margin-bottom: 2rem; -` - -export const Button = styled(BaseButton)` - min-height: 1.5rem; -` - -export const ActionsWrapper = styled.div` - display: flex; - align-items: flex-start; - justify-content: space-between; - - ${media.small} { - display: block; - - ${Button} { - margin-top: 2em; - } - } -` - -export const Input = styled(BaseInput)` - &:not(:last-child) { - margin-bottom: 2rem; - } -` - -export const Textarea = styled(BaseTextarea)` - &:not(:last-child) { - margin-bottom: 2rem; - } -` - -export const FileInput = styled(BaseFileInput)` - min-height: 1.5rem; -` diff --git a/src/components/Careers/Hero/index.tsx b/src/components/Careers/Hero/index.tsx deleted file mode 100644 index 686f27c6..00000000 --- a/src/components/Careers/Hero/index.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import { IGatsbyImageData } from 'gatsby-plugin-image' -import React from 'react' - -import { textByLine } from '../../../utils/textByLine' -import * as S from './styled' - -interface IGallery { - childImageSharp: { - gatsbyImageData: IGatsbyImageData - alt: string - original: { - width: number - height: number - } - } -} -interface ICareersHero { - careersYaml: { - hero: { - title: string - images: IGallery[] - } - } -} - -const Hero: React.FC = () => { - const { - careersYaml: { - hero: { title, images }, - }, - }: ICareersHero = useStaticQuery(careersHeroQuery) - - const renderGallery = ({ childImageSharp }: IGallery, i: number) => ( - - ) - - return ( - - - {textByLine(title).map((line, i) => ( - - {line}{' '} - - ))} - - - {images.map(renderGallery)} - - ) -} - -const careersHeroQuery = graphql` - query CareersHeroQuery { - careersYaml { - hero { - title - images { - childImageSharp { - original { - width - height - } - gatsbyImageData(width: 400, placeholder: NONE, layout: CONSTRAINED) - } - } - } - } - } -` - -export default Hero diff --git a/src/components/Careers/Hero/styled.tsx b/src/components/Careers/Hero/styled.tsx deleted file mode 100644 index 2213eb89..00000000 --- a/src/components/Careers/Hero/styled.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import { GatsbyImage, IGatsbyImageData } from 'gatsby-plugin-image' -import styled from 'styled-components' - -import { media } from '@theme' - -import { Container, Display as BaseDisplay } from '../../UI' - -export const PageContainer = styled.div` - overflow: hidden; -` - -export const Wrapper = styled(Container)` - margin-top: 7.5rem; - margin-bottom: 7.5em; - - ${media.small} { - margin-top: 5em; - margin-bottom: 5em; - - > * { - display: inline; - } - } -` - -export const Display = styled(BaseDisplay)`` - -export const GalleryWrapper = styled(Container)` - display: flex; - max-height: 32rem; - - /* Center top images in very large screens */ - ${media.xxlarge} { - max-width: none; - justify-content: center; - } - - ${media.large} { - display: grid; - grid-template: auto / repeat(2, 1fr); - grid-column-gap: 3em; - max-height: none; - } - - ${media.small} { - grid-row-gap: 1.5em; - grid-template: auto / 1fr; - } -` - -type GalleryImageType = { - width: number - height: number - image: IGatsbyImageData - alt: string -} - -export const GalleryImage = styled(GatsbyImage)` - margin-top: 6rem; - flex-shrink: 0; - - &:not(:last-child) { - margin-right: 5rem; - } - - width: ${({ width }) => width}px; - height: ${({ height }) => height}px; - - &:nth-child(3) { - margin-top: 0; - } - - ${media.large} { - &:nth-child(n + 3) { - display: none; - } - - margin-top: 0; - margin-right: 0; - width: 100%; - } - - ${media.small} { - width: 100%; - height: auto; - } -` diff --git a/src/components/Careers/Perks/Eggs/Arcade.tsx b/src/components/Careers/Perks/Eggs/Arcade.tsx deleted file mode 100644 index 18aba9d8..00000000 --- a/src/components/Careers/Perks/Eggs/Arcade.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import React from 'react' - -const Arcade = () => ( - - - - - - - - - - - -) -export default Arcade diff --git a/src/components/Careers/Perks/Eggs/Equipment.tsx b/src/components/Careers/Perks/Eggs/Equipment.tsx deleted file mode 100644 index 57b33d03..00000000 --- a/src/components/Careers/Perks/Eggs/Equipment.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import React from 'react' - -const Equipment = () => ( - - - - - - - - - - - -) -export default Equipment diff --git a/src/components/Careers/Perks/Eggs/Flexible.tsx b/src/components/Careers/Perks/Eggs/Flexible.tsx deleted file mode 100644 index 29ad4554..00000000 --- a/src/components/Careers/Perks/Eggs/Flexible.tsx +++ /dev/null @@ -1,58 +0,0 @@ -import React from 'react' - -const Flexible = () => ( - - - - - - - - - - - - -) - -export default Flexible diff --git a/src/components/Careers/Perks/Eggs/Food.tsx b/src/components/Careers/Perks/Eggs/Food.tsx deleted file mode 100644 index f2678c3f..00000000 --- a/src/components/Careers/Perks/Eggs/Food.tsx +++ /dev/null @@ -1,51 +0,0 @@ -import React from 'react' - -const Food = () => ( - - - - - - - - - - - -) - -export default Food diff --git a/src/components/Careers/Perks/Eggs/Fruit.tsx b/src/components/Careers/Perks/Eggs/Fruit.tsx deleted file mode 100644 index 879b8267..00000000 --- a/src/components/Careers/Perks/Eggs/Fruit.tsx +++ /dev/null @@ -1,20 +0,0 @@ -import React from 'react' - -const Fruit = () => ( - - - - - - - -) - -export default Fruit diff --git a/src/components/Careers/Perks/Eggs/Health.tsx b/src/components/Careers/Perks/Eggs/Health.tsx deleted file mode 100644 index 2b3ba3af..00000000 --- a/src/components/Careers/Perks/Eggs/Health.tsx +++ /dev/null @@ -1,67 +0,0 @@ -import React from 'react' - -const Health = () => ( - - - - - - - - - - - - - - -) - -export default Health diff --git a/src/components/Careers/Perks/Eggs/Learning.tsx b/src/components/Careers/Perks/Eggs/Learning.tsx deleted file mode 100644 index 6ddc9ec4..00000000 --- a/src/components/Careers/Perks/Eggs/Learning.tsx +++ /dev/null @@ -1,72 +0,0 @@ -import React from 'react' - -const Learning = () => ( - - - - - - - - - - - - - - - -) - -export default Learning diff --git a/src/components/Careers/Perks/Eggs/Retreat.tsx b/src/components/Careers/Perks/Eggs/Retreat.tsx deleted file mode 100644 index 49c6f19b..00000000 --- a/src/components/Careers/Perks/Eggs/Retreat.tsx +++ /dev/null @@ -1,93 +0,0 @@ -import React from 'react' - -const Retreat = () => ( - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -) - -export default Retreat diff --git a/src/components/Careers/Perks/Eggs/index.ts b/src/components/Careers/Perks/Eggs/index.ts deleted file mode 100644 index 32b37367..00000000 --- a/src/components/Careers/Perks/Eggs/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -export { default as arcade } from './Arcade' -export { default as equipment } from './Equipment' -export { default as flexible } from './Flexible' -export { default as food } from './Food' -export { default as fruit } from './Fruit' -export { default as health } from './Health' -export { default as learning } from './Learning' -export { default as retreat } from './Retreat' diff --git a/src/components/Careers/Perks/index.tsx b/src/components/Careers/Perks/index.tsx deleted file mode 100644 index 8fd78ddb..00000000 --- a/src/components/Careers/Perks/index.tsx +++ /dev/null @@ -1,78 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import React from 'react' - -import { RightContent } from '../../UI/Layout' -import * as Eggs from './Eggs' -import * as S from './styled' - -type EggType = - | 'health' - | 'learning' - | 'food' - | 'arcade' - | 'fruit' - | 'retreat' - | 'equipment' - | 'flexible' - -interface ISection { - title: string - text: string - egg: EggType -} - -interface ICareersPerks { - careersYaml: { - perks: { - title: string - list: ISection[] - } - } -} - -type EggsMap = { [K in EggType]: React.ComponentType } - -const Perks: React.FC = () => { - const { - careersYaml: { perks }, - }: ICareersPerks = useStaticQuery(careersPerksQuery) - - const renderEgg = (egg: EggType) => { - const EggComponent = (Eggs as EggsMap)[egg] - - return - } - - const renderPerks = ({ title, text, egg }: ISection) => ( - - {renderEgg(egg)} - {title} - {text} - - ) - - return ( - - - {perks.list.map(renderPerks)} - - - ) -} - -const careersPerksQuery = graphql` - query CareersPerksQuery { - careersYaml { - perks { - title - list { - title - text - egg - } - } - } - } -` - -export default Perks diff --git a/src/components/Careers/Perks/styled.tsx b/src/components/Careers/Perks/styled.tsx deleted file mode 100644 index d4dd6198..00000000 --- a/src/components/Careers/Perks/styled.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { Big, Text } from '../../UI/' - -export const Wrapper = styled.div` - margin-top: 12em; - - ${media.large} { - padding-left: 0; - padding-right: 0; - margin-top: 3em; - } -` - -export const Section = styled.div` - display: flex; - flex-wrap: wrap; - justify-content: space-between; - - > * { - box-sizing: border-box; - width: calc(100% / 3 - 4%); - - &:nth-child(3n) { - padding-right: 0; - } - - ${media.large} { - width: calc(100% / 2 - 4%); - padding-right: 0; - } - - ${media.small} { - width: 100%; - padding-right: 0; - } - - svg { - margin-bottom: 1em; - height: 130px; - } - - ${media.small} { - svg { - margin-bottom: 0; - } - } - } - - &:after { - content: ''; - width: calc(100% / 3 - 4%); - } -` - -export const Item = styled.div` - &:not(:last-child) { - margin-bottom: 3em; - } -` - -export const ItemTitle = styled(Big)` - margin-bottom: 0.5rem; -` - -export const ItemText = styled(Text)`` diff --git a/src/components/Careers/Positions/index.tsx b/src/components/Careers/Positions/index.tsx deleted file mode 100644 index 84afff13..00000000 --- a/src/components/Careers/Positions/index.tsx +++ /dev/null @@ -1,108 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import React from 'react' - -import linkResolver from '../../../utils/linkResolver' -import { RightContent, Big } from '../../UI/' -import * as S from './styled' - -interface IPositions { - careersYaml: { - positions: { - title: string - defaultPosition: { - position: string - tagline: string - } - } - } - allPrismicPosition: { - edges: Array<{ - node: { - type: string - uid: string - data: { - tagline: string - title: string - } - } - }> - } -} - -interface ItemProps { - doc: { - uid: string - type: string - data: { - tagline: string - title: string - } - } -} - -const Item = ({ doc }: ItemProps) => { - return ( - - - - {doc.data.title} - - {doc.data.tagline} - - - ) -} - -const Positions = () => { - const { - careersYaml: { positions }, - allPrismicPosition: { edges }, - }: IPositions = useStaticQuery(careersPositionsQuery) - - return ( - -
    - {edges.map(({ node }, i) => { - return - })} - - - - - {positions.defaultPosition.position} - - {positions.defaultPosition.tagline} - - -
-
- ) -} - -const careersPositionsQuery = graphql` - query CareersPositionsQuery { - careersYaml { - positions { - title - defaultPosition { - position - tagline - } - } - } - allPrismicPosition { - edges { - node { - type - uid - data { - tagline - title - } - } - } - } - } -` - -export default Positions diff --git a/src/components/Careers/Positions/styled.tsx b/src/components/Careers/Positions/styled.tsx deleted file mode 100644 index 1dd86f82..00000000 --- a/src/components/Careers/Positions/styled.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import { Link as RouterLink } from 'gatsby' -import styled from 'styled-components' - -import { media } from '@theme' - -import { Text } from '../../UI' - -export const ListItem = styled.li` - position: relative; - padding-bottom: 2em; - - border-bottom: 1px solid ${({ theme }) => theme.colors.subtle}; - - &:not(:first-child) { - padding-top: 2em; - } -` - -export const Link = styled(RouterLink)` - display: block; - transition: opacity ${({ theme }) => theme.transitions.ease()}; - - ${media.hover} { - &:hover { - opacity: 0.6; - } - } -` - -export const TitleWrapper = styled.div` - display: flex; - align-items: center; - - svg { - margin-top: 2px; - color: ${({ theme }) => theme.colors.foreground}; - margin-left: 0.75rem; - } -` - -export const More = styled(Text)` - margin-top: 0.5em; -` - -export const CompanyImage = styled.img` - margin-left: 0.7em; -` diff --git a/src/components/Careers/index.tsx b/src/components/Careers/index.tsx deleted file mode 100644 index 0d3ba098..00000000 --- a/src/components/Careers/index.tsx +++ /dev/null @@ -1,6 +0,0 @@ -export { default as Hero } from './Hero' -export { default as About } from './About' -export { default as ADayAtSignifica } from './ADayAtSignifica' -export { default as Perks } from './Perks' -export { default as Positions } from './Positions' -export { default as FormPosition } from './FormPosition' diff --git a/src/components/Contact/Contacts/index.tsx b/src/components/Contact/Contacts/index.tsx deleted file mode 100644 index 25cf3f2b..00000000 --- a/src/components/Contact/Contacts/index.tsx +++ /dev/null @@ -1,80 +0,0 @@ -import { StaticQuery, graphql } from 'gatsby' -import React from 'react' - -import * as S from './styled' - -interface IGeneralContacts { - contactYaml: { - contacts: { - title: string - columns: Array<{ - title: string - mail?: string - phone?: string - address1?: string - address2?: string - }> - } - } -} - -const Contacts: React.FC = ({ - contactYaml: { contacts }, -}) => { - return ( - - {contacts.title} - - {contacts.columns.map((column, index) => { - return ( -
- {column.title} - {column.mail && ( - - {column.mail} - - )} - {column.phone && ( - - {column.phone} - - )} - {column.address1 && {column.address1}} - {column.address2 && {column.address2}} -
- ) - })} -
-
- ) -} - -const ConnectedContacts = () => { - return ( - } - /> - ) -} - -const generalContactsQuery = graphql` - query GeneralContactsQuery { - contactYaml { - contacts { - title - columns { - title - mail - phone - address1 - address2 - } - } - } - } -` - -export default ConnectedContacts diff --git a/src/components/Contact/Contacts/styled.ts b/src/components/Contact/Contacts/styled.ts deleted file mode 100644 index 1ebf5163..00000000 --- a/src/components/Contact/Contacts/styled.ts +++ /dev/null @@ -1,59 +0,0 @@ -import styled, { AnyStyledComponent } from 'styled-components' - -import { media } from '@theme' - -import { Container, Title as BaseTitle, Text as BaseText, Big } from '../../UI' - -export const Wrapper = styled(Container)` - margin-top: 12.5rem; - margin-bottom: 12.5rem; - - ${media.large} { - margin-top: 10rem; - margin-bottom: 10rem; - } - - ${media.medium} { - margin-top: 7.5rem; - margin-bottom: 7.5rem; - } - - ${media.small} { - margin-top: 5rem; - margin-bottom: 5rem; - } -` - -export const Title = styled(BaseTitle)` - margin-bottom: 3.5rem; -` - -export const Columns = styled.div` - display: grid; - grid-gap: 2em; - grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr)); -` - -export const ColumnTitle = styled(BaseText).attrs({ as: 'h3' })` - margin-bottom: 0.75rem; -` - -export const Text = styled(Big)`` -export const PhoneLink: AnyStyledComponent = styled(Big).attrs({ as: 'a' })` - display: block; - - color: ${({ theme }) => theme.colors.foreground}; - - text-decoration: none; - - transition: opacity ${({ theme }) => theme.transitions.ease()}; - - ${media.hover} { - &:hover { - opacity: 0.6; - } - } -` -export const MailLink = styled(PhoneLink)` - color: ${({ theme }) => theme.colors.highlight}; -` diff --git a/src/components/Contact/Form/Success/index.tsx b/src/components/Contact/Form/Success/index.tsx deleted file mode 100644 index 30a9f215..00000000 --- a/src/components/Contact/Form/Success/index.tsx +++ /dev/null @@ -1,57 +0,0 @@ -import { StaticQuery, graphql } from 'gatsby' -import React from 'react' - -import { textByLine } from '../../../../utils/textByLine' -import * as S from './styled' - -interface ISuccessProps { - goBack: () => void -} - -interface ISuccessData { - contactYaml: { - success: { - title: string - subtitle: string - back: string - } - } -} - -const Success = ({ goBack }: ISuccessProps) => { - return ( - { - return ( - - {textByLine(data.contactYaml.success.title).map((line, key) => ( - {line} - ))} - {textByLine(data.contactYaml.success.subtitle).map((line, key) => ( - {line} - ))} - - - {data.contactYaml.success.back} - - - ) - }} - /> - ) -} - -const contactFormSuccessQuery = graphql` - query ContactFormSuccessQuery { - contactYaml { - success { - title - subtitle - back - } - } - } -` - -export default Success diff --git a/src/components/Contact/Form/Success/styled.ts b/src/components/Contact/Form/Success/styled.ts deleted file mode 100644 index fcd68a93..00000000 --- a/src/components/Contact/Form/Success/styled.ts +++ /dev/null @@ -1,30 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { Container, Display, Text as BaseText, ArrowLink } from '../../../UI' - -export const Wrapper = styled(Container)` - max-width: 38em; - - margin-top: 7.5em; - margin-bottom: 12.5em; - - ${media.medium} { - margin-top: 5em; - margin-bottom: 7em; - } -` - -export const Title = styled(Display)`` -export const Text = styled(BaseText)` - &:first-of-type { - margin-top: 0.5rem; - } -` - -export const Button = styled(ArrowLink).attrs({ - reverse: true, -})` - margin-top: 2rem; -` diff --git a/src/components/Contact/Form/index.tsx b/src/components/Contact/Form/index.tsx deleted file mode 100644 index 6beb8b92..00000000 --- a/src/components/Contact/Form/index.tsx +++ /dev/null @@ -1,274 +0,0 @@ -import axios from 'axios' -import { StaticQuery, graphql } from 'gatsby' -import React, { useState } from 'react' - -import { MAIL_REGEX } from '../../../constants' -import useFileUpload from '../../../hooks/useFileUpload' -import useForm from '../../../hooks/useForm' -import { textByLine } from '../../../utils/textByLine' -import { Link } from '../../UI' -import Success from './Success' -import * as S from './styled' - -interface IValues { - [key: string]: string | number | boolean -} -interface IErrors { - [key: string]: string -} - -const Form: React.FC = ({ contactYaml: data }) => { - // Main status state - const [submitted, setSubmitted] = useState(false) - - // FileUpload - const { - upload, - cancel, - pending: filePending, - fileUrl, - error: fileError, - } = useFileUpload({ - errors: { - upload: data.errors.uploadError, - fileSize: data.errors.uploadSizeError, - }, - }) - - // Form - const [form, fields] = useForm({ - initialValues: { - name: '', - email: '', - budget: '', - message: '', - }, - validate, - handleSubmit: values => handleSubmit(values, fileUrl), - }) - - // HandleSubmit - function handleSubmit(values: IValues, attachment: string) { - const body = fileUrl - ? { ...values, type: 'enquiry', attachment } - : { ...values, type: 'enquiry' } - return axios - .post('https://api.significa.co/enquiry', body) - .then(() => { - setSubmitted(true) - }) - .catch(() => { - return { global: data.errors.global } - }) - } - - // Validate - function validate(values: IValues) { - const errors: IErrors = {} - - if (!values.name) { - errors.name = data.errors.nameRequired - } - - if (!values.email) { - errors.email = data.errors.emailRequired - } else if ( - typeof values.email === 'string' && - !MAIL_REGEX.test(values.email) - ) { - errors.email = data.errors.emailInvalid - } - - if (!values.message) { - errors.message = data.errors.messageRequired - } - - return errors - } - - // Render - if (submitted) { - return setSubmitted(false)} /> - } - - return ( - - - {textByLine(data.title).map((line, key) => ( - {line} - ))} - - {textByLine(data.subtitle).map((line, key) => { - const isSubtitleLastLine = key === textByLine(data.subtitle).length - 1 - if (!isSubtitleLastLine) { - return ( - {line}{
}
- ) - } - - return ( - {line} - ) - })} - {' '} - - {data.link} - -
-
- - {form.errors.global && {form.errors.global}} - -
- - - - - - - - {data.form.submit.label} - - - -
- ) -} - -/** Graphql from here until the bottom */ - -interface IContactForm { - contactYaml: { - title: string - subtitle: string - page: string - link: string - - errors: { - global: string - nameRequired: string - emailRequired: string - emailInvalid: string - messageRequired: string - uploadError: string - uploadSizeError: string - } - - form: { - name: { - label: string - placeholder: string - } - email: { - label: string - placeholder: string - } - budget: { - label: string - placeholder: string - } - message: { - label: string - placeholder: string - } - attachment: { - label: string - } - submit: { - label: string - } - } - } -} - -const ConnectedForm = () => { - return ( -
} - /> - ) -} - -const contactFormQuery = graphql` - query ContactFormQuery { - contactYaml { - title - subtitle - page - link - - errors { - global - nameRequired - emailRequired - emailInvalid - messageRequired - uploadError - uploadSizeError - } - - form { - name { - label - placeholder - } - email { - label - placeholder - } - budget { - label - placeholder - } - message { - label - placeholder - } - attachment { - label - } - submit { - label - } - } - - success { - title - subtitle - back - } - } - } -` - -export default ConnectedForm diff --git a/src/components/Contact/Form/styled.ts b/src/components/Contact/Form/styled.ts deleted file mode 100644 index 8e1817f9..00000000 --- a/src/components/Contact/Form/styled.ts +++ /dev/null @@ -1,84 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { - Container, - Input as BaseInput, - Textarea as BaseTextarea, - Button as BaseButton, - FileInput as BaseFileInput, - Display, - Text as BaseText, -} from '../../UI' - -interface IWrapper { - isSubmitting: boolean -} -export const Wrapper = styled(Container)` - max-width: 38em; - - margin-top: 7.5em; - margin-bottom: 12.5em; - - transition: opacity ${({ theme }) => theme.transitions.ease()}; - pointer-events: ${({ isSubmitting }: IWrapper) => - isSubmitting ? 'none' : 'default'}; - - ${media.medium} { - margin-top: 7.5em; - margin-bottom: 7.5em; - } - - ${media.small} { - margin-top: 5em; - margin-bottom: 5em; - } -` - -export const Top = styled.div` - margin-bottom: 3rem; -` - -export const Title = styled(Display)`` -export const Text = styled(BaseText)` - margin-top: 0.5rem; -` -export const Error = styled(BaseText)` - color: ${({ theme }) => theme.colors.error}; - margin-bottom: 2rem; -` - -export const Button = styled(BaseButton)` - min-height: 1.5rem; -` - -export const ActionsWrapper = styled.div` - display: flex; - align-items: flex-start; - justify-content: space-between; - - ${media.small} { - display: block; - - ${Button} { - margin-top: 2em; - } - } -` - -export const Input = styled(BaseInput)` - &:not(:last-child) { - margin-bottom: 2rem; - } -` - -export const Textarea = styled(BaseTextarea)` - &:not(:last-child) { - margin-bottom: 2rem; - } -` - -export const FileInput = styled(BaseFileInput)` - min-height: 1.5rem; -` diff --git a/src/components/Contact/WhatMatters/index.tsx b/src/components/Contact/WhatMatters/index.tsx deleted file mode 100644 index 5bb01cfd..00000000 --- a/src/components/Contact/WhatMatters/index.tsx +++ /dev/null @@ -1,137 +0,0 @@ -import { StaticQuery, graphql } from 'gatsby' -import { IGatsbyImageData } from 'gatsby-plugin-image' -import React from 'react' - -import { Theme } from '@theme' - -import { textByLine } from '../../../utils/textByLine' -import * as S from './styled' - -interface IWhatMatters { - contactYaml: { - matters: { - title: string - text: string - more: string - interested: string - photos: { - center: { - childImageSharp: { gatsbyImageData: IGatsbyImageData } - } - topLeft: { - childImageSharp: { gatsbyImageData: IGatsbyImageData } - } - topRight: { - childImageSharp: { gatsbyImageData: IGatsbyImageData } - } - bottomLeft: { - childImageSharp: { gatsbyImageData: IGatsbyImageData } - } - bottomRight: { - childImageSharp: { gatsbyImageData: IGatsbyImageData } - } - } - } - } -} - -const WhatMatters: React.FC = ({ - contactYaml: { matters: data }, -}) => { - return ( - - - - {data.title} - {data.text} - - - - - - - - - - - {textByLine(data.more).map((line, i) => ( - {line} - ))} - {data.interested} - - - - - ) -} - -const ConnectedWhatMatters = () => { - return ( - } - /> - ) -} - -const whatMattersQuery = graphql` - query WhatMattersQuery { - contactYaml { - matters { - title - text - more - interested - photos { - center { - childImageSharp { - gatsbyImageData - } - } - topLeft { - childImageSharp { - gatsbyImageData - } - } - topRight { - childImageSharp { - gatsbyImageData - } - } - bottomLeft { - childImageSharp { - gatsbyImageData - } - } - bottomRight { - childImageSharp { - gatsbyImageData - } - } - } - } - } - } -` - -export default ConnectedWhatMatters diff --git a/src/components/Contact/WhatMatters/styled.ts b/src/components/Contact/WhatMatters/styled.ts deleted file mode 100644 index a99a145f..00000000 --- a/src/components/Contact/WhatMatters/styled.ts +++ /dev/null @@ -1,147 +0,0 @@ -import { GatsbyImage } from 'gatsby-plugin-image' -import styled from 'styled-components' - -import { media } from '@theme' - -import { - Container as BaseContainer, - Display, - Big as BaseBig, - List as BaseList, -} from '../../UI' - -export const Wrapper = styled.section` - background-color: ${({ theme }) => theme.colors.background}; - - padding: 12.5rem 0; - - ${media.large} { - padding: 10rem 0; - } - - ${media.medium} { - padding: 7.5rem 0; - } - - ${media.small} { - padding: 5rem 0; - } -` - -export const Container = styled(BaseContainer).attrs({ as: 'div' })`` - -export const Title = styled(Display)` - text-align: center; - - max-width: 35rem; - margin: 0 auto; - margin-bottom: 0.75rem; -` - -export const SubText = styled(BaseBig)` - text-align: center; - - max-width: 35rem; - margin: 0 auto; -` - -export const MoreWrapper = styled.div` - margin: 7.5rem auto 0; - display: block; - max-width: 38em; - - ${media.medium} { - margin-top: 5em; - } - - ${media.small} { - margin-top: 3em; - } -` - -export const MoreContent = styled(BaseBig)` - &:not(:last-of-type) { - margin-bottom: 1.5rem; - } -` - -export const List = styled(BaseList)` - margin-top: 1rem; -` - -export const ImagesGrid = styled.div` - margin-top: 7.5rem; - display: grid; - grid-column-gap: 3rem; - grid-template: repeat(2, 1fr) / repeat(3, 1fr); - - ${media.medium} { - margin-top: 5rem; - grid-template-columns: repeat(2, 1fr); - grid-row-gap: 3rem; - } - - ${media.small} { - margin-top: 3rem; - grid-template-columns: 1fr; - grid-row-gap: 0; - } -` - -export const TopLeftImage = styled(GatsbyImage)` - margin-top: 3rem; - - ${media.medium} { - margin: 0; - } - - ${media.small} { - display: none; - } -` - -export const CenterImage = styled(GatsbyImage)` - grid-row-end: span 2; -` - -export const TopRightImage = styled(GatsbyImage)` - margin-bottom: 3rem; - margin-top: 5rem; - margin-right: 10rem; - - ${media.large} { - margin-right: 3rem; - margin-top: 3rem; - } - - ${media.medium} { - display: none; - } -` - -export const BottomLeftImage = styled(GatsbyImage)` - margin-top: 3rem; - margin-bottom: 5rem; - margin-left: 7.5rem; - - ${media.large} { - margin-left: 3rem; - margin-bottom: 3rem; - } - - ${media.medium} { - display: none; - } -` - -export const BottomRightImage = styled(GatsbyImage)` - margin-bottom: 3rem; - - ${media.medium} { - margin: 0; - } - - ${media.small} { - display: none; - } -` diff --git a/src/components/Contact/index.ts b/src/components/Contact/index.ts deleted file mode 100644 index f3e1e676..00000000 --- a/src/components/Contact/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default as Form } from './Form' -export { default as Contacts } from './Contacts' -export { default as WhatMatters } from './WhatMatters' diff --git a/src/components/Footer/FooterNav/index.tsx b/src/components/Footer/FooterNav/index.tsx deleted file mode 100644 index 1d1f9179..00000000 --- a/src/components/Footer/FooterNav/index.tsx +++ /dev/null @@ -1,110 +0,0 @@ -import { StaticQuery, graphql } from 'gatsby' -import React from 'react' - -import { Small, Link, Segg, Social } from '../../UI/' -import * as S from './styled' - -interface IItemType { - label: string - link: string -} - -interface IColumnType { - node: { - id: string - title: string - type: 'column' | 'social' - items: IItemType[] - } -} - -interface INavFooterQuery { - allFooterYaml: { - edges: IColumnType[] - } -} - -class FooterNav extends React.Component> { - renderSocialItems = (items: IItemType[]) => { - return items.map(({ label, link }, i) => ( - - )) - } - - renderItems = (items: IItemType[]) => { - return items.map(({ label, link }, i) => ( - - {label} - - )) - } - - renderColumns = (columns: IColumnType[]) => { - return columns.map(({ node: { id, title, type, items } }) => { - if (title === 'Contact') { - return ( -
- - - - - {this.renderItems(items)} - - - Legal ©  - {new Date().getFullYear()} - -
- ) - } - - if (type === 'social') { - return ( -
- {title} - {this.renderSocialItems(items)} -
- ) - } - - return ( -
- {title} - {this.renderItems(items)} -
- ) - }) - } - - render() { - return ( - { - const { edges: columns } = data.allFooterYaml - return this.renderColumns(columns) - }} - /> - ) - } -} - -const footerNavQuery = graphql` - query FooterNavQuery { - allFooterYaml { - edges { - node { - id - title - type - items { - label - link - } - } - } - } - } -` - -export default FooterNav diff --git a/src/components/Footer/FooterNav/styled.ts b/src/components/Footer/FooterNav/styled.ts deleted file mode 100644 index 9515f9b1..00000000 --- a/src/components/Footer/FooterNav/styled.ts +++ /dev/null @@ -1,48 +0,0 @@ -import { Link as BaseLink } from 'gatsby' -import styled from 'styled-components' - -import { media } from '@theme' - -import { Small, Link } from '../../UI/' - -export const Title = styled(Small).attrs({ as: 'h4' })` - margin-bottom: 2em; -` - -export const Column = styled.div` - display: flex; - flex-direction: column; - align-items: flex-start; - flex-wrap: wrap; - - a { - display: inline-block; - padding: 0.5em 0; - } -` - -export const ContactColumn = styled(Column)` - margin-bottom: 2em; -` - -export const Row = styled.div` - display: flex; - align-items: center; - - a:not(:last-child) { - margin-right: 1em; - } -` - -export const FooterLink = styled(Link)` - text-decoration: none; - - ${media.small} { - padding: 0 !important; - line-height: 3; - } -` - -export const LogoLink = styled(BaseLink)` - margin-bottom: 2em; -` diff --git a/src/components/Footer/index.tsx b/src/components/Footer/index.tsx deleted file mode 100644 index bdd4e31d..00000000 --- a/src/components/Footer/index.tsx +++ /dev/null @@ -1,14 +0,0 @@ -import React from 'react' - -import FooterNav from './FooterNav' -import * as S from './styled' - -const Footer: React.FC> = () => ( - - - - - -) - -export default Footer diff --git a/src/components/Footer/styled.ts b/src/components/Footer/styled.ts deleted file mode 100644 index 26ef364c..00000000 --- a/src/components/Footer/styled.ts +++ /dev/null @@ -1,69 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { Container as BaseContainer } from '../UI/' - -export const Footer = styled.footer` - padding: 2.5em 0 5em; - background-color: ${({ theme }) => theme.colors.background}; - - ${media.medium} { - padding-bottom: 5em; - } - - ${media.small} { - padding-bottom: 3em; - } - - /** Footer can have different bg color than background. - Use pseudo-element to hide color change on elastic scroll **/ - &:after { - content: ''; - position: fixed; - width: 100vw; - height: 50vh; - bottom: -50vh; - background-color: ${({ theme }) => theme.colors.background}; - } -` - -export const Container = styled(BaseContainer)` - display: flex; - flex-wrap: wrap; - - > * { - flex: 1; - margin-bottom: 4em; - - &:first-child { - min-width: calc(((100% / 12)) * 4.2); - } - - &:last-child { - margin-bottom: 2em; - } - } - - ${media.medium} { - > * { - flex: 1; - min-width: auto; - - &:first-child { - min-width: 100%; - } - } - } - - ${media.small} { - > * { - flex: 1; - min-width: 100%; - - &:first-child { - min-width: 100%; - } - } - } -` diff --git a/src/components/FromTheBlog/index.tsx b/src/components/FromTheBlog/index.tsx deleted file mode 100644 index 2b9ddc31..00000000 --- a/src/components/FromTheBlog/index.tsx +++ /dev/null @@ -1,128 +0,0 @@ -import slugify from '@sindresorhus/slugify' -import { graphql, StaticQuery, Link } from 'gatsby' -import React from 'react' - -import formatDate from '../../utils/formatDate' -import linkResolver from '../../utils/linkResolver' -import AuthorBox from '../Blog/AuthorBox/AuthorBox' -import { BlogPost } from '../Blog/types' -import { RightContent, Big } from '../UI/' -import * as S from './styled' - -interface IFromTheBlogQuery { - homeYaml: { - fromTheBlog: { - title: string - cta: string - link: string - } - } - allPrismicBlogPost: { - edges: Array<{ - node: BlogPost - }> - } -} - -const FromTheBlog: React.FC> = () => { - return ( - { - return ( - - -
    - {edges.map(({ node: post }, i) => { - const slugifyCategory = slugify(post.data.category) - const categoryMeta = { - type: 'blog_category', - uid: slugifyCategory, - } - - const postLink = linkResolver(post) - - return ( - - - {post.data.title} - {post.data.teaser} - - - - {/* render as children */} - · - - {post.data.category} - - · - {formatDate(post.data.date)} - - - - ) - })} -
- - {fromTheBlog.cta} - -
-
- ) - }} - /> - ) -} - -const fromTheBlogQuery = graphql` - query FromTheBlogQuery { - homeYaml { - fromTheBlog { - title - cta - link - } - } - - allPrismicBlogPost(limit: 3, sort: { fields: data___date, order: DESC }) { - edges { - node { - uid - type - - data { - title - teaser - category - date - - author { - document { - ... on PrismicBlogAuthor { - uid - type - - data { - name - profile_pic { - gatsbyImageData - alt - } - } - } - } - } - } - } - } - } - } -` - -export default FromTheBlog diff --git a/src/components/FromTheBlog/styled.ts b/src/components/FromTheBlog/styled.ts deleted file mode 100644 index 0ba39341..00000000 --- a/src/components/FromTheBlog/styled.ts +++ /dev/null @@ -1,44 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { ArrowLink as BaseArrowLink, Text } from '../UI/' - -export const Wrapper = styled.div` - border-top: 1px solid ${({ theme }) => theme.colors.background}; - border-bottom: 1px solid ${({ theme }) => theme.colors.background}; - background-color: ${({ theme }) => theme.colors.background}; -` - -export const ListItem = styled.li` - position: relative; - padding-bottom: 2em; - border-bottom: 1px solid ${({ theme }) => theme.colors.subtle}; - - &:not(:last-child) { - margin-bottom: 2em; - } -` - -export const Link = styled.a` - display: block; - transition: opacity ${({ theme }) => theme.transitions.ease()}; - - ${media.hover} { - &:hover { - opacity: 0.6; - } - } -` - -export const More = styled(Text)` - margin-top: 0.5em; -` - -export const ArrowLink = styled(BaseArrowLink)` - margin-top: 3em; -` - -export const Author = styled.div` - margin-top: 1em; -` diff --git a/src/components/Handbook/BottomNavigation/index.tsx b/src/components/Handbook/BottomNavigation/index.tsx deleted file mode 100644 index 9e12c0e1..00000000 --- a/src/components/Handbook/BottomNavigation/index.tsx +++ /dev/null @@ -1,60 +0,0 @@ -import React from 'react' - -import { NavigationChapter } from '../../../templates/handbook' -import * as S from './styled' - -interface BottomNavigationProps { - prevChapter?: NavigationChapter - nextChapter?: NavigationChapter -} - -const BottomNavigation: React.FC = ({ - prevChapter, - nextChapter, -}) => { - if (!prevChapter && !nextChapter) { - return null - } - - return ( - - {prevChapter && ( - - - Previous - - - {prevChapter.chapter.document.data.title} - - - - - - - )} - - {nextChapter && ( - - - Next - - {nextChapter.chapter.document.data.title} - - - - - - - - )} - - ) -} - -export default BottomNavigation diff --git a/src/components/Handbook/BottomNavigation/styled.ts b/src/components/Handbook/BottomNavigation/styled.ts deleted file mode 100644 index 88faf12a..00000000 --- a/src/components/Handbook/BottomNavigation/styled.ts +++ /dev/null @@ -1,144 +0,0 @@ -import { Link } from 'gatsby' -import styled from 'styled-components' - -import { media } from '@theme' - -import { labelStyle, Text } from '../../UI' -import ArrowIcon from '../common/Arrow' - -export const Wrapper = styled.footer` - /* Same as ../Content/styled */ - width: calc(100% - 20rem); - max-width: 42rem; - - display: flex; - - margin-top: 7.5rem; - margin-bottom: 7.5rem; - - ${media.large} { - width: calc(100% - 18rem); - } - - ${media.medium} { - width: 100%; - max-width: 100%; - } - - ${media.small} { - margin-top: 5rem; - margin-bottom: 4rem; - - flex-direction: column; - } -` - -export const Header = styled.div`` - -export const LeftArrow = styled(ArrowIcon)` - transform: rotate(180deg); - transition: transform ${({ theme }) => theme.transitions.cubic()}; -` - -export const RightArrow = styled(ArrowIcon)` - transition: transform ${({ theme }) => theme.transitions.cubic()}; -` - -export const Prev = styled.p` - ${labelStyle} - color: inherit; - - text-align: right; -` - -export const Next = styled.p` - ${labelStyle} - color: inherit; -` - -export const Title = styled(Text)` - color: inherit; -` - -export const LinkHolder = styled.div` - margin-top: 0.5rem; - margin-bottom: 2rem; - display: flex; - justify-content: space-between; - align-items: center; - - ${media.small} { - margin-bottom: 0; - } -` - -export const ImgHolder = styled.div`` - -export const Image = styled.img` - width: 100%; - - margin-bottom: -7rem; - - ${media.small} { - display: none; - } -` - -export const Box = styled(Link)` - display: block; - box-sizing: border-box; - width: calc(50% - 1rem); - - border: 1px solid ${({ theme }) => theme.colors.subtle}; - color: ${({ theme }) => theme.colors.foreground}; - background-color: ${({ theme }) => theme.colors.background}; - - border-radius: 2px; - - padding: 1.25rem; - margin-bottom: 7.5rem; - - transition: background-color ${({ theme }) => theme.transitions.ease()}; - - &:first-child { - margin-right: 1rem; - - ${media.small} { - margin-right: 0; - order: 2; - } - } - - &:last-child { - margin-left: 1rem; - - ${media.small} { - margin-left: 0; - } - } - - &:only-child { - margin-left: 0; - margin-right: 0; - } - - ${media.hover} { - &:hover { - background-color: ${({ theme }) => theme.colors.subtle}; - - ${RightArrow} { - transform: translateX(0.5rem); - } - - ${LeftArrow} { - transform: rotate(180deg) translateX(0.5rem); - } - } - } - - ${media.small} { - width: 100%; - - margin-bottom: 1.5rem; - } -` diff --git a/src/components/Handbook/Content/index.tsx b/src/components/Handbook/Content/index.tsx deleted file mode 100644 index c4d4f012..00000000 --- a/src/components/Handbook/Content/index.tsx +++ /dev/null @@ -1,9 +0,0 @@ -import React, { ReactNode } from 'react' - -import { Renderer } from './styled' - -const Content: React.FC<{ children: ReactNode }> = ({ children }) => { - return {children} -} - -export default Content diff --git a/src/components/Handbook/Content/styled.ts b/src/components/Handbook/Content/styled.ts deleted file mode 100644 index 6d6bafb5..00000000 --- a/src/components/Handbook/Content/styled.ts +++ /dev/null @@ -1,171 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { - displayStyle, - textStyle, - titleStyle, - smallTitleStyle, - labelStyle, -} from '../../UI' -import { liBaseStyle } from '../../UI/List/styled' - -export const Renderer = styled.div` - position: relative; - - & > *:not(aside) { - /* Due to conflicting CSS, Side Notes were having width issues. - To prevent it, we must use :not(aside) - Aside refers to Handbook Sidenotes which is available at Handbook/CustomComponentParser/styled.ts */ - width: calc(100% - 20rem); - max-width: 42rem; - - box-sizing: border-box; - - ${media.large} { - width: calc(100% - 18rem); - } - - ${media.medium} { - width: 100%; - max-width: 100%; - padding-right: 0; - } - } - - figure { - margin-bottom: 3.5rem; - } - - p + figure, - ul + figure, - ol + figure { - margin-top: 3.5rem; - } - - img { - width: 100%; - height: auto; - - border-radius: 2px; - } - - figcaption { - ${labelStyle}; - - margin-top: 1rem; - text-align: center; - } - - h2 { - ${displayStyle} - - padding-top: 7.5rem; - margin-bottom: 1.25rem; - - ${media.small} { - padding-top: 4rem; - } - } - - figure + h2 { - padding-top: 4.5rem; - } - - h3 { - ${titleStyle} - - padding-top: 5rem; - margin-bottom: 1.25rem; - - ${media.small} { - padding-top: 2.5rem; - } - } - - figure + h3 { - padding-top: 1.5rem; - } - - h4 { - ${smallTitleStyle} - - margin-top: 2.5rem; - margin-bottom: 0.75rem; - - ${media.small} { - margin-top: 2rem; - } - } - - p, - li { - ${textStyle} - } - - ul li { - ${liBaseStyle} - - &:before { - content: '-'; - color: ${({ theme }) => theme.colors.highlight}; - } - } - - ol { - counter-reset: li; - margin-left: 1.5rem; - } - - ol li { - ${liBaseStyle} - counter-increment: li; - - &:before { - content: counter(li) '.'; - color: ${({ theme }) => theme.colors.highlight}; - left: -1.5rem; - } - } - - p, - ol, - ul, - pre, - .embed { - margin-bottom: 1.5rem; - } - - strong { - font-weight: bold; - } - - em { - font-style: italic; - } - - pre { - font-family: monospace; - font-size: 1.15rem; - line-height: 1.5; - - padding: 2rem; - border-radius: 0.5rem; - - background-color: ${({ theme }) => theme.colors.foreground}; - color: ${({ theme }) => theme.colors.background}; - } - - a { - color: ${({ theme }) => theme.colors.highlight}; - - transition: opacity ${({ theme }) => theme.transitions.ease()}; - - ${media.hover} { - &:hover { - opacity: 0.6; - } - } - } -` diff --git a/src/components/Handbook/Cover/index.tsx b/src/components/Handbook/Cover/index.tsx deleted file mode 100644 index b89497a4..00000000 --- a/src/components/Handbook/Cover/index.tsx +++ /dev/null @@ -1,24 +0,0 @@ -import React from 'react' - -import { Chapter } from '../../../templates/handbook' -import * as S from './styled' - -const Cover: React.FC<{ chapter: Chapter }> = ({ chapter }) => { - return ( - - - Handbook - {chapter.title} - {chapter.description} - - - - - ) -} - -export default Cover diff --git a/src/components/Handbook/Cover/styled.ts b/src/components/Handbook/Cover/styled.ts deleted file mode 100644 index 97b28f18..00000000 --- a/src/components/Handbook/Cover/styled.ts +++ /dev/null @@ -1,99 +0,0 @@ -import styled, { keyframes } from 'styled-components' - -import { media } from '@theme' - -import Img from '../../PrismicImage' -import { Display, Big, Small } from '../../UI' - -export const Wrapper = styled.div` - position: relative; - display: flex; - justify-content: space-between; - align-items: center; - - margin-bottom: -3rem; - - ${media.medium} { - flex-direction: column; - align-items: flex-start; - justify-content: flex-start; - } -` - -export const Image = styled(Img)` - position: relative; - - max-width: 22rem; - width: 100%; - height: auto; - - margin-left: 3rem; - margin-right: -2rem; - - ${media.medium} { - margin: 0; - } -` - -export const Holder = styled.div` - margin-top: 1rem; - max-width: 32rem; - margin-bottom: 5rem; - - ${media.medium} { - margin-bottom: 3rem; - } -` - -export const PreTitle = styled(Small)` - font-weight: 400; - display: block; - margin-bottom: 0.75rem; -` - -export const Title = styled(Display)` - margin-bottom: 1rem; -` - -export const Description = styled(Big)`` - -const goDown = keyframes` - from { - top: 8px; - } - - to { - top: 4px; - } -` - -export const Mouse = styled.div` - position: relative; - margin-top: 5rem; - - width: 1rem; - height: 1.5rem; - - border: 2px solid ${({ theme }) => theme.colors.medium}; - border-radius: 1rem; - - &:before { - content: ''; - display: block; - position: absolute; - left: 6px; - top: 5px; - - width: 4px; - height: 4px; - border-radius: 2px; - - background-color: ${({ theme }) => theme.colors.foreground}; - - animation: ${goDown} 1s cubic-bezier(0.2, 1, 0.2, 1) infinite alternate; - } - - ${media.medium} { - display: none; - } -` diff --git a/src/components/Handbook/CustomComponentParser/index.tsx b/src/components/Handbook/CustomComponentParser/index.tsx deleted file mode 100644 index 6189d843..00000000 --- a/src/components/Handbook/CustomComponentParser/index.tsx +++ /dev/null @@ -1,192 +0,0 @@ -import React from 'react' - -import linkResolver from '../../../utils/linkResolver' -import * as S from './styled' - -interface CustomComponentParserProps { - element: { - type: string - text: string - spans: Array<{ - start: number - end: number - type: string - data?: { - id: string - isBroken: boolean - lang: string - link_type: string - slug: string - type: string - uid: string - url?: string - } - }> - } -} - -const breakLines = (text: string) => { - const lines = text.split('\n') - - if (lines.length === 1) { - return lines[0] - } - - return lines.map((line, i) => { - return ( - - {line} -
-
- ) - }) -} - -const renderText = (text: string) => { - return breakLines(text.replace(/^[\r\n]+|[\r\n]+$/gim, '')) -} - -const CustomComponentParser: React.FC = ({ - element, -}) => { - // Side-note - if (/\[side-note/gim.test(element.text)) { - let text = element.text - const content = /\[side-note\]([^<]+)\[\/side-note\]/gim.exec(element.text) - - if (content && content.length > 0) { - text = content[1] - } - - return ( - - 🗒 Side Note - {renderText(text)} - - ) - } - - // Box - if (/\[box/gim.test(element.text)) { - const content = /\[box title="([^<]+)"\]([^<]+)\[\/box\]/gim.exec( - element.text - ) - - if (content && content.length > 0) { - const [, title, text] = content - - return ( - - {title} - {renderText(text)} - - ) - } - - return null - } - - // Highlight - if (/\[highlight/gim.test(element.text)) { - let text = element.text - const content = /\[highlight\]([^<]+)\[\/highlight\]/gim.exec(element.text) - - if (content && content.length > 0) { - text = content[1] - } - - return ( - - {renderText(text)} - - ) - } - - // Link - if (/\[link/gim.test(element.text)) { - const content = /\[link text="([^<]+)"\]([^<]+)\[\/link\]/gim.exec( - element.text - ) - - if ( - content && - content.length > 0 && - element.spans.length > 0 && - element.spans[0].data - ) { - const [, title, text] = content - const link = element.spans[0].data - - return ( - - {title} - {link.link_type === 'Web' || link.link_type === 'Media' ? ( - - {renderText(text)} - - - ) : ( - - {renderText(text)} - - - )} - - ) - } - - return null - } - - // Abbr - if (/\[abbr/gim.test(element.text)) { - const parts: string[][][] = element.text - .split('[abbr text="') - .map(text => text.split('"]').map(t => t.split('[/abbr]'))) - - return ( -

- {parts.map((chunk, i) => { - // abbr found - if (chunk.length === 2) { - /** - * If an abbr was found, we will get an array like this: - * [ - * ['Tooltip content for abbr'], - * ['abbr text', 'remaining text'] - * ] - */ - const [tooltipContentArray, textContentArr] = chunk - const [abbr, rest] = textContentArr - - return ( - - - {abbr} - - {renderText(tooltipContentArray.toString())} - - - {renderText(rest)} - - ) - } - - return ( - - {renderText(chunk.toString())} - - ) - })} -

- ) - } - - return null -} - -export default CustomComponentParser diff --git a/src/components/Handbook/CustomComponentParser/styled.ts b/src/components/Handbook/CustomComponentParser/styled.ts deleted file mode 100644 index bf412431..00000000 --- a/src/components/Handbook/CustomComponentParser/styled.ts +++ /dev/null @@ -1,168 +0,0 @@ -import { Link as GatsbyLink } from 'gatsby' -import styled from 'styled-components' - -import { media } from '@theme' - -import { labelStyle, Text as BaseText } from '../../UI' -import ArrowIcon from '../common/Arrow' - -export const Title = styled.span` - ${labelStyle} - display: block; - margin-bottom: 0.5rem; - line-height: 1.5; -` - -export const SmallText = styled.span` - ${labelStyle} - color: inherit; - line-height: 1.5; -` - -export const Text = styled(BaseText)` - margin-bottom: 0 !important; -` - -export const RightArrow = styled(ArrowIcon)` - margin-left: 0.5rem; - transform: scale(0.8); - transition: transform ${({ theme }) => theme.transitions.cubic()}; -` - -export const ExternalLink = styled.a` - display: flex; - align-items: center; - - opacity: 1 !important; - - color: ${({ theme }) => theme.colors.highlight}; - - ${media.hover} { - &:hover { - ${RightArrow} { - transform: scale(0.8) translateX(0.5rem); - } - } - } -` - -export const Link = styled(GatsbyLink)` - display: flex; - align-items: center; - - opacity: 1 !important; - - color: ${({ theme }) => theme.colors.highlight}; - - ${media.hover} { - &:hover { - ${RightArrow} { - transform: scale(0.8) translateX(0.5rem); - } - } - } -` - -/* Sidenote */ -export const SidenoteWrapper = styled.aside` - position: absolute; - right: 0; - - width: 16rem; - padding: 1rem 1.125rem; - - background: #fdf8ed; - color: ${({ theme }) => theme.colors.foreground}; - border-left: 2px solid #fbeed2; - - ${media.large} { - box-sizing: border-box; - width: 16rem; - } - - ${media.medium} { - position: relative; - width: 100%; - max-width: 100%; - margin-bottom: 1.5rem; - } -` - -/* Box */ -export const Box = styled.div` - box-sizing: border-box; - padding: 1rem 1.125rem; - - background-color: #f8f2f0; - border-left: 1px solid #e8d5cd; - - margin-bottom: 2rem; - - & + h2 { - margin-top: -2rem; - } -` - -/* Highlight */ -export const Highlight = styled(Box)` - background-color: #f5f8ff; - border-left: 1px solid #0154ff; -` - -/* Link */ -export const LinkBox = styled(Box)` - background-color: #f6f7f7; - border-left: 1px solid #dfe0e0; -` - -/* Tooltip */ -export const Tooltip = styled.span` - ${labelStyle}; - pointer-events: none; - - opacity: 0; - - white-space: normal; - line-height: 1.5; - - position: absolute; - z-index: 99; - left: 50%; - transform: translateY(1rem) translateX(-50%); - top: 100%; - margin-top: 0.5rem; - - width: 12rem; - - background-color: ${({ theme }) => theme.colors.foreground}; - color: ${({ theme }) => theme.colors.background}; - - padding: 1rem; - border-radius: 2px; - - box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.25), 0px 4px 8px rgba(0, 0, 0, 0.25); - - transition: opacity ${({ theme }) => theme.transitions.ease()}, - transform ${({ theme }) => theme.transitions.cubic()}; -` - -export const Abbr = styled.abbr` - white-space: nowrap; - text-decoration: none; - - cursor: help; - - position: relative; - - background-color: #fdf5e4; - border-bottom: 1px dashed #f9db99; - - ${media.hover} { - &:hover ${Tooltip} { - pointer-events: auto; - opacity: 1; - - transform: translateY(0rem) translateX(-50%); - } - } -` diff --git a/src/components/Handbook/Image/index.tsx b/src/components/Handbook/Image/index.tsx deleted file mode 100644 index 85bec652..00000000 --- a/src/components/Handbook/Image/index.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react' - -const Image: React.FC<{ url: string; alt: string }> = ({ url, alt }) => { - return ( -
- {alt} -
{alt}
-
- ) -} - -export default Image diff --git a/src/components/Handbook/MainPage/Category/index.tsx b/src/components/Handbook/MainPage/Category/index.tsx deleted file mode 100644 index 31d22d0e..00000000 --- a/src/components/Handbook/MainPage/Category/index.tsx +++ /dev/null @@ -1,47 +0,0 @@ -import React from 'react' - -import { Chapter } from '../../../../pages/handbook' -import { textByLine } from '../../../../utils/textByLine' -import { Text, Small } from '../../../UI' -import * as S from './styled' - -interface CategoryProps { - title: string - description: string - chapters: Chapter[] -} - -const Category = ({ title, description, chapters }: CategoryProps) => { - return ( - - -
- {title} - {description} -
-
- - {chapters.map( - ({ chapter, chapter_link_description, chapter_link_text }, i) => { - return ( - -
- {chapter.document.data.title} - {textByLine(chapter_link_description).map((line, j) => ( - {line} - ))} -
- - {chapter_link_text} - - -
- ) - } - )} -
-
- ) -} - -export default Category diff --git a/src/components/Handbook/MainPage/Category/styled.ts b/src/components/Handbook/MainPage/Category/styled.ts deleted file mode 100644 index 8f6f30de..00000000 --- a/src/components/Handbook/MainPage/Category/styled.ts +++ /dev/null @@ -1,93 +0,0 @@ -import { Link } from 'gatsby' -import styled from 'styled-components' - -import { media } from '@theme' - -import { - Container, - Title as BaseTitle, - Text as BaseText, - Small as BaseSmall, -} from '../../../UI' -import ArrowIcon from '../../common/Arrow' - -export const Wrapper = styled(Container)` - margin-bottom: 5rem; -` - -export const Header = styled.div` - display: grid; - grid-template-columns: 1fr 1fr; - grid-gap: 3rem; - - margin-bottom: 3.5rem; - - ${media.large} { - grid-template-columns: 2fr 1fr; - } - - ${media.medium} { - grid-template-columns: 1fr; - } -` - -export const Title = styled(BaseTitle)` - margin-bottom: 0.75rem; -` - -export const BoxTitle = styled(BaseText)` - margin-bottom: 0.5rem; -` - -export const BlockSmall = styled(BaseSmall)` - display: block; -` - -export const BoxesHolder = styled.ul` - display: grid; - grid-gap: 3rem; - grid-template-columns: repeat(auto-fill, minmax(15rem, 1fr)); - grid-template-rows: auto 1fr; - - ${media.medium} { - grid-gap: 2rem; - } - - ${media.small} { - grid-gap: 1.5rem; - } -` - -export const LinkHolder = styled.div` - margin-top: 1.25rem; - display: flex; - align-items: center; -` - -export const RightArrow = styled(ArrowIcon)` - margin-left: 0.5rem; - transition: transform ${({ theme }) => theme.transitions.cubic()}; -` - -export const BoxLink = styled(Link)` - border: 1px solid ${({ theme }) => theme.colors.subtle}; - color: ${({ theme }) => theme.colors.foreground}; - background-color: ${({ theme }) => theme.colors.background}; - - padding: 1.25rem; - - display: flex; - flex-direction: column; - justify-content: space-between; - transition: background-color ${({ theme }) => theme.transitions.ease()}; - - ${media.hover} { - &:hover { - background-color: ${({ theme }) => theme.colors.subtle}; - - ${RightArrow} { - transform: translateX(0.5rem); - } - } - } -` diff --git a/src/components/Handbook/MainPage/Featured/index.tsx b/src/components/Handbook/MainPage/Featured/index.tsx deleted file mode 100644 index b4d2fa1d..00000000 --- a/src/components/Handbook/MainPage/Featured/index.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import React from 'react' - -import { ChapterWithImage } from '../../../../pages/handbook' -import * as S from './styled' - -interface FeaturedProps { - featured: ChapterWithImage[] -} - -const Featured = ({ featured }: FeaturedProps) => { - return ( - - {featured.map( - ({ chapter, chapter_link_description, chapter_link_text }, i) => { - return ( - - -
- {chapter.document.data.title} - {chapter_link_description} -
- - {chapter_link_text} - - -
- -
- ) - } - )} -
- ) -} - -export default Featured diff --git a/src/components/Handbook/MainPage/Featured/styled.ts b/src/components/Handbook/MainPage/Featured/styled.ts deleted file mode 100644 index 1eef08b9..00000000 --- a/src/components/Handbook/MainPage/Featured/styled.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { Link } from 'gatsby' -import { GatsbyImage } from 'gatsby-plugin-image' -import styled from 'styled-components' - -import { media } from '@theme' - -import { Container, Title as BaseTitle, Text as BaseText } from '../../../UI' -import ArrowIcon from '../../common/Arrow' - -export const Wrapper = styled(Container)` - display: grid; - grid-template-columns: 1fr 1fr; - grid-gap: 3rem; - - margin-bottom: 5rem; - - ${media.medium} { - grid-template-columns: 1fr; - grid-gap: 2rem; - } - - ${media.small} { - grid-gap: 1.5rem; - } -` - -export const Content = styled.div` - max-width: 50%; - display: flex; - flex-direction: column; - justify-content: space-between; - - ${media.largest} { - max-width: 100%; - } - - ${media.medium} { - max-width: 75%; - } -` - -export const Title = styled(BaseTitle)` - margin-bottom: 0.75rem; -` - -export const Text = styled(BaseText)` - margin-bottom: 2.5rem; -` - -export const LinkText = styled(BaseText)` - color: inherit; -` - -export const LinkHolder = styled.div` - display: flex; - align-items: center; -` - -export const RightArrow = styled(ArrowIcon)` - margin-left: 0.5rem; - transition: transform ${({ theme }) => theme.transitions.cubic()}; -` - -export const Image = styled(GatsbyImage)` - position: absolute !important; - max-width: 15rem; - - width: 40%; - right: 0; - top: 3rem; - - ${media.largest} { - position: relative !important; - right: auto; - top: auto; - - width: 100%; - max-width: 15rem; - height: auto; - - margin-top: 3rem; - margin-bottom: -4.5rem; - } - - ${media.medium} { - display: none; - } -` - -export const BoxLink = styled(Link)` - display: flex; - position: relative; - box-sizing: border-box; - - border: 1px solid ${({ theme }) => theme.colors.subtle}; - color: ${({ theme }) => theme.colors.foreground}; - background-color: ${({ theme }) => theme.colors.background}; - - border-radius: 2px; - - padding: 2rem; - margin-bottom: 5rem; - - transition: background-color ${({ theme }) => theme.transitions.ease()}; - - ${media.largest} { - flex-direction: column; - padding-bottom: 0; - } - - ${media.medium} { - padding-bottom: 2rem; - margin-bottom: 0; - } - - ${media.hover} { - &:hover { - background-color: ${({ theme }) => theme.colors.subtle}; - - ${RightArrow} { - transform: translateX(0.5rem); - } - } - } -` diff --git a/src/components/Handbook/MainPage/Top/index.tsx b/src/components/Handbook/MainPage/Top/index.tsx deleted file mode 100644 index 32d3eb17..00000000 --- a/src/components/Handbook/MainPage/Top/index.tsx +++ /dev/null @@ -1,29 +0,0 @@ -import React from 'react' - -import { textByLine } from '../../../../utils/textByLine' -import { Big } from '../../../UI' -import * as S from './styled' - -interface TopProps { - title: string - description: string - sideNote: string -} - -const Top = ({ title, description, sideNote }: TopProps) => { - return ( - - - {title} - {description} - - - {textByLine(sideNote).map((line, i) => { - return {line} - })} - - - ) -} - -export default Top diff --git a/src/components/Handbook/MainPage/Top/styled.ts b/src/components/Handbook/MainPage/Top/styled.ts deleted file mode 100644 index 8e065ca6..00000000 --- a/src/components/Handbook/MainPage/Top/styled.ts +++ /dev/null @@ -1,43 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { Container, Display, Small } from '../../../UI' -import { SidenoteWrapper } from '../../CustomComponentParser/styled' - -export const Wrapper = styled(Container)` - text-align: left; - - margin-top: 7.5rem; - margin-bottom: 7.5em; - - display: flex; - justify-content: space-between; - align-items: flex-end; - - ${media.small} { - margin-top: 5em; - margin-bottom: 5em; - } -` - -export const Left = styled.div` - max-width: 32rem; -` - -export const Title = styled(Display)` - margin-bottom: 0.75rem; -` - -export const Sidenote = styled(SidenoteWrapper)` - position: relative; - margin-left: 5rem; - - ${media.medium} { - display: none; - } -` - -export const SidenoteText = styled(Small)` - display: block; -` diff --git a/src/components/Handbook/MainPage/index.ts b/src/components/Handbook/MainPage/index.ts deleted file mode 100644 index a8c852de..00000000 --- a/src/components/Handbook/MainPage/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default as Top } from './Top' -export { default as Featured } from './Featured' -export { default as Category } from './Category' diff --git a/src/components/Handbook/Navigation/Arrow.tsx b/src/components/Handbook/Navigation/Arrow.tsx deleted file mode 100644 index 2bac21ed..00000000 --- a/src/components/Handbook/Navigation/Arrow.tsx +++ /dev/null @@ -1,15 +0,0 @@ -import React from 'react' - -const Arrow = (props: any) => ( - - - -) - -export default Arrow diff --git a/src/components/Handbook/Navigation/SubMenu/index.tsx b/src/components/Handbook/Navigation/SubMenu/index.tsx deleted file mode 100644 index 7755f896..00000000 --- a/src/components/Handbook/Navigation/SubMenu/index.tsx +++ /dev/null @@ -1,104 +0,0 @@ -import { motion } from 'framer-motion' -import React, { useEffect, useRef, useState } from 'react' - -import { ContentType } from '../' -import { scrollToId } from '../../../../utils/scrollToId' -import { titleToID } from '../../../../utils/titleToID' -import * as S from './styled' - -interface SubMenuProps { - path: string - headings: ContentType[] - isActive: boolean -} - -const variants = { - open: (ulRef: { current: HTMLUListElement }) => { - return { - maxHeight: `${ulRef.current.getBoundingClientRect().height}px`, - } - }, - closed: { - maxHeight: 0, - }, -} - -const SubMenu = ({ path, headings, isActive }: SubMenuProps) => { - const [active, setActive] = useState(titleToID(headings[0].text)) - const domList = useRef([]) - - // Fetch IDs from DOM when mounting - useEffect(() => { - headings.forEach((heading, _index) => { - if (heading.text) { - const target = document.querySelector(`#${titleToID(heading.text)}`) - if (target && target instanceof HTMLHeadingElement) { - domList.current.push(target) - } - } - }) - }, [headings]) - - // Add event listener to scroll to change currently active heading - const onScroll = () => { - const domNodes = domList.current.slice().reverse() - - for (const element of domNodes) { - if (element.getBoundingClientRect().top < 100) { - const id = element.getAttribute('id') - if (id) { - setActive(id) - break - } - } - } - } - - useEffect(() => { - onScroll() - window.addEventListener('scroll', onScroll) - - return function cleanup() { - window.removeEventListener('scroll', onScroll) - } - }, []) - - // Ul Ref to animate - const ulRef = useRef(null) - - return ( - -
    - {headings.map((heading, i) => { - const id = titleToID(heading.text) - return ( -
  • - ) => { - scrollToId(e, id) - }} - > - {heading.text} - -
  • - ) - })} -
-
- ) -} - -export default SubMenu diff --git a/src/components/Handbook/Navigation/SubMenu/styled.ts b/src/components/Handbook/Navigation/SubMenu/styled.ts deleted file mode 100644 index 79fcf749..00000000 --- a/src/components/Handbook/Navigation/SubMenu/styled.ts +++ /dev/null @@ -1,32 +0,0 @@ -import styled, { css } from 'styled-components' - -import { media } from '@theme' - -import { linkStyle } from '../styled' - -export const Link = styled.a<{ - extraMargin: boolean - isActive: boolean -}>` - ${linkStyle}; - - display: block; - padding: 0.35rem 0; - padding-left: ${({ extraMargin }) => (extraMargin ? '3rem' : '2rem')}; - border-left: 1px solid ${({ theme }) => theme.colors.subtle}; - line-height: 1.4; - - ${media.hover} { - &:hover { - color: ${({ theme }) => theme.colors.highlight}; - } - } - - ${({ isActive }) => - isActive && - css` - pointer-events: none; - color: ${({ theme }) => theme.colors.highlight}; - border-left: 1px solid ${({ theme }) => theme.colors.highlight}; - `} -` diff --git a/src/components/Handbook/Navigation/index.tsx b/src/components/Handbook/Navigation/index.tsx deleted file mode 100644 index 52da996f..00000000 --- a/src/components/Handbook/Navigation/index.tsx +++ /dev/null @@ -1,176 +0,0 @@ -import { graphql, useStaticQuery } from 'gatsby' -import React from 'react' - -import Arrow from './Arrow' -import SubMenu from './SubMenu' -import * as S from './styled' - -export interface ContentType { - type: string - // text is guaranteed on headings (which we are filtering for) - text: string -} - -type Body = Array<{ - __typename: string - // primary only exists if __typename is PrismicHandbookChapterBodyContent - primary: { - content: { - raw: ContentType[] - } - } -}> - -interface Chapter { - chapter: { - document: { - uid: string - url: string - data: { - title: string - body: Body - } - } - } -} - -interface Content { - featured: Chapter[] - body: Array<{ - primary: { - category_title: string - category_description: string - } - items: Chapter[] - }> -} - -interface Data { - allPrismicHandbook: { - nodes: Array<{ data: Content }> - } -} - -const flatChapterHeadings = (body: Body) => { - return body.reduce((acc: ContentType[], b) => { - if (b.__typename === 'PrismicHandbookChapterBodyContent') { - const justHeadings = b.primary.content.raw.filter( - c => c.type === 'heading2' || c.type === 'heading3' - ) - acc.push(...justHeadings) - } - - return acc - }, []) -} - -const Navigation: React.FC<{ currentPage?: string }> = ({ currentPage }) => { - const data: Data = useStaticQuery(query) - const { body: categories, featured } = data.allPrismicHandbook.nodes[0].data - - const mapChapters = ({ chapter }: Chapter) => { - const headings = flatChapterHeadings(chapter.document.data.body) - - return ( -
  • - - - - - {chapter.document.data.title} - - {headings.length > 0 && ( - - )} -
  • - ) - } - - return ( - -
      -
    • - Handbook -
    • -
    - {featured.length > 0 &&
      {featured.map(mapChapters)}
    } - {categories.map(({ primary: category, items: chapters }, i) => { - return ( - - {category.category_title && ( - {category.category_title} - )} -
      {chapters.map(mapChapters)}
    -
    - ) - })} -
    - ) -} - -export default Navigation - -const query = graphql` - fragment NavigationChapter on PrismicLinkType { - document { - ... on PrismicHandbookChapter { - uid - url - data { - title - body { - __typename - ... on PrismicHandbookChapterDataBodyContent { - primary { - content { - raw - } - } - } - } - } - } - } - } - - query HandbookNavigation { - allPrismicHandbook { - nodes { - data { - featured { - chapter { - ...NavigationChapter - } - } - body { - ... on PrismicHandbookDataBodyCategory { - primary { - category_title - category_description - } - items { - chapter { - ...NavigationChapter - } - } - } - } - } - } - } - } -` diff --git a/src/components/Handbook/Navigation/styled.ts b/src/components/Handbook/Navigation/styled.ts deleted file mode 100644 index 0215844b..00000000 --- a/src/components/Handbook/Navigation/styled.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { motion } from 'framer-motion' -import { Link } from 'gatsby' -import styled, { css } from 'styled-components' - -import { media } from '@theme' - -import { Label } from '../../UI' - -export const Wrapper = styled.div` - margin-bottom: 5rem; -` - -export const CategoryLabel = styled(Label)` - display: block; - color: ${({ theme }) => theme.colors.secondary}; - - margin-top: 1.75rem; - margin-bottom: 0.75rem; - margin-left: 1rem; -` - -export const linkStyle = css` - font-size: 1rem; - color: ${({ theme }) => theme.colors.foreground}; - line-height: 1; -` - -export const MainLink = styled(Link)` - ${linkStyle} - - display: flex; - align-items: center; - - padding: 0.6rem 0; - - ${media.hover} { - &:hover { - color: ${({ theme }) => theme.colors.highlight}; - } - } -` - -export const AnimatedArrowHolder = styled(motion.div)` - display: flex; - justify-content: center; - align-items: center; - - height: 0.5rem; - width: 0.5rem; - - margin-right: 0.5rem; -` diff --git a/src/components/Handbook/Testimonial/index.tsx b/src/components/Handbook/Testimonial/index.tsx deleted file mode 100644 index 59bd2903..00000000 --- a/src/components/Handbook/Testimonial/index.tsx +++ /dev/null @@ -1,31 +0,0 @@ -import React from 'react' - -import { Testimonial as TestimonialType } from '../../../templates/handbook' -import * as S from './styled' - -const Testimonial: React.FC<{ testimonial: TestimonialType }> = ({ - testimonial, -}) => { - return ( - - - - - - - -
    - {testimonial.name} - {testimonial.position} -
    -
    - {testimonial.link && testimonial.link.url && ( - {testimonial.link_text} - )} -
    - {testimonial.quote} -
    - ) -} - -export default Testimonial diff --git a/src/components/Handbook/Testimonial/styled.ts b/src/components/Handbook/Testimonial/styled.ts deleted file mode 100644 index b018c4ad..00000000 --- a/src/components/Handbook/Testimonial/styled.ts +++ /dev/null @@ -1,121 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { ArrowLink, titleStyle, textStyle, labelStyle } from '../../UI' - -export const Wrapper = styled.div` - margin-top: 5rem; - padding: 3rem; - border-radius: 2px; - background-color: ${(p: { backgroundColor: string }) => p.backgroundColor}; - - color: white; - - display: flex; - - ${media.medium} { - flex-direction: column; - } - - ${media.small} { - width: 100%; - padding: 1.5rem; - box-sizing: border-box; - } -` - -export const Left = styled.div` - flex: 1; - display: flex; - flex-direction: column; - justify-content: space-between; - align-items: flex-start; - - ${media.medium} { - order: 2; - margin-top: 3rem; - } - - ${media.small} { - margin-top: 1.5rem; - } -` - -export const Quote = styled.blockquote` - ${titleStyle} - color: white; - line-height: 1.25; - - margin-left: 4rem; - - flex: 3; - - ${media.medium} { - margin: 0; - } -` - -export const PhotoHolder = styled.div` - position: relative; - - margin-right: 1rem; -` - -export const Photo = styled.img` - width: 3rem; - height: 3rem; - border-radius: 100%; - overflow: hidden; -` - -export const Logo = styled.img` - width: 1.5rem; - height: 1.5rem; - border-radius: 100%; - position: absolute; - left: 2rem; - bottom: 0; -` - -export const Info = styled.div` - display: flex; - - align-items: center; - - ${media.medium} { - margin-bottom: 3rem; - } - - ${media.small} { - margin-bottom: 1.5rem; - } -` - -export const Name = styled.p` - ${textStyle}; - margin-bottom: 0.15rem; - - white-space: nowrap; - - color: white; -` - -export const Position = styled.p` - ${labelStyle}; - white-space: nowrap; - - color: white; -` - -export const Link = styled(ArrowLink)` - color: white; - white-space: nowrap; - margin-top: 1rem; - - ${media.hover} { - &:hover { - color: white; - } - } -` diff --git a/src/components/Handbook/common/Arrow.tsx b/src/components/Handbook/common/Arrow.tsx deleted file mode 100644 index d5c33622..00000000 --- a/src/components/Handbook/common/Arrow.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import React from 'react' - -const Arrow = (props: any) => ( - - - - - - -) - -export default Arrow diff --git a/src/components/Handbook/index.ts b/src/components/Handbook/index.ts deleted file mode 100644 index a35dd361..00000000 --- a/src/components/Handbook/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export { default as Content } from './Content' -export { default as Navigation } from './Navigation' -export { default as Testimonial } from './Testimonial' -export { default as Cover } from './Cover' -export { default as Image } from './Image' -export { default as BottomNavigation } from './BottomNavigation' -export { default as CustomComponentParser } from './CustomComponentParser' diff --git a/src/components/Header/Navigation/index.tsx b/src/components/Header/Navigation/index.tsx deleted file mode 100644 index 131e0573..00000000 --- a/src/components/Header/Navigation/index.tsx +++ /dev/null @@ -1,101 +0,0 @@ -import { StaticQuery, graphql } from 'gatsby' -import React, { RefObject } from 'react' - -import { NavLink } from '../../UI/' -import * as S from './styled' - -interface ILinkType { - node: { - id: string - label: string - link: string - } -} - -interface INavigationQuery { - allMenuYaml: { - edges: ILinkType[] - } -} - -interface INavigationState { - mobileMenu: boolean -} - -class Navigation extends React.Component< - { forceClose: boolean }, - INavigationState -> { - menuWrapperRef: RefObject = React.createRef() - - state = { mobileMenu: false } - - toggleMenu = () => this.setState(state => ({ mobileMenu: !state.mobileMenu })) - - renderLinks = (items: ILinkType[]) => - items.map(({ node: { label, link, id } }) => ( - - {label} - - )) - - getItemsHeight = (): number => { - if (this.menuWrapperRef.current) { - return Array.prototype.slice - .call(this.menuWrapperRef.current.childNodes) - .reduce((acc, child) => acc + child.offsetHeight, 0) - } - - return 0 - } - - componentDidUpdate() { - if (this.props.forceClose) { - this.setState({ mobileMenu: false }) - } - } - - render() { - return ( - - { - const { edges: items } = data.allMenuYaml - - return ( - - {this.renderLinks(items)} - - ) - }} - /> - - - ) - } -} - -const navigationQuery = graphql` - query NavigationQuery { - allMenuYaml { - edges { - node { - id - label - link - } - } - } - } -` - -export default Navigation diff --git a/src/components/Header/Navigation/styled.ts b/src/components/Header/Navigation/styled.ts deleted file mode 100644 index 048d56ae..00000000 --- a/src/components/Header/Navigation/styled.ts +++ /dev/null @@ -1,137 +0,0 @@ -import styled, { css } from 'styled-components' - -import { media } from '@theme' - -import { NavLink } from '../../UI/' - -export const Wrapper = styled.div` - ${media.medium} { - /* Dirty hack to hide the top shadow of the mobile menu */ - &:before { - content: ''; - display: block; - position: absolute; - z-index: 101; - left: 0; - right: 0; - bottom: 0; - height: 10px; - background-color: ${({ theme }) => theme.colors.background}; - } - } -` - -interface IHambuguer { - show: boolean -} - -export const Hamburguer = styled.button` - display: none; - position: relative; - - width: 2.5em; - height: 2.5em; - padding: 0; - margin: 0; - background-color: transparent; - border: none; - cursor: pointer; - - &:focus { - outline: none; - - &:before, - &:after { - opacity: 0.8; - } - } - - &:before, - &:after { - content: ''; - background-color: ${({ theme }) => theme.colors.foreground}; - height: 2px; - width: 100%; - left: 0; - position: absolute; - } - - &:before { - top: 0.75em; - transition: transform ${({ theme }) => theme.transitions.cubic()}, - top ${({ theme }) => theme.transitions.cubic()}; - } - - &:after { - bottom: 0.75em; - transition: transform ${({ theme }) => theme.transitions.cubic()}, - bottom ${({ theme }) => theme.transitions.cubic()}; - } - - ${(p: IHambuguer) => - p.show && - css` - &:before { - top: 1.15em; - transform: rotate(45deg); - } - - &:after { - bottom: 1.15em; - transform: rotate(135deg); - } - `} - - ${media.medium} { - display: block; - } -` - -interface INavWrapper { - show: boolean - itemsHeight: number -} - -export const NavWrapper = styled.nav` - display: grid; - grid-auto-flow: column; - grid-gap: 2em; - - ${media.medium} { - position: absolute; - z-index: 100; - overflow: hidden; - background-color: ${({ theme }) => theme.colors.background}; - - top: ${(p: INavWrapper) => (p.show ? 'calc(100%)' : '100%')}; - max-height: ${(p: INavWrapper) => - p.show ? `${p.itemsHeight / 16}em` : '0em'}; - right: 0; - left: 0; - - padding: 0 1.9em; - - display: block; - text-align: right; - - transition: top ${({ theme }) => theme.transitions.cubic()}, - max-height ${({ theme }) => theme.transitions.cubic()}, - box-shadow ${({ theme }) => theme.transitions.cubic()}; - - box-shadow: ${(p: INavWrapper) => - p.show - ? '0 1px 2px rgba(0,0,0,0.05), 0 2px 8px rgba(0,0,0,0.05)' - : '0 0 rgba(0,0,0,0)'}; - - ${NavLink} { - display: block; - font-size: 1.25em; - line-height: 1; - color: ${({ theme }) => theme.colors.foreground}; - - &:last-child { - padding-bottom: 3rem; - } - } - } -` diff --git a/src/components/Header/blog-logos/1.png b/src/components/Header/blog-logos/1.png deleted file mode 100644 index 8c8276ac..00000000 Binary files a/src/components/Header/blog-logos/1.png and /dev/null differ diff --git a/src/components/Header/blog-logos/10.png b/src/components/Header/blog-logos/10.png deleted file mode 100644 index 85b65136..00000000 Binary files a/src/components/Header/blog-logos/10.png and /dev/null differ diff --git a/src/components/Header/blog-logos/11.png b/src/components/Header/blog-logos/11.png deleted file mode 100644 index c86cfe2f..00000000 Binary files a/src/components/Header/blog-logos/11.png and /dev/null differ diff --git a/src/components/Header/blog-logos/12.png b/src/components/Header/blog-logos/12.png deleted file mode 100644 index 4ff10eb9..00000000 Binary files a/src/components/Header/blog-logos/12.png and /dev/null differ diff --git a/src/components/Header/blog-logos/2.png b/src/components/Header/blog-logos/2.png deleted file mode 100644 index e6f3a5d8..00000000 Binary files a/src/components/Header/blog-logos/2.png and /dev/null differ diff --git a/src/components/Header/blog-logos/3.png b/src/components/Header/blog-logos/3.png deleted file mode 100644 index 4097bc79..00000000 Binary files a/src/components/Header/blog-logos/3.png and /dev/null differ diff --git a/src/components/Header/blog-logos/4.png b/src/components/Header/blog-logos/4.png deleted file mode 100644 index 6ce3538e..00000000 Binary files a/src/components/Header/blog-logos/4.png and /dev/null differ diff --git a/src/components/Header/blog-logos/5.png b/src/components/Header/blog-logos/5.png deleted file mode 100644 index 962af1e4..00000000 Binary files a/src/components/Header/blog-logos/5.png and /dev/null differ diff --git a/src/components/Header/blog-logos/6.png b/src/components/Header/blog-logos/6.png deleted file mode 100644 index 06a5f5b8..00000000 Binary files a/src/components/Header/blog-logos/6.png and /dev/null differ diff --git a/src/components/Header/blog-logos/7.png b/src/components/Header/blog-logos/7.png deleted file mode 100644 index 42c9ce02..00000000 Binary files a/src/components/Header/blog-logos/7.png and /dev/null differ diff --git a/src/components/Header/blog-logos/8.png b/src/components/Header/blog-logos/8.png deleted file mode 100644 index 0e7c8143..00000000 Binary files a/src/components/Header/blog-logos/8.png and /dev/null differ diff --git a/src/components/Header/blog-logos/9.png b/src/components/Header/blog-logos/9.png deleted file mode 100644 index ec0eda95..00000000 Binary files a/src/components/Header/blog-logos/9.png and /dev/null differ diff --git a/src/components/Header/index.tsx b/src/components/Header/index.tsx deleted file mode 100644 index 14def9e8..00000000 --- a/src/components/Header/index.tsx +++ /dev/null @@ -1,68 +0,0 @@ -import React, { - createContext, - memo, - ReactNode, - useContext, - useEffect, - useState, -} from 'react' - -import { Logo } from '../UI/' -import Navigation from './Navigation' -import logos from './logos' -import * as S from './styled' - -// Context to set a random logo on blog -const Context = createContext(null) - -export const Provider: React.FC<{ children: ReactNode }> = ({ children }) => { - const [indexBlogLogo, setIndexBlogLogo] = useState(null) - - useEffect(() => { - setIndexBlogLogo(Math.floor(Math.random() * 12) + 1) - }, []) - - return {children} -} - -const Header: React.FC<{ isBlogPage?: boolean; children: React.ReactNode }> = ({ - children, - isBlogPage, -}) => { - const indexBlogLogo = useContext(Context) - - const [shouldClose, setShouldClose] = useState(false) - - // reset state - useEffect(() => { - if (shouldClose) { - setShouldClose(false) - } - }, [shouldClose]) - - return ( - setShouldClose(true)}> - - -
    - - - - - {isBlogPage && indexBlogLogo && logos[indexBlogLogo] && ( - - - - )} -
    - - -
    -
    - - {children} -
    - ) -} - -export default memo(Header) diff --git a/src/components/Header/logos.ts b/src/components/Header/logos.ts deleted file mode 100644 index 324060e9..00000000 --- a/src/components/Header/logos.ts +++ /dev/null @@ -1,29 +0,0 @@ -import BlogLogo1 from './blog-logos/1.png' -import BlogLogo10 from './blog-logos/10.png' -import BlogLogo11 from './blog-logos/11.png' -import BlogLogo12 from './blog-logos/12.png' -import BlogLogo2 from './blog-logos/2.png' -import BlogLogo3 from './blog-logos/3.png' -import BlogLogo4 from './blog-logos/4.png' -import BlogLogo5 from './blog-logos/5.png' -import BlogLogo6 from './blog-logos/6.png' -import BlogLogo7 from './blog-logos/7.png' -import BlogLogo8 from './blog-logos/8.png' -import BlogLogo9 from './blog-logos/9.png' - -const logos: { [key: number]: string } = { - 1: BlogLogo1, - 2: BlogLogo2, - 3: BlogLogo3, - 4: BlogLogo4, - 5: BlogLogo5, - 6: BlogLogo6, - 7: BlogLogo7, - 8: BlogLogo8, - 9: BlogLogo9, - 10: BlogLogo10, - 11: BlogLogo11, - 12: BlogLogo12, -} - -export default logos diff --git a/src/components/Header/styled.ts b/src/components/Header/styled.ts deleted file mode 100644 index bfded928..00000000 --- a/src/components/Header/styled.ts +++ /dev/null @@ -1,76 +0,0 @@ -import { Link } from 'gatsby' -import Headroom from 'react-headroom' -import styled from 'styled-components' - -import { media } from '@theme' - -import { Container as BaseContainer } from '../UI/' - -export const Wrapper = styled.header` - background-color: ${({ theme }) => theme.colors.background}; - padding-top: 3em; - padding-bottom: 1em; - transition: padding ${({ theme: { transitions } }) => transitions.ease()}; - - ${media.medium} { - padding-top: 2em; - } - - &:after { - content: ''; - position: fixed; - width: 100vw; - height: 50vh; - top: -50vh; - left: 0; - background-color: ${({ theme }) => theme.colors.background}; - } -` - -export const Header = styled(Headroom)` - background-color: ${({ theme }) => theme.colors.background}; - - .headroom { - transform: translate3d(0, 0, 0); - z-index: 999 !important; - } - .headroom--pinned { - ${Wrapper} { - padding-top: 0.75rem; - padding-bottom: 0.75rem; - box-shadow: 0 1px 0px rgba(0, 0, 0, 0.05); - } - } -` - -export const Container = styled(BaseContainer)` - display: flex; - justify-content: space-between; - align-items: center; -` - -export const LogoLink = styled(Link)` - transition: opacity ${({ theme }) => theme.transitions.ease()}; - /* Small optical compensation */ - margin-top: 0.25em; - - ${media.hover} { - &:hover { - opacity: 0.8; - } - } -` - -export const WrapperLogoBlog = styled.div` - position: relative; - height: 100%; - display: inline-block; - margin-left: 1em; -` - -export const LogoBlog = styled.img` - height: 2.2em; - position: absolute; - left: 0; - bottom: 0; -` diff --git a/src/components/Home/Careers/index.tsx b/src/components/Home/Careers/index.tsx deleted file mode 100644 index 7b221b40..00000000 --- a/src/components/Home/Careers/index.tsx +++ /dev/null @@ -1,52 +0,0 @@ -import { GatsbyImage } from 'gatsby-plugin-image' -import React from 'react' - -import { ICareersContent } from '../../../pages' -import { textByLine } from '../../../utils/textByLine' -import { ArrowLink } from '../../UI/' -import * as S from './styled' - -const Careers: React.FC = ({ - title, - text, - cta, - link, - photos, -}) => ( - <> - - - - {textByLine(title).map(l => { - return ( - - {l} -
    -
    - ) - })} -
    -
    - - {text} - - {cta} - - - - {photos.map((photo, i) => { - return ( -
    - -
    - ) - })} -
    -
    - -) - -export default Careers diff --git a/src/components/Home/Careers/styled.ts b/src/components/Home/Careers/styled.ts deleted file mode 100644 index 06f7296d..00000000 --- a/src/components/Home/Careers/styled.ts +++ /dev/null @@ -1,87 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { - Container as BaseContainer, - Title as BaseTitle, - Big as BaseBig, -} from '../../UI/' - -export const Container = styled(BaseContainer).attrs({ as: 'section' })` - margin: 10em auto; - - display: grid; - grid-template-columns: repeat(12, 1fr); - grid-column-gap: 3em; - - ${media.medium} { - margin: 7em auto; - grid-column-gap: 0; - grid-row-gap: 3em; - } - - ${media.small} { - margin: 5em auto; - } -` - -export const Left = styled.div` - grid-column: 1 / 6; - - ${media.large} { - grid-column: 1 / 5; - } - - ${media.medium} { - grid-column: 1 / -1; - } -` - -export const Right = styled.div` - grid-column: 6 / 12; - - ${media.large} { - grid-column: 5 / 13; - } - - ${media.medium} { - grid-column: 1 / -1; - } -` - -export const Title = styled(BaseTitle)` - max-width: 10em; -` - -export const Big = styled(BaseBig)` - margin-bottom: 3em; -` - -export const Photos = styled.div` - grid-column: 1 / -1; - - margin-top: 10em; - - display: grid; - grid-template: auto / repeat(3, 1fr); - grid-column-gap: 3em; - - ${media.large} { - grid-template: auto / repeat(2, 1fr); - /** Hide last image **/ - & > *:last-child { - display: none; - } - } - - ${media.medium} { - margin-top: 7em; - } - - ${media.small} { - margin-top: 3em; - grid-template: auto / auto; - grid-row-gap: 1em; - } -` diff --git a/src/components/Home/Services/index.tsx b/src/components/Home/Services/index.tsx deleted file mode 100644 index 97ef2137..00000000 --- a/src/components/Home/Services/index.tsx +++ /dev/null @@ -1,40 +0,0 @@ -import React from 'react' - -import { IServicesContent } from '../../../pages' -import { textByLine } from '../../../utils/textByLine' -import { Big, List, ArrowLink } from '../../UI/' -import * as S from './styled' - -const Services: React.FC = ({ - title, - text, - columns, - cta, - link, -}) => ( - - - {title} - - - {textByLine(text).map((line, key) => ( - {line} - ))} - - - {columns.map((column, i) => ( -
    - {column.title} - -
    - ))} -
    - - - {cta} - - -
    -) - -export default Services diff --git a/src/components/Home/Services/styled.ts b/src/components/Home/Services/styled.ts deleted file mode 100644 index b23a6a97..00000000 --- a/src/components/Home/Services/styled.ts +++ /dev/null @@ -1,75 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { - Container as BaseContainer, - Title as BaseTitle, - Big as BaseBig, -} from '../../UI/' - -export const Container = styled(BaseContainer).attrs({ as: 'section' })` - margin: 12.5em auto; - - display: grid; - grid-template: repeat(3, auto) / repeat(12, 1fr); - grid-column-gap: 3em; - grid-row-gap: 5em; - grid-template-areas: - 't t t t t x x x x x x .' - '. . c c c c c c c c c .' - '. . . . . b b b b b b .'; - - ${media.large} { - margin: 10em auto; - grid-template-areas: - 't t t t x x x x x x x x' - 'c c c c c c c c c c c c' - '. . . . b b b b b b b b'; - } - - ${media.medium} { - margin: 7em auto; - grid-row-gap: 3em; - grid-template-rows: repeat(4, auto); - grid-column-gap: 0; - grid-template-areas: - 't t t t t t t t t t t t' - 'x x x x x x x x x x x x' - 'c c c c c c c c c c c c' - 'b b b b b b b b b b b b'; - } -` - -export const Left = styled.div` - grid-area: t; -` - -export const TextContent = styled.div` - grid-area: x; -` - -export const Columns = styled.div` - grid-area: c; - - display: grid; - grid-template: auto / repeat(3, 1fr); - grid-column-gap: 3em; - - ${media.medium} { - grid-template-columns: repeat(1, auto); - grid-row-gap: 2em; - } -` - -export const Bottom = styled.div` - grid-area: b; -` - -export const Title = styled(BaseTitle)` - max-width: 10em; -` - -export const Big = styled(BaseBig)` - margin-bottom: 1em; -` diff --git a/src/components/Home/Top/RecentProjects/index.tsx b/src/components/Home/Top/RecentProjects/index.tsx deleted file mode 100644 index 3ec05a48..00000000 --- a/src/components/Home/Top/RecentProjects/index.tsx +++ /dev/null @@ -1,102 +0,0 @@ -import { motion } from 'framer-motion' -import { graphql, StaticQuery } from 'gatsby' -import { IGatsbyImageData } from 'gatsby-plugin-image' -import React from 'react' - -import getThumbBgColor from '../../../../utils/getThumbBgColor' -import { ProjectThumb } from '../../../UI' -import * as S from './styled' - -interface IRecentProjectsData { - allPrismicProject: { - nodes: Array<{ - url: string - uid: string - data: { - hero_theme: string - themes: Array<{ name: string; background: string }> - project_title: string - tagline: string - services: Array<{ - service: string - }> - thumb_image: { - alt: string - gatsbyImageData: IGatsbyImageData - } - } - }> - } -} - -const RecentProjects = () => ( - { - const { nodes: projects } = data.allPrismicProject - - return ( - - {projects.map((project, i) => { - return ( - - s.service)} - limitServices - backgroundColor={getThumbBgColor( - project.data.hero_theme, - project.data.themes - )} - /> - - ) - })} - - ) - }} - /> -) - -const recentProjectsQuery = graphql` - query RecentProjectsQuery { - allPrismicProject( - sort: { fields: first_publication_date, order: DESC } - limit: 3 - ) { - nodes { - uid - data { - hero_theme - themes { - name - background - } - thumb_image { - alt - gatsbyImageData - } - project_title - tagline - services { - service - } - } - url - } - } - } -` - -export default RecentProjects diff --git a/src/components/Home/Top/RecentProjects/styled.ts b/src/components/Home/Top/RecentProjects/styled.ts deleted file mode 100644 index f01451aa..00000000 --- a/src/components/Home/Top/RecentProjects/styled.ts +++ /dev/null @@ -1,26 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { Container as BaseContainer } from '../../../UI' - -export const Container = styled(BaseContainer).attrs({ as: 'section' })` - display: grid; - grid-template: auto / repeat(3, 1fr); - grid-column-gap: 3rem; - - ${media.large} { - grid-template: auto / repeat(2, 1fr); - - /** Hide last one **/ - & > *:last-child { - display: none; - } - } - - ${media.small} { - grid-template: auto / 1fr; - grid-column-gap: 0; - grid-row-gap: 3em; - } -` diff --git a/src/components/Home/Top/index.tsx b/src/components/Home/Top/index.tsx deleted file mode 100644 index f7023eef..00000000 --- a/src/components/Home/Top/index.tsx +++ /dev/null @@ -1,43 +0,0 @@ -import { motion } from 'framer-motion' -import React from 'react' - -import RecentProjects from './RecentProjects' -import * as S from './styled' - -interface ITop { - headline: string - tagline: string -} - -const SPRING_TRANSITION = { - type: 'spring', - damping: 20, - stiffness: 300, -} - -const Top: React.FC = ({ headline, tagline }) => ( - <> - - - - {headline} - - - {tagline} - - - - - - -) - -export default Top diff --git a/src/components/Home/Top/styled.ts b/src/components/Home/Top/styled.ts deleted file mode 100644 index f8e64788..00000000 --- a/src/components/Home/Top/styled.ts +++ /dev/null @@ -1,37 +0,0 @@ -import styled from 'styled-components' - -import { - Container as BaseContainer, - Huge as BaseHuge, - SmallTitle as BaseSmallTitle, -} from '../../UI/' - -export const Wrapper = styled(BaseContainer)` - height: 70vh; - min-height: 400px; - - display: flex; - flex-direction: column; - justify-content: flex-end; - - margin-bottom: 5rem; -` - -export const Info = styled.div` - height: 50%; - - display: flex; - flex-direction: column; - justify-content: space-between; -` - -export const Huge = styled(BaseHuge)` - font-size: 3.25em; - max-width: 24rem; - - transform: translateY(-75%); -` - -export const SmallTitle = styled(BaseSmallTitle)` - max-width: 34rem; -` diff --git a/src/components/Home/index.ts b/src/components/Home/index.ts deleted file mode 100644 index 079ddff8..00000000 --- a/src/components/Home/index.ts +++ /dev/null @@ -1,3 +0,0 @@ -export { default as Top } from './Top/' -export { default as Services } from './Services/' -export { default as Careers } from './Careers/' diff --git a/src/components/Labs/All/index.tsx b/src/components/Labs/All/index.tsx deleted file mode 100644 index 184b410e..00000000 --- a/src/components/Labs/All/index.tsx +++ /dev/null @@ -1,86 +0,0 @@ -import React, { useState } from 'react' - -import { ILabType } from '../../../pages/labs' -import { Big } from '../../UI' -import * as S from './styled' - -interface IAll { - content: Array<{ node: { data: ILabType } }> -} - -type FilterState = string | null - -const All: React.FC = ({ content }) => { - const tags = content.reduce( - (acc: string[], item: { node: { data: ILabType } }) => { - item.node.data.tags.forEach(tag => { - if (acc.indexOf(tag.tag) < 0) { - acc.push(tag.tag) - } - }) - - return acc - }, - [] - ) - const [filter, setFilter] = useState(null) - const filteredContent = content.filter(c => { - const itemTags = c.node.data.tags.map(tag => tag.tag) - - if (filter) { - return itemTags.indexOf(filter) >= 0 - } - - return - }) - - const items = !filter ? content : filteredContent - - return ( - - - setFilter(null)}> - All - - {tags.map(tag => { - return ( - setFilter(tag)} - > - {tag} - - ) - })} - -
    - {items.map(item => { - return ( - - - - - - - {item.node.data.title} - {item.node.data.tagline} - - {item.node.data.tags.map(t => t.tag).join(', ')} - - - - ) - })} -
    -
    - ) -} - -export default All diff --git a/src/components/Labs/All/styled.ts b/src/components/Labs/All/styled.ts deleted file mode 100644 index 93f8d476..00000000 --- a/src/components/Labs/All/styled.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { GatsbyImage } from 'gatsby-plugin-image' -import styled from 'styled-components' - -import { media } from '@theme' - -import { - Container as BaseContainer, - Big as BaseBig, - Text, - Small, - LabsIcon as Icon, -} from '../../UI/' - -export const Wrapper = styled(BaseContainer)` - max-width: 70em; - margin: 10em auto; - - display: flex; - - ${media.small} { - margin: 5em auto; - } -` - -/** Sidebar */ -export const Sidebar = styled.nav` - max-width: 16em; - width: 100%; - padding-right: 3em; - - display: flex; - flex-direction: column; - - ${media.large} { - max-width: 12em; - } - - ${media.medium} { - display: none; - } -` - -export const Filter = styled(BaseBig).attrs({ as: 'a', role: 'button' })<{ - active: boolean -}>` - display: inline-block; - padding: 0.125rem 0; - - cursor: ${({ active }) => (active ? 'default' : 'pointer')}; - - color: ${({ theme, active }) => - active ? theme.colors.foreground : theme.colors.medium}; - transition: color ${({ theme }) => theme.transitions.ease()}; - - ${media.hover} { - &:hover { - color: ${({ theme }) => theme.colors.foreground}; - } - } - - &:not(:last-child) { - margin-bottom: 0.5rem; - } -` - -/** Items */ -export const ItemLink = styled.a.attrs({ - target: '_blank', - rel: 'noopener noreferrer', -})` - display: flex; - transition: opacity ${({ theme }) => theme.transitions.ease()}; - - ${media.hover} { - &:hover { - opacity: 0.6; - } - } - - &:not(:last-child) { - margin-bottom: 2em; - } - - ${media.small} { - flex-direction: column; - } -` - -export const ImgHolder = styled.div` - position: relative; -` - -export const LabsIcon = styled(Icon)` - position: absolute; - top: 0.5rem; - left: 0.5rem; - - z-index: 10; - - ${media.small} { - top: 0.75rem; - left: 0.75rem; - } -` - -export const Img = styled(GatsbyImage)` - margin-right: 2em; - margin-bottom: 2em; - - width: 100%; - max-width: 10rem; - height: 5.5em; - - border-radius: 2px; - - ${media.large} { - max-width: 8em; - } - - ${media.small} { - max-width: 100%; - height: auto; - } -` - -export const ContentHolder = styled.div` - flex: 1; - padding-bottom: 2em; - - border-bottom: 1px solid ${({ theme }) => theme.colors.subtle}; -` - -export const Tagline = styled(Text)` - color: ${({ theme }) => theme.colors.medium}; -` - -export const More = styled(Small).attrs({ as: 'p' })` - margin-top: 0.5em; - - color: ${({ theme }) => theme.colors.medium}; -` diff --git a/src/components/Labs/Top/index.tsx b/src/components/Labs/Top/index.tsx deleted file mode 100644 index f671dbe8..00000000 --- a/src/components/Labs/Top/index.tsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from 'react' - -import * as S from './styled' - -interface ITop { - title: string - subtitle: string -} - -const Top: React.FC = ({ title, subtitle }) => { - return ( - - {title} - {subtitle} - - ) -} - -export default Top diff --git a/src/components/Labs/Top/styled.ts b/src/components/Labs/Top/styled.ts deleted file mode 100644 index 14862add..00000000 --- a/src/components/Labs/Top/styled.ts +++ /dev/null @@ -1,25 +0,0 @@ -import styled from 'styled-components' - -import { media } from '@theme' - -import { Huge as BaseHuge, Big as BaseBig } from '../../UI' - -export const LabsTopWrapper = styled.section` - padding: 10rem 2rem 0; - - text-align: center; - - ${media.medium} { - padding: 8rem 2rem 0; - } - - ${media.small} { - padding: 6rem 1rem 0; - } -` - -export const Huge = styled(BaseHuge)` - margin-bottom: 0.5rem; -` - -export const Big = styled(BaseBig)`` diff --git a/src/components/Labs/index.ts b/src/components/Labs/index.ts deleted file mode 100644 index 883a6d63..00000000 --- a/src/components/Labs/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default as Top } from './Top' -export { default as All } from './All' diff --git a/src/components/Layout/HandbookLayout/index.tsx b/src/components/Layout/HandbookLayout/index.tsx deleted file mode 100644 index e32f294b..00000000 --- a/src/components/Layout/HandbookLayout/index.tsx +++ /dev/null @@ -1,39 +0,0 @@ -import React, { ReactNode, useState } from 'react' - -import Layout from '..' -import { Navigation } from '../../Handbook/' -import * as S from './styled' - -const NavigationHolder: React.FC<{ children: ReactNode }> = ({ children }) => { - const [isOpen, setIsOpen] = useState(false) - - return ( - <> - setIsOpen(!isOpen)} /> - {children} - setIsOpen(!isOpen)}> - - - - - - ) -} - -const HandbookLayout: React.FC<{ - currentPage?: string - children?: ReactNode -}> = ({ children, currentPage }) => { - return ( - - - - - - {children} - - - ) -} - -export default HandbookLayout diff --git a/src/components/Layout/HandbookLayout/styled.ts b/src/components/Layout/HandbookLayout/styled.ts deleted file mode 100644 index 0daa52a8..00000000 --- a/src/components/Layout/HandbookLayout/styled.ts +++ /dev/null @@ -1,178 +0,0 @@ -import styled, { css } from 'styled-components' - -import { media } from '@theme' - -import { Container } from '../../UI' - -export const Wrapper = styled(Container)` - display: flex; - align-items: flex-start; -` - -export const NavHolder = styled.aside<{ isOpen: boolean }>` - top: 0; - padding: 5rem 0; - padding-right: 3rem; - position: sticky; - box-sizing: border-box; - - width: 18rem; - flex-shrink: 0; - height: 100vh; - - overflow-y: auto; - - ${media.large} { - position: fixed; - z-index: 1000; - - left: 0; - - background-color: ${({ theme }) => theme.colors.background}; - overflow: auto; - - height: 100vh; - width: 22em; - padding: 3em 3rem 3rem 4em; - margin-right: 0; - transform: translatex(-100%); - transition: transform ${({ theme }) => theme.transitions.cubic()}; - - ${({ isOpen }) => - isOpen && - css` - transform: translatex(0); - `} - } -` - -export const NavOverlay = styled.div<{ isOpen: boolean }>` - display: none; - - ${media.large} { - display: block; - position: fixed; - top: 0; - right: 0; - bottom: 0; - left: 0; - - background-color: rgba(0, 0, 0, 0.5); - opacity: 0; - - z-index: 999; - cursor: zoom-out; - pointer-events: none; - - transition: opacity 0.3s ease-in; - - ${({ isOpen }) => - isOpen && - css` - pointer-events: auto; - opacity: 1; - `} - } -` - -export const ButtonLine = styled.span` - position: absolute; - left: 0.5rem; - - height: 1px; - - background-color: black; - - transform: rotate(0deg); - transition: width ${({ theme }) => theme.transitions.cubic()}, - opacity ${({ theme }) => theme.transitions.ease()}, - transform ${({ theme }) => theme.transitions.cubic()}; - - &:nth-child(1) { - width: 0.85rem; - top: 0.75rem; - } - - &:nth-child(2) { - width: 1rem; - top: 1rem; - } - - &:nth-child(3) { - width: 0.8rem; - top: 1.25rem; - } -` - -export const Hamburger = styled.button<{ isOpen: boolean }>` - display: none; - - ${media.large} { - display: block; - position: fixed; - left: 1rem; - bottom: 1rem; - - z-index: 1001; - - box-sizing: border-box; - - width: 2rem; - height: 2rem; - - border-radius: 0.25rem; - cursor: pointer; - - border: none; - outline: none; - box-shadow: none; - appearance: none; - - background-color: white; - - box-shadow: rgba(0, 0, 0, 0.1) 0px 1px 2px, rgba(0, 0, 0, 0.1) 0px 2px 4px; - transition: box-shadow 500ms cubic-bezier(0.2, 1, 0.2, 1) 0s; - - &:hover { - ${ButtonLine} { - width: 1rem; - } - } - - ${({ isOpen }) => - isOpen && - css` - box-shadow: rgba(0, 0, 0, 0) 0px 1px 2px, rgba(0, 0, 0, 0) 0px 2px 4px; - - ${ButtonLine} { - &:nth-child(1) { - width: 1rem; - transform: rotate(45deg); - top: 1rem; - } - - &:nth-child(2) { - width: 1rem; - transform: rotate(135deg); - opacity: 0; - } - - &:nth-child(3) { - width: 1rem; - transform: rotate(135deg); - top: 1rem; - } - } - `} - } -` - -export const Main = styled.main` - width: 100%; - margin-top: 5rem; - padding-left: 3rem; - - ${media.large} { - padding-left: 0; - } -` diff --git a/src/components/Layout/index.tsx b/src/components/Layout/index.tsx deleted file mode 100644 index b05d687c..00000000 --- a/src/components/Layout/index.tsx +++ /dev/null @@ -1,45 +0,0 @@ -import React from 'react' - -import { Provider, Theme, colorArgumentType } from '@theme' - -import Footer from '../Footer' -import Header from '../Header' -import ConditionalWrap from '../utils/ConditionalWrap' - -interface ILayoutProps { - children: React.ReactNode - theme?: colorArgumentType - headerTheme?: colorArgumentType - footerTheme?: colorArgumentType - renderHeaderChildren?: React.ReactNode - isBlogPage?: boolean -} - -const Layout: React.FC = ({ - theme, - headerTheme, - footerTheme, - children, - renderHeaderChildren, - isBlogPage, -}) => { - return ( - - {c}} - > -
    {renderHeaderChildren}
    -
    - {children} - {c}} - > -