From 29052aba7d0b78316d3a52aef1d7ddd54fe6ca84 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 22 Dec 2018 16:09:27 -0500 Subject: [PATCH] Bring svelte.technology source into main repo --- .eslintrc.json | 87 +- .gitignore | 6 +- package.json | 2 +- site/.eslintrc.json | 45 + site/.travis.yml | 11 + site/README.md | 75 + site/appveyor.yml | 18 + ...-11-26-frameworks-without-the-framework.md | 56 + ...17-08-07-the-easiest-way-to-get-started.md | 66 + .../2017-09-06-the-zen-of-just-writing-css.md | 77 + ...per-towards-the-ideal-web-app-framework.md | 85 + site/content/blog/2018-04-18-version-2.md | 218 + site/content/examples/7guis-circles/App.html | 125 + .../content/examples/7guis-circles/data.json5 | 1 + site/content/examples/7guis-counter/App.html | 3 + .../content/examples/7guis-counter/data.json5 | 3 + site/content/examples/7guis-crud/App.html | 84 + site/content/examples/7guis-crud/data.json5 | 16 + .../examples/7guis-flight-booker/App.html | 61 + .../examples/7guis-flight-booker/data.json5 | 1 + .../examples/7guis-temperature/App.html | 24 + .../examples/7guis-temperature/data.json5 | 3 + site/content/examples/7guis-timer/App.html | 41 + site/content/examples/7guis-timer/data.json5 | 1 + site/content/examples/await-block/App.html | 24 + site/content/examples/await-block/data.json5 | 1 + site/content/examples/bar-chart/App.html | 112 + site/content/examples/bar-chart/data.json5 | 28 + .../binding-input-checkbox-group/App.html | 16 + .../binding-input-checkbox-group/data.json5 | 3 + .../examples/binding-input-checkbox/App.html | 17 + .../binding-input-checkbox/data.json5 | 16 + .../examples/binding-input-numeric/App.html | 12 + .../examples/binding-input-numeric/data.json5 | 4 + .../examples/binding-input-radio/App.html | 16 + .../examples/binding-input-radio/data.json5 | 3 + .../examples/binding-input-text/App.html | 2 + .../examples/binding-input-text/data.json5 | 3 + .../examples/binding-media-elements/App.html | 96 + .../binding-media-elements/data.json5 | 1 + .../examples/binding-textarea/App.html | 15 + .../examples/binding-textarea/data.json5 | 3 + site/content/examples/each-blocks/App.html | 7 + site/content/examples/each-blocks/data.json5 | 16 + site/content/examples/hacker-news/App.html | 59 + .../content/examples/hacker-news/Comment.html | 28 + site/content/examples/hacker-news/Item.html | 43 + site/content/examples/hacker-news/List.html | 49 + .../content/examples/hacker-news/Summary.html | 38 + site/content/examples/hacker-news/data.json5 | 1 + site/content/examples/hello-world/App.html | 14 + site/content/examples/hello-world/data.json5 | 3 + site/content/examples/if-blocks/App.html | 5 + site/content/examples/if-blocks/data.json5 | 3 + site/content/examples/immutable/App.html | 40 + .../examples/immutable/ImmutableTodo.html | 15 + .../examples/immutable/MutableTodo.html | 13 + site/content/examples/immutable/data.json5 | 7 + site/content/examples/immutable/flash.js | 13 + site/content/examples/line-chart/App.html | 129 + site/content/examples/line-chart/data.json5 | 156 + site/content/examples/manifest.json | 175 + .../content/examples/modal-with-slot/App.html | 29 + .../examples/modal-with-slot/Modal.html | 45 + .../examples/modal-with-slot/data.json5 | 3 + .../examples/nested-components/App.html | 6 + .../examples/nested-components/Nested.html | 1 + .../examples/nested-components/data.json5 | 1 + site/content/examples/parallax/App.html | 76 + site/content/examples/parallax/data.json5 | 1 + site/content/examples/scatterplot/App.html | 28 + .../examples/scatterplot/Scatterplot.html | 111 + site/content/examples/scatterplot/data.json5 | 186 + site/content/examples/scoped-styles/App.html | 11 + .../content/examples/scoped-styles/data.json5 | 1 + .../content/examples/self-references/App.html | 9 + .../examples/self-references/data.json5 | 32 + site/content/examples/svg-clock/App.html | 100 + site/content/examples/svg-clock/data.json5 | 1 + .../examples/transitions-custom/App.html | 46 + .../examples/transitions-custom/data.json5 | 1 + .../examples/transitions-fade/App.html | 11 + .../examples/transitions-fade/data.json5 | 1 + .../content/examples/transitions-fly/App.html | 11 + .../examples/transitions-fly/data.json5 | 1 + .../examples/transitions-in-out/App.html | 11 + .../examples/transitions-in-out/data.json5 | 1 + site/content/guide/00-introduction.md | 112 + site/content/guide/02-template-syntax.md | 281 + site/content/guide/03-scoped-styles.md | 118 + site/content/guide/04-behaviour.md | 121 + site/content/guide/05-nested-components.md | 147 + site/content/guide/06-special-components.md | 137 + site/content/guide/07-events.md | 180 + site/content/guide/08-bindings.md | 161 + site/content/guide/09-transitions.md | 89 + site/content/guide/10-actions.md | 103 + site/content/guide/11-classes.md | 70 + site/content/guide/14-module-context.md | 67 + .../content/guide/15-server-side-rendering.md | 78 + site/content/guide/16-state-management.md | 304 ++ site/content/guide/17-preprocessing.md | 61 + site/content/guide/18-advanced.md | 150 + site/content/guide/19-custom-elements.md | 109 + site/content/guide/20-miscellaneous.md | 8 + site/content/guide/98-api-reference.md | 154 + site/content/guide/99-still-to-come.md | 5 + site/cypress.json | 4 + site/cypress/fixtures/example.json | 5 + site/cypress/integration/spec.js | 19 + site/cypress/plugins/index.js | 17 + site/cypress/support/commands.js | 25 + site/cypress/support/index.js | 20 + site/now.json | 16 + site/package-lock.json | 4550 +++++++++++++++++ site/package.json | 56 + site/rollup.config.js | 96 + site/src/client.js | 5 + site/src/components/debug-css.html | 68 + site/src/components/icon.html | 39 + site/src/components/inline-svg.html | 140 + site/src/components/isometry.html | 28 + site/src/components/logo.html | 28 + site/src/components/theme-input.html | 81 + site/src/components/toaster.html | 49 + site/src/components/top-nav.html | 224 + site/src/routes/_error.html | 39 + site/src/routes/_layout.html | 28 + site/src/routes/about.html | 7 + site/src/routes/api/blog/[slug].js | 20 + site/src/routes/api/blog/_posts.js | 60 + site/src/routes/api/blog/index.js | 20 + site/src/routes/api/examples/[slug].js | 74 + site/src/routes/auth/me.json.js | 9 + site/src/routes/blog/[slug].html | 76 + site/src/routes/blog/index.html | 123 + site/src/routes/blog/rss.xml.js | 42 + site/src/routes/gist/[id].js | 81 + site/src/routes/gist/_utils.js | 19 + site/src/routes/gist/create.js | 74 + site/src/routes/guide/_GuideContents.html | 95 + site/src/routes/guide/_sections.js | 219 + site/src/routes/guide/demo/[hash].json.js | 22 + site/src/routes/guide/index.html | 218 + site/src/routes/guide/index.json.js | 15 + site/src/routes/index.html | 183 + .../_components/AppControls/UserMenu.html | 85 + .../repl/_components/AppControls/index.html | 343 ++ .../routes/repl/_components/CodeMirror.html | 252 + .../_components/Input/ComponentSelector.html | 217 + .../repl/_components/Input/ModuleEditor.html | 38 + .../routes/repl/_components/Input/index.html | 29 + .../repl/_components/Output/PropEditor.html | 70 + .../repl/_components/Output/Viewer.html | 395 ++ .../routes/repl/_components/Output/index.html | 173 + site/src/routes/repl/_components/Repl.html | 278 + .../routes/repl/_components/SplitPane.html | 168 + .../routes/repl/_components/_codemirror.js | 10 + .../routes/repl/_components/codemirror.css | 350 ++ site/src/routes/repl/_components/events.js | 19 + site/src/routes/repl/_utils/downloadBlob.js | 11 + .../repl/_utils/getLocationFromStack.js | 31 + site/src/routes/repl/index.html | 212 + site/src/server.js | 114 + site/src/service-worker.js | 82 + site/src/template.html | 36 + site/src/user.js | 16 + site/src/utils/_process_markdown.js | 15 + site/static/curl.js | 22 + site/static/favicon.ico | Bin 0 -> 1150 bytes site/static/favicon.png | Bin 0 -> 4374 bytes .../fonts/aller-subset/aller_lt-web.woff | Bin 0 -> 21948 bytes .../fonts/aller-subset/aller_lt-web.woff2 | Bin 0 -> 17640 bytes .../fonts/aller-subset/aller_rg-web.woff | Bin 0 -> 22984 bytes .../fonts/aller-subset/aller_rg-web.woff2 | Bin 0 -> 18500 bytes .../fonts/asap-subset/asap-bold-web.woff | Bin 0 -> 18896 bytes .../fonts/asap-subset/asap-bold-web.woff2 | Bin 0 -> 15164 bytes site/static/global.css | 404 ++ site/static/great-success.png | Bin 0 -> 81921 bytes site/static/icons/arrow-right.svg | 7 + site/static/icons/check.svg | 4 + site/static/icons/collapse.svg | 4 + site/static/icons/download.svg | 4 + site/static/icons/dropdown.svg | 4 + site/static/icons/expand.svg | 4 + site/static/icons/flip.svg | 4 + site/static/icons/fork.svg | 4 + site/static/icons/link.svg | 4 + site/static/icons/save.svg | 4 + .../images/svelte-android-chrome-192.png | Bin 0 -> 6598 bytes .../images/svelte-android-chrome-512.png | Bin 0 -> 20561 bytes .../static/images/svelte-apple-touch-icon.png | Bin 0 -> 5086 bytes site/static/images/svelte-mstile-150.png | Bin 0 -> 6042 bytes site/static/images/twitter-card.png | Bin 0 -> 20939 bytes site/static/logo.svg | 16 + site/static/manifest.json | 20 + site/static/prism.css | 95 + site/static/repl-viewer.css | 61 + site/static/svelte-logo-192.png | Bin 0 -> 3996 bytes site/static/svelte-logo-512.png | Bin 0 -> 2054 bytes site/static/workers/bundler.js | 217 + site/static/workers/compiler.js | 42 + src/compile/Component.ts | 1 + .../render-dom/wrappers/Element/index.ts | 3 +- .../wrappers/InlineComponent/index.ts | 10 +- src/compile/render-dom/wrappers/Window.ts | 69 +- test/js/samples/hoisted-const/expected.js | 47 + test/js/samples/hoisted-const/input.html | 6 + .../samples/window-binding-scroll/expected.js | 34 +- .../binding-this-component-reactive/Foo.html | 1 + .../_config.js | 8 + .../binding-this-component-reactive/main.html | 9 + .../binding-this-element-reactive/_config.js | 5 + .../binding-this-element-reactive/main.html | 7 + .../_config.js | 0 .../main.html | 0 .../_config.js | 0 .../main.html | 0 .../samples/{refs => binding-this}/_config.js | 0 .../samples/{refs => binding-this}/main.html | 0 220 files changed, 16333 insertions(+), 99 deletions(-) create mode 100644 site/.eslintrc.json create mode 100644 site/.travis.yml create mode 100644 site/README.md create mode 100644 site/appveyor.yml create mode 100644 site/content/blog/2016-11-26-frameworks-without-the-framework.md create mode 100644 site/content/blog/2017-08-07-the-easiest-way-to-get-started.md create mode 100644 site/content/blog/2017-09-06-the-zen-of-just-writing-css.md create mode 100644 site/content/blog/2017-12-31-sapper-towards-the-ideal-web-app-framework.md create mode 100644 site/content/blog/2018-04-18-version-2.md create mode 100644 site/content/examples/7guis-circles/App.html create mode 100644 site/content/examples/7guis-circles/data.json5 create mode 100644 site/content/examples/7guis-counter/App.html create mode 100644 site/content/examples/7guis-counter/data.json5 create mode 100644 site/content/examples/7guis-crud/App.html create mode 100644 site/content/examples/7guis-crud/data.json5 create mode 100644 site/content/examples/7guis-flight-booker/App.html create mode 100644 site/content/examples/7guis-flight-booker/data.json5 create mode 100644 site/content/examples/7guis-temperature/App.html create mode 100644 site/content/examples/7guis-temperature/data.json5 create mode 100644 site/content/examples/7guis-timer/App.html create mode 100644 site/content/examples/7guis-timer/data.json5 create mode 100644 site/content/examples/await-block/App.html create mode 100644 site/content/examples/await-block/data.json5 create mode 100644 site/content/examples/bar-chart/App.html create mode 100644 site/content/examples/bar-chart/data.json5 create mode 100644 site/content/examples/binding-input-checkbox-group/App.html create mode 100644 site/content/examples/binding-input-checkbox-group/data.json5 create mode 100644 site/content/examples/binding-input-checkbox/App.html create mode 100644 site/content/examples/binding-input-checkbox/data.json5 create mode 100644 site/content/examples/binding-input-numeric/App.html create mode 100644 site/content/examples/binding-input-numeric/data.json5 create mode 100644 site/content/examples/binding-input-radio/App.html create mode 100644 site/content/examples/binding-input-radio/data.json5 create mode 100644 site/content/examples/binding-input-text/App.html create mode 100644 site/content/examples/binding-input-text/data.json5 create mode 100644 site/content/examples/binding-media-elements/App.html create mode 100644 site/content/examples/binding-media-elements/data.json5 create mode 100644 site/content/examples/binding-textarea/App.html create mode 100644 site/content/examples/binding-textarea/data.json5 create mode 100644 site/content/examples/each-blocks/App.html create mode 100644 site/content/examples/each-blocks/data.json5 create mode 100644 site/content/examples/hacker-news/App.html create mode 100644 site/content/examples/hacker-news/Comment.html create mode 100644 site/content/examples/hacker-news/Item.html create mode 100644 site/content/examples/hacker-news/List.html create mode 100644 site/content/examples/hacker-news/Summary.html create mode 100644 site/content/examples/hacker-news/data.json5 create mode 100644 site/content/examples/hello-world/App.html create mode 100644 site/content/examples/hello-world/data.json5 create mode 100644 site/content/examples/if-blocks/App.html create mode 100644 site/content/examples/if-blocks/data.json5 create mode 100644 site/content/examples/immutable/App.html create mode 100644 site/content/examples/immutable/ImmutableTodo.html create mode 100644 site/content/examples/immutable/MutableTodo.html create mode 100644 site/content/examples/immutable/data.json5 create mode 100644 site/content/examples/immutable/flash.js create mode 100644 site/content/examples/line-chart/App.html create mode 100644 site/content/examples/line-chart/data.json5 create mode 100644 site/content/examples/manifest.json create mode 100644 site/content/examples/modal-with-slot/App.html create mode 100644 site/content/examples/modal-with-slot/Modal.html create mode 100644 site/content/examples/modal-with-slot/data.json5 create mode 100644 site/content/examples/nested-components/App.html create mode 100644 site/content/examples/nested-components/Nested.html create mode 100644 site/content/examples/nested-components/data.json5 create mode 100644 site/content/examples/parallax/App.html create mode 100644 site/content/examples/parallax/data.json5 create mode 100644 site/content/examples/scatterplot/App.html create mode 100644 site/content/examples/scatterplot/Scatterplot.html create mode 100644 site/content/examples/scatterplot/data.json5 create mode 100644 site/content/examples/scoped-styles/App.html create mode 100644 site/content/examples/scoped-styles/data.json5 create mode 100644 site/content/examples/self-references/App.html create mode 100644 site/content/examples/self-references/data.json5 create mode 100644 site/content/examples/svg-clock/App.html create mode 100644 site/content/examples/svg-clock/data.json5 create mode 100644 site/content/examples/transitions-custom/App.html create mode 100644 site/content/examples/transitions-custom/data.json5 create mode 100644 site/content/examples/transitions-fade/App.html create mode 100644 site/content/examples/transitions-fade/data.json5 create mode 100644 site/content/examples/transitions-fly/App.html create mode 100644 site/content/examples/transitions-fly/data.json5 create mode 100644 site/content/examples/transitions-in-out/App.html create mode 100644 site/content/examples/transitions-in-out/data.json5 create mode 100644 site/content/guide/00-introduction.md create mode 100644 site/content/guide/02-template-syntax.md create mode 100644 site/content/guide/03-scoped-styles.md create mode 100644 site/content/guide/04-behaviour.md create mode 100644 site/content/guide/05-nested-components.md create mode 100644 site/content/guide/06-special-components.md create mode 100644 site/content/guide/07-events.md create mode 100644 site/content/guide/08-bindings.md create mode 100644 site/content/guide/09-transitions.md create mode 100644 site/content/guide/10-actions.md create mode 100644 site/content/guide/11-classes.md create mode 100644 site/content/guide/14-module-context.md create mode 100644 site/content/guide/15-server-side-rendering.md create mode 100644 site/content/guide/16-state-management.md create mode 100644 site/content/guide/17-preprocessing.md create mode 100644 site/content/guide/18-advanced.md create mode 100644 site/content/guide/19-custom-elements.md create mode 100644 site/content/guide/20-miscellaneous.md create mode 100644 site/content/guide/98-api-reference.md create mode 100644 site/content/guide/99-still-to-come.md create mode 100644 site/cypress.json create mode 100644 site/cypress/fixtures/example.json create mode 100644 site/cypress/integration/spec.js create mode 100644 site/cypress/plugins/index.js create mode 100644 site/cypress/support/commands.js create mode 100644 site/cypress/support/index.js create mode 100644 site/now.json create mode 100644 site/package-lock.json create mode 100644 site/package.json create mode 100644 site/rollup.config.js create mode 100644 site/src/client.js create mode 100644 site/src/components/debug-css.html create mode 100644 site/src/components/icon.html create mode 100644 site/src/components/inline-svg.html create mode 100644 site/src/components/isometry.html create mode 100644 site/src/components/logo.html create mode 100644 site/src/components/theme-input.html create mode 100644 site/src/components/toaster.html create mode 100644 site/src/components/top-nav.html create mode 100644 site/src/routes/_error.html create mode 100644 site/src/routes/_layout.html create mode 100644 site/src/routes/about.html create mode 100644 site/src/routes/api/blog/[slug].js create mode 100644 site/src/routes/api/blog/_posts.js create mode 100644 site/src/routes/api/blog/index.js create mode 100644 site/src/routes/api/examples/[slug].js create mode 100644 site/src/routes/auth/me.json.js create mode 100644 site/src/routes/blog/[slug].html create mode 100644 site/src/routes/blog/index.html create mode 100644 site/src/routes/blog/rss.xml.js create mode 100644 site/src/routes/gist/[id].js create mode 100644 site/src/routes/gist/_utils.js create mode 100644 site/src/routes/gist/create.js create mode 100644 site/src/routes/guide/_GuideContents.html create mode 100644 site/src/routes/guide/_sections.js create mode 100644 site/src/routes/guide/demo/[hash].json.js create mode 100644 site/src/routes/guide/index.html create mode 100644 site/src/routes/guide/index.json.js create mode 100644 site/src/routes/index.html create mode 100644 site/src/routes/repl/_components/AppControls/UserMenu.html create mode 100644 site/src/routes/repl/_components/AppControls/index.html create mode 100644 site/src/routes/repl/_components/CodeMirror.html create mode 100644 site/src/routes/repl/_components/Input/ComponentSelector.html create mode 100644 site/src/routes/repl/_components/Input/ModuleEditor.html create mode 100644 site/src/routes/repl/_components/Input/index.html create mode 100644 site/src/routes/repl/_components/Output/PropEditor.html create mode 100644 site/src/routes/repl/_components/Output/Viewer.html create mode 100644 site/src/routes/repl/_components/Output/index.html create mode 100644 site/src/routes/repl/_components/Repl.html create mode 100644 site/src/routes/repl/_components/SplitPane.html create mode 100644 site/src/routes/repl/_components/_codemirror.js create mode 100644 site/src/routes/repl/_components/codemirror.css create mode 100644 site/src/routes/repl/_components/events.js create mode 100644 site/src/routes/repl/_utils/downloadBlob.js create mode 100644 site/src/routes/repl/_utils/getLocationFromStack.js create mode 100644 site/src/routes/repl/index.html create mode 100644 site/src/server.js create mode 100644 site/src/service-worker.js create mode 100644 site/src/template.html create mode 100644 site/src/user.js create mode 100644 site/src/utils/_process_markdown.js create mode 100644 site/static/curl.js create mode 100644 site/static/favicon.ico create mode 100644 site/static/favicon.png create mode 100755 site/static/fonts/aller-subset/aller_lt-web.woff create mode 100755 site/static/fonts/aller-subset/aller_lt-web.woff2 create mode 100755 site/static/fonts/aller-subset/aller_rg-web.woff create mode 100755 site/static/fonts/aller-subset/aller_rg-web.woff2 create mode 100755 site/static/fonts/asap-subset/asap-bold-web.woff create mode 100755 site/static/fonts/asap-subset/asap-bold-web.woff2 create mode 100644 site/static/global.css create mode 100644 site/static/great-success.png create mode 100644 site/static/icons/arrow-right.svg create mode 100644 site/static/icons/check.svg create mode 100644 site/static/icons/collapse.svg create mode 100644 site/static/icons/download.svg create mode 100644 site/static/icons/dropdown.svg create mode 100644 site/static/icons/expand.svg create mode 100644 site/static/icons/flip.svg create mode 100644 site/static/icons/fork.svg create mode 100644 site/static/icons/link.svg create mode 100644 site/static/icons/save.svg create mode 100644 site/static/images/svelte-android-chrome-192.png create mode 100644 site/static/images/svelte-android-chrome-512.png create mode 100644 site/static/images/svelte-apple-touch-icon.png create mode 100644 site/static/images/svelte-mstile-150.png create mode 100644 site/static/images/twitter-card.png create mode 100644 site/static/logo.svg create mode 100644 site/static/manifest.json create mode 100644 site/static/prism.css create mode 100644 site/static/repl-viewer.css create mode 100644 site/static/svelte-logo-192.png create mode 100644 site/static/svelte-logo-512.png create mode 100644 site/static/workers/bundler.js create mode 100644 site/static/workers/compiler.js create mode 100644 test/js/samples/hoisted-const/expected.js create mode 100644 test/js/samples/hoisted-const/input.html create mode 100644 test/runtime/samples/binding-this-component-reactive/Foo.html create mode 100644 test/runtime/samples/binding-this-component-reactive/_config.js create mode 100644 test/runtime/samples/binding-this-component-reactive/main.html create mode 100644 test/runtime/samples/binding-this-element-reactive/_config.js create mode 100644 test/runtime/samples/binding-this-element-reactive/main.html rename test/runtime/samples/{refs-no-innerhtml => binding-this-no-innerhtml}/_config.js (100%) rename test/runtime/samples/{refs-no-innerhtml => binding-this-no-innerhtml}/main.html (100%) rename test/runtime/samples/{refs-unset => binding-this-unset}/_config.js (100%) rename test/runtime/samples/{refs-unset => binding-this-unset}/main.html (100%) rename test/runtime/samples/{refs => binding-this}/_config.js (100%) rename test/runtime/samples/{refs => binding-this}/main.html (100%) diff --git a/.eslintrc.json b/.eslintrc.json index 340b9a0e12..c5da7150a7 100644 --- a/.eslintrc.json +++ b/.eslintrc.json @@ -1,46 +1,45 @@ { - "root": true, - "rules": { - "indent": [ 2, "tab", { "SwitchCase": 1 } ], - "semi": [ 2, "always" ], - "keyword-spacing": [ 2, { "before": true, "after": true } ], - "space-before-blocks": [ 2, "always" ], - "no-mixed-spaces-and-tabs": [ 2, "smart-tabs" ], - "no-cond-assign": 0, - "no-unused-vars": 2, - "object-shorthand": [ 2, "always" ], - "no-const-assign": 2, - "no-class-assign": 2, - "no-this-before-super": 2, - "no-var": 2, - "no-unreachable": 2, - "valid-typeof": 2, - "quote-props": [ 2, "as-needed" ], - "one-var": [ 2, "never" ], - "prefer-arrow-callback": 2, - "prefer-const": [ 2, { "destructuring": "all" } ], - "arrow-spacing": 2, - "no-inner-declarations": 0 - }, - "env": { - "es6": true, - "browser": true, - "node": true, - "mocha": true - }, - "extends": [ - "eslint:recommended", - "plugin:import/errors", - "plugin:import/warnings" - ], - "plugins": [ - "html" - ], - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module" - }, - "settings": { - "import/core-modules": [ "svelte" ] - } + "root": true, + "rules": { + "indent": [2, "tab", { "SwitchCase": 1 }], + "semi": [2, "always"], + "keyword-spacing": [2, { "before": true, "after": true }], + "space-before-blocks": [2, "always"], + "no-mixed-spaces-and-tabs": [2, "smart-tabs"], + "no-cond-assign": 0, + "no-unused-vars": 2, + "object-shorthand": [2, "always"], + "no-const-assign": 2, + "no-class-assign": 2, + "no-this-before-super": 2, + "no-var": 2, + "no-unreachable": 2, + "valid-typeof": 2, + "quote-props": [2, "as-needed"], + "one-var": [2, "never"], + "prefer-arrow-callback": 2, + "prefer-const": [2, { "destructuring": "all" }], + "arrow-spacing": 2, + "no-inner-declarations": 0 + }, + "env": { + "es6": true, + "browser": true, + "node": true, + "mocha": true + }, + "extends": [ + "eslint:recommended", + "plugin:import/errors", + "plugin:import/warnings" + ], + "plugins": ["svelte3"], + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module" + }, + "settings": { + "import/core-modules": ["svelte"], + "svelte3/extensions": ["html"] + } } diff --git a/.gitignore b/.gitignore index dbed468f15..1499a0e697 100644 --- a/.gitignore +++ b/.gitignore @@ -17,4 +17,8 @@ node_modules /test/sourcemaps/samples/*/output.css.map /yarn-error.log _actual*.* -_*/ + +/site/cypress/screenshots/ +/site/__sapper__/ +/site/.env +/site/.sessions \ No newline at end of file diff --git a/package.json b/package.json index 9cac947be5..0f43ed0019 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "svelte", - "version": "3.0.0-alpha6", + "version": "3.0.0-alpha8", "description": "The magical disappearing UI framework", "module": "index.mjs", "main": "index.js", diff --git a/site/.eslintrc.json b/site/.eslintrc.json new file mode 100644 index 0000000000..cb0d06a2ec --- /dev/null +++ b/site/.eslintrc.json @@ -0,0 +1,45 @@ +{ + "root": true, + "rules": { + "indent": [2, "tab", { "SwitchCase": 1 }], + "semi": [2, "always"], + "keyword-spacing": [2, { "before": true, "after": true }], + "space-before-blocks": [2, "always"], + "no-mixed-spaces-and-tabs": [2, "smart-tabs"], + "no-cond-assign": 0, + "no-unused-vars": 2, + "object-shorthand": [2, "always"], + "no-const-assign": 2, + "no-class-assign": 2, + "no-this-before-super": 2, + "no-var": 2, + "no-unreachable": 2, + "valid-typeof": 2, + "quote-props": [2, "as-needed"], + "one-var": [2, "never"], + "prefer-arrow-callback": 2, + "prefer-const": [2, { "destructuring": "all" }], + "arrow-spacing": 2, + "no-inner-declarations": 0 + }, + "env": { + "es6": true, + "browser": true, + "node": true, + "mocha": true + }, + "extends": [ + "eslint:recommended", + "plugin:import/errors", + "plugin:import/warnings" + ], + "plugins": ["svelte3"], + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "module" + }, + "settings": { + "import/core-modules": ["svelte"], + "svelte3/extensions": [".html"] + } +} diff --git a/site/.travis.yml b/site/.travis.yml new file mode 100644 index 0000000000..8ad1fc38c8 --- /dev/null +++ b/site/.travis.yml @@ -0,0 +1,11 @@ +sudo: false +language: node_js +node_js: + - "stable" +env: + global: + - BUILD_TIMEOUT=10000 +install: + - npm install + - npm install cypress + diff --git a/site/README.md b/site/README.md new file mode 100644 index 0000000000..eb3c7013ce --- /dev/null +++ b/site/README.md @@ -0,0 +1,75 @@ +# sapper-template-rollup + +A version of the default [Sapper](https://github.com/sveltejs/sapper) template that uses Rollup instead of webpack. To clone it and get started: + +```bash +npx degit sveltejs/sapper-template#rollup my-app +cd my-app +npm install # or yarn! +npm run dev +``` + +Open up [localhost:3000](http://localhost:3000) and start clicking around. + +Consult [sapper.svelte.technology](https://sapper.svelte.technology) for help getting started. + +*[Click here for the webpack version of this template](https://github.com/sveltejs/sapper-template)* + +## Structure + +Sapper expects to find three directories in the root of your project — `app`, `assets` and `routes`. + + +### app + +The [app](app) directory contains the entry points for your app — `client.js`, `server.js` and (optionally) a `service-worker.js` — along with a `template.html` file. + + +### assets + +The [assets](assets) directory contains any static assets that should be available. These are served using [sirv](https://github.com/lukeed/sirv). + +In your [service-worker.js](app/service-worker.js) file, you can import these as `assets` from the generated manifest... + +```js +import { assets } from './manifest/service-worker.js'; +``` + +...so that you can cache them (though you can choose not to, for example if you don't want to cache very large files). + + +### routes + +This is the heart of your Sapper app. There are two kinds of routes — *pages*, and *server routes*. + +**Pages** are Svelte components written in `.html` files. When a user first visits the application, they will be served a server-rendered version of the route in question, plus some JavaScript that 'hydrates' the page and initialises a client-side router. From that point forward, navigating to other pages is handled entirely on the client for a fast, app-like feel. (Sapper will preload and cache the code for these subsequent pages, so that navigation is instantaneous.) + +**Server routes** are modules written in `.js` files, that export functions corresponding to HTTP methods. Each function receives Express `request` and `response` objects as arguments, plus a `next` function. This is useful for creating a JSON API, for example. + +There are three simple rules for naming the files that define your routes: + +* A file called `routes/about.html` corresponds to the `/about` route. A file called `routes/blog/[slug].html` corresponds to the `/blog/:slug` route, in which case `params.slug` is available to the route +* The file `routes/index.html` (or `routes/index.js`) corresponds to the root of your app. `routes/about/index.html` is treated the same as `routes/about.html`. +* Files and directories with a leading underscore do *not* create routes. This allows you to colocate helper modules and components with the routes that depend on them — for example you could have a file called `routes/_helpers/datetime.js` and it would *not* create a `/_helpers/datetime` route + + +## Rollup config + +Sapper uses Rollup to provide code-splitting and dynamic imports, as well as compiling your Svelte components. As long as you don't do anything daft, you can edit the configuration files to add whatever plugins you'd like. + + +## Production mode and deployment + +To start a production version of your app, run `npm run build && npm start`. + +You can deploy your application to any environment that supports Node 8 or above. As an example, to deploy to [Now](https://zeit.co/now), run these commands: + +```bash +npm install -g now +now +``` + + +## Bugs and feedback + +Sapper is in early development, and may have the odd rough edge here and there. Please be vocal over on the [Sapper issue tracker](https://github.com/sveltejs/sapper/issues). diff --git a/site/appveyor.yml b/site/appveyor.yml new file mode 100644 index 0000000000..e75da3bfae --- /dev/null +++ b/site/appveyor.yml @@ -0,0 +1,18 @@ +version: "{build}" + +shallow_clone: true + +init: + - git config --global core.autocrlf false + +build: off + +environment: + matrix: + # node.js + - nodejs_version: stable + +install: + - ps: Install-Product node $env:nodejs_version + - npm install cypress + - npm install diff --git a/site/content/blog/2016-11-26-frameworks-without-the-framework.md b/site/content/blog/2016-11-26-frameworks-without-the-framework.md new file mode 100644 index 0000000000..9c663a01ba --- /dev/null +++ b/site/content/blog/2016-11-26-frameworks-without-the-framework.md @@ -0,0 +1,56 @@ +--- +title: Frameworks without the framework: why didn't we think of this sooner? +description: You can't write serious applications in vanilla JavaScript without hitting a complexity wall. But a compiler can do it for you. +pubdate: 2016-11-26 +author: Rich Harris +authorURL: https://twitter.com/Rich_Harris +--- + +> Wait, this new framework has a *runtime*? Ugh. Thanks, I'll pass. +> **– front end developers in 2018** + +We're shipping too much code to our users. Like a lot of front end developers, I've been in denial about that fact, thinking that it was fine to serve 100kb of JavaScript on page load – just use [one less .jpg!](https://twitter.com/miketaylr/status/227056824275333120) – and that what *really* mattered was performance once your app was already interactive. + +But I was wrong. 100kb of .js isn't equivalent to 100kb of .jpg. It's not just the network time that'll kill your app's startup performance, but the time spent parsing and evaluating your script, during which time the browser becomes completely unresponsive. On mobile, those milliseconds rack up very quickly. + +If you're not convinced that this is a problem, follow [Alex Russell](https://twitter.com/slightlylate) on Twitter. Alex [hasn't been making many friends in the framework community lately](https://twitter.com/slightlylate/status/728355959022587905), but he's not wrong. But the proposed alternative to using frameworks like Angular, React and Ember – [Polymer](https://www.polymer-project.org/1.0/) – hasn't yet gained traction in the front end world, and it's certainly not for a lack of marketing. + +Perhaps we need to rethink the whole thing. + + +## What problem do frameworks *really* solve? + +The common view is that frameworks make it easier to manage the complexity of your code: the framework abstracts away all the fussy implementation details with techniques like virtual DOM diffing. But that's not really true. At best, frameworks *move the complexity around*, away from code that you had to write and into code you didn't. + +Instead, the reason that ideas like React are so wildly and deservedly successful is that they make it easier to manage the complexity of your *concepts*. Frameworks are primarily a tool for structuring your thoughts, not your code. + +Given that, what if the framework *didn't actually run in the browser*? What if, instead, it converted your application into pure vanilla JavaScript, just like Babel converts ES2016+ to ES5? You'd pay no upfront cost of shipping a hefty runtime, and your app would get seriously fast, because there'd be no layers of abstraction between your app and the browser. + + +## Introducing Svelte + +Svelte is a new framework that does exactly that. You write your components using HTML, CSS and JavaScript (plus a few extra bits you can [learn in under 5 minutes](/guide)), and during your build process Svelte compiles them into tiny standalone JavaScript modules. By statically analysing the component template, we can make sure that the browser does as little work as possible. + +The [Svelte implementation of TodoMVC](http://svelte-todomvc.surge.sh/) weighs 3.6kb zipped. For comparison, React plus ReactDOM *without any app code* weighs about 45kb zipped. It takes about 10x as long for the browser just to evaluate React as it does for Svelte to be up and running with an interactive TodoMVC. + +And once your app *is* up and running, according to [js-framework-benchmark](https://github.com/krausest/js-framework-benchmark) **Svelte is fast as heck**. It's faster than React. It's faster than Vue. It's faster than Angular, or Ember, or Ractive, or Preact, or Riot, or Mithril. It's competitive with Inferno, which is probably the fastest UI framework in the world, for now, because [Dominic Gannaway](https://twitter.com/trueadm) is a wizard. (Svelte is slower at removing elements. We're [working on it](https://github.com/sveltejs/svelte/issues/26).) + +It's basically as fast as vanilla JS, which makes sense because it *is* vanilla JS – just vanilla JS that you didn't have to write. + + +## But that's not the important thing + +Well, it *is* important – performance matters a great deal. What's really exciting about this approach, though, is that we can finally solve some of the thorniest problems in web development. + +Consider interoperability. Want to `npm install cool-calendar-widget` and use it in your app? Previously, you could only do that if you were already using (a correct version of) the framework that the widget was designed for – if `cool-calendar-widget` was built in React and you're using Angular then, well, hard cheese. But if the widget author used Svelte, apps that use it can be built using whatever technology you like. (On the TODO list: a way to convert Svelte components into web components.) + +Or [code splitting](https://twitter.com/samccone/status/797528710085652480). It's a great idea (only load the code the user needs for the initial view, then get the rest later), but there's a problem – even if you only initially serve one React component instead of 100, *you still have to serve React itself*. With Svelte, code splitting can be much more effective, because the framework is embedded in the component, and the component is tiny. + +Finally, something I've wrestled with a great deal as an open source maintainer: your users always want *their* features prioritised, and underestimate the cost of those features to people who don't need them. A framework author must always balance the long-term health of the project with the desire to meet their users' needs. That's incredibly difficult, because it's hard to anticipate – much less articulate – the consequences of incremental bloat, and it takes serious soft skills to tell people (who may have been enthusiastically evangelising your tool up to that point) that their feature isn't important enough. But with an approach like Svelte's, many features can be added with absolutely no cost to people who don't use them, because the code that implements those features just doesn't get generated by the compiler if it's unnecessary. + + +## We're just getting started + +Svelte is very new. There's a lot of work still left to do – creating build tool integrations, adding a server-side renderer, hot reloading, transitions, more documentation and examples, starter kits, and so on. + +But you can already build rich components with it, which is why we've gone straight to a stable 1.0.0 release. [Read the guide](/guide), [try it out in the REPL](/repl), and head over to [GitHub](https://github.com/sveltejs/svelte) to help kickstart the next era of front end development. diff --git a/site/content/blog/2017-08-07-the-easiest-way-to-get-started.md b/site/content/blog/2017-08-07-the-easiest-way-to-get-started.md new file mode 100644 index 0000000000..08f5b1bf02 --- /dev/null +++ b/site/content/blog/2017-08-07-the-easiest-way-to-get-started.md @@ -0,0 +1,66 @@ +--- +title: The easiest way to get started with Svelte +description: This'll only take a minute. +pubdate: 2017-08-07 +author: Rich Harris +authorURL: https://twitter.com/Rich_Harris +--- + +Svelte is a [new kind of framework](/blog/frameworks-without-the-framework). Rather than putting a ` + + + +
+ + +
+ + + {#each circles as circle} + + {/each} + + +{#if adjusting} +
+

adjust diameter of circle at {selected.cx}, {selected.cy}

+ +
+{/if} \ No newline at end of file diff --git a/site/content/examples/7guis-circles/data.json5 b/site/content/examples/7guis-circles/data.json5 new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/site/content/examples/7guis-circles/data.json5 @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/site/content/examples/7guis-counter/App.html b/site/content/examples/7guis-counter/App.html new file mode 100644 index 0000000000..385a3c9749 --- /dev/null +++ b/site/content/examples/7guis-counter/App.html @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/site/content/examples/7guis-counter/data.json5 b/site/content/examples/7guis-counter/data.json5 new file mode 100644 index 0000000000..f30dc46c11 --- /dev/null +++ b/site/content/examples/7guis-counter/data.json5 @@ -0,0 +1,3 @@ +{ + "count": 0 +} \ No newline at end of file diff --git a/site/content/examples/7guis-crud/App.html b/site/content/examples/7guis-crud/App.html new file mode 100644 index 0000000000..82ce893aac --- /dev/null +++ b/site/content/examples/7guis-crud/App.html @@ -0,0 +1,84 @@ + + + + + + + + + + + + + +
+ + + +
\ No newline at end of file diff --git a/site/content/examples/7guis-crud/data.json5 b/site/content/examples/7guis-crud/data.json5 new file mode 100644 index 0000000000..c3e6dc3e67 --- /dev/null +++ b/site/content/examples/7guis-crud/data.json5 @@ -0,0 +1,16 @@ +{ + "people": [ + { + "first": "Hans", + "last": "Emil" + }, + { + "first": "Max", + "last": "Mustermann" + }, + { + "first": "Roman", + "last": "Tisch" + } + ] +} \ No newline at end of file diff --git a/site/content/examples/7guis-flight-booker/App.html b/site/content/examples/7guis-flight-booker/App.html new file mode 100644 index 0000000000..1cb45371e1 --- /dev/null +++ b/site/content/examples/7guis-flight-booker/App.html @@ -0,0 +1,61 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/site/content/examples/7guis-flight-booker/data.json5 b/site/content/examples/7guis-flight-booker/data.json5 new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/site/content/examples/7guis-flight-booker/data.json5 @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/site/content/examples/7guis-temperature/App.html b/site/content/examples/7guis-temperature/App.html new file mode 100644 index 0000000000..216c3461eb --- /dev/null +++ b/site/content/examples/7guis-temperature/App.html @@ -0,0 +1,24 @@ + + °c = + °f + + + + diff --git a/site/content/examples/7guis-temperature/data.json5 b/site/content/examples/7guis-temperature/data.json5 new file mode 100644 index 0000000000..21950c8dfb --- /dev/null +++ b/site/content/examples/7guis-temperature/data.json5 @@ -0,0 +1,3 @@ +{ + "celsius": 0 +} \ No newline at end of file diff --git a/site/content/examples/7guis-timer/App.html b/site/content/examples/7guis-timer/App.html new file mode 100644 index 0000000000..47afd6c48b --- /dev/null +++ b/site/content/examples/7guis-timer/App.html @@ -0,0 +1,41 @@ + + + + + + +
{(elapsed / 1000).toFixed(1)}s
+ + + + \ No newline at end of file diff --git a/site/content/examples/7guis-timer/data.json5 b/site/content/examples/7guis-timer/data.json5 new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/site/content/examples/7guis-timer/data.json5 @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/site/content/examples/await-block/App.html b/site/content/examples/await-block/App.html new file mode 100644 index 0000000000..dd3ef25bfc --- /dev/null +++ b/site/content/examples/await-block/App.html @@ -0,0 +1,24 @@ + + + + +{#if promise} + {#await promise} +

wait for it...

+ {:then answer} +

the answer is {answer}!

+ {:catch error} +

well that's odd

+ {/await} +{/if} \ No newline at end of file diff --git a/site/content/examples/await-block/data.json5 b/site/content/examples/await-block/data.json5 new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/site/content/examples/await-block/data.json5 @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/site/content/examples/bar-chart/App.html b/site/content/examples/bar-chart/App.html new file mode 100644 index 0000000000..0098454e91 --- /dev/null +++ b/site/content/examples/bar-chart/App.html @@ -0,0 +1,112 @@ + + + + +
+

US birthrate by year {width}/{height}

+ + + + {#each yTicks as tick} + + + {tick} {tick === 20 ? ' per 1,000 population' : ''} + + {/each} + + + + + {#each points as point, i} + + {width > 380 ? point.year : formatMobile(point.year)} + + {/each} + + + + {#each points as point, i} + + {/each} + + +
\ No newline at end of file diff --git a/site/content/examples/bar-chart/data.json5 b/site/content/examples/bar-chart/data.json5 new file mode 100644 index 0000000000..389c90a7d1 --- /dev/null +++ b/site/content/examples/bar-chart/data.json5 @@ -0,0 +1,28 @@ +{ + "points": [ + { + "year": 1990, + "birthrate": 16.7 + }, + { + "year": 1995, + "birthrate": 14.6 + }, + { + "year": 2000, + "birthrate": 14.4 + }, + { + "year": 2005, + "birthrate": 14 + }, + { + "year": 2010, + "birthrate": 13 + }, + { + "year": 2015, + "birthrate": 12.4 + } + ] +} \ No newline at end of file diff --git a/site/content/examples/binding-input-checkbox-group/App.html b/site/content/examples/binding-input-checkbox-group/App.html new file mode 100644 index 0000000000..617e71e17d --- /dev/null +++ b/site/content/examples/binding-input-checkbox-group/App.html @@ -0,0 +1,16 @@ + + + + + + +

{selected.join(', ') || 'nothing'} selected

\ No newline at end of file diff --git a/site/content/examples/binding-input-checkbox-group/data.json5 b/site/content/examples/binding-input-checkbox-group/data.json5 new file mode 100644 index 0000000000..2285e3abfa --- /dev/null +++ b/site/content/examples/binding-input-checkbox-group/data.json5 @@ -0,0 +1,3 @@ +{ + "selected": ["blue"] +} \ No newline at end of file diff --git a/site/content/examples/binding-input-checkbox/App.html b/site/content/examples/binding-input-checkbox/App.html new file mode 100644 index 0000000000..b8facdd53b --- /dev/null +++ b/site/content/examples/binding-input-checkbox/App.html @@ -0,0 +1,17 @@ +{#each todos as todo} +
+ + +
+{/each} + + \ No newline at end of file diff --git a/site/content/examples/binding-input-checkbox/data.json5 b/site/content/examples/binding-input-checkbox/data.json5 new file mode 100644 index 0000000000..4afee559a5 --- /dev/null +++ b/site/content/examples/binding-input-checkbox/data.json5 @@ -0,0 +1,16 @@ +{ + "todos": [ + { + "description": "Buy some milk", + "done": true + }, + { + "description": "Do the laundry", + "done": true + }, + { + "description": "Find life's true purpose", + "done": false + } + ] +} \ No newline at end of file diff --git a/site/content/examples/binding-input-numeric/App.html b/site/content/examples/binding-input-numeric/App.html new file mode 100644 index 0000000000..566c16006c --- /dev/null +++ b/site/content/examples/binding-input-numeric/App.html @@ -0,0 +1,12 @@ + + + + +

{a} * {b} = {a * b}

+ + \ No newline at end of file diff --git a/site/content/examples/binding-input-numeric/data.json5 b/site/content/examples/binding-input-numeric/data.json5 new file mode 100644 index 0000000000..1aa99a76cd --- /dev/null +++ b/site/content/examples/binding-input-numeric/data.json5 @@ -0,0 +1,4 @@ +{ + "a": 5, + "b": 5 +} \ No newline at end of file diff --git a/site/content/examples/binding-input-radio/App.html b/site/content/examples/binding-input-radio/App.html new file mode 100644 index 0000000000..f83813754f --- /dev/null +++ b/site/content/examples/binding-input-radio/App.html @@ -0,0 +1,16 @@ + + + + + + +

selected {selected}

\ No newline at end of file diff --git a/site/content/examples/binding-input-radio/data.json5 b/site/content/examples/binding-input-radio/data.json5 new file mode 100644 index 0000000000..961184190e --- /dev/null +++ b/site/content/examples/binding-input-radio/data.json5 @@ -0,0 +1,3 @@ +{ + "selected": "blue" +} \ No newline at end of file diff --git a/site/content/examples/binding-input-text/App.html b/site/content/examples/binding-input-text/App.html new file mode 100644 index 0000000000..5d81d1e564 --- /dev/null +++ b/site/content/examples/binding-input-text/App.html @@ -0,0 +1,2 @@ + +

Hello {name || 'stranger'}!

\ No newline at end of file diff --git a/site/content/examples/binding-input-text/data.json5 b/site/content/examples/binding-input-text/data.json5 new file mode 100644 index 0000000000..393554903d --- /dev/null +++ b/site/content/examples/binding-input-text/data.json5 @@ -0,0 +1,3 @@ +{ + "name": "" +} \ No newline at end of file diff --git a/site/content/examples/binding-media-elements/App.html b/site/content/examples/binding-media-elements/App.html new file mode 100644 index 0000000000..a8fcb64f64 --- /dev/null +++ b/site/content/examples/binding-media-elements/App.html @@ -0,0 +1,96 @@ + + + + + + +

THX Deep Note

+
+ play/pause button + {format(t)} + {format(d)} +
+ +
+

THX Deep Note

+
+ play/pause button + {format(t)} + {format(d)} +
+
+ + diff --git a/site/content/examples/binding-media-elements/data.json5 b/site/content/examples/binding-media-elements/data.json5 new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/site/content/examples/binding-media-elements/data.json5 @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/site/content/examples/binding-textarea/App.html b/site/content/examples/binding-textarea/App.html new file mode 100644 index 0000000000..4fd46f2625 --- /dev/null +++ b/site/content/examples/binding-textarea/App.html @@ -0,0 +1,15 @@ + + + +
{@html marked(markdown)}
+ + \ No newline at end of file diff --git a/site/content/examples/binding-textarea/data.json5 b/site/content/examples/binding-textarea/data.json5 new file mode 100644 index 0000000000..12268060fb --- /dev/null +++ b/site/content/examples/binding-textarea/data.json5 @@ -0,0 +1,3 @@ +{ + "markdown": "# Markdown editor\n\nTODOs:\n\n* make a Svelte app\n* think of a third item for this list" +} \ No newline at end of file diff --git a/site/content/examples/each-blocks/App.html b/site/content/examples/each-blocks/App.html new file mode 100644 index 0000000000..b8ba07a5e9 --- /dev/null +++ b/site/content/examples/each-blocks/App.html @@ -0,0 +1,7 @@ +

Cats of YouTube

+ + \ No newline at end of file diff --git a/site/content/examples/each-blocks/data.json5 b/site/content/examples/each-blocks/data.json5 new file mode 100644 index 0000000000..41eff03354 --- /dev/null +++ b/site/content/examples/each-blocks/data.json5 @@ -0,0 +1,16 @@ +{ + "cats": [ + { + "name": "Keyboard Cat", + "video": "https://www.youtube.com/watch?v=J---aiyznGQ" + }, + { + "name": "Maru", + "video": "https://www.youtube.com/watch?v=z_AbfPXTKms" + }, + { + "name": "Henri The Existential Cat", + "video": "https://www.youtube.com/watch?v=OUtn3pvWmpg" + } + ] +} \ No newline at end of file diff --git a/site/content/examples/hacker-news/App.html b/site/content/examples/hacker-news/App.html new file mode 100644 index 0000000000..2f8283fdf2 --- /dev/null +++ b/site/content/examples/hacker-news/App.html @@ -0,0 +1,59 @@ + + + + + + +
+ {#if item} + + {:elseif page} + + {/if} +
\ No newline at end of file diff --git a/site/content/examples/hacker-news/Comment.html b/site/content/examples/hacker-news/Comment.html new file mode 100644 index 0000000000..241499dcb3 --- /dev/null +++ b/site/content/examples/hacker-news/Comment.html @@ -0,0 +1,28 @@ + + +
+

{comment.user} {comment.time_ago}

+ + {@html comment.content} + +
+ {#each comment.comments as child} + + {/each} +
+
\ No newline at end of file diff --git a/site/content/examples/hacker-news/Item.html b/site/content/examples/hacker-news/Item.html new file mode 100644 index 0000000000..9ce2f739f8 --- /dev/null +++ b/site/content/examples/hacker-news/Item.html @@ -0,0 +1,43 @@ + + + + +« back + + + +
+ {#each item.comments as comment} + + {/each} +
\ No newline at end of file diff --git a/site/content/examples/hacker-news/List.html b/site/content/examples/hacker-news/List.html new file mode 100644 index 0000000000..361db9905d --- /dev/null +++ b/site/content/examples/hacker-news/List.html @@ -0,0 +1,49 @@ + + + + +{#if items} + {#each items as item, i} + + {/each} + + page {page + 1} +{:else} +

loading...

+{/if} \ No newline at end of file diff --git a/site/content/examples/hacker-news/Summary.html b/site/content/examples/hacker-news/Summary.html new file mode 100644 index 0000000000..0ff25964f7 --- /dev/null +++ b/site/content/examples/hacker-news/Summary.html @@ -0,0 +1,38 @@ + + + + + \ No newline at end of file diff --git a/site/content/examples/hacker-news/data.json5 b/site/content/examples/hacker-news/data.json5 new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/site/content/examples/hacker-news/data.json5 @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/site/content/examples/hello-world/App.html b/site/content/examples/hello-world/App.html new file mode 100644 index 0000000000..f6882abc09 --- /dev/null +++ b/site/content/examples/hello-world/App.html @@ -0,0 +1,14 @@ +

Hello {name}!

+ + \ No newline at end of file diff --git a/site/content/examples/hello-world/data.json5 b/site/content/examples/hello-world/data.json5 new file mode 100644 index 0000000000..3949aecc6a --- /dev/null +++ b/site/content/examples/hello-world/data.json5 @@ -0,0 +1,3 @@ +{ + "name": "world" +} \ No newline at end of file diff --git a/site/content/examples/if-blocks/App.html b/site/content/examples/if-blocks/App.html new file mode 100644 index 0000000000..57de219159 --- /dev/null +++ b/site/content/examples/if-blocks/App.html @@ -0,0 +1,5 @@ +{#if foo} +

foo!

+{:else} +

not foo!

+{/if} \ No newline at end of file diff --git a/site/content/examples/if-blocks/data.json5 b/site/content/examples/if-blocks/data.json5 new file mode 100644 index 0000000000..c803db4749 --- /dev/null +++ b/site/content/examples/if-blocks/data.json5 @@ -0,0 +1,3 @@ +{ + "foo": true +} \ No newline at end of file diff --git a/site/content/examples/immutable/App.html b/site/content/examples/immutable/App.html new file mode 100644 index 0000000000..db7795f43f --- /dev/null +++ b/site/content/examples/immutable/App.html @@ -0,0 +1,40 @@ + + + + +

Immutable

+{#each todos as todo} + +{/each} + +

Mutable

+{#each todos as todo} + +{/each} diff --git a/site/content/examples/immutable/ImmutableTodo.html b/site/content/examples/immutable/ImmutableTodo.html new file mode 100644 index 0000000000..bc2403f048 --- /dev/null +++ b/site/content/examples/immutable/ImmutableTodo.html @@ -0,0 +1,15 @@ + + + + + +{todo.text} diff --git a/site/content/examples/immutable/MutableTodo.html b/site/content/examples/immutable/MutableTodo.html new file mode 100644 index 0000000000..948aaea805 --- /dev/null +++ b/site/content/examples/immutable/MutableTodo.html @@ -0,0 +1,13 @@ + + + +{todo.text} diff --git a/site/content/examples/immutable/data.json5 b/site/content/examples/immutable/data.json5 new file mode 100644 index 0000000000..a0ed59d82b --- /dev/null +++ b/site/content/examples/immutable/data.json5 @@ -0,0 +1,7 @@ +{ + todos: [ + { id: 1, done: true, text: "wash the car" }, + { id: 2, done: false, text: "take the dog for a walk" }, + { id: 3, done: false, text: "mow the lawn" } + ] +} diff --git a/site/content/examples/immutable/flash.js b/site/content/examples/immutable/flash.js new file mode 100644 index 0000000000..d8c251f32a --- /dev/null +++ b/site/content/examples/immutable/flash.js @@ -0,0 +1,13 @@ +import { afterUpdate } from 'svelte'; + +export default function flash(fn) { + afterUpdate(() => { + const span = fn(); + + span.style.color = 'red'; + + setTimeout(() => { + span.style.color = 'black'; + }, 400); + }); +} \ No newline at end of file diff --git a/site/content/examples/line-chart/App.html b/site/content/examples/line-chart/App.html new file mode 100644 index 0000000000..41881f8a8f --- /dev/null +++ b/site/content/examples/line-chart/App.html @@ -0,0 +1,129 @@ + + + + +
+

Arctic sea ice minimum

+ + + + + {#each yTicks as tick} + + + {tick} {tick === 8 ? ' million sq km' : ''} + + {/each} + + + + + {#each xTicks as tick} + + + {width > 380 ? tick : formatMobile(tick)} + + {/each} + + + + + + + +

Average September extent. Source: NSIDC/NASA +

+ + \ No newline at end of file diff --git a/site/content/examples/line-chart/data.json5 b/site/content/examples/line-chart/data.json5 new file mode 100644 index 0000000000..88e7f02f35 --- /dev/null +++ b/site/content/examples/line-chart/data.json5 @@ -0,0 +1,156 @@ +{ + "points": [ + { + "x": 1979, + "y": 7.19 + }, + { + "x": 1980, + "y": 7.83 + }, + { + "x": 1981, + "y": 7.24 + }, + { + "x": 1982, + "y": 7.44 + }, + { + "x": 1983, + "y": 7.51 + }, + { + "x": 1984, + "y": 7.1 + }, + { + "x": 1985, + "y": 6.91 + }, + { + "x": 1986, + "y": 7.53 + }, + { + "x": 1987, + "y": 7.47 + }, + { + "x": 1988, + "y": 7.48 + }, + { + "x": 1989, + "y": 7.03 + }, + { + "x": 1990, + "y": 6.23 + }, + { + "x": 1991, + "y": 6.54 + }, + { + "x": 1992, + "y": 7.54 + }, + { + "x": 1993, + "y": 6.5 + }, + { + "x": 1994, + "y": 7.18 + }, + { + "x": 1995, + "y": 6.12 + }, + { + "x": 1996, + "y": 7.87 + }, + { + "x": 1997, + "y": 6.73 + }, + { + "x": 1998, + "y": 6.55 + }, + { + "x": 1999, + "y": 6.23 + }, + { + "x": 2000, + "y": 6.31 + }, + { + "x": 2001, + "y": 6.74 + }, + { + "x": 2002, + "y": 5.95 + }, + { + "x": 2003, + "y": 6.13 + }, + { + "x": 2004, + "y": 6.04 + }, + { + "x": 2005, + "y": 5.56 + }, + { + "x": 2006, + "y": 5.91 + }, + { + "x": 2007, + "y": 4.29 + }, + { + "x": 2008, + "y": 4.72 + }, + { + "x": 2009, + "y": 5.38 + }, + { + "x": 2010, + "y": 4.92 + }, + { + "x": 2011, + "y": 4.61 + }, + { + "x": 2012, + "y": 3.62 + }, + { + "x": 2013, + "y": 5.35 + }, + { + "x": 2014, + "y": 5.28 + }, + { + "x": 2015, + "y": 4.63 + }, + { + "x": 2016, + "y": 4.72 + } + ] +} \ No newline at end of file diff --git a/site/content/examples/manifest.json b/site/content/examples/manifest.json new file mode 100644 index 0000000000..f14f803ea8 --- /dev/null +++ b/site/content/examples/manifest.json @@ -0,0 +1,175 @@ +[ + { + "name": "Basics", + "examples": [ + { + "slug": "hello-world", + "title": "Hello World!" + }, + { + "slug": "if-blocks", + "title": "If blocks" + }, + { + "slug": "each-blocks", + "title": "Each blocks" + }, + { + "slug": "scoped-styles", + "title": "Scoped styles" + } + ] + }, + { + "name": "Two-way bindings", + "examples": [ + { + "slug": "binding-input-text", + "title": "Text input" + }, + { + "slug": "binding-input-numeric", + "title": "Numeric input" + }, + { + "slug": "binding-textarea", + "title": "Textarea" + }, + { + "slug": "binding-input-checkbox", + "title": "Checkbox input" + }, + { + "slug": "binding-input-checkbox-group", + "title": "Checkbox input (grouped)" + }, + { + "slug": "binding-input-radio", + "title": "Radio input" + }, + { + "slug": "binding-media-elements", + "title": "Media elements" + } + ] + }, + { + "name": "Nested components", + "examples": [ + { + "slug": "nested-components", + "title": "Nested components" + }, + { + "slug": "modal-with-slot", + "title": "Modal with " + }, + { + "slug": "self-references", + "title": "Self-references" + } + ] + }, + { + "name": "SVG and dataviz", + "examples": [ + { + "slug": "svg-clock", + "title": "SVG Clock" + }, + { + "slug": "line-chart", + "title": "Line/area chart" + }, + { + "slug": "bar-chart", + "title": "Bar chart" + }, + { + "slug": "scatterplot", + "title": "Scatterplot" + } + ] + }, + { + "name": "Transitions", + "examples": [ + { + "slug": "transitions-fade", + "title": "Simple fade" + }, + { + "slug": "transitions-fly", + "title": "Parameterised" + }, + { + "slug": "transitions-in-out", + "title": "In and out" + }, + { + "slug": "transitions-custom", + "title": "Custom CSS" + } + ] + }, + { + "name": "Async data", + "examples": [ + { + "slug": "await-block", + "title": "Await block" + } + ] + }, + { + "name": "7guis", + "examples": [ + { + "slug": "7guis-counter", + "title": "Counter" + }, + { + "slug": "7guis-temperature", + "title": "Temperature converter" + }, + { + "slug": "7guis-flight-booker", + "title": "Flight booker" + }, + { + "slug": "7guis-timer", + "title": "Timer" + }, + { + "slug": "7guis-crud", + "title": "CRUD" + }, + { + "slug": "7guis-circles", + "title": "Circles" + } + ] + }, + { + "name": "<:Window>", + "examples": [ + { + "slug": "parallax", + "title": "Parallax" + } + ] + }, + { + "name": "Miscellaneous", + "examples": [ + { + "slug": "hacker-news", + "title": "Hacker News" + }, + { + "slug": "immutable", + "title": "Immutable data" + } + ] + } +] diff --git a/site/content/examples/modal-with-slot/App.html b/site/content/examples/modal-with-slot/App.html new file mode 100644 index 0000000000..621dfdd203 --- /dev/null +++ b/site/content/examples/modal-with-slot/App.html @@ -0,0 +1,29 @@ + + +{#if showModal} + +

+ modal + adjective mod·al \ˈmō-dəl\ +

+ +
    +
  1. of or relating to modality in logic
  2. +
  3. containing provisions as to the mode of procedure or the manner of taking effect —used of a contract or legacy
  4. +
  5. of or relating to a musical mode
  6. +
  7. of or relating to structure as opposed to substance
  8. +
  9. of, relating to, or constituting a grammatical form or category characteristically indicating predication
  10. +
  11. of or relating to a statistical mode
  12. +
+ + merriam-webster.com +
+{:else} + +{/if} \ No newline at end of file diff --git a/site/content/examples/modal-with-slot/Modal.html b/site/content/examples/modal-with-slot/Modal.html new file mode 100644 index 0000000000..87f1b02299 --- /dev/null +++ b/site/content/examples/modal-with-slot/Modal.html @@ -0,0 +1,45 @@ + + + + + + + diff --git a/site/content/examples/modal-with-slot/data.json5 b/site/content/examples/modal-with-slot/data.json5 new file mode 100644 index 0000000000..18cc32884c --- /dev/null +++ b/site/content/examples/modal-with-slot/data.json5 @@ -0,0 +1,3 @@ +{ + "showModal": true +} \ No newline at end of file diff --git a/site/content/examples/nested-components/App.html b/site/content/examples/nested-components/App.html new file mode 100644 index 0000000000..a00cb18a41 --- /dev/null +++ b/site/content/examples/nested-components/App.html @@ -0,0 +1,6 @@ + + +

This is a top-level element.

+ \ No newline at end of file diff --git a/site/content/examples/nested-components/Nested.html b/site/content/examples/nested-components/Nested.html new file mode 100644 index 0000000000..74ee56a5ed --- /dev/null +++ b/site/content/examples/nested-components/Nested.html @@ -0,0 +1 @@ +

And this is a nested component.

\ No newline at end of file diff --git a/site/content/examples/nested-components/data.json5 b/site/content/examples/nested-components/data.json5 new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/site/content/examples/nested-components/data.json5 @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/site/content/examples/parallax/App.html b/site/content/examples/parallax/App.html new file mode 100644 index 0000000000..c7781e7a3f --- /dev/null +++ b/site/content/examples/parallax/App.html @@ -0,0 +1,76 @@ + + + + + + +
+ + + + + +
+ +
+ (scroll down) + parallax has never been this easy +
+ + \ No newline at end of file diff --git a/site/content/examples/parallax/data.json5 b/site/content/examples/parallax/data.json5 new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/site/content/examples/parallax/data.json5 @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/site/content/examples/scatterplot/App.html b/site/content/examples/scatterplot/App.html new file mode 100644 index 0000000000..e45d6f8f7f --- /dev/null +++ b/site/content/examples/scatterplot/App.html @@ -0,0 +1,28 @@ + + +
+

Anscombe's quartet

+ + + + + +
+ + \ No newline at end of file diff --git a/site/content/examples/scatterplot/Scatterplot.html b/site/content/examples/scatterplot/Scatterplot.html new file mode 100644 index 0000000000..6f62bc9c6f --- /dev/null +++ b/site/content/examples/scatterplot/Scatterplot.html @@ -0,0 +1,111 @@ + + + + + + + + {#each yTicks as tick} + + + {tick} + + {/each} + + + + + {#each xTicks as tick} + + + {tick} + + {/each} + + + + {#each points as point} + + {/each} + + + \ No newline at end of file diff --git a/site/content/examples/scatterplot/data.json5 b/site/content/examples/scatterplot/data.json5 new file mode 100644 index 0000000000..8d879e1edd --- /dev/null +++ b/site/content/examples/scatterplot/data.json5 @@ -0,0 +1,186 @@ +{ + "a": [ + { + "x": 10, + "y": 8.04 + }, + { + "x": 8, + "y": 6.95 + }, + { + "x": 13, + "y": 7.58 + }, + { + "x": 9, + "y": 8.81 + }, + { + "x": 11, + "y": 8.33 + }, + { + "x": 14, + "y": 9.96 + }, + { + "x": 6, + "y": 7.24 + }, + { + "x": 4, + "y": 4.26 + }, + { + "x": 12, + "y": 10.84 + }, + { + "x": 7, + "y": 4.82 + }, + { + "x": 5, + "y": 5.68 + } + ], + "b": [ + { + "x": 10, + "y": 9.14 + }, + { + "x": 8, + "y": 8.14 + }, + { + "x": 13, + "y": 8.74 + }, + { + "x": 9, + "y": 8.77 + }, + { + "x": 11, + "y": 9.26 + }, + { + "x": 14, + "y": 8.1 + }, + { + "x": 6, + "y": 6.13 + }, + { + "x": 4, + "y": 3.1 + }, + { + "x": 12, + "y": 9.13 + }, + { + "x": 7, + "y": 7.26 + }, + { + "x": 5, + "y": 4.74 + } + ], + "c": [ + { + "x": 10, + "y": 7.46 + }, + { + "x": 8, + "y": 6.77 + }, + { + "x": 13, + "y": 12.74 + }, + { + "x": 9, + "y": 7.11 + }, + { + "x": 11, + "y": 7.81 + }, + { + "x": 14, + "y": 8.84 + }, + { + "x": 6, + "y": 6.08 + }, + { + "x": 4, + "y": 5.39 + }, + { + "x": 12, + "y": 8.15 + }, + { + "x": 7, + "y": 6.42 + }, + { + "x": 5, + "y": 5.73 + } + ], + "d": [ + { + "x": 8, + "y": 6.58 + }, + { + "x": 8, + "y": 5.76 + }, + { + "x": 8, + "y": 7.71 + }, + { + "x": 8, + "y": 8.84 + }, + { + "x": 8, + "y": 8.47 + }, + { + "x": 8, + "y": 7.04 + }, + { + "x": 8, + "y": 5.25 + }, + { + "x": 19, + "y": 12.5 + }, + { + "x": 8, + "y": 5.56 + }, + { + "x": 8, + "y": 7.91 + }, + { + "x": 8, + "y": 6.89 + } + ] +} \ No newline at end of file diff --git a/site/content/examples/scoped-styles/App.html b/site/content/examples/scoped-styles/App.html new file mode 100644 index 0000000000..c4d73176f0 --- /dev/null +++ b/site/content/examples/scoped-styles/App.html @@ -0,0 +1,11 @@ +
+ Big red Comic Sans +
+ + \ No newline at end of file diff --git a/site/content/examples/scoped-styles/data.json5 b/site/content/examples/scoped-styles/data.json5 new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/site/content/examples/scoped-styles/data.json5 @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/site/content/examples/self-references/App.html b/site/content/examples/self-references/App.html new file mode 100644 index 0000000000..bd4475e206 --- /dev/null +++ b/site/content/examples/self-references/App.html @@ -0,0 +1,9 @@ +
    +
  • {node.name} + {#if node.children} + {#each node.children as child} + + {/each} + {/if} +
  • +
\ No newline at end of file diff --git a/site/content/examples/self-references/data.json5 b/site/content/examples/self-references/data.json5 new file mode 100644 index 0000000000..de0cfbd194 --- /dev/null +++ b/site/content/examples/self-references/data.json5 @@ -0,0 +1,32 @@ +{ + "node": { + "name": "Fruit", + "children": [ + { + "name": "Red", + "children": [ + { + "name": "Cherry" + }, + { + "name": "Strawberry" + } + ] + }, + { + "name": "Green", + "children": [ + { + "name": "Apple" + }, + { + "name": "Pear" + }, + { + "name": "Lime" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/site/content/examples/svg-clock/App.html b/site/content/examples/svg-clock/App.html new file mode 100644 index 0000000000..3e406b5d65 --- /dev/null +++ b/site/content/examples/svg-clock/App.html @@ -0,0 +1,100 @@ + + + + + + + {#each [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55] as minute} + + + {#each [1, 2, 3, 4] as offset} + + {/each} + {/each} + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/site/content/examples/svg-clock/data.json5 b/site/content/examples/svg-clock/data.json5 new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/site/content/examples/svg-clock/data.json5 @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/site/content/examples/transitions-custom/App.html b/site/content/examples/transitions-custom/App.html new file mode 100644 index 0000000000..66d6918895 --- /dev/null +++ b/site/content/examples/transitions-custom/App.html @@ -0,0 +1,46 @@ + + + visible + +{#if visible} +
+ wheeee!!!!! +
+{/if} + + diff --git a/site/content/examples/transitions-custom/data.json5 b/site/content/examples/transitions-custom/data.json5 new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/site/content/examples/transitions-custom/data.json5 @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/site/content/examples/transitions-fade/App.html b/site/content/examples/transitions-fade/App.html new file mode 100644 index 0000000000..ef424447de --- /dev/null +++ b/site/content/examples/transitions-fade/App.html @@ -0,0 +1,11 @@ + + + visible + +{#if visible} +

fades in and out

+{/if} \ No newline at end of file diff --git a/site/content/examples/transitions-fade/data.json5 b/site/content/examples/transitions-fade/data.json5 new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/site/content/examples/transitions-fade/data.json5 @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/site/content/examples/transitions-fly/App.html b/site/content/examples/transitions-fly/App.html new file mode 100644 index 0000000000..2568480bbf --- /dev/null +++ b/site/content/examples/transitions-fly/App.html @@ -0,0 +1,11 @@ + + + visible + +{#if visible} +

flies 200 pixels up, slowly

+{/if} \ No newline at end of file diff --git a/site/content/examples/transitions-fly/data.json5 b/site/content/examples/transitions-fly/data.json5 new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/site/content/examples/transitions-fly/data.json5 @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/site/content/examples/transitions-in-out/App.html b/site/content/examples/transitions-in-out/App.html new file mode 100644 index 0000000000..940377ea3d --- /dev/null +++ b/site/content/examples/transitions-in-out/App.html @@ -0,0 +1,11 @@ + + + visible + +{#if visible} +

flies up, fades out

+{/if} \ No newline at end of file diff --git a/site/content/examples/transitions-in-out/data.json5 b/site/content/examples/transitions-in-out/data.json5 new file mode 100644 index 0000000000..9e26dfeeb6 --- /dev/null +++ b/site/content/examples/transitions-in-out/data.json5 @@ -0,0 +1 @@ +{} \ No newline at end of file diff --git a/site/content/guide/00-introduction.md b/site/content/guide/00-introduction.md new file mode 100644 index 0000000000..f193f32217 --- /dev/null +++ b/site/content/guide/00-introduction.md @@ -0,0 +1,112 @@ +--- +title: Introduction +--- + +### What is Svelte? + +Svelte is a tool for building fast web applications. + +It is similar to JavaScript frameworks such as React and Vue, which share a goal of making it easy to build slick interactive user interfaces. + +But there's a crucial difference: Svelte converts your app into ideal JavaScript at *build time*, rather than interpreting your application code at *run time*. This means you don't pay the performance cost of the framework's abstractions, and you don't incur a penalty when your app first loads. + +You can build your entire app with Svelte, or you can add it incrementally to an existing codebase. You can also ship components as standalone packages that work anywhere, without the overhead of a dependency on a conventional framework. + +[Read the introductory blog post](/blog/frameworks-without-the-framework) to learn more about Svelte's goals and philosophy. + + +### Understanding Svelte components + +In Svelte, an application is composed from one or more *components*. A component is a reusable self-contained block of code that encapsulates markup, styles and behaviours that belong together, written into an `.html` file. Here's a simple example: + +```html + +

Hello {name}!

+``` + +```json +/* { hidden: true } */ +{ + name: 'world' +} +``` + +> Wherever you see REPL links, click through for an interactive example + +Svelte turns this into a JavaScript module that you can import into your app: + +```js +/* { filename: 'main.js' } */ +import App from './App.html'; + +const app = new App({ + target: document.querySelector('main'), + props: { name: 'world' }, +}); + +// change the component's "name" prop. We'll learn about props (aka properties) below +app.name = 'everybody'; + +// detach the component and clean everything up +app.$destroy(); +``` + +Congratulations, you've just learned about half of Svelte's API! + + +### Getting started + +Normally, this is the part where the instructions might tell you to add the framework to your page as a ` + +{#await promise} +

wait for it...

+{:then answer} +

the answer is {answer}!

+{:catch error} +

well that's odd

+{/await} +``` + +If the expression in `{#await expression}` *isn't* a promise, Svelte skips ahead to the `then` section. + + +### Directives + +Directives allow you to add special instructions for adding [event handlers](guide#event-handlers), [bindings](guide#bindings), [transitions](guide#transitions) and so on. We'll cover each of those in later stages of this guide – for now, all you need to know is that directives can be identified by the `:` character: + +```html + +

Count: {count}

+ +``` + +```json +/* { hidden: true } */ +{ + count: 0 +} +``` + +> Technically, the `:` character is used to denote namespaced attributes in HTML. These will *not* be treated as directives, if encountered. + + +### Debug tags + +To inspect data as it changes and flows through your app, use a `{@debug ...}` tag: + +```html + + + +{@debug name} +

Hello {name}!

+``` + +```json +/* { hidden: true } */ +{ + name: 'world' +} +``` + +This will log the value of `name` whenever it changes. If your devtools are open, changing `name` will pause execution and open the debugger. + +You can debug multiple values simultaneously (`{@debug foo, bar, baz}`), or use `{@debug}` to pause execution whenever the surrounding markup is updated. + +> Debug tags only have an effect when compiling with the `dev: true` compiler option. diff --git a/site/content/guide/03-scoped-styles.md b/site/content/guide/03-scoped-styles.md new file mode 100644 index 0000000000..9a96da84db --- /dev/null +++ b/site/content/guide/03-scoped-styles.md @@ -0,0 +1,118 @@ +--- +title: Scoped styles +--- + +One of Svelte's key tenets is that components should be self-contained and reusable in different contexts. Because of that, it has a mechanism for *scoping* your CSS, so that you don't accidentally clobber other selectors on the page. + +### Adding styles + +Your component template can have a ` + +
+ Big red Comic Sans +
+``` + + +### How it works + +Open the example above in the REPL and inspect the element to see what has happened – Svelte has added a `svelte-[uniqueid]` class to the element, and transformed the CSS selector accordingly. Since no other element on the page can share that selector, anything else on the page with `class="foo"` will be unaffected by our styles. + +This is vastly simpler than achieving the same effect via [Shadow DOM](http://caniuse.com/#search=shadow%20dom) and works everywhere without polyfills. + +> Svelte will add a ` + +
+ +
+``` + +> Scoped styles are *not* dynamic – they are shared between all instances of a component. In other words you can't use `{tags}` inside your CSS. + + +### Unused style removal + +Svelte will identify and remove styles that are not being used in your app. It will also emit a warning so that you can remove them from the source. + +For rules *not* to be removed, they must apply to the component's markup. As far as Svelte is concerned `.bold` is unused in the following code and should be removed: + +```html + +
+

this text is not bold

+
+ + + + +``` + +Instead of manually manipulating the DOM, you should always use the `class` attribute (or the [class directive](https://svelte.technology/guide#classes)): + +```html + +
+

this text is bold

+
+``` + +If that's impossible for some reason, you can use `:global(...)`: + +```html + + +``` + +The same applies to the contents of `{@html ...}` tags. \ No newline at end of file diff --git a/site/content/guide/04-behaviour.md b/site/content/guide/04-behaviour.md new file mode 100644 index 0000000000..008a6e4556 --- /dev/null +++ b/site/content/guide/04-behaviour.md @@ -0,0 +1,121 @@ +--- +title: Behaviours +--- + +As well as scoped styles and a template, components can encapsulate *behaviours*. For that, we add a ` + +
+ +
+``` + + +### Internal state + +Often, it makes sense for a component to have internal state that isn't visible to the outside world. + +```html + + + +

Count: {count}

+ +``` + + +### External properties + +On the other hand, for the component to form part of a system, it needs to expose certain values so that they can be set from outside. These are called *props*, and we use the `export` keyword to differentiate them from internal state: + +```html + + + +

Count: {count}

+ +``` + +> Effectively, we're exporting a *contract* with the outside world. The `export` keyword normally means something different in JavaScript, so you might be surprised to see it used like this. Just roll with it for now! + +The `= 0` sets a default value for `count`, if none is provided. + +```js +const counter = new Counter({ + target: document.body, + props: { + count: 99 + } +}); + +counter.count; // 99 +counter.count += 1; // 100 +``` + +Props declared with `const` or `function` are *read-only* — they cannot be set from outside. This allows you to, for example, attach custom methods to your component: + +```js +component.doSomethingFun(); +``` + + +### Lifecycle hooks + +There are four 'hooks' provided by Svelte for adding control logic — `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`. Import them directly from `svelte`: + +```html + + + + + +> Lifecycle hooks do *not* run in server-side rendering (SSR) mode, with the exception of `onDestroy`. More on SSR later. diff --git a/site/content/guide/05-nested-components.md b/site/content/guide/05-nested-components.md new file mode 100644 index 0000000000..be114b49eb --- /dev/null +++ b/site/content/guide/05-nested-components.md @@ -0,0 +1,147 @@ +--- +title: Nested components +--- + +As well as containing elements (and `if` blocks and `each` blocks), Svelte components can contain *other* Svelte components. + +```html + + + +
+ +
+``` + +```html + +

I am a nested component. The answer is {answer}

+``` + +That's similar to doing this... + +```js +import Widget from './Widget.html'; + +const widget = new Widget({ + target: document.querySelector('.widget-container'), + props: { + answer: 42 + } +}); +``` + +...except that Svelte takes care of destroying the child component when the parent is destroyed, and keeps props in sync if they change. + +> Component names must be capitalised, following the widely-used JavaScript convention of capitalising constructor names. It's also an easy way to distinguish components from elements in your template. + + +### Props + +Props, short for 'properties', are the means by which you pass data down from a parent to a child component — in other words, they're just like attributes on an element. As with element attributes, prop values can contain any valid JavaScript expression. + +Often, the name of the property will be the same as the value, in which case we can use a shorthand: + +```html + + + + +``` + +> Note that props are *one-way* — to get data from a child component into a parent component, use [bindings](guide#bindings). + + +### Composing with `` + +A component can contain a `` element, which allows the parent component to inject content: + +```html + + + + +

Hello!

+

This is a box. It can contain anything.

+
+``` + +```html + + + +
+ +
+``` + +The `` element can contain 'fallback content', which will be used if no children are provided for the component: + +```html + + + + +``` + +```html + + + +
+ +

the box is empty!

+
+
+``` + +You can also have *named* slots. Any elements with a corresponding `slot` attribute will fill these slots: + +```html + + + + + P. Sherman + 42 Wallaby Way, Sydney + +``` + +```html + + + +
+

+ Unknown address +
+ Unknown email +
+``` \ No newline at end of file diff --git a/site/content/guide/06-special-components.md b/site/content/guide/06-special-components.md new file mode 100644 index 0000000000..47c31c3733 --- /dev/null +++ b/site/content/guide/06-special-components.md @@ -0,0 +1,137 @@ +--- +title: Special elements +--- + +Svelte includes a handful of built-in elements with special behaviour. + + +### `` + +Sometimes, a component needs to embed itself recursively — for example if you have a tree-like data structure. In Svelte, that's accomplished with the `` tag: + +```html + +{#if countdown > 0} +

{countdown}

+ +{:else} +

liftoff!

+{/if} +``` + +```json +/* { hidden: true } */ +{ + countdown: 5 +} +``` + + +### `` + +If you don't know what kind of component to render until the app runs — in other words, it's driven by state (aka a dynamic component) — you can use ``: + +```html + + + + foo + +``` + +```html + +

Red {name}

+``` + +```html + +

Blue {name}

+``` + +The expression inside the `this="{...}"` can be any valid JavaScript expression. + + +### `` + +The `` tag gives you a convenient way to declaratively add event listeners to `window`. Event listeners are automatically removed when the component is destroyed. + +```html + + + + + +{#if key} +

{key === ' ' ? 'Space' : key} (code {keyCode})

+{:else} +

click in this window and press any key

+{/if} +``` + +You can also bind to certain values — so far `innerWidth`, `outerWidth`, `innerHeight`, `outerHeight`, `scrollX`, `scrollY` and `online`: + +```html + + + + + +
+

user has scrolled {y} pixels

+``` + + +### `` + +TODO REPLACE THIS WITH svelte:body + +The `` tag, just like ``, gives you a convenient way to declaratively add event listeners to the `document` object. This is useful for listening to events that don't fire on `window`, such as `mouseenter` and `mouseleave`. + + +### `` + +If you're building an application with Svelte — particularly if you're using [Sapper](https://sapper.svelte.technology) — then it's likely you'll need to add some content to the `` of your page, such as adding a `` element. + +You can do that with the `<svelte:head>` tag: + +```html +<!-- { title: '<svelte:head> tags' } --> +<svelte:head> + <title>{post.title} • My blog + +``` + +When [server rendering](guide#server-side-rendering), the `` contents can be extracted separately to the rest of the markup. diff --git a/site/content/guide/07-events.md b/site/content/guide/07-events.md new file mode 100644 index 0000000000..6cf6b98a23 --- /dev/null +++ b/site/content/guide/07-events.md @@ -0,0 +1,180 @@ +--- +title: Events +--- + +In most applications, you'll need to respond to the user's actions. In Svelte, this is done with the `on:[event]` directive. + +### Element events + +When used on an element, `on:click={handler}` is equivalent to calling `element.addEventListener('click', handler)`. When the element is removed, Svelte calls `removeEventListener` automatically. + +```html + +

Count: {count}

+ +``` + +```json +/* { hidden: true } */ +{ + count: 0 +} +``` + +For more complicated behaviours, you'll probably want to declare an event handler in your ` + +

Count: {count}

+ +``` + +```json +/* { hidden: true } */ +{ + count: 0 +} +``` + + +### Event handler modifiers + +While you can invoke methods like `event.stopPropagation` directly... + +```html + +
...
+``` + +...it gets annoying if you want to combine that with some other behaviour: + +```html + + + +
...
+``` + +For that reason, Svelte lets you use *event modifiers*: + +- [`preventDefault`](https://developer.mozilla.org/en-US/docs/Web/API/Event/preventDefault) +- [`stopPropagation`](https://developer.mozilla.org/en-US/docs/Web/API/Event/stopPropagation) +- [`passive`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Parameters) — improves scrolling performance on touch/wheel events (Svelte will add it automatically where it's safe to do so) +- [`once`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Parameters) — removes the listener after the first invocation +- [`capture`](https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Parameter) + +> `passive` and `once` are not implemented in `legacy` mode + +The example above can be achieved with modifiers — no need for a separate event handler: + +```html + +
...
+``` + + +### Component events + +Events are an excellent way for [nested components](guide#nested-components) to communicate with their parents. Let's revisit our earlier example, but turn it into a `` component: + +```html + +

Select a category:

+ +{#each categories as category} + +{/each} + + +``` + +When the user clicks a button, the component will fire a `select` event, where the `event` object has a `category` property. Any component that nests `` can listen for events like so: + +```html + + + + +``` + +```html + +

Select a category:

+ +{#each categories as category} + +{/each} + + +``` + +Just as `this` in an element's event handler refers to the element itself, in a component event handler `this` refers to the component firing the event. + +There is also a shorthand for listening for and re-firing an event unchanged. + +```html + + + + +``` + +Since component events do not propagate as DOM events do, this can be used to pass events through intermediate components. This shorthand technique also applies to element events (`on:click` is equivalent to `on:click="fire('click', event)"`). diff --git a/site/content/guide/08-bindings.md b/site/content/guide/08-bindings.md new file mode 100644 index 0000000000..b899ea2376 --- /dev/null +++ b/site/content/guide/08-bindings.md @@ -0,0 +1,161 @@ +--- +title: Bindings +--- + + +### Bindings + +As we've seen, data can be passed down to elements and components with attributes and [props](guide#props). Occasionally, you need to get data back *up*; for that we use bindings. + + +#### Component bindings + +Component bindings keep values in sync between a parent and a child: + +```html + + +``` + +Whenever `childValue` changes in the child component, `parentValue` will be updated in the parent component and vice versa. + +If the names are the same, you can shorten the declaration: + +```html + + +``` + +> Use component bindings judiciously. They can save you a lot of boilerplate, but will make it harder to reason about data flow within your application if you overuse them. + + +#### Element bindings + +Element bindings make it easy to respond to user interactions: + +```html + +

Hello {name}!

+ +``` + +```json +/* { hidden: true } */ +{ + name: 'world' +} +``` + +Some bindings are *one-way*, meaning that the values are read-only. Most are *two-way* — changing the data programmatically will update the DOM. The following bindings are available: + +| Name | Applies to | Kind | +|-----------------------------------------------------------------|----------------------------------------------|----------------------| +| `value` | `` ` + + {#if error} +

+ {#if error.loc} + + {#if error.filename} + {error.filename} + {/if} + + ({error.loc.line}:{error.loc.column}) + + {/if} + + {error.message} +

+ {:elseif warningCount > 0} +

+ Compiled, but with {warningCount} {warningCount === 1 ? 'warning' : 'warnings'} — check the console for details +

+ {/if} + + +{#if !CodeMirror} +

loading editor...

+{/if} + + + \ No newline at end of file diff --git a/site/src/routes/repl/_components/Input/ComponentSelector.html b/site/src/routes/repl/_components/Input/ComponentSelector.html new file mode 100644 index 0000000000..32be6074b1 --- /dev/null +++ b/site/src/routes/repl/_components/Input/ComponentSelector.html @@ -0,0 +1,217 @@ + + + + +
+
+ {#each $component_store as component} + + {/each} +
+ + +
diff --git a/site/src/routes/repl/_components/Input/ModuleEditor.html b/site/src/routes/repl/_components/Input/ModuleEditor.html new file mode 100644 index 0000000000..783dc02dc9 --- /dev/null +++ b/site/src/routes/repl/_components/Input/ModuleEditor.html @@ -0,0 +1,38 @@ + + + + +
+ {#if component} + + {/if} +
\ No newline at end of file diff --git a/site/src/routes/repl/_components/Input/index.html b/site/src/routes/repl/_components/Input/index.html new file mode 100644 index 0000000000..50460af098 --- /dev/null +++ b/site/src/routes/repl/_components/Input/index.html @@ -0,0 +1,29 @@ + + + + + + \ No newline at end of file diff --git a/site/src/routes/repl/_components/Output/PropEditor.html b/site/src/routes/repl/_components/Output/PropEditor.html new file mode 100644 index 0000000000..a42612fb2d --- /dev/null +++ b/site/src/routes/repl/_components/Output/PropEditor.html @@ -0,0 +1,70 @@ + + + + +
+ +
\ No newline at end of file diff --git a/site/src/routes/repl/_components/Output/Viewer.html b/site/src/routes/repl/_components/Output/Viewer.html new file mode 100644 index 0000000000..aeeb49060a --- /dev/null +++ b/site/src/routes/repl/_components/Output/Viewer.html @@ -0,0 +1,395 @@ + + + + +
+ +
+ +
+ {#if error} +

+ {#if error.loc} + + {#if error.filename} + {error.filename} + {/if} + + ({error.loc.line}:{error.loc.column}) + + {/if} + + {error.message} +

+ {:elseif pending} +
+ +
+ {:elseif pendingImports} +

loading {pendingImports} {pendingImports === 1 ? 'dependency' : 'dependencies'} from + https://bundle.run

+ {/if} +
\ No newline at end of file diff --git a/site/src/routes/repl/_components/Output/index.html b/site/src/routes/repl/_components/Output/index.html new file mode 100644 index 0000000000..80bd6c777d --- /dev/null +++ b/site/src/routes/repl/_components/Output/index.html @@ -0,0 +1,173 @@ + + + + +
+ + + +
+ + +{#if view === 'result'} + +
+ {#if bundle} + + {:else} + +

loading Svelte compiler...

+ {/if} +
+ +
+

Props editor

+ + {#if props} + {#if props.length > 0} +
+ {#each props.sort() as prop (prop)} + {prop} + + + + {/each} +
+ {:else} +
+ + +

This component has no props — declare props with the export keyword

+
+ {/if} + {/if} +
+
+{:else} + +
+ +
+ +
+

Compiler options

+ +
TODO
+
+
+{/if} \ No newline at end of file diff --git a/site/src/routes/repl/_components/Repl.html b/site/src/routes/repl/_components/Repl.html new file mode 100644 index 0000000000..4e0bec168c --- /dev/null +++ b/site/src/routes/repl/_components/Repl.html @@ -0,0 +1,278 @@ + + + + +
+ +
+ +
+ +
+ +
+
+
\ No newline at end of file diff --git a/site/src/routes/repl/_components/SplitPane.html b/site/src/routes/repl/_components/SplitPane.html new file mode 100644 index 0000000000..f4843c24e1 --- /dev/null +++ b/site/src/routes/repl/_components/SplitPane.html @@ -0,0 +1,168 @@ + + + + +
+
+ +
+ +
+ +
+ +
+
+ +{#if dragging} +
+{/if} \ No newline at end of file diff --git a/site/src/routes/repl/_components/_codemirror.js b/site/src/routes/repl/_components/_codemirror.js new file mode 100644 index 0000000000..1619ab760c --- /dev/null +++ b/site/src/routes/repl/_components/_codemirror.js @@ -0,0 +1,10 @@ +const CodeMirror = require('codemirror'); +require('./codemirror.css'); +require('codemirror/mode/javascript/javascript.js'); +require('codemirror/mode/shell/shell.js'); +require('codemirror/mode/handlebars/handlebars.js'); +require('codemirror/mode/htmlmixed/htmlmixed.js'); +require('codemirror/mode/xml/xml.js'); +require('codemirror/mode/css/css.js'); + +module.exports = CodeMirror; diff --git a/site/src/routes/repl/_components/codemirror.css b/site/src/routes/repl/_components/codemirror.css new file mode 100644 index 0000000000..e573122457 --- /dev/null +++ b/site/src/routes/repl/_components/codemirror.css @@ -0,0 +1,350 @@ +/* BASICS */ + +.CodeMirror { + /* copied colors over from prism */ + --background: var(--back-light); + --base: hsl(45, 7%, 45%); + --comment: hsl(210, 25%, 60%); + --keyword: hsl(204, 58%, 45%); + --function: hsl(19, 67%, 45%); + --string: hsl(41, 37%, 45%); + --number: hsl(102, 27%, 50%); + --tags: var(--function); + --important: var(--string); + + /* Set height, width, borders, and global font properties here */ + /* see prism.css */ + height: 300px; + direction: ltr; +} + +/* PADDING */ + +.CodeMirror-lines { + padding: 4px 0; /* Vertical padding around content */ +} +.CodeMirror pre { + padding: 0 4px; /* Horizontal padding of content */ +} + +.CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + background-color: white; /* The little square between H and V scrollbars */ +} + +/* GUTTER */ + +.CodeMirror-gutters { + border-right: 1px solid #ddd; + background-color: var(--back-light); + white-space: nowrap; +} +.CodeMirror-linenumber { + padding: 0 3px 0 5px; + min-width: 20px; + text-align: right; + color: var(--comment); + white-space: nowrap; + opacity: .6; +} + +.CodeMirror-guttermarker { color: black; } +.CodeMirror-guttermarker-subtle { color: #999; } + +/* CURSOR */ + +.CodeMirror-cursor { + border-left: 1px solid black; + border-right: none; + width: 0; +} +/* Shown when moving in bi-directional text */ +.CodeMirror div.CodeMirror-secondarycursor { + border-left: 1px solid silver; +} +.cm-fat-cursor .CodeMirror-cursor { + width: auto; + border: 0 !important; + background: #7e7; +} +.cm-fat-cursor div.CodeMirror-cursors { + z-index: 1; +} +.cm-fat-cursor-mark { + background-color: rgba(20, 255, 20, .5); + -webkit-animation: blink 1.06s steps(1) infinite; + -moz-animation: blink 1.06s steps(1) infinite; + animation: blink 1.06s steps(1) infinite; +} +.cm-animate-fat-cursor { + width: auto; + border: 0; + -webkit-animation: blink 1.06s steps(1) infinite; + -moz-animation: blink 1.06s steps(1) infinite; + animation: blink 1.06s steps(1) infinite; + background-color: #7e7; +} +@-moz-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@-webkit-keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} +@keyframes blink { + 0% {} + 50% { background-color: transparent; } + 100% {} +} + +.cm-tab { display: inline-block; text-decoration: inherit; } + +.CodeMirror-rulers { + position: absolute; + left: 0; right: 0; top: -50px; bottom: -20px; + overflow: hidden; +} +.CodeMirror-ruler { + border-left: 1px solid #ccc; + top: 0; bottom: 0; + position: absolute; +} + +/* DEFAULT THEME */ +.cm-s-default .cm-header {color: blue} +.cm-s-default .cm-quote {color: #090} +.cm-negative {color: #d44} +.cm-positive {color: #292} +.cm-header, .cm-strong {font-weight: bold} +.cm-em {font-style: italic} +.cm-link {text-decoration: underline} +.cm-strikethrough {text-decoration: line-through} + +.cm-s-default .cm-atom, +.cm-s-default .cm-def, +.cm-s-default .cm-property, +.cm-s-default .cm-variable-2, +.cm-s-default .cm-variable-3, +.cm-s-default .cm-punctuation {color: var(--base)} +.cm-s-default .cm-hr, +.cm-s-default .cm-comment {color: var(--comment)} +.cm-s-default .cm-attribute, +.cm-s-default .cm-keyword {color: var(--keyword)} +.cm-s-default .cm-variable, +.cm-s-default .cm-bracket, +.cm-s-default .cm-tag {color: var(--tags)} +.cm-s-default .cm-number {color: var(--number)} +.cm-s-default .cm-string {color: var(--string)} + +.cm-s-default .cm-string-2 {color: #f50} +.cm-s-default .cm-type {color: #085} +.cm-s-default .cm-meta {color: #555} +.cm-s-default .cm-qualifier {color: #555} +.cm-s-default .cm-builtin {color: #30a} +.cm-s-default .cm-link {color: var(--flash)} +.cm-s-default .cm-error {color: #ff008c} +.cm-invalidchar {color: #ff008c} + +.CodeMirror-composing { border-bottom: 2px solid; } + +/* Default styles for common addons */ + +div.CodeMirror span.CodeMirror-matchingbracket {color: #0b0;} +div.CodeMirror span.CodeMirror-nonmatchingbracket {color: #a22;} +.CodeMirror-matchingtag { background: rgba(255, 150, 0, .3); } +.CodeMirror-activeline-background {background: #e8f2ff;} + +/* STOP */ + +/* The rest of this file contains styles related to the mechanics of + the editor. You probably shouldn't touch them. */ + +.CodeMirror { + position: relative; + overflow: hidden; + background: white; +} + +.CodeMirror-scroll { + overflow: scroll !important; /* Things will break if this is overridden */ + /* 30px is the magic margin used to hide the element's real scrollbars */ + /* See overflow: hidden in .CodeMirror */ + margin-bottom: -30px; margin-right: -30px; + padding-bottom: 30px; + height: 100%; + outline: none; /* Prevent dragging from highlighting the element */ + position: relative; +} +.CodeMirror-sizer { + position: relative; + border-right: 30px solid transparent; +} + +/* The fake, visible scrollbars. Used to force redraw during scrolling + before actual scrolling happens, thus preventing shaking and + flickering artifacts. */ +.CodeMirror-vscrollbar, .CodeMirror-hscrollbar, .CodeMirror-scrollbar-filler, .CodeMirror-gutter-filler { + position: absolute; + z-index: 6; + display: none; +} +.CodeMirror-vscrollbar { + right: 0; top: 0; + overflow-x: hidden; + overflow-y: scroll; +} +.CodeMirror-hscrollbar { + bottom: 0; left: 0; + overflow-y: hidden; + overflow-x: scroll; +} +.CodeMirror-scrollbar-filler { + right: 0; bottom: 0; +} +.CodeMirror-gutter-filler { + left: 0; bottom: 0; +} + +.CodeMirror-gutters { + position: absolute; left: 0; top: 0; + min-height: 100%; + z-index: 3; +} +.CodeMirror-gutter { + white-space: normal; + height: 100%; + display: inline-block; + vertical-align: top; + margin-bottom: -30px; +} +.CodeMirror-gutter-wrapper { + position: absolute; + z-index: 4; + background: none !important; + border: none !important; +} +.CodeMirror-gutter-background { + position: absolute; + top: 0; bottom: 0; + z-index: 4; +} +.CodeMirror-gutter-elt { + position: absolute; + cursor: default; + z-index: 4; +} +.CodeMirror-gutter-wrapper ::selection { background-color: transparent } +.CodeMirror-gutter-wrapper ::-moz-selection { background-color: transparent } + +.CodeMirror-lines { + cursor: text; + min-height: 1px; /* prevents collapsing before first draw */ +} +.CodeMirror pre { + /* Reset some styles that the rest of the page might have set */ + -moz-border-radius: 0; -webkit-border-radius: 0; border-radius: 0; + border-width: 0; + background: transparent; + font-family: inherit; + font-size: inherit; + margin: 0; + white-space: pre; + word-wrap: normal; + line-height: inherit; + color: inherit; + z-index: 2; + position: relative; + overflow: visible; + -webkit-tap-highlight-color: transparent; + -webkit-font-variant-ligatures: contextual; + font-variant-ligatures: contextual; +} +.CodeMirror-wrap pre { + word-wrap: break-word; + white-space: pre-wrap; + word-break: normal; +} + +.CodeMirror-linebackground { + position: absolute; + left: 0; right: 0; top: 0; bottom: 0; + z-index: 0; +} + +.CodeMirror-linewidget { + position: relative; + z-index: 2; + padding: .1px; /* Force widget margins to stay inside of the container */ +} + +.CodeMirror-rtl pre { direction: rtl; } + +.CodeMirror-code { + outline: none; +} + +/* Force content-box sizing for the elements where we expect it */ +.CodeMirror-scroll, +.CodeMirror-sizer, +.CodeMirror-gutter, +.CodeMirror-gutters, +.CodeMirror-linenumber { + -moz-box-sizing: content-box; + box-sizing: content-box; +} + +.CodeMirror-measure { + position: absolute; + width: 100%; + height: 0; + overflow: hidden; + visibility: hidden; +} + +.CodeMirror-cursor { + position: absolute; + pointer-events: none; +} +.CodeMirror-measure pre { position: static; } + +div.CodeMirror-cursors { + visibility: hidden; + position: relative; + z-index: 3; +} +div.CodeMirror-dragcursors { + visibility: visible; +} + +.CodeMirror-focused div.CodeMirror-cursors { + visibility: visible; +} + +.CodeMirror-selected { background: #d9d9d9; } +.CodeMirror-focused .CodeMirror-selected { background: #d7d4f0; } +.CodeMirror-crosshair { cursor: crosshair; } +.CodeMirror-line::selection, .CodeMirror-line > span::selection, .CodeMirror-line > span > span::selection { background: #d7d4f0; } +.CodeMirror-line::-moz-selection, .CodeMirror-line > span::-moz-selection, .CodeMirror-line > span > span::-moz-selection { background: #d7d4f0; } + +.cm-searching { + background-color: #ffa; + background-color: rgba(255, 255, 0, .4); +} + +/* Used to force a border model for a node */ +.cm-force-border { padding-right: .1px; } + +@media print { + /* Hide the cursor when printing */ + .CodeMirror div.CodeMirror-cursors { + visibility: hidden; + } +} + +/* See issue #2901 */ +.cm-tab-wrap-hack:after { content: ''; } + +/* Help users use markselection to safely style text background */ +span.CodeMirror-selectedtext { background: none; } diff --git a/site/src/routes/repl/_components/events.js b/site/src/routes/repl/_components/events.js new file mode 100644 index 0000000000..c1d2e84199 --- /dev/null +++ b/site/src/routes/repl/_components/events.js @@ -0,0 +1,19 @@ +export function keyEvent(code) { + return function (node, callback) { + node.addEventListener('keydown', handleKeydown); + + function handleKeydown(event) { + if (event.keyCode === code) { + callback.call(this, event); + } + } + + return { + destroy() { + node.removeEventListener('keydown', handleKeydown); + } + }; + } +} + +export const enter = keyEvent(13); \ No newline at end of file diff --git a/site/src/routes/repl/_utils/downloadBlob.js b/site/src/routes/repl/_utils/downloadBlob.js new file mode 100644 index 0000000000..d90ed40530 --- /dev/null +++ b/site/src/routes/repl/_utils/downloadBlob.js @@ -0,0 +1,11 @@ +export default (blob, filename) => { + const url = URL.createObjectURL(blob); + const link = document.createElement('a'); + link.href = url; + link.download = filename; + link.style.display = 'none'; + document.body.appendChild(link); + link.click(); + URL.revokeObjectURL(url); + link.remove(); +}; diff --git a/site/src/routes/repl/_utils/getLocationFromStack.js b/site/src/routes/repl/_utils/getLocationFromStack.js new file mode 100644 index 0000000000..3d10fdee98 --- /dev/null +++ b/site/src/routes/repl/_utils/getLocationFromStack.js @@ -0,0 +1,31 @@ +import { decode } from 'sourcemap-codec'; + +export default function getLocationFromStack(stack, map) { + if (!stack) return; + const last = stack.split('\n')[1]; + const match = /:(\d+):(\d+)\)$/.exec(last); + + if (!match) return null; + + const line = +match[1]; + const column = +match[2]; + + return trace({ line, column }, map); +} + +function trace(loc, map) { + const mappings = decode(map.mappings); + const segments = mappings[loc.line - 1]; + + for (let i = 0; i < segments.length; i += 1) { + const segment = segments[i]; + if (segment[0] === loc.column) { + const [, sourceIndex, line, column] = segment; + const source = map.sources[sourceIndex].slice(2); + + return { source, line: line + 1, column }; + } + } + + return null; +} diff --git a/site/src/routes/repl/index.html b/site/src/routes/repl/index.html new file mode 100644 index 0000000000..112088adb4 --- /dev/null +++ b/site/src/routes/repl/index.html @@ -0,0 +1,212 @@ + + + + + + Svelte REPL + + +
+ + + {#if process.browser} + + {/if} +
diff --git a/site/src/server.js b/site/src/server.js new file mode 100644 index 0000000000..e0a78b072a --- /dev/null +++ b/site/src/server.js @@ -0,0 +1,114 @@ +import 'dotenv/config'; +import express from 'express'; +import compression from 'compression'; +import session from 'express-session'; +import passport from 'passport'; +import { Strategy } from 'passport-github'; +import sessionFileStore from 'session-file-store'; +import serve from 'serve-static'; +import devalue from 'devalue'; +import * as sapper from '../__sapper__/server.js'; + +const app = express(); + +if (process.env.GITHUB_CLIENT_ID) { + const FileStore = sessionFileStore(session); + + passport.use(new Strategy({ + clientID: process.env.GITHUB_CLIENT_ID, + clientSecret: process.env.GITHUB_CLIENT_SECRET, + callbackURL: `${process.env.BASEURL}/auth/callback`, + userAgent: 'svelte.technology' + }, (accessToken, refreshToken, profile, callback) => { + return callback(null, { + token: accessToken, + id: profile.id, + username: profile.username, + displayName: profile.displayName, + photo: profile.photos && profile.photos[0] && profile.photos[0].value + }); + })); + + passport.serializeUser((user, cb) => { + cb(null, user); + }); + + passport.deserializeUser((obj, cb) => { + cb(null, obj); + }); + + app + .use(session({ + secret: 'svelte', + resave: true, + saveUninitialized: true, + cookie: { + maxAge: 31536000 + }, + store: new FileStore({ + path: process.env.NOW ? `/tmp/sessions` : `.sessions` + }) + })) + + .use(passport.initialize()) + .use(passport.session()) + + .get('/auth/login', (req, res, next) => { + const { returnTo } = req.query; + req.session.returnTo = returnTo ? decodeURIComponent(returnTo) : '/'; + next(); + }, passport.authenticate('github', { scope: ['gist', 'read:user'] })) + + .post('/auth/logout', (req, res) => { + req.logout(); + res.end('ok'); + }) + + .get('/auth/callback', passport.authenticate('github', { failureRedirect: '/auth/error' }), (req, res) => { + const { id, username, displayName, photo } = req.session.passport && req.session.passport.user; + + res.set({ 'Content-Type': 'text/html; charset=utf-8' }); + res.end(` + + `); + }); +} else { + app.get('/auth/login', (req, res) => { + res.writeHead(500); + res.end(` + +

Missing .env file

+

In order to use GitHub authentication, you will need to register an OAuth application with gist and read:user scopes, and create a .env file:

+ +
GITHUB_CLIENT_ID=[YOUR_APP_ID]\nGITHUB_CLIENT_SECRET=[YOUR_APP_SECRET]\nBASEURL=http://localhost:3000
+ +

The BASEURL variable should match the callback URL specified for your app.

+ + `); + }); +} + +app.use( + compression({ threshold: 0 }), + serve('static'), + sapper.middleware({ + // TODO update Sapper so that we can pass props to the client + props: req => { + const user = req.session && req.session.passport && req.session.passport.user; + + return { + user: user && { + // strip access token + id: user.id, + username: user.username, + displayName: user.displayName, + photo: user.photo + } + }; + } + }) +).listen(process.env.PORT); \ No newline at end of file diff --git a/site/src/service-worker.js b/site/src/service-worker.js new file mode 100644 index 0000000000..d175aa9a76 --- /dev/null +++ b/site/src/service-worker.js @@ -0,0 +1,82 @@ +import { timestamp, files, shell, routes } from '../__sapper__/service-worker.js'; + +const ASSETS = `cache${timestamp}`; + +// `shell` is an array of all the files generated by Rollup, +// `files` is an array of everything in the `static` directory +const to_cache = shell.concat(files); +const cached = new Set(to_cache); + +self.addEventListener('install', event => { + event.waitUntil( + caches + .open(ASSETS) + .then(cache => cache.addAll(to_cache)) + .then(() => { + self.skipWaiting(); + }) + ); +}); + +self.addEventListener('activate', event => { + event.waitUntil( + caches.keys().then(async keys => { + // delete old caches + for (const key of keys) { + if (key !== ASSETS) await caches.delete(key); + } + + self.clients.claim(); + }) + ); +}); + +self.addEventListener('fetch', event => { + if (event.request.method !== 'GET' || event.request.headers.has('range')) return; + + const url = new URL(event.request.url); + + // don't try to handle e.g. data: URIs + if (!url.protocol.startsWith('http')) return; + + // ignore dev server requests + if (url.hostname === self.location.hostname && url.port !== self.location.port) return; + + // always serve static files and Rollup-generated assets from cache + if (url.host === self.location.host && cached.has(url.pathname)) { + event.respondWith(caches.match(event.request)); + return; + } + + // for pages, you might want to serve a shell `index.html` file, + // which Sapper has generated for you. It's not right for every + // app, but if it's right for yours then uncomment this section + /* + if (url.origin === self.origin && routes.find(route => route.pattern.test(url.pathname))) { + event.respondWith(caches.match('/index.html')); + return; + } + */ + + if (event.request.cache === 'only-if-cached') return; + + // for everything else, try the network first, falling back to + // cache if the user is offline. (If the pages never change, you + // might prefer a cache-first approach to a network-first one.) + event.respondWith( + caches + .open(`offline${timestamp}`) + .then(async cache => { + try { + const response = await fetch(event.request); + cache.put(event.request, response.clone()); + return response; + } catch(err) { + const response = await cache.match(event.request); + if (response) return response; + + throw err; + } + }) + ); +}); diff --git a/site/src/template.html b/site/src/template.html new file mode 100644 index 0000000000..c7dafc73dc --- /dev/null +++ b/site/src/template.html @@ -0,0 +1,36 @@ + + + + + + + + %sapper.base% + + + + + + + + + + %sapper.styles% + + + %sapper.head% + + + +
%sapper.html%
+ + + %sapper.scripts% + + diff --git a/site/src/user.js b/site/src/user.js new file mode 100644 index 0000000000..665db40bae --- /dev/null +++ b/site/src/user.js @@ -0,0 +1,16 @@ +import { writable } from 'svelte/store.js'; + +export const user = writable(null); + +if (process.browser) { + // TODO this is a workaround for the fact that there's currently + // no way to pass session data from server to client + fetch('/auth/me.json', { credentials: 'include' }) + .then(r => r.json()) + .then(user.set); +} + +export async function logout() { + const r = await fetch(`/auth/logout`, { method: 'POST' }); + if (r.ok) user.set(null); +} \ No newline at end of file diff --git a/site/src/utils/_process_markdown.js b/site/src/utils/_process_markdown.js new file mode 100644 index 0000000000..a79d759cbb --- /dev/null +++ b/site/src/utils/_process_markdown.js @@ -0,0 +1,15 @@ +export default function process_markdown(markdown) { + const match = /---\n([\s\S]+?)\n---/.exec(markdown); + const frontMatter = match[1]; + const content = markdown.slice(match[0].length); + + const metadata = {}; + frontMatter.split('\n').forEach(pair => { + const colonIndex = pair.indexOf(':'); + metadata[pair.slice(0, colonIndex).trim()] = pair + .slice(colonIndex + 1) + .trim(); + }); + + return { metadata, content }; +} \ No newline at end of file diff --git a/site/static/curl.js b/site/static/curl.js new file mode 100644 index 0000000000..b0ddc51a71 --- /dev/null +++ b/site/static/curl.js @@ -0,0 +1,22 @@ +/* version: 0.8.13 */ +(function(){/* + MIT License (c) copyright 2010-2013 B Cavalier & J Hann */ + (function(m){function U(){}function u(a,b){return 0==aa.call(a).indexOf("[object "+b)}function I(a){return a&&"/"==a.charAt(a.length-1)?a.substr(0,a.length-1):a}function V(a,b){var d,c,e,f;d=1;c=a;"."==c.charAt(0)&&(e=!0,c=c.replace(ba,function(a,b,c,e){c&&d++;return e||""}));if(e){e=b.split("/");f=e.length-d;if(0>f)return a;e.splice(f,d);return e.concat(c||[]).join("/")}return c}function J(a){var b=a.indexOf("!");return{h:a.substr(b+1),f:0<=b&&a.substr(0,b)}}function P(){}function v(a,b){P.prototype= + a||Q;var d=new P;P.prototype=Q;for(var c in b)d[c]=b[c];return d}function K(){function a(a,b,d){c.push([a,b,d])}function b(a,b){for(var d,e=0;d=c[e++];)(d=d[a])&&d(b)}var d,c,e;d=this;c=[];e=function(d,g){a=d?function(a){a&&a(g)}:function(a,b){b&&b(g)};e=U;b(d?0:1,g);b=U;c=k};this.then=function(b,c,e){a(b,c,e);return d};this.resolve=function(a){d.va=a;e(!0,a)};this.reject=function(a){d.ua=a;e(!1,a)};this.D=function(a){b(2,a)}}function L(a){return a instanceof K||a instanceof B}function w(a,b,d,c){L(a)? + a.then(b,d,c):b(a)}function C(a,b,d){var c;return function(){0<=--a&&b&&(c=b.apply(k,arguments));0==a&&d&&d(c);return c}}function A(){var a,b;D="";a=[].slice.call(arguments);u(a[0],"Object")&&(b=a.shift(),b=M(b));return new B(a[0],a[1],a[2],b)}function M(a,b,d){var c;D="";if(a&&(h.V(a),x=h.a(a),"preloads"in a&&(c=new B(a.preloads,k,d,E,!0),h.m(function(){E=c})),a=a.main))return new B(a,b,d)}function B(a,b,d,c,e){var f;f=h.j(x,k,[].concat(a),e);this.then=this.then=a=function(a,b){w(f,function(b){a&& + a.apply(k,b)},function(a){if(b)b(a);else throw a;});return this};this.next=function(a,b,c){return new B(a,b,c,f)};this.config=M;(b||d)&&a(b,d);h.m(function(){w(e||E,function(){w(c,function(){h.w(f)},d)})})}function W(a){var b,d;b=a.id;b==k&&(F!==k?F={L:"Multiple anonymous defines encountered"}:(b=h.ha())||(F=a));if(b!=k){d=l[b];b in l||(d=h.i(b,x),d=h.I(d.a,b),l[b]=d);if(!L(d))throw Error("duplicate define: "+b);d.ja=!1;h.J(d,a)}}function R(){var a=h.ea(arguments);W(a)}var D,x,y,G,z=m.document,S= + z&&(z.head||z.getElementsByTagName("head")[0]),ca=S&&S.getElementsByTagName("base")[0]||null,X={},Y={},N={},da="addEventListener"in m?{}:{loaded:1,complete:1},Q={},aa=Q.toString,k,l={},O={},E=!1,F,Z=/^\/|^[^:]+:\/\/|^[A-Za-z]:[\\/]/,ba=/(\.)(\.?)(?:$|\/([^\.\/]+.*)?)/g,ea=/\/\*[\s\S]*?\*\/|\/\/.*?[\n\r]/g,fa=/require\s*\(\s*(["'])(.*?[^\\])\1\s*\)|[^\\]?(["'])/g,ga=/\s*,\s*/,T,h;h={o:function(a,b,d){var c;a=V(a,b);if("."==a.charAt(0))return a;c=J(a);a=(b=c.f)||c.h;a in d.c&&(a=d.c[a].R||a);b&&(0> + b.indexOf("/")&&!(b in d.c)&&(a=I(d.T)+"/"+b),a=a+"!"+c.h);return a},j:function(a,b,d,c){function e(b,c){var d,f;d=h.o(b,g.id,a);if(!c)return d;f=J(d);if(!f.f)return d;d=l[f.f];f.h="normalize"in d?d.normalize(f.h,e,g.a)||"":e(f.h);return f.f+"!"+f.h}function f(b,d,f){var p;p=d&&function(a){d.apply(k,a)};if(u(b,"String")){if(p)throw Error("require(id, callback) not allowed");f=e(b,!0);b=l[f];if(!(f in l))throw Error("Module not resolved: "+f);return(f=L(b)&&b.b)||b}w(h.w(h.j(a,g.id,b,c)),p,f)}var g; + g=new K;g.id=b||"";g.ia=c;g.K=d;g.a=a;g.F=f;f.toUrl=function(b){return h.i(e(b,!0),a).url};g.o=e;return g},I:function(a,b,d){var c,e,f;c=h.j(a,b,k,d);e=c.resolve;f=C(1,function(a){c.v=a;try{return h.Z(c)}catch(b){c.reject(b)}});c.resolve=function(a){w(d||E,function(){e(l[c.id]=O[c.url]=f(a))})};c.M=function(a){w(d||E,function(){c.b&&(f(a),c.D(Y))})};return c},Y:function(a,b,d,c){return h.j(a,d,k,c)},ga:function(a){return a.F},N:function(a){return a.b||(a.b={})},fa:function(a){var b=a.A;b||(b=a.A= + {id:a.id,uri:h.O(a),exports:h.N(a),config:function(){return a.a}},b.b=b.exports);return b},O:function(a){return a.url||(a.url=h.H(a.F.toUrl(a.id),a.a))},V:function(a){var b,d,c,e,f;b="curl";d="define";c=e=m;if(a&&(f=a.overwriteApi||a.sa,b=a.apiName||a.la||b,c=a.apiContext||a.ka||c,d=a.defineName||a.na||d,e=a.defineContext||a.ma||e,y&&u(y,"Function")&&(m.curl=y),y=null,G&&u(G,"Function")&&(m.define=G),G=null,!f)){if(c[b]&&c[b]!=A)throw Error(b+" already exists");if(e[d]&&e[d]!=R)throw Error(d+" already exists"); + }c[b]=A;e[d]=R},a:function(a){function b(a,b){var d,c,g,n,q;for(q in a){g=a[q];u(g,"String")&&(g={path:a[q]});g.name=g.name||q;n=e;c=J(I(g.name));d=c.h;if(c=c.f)n=f[c],n||(n=f[c]=v(e),n.c=v(e.c),n.g=[]),delete a[q];c=g;var l=b,H=void 0;c.path=I(c.path||c.location||"");l&&(H=c.main||"./main","."==H.charAt(0)||(H="./"+H),c.R=V(H,c.name+"/"));c.a=c.config;c.a&&(c.a=v(e,c.a));c.W=d.split("/").length;d?(n.c[d]=c,n.g.push(d)):n.s=h.U(g.path,e)}}function d(a){var b=a.c;a.S=new RegExp("^("+a.g.sort(function(a, + c){return b[c].W-b[a].W}).join("|").replace(/\/|\./g,"\\$&")+")(?=\\/|$)");delete a.g}var c,e,f,g;"baseUrl"in a&&(a.s=a.baseUrl);"main"in a&&(a.R=a.main);"preloads"in a&&(a.ta=a.preloads);"pluginPath"in a&&(a.T=a.pluginPath);if("dontAddFileExt"in a||a.l)a.l=new RegExp(a.dontAddFileExt||a.l);c=x;e=v(c,a);e.c=v(c.c);f=a.plugins||{};e.plugins=v(c.plugins);e.C=v(c.C,a.C);e.B=v(c.B,a.B);e.g=[];b(a.packages,!0);b(a.paths,!1);for(g in f)a=h.o(g+"!","",e),e.plugins[a.substr(0,a.length-1)]=f[g];f=e.plugins; + for(g in f)if(f[g]=v(e,f[g]),a=f[g].g)f[g].g=a.concat(e.g),d(f[g]);for(g in c.c)e.c.hasOwnProperty(g)||e.g.push(g);d(e);return e},i:function(a,b){var d,c,e,f;d=b.c;e=Z.test(a)?a:a.replace(b.S,function(a){c=d[a]||{};f=c.a;return c.path||""});return{a:f||x,url:h.U(e,b)}},U:function(a,b){var d=b.s;return d&&!Z.test(a)?I(d)+"/"+a:a},H:function(a,b){return a+((b||x).l.test(a)?"":".js")},P:function(a,b,d){var c=z.createElement("script");c.onload=c.onreadystatechange=function(d){d=d||m.event;if("load"== + d.type||da[c.readyState])delete N[a.id],c.onload=c.onreadystatechange=c.onerror="",b()};c.onerror=function(){d(Error("Syntax or http error: "+a.url))};c.type=a.pa||"text/javascript";c.charset="utf-8";c.async=!a.ra;c.src=a.url;N[a.id]=c;S.insertBefore(c,ca);return c},$:function(a){var b=[],d;("string"==typeof a?a:a.toSource?a.toSource():a.toString()).replace(ea,"").replace(fa,function(a,e,f,g){g?d=d==g?k:d:d||b.push(f);return""});return b},ea:function(a){var b,d,c,e,f,g;f=a.length;c=a[f-1];e=u(c,"Function")? + c.length:-1;2==f?u(a[0],"Array")?d=a[0]:b=a[0]:3==f&&(b=a[0],d=a[1]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 Utv)$iO6dRq00047v2T|E0D(Cs`2YX_ literal 0 HcmV?d00001 diff --git a/site/static/fonts/aller-subset/aller_lt-web.woff2 b/site/static/fonts/aller-subset/aller_lt-web.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..7407a719cee9d9b5fc46e2552f2a27612eeef6e5 GIT binary patch literal 17640 zcmV)2K+L~)Pew8T0RR9107U2j6951J0HE*y07QBK0RR9100000000000000000000 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 b^cIs7nYYk(WQmxobcx(&8nC(^oXrCOT7BNp literal 0 HcmV?d00001 diff --git a/site/static/fonts/aller-subset/aller_rg-web.woff b/site/static/fonts/aller-subset/aller_rg-web.woff new file mode 100755 index 0000000000000000000000000000000000000000..e1a623ffc971ca2239fbc0eca608bd4223e8b994 GIT binary patch literal 22984 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 literal 0 HcmV?d00001 diff --git a/site/static/fonts/aller-subset/aller_rg-web.woff2 b/site/static/fonts/aller-subset/aller_rg-web.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..15580213c4828e4b623da84ca4f9b0fff7cbb528 GIT binary patch literal 18500 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 D!^7|& literal 0 HcmV?d00001 diff --git a/site/static/fonts/asap-subset/asap-bold-web.woff b/site/static/fonts/asap-subset/asap-bold-web.woff new file mode 100755 index 0000000000000000000000000000000000000000..8b709fc2a005b927176afc7874576983ca033840 GIT binary patch literal 18896 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 literal 0 HcmV?d00001 diff --git a/site/static/fonts/asap-subset/asap-bold-web.woff2 b/site/static/fonts/asap-subset/asap-bold-web.woff2 new file mode 100755 index 0000000000000000000000000000000000000000..be0c23025ad5b3799bff27d5501574ac0985ca5f GIT binary patch literal 15164 zcmV-CJHy0xPew8T0RR9106RPY6951J0CWTZ06NS70RoQz00000000000000000000 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 literal 0 HcmV?d00001 diff --git a/site/static/global.css b/site/static/global.css new file mode 100644 index 0000000000..981823c77d --- /dev/null +++ b/site/static/global.css @@ -0,0 +1,404 @@ +body { + --font: 'Overpass', sans-serif; + --font-alt: 'Overpass', sans-serif; + --font-mono: 'Overpass Mono', monospace; + --font-ui: var(--font-mono); +} + +/* base reset ----------------------------- */ +html { + font-size: 62.5%; + -ms-text-size-adjust: 62.5%; + -webkit-text-size-adjust: 62.5%; + -ms-overflow-style: -ms-autohiding-scrollbar; + overflow-y: scroll; + box-sizing: border-box; + border-collapse: collapse; +} + +* { + box-sizing: inherit; + margin: 0; + padding: 0; +} + +/* links reset ---------------------------- */ +a { + text-decoration: none; + cursor: pointer; + color: inherit; +} + +a:hover, +a:active { + color: var(--flash); +} + +a:focus { + outline: none +} + +/* +----------------------------------------------- + global styles + + NOTE + – !important overrides class-definitions + - some vars change inside media-queries! +----------------------------------------------- +*/ + +/* constants and calc ----------------------- + - commonly used values + - under normal conditions, there's no need to touch these + - look confusing/cluttering at first, + but they simplify life immensely +----------------------------------------------- +*/ +:root { + --nav-h: 6rem; + --top-offset: 6rem; + --sidebar-w: 24rem; + --main-width: 80rem; + --code-w: 72em; + --side-nav: 4.8rem; + --side-page: var(--side-nav); + + /* easings */ + --in-cubic: cubic-bezier(0.55, 0.055, 0.675, 0.19); + --out-cubic: cubic-bezier(0.215, 0.61, 0.355, 1); + --inout-cubic: cubic-bezier(0.645, 0.045, 0.355, 1); + + --in-back: cubic-bezier(0.6, -0.28, 0.735, 0.045); + --out-back: cubic-bezier(0.175, 0.885, 0.32, 1.275); + --inout-back: cubic-bezier(0.68, -0.55, 0.265, 1.55); +} + +/* theme vars ----------------------------- */ +.theme-default { + --back: #ffffff; + --back-light: #fbfcfd; + --prime: #ff3e00; + --second: #676778; + --flash: #40b3ff; + --heading: var(--second); + --text: #333; /* hsl(36, 3%, 62%) */ + --border-w: .3rem; /* border-width */ + --border-r: .4rem; /* border-radius */ +} + +/* typo vars ------------------------------ */ +.typo-default { + --unit: .8rem; + --code-fs: 1.3rem; + --h6: 1.4rem; + --h5: 1.6rem; + --h4: 1.8rem; + --h3: 2.4rem; + --h2: 3rem; + --h1: 3.2rem; + --linemax: 42em; /* max line-length */ + --lh: calc(4/2.2); /* base line-height */ +} + +/* typography ----------------------------- */ +body { + font: 300 var(--h4)/var(--lh) var(--font); + background-color: var(--back); + color: var(--text); +} + +h1, h2, h3, h4, h5, h6, li, blockquote { + margin: 0; + color: var(--heading); +} + +h1, h2, h3, h4, h5, h6 { font-weight: 700 } +h6 { font-size: var(--h6) } +h5 { font-size: var(--h5) } +h4 { font-size: var(--h4) } +h3 { font-size: var(--h3) } +h2 { font-size: var(--h2) } +h1 { font-size: var(--h1) } + +p { + line-height: 1.35; + margin: 0 0 1em 0; +} + +.b, b, strong { font-weight: 700 } + +tt, code, kbd, samp { + font: 300 var(--code-fs)/1.7 var(--font-mono); +} + +:not(pre) > p > code { + position: relative; + top: -.1rem; + padding: .3rem .8rem .5rem; + margin: 0 .2rem; + border-radius: 0.3em; + white-space: nowrap; + background: var(--back-light); + border-top: .1rem solid #e5e5e9; + border-left: .1rem solid #e5e5e9; + /* color: inherit; */ + color: #8f9196; +} + +::selection { + background: var(--flash); + color: white; +} + +/* opinionated styles --------------------- */ +h1, h2 { + font-family: var(--font-alt); + line-height: 1.2; + pointer-events: none; +} + +li:not(.white) > h2 { + color: var(--second) +} + +blockquote { + position: relative; + margin: 1.6rem 0 2.4rem; + padding: 2rem 2.4rem 1.8rem 2.4rem; + border-radius: var(--border-r); + font-family: var(--font); + max-width: var(--linemax); +} + +blockquote p { + font-size: var(--h5); +} + +blockquote :last-child { + margin: 0; +} + + +/* buttons -------------------------------- */ +button { + font-family: inherit; + font-size: inherit; + background-color: transparent; + border: none; + color: currentColor; +} + +button:focus { outline: 0 } + +button[disabled] { + opacity: .55; + pointer-events: none; +} + +button > svg { + position: relative; + top: -.1rem; + width: 2rem !important; + height: 2rem !important; +} + +/* options */ +button[outline] { + min-height: var(--bttn-calc-h); + line-height: var(--bttn-calc-h); + border: var(--bttn-outline) solid currentColor; + background-color: white; + color: currentColor; +} + +/* links ------------------------------------- + - idea from https://up.docs.apex.sh + + How can this be solved? + Setup for all links is risky/tricky + + We need global -styles and