diff --git a/.babelrc b/.babelrc index 92346732ece18..ac40c5620e512 100644 --- a/.babelrc +++ b/.babelrc @@ -1,11 +1,17 @@ { "presets": [ + ["env", { + "targets": { + "node": 4.0 + }, + }], 'react', - 'es2015', - 'stage-0', + 'flow', ], "plugins": [ - 'transform-flow-strip-types', - 'lodash', - ], + "transform-runtime", + "transform-object-rest-spread", + "transform-async-to-generator", + "transform-flow-strip-types", + ] } diff --git a/.eslintrc b/.eslintrc index 1a1413811d7e4..4651e1718fd9b 100644 --- a/.eslintrc +++ b/.eslintrc @@ -1,58 +1,29 @@ { - "parser": "babel-eslint", "extends": [ - "eslint-config-airbnb", - "plugin:ava/recommended" + "google", + "plugin:flowtype/recommended", + "plugin:react/recommended", + "prettier", + "prettier/flowtype", + "prettier/react" ], "plugins": [ - "ava", "flowtype", - "flow-vars" + "react", ], - "rules": { - "indent": [2, 2, {"SwitchCase": 1}], - "no-console": [0], - "func-names": [0], - "semi": [2, "never"], - "no-extra-semi": [2], - "space-before-function-paren": [2, "always"], - "no-else-return": [0], - "space-infix-ops": [0], - "react/prefer-es6-class": [0], - "react/prefer-stateless-function": [0], - "no-underscore-dangle": ["error", { "allow": ["_config"] }], - "import/no-unresolved": [0], - "global-require": [0], - "no-duplicate-imports": [0], - /*"flowtype/require-parameter-type": 1,*/ - /*"flowtype/require-return-type": [*/ - /*1,*/ - /*"always",*/ - /*{*/ - /*"annotateUndefined": "never"*/ - /*}*/ - /*],*/ - /*"flowtype/space-after-type-colon": [*/ - /*1,*/ - /*"always"*/ - /*],*/ - /*"flowtype/space-before-type-colon": [*/ - /*1,*/ - /*"never"*/ - /*],*/ - /*"flowtype/type-id-match": [*/ - /*0,*/ - /*"^([A-Z][a-z0-9]+)+Type$"*/ - /*],*/ - /*"flow-vars/define-flow-type": 1,*/ - /*"flow-vars/use-flow-type": 1,*/ + "parserOptions": { + "ecmaVersion": 2016, + "sourceType": "module", + "ecmaFeatures": { + "jsx": true + } }, - "globals": { - "__PREFIX_LINKS__": true, + "env": { + "es6": true, + "node": true }, - "settings": { - "flowtype": { - "onlyFilesWithFlowAnnotation": true - } + "rules": { + "valid-jsdoc": [0], + "require-jsdoc": [0], } } diff --git a/.flowconfig b/.flowconfig index 3f2c8ddeace7f..1fdf79f22aa58 100644 --- a/.flowconfig +++ b/.flowconfig @@ -1,24 +1,10 @@ [version] -0.27.0 +0.42.0 [ignore] -.*/node_modules/.* .*/test/.* - -[include] -node_modules - -[libs] -./interfaces/ -node_modules/iflow-debug/index.js.flow -node_modules/iflow-lodash/index.js.flow -node_modules/iflow-react-router/index.js.flow - -[options] -esproposal.class_instance_fields=enable -esproposal.class_static_fields=enable - -strip_root=true - -suppress_comment= \\(.\\|\n\\)*\\$FlowFixMe -suppress_comment= \\(.\\|\n\\)*\\$FlowIssue \ No newline at end of file +.*/node_modules/typography/.* +.*/node_modules/fbjs/.* +.*/node_modules/react-side-effect/.* +.*/www/.* +.*/examples/.* diff --git a/.gitignore b/.gitignore index 8dfccdb41438d..6f6a4bb3d9dfd 100644 --- a/.gitignore +++ b/.gitignore @@ -36,3 +36,6 @@ bin/published.js test/**/public .gatsby-context.js .DS_Store +public/ +node_modules/ +.cache/ diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 0000000000000..1e8b314962144 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +6 diff --git a/.pre-commit.sh b/.pre-commit.sh new file mode 100755 index 0000000000000..9a0a5667abde4 --- /dev/null +++ b/.pre-commit.sh @@ -0,0 +1,12 @@ +#!/bin/sh +jsfiles=$(git diff --cached --name-only --diff-filter=ACM | grep '\.jsx\?$' | tr '\n' ' ') +[ -z "$jsfiles" ] && exit 0 + +diffs=$(node_modules/.bin/prettier -l $jsfiles) +[ -z "$diffs" ] && exit 0 + +echo "here" +echo >&2 "Javascript files must be formatted with prettier. Please run:" +echo >&2 "node_modules/.bin/prettier --write "$diffs"" + +exit 1 diff --git a/.travis.yml b/.travis.yml index 9cc17aa33ce07..f980690e8cd7d 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,6 @@ language: cpp sudo: false env: - - export NODE_VERSION="0.12" - export NODE_VERSION="4" - export NODE_VERSION="6" os: diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000000000..ab9ba0dfe8a6d --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,6 @@ +// Place your settings in this file to overwrite the default settings +{ + "prettier.semi": false, + "prettier.trailingComma": "es5", + "editor.formatOnSave": true +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000000000..acb3d30c8d388 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,161 @@ +# Change Log + +## [1.0.0-alpha10] - 2016-11-17 +### Added +- Did the intitial build of the new gatsbyjs.org! It's in the `www` + subdirectory on the 1.0 branch and is built on each push! That's my +kind of integration testing :-) You can see the early version of the +site at https://gatsbyjs.netlify.com/. PRs welcome! +- Added for page scripts. This speeds up loading scripts + slightly by telling the browser to start downloading the scripts when +the HTML first starts being parsed instead of when the browser reaches +the end. This is especially helpful for large HTML documents on slow +mobile networks. [PR](https://github.com/gatsbyjs/gatsby/pull/558) + +## Changed +- Use namedmodulesplugin instead of recordsPath for ensuring + deterministic builds and long-term cachability. The [previous PR adding +support for recordsPath](https://github.com/gatsbyjs/gatsby/pull/533) +proved unpleasant as you had to build locally and commit the outputted +records.json which was confusing and annoying. +[PR](https://github.com/gatsbyjs/gatsby/pull/559) + +## [1.0.0-alpha9] - 2016-11-04 +### Added +- Put the routes module on `window` to support experimental idea. See + this issue for more](https://github.com/gatsbyjs/gatsby/issues/537). +[commit](https://github.com/gatsbyjs/gatsby/commit/28e84f3aed480d1f5a8f9859172d1c6f531696d4) + +### Changed +- Removed the package `sharp` as it's not used and is preventing Gatsby + 1.0 from being installed on Windows. +[commit](https://github.com/gatsbyjs/gatsby/commit/34fff74e6fb3cae88010b42f74d784382ead4031) + +## [1.0.0-alpha8] - 2016-11-01 +### Added +- Extension API `swOnUpdated` for when a service worker finishes + updating. Use this to alert users of your app to reload to see the +latest version. +[commit](https://github.com/gatsbyjs/gatsby/commit/5173bdc5424e7c874b3f2abfad706cea2e38ebc3) + +### Fixed +- hot reloading now fully works. Apparently you can't use function + components for top-level routes on react-router with react-hot-loader +3.0 `¯\_(ツ)_/¯` [#532](https://github.com/gatsbyjs/gatsby/pull/532) and +[commit](https://github.com/gatsbyjs/gatsby/commit/36f2c169586ea30518639d7b1493e08e05befb73) +- Webpack needs the help of an obscure setting `recordsPath` to preserve + module ids across builds. Big thanks to @NekR for pointing this out to +me. Previous to this change, loading changed JS chunks could cause a JS +error as the module ids the new chunk expects wouldn't match the module +ids from the older chunks. +[#533](https://github.com/gatsbyjs/gatsby/pull/533) + +### Changed +- Disabled hard-source-webpack-plugin. It speeds up builds significantly + but has been causing hard-to-debug errors while developing. We'll +circle back to it down the road. +[commit](https://github.com/gatsbyjs/gatsby/commit/4bc9660ac8c371d23c0295cde52002775eee5aa1) +- Restored using ChunkManifestPlugin. It was disabled while trying to + debug the mismatched module id bug but that being fixed, we're using +it again. +[commit](https://github.com/gatsbyjs/gatsby/commit/8d16905f31b80ca56db225904d60ed78c6091ca9) +- Name modules ids in development for easier debugging. Primary benefit + is you can see which modules are getting hot reloaded. +[commit](https://github.com/gatsbyjs/gatsby/commit/93f6bd2c4206e71623c1a7fa007322f8dc9887be) + +## [1.0.0-alpha7] - 2016-10-27 +### Fixed +- Removed entries from the webpack config looking for + `node_modules/gatsby/node_modules`. This was added to help when +developing Gatsby using `npm link` but when Gatsby is installed +regularly, it then fails the Webpack validation as +`node_modules/gatsby/node_modules` doesn't now exist. + +## [1.0.0-alpha6] - 2016-10-27 +### Added +- extension API for adding types to the GraphQL schema + [commit](https://github.com/gatsbyjs/gatsby/commit/18b8b64ed4cbe3399fb262395c0c6e6a5a16099a) + +### Fixed +- Use babel-traverse instead of using babel-plugin so that don't say + done early when running graphql queries that have async resolvers +[commit](https://github.com/gatsbyjs/gatsby/commit/a19677e38d1ce8ba4fb39ddff75482904f168db6) + +## [1.0.0-alpha5] - 2016-10-14 +### Added +- hard-source-webpack-plugin + [commit](https://github.com/gatsbyjs/gatsby/commit/2c48e5c42887fecabc01c5f5b6f3dd8e06d3372f) +- New replacement API to wrap root component (useful for Redux, et + al.) +[commit](https://github.com/gatsbyjs/gatsby/commit/ebd57d2bd6c39b51a455b76018737e2957e146ef) +- yarn.lock + [commit](https://github.com/gatsbyjs/gatsby/commit/5ce3321b84e912925c4705ececef6f2c817b0684) + +### Changed +- Disable extracting the Webpack chunk manifest until understand why + this breaks updates when using Service Workers +[commit](https://github.com/gatsbyjs/gatsby/commit/07ed5b010ad27b1816084b361f06fd0ae6a017ba) + +## [1.0.0-alpha4] - 2016-10-07 +### Added +- Add more file extensions to file/url loader config. Default to url + loader unless it never makes sense to use data-uri e.g. favicons. +- Use api-runner-browser for calling browser extension + APIs/replacements. Prep for plugin system. +- Add extension API `clientEntry` that let's site code and plugins to + run code at the very start of client app. + +### Changed +- Add config to uglify to ignore ie8. +- Disable building AppCache until can research if useful. +- Turn on screw_ie8 options in UglifyJS. + +### Fixed +- Actually use the "sources" key from gatsby-config.js for looking for +markdown files. This will be getting an overhaul soon. +- Don't use null-loader for css during the build-js stage as this + prevents offline-plugin from caching files referenced in your CSS. +- Add missing publicPath for build-html step. + +## [1.0.0-alpha3] - 2016-10-05 +### Added +- Introduce way to programatically add components to `` + API to take over SSR rendering [a39c2a5](https://github.com/gatsbyjs/gatsby/commit/a39c2a5) +- Extract webpack manifest from commons.js so it doesn't change on every + build improving its cachability +[0941d33](https://github.com/gatsbyjs/gatsby/commit/0941d33) +- Always add babel-plugin-add-module-exports + [97f083d](https://github.com/gatsbyjs/gatsby/commit/97f083d) + +### Changed +- Upgraded React Hot Loader to 3.0-beta5 + [5185c3a](https://github.com/gatsbyjs/gatsby/commit/5185c3a) + +### Fixed +- Ensure bundle names for components and paths are unique [342030d](https://github.com/gatsbyjs/gatsby/commit/342030d) + [a1dfe19](https://github.com/gatsbyjs/gatsby/commit/a1dfe19) +- Remove old code loading config.toml + [66f901](https://github.com/gatsbyjs/gatsby/commit/66f901) + +## [1.0.0-alpha2] - 2016-09-21 +### Added +- New system for specifying page layouts inspired by Jekyll. +- `` and `` helper components for rendering + correct scripts and styles in your html.js, +- Validate at runtime gatsby-config.js and page objects. +- Start of new plugin system. +- New extension API: `onPostCreatePages` — called with pages after all + pages are created. Useful for programmatically modifying pages created +in plugins. + +### Changed +- Removed remaining 0.x code +- Exit if can't find local install of Gatsby. + [030f655](https://github.com/gatsbyjs/gatsby/commit/030f655075be5ad91af1dc12a05e6bd153a861df) +- Fix folder hierarchy for looking for loaders and modules #435 +- Changed default `Config` GraphQL type to `Site` and added some + Jekyll-inspired fields. + +## [1.0.0-alpha1] - 2016-09-02 +### Added +- Initial versions of new GraphQL data layer, PRPL pattern, programmatic routes, code + splitting, supporting long-term caching of JS files. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3e9c7b273410d..86dbf9e1e9f57 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,34 +1,81 @@ -# Filing an issue +# How to contribute -If you want your issue to be resolved quickly, please include in your -issue: +## Filing an issue + +If you want your issue to be resolved quickly, please include in your issue: * Gatsby version, node.js version, OS version -* The contents of your `gatsby-node.js`, `gatsby-browser.js`, and `package.json`. +* The contents of your `gatsby-config.js` and `package.json` as well as your + `gatsby-node.js`, `gatsby-browser.js` `gatsby-ssr.js` files depending on + changes you've made there. -# Contributing -You can install the latest `master` version of Gatsby by following these -simple steps: +## Contributing +You can install the latest `master` version of Gatsby by following these steps: * Clone the repo, navigate to its directory. -* Execute `npm install` to install packages. -* Execute `npm uninstall -g gatsby && npm link` -* Use `git pull` to update to latest Gatsby. - -Test suite can be run via `npm test`. - -This project uses [FlowType](https://flowtype.org/) for static type checking. +* Install dependencies using `npm install` in the root of the repo. The usual contributing steps are: * Fork the [official repository](https://github.com/gatsbyjs/gatsby). * Clone your fork: git clone `git@github.com:/gatsby.git` -* Make sure tests are passing for you: npm install && npm test -* Create a topic branch: git checkout -b topics/new-feature-name -* Run `npm run watch` to watch code and compile your changes. -* Clone one of the official repositories and "link" your fork of Gatsby - to it (run `npm link gatsby`). +* Install lerna, and gatsby-dev-cli globaly: `npm install -g lerna gatsby-dev-cli@canary` +* Checkout to the 1.0 branch: `git checkout 1.0` +* Install dependencies: `npm install && lerna bootstrap` +* Make sure tests are passing for you: `npm test` +* Create a topic branch: `git checkout -b topics/new-feature-name` +* Run `npm run watch` to do an initial build of all packages and watch for + changes to packages' source code and compile changes on the fly as you + work. +* For each of your Gatsby test sites, run the `gatsby-dev` command there to copy + the built files from your cloned copy of Gatsby. For more detailed instructions + see the [gatsby-dev-cli README](/packages/gatsby-dev-cli/) * Add tests and code for your changes. -* Once you‘re done, make sure all tests still pass: npm install && npm test +* Once you're done, make sure all tests still pass: `npm test` * Commit and push to your fork. * Create an pull request from your branch. + +## Development tools + +### Redux devtools + +Gatsby uses Redux for managing state during development and building. It's +often helpful to see the flow of actions and builtup state for a site you're +working on or if adding new functionality to core. We leverage +https://github.com/zalmoxisus/remote-redux-devtools and +https://github.com/zalmoxisus/remotedev-server to give you use the Redux +devtools extension for debugging Gatsby. + +To use this, first install +[redux-devtools-extension](https://github.com/zalmoxisus/redux-devtools-extension) +in your browser. Then in your Gatsby repo, run `npm run remotedev`. Then in +your site directory run `REDUX_DEVTOOLS=true gatsby develop`. Depending on +your operating system and shell, you may need to modify how you set the +`REDUX_DEVTOOLS` environment variable. + +At this point, your site will be sending Redux actions and state to the remote server. + +To connect to this, you need to setup the devtools extension to talk to the remote +server. + +First open the remote devtools. + +![how to open the redux remote devtools extension](./images/open-remote-dev-tools.png) + +Then click settings along the bottom menu and set the host and port. + +![how to set the host/port for the remote devtools extension to connect to Gatsby](./images/remote-dev-settings.png) + +After this, the devtools extension *should* connect to the remote server and you'll +see actions start showing up. + +![gatsby redux remote devtools](./images/running-redux-devtools.png) + +**Warning!! Lots of buginess**. While having this available is extreamly +helpful, this setup is very buggy and fragile. There is a memory leak in the +extension that's triggered it seems every time you restart the Gatsby +development server. Also the extension often, for no apparent reason, just +won't show any actions from the remote server. It'll also often freeze up. The +best solution seems to just be turning everything off and on again. Fixing up +these tools would be very helpful for us and many others using these tools if +someone wants to take this on! diff --git a/README.md b/README.md index 66f830daa9a34..a89f4255ca040 100644 --- a/README.md +++ b/README.md @@ -257,7 +257,7 @@ module.exports = React.createClass({ * `config.toml` - Core application configuration is stored here. Available via a `require` or `import` of 'config'. Values: * `noProductionJavascript` - set to a truthy value to prevent generation of bundle.js - (containing your client-side Single Page App) during a `gatbsy build`. You'll need + (containing your client-side Single Page App) during a `gatsby build`. You'll need to update your top-level `html.js` file so that it doesn't pull in `bundle.js` in production, but you'll want to keep it for `gatsby develop` mode. * `/pages` - All pages go here. Everything is turned into a page except diff --git a/decls/globals.js b/decls/globals.js new file mode 100644 index 0000000000000..3f756e0cf3e0d --- /dev/null +++ b/decls/globals.js @@ -0,0 +1,5 @@ +declare var __PREFIX_LINKS__: bool; +declare var __LINK_PREFIX__: string; +declare module 'gatsby-helpers' { + declare function prefixLink(link: string): string; +} diff --git a/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/gatsbygram-screenshot.png b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/gatsbygram-screenshot.png new file mode 100644 index 0000000000000..9e3adf3b2cb77 Binary files /dev/null and b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/gatsbygram-screenshot.png differ diff --git a/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/gatsbygram.mp4 b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/gatsbygram.mp4 new file mode 100644 index 0000000000000..f4704f0807a0c Binary files /dev/null and b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/gatsbygram.mp4 differ diff --git a/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/index.bkup b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/index.bkup new file mode 100644 index 0000000000000..85b10b053a01c --- /dev/null +++ b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/index.bkup @@ -0,0 +1,139 @@ +--- +title: "Gatsby 1.0 update" +date: "2017-02-23" +author: "Kyle Mathews" +--- + +*hint — the solution isn't reverting to an idealized "simpler" way of +working on the web* + +*Move problem statement here — that working in JS world feels like riding runaway +train or surfing overly aggressive wave* + +Advanced technologies don't emerge into the world fully grown like +Athena leaping from Zeus' forehead. Instead like babies, they are born +quite helpless and weak and must be slowly nurtured through their +awkward younger years until they are finally productive technology +adults. + +Software technology adoption goes through multiple stages. + +1. R&D / Custom built +2. Productization +3. Commodization + +## R&D and custom built solutions + +The first stage is the time of *R&D and custom built solutions*. +Sophesticated technology groups with advanced needs start running into +problems that existing solutiosn don't solve so feel compelled to build +new technology or cobble together existing tools into novel packages. + +So the Googles, Facebooks, Amazon, Apples of the world are running +applications in containers distributed across dozens of data centers +*years or decades* before Docker and Kubernetes came on the scene. +Similiarly tools like Google Closure Compiler and GWT pioneered advanced +Javascript building and bundling techniquges while the rest of us were +still *manually adding script tags to HTML pages*. + +## Productization + +As time goes on, more and more organizations start to run into the same +problems as these early pioneers and the ideas they pioneered start to +leak out into open source projects. + +These new open source *software products* see rapid adoption from early adopters +and improve quickly. They generate widespread controversy as brash early +adopters loudly market the new tools generating pushback from groups +heavily invested in older tools. + +## Commodization + +As time goes on, more and more of the complexity and sharp edges of the +early-stage product are solved until at last the software product is the +"new normal" which begineers are taught and is taken for granted. + +This is a widely understood pattern and has repeated itself over and +over the past ~60 years since computers came on the scene. + +Microprocessors, operating systems, compilers, databases, the internet, +email all had long awakward adolesants periods where they were seen as +toys or niche tools before growing up to dominate their respective +ecosystems—to the point that we struggle to remember what it was like +before they existed. + +## Adopting new technologies + +Long-lived organizations learn to surf the successive waves of incoming +new technologies by picking points on the technology life cycle to adopt +new tools and techniques. Some need the most advanced technologies and +are vorocious adopters and inventors. Others lag years behind. + +Or as [Erik Meijer summarized +it](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.72.868&rep=rep1&type=pdf) + +`Change Function = F(Perceived Crisis/Perceived Pain of Adoption)` + +Organizations in rapidly growing industries have many competitors and +are in a constant state of competative crisis so despite high adoption +pain, quickly adopt new technologies. + +Normally this works out nicely for everyone. The pain of developing new +technologies is borne by those that with the greatest need and everyone +else (the vast majority) can wait until things settle down and mature so +adoption is fairly painless. + +## Javascript in crisis + +![Javascript engineering wipes out while attempting to ride the webpack +wave](wipeout.jpg)*Javascript Engineer +wipes out while attempting to ride the webpack wave (from +[vaguelyartistic](https://www.flickr.com/photos/vaguelyartistic/292083492/in/photolist-rP1fh-hKfnhu-dPaHGm-dPaJj7-4Qd1rD-7RpZ8K-bpKqSf-bjWsr-5hAmkk-sfv38A-6T5D58-5KmnwF-oajBZ-8ngHVq-dK6r66-8LbLTj-4SdMxB-bmS9Yg-34wrh2-4kA7U9-dhwznJ-cSaLoq-cdkxFu-4bKzqQ-4C5dd4-FNAdm-4pchw3-pxvVkk-9viJ6k-dh6q21-dh6qiH-afqWxP-r1ftrh-9sjyvY-bz2JCe-7rfMDY-5o29iE-9YHVCe-bCEn8t-agcSdt-5K7ENr-a8aUW-qdyYC-5o27jb-bmS9V4-5nWRWg-tGgt7-hT9qL-9YLQmQ-4ZupJg))* + +* everyone has to build for the web +* tools take a while to mature (the critical path for improving tools +used by 100s of thousands of engineers often goes through surprisingly +few people and they can only work so fast). +* enormous competative pressure — the internet pits everyone against +each other. Dropping one service for another is easy. Everyone has to level +up quickly or get left behind. +* Suggests new tools (React, Webpack, Redux, GraphQL, etc.) *are +actually dramatically better* as sophesticated companies under enormous +competative pressure are rapidly adopting new web tools. + +New tools get widely adopted within *months*(!!!). New Javascript +projects can get 1000s of stars on Github within days. Bewilidering +abundance of choices. + +## Riding the runaway Javascript train + +![Javascript engineering riding runaway train](runaway-train.jpg)*Terrified Javascript Engineer riding the runaway Javascript train* + +Highly unsettling for many engineers and organizations. Those most +comfortable being mid to late adopters are forced into becoming early +adopters. + +## Things don't get better until they're made better + +* stay away if you can. Tools are rapidly maturing and consolidating. +* If you can't (you probably can't) — accept building for the web is +much more complex than it used to be. +* Budget more for training and hiring more senior engineers to work on +your web products. +* Invest in open source. They're are many engineers who'd love to work +full-time on open source code. Identify critical tools for your +organization and invest in them. Very high leverage investment as you +gain access to some of the best engineers and the rest of your +engineering organization learns from working with them. + +## As one layer of technology matures, they become the building blocks for the next generation of tools. + +New breed of web tools that take for granted new web technologies. + +Gatsby excemplifies this. Gensis was I wanted easy way to build +really fast websites with all my favorite web tools. Wraps React, +webpack, markdown to make it really easy to build websites out of these +building blocks without any configuration. + +![Javascript engineering masters runaway train](mastered-runaway-train.jpg)*Our hero Javascript Engineers masters the Javascript train* + diff --git a/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/index.md b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/index.md new file mode 100644 index 0000000000000..997c771b1cf40 --- /dev/null +++ b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/index.md @@ -0,0 +1,380 @@ +--- +title: What's coming in Gatsby 1.0 +date: "2017-02-23" +author: "Kyle Mathews" +image: 'ui-and-code.png' +draft: true +--- + +![Gatsbygram](ui-and-code.png) + +Imagine for a moment the perfect website framework. One that produced +really fast sites by default, that let you use the latest web tools and +browser features without complicated setup, and that helped your team +stay coordinated as you develop, ship, and maintain sites. + +This framework would have to be: + +* **universal**, work for all types of sites from simple brocurewares to +complex web-apps. +* **simple**, not requiring any setup to start using and with thoughtful +APIs to extend the framework. +* **fast**, doesn't lose customers to slow page loads. Takes advantage of +HTTP/2, browser caching, service workers, inlined critical css, and code +splitting so your site always loads incredibly fast—no matter what you +build. +* **JavaScript-driven**, the web is huge and intensely competitive. +Sites that win are fast and richly interactive. Your framework must make +it trivial to use advanced JavaScript. +* **team ready**, use industry standard collaboration tools like NPM, +Git, and continuous deployment, so your team is always on the same page +and shipping new features is easy. +* **modular**, allows for cleanly separated features so fixing bugs and +adding new features is easy and complexity is contained. +* **internet scale**, launch your site to millions without crashing your +site (or your wallet). +* **secure**, doesn't put your your users' data at risk of hacking. + +I believe that Gatsby fulfills these requirements. After several years +of working on the project and seeing it used successfully by many people +on a wide variety of sites, I'm confident that Gatsby works. + +Since I open sourced Gatsby in 2015, it's collected over **8000 stars** +on Github (by far the most stars on Github for a project of its type), +been joined by **122 contributors**, and **downloaded 130,000** times! + +In mid-2016, I decided to [work full-time on +Gatsby](https://www.bricolage.io/gatsby-open-source-work/) and started +researching and prototyping ideas that are now coming together as Gatsby +1.0. + +## What is Gatsby + +Gatsby combines the fast performance of static websites with the +powerful abstractions, excellent tools, and client capabilities of +the web-app world. + +It is a general purpose data-centric web framework that is [successfully +being used for a wide variety of +sites](https://github.com/gatsbyjs/gatsby#sites-built-with-gatsby) +including blogs, marketing sites, documentation sites, and e-commerce. + +It wraps three of the most popular web app tools into a cohesive website +framework: + +* [React](https://facebook.github.io/react/) from Facebook for building UIs +* [Webpack](https://webpack.js.org/) for bundling JavaScript and CSS +* [GraphQL](http://graphql.org/) from Facebook for declarative data queries + +While designing Gatsby, I wanted a synthesis of two of my favorite +developer experiences. The simplicity of building sites with markdown +and static site generators and the powerful hot-reloading environment of +the React world. + +![Gatsby development +experience](https://camo.githubusercontent.com/0506699aaaae2f9772cc381b92f2aa5e14eba296/687474703a2f2f7a697070792e6766796361742e636f6d2f556c74696d6174655765656b6c7942617265626972646261742e676966) + +When loading a page in a Gatsby site, browsers first load the page's +pre-built HTML file and then load the minimum JavaScript needed to make +that page interactive. + +Because Gatsby sites are just static files, you're ensured a much more +*carefree deployment*. There are no *complicated databases* to install +and maintain and *web-servers to scale* and protect against hacking. + +Serving static files ensures consistent *super fast load times*. Once +your site is loaded, Gatsby automatically *pre-fetches* adjacent pages. +This means navigating around your site feels *instantaneous* as all the +content and scripts for the next page has been loaded already. Since +you're reading this on a Gatsby site, try clicking on a link in the +header and then click back (note, this site is still being worked on as we +approach 1.0). A bit faster than your current site no? 😜 + +## Apps vs sites + +From nearly the beginning of the web, the idea of the web as an +application platform has competed with the idea of the web as a series +of "documents". + +In recent years, the "app" paradigm has gained steam as dozens of +JavaScript frameworks and other JavaScript tools have been released, +exploring ideas and competing for mind-share. + +100s of millions of dollars have been invested by the largest companies +in the world in these JavaScript frameworks and the larger ecosystem of +tools surrounding them. + +The improvement has been dramatic and exhilarating. I can remember many +things I struggled for weeks to build in ~2010-2013 that took me days or +even hours once I'd adopted React. + +React has taken over the web world and for good reason. Its three big +ideas, composable components, lifecycle APIs, and one-way data flow +dramatically *simplify* web UI development. Things that are really hard +to build within other paradigms feel almost easy with React. + +## Time for a JavaScript web framework? + +The internet runs on Open Source CMSs—primarily Wordpress and Drupal. I +spent most of college building Drupal websites and writing [open-source +Drupal +modules](https://www.bricolage.io/first-beta-release-drupal-native-mailinglist-module/). +My first startup job was at [Pantheon](https://pantheon.io)—where I +helped [design and build developer tools](https://www.bricolage.io/new-beginnings/) +for teams building Drupal & Wordpress sites. + +These open source CMSs are *extraordinary tools and have remarkably dynamic +ecosystems*. They truly run the web. Wordpress alone runs more than 25% +of all websites on the internet! + +But still, the time seems ripe for a client-centric web framework. + +As more and more sites are expected to become app-like there's been a +*rush to add more JavaScript into our sites* resulting in an explosion of +tool complexity resulting in, at times, poorly optimized sites that ship +far too much JavaScript at the wrong times bogging down the site. + +But it doesn't need to be this way. We use web frameworks because they +*embed smart ideas about how to organize our code* so we're guided towards +building fast sites that are simple to build and maintain. + +Gatsby aims to be a *modern web framework* that's designed with the +assumption that you need a rich client. Gatsby bakes in modern +JavaScript compiler and bundling tools along with a full asset pipeline +so you can just start writing your website and *be confident things will +work*. + +## Gatsby 1.0: Setting the foundation for a modern JavaScript website framework + +I started working on the [1.0 +branch](https://github.com/gatsbyjs/gatsby/tree/1.0) in August and after +months of hard work, our first beta release is in sight. + +The changes for 1.0 can be organized into a few areas. + +### Add service worker and offline support + +Service workers are perhaps the most exciting technology that's come to +the web in the past several years. It makes possible (finally!) +sophisticated client caching plus true offline support. I've added +excellent on-by-default support to Gatsby for Service Workers and a +great offline experience. If you're using Chrome or Firefox, this site +loads offline! *Service workers make your site much more resilient +against bad networks*. If someone loads your site on a train and goes +through a tunnel, you won't lose them as they'll still be able to keep +clicking around. + +### Route-based code splitting + +Many sites generate one JavaScript bundle for the *entire* site. Which +means someone loading your frontpage loads far more code than is +necessary. + +Gatsby 1.0 only loads the scripts necessary for the page you're on. As you +navigate around, Gatsby loads the JavaScript needed for each route. + +This means that one page with heavy imports: + +```javascript +import d3 from "d3" +import threejs from "react-threejs" +``` + +...won't affect the performance of the rest of the site. + +This is particularly helpful for teams of people collaborating on a site +with pages with very different technical and business requirements. +Different parts of the site can evolve independently of each other. + +One client I'm working with on Gatsby 1.0 (a stealth startup in San +Francisco) is using Gatsby to build both their marketing site *and* SaaS +app within the *same Gatsby codebase*. + +The marketing pages of their site are built using markdown and React +components along with a modern css-in-js library +[Glamor](https://github.com/threepointone/glamor) for styling. +The SaaS portion uses [Redux](http://redux.js.org/) to communicate with +their Django API. + +The marketing portion of the site loads quickly with minimal JavaScript. +When a potential customer goes to sign-up for the app, there's no +*awkward jump from the marketing website to the web app*—just a simple +page change which seamlessly loads in the needed JavaScript. The *team +is sharing components and styles across the site* without stepping on +each others shoes as they rapidly iterate on features. + +### Plugin and Theme systems + +Wordpress & Jekyll are both great examples of open source communities +with robust theme & plugins ecosystems. + +Themes and plugins help accelerate building as you can build on what +others have done and help collaborate with others on basic building +blocks + +Gatsby 1.0 will be adding plugin and theme support. + +The plugin system will let you hook into lifecycle APIs from events +during the bootstrap and build processes and in the browser. + +There are a [number of official Gatsby plugins](/docs/plugins/) already +built—all distributed as separate NPM packages. It'll be easy to create +your own plugins for internal projects and as open source projects +published on NPM. + +Plugins can: + +* add support for webpack loaders such as Sass, Less +* add drop-in support for lightweight React-compatible frameworks +[Preact](https://preactjs.com/) and [Inferno](https://infernojs.org/) +* add a sitemap or RSS feed +* add [Google Analytics](/docs/packages/gatsby-plugin-google-analytics/) +* ...and many more! + +Plugins also drive the new GraphQL data processing layer. + +The final pieces for theme support are coming soon. Gatsby's theme system +will have some unique properties. You'll be able to add multiple themes +to a site. So you could start a site with a "blog" theme and later add +on a "portfolio" theme. Themes will also be able to *compose* other +themes. So a large organization could have a standard "base" theme and +then individual departments could extend the base theme to meet their +specific requirements. + +Themes (like plugins) will be published on NPM. So soon, starting a new +Gatsby blog will be as simple as: + +```bash +npm install --save gatsby-super-cool-theme +gatsby build --theme gatsby-super-cool-theme +``` + +### GraphQL data layer + +Currently data in Gatsby (like pretty much every static site generator) +is processed then *pushed* into templates to be rendered into HTML. This +is a simple pattern and works great for many use cases. But when you +start working on more complex sites, you really start to miss the +flexibility of building a database-driven site. With a database, all +your data is available to query against in any fashion you'd like. +Whatever bits of data you need to assemble a page, you can *pull* in. +You want to create author pages showing their bio and last 5 posts? It's +just a query away. + +I wanted this same flexibility for Gatsby. So for 1.0, I've built a new +data processing layer which converts your static data files (or any +other data source) into a *GraphQL schema* which you can query against +like a database. + +Every Gatsby page or page template can have a GraphQL query which tells +Gatsby what data is required for that page. The data layer runs the +GraphQL queries during development and at build time and writes out a +JSON file with the result of the query. This JSON file is then injected +into the React component as props. + +Because we know at build-time what data is needed for every page, we can +easily pre-fetch page data meaning even very complex, data-heavy pages +load almost instantly. + +This pattern of *colocating* your queries next to your views is copied +from the [Relay data framework from +Facebook](https://facebook.github.io/relay/). Colocaton makes it easy to +fully understand your views as everything necessary for that view +is fully described there. + +A simple example of how this works in practice. + +Say we had a markdown file that looked like: + +```markdown +--- +title: A sweet post +date: "2017-02-23" +--- + +This is my sweet blog post. **Cool!** +``` + +In our site, we would write a React component which acts as a template +for all the blog posts. Included with the component is an exported +`pageQuery`. + +```javascript +// A simple React component for rendering a blog page. +import React from "react" + +class BlogPostTemplate extends React.Component { + render () { +
+

{this.props.data.markdown.frontmatter.title}

+ {this.props.data.markdown.frontmatter.date} +
+
+ } +} + +export default BlogPostTemplate + +export const pageQuery = ` + query BlogPost($slug: String!) { + markdown(slug: { eq: $slug }) { + // Get the markdown body compiled to HTML. + html + frontmatter { + title + // Transform the date at build time! + date(formatString: "MMM D, YYYY") + } + } + } +` + +``` + +All data parsing and processing is plugin-driven. So in time, any +imaginable data format and source and potential way of processing its +data will be an npm install away. + +So far I've focused on building out the markdown ecosystem. So there are +plugins to [parse markdown](/docs/packages/gatsby-parser-remark/) and +process it in a variety of ways (including [adding syntax highlighting +with PrismJS](/docs/packages/gatsby-typegen-remark-prismjs/) and +[resizing images referenced in markdown +files](/docs/packages/gatsby-typegen-remark-responsive-image/) so +they're mobile ready). I've also added parsers for +[YAML](/docs/packages/gatsby-parser-yaml/), +[JSON](/docs/packages/gatsby-parser-json/), and +[images](/docs/packages/gatsby-parser-sharp/). + +These plugins are easy to write (somewhat similar to webpack loaders) so +I expect to see the list of plugins grow rapidly. + +The GraphQL layer can also connect to external data sources like +databases, APIs, or 3rd party services e.g. the various hosted CMSs such +as [Contentful](https://www.contentful.com/) and +[DataCMS](https://www.datocms.com/). + +## Getting started with Gatsby 1.0 + +Gatsby 1.0 is still in alpha so I don't recommend it yet for +casual use. If you don't mind some growth pains and diving it to fix +bugs and add features, Gatsby 1.0 is mostly feature-complete now and can +be used to build real sites. + +The first beta will be released in the coming weeks along with more +documentation and a getting started tutorial. Subscribe to the [1.0 meta +issue](https://github.com/gatsbyjs/gatsby/issues/419) on Github to get +updates. + +This has been a super fun project to work on. I'm really interested to +hear your reactions and what kind of problems you face that you think +Gatsby will help with. + +If you're interested in contributing, please join the [#gatsby +channel](https://discord.gg/0ZcbPKXt5bVoxkfV) on Discord, check out the +[issues](https://github.com/gatsbyjs/gatsby/issues), and help bikeshed +on names and APIs and other ideas. diff --git a/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/mastered-runaway-train.jpg b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/mastered-runaway-train.jpg new file mode 100644 index 0000000000000..ff2d1cabb16fc Binary files /dev/null and b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/mastered-runaway-train.jpg differ diff --git a/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/runaway-train.jpg b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/runaway-train.jpg new file mode 100644 index 0000000000000..c931d8836ac71 Binary files /dev/null and b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/runaway-train.jpg differ diff --git a/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/ui-and-code.png b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/ui-and-code.png new file mode 100644 index 0000000000000..ba91bea90ad40 Binary files /dev/null and b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/ui-and-code.png differ diff --git a/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/wipeout.jpg b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/wipeout.jpg new file mode 100644 index 0000000000000..d1e42986fcc19 Binary files /dev/null and b/docs/blog/2017-02-21-1-0-progress-update-where-came-from-where-going/wipeout.jpg differ diff --git a/docs/blog/author.yaml b/docs/blog/author.yaml new file mode 100644 index 0000000000000..f6d67d6052ab5 --- /dev/null +++ b/docs/blog/author.yaml @@ -0,0 +1,4 @@ +- id: Kyle Mathews + bio: Founder @ GatsbyJS. Likes tech, reading/writing, founding things. Blogs at bricolage.io. + avatar: avatars/kyle-mathews.jpeg + twitter: "@kylemathews" diff --git a/docs/blog/avatars/kyle-mathews.jpeg b/docs/blog/avatars/kyle-mathews.jpeg new file mode 100644 index 0000000000000..6d544addab06f Binary files /dev/null and b/docs/blog/avatars/kyle-mathews.jpeg differ diff --git a/docs/blog/gatsbygram-case-study/gatsbygram-instagram-repeat-load.png b/docs/blog/gatsbygram-case-study/gatsbygram-instagram-repeat-load.png new file mode 100644 index 0000000000000..876d7c1e6f689 Binary files /dev/null and b/docs/blog/gatsbygram-case-study/gatsbygram-instagram-repeat-load.png differ diff --git a/docs/blog/gatsbygram-case-study/gatsbygram-instagram.png b/docs/blog/gatsbygram-case-study/gatsbygram-instagram.png new file mode 100644 index 0000000000000..ea6ebf076777c Binary files /dev/null and b/docs/blog/gatsbygram-case-study/gatsbygram-instagram.png differ diff --git a/docs/blog/gatsbygram-case-study/gatsbygram-layout.png b/docs/blog/gatsbygram-case-study/gatsbygram-layout.png new file mode 100644 index 0000000000000..53cdadc07340b Binary files /dev/null and b/docs/blog/gatsbygram-case-study/gatsbygram-layout.png differ diff --git a/docs/blog/gatsbygram-case-study/index.md b/docs/blog/gatsbygram-case-study/index.md new file mode 100644 index 0000000000000..db69282820ba0 --- /dev/null +++ b/docs/blog/gatsbygram-case-study/index.md @@ -0,0 +1,599 @@ +--- +title: Gatsbygram Case Study +date: "2017-03-09" +author: "Kyle Mathews" +image: 'ui-and-code.png' +--- + +![Gatsbygram](ui-and-code.png) + +[Gatsbygram](https://gatsbygram.gatsbyjs.org) is a clone of Instagram +built with Gatsby 1.0.0-alpha12 and is being continually updated as we +make our way towards our 1.0 release. + +The [source code for +Gatsbygram](https://github.com/gatsbyjs/gatsby/tree/1.0/examples/gatsbygram) +lives in the Gatsby monorepo. See the instructions at the end for how to +start playing with the code! + +
+ +
+ +## What is Gatsby + +Gatsby is a JavaScript web framework that let's you build fast, +dynamic, mobile-ready websites *without* an advanced degree in +JavaScript wizardry. + +It combines the fast performance of static websites with the powerful +abstractions, tools, and client capabilities of the React.js world. + +### Gatsby is fast + +[Gatsby automatically optimizes your site for the modern +web](/docs/prpl-pattern/). You provide pages and Gatsby stitches them +together so they load as fast as possible. + +As proof of this, Gatsbygram loads *2-3x faster* than the real Instagram site. + +I tested Gatsbygram and Instagram on +[webpagetest.org](https://www.webpagetest.org/) using a simulated 3G +network and a Moto G4 smartphone—a budget Android typical of many +lower-end phones used today. The median [speed +index](https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index) +score for +[Gatsbygram](http://www.webpagetest.org/result/170310_XP_11AS/) was 3151 +vs. 8251 for +[Instagram](http://www.webpagetest.org/result/170310_PC_11AZ/). + +![gatsbygram vs. instagram filmstrip](gatsbygram-instagram.png)*Filmstrip of Gatsbygram (top) +and Instagram (bottom) loading on webpagetest.org* + +The second repeat view is even faster for Gatsbygram as it now loads +from its service worker. It has *pixels on the screen in under a 1/2 +second on a budget Android device*! And for both the initial and repeat +view, Gatsbygram *finishes* loading a full second before Instagram gets +started. + +![gatsbygram vs. instagram filmstrip repeat +load](gatsbygram-instagram-repeat-load.png)*Filmstrip of a repeat view +of Gatsbygram (top) and Instagram (bottom) loading on webpagetest.org* + +The difference in Time to Interactivity (TTI) (measure of how long +before the user can actually interact with the page e.g. click on a +link) between the sites is just as dramatic. Gatsbygram's TTI is 6.1s vs +14.1s for Instagram. + +* [Gatsbygram's webpagetest +results](http://www.webpagetest.org/result/170310_XP_11AS/) +* [Instagram's webpagetest +results](http://www.webpagetest.org/result/170310_PC_11AZ/) + +### Gatsby is built for the next billion internet users + +As [Benedict Evans has +noted](http://ben-evans.com/benedictevans/2015/5/13/the-smartphone-and-the-sun), +the next billion people poised to come online will be using the internet +almost exclusively through smartphones. + +Smartphones with decent specs (as good or better than the Moto G4), a +great browser, but *without* a reliable internet connection. + +Gatsby uses modern web performance ideas (e.g. +[PRPL](https://developers.google.com/web/fundamentals/performance/prpl-pattern/)) +developed by the Google Chrome Developer Relations team and others to +help websites work well on modern browsers with unreliable networks. + +Sites built with Gatsby run as much as possible in the client so +regardless of the network conditions—good, bad, or +nonexistent—things will keep working. + +Many of the top e-commerce websites in areas where people are coming +online for the first time are developing their websites using these +techniques. + +Read Google's case studies on: + +* [Flipkart +(India)](https://developers.google.com/web/showcase/2016/flipkart) +* [Konga +(Nigeria)](https://developers.google.com/web/showcase/2016/konga) +* [Housing.com +(India)](https://developers.google.com/web/showcase/2016/housing) + +### Gatsby is simple + +Modern JavaScript websites are too complex to rely on developers always +configuring things correctly. Gatsby simplifies website development by +extracting configuration out of your site and moving it into the +framework and community plugins. + +You give Gatsby React.js components, data, and styles and Gatsby gives you +back an optimized website. + +Gatsbygram is a completely vanilla Gatsby site. Its optimizations are +from the framework. + +Gatsby includes a full modern JavaScript toolchain +(Babel/webpack/Uglify) with optimized production builds and +an innovative *declarative* asset pipeline. + +For Gatsbygram, Gatsby generates over *1000* image thumbnails for +responsive images without *any* custom scripting by leveraging the +Gatsby image processing plugin +[gatsby-typegen-sharp](/docs/packages/gatsby-typegen-sharp/). + +Stop wasting time and build something! + +## App structure + +All static site generators create a set of files that determine the +routing in your site. Typically, you define the output file structure +(and thus URL structure) of your site by way of the input structure. For +example the input structure: + +``` +my-site/ + index.md + blogs/ + blog1.md +``` + +...would be transformed to: + +``` +my-site/ + index.html + blogs/ + blog1.html +``` + +This is fine at first, but can be limiting. For example, in Gatsbygram, +we have a JSON data blob scraped from an Instagram user profile. From +this we want to generate a page for each image. We couldn't do this with +a typical static site generator, but Gatsby lets you define routes +programmatically through the `createPages` API using any data you have +available. + +Here is how we define pages from our JSON data for Gatsbygram at build time in +the site's [`gatsby-node.js` +file](https://github.com/gatsbyjs/gatsby/blob/1.0/examples/gatsbygram/gatsby-node.js): + +```javascript +const _ = require("lodash") +const Promise = require("bluebird") +const path = require("path") +const slug = require("slug") +const slash = require("slash") + +// Implement the Gatsby API “createPages”. This is +// called after the Gatsby bootstrap is finished so you have +// access to any information necessary to programatically +// create pages. +exports.createPages = ({ graphql, actionCreators }) => { + const { upsertPage } = actionCreators + + return new Promise((resolve, reject) => { + // The “graphql” function allows us to run arbitrary + // queries against this Gatsbygram's graphql schema. Think of + // it like Gatsbygram has a built-in database constructed + // from static data that you can run queries against. + // + // Post is a data node type derived from data/posts.json + // which is created when scrapping Instagram. “allPosts” + // is a "connection" (a GraphQL convention for accessing + // a list of nodes) gives us an easy way to query all + // Post nodes. + graphql( + ` + { + allPosts(limit: 1000) { + edges { + node { + id + } + } + } + } + ` + ).then(result => { + if (result.errors) { + console.log(result.errors) + reject(result.errors) + } + + // Create image post pages. + const postTemplate = path.resolve(`templates/post-page.js`) + // We want to create a detailed page for each + // Instagram post. Since the scrapped Instagram data + // already includes an ID field, we just use that for + // each page's path. + _.each(result.data.allPosts.edges, edge => { + // Gatsby uses Redux to manage its internal state. + // Plugins and sites can use functions like "upsertPage" + // to interact with Gatsby. + upsertPage({ + // Each page is required to have a `path` as well + // as a template component. The `context` is + // optional but is often necessary so the template + // can query data specific to each page. + path: slug(edge.node.id), + component: slash(postTemplate), + context: { + id: edge.node.id, + }, + }) + }) + resolve() + }) + }) +} +``` + +## Using templates + +Gatsby uses standard React.js components to render pages. When you +define a page in the `createPages` API, you specify its component. +Those components, usually called templates, get reused with +page-specific data to generate the different pages. + +As you can see above, when defining a page, we can set "context" data, which is +passed as a `prop` to the component and as a [GraphQL +variable](http://graphql.org/learn/queries/#variables) in our `GraphQL` query. +For the "[post +template](https://github.com/gatsbyjs/gatsby/blob/1.0/examples/gatsbygram/templates/template-post-page.js)", +we pass the id to the post. Below we use that id to query our `GraphQL` schema +and return a fully formed page: + +```jsx +import React from "react" +import PostDetail from "../components/post-detail" + +class PostTemplate extends React.Component { + render() { + return ( + // PostDetail is used for this detail page and + // also in the modal. + + ) + } +} + +export default PostTemplate + +// The post template's GraphQL query. Notice the “id” +// variable which is passed in. We set this on the page +// context in gatsby-node.js. +// +// All GraphQL queries in Gatsby are run at build-time and +// loaded as plain JSON files so have minimal client cost. +export const pageQuery = ` + query PostPage($id: String!) { + # Select the post which equals this id. + posts(id: { eq: $id }) { + # Specify the fields from the post we need. + username + avatar + likes + id + text + # Date fields have special arguments. This one computes + # how many weeks have passed since the post was created. + # All calculations like this (like all GraphQL query + # activity) happens at build-time! So has minimal cost + # for the client. + weeksAgo: time(difference: "weeks") + image { + children { + ... on ImageSharp { + # Here we query for *multiple* image thumbnails to be + # created. So with no effort on our part, 100s of + # thumbnails are created. This makes iterating on + # designs effortless as we simply change the args + # for the query and we get new thumbnails. + big: responsiveSizes(maxWidth: 640) { + src + srcSet + } + } + } + } + } + } +` +``` + +## Creating React.js component pages + +In addition to creating pages for our Instagram photos, we want to make +an index page for browsing all photos. To build this index page, Gatsby +lets us create pages using simple React.js components. + +``` +pages/ + index.js + about.js +``` + +These React component pages can query the Gatsbygram GraphQL schema for +data and are automatically converted into their own pages at +`gatsbygram.gatsbyjs.org/` and `gatsbygram.gatsbyjs.org/about/`. + +Gatsbygram's `about.js` is a simple React component with no query. +`index.js` is more complex. It queries for thumbnails for all images and +has an infinite scroll implementation to lazy load in image thumbnails. + +[Read pages/index.js on +Github](https://github.com/gatsbyjs/gatsby/blob/1.0/examples/gatsbygram/pages/index.js) +[Read pages/about.js on +Github](https://github.com/gatsbyjs/gatsby/blob/1.0/examples/gatsbygram/pages/about.js) + +## The Layout Component + +Each Gatsby site has a top-level layout component at +`layouts/default.js`. This layout component is used on every page of +your site so can contain things like your header, footer, and default +page structure. It is also used as the "[app +shell](https://developers.google.com/web/updates/2015/11/app-shell)" +when loading your site from a service worker. + +A simple layout component might look something like this. + +```jsx +import React from "react" +import Link from "gatsby-link" + +class Layout extends React.Component { + render () { + return ( +
+ + Home + +
+ {/* Render children pages */} + {this.props.children} +
+ ) + } +} + +export default Layout +``` + +Every page will be rendered as children of the `Layout` component: +```jsx + + + +``` + +Gatsbygram's layout component is somewhat more complicated than most +sites as it has logic to show clicked images in either a modal on larger +screens or on their own page on smaller screens. + +[Read Gatsbygram's Layout component on +Github](https://github.com/gatsbyjs/gatsby/blob/1.0/examples/gatsbygram/layouts/default.js). + +## Client routing and pre-caching + +Gatsby loads first a static server-rendered HTML page and then the +JavasScript to convert the site into a web application. Which means that +clicking around the site doesn't require a page reload. Gatsby +*pre-caches* code and data needed for other pages so that clicking on a +link loads the next page instantly. + +All the setup for this is handled behind the scenes. Gatsby uses [React +Router](https://github.com/ReactTraining/react-router) under the hood +but generates all the configuration for you. + +Normally page resources are pre-cached with a service worker. But as +several browsers (Safari/Microsoft Edge) still don't support Service +Workers, the [Gatsby `` component](/docs/packages/gatsby-link/) +pre-caches resources for pages it links to by loading them into memory. + +## Plugins + +Gatsby has always had a rich set of lifecycle APIs to allow you to hook +into various events during development, building, and in the client. + +Gatsby 1.0 adds new APIs and also adds a [new plugin +architecture](/docs/plugins/). So functionality can now be extracted from sites +and made reusable. Most of the new functionality in Gatsby 1.0 is +powered by plugins. + +Plugins are added to a site in its `gatsby-config.js`. Here's what +Gatsbygram's config file looks like: + +```javascript +module.exports = { + siteMetadata: { + title: `Gatsbygram`, + }, + plugins: [ + /* + * Gatsby's data processing layer begins with “source” + * plugins. You can source data nodes from anywhere but + * most sites, like Gatsbygram, will include data from + * the filesystem so we start here with + * “gatsby-source-filesystem”. + * + * A site can have as many instances of + * gatsby-source-filesystem as you need. Each plugin + * instance is configured with a root path where it then + * recursively reads in files and adds them to the data + * tree. + */ + { + resolve: `gatsby-source-filesystem`, + options: { + name: `data`, + path: `${__dirname}/data`, + }, + }, + // This plugin exposes helper functions for processing + // images with the NPM package “sharp”. It's used by + // several other plugins. + `gatsby-plugin-sharp`, + // This plugin identifies file nodes that are images and + // transforms these to create new “ImageSharp” nodes. + `gatsby-transformer-sharp`, + // This plugin transforms JSON file nodes. + `gatsby-transformer-json`, + `gatsby-typegen-filesystem`, + // This plugin adds GraphQL fields to the ImageSharp + // GraphQL type. With them you can resize images and + // generate sets of responsive images. + `gatsby-typegen-sharp`, + // This plugin sets up the popular css-in-js library + // Glamor. It handles adding a Babel plugin and webpack + // configuration as well as setting up optimized server + // rendering and client re-hydration. + `gatsby-plugin-glamor`, + // This plugin takes your configuration and generates a + // web manifest file so Gatsbygram can be added to your + // homescreen on Android. + { + resolve: `gatsby-plugin-manifest`, + options: { + name: `Gatsbygram`, + short_name: `Gatsbygram`, + start_url: `/`, + background_color: `#f7f7f7`, + theme_color: `#191919`, + display: `minimal-ui`, + }, + }, + // This plugin generates a service worker and AppShell + // html file so the site works offline and is otherwise + // resistant to bad networks. Works with almost any + // site! + `gatsby-plugin-offline`, + // This plugin sets up Google Analytics for you. + { + resolve: `gatsby-plugin-google-analytics`, + options: { + trackingId: `UA-91652198-1`, + }, + }, + ], +} +``` + +## Styles + +Gatsbygram uses two popular and complementary css-in-js libraries, +[Typography.js](https://github.com/KyleAMathews/typography.js) and +[Glamor](https://github.com/threepointone/glamor). + +Typography.js is a powerful toolkit for building websites with beautiful +design. + +Gatsbygram uses Typography.js to generate the *global* styles for the +site helping set the overall feel of the design. + +Glamor lets you write *real CSS* in JavaScript inline in your React.js +components. It is used for *component* styles. + +Typography.js exposes two helper JavaScript functions, `rhythm` and +`scale` to help keep your design in sync as you make changes. Instead of +using hard-coded spacing values (which break as soon as you change your +global theme), you use the Typography.js helper functions e.g. + +```jsx +import React from "react"; +import { rhythm, scale } from "../utils/typography"; + +class SampleComponent extends React { + render () { + return ( +
+

+ My sweet title +

+

Hello friends

+
+ ) + } +} +``` + +Together they allow you to quickly iterate on designs. + +They also contribute to Gatsbygram's excellent loading speed. The holy +grail of CSS performance is *inlined critical CSS*. Meaning a) only ship +a page with the CSS necessary to render that page and b) inline it in +the `` instead of putting it in a separate file. There are various +tools to make this happen but they tend to involve extensive +configuration and heavy post-processing. + +But with Typography.js and Glamor you get optimized CSS with no +tedious, error-prone bookkeeping. Typography.js (by definition) +generates only global styles so its styles are included on every page. +Glamor includes some [clever server-rendering +optimizations](https://github.com/threepointone/glamor/blob/master/docs/server.md) +which I've implemented in the [Gatsby Glamor +plugin](/docs/packages/gatsby-plugin-glamor/) where it automatically +extracts out the CSS used *in components on the page being server +rendered* and automatically inlines those styles in the generated HTML +page. + +Super fast CSS by default. 👏👏👏 + +## Creating your own Gatsbygram + +It's easy to create your own "Gatsbygram" site from an Instagram +account. + +### Instructions on setting up your own Gatsbygram site. + +```bash +# Clone the Gatsby repo. +git clone -b 1.0 git@github.com:gatsbyjs/gatsby.git +cd gatsby/examples/gatsbygram +npm install + +# Remove the committed scrapped Instagram data +rm -r data + +# Scrape a new account +node scrape.js INSTAGRAM_USERNAME + +# Wait for pictures to download... + +# Start the Gatsby development server. The initial +# run will take extra time as it processes +# images the first time. +gatsby develop +``` + +While writing this post I scrapped a few accounts and published their +resulting "Gatsbygram" sites: + +* https://iceland-gatsbygram.netlify.com +* https://tinyhouses-gatsbygram.netlify.com + +*With thanks to Sam Bhagwatt, Sunil Pai, Nolan Lawson, Nik Graf, +Jeff Posnick, and Addy Osmani for their reviews.* + +*And a special thanks to Kristo Jorgenson for his [refactor of the “App +structure” section](https://github.com/gatsbyjs/gatsby/pull/708).* diff --git a/docs/blog/gatsbygram-case-study/index.md.bak b/docs/blog/gatsbygram-case-study/index.md.bak new file mode 100644 index 0000000000000..d9998fa5b755a --- /dev/null +++ b/docs/blog/gatsbygram-case-study/index.md.bak @@ -0,0 +1,574 @@ +--- +title: Gatsbygram Case Study +date: "2017-03-08" +author: "Kyle Mathews" +image: 'ui-and-code.png' +--- + +![Gatsbygram](ui-and-code.png) + +[Gatsbygram](https://gatsbygram.gatsbyjs.org) is a clone of Instagram +built with Gatsby 1.0.0-alpha12 and is being continually updated as we +make our way towards our 1.0 release. + +The [source code for +Gatsbygram](https://github.com/gatsbyjs/gatsby/tree/1.0/examples/gatsbygram) +lives in the Gatsby monorepo. See the instructions at the end for how to +start playing with the code! + +
+ +
+ +## What is Gatsby + +Gatsby is a JavaScript web framework that let's you build fast, very +dynamic, mobile-ready websites *without* an advanced degree in +JavaScript wizardry. + +It combines the fast performance of static websites with the powerful +abstractions, tools, and client capabilities of the React.js world. + +### Gatsby is fast + +Gatsby automatically optimizes your site for the modern web. You +provide pages and Gatsby stitches them together so they load as fast as +possible. + +As proof of this, Gatsbygram loads *2-3x faster* than the real Instagram site. + +I tested Gatsbygram and Instagram on +[webpagetest.org](https://www.webpagetest.org/) using a simulated 3G +network and a Moto G smartphone—a budget Android released 3.5 +years ago—so typical of many lower-end phones used still today. The +median [speed +index](https://sites.google.com/a/webpagetest.org/docs/using-webpagetest/metrics/speed-index) +score for +[Gatsbygram](http://www.webpagetest.org/result/170307_10_17H0/) was 3128 +vs. 8145 for +[Instagram](http://www.webpagetest.org/result/170307_VS_16JZ/). + +![gatsbygram vs. instagram filmstrip](gatsbygram-instagram.png)*Filmstrip of Gatsbygram (top) +and Instagram (bottom) loading on webpagetest.org* + +The second view is even faster for Gatsbygram as it now loads from its +service worker. It has pixels on the screen in *under a second* on a +budget Android device! And it *finishes* loading a full 1.5 seconds +before Instagram gets started. + +![gatsbygram vs. instagram filmstrip repeat +load](gatsbygram-instagram-repeat-load.png)*Filmstrip of a repeat view +of Gatsbygram (top) and Instagram (bottom) loading on webpagetest.org* + +### Gatsby is built for the next billion internet users + +As [Benedict Evans has +noted](http://ben-evans.com/benedictevans/2015/5/13/the-smartphone-and-the-sun), +the next billion people poised to come online will be using the internet +almost exclusively through smartphones. + +Smartphones with decent specs (as good or better than the Moto G), a +great browser, but *without* a reliable internet connection. + +Gatsby uses [modern web performance +ideas](https://developers.google.com/web/fundamentals/performance/prpl-pattern/) +developed by the Google Chrome Developer Relations team to help +websites work well on modern browsers with unreliable networks. + +Sites built with Gatsby run as much as possible in the client so +regardless of the network conditions—good, bad, or +nonexistent—things will keep working. + +Many of the top e-commerce websites in areas where people are coming +online for the first time are developing their websites using these +techniques. + +Read Google's case studies on: + +* [Flipkart +(India)](https://developers.google.com/web/showcase/2016/flipkart) +* [Konga +(Nigeria)](https://developers.google.com/web/showcase/2016/konga) +* [Housing.com +(India)](https://developers.google.com/web/showcase/2016/housing) + +### Gatsby is simple + +Modern JavaScript websites are too complex to rely on developers always +configuring things correctly. Gatsby simplifies website development by +extracting configuration out of your site moving it into the framework +and community plugins. + +You give Gatsby React.js components, data, and styles and Gatsby gives you +back an optimized website. + +Gatsbygram is a completely vanilla Gatsby site. Its optimizations are +from the framework. + +Gatsby includes a full modern JavaScript toolchain +(Babel/webpack/uglifyjs) with optimized production builds and +an innovative *declarative* asset pipeline. + +For Gatsbygram, Gatsby generates over *1000* image thumbnails for +responsive images without *any* custom scripting. + +Stop wasting time and build something! + +## App structure + +All static site generators create a set of files that determine the +routing in your site. Typically, you define the output file structure +(and thus url structure) of your site by way of the input structure. For +example the input structure: + +``` +my-site/ + index.md + blogs/ + blog1.md +``` + +...would be transformed to: + +``` +my-site/ + index.html + blogs/ + blog1.html +``` + +This is fine at first, but can be limiting. For example, in Gatsbygram, +we have a JSON data blob scraped from an Instagram user profile. From +this we want to generate a page for each image. We couldn't do this with +a typical static site generator, but Gatsby lets you define routes +programatically through the `createPages` api using any data you have +available. + +Here is how we define pages from our JSON data for Gatsbygram at build time: + +```javascript +const _ = require("lodash") +const Promise = require("bluebird") +const path = require("path") +const slug = require("slug") + +// Implement the Gatsby API “createPages”. This is +// called after the Gatsby bootstrap is finished so you have +// access to any information necessary to programatically +// create pages. +exports.createPages = ({ args }) => ( + new Promise((resolve, reject) => { + // The “graphql” function allows us to run arbitrary + // queries against this Gatsbygram's GraphQL schema. Think of + // it like Gatsbygram has a built-in database constructed + // from static data that you can run queries against. + const { graphql } = args + const pages = [] + // Post is a data node type derived from data/posts.json + // which is created when scrapping Instagram. “allPosts” + // is a "connection" (a GraphQL convention for accessing + // a list of nodes) gives us an easy way to query all + // Post nodes. + graphql(` + { + allPosts(limit: 1000) { + edges { + node { + id + } + } + } + } + `) + .then(result => { + if (result.errors) { + console.log(result.errors) + reject(result.errors) + } + + // Create image post pages. + const postTemplate = path.resolve(`pages/template-post-page.js`) + // We want to create a detailed page for each + // Instagram post. Since the scrapped Instagram data + // already includes an ID field, we just use that for + // each page's path. + _.each(result.data.allPosts.edges, (edge) => { + pages.push({ + // Each page is required to have a `path` as well + // as a template component. The `context` is + // optional but is often necessary so the template + // can query data specific to each page. + path: slug(edge.node.id), + component: postTemplate, + context: { + id: edge.node.id, + }, + }) + }) + + resolve(pages) + }) + }) +) +``` + +## Using templates + +Gatsby uses standard React.js components to render pages. When you +define a page in the `createPages` api, you specify its component. +Those components, usually called templates, get reused with +page-specific data to generate the different pages. + +As you can see above, when defining a page, we can set "context" data, +which is passed as a `prop` to the component and as a [GraphQL +variable](http://graphql.org/learn/queries/#variables) in our `GraphQL` +query. For the "postTemplate", we pass the id to the post. Below we use +that id to query our `GraphQL` schema and return a fully formed page: + +```jsx +import React from 'react' +import PostDetail from '../components/post-detail' + +class PostTemplate extends React.Component { + render () { + return ( + // PostDetail is used for this detail page and + // also in the modal. + + ) + } +} + +export default PostTemplate + +// The post template's GraphQL query. Notice the “id” +// variable which is passed in. We set this on the page +// context in gatsby-node.js. +// +// All GraphQL queries in Gatsby are run at build-time and +// loaded as plain JSON files so have no client cost. +export const pageQuery = ` + query PostPage($id: String!) { + # Select the post which equals this id. + posts(id: { eq: $id }) { + # Specify the fields from the post we need. + username + likes + id + text + # Date fields have special arguments. This one computes + # how many weeks have passed since the post was created. + # All calculations like this (like all GraphQL query + # activity) happens at build-time! So has zero cost + # for the client. + weeksAgo: time(difference: "weeks") + image { + children { + ... on ImageSharp { + # Here we query for *multiple* image thumbnails to be + # created. So with no effort on our part, 100s of + # thumbnails are created. This makes iterating on + # designs effortless as we simply change the args + # for the query and we get new thumbnails. + big: responsiveSizes(maxWidth: 640) { + src + srcSet + } + } + } + } + } + } +` +``` + +## Creating one-off pages + +In addition to creating pages for our Instagram photos, we want to make +an index page for browsing all photos. To build this index page, Gatsby +lets us create pages using simple React.js components. + +``` +pages/ + index.js + about.js +``` + +These React component pages can query the Gatsbygram GraphQL schema for +data and are automatically converted into their own pages at +`gatsbygram.gatsbyjs.org/` and `gatsbygram.gatsbyjs.org/about/`. + +Gatsbygram's `about.js` is a simple React component with no query. +`index.js` is more complex. It queries for thumbnails for all images and +has an infinite scroll implementation to lazy load in image thumbnails. + +[Read pages/index.js on +Github](https://github.com/gatsbyjs/gatsby/blob/1.0/examples/gatsbygram/pages/index.js) +[Read pages/about.js on +Github](https://github.com/gatsbyjs/gatsby/blob/1.0/examples/gatsbygram/pages/about.js) + +## The Layout Component + +Each Gatsby site has a top-level layout component at +`layouts/default.js`. This layout component is used on every page of +your site so can contain things like your header, footer, and default +page structure. It is also used as the "[app +shell](https://developers.google.com/web/updates/2015/11/app-shell)" +when loading your site from a service worker. + +A simple layout component might look something like this. + +```jsx +import React from "react" +import Link from "gatsby-link" + +class Layout extends React.Component { + render () { + return ( +
+ + Home + +
+ {/* Render children pages */} + {this.props.children} +
+ ) + } +} + +export default Layout +``` + +Every page will be rendered as children of the `Layout` component: +```jsx + + + +``` + +Gatsbygram's layout component is somewhat more complicated than most +sites as it has logic to show clicked images in either a modal on larger +screens or on their own page on smaller screens. + +[Read Gatsbygram's Layout component on +Github](https://github.com/gatsbyjs/gatsby/blob/1.0/examples/gatsbygram/layouts/default.js). + +## Client routing and pre-caching + +Gatsby loads first a static server-rendered HTML page and then the +JavasScript to convert the site into a web application. Which means that +clicking around the site doesn't require a page reload. Gatsby +*pre-caches* code and data needed for other pages so that clicking on a +link loads the next page instantly. + +All the setup for this is handled behind the scenes. Gatsby uses [React +Router](https://github.com/ReactTraining/react-router) under the hood +but generates all the configuration for you. + +Normally page resources are pre-cached with a service worker. But as +several browsers (Safari/Microsoft Edge) still don't support Service +Workers, the [Gatsby `` component](/docs/packages/gatsby-link/) +pre-caches resources for pages it links to. + +## Plugins + +Gatsby has always had a rich set of lifecycle APIs to allow you to hook +into various events during development, building, and in the client. + +Gatsby 1.0 adds new APIs and also adds a [new plugin +architecture](/docs/plugins/). So functionality can now be extracted from sites +and made reusable. Most of the new functionality in Gatsby 1.0 is +powered by plugins. + +Plugins are added to a site in its `gatsby-config.js`. Here's what +Gatsbygram's config file looks like: + +```javascript +module.exports = { + siteMetadata: { + title: `Gatsbygram`, + }, + plugins: [ + /* + * Gatsby's data processing layer begins with “source” + * plugins. You can source data nodes from anywhere but + * most sites, like Gatsbygram, will include data from + * the filesystem so we start here with + * “gatsby-source-filesystem”. + * + * A site can have as many instances of + * gatsby-source-filesystem as you need. Each plugin + * instance is configured with a root path where it then + * recursively reads in files and adds them to the data + * tree. + */ + { + resolve: `gatsby-source-filesystem`, + options: { + name: `data`, + path: `${__dirname}/data`, + }, + }, + // This plugin exposes helper functions for processing + // images with the NPM package “sharp”. It's used by + // several other plugins. + `gatsby-plugin-sharp`, + // This plugin identifies file nodes that are images and + // extends these to create new "ImageSharp" nodes. + `gatsby-parser-sharp`, + // This plugin parses JSON file nodes. + `gatsby-parser-json`, + `gatsby-typegen-filesystem`, + // This plugin adds GraphQL fields to the ImageSharp + // GraphQL type. With them you can resize images and + // generate sets of responsive images. + `gatsby-typegen-sharp`, + // This plugin sets up the popular css-in-js library + // Glamor. It handles adding a Babel plugin and webpack + // configuration as well as setting up optimized server + // rendering and client rehydration. + `gatsby-plugin-glamor`, + // This plugin takes your configuration and generates a + // web manifest file so Gatsbygram can be added to your + // homescreen on Android. + { + resolve: `gatsby-plugin-manifest`, + options: { + name: `Gatsbygram`, + short_name: `Gatsbygram`, + start_url: `/`, + background_color: `#f7f7f7`, + theme_color: `#191919`, + display: `minimal-ui`, + }, + }, + // This plugin generates a service worker and AppShell + // html file so the site works offline and is otherwise + // resistent to bad networks. Works with almost any + // site! + `gatsby-plugin-offline`, + // This plugin sets up Google Analytics for you. + { + resolve: `gatsby-plugin-google-analytics`, + options: { + trackingId: `UA-91652198-1`, + }, + }, + ], +} +``` + +## Styles + +Gatsbygram uses two popular and complementary css-in-js libraries, +[Typography.js](https://github.com/KyleAMathews/typography.js) and +[Glamor](https://github.com/threepointone/glamor). + +Typography.js is a powerful toolkit for building websites with beautiful +design. + +Gatsbygram uses Typography.js to generate the *global* styles for the +site helping set the overall feel of the design. + +Glamor lets you write *real CSS* in JavaScript inline in your React.js +components. It is used for *component* styles. + +Typography.js exposes two helper javascript functions, `rhythm` and +`scale` to help keep your design in sync as you make changes. Instead of +using hard-coded spacing values (which break as soon as you change your +global theme), you use the Typography.js helper functions e.g. + +```jsx +import React from "react"; +import { rhythm, scale } from "../utils/typography"; + +class SampleComponent extends React { + render () { + return ( +
+

+ My sweet title +

+

Hello friends

+
+ ) + } +} +``` + +Together they allow you to very quickly iterate on designs. + +They also contribute to Gatsbygram's excellent loading speed. The holy +grail of CSS performance is *inlined critical CSS*. Meaning a) only ship +a page with the CSS necessary to render that page and b) inline it in +the `` instead of putting it in a separate file. There are various +tools to make this happen but they tend to involve extensive +configuration and heavy post-processing. + +But with Typography.js and Glamor you get optimized CSS for free with no +tedious, error-prone bookkeeping. Typography.js (by definition) +generates only global styles so its styles are included on every page. +Glamor includes some [very clever server-rendering +optimizations](https://github.com/threepointone/glamor/blob/master/docs/server.md) +which I've implemented in the [Gatsby Glamor +plugin](/docs/packages/gatsby-plugin-glamor/) where it automatically +extracts out the CSS used *in components on the page being server +rendered* and automatically inlines those styles in the generated HTML +page. + +Super fast CSS for free 👏👏👏 + +## Creating your own Gatsbygram + +It's easy to create your own "Gatsbygram" site from an Instagram +account. + +### Instructions on setting up your own Gatsbygram site. + +```bash +# Clone the Gatsby repo. +git clone -b 1.0 git@github.com:gatsbyjs/gatsby.git +cd gatsby/examples/gatsbygram +npm install + +# Remove the committed scrapped Instagram data +rm -r data + +# Scrape a new account +node scrape.js INSTAGRAM_USERNAME + +# Wait for pictures to download... + +# Start the Gatsby development server. The initial +# run will take extra time as it processes +# images the first time. +gatsby develop +``` + +While writing this post I scrapped a few accounts and published their +resulting "Gatsbygram" sites: + +* https://iceland-gatsbygram.netlify.com +* https://tinyhouses-gatsbygram.netlify.com + +**Help wanted:** scrape the user's profile picture and use that instead +of my Gravatar image which is hard-coded atm. diff --git a/docs/blog/gatsbygram-case-study/template-page-screenshot.png b/docs/blog/gatsbygram-case-study/template-page-screenshot.png new file mode 100644 index 0000000000000..ddaf9cded2da9 Binary files /dev/null and b/docs/blog/gatsbygram-case-study/template-page-screenshot.png differ diff --git a/docs/blog/gatsbygram-case-study/ui-and-code.png b/docs/blog/gatsbygram-case-study/ui-and-code.png new file mode 100644 index 0000000000000..ba91bea90ad40 Binary files /dev/null and b/docs/blog/gatsbygram-case-study/ui-and-code.png differ diff --git a/docs/code-of-conduct.md b/docs/code-of-conduct.md new file mode 100644 index 0000000000000..66dc0aad3a40c --- /dev/null +++ b/docs/code-of-conduct.md @@ -0,0 +1,81 @@ +--- +title: Gatsby Contributor Covenant Code of Conduct +--- + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our +project and our community a harassment-free experience for everyone, +regardless of age, body size, disability, ethnicity, gender identity and +expression, level of experience, nationality, personal appearance, race, +religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual +attention or advances +* Trolling, insulting/derogatory comments, and personal or political +attacks +* Public or private harassment +* Publishing others' private information, such as a physical or +electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a +professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of +acceptable behavior and are expected to take appropriate and fair +corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, +or reject comments, commits, code, wiki edits, issues, and other +contributions that are not aligned to this Code of Conduct, or to ban +temporarily or permanently any contributor for other behaviors that they +deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public +spaces when an individual is representing the project or its community. +Examples of representing a project or community include using an +official project e-mail address, posting via an official social media +account, or acting as an appointed representative at an online or +offline event. Representation of a project may be further defined and +clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may +be reported by contacting the project team at +[mathews.kyle@gmail.com](mailto:mathews.kyle@gmail.com). All complaints +will be reviewed and investigated and will result in a response that is +deemed necessary and appropriate to the circumstances. The project team +is obligated to maintain confidentiality with regard to the reporter of +an incident. Further details of specific enforcement policies may be +posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in +good faith may face temporary or permanent repercussions as determined +by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor +Covenant][homepage], version 1.4, available at +[http://contributor-covenant.org/version/1/4][version] + +homepage: http://contributor-covenant.org +version: http://contributor-covenant.org/version/1/4/ diff --git a/docs/community/index.md b/docs/community/index.md new file mode 100644 index 0000000000000..6bdaafbe2c22a --- /dev/null +++ b/docs/community/index.md @@ -0,0 +1,38 @@ +--- +title: Community +--- + +## Gatsby Contributor Covenant Code of Conduct + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our +project and our community a harassment-free experience for everyone, +regardless of age, body size, disability, ethnicity, gender identity and +expression, level of experience, nationality, personal appearance, race, +religion, or sexual identity and orientation. + +[Read full code of conduct](/code-of-conduct/) + +## Gatsby news + +### Twitter + +For the latest news about Gatsby, [follow **@gatsbyjs** on +Twitter](https://twitter.com/gatsbyjs). + +## Where to get support + +### Stack Overflow + +Many members of the community use Stack Overflow to ask questions. Read +through the [existing +questions](http://stackoverflow.com/questions/tagged/gatsbyjs) tagged +with **gatsby** or [ask your +own](http://stackoverflow.com/questions/ask?tags=gatsby)! + +### Reactiflux Chat + +If you need an answer right away, check out the [Reactiflux +Discord](https://discord.gg/0ZcbPKXt5bZjGY5n) #gatsby channnel. There are +usually a number of Gatsby experts there who can help out or point you to +useful resources. diff --git a/docs/docs/add-404-page.md b/docs/docs/add-404-page.md new file mode 100644 index 0000000000000..fa8c998319765 --- /dev/null +++ b/docs/docs/add-404-page.md @@ -0,0 +1,11 @@ +--- +title: "Add 404 Page" +--- + +Adding a 404 page is easy. Simply create a page that matches `/404*`. Most +often you'll just want to create a React component page at `pages/404.js`. + +Gatsby ensures that your 404 page is outputted as `404.html` as many static +hosting platforms default to using this as your 404 error page. If you're +hosting your site another way, you'll need to setup a custom rule to serve +this file for 404 errors. diff --git a/docs/docs/building-with-components.md b/docs/docs/building-with-components.md new file mode 100644 index 0000000000000..6e1d0b7457d6d --- /dev/null +++ b/docs/docs/building-with-components.md @@ -0,0 +1,10 @@ +--- +title: Building with Components +--- + +Rough outline + +* Docs expect basic familiarity with React +* All Gatsby site UI build with React components. +* Concise description of why components amazing model for building sites. +* Perhaps link to other good articles on "Why components are amazing". diff --git a/docs/docs/design-principles.md b/docs/docs/design-principles.md new file mode 100644 index 0000000000000..0739292ec675c --- /dev/null +++ b/docs/docs/design-principles.md @@ -0,0 +1,5 @@ +--- +title: Design Principles +--- + +Coming soon. diff --git a/docs/docs/gatsby-lifecycle-apis.md b/docs/docs/gatsby-lifecycle-apis.md new file mode 100644 index 0000000000000..478f255ac5c2e --- /dev/null +++ b/docs/docs/gatsby-lifecycle-apis.md @@ -0,0 +1,13 @@ +--- +title: Gatsby Lifecycle APIs +--- + +Rough outline + +* Rich set of lifecycle APIs to hook into Gatsby's bootstrap, build, and +client operations. +* Code > convention +* Easy to modularize code into plugins (link to plugin page). +* Plugins are easy to open source and reuse. They're just NPM packages. +Link to list of plugins. +* Link to full reference documentation of all lifecycle APIs. diff --git a/docs/docs/gatsby-on-windows.md b/docs/docs/gatsby-on-windows.md new file mode 100644 index 0000000000000..29c6e3e8cb1a4 --- /dev/null +++ b/docs/docs/gatsby-on-windows.md @@ -0,0 +1,18 @@ +--- +title: Gatsby on windows +--- + +## Setting up your environment for building native Node.js modules. + +Many Gatsby plugins and themes require building native Node.js modules e.g. +[Sharp (a common Gatsby dependency used for image +processing)](/docs/packages/gatsby-plugin-sharp/). To do so, you need a +functional build environment (Python and Visual C++ Build Tools). + +The easy way to setup your build environment on Windows is to install the +[`windows-build-tools`](https://github.com/felixrieseberg/windows-build-tools) +package by runnning `npm install --global windows-build-tools` on an admin +powershell console. On installing this package, it downloads and installs the +Visual C++ Build Tools 2015, provided free of charge by Microsoft. These tools +are required to compile popular native modules. It will also install Python +2.7, configuring your machine and npm appropriately. diff --git a/docs/docs/how-to-contribute.md b/docs/docs/how-to-contribute.md new file mode 120000 index 0000000000000..f939e75f21a8b --- /dev/null +++ b/docs/docs/how-to-contribute.md @@ -0,0 +1 @@ +../../CONTRIBUTING.md \ No newline at end of file diff --git a/docs/docs/images/open-remote-dev-tools.png b/docs/docs/images/open-remote-dev-tools.png new file mode 100644 index 0000000000000..3eac817954d1c Binary files /dev/null and b/docs/docs/images/open-remote-dev-tools.png differ diff --git a/docs/docs/images/remote-dev-settings.png b/docs/docs/images/remote-dev-settings.png new file mode 100644 index 0000000000000..228f61dcda2b9 Binary files /dev/null and b/docs/docs/images/remote-dev-settings.png differ diff --git a/docs/docs/images/running-redux-devtools.png b/docs/docs/images/running-redux-devtools.png new file mode 100644 index 0000000000000..2d2dc30e5f0a9 Binary files /dev/null and b/docs/docs/images/running-redux-devtools.png differ diff --git a/docs/docs/node-interface.md b/docs/docs/node-interface.md new file mode 100644 index 0000000000000..26bd64364d5ad --- /dev/null +++ b/docs/docs/node-interface.md @@ -0,0 +1,5 @@ +--- +title: Node Interface +--- + +Coming soon. diff --git a/docs/docs/path-prefix.md b/docs/docs/path-prefix.md new file mode 100644 index 0000000000000..aeb1d37ff9416 --- /dev/null +++ b/docs/docs/path-prefix.md @@ -0,0 +1,45 @@ +--- +title: Adding a Path Prefix +--- + +Many sites are hosted at something other than the root of their domain. + +E.g. a Gatsby blog could live at `example.com/blog/` or a site could be +hosted on Github pages at `example.github.io/my-gatsby-site/` + +Each of these sites need a prefix added to all paths on the site. So a link +to `/my-sweet-blog-post/` should be rewritten to `/blog/my-sweet-blog-post`. + +In addition links to various resources (JavaScript, images, CSS) need the same +prefix added. + +Luckily, for most sites, this work can be offloaded to Gatsby. Using +[gatsby-link](/docs/packages/gatsby-link/) for internal links ensures those +links will be prefixed correctly. Gatsby ensures that paths created internally +and by webpack are also correctly prefixed. + +## Development + +During development, write paths as if there was no path prefix e.g. for a blog +hosted at `example.com/blog`, don't add `/blog` to your links. The prefix +will be added when you build for deployment. + +## Production build + +There are two steps for building a site with path prefixes. + +First define the prefix in your site's `gatsby-config.js`. + +```javascript +module.exports = { + // Note: it must *not* have a trailing slash. + pathPrefix: `/blog` +} +``` + +### TODOs + +* currently we call this `linkPrefix` as that's what's used in Gatsby 0.x. A breaking change seems +in order as we're using `path` everywhere else. +* Add runtime check that there's a slash at the start and no trailing slash. +* Add tests around this. diff --git a/docs/docs/plugins.md b/docs/docs/plugins.md new file mode 100644 index 0000000000000..b2bbd3a590e18 --- /dev/null +++ b/docs/docs/plugins.md @@ -0,0 +1,46 @@ +--- +title: Plugins +--- + +Rough outline. + +Plugins are modules that implement Gatsby APIs. Easily solve common +website build problems. Pull together open source components. For large +complex builds, modularize customizations into site-specific plugins. + +How to use? + +Export function for browser/node/ssr. Link to lifecycle APIs doc. + +Show several examples of simple plugins (query for them directly — add a +utf8 field to typegen-file to pull in utf8 string of file. This would +mean converting this file into a JS component). + +## Official plugins + +* [gatsby-parser-json](/docs/packages/gatsby-parser-json/) +* [gatsby-parser-remark](/docs/packages/gatsby-parser-remark/) +* [gatsby-parser-sharp](/docs/packages/gatsby-parser-sharp/) +* [gatsby-parser-yaml](/docs/packages/gatsby-parser-yaml/) +* [gatsby-plugin-catch-links](/docs/packages/gatsby-plugin-catch-links/) +* [gatsby-plugin-coffeescript](/docs/packages/gatsby-plugin-coffeescript/) +* [gatsby-plugin-glamor](/docs/packages/gatsby-plugin-glamor/) +* [gatsby-plugin-google-analytics](/docs/packages/gatsby-plugin-google-analytics/) +* [gatsby-plugin-manifest](/docs/packages/gatsby-plugin-manifest/) +* [gatsby-plugin-offline](/docs/packages/gatsby-plugin-offline/) +* [gatsby-plugin-preact](/docs/packages/gatsby-plugin-preact/) +* [gatsby-plugin-sharp](/docs/packages/gatsby-plugin-sharp/) +* [gatsby-plugin-typescript](/docs/packages/gatsby-plugin-typescript/) +* [gatsby-source-filesystem](/docs/packages/gatsby-source-filesystem/) +* [gatsby-typegen-remark](/docs/packages/gatsby-typegen-remark/) +* [gatsby-typegen-remark-autolink-headers](/docs/packages/gatsby-typegen-remark-autolink-headers/) +* [gatsby-typegen-remark-copy-linked-files](/docs/packages/gatsby-typegen-remark-copy-linked-files/) +* [gatsby-typegen-remark-prismjs](/docs/packages/gatsby-typegen-remark-prismjs/) +* [gatsby-typegen-remark-responsive-iframe](/docs/packages/gatsby-typegen-remark-responsive-iframe/) +* [gatsby-typegen-remark-responsive-image](/docs/packages/gatsby-typegen-remark-responsive-image/) +* [gatsby-typegen-remark-smartypants](/docs/packages/gatsby-typegen-remark-smartypants/) +* [gatsby-typegen-sharp](/docs/packages/gatsby-typegen-sharp/) + +## Official components + +* [gatsby-link](/docs/packages/gatsby-link/) diff --git a/docs/docs/prpl-pattern.md b/docs/docs/prpl-pattern.md new file mode 100644 index 0000000000000..61f334b7ef7c9 --- /dev/null +++ b/docs/docs/prpl-pattern.md @@ -0,0 +1,21 @@ +--- +title: PRPL Pattern +--- + +i.e. why Gatsby is really fast. + +https://developers.google.com/web/fundamentals/performance/prpl-pattern/ + +* **Push** critical resources for the initial URL route. +* **Render** initial route. +* **Pre-cache** remaining routes. +* **Lazy-load** and create remaining routes on demand. + +* H/2 push is developing technology — not available on most hosts just +yet. + +TODO fill out how Gatsby implements PRPL. + +This issue from last fall is a good intro for now: + +https://github.com/gatsbyjs/gatsby/issues/431 diff --git a/docs/docs/querying-with-graphql.md b/docs/docs/querying-with-graphql.md new file mode 100644 index 0000000000000..e4b913b538f30 --- /dev/null +++ b/docs/docs/querying-with-graphql.md @@ -0,0 +1,24 @@ +--- +title: Querying with GraphQL +--- + +Rough outline + +* What is GraphQL +* Why GraphQL? As Gatsby runs on both server (at build time) & client, +need way to specify which data is needed. +* Emphasize this is a *build-time only* use of GraphQL. You don't need to run a +GraphQL server in production. Convenient way to describe data +requirements of component. +* Why query colocation rocks. +* Some basic terminology + * Types based on file type + way data can be transformed + * Connections + * Shallow intro to how data layer works e.g. parsers, typegens. + * Compare to Webpack loaders — like loaders except create schema that + can then be queried. +* Example queries showing off sorting, filtering, picking fields, +programmatic transformations +* Link to some doc pages on advanced usages of GraphQL. +* iFrame of graphiql instance for this site running on Heroku so people +can run live queries. diff --git a/docs/docs/themes.md b/docs/docs/themes.md new file mode 100644 index 0000000000000..94e5aacc998b2 --- /dev/null +++ b/docs/docs/themes.md @@ -0,0 +1,24 @@ +--- +title: Themes +--- + +Rough outline + +Themes are collections of plugins with optional additional assets such +as react components, css, and binary files e.g. images. + +Themes are NPM packages. + +A site can have multiple themes. + +Themes can compose other themes. + +User can override theme's default options for plugins. + +All theme assets are "ejectable" e.g. will be copied into the site's +source so you can modify the file directory. + +You'll type something like `gatsby eject gatsby-core-theme` and then be +presented with a list of assets from which you could choose which assets +to eject. A common use case will be, install Gatsby blog theme, decide +to override the blog index page, eject it, tweak the react component. diff --git a/docs/docs/thinking-in-gatsby.md b/docs/docs/thinking-in-gatsby.md new file mode 100644 index 0000000000000..b2b935a012f81 --- /dev/null +++ b/docs/docs/thinking-in-gatsby.md @@ -0,0 +1,5 @@ +--- +title: Thinking in Gatsby +--- + +Coming soon. diff --git a/docs/tutorial/index.md b/docs/tutorial/index.md new file mode 100644 index 0000000000000..696be0a055e35 --- /dev/null +++ b/docs/tutorial/index.md @@ -0,0 +1,5 @@ +--- +title: Tutorial +--- + +Coming soon diff --git a/examples/gatsbygram/.babelrc b/examples/gatsbygram/.babelrc new file mode 100644 index 0000000000000..a8b9b8bbcd312 --- /dev/null +++ b/examples/gatsbygram/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ['react', 'es2015', 'stage-1'], + "plugins": ['add-module-exports'] +} diff --git a/examples/gatsbygram/.gitignore b/examples/gatsbygram/.gitignore new file mode 100644 index 0000000000000..8f5b35a4a9cbc --- /dev/null +++ b/examples/gatsbygram/.gitignore @@ -0,0 +1,3 @@ +public +.cache +node_modules diff --git a/examples/gatsbygram/.nvmrc b/examples/gatsbygram/.nvmrc new file mode 100644 index 0000000000000..73d2f99996d42 --- /dev/null +++ b/examples/gatsbygram/.nvmrc @@ -0,0 +1 @@ +v7.8.0 diff --git a/examples/gatsbygram/README.md b/examples/gatsbygram/README.md new file mode 100644 index 0000000000000..97ba1d3db1140 --- /dev/null +++ b/examples/gatsbygram/README.md @@ -0,0 +1,6 @@ +# Gatsbygram + +https://gatsbygram.gatsbyjs.org/ + +Built with Gatsby 1.0 (Alpha 11) as a demo of Gatsby's new built-in +image processing capabilities. diff --git a/examples/gatsbygram/data/images/2B8CeRM9we.jpg b/examples/gatsbygram/data/images/2B8CeRM9we.jpg new file mode 100644 index 0000000000000..6b71dc6f29ffd Binary files /dev/null and b/examples/gatsbygram/data/images/2B8CeRM9we.jpg differ diff --git a/examples/gatsbygram/data/images/2Mj4uJM995.jpg b/examples/gatsbygram/data/images/2Mj4uJM995.jpg new file mode 100644 index 0000000000000..4d162903d9e5b Binary files /dev/null and b/examples/gatsbygram/data/images/2Mj4uJM995.jpg differ diff --git a/examples/gatsbygram/data/images/3UlOVgM9yz.jpg b/examples/gatsbygram/data/images/3UlOVgM9yz.jpg new file mode 100644 index 0000000000000..4fbf02725c10f Binary files /dev/null and b/examples/gatsbygram/data/images/3UlOVgM9yz.jpg differ diff --git a/examples/gatsbygram/data/images/3lADm0M90E.jpg b/examples/gatsbygram/data/images/3lADm0M90E.jpg new file mode 100644 index 0000000000000..df1d1bbc8f4bb Binary files /dev/null and b/examples/gatsbygram/data/images/3lADm0M90E.jpg differ diff --git a/examples/gatsbygram/data/images/4IjD5ts9ws.jpg b/examples/gatsbygram/data/images/4IjD5ts9ws.jpg new file mode 100644 index 0000000000000..e5e23566a3aac Binary files /dev/null and b/examples/gatsbygram/data/images/4IjD5ts9ws.jpg differ diff --git a/examples/gatsbygram/data/images/4nm0fJs91a.jpg b/examples/gatsbygram/data/images/4nm0fJs91a.jpg new file mode 100644 index 0000000000000..7fe78f7d0e65a Binary files /dev/null and b/examples/gatsbygram/data/images/4nm0fJs91a.jpg differ diff --git a/examples/gatsbygram/data/images/6JCu-jM9yk.jpg b/examples/gatsbygram/data/images/6JCu-jM9yk.jpg new file mode 100644 index 0000000000000..2adee99bf41f1 Binary files /dev/null and b/examples/gatsbygram/data/images/6JCu-jM9yk.jpg differ diff --git a/examples/gatsbygram/data/images/6TtTqhM981.jpg b/examples/gatsbygram/data/images/6TtTqhM981.jpg new file mode 100644 index 0000000000000..ac3078709bdd2 Binary files /dev/null and b/examples/gatsbygram/data/images/6TtTqhM981.jpg differ diff --git a/examples/gatsbygram/data/images/7g4S2QM9_l.jpg b/examples/gatsbygram/data/images/7g4S2QM9_l.jpg new file mode 100644 index 0000000000000..2b8cfa14c9378 Binary files /dev/null and b/examples/gatsbygram/data/images/7g4S2QM9_l.jpg differ diff --git a/examples/gatsbygram/data/images/8HcJ7is90a.jpg b/examples/gatsbygram/data/images/8HcJ7is90a.jpg new file mode 100644 index 0000000000000..a298d357394ea Binary files /dev/null and b/examples/gatsbygram/data/images/8HcJ7is90a.jpg differ diff --git a/examples/gatsbygram/data/images/8rNAoWs9wR.jpg b/examples/gatsbygram/data/images/8rNAoWs9wR.jpg new file mode 100644 index 0000000000000..c44ed8a7436a6 Binary files /dev/null and b/examples/gatsbygram/data/images/8rNAoWs9wR.jpg differ diff --git a/examples/gatsbygram/data/images/BBd11a1s9x3.jpg b/examples/gatsbygram/data/images/BBd11a1s9x3.jpg new file mode 100644 index 0000000000000..0960bae1700f8 Binary files /dev/null and b/examples/gatsbygram/data/images/BBd11a1s9x3.jpg differ diff --git a/examples/gatsbygram/data/images/BCMVNmFM9yJ.jpg b/examples/gatsbygram/data/images/BCMVNmFM9yJ.jpg new file mode 100644 index 0000000000000..9311432469d89 Binary files /dev/null and b/examples/gatsbygram/data/images/BCMVNmFM9yJ.jpg differ diff --git a/examples/gatsbygram/data/images/BEZprQ3s95w.jpg b/examples/gatsbygram/data/images/BEZprQ3s95w.jpg new file mode 100644 index 0000000000000..dc5e10b43e9e2 Binary files /dev/null and b/examples/gatsbygram/data/images/BEZprQ3s95w.jpg differ diff --git a/examples/gatsbygram/data/images/BFur3Jfs94V.jpg b/examples/gatsbygram/data/images/BFur3Jfs94V.jpg new file mode 100644 index 0000000000000..cab161a891991 Binary files /dev/null and b/examples/gatsbygram/data/images/BFur3Jfs94V.jpg differ diff --git a/examples/gatsbygram/data/images/BGiWipNM96D.jpg b/examples/gatsbygram/data/images/BGiWipNM96D.jpg new file mode 100644 index 0000000000000..6f64163e96646 Binary files /dev/null and b/examples/gatsbygram/data/images/BGiWipNM96D.jpg differ diff --git a/examples/gatsbygram/data/images/BKwuIApgkKJ.jpg b/examples/gatsbygram/data/images/BKwuIApgkKJ.jpg new file mode 100644 index 0000000000000..22154a3b579be Binary files /dev/null and b/examples/gatsbygram/data/images/BKwuIApgkKJ.jpg differ diff --git a/examples/gatsbygram/data/images/BLhhsTZlGwd.jpg b/examples/gatsbygram/data/images/BLhhsTZlGwd.jpg new file mode 100644 index 0000000000000..d877645c2c3ae Binary files /dev/null and b/examples/gatsbygram/data/images/BLhhsTZlGwd.jpg differ diff --git a/examples/gatsbygram/data/images/BSEdRj_B8HP.jpg b/examples/gatsbygram/data/images/BSEdRj_B8HP.jpg new file mode 100644 index 0000000000000..5bc7965e0b56d Binary files /dev/null and b/examples/gatsbygram/data/images/BSEdRj_B8HP.jpg differ diff --git a/examples/gatsbygram/data/images/BSWUdcThRa-.jpg b/examples/gatsbygram/data/images/BSWUdcThRa-.jpg new file mode 100644 index 0000000000000..9f91e77c51351 Binary files /dev/null and b/examples/gatsbygram/data/images/BSWUdcThRa-.jpg differ diff --git a/examples/gatsbygram/data/images/BShF_8qhtEv.jpg b/examples/gatsbygram/data/images/BShF_8qhtEv.jpg new file mode 100644 index 0000000000000..4eba527e26199 Binary files /dev/null and b/examples/gatsbygram/data/images/BShF_8qhtEv.jpg differ diff --git a/examples/gatsbygram/data/images/S6F7tDM99M.jpg b/examples/gatsbygram/data/images/S6F7tDM99M.jpg new file mode 100644 index 0000000000000..25e00f50b6449 Binary files /dev/null and b/examples/gatsbygram/data/images/S6F7tDM99M.jpg differ diff --git a/examples/gatsbygram/data/images/SBx5zDM96r.jpg b/examples/gatsbygram/data/images/SBx5zDM96r.jpg new file mode 100644 index 0000000000000..5e29980314c27 Binary files /dev/null and b/examples/gatsbygram/data/images/SBx5zDM96r.jpg differ diff --git a/examples/gatsbygram/data/images/SbHaprs9_K.jpg b/examples/gatsbygram/data/images/SbHaprs9_K.jpg new file mode 100644 index 0000000000000..c033b0cadebdd Binary files /dev/null and b/examples/gatsbygram/data/images/SbHaprs9_K.jpg differ diff --git a/examples/gatsbygram/data/images/T4ygWXs98-.jpg b/examples/gatsbygram/data/images/T4ygWXs98-.jpg new file mode 100644 index 0000000000000..03376e3c4e1df Binary files /dev/null and b/examples/gatsbygram/data/images/T4ygWXs98-.jpg differ diff --git a/examples/gatsbygram/data/images/T4zsrIs9-b.jpg b/examples/gatsbygram/data/images/T4zsrIs9-b.jpg new file mode 100644 index 0000000000000..b73146292d8fa Binary files /dev/null and b/examples/gatsbygram/data/images/T4zsrIs9-b.jpg differ diff --git a/examples/gatsbygram/data/images/TEgqzWs98e.jpg b/examples/gatsbygram/data/images/TEgqzWs98e.jpg new file mode 100644 index 0000000000000..5a28fd4f130a5 Binary files /dev/null and b/examples/gatsbygram/data/images/TEgqzWs98e.jpg differ diff --git a/examples/gatsbygram/data/images/TPga4IM9wF.jpg b/examples/gatsbygram/data/images/TPga4IM9wF.jpg new file mode 100644 index 0000000000000..24dd9ffd38ef8 Binary files /dev/null and b/examples/gatsbygram/data/images/TPga4IM9wF.jpg differ diff --git a/examples/gatsbygram/data/images/TWXrxBM98V.jpg b/examples/gatsbygram/data/images/TWXrxBM98V.jpg new file mode 100644 index 0000000000000..5a77f54fa738e Binary files /dev/null and b/examples/gatsbygram/data/images/TWXrxBM98V.jpg differ diff --git a/examples/gatsbygram/data/images/ToYJj0M92U.jpg b/examples/gatsbygram/data/images/ToYJj0M92U.jpg new file mode 100644 index 0000000000000..5c10e2fc58b2a Binary files /dev/null and b/examples/gatsbygram/data/images/ToYJj0M92U.jpg differ diff --git a/examples/gatsbygram/data/images/Tq2ITZs9x6.jpg b/examples/gatsbygram/data/images/Tq2ITZs9x6.jpg new file mode 100644 index 0000000000000..8f4b39abcf4b4 Binary files /dev/null and b/examples/gatsbygram/data/images/Tq2ITZs9x6.jpg differ diff --git a/examples/gatsbygram/data/images/V7AMWds949.jpg b/examples/gatsbygram/data/images/V7AMWds949.jpg new file mode 100644 index 0000000000000..e82af76db405e Binary files /dev/null and b/examples/gatsbygram/data/images/V7AMWds949.jpg differ diff --git a/examples/gatsbygram/data/images/VlFCais9_U.jpg b/examples/gatsbygram/data/images/VlFCais9_U.jpg new file mode 100644 index 0000000000000..b23c9dc43a827 Binary files /dev/null and b/examples/gatsbygram/data/images/VlFCais9_U.jpg differ diff --git a/examples/gatsbygram/data/images/Vmws0_s9yL.jpg b/examples/gatsbygram/data/images/Vmws0_s9yL.jpg new file mode 100644 index 0000000000000..732c1c683065e Binary files /dev/null and b/examples/gatsbygram/data/images/Vmws0_s9yL.jpg differ diff --git a/examples/gatsbygram/data/images/WBNdvKs9-x.jpg b/examples/gatsbygram/data/images/WBNdvKs9-x.jpg new file mode 100644 index 0000000000000..1697f5179b183 Binary files /dev/null and b/examples/gatsbygram/data/images/WBNdvKs9-x.jpg differ diff --git a/examples/gatsbygram/data/images/WVE_9as9-Z.jpg b/examples/gatsbygram/data/images/WVE_9as9-Z.jpg new file mode 100644 index 0000000000000..a5e5ff2b92877 Binary files /dev/null and b/examples/gatsbygram/data/images/WVE_9as9-Z.jpg differ diff --git a/examples/gatsbygram/data/images/YA47taM9xR.jpg b/examples/gatsbygram/data/images/YA47taM9xR.jpg new file mode 100644 index 0000000000000..49052ad0c95f8 Binary files /dev/null and b/examples/gatsbygram/data/images/YA47taM9xR.jpg differ diff --git a/examples/gatsbygram/data/images/YBJ_8xM91G.jpg b/examples/gatsbygram/data/images/YBJ_8xM91G.jpg new file mode 100644 index 0000000000000..9f1542f0c585d Binary files /dev/null and b/examples/gatsbygram/data/images/YBJ_8xM91G.jpg differ diff --git a/examples/gatsbygram/data/images/YBKLxfs91e.jpg b/examples/gatsbygram/data/images/YBKLxfs91e.jpg new file mode 100644 index 0000000000000..a2f2c2fa45365 Binary files /dev/null and b/examples/gatsbygram/data/images/YBKLxfs91e.jpg differ diff --git a/examples/gatsbygram/data/images/YDPr3BM9yC.jpg b/examples/gatsbygram/data/images/YDPr3BM9yC.jpg new file mode 100644 index 0000000000000..cc9c0555b5c3b Binary files /dev/null and b/examples/gatsbygram/data/images/YDPr3BM9yC.jpg differ diff --git a/examples/gatsbygram/data/images/Z0mVePs9yb.jpg b/examples/gatsbygram/data/images/Z0mVePs9yb.jpg new file mode 100644 index 0000000000000..3d98599635715 Binary files /dev/null and b/examples/gatsbygram/data/images/Z0mVePs9yb.jpg differ diff --git a/examples/gatsbygram/data/images/Zt65eQs96z.jpg b/examples/gatsbygram/data/images/Zt65eQs96z.jpg new file mode 100644 index 0000000000000..88e3fdd2dbff3 Binary files /dev/null and b/examples/gatsbygram/data/images/Zt65eQs96z.jpg differ diff --git a/examples/gatsbygram/data/images/Zt6drmM96I.jpg b/examples/gatsbygram/data/images/Zt6drmM96I.jpg new file mode 100644 index 0000000000000..959ae491aff60 Binary files /dev/null and b/examples/gatsbygram/data/images/Zt6drmM96I.jpg differ diff --git a/examples/gatsbygram/data/images/aWqdbpM99F.jpg b/examples/gatsbygram/data/images/aWqdbpM99F.jpg new file mode 100644 index 0000000000000..4bab2e3f9bf58 Binary files /dev/null and b/examples/gatsbygram/data/images/aWqdbpM99F.jpg differ diff --git a/examples/gatsbygram/data/images/bSOo_Gs98O.jpg b/examples/gatsbygram/data/images/bSOo_Gs98O.jpg new file mode 100644 index 0000000000000..edb4750a4698a Binary files /dev/null and b/examples/gatsbygram/data/images/bSOo_Gs98O.jpg differ diff --git a/examples/gatsbygram/data/images/baIXGhs99Z.jpg b/examples/gatsbygram/data/images/baIXGhs99Z.jpg new file mode 100644 index 0000000000000..d417008e7c143 Binary files /dev/null and b/examples/gatsbygram/data/images/baIXGhs99Z.jpg differ diff --git a/examples/gatsbygram/data/images/cipIL0M9zb.jpg b/examples/gatsbygram/data/images/cipIL0M9zb.jpg new file mode 100644 index 0000000000000..fc61c662427eb Binary files /dev/null and b/examples/gatsbygram/data/images/cipIL0M9zb.jpg differ diff --git a/examples/gatsbygram/data/images/cpKHxyM97Q.jpg b/examples/gatsbygram/data/images/cpKHxyM97Q.jpg new file mode 100644 index 0000000000000..890d9c49de6ba Binary files /dev/null and b/examples/gatsbygram/data/images/cpKHxyM97Q.jpg differ diff --git a/examples/gatsbygram/data/images/dCsmF8s951.jpg b/examples/gatsbygram/data/images/dCsmF8s951.jpg new file mode 100644 index 0000000000000..1eb43b6cff60a Binary files /dev/null and b/examples/gatsbygram/data/images/dCsmF8s951.jpg differ diff --git a/examples/gatsbygram/data/images/dUiIWFM99E.jpg b/examples/gatsbygram/data/images/dUiIWFM99E.jpg new file mode 100644 index 0000000000000..30a89792f0ec8 Binary files /dev/null and b/examples/gatsbygram/data/images/dUiIWFM99E.jpg differ diff --git a/examples/gatsbygram/data/images/dUiblpM990.jpg b/examples/gatsbygram/data/images/dUiblpM990.jpg new file mode 100644 index 0000000000000..678a3e18340b9 Binary files /dev/null and b/examples/gatsbygram/data/images/dUiblpM990.jpg differ diff --git a/examples/gatsbygram/data/images/dUimPbM9-K.jpg b/examples/gatsbygram/data/images/dUimPbM9-K.jpg new file mode 100644 index 0000000000000..7da556d0888b4 Binary files /dev/null and b/examples/gatsbygram/data/images/dUimPbM9-K.jpg differ diff --git a/examples/gatsbygram/data/images/dac9QCs96Z.jpg b/examples/gatsbygram/data/images/dac9QCs96Z.jpg new file mode 100644 index 0000000000000..f56f3c73fa3d6 Binary files /dev/null and b/examples/gatsbygram/data/images/dac9QCs96Z.jpg differ diff --git a/examples/gatsbygram/data/images/daf92Rs9wJ.jpg b/examples/gatsbygram/data/images/daf92Rs9wJ.jpg new file mode 100644 index 0000000000000..fd5b7006810d5 Binary files /dev/null and b/examples/gatsbygram/data/images/daf92Rs9wJ.jpg differ diff --git a/examples/gatsbygram/data/images/gb7GOoM92V.jpg b/examples/gatsbygram/data/images/gb7GOoM92V.jpg new file mode 100644 index 0000000000000..522888a6a63dc Binary files /dev/null and b/examples/gatsbygram/data/images/gb7GOoM92V.jpg differ diff --git a/examples/gatsbygram/data/images/goTReQM95o.jpg b/examples/gatsbygram/data/images/goTReQM95o.jpg new file mode 100644 index 0000000000000..2d3a80ce6034c Binary files /dev/null and b/examples/gatsbygram/data/images/goTReQM95o.jpg differ diff --git a/examples/gatsbygram/data/images/h9ZrIms9y_.jpg b/examples/gatsbygram/data/images/h9ZrIms9y_.jpg new file mode 100644 index 0000000000000..4b486e3dd84c1 Binary files /dev/null and b/examples/gatsbygram/data/images/h9ZrIms9y_.jpg differ diff --git a/examples/gatsbygram/data/images/hG-1k4s9yJ.jpg b/examples/gatsbygram/data/images/hG-1k4s9yJ.jpg new file mode 100644 index 0000000000000..c098f26f8794b Binary files /dev/null and b/examples/gatsbygram/data/images/hG-1k4s9yJ.jpg differ diff --git a/examples/gatsbygram/data/images/hKxaEXs96v.jpg b/examples/gatsbygram/data/images/hKxaEXs96v.jpg new file mode 100644 index 0000000000000..7eee655024860 Binary files /dev/null and b/examples/gatsbygram/data/images/hKxaEXs96v.jpg differ diff --git a/examples/gatsbygram/data/images/hSNJLVs9_0.jpg b/examples/gatsbygram/data/images/hSNJLVs9_0.jpg new file mode 100644 index 0000000000000..cacb29dccc52f Binary files /dev/null and b/examples/gatsbygram/data/images/hSNJLVs9_0.jpg differ diff --git a/examples/gatsbygram/data/images/hd7P_nM98p.jpg b/examples/gatsbygram/data/images/hd7P_nM98p.jpg new file mode 100644 index 0000000000000..1d51e316f8382 Binary files /dev/null and b/examples/gatsbygram/data/images/hd7P_nM98p.jpg differ diff --git a/examples/gatsbygram/data/images/hhkRxns97X.jpg b/examples/gatsbygram/data/images/hhkRxns97X.jpg new file mode 100644 index 0000000000000..3ccc4665f168d Binary files /dev/null and b/examples/gatsbygram/data/images/hhkRxns97X.jpg differ diff --git a/examples/gatsbygram/data/images/htQkA2M9_x.jpg b/examples/gatsbygram/data/images/htQkA2M9_x.jpg new file mode 100644 index 0000000000000..73d059d055bd9 Binary files /dev/null and b/examples/gatsbygram/data/images/htQkA2M9_x.jpg differ diff --git a/examples/gatsbygram/data/images/iDVBRjM99x.jpg b/examples/gatsbygram/data/images/iDVBRjM99x.jpg new file mode 100644 index 0000000000000..6b8f78f88859f Binary files /dev/null and b/examples/gatsbygram/data/images/iDVBRjM99x.jpg differ diff --git a/examples/gatsbygram/data/images/iRfNB_M99y.jpg b/examples/gatsbygram/data/images/iRfNB_M99y.jpg new file mode 100644 index 0000000000000..cde85751fa566 Binary files /dev/null and b/examples/gatsbygram/data/images/iRfNB_M99y.jpg differ diff --git a/examples/gatsbygram/data/images/icK7QlM96C.jpg b/examples/gatsbygram/data/images/icK7QlM96C.jpg new file mode 100644 index 0000000000000..3793e8a886969 Binary files /dev/null and b/examples/gatsbygram/data/images/icK7QlM96C.jpg differ diff --git a/examples/gatsbygram/data/images/jID6jzM95N.jpg b/examples/gatsbygram/data/images/jID6jzM95N.jpg new file mode 100644 index 0000000000000..1717e7650629e Binary files /dev/null and b/examples/gatsbygram/data/images/jID6jzM95N.jpg differ diff --git a/examples/gatsbygram/data/images/jKpZA4M90B.jpg b/examples/gatsbygram/data/images/jKpZA4M90B.jpg new file mode 100644 index 0000000000000..be5bff33fa307 Binary files /dev/null and b/examples/gatsbygram/data/images/jKpZA4M90B.jpg differ diff --git a/examples/gatsbygram/data/images/jKzbvCs9_9.jpg b/examples/gatsbygram/data/images/jKzbvCs9_9.jpg new file mode 100644 index 0000000000000..fd61e517ffa88 Binary files /dev/null and b/examples/gatsbygram/data/images/jKzbvCs9_9.jpg differ diff --git a/examples/gatsbygram/data/images/jSZfqEM9-l.jpg b/examples/gatsbygram/data/images/jSZfqEM9-l.jpg new file mode 100644 index 0000000000000..b9500187d5287 Binary files /dev/null and b/examples/gatsbygram/data/images/jSZfqEM9-l.jpg differ diff --git a/examples/gatsbygram/data/images/jU-tlcM9-_.jpg b/examples/gatsbygram/data/images/jU-tlcM9-_.jpg new file mode 100644 index 0000000000000..4b54860693992 Binary files /dev/null and b/examples/gatsbygram/data/images/jU-tlcM9-_.jpg differ diff --git a/examples/gatsbygram/data/images/jh0QmFM9_4.jpg b/examples/gatsbygram/data/images/jh0QmFM9_4.jpg new file mode 100644 index 0000000000000..34e6e1466e3cd Binary files /dev/null and b/examples/gatsbygram/data/images/jh0QmFM9_4.jpg differ diff --git a/examples/gatsbygram/data/images/k7zLTbs9z0.jpg b/examples/gatsbygram/data/images/k7zLTbs9z0.jpg new file mode 100644 index 0000000000000..1fe88992b3948 Binary files /dev/null and b/examples/gatsbygram/data/images/k7zLTbs9z0.jpg differ diff --git a/examples/gatsbygram/data/images/kFThHyM95O.jpg b/examples/gatsbygram/data/images/kFThHyM95O.jpg new file mode 100644 index 0000000000000..ee61428e22edb Binary files /dev/null and b/examples/gatsbygram/data/images/kFThHyM95O.jpg differ diff --git a/examples/gatsbygram/data/images/l3kMPSM92e.jpg b/examples/gatsbygram/data/images/l3kMPSM92e.jpg new file mode 100644 index 0000000000000..9a31bac4347a2 Binary files /dev/null and b/examples/gatsbygram/data/images/l3kMPSM92e.jpg differ diff --git a/examples/gatsbygram/data/images/lYmjeQs9_j.jpg b/examples/gatsbygram/data/images/lYmjeQs9_j.jpg new file mode 100644 index 0000000000000..f864118906128 Binary files /dev/null and b/examples/gatsbygram/data/images/lYmjeQs9_j.jpg differ diff --git a/examples/gatsbygram/data/images/lYnUVSs9wf.jpg b/examples/gatsbygram/data/images/lYnUVSs9wf.jpg new file mode 100644 index 0000000000000..19639f35cd729 Binary files /dev/null and b/examples/gatsbygram/data/images/lYnUVSs9wf.jpg differ diff --git a/examples/gatsbygram/data/images/lYoYWVs9x_.jpg b/examples/gatsbygram/data/images/lYoYWVs9x_.jpg new file mode 100644 index 0000000000000..ea39ab00b46cd Binary files /dev/null and b/examples/gatsbygram/data/images/lYoYWVs9x_.jpg differ diff --git a/examples/gatsbygram/data/images/lutoOTs902.jpg b/examples/gatsbygram/data/images/lutoOTs902.jpg new file mode 100644 index 0000000000000..78a5d34b1647a Binary files /dev/null and b/examples/gatsbygram/data/images/lutoOTs902.jpg differ diff --git a/examples/gatsbygram/data/images/lxaO_8s993.jpg b/examples/gatsbygram/data/images/lxaO_8s993.jpg new file mode 100644 index 0000000000000..60a09f8125c21 Binary files /dev/null and b/examples/gatsbygram/data/images/lxaO_8s993.jpg differ diff --git a/examples/gatsbygram/data/images/mlxMw3M94j.jpg b/examples/gatsbygram/data/images/mlxMw3M94j.jpg new file mode 100644 index 0000000000000..9bfba8d6e1f47 Binary files /dev/null and b/examples/gatsbygram/data/images/mlxMw3M94j.jpg differ diff --git a/examples/gatsbygram/data/images/moglcxM97P.jpg b/examples/gatsbygram/data/images/moglcxM97P.jpg new file mode 100644 index 0000000000000..74bb1a2ce1a59 Binary files /dev/null and b/examples/gatsbygram/data/images/moglcxM97P.jpg differ diff --git a/examples/gatsbygram/data/images/nQtXUns97Y.jpg b/examples/gatsbygram/data/images/nQtXUns97Y.jpg new file mode 100644 index 0000000000000..ed54d47ce375f Binary files /dev/null and b/examples/gatsbygram/data/images/nQtXUns97Y.jpg differ diff --git a/examples/gatsbygram/data/images/nZaKQfM99Z.jpg b/examples/gatsbygram/data/images/nZaKQfM99Z.jpg new file mode 100644 index 0000000000000..80a296d1593b5 Binary files /dev/null and b/examples/gatsbygram/data/images/nZaKQfM99Z.jpg differ diff --git a/examples/gatsbygram/data/images/oFM91Fs9z6.jpg b/examples/gatsbygram/data/images/oFM91Fs9z6.jpg new file mode 100644 index 0000000000000..0683542ce588e Binary files /dev/null and b/examples/gatsbygram/data/images/oFM91Fs9z6.jpg differ diff --git a/examples/gatsbygram/data/images/oJebJyM9z8.jpg b/examples/gatsbygram/data/images/oJebJyM9z8.jpg new file mode 100644 index 0000000000000..ac4d598bd61dd Binary files /dev/null and b/examples/gatsbygram/data/images/oJebJyM9z8.jpg differ diff --git a/examples/gatsbygram/data/images/oqbez7s9_x.jpg b/examples/gatsbygram/data/images/oqbez7s9_x.jpg new file mode 100644 index 0000000000000..c564c587e703a Binary files /dev/null and b/examples/gatsbygram/data/images/oqbez7s9_x.jpg differ diff --git a/examples/gatsbygram/data/images/oqbxsdM9wR.jpg b/examples/gatsbygram/data/images/oqbxsdM9wR.jpg new file mode 100644 index 0000000000000..3f1475aed827e Binary files /dev/null and b/examples/gatsbygram/data/images/oqbxsdM9wR.jpg differ diff --git a/examples/gatsbygram/data/images/oqeqN7s912.jpg b/examples/gatsbygram/data/images/oqeqN7s912.jpg new file mode 100644 index 0000000000000..5c117936a24bc Binary files /dev/null and b/examples/gatsbygram/data/images/oqeqN7s912.jpg differ diff --git a/examples/gatsbygram/data/images/oqvZV5s9z2.jpg b/examples/gatsbygram/data/images/oqvZV5s9z2.jpg new file mode 100644 index 0000000000000..fe35deeba0500 Binary files /dev/null and b/examples/gatsbygram/data/images/oqvZV5s9z2.jpg differ diff --git a/examples/gatsbygram/data/images/orMhzhs97P.jpg b/examples/gatsbygram/data/images/orMhzhs97P.jpg new file mode 100644 index 0000000000000..0e1a7ea5da9b8 Binary files /dev/null and b/examples/gatsbygram/data/images/orMhzhs97P.jpg differ diff --git a/examples/gatsbygram/data/images/orPfaus9xF.jpg b/examples/gatsbygram/data/images/orPfaus9xF.jpg new file mode 100644 index 0000000000000..4e0af9d6ef54d Binary files /dev/null and b/examples/gatsbygram/data/images/orPfaus9xF.jpg differ diff --git a/examples/gatsbygram/data/images/orRtxus906.jpg b/examples/gatsbygram/data/images/orRtxus906.jpg new file mode 100644 index 0000000000000..bceb896a1deaf Binary files /dev/null and b/examples/gatsbygram/data/images/orRtxus906.jpg differ diff --git a/examples/gatsbygram/data/images/ov6A6Xs93f.jpg b/examples/gatsbygram/data/images/ov6A6Xs93f.jpg new file mode 100644 index 0000000000000..982fac547bef4 Binary files /dev/null and b/examples/gatsbygram/data/images/ov6A6Xs93f.jpg differ diff --git a/examples/gatsbygram/data/images/ov6BJ8M93g.jpg b/examples/gatsbygram/data/images/ov6BJ8M93g.jpg new file mode 100644 index 0000000000000..9f925e356e9cb Binary files /dev/null and b/examples/gatsbygram/data/images/ov6BJ8M93g.jpg differ diff --git a/examples/gatsbygram/data/images/ov6Bgps93h.jpg b/examples/gatsbygram/data/images/ov6Bgps93h.jpg new file mode 100644 index 0000000000000..78a3896541c06 Binary files /dev/null and b/examples/gatsbygram/data/images/ov6Bgps93h.jpg differ diff --git a/examples/gatsbygram/data/images/rf52zpM98X.jpg b/examples/gatsbygram/data/images/rf52zpM98X.jpg new file mode 100644 index 0000000000000..e262915c692ed Binary files /dev/null and b/examples/gatsbygram/data/images/rf52zpM98X.jpg differ diff --git a/examples/gatsbygram/data/images/saS0ZtM9x5.jpg b/examples/gatsbygram/data/images/saS0ZtM9x5.jpg new file mode 100644 index 0000000000000..585824c4597ce Binary files /dev/null and b/examples/gatsbygram/data/images/saS0ZtM9x5.jpg differ diff --git a/examples/gatsbygram/data/images/tB0dMts9x9.jpg b/examples/gatsbygram/data/images/tB0dMts9x9.jpg new file mode 100644 index 0000000000000..12f7e7cc01f13 Binary files /dev/null and b/examples/gatsbygram/data/images/tB0dMts9x9.jpg differ diff --git a/examples/gatsbygram/data/images/tB0kS4M9yO.jpg b/examples/gatsbygram/data/images/tB0kS4M9yO.jpg new file mode 100644 index 0000000000000..26f9d1dd3b514 Binary files /dev/null and b/examples/gatsbygram/data/images/tB0kS4M9yO.jpg differ diff --git a/examples/gatsbygram/data/posts.json b/examples/gatsbygram/data/posts.json new file mode 100644 index 0000000000000..e99ed326c08e0 --- /dev/null +++ b/examples/gatsbygram/data/posts.json @@ -0,0 +1,1301 @@ +[ + { + "id": "1486495736706552111_31593318", + "code": "BShF_8qhtEv", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2017-04-05T20:28:42.000Z", + "type": "image", + "likes": 7, + "comment": 0, + "text": "\"EXTRODINARY fresh mustards\". This is where they're at folks", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/17663748_1153852971404500_7070241507587915776_n.jpg", + "image": "images/BShF_8qhtEv.jpg" + }, + { + "id": "1483463111452464830_31593318", + "code": "BSWUdcThRa-", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2017-04-01T16:03:25.000Z", + "type": "image", + "likes": 22, + "comment": 2, + "text": "Third city on my east coast swing. First New Orleans, then DC, and now Philly.", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/c0.135.1080.1080/17662854_1280815928623035_937926441180332032_n.jpg", + "image": "images/BSWUdcThRa-.jpg" + }, + { + "id": "1478435327902728655_31593318", + "code": "BSEdRj_B8HP", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2017-03-25T17:34:06.000Z", + "type": "image", + "likes": 20, + "comment": 1, + "text": "Raining and almost 80 degrees in New Orleans French Quarter", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/c135.0.810.810/17494792_1133907666737199_1768011540662845440_n.jpg", + "image": "images/BSEdRj_B8HP.jpg" + }, + { + "id": "1360516742464695325_31593318", + "code": "BLhhsTZlGwd", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2016-10-14T00:50:56.000Z", + "type": "image", + "likes": 15, + "comment": 0, + "text": "Hey San Francisco ❤️", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/14693758_1766411793613440_7185291805863182336_n.jpg", + "image": "images/BLhhsTZlGwd.jpg" + }, + { + "id": "1346779149175505545_31593318", + "code": "BKwuIApgkKJ", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2016-09-25T01:56:47.000Z", + "type": "image", + "likes": 18, + "comment": 1, + "text": "Timed my run nicely", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/14360137_1696760950649699_2816603071264587776_n.jpg", + "image": "images/BKwuIApgkKJ.jpg" + }, + { + "id": "1270677182602272387_31593318", + "code": "BGiWipNM96D", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2016-06-12T01:55:45.000Z", + "type": "image", + "likes": 26, + "comment": 1, + "text": "Sitting in setting sun on bernal hill equals heaven", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/13398891_954318571333512_2037518487_n.jpg", + "image": "images/BGiWipNM96D.jpg" + }, + { + "id": "1256134251849702933_31593318", + "code": "BFur3Jfs94V", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2016-05-23T00:21:33.000Z", + "type": "image", + "likes": 15, + "comment": 0, + "text": "I built this!", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/13116581_508808719302533_932557327_n.jpg", + "image": "images/BFur3Jfs94V.jpg" + }, + { + "id": "1232199266021400176_31593318", + "code": "BEZprQ3s95w", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2016-04-19T23:47:00.000Z", + "type": "image", + "likes": 16, + "comment": 1, + "text": "Hi Chicago", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/12918518_1607204502935928_1750163314_n.jpg", + "image": "images/BEZprQ3s95w.jpg" + }, + { + "id": "1192421294565743753_31593318", + "code": "BCMVNmFM9yJ", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2016-02-25T02:35:17.000Z", + "type": "image", + "likes": 19, + "comment": 0, + "text": "Fading embers", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/12729578_238604273139219_1437358774_n.jpg", + "image": "images/BCMVNmFM9yJ.jpg" + }, + { + "id": "1179335444856560759_31593318", + "code": "BBd11a1s9x3", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2016-02-07T01:16:02.000Z", + "type": "image", + "likes": 9, + "comment": 0, + "text": "Mt. Sutro", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/12677693_186899455005435_855017645_n.jpg", + "image": "images/BBd11a1s9x3.jpg" + }, + { + "id": "1093024552502680593_31593318", + "code": "8rNAoWs9wR", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2015-10-10T23:11:42.000Z", + "type": "image", + "likes": 8, + "comment": 1, + "text": "Marina SF", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/12139643_879198768830916_1627002305_n.jpg", + "image": "images/8rNAoWs9wR.jpg" + }, + { + "id": "1082958063116475674_31593318", + "code": "8HcJ7is90a", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2015-09-27T01:51:22.000Z", + "type": "image", + "likes": 14, + "comment": 0, + "text": "Twin Peaks SF", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/10576216_693388384130914_1470225115_n.jpg", + "image": "images/8HcJ7is90a.jpg" + }, + { + "id": "1072104297123274725_31593318", + "code": "7g4S2QM9_l", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2015-09-12T02:26:53.000Z", + "type": "image", + "likes": 13, + "comment": 0, + "text": "Sunset SF Sunset", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/11909961_477080385804619_1729162928_n.jpg", + "image": "images/7g4S2QM9_l.jpg" + }, + { + "id": "1050382401524719413_31593318", + "code": "6TtTqhM981", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2015-08-13T03:09:21.000Z", + "type": "image", + "likes": 5, + "comment": 1, + "text": "San Francisco sure is lovely", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/11850254_1706767189554247_167276454_n.jpg", + "image": "images/6TtTqhM981.jpg" + }, + { + "id": "1047380412691897508_31593318", + "code": "6JCu-jM9yk", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2015-08-08T23:44:56.000Z", + "type": "image", + "likes": 6, + "comment": 0, + "text": "Foggy hike", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/11356873_1471238179865005_292092201_n.jpg", + "image": "images/6JCu-jM9yk.jpg" + }, + { + "id": "1019954573251698010_31593318", + "code": "4nm0fJs91a", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2015-07-02T03:34:41.000Z", + "type": "image", + "likes": 10, + "comment": 0, + "text": "Foggy evening run", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/sh0.08/e35/11380117_1465341190444968_380349894_n.jpg", + "image": "images/4nm0fJs91a.jpg" + }, + { + "id": "1011212316101041196_31593318", + "code": "4IjD5ts9ws", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2015-06-20T02:05:23.000Z", + "type": "image", + "likes": 4, + "comment": 0, + "text": "A container food truck!", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11335072_1868600436697712_1490794057_n.jpg", + "image": "images/4IjD5ts9ws.jpg" + }, + { + "id": "1001206739996237060_31593318", + "code": "3lADm0M90E", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2015-06-06T06:46:05.000Z", + "type": "image", + "likes": 9, + "comment": 2, + "text": "National donut day @colonial donuts in Oakland", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11430188_100848140257178_1391253248_n.jpg", + "image": "images/3lADm0M90E.jpg" + }, + { + "id": "996585130438155443_31593318", + "code": "3UlOVgM9yz", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2015-05-30T21:43:47.000Z", + "type": "image", + "likes": 5, + "comment": 0, + "text": "Chilling on the bow", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11381438_1617144825194647_1827846331_n.jpg", + "image": "images/3UlOVgM9yz.jpg" + }, + { + "id": "976313048697659257_31593318", + "code": "2Mj4uJM995", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2015-05-02T22:26:46.000Z", + "type": "image", + "likes": 11, + "comment": 1, + "text": "Stumbled into a first row seat at the Giants game", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11201673_643314849146572_717884664_n.jpg", + "image": "images/2Mj4uJM995.jpg" + }, + { + "id": "973323047219223582_31593318", + "code": "2B8CeRM9we", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2015-04-28T19:26:10.000Z", + "type": "image", + "likes": 9, + "comment": 3, + "text": "Home sweet home", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11191126_1611820855722488_427066186_n.jpg", + "image": "images/2B8CeRM9we.jpg" + }, + { + "id": "811160600493415566_31593318", + "code": "tB0kS4M9yO", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-09-17T01:38:20.000Z", + "type": "image", + "likes": 5, + "comment": 1, + "text": "@lindawatkins has a nice view it turns out", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/923785_298030550384778_1748260542_n.jpg", + "image": "images/tB0kS4M9yO.jpg" + }, + { + "id": "811160112838466685_31593318", + "code": "tB0dMts9x9", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-09-17T01:37:22.000Z", + "type": "image", + "likes": 4, + "comment": 0, + "text": "Post-nap grumpy face", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10706977_294380270767284_1824123800_n.jpg", + "image": "images/tB0dMts9x9.jpg" + }, + { + "id": "800034649663593593_31593318", + "code": "saS0ZtM9x5", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-09-01T17:13:03.000Z", + "type": "image", + "likes": 9, + "comment": 0, + "text": "Mesa Falls, Idaho", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10666270_686048818144270_157152842_n.jpg", + "image": "images/saS0ZtM9x5.jpg" + }, + { + "id": "783599315140730647_31593318", + "code": "rf52zpM98X", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-08-10T00:58:59.000Z", + "type": "image", + "likes": 10, + "comment": 0, + "text": "Marin headlands", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10607937_618465764934873_1365604485_n.jpg", + "image": "images/rf52zpM98X.jpg" + }, + { + "id": "734060454761192929_31593318", + "code": "ov6Bgps93h", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-06-02T16:34:07.000Z", + "type": "image", + "likes": 5, + "comment": 1, + "text": "Packard plant", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10369443_706391792754842_1488217259_n.jpg", + "image": "images/ov6Bgps93h.jpg" + }, + { + "id": "734060430375509472_31593318", + "code": "ov6BJ8M93g", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-06-02T16:34:04.000Z", + "type": "image", + "likes": 0, + "comment": 0, + "text": "Hanging out in Detroit", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/926200_533478630112183_770870098_n.jpg", + "image": "images/ov6BJ8M93g.jpg" + }, + { + "id": "734060413657013727_31593318", + "code": "ov6A6Xs93f", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-06-02T16:34:02.000Z", + "type": "image", + "likes": 2, + "comment": 0, + "text": "Heidelberg project", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10431984_255514737968206_819303614_n.jpg", + "image": "images/ov6A6Xs93f.jpg" + }, + { + "id": "732757276941868346_31593318", + "code": "orRtxus906", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-05-31T21:24:56.000Z", + "type": "image", + "likes": 5, + "comment": 0, + "text": "#sammarrieslaura", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10349344_1494462330766381_2076888008_n.jpg", + "image": "images/orRtxus906.jpg" + }, + { + "id": "732747494080109637_31593318", + "code": "orPfaus9xF", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-05-31T21:05:29.000Z", + "type": "image", + "likes": 3, + "comment": 0, + "text": "#sammarrieslaura", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10401555_685955498137974_1036632050_n.jpg", + "image": "images/orPfaus9xF.jpg" + }, + { + "id": "732734464004972239_31593318", + "code": "orMhzhs97P", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-05-31T20:39:36.000Z", + "type": "image", + "likes": 6, + "comment": 0, + "text": "#sammarrieslaura", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10362260_1492310504316697_181712081_n.jpg", + "image": "images/orMhzhs97P.jpg" + }, + { + "id": "732606339090734326_31593318", + "code": "oqvZV5s9z2", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-05-31T16:25:02.000Z", + "type": "image", + "likes": 5, + "comment": 0, + "text": "#sammarrieslaura", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10358344_658003337606852_1782453008_n.jpg", + "image": "images/oqvZV5s9z2.jpg" + }, + { + "id": "732532731974770038_31593318", + "code": "oqeqN7s912", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-05-31T13:58:48.000Z", + "type": "image", + "likes": 3, + "comment": 0, + "text": "#sammarrieslaura", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/926760_1436717873249933_2076253966_n.jpg", + "image": "images/oqeqN7s912.jpg" + }, + { + "id": "732520051645864977_31593318", + "code": "oqbxsdM9wR", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-05-31T13:33:36.000Z", + "type": "image", + "likes": 4, + "comment": 0, + "text": "#sammarrieslaura", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10358298_398846293587168_846099988_n.jpg", + "image": "images/oqbxsdM9wR.jpg" + }, + { + "id": "732518754003705841_31593318", + "code": "oqbez7s9_x", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-05-31T13:31:01.000Z", + "type": "image", + "likes": 3, + "comment": 0, + "text": "#sammarrieslaura", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/923987_240684122793934_1971044527_n.jpg", + "image": "images/oqbez7s9_x.jpg" + }, + { + "id": "723243022496816380_31593318", + "code": "oJebJyM9z8", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-05-18T18:21:48.000Z", + "type": "image", + "likes": 4, + "comment": 2, + "text": "Church selfie", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10311024_1400448496908952_1429408879_n.jpg", + "image": "images/oJebJyM9z8.jpg" + }, + { + "id": "722040340713037050_31593318", + "code": "oFM91Fs9z6", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-05-17T02:32:17.000Z", + "type": "image", + "likes": 6, + "comment": 0, + "text": "Sun's goin' down", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10349758_698597846853765_308306429_n.jpg", + "image": "images/oFM91Fs9z6.jpg" + }, + { + "id": "709713470394982233_31593318", + "code": "nZaKQfM99Z", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-04-30T02:21:00.000Z", + "type": "image", + "likes": 3, + "comment": 0, + "text": "Walking home", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10311263_1500571720162241_488304399_n.jpg", + "image": "images/nZaKQfM99Z.jpg" + }, + { + "id": "707264656279068376_31593318", + "code": "nQtXUns97Y", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-04-26T17:15:38.000Z", + "type": "image", + "likes": 3, + "comment": 0, + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10311311_269172509930751_401381103_n.jpg", + "image": "images/nQtXUns97Y.jpg" + }, + { + "id": "695949453427990223_31593318", + "code": "moglcxM97P", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-04-11T02:34:21.000Z", + "type": "image", + "likes": 8, + "comment": 0, + "text": "Sunset living up to its foggy reputation", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/914285_232024907001450_989329933_n.jpg", + "image": "images/moglcxM97P.jpg" + }, + { + "id": "695178098877128227_31593318", + "code": "mlxMw3M94j", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-04-10T01:01:48.000Z", + "type": "image", + "likes": 9, + "comment": 0, + "text": "Foggy day #sf #oceanbeach #sutroheights", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/10246211_524667710977688_1539466318_n.jpg", + "image": "images/mlxMw3M94j.jpg" + }, + { + "id": "682173039289556382_31593318", + "code": "l3kMPSM92e", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-03-23T02:23:05.000Z", + "type": "image", + "likes": 9, + "comment": 0, + "text": "#sf #sunset", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11356983_996659560368958_1802776196_n.jpg", + "image": "images/l3kMPSM92e.jpg" + }, + { + "id": "680440398655774583_31593318", + "code": "lxaO_8s993", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-03-20T17:00:38.000Z", + "type": "image", + "likes": 5, + "comment": 2, + "text": "Working @ Harvard Square", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11428164_1624154427831330_53333732_n.jpg", + "image": "images/lxaO_8s993.jpg" + }, + { + "id": "679681270014532918_31593318", + "code": "lutoOTs902", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-03-19T15:52:23.000Z", + "type": "image", + "likes": 5, + "comment": 0, + "text": "At the zoo... or Antarctica", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11326269_936340726413259_1952229238_n.jpg", + "image": "images/lutoOTs902.jpg" + }, + { + "id": "673465739406204031_31593318", + "code": "lYoYWVs9x_", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-03-11T02:03:14.000Z", + "type": "image", + "likes": 7, + "comment": 0, + "text": "Biking home part 3 #sunset #sf", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11325187_848471188533323_2115425970_n.jpg", + "image": "images/lYoYWVs9x_.jpg" + }, + { + "id": "673461065357712415_31593318", + "code": "lYnUVSs9wf", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-03-11T01:53:56.000Z", + "type": "image", + "likes": 4, + "comment": 0, + "text": "Biking home part 2 #sf", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11355064_705393262905534_598512475_n.jpg", + "image": "images/lYnUVSs9wf.jpg" + }, + { + "id": "673457707733475299_31593318", + "code": "lYmjeQs9_j", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-03-11T01:47:16.000Z", + "type": "image", + "likes": 5, + "comment": 0, + "text": "Biking home #sf", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11334479_1440365799601549_1338616584_n.jpg", + "image": "images/lYmjeQs9_j.jpg" + }, + { + "id": "665350447119457524_31593318", + "code": "k7zLTbs9z0", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-02-27T21:19:35.000Z", + "type": "image", + "likes": 3, + "comment": 0, + "text": "Dental office #justacleaning #ihope", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1740870_1440791909490171_933390768_n.jpg", + "image": "images/k7zLTbs9z0.jpg" + }, + { + "id": "650011560209800782_31593318", + "code": "kFThHyM95O", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-02-06T17:23:58.000Z", + "type": "image", + "likes": 7, + "comment": 0, + "text": "Rainy San Francisco", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1169989_1439666386267479_1805701176_n.jpg", + "image": "images/kFThHyM95O.jpg" + }, + { + "id": "640022460883001336_31593318", + "code": "jh0QmFM9_4", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-01-23T22:37:24.000Z", + "type": "image", + "likes": 2, + "comment": 0, + "text": "Pastrami sandwich", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1516553_267682393389152_1988116567_n.jpg", + "image": "images/jh0QmFM9_4.jpg" + }, + { + "id": "636409258827833279_31593318", + "code": "jU-tlcM9-_", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-01-18T22:58:37.000Z", + "type": "image", + "likes": 6, + "comment": 2, + "text": "Spring!", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/927542_1382940688632822_791314040_n.jpg", + "image": "images/jU-tlcM9-_.jpg" + }, + { + "id": "635682624046882725_31593318", + "code": "jSZfqEM9-l", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-01-17T22:54:55.000Z", + "type": "image", + "likes": 7, + "comment": 0, + "text": "San Francisco Market Street", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1599918_671503232900660_321825947_n.jpg", + "image": "images/jSZfqEM9-l.jpg" + }, + { + "id": "633544903908122621_31593318", + "code": "jKzbvCs9_9", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-01-15T00:07:39.000Z", + "type": "image", + "likes": 3, + "comment": 0, + "text": "Looking back at snowshoe prints. #latergram #lehi", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1516230_1415533748685929_1687508360_n.jpg", + "image": "images/jKzbvCs9_9.jpg" + }, + { + "id": "633500736435772673_31593318", + "code": "jKpZA4M90B", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-01-14T22:39:54.000Z", + "type": "image", + "likes": 7, + "comment": 8, + "text": "Purple cauliflower for lunch", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1517107_1396777213909061_1781415780_n.jpg", + "image": "images/jKpZA4M90B.jpg" + }, + { + "id": "632772965954739789_31593318", + "code": "jID6jzM95N", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2014-01-13T22:33:57.000Z", + "type": "image", + "likes": 7, + "comment": 0, + "text": "Startup in SF means lots of bikes. #pantheon", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11352438_848263221895300_847311871_n.jpg", + "image": "images/jID6jzM95N.jpg" + }, + { + "id": "620418901388549762_31593318", + "code": "icK7QlM96C", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-12-27T21:28:38.000Z", + "type": "image", + "likes": 7, + "comment": 0, + "text": "Big Cottonwood. Returning from sledding with the fam", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/924517_609921485721994_568440563_n.jpg", + "image": "images/icK7QlM96C.jpg" + }, + { + "id": "617411858855616370_31593318", + "code": "iRfNB_M99y", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-12-23T17:54:10.000Z", + "type": "image", + "likes": 6, + "comment": 2, + "text": "Riding Amtrak to Utah for Xmas.", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1517156_429536667173077_325353637_n.jpg", + "image": "images/iRfNB_M99y.jpg" + }, + { + "id": "613426420792942449_31593318", + "code": "iDVBRjM99x", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-12-18T05:55:49.000Z", + "type": "image", + "likes": 3, + "comment": 10, + "text": "Late night Caltrain", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1515130_468120576642411_769132317_n.jpg", + "image": "images/iDVBRjM99x.jpg" + }, + { + "id": "611758039731788991_31593318", + "code": "h9ZrIms9y_", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-12-15T22:41:03.000Z", + "type": "image", + "likes": 0, + "comment": 0, + "text": "Had to do it once this season", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1516240_571823206220538_1940906009_n.jpg", + "image": "images/h9ZrIms9y_.jpg" + }, + { + "id": "607214368319594481_31593318", + "code": "htQkA2M9_x", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-12-09T16:13:35.000Z", + "type": "image", + "likes": 2, + "comment": 0, + "text": "Chilly morning at the train station (29)", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1169200_564665890270989_1774286305_n.jpg", + "image": "images/htQkA2M9_x.jpg" + }, + { + "id": "603923376229310167_31593318", + "code": "hhkRxns97X", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-12-05T03:14:58.000Z", + "type": "image", + "likes": 8, + "comment": 2, + "text": "The Sound of Music Sing-A-Long @ Castro Theater SF", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1169082_237261336450291_650902315_n.jpg", + "image": "images/hhkRxns97X.jpg" + }, + { + "id": "602898508977266473_31593318", + "code": "hd7P_nM98p", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-12-03T17:18:44.000Z", + "type": "image", + "likes": 8, + "comment": 4, + "text": "California \"winter\"", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1169297_1429416893941620_574489476_n.jpg", + "image": "images/hd7P_nM98p.jpg" + }, + { + "id": "599599505648902132_31593318", + "code": "hSNJLVs9_0", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-11-29T04:04:12.000Z", + "type": "image", + "likes": 4, + "comment": 2, + "text": "South Provo Utah", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1171720_179135252280992_675162948_n.jpg", + "image": "images/hSNJLVs9_0.jpg" + }, + { + "id": "597507196258082479_31593318", + "code": "hKxaEXs96v", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-11-26T06:47:10.000Z", + "type": "image", + "likes": 6, + "comment": 1, + "text": "Making cranapplesauce", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1389996_372744932872165_779748358_n.jpg", + "image": "images/hKxaEXs96v.jpg" + }, + { + "id": "596440361295142025_31593318", + "code": "hG-1k4s9yJ", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-11-24T19:27:33.000Z", + "type": "image", + "likes": 9, + "comment": 0, + "text": "Hiking above Orem Utah yesterday", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/1169694_662818783763068_581767053_n.jpg", + "image": "images/hG-1k4s9yJ.jpg" + }, + { + "id": "587804514970754664_31593318", + "code": "goTReQM95o", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-11-12T21:29:40.000Z", + "type": "image", + "likes": 5, + "comment": 2, + "text": "1 Market St San Francisco", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/924793_180271615509067_1687415809_n.jpg", + "image": "images/goTReQM95o.jpg" + }, + { + "id": "584320489442499989_31593318", + "code": "gb7GOoM92V", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-11-08T02:07:32.000Z", + "type": "image", + "likes": 1, + "comment": 0, + "text": "Crazy crowded as normal on Caltrain", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/915632_1435901739962475_486322309_n.jpg", + "image": "images/gb7GOoM92V.jpg" + }, + { + "id": "529876495778438153_31593318", + "code": "daf92Rs9wJ", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-08-24T23:17:02.000Z", + "type": "image", + "likes": 3, + "comment": 0, + "text": "Friend bought a durian shake. We had to \"quarantine\" it in the plastic bag as the smell was making us all feel nauseous.", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11378426_466336863534615_1547307167_n.jpg", + "image": "images/daf92Rs9wJ.jpg" + }, + { + "id": "529863260585057945_31593318", + "code": "dac9QCs96Z", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-08-24T22:50:44.000Z", + "type": "image", + "likes": 4, + "comment": 0, + "text": "Alien abduction. Or sunlit patch in a cave.", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11313247_900827439960757_1617982516_n.jpg", + "image": "images/dac9QCs96Z.jpg" + }, + { + "id": "528199217793195914_31593318", + "code": "dUimPbM9-K", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-08-22T15:44:35.000Z", + "type": "image", + "likes": 7, + "comment": 0, + "text": "The Swiss say happy cows are key to their delicious cheese and chocolate", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11274412_962531207101572_1996053268_n.jpg", + "image": "images/dUimPbM9-K.jpg" + }, + { + "id": "528198485736152948_31593318", + "code": "dUiblpM990", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-08-22T15:43:07.000Z", + "type": "image", + "likes": 3, + "comment": 0, + "text": "Lausanne Switzerland #latergram", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11380991_1604775013138554_1975699581_n.jpg", + "image": "images/dUiblpM990.jpg" + }, + { + "id": "528197163355987780_31593318", + "code": "dUiIWFM99E", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-08-22T15:40:30.000Z", + "type": "image", + "likes": 6, + "comment": 0, + "text": "Zurich #latergram", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11287787_659815724150301_2060472739_n.jpg", + "image": "images/dUiIWFM99E.jpg" + }, + { + "id": "523176638502133365_31593318", + "code": "dCsmF8s951", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-08-15T17:25:37.000Z", + "type": "image", + "likes": 9, + "comment": 0, + "text": "Salzburg the beautiful", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11386498_833081943412682_1392111115_n.jpg", + "image": "images/dCsmF8s951.jpg" + }, + { + "id": "515988147267690192_31593318", + "code": "cpKHxyM97Q", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-08-05T19:23:22.000Z", + "type": "image", + "likes": 6, + "comment": 1, + "text": "That's THREE iconic London sites in one picture. I try to be efficient.", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11353113_1607832536141844_2018928172_n.jpg", + "image": "images/cpKHxyM97Q.jpg" + }, + { + "id": "514154189823401179_31593318", + "code": "cipIL0M9zb", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-08-03T06:39:37.000Z", + "type": "image", + "likes": 7, + "comment": 0, + "text": "I guess I didn't look too sketchy", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11311410_752535601559991_1024538760_n.jpg", + "image": "images/cipIL0M9zb.jpg" + }, + { + "id": "493743881078431577_31593318", + "code": "baIXGhs99Z", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-07-06T02:47:59.000Z", + "type": "image", + "likes": 1, + "comment": 0, + "text": "Baseballing", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11355159_1450771905223070_219338865_n.jpg", + "image": "images/baIXGhs99Z.jpg" + }, + { + "id": "491519698525216526_31593318", + "code": "bSOo_Gs98O", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-07-03T01:08:55.000Z", + "type": "image", + "likes": 6, + "comment": 0, + "text": "Trying on some Google Glasses", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11376229_382586481941409_228274495_n.jpg", + "image": "images/bSOo_Gs98O.jpg" + }, + { + "id": "474753551234752325_31593318", + "code": "aWqdbpM99F", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-06-09T21:57:35.000Z", + "type": "image", + "likes": 5, + "comment": 1, + "text": "Listening to @lindawatkins and the Symphony Parnassus", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11381478_752996551464700_2020946164_n.jpg", + "image": "images/aWqdbpM99F.jpg" + }, + { + "id": "465165262878137499_31593318", + "code": "Z0mVePs9yb", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-05-27T16:27:22.000Z", + "type": "image", + "likes": 0, + "comment": 0, + "text": "Reminds me of a certain poem", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11282186_1641815769384247_553838929_n.jpg", + "image": "images/Z0mVePs9yb.jpg" + }, + { + "id": "463285372889325235_31593318", + "code": "Zt65eQs96z", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-05-25T02:12:21.000Z", + "type": "image", + "likes": 3, + "comment": 0, + "text": "Me and the sky", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11312119_471864216296568_947475813_n.jpg", + "image": "images/Zt65eQs96z.jpg" + }, + { + "id": "463283463063330440_31593318", + "code": "Zt6drmM96I", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-05-25T02:08:34.000Z", + "type": "image", + "likes": 2, + "comment": 1, + "text": "Portland the beautiful", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11328545_1612204442382836_321806408_n.jpg", + "image": "images/Zt6drmM96I.jpg" + }, + { + "id": "433258973868842114_31593318", + "code": "YDPr3BM9yC", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-04-13T15:55:16.000Z", + "type": "image", + "likes": 3, + "comment": 0, + "text": "Iconic pizza time", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11274300_839105672792470_1770132230_n.jpg", + "image": "images/YDPr3BM9yC.jpg" + }, + { + "id": "432671828728864094_31593318", + "code": "YBKLxfs91e", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-04-12T20:28:43.000Z", + "type": "image", + "likes": 5, + "comment": 0, + "text": "Beautiful old stone dam", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11282234_634169686719958_1078651290_n.jpg", + "image": "images/YBKLxfs91e.jpg" + }, + { + "id": "432671016199904582_31593318", + "code": "YBJ_8xM91G", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-04-12T20:27:06.000Z", + "type": "image", + "likes": 3, + "comment": 0, + "text": "Crofton dam", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11280076_687001724737222_1069333862_n.jpg", + "image": "images/YBJ_8xM91G.jpg" + }, + { + "id": "432595958039305297_31593318", + "code": "YA47taM9xR", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-04-12T17:57:58.000Z", + "type": "image", + "likes": 3, + "comment": 1, + "text": "Sleepy hollow", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11287874_421990181338785_380715_n.jpg", + "image": "images/YA47taM9xR.jpg" + }, + { + "id": "402249729178853273_31593318", + "code": "WVE_9as9-Z", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-03-01T21:05:26.000Z", + "type": "image", + "likes": 4, + "comment": 0, + "text": "Crazy warm in SF today. Mid-60s", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11251145_1599823240288665_1297228813_n.jpg", + "image": "images/WVE_9as9-Z.jpg" + }, + { + "id": "396657460300210097_31593318", + "code": "WBNdvKs9-x", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-02-22T03:54:35.000Z", + "type": "image", + "likes": 1, + "comment": 0, + "text": "BYU. vs St. Mary's", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11257886_365367033659818_1947115382_n.jpg", + "image": "images/WBNdvKs9-x.jpg" + }, + { + "id": "394910241079418429_31593318", + "code": "V7AMWds949", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-02-19T18:03:10.000Z", + "type": "image", + "likes": 4, + "comment": 1, + "text": "Rainy morning on the train", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11256373_1399701320356390_1861180233_n.jpg", + "image": "images/V7AMWds949.jpg" + }, + { + "id": "389212604606962827_31593318", + "code": "Vmws0_s9yL", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-02-11T21:22:59.000Z", + "type": "image", + "likes": 1, + "comment": 0, + "text": "Lovely spring day in San Francisco", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11252668_1583985011865990_1037189552_n.jpg", + "image": "images/Vmws0_s9yL.jpg" + }, + { + "id": "388739099008425940_31593318", + "code": "VlFCais9_U", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2013-02-11T05:42:13.000Z", + "type": "image", + "likes": 1, + "comment": 2, + "text": "My new wall photo grid", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11230390_712086292250337_1353127328_n.jpg", + "image": "images/VlFCais9_U.jpg" + }, + { + "id": "358263540721901467_31593318", + "code": "T4zsrIs9-b", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2012-12-31T04:32:43.000Z", + "type": "image", + "likes": 4, + "comment": 0, + "text": "A profile in concentration.", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11252415_826604620756892_429311033_n.jpg", + "image": "images/T4zsrIs9-b.jpg" + }, + { + "id": "358258295744749374_31593318", + "code": "T4ygWXs98-", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2012-12-31T04:22:18.000Z", + "type": "image", + "likes": 3, + "comment": 1, + "text": "Game night with ma and sis", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11266018_403557056498323_762755229_n.jpg", + "image": "images/T4ygWXs98-.jpg" + }, + { + "id": "354333585801731194_31593318", + "code": "Tq2ITZs9x6", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2012-12-25T18:24:36.000Z", + "type": "image", + "likes": 2, + "comment": 0, + "text": "A white Christmas!", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11246548_894528543936635_827529874_n.jpg", + "image": "images/Tq2ITZs9x6.jpg" + }, + { + "id": "353638780796919188_31593318", + "code": "ToYJj0M92U", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2012-12-24T19:24:09.000Z", + "type": "image", + "likes": 1, + "comment": 0, + "text": "Snow!", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11243833_924423070955251_1998110268_n.jpg", + "image": "images/ToYJj0M92U.jpg" + }, + { + "id": "348570183808573205_31593318", + "code": "TWXrxBM98V", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2012-12-17T19:33:45.000Z", + "type": "image", + "likes": 7, + "comment": 1, + "text": "Google self-driving car in Palo Alto", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11202518_1580336602226324_173677835_n.jpg", + "image": "images/TWXrxBM98V.jpg" + }, + { + "id": "346638280792726533_31593318", + "code": "TPga4IM9wF", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2012-12-15T03:35:24.000Z", + "type": "image", + "likes": 1, + "comment": 0, + "text": "Oakland LDS temple lit up for Christmas", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11253250_1010655875612100_1362538936_n.jpg", + "image": "images/TPga4IM9wF.jpg" + }, + { + "id": "343543150435098398_31593318", + "code": "TEgqzWs98e", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2012-12-10T21:05:56.000Z", + "type": "image", + "likes": 4, + "comment": 0, + "text": "Reading afternoon on the roof at work.", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11232843_377906735739746_92452298_n.jpg", + "image": "images/TEgqzWs98e.jpg" + }, + { + "id": "340610814873689932_31593318", + "code": "S6F7tDM99M", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2012-12-06T19:59:54.000Z", + "type": "image", + "likes": 0, + "comment": 0, + "text": "Awesome!", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11259663_1452513261708104_734265453_n.jpg", + "image": "images/S6F7tDM99M.jpg" + }, + { + "id": "331891615330459594_31593318", + "code": "SbHaprs9_K", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2012-11-24T19:16:25.000Z", + "type": "image", + "likes": 0, + "comment": 0, + "text": "Utah canyon hiking.", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11236306_957691850920654_1431258098_n.jpg", + "image": "images/SbHaprs9_K.jpg" + }, + { + "id": "324760124251168427_31593318", + "code": "SBx5zDM96r", + "username": "kyle__mathews", + "avatar": "https://scontent-fra3-1.cdninstagram.com/t51.2885-19/11373674_1480574918906897_270256414_a.jpg", + "time": "2012-11-14T23:07:25.000Z", + "type": "image", + "likes": 2, + "comment": 0, + "text": "Nob Hill, San Francisco", + "media": "https://scontent-fra3-1.cdninstagram.com/t51.2885-15/e15/11249605_1586447784964342_439897156_n.jpg", + "image": "images/SBx5zDM96r.jpg" + } +] diff --git a/examples/gatsbygram/gatsby-browser.js b/examples/gatsbygram/gatsby-browser.js new file mode 100644 index 0000000000000..6a5fd30a630c0 --- /dev/null +++ b/examples/gatsbygram/gatsby-browser.js @@ -0,0 +1,11 @@ +const windowWidth = window.innerWidth + +exports.shouldUpdateScroll = args => { + // Scroll position only matters on mobile as on larger screens, we use a + // modal. + if (windowWidth < 750) { + return true + } else { + return false + } +} diff --git a/examples/gatsbygram/gatsby-config.js b/examples/gatsbygram/gatsby-config.js new file mode 100644 index 0000000000000..b46cd83530b57 --- /dev/null +++ b/examples/gatsbygram/gatsby-config.js @@ -0,0 +1,72 @@ +module.exports = { + siteMetadata: { + title: `Gatsbygram`, + }, + plugins: [ + /* + * Gatsby's data processing layer begins with “source” + * plugins. You can source data nodes from anywhere but + * most sites, like Gatsbygram, will include data from + * the filesystem so we start here with + * “gatsby-source-filesystem”. + * + * A site can have as many instances of + * gatsby-source-filesystem as you need. Each plugin + * instance is configured with a root path where it then + * recursively reads in files and adds them to the data + * tree. + */ + { + resolve: `gatsby-source-filesystem`, + options: { + name: `data`, + path: `${__dirname}/data`, + }, + }, + // This plugin exposes helper functions for processing + // images with the NPM package “sharp”. It's used by + // several other plugins. + `gatsby-plugin-sharp`, + // This plugin identifies file nodes that are images and + // transforms these to create new “ImageSharp” nodes. + `gatsby-transformer-sharp`, + // This plugin transforms JSON file nodes. + `gatsby-transformer-json`, + `gatsby-typegen-filesystem`, + // This plugin adds GraphQL fields to the ImageSharp + // GraphQL type. With them you can resize images and + // generate sets of responsive images. + `gatsby-typegen-sharp`, + // This plugin sets up the popular css-in-js library + // Glamor. It handles adding a Babel plugin and webpack + // configuration as well as setting up optimized server + // rendering and client re-hydration. + `gatsby-plugin-glamor`, + // This plugin takes your configuration and generates a + // web manifest file so Gatsbygram can be added to your + // homescreen on Android. + { + resolve: `gatsby-plugin-manifest`, + options: { + name: `Gatsbygram`, + short_name: `Gatsbygram`, + start_url: `/`, + background_color: `#f7f7f7`, + theme_color: `#191919`, + display: `minimal-ui`, + }, + }, + // This plugin generates a service worker and AppShell + // html file so the site works offline and is otherwise + // resistant to bad networks. Works with almost any + // site! + `gatsby-plugin-offline`, + // This plugin sets up Google Analytics for you. + { + resolve: `gatsby-plugin-google-analytics`, + options: { + trackingId: `UA-91652198-1`, + }, + }, + ], +} diff --git a/examples/gatsbygram/gatsby-node.js b/examples/gatsbygram/gatsby-node.js new file mode 100644 index 0000000000000..f876d1e8c972b --- /dev/null +++ b/examples/gatsbygram/gatsby-node.js @@ -0,0 +1,68 @@ +const _ = require("lodash") +const Promise = require("bluebird") +const path = require("path") +const slug = require("slug") +const slash = require("slash") + +// Implement the Gatsby API “createPages”. This is +// called after the Gatsby bootstrap is finished so you have +// access to any information necessary to programatically +// create pages. +exports.createPages = ({ graphql, boundActionCreators }) => { + const { upsertPage } = boundActionCreators + + return new Promise((resolve, reject) => { + // The “graphql” function allows us to run arbitrary + // queries against this Gatsbygram's graphql schema. Think of + // it like Gatsbygram has a built-in database constructed + // from static data that you can run queries against. + // + // Post is a data node type derived from data/posts.json + // which is created when scrapping Instagram. “allPosts” + // is a "connection" (a GraphQL convention for accessing + // a list of nodes) gives us an easy way to query all + // Post nodes. + graphql( + ` + { + allPosts(limit: 1000) { + edges { + node { + id + } + } + } + } + ` + ).then(result => { + if (result.errors) { + console.log(result.errors) + reject(result.errors) + } + + // Create image post pages. + const postTemplate = path.resolve(`src/templates/post-page.js`) + // We want to create a detailed page for each + // Instagram post. Since the scrapped Instagram data + // already includes an ID field, we just use that for + // each page's path. + _.each(result.data.allPosts.edges, edge => { + // Gatsby uses Redux to manage its internal state. + // Plugins and sites can use functions like "upsertPage" + // to interact with Gatsby. + upsertPage({ + // Each page is required to have a `path` as well + // as a template component. The `context` is + // optional but is often necessary so the template + // can query data specific to each page. + path: slug(edge.node.id), + component: slash(postTemplate), + context: { + id: edge.node.id, + }, + }) + }) + resolve() + }) + }) +} diff --git a/examples/gatsbygram/package.json b/examples/gatsbygram/package.json new file mode 100644 index 0000000000000..ad540cb0c1bef --- /dev/null +++ b/examples/gatsbygram/package.json @@ -0,0 +1,46 @@ +{ + "name": "gatsby-example-image-gallery", + "private": true, + "description": "Gatsby example site: image gallery", + "version": "1.0.0", + "author": "Kyle Mathews ", + "dependencies": { + "gatsby": "1.0.0-alpha13", + "gatsby-link": "1.0.0-alpha13", + "gatsby-transformer-json": "1.0.0-alpha13", + "gatsby-transformer-sharp": "1.0.0-alpha13", + "gatsby-plugin-glamor": "1.0.0-alpha13", + "gatsby-plugin-google-analytics": "^1.0.0-alpha13", + "gatsby-plugin-manifest": "1.0.0-alpha13", + "gatsby-plugin-offline": "1.0.0-alpha13", + "gatsby-plugin-sharp": "1.0.0-alpha13", + "gatsby-source-filesystem": "1.0.0-alpha13", + "gatsby-typegen-filesystem": "1.0.0-alpha13", + "gatsby-typegen-sharp": "1.0.0-alpha13", + "instagram-screen-scrape": "^2.0.0", + "lodash": "^4.16.4", + "mkdirp": "^0.5.1", + "mousetrap": "^1.6.0", + "progress": "^1.1.8", + "react-gravatar": "^2.6.1", + "react-icons": "^2.2.3", + "react-modal": "^1.7.6", + "react-typography": "^0.15.0", + "request": "^2.79.0", + "slug": "^0.9.1", + "typeface-space-mono": "^0.0.22", + "typography": "^0.15.0" + }, + "keywords": [ + "gatsby" + ], + "license": "MIT", + "main": "n/a", + "scripts": { + "lint": "./node_modules/.bin/eslint --ext .js,.jsx --ignore-pattern public .", + "test": "echo \"Error: no test specified\" && exit 1", + "develop": "gatsby develop", + "build": "gatsby build", + "deploy": "gatsby build --prefix-links && gh-pages -d public" + } +} diff --git a/examples/gatsbygram/scrape.js b/examples/gatsbygram/scrape.js new file mode 100644 index 0000000000000..3bee6d337780d --- /dev/null +++ b/examples/gatsbygram/scrape.js @@ -0,0 +1,92 @@ +const fs = require("fs") +const request = require("request") +const mkdirp = require("mkdirp") +const ProgressBar = require("progress") +const { get } = require("lodash") +const download = require("./utils/download-file") + +const username = process.argv[2] + +if (!username) { + console.log( + ` +You didn't supply an Instagram username! +Run this command like: + +node scrape.js INSTAGRAM_USERNAME + ` + ) + process.exit() +} + +// Convert timestamp to ISO 8601. +const toISO8601 = timestamp => new Date(timestamp * 1000).toJSON() + +// Create the progress bar +const bar = new ProgressBar( + `Downloading instagram posts [:bar] :current/:total :elapsed secs :percent`, + { + total: 0, + width: 30, + } +) + +// Create the images directory +mkdirp.sync(`./data/images`) + +let posts = [] + +// Write json +const saveJSON = _ => + fs.writeFileSync(`./data/posts.json`, JSON.stringify(posts, "", 2)) + +const getPosts = maxId => { + let url = `https://www.instagram.com/${username}/media` + if (maxId) url += `?max_id=${maxId}` + + request(url, { encoding: `utf8` }, (err, res, body) => { + if (err) console.log(`error: ${err}`) + body = JSON.parse(body) + // Parse posts + let lastId + body.items + .filter(item => item.type === `image`) + .map(item => { + // Parse item to a simple object + return { + id: get(item, `id`), + code: get(item, `code`), + username: get(item, `user.username`), + avatar: get(item, `user.profile_picture`), + time: toISO8601(get(item, `created_time`)), + type: get(item, `type`), + likes: get(item, `likes.count`), + comment: get(item, `comments.count`), + text: get(item, `caption.text`), + media: get(item, `images.standard_resolution.url`, ``).replace( + `/s640x640`, + `` + ), + image: `images/${item.code}.jpg`, + } + }) + .forEach(item => { + if (posts.length >= 100) return + + // Download image locally and update progress bar + bar.total++ + download(item.media, `./data/images/${item.code}.jpg`, _ => bar.tick()) + + // Add item to posts + posts.push(item) + + // Save lastId for next request + lastId = item.id + }) + + if (posts.length < 100 && get(body, `more_available`)) getPosts(lastId) + else saveJSON() + }) +} + +getPosts() diff --git a/examples/gatsbygram/src/components/modal.js b/examples/gatsbygram/src/components/modal.js new file mode 100644 index 0000000000000..9d8b35c7831e2 --- /dev/null +++ b/examples/gatsbygram/src/components/modal.js @@ -0,0 +1,154 @@ +import React from "react" +import Modal from "react-modal" +import browserHistory from "react-router/lib/browserHistory" +import CaretRight from "react-icons/lib/fa/caret-right" +import CaretLeft from "react-icons/lib/fa/caret-left" +import Close from "react-icons/lib/md/close" +import findIndex from "lodash/findIndex" +import mousetrap from "mousetrap" + +import { rhythm, scale } from "../utils/typography" + +class GatsbyGramModal extends React.Component { + componentDidMount() { + mousetrap.bind("left", () => this.previous()) + mousetrap.bind("right", () => this.next()) + mousetrap.bind("spacebar", () => this.next()) + } + + componentWillUnmount() { + mousetrap.unbind("left") + mousetrap.unbind("right") + mousetrap.unbind("spacebar") + } + + findCurrentIndex() { + let index + index = findIndex(this.props.edges, edge => { + return edge.node.id === this.props.location.pathname.split(`/`)[1] + }) + + return index + } + + next(e) { + if (e) { + e.stopPropagation() + } + const currentIndex = this.findCurrentIndex() + if (currentIndex || currentIndex === 0) { + const edges = this.props.edges + let nextPost + // Wrap around if at end. + if (currentIndex + 1 === edges.length) { + nextPost = edges[0] + } else { + nextPost = edges[currentIndex + 1] + } + browserHistory.push(`/${nextPost.node.id}/`) + } + } + + previous(e) { + if (e) { + e.stopPropagation() + } + const currentIndex = this.findCurrentIndex() + if (currentIndex || currentIndex === 0) { + const edges = this.props.edges + let previousPost + // Wrap around if at start. + if (currentIndex === 0) { + previousPost = edges.slice(-1)[0] + } else { + previousPost = edges[currentIndex - 1] + } + browserHistory.push(`/${previousPost.node.id}/`) + } + } + + render() { + return ( + browserHistory.push(`/`)} + style={{ + overlay: { + position: "fixed", + top: 0, + left: 0, + right: 0, + bottom: 0, + backgroundColor: "rgba(0, 0, 0, 0.75)", + }, + content: { + position: "absolute", + border: `none`, + background: `none`, + padding: 0, + top: 0, + bottom: 0, + right: 0, + left: 0, + overflow: "auto", + WebkitOverflowScrolling: "touch", + }, + }} + contentLabel="Modal" + > +
browserHistory.push(`/`)} + css={{ + display: `flex`, + position: `relative`, + height: `100vh`, + }} + > +
+ this.previous(e)} + /> + {this.props.children} + this.next(e)} + /> +
+ browserHistory.push(`/`)} + css={{ + cursor: `pointer`, + color: `rgba(255,255,255,0.8)`, + fontSize: `30px`, + position: `absolute`, + top: rhythm(1 / 4), + right: rhythm(1 / 4), + }} + /> +
+
+ ) + } +} + +export default GatsbyGramModal diff --git a/examples/gatsbygram/src/components/post-detail.js b/examples/gatsbygram/src/components/post-detail.js new file mode 100644 index 0000000000000..3cb84f62628e5 --- /dev/null +++ b/examples/gatsbygram/src/components/post-detail.js @@ -0,0 +1,193 @@ +import React from "react" +import HeartIcon from "react-icons/lib/fa/heart" + +import presets from "../utils/presets" +import typography, { rhythm, scale } from "../utils/typography" + +class PostDetail extends React.Component { + constructor() { + super() + } + + render() { + const { + image, + likes, + id, + username, + weeksAgo, + text, + avatar, + } = this.props.post + const { big } = image.children[0] + + const UserBar = () => ( +
+ {username} +
+ {username} +
+
+ ) + + const PostDetails = () => ( +
+
+ + {likes} likes + + + {weeksAgo}w + +
+
+ {username} {text} +
+
+ ) + + return ( +
e.stopPropagation()} + css={{ + background: `white`, + display: `flex`, + alignItems: `stretch`, + flexDirection: `column`, + width: `100%`, + [presets.Tablet]: { + flexDirection: `row-reverse`, + marginTop: rhythm(1), + }, + }} + > +
+ +
+ +
+
+
+
+ +
+
+
+
+ +
+
+ ) + } +} + +export default PostDetail diff --git a/examples/gatsbygram/src/components/post.js b/examples/gatsbygram/src/components/post.js new file mode 100644 index 0000000000000..74361a33e7733 --- /dev/null +++ b/examples/gatsbygram/src/components/post.js @@ -0,0 +1,117 @@ +import React from "react" +import HeartIcon from "react-icons/lib/fa/heart" +import Link from "gatsby-link" + +import { rhythm, scale } from "../utils/typography" +import presets from "../utils/presets" + +let touched = false + +class Post extends React.Component { + constructor() { + super() + this.state = { + hovering: false, + } + } + + render() { + const { image, likes, id } = this.props.post + const { small } = image.children[0] + return ( + (touched = true)} + onMouseEnter={() => { + if (!touched) { + this.setState({ hovering: true }) + } + }} + onMouseLeave={() => { + if (!touched) { + this.setState({ hovering: false }) + } + }} + css={{ + display: `block`, + backgroundColor: `lightgray`, + flex: `1 0 0%`, + marginRight: rhythm(1 / 8), + width: `100%`, + maxWidth: 290.1, + position: `relative`, + [presets.Tablet]: { + marginRight: rhythm(1), + }, + ":last-child": { + marginRight: 0, + }, + }} + > +
+ +
+
+ {/* overlay */} + {this.state.hovering && +
+ {likes} +
} + + ) + } +} + +export default Post diff --git a/examples/gatsbygram/src/html.js b/examples/gatsbygram/src/html.js new file mode 100644 index 0000000000000..c16b8798e8906 --- /dev/null +++ b/examples/gatsbygram/src/html.js @@ -0,0 +1,71 @@ +import React from "react" +import DocumentTitle from "react-document-title" +import { GoogleFont, TypographyStyle } from "react-typography" + +import typography from "./utils/typography" +import logo from "!file-loader!../static/images/logo.png" + +let stylesStr +if (process.env.NODE_ENV === `production`) { + try { + stylesStr = require("!raw-loader!../public/styles.css") + } catch (e) { + console.log(e) + } +} + +module.exports = React.createClass({ + render() { + const title = DocumentTitle.rewind() + let css + if (process.env.NODE_ENV === `production`) { + css = ( + , + + + + + + + +Futura PT Book Specimen + + + + + + +
+ + + +
+ + +
+ +
+
+
AaBb
+
+
+ +
+
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​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​1​2​3​4​5​6​7​8​9​0​&​.​,​?​!​@​(​)​#​$​%​*​+​-​=​:​;
+
+
+
+ + + + + + + + + + + + + + + + +
10abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
11abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
12abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
13abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
14abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
16abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
18abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
20abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
24abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
30abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
36abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
48abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
60abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
72abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
90abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+ +
+ +
+ + + +
+ + +
+
body
body
body
body
+
+ bodyFutura PT Book +
+
+ bodyArial +
+
+ bodyVerdana +
+
+ bodyGeorgia +
+ + + +
+ + +
+ +
+

10.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

11.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

12.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

13.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+ +
+
+
+

14.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

16.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

18.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+ +
+ +
+ +
+
+

20.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+

24.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+ +
+ +
+ +
+
+

30.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+ +
+ + + +
+
+

10.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

11.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

12.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

13.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+ +
+ +
+
+

14.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

16.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

18.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+ +
+ +
+
+

20.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+

24.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+ +
+ +
+ +
+
+

30.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+ +
+ + + + +
+ +
+ +
+ +
+

Lorem Ipsum Dolor

+

Etiam porta sem malesuada magna mollis euismod

+ + +
+
+
+
+

Donec sed odio dui. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ + +

Pellentesque ornare sem

+ +

Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas faucibus mollis interdum. Donec ullamcorper nulla non metus auctor fringilla. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam id dolor id nibh ultricies vehicula ut id elit.

+ +

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+ +

Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean lacinia bibendum nulla sed consectetur.

+ +

Nullam quis risus eget urna mollis ornare vel eu leo. Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec ullamcorper nulla non metus auctor fringilla.

+ +

Cras mattis consectetur

+ +

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean lacinia bibendum nulla sed consectetur. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Cras mattis consectetur purus sit amet fermentum.

+ +

Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis ornare vel eu leo. Cras mattis consectetur purus sit amet fermentum.

+
+ + +
+ +
+ + + + + + +
+
+
+ +

Language Support

+

The subset of Futura PT Book in this kit supports the following languages:
+ + Albanian, Alsatian, Aragonese, Arapaho, Aromanian, Arrernte, Asturian, Aymara, Azerbaijani (Cyrillic), Bashkir, Basque, Belarusian, Belarusian (Lacinka), Bislama, Bosnian, Breton, Buryat (Cyrillic), Catalan, Cebuano, Chamorro, Cheyenne, Chuvash, Cimbrian, Corsican, Croatian, Cyrillic, Czech, Danish, Demo, Dungan, Dutch, English, Esperanto, Estonian, Evenki (Cyrillic), Faroese, Fijian, Finnish, French, French Creole (Saint Lucia), Frisian, Friulian, Galician, Genoese, German, Gilbertese (Kiribati), Greenlandic, Haitian Creole, Hawaiian, Hiligaynon, Hill Mari, Hmong, Hopi, Hungarian, Ibanag, Iloko (Ilokano), Indonesian, Interglossa (Glosa), Interlingua, Irish (Gaelic), Islandic, Istro-Romanian, Italian, Jèrriais, Kalmyk (Cyrillic), Karachay (Cyrillic), Kashubian, Kazakh (Cyrillic), Khalkha, Khanty, Komi-Permyak, Kurdish (Kurmanji), Kyrgyz (Cyrillic), Ladin, Latin Basic, Latvian, Lithuanian, Lojban, Lombard, Low Saxon, Luxembourgian, Malagasy, Maltese, Manx, Maori, Meadow Mari, Megleno-Romanian, Mohawk, Moldovan, Nahuatl, Nenets, Norfolk/Pitcairnese, Northern Sotho (Pedi), Norwegian, Occitan, Oromo, Ossetian, Pangasinan, Papiamento, Piedmontese, Polish, Portuguese, Potawatomi, Quechua, Rhaeto-Romance, Romanian, Romansh (Rumantsch), Rotokas, Russian, Rusyn, Sami (Lule), Samoan, Sardinian (Sardu), Scots (Gaelic), Serbian (Cyrillic), Seychellois Creole (Seselwa), Shona, Sicilian, Slovak, Slovenian (Slovene), Somali, Southern Ndebele, Southern Sotho (Sesotho), Spanish, Swahili, Swati/Swazi, Swedish, Tagalog (Filipino/Pilipino), Tahitian, Tajik, Tatar (Cyrillic), Tausug, Tetum (Tetun), Tok Pisin, Tongan (Faka-Tonga), Tswana, Turkish, Turkmen, Turkmen (Cyrillic), Turkmen (Latinized), Tuvaluan, Tuvin, ubasic, Udmurt, Ukrainian, Uyghur (Cyrillic), Uyghur (Latinized), Uzbek (Cyrillic), Veps, Volapük, Votic (Cyrillic), Votic (Latinized), Walloon, Warlpiri, Xhosa, Yakut/Sakha, Yapese, Zulu

+

Glyph Chart

+

The subset of Futura PT Book in this kit includes all the glyphs listed below. Unicode entities are included above each glyph to help you insert individual characters into your layout.

+
+ +
+
+ + +
+
+ + +
+ +
+ +
+
+
+

Installing Webfonts

+ +

Webfonts are supported by all major browser platforms but not all in the same way. There are currently four different font formats that must be included in order to target all browsers. This includes TTF, WOFF, EOT and SVG.

+ +

1. Upload your webfonts

+

You must upload your webfont kit to your website. They should be in or near the same directory as your CSS files.

+ +

2. Include the webfont stylesheet

+

A special CSS @font-face declaration helps the various browsers select the appropriate font it needs without causing you a bunch of headaches. Learn more about this syntax by reading the Fontspring blog post about it. The code for it is as follows:

+ + + +@font-face{ + font-family: 'MyWebFont'; + src: url('WebFont.eot'); + src: url('WebFont.eot?#iefix') format('embedded-opentype'), + url('WebFont.woff') format('woff'), + url('WebFont.ttf') format('truetype'), + url('WebFont.svg#webfont') format('svg'); +} + + +

We've already gone ahead and generated the code for you. All you have to do is link to the stylesheet in your HTML, like this:

+ <link rel="stylesheet" href="stylesheet.css" type="text/css" charset="utf-8" /> + +

3. Modify your own stylesheet

+

To take advantage of your new fonts, you must tell your stylesheet to use them. Look at the original @font-face declaration above and find the property called "font-family." The name linked there will be what you use to reference the font. Prepend that webfont name to the font stack in the "font-family" property, inside the selector you want to change. For example:

+p { font-family: 'MyWebFont', Arial, sans-serif; } + +

4. Test

+

Getting webfonts to work cross-browser can be tricky. Use the information in the sidebar to help you if you find that fonts aren't loading in a particular browser.

+
+ + +
+ +
+ +
+ +
+ + diff --git a/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.eot b/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.eot new file mode 100644 index 0000000000000..2590a957ecf1c Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.eot differ diff --git a/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.svg b/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.svg new file mode 100644 index 0000000000000..f141e1a8959d9 --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.svg @@ -0,0 +1,1089 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.ttf b/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.ttf new file mode 100644 index 0000000000000..e92958b4eea90 Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.ttf differ diff --git a/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.woff b/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.woff new file mode 100644 index 0000000000000..0159627f845df Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.woff differ diff --git a/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.woff2 b/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.woff2 new file mode 100644 index 0000000000000..ad77f33878578 Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_book_macroman/ftn45-webfont.woff2 differ diff --git a/www/src/fonts/Webfonts/futurapt_book_macroman/specimen_files/grid_12-825-55-15.css b/www/src/fonts/Webfonts/futurapt_book_macroman/specimen_files/grid_12-825-55-15.css new file mode 100644 index 0000000000000..3d6aef783a908 --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_book_macroman/specimen_files/grid_12-825-55-15.css @@ -0,0 +1,129 @@ +/*Notes about grid: +Columns: 12 +Grid Width: 825px +Column Width: 55px +Gutter Width: 15px +-------------------------------*/ + + + +.section {margin-bottom: 18px; +} +.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;} +.section {*zoom: 1;} + +.section .firstcolumn, +.section .firstcol {margin-left: 0;} + + +/* Border on left hand side of a column. */ +.border { + padding-left: 7px; + margin-left: 7px; + border-left: 1px solid #eee; +} + +/* Border with more whitespace, spans one column. */ +.colborder { + padding-left: 42px; + margin-left: 42px; + border-left: 1px solid #eee; +} + + + +/* The Grid Classes */ +.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12 +{margin-left: 15px;float: left;display: inline; overflow: hidden;} + + +.width1, .grid1, .span-1 {width: 55px;} +.width1_2cols,.grid1_2cols {width: 20px;} +.width1_3cols,.grid1_3cols {width: 8px;} +.width1_4cols,.grid1_4cols {width: 2px;} +.input_width1 {width: 49px;} + +.width2, .grid2, .span-2 {width: 125px;} +.width2_3cols,.grid2_3cols {width: 31px;} +.width2_4cols,.grid2_4cols {width: 20px;} +.input_width2 {width: 119px;} + +.width3, .grid3, .span-3 {width: 195px;} +.width3_2cols,.grid3_2cols {width: 90px;} +.width3_4cols,.grid3_4cols {width: 37px;} +.input_width3 {width: 189px;} + +.width4, .grid4, .span-4 {width: 265px;} +.width4_3cols,.grid4_3cols {width: 78px;} +.input_width4 {width: 259px;} + +.width5, .grid5, .span-5 {width: 335px;} +.width5_2cols,.grid5_2cols {width: 160px;} +.width5_3cols,.grid5_3cols {width: 101px;} +.width5_4cols,.grid5_4cols {width: 72px;} +.input_width5 {width: 329px;} + +.width6, .grid6, .span-6 {width: 405px;} +.width6_4cols,.grid6_4cols {width: 90px;} +.input_width6 {width: 399px;} + +.width7, .grid7, .span-7 {width: 475px;} +.width7_2cols,.grid7_2cols {width: 230px;} +.width7_3cols,.grid7_3cols {width: 148px;} +.width7_4cols,.grid7_4cols {width: 107px;} +.input_width7 {width: 469px;} + +.width8, .grid8, .span-8 {width: 545px;} +.width8_3cols,.grid8_3cols {width: 171px;} +.input_width8 {width: 539px;} + +.width9, .grid9, .span-9 {width: 615px;} +.width9_2cols,.grid9_2cols {width: 300px;} +.width9_4cols,.grid9_4cols {width: 142px;} +.input_width9 {width: 609px;} + +.width10, .grid10, .span-10 {width: 685px;} +.width10_3cols,.grid10_3cols {width: 218px;} +.width10_4cols,.grid10_4cols {width: 160px;} +.input_width10 {width: 679px;} + +.width11, .grid11, .span-11 {width: 755px;} +.width11_2cols,.grid11_2cols {width: 370px;} +.width11_3cols,.grid11_3cols {width: 241px;} +.width11_4cols,.grid11_4cols {width: 177px;} +.input_width11 {width: 749px;} + +.width12, .grid12, .span-12 {width: 825px;} +.input_width12 {width: 819px;} + +/* Subdivided grid spaces */ +.emptycols_left1, .prepend-1 {padding-left: 70px;} +.emptycols_right1, .append-1 {padding-right: 70px;} +.emptycols_left2, .prepend-2 {padding-left: 140px;} +.emptycols_right2, .append-2 {padding-right: 140px;} +.emptycols_left3, .prepend-3 {padding-left: 210px;} +.emptycols_right3, .append-3 {padding-right: 210px;} +.emptycols_left4, .prepend-4 {padding-left: 280px;} +.emptycols_right4, .append-4 {padding-right: 280px;} +.emptycols_left5, .prepend-5 {padding-left: 350px;} +.emptycols_right5, .append-5 {padding-right: 350px;} +.emptycols_left6, .prepend-6 {padding-left: 420px;} +.emptycols_right6, .append-6 {padding-right: 420px;} +.emptycols_left7, .prepend-7 {padding-left: 490px;} +.emptycols_right7, .append-7 {padding-right: 490px;} +.emptycols_left8, .prepend-8 {padding-left: 560px;} +.emptycols_right8, .append-8 {padding-right: 560px;} +.emptycols_left9, .prepend-9 {padding-left: 630px;} +.emptycols_right9, .append-9 {padding-right: 630px;} +.emptycols_left10, .prepend-10 {padding-left: 700px;} +.emptycols_right10, .append-10 {padding-right: 700px;} +.emptycols_left11, .prepend-11 {padding-left: 770px;} +.emptycols_right11, .append-11 {padding-right: 770px;} +.pull-1 {margin-left: -70px;} +.push-1 {margin-right: -70px;margin-left: 18px;float: right;} +.pull-2 {margin-left: -140px;} +.push-2 {margin-right: -140px;margin-left: 18px;float: right;} +.pull-3 {margin-left: -210px;} +.push-3 {margin-right: -210px;margin-left: 18px;float: right;} +.pull-4 {margin-left: -280px;} +.push-4 {margin-right: -280px;margin-left: 18px;float: right;} \ No newline at end of file diff --git a/www/src/fonts/Webfonts/futurapt_book_macroman/specimen_files/specimen_stylesheet.css b/www/src/fonts/Webfonts/futurapt_book_macroman/specimen_files/specimen_stylesheet.css new file mode 100644 index 0000000000000..aecc43c32ce0e --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_book_macroman/specimen_files/specimen_stylesheet.css @@ -0,0 +1,396 @@ +@import url('grid_12-825-55-15.css'); + +/* + CSS Reset by Eric Meyer - Released under Public Domain + http://meyerweb.com/eric/tools/css/reset/ +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, table, +caption, tbody, tfoot, thead, tr, th, td + {margin: 0;padding: 0;border: 0;outline: 0; + font-size: 100%;vertical-align: baseline; + background: transparent;} +body {line-height: 1;} +ol, ul {list-style: none;} +blockquote, q {quotes: none;} +blockquote:before, blockquote:after, +q:before, q:after {content: ''; content: none;} +:focus {outline: 0;} +ins {text-decoration: none;} +del {text-decoration: line-through;} +table {border-collapse: collapse;border-spacing: 0;} + + + + +body { + color: #000; + background-color: #dcdcdc; +} + +a { + text-decoration: none; + color: #1883ba; +} + +h1{ + font-size: 32px; + font-weight: normal; + font-style: normal; + margin-bottom: 18px; +} + +h2{ + font-size: 18px; +} + +#container { + width: 865px; + margin: 0px auto; +} + + +#header { + padding: 20px; + font-size: 36px; + background-color: #000; + color: #fff; +} + +#header span { + color: #666; +} +#main_content { + background-color: #fff; + padding: 60px 20px 20px; +} + + +#footer p { + margin: 0; + padding-top: 10px; + padding-bottom: 50px; + color: #333; + font: 10px Arial, sans-serif; +} + +.tabs { + width: 100%; + height: 31px; + background-color: #444; +} +.tabs li { + float: left; + margin: 0; + overflow: hidden; + background-color: #444; +} +.tabs li a { + display: block; + color: #fff; + text-decoration: none; + font: bold 11px/11px 'Arial'; + text-transform: uppercase; + padding: 10px 15px; + border-right: 1px solid #fff; +} + +.tabs li a:hover { + background-color: #00b3ff; + +} + +.tabs li.active a { + color: #000; + background-color: #fff; +} + + + +div.huge { + + font-size: 300px; + line-height: 1em; + padding: 0; + letter-spacing: -.02em; + overflow: hidden; +} +div.glyph_range { + font-size: 72px; + line-height: 1.1em; +} + +.size10{ font-size: 10px; } +.size11{ font-size: 11px; } +.size12{ font-size: 12px; } +.size13{ font-size: 13px; } +.size14{ font-size: 14px; } +.size16{ font-size: 16px; } +.size18{ font-size: 18px; } +.size20{ font-size: 20px; } +.size24{ font-size: 24px; } +.size30{ font-size: 30px; } +.size36{ font-size: 36px; } +.size48{ font-size: 48px; } +.size60{ font-size: 60px; } +.size72{ font-size: 72px; } +.size90{ font-size: 90px; } + + +.psample_row1 { height: 120px;} +.psample_row1 { height: 120px;} +.psample_row2 { height: 160px;} +.psample_row3 { height: 160px;} +.psample_row4 { height: 160px;} + +.psample { + overflow: hidden; + position: relative; +} +.psample p { + line-height: 1.3em; + display: block; + overflow: hidden; + margin: 0; +} + +.psample span { + margin-right: .5em; +} + +.white_blend { + width: 100%; + height: 61px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==); + position: absolute; + bottom: 0; +} +.black_blend { + width: 100%; + height: 61px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC); + position: absolute; + bottom: 0; +} +.fullreverse { + background: #000 !important; + color: #fff !important; + margin-left: -20px; + padding-left: 20px; + margin-right: -20px; + padding-right: 20px; + padding: 20px; + margin-bottom:0; +} + + +.sample_table td { + padding-top: 3px; + padding-bottom:5px; + padding-left: 5px; + vertical-align: middle; + line-height: 1.2em; +} + +.sample_table td:first-child { + background-color: #eee; + text-align: right; + padding-right: 5px; + padding-left: 0; + padding: 5px; + font: 11px/12px "Courier New", Courier, mono; +} + +code { + white-space: pre; + background-color: #eee; + display: block; + padding: 10px; + margin-bottom: 18px; + overflow: auto; +} + + +.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;} + +.box { + padding: 18px; + margin-bottom: 18px; + background: #eee; +} + +.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;} + +#bodycomparison { + position: relative; + overflow: hidden; + font-size: 72px; + height: 90px; + white-space: nowrap; +} + +#bodycomparison div{ + font-size: 72px; + line-height: 90px; + display: inline; + margin: 0 15px 0 0; + padding: 0; +} + +#bodycomparison div span{ + font: 10px Arial; + position: absolute; + left: 0; +} +#xheight { + float: none; + position: absolute; + color: #d9f3ff; + font-size: 72px; + line-height: 90px; +} + +.fontbody { + position: relative; +} +.arialbody{ + font-family: Arial; + position: relative; +} +.verdanabody{ + font-family: Verdana; + position: relative; +} +.georgiabody{ + font-family: Georgia; + position: relative; +} + +/* @group Layout page + */ + +#layout h1 { + font-size: 36px; + line-height: 42px; + font-weight: normal; + font-style: normal; +} + +#layout h2 { + font-size: 24px; + line-height: 23px; + font-weight: normal; + font-style: normal; +} + +#layout h3 { + font-size: 22px; + line-height: 1.4em; + margin-top: 1em; + font-weight: normal; + font-style: normal; +} + + +#layout p.byline { + font-size: 12px; + margin-top: 18px; + line-height: 12px; + margin-bottom: 0; +} +#layout p { + font-size: 14px; + line-height: 21px; + margin-bottom: .5em; +} + +#layout p.large{ + font-size: 18px; + line-height: 26px; +} + +#layout .sidebar p{ + font-size: 12px; + line-height: 1.4em; +} + +#layout p.caption { + font-size: 10px; + margin-top: -16px; + margin-bottom: 18px; +} + +/* @end */ + +/* @group Glyphs */ + +#glyph_chart div{ + background-color: #d9f3ff; + color: black; + float: left; + font-size: 36px; + height: 1.2em; + line-height: 1.2em; + margin-bottom: 1px; + margin-right: 1px; + text-align: center; + width: 1.2em; + position: relative; + padding: .6em .2em .2em; +} + +#glyph_chart div p { + position: absolute; + left: 0; + top: 0; + display: block; + text-align: center; + font: bold 9px Arial, sans-serif; + background-color: #3a768f; + width: 100%; + color: #fff; + padding: 2px 0; +} + + +#glyphs h1 { + font-family: Arial, sans-serif; +} +/* @end */ + +/* @group Installing */ + +#installing { + font: 13px Arial, sans-serif; +} + +#installing p, +#glyphs p{ + line-height: 1.2em; + margin-bottom: 18px; + font: 13px Arial, sans-serif; +} + + + +#installing h3{ + font-size: 15px; + margin-top: 18px; +} + +/* @end */ + +#rendering h1 { + font-family: Arial, sans-serif; +} +.render_table td { + font: 11px "Courier New", Courier, mono; + vertical-align: middle; +} + + diff --git a/www/src/fonts/Webfonts/futurapt_book_macroman/stylesheet.css b/www/src/fonts/Webfonts/futurapt_book_macroman/stylesheet.css new file mode 100644 index 0000000000000..c90ca03ced708 --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_book_macroman/stylesheet.css @@ -0,0 +1,37 @@ +/* + * Web Fonts from fontspring.com + * + * All OpenType features and all extended glyphs have been removed. + * Fully installable fonts can be purchased at http://www.fontspring.com + * + * The fonts included in this stylesheet are subject to the End User License you purchased + * from Fontspring. The fonts are protected under domestic and international trademark and + * copyright law. You are prohibited from modifying, reverse engineering, duplicating, or + * distributing this font software. + * + * (c) 2010-2016 Fontspring + * + * + * + * + * The fonts included are copyrighted by the vendor listed below. + * + * Vendor: ParaType + * License URL: https://www.fontspring.com/licenses/paratype/webfont + * + * + */ + +@font-face { + font-family: "Futura PT"; + src: url('./ftn45-webfont.eot'); + src: url('./ftn45-webfont.eot?#iefix') format('embedded-opentype'), + url('./ftn45-webfont.woff2') format('woff2'), + url('./ftn45-webfont.woff') format('woff'), + url('./ftn45-webfont.ttf') format('truetype'), + url('./ftn45-webfont.svg#futura_ptbook') format('svg'); + font-weight: normal; + font-style: normal; + +} + diff --git a/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-demo.html b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-demo.html new file mode 100644 index 0000000000000..89c10879be287 --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-demo.html @@ -0,0 +1,382 @@ + + + + + + + + + + + + +Futura PT Book Italic Specimen + + + + + + +
+ + + +
+ + +
+ +
+
+
AaBb
+
+
+ +
+
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​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​1​2​3​4​5​6​7​8​9​0​&​.​,​?​!​@​(​)​#​$​%​*​+​-​=​:​;
+
+
+
+ + + + + + + + + + + + + + + + +
10abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
11abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
12abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
13abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
14abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
16abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
18abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
20abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
24abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
30abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
36abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
48abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
60abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
72abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
90abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+ +
+ +
+ + + +
+ + +
+
body
body
body
body
+
+ bodyFutura PT Book Italic +
+
+ bodyArial +
+
+ bodyVerdana +
+
+ bodyGeorgia +
+ + + +
+ + +
+ +
+

10.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

11.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

12.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

13.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+ +
+
+
+

14.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

16.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

18.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+ +
+ +
+ +
+
+

20.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+

24.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+ +
+ +
+ +
+
+

30.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+ +
+ + + +
+
+

10.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

11.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

12.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

13.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+ +
+ +
+
+

14.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

16.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

18.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+ +
+ +
+
+

20.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+

24.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+ +
+ +
+ +
+
+

30.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+ +
+ + + + +
+ +
+ +
+ +
+

Lorem Ipsum Dolor

+

Etiam porta sem malesuada magna mollis euismod

+ + +
+
+
+
+

Donec sed odio dui. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ + +

Pellentesque ornare sem

+ +

Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas faucibus mollis interdum. Donec ullamcorper nulla non metus auctor fringilla. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam id dolor id nibh ultricies vehicula ut id elit.

+ +

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+ +

Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean lacinia bibendum nulla sed consectetur.

+ +

Nullam quis risus eget urna mollis ornare vel eu leo. Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec ullamcorper nulla non metus auctor fringilla.

+ +

Cras mattis consectetur

+ +

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean lacinia bibendum nulla sed consectetur. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Cras mattis consectetur purus sit amet fermentum.

+ +

Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis ornare vel eu leo. Cras mattis consectetur purus sit amet fermentum.

+
+ + +
+ +
+ + + + + + +
+
+
+ +

Language Support

+

The subset of Futura PT Book Italic in this kit supports the following languages:
+ + Albanian, Alsatian, Aragonese, Arapaho, Aromanian, Arrernte, Asturian, Aymara, Azerbaijani (Cyrillic), Bashkir, Basque, Belarusian, Belarusian (Lacinka), Bislama, Bosnian, Breton, Buryat (Cyrillic), Catalan, Cebuano, Chamorro, Cheyenne, Chuvash, Cimbrian, Corsican, Croatian, Cyrillic, Czech, Danish, Demo, Dungan, Dutch, English, Esperanto, Estonian, Evenki (Cyrillic), Faroese, Fijian, Finnish, French, French Creole (Saint Lucia), Frisian, Friulian, Galician, Genoese, German, Gilbertese (Kiribati), Greenlandic, Haitian Creole, Hawaiian, Hiligaynon, Hill Mari, Hmong, Hopi, Hungarian, Ibanag, Iloko (Ilokano), Indonesian, Interglossa (Glosa), Interlingua, Irish (Gaelic), Islandic, Istro-Romanian, Italian, Jèrriais, Kalmyk (Cyrillic), Karachay (Cyrillic), Kashubian, Kazakh (Cyrillic), Khalkha, Khanty, Komi-Permyak, Kurdish (Kurmanji), Kyrgyz (Cyrillic), Ladin, Latin Basic, Latvian, Lithuanian, Lojban, Lombard, Low Saxon, Luxembourgian, Malagasy, Maltese, Manx, Maori, Meadow Mari, Megleno-Romanian, Mohawk, Moldovan, Nahuatl, Nenets, Norfolk/Pitcairnese, Northern Sotho (Pedi), Norwegian, Occitan, Oromo, Ossetian, Pangasinan, Papiamento, Piedmontese, Polish, Portuguese, Potawatomi, Quechua, Rhaeto-Romance, Romanian, Romansh (Rumantsch), Rotokas, Russian, Rusyn, Sami (Lule), Samoan, Sardinian (Sardu), Scots (Gaelic), Serbian (Cyrillic), Seychellois Creole (Seselwa), Shona, Sicilian, Slovak, Slovenian (Slovene), Somali, Southern Ndebele, Southern Sotho (Sesotho), Spanish, Swahili, Swati/Swazi, Swedish, Tagalog (Filipino/Pilipino), Tahitian, Tajik, Tatar (Cyrillic), Tausug, Tetum (Tetun), Tok Pisin, Tongan (Faka-Tonga), Tswana, Turkish, Turkmen, Turkmen (Cyrillic), Turkmen (Latinized), Tuvaluan, Tuvin, ubasic, Udmurt, Ukrainian, Uyghur (Cyrillic), Uyghur (Latinized), Uzbek (Cyrillic), Veps, Volapük, Votic (Cyrillic), Votic (Latinized), Walloon, Warlpiri, Xhosa, Yakut/Sakha, Yapese, Zulu

+

Glyph Chart

+

The subset of Futura PT Book Italic in this kit includes all the glyphs listed below. Unicode entities are included above each glyph to help you insert individual characters into your layout.

+
+ +
+
+ + +
+
+ + +
+ +
+ +
+
+
+

Installing Webfonts

+ +

Webfonts are supported by all major browser platforms but not all in the same way. There are currently four different font formats that must be included in order to target all browsers. This includes TTF, WOFF, EOT and SVG.

+ +

1. Upload your webfonts

+

You must upload your webfont kit to your website. They should be in or near the same directory as your CSS files.

+ +

2. Include the webfont stylesheet

+

A special CSS @font-face declaration helps the various browsers select the appropriate font it needs without causing you a bunch of headaches. Learn more about this syntax by reading the Fontspring blog post about it. The code for it is as follows:

+ + + +@font-face{ + font-family: 'MyWebFont'; + src: url('WebFont.eot'); + src: url('WebFont.eot?#iefix') format('embedded-opentype'), + url('WebFont.woff') format('woff'), + url('WebFont.ttf') format('truetype'), + url('WebFont.svg#webfont') format('svg'); +} + + +

We've already gone ahead and generated the code for you. All you have to do is link to the stylesheet in your HTML, like this:

+ <link rel="stylesheet" href="stylesheet.css" type="text/css" charset="utf-8" /> + +

3. Modify your own stylesheet

+

To take advantage of your new fonts, you must tell your stylesheet to use them. Look at the original @font-face declaration above and find the property called "font-family." The name linked there will be what you use to reference the font. Prepend that webfont name to the font stack in the "font-family" property, inside the selector you want to change. For example:

+p { font-family: 'MyWebFont', Arial, sans-serif; } + +

4. Test

+

Getting webfonts to work cross-browser can be tricky. Use the information in the sidebar to help you if you find that fonts aren't loading in a particular browser.

+
+ + +
+ +
+ +
+ +
+ + diff --git a/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.eot b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.eot new file mode 100644 index 0000000000000..fb20f5c4be255 Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.eot differ diff --git a/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.svg b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.svg new file mode 100644 index 0000000000000..38f7662548181 --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.svg @@ -0,0 +1,1202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.ttf b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.ttf new file mode 100644 index 0000000000000..83e13574a9a89 Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.ttf differ diff --git a/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.woff b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.woff new file mode 100644 index 0000000000000..3c34a793ef4a9 Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.woff differ diff --git a/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.woff2 b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.woff2 new file mode 100644 index 0000000000000..09f5dd66b1d9f Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/ftn46-webfont.woff2 differ diff --git a/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/specimen_files/grid_12-825-55-15.css b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/specimen_files/grid_12-825-55-15.css new file mode 100644 index 0000000000000..3d6aef783a908 --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/specimen_files/grid_12-825-55-15.css @@ -0,0 +1,129 @@ +/*Notes about grid: +Columns: 12 +Grid Width: 825px +Column Width: 55px +Gutter Width: 15px +-------------------------------*/ + + + +.section {margin-bottom: 18px; +} +.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;} +.section {*zoom: 1;} + +.section .firstcolumn, +.section .firstcol {margin-left: 0;} + + +/* Border on left hand side of a column. */ +.border { + padding-left: 7px; + margin-left: 7px; + border-left: 1px solid #eee; +} + +/* Border with more whitespace, spans one column. */ +.colborder { + padding-left: 42px; + margin-left: 42px; + border-left: 1px solid #eee; +} + + + +/* The Grid Classes */ +.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12 +{margin-left: 15px;float: left;display: inline; overflow: hidden;} + + +.width1, .grid1, .span-1 {width: 55px;} +.width1_2cols,.grid1_2cols {width: 20px;} +.width1_3cols,.grid1_3cols {width: 8px;} +.width1_4cols,.grid1_4cols {width: 2px;} +.input_width1 {width: 49px;} + +.width2, .grid2, .span-2 {width: 125px;} +.width2_3cols,.grid2_3cols {width: 31px;} +.width2_4cols,.grid2_4cols {width: 20px;} +.input_width2 {width: 119px;} + +.width3, .grid3, .span-3 {width: 195px;} +.width3_2cols,.grid3_2cols {width: 90px;} +.width3_4cols,.grid3_4cols {width: 37px;} +.input_width3 {width: 189px;} + +.width4, .grid4, .span-4 {width: 265px;} +.width4_3cols,.grid4_3cols {width: 78px;} +.input_width4 {width: 259px;} + +.width5, .grid5, .span-5 {width: 335px;} +.width5_2cols,.grid5_2cols {width: 160px;} +.width5_3cols,.grid5_3cols {width: 101px;} +.width5_4cols,.grid5_4cols {width: 72px;} +.input_width5 {width: 329px;} + +.width6, .grid6, .span-6 {width: 405px;} +.width6_4cols,.grid6_4cols {width: 90px;} +.input_width6 {width: 399px;} + +.width7, .grid7, .span-7 {width: 475px;} +.width7_2cols,.grid7_2cols {width: 230px;} +.width7_3cols,.grid7_3cols {width: 148px;} +.width7_4cols,.grid7_4cols {width: 107px;} +.input_width7 {width: 469px;} + +.width8, .grid8, .span-8 {width: 545px;} +.width8_3cols,.grid8_3cols {width: 171px;} +.input_width8 {width: 539px;} + +.width9, .grid9, .span-9 {width: 615px;} +.width9_2cols,.grid9_2cols {width: 300px;} +.width9_4cols,.grid9_4cols {width: 142px;} +.input_width9 {width: 609px;} + +.width10, .grid10, .span-10 {width: 685px;} +.width10_3cols,.grid10_3cols {width: 218px;} +.width10_4cols,.grid10_4cols {width: 160px;} +.input_width10 {width: 679px;} + +.width11, .grid11, .span-11 {width: 755px;} +.width11_2cols,.grid11_2cols {width: 370px;} +.width11_3cols,.grid11_3cols {width: 241px;} +.width11_4cols,.grid11_4cols {width: 177px;} +.input_width11 {width: 749px;} + +.width12, .grid12, .span-12 {width: 825px;} +.input_width12 {width: 819px;} + +/* Subdivided grid spaces */ +.emptycols_left1, .prepend-1 {padding-left: 70px;} +.emptycols_right1, .append-1 {padding-right: 70px;} +.emptycols_left2, .prepend-2 {padding-left: 140px;} +.emptycols_right2, .append-2 {padding-right: 140px;} +.emptycols_left3, .prepend-3 {padding-left: 210px;} +.emptycols_right3, .append-3 {padding-right: 210px;} +.emptycols_left4, .prepend-4 {padding-left: 280px;} +.emptycols_right4, .append-4 {padding-right: 280px;} +.emptycols_left5, .prepend-5 {padding-left: 350px;} +.emptycols_right5, .append-5 {padding-right: 350px;} +.emptycols_left6, .prepend-6 {padding-left: 420px;} +.emptycols_right6, .append-6 {padding-right: 420px;} +.emptycols_left7, .prepend-7 {padding-left: 490px;} +.emptycols_right7, .append-7 {padding-right: 490px;} +.emptycols_left8, .prepend-8 {padding-left: 560px;} +.emptycols_right8, .append-8 {padding-right: 560px;} +.emptycols_left9, .prepend-9 {padding-left: 630px;} +.emptycols_right9, .append-9 {padding-right: 630px;} +.emptycols_left10, .prepend-10 {padding-left: 700px;} +.emptycols_right10, .append-10 {padding-right: 700px;} +.emptycols_left11, .prepend-11 {padding-left: 770px;} +.emptycols_right11, .append-11 {padding-right: 770px;} +.pull-1 {margin-left: -70px;} +.push-1 {margin-right: -70px;margin-left: 18px;float: right;} +.pull-2 {margin-left: -140px;} +.push-2 {margin-right: -140px;margin-left: 18px;float: right;} +.pull-3 {margin-left: -210px;} +.push-3 {margin-right: -210px;margin-left: 18px;float: right;} +.pull-4 {margin-left: -280px;} +.push-4 {margin-right: -280px;margin-left: 18px;float: right;} \ No newline at end of file diff --git a/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/specimen_files/specimen_stylesheet.css b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/specimen_files/specimen_stylesheet.css new file mode 100644 index 0000000000000..aecc43c32ce0e --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/specimen_files/specimen_stylesheet.css @@ -0,0 +1,396 @@ +@import url('grid_12-825-55-15.css'); + +/* + CSS Reset by Eric Meyer - Released under Public Domain + http://meyerweb.com/eric/tools/css/reset/ +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, table, +caption, tbody, tfoot, thead, tr, th, td + {margin: 0;padding: 0;border: 0;outline: 0; + font-size: 100%;vertical-align: baseline; + background: transparent;} +body {line-height: 1;} +ol, ul {list-style: none;} +blockquote, q {quotes: none;} +blockquote:before, blockquote:after, +q:before, q:after {content: ''; content: none;} +:focus {outline: 0;} +ins {text-decoration: none;} +del {text-decoration: line-through;} +table {border-collapse: collapse;border-spacing: 0;} + + + + +body { + color: #000; + background-color: #dcdcdc; +} + +a { + text-decoration: none; + color: #1883ba; +} + +h1{ + font-size: 32px; + font-weight: normal; + font-style: normal; + margin-bottom: 18px; +} + +h2{ + font-size: 18px; +} + +#container { + width: 865px; + margin: 0px auto; +} + + +#header { + padding: 20px; + font-size: 36px; + background-color: #000; + color: #fff; +} + +#header span { + color: #666; +} +#main_content { + background-color: #fff; + padding: 60px 20px 20px; +} + + +#footer p { + margin: 0; + padding-top: 10px; + padding-bottom: 50px; + color: #333; + font: 10px Arial, sans-serif; +} + +.tabs { + width: 100%; + height: 31px; + background-color: #444; +} +.tabs li { + float: left; + margin: 0; + overflow: hidden; + background-color: #444; +} +.tabs li a { + display: block; + color: #fff; + text-decoration: none; + font: bold 11px/11px 'Arial'; + text-transform: uppercase; + padding: 10px 15px; + border-right: 1px solid #fff; +} + +.tabs li a:hover { + background-color: #00b3ff; + +} + +.tabs li.active a { + color: #000; + background-color: #fff; +} + + + +div.huge { + + font-size: 300px; + line-height: 1em; + padding: 0; + letter-spacing: -.02em; + overflow: hidden; +} +div.glyph_range { + font-size: 72px; + line-height: 1.1em; +} + +.size10{ font-size: 10px; } +.size11{ font-size: 11px; } +.size12{ font-size: 12px; } +.size13{ font-size: 13px; } +.size14{ font-size: 14px; } +.size16{ font-size: 16px; } +.size18{ font-size: 18px; } +.size20{ font-size: 20px; } +.size24{ font-size: 24px; } +.size30{ font-size: 30px; } +.size36{ font-size: 36px; } +.size48{ font-size: 48px; } +.size60{ font-size: 60px; } +.size72{ font-size: 72px; } +.size90{ font-size: 90px; } + + +.psample_row1 { height: 120px;} +.psample_row1 { height: 120px;} +.psample_row2 { height: 160px;} +.psample_row3 { height: 160px;} +.psample_row4 { height: 160px;} + +.psample { + overflow: hidden; + position: relative; +} +.psample p { + line-height: 1.3em; + display: block; + overflow: hidden; + margin: 0; +} + +.psample span { + margin-right: .5em; +} + +.white_blend { + width: 100%; + height: 61px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==); + position: absolute; + bottom: 0; +} +.black_blend { + width: 100%; + height: 61px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC); + position: absolute; + bottom: 0; +} +.fullreverse { + background: #000 !important; + color: #fff !important; + margin-left: -20px; + padding-left: 20px; + margin-right: -20px; + padding-right: 20px; + padding: 20px; + margin-bottom:0; +} + + +.sample_table td { + padding-top: 3px; + padding-bottom:5px; + padding-left: 5px; + vertical-align: middle; + line-height: 1.2em; +} + +.sample_table td:first-child { + background-color: #eee; + text-align: right; + padding-right: 5px; + padding-left: 0; + padding: 5px; + font: 11px/12px "Courier New", Courier, mono; +} + +code { + white-space: pre; + background-color: #eee; + display: block; + padding: 10px; + margin-bottom: 18px; + overflow: auto; +} + + +.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;} + +.box { + padding: 18px; + margin-bottom: 18px; + background: #eee; +} + +.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;} + +#bodycomparison { + position: relative; + overflow: hidden; + font-size: 72px; + height: 90px; + white-space: nowrap; +} + +#bodycomparison div{ + font-size: 72px; + line-height: 90px; + display: inline; + margin: 0 15px 0 0; + padding: 0; +} + +#bodycomparison div span{ + font: 10px Arial; + position: absolute; + left: 0; +} +#xheight { + float: none; + position: absolute; + color: #d9f3ff; + font-size: 72px; + line-height: 90px; +} + +.fontbody { + position: relative; +} +.arialbody{ + font-family: Arial; + position: relative; +} +.verdanabody{ + font-family: Verdana; + position: relative; +} +.georgiabody{ + font-family: Georgia; + position: relative; +} + +/* @group Layout page + */ + +#layout h1 { + font-size: 36px; + line-height: 42px; + font-weight: normal; + font-style: normal; +} + +#layout h2 { + font-size: 24px; + line-height: 23px; + font-weight: normal; + font-style: normal; +} + +#layout h3 { + font-size: 22px; + line-height: 1.4em; + margin-top: 1em; + font-weight: normal; + font-style: normal; +} + + +#layout p.byline { + font-size: 12px; + margin-top: 18px; + line-height: 12px; + margin-bottom: 0; +} +#layout p { + font-size: 14px; + line-height: 21px; + margin-bottom: .5em; +} + +#layout p.large{ + font-size: 18px; + line-height: 26px; +} + +#layout .sidebar p{ + font-size: 12px; + line-height: 1.4em; +} + +#layout p.caption { + font-size: 10px; + margin-top: -16px; + margin-bottom: 18px; +} + +/* @end */ + +/* @group Glyphs */ + +#glyph_chart div{ + background-color: #d9f3ff; + color: black; + float: left; + font-size: 36px; + height: 1.2em; + line-height: 1.2em; + margin-bottom: 1px; + margin-right: 1px; + text-align: center; + width: 1.2em; + position: relative; + padding: .6em .2em .2em; +} + +#glyph_chart div p { + position: absolute; + left: 0; + top: 0; + display: block; + text-align: center; + font: bold 9px Arial, sans-serif; + background-color: #3a768f; + width: 100%; + color: #fff; + padding: 2px 0; +} + + +#glyphs h1 { + font-family: Arial, sans-serif; +} +/* @end */ + +/* @group Installing */ + +#installing { + font: 13px Arial, sans-serif; +} + +#installing p, +#glyphs p{ + line-height: 1.2em; + margin-bottom: 18px; + font: 13px Arial, sans-serif; +} + + + +#installing h3{ + font-size: 15px; + margin-top: 18px; +} + +/* @end */ + +#rendering h1 { + font-family: Arial, sans-serif; +} +.render_table td { + font: 11px "Courier New", Courier, mono; + vertical-align: middle; +} + + diff --git a/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/stylesheet.css b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/stylesheet.css new file mode 100644 index 0000000000000..0cfa5cf50dafe --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_bookitalic_macroman/stylesheet.css @@ -0,0 +1,37 @@ +/* + * Web Fonts from fontspring.com + * + * All OpenType features and all extended glyphs have been removed. + * Fully installable fonts can be purchased at http://www.fontspring.com + * + * The fonts included in this stylesheet are subject to the End User License you purchased + * from Fontspring. The fonts are protected under domestic and international trademark and + * copyright law. You are prohibited from modifying, reverse engineering, duplicating, or + * distributing this font software. + * + * (c) 2010-2016 Fontspring + * + * + * + * + * The fonts included are copyrighted by the vendor listed below. + * + * Vendor: ParaType + * License URL: https://www.fontspring.com/licenses/paratype/webfont + * + * + */ + +@font-face { + font-family: 'Futura PT'; + src: url('ftn46-webfont.eot'); + src: url('ftn46-webfont.eot?#iefix') format('embedded-opentype'), + url('ftn46-webfont.woff2') format('woff2'), + url('ftn46-webfont.woff') format('woff'), + url('ftn46-webfont.ttf') format('truetype'), + url('ftn46-webfont.svg#futura_ptbook_oblique') format('svg'); + font-weight: normal; + font-style: italic; + +} + diff --git a/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-demo.html b/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-demo.html new file mode 100644 index 0000000000000..84a1a5011ebbf --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-demo.html @@ -0,0 +1,382 @@ + + + + + + + + + + + + +Futura PT Demi Specimen + + + + + + +
+ + + +
+ + +
+ +
+
+
AaBb
+
+
+ +
+
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​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​1​2​3​4​5​6​7​8​9​0​&​.​,​?​!​@​(​)​#​$​%​*​+​-​=​:​;
+
+
+
+ + + + + + + + + + + + + + + + +
10abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
11abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
12abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
13abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
14abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
16abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
18abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
20abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
24abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
30abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
36abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
48abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
60abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
72abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
90abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+ +
+ +
+ + + +
+ + +
+
body
body
body
body
+
+ bodyFutura PT Demi +
+
+ bodyArial +
+
+ bodyVerdana +
+
+ bodyGeorgia +
+ + + +
+ + +
+ +
+

10.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

11.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

12.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

13.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+ +
+
+
+

14.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

16.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

18.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+ +
+ +
+ +
+
+

20.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+

24.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+ +
+ +
+ +
+
+

30.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+ +
+ + + +
+
+

10.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

11.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

12.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

13.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+ +
+ +
+
+

14.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

16.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

18.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+ +
+ +
+
+

20.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+

24.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+ +
+ +
+ +
+
+

30.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+ +
+ + + + +
+ +
+ +
+ +
+

Lorem Ipsum Dolor

+

Etiam porta sem malesuada magna mollis euismod

+ + +
+
+
+
+

Donec sed odio dui. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ + +

Pellentesque ornare sem

+ +

Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas faucibus mollis interdum. Donec ullamcorper nulla non metus auctor fringilla. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam id dolor id nibh ultricies vehicula ut id elit.

+ +

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+ +

Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean lacinia bibendum nulla sed consectetur.

+ +

Nullam quis risus eget urna mollis ornare vel eu leo. Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec ullamcorper nulla non metus auctor fringilla.

+ +

Cras mattis consectetur

+ +

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean lacinia bibendum nulla sed consectetur. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Cras mattis consectetur purus sit amet fermentum.

+ +

Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis ornare vel eu leo. Cras mattis consectetur purus sit amet fermentum.

+
+ + +
+ +
+ + + + + + +
+
+
+ +

Language Support

+

The subset of Futura PT Demi in this kit supports the following languages:
+ + Albanian, Alsatian, Aragonese, Arapaho, Aromanian, Arrernte, Asturian, Aymara, Azerbaijani (Cyrillic), Bashkir, Basque, Belarusian, Belarusian (Lacinka), Bislama, Bosnian, Breton, Buryat (Cyrillic), Catalan, Cebuano, Chamorro, Cheyenne, Chuvash, Cimbrian, Corsican, Croatian, Cyrillic, Czech, Danish, Demo, Dungan, Dutch, English, Esperanto, Estonian, Evenki (Cyrillic), Faroese, Fijian, Finnish, French, French Creole (Saint Lucia), Frisian, Friulian, Galician, Genoese, German, Gilbertese (Kiribati), Greenlandic, Haitian Creole, Hawaiian, Hiligaynon, Hill Mari, Hmong, Hopi, Hungarian, Ibanag, Iloko (Ilokano), Indonesian, Interglossa (Glosa), Interlingua, Irish (Gaelic), Islandic, Istro-Romanian, Italian, Jèrriais, Kalmyk (Cyrillic), Karachay (Cyrillic), Kashubian, Kazakh (Cyrillic), Khalkha, Khanty, Komi-Permyak, Kurdish (Kurmanji), Kyrgyz (Cyrillic), Ladin, Latin Basic, Latvian, Lithuanian, Lojban, Lombard, Low Saxon, Luxembourgian, Malagasy, Maltese, Manx, Maori, Meadow Mari, Megleno-Romanian, Mohawk, Moldovan, Nahuatl, Nenets, Norfolk/Pitcairnese, Northern Sotho (Pedi), Norwegian, Occitan, Oromo, Ossetian, Pangasinan, Papiamento, Piedmontese, Polish, Portuguese, Potawatomi, Quechua, Rhaeto-Romance, Romanian, Romansh (Rumantsch), Rotokas, Russian, Rusyn, Sami (Lule), Samoan, Sardinian (Sardu), Scots (Gaelic), Serbian (Cyrillic), Seychellois Creole (Seselwa), Shona, Sicilian, Slovak, Slovenian (Slovene), Somali, Southern Ndebele, Southern Sotho (Sesotho), Spanish, Swahili, Swati/Swazi, Swedish, Tagalog (Filipino/Pilipino), Tahitian, Tajik, Tatar (Cyrillic), Tausug, Tetum (Tetun), Tok Pisin, Tongan (Faka-Tonga), Tswana, Turkish, Turkmen, Turkmen (Cyrillic), Turkmen (Latinized), Tuvaluan, Tuvin, ubasic, Udmurt, Ukrainian, Uyghur (Cyrillic), Uyghur (Latinized), Uzbek (Cyrillic), Veps, Volapük, Votic (Cyrillic), Votic (Latinized), Walloon, Warlpiri, Xhosa, Yakut/Sakha, Yapese, Zulu

+

Glyph Chart

+

The subset of Futura PT Demi in this kit includes all the glyphs listed below. Unicode entities are included above each glyph to help you insert individual characters into your layout.

+
+ +
+
+ + +
+
+ + +
+ +
+ +
+
+
+

Installing Webfonts

+ +

Webfonts are supported by all major browser platforms but not all in the same way. There are currently four different font formats that must be included in order to target all browsers. This includes TTF, WOFF, EOT and SVG.

+ +

1. Upload your webfonts

+

You must upload your webfont kit to your website. They should be in or near the same directory as your CSS files.

+ +

2. Include the webfont stylesheet

+

A special CSS @font-face declaration helps the various browsers select the appropriate font it needs without causing you a bunch of headaches. Learn more about this syntax by reading the Fontspring blog post about it. The code for it is as follows:

+ + + +@font-face{ + font-family: 'MyWebFont'; + src: url('WebFont.eot'); + src: url('WebFont.eot?#iefix') format('embedded-opentype'), + url('WebFont.woff') format('woff'), + url('WebFont.ttf') format('truetype'), + url('WebFont.svg#webfont') format('svg'); +} + + +

We've already gone ahead and generated the code for you. All you have to do is link to the stylesheet in your HTML, like this:

+ <link rel="stylesheet" href="stylesheet.css" type="text/css" charset="utf-8" /> + +

3. Modify your own stylesheet

+

To take advantage of your new fonts, you must tell your stylesheet to use them. Look at the original @font-face declaration above and find the property called "font-family." The name linked there will be what you use to reference the font. Prepend that webfont name to the font stack in the "font-family" property, inside the selector you want to change. For example:

+p { font-family: 'MyWebFont', Arial, sans-serif; } + +

4. Test

+

Getting webfonts to work cross-browser can be tricky. Use the information in the sidebar to help you if you find that fonts aren't loading in a particular browser.

+
+ + +
+ +
+ +
+ +
+ + diff --git a/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.eot b/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.eot new file mode 100644 index 0000000000000..27a25b8c44a7c Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.eot differ diff --git a/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.svg b/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.svg new file mode 100644 index 0000000000000..950a4eb3ca264 --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.svg @@ -0,0 +1,1469 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.ttf b/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.ttf new file mode 100644 index 0000000000000..c91b25f275d12 Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.ttf differ diff --git a/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.woff b/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.woff new file mode 100644 index 0000000000000..36879e23207ba Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.woff differ diff --git a/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.woff2 b/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.woff2 new file mode 100644 index 0000000000000..0edbbe3238408 Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_demi_macroman/ftn65-webfont.woff2 differ diff --git a/www/src/fonts/Webfonts/futurapt_demi_macroman/specimen_files/grid_12-825-55-15.css b/www/src/fonts/Webfonts/futurapt_demi_macroman/specimen_files/grid_12-825-55-15.css new file mode 100644 index 0000000000000..3d6aef783a908 --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_demi_macroman/specimen_files/grid_12-825-55-15.css @@ -0,0 +1,129 @@ +/*Notes about grid: +Columns: 12 +Grid Width: 825px +Column Width: 55px +Gutter Width: 15px +-------------------------------*/ + + + +.section {margin-bottom: 18px; +} +.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;} +.section {*zoom: 1;} + +.section .firstcolumn, +.section .firstcol {margin-left: 0;} + + +/* Border on left hand side of a column. */ +.border { + padding-left: 7px; + margin-left: 7px; + border-left: 1px solid #eee; +} + +/* Border with more whitespace, spans one column. */ +.colborder { + padding-left: 42px; + margin-left: 42px; + border-left: 1px solid #eee; +} + + + +/* The Grid Classes */ +.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12 +{margin-left: 15px;float: left;display: inline; overflow: hidden;} + + +.width1, .grid1, .span-1 {width: 55px;} +.width1_2cols,.grid1_2cols {width: 20px;} +.width1_3cols,.grid1_3cols {width: 8px;} +.width1_4cols,.grid1_4cols {width: 2px;} +.input_width1 {width: 49px;} + +.width2, .grid2, .span-2 {width: 125px;} +.width2_3cols,.grid2_3cols {width: 31px;} +.width2_4cols,.grid2_4cols {width: 20px;} +.input_width2 {width: 119px;} + +.width3, .grid3, .span-3 {width: 195px;} +.width3_2cols,.grid3_2cols {width: 90px;} +.width3_4cols,.grid3_4cols {width: 37px;} +.input_width3 {width: 189px;} + +.width4, .grid4, .span-4 {width: 265px;} +.width4_3cols,.grid4_3cols {width: 78px;} +.input_width4 {width: 259px;} + +.width5, .grid5, .span-5 {width: 335px;} +.width5_2cols,.grid5_2cols {width: 160px;} +.width5_3cols,.grid5_3cols {width: 101px;} +.width5_4cols,.grid5_4cols {width: 72px;} +.input_width5 {width: 329px;} + +.width6, .grid6, .span-6 {width: 405px;} +.width6_4cols,.grid6_4cols {width: 90px;} +.input_width6 {width: 399px;} + +.width7, .grid7, .span-7 {width: 475px;} +.width7_2cols,.grid7_2cols {width: 230px;} +.width7_3cols,.grid7_3cols {width: 148px;} +.width7_4cols,.grid7_4cols {width: 107px;} +.input_width7 {width: 469px;} + +.width8, .grid8, .span-8 {width: 545px;} +.width8_3cols,.grid8_3cols {width: 171px;} +.input_width8 {width: 539px;} + +.width9, .grid9, .span-9 {width: 615px;} +.width9_2cols,.grid9_2cols {width: 300px;} +.width9_4cols,.grid9_4cols {width: 142px;} +.input_width9 {width: 609px;} + +.width10, .grid10, .span-10 {width: 685px;} +.width10_3cols,.grid10_3cols {width: 218px;} +.width10_4cols,.grid10_4cols {width: 160px;} +.input_width10 {width: 679px;} + +.width11, .grid11, .span-11 {width: 755px;} +.width11_2cols,.grid11_2cols {width: 370px;} +.width11_3cols,.grid11_3cols {width: 241px;} +.width11_4cols,.grid11_4cols {width: 177px;} +.input_width11 {width: 749px;} + +.width12, .grid12, .span-12 {width: 825px;} +.input_width12 {width: 819px;} + +/* Subdivided grid spaces */ +.emptycols_left1, .prepend-1 {padding-left: 70px;} +.emptycols_right1, .append-1 {padding-right: 70px;} +.emptycols_left2, .prepend-2 {padding-left: 140px;} +.emptycols_right2, .append-2 {padding-right: 140px;} +.emptycols_left3, .prepend-3 {padding-left: 210px;} +.emptycols_right3, .append-3 {padding-right: 210px;} +.emptycols_left4, .prepend-4 {padding-left: 280px;} +.emptycols_right4, .append-4 {padding-right: 280px;} +.emptycols_left5, .prepend-5 {padding-left: 350px;} +.emptycols_right5, .append-5 {padding-right: 350px;} +.emptycols_left6, .prepend-6 {padding-left: 420px;} +.emptycols_right6, .append-6 {padding-right: 420px;} +.emptycols_left7, .prepend-7 {padding-left: 490px;} +.emptycols_right7, .append-7 {padding-right: 490px;} +.emptycols_left8, .prepend-8 {padding-left: 560px;} +.emptycols_right8, .append-8 {padding-right: 560px;} +.emptycols_left9, .prepend-9 {padding-left: 630px;} +.emptycols_right9, .append-9 {padding-right: 630px;} +.emptycols_left10, .prepend-10 {padding-left: 700px;} +.emptycols_right10, .append-10 {padding-right: 700px;} +.emptycols_left11, .prepend-11 {padding-left: 770px;} +.emptycols_right11, .append-11 {padding-right: 770px;} +.pull-1 {margin-left: -70px;} +.push-1 {margin-right: -70px;margin-left: 18px;float: right;} +.pull-2 {margin-left: -140px;} +.push-2 {margin-right: -140px;margin-left: 18px;float: right;} +.pull-3 {margin-left: -210px;} +.push-3 {margin-right: -210px;margin-left: 18px;float: right;} +.pull-4 {margin-left: -280px;} +.push-4 {margin-right: -280px;margin-left: 18px;float: right;} \ No newline at end of file diff --git a/www/src/fonts/Webfonts/futurapt_demi_macroman/specimen_files/specimen_stylesheet.css b/www/src/fonts/Webfonts/futurapt_demi_macroman/specimen_files/specimen_stylesheet.css new file mode 100644 index 0000000000000..aecc43c32ce0e --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_demi_macroman/specimen_files/specimen_stylesheet.css @@ -0,0 +1,396 @@ +@import url('grid_12-825-55-15.css'); + +/* + CSS Reset by Eric Meyer - Released under Public Domain + http://meyerweb.com/eric/tools/css/reset/ +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, table, +caption, tbody, tfoot, thead, tr, th, td + {margin: 0;padding: 0;border: 0;outline: 0; + font-size: 100%;vertical-align: baseline; + background: transparent;} +body {line-height: 1;} +ol, ul {list-style: none;} +blockquote, q {quotes: none;} +blockquote:before, blockquote:after, +q:before, q:after {content: ''; content: none;} +:focus {outline: 0;} +ins {text-decoration: none;} +del {text-decoration: line-through;} +table {border-collapse: collapse;border-spacing: 0;} + + + + +body { + color: #000; + background-color: #dcdcdc; +} + +a { + text-decoration: none; + color: #1883ba; +} + +h1{ + font-size: 32px; + font-weight: normal; + font-style: normal; + margin-bottom: 18px; +} + +h2{ + font-size: 18px; +} + +#container { + width: 865px; + margin: 0px auto; +} + + +#header { + padding: 20px; + font-size: 36px; + background-color: #000; + color: #fff; +} + +#header span { + color: #666; +} +#main_content { + background-color: #fff; + padding: 60px 20px 20px; +} + + +#footer p { + margin: 0; + padding-top: 10px; + padding-bottom: 50px; + color: #333; + font: 10px Arial, sans-serif; +} + +.tabs { + width: 100%; + height: 31px; + background-color: #444; +} +.tabs li { + float: left; + margin: 0; + overflow: hidden; + background-color: #444; +} +.tabs li a { + display: block; + color: #fff; + text-decoration: none; + font: bold 11px/11px 'Arial'; + text-transform: uppercase; + padding: 10px 15px; + border-right: 1px solid #fff; +} + +.tabs li a:hover { + background-color: #00b3ff; + +} + +.tabs li.active a { + color: #000; + background-color: #fff; +} + + + +div.huge { + + font-size: 300px; + line-height: 1em; + padding: 0; + letter-spacing: -.02em; + overflow: hidden; +} +div.glyph_range { + font-size: 72px; + line-height: 1.1em; +} + +.size10{ font-size: 10px; } +.size11{ font-size: 11px; } +.size12{ font-size: 12px; } +.size13{ font-size: 13px; } +.size14{ font-size: 14px; } +.size16{ font-size: 16px; } +.size18{ font-size: 18px; } +.size20{ font-size: 20px; } +.size24{ font-size: 24px; } +.size30{ font-size: 30px; } +.size36{ font-size: 36px; } +.size48{ font-size: 48px; } +.size60{ font-size: 60px; } +.size72{ font-size: 72px; } +.size90{ font-size: 90px; } + + +.psample_row1 { height: 120px;} +.psample_row1 { height: 120px;} +.psample_row2 { height: 160px;} +.psample_row3 { height: 160px;} +.psample_row4 { height: 160px;} + +.psample { + overflow: hidden; + position: relative; +} +.psample p { + line-height: 1.3em; + display: block; + overflow: hidden; + margin: 0; +} + +.psample span { + margin-right: .5em; +} + +.white_blend { + width: 100%; + height: 61px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==); + position: absolute; + bottom: 0; +} +.black_blend { + width: 100%; + height: 61px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC); + position: absolute; + bottom: 0; +} +.fullreverse { + background: #000 !important; + color: #fff !important; + margin-left: -20px; + padding-left: 20px; + margin-right: -20px; + padding-right: 20px; + padding: 20px; + margin-bottom:0; +} + + +.sample_table td { + padding-top: 3px; + padding-bottom:5px; + padding-left: 5px; + vertical-align: middle; + line-height: 1.2em; +} + +.sample_table td:first-child { + background-color: #eee; + text-align: right; + padding-right: 5px; + padding-left: 0; + padding: 5px; + font: 11px/12px "Courier New", Courier, mono; +} + +code { + white-space: pre; + background-color: #eee; + display: block; + padding: 10px; + margin-bottom: 18px; + overflow: auto; +} + + +.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;} + +.box { + padding: 18px; + margin-bottom: 18px; + background: #eee; +} + +.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;} + +#bodycomparison { + position: relative; + overflow: hidden; + font-size: 72px; + height: 90px; + white-space: nowrap; +} + +#bodycomparison div{ + font-size: 72px; + line-height: 90px; + display: inline; + margin: 0 15px 0 0; + padding: 0; +} + +#bodycomparison div span{ + font: 10px Arial; + position: absolute; + left: 0; +} +#xheight { + float: none; + position: absolute; + color: #d9f3ff; + font-size: 72px; + line-height: 90px; +} + +.fontbody { + position: relative; +} +.arialbody{ + font-family: Arial; + position: relative; +} +.verdanabody{ + font-family: Verdana; + position: relative; +} +.georgiabody{ + font-family: Georgia; + position: relative; +} + +/* @group Layout page + */ + +#layout h1 { + font-size: 36px; + line-height: 42px; + font-weight: normal; + font-style: normal; +} + +#layout h2 { + font-size: 24px; + line-height: 23px; + font-weight: normal; + font-style: normal; +} + +#layout h3 { + font-size: 22px; + line-height: 1.4em; + margin-top: 1em; + font-weight: normal; + font-style: normal; +} + + +#layout p.byline { + font-size: 12px; + margin-top: 18px; + line-height: 12px; + margin-bottom: 0; +} +#layout p { + font-size: 14px; + line-height: 21px; + margin-bottom: .5em; +} + +#layout p.large{ + font-size: 18px; + line-height: 26px; +} + +#layout .sidebar p{ + font-size: 12px; + line-height: 1.4em; +} + +#layout p.caption { + font-size: 10px; + margin-top: -16px; + margin-bottom: 18px; +} + +/* @end */ + +/* @group Glyphs */ + +#glyph_chart div{ + background-color: #d9f3ff; + color: black; + float: left; + font-size: 36px; + height: 1.2em; + line-height: 1.2em; + margin-bottom: 1px; + margin-right: 1px; + text-align: center; + width: 1.2em; + position: relative; + padding: .6em .2em .2em; +} + +#glyph_chart div p { + position: absolute; + left: 0; + top: 0; + display: block; + text-align: center; + font: bold 9px Arial, sans-serif; + background-color: #3a768f; + width: 100%; + color: #fff; + padding: 2px 0; +} + + +#glyphs h1 { + font-family: Arial, sans-serif; +} +/* @end */ + +/* @group Installing */ + +#installing { + font: 13px Arial, sans-serif; +} + +#installing p, +#glyphs p{ + line-height: 1.2em; + margin-bottom: 18px; + font: 13px Arial, sans-serif; +} + + + +#installing h3{ + font-size: 15px; + margin-top: 18px; +} + +/* @end */ + +#rendering h1 { + font-family: Arial, sans-serif; +} +.render_table td { + font: 11px "Courier New", Courier, mono; + vertical-align: middle; +} + + diff --git a/www/src/fonts/Webfonts/futurapt_demi_macroman/stylesheet.css b/www/src/fonts/Webfonts/futurapt_demi_macroman/stylesheet.css new file mode 100644 index 0000000000000..a06109c270a72 --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_demi_macroman/stylesheet.css @@ -0,0 +1,37 @@ +/* + * Web Fonts from fontspring.com + * + * All OpenType features and all extended glyphs have been removed. + * Fully installable fonts can be purchased at http://www.fontspring.com + * + * The fonts included in this stylesheet are subject to the End User License you purchased + * from Fontspring. The fonts are protected under domestic and international trademark and + * copyright law. You are prohibited from modifying, reverse engineering, duplicating, or + * distributing this font software. + * + * (c) 2010-2016 Fontspring + * + * + * + * + * The fonts included are copyrighted by the vendor listed below. + * + * Vendor: ParaType + * License URL: https://www.fontspring.com/licenses/paratype/webfont + * + * + */ + +@font-face { + font-family: 'Futura PT'; + src: url('ftn65-webfont.eot'); + src: url('ftn65-webfont.eot?#iefix') format('embedded-opentype'), + url('ftn65-webfont.woff2') format('woff2'), + url('ftn65-webfont.woff') format('woff'), + url('ftn65-webfont.ttf') format('truetype'), + url('ftn65-webfont.svg#futura_ptdemi') format('svg'); + font-weight: bold; + font-style: normal; + +} + diff --git a/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-demo.html b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-demo.html new file mode 100644 index 0000000000000..cc89f50ec1d7b --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-demo.html @@ -0,0 +1,382 @@ + + + + + + + + + + + + +Futura PT Demi Italic Specimen + + + + + + +
+ + + +
+ + +
+ +
+
+
AaBb
+
+
+ +
+
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​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​1​2​3​4​5​6​7​8​9​0​&​.​,​?​!​@​(​)​#​$​%​*​+​-​=​:​;
+
+
+
+ + + + + + + + + + + + + + + + +
10abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
11abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
12abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
13abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
14abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
16abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
18abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
20abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
24abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
30abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
36abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
48abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
60abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
72abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
90abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
+ +
+ +
+ + + +
+ + +
+
body
body
body
body
+
+ bodyFutura PT Demi Italic +
+
+ bodyArial +
+
+ bodyVerdana +
+
+ bodyGeorgia +
+ + + +
+ + +
+ +
+

10.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

11.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

12.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

13.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+ +
+
+
+

14.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

16.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

18.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+ +
+ +
+ +
+
+

20.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+

24.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+ +
+ +
+ +
+
+

30.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+ +
+ + + +
+
+

10.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

11.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

12.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

13.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+ +
+ +
+
+

14.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

16.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+

18.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+ +
+
+ +
+ +
+
+

20.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+

24.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+ +
+ +
+ +
+
+

30.Aenean lacinia bibendum nulla sed consectetur. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus. Nullam id dolor id nibh ultricies vehicula ut id elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nulla vitae elit libero, a pharetra augue.

+
+
+ +
+ + + + +
+ +
+ +
+ +
+

Lorem Ipsum Dolor

+

Etiam porta sem malesuada magna mollis euismod

+ + +
+
+
+
+

Donec sed odio dui. Morbi leo risus, porta ac consectetur ac, vestibulum at eros. Fusce dapibus, tellus ac cursus commodo, tortor mauris condimentum nibh, ut fermentum massa justo sit amet risus.

+ + +

Pellentesque ornare sem

+ +

Maecenas sed diam eget risus varius blandit sit amet non magna. Maecenas faucibus mollis interdum. Donec ullamcorper nulla non metus auctor fringilla. Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam id dolor id nibh ultricies vehicula ut id elit.

+ +

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.

+ +

Nulla vitae elit libero, a pharetra augue. Praesent commodo cursus magna, vel scelerisque nisl consectetur et. Aenean lacinia bibendum nulla sed consectetur.

+ +

Nullam quis risus eget urna mollis ornare vel eu leo. Nullam quis risus eget urna mollis ornare vel eu leo. Maecenas sed diam eget risus varius blandit sit amet non magna. Donec ullamcorper nulla non metus auctor fringilla.

+ +

Cras mattis consectetur

+ +

Aenean eu leo quam. Pellentesque ornare sem lacinia quam venenatis vestibulum. Aenean lacinia bibendum nulla sed consectetur. Integer posuere erat a ante venenatis dapibus posuere velit aliquet. Cras mattis consectetur purus sit amet fermentum.

+ +

Nullam id dolor id nibh ultricies vehicula ut id elit. Nullam quis risus eget urna mollis ornare vel eu leo. Cras mattis consectetur purus sit amet fermentum.

+
+ + +
+ +
+ + + + + + +
+
+
+ +

Language Support

+

The subset of Futura PT Demi Italic in this kit supports the following languages:
+ + Albanian, Alsatian, Aragonese, Arapaho, Aromanian, Arrernte, Asturian, Aymara, Azerbaijani (Cyrillic), Bashkir, Basque, Belarusian, Belarusian (Lacinka), Bislama, Bosnian, Breton, Buryat (Cyrillic), Catalan, Cebuano, Chamorro, Cheyenne, Chuvash, Cimbrian, Corsican, Croatian, Cyrillic, Czech, Danish, Demo, Dungan, Dutch, English, Esperanto, Estonian, Evenki (Cyrillic), Faroese, Fijian, Finnish, French, French Creole (Saint Lucia), Frisian, Friulian, Galician, Genoese, German, Gilbertese (Kiribati), Greenlandic, Haitian Creole, Hawaiian, Hiligaynon, Hill Mari, Hmong, Hopi, Hungarian, Ibanag, Iloko (Ilokano), Indonesian, Interglossa (Glosa), Interlingua, Irish (Gaelic), Islandic, Istro-Romanian, Italian, Jèrriais, Kalmyk (Cyrillic), Karachay (Cyrillic), Kashubian, Kazakh (Cyrillic), Khalkha, Khanty, Komi-Permyak, Kurdish (Kurmanji), Kyrgyz (Cyrillic), Ladin, Latin Basic, Latvian, Lithuanian, Lojban, Lombard, Low Saxon, Luxembourgian, Malagasy, Maltese, Manx, Maori, Meadow Mari, Megleno-Romanian, Mohawk, Moldovan, Nahuatl, Nenets, Norfolk/Pitcairnese, Northern Sotho (Pedi), Norwegian, Occitan, Oromo, Ossetian, Pangasinan, Papiamento, Piedmontese, Polish, Portuguese, Potawatomi, Quechua, Rhaeto-Romance, Romanian, Romansh (Rumantsch), Rotokas, Russian, Rusyn, Sami (Lule), Samoan, Sardinian (Sardu), Scots (Gaelic), Serbian (Cyrillic), Seychellois Creole (Seselwa), Shona, Sicilian, Slovak, Slovenian (Slovene), Somali, Southern Ndebele, Southern Sotho (Sesotho), Spanish, Swahili, Swati/Swazi, Swedish, Tagalog (Filipino/Pilipino), Tahitian, Tajik, Tatar (Cyrillic), Tausug, Tetum (Tetun), Tok Pisin, Tongan (Faka-Tonga), Tswana, Turkish, Turkmen, Turkmen (Cyrillic), Turkmen (Latinized), Tuvaluan, Tuvin, ubasic, Udmurt, Ukrainian, Uyghur (Cyrillic), Uyghur (Latinized), Uzbek (Cyrillic), Veps, Volapük, Votic (Cyrillic), Votic (Latinized), Walloon, Warlpiri, Xhosa, Yakut/Sakha, Yapese, Zulu

+

Glyph Chart

+

The subset of Futura PT Demi Italic in this kit includes all the glyphs listed below. Unicode entities are included above each glyph to help you insert individual characters into your layout.

+
+ +
+
+ + +
+
+ + +
+ +
+ +
+
+
+

Installing Webfonts

+ +

Webfonts are supported by all major browser platforms but not all in the same way. There are currently four different font formats that must be included in order to target all browsers. This includes TTF, WOFF, EOT and SVG.

+ +

1. Upload your webfonts

+

You must upload your webfont kit to your website. They should be in or near the same directory as your CSS files.

+ +

2. Include the webfont stylesheet

+

A special CSS @font-face declaration helps the various browsers select the appropriate font it needs without causing you a bunch of headaches. Learn more about this syntax by reading the Fontspring blog post about it. The code for it is as follows:

+ + + +@font-face{ + font-family: 'MyWebFont'; + src: url('WebFont.eot'); + src: url('WebFont.eot?#iefix') format('embedded-opentype'), + url('WebFont.woff') format('woff'), + url('WebFont.ttf') format('truetype'), + url('WebFont.svg#webfont') format('svg'); +} + + +

We've already gone ahead and generated the code for you. All you have to do is link to the stylesheet in your HTML, like this:

+ <link rel="stylesheet" href="stylesheet.css" type="text/css" charset="utf-8" /> + +

3. Modify your own stylesheet

+

To take advantage of your new fonts, you must tell your stylesheet to use them. Look at the original @font-face declaration above and find the property called "font-family." The name linked there will be what you use to reference the font. Prepend that webfont name to the font stack in the "font-family" property, inside the selector you want to change. For example:

+p { font-family: 'MyWebFont', Arial, sans-serif; } + +

4. Test

+

Getting webfonts to work cross-browser can be tricky. Use the information in the sidebar to help you if you find that fonts aren't loading in a particular browser.

+
+ + +
+ +
+ +
+ +
+ + diff --git a/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.eot b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.eot new file mode 100644 index 0000000000000..920f8a207e928 Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.eot differ diff --git a/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.svg b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.svg new file mode 100644 index 0000000000000..f09aa864eb217 --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.svg @@ -0,0 +1,1366 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.ttf b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.ttf new file mode 100644 index 0000000000000..1a2738a454751 Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.ttf differ diff --git a/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.woff b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.woff new file mode 100644 index 0000000000000..adda7a1fa81b8 Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.woff differ diff --git a/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.woff2 b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.woff2 new file mode 100644 index 0000000000000..d174a85c59d49 Binary files /dev/null and b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/ftn66-webfont.woff2 differ diff --git a/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/specimen_files/grid_12-825-55-15.css b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/specimen_files/grid_12-825-55-15.css new file mode 100644 index 0000000000000..3d6aef783a908 --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/specimen_files/grid_12-825-55-15.css @@ -0,0 +1,129 @@ +/*Notes about grid: +Columns: 12 +Grid Width: 825px +Column Width: 55px +Gutter Width: 15px +-------------------------------*/ + + + +.section {margin-bottom: 18px; +} +.section:after {content: ".";display: block;height: 0;clear: both;visibility: hidden;} +.section {*zoom: 1;} + +.section .firstcolumn, +.section .firstcol {margin-left: 0;} + + +/* Border on left hand side of a column. */ +.border { + padding-left: 7px; + margin-left: 7px; + border-left: 1px solid #eee; +} + +/* Border with more whitespace, spans one column. */ +.colborder { + padding-left: 42px; + margin-left: 42px; + border-left: 1px solid #eee; +} + + + +/* The Grid Classes */ +.grid1, .grid1_2cols, .grid1_3cols, .grid1_4cols, .grid2, .grid2_3cols, .grid2_4cols, .grid3, .grid3_2cols, .grid3_4cols, .grid4, .grid4_3cols, .grid5, .grid5_2cols, .grid5_3cols, .grid5_4cols, .grid6, .grid6_4cols, .grid7, .grid7_2cols, .grid7_3cols, .grid7_4cols, .grid8, .grid8_3cols, .grid9, .grid9_2cols, .grid9_4cols, .grid10, .grid10_3cols, .grid10_4cols, .grid11, .grid11_2cols, .grid11_3cols, .grid11_4cols, .grid12 +{margin-left: 15px;float: left;display: inline; overflow: hidden;} + + +.width1, .grid1, .span-1 {width: 55px;} +.width1_2cols,.grid1_2cols {width: 20px;} +.width1_3cols,.grid1_3cols {width: 8px;} +.width1_4cols,.grid1_4cols {width: 2px;} +.input_width1 {width: 49px;} + +.width2, .grid2, .span-2 {width: 125px;} +.width2_3cols,.grid2_3cols {width: 31px;} +.width2_4cols,.grid2_4cols {width: 20px;} +.input_width2 {width: 119px;} + +.width3, .grid3, .span-3 {width: 195px;} +.width3_2cols,.grid3_2cols {width: 90px;} +.width3_4cols,.grid3_4cols {width: 37px;} +.input_width3 {width: 189px;} + +.width4, .grid4, .span-4 {width: 265px;} +.width4_3cols,.grid4_3cols {width: 78px;} +.input_width4 {width: 259px;} + +.width5, .grid5, .span-5 {width: 335px;} +.width5_2cols,.grid5_2cols {width: 160px;} +.width5_3cols,.grid5_3cols {width: 101px;} +.width5_4cols,.grid5_4cols {width: 72px;} +.input_width5 {width: 329px;} + +.width6, .grid6, .span-6 {width: 405px;} +.width6_4cols,.grid6_4cols {width: 90px;} +.input_width6 {width: 399px;} + +.width7, .grid7, .span-7 {width: 475px;} +.width7_2cols,.grid7_2cols {width: 230px;} +.width7_3cols,.grid7_3cols {width: 148px;} +.width7_4cols,.grid7_4cols {width: 107px;} +.input_width7 {width: 469px;} + +.width8, .grid8, .span-8 {width: 545px;} +.width8_3cols,.grid8_3cols {width: 171px;} +.input_width8 {width: 539px;} + +.width9, .grid9, .span-9 {width: 615px;} +.width9_2cols,.grid9_2cols {width: 300px;} +.width9_4cols,.grid9_4cols {width: 142px;} +.input_width9 {width: 609px;} + +.width10, .grid10, .span-10 {width: 685px;} +.width10_3cols,.grid10_3cols {width: 218px;} +.width10_4cols,.grid10_4cols {width: 160px;} +.input_width10 {width: 679px;} + +.width11, .grid11, .span-11 {width: 755px;} +.width11_2cols,.grid11_2cols {width: 370px;} +.width11_3cols,.grid11_3cols {width: 241px;} +.width11_4cols,.grid11_4cols {width: 177px;} +.input_width11 {width: 749px;} + +.width12, .grid12, .span-12 {width: 825px;} +.input_width12 {width: 819px;} + +/* Subdivided grid spaces */ +.emptycols_left1, .prepend-1 {padding-left: 70px;} +.emptycols_right1, .append-1 {padding-right: 70px;} +.emptycols_left2, .prepend-2 {padding-left: 140px;} +.emptycols_right2, .append-2 {padding-right: 140px;} +.emptycols_left3, .prepend-3 {padding-left: 210px;} +.emptycols_right3, .append-3 {padding-right: 210px;} +.emptycols_left4, .prepend-4 {padding-left: 280px;} +.emptycols_right4, .append-4 {padding-right: 280px;} +.emptycols_left5, .prepend-5 {padding-left: 350px;} +.emptycols_right5, .append-5 {padding-right: 350px;} +.emptycols_left6, .prepend-6 {padding-left: 420px;} +.emptycols_right6, .append-6 {padding-right: 420px;} +.emptycols_left7, .prepend-7 {padding-left: 490px;} +.emptycols_right7, .append-7 {padding-right: 490px;} +.emptycols_left8, .prepend-8 {padding-left: 560px;} +.emptycols_right8, .append-8 {padding-right: 560px;} +.emptycols_left9, .prepend-9 {padding-left: 630px;} +.emptycols_right9, .append-9 {padding-right: 630px;} +.emptycols_left10, .prepend-10 {padding-left: 700px;} +.emptycols_right10, .append-10 {padding-right: 700px;} +.emptycols_left11, .prepend-11 {padding-left: 770px;} +.emptycols_right11, .append-11 {padding-right: 770px;} +.pull-1 {margin-left: -70px;} +.push-1 {margin-right: -70px;margin-left: 18px;float: right;} +.pull-2 {margin-left: -140px;} +.push-2 {margin-right: -140px;margin-left: 18px;float: right;} +.pull-3 {margin-left: -210px;} +.push-3 {margin-right: -210px;margin-left: 18px;float: right;} +.pull-4 {margin-left: -280px;} +.push-4 {margin-right: -280px;margin-left: 18px;float: right;} \ No newline at end of file diff --git a/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/specimen_files/specimen_stylesheet.css b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/specimen_files/specimen_stylesheet.css new file mode 100644 index 0000000000000..aecc43c32ce0e --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/specimen_files/specimen_stylesheet.css @@ -0,0 +1,396 @@ +@import url('grid_12-825-55-15.css'); + +/* + CSS Reset by Eric Meyer - Released under Public Domain + http://meyerweb.com/eric/tools/css/reset/ +*/ +html, body, div, span, applet, object, iframe, +h1, h2, h3, h4, h5, h6, p, blockquote, pre, +a, abbr, acronym, address, big, cite, code, +del, dfn, em, font, img, ins, kbd, q, s, samp, +small, strike, strong, sub, sup, tt, var, +b, u, i, center, dl, dt, dd, ol, ul, li, +fieldset, form, label, legend, table, +caption, tbody, tfoot, thead, tr, th, td + {margin: 0;padding: 0;border: 0;outline: 0; + font-size: 100%;vertical-align: baseline; + background: transparent;} +body {line-height: 1;} +ol, ul {list-style: none;} +blockquote, q {quotes: none;} +blockquote:before, blockquote:after, +q:before, q:after {content: ''; content: none;} +:focus {outline: 0;} +ins {text-decoration: none;} +del {text-decoration: line-through;} +table {border-collapse: collapse;border-spacing: 0;} + + + + +body { + color: #000; + background-color: #dcdcdc; +} + +a { + text-decoration: none; + color: #1883ba; +} + +h1{ + font-size: 32px; + font-weight: normal; + font-style: normal; + margin-bottom: 18px; +} + +h2{ + font-size: 18px; +} + +#container { + width: 865px; + margin: 0px auto; +} + + +#header { + padding: 20px; + font-size: 36px; + background-color: #000; + color: #fff; +} + +#header span { + color: #666; +} +#main_content { + background-color: #fff; + padding: 60px 20px 20px; +} + + +#footer p { + margin: 0; + padding-top: 10px; + padding-bottom: 50px; + color: #333; + font: 10px Arial, sans-serif; +} + +.tabs { + width: 100%; + height: 31px; + background-color: #444; +} +.tabs li { + float: left; + margin: 0; + overflow: hidden; + background-color: #444; +} +.tabs li a { + display: block; + color: #fff; + text-decoration: none; + font: bold 11px/11px 'Arial'; + text-transform: uppercase; + padding: 10px 15px; + border-right: 1px solid #fff; +} + +.tabs li a:hover { + background-color: #00b3ff; + +} + +.tabs li.active a { + color: #000; + background-color: #fff; +} + + + +div.huge { + + font-size: 300px; + line-height: 1em; + padding: 0; + letter-spacing: -.02em; + overflow: hidden; +} +div.glyph_range { + font-size: 72px; + line-height: 1.1em; +} + +.size10{ font-size: 10px; } +.size11{ font-size: 11px; } +.size12{ font-size: 12px; } +.size13{ font-size: 13px; } +.size14{ font-size: 14px; } +.size16{ font-size: 16px; } +.size18{ font-size: 18px; } +.size20{ font-size: 20px; } +.size24{ font-size: 24px; } +.size30{ font-size: 30px; } +.size36{ font-size: 36px; } +.size48{ font-size: 48px; } +.size60{ font-size: 60px; } +.size72{ font-size: 72px; } +.size90{ font-size: 90px; } + + +.psample_row1 { height: 120px;} +.psample_row1 { height: 120px;} +.psample_row2 { height: 160px;} +.psample_row3 { height: 160px;} +.psample_row4 { height: 160px;} + +.psample { + overflow: hidden; + position: relative; +} +.psample p { + line-height: 1.3em; + display: block; + overflow: hidden; + margin: 0; +} + +.psample span { + margin-right: .5em; +} + +.white_blend { + width: 100%; + height: 61px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAO1JREFUeNrs3TsKgFAMRUE/eer+NxztxMYuEWQG3ECKwwUF58ycAKixOAGAyAKILAAiCyCyACILgMgCiCyAyAIgsgAiCyCyAIgsgMgCiCwAIgsgsgAiC4DIAogsACIL0CWuZ3UGgLrIhjMA1EV2OAOAJQtgyQLwjOzmDAAiCyCyAIgsQFtkd2cAEFkAkQVAZAHaIns4A4AlC2DJAiCyACILILIAiCzAV5H1dQGAJQsgsgCILIDIAvwisl58AViyAJYsACILILIAIgvAe2T9EhxAZAFEFgCRBeiL7HAGgLrIhjMAWLIAliwAt1OAAQDwygTBulLIlQAAAABJRU5ErkJggg==); + position: absolute; + bottom: 0; +} +.black_blend { + width: 100%; + height: 61px; + background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAVkAAAA9CAYAAAAH4BojAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAPJJREFUeNrs3TEKhTAQRVGjibr/9QoxhY2N3Ywo50A28IrLwP9g6b1PAMSYTQAgsgAiC4DIAogsgMgCILIAIgsgsgCILIDIAogsACILILIAIguAyAKILIDIAiCyACILgMgCZCnjLWYAiFGvB0BQZJsZAFyyAC5ZAO6RXc0AILIAIguAyAKkRXYzA4DIAogsACILkBbZ3QwALlkAlywAIgsgsgAiC4DIArwVWf8uAHDJAogsACILILIAv4isH74AXLIALlkARBZAZAFEFoDnyPokOIDIAogsACILkBfZZgaAuMhWMwC4ZAE+p4x3mAEgxinAAJ+XBbPWGkwAAAAAAElFTkSuQmCC); + position: absolute; + bottom: 0; +} +.fullreverse { + background: #000 !important; + color: #fff !important; + margin-left: -20px; + padding-left: 20px; + margin-right: -20px; + padding-right: 20px; + padding: 20px; + margin-bottom:0; +} + + +.sample_table td { + padding-top: 3px; + padding-bottom:5px; + padding-left: 5px; + vertical-align: middle; + line-height: 1.2em; +} + +.sample_table td:first-child { + background-color: #eee; + text-align: right; + padding-right: 5px; + padding-left: 0; + padding: 5px; + font: 11px/12px "Courier New", Courier, mono; +} + +code { + white-space: pre; + background-color: #eee; + display: block; + padding: 10px; + margin-bottom: 18px; + overflow: auto; +} + + +.bottom,.last {margin-bottom:0 !important; padding-bottom:0 !important;} + +.box { + padding: 18px; + margin-bottom: 18px; + background: #eee; +} + +.reverse,.reversed { background: #000 !important;color: #fff !important; border: none !important;} + +#bodycomparison { + position: relative; + overflow: hidden; + font-size: 72px; + height: 90px; + white-space: nowrap; +} + +#bodycomparison div{ + font-size: 72px; + line-height: 90px; + display: inline; + margin: 0 15px 0 0; + padding: 0; +} + +#bodycomparison div span{ + font: 10px Arial; + position: absolute; + left: 0; +} +#xheight { + float: none; + position: absolute; + color: #d9f3ff; + font-size: 72px; + line-height: 90px; +} + +.fontbody { + position: relative; +} +.arialbody{ + font-family: Arial; + position: relative; +} +.verdanabody{ + font-family: Verdana; + position: relative; +} +.georgiabody{ + font-family: Georgia; + position: relative; +} + +/* @group Layout page + */ + +#layout h1 { + font-size: 36px; + line-height: 42px; + font-weight: normal; + font-style: normal; +} + +#layout h2 { + font-size: 24px; + line-height: 23px; + font-weight: normal; + font-style: normal; +} + +#layout h3 { + font-size: 22px; + line-height: 1.4em; + margin-top: 1em; + font-weight: normal; + font-style: normal; +} + + +#layout p.byline { + font-size: 12px; + margin-top: 18px; + line-height: 12px; + margin-bottom: 0; +} +#layout p { + font-size: 14px; + line-height: 21px; + margin-bottom: .5em; +} + +#layout p.large{ + font-size: 18px; + line-height: 26px; +} + +#layout .sidebar p{ + font-size: 12px; + line-height: 1.4em; +} + +#layout p.caption { + font-size: 10px; + margin-top: -16px; + margin-bottom: 18px; +} + +/* @end */ + +/* @group Glyphs */ + +#glyph_chart div{ + background-color: #d9f3ff; + color: black; + float: left; + font-size: 36px; + height: 1.2em; + line-height: 1.2em; + margin-bottom: 1px; + margin-right: 1px; + text-align: center; + width: 1.2em; + position: relative; + padding: .6em .2em .2em; +} + +#glyph_chart div p { + position: absolute; + left: 0; + top: 0; + display: block; + text-align: center; + font: bold 9px Arial, sans-serif; + background-color: #3a768f; + width: 100%; + color: #fff; + padding: 2px 0; +} + + +#glyphs h1 { + font-family: Arial, sans-serif; +} +/* @end */ + +/* @group Installing */ + +#installing { + font: 13px Arial, sans-serif; +} + +#installing p, +#glyphs p{ + line-height: 1.2em; + margin-bottom: 18px; + font: 13px Arial, sans-serif; +} + + + +#installing h3{ + font-size: 15px; + margin-top: 18px; +} + +/* @end */ + +#rendering h1 { + font-family: Arial, sans-serif; +} +.render_table td { + font: 11px "Courier New", Courier, mono; + vertical-align: middle; +} + + diff --git a/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/stylesheet.css b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/stylesheet.css new file mode 100644 index 0000000000000..ecd4df123e739 --- /dev/null +++ b/www/src/fonts/Webfonts/futurapt_demiitalic_macroman/stylesheet.css @@ -0,0 +1,37 @@ +/* + * Web Fonts from fontspring.com + * + * All OpenType features and all extended glyphs have been removed. + * Fully installable fonts can be purchased at http://www.fontspring.com + * + * The fonts included in this stylesheet are subject to the End User License you purchased + * from Fontspring. The fonts are protected under domestic and international trademark and + * copyright law. You are prohibited from modifying, reverse engineering, duplicating, or + * distributing this font software. + * + * (c) 2010-2016 Fontspring + * + * + * + * + * The fonts included are copyrighted by the vendor listed below. + * + * Vendor: ParaType + * License URL: https://www.fontspring.com/licenses/paratype/webfont + * + * + */ + +@font-face { + font-family: 'Futura PT'; + src: url('ftn66-webfont.eot'); + src: url('ftn66-webfont.eot?#iefix') format('embedded-opentype'), + url('ftn66-webfont.woff2') format('woff2'), + url('ftn66-webfont.woff') format('woff'), + url('ftn66-webfont.ttf') format('truetype'), + url('ftn66-webfont.svg#futura_ptdemi_oblique') format('svg'); + font-weight: bold; + font-style: italic; + +} + diff --git a/www/src/html.js b/www/src/html.js new file mode 100644 index 0000000000000..0350e59d8b03b --- /dev/null +++ b/www/src/html.js @@ -0,0 +1,98 @@ +import React from "react" +import { TypographyStyle } from "react-typography" +import Helmet from "react-helmet" + +import typography from "./utils/typography" + +let stylesStr +if (process.env.NODE_ENV === `production`) { + try { + stylesStr = require("!raw-loader!../public/styles.css") + } catch (e) { + console.log(e) + } +} + +module.exports = React.createClass({ + render() { + const head = Helmet.rewind() + + let css + if (process.env.NODE_ENV === `production`) { + css = ( +