From d255d1aae12593af346b575e51725710ddb1c54a Mon Sep 17 00:00:00 2001 From: Adam Hopkins Date: Wed, 6 Sep 2023 15:44:00 +0300 Subject: [PATCH] Conversion of User Guide to the SHH stack (#2781) --- .github/workflows/tests.yml | 2 +- .gitignore | 1 + Makefile | 3 + guide/config/en/general.yaml | 1 + guide/config/en/navbar.yaml | 15 + guide/config/en/sidebar.yaml | 257 + guide/content/en/emoji.py | 3668 +++++ .../en/guide/advanced/class-based-views.md | 202 + .../en/guide/advanced/proxy-headers.md | 477 + guide/content/en/guide/advanced/signals.md | 346 + guide/content/en/guide/advanced/streaming.md | 151 + guide/content/en/guide/advanced/versioning.md | 170 + guide/content/en/guide/advanced/websockets.md | 82 + guide/content/en/guide/basics/README.md | 1 + guide/content/en/guide/basics/app.md | 517 + guide/content/en/guide/basics/cookies.md | 108 + guide/content/en/guide/basics/handlers.md | 131 + guide/content/en/guide/basics/headers.md | 229 + guide/content/en/guide/basics/listeners.md | 243 + guide/content/en/guide/basics/middleware.md | 229 + guide/content/en/guide/basics/request.md | 327 + guide/content/en/guide/basics/response.md | 265 + guide/content/en/guide/basics/routing.md | 798 + guide/content/en/guide/basics/tasks.md | 135 + .../en/guide/best-practices/blueprints.md | 453 + .../en/guide/best-practices/decorators.md | 176 + .../en/guide/best-practices/exceptions.md | 580 + .../en/guide/best-practices/logging.md | 97 + .../en/guide/best-practices/testing.md | 3 + guide/content/en/guide/deployment/caddy.md | 74 + guide/content/en/guide/deployment/docker.md | 175 + .../content/en/guide/deployment/kubernetes.md | 1 + guide/content/en/guide/deployment/nginx.md | 172 + guide/content/en/guide/getting-started.md | 93 + guide/content/en/guide/how-to/README.md | 1 + .../content/en/guide/how-to/authentication.md | 117 + .../content/en/guide/how-to/autodiscovery.md | 197 + guide/content/en/guide/how-to/cors.md | 135 + guide/content/en/guide/how-to/csrf.md | 1 + guide/content/en/guide/how-to/db.md | 1 + guide/content/en/guide/how-to/decorators.md | 1 + guide/content/en/guide/how-to/ipv6.md | 0 guide/content/en/guide/how-to/mounting.md | 51 + guide/content/en/guide/how-to/orm.md | 418 + .../en/guide/how-to/request-id-logging.md | 0 .../content/en/guide/how-to/serialization.md | 1 + .../en/guide/how-to/server-sent-events.md | 1 + .../en/guide/how-to/static-redirects.md | 112 + .../en/guide/how-to/table-of-contents.md | 13 + guide/content/en/guide/how-to/task-queue.md | 1 + guide/content/en/guide/how-to/tls.md | 176 + guide/content/en/guide/how-to/validation.md | 1 + .../content/en/guide/how-to/websocket-feed.md | 1 + guide/content/en/guide/introduction.md | 67 + guide/content/en/guide/running/app-loader.md | 85 + .../content/en/guide/running/configuration.md | 291 + guide/content/en/guide/running/development.md | 126 + guide/content/en/guide/running/inspector.md | 214 + guide/content/en/guide/running/manager.md | 343 + guide/content/en/guide/running/running.md | 521 + guide/content/en/help.md | 27 + guide/content/en/index.md | 311 + guide/content/en/migrate.py | 119 + guide/content/en/org/README.md | 1 + guide/content/en/org/feature_requests.md | 9 + guide/content/en/org/policies.md | 65 + guide/content/en/org/scope.md | 263 + .../en/organization/code-of-conduct.md | 74 + guide/content/en/organization/contributing.md | 166 + guide/content/en/organization/policies.md | 68 + guide/content/en/organization/scope.md | 258 + .../en/plugins/sanic-ext/configuration.md | 270 + .../en/plugins/sanic-ext/convenience.md | 111 + guide/content/en/plugins/sanic-ext/custom.md | 84 + .../en/plugins/sanic-ext/getting-started.md | 81 + .../en/plugins/sanic-ext/health-monitor.md | 69 + .../content/en/plugins/sanic-ext/http/cors.md | 86 + .../en/plugins/sanic-ext/http/methods.md | 142 + .../content/en/plugins/sanic-ext/injection.md | 356 + guide/content/en/plugins/sanic-ext/logger.md | 30 + guide/content/en/plugins/sanic-ext/openapi.md | 7 + .../en/plugins/sanic-ext/openapi/README.md | 0 .../en/plugins/sanic-ext/openapi/advanced.md | 9 + .../en/plugins/sanic-ext/openapi/autodoc.md | 141 + .../en/plugins/sanic-ext/openapi/basics.md | 70 + .../plugins/sanic-ext/openapi/decorators.md | 468 + .../en/plugins/sanic-ext/openapi/security.md | 96 + .../en/plugins/sanic-ext/openapi/ui.md | 26 + .../sanic-ext/templating/html5tagger.md | 1 + .../en/plugins/sanic-ext/templating/jinja.md | 153 + .../en/plugins/sanic-ext/validation.md | 164 + .../en/plugins/sanic-testing/README.md | 0 .../en/plugins/sanic-testing/clients.md | 124 + .../plugins/sanic-testing/getting-started.md | 81 + guide/content/en/release-notes/2021/v21.12.md | 510 + guide/content/en/release-notes/2021/v21.3.md | 268 + guide/content/en/release-notes/2021/v21.6.md | 346 + guide/content/en/release-notes/2021/v21.9.md | 234 + guide/content/en/release-notes/2022/v22.12.md | 185 + guide/content/en/release-notes/2022/v22.3.md | 221 + guide/content/en/release-notes/2022/v22.6.md | 159 + guide/content/en/release-notes/2022/v22.9.md | 325 + guide/content/en/release-notes/2023/v23.3.md | 389 + guide/content/en/release-notes/2023/v23.6.md | 195 + guide/public/assets/.gitkeep | 0 guide/public/assets/code.css | 83 + guide/public/assets/docs.js | 164 + guide/public/assets/images/directory-view.png | Bin 0 -> 47234 bytes .../images/error-display-html-debug.png | Bin 0 -> 156952 bytes .../assets/images/error-display-html-prod.png | Bin 0 -> 76580 bytes .../assets/images/error-div-by-zero.png | Bin 0 -> 147981 bytes .../assets/images/error-extra-debug.png | Bin 0 -> 147898 bytes .../public/assets/images/error-extra-prod.png | Bin 0 -> 73041 bytes .../public/assets/images/error-html-debug.png | Bin 0 -> 134384 bytes .../assets/images/error-html-no-debug.png | Bin 0 -> 63032 bytes guide/public/assets/images/grottoes.jpg | Bin 0 -> 261335 bytes guide/public/assets/images/logo-white.svg | 54 + guide/public/assets/images/logo.svg | 52 + .../public/assets/images/sanic-ext-redoc.png | Bin 0 -> 61275 bytes .../assets/images/sanic-ext-swagger.png | Bin 0 -> 74918 bytes .../images/sanic-framework-logo-400x97.png | Bin 0 -> 13600 bytes .../sanic-framework-logo-simple-400x97.png | Bin 0 -> 10549 bytes ...nic-framework-logo-simple-white-400x97.png | Bin 0 -> 10111 bytes .../sanic-framework-logo-white-400x97.png | Bin 0 -> 13286 bytes guide/public/assets/style.css | 13028 ++++++++++++++++ guide/public/index.html | 12 + guide/server.py | 5 + guide/style/bulma-prefers-dark/LICENSE | 21 + .../bulma-prefers-dark.sass | 9 + .../bulma-prefers-dark/sass/base/_all.sass | 4 + .../bulma-prefers-dark/sass/base/generic.sass | 39 + .../bulma-prefers-dark/sass/base/helpers.sass | 16 + .../sass/components/_all.sass | 14 + .../sass/components/breadcrumb.sass | 17 + .../sass/components/card.sass | 26 + .../sass/components/dropdown.sass | 30 + .../sass/components/list.sass | 27 + .../sass/components/media.sass | 5 + .../sass/components/menu.sass | 21 + .../sass/components/message.sass | 48 + .../sass/components/modal.sass | 30 + .../sass/components/navbar.sass | 214 + .../sass/components/pagination.sass | 49 + .../sass/components/panel.sass | 57 + .../sass/components/tabs.sass | 57 + .../sass/elements/_all.sass | 13 + .../bulma-prefers-dark/sass/elements/box.sass | 18 + .../sass/elements/button.sass | 218 + .../sass/elements/content.sass | 35 + .../sass/elements/form.sass | 236 + .../sass/elements/notification.sass | 21 + .../sass/elements/other.sass | 2 + .../sass/elements/progress.sass | 39 + .../sass/elements/table.sass | 78 + .../bulma-prefers-dark/sass/elements/tag.sass | 27 + .../sass/elements/title.sass | 12 + .../bulma-prefers-dark/sass/layout/_all.sass | 4 + .../sass/layout/footer.sass | 4 + .../bulma-prefers-dark/sass/layout/hero.sass | 146 + .../sass/utilities/_all.sass | 5 + .../sass/utilities/derived-variables.sass | 67 + .../sass/utilities/initial-variables.sass | 7 + .../sass/utilities/mixins.sass | 5 + guide/style/bulma/LICENSE | 21 + guide/style/bulma/bulma.sass | 10 + guide/style/bulma/sass/base/_all.sass | 6 + guide/style/bulma/sass/base/animations.sass | 5 + guide/style/bulma/sass/base/generic.sass | 145 + guide/style/bulma/sass/base/helpers.sass | 1 + guide/style/bulma/sass/base/minireset.sass | 79 + guide/style/bulma/sass/components/_all.sass | 15 + .../bulma/sass/components/breadcrumb.sass | 77 + guide/style/bulma/sass/components/card.sass | 103 + .../style/bulma/sass/components/dropdown.sass | 83 + guide/style/bulma/sass/components/level.sass | 79 + guide/style/bulma/sass/components/media.sass | 59 + guide/style/bulma/sass/components/menu.sass | 59 + .../style/bulma/sass/components/message.sass | 101 + guide/style/bulma/sass/components/modal.sass | 117 + guide/style/bulma/sass/components/navbar.sass | 446 + .../bulma/sass/components/pagination.sass | 167 + guide/style/bulma/sass/components/panel.sass | 121 + guide/style/bulma/sass/components/tabs.sass | 176 + guide/style/bulma/sass/elements/_all.sass | 16 + guide/style/bulma/sass/elements/box.sass | 26 + guide/style/bulma/sass/elements/button.sass | 357 + .../style/bulma/sass/elements/container.sass | 29 + guide/style/bulma/sass/elements/content.sass | 162 + guide/style/bulma/sass/elements/form.sass | 1 + guide/style/bulma/sass/elements/icon.sass | 46 + guide/style/bulma/sass/elements/image.sass | 73 + .../bulma/sass/elements/notification.sass | 52 + guide/style/bulma/sass/elements/other.sass | 31 + guide/style/bulma/sass/elements/progress.sass | 73 + guide/style/bulma/sass/elements/table.sass | 134 + guide/style/bulma/sass/elements/tag.sass | 140 + guide/style/bulma/sass/elements/title.sass | 70 + guide/style/bulma/sass/form/_all.sass | 9 + .../style/bulma/sass/form/checkbox-radio.sass | 22 + guide/style/bulma/sass/form/file.sass | 184 + .../style/bulma/sass/form/input-textarea.sass | 66 + guide/style/bulma/sass/form/select.sass | 88 + guide/style/bulma/sass/form/shared.sass | 60 + guide/style/bulma/sass/form/tools.sass | 215 + guide/style/bulma/sass/grid/_all.sass | 5 + guide/style/bulma/sass/grid/columns.sass | 513 + guide/style/bulma/sass/grid/tiles.sass | 36 + guide/style/bulma/sass/helpers/_all.sass | 12 + guide/style/bulma/sass/helpers/color.sass | 39 + guide/style/bulma/sass/helpers/flexbox.sass | 35 + guide/style/bulma/sass/helpers/float.sass | 10 + guide/style/bulma/sass/helpers/other.sass | 14 + guide/style/bulma/sass/helpers/overflow.sass | 2 + guide/style/bulma/sass/helpers/position.sass | 7 + guide/style/bulma/sass/helpers/spacing.sass | 31 + .../style/bulma/sass/helpers/typography.sass | 103 + .../style/bulma/sass/helpers/visibility.sass | 122 + guide/style/bulma/sass/layout/_all.sass | 6 + guide/style/bulma/sass/layout/footer.sass | 11 + guide/style/bulma/sass/layout/hero.sass | 153 + guide/style/bulma/sass/layout/section.sass | 17 + guide/style/bulma/sass/utilities/_all.sass | 9 + .../bulma/sass/utilities/animations.sass | 1 + .../style/bulma/sass/utilities/controls.sass | 49 + .../sass/utilities/derived-variables.sass | 114 + guide/style/bulma/sass/utilities/extends.sass | 25 + .../style/bulma/sass/utilities/functions.sass | 135 + .../sass/utilities/initial-variables.sass | 79 + guide/style/bulma/sass/utilities/mixins.sass | 303 + guide/style/colors.scss | 19 + guide/style/elements.scss | 292 + guide/style/general.scss | 52 + guide/style/index.scss | 12 + guide/style/menu.scss | 121 + guide/style/overrides.scss | 35 + guide/style/theme.scss | 65 + guide/webapp/__init__.py | 0 guide/webapp/display/__init__.py | 0 guide/webapp/display/base.py | 27 + guide/webapp/display/code_style.py | 20 + guide/webapp/display/layouts/__init__.py | 0 guide/webapp/display/layouts/base.py | 25 + .../display/layouts/elements/__init__.py | 0 .../webapp/display/layouts/elements/footer.py | 75 + .../webapp/display/layouts/elements/navbar.py | 68 + .../display/layouts/elements/sidebar.py | 118 + guide/webapp/display/layouts/home.py | 50 + guide/webapp/display/layouts/main.py | 45 + guide/webapp/display/layouts/models.py | 14 + guide/webapp/display/markdown.py | 140 + guide/webapp/display/page/__init__.py | 4 + guide/webapp/display/page/docobject.py | 389 + guide/webapp/display/page/page.py | 164 + guide/webapp/display/page/renderer.py | 47 + guide/webapp/display/plugins/__init__.py | 0 guide/webapp/display/plugins/attrs.py | 40 + guide/webapp/display/plugins/columns.py | 45 + guide/webapp/display/plugins/hook.py | 31 + guide/webapp/display/plugins/mermaid.py | 41 + guide/webapp/display/plugins/notification.py | 47 + guide/webapp/display/plugins/span.py | 26 + guide/webapp/display/plugins/tabs.py | 50 + guide/webapp/display/search/__init__.py | 0 guide/webapp/display/search/renderer.py | 68 + guide/webapp/display/search/search.py | 175 + guide/webapp/display/text.py | 7 + guide/webapp/endpoint/__init__.py | 0 guide/webapp/endpoint/search.py | 29 + guide/webapp/endpoint/view.py | 5 + guide/webapp/worker/__init__.py | 0 guide/webapp/worker/config.py | 14 + guide/webapp/worker/factory.py | 73 + guide/webapp/worker/livereload.js | 3795 +++++ guide/webapp/worker/reload.py | 115 + guide/webapp/worker/style.py | 28 + sanic/app.py | 926 +- sanic/application/constants.py | 6 + sanic/application/ext.py | 14 + sanic/application/logo.py | 13 +- sanic/application/motd.py | 29 +- sanic/application/spinner.py | 5 + sanic/application/state.py | 28 +- sanic/blueprint_group.py | 277 +- sanic/blueprints.py | 555 +- sanic/compat.py | 15 +- sanic/config.py | 128 +- sanic/constants.py | 4 + sanic/cookies/request.py | 50 +- sanic/cookies/response.py | 229 +- sanic/errorpages.py | 76 +- sanic/exceptions.py | 595 +- sanic/handlers/content_range.py | 30 +- sanic/handlers/directory.py | 23 + sanic/handlers/error.py | 101 +- sanic/headers.py | 144 +- sanic/helpers.py | 6 +- sanic/http/constants.py | 5 +- sanic/http/http1.py | 68 +- sanic/http/http3.py | 23 +- sanic/middleware.py | 40 +- sanic/mixins/base.py | 2 + sanic/mixins/exceptions.py | 94 +- sanic/mixins/listeners.py | 272 +- sanic/mixins/middleware.py | 144 +- sanic/mixins/routes.py | 488 +- sanic/mixins/signals.py | 59 +- sanic/mixins/startup.py | 439 +- sanic/mixins/static.py | 100 +- sanic/models/asgi.py | 2 +- sanic/models/protocol_types.py | 20 +- sanic/models/server_types.py | 4 +- sanic/pages/base.py | 12 + sanic/pages/directory_page.py | 4 + sanic/pages/error.py | 2 + sanic/request/form.py | 28 +- sanic/request/parameters.py | 27 +- sanic/request/types.py | 628 +- sanic/response/convenience.py | 163 +- sanic/response/types.py | 263 +- sanic/router.py | 129 +- sanic/server/async_server.py | 30 +- sanic/server/events.py | 9 +- sanic/server/loop.py | 5 +- sanic/server/runners.py | 39 +- sanic/signals.py | 49 +- sanic/views.py | 155 +- sanic/worker/constants.py | 4 + sanic/worker/inspector.py | 38 +- sanic/worker/loader.py | 14 + sanic/worker/manager.py | 96 +- sanic/worker/multiplexer.py | 33 + sanic/worker/process.py | 2 + 332 files changed, 51495 insertions(+), 2013 deletions(-) create mode 100644 guide/config/en/general.yaml create mode 100644 guide/config/en/navbar.yaml create mode 100644 guide/config/en/sidebar.yaml create mode 100644 guide/content/en/emoji.py create mode 100644 guide/content/en/guide/advanced/class-based-views.md create mode 100644 guide/content/en/guide/advanced/proxy-headers.md create mode 100644 guide/content/en/guide/advanced/signals.md create mode 100644 guide/content/en/guide/advanced/streaming.md create mode 100644 guide/content/en/guide/advanced/versioning.md create mode 100644 guide/content/en/guide/advanced/websockets.md create mode 100644 guide/content/en/guide/basics/README.md create mode 100644 guide/content/en/guide/basics/app.md create mode 100644 guide/content/en/guide/basics/cookies.md create mode 100644 guide/content/en/guide/basics/handlers.md create mode 100644 guide/content/en/guide/basics/headers.md create mode 100644 guide/content/en/guide/basics/listeners.md create mode 100644 guide/content/en/guide/basics/middleware.md create mode 100644 guide/content/en/guide/basics/request.md create mode 100644 guide/content/en/guide/basics/response.md create mode 100644 guide/content/en/guide/basics/routing.md create mode 100644 guide/content/en/guide/basics/tasks.md create mode 100644 guide/content/en/guide/best-practices/blueprints.md create mode 100644 guide/content/en/guide/best-practices/decorators.md create mode 100644 guide/content/en/guide/best-practices/exceptions.md create mode 100644 guide/content/en/guide/best-practices/logging.md create mode 100644 guide/content/en/guide/best-practices/testing.md create mode 100644 guide/content/en/guide/deployment/caddy.md create mode 100644 guide/content/en/guide/deployment/docker.md create mode 100644 guide/content/en/guide/deployment/kubernetes.md create mode 100644 guide/content/en/guide/deployment/nginx.md create mode 100644 guide/content/en/guide/getting-started.md create mode 100644 guide/content/en/guide/how-to/README.md create mode 100644 guide/content/en/guide/how-to/authentication.md create mode 100644 guide/content/en/guide/how-to/autodiscovery.md create mode 100644 guide/content/en/guide/how-to/cors.md create mode 100644 guide/content/en/guide/how-to/csrf.md create mode 100644 guide/content/en/guide/how-to/db.md create mode 100644 guide/content/en/guide/how-to/decorators.md create mode 100644 guide/content/en/guide/how-to/ipv6.md create mode 100644 guide/content/en/guide/how-to/mounting.md create mode 100644 guide/content/en/guide/how-to/orm.md create mode 100644 guide/content/en/guide/how-to/request-id-logging.md create mode 100644 guide/content/en/guide/how-to/serialization.md create mode 100644 guide/content/en/guide/how-to/server-sent-events.md create mode 100644 guide/content/en/guide/how-to/static-redirects.md create mode 100644 guide/content/en/guide/how-to/table-of-contents.md create mode 100644 guide/content/en/guide/how-to/task-queue.md create mode 100644 guide/content/en/guide/how-to/tls.md create mode 100644 guide/content/en/guide/how-to/validation.md create mode 100644 guide/content/en/guide/how-to/websocket-feed.md create mode 100644 guide/content/en/guide/introduction.md create mode 100644 guide/content/en/guide/running/app-loader.md create mode 100644 guide/content/en/guide/running/configuration.md create mode 100644 guide/content/en/guide/running/development.md create mode 100644 guide/content/en/guide/running/inspector.md create mode 100644 guide/content/en/guide/running/manager.md create mode 100644 guide/content/en/guide/running/running.md create mode 100644 guide/content/en/help.md create mode 100644 guide/content/en/index.md create mode 100644 guide/content/en/migrate.py create mode 100644 guide/content/en/org/README.md create mode 100644 guide/content/en/org/feature_requests.md create mode 100644 guide/content/en/org/policies.md create mode 100644 guide/content/en/org/scope.md create mode 100644 guide/content/en/organization/code-of-conduct.md create mode 100644 guide/content/en/organization/contributing.md create mode 100644 guide/content/en/organization/policies.md create mode 100644 guide/content/en/organization/scope.md create mode 100644 guide/content/en/plugins/sanic-ext/configuration.md create mode 100644 guide/content/en/plugins/sanic-ext/convenience.md create mode 100644 guide/content/en/plugins/sanic-ext/custom.md create mode 100644 guide/content/en/plugins/sanic-ext/getting-started.md create mode 100644 guide/content/en/plugins/sanic-ext/health-monitor.md create mode 100644 guide/content/en/plugins/sanic-ext/http/cors.md create mode 100644 guide/content/en/plugins/sanic-ext/http/methods.md create mode 100644 guide/content/en/plugins/sanic-ext/injection.md create mode 100644 guide/content/en/plugins/sanic-ext/logger.md create mode 100644 guide/content/en/plugins/sanic-ext/openapi.md create mode 100644 guide/content/en/plugins/sanic-ext/openapi/README.md create mode 100644 guide/content/en/plugins/sanic-ext/openapi/advanced.md create mode 100644 guide/content/en/plugins/sanic-ext/openapi/autodoc.md create mode 100644 guide/content/en/plugins/sanic-ext/openapi/basics.md create mode 100644 guide/content/en/plugins/sanic-ext/openapi/decorators.md create mode 100644 guide/content/en/plugins/sanic-ext/openapi/security.md create mode 100644 guide/content/en/plugins/sanic-ext/openapi/ui.md create mode 100644 guide/content/en/plugins/sanic-ext/templating/html5tagger.md create mode 100644 guide/content/en/plugins/sanic-ext/templating/jinja.md create mode 100644 guide/content/en/plugins/sanic-ext/validation.md create mode 100644 guide/content/en/plugins/sanic-testing/README.md create mode 100644 guide/content/en/plugins/sanic-testing/clients.md create mode 100644 guide/content/en/plugins/sanic-testing/getting-started.md create mode 100644 guide/content/en/release-notes/2021/v21.12.md create mode 100644 guide/content/en/release-notes/2021/v21.3.md create mode 100644 guide/content/en/release-notes/2021/v21.6.md create mode 100644 guide/content/en/release-notes/2021/v21.9.md create mode 100644 guide/content/en/release-notes/2022/v22.12.md create mode 100644 guide/content/en/release-notes/2022/v22.3.md create mode 100644 guide/content/en/release-notes/2022/v22.6.md create mode 100644 guide/content/en/release-notes/2022/v22.9.md create mode 100644 guide/content/en/release-notes/2023/v23.3.md create mode 100644 guide/content/en/release-notes/2023/v23.6.md create mode 100644 guide/public/assets/.gitkeep create mode 100644 guide/public/assets/code.css create mode 100644 guide/public/assets/docs.js create mode 100644 guide/public/assets/images/directory-view.png create mode 100644 guide/public/assets/images/error-display-html-debug.png create mode 100644 guide/public/assets/images/error-display-html-prod.png create mode 100644 guide/public/assets/images/error-div-by-zero.png create mode 100644 guide/public/assets/images/error-extra-debug.png create mode 100644 guide/public/assets/images/error-extra-prod.png create mode 100644 guide/public/assets/images/error-html-debug.png create mode 100644 guide/public/assets/images/error-html-no-debug.png create mode 100644 guide/public/assets/images/grottoes.jpg create mode 100644 guide/public/assets/images/logo-white.svg create mode 100644 guide/public/assets/images/logo.svg create mode 100644 guide/public/assets/images/sanic-ext-redoc.png create mode 100644 guide/public/assets/images/sanic-ext-swagger.png create mode 100644 guide/public/assets/images/sanic-framework-logo-400x97.png create mode 100644 guide/public/assets/images/sanic-framework-logo-simple-400x97.png create mode 100644 guide/public/assets/images/sanic-framework-logo-simple-white-400x97.png create mode 100644 guide/public/assets/images/sanic-framework-logo-white-400x97.png create mode 100644 guide/public/assets/style.css create mode 100644 guide/public/index.html create mode 100644 guide/server.py create mode 100644 guide/style/bulma-prefers-dark/LICENSE create mode 100644 guide/style/bulma-prefers-dark/bulma-prefers-dark.sass create mode 100644 guide/style/bulma-prefers-dark/sass/base/_all.sass create mode 100644 guide/style/bulma-prefers-dark/sass/base/generic.sass create mode 100644 guide/style/bulma-prefers-dark/sass/base/helpers.sass create mode 100644 guide/style/bulma-prefers-dark/sass/components/_all.sass create mode 100644 guide/style/bulma-prefers-dark/sass/components/breadcrumb.sass create mode 100644 guide/style/bulma-prefers-dark/sass/components/card.sass create mode 100644 guide/style/bulma-prefers-dark/sass/components/dropdown.sass create mode 100644 guide/style/bulma-prefers-dark/sass/components/list.sass create mode 100644 guide/style/bulma-prefers-dark/sass/components/media.sass create mode 100644 guide/style/bulma-prefers-dark/sass/components/menu.sass create mode 100644 guide/style/bulma-prefers-dark/sass/components/message.sass create mode 100644 guide/style/bulma-prefers-dark/sass/components/modal.sass create mode 100644 guide/style/bulma-prefers-dark/sass/components/navbar.sass create mode 100644 guide/style/bulma-prefers-dark/sass/components/pagination.sass create mode 100644 guide/style/bulma-prefers-dark/sass/components/panel.sass create mode 100644 guide/style/bulma-prefers-dark/sass/components/tabs.sass create mode 100644 guide/style/bulma-prefers-dark/sass/elements/_all.sass create mode 100644 guide/style/bulma-prefers-dark/sass/elements/box.sass create mode 100644 guide/style/bulma-prefers-dark/sass/elements/button.sass create mode 100644 guide/style/bulma-prefers-dark/sass/elements/content.sass create mode 100644 guide/style/bulma-prefers-dark/sass/elements/form.sass create mode 100644 guide/style/bulma-prefers-dark/sass/elements/notification.sass create mode 100644 guide/style/bulma-prefers-dark/sass/elements/other.sass create mode 100644 guide/style/bulma-prefers-dark/sass/elements/progress.sass create mode 100644 guide/style/bulma-prefers-dark/sass/elements/table.sass create mode 100644 guide/style/bulma-prefers-dark/sass/elements/tag.sass create mode 100644 guide/style/bulma-prefers-dark/sass/elements/title.sass create mode 100644 guide/style/bulma-prefers-dark/sass/layout/_all.sass create mode 100644 guide/style/bulma-prefers-dark/sass/layout/footer.sass create mode 100644 guide/style/bulma-prefers-dark/sass/layout/hero.sass create mode 100644 guide/style/bulma-prefers-dark/sass/utilities/_all.sass create mode 100644 guide/style/bulma-prefers-dark/sass/utilities/derived-variables.sass create mode 100644 guide/style/bulma-prefers-dark/sass/utilities/initial-variables.sass create mode 100644 guide/style/bulma-prefers-dark/sass/utilities/mixins.sass create mode 100644 guide/style/bulma/LICENSE create mode 100644 guide/style/bulma/bulma.sass create mode 100644 guide/style/bulma/sass/base/_all.sass create mode 100644 guide/style/bulma/sass/base/animations.sass create mode 100644 guide/style/bulma/sass/base/generic.sass create mode 100644 guide/style/bulma/sass/base/helpers.sass create mode 100644 guide/style/bulma/sass/base/minireset.sass create mode 100644 guide/style/bulma/sass/components/_all.sass create mode 100644 guide/style/bulma/sass/components/breadcrumb.sass create mode 100644 guide/style/bulma/sass/components/card.sass create mode 100644 guide/style/bulma/sass/components/dropdown.sass create mode 100644 guide/style/bulma/sass/components/level.sass create mode 100644 guide/style/bulma/sass/components/media.sass create mode 100644 guide/style/bulma/sass/components/menu.sass create mode 100644 guide/style/bulma/sass/components/message.sass create mode 100644 guide/style/bulma/sass/components/modal.sass create mode 100644 guide/style/bulma/sass/components/navbar.sass create mode 100644 guide/style/bulma/sass/components/pagination.sass create mode 100644 guide/style/bulma/sass/components/panel.sass create mode 100644 guide/style/bulma/sass/components/tabs.sass create mode 100644 guide/style/bulma/sass/elements/_all.sass create mode 100644 guide/style/bulma/sass/elements/box.sass create mode 100644 guide/style/bulma/sass/elements/button.sass create mode 100644 guide/style/bulma/sass/elements/container.sass create mode 100644 guide/style/bulma/sass/elements/content.sass create mode 100644 guide/style/bulma/sass/elements/form.sass create mode 100644 guide/style/bulma/sass/elements/icon.sass create mode 100644 guide/style/bulma/sass/elements/image.sass create mode 100644 guide/style/bulma/sass/elements/notification.sass create mode 100644 guide/style/bulma/sass/elements/other.sass create mode 100644 guide/style/bulma/sass/elements/progress.sass create mode 100644 guide/style/bulma/sass/elements/table.sass create mode 100644 guide/style/bulma/sass/elements/tag.sass create mode 100644 guide/style/bulma/sass/elements/title.sass create mode 100644 guide/style/bulma/sass/form/_all.sass create mode 100644 guide/style/bulma/sass/form/checkbox-radio.sass create mode 100644 guide/style/bulma/sass/form/file.sass create mode 100644 guide/style/bulma/sass/form/input-textarea.sass create mode 100644 guide/style/bulma/sass/form/select.sass create mode 100644 guide/style/bulma/sass/form/shared.sass create mode 100644 guide/style/bulma/sass/form/tools.sass create mode 100644 guide/style/bulma/sass/grid/_all.sass create mode 100644 guide/style/bulma/sass/grid/columns.sass create mode 100644 guide/style/bulma/sass/grid/tiles.sass create mode 100644 guide/style/bulma/sass/helpers/_all.sass create mode 100644 guide/style/bulma/sass/helpers/color.sass create mode 100644 guide/style/bulma/sass/helpers/flexbox.sass create mode 100644 guide/style/bulma/sass/helpers/float.sass create mode 100644 guide/style/bulma/sass/helpers/other.sass create mode 100644 guide/style/bulma/sass/helpers/overflow.sass create mode 100644 guide/style/bulma/sass/helpers/position.sass create mode 100644 guide/style/bulma/sass/helpers/spacing.sass create mode 100644 guide/style/bulma/sass/helpers/typography.sass create mode 100644 guide/style/bulma/sass/helpers/visibility.sass create mode 100644 guide/style/bulma/sass/layout/_all.sass create mode 100644 guide/style/bulma/sass/layout/footer.sass create mode 100644 guide/style/bulma/sass/layout/hero.sass create mode 100644 guide/style/bulma/sass/layout/section.sass create mode 100644 guide/style/bulma/sass/utilities/_all.sass create mode 100644 guide/style/bulma/sass/utilities/animations.sass create mode 100644 guide/style/bulma/sass/utilities/controls.sass create mode 100644 guide/style/bulma/sass/utilities/derived-variables.sass create mode 100644 guide/style/bulma/sass/utilities/extends.sass create mode 100644 guide/style/bulma/sass/utilities/functions.sass create mode 100644 guide/style/bulma/sass/utilities/initial-variables.sass create mode 100644 guide/style/bulma/sass/utilities/mixins.sass create mode 100644 guide/style/colors.scss create mode 100644 guide/style/elements.scss create mode 100644 guide/style/general.scss create mode 100644 guide/style/index.scss create mode 100644 guide/style/menu.scss create mode 100644 guide/style/overrides.scss create mode 100644 guide/style/theme.scss create mode 100644 guide/webapp/__init__.py create mode 100644 guide/webapp/display/__init__.py create mode 100644 guide/webapp/display/base.py create mode 100644 guide/webapp/display/code_style.py create mode 100644 guide/webapp/display/layouts/__init__.py create mode 100644 guide/webapp/display/layouts/base.py create mode 100644 guide/webapp/display/layouts/elements/__init__.py create mode 100644 guide/webapp/display/layouts/elements/footer.py create mode 100644 guide/webapp/display/layouts/elements/navbar.py create mode 100644 guide/webapp/display/layouts/elements/sidebar.py create mode 100644 guide/webapp/display/layouts/home.py create mode 100644 guide/webapp/display/layouts/main.py create mode 100644 guide/webapp/display/layouts/models.py create mode 100644 guide/webapp/display/markdown.py create mode 100644 guide/webapp/display/page/__init__.py create mode 100644 guide/webapp/display/page/docobject.py create mode 100644 guide/webapp/display/page/page.py create mode 100644 guide/webapp/display/page/renderer.py create mode 100644 guide/webapp/display/plugins/__init__.py create mode 100644 guide/webapp/display/plugins/attrs.py create mode 100644 guide/webapp/display/plugins/columns.py create mode 100644 guide/webapp/display/plugins/hook.py create mode 100644 guide/webapp/display/plugins/mermaid.py create mode 100644 guide/webapp/display/plugins/notification.py create mode 100644 guide/webapp/display/plugins/span.py create mode 100644 guide/webapp/display/plugins/tabs.py create mode 100644 guide/webapp/display/search/__init__.py create mode 100644 guide/webapp/display/search/renderer.py create mode 100644 guide/webapp/display/search/search.py create mode 100644 guide/webapp/display/text.py create mode 100644 guide/webapp/endpoint/__init__.py create mode 100644 guide/webapp/endpoint/search.py create mode 100644 guide/webapp/endpoint/view.py create mode 100644 guide/webapp/worker/__init__.py create mode 100644 guide/webapp/worker/config.py create mode 100644 guide/webapp/worker/factory.py create mode 100644 guide/webapp/worker/livereload.js create mode 100644 guide/webapp/worker/reload.py create mode 100644 guide/webapp/worker/style.py diff --git a/.github/workflows/tests.yml b/.github/workflows/tests.yml index d2f155bb..b071e7e4 100644 --- a/.github/workflows/tests.yml +++ b/.github/workflows/tests.yml @@ -29,7 +29,7 @@ jobs: - { python-version: "3.10", tox-env: security } - { python-version: "3.11", tox-env: security } - { python-version: "3.10", tox-env: lint } - - { python-version: "3.10", tox-env: docs } + # - { python-version: "3.10", tox-env: docs } - { python-version: "3.8", tox-env: type-checking } - { python-version: "3.9", tox-env: type-checking } - { python-version: "3.10", tox-env: type-checking } diff --git a/.gitignore b/.gitignore index 2a30c319..076fc360 100644 --- a/.gitignore +++ b/.gitignore @@ -23,3 +23,4 @@ pip-wheel-metadata/ .venv/* venv/* .vscode/* +guide/node_modules/ diff --git a/Makefile b/Makefile index 041bc263..d05a8810 100644 --- a/Makefile +++ b/Makefile @@ -93,6 +93,9 @@ docs-serve: changelog: python scripts/changelog.py +guide-serve: + cd guide && sanic server:app -r -R ./content -R ./style + release: ifdef version python scripts/release.py --release-version ${version} --generate-changelog diff --git a/guide/config/en/general.yaml b/guide/config/en/general.yaml new file mode 100644 index 00000000..19afeace --- /dev/null +++ b/guide/config/en/general.yaml @@ -0,0 +1 @@ +current_version: "23.6" diff --git a/guide/config/en/navbar.yaml b/guide/config/en/navbar.yaml new file mode 100644 index 00000000..2a44f490 --- /dev/null +++ b/guide/config/en/navbar.yaml @@ -0,0 +1,15 @@ +root: + - label: Home + path: index.html + - label: Community + items: + - label: Forums + href: https://community.sanicframework.org + - label: Discord + href: https://discord.gg/FARQzAEMAA + - label: Twitter + href: https://twitter.com/sanicframework + - label: Help + path: ./help.html + - label: GitHub + href: https://github.com/sanic-org/sanic diff --git a/guide/config/en/sidebar.yaml b/guide/config/en/sidebar.yaml new file mode 100644 index 00000000..a2846003 --- /dev/null +++ b/guide/config/en/sidebar.yaml @@ -0,0 +1,257 @@ +root: + - label: User Guide + items: + - label: General + items: + - label: Introduction + path: guide/introduction.html + - label: Getting Started + path: guide/getting-started.html + - label: Basics + items: + - label: Sanic Application + path: guide/basics/app.html + - label: Handlers + path: guide/basics/handlers.html + - label: Request + path: guide/basics/request.html + - label: Response + path: guide/basics/response.html + - label: Routing + path: guide/basics/routing.html + - label: Listeners + path: guide/basics/listeners.html + - label: Middleware + path: guide/basics/middleware.html + - label: Headers + path: guide/basics/headers.html + - label: Cookies + path: guide/basics/cookies.html + - label: Background Tasks + path: guide/basics/tasks.html + - label: Advanced + items: + - label: Class Based Views + path: guide/advanced/class-based-views.html + - label: Proxy Configuration + path: guide/advanced/proxy-headers.html + - label: Streaming + path: guide/advanced/streaming.html + - label: Websockets + path: guide/advanced/websockets.html + - label: Versioning + path: guide/advanced/versioning.html + - label: Signals + path: guide/advanced/signals.html + - label: Best Practices + items: + - label: Blueprints + path: guide/best-practices/blueprints.html + - label: Exceptions + path: guide/best-practices/exceptions.html + - label: Decorators + path: guide/best-practices/decorators.html + - label: Logging + path: guide/best-practices/logging.html + - label: Testing + path: guide/best-practices/testing.html + - label: Running Sanic + items: + - label: Configuration + path: guide/running/configuration.html + - label: Development + path: guide/running/development.html + - label: Server + path: guide/running/running.html + - label: Worker Manager + path: guide/running/manager.html + - label: Dynamic Applications + path: guide/running/app-loader.html + - label: Inspector + path: guide/running/inspector.html + - label: Deployment + items: + - label: Caddy + path: guide/deployment/caddy.html + - label: Nginx + path: guide/deployment/nginx.html + - label: Docker + path: guide/deployment/docker.html + - label: How to ... + items: + - label: Table of Contents + path: guide/how-to/table-of-contents.html + - label: Application Mounting + path: guide/how-to/mounting.html + - label: Authentication + path: guide/how-to/authentication.html + - label: Autodiscovery + path: guide/how-to/autodiscovery.html + - label: CORS + path: guide/how-to/cors.html + - label: ORM + path: guide/how-to/orm.html + - label: Static Redirects + path: guide/how-to/static-redirects.html + - label: TLS/SSL/HTTPS + path: guide/how-to/tls.html + - label: Plugins + items: + - label: Sanic Extensions + items: + - label: Getting Started + path: plugins/sanic-ext/getting-started.html + - label: HTTP - Methods + path: plugins/sanic-ext/http/methods.html + - label: HTTP - CORS Protection + path: plugins/sanic-ext/http/cors.html + - label: OpenAPI - Basics + path: plugins/sanic-ext/openapi/basics.html + - label: OpenAPI - UI + path: plugins/sanic-ext/openapi/ui.html + - label: OpenAPI - Decorators + path: plugins/sanic-ext/openapi/decorators.html + # - label: OpenAPI - Advanced + # path: plugins/sanic-ext/openapi/advanced.html + - label: OpenAPI - Auto Documentation + path: plugins/sanic-ext/openapi/autodoc.html + - label: OpenAPI - Security + path: plugins/sanic-ext/openapi/security.html + - label: Convenience + path: plugins/sanic-ext/convenience.html + - label: Templating - Jinja + path: plugins/sanic-ext/templating/jinja.html + - label: Templating - html5tagger + path: plugins/sanic-ext/templating/html5tagger.html + - label: Dependency Injection + path: plugins/sanic-ext/injection.html + - label: Validation + path: plugins/sanic-ext/validation.html + - label: Health Monitor + path: plugins/sanic-ext/health-monitor.html + - label: Background Logger + path: plugins/sanic-ext/logger.html + - label: Configuration + path: plugins/sanic-ext/configuration.html + - label: Custom Extensions + path: plugins/sanic-ext/custom.html + - label: Sanic Testing + items: + - label: Getting Started + path: plugins/sanic-testing/getting-started.html + - label: Test Clients + path: plugins/sanic-testing/clients.html + - label: Release Notes + items: + - label: "2023" + items: + - label: Sanic 23.6 + path: release-notes/2023/v23.6.html + - label: Sanic 23.3 + path: release-notes/2023/v23.3.html + - label: "2022" + items: + - label: Sanic 22.12 + path: release-notes/2022/v22.12.html + - label: Sanic 22.9 + path: release-notes/2022/v22.9.html + - label: Sanic 22.6 + path: release-notes/2022/v22.6.html + - label: Sanic 22.3 + path: release-notes/2022/v22.3.html + - label: "2021" + items: + - label: Sanic 21.12 + path: release-notes/2021/v21.12.html + - label: Sanic 21.9 + path: release-notes/2021/v21.9.html + - label: Sanic 21.6 + path: release-notes/2021/v21.6.html + - label: Sanic 21.3 + path: release-notes/2021/v21.3.html + - label: Organization + items: + - label: Contributing + path: organization/contributing.html + - label: Code of Conduct + path: organization/code-of-conduct.html + - label: S.C.O.P.E. (Governance) + path: organization/scope.html + - label: Policies + path: organization/policies.html + - label: API Reference + items: + - label: Application + items: + - label: sanic.app + path: /api/sanic.app.html + - label: sanic.config + path: /api/sanic.config.html + - label: sanic.application + path: /api/sanic.application.html + - label: Blueprint + items: + - label: sanic.blueprints + path: /api/sanic.blueprints.html + - label: sanic.blueprint_group + path: /api/sanic.blueprint_group.html + - label: Constant + items: + - label: sanic.constants + path: /api/sanic.constants.html + - label: Core + items: + - label: sanic.cookies + path: /api/sanic.cookies.html + - label: sanic.handlers + path: /api/sanic.handlers.html + - label: sanic.headers + path: /api/sanic.headers.html + - label: sanic.middleware + path: /api/sanic.middleware.html + - label: sanic.mixins + path: /api/sanic.mixins.html + - label: sanic.request + path: /api/sanic.request.html + - label: sanic.response + path: /api/sanic.response.html + - label: sanic.views + path: /api/sanic.views.html + - label: Display + items: + - label: sanic.pages + path: /api/sanic.pages.html + - label: Exception + items: + - label: sanic.errorpages + path: /api/sanic.errorpages.html + - label: sanic.exceptions + path: /api/sanic.exceptions.html + - label: Model + items: + - label: sanic.models + path: /api/sanic.models.html + - label: Routing + items: + - label: sanic.router + path: /api/sanic.router.html + - label: sanic.signals + path: /api/sanic.signals.html + - label: Server + items: + - label: sanic.http + path: /api/sanic.http.html + - label: sanic.server + path: /api/sanic.server.html + - label: sanic.worker + path: /api/sanic.worker.html + - label: Utility + items: + - label: sanic.compat + path: /api/sanic.compat.html + - label: sanic.helpers + path: /api/sanic.helpers.html + - label: sanic.log + path: /api/sanic.log.html + - label: sanic.utils + path: /api/sanic.utils.html diff --git a/guide/content/en/emoji.py b/guide/content/en/emoji.py new file mode 100644 index 00000000..1bf94327 --- /dev/null +++ b/guide/content/en/emoji.py @@ -0,0 +1,3668 @@ +EMOJI = { + "1st_place_medal": "๐Ÿฅ‡", + "2nd_place_medal": "๐Ÿฅˆ", + "3rd_place_medal": "๐Ÿฅ‰", + "AB_button_(blood_type)": "๐Ÿ†Ž", + "ATM_sign": "๐Ÿง", + "A_button_(blood_type)": "๐Ÿ…ฐ", + "Afghanistan": "๐Ÿ‡ฆ๐Ÿ‡ซ", + "Albania": "๐Ÿ‡ฆ๐Ÿ‡ฑ", + "Algeria": "๐Ÿ‡ฉ๐Ÿ‡ฟ", + "American_Samoa": "๐Ÿ‡ฆ๐Ÿ‡ธ", + "Andorra": "๐Ÿ‡ฆ๐Ÿ‡ฉ", + "Angola": "๐Ÿ‡ฆ๐Ÿ‡ด", + "Anguilla": "๐Ÿ‡ฆ๐Ÿ‡ฎ", + "Antarctica": "๐Ÿ‡ฆ๐Ÿ‡ถ", + "Antigua_&_Barbuda": "๐Ÿ‡ฆ๐Ÿ‡ฌ", + "Aquarius": "โ™’", + "Argentina": "๐Ÿ‡ฆ๐Ÿ‡ท", + "Aries": "โ™ˆ", + "Armenia": "๐Ÿ‡ฆ๐Ÿ‡ฒ", + "Aruba": "๐Ÿ‡ฆ๐Ÿ‡ผ", + "Ascension_Island": "๐Ÿ‡ฆ๐Ÿ‡จ", + "Australia": "๐Ÿ‡ฆ๐Ÿ‡บ", + "Austria": "๐Ÿ‡ฆ๐Ÿ‡น", + "Azerbaijan": "๐Ÿ‡ฆ๐Ÿ‡ฟ", + "BACK_arrow": "๐Ÿ”™", + "B_button_(blood_type)": "๐Ÿ…ฑ", + "Bahamas": "๐Ÿ‡ง๐Ÿ‡ธ", + "Bahrain": "๐Ÿ‡ง๐Ÿ‡ญ", + "Bangladesh": "๐Ÿ‡ง๐Ÿ‡ฉ", + "Barbados": "๐Ÿ‡ง๐Ÿ‡ง", + "Belarus": "๐Ÿ‡ง๐Ÿ‡พ", + "Belgium": "๐Ÿ‡ง๐Ÿ‡ช", + "Belize": "๐Ÿ‡ง๐Ÿ‡ฟ", + "Benin": "๐Ÿ‡ง๐Ÿ‡ฏ", + "Bermuda": "๐Ÿ‡ง๐Ÿ‡ฒ", + "Bhutan": "๐Ÿ‡ง๐Ÿ‡น", + "Bolivia": "๐Ÿ‡ง๐Ÿ‡ด", + "Bosnia_&_Herzegovina": "๐Ÿ‡ง๐Ÿ‡ฆ", + "Botswana": "๐Ÿ‡ง๐Ÿ‡ผ", + "Bouvet_Island": "๐Ÿ‡ง๐Ÿ‡ป", + "Brazil": "๐Ÿ‡ง๐Ÿ‡ท", + "British_Indian_Ocean_Territory": "๐Ÿ‡ฎ๐Ÿ‡ด", + "British_Virgin_Islands": "๐Ÿ‡ป๐Ÿ‡ฌ", + "Brunei": "๐Ÿ‡ง๐Ÿ‡ณ", + "Bulgaria": "๐Ÿ‡ง๐Ÿ‡ฌ", + "Burkina_Faso": "๐Ÿ‡ง๐Ÿ‡ซ", + "Burundi": "๐Ÿ‡ง๐Ÿ‡ฎ", + "CL_button": "๐Ÿ†‘", + "COOL_button": "๐Ÿ†’", + "Cambodia": "๐Ÿ‡ฐ๐Ÿ‡ญ", + "Cameroon": "๐Ÿ‡จ๐Ÿ‡ฒ", + "Canada": "๐Ÿ‡จ๐Ÿ‡ฆ", + "Canary_Islands": "๐Ÿ‡ฎ๐Ÿ‡จ", + "Cancer": "โ™‹", + "Cape_Verde": "๐Ÿ‡จ๐Ÿ‡ป", + "Capricorn": "โ™‘", + "Caribbean_Netherlands": "๐Ÿ‡ง๐Ÿ‡ถ", + "Cayman_Islands": "๐Ÿ‡ฐ๐Ÿ‡พ", + "Central_African_Republic": "๐Ÿ‡จ๐Ÿ‡ซ", + "Ceuta_&_Melilla": "๐Ÿ‡ช๐Ÿ‡ฆ", + "Chad": "๐Ÿ‡น๐Ÿ‡ฉ", + "Chile": "๐Ÿ‡จ๐Ÿ‡ฑ", + "China": "๐Ÿ‡จ๐Ÿ‡ณ", + "Christmas_Island": "๐Ÿ‡จ๐Ÿ‡ฝ", + "Christmas_tree": "๐ŸŽ„", + "Clipperton_Island": "๐Ÿ‡จ๐Ÿ‡ต", + "Cocos_(Keeling)_Islands": "๐Ÿ‡จ๐Ÿ‡จ", + "Colombia": "๐Ÿ‡จ๐Ÿ‡ด", + "Comoros": "๐Ÿ‡ฐ๐Ÿ‡ฒ", + "Congo-Brazzaville": "๐Ÿ‡จ๐Ÿ‡ฌ", + "Congo-Kinshasa": "๐Ÿ‡จ๐Ÿ‡ฉ", + "Cook_Islands": "๐Ÿ‡จ๐Ÿ‡ฐ", + "Costa_Rica": "๐Ÿ‡จ๐Ÿ‡ท", + "Croatia": "๐Ÿ‡ญ๐Ÿ‡ท", + "Cuba": "๐Ÿ‡จ๐Ÿ‡บ", + "Curaรงao": "๐Ÿ‡จ๐Ÿ‡ผ", + "Cyprus": "๐Ÿ‡จ๐Ÿ‡พ", + "Czechia": "๐Ÿ‡จ๐Ÿ‡ฟ", + "Cรดte_dโ€™Ivoire": "๐Ÿ‡จ๐Ÿ‡ฎ", + "Denmark": "๐Ÿ‡ฉ๐Ÿ‡ฐ", + "Diego_Garcia": "๐Ÿ‡ฉ๐Ÿ‡ฌ", + "Djibouti": "๐Ÿ‡ฉ๐Ÿ‡ฏ", + "Dominica": "๐Ÿ‡ฉ๐Ÿ‡ฒ", + "Dominican_Republic": "๐Ÿ‡ฉ๐Ÿ‡ด", + "END_arrow": "๐Ÿ”š", + "Ecuador": "๐Ÿ‡ช๐Ÿ‡จ", + "Egypt": "๐Ÿ‡ช๐Ÿ‡ฌ", + "El_Salvador": "๐Ÿ‡ธ๐Ÿ‡ป", + "England": "๐Ÿด๓ ง๓ ข๓ ฅ๓ ฎ๓ ง๓ ฟ", + "Equatorial_Guinea": "๐Ÿ‡ฌ๐Ÿ‡ถ", + "Eritrea": "๐Ÿ‡ช๐Ÿ‡ท", + "Estonia": "๐Ÿ‡ช๐Ÿ‡ช", + "Eswatini": "๐Ÿ‡ธ๐Ÿ‡ฟ", + "Ethiopia": "๐Ÿ‡ช๐Ÿ‡น", + "European_Union": "๐Ÿ‡ช๐Ÿ‡บ", + "FREE_button": "๐Ÿ†“", + "Falkland_Islands": "๐Ÿ‡ซ๐Ÿ‡ฐ", + "Faroe_Islands": "๐Ÿ‡ซ๐Ÿ‡ด", + "Fiji": "๐Ÿ‡ซ๐Ÿ‡ฏ", + "Finland": "๐Ÿ‡ซ๐Ÿ‡ฎ", + "France": "๐Ÿ‡ซ๐Ÿ‡ท", + "French_Guiana": "๐Ÿ‡ฌ๐Ÿ‡ซ", + "French_Polynesia": "๐Ÿ‡ต๐Ÿ‡ซ", + "French_Southern_Territories": "๐Ÿ‡น๐Ÿ‡ซ", + "Gabon": "๐Ÿ‡ฌ๐Ÿ‡ฆ", + "Gambia": "๐Ÿ‡ฌ๐Ÿ‡ฒ", + "Gemini": "โ™Š", + "Georgia": "๐Ÿ‡ฌ๐Ÿ‡ช", + "Germany": "๐Ÿ‡ฉ๐Ÿ‡ช", + "Ghana": "๐Ÿ‡ฌ๐Ÿ‡ญ", + "Gibraltar": "๐Ÿ‡ฌ๐Ÿ‡ฎ", + "Greece": "๐Ÿ‡ฌ๐Ÿ‡ท", + "Greenland": "๐Ÿ‡ฌ๐Ÿ‡ฑ", + "Grenada": "๐Ÿ‡ฌ๐Ÿ‡ฉ", + "Guadeloupe": "๐Ÿ‡ฌ๐Ÿ‡ต", + "Guam": "๐Ÿ‡ฌ๐Ÿ‡บ", + "Guatemala": "๐Ÿ‡ฌ๐Ÿ‡น", + "Guernsey": "๐Ÿ‡ฌ๐Ÿ‡ฌ", + "Guinea": "๐Ÿ‡ฌ๐Ÿ‡ณ", + "Guinea-Bissau": "๐Ÿ‡ฌ๐Ÿ‡ผ", + "Guyana": "๐Ÿ‡ฌ๐Ÿ‡พ", + "Haiti": "๐Ÿ‡ญ๐Ÿ‡น", + "Heard_&_McDonald_Islands": "๐Ÿ‡ญ๐Ÿ‡ฒ", + "Honduras": "๐Ÿ‡ญ๐Ÿ‡ณ", + "Hong_Kong_SAR_China": "๐Ÿ‡ญ๐Ÿ‡ฐ", + "Hungary": "๐Ÿ‡ญ๐Ÿ‡บ", + "ID_button": "๐Ÿ†”", + "Iceland": "๐Ÿ‡ฎ๐Ÿ‡ธ", + "India": "๐Ÿ‡ฎ๐Ÿ‡ณ", + "Indonesia": "๐Ÿ‡ฎ๐Ÿ‡ฉ", + "Iran": "๐Ÿ‡ฎ๐Ÿ‡ท", + "Iraq": "๐Ÿ‡ฎ๐Ÿ‡ถ", + "Ireland": "๐Ÿ‡ฎ๐Ÿ‡ช", + "Isle_of_Man": "๐Ÿ‡ฎ๐Ÿ‡ฒ", + "Israel": "๐Ÿ‡ฎ๐Ÿ‡ฑ", + "Italy": "๐Ÿ‡ฎ๐Ÿ‡น", + "Jamaica": "๐Ÿ‡ฏ๐Ÿ‡ฒ", + "Japan": "๐Ÿ‡ฏ๐Ÿ‡ต", + "Japanese_acceptable_button": "๐Ÿ‰‘", + "Japanese_application_button": "๐Ÿˆธ", + "Japanese_bargain_button": "๐Ÿ‰", + "Japanese_castle": "๐Ÿฏ", + "Japanese_congratulations_button": "ใŠ—", + "Japanese_discount_button": "๐Ÿˆน", + "Japanese_dolls": "๐ŸŽŽ", + "Japanese_free_of_charge_button": "๐Ÿˆš", + "Japanese_here_button": "๐Ÿˆ", + "Japanese_monthly_amount_button": "๐Ÿˆท", + "Japanese_no_vacancy_button": "๐Ÿˆต", + "Japanese_not_free_of_charge_button": "๐Ÿˆถ", + "Japanese_open_for_business_button": "๐Ÿˆบ", + "Japanese_passing_grade_button": "๐Ÿˆด", + "Japanese_post_office": "๐Ÿฃ", + "Japanese_prohibited_button": "๐Ÿˆฒ", + "Japanese_reserved_button": "๐Ÿˆฏ", + "Japanese_secret_button": "ใŠ™", + "Japanese_service_charge_button": "๐Ÿˆ‚", + "Japanese_symbol_for_beginner": "๐Ÿ”ฐ", + "Japanese_vacancy_button": "๐Ÿˆณ", + "Jersey": "๐Ÿ‡ฏ๐Ÿ‡ช", + "Jordan": "๐Ÿ‡ฏ๐Ÿ‡ด", + "Kazakhstan": "๐Ÿ‡ฐ๐Ÿ‡ฟ", + "Kenya": "๐Ÿ‡ฐ๐Ÿ‡ช", + "Kiribati": "๐Ÿ‡ฐ๐Ÿ‡ฎ", + "Kosovo": "๐Ÿ‡ฝ๐Ÿ‡ฐ", + "Kuwait": "๐Ÿ‡ฐ๐Ÿ‡ผ", + "Kyrgyzstan": "๐Ÿ‡ฐ๐Ÿ‡ฌ", + "Laos": "๐Ÿ‡ฑ๐Ÿ‡ฆ", + "Latvia": "๐Ÿ‡ฑ๐Ÿ‡ป", + "Lebanon": "๐Ÿ‡ฑ๐Ÿ‡ง", + "Leo": "โ™Œ", + "Lesotho": "๐Ÿ‡ฑ๐Ÿ‡ธ", + "Liberia": "๐Ÿ‡ฑ๐Ÿ‡ท", + "Libra": "โ™Ž", + "Libya": "๐Ÿ‡ฑ๐Ÿ‡พ", + "Liechtenstein": "๐Ÿ‡ฑ๐Ÿ‡ฎ", + "Lithuania": "๐Ÿ‡ฑ๐Ÿ‡น", + "Luxembourg": "๐Ÿ‡ฑ๐Ÿ‡บ", + "Macao_SAR_China": "๐Ÿ‡ฒ๐Ÿ‡ด", + "Madagascar": "๐Ÿ‡ฒ๐Ÿ‡ฌ", + "Malawi": "๐Ÿ‡ฒ๐Ÿ‡ผ", + "Malaysia": "๐Ÿ‡ฒ๐Ÿ‡พ", + "Maldives": "๐Ÿ‡ฒ๐Ÿ‡ป", + "Mali": "๐Ÿ‡ฒ๐Ÿ‡ฑ", + "Malta": "๐Ÿ‡ฒ๐Ÿ‡น", + "Marshall_Islands": "๐Ÿ‡ฒ๐Ÿ‡ญ", + "Martinique": "๐Ÿ‡ฒ๐Ÿ‡ถ", + "Mauritania": "๐Ÿ‡ฒ๐Ÿ‡ท", + "Mauritius": "๐Ÿ‡ฒ๐Ÿ‡บ", + "Mayotte": "๐Ÿ‡พ๐Ÿ‡น", + "Mexico": "๐Ÿ‡ฒ๐Ÿ‡ฝ", + "Micronesia": "๐Ÿ‡ซ๐Ÿ‡ฒ", + "Moldova": "๐Ÿ‡ฒ๐Ÿ‡ฉ", + "Monaco": "๐Ÿ‡ฒ๐Ÿ‡จ", + "Mongolia": "๐Ÿ‡ฒ๐Ÿ‡ณ", + "Montenegro": "๐Ÿ‡ฒ๐Ÿ‡ช", + "Montserrat": "๐Ÿ‡ฒ๐Ÿ‡ธ", + "Morocco": "๐Ÿ‡ฒ๐Ÿ‡ฆ", + "Mozambique": "๐Ÿ‡ฒ๐Ÿ‡ฟ", + "Mrs._Claus": "๐Ÿคถ", + "Mrs._Claus_dark_skin_tone": "๐Ÿคถ๐Ÿฟ", + "Mrs._Claus_light_skin_tone": "๐Ÿคถ๐Ÿป", + "Mrs._Claus_medium-dark_skin_tone": "๐Ÿคถ๐Ÿพ", + "Mrs._Claus_medium-light_skin_tone": "๐Ÿคถ๐Ÿผ", + "Mrs._Claus_medium_skin_tone": "๐Ÿคถ๐Ÿฝ", + "Myanmar_(Burma)": "๐Ÿ‡ฒ๐Ÿ‡ฒ", + "NEW_button": "๐Ÿ†•", + "NG_button": "๐Ÿ†–", + "Namibia": "๐Ÿ‡ณ๐Ÿ‡ฆ", + "Nauru": "๐Ÿ‡ณ๐Ÿ‡ท", + "Nepal": "๐Ÿ‡ณ๐Ÿ‡ต", + "Netherlands": "๐Ÿ‡ณ๐Ÿ‡ฑ", + "New_Caledonia": "๐Ÿ‡ณ๐Ÿ‡จ", + "New_Zealand": "๐Ÿ‡ณ๐Ÿ‡ฟ", + "Nicaragua": "๐Ÿ‡ณ๐Ÿ‡ฎ", + "Niger": "๐Ÿ‡ณ๐Ÿ‡ช", + "Nigeria": "๐Ÿ‡ณ๐Ÿ‡ฌ", + "Niue": "๐Ÿ‡ณ๐Ÿ‡บ", + "Norfolk_Island": "๐Ÿ‡ณ๐Ÿ‡ซ", + "North_Korea": "๐Ÿ‡ฐ๐Ÿ‡ต", + "North_Macedonia": "๐Ÿ‡ฒ๐Ÿ‡ฐ", + "Northern_Mariana_Islands": "๐Ÿ‡ฒ๐Ÿ‡ต", + "Norway": "๐Ÿ‡ณ๐Ÿ‡ด", + "OK_button": "๐Ÿ†—", + "OK_hand": "๐Ÿ‘Œ", + "OK_hand_dark_skin_tone": "๐Ÿ‘Œ๐Ÿฟ", + "OK_hand_light_skin_tone": "๐Ÿ‘Œ๐Ÿป", + "OK_hand_medium-dark_skin_tone": "๐Ÿ‘Œ๐Ÿพ", + "OK_hand_medium-light_skin_tone": "๐Ÿ‘Œ๐Ÿผ", + "OK_hand_medium_skin_tone": "๐Ÿ‘Œ๐Ÿฝ", + "ON!_arrow": "๐Ÿ”›", + "O_button_(blood_type)": "๐Ÿ…พ", + "Oman": "๐Ÿ‡ด๐Ÿ‡ฒ", + "Ophiuchus": "โ›Ž", + "P_button": "๐Ÿ…ฟ", + "Pakistan": "๐Ÿ‡ต๐Ÿ‡ฐ", + "Palau": "๐Ÿ‡ต๐Ÿ‡ผ", + "Palestinian_Territories": "๐Ÿ‡ต๐Ÿ‡ธ", + "Panama": "๐Ÿ‡ต๐Ÿ‡ฆ", + "Papua_New_Guinea": "๐Ÿ‡ต๐Ÿ‡ฌ", + "Paraguay": "๐Ÿ‡ต๐Ÿ‡พ", + "Peru": "๐Ÿ‡ต๐Ÿ‡ช", + "Philippines": "๐Ÿ‡ต๐Ÿ‡ญ", + "Pisces": "โ™“", + "Pitcairn_Islands": "๐Ÿ‡ต๐Ÿ‡ณ", + "Poland": "๐Ÿ‡ต๐Ÿ‡ฑ", + "Portugal": "๐Ÿ‡ต๐Ÿ‡น", + "Puerto_Rico": "๐Ÿ‡ต๐Ÿ‡ท", + "Qatar": "๐Ÿ‡ถ๐Ÿ‡ฆ", + "Romania": "๐Ÿ‡ท๐Ÿ‡ด", + "Russia": "๐Ÿ‡ท๐Ÿ‡บ", + "Rwanda": "๐Ÿ‡ท๐Ÿ‡ผ", + "Rรฉunion": "๐Ÿ‡ท๐Ÿ‡ช", + "SOON_arrow": "๐Ÿ”œ", + "SOS_button": "๐Ÿ†˜", + "Sagittarius": "โ™", + "Samoa": "๐Ÿ‡ผ๐Ÿ‡ธ", + "San_Marino": "๐Ÿ‡ธ๐Ÿ‡ฒ", + "Santa_Claus": "๐ŸŽ…", + "Santa_Claus_dark_skin_tone": "๐ŸŽ…๐Ÿฟ", + "Santa_Claus_light_skin_tone": "๐ŸŽ…๐Ÿป", + "Santa_Claus_medium-dark_skin_tone": "๐ŸŽ…๐Ÿพ", + "Santa_Claus_medium-light_skin_tone": "๐ŸŽ…๐Ÿผ", + "Santa_Claus_medium_skin_tone": "๐ŸŽ…๐Ÿฝ", + "Saudi_Arabia": "๐Ÿ‡ธ๐Ÿ‡ฆ", + "Scorpio": "โ™", + "Scotland": "๐Ÿด๓ ง๓ ข๓ ณ๓ ฃ๓ ด๓ ฟ", + "Senegal": "๐Ÿ‡ธ๐Ÿ‡ณ", + "Serbia": "๐Ÿ‡ท๐Ÿ‡ธ", + "Seychelles": "๐Ÿ‡ธ๐Ÿ‡จ", + "Sierra_Leone": "๐Ÿ‡ธ๐Ÿ‡ฑ", + "Singapore": "๐Ÿ‡ธ๐Ÿ‡ฌ", + "Sint_Maarten": "๐Ÿ‡ธ๐Ÿ‡ฝ", + "Slovakia": "๐Ÿ‡ธ๐Ÿ‡ฐ", + "Slovenia": "๐Ÿ‡ธ๐Ÿ‡ฎ", + "Solomon_Islands": "๐Ÿ‡ธ๐Ÿ‡ง", + "Somalia": "๐Ÿ‡ธ๐Ÿ‡ด", + "South_Africa": "๐Ÿ‡ฟ๐Ÿ‡ฆ", + "South_Georgia_&_South_Sandwich_Islands": "๐Ÿ‡ฌ๐Ÿ‡ธ", + "South_Korea": "๐Ÿ‡ฐ๐Ÿ‡ท", + "South_Sudan": "๐Ÿ‡ธ๐Ÿ‡ธ", + "Spain": "๐Ÿ‡ช๐Ÿ‡ธ", + "Sri_Lanka": "๐Ÿ‡ฑ๐Ÿ‡ฐ", + "St._Barthรฉlemy": "๐Ÿ‡ง๐Ÿ‡ฑ", + "St._Helena": "๐Ÿ‡ธ๐Ÿ‡ญ", + "St._Kitts_&_Nevis": "๐Ÿ‡ฐ๐Ÿ‡ณ", + "St._Lucia": "๐Ÿ‡ฑ๐Ÿ‡จ", + "St._Martin": "๐Ÿ‡ฒ๐Ÿ‡ซ", + "St._Pierre_&_Miquelon": "๐Ÿ‡ต๐Ÿ‡ฒ", + "St._Vincent_&_Grenadines": "๐Ÿ‡ป๐Ÿ‡จ", + "Statue_of_Liberty": "๐Ÿ—ฝ", + "Sudan": "๐Ÿ‡ธ๐Ÿ‡ฉ", + "Suriname": "๐Ÿ‡ธ๐Ÿ‡ท", + "Svalbard_&_Jan_Mayen": "๐Ÿ‡ธ๐Ÿ‡ฏ", + "Sweden": "๐Ÿ‡ธ๐Ÿ‡ช", + "Switzerland": "๐Ÿ‡จ๐Ÿ‡ญ", + "Syria": "๐Ÿ‡ธ๐Ÿ‡พ", + "Sรฃo_Tomรฉ_&_Prรญncipe": "๐Ÿ‡ธ๐Ÿ‡น", + "T-Rex": "๐Ÿฆ–", + "TOP_arrow": "๐Ÿ”", + "Taiwan": "๐Ÿ‡น๐Ÿ‡ผ", + "Tajikistan": "๐Ÿ‡น๐Ÿ‡ฏ", + "Tanzania": "๐Ÿ‡น๐Ÿ‡ฟ", + "Taurus": "โ™‰", + "Thailand": "๐Ÿ‡น๐Ÿ‡ญ", + "Timor-Leste": "๐Ÿ‡น๐Ÿ‡ฑ", + "Togo": "๐Ÿ‡น๐Ÿ‡ฌ", + "Tokelau": "๐Ÿ‡น๐Ÿ‡ฐ", + "Tokyo_tower": "๐Ÿ—ผ", + "Tonga": "๐Ÿ‡น๐Ÿ‡ด", + "Trinidad_&_Tobago": "๐Ÿ‡น๐Ÿ‡น", + "Tristan_da_Cunha": "๐Ÿ‡น๐Ÿ‡ฆ", + "Tunisia": "๐Ÿ‡น๐Ÿ‡ณ", + "Turkey": "๐Ÿ‡น๐Ÿ‡ท", + "Turkmenistan": "๐Ÿ‡น๐Ÿ‡ฒ", + "Turks_&_Caicos_Islands": "๐Ÿ‡น๐Ÿ‡จ", + "Tuvalu": "๐Ÿ‡น๐Ÿ‡ป", + "U.S._Outlying_Islands": "๐Ÿ‡บ๐Ÿ‡ฒ", + "U.S._Virgin_Islands": "๐Ÿ‡ป๐Ÿ‡ฎ", + "UP!_button": "๐Ÿ†™", + "Uganda": "๐Ÿ‡บ๐Ÿ‡ฌ", + "Ukraine": "๐Ÿ‡บ๐Ÿ‡ฆ", + "United_Arab_Emirates": "๐Ÿ‡ฆ๐Ÿ‡ช", + "United_Kingdom": "๐Ÿ‡ฌ๐Ÿ‡ง", + "United_Nations": "๐Ÿ‡บ๐Ÿ‡ณ", + "United_States": "๐Ÿ‡บ๐Ÿ‡ธ", + "Uruguay": "๐Ÿ‡บ๐Ÿ‡พ", + "Uzbekistan": "๐Ÿ‡บ๐Ÿ‡ฟ", + "VS_button": "๐Ÿ†š", + "Vanuatu": "๐Ÿ‡ป๐Ÿ‡บ", + "Vatican_City": "๐Ÿ‡ป๐Ÿ‡ฆ", + "Venezuela": "๐Ÿ‡ป๐Ÿ‡ช", + "Vietnam": "๐Ÿ‡ป๐Ÿ‡ณ", + "Virgo": "โ™", + "Wales": "๐Ÿด๓ ง๓ ข๓ ท๓ ฌ๓ ณ๓ ฟ", + "Wallis_&_Futuna": "๐Ÿ‡ผ๐Ÿ‡ซ", + "Western_Sahara": "๐Ÿ‡ช๐Ÿ‡ญ", + "Yemen": "๐Ÿ‡พ๐Ÿ‡ช", + "ZZZ": "๐Ÿ’ค", + "Zambia": "๐Ÿ‡ฟ๐Ÿ‡ฒ", + "Zimbabwe": "๐Ÿ‡ฟ๐Ÿ‡ผ", + "abacus": "๐Ÿงฎ", + "accordion": "๐Ÿช—", + "adhesive_bandage": "๐Ÿฉน", + "admission_tickets": "๐ŸŽŸ", + "aerial_tramway": "๐Ÿšก", + "airplane": "โœˆ", + "airplane_arrival": "๐Ÿ›ฌ", + "airplane_departure": "๐Ÿ›ซ", + "alarm_clock": "โฐ", + "alembic": "โš—", + "alien": "๐Ÿ‘ฝ", + "alien_monster": "๐Ÿ‘พ", + "ambulance": "๐Ÿš‘", + "american_football": "๐Ÿˆ", + "amphora": "๐Ÿบ", + "anatomical_heart": "๐Ÿซ€", + "anchor": "โš“", + "anger_symbol": "๐Ÿ’ข", + "angry_face": "๐Ÿ˜ ", + "angry_face_with_horns": "๐Ÿ‘ฟ", + "anguished_face": "๐Ÿ˜ง", + "ant": "๐Ÿœ", + "antenna_bars": "๐Ÿ“ถ", + "anxious_face_with_sweat": "๐Ÿ˜ฐ", + "articulated_lorry": "๐Ÿš›", + "artist": "๐Ÿง‘โ€๐ŸŽจ", + "artist_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐ŸŽจ", + "artist_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐ŸŽจ", + "artist_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐ŸŽจ", + "artist_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐ŸŽจ", + "artist_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐ŸŽจ", + "artist_palette": "๐ŸŽจ", + "astonished_face": "๐Ÿ˜ฒ", + "astronaut": "๐Ÿง‘โ€๐Ÿš€", + "astronaut_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿš€", + "astronaut_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿš€", + "astronaut_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿš€", + "astronaut_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿš€", + "astronaut_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿš€", + "atom_symbol": "โš›", + "auto_rickshaw": "๐Ÿ›บ", + "automobile": "๐Ÿš—", + "avocado": "๐Ÿฅ‘", + "axe": "๐Ÿช“", + "baby": "๐Ÿ‘ถ", + "baby_angel": "๐Ÿ‘ผ", + "baby_angel_dark_skin_tone": "๐Ÿ‘ผ๐Ÿฟ", + "baby_angel_light_skin_tone": "๐Ÿ‘ผ๐Ÿป", + "baby_angel_medium-dark_skin_tone": "๐Ÿ‘ผ๐Ÿพ", + "baby_angel_medium-light_skin_tone": "๐Ÿ‘ผ๐Ÿผ", + "baby_angel_medium_skin_tone": "๐Ÿ‘ผ๐Ÿฝ", + "baby_bottle": "๐Ÿผ", + "baby_chick": "๐Ÿค", + "baby_dark_skin_tone": "๐Ÿ‘ถ๐Ÿฟ", + "baby_light_skin_tone": "๐Ÿ‘ถ๐Ÿป", + "baby_medium-dark_skin_tone": "๐Ÿ‘ถ๐Ÿพ", + "baby_medium-light_skin_tone": "๐Ÿ‘ถ๐Ÿผ", + "baby_medium_skin_tone": "๐Ÿ‘ถ๐Ÿฝ", + "baby_symbol": "๐Ÿšผ", + "backhand_index_pointing_down": "๐Ÿ‘‡", + "backhand_index_pointing_down_dark_skin_tone": "๐Ÿ‘‡๐Ÿฟ", + "backhand_index_pointing_down_light_skin_tone": "๐Ÿ‘‡๐Ÿป", + "backhand_index_pointing_down_medium-dark_skin_tone": "๐Ÿ‘‡๐Ÿพ", + "backhand_index_pointing_down_medium-light_skin_tone": "๐Ÿ‘‡๐Ÿผ", + "backhand_index_pointing_down_medium_skin_tone": "๐Ÿ‘‡๐Ÿฝ", + "backhand_index_pointing_left": "๐Ÿ‘ˆ", + "backhand_index_pointing_left_dark_skin_tone": "๐Ÿ‘ˆ๐Ÿฟ", + "backhand_index_pointing_left_light_skin_tone": "๐Ÿ‘ˆ๐Ÿป", + "backhand_index_pointing_left_medium-dark_skin_tone": "๐Ÿ‘ˆ๐Ÿพ", + "backhand_index_pointing_left_medium-light_skin_tone": "๐Ÿ‘ˆ๐Ÿผ", + "backhand_index_pointing_left_medium_skin_tone": "๐Ÿ‘ˆ๐Ÿฝ", + "backhand_index_pointing_right": "๐Ÿ‘‰", + "backhand_index_pointing_right_dark_skin_tone": "๐Ÿ‘‰๐Ÿฟ", + "backhand_index_pointing_right_light_skin_tone": "๐Ÿ‘‰๐Ÿป", + "backhand_index_pointing_right_medium-dark_skin_tone": "๐Ÿ‘‰๐Ÿพ", + "backhand_index_pointing_right_medium-light_skin_tone": "๐Ÿ‘‰๐Ÿผ", + "backhand_index_pointing_right_medium_skin_tone": "๐Ÿ‘‰๐Ÿฝ", + "backhand_index_pointing_up": "๐Ÿ‘†", + "backhand_index_pointing_up_dark_skin_tone": "๐Ÿ‘†๐Ÿฟ", + "backhand_index_pointing_up_light_skin_tone": "๐Ÿ‘†๐Ÿป", + "backhand_index_pointing_up_medium-dark_skin_tone": "๐Ÿ‘†๐Ÿพ", + "backhand_index_pointing_up_medium-light_skin_tone": "๐Ÿ‘†๐Ÿผ", + "backhand_index_pointing_up_medium_skin_tone": "๐Ÿ‘†๐Ÿฝ", + "backpack": "๐ŸŽ’", + "bacon": "๐Ÿฅ“", + "badger": "๐Ÿฆก", + "badminton": "๐Ÿธ", + "bagel": "๐Ÿฅฏ", + "baggage_claim": "๐Ÿ›„", + "baguette_bread": "๐Ÿฅ–", + "balance_scale": "โš–", + "bald": "๐Ÿฆฒ", + "ballet_shoes": "๐Ÿฉฐ", + "balloon": "๐ŸŽˆ", + "ballot_box_with_ballot": "๐Ÿ—ณ", + "banana": "๐ŸŒ", + "banjo": "๐Ÿช•", + "bank": "๐Ÿฆ", + "bar_chart": "๐Ÿ“Š", + "barber_pole": "๐Ÿ’ˆ", + "baseball": "โšพ", + "basket": "๐Ÿงบ", + "basketball": "๐Ÿ€", + "bat": "๐Ÿฆ‡", + "bathtub": "๐Ÿ›", + "battery": "๐Ÿ”‹", + "beach_with_umbrella": "๐Ÿ–", + "beaming_face_with_smiling_eyes": "๐Ÿ˜", + "beans": "๐Ÿซ˜", + "bear": "๐Ÿป", + "beating_heart": "๐Ÿ’“", + "beaver": "๐Ÿฆซ", + "bed": "๐Ÿ›", + "beer_mug": "๐Ÿบ", + "beetle": "๐Ÿชฒ", + "bell": "๐Ÿ””", + "bell_pepper": "๐Ÿซ‘", + "bell_with_slash": "๐Ÿ”•", + "bellhop_bell": "๐Ÿ›Ž", + "bento_box": "๐Ÿฑ", + "beverage_box": "๐Ÿงƒ", + "bicycle": "๐Ÿšฒ", + "bikini": "๐Ÿ‘™", + "billed_cap": "๐Ÿงข", + "biohazard": "โ˜ฃ", + "bird": "๐Ÿฆ", + "birthday_cake": "๐ŸŽ‚", + "bison": "๐Ÿฆฌ", + "biting_lip": "๐Ÿซฆ", + "black_bird": "๐Ÿฆโ€โฌ›", + "black_cat": "๐Ÿˆโ€โฌ›", + "black_circle": "โšซ", + "black_flag": "๐Ÿด", + "black_heart": "๐Ÿ–ค", + "black_large_square": "โฌ›", + "black_medium-small_square": "โ—พ", + "black_medium_square": "โ—ผ", + "black_nib": "โœ’", + "black_small_square": "โ–ช", + "black_square_button": "๐Ÿ”ฒ", + "blossom": "๐ŸŒผ", + "blowfish": "๐Ÿก", + "blue_book": "๐Ÿ“˜", + "blue_circle": "๐Ÿ”ต", + "blue_heart": "๐Ÿ’™", + "blue_square": "๐ŸŸฆ", + "blueberries": "๐Ÿซ", + "boar": "๐Ÿ—", + "bomb": "๐Ÿ’ฃ", + "bone": "๐Ÿฆด", + "bookmark": "๐Ÿ”–", + "bookmark_tabs": "๐Ÿ“‘", + "books": "๐Ÿ“š", + "boomerang": "๐Ÿชƒ", + "bottle_with_popping_cork": "๐Ÿพ", + "bouquet": "๐Ÿ’", + "bow_and_arrow": "๐Ÿน", + "bowl_with_spoon": "๐Ÿฅฃ", + "bowling": "๐ŸŽณ", + "boxing_glove": "๐ŸฅŠ", + "boy": "๐Ÿ‘ฆ", + "boy_dark_skin_tone": "๐Ÿ‘ฆ๐Ÿฟ", + "boy_light_skin_tone": "๐Ÿ‘ฆ๐Ÿป", + "boy_medium-dark_skin_tone": "๐Ÿ‘ฆ๐Ÿพ", + "boy_medium-light_skin_tone": "๐Ÿ‘ฆ๐Ÿผ", + "boy_medium_skin_tone": "๐Ÿ‘ฆ๐Ÿฝ", + "brain": "๐Ÿง ", + "bread": "๐Ÿž", + "breast-feeding": "๐Ÿคฑ", + "breast-feeding_dark_skin_tone": "๐Ÿคฑ๐Ÿฟ", + "breast-feeding_light_skin_tone": "๐Ÿคฑ๐Ÿป", + "breast-feeding_medium-dark_skin_tone": "๐Ÿคฑ๐Ÿพ", + "breast-feeding_medium-light_skin_tone": "๐Ÿคฑ๐Ÿผ", + "breast-feeding_medium_skin_tone": "๐Ÿคฑ๐Ÿฝ", + "brick": "๐Ÿงฑ", + "bridge_at_night": "๐ŸŒ‰", + "briefcase": "๐Ÿ’ผ", + "briefs": "๐Ÿฉฒ", + "bright_button": "๐Ÿ”†", + "broccoli": "๐Ÿฅฆ", + "broken_heart": "๐Ÿ’”", + "broom": "๐Ÿงน", + "brown_circle": "๐ŸŸค", + "brown_heart": "๐ŸคŽ", + "brown_square": "๐ŸŸซ", + "bubble_tea": "๐Ÿง‹", + "bubbles": "๐Ÿซง", + "bucket": "๐Ÿชฃ", + "bug": "๐Ÿ›", + "building_construction": "๐Ÿ—", + "bullet_train": "๐Ÿš…", + "bullseye": "๐ŸŽฏ", + "burrito": "๐ŸŒฏ", + "bus": "๐ŸšŒ", + "bus_stop": "๐Ÿš", + "bust_in_silhouette": "๐Ÿ‘ค", + "busts_in_silhouette": "๐Ÿ‘ฅ", + "butter": "๐Ÿงˆ", + "butterfly": "๐Ÿฆ‹", + "cactus": "๐ŸŒต", + "calendar": "๐Ÿ“…", + "call_me_hand": "๐Ÿค™", + "call_me_hand_dark_skin_tone": "๐Ÿค™๐Ÿฟ", + "call_me_hand_light_skin_tone": "๐Ÿค™๐Ÿป", + "call_me_hand_medium-dark_skin_tone": "๐Ÿค™๐Ÿพ", + "call_me_hand_medium-light_skin_tone": "๐Ÿค™๐Ÿผ", + "call_me_hand_medium_skin_tone": "๐Ÿค™๐Ÿฝ", + "camel": "๐Ÿช", + "camera": "๐Ÿ“ท", + "camera_with_flash": "๐Ÿ“ธ", + "camping": "๐Ÿ•", + "candle": "๐Ÿ•ฏ", + "candy": "๐Ÿฌ", + "canned_food": "๐Ÿฅซ", + "canoe": "๐Ÿ›ถ", + "card_file_box": "๐Ÿ—ƒ", + "card_index": "๐Ÿ“‡", + "card_index_dividers": "๐Ÿ—‚", + "carousel_horse": "๐ŸŽ ", + "carp_streamer": "๐ŸŽ", + "carpentry_saw": "๐Ÿชš", + "carrot": "๐Ÿฅ•", + "castle": "๐Ÿฐ", + "cat": "๐Ÿˆ", + "cat_face": "๐Ÿฑ", + "cat_with_tears_of_joy": "๐Ÿ˜น", + "cat_with_wry_smile": "๐Ÿ˜ผ", + "chains": "โ›“", + "chair": "๐Ÿช‘", + "chart_decreasing": "๐Ÿ“‰", + "chart_increasing": "๐Ÿ“ˆ", + "chart_increasing_with_yen": "๐Ÿ’น", + "check_box_with_check": "โ˜‘", + "check_mark": "โœ”", + "check_mark_button": "โœ…", + "cheese_wedge": "๐Ÿง€", + "chequered_flag": "๐Ÿ", + "cherries": "๐Ÿ’", + "cherry_blossom": "๐ŸŒธ", + "chess_pawn": "โ™Ÿ", + "chestnut": "๐ŸŒฐ", + "chicken": "๐Ÿ”", + "child": "๐Ÿง’", + "child_dark_skin_tone": "๐Ÿง’๐Ÿฟ", + "child_light_skin_tone": "๐Ÿง’๐Ÿป", + "child_medium-dark_skin_tone": "๐Ÿง’๐Ÿพ", + "child_medium-light_skin_tone": "๐Ÿง’๐Ÿผ", + "child_medium_skin_tone": "๐Ÿง’๐Ÿฝ", + "children_crossing": "๐Ÿšธ", + "chipmunk": "๐Ÿฟ", + "chocolate_bar": "๐Ÿซ", + "chopsticks": "๐Ÿฅข", + "church": "โ›ช", + "cigarette": "๐Ÿšฌ", + "cinema": "๐ŸŽฆ", + "circled_M": "โ“‚", + "circus_tent": "๐ŸŽช", + "cityscape": "๐Ÿ™", + "cityscape_at_dusk": "๐ŸŒ†", + "clamp": "๐Ÿ—œ", + "clapper_board": "๐ŸŽฌ", + "clapping_hands": "๐Ÿ‘", + "clapping_hands_dark_skin_tone": "๐Ÿ‘๐Ÿฟ", + "clapping_hands_light_skin_tone": "๐Ÿ‘๐Ÿป", + "clapping_hands_medium-dark_skin_tone": "๐Ÿ‘๐Ÿพ", + "clapping_hands_medium-light_skin_tone": "๐Ÿ‘๐Ÿผ", + "clapping_hands_medium_skin_tone": "๐Ÿ‘๐Ÿฝ", + "classical_building": "๐Ÿ›", + "clinking_beer_mugs": "๐Ÿป", + "clinking_glasses": "๐Ÿฅ‚", + "clipboard": "๐Ÿ“‹", + "clockwise_vertical_arrows": "๐Ÿ”ƒ", + "closed_book": "๐Ÿ“•", + "closed_mailbox_with_lowered_flag": "๐Ÿ“ช", + "closed_mailbox_with_raised_flag": "๐Ÿ“ซ", + "closed_umbrella": "๐ŸŒ‚", + "cloud": "โ˜", + "cloud_with_lightning": "๐ŸŒฉ", + "cloud_with_lightning_and_rain": "โ›ˆ", + "cloud_with_rain": "๐ŸŒง", + "cloud_with_snow": "๐ŸŒจ", + "clown_face": "๐Ÿคก", + "club_suit": "โ™ฃ", + "clutch_bag": "๐Ÿ‘", + "coat": "๐Ÿงฅ", + "cockroach": "๐Ÿชณ", + "cocktail_glass": "๐Ÿธ", + "coconut": "๐Ÿฅฅ", + "coffin": "โšฐ", + "coin": "๐Ÿช™", + "cold_face": "๐Ÿฅถ", + "collision": "๐Ÿ’ฅ", + "comet": "โ˜„", + "compass": "๐Ÿงญ", + "computer_disk": "๐Ÿ’ฝ", + "computer_mouse": "๐Ÿ–ฑ", + "confetti_ball": "๐ŸŽŠ", + "confounded_face": "๐Ÿ˜–", + "confused_face": "๐Ÿ˜•", + "construction": "๐Ÿšง", + "construction_worker": "๐Ÿ‘ท", + "construction_worker_dark_skin_tone": "๐Ÿ‘ท๐Ÿฟ", + "construction_worker_light_skin_tone": "๐Ÿ‘ท๐Ÿป", + "construction_worker_medium-dark_skin_tone": "๐Ÿ‘ท๐Ÿพ", + "construction_worker_medium-light_skin_tone": "๐Ÿ‘ท๐Ÿผ", + "construction_worker_medium_skin_tone": "๐Ÿ‘ท๐Ÿฝ", + "control_knobs": "๐ŸŽ›", + "convenience_store": "๐Ÿช", + "cook": "๐Ÿง‘โ€๐Ÿณ", + "cook_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿณ", + "cook_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿณ", + "cook_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿณ", + "cook_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿณ", + "cook_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿณ", + "cooked_rice": "๐Ÿš", + "cookie": "๐Ÿช", + "cooking": "๐Ÿณ", + "copyright": "ยฉ", + "coral": "๐Ÿชธ", + "couch_and_lamp": "๐Ÿ›‹", + "counterclockwise_arrows_button": "๐Ÿ”„", + "couple_with_heart": "๐Ÿ’‘", + "couple_with_heart_dark_skin_tone": "๐Ÿ’‘๐Ÿฟ", + "couple_with_heart_light_skin_tone": "๐Ÿ’‘๐Ÿป", + "couple_with_heart_man_man": "๐Ÿ‘จโ€โคโ€๐Ÿ‘จ", + "couple_with_heart_man_man_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿฟ", + "couple_with_heart_man_man_dark_skin_tone_light_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿป", + "couple_with_heart_man_man_dark_skin_tone_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿพ", + "couple_with_heart_man_man_dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿผ", + "couple_with_heart_man_man_dark_skin_tone_medium_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿฝ", + "couple_with_heart_man_man_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿป", + "couple_with_heart_man_man_light_skin_tone_dark_skin_tone": "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿฟ", + "couple_with_heart_man_man_light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿพ", + "couple_with_heart_man_man_light_skin_tone_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿผ", + "couple_with_heart_man_man_light_skin_tone_medium_skin_tone": "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿฝ", + "couple_with_heart_man_man_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿพ", + "couple_with_heart_man_man_medium-dark_skin_tone_dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿฟ", + "couple_with_heart_man_man_medium-dark_skin_tone_light_skin_tone": "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿป", + "couple_with_heart_man_man_medium-dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿผ", + "couple_with_heart_man_man_medium-dark_skin_tone_medium_skin_tone": "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿฝ", + "couple_with_heart_man_man_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿผ", + "couple_with_heart_man_man_medium-light_skin_tone_dark_skin_tone": "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿฟ", + "couple_with_heart_man_man_medium-light_skin_tone_light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿป", + "couple_with_heart_man_man_medium-light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿพ", + "couple_with_heart_man_man_medium-light_skin_tone_medium_skin_tone": "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿฝ", + "couple_with_heart_man_man_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿฝ", + "couple_with_heart_man_man_medium_skin_tone_dark_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿฟ", + "couple_with_heart_man_man_medium_skin_tone_light_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿป", + "couple_with_heart_man_man_medium_skin_tone_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿพ", + "couple_with_heart_man_man_medium_skin_tone_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿผ", + "couple_with_heart_medium-dark_skin_tone": "๐Ÿ’‘๐Ÿพ", + "couple_with_heart_medium-light_skin_tone": "๐Ÿ’‘๐Ÿผ", + "couple_with_heart_medium_skin_tone": "๐Ÿ’‘๐Ÿฝ", + "couple_with_heart_person_person_dark_skin_tone_light_skin_tone": "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿง‘๐Ÿป", + "couple_with_heart_person_person_dark_skin_tone_medium-dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿง‘๐Ÿพ", + "couple_with_heart_person_person_dark_skin_tone_medium-light_skin_tone": "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿง‘๐Ÿผ", + "couple_with_heart_person_person_dark_skin_tone_medium_skin_tone": "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿง‘๐Ÿฝ", + "couple_with_heart_person_person_light_skin_tone_dark_skin_tone": "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿง‘๐Ÿฟ", + "couple_with_heart_person_person_light_skin_tone_medium-dark_skin_tone": "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿง‘๐Ÿพ", + "couple_with_heart_person_person_light_skin_tone_medium-light_skin_tone": "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿง‘๐Ÿผ", + "couple_with_heart_person_person_light_skin_tone_medium_skin_tone": "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿง‘๐Ÿฝ", + "couple_with_heart_person_person_medium-dark_skin_tone_dark_skin_tone": "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿง‘๐Ÿฟ", + "couple_with_heart_person_person_medium-dark_skin_tone_light_skin_tone": "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿง‘๐Ÿป", + "couple_with_heart_person_person_medium-dark_skin_tone_medium-light_skin_tone": "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿง‘๐Ÿผ", + "couple_with_heart_person_person_medium-dark_skin_tone_medium_skin_tone": "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿง‘๐Ÿฝ", + "couple_with_heart_person_person_medium-light_skin_tone_dark_skin_tone": "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿง‘๐Ÿฟ", + "couple_with_heart_person_person_medium-light_skin_tone_light_skin_tone": "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿง‘๐Ÿป", + "couple_with_heart_person_person_medium-light_skin_tone_medium-dark_skin_tone": "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿง‘๐Ÿพ", + "couple_with_heart_person_person_medium-light_skin_tone_medium_skin_tone": "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿง‘๐Ÿฝ", + "couple_with_heart_person_person_medium_skin_tone_dark_skin_tone": "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿง‘๐Ÿฟ", + "couple_with_heart_person_person_medium_skin_tone_light_skin_tone": "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿง‘๐Ÿป", + "couple_with_heart_person_person_medium_skin_tone_medium-dark_skin_tone": "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿง‘๐Ÿพ", + "couple_with_heart_person_person_medium_skin_tone_medium-light_skin_tone": "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿง‘๐Ÿผ", + "couple_with_heart_woman_man": "๐Ÿ‘ฉโ€โคโ€๐Ÿ‘จ", + "couple_with_heart_woman_man_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿฟ", + "couple_with_heart_woman_man_dark_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿป", + "couple_with_heart_woman_man_dark_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿพ", + "couple_with_heart_woman_man_dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿผ", + "couple_with_heart_woman_man_dark_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘จ๐Ÿฝ", + "couple_with_heart_woman_man_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿป", + "couple_with_heart_woman_man_light_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿฟ", + "couple_with_heart_woman_man_light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿพ", + "couple_with_heart_woman_man_light_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿผ", + "couple_with_heart_woman_man_light_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘จ๐Ÿฝ", + "couple_with_heart_woman_man_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿพ", + "couple_with_heart_woman_man_medium-dark_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿฟ", + "couple_with_heart_woman_man_medium-dark_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿป", + "couple_with_heart_woman_man_medium-dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿผ", + "couple_with_heart_woman_man_medium-dark_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘จ๐Ÿฝ", + "couple_with_heart_woman_man_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿผ", + "couple_with_heart_woman_man_medium-light_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿฟ", + "couple_with_heart_woman_man_medium-light_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿป", + "couple_with_heart_woman_man_medium-light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿพ", + "couple_with_heart_woman_man_medium-light_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘จ๐Ÿฝ", + "couple_with_heart_woman_man_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿฝ", + "couple_with_heart_woman_man_medium_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿฟ", + "couple_with_heart_woman_man_medium_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿป", + "couple_with_heart_woman_man_medium_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿพ", + "couple_with_heart_woman_man_medium_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘จ๐Ÿผ", + "couple_with_heart_woman_woman": "๐Ÿ‘ฉโ€โคโ€๐Ÿ‘ฉ", + "couple_with_heart_woman_woman_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", + "couple_with_heart_woman_woman_dark_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿป", + "couple_with_heart_woman_woman_dark_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", + "couple_with_heart_woman_woman_dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", + "couple_with_heart_woman_woman_dark_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", + "couple_with_heart_woman_woman_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿป", + "couple_with_heart_woman_woman_light_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", + "couple_with_heart_woman_woman_light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", + "couple_with_heart_woman_woman_light_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", + "couple_with_heart_woman_woman_light_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", + "couple_with_heart_woman_woman_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", + "couple_with_heart_woman_woman_medium-dark_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", + "couple_with_heart_woman_woman_medium-dark_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿป", + "couple_with_heart_woman_woman_medium-dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", + "couple_with_heart_woman_woman_medium-dark_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", + "couple_with_heart_woman_woman_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", + "couple_with_heart_woman_woman_medium-light_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", + "couple_with_heart_woman_woman_medium-light_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿป", + "couple_with_heart_woman_woman_medium-light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", + "couple_with_heart_woman_woman_medium-light_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", + "couple_with_heart_woman_woman_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿฝ", + "couple_with_heart_woman_woman_medium_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿฟ", + "couple_with_heart_woman_woman_medium_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿป", + "couple_with_heart_woman_woman_medium_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿพ", + "couple_with_heart_woman_woman_medium_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ‘ฉ๐Ÿผ", + "cow": "๐Ÿ„", + "cow_face": "๐Ÿฎ", + "cowboy_hat_face": "๐Ÿค ", + "crab": "๐Ÿฆ€", + "crayon": "๐Ÿ–", + "credit_card": "๐Ÿ’ณ", + "crescent_moon": "๐ŸŒ™", + "cricket": "๐Ÿฆ—", + "cricket_game": "๐Ÿ", + "crocodile": "๐ŸŠ", + "croissant": "๐Ÿฅ", + "cross_mark": "โŒ", + "cross_mark_button": "โŽ", + "crossed_fingers": "๐Ÿคž", + "crossed_fingers_dark_skin_tone": "๐Ÿคž๐Ÿฟ", + "crossed_fingers_light_skin_tone": "๐Ÿคž๐Ÿป", + "crossed_fingers_medium-dark_skin_tone": "๐Ÿคž๐Ÿพ", + "crossed_fingers_medium-light_skin_tone": "๐Ÿคž๐Ÿผ", + "crossed_fingers_medium_skin_tone": "๐Ÿคž๐Ÿฝ", + "crossed_flags": "๐ŸŽŒ", + "crossed_swords": "โš”", + "crown": "๐Ÿ‘‘", + "crutch": "๐Ÿฉผ", + "crying_cat": "๐Ÿ˜ฟ", + "crying_face": "๐Ÿ˜ข", + "crystal_ball": "๐Ÿ”ฎ", + "cucumber": "๐Ÿฅ’", + "cup_with_straw": "๐Ÿฅค", + "cupcake": "๐Ÿง", + "curling_stone": "๐ŸฅŒ", + "curly_hair": "๐Ÿฆฑ", + "curly_loop": "โžฐ", + "currency_exchange": "๐Ÿ’ฑ", + "curry_rice": "๐Ÿ›", + "custard": "๐Ÿฎ", + "customs": "๐Ÿ›ƒ", + "cut_of_meat": "๐Ÿฅฉ", + "cyclone": "๐ŸŒ€", + "dagger": "๐Ÿ—ก", + "dango": "๐Ÿก", + "dark_skin_tone": "๐Ÿฟ", + "dashing_away": "๐Ÿ’จ", + "deaf_man": "๐Ÿงโ€โ™‚", + "deaf_man_dark_skin_tone": "๐Ÿง๐Ÿฟโ€โ™‚", + "deaf_man_light_skin_tone": "๐Ÿง๐Ÿปโ€โ™‚", + "deaf_man_medium-dark_skin_tone": "๐Ÿง๐Ÿพโ€โ™‚", + "deaf_man_medium-light_skin_tone": "๐Ÿง๐Ÿผโ€โ™‚", + "deaf_man_medium_skin_tone": "๐Ÿง๐Ÿฝโ€โ™‚", + "deaf_person": "๐Ÿง", + "deaf_person_dark_skin_tone": "๐Ÿง๐Ÿฟ", + "deaf_person_light_skin_tone": "๐Ÿง๐Ÿป", + "deaf_person_medium-dark_skin_tone": "๐Ÿง๐Ÿพ", + "deaf_person_medium-light_skin_tone": "๐Ÿง๐Ÿผ", + "deaf_person_medium_skin_tone": "๐Ÿง๐Ÿฝ", + "deaf_woman": "๐Ÿงโ€โ™€", + "deaf_woman_dark_skin_tone": "๐Ÿง๐Ÿฟโ€โ™€", + "deaf_woman_light_skin_tone": "๐Ÿง๐Ÿปโ€โ™€", + "deaf_woman_medium-dark_skin_tone": "๐Ÿง๐Ÿพโ€โ™€", + "deaf_woman_medium-light_skin_tone": "๐Ÿง๐Ÿผโ€โ™€", + "deaf_woman_medium_skin_tone": "๐Ÿง๐Ÿฝโ€โ™€", + "deciduous_tree": "๐ŸŒณ", + "deer": "๐ŸฆŒ", + "delivery_truck": "๐Ÿšš", + "department_store": "๐Ÿฌ", + "derelict_house": "๐Ÿš", + "desert": "๐Ÿœ", + "desert_island": "๐Ÿ", + "desktop_computer": "๐Ÿ–ฅ", + "detective": "๐Ÿ•ต", + "detective_dark_skin_tone": "๐Ÿ•ต๐Ÿฟ", + "detective_light_skin_tone": "๐Ÿ•ต๐Ÿป", + "detective_medium-dark_skin_tone": "๐Ÿ•ต๐Ÿพ", + "detective_medium-light_skin_tone": "๐Ÿ•ต๐Ÿผ", + "detective_medium_skin_tone": "๐Ÿ•ต๐Ÿฝ", + "diamond_suit": "โ™ฆ", + "diamond_with_a_dot": "๐Ÿ’ ", + "dim_button": "๐Ÿ”…", + "disappointed_face": "๐Ÿ˜ž", + "disguised_face": "๐Ÿฅธ", + "divide": "โž—", + "diving_mask": "๐Ÿคฟ", + "diya_lamp": "๐Ÿช”", + "dizzy": "๐Ÿ’ซ", + "dna": "๐Ÿงฌ", + "dodo": "๐Ÿฆค", + "dog": "๐Ÿ•", + "dog_face": "๐Ÿถ", + "dollar_banknote": "๐Ÿ’ต", + "dolphin": "๐Ÿฌ", + "donkey": "๐Ÿซ", + "door": "๐Ÿšช", + "dotted_line_face": "๐Ÿซฅ", + "dotted_six-pointed_star": "๐Ÿ”ฏ", + "double_curly_loop": "โžฟ", + "double_exclamation_mark": "โ€ผ", + "doughnut": "๐Ÿฉ", + "dove": "๐Ÿ•Š", + "down-left_arrow": "โ†™", + "down-right_arrow": "โ†˜", + "down_arrow": "โฌ‡", + "downcast_face_with_sweat": "๐Ÿ˜“", + "downwards_button": "๐Ÿ”ฝ", + "dragon": "๐Ÿ‰", + "dragon_face": "๐Ÿฒ", + "dress": "๐Ÿ‘—", + "drooling_face": "๐Ÿคค", + "drop_of_blood": "๐Ÿฉธ", + "droplet": "๐Ÿ’ง", + "drum": "๐Ÿฅ", + "duck": "๐Ÿฆ†", + "dumpling": "๐ŸฅŸ", + "dvd": "๐Ÿ“€", + "e-mail": "๐Ÿ“ง", + "eagle": "๐Ÿฆ…", + "ear": "๐Ÿ‘‚", + "ear_dark_skin_tone": "๐Ÿ‘‚๐Ÿฟ", + "ear_light_skin_tone": "๐Ÿ‘‚๐Ÿป", + "ear_medium-dark_skin_tone": "๐Ÿ‘‚๐Ÿพ", + "ear_medium-light_skin_tone": "๐Ÿ‘‚๐Ÿผ", + "ear_medium_skin_tone": "๐Ÿ‘‚๐Ÿฝ", + "ear_of_corn": "๐ŸŒฝ", + "ear_with_hearing_aid": "๐Ÿฆป", + "ear_with_hearing_aid_dark_skin_tone": "๐Ÿฆป๐Ÿฟ", + "ear_with_hearing_aid_light_skin_tone": "๐Ÿฆป๐Ÿป", + "ear_with_hearing_aid_medium-dark_skin_tone": "๐Ÿฆป๐Ÿพ", + "ear_with_hearing_aid_medium-light_skin_tone": "๐Ÿฆป๐Ÿผ", + "ear_with_hearing_aid_medium_skin_tone": "๐Ÿฆป๐Ÿฝ", + "egg": "๐Ÿฅš", + "eggplant": "๐Ÿ†", + "eight-pointed_star": "โœด", + "eight-spoked_asterisk": "โœณ", + "eight-thirty": "๐Ÿ•ฃ", + "eight_oโ€™clock": "๐Ÿ•—", + "eject_button": "โ", + "electric_plug": "๐Ÿ”Œ", + "elephant": "๐Ÿ˜", + "elevator": "๐Ÿ›—", + "eleven-thirty": "๐Ÿ•ฆ", + "eleven_oโ€™clock": "๐Ÿ•š", + "elf": "๐Ÿง", + "elf_dark_skin_tone": "๐Ÿง๐Ÿฟ", + "elf_light_skin_tone": "๐Ÿง๐Ÿป", + "elf_medium-dark_skin_tone": "๐Ÿง๐Ÿพ", + "elf_medium-light_skin_tone": "๐Ÿง๐Ÿผ", + "elf_medium_skin_tone": "๐Ÿง๐Ÿฝ", + "empty_nest": "๐Ÿชน", + "enraged_face": "๐Ÿ˜ก", + "envelope": "โœ‰", + "envelope_with_arrow": "๐Ÿ“ฉ", + "euro_banknote": "๐Ÿ’ถ", + "evergreen_tree": "๐ŸŒฒ", + "ewe": "๐Ÿ‘", + "exclamation_question_mark": "โ‰", + "exploding_head": "๐Ÿคฏ", + "expressionless_face": "๐Ÿ˜‘", + "eye": "๐Ÿ‘", + "eye_in_speech_bubble": "๐Ÿ‘โ€๐Ÿ—จ", + "eyes": "๐Ÿ‘€", + "face_blowing_a_kiss": "๐Ÿ˜˜", + "face_exhaling": "๐Ÿ˜ฎโ€๐Ÿ’จ", + "face_holding_back_tears": "๐Ÿฅน", + "face_in_clouds": "๐Ÿ˜ถโ€๐ŸŒซ", + "face_savoring_food": "๐Ÿ˜‹", + "face_screaming_in_fear": "๐Ÿ˜ฑ", + "face_vomiting": "๐Ÿคฎ", + "face_with_crossed-out_eyes": "๐Ÿ˜ต", + "face_with_diagonal_mouth": "๐Ÿซค", + "face_with_hand_over_mouth": "๐Ÿคญ", + "face_with_head-bandage": "๐Ÿค•", + "face_with_medical_mask": "๐Ÿ˜ท", + "face_with_monocle": "๐Ÿง", + "face_with_open_eyes_and_hand_over_mouth": "๐Ÿซข", + "face_with_open_mouth": "๐Ÿ˜ฎ", + "face_with_peeking_eye": "๐Ÿซฃ", + "face_with_raised_eyebrow": "๐Ÿคจ", + "face_with_rolling_eyes": "๐Ÿ™„", + "face_with_spiral_eyes": "๐Ÿ˜ตโ€๐Ÿ’ซ", + "face_with_steam_from_nose": "๐Ÿ˜ค", + "face_with_symbols_on_mouth": "๐Ÿคฌ", + "face_with_tears_of_joy": "๐Ÿ˜‚", + "face_with_thermometer": "๐Ÿค’", + "face_with_tongue": "๐Ÿ˜›", + "face_without_mouth": "๐Ÿ˜ถ", + "factory": "๐Ÿญ", + "factory_worker": "๐Ÿง‘โ€๐Ÿญ", + "factory_worker_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿญ", + "factory_worker_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿญ", + "factory_worker_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿญ", + "factory_worker_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿญ", + "factory_worker_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿญ", + "fairy": "๐Ÿงš", + "fairy_dark_skin_tone": "๐Ÿงš๐Ÿฟ", + "fairy_light_skin_tone": "๐Ÿงš๐Ÿป", + "fairy_medium-dark_skin_tone": "๐Ÿงš๐Ÿพ", + "fairy_medium-light_skin_tone": "๐Ÿงš๐Ÿผ", + "fairy_medium_skin_tone": "๐Ÿงš๐Ÿฝ", + "falafel": "๐Ÿง†", + "fallen_leaf": "๐Ÿ‚", + "family": "๐Ÿ‘ช", + "family_man_boy": "๐Ÿ‘จโ€๐Ÿ‘ฆ", + "family_man_boy_boy": "๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", + "family_man_girl": "๐Ÿ‘จโ€๐Ÿ‘ง", + "family_man_girl_boy": "๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", + "family_man_girl_girl": "๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง", + "family_man_man_boy": "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆ", + "family_man_man_boy_boy": "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", + "family_man_man_girl": "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘ง", + "family_man_man_girl_boy": "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", + "family_man_man_girl_girl": "๐Ÿ‘จโ€๐Ÿ‘จโ€๐Ÿ‘งโ€๐Ÿ‘ง", + "family_man_woman_boy": "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ", + "family_man_woman_boy_boy": "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", + "family_man_woman_girl": "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง", + "family_man_woman_girl_boy": "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", + "family_man_woman_girl_girl": "๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", + "family_woman_boy": "๐Ÿ‘ฉโ€๐Ÿ‘ฆ", + "family_woman_boy_boy": "๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", + "family_woman_girl": "๐Ÿ‘ฉโ€๐Ÿ‘ง", + "family_woman_girl_boy": "๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", + "family_woman_girl_girl": "๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", + "family_woman_woman_boy": "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆ", + "family_woman_woman_boy_boy": "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ฆโ€๐Ÿ‘ฆ", + "family_woman_woman_girl": "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘ง", + "family_woman_woman_girl_boy": "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ", + "family_woman_woman_girl_girl": "๐Ÿ‘ฉโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ง", + "farmer": "๐Ÿง‘โ€๐ŸŒพ", + "farmer_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐ŸŒพ", + "farmer_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐ŸŒพ", + "farmer_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐ŸŒพ", + "farmer_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐ŸŒพ", + "farmer_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐ŸŒพ", + "fast-forward_button": "โฉ", + "fast_down_button": "โฌ", + "fast_reverse_button": "โช", + "fast_up_button": "โซ", + "fax_machine": "๐Ÿ“ ", + "fearful_face": "๐Ÿ˜จ", + "feather": "๐Ÿชถ", + "female_sign": "โ™€", + "ferris_wheel": "๐ŸŽก", + "ferry": "โ›ด", + "field_hockey": "๐Ÿ‘", + "file_cabinet": "๐Ÿ—„", + "file_folder": "๐Ÿ“", + "film_frames": "๐ŸŽž", + "film_projector": "๐Ÿ“ฝ", + "fire": "๐Ÿ”ฅ", + "fire_engine": "๐Ÿš’", + "fire_extinguisher": "๐Ÿงฏ", + "firecracker": "๐Ÿงจ", + "firefighter": "๐Ÿง‘โ€๐Ÿš’", + "firefighter_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿš’", + "firefighter_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿš’", + "firefighter_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿš’", + "firefighter_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿš’", + "firefighter_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿš’", + "fireworks": "๐ŸŽ†", + "first_quarter_moon": "๐ŸŒ“", + "first_quarter_moon_face": "๐ŸŒ›", + "fish": "๐ŸŸ", + "fish_cake_with_swirl": "๐Ÿฅ", + "fishing_pole": "๐ŸŽฃ", + "five-thirty": "๐Ÿ• ", + "five_oโ€™clock": "๐Ÿ•”", + "flag_in_hole": "โ›ณ", + "flamingo": "๐Ÿฆฉ", + "flashlight": "๐Ÿ”ฆ", + "flat_shoe": "๐Ÿฅฟ", + "flatbread": "๐Ÿซ“", + "fleur-de-lis": "โšœ", + "flexed_biceps": "๐Ÿ’ช", + "flexed_biceps_dark_skin_tone": "๐Ÿ’ช๐Ÿฟ", + "flexed_biceps_light_skin_tone": "๐Ÿ’ช๐Ÿป", + "flexed_biceps_medium-dark_skin_tone": "๐Ÿ’ช๐Ÿพ", + "flexed_biceps_medium-light_skin_tone": "๐Ÿ’ช๐Ÿผ", + "flexed_biceps_medium_skin_tone": "๐Ÿ’ช๐Ÿฝ", + "floppy_disk": "๐Ÿ’พ", + "flower_playing_cards": "๐ŸŽด", + "flushed_face": "๐Ÿ˜ณ", + "flute": "๐Ÿชˆ", + "fly": "๐Ÿชฐ", + "flying_disc": "๐Ÿฅ", + "flying_saucer": "๐Ÿ›ธ", + "fog": "๐ŸŒซ", + "foggy": "๐ŸŒ", + "folded_hands": "๐Ÿ™", + "folded_hands_dark_skin_tone": "๐Ÿ™๐Ÿฟ", + "folded_hands_light_skin_tone": "๐Ÿ™๐Ÿป", + "folded_hands_medium-dark_skin_tone": "๐Ÿ™๐Ÿพ", + "folded_hands_medium-light_skin_tone": "๐Ÿ™๐Ÿผ", + "folded_hands_medium_skin_tone": "๐Ÿ™๐Ÿฝ", + "folding_hand_fan": "๐Ÿชญ", + "fondue": "๐Ÿซ•", + "foot": "๐Ÿฆถ", + "foot_dark_skin_tone": "๐Ÿฆถ๐Ÿฟ", + "foot_light_skin_tone": "๐Ÿฆถ๐Ÿป", + "foot_medium-dark_skin_tone": "๐Ÿฆถ๐Ÿพ", + "foot_medium-light_skin_tone": "๐Ÿฆถ๐Ÿผ", + "foot_medium_skin_tone": "๐Ÿฆถ๐Ÿฝ", + "footprints": "๐Ÿ‘ฃ", + "fork_and_knife": "๐Ÿด", + "fork_and_knife_with_plate": "๐Ÿฝ", + "fortune_cookie": "๐Ÿฅ ", + "fountain": "โ›ฒ", + "fountain_pen": "๐Ÿ–‹", + "four-thirty": "๐Ÿ•Ÿ", + "four_leaf_clover": "๐Ÿ€", + "four_oโ€™clock": "๐Ÿ•“", + "fox": "๐ŸฆŠ", + "framed_picture": "๐Ÿ–ผ", + "french_fries": "๐ŸŸ", + "fried_shrimp": "๐Ÿค", + "frog": "๐Ÿธ", + "front-facing_baby_chick": "๐Ÿฅ", + "frowning_face": "โ˜น", + "frowning_face_with_open_mouth": "๐Ÿ˜ฆ", + "fuel_pump": "โ›ฝ", + "full_moon": "๐ŸŒ•", + "full_moon_face": "๐ŸŒ", + "funeral_urn": "โšฑ", + "game_die": "๐ŸŽฒ", + "garlic": "๐Ÿง„", + "gear": "โš™", + "gem_stone": "๐Ÿ’Ž", + "genie": "๐Ÿงž", + "ghost": "๐Ÿ‘ป", + "ginger_root": "๐Ÿซš", + "giraffe": "๐Ÿฆ’", + "girl": "๐Ÿ‘ง", + "girl_dark_skin_tone": "๐Ÿ‘ง๐Ÿฟ", + "girl_light_skin_tone": "๐Ÿ‘ง๐Ÿป", + "girl_medium-dark_skin_tone": "๐Ÿ‘ง๐Ÿพ", + "girl_medium-light_skin_tone": "๐Ÿ‘ง๐Ÿผ", + "girl_medium_skin_tone": "๐Ÿ‘ง๐Ÿฝ", + "glass_of_milk": "๐Ÿฅ›", + "glasses": "๐Ÿ‘“", + "globe_showing_Americas": "๐ŸŒŽ", + "globe_showing_Asia-Australia": "๐ŸŒ", + "globe_showing_Europe-Africa": "๐ŸŒ", + "globe_with_meridians": "๐ŸŒ", + "gloves": "๐Ÿงค", + "glowing_star": "๐ŸŒŸ", + "goal_net": "๐Ÿฅ…", + "goat": "๐Ÿ", + "goblin": "๐Ÿ‘บ", + "goggles": "๐Ÿฅฝ", + "goose": "๐Ÿชฟ", + "gorilla": "๐Ÿฆ", + "graduation_cap": "๐ŸŽ“", + "grapes": "๐Ÿ‡", + "green_apple": "๐Ÿ", + "green_book": "๐Ÿ“—", + "green_circle": "๐ŸŸข", + "green_heart": "๐Ÿ’š", + "green_salad": "๐Ÿฅ—", + "green_square": "๐ŸŸฉ", + "grey_heart": "๐Ÿฉถ", + "grimacing_face": "๐Ÿ˜ฌ", + "grinning_cat": "๐Ÿ˜บ", + "grinning_cat_with_smiling_eyes": "๐Ÿ˜ธ", + "grinning_face": "๐Ÿ˜€", + "grinning_face_with_big_eyes": "๐Ÿ˜ƒ", + "grinning_face_with_smiling_eyes": "๐Ÿ˜„", + "grinning_face_with_sweat": "๐Ÿ˜…", + "grinning_squinting_face": "๐Ÿ˜†", + "growing_heart": "๐Ÿ’—", + "guard": "๐Ÿ’‚", + "guard_dark_skin_tone": "๐Ÿ’‚๐Ÿฟ", + "guard_light_skin_tone": "๐Ÿ’‚๐Ÿป", + "guard_medium-dark_skin_tone": "๐Ÿ’‚๐Ÿพ", + "guard_medium-light_skin_tone": "๐Ÿ’‚๐Ÿผ", + "guard_medium_skin_tone": "๐Ÿ’‚๐Ÿฝ", + "guide_dog": "๐Ÿฆฎ", + "guitar": "๐ŸŽธ", + "hair_pick": "๐Ÿชฎ", + "hamburger": "๐Ÿ”", + "hammer": "๐Ÿ”จ", + "hammer_and_pick": "โš’", + "hammer_and_wrench": "๐Ÿ› ", + "hamsa": "๐Ÿชฌ", + "hamster": "๐Ÿน", + "hand_with_fingers_splayed": "๐Ÿ–", + "hand_with_fingers_splayed_dark_skin_tone": "๐Ÿ–๐Ÿฟ", + "hand_with_fingers_splayed_light_skin_tone": "๐Ÿ–๐Ÿป", + "hand_with_fingers_splayed_medium-dark_skin_tone": "๐Ÿ–๐Ÿพ", + "hand_with_fingers_splayed_medium-light_skin_tone": "๐Ÿ–๐Ÿผ", + "hand_with_fingers_splayed_medium_skin_tone": "๐Ÿ–๐Ÿฝ", + "hand_with_index_finger_and_thumb_crossed": "๐Ÿซฐ", + "hand_with_index_finger_and_thumb_crossed_dark_skin_tone": "๐Ÿซฐ๐Ÿฟ", + "hand_with_index_finger_and_thumb_crossed_light_skin_tone": "๐Ÿซฐ๐Ÿป", + "hand_with_index_finger_and_thumb_crossed_medium-dark_skin_tone": "๐Ÿซฐ๐Ÿพ", + "hand_with_index_finger_and_thumb_crossed_medium-light_skin_tone": "๐Ÿซฐ๐Ÿผ", + "hand_with_index_finger_and_thumb_crossed_medium_skin_tone": "๐Ÿซฐ๐Ÿฝ", + "handbag": "๐Ÿ‘œ", + "handshake": "๐Ÿค", + "handshake_dark_skin_tone": "๐Ÿค๐Ÿฟ", + "handshake_dark_skin_tone_light_skin_tone": "๐Ÿซฑ๐Ÿฟโ€๐Ÿซฒ๐Ÿป", + "handshake_dark_skin_tone_medium-dark_skin_tone": "๐Ÿซฑ๐Ÿฟโ€๐Ÿซฒ๐Ÿพ", + "handshake_dark_skin_tone_medium-light_skin_tone": "๐Ÿซฑ๐Ÿฟโ€๐Ÿซฒ๐Ÿผ", + "handshake_dark_skin_tone_medium_skin_tone": "๐Ÿซฑ๐Ÿฟโ€๐Ÿซฒ๐Ÿฝ", + "handshake_light_skin_tone": "๐Ÿค๐Ÿป", + "handshake_light_skin_tone_dark_skin_tone": "๐Ÿซฑ๐Ÿปโ€๐Ÿซฒ๐Ÿฟ", + "handshake_light_skin_tone_medium-dark_skin_tone": "๐Ÿซฑ๐Ÿปโ€๐Ÿซฒ๐Ÿพ", + "handshake_light_skin_tone_medium-light_skin_tone": "๐Ÿซฑ๐Ÿปโ€๐Ÿซฒ๐Ÿผ", + "handshake_light_skin_tone_medium_skin_tone": "๐Ÿซฑ๐Ÿปโ€๐Ÿซฒ๐Ÿฝ", + "handshake_medium-dark_skin_tone": "๐Ÿค๐Ÿพ", + "handshake_medium-dark_skin_tone_dark_skin_tone": "๐Ÿซฑ๐Ÿพโ€๐Ÿซฒ๐Ÿฟ", + "handshake_medium-dark_skin_tone_light_skin_tone": "๐Ÿซฑ๐Ÿพโ€๐Ÿซฒ๐Ÿป", + "handshake_medium-dark_skin_tone_medium-light_skin_tone": "๐Ÿซฑ๐Ÿพโ€๐Ÿซฒ๐Ÿผ", + "handshake_medium-dark_skin_tone_medium_skin_tone": "๐Ÿซฑ๐Ÿพโ€๐Ÿซฒ๐Ÿฝ", + "handshake_medium-light_skin_tone": "๐Ÿค๐Ÿผ", + "handshake_medium-light_skin_tone_dark_skin_tone": "๐Ÿซฑ๐Ÿผโ€๐Ÿซฒ๐Ÿฟ", + "handshake_medium-light_skin_tone_light_skin_tone": "๐Ÿซฑ๐Ÿผโ€๐Ÿซฒ๐Ÿป", + "handshake_medium-light_skin_tone_medium-dark_skin_tone": "๐Ÿซฑ๐Ÿผโ€๐Ÿซฒ๐Ÿพ", + "handshake_medium-light_skin_tone_medium_skin_tone": "๐Ÿซฑ๐Ÿผโ€๐Ÿซฒ๐Ÿฝ", + "handshake_medium_skin_tone": "๐Ÿค๐Ÿฝ", + "handshake_medium_skin_tone_dark_skin_tone": "๐Ÿซฑ๐Ÿฝโ€๐Ÿซฒ๐Ÿฟ", + "handshake_medium_skin_tone_light_skin_tone": "๐Ÿซฑ๐Ÿฝโ€๐Ÿซฒ๐Ÿป", + "handshake_medium_skin_tone_medium-dark_skin_tone": "๐Ÿซฑ๐Ÿฝโ€๐Ÿซฒ๐Ÿพ", + "handshake_medium_skin_tone_medium-light_skin_tone": "๐Ÿซฑ๐Ÿฝโ€๐Ÿซฒ๐Ÿผ", + "hatching_chick": "๐Ÿฃ", + "headphone": "๐ŸŽง", + "headstone": "๐Ÿชฆ", + "health_worker": "๐Ÿง‘โ€โš•", + "health_worker_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€โš•", + "health_worker_light_skin_tone": "๐Ÿง‘๐Ÿปโ€โš•", + "health_worker_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€โš•", + "health_worker_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€โš•", + "health_worker_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€โš•", + "hear-no-evil_monkey": "๐Ÿ™‰", + "heart_decoration": "๐Ÿ’Ÿ", + "heart_exclamation": "โฃ", + "heart_hands": "๐Ÿซถ", + "heart_hands_dark_skin_tone": "๐Ÿซถ๐Ÿฟ", + "heart_hands_light_skin_tone": "๐Ÿซถ๐Ÿป", + "heart_hands_medium-dark_skin_tone": "๐Ÿซถ๐Ÿพ", + "heart_hands_medium-light_skin_tone": "๐Ÿซถ๐Ÿผ", + "heart_hands_medium_skin_tone": "๐Ÿซถ๐Ÿฝ", + "heart_on_fire": "โคโ€๐Ÿ”ฅ", + "heart_suit": "โ™ฅ", + "heart_with_arrow": "๐Ÿ’˜", + "heart_with_ribbon": "๐Ÿ’", + "heavy_dollar_sign": "๐Ÿ’ฒ", + "heavy_equals_sign": "๐ŸŸฐ", + "hedgehog": "๐Ÿฆ”", + "helicopter": "๐Ÿš", + "herb": "๐ŸŒฟ", + "hibiscus": "๐ŸŒบ", + "high-heeled_shoe": "๐Ÿ‘ ", + "high-speed_train": "๐Ÿš„", + "high_voltage": "โšก", + "hiking_boot": "๐Ÿฅพ", + "hindu_temple": "๐Ÿ›•", + "hippopotamus": "๐Ÿฆ›", + "hole": "๐Ÿ•ณ", + "hollow_red_circle": "โญ•", + "honey_pot": "๐Ÿฏ", + "honeybee": "๐Ÿ", + "hook": "๐Ÿช", + "horizontal_traffic_light": "๐Ÿšฅ", + "horse": "๐ŸŽ", + "horse_face": "๐Ÿด", + "horse_racing": "๐Ÿ‡", + "horse_racing_dark_skin_tone": "๐Ÿ‡๐Ÿฟ", + "horse_racing_light_skin_tone": "๐Ÿ‡๐Ÿป", + "horse_racing_medium-dark_skin_tone": "๐Ÿ‡๐Ÿพ", + "horse_racing_medium-light_skin_tone": "๐Ÿ‡๐Ÿผ", + "horse_racing_medium_skin_tone": "๐Ÿ‡๐Ÿฝ", + "hospital": "๐Ÿฅ", + "hot_beverage": "โ˜•", + "hot_dog": "๐ŸŒญ", + "hot_face": "๐Ÿฅต", + "hot_pepper": "๐ŸŒถ", + "hot_springs": "โ™จ", + "hotel": "๐Ÿจ", + "hourglass_done": "โŒ›", + "hourglass_not_done": "โณ", + "house": "๐Ÿ ", + "house_with_garden": "๐Ÿก", + "houses": "๐Ÿ˜", + "hundred_points": "๐Ÿ’ฏ", + "hushed_face": "๐Ÿ˜ฏ", + "hut": "๐Ÿ›–", + "hyacinth": "๐Ÿชป", + "ice": "๐ŸงŠ", + "ice_cream": "๐Ÿจ", + "ice_hockey": "๐Ÿ’", + "ice_skate": "โ›ธ", + "identification_card": "๐Ÿชช", + "inbox_tray": "๐Ÿ“ฅ", + "incoming_envelope": "๐Ÿ“จ", + "index_pointing_at_the_viewer": "๐Ÿซต", + "index_pointing_at_the_viewer_dark_skin_tone": "๐Ÿซต๐Ÿฟ", + "index_pointing_at_the_viewer_light_skin_tone": "๐Ÿซต๐Ÿป", + "index_pointing_at_the_viewer_medium-dark_skin_tone": "๐Ÿซต๐Ÿพ", + "index_pointing_at_the_viewer_medium-light_skin_tone": "๐Ÿซต๐Ÿผ", + "index_pointing_at_the_viewer_medium_skin_tone": "๐Ÿซต๐Ÿฝ", + "index_pointing_up": "โ˜", + "index_pointing_up_dark_skin_tone": "โ˜๐Ÿฟ", + "index_pointing_up_light_skin_tone": "โ˜๐Ÿป", + "index_pointing_up_medium-dark_skin_tone": "โ˜๐Ÿพ", + "index_pointing_up_medium-light_skin_tone": "โ˜๐Ÿผ", + "index_pointing_up_medium_skin_tone": "โ˜๐Ÿฝ", + "infinity": "โ™พ", + "information": "โ„น", + "input_latin_letters": "๐Ÿ”ค", + "input_latin_lowercase": "๐Ÿ”ก", + "input_latin_uppercase": "๐Ÿ” ", + "input_numbers": "๐Ÿ”ข", + "input_symbols": "๐Ÿ”ฃ", + "jack-o-lantern": "๐ŸŽƒ", + "jar": "๐Ÿซ™", + "jeans": "๐Ÿ‘–", + "jellyfish": "๐Ÿชผ", + "joker": "๐Ÿƒ", + "joystick": "๐Ÿ•น", + "judge": "๐Ÿง‘โ€โš–", + "judge_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€โš–", + "judge_light_skin_tone": "๐Ÿง‘๐Ÿปโ€โš–", + "judge_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€โš–", + "judge_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€โš–", + "judge_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€โš–", + "kaaba": "๐Ÿ•‹", + "kangaroo": "๐Ÿฆ˜", + "key": "๐Ÿ”‘", + "keyboard": "โŒจ", + "keycap_#": "#โƒฃ", + "keycap_*": "*โƒฃ", + "keycap_0": "0โƒฃ", + "keycap_1": "1โƒฃ", + "keycap_10": "๐Ÿ”Ÿ", + "keycap_2": "2โƒฃ", + "keycap_3": "3โƒฃ", + "keycap_4": "4โƒฃ", + "keycap_5": "5โƒฃ", + "keycap_6": "6โƒฃ", + "keycap_7": "7โƒฃ", + "keycap_8": "8โƒฃ", + "keycap_9": "9โƒฃ", + "khanda": "๐Ÿชฏ", + "kick_scooter": "๐Ÿ›ด", + "kimono": "๐Ÿ‘˜", + "kiss": "๐Ÿ’", + "kiss_dark_skin_tone": "๐Ÿ’๐Ÿฟ", + "kiss_light_skin_tone": "๐Ÿ’๐Ÿป", + "kiss_man_man": "๐Ÿ‘จโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ", + "kiss_man_man_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", + "kiss_man_man_dark_skin_tone_light_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", + "kiss_man_man_dark_skin_tone_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", + "kiss_man_man_dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", + "kiss_man_man_dark_skin_tone_medium_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", + "kiss_man_man_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", + "kiss_man_man_light_skin_tone_dark_skin_tone": "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", + "kiss_man_man_light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", + "kiss_man_man_light_skin_tone_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", + "kiss_man_man_light_skin_tone_medium_skin_tone": "๐Ÿ‘จ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", + "kiss_man_man_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", + "kiss_man_man_medium-dark_skin_tone_dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", + "kiss_man_man_medium-dark_skin_tone_light_skin_tone": "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", + "kiss_man_man_medium-dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", + "kiss_man_man_medium-dark_skin_tone_medium_skin_tone": "๐Ÿ‘จ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", + "kiss_man_man_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", + "kiss_man_man_medium-light_skin_tone_dark_skin_tone": "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", + "kiss_man_man_medium-light_skin_tone_light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", + "kiss_man_man_medium-light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", + "kiss_man_man_medium-light_skin_tone_medium_skin_tone": "๐Ÿ‘จ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", + "kiss_man_man_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", + "kiss_man_man_medium_skin_tone_dark_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", + "kiss_man_man_medium_skin_tone_light_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", + "kiss_man_man_medium_skin_tone_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", + "kiss_man_man_medium_skin_tone_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", + "kiss_mark": "๐Ÿ’‹", + "kiss_medium-dark_skin_tone": "๐Ÿ’๐Ÿพ", + "kiss_medium-light_skin_tone": "๐Ÿ’๐Ÿผ", + "kiss_medium_skin_tone": "๐Ÿ’๐Ÿฝ", + "kiss_person_person_dark_skin_tone_light_skin_tone": "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป", + "kiss_person_person_dark_skin_tone_medium-dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ", + "kiss_person_person_dark_skin_tone_medium-light_skin_tone": "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ", + "kiss_person_person_dark_skin_tone_medium_skin_tone": "๐Ÿง‘๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ", + "kiss_person_person_light_skin_tone_dark_skin_tone": "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ", + "kiss_person_person_light_skin_tone_medium-dark_skin_tone": "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ", + "kiss_person_person_light_skin_tone_medium-light_skin_tone": "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ", + "kiss_person_person_light_skin_tone_medium_skin_tone": "๐Ÿง‘๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ", + "kiss_person_person_medium-dark_skin_tone_dark_skin_tone": "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ", + "kiss_person_person_medium-dark_skin_tone_light_skin_tone": "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป", + "kiss_person_person_medium-dark_skin_tone_medium-light_skin_tone": "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ", + "kiss_person_person_medium-dark_skin_tone_medium_skin_tone": "๐Ÿง‘๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ", + "kiss_person_person_medium-light_skin_tone_dark_skin_tone": "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ", + "kiss_person_person_medium-light_skin_tone_light_skin_tone": "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป", + "kiss_person_person_medium-light_skin_tone_medium-dark_skin_tone": "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ", + "kiss_person_person_medium-light_skin_tone_medium_skin_tone": "๐Ÿง‘๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฝ", + "kiss_person_person_medium_skin_tone_dark_skin_tone": "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿฟ", + "kiss_person_person_medium_skin_tone_light_skin_tone": "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿป", + "kiss_person_person_medium_skin_tone_medium-dark_skin_tone": "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿพ", + "kiss_person_person_medium_skin_tone_medium-light_skin_tone": "๐Ÿง‘๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿง‘๐Ÿผ", + "kiss_woman_man": "๐Ÿ‘ฉโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ", + "kiss_woman_man_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", + "kiss_woman_man_dark_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", + "kiss_woman_man_dark_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", + "kiss_woman_man_dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", + "kiss_woman_man_dark_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", + "kiss_woman_man_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", + "kiss_woman_man_light_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", + "kiss_woman_man_light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", + "kiss_woman_man_light_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", + "kiss_woman_man_light_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", + "kiss_woman_man_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", + "kiss_woman_man_medium-dark_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", + "kiss_woman_man_medium-dark_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", + "kiss_woman_man_medium-dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", + "kiss_woman_man_medium-dark_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", + "kiss_woman_man_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", + "kiss_woman_man_medium-light_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", + "kiss_woman_man_medium-light_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", + "kiss_woman_man_medium-light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", + "kiss_woman_man_medium-light_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", + "kiss_woman_man_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฝ", + "kiss_woman_man_medium_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿฟ", + "kiss_woman_man_medium_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿป", + "kiss_woman_man_medium_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿพ", + "kiss_woman_man_medium_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘จ๐Ÿผ", + "kiss_woman_woman": "๐Ÿ‘ฉโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ", + "kiss_woman_woman_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", + "kiss_woman_woman_dark_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", + "kiss_woman_woman_dark_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", + "kiss_woman_woman_dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", + "kiss_woman_woman_dark_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", + "kiss_woman_woman_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", + "kiss_woman_woman_light_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", + "kiss_woman_woman_light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", + "kiss_woman_woman_light_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", + "kiss_woman_woman_light_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", + "kiss_woman_woman_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", + "kiss_woman_woman_medium-dark_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", + "kiss_woman_woman_medium-dark_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", + "kiss_woman_woman_medium-dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", + "kiss_woman_woman_medium-dark_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", + "kiss_woman_woman_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", + "kiss_woman_woman_medium-light_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", + "kiss_woman_woman_medium-light_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", + "kiss_woman_woman_medium-light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", + "kiss_woman_woman_medium-light_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", + "kiss_woman_woman_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฝ", + "kiss_woman_woman_medium_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿฟ", + "kiss_woman_woman_medium_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿป", + "kiss_woman_woman_medium_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿพ", + "kiss_woman_woman_medium_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โคโ€๐Ÿ’‹โ€๐Ÿ‘ฉ๐Ÿผ", + "kissing_cat": "๐Ÿ˜ฝ", + "kissing_face": "๐Ÿ˜—", + "kissing_face_with_closed_eyes": "๐Ÿ˜š", + "kissing_face_with_smiling_eyes": "๐Ÿ˜™", + "kitchen_knife": "๐Ÿ”ช", + "kite": "๐Ÿช", + "kiwi_fruit": "๐Ÿฅ", + "knot": "๐Ÿชข", + "koala": "๐Ÿจ", + "lab_coat": "๐Ÿฅผ", + "label": "๐Ÿท", + "lacrosse": "๐Ÿฅ", + "ladder": "๐Ÿชœ", + "lady_beetle": "๐Ÿž", + "laptop": "๐Ÿ’ป", + "large_blue_diamond": "๐Ÿ”ท", + "large_orange_diamond": "๐Ÿ”ถ", + "last_quarter_moon": "๐ŸŒ—", + "last_quarter_moon_face": "๐ŸŒœ", + "last_track_button": "โฎ", + "latin_cross": "โœ", + "leaf_fluttering_in_wind": "๐Ÿƒ", + "leafy_green": "๐Ÿฅฌ", + "ledger": "๐Ÿ“’", + "left-facing_fist": "๐Ÿค›", + "left-facing_fist_dark_skin_tone": "๐Ÿค›๐Ÿฟ", + "left-facing_fist_light_skin_tone": "๐Ÿค›๐Ÿป", + "left-facing_fist_medium-dark_skin_tone": "๐Ÿค›๐Ÿพ", + "left-facing_fist_medium-light_skin_tone": "๐Ÿค›๐Ÿผ", + "left-facing_fist_medium_skin_tone": "๐Ÿค›๐Ÿฝ", + "left-right_arrow": "โ†”", + "left_arrow": "โฌ…", + "left_arrow_curving_right": "โ†ช", + "left_luggage": "๐Ÿ›…", + "left_speech_bubble": "๐Ÿ—จ", + "leftwards_hand": "๐Ÿซฒ", + "leftwards_hand_dark_skin_tone": "๐Ÿซฒ๐Ÿฟ", + "leftwards_hand_light_skin_tone": "๐Ÿซฒ๐Ÿป", + "leftwards_hand_medium-dark_skin_tone": "๐Ÿซฒ๐Ÿพ", + "leftwards_hand_medium-light_skin_tone": "๐Ÿซฒ๐Ÿผ", + "leftwards_hand_medium_skin_tone": "๐Ÿซฒ๐Ÿฝ", + "leftwards_pushing_hand": "๐Ÿซท", + "leftwards_pushing_hand_dark_skin_tone": "๐Ÿซท๐Ÿฟ", + "leftwards_pushing_hand_light_skin_tone": "๐Ÿซท๐Ÿป", + "leftwards_pushing_hand_medium-dark_skin_tone": "๐Ÿซท๐Ÿพ", + "leftwards_pushing_hand_medium-light_skin_tone": "๐Ÿซท๐Ÿผ", + "leftwards_pushing_hand_medium_skin_tone": "๐Ÿซท๐Ÿฝ", + "leg": "๐Ÿฆต", + "leg_dark_skin_tone": "๐Ÿฆต๐Ÿฟ", + "leg_light_skin_tone": "๐Ÿฆต๐Ÿป", + "leg_medium-dark_skin_tone": "๐Ÿฆต๐Ÿพ", + "leg_medium-light_skin_tone": "๐Ÿฆต๐Ÿผ", + "leg_medium_skin_tone": "๐Ÿฆต๐Ÿฝ", + "lemon": "๐Ÿ‹", + "leopard": "๐Ÿ†", + "level_slider": "๐ŸŽš", + "light_blue_heart": "๐Ÿฉต", + "light_bulb": "๐Ÿ’ก", + "light_rail": "๐Ÿšˆ", + "light_skin_tone": "๐Ÿป", + "link": "๐Ÿ”—", + "linked_paperclips": "๐Ÿ–‡", + "lion": "๐Ÿฆ", + "lipstick": "๐Ÿ’„", + "litter_in_bin_sign": "๐Ÿšฎ", + "lizard": "๐ŸฆŽ", + "llama": "๐Ÿฆ™", + "lobster": "๐Ÿฆž", + "locked": "๐Ÿ”’", + "locked_with_key": "๐Ÿ”", + "locked_with_pen": "๐Ÿ”", + "locomotive": "๐Ÿš‚", + "lollipop": "๐Ÿญ", + "long_drum": "๐Ÿช˜", + "lotion_bottle": "๐Ÿงด", + "lotus": "๐Ÿชท", + "loudly_crying_face": "๐Ÿ˜ญ", + "loudspeaker": "๐Ÿ“ข", + "love-you_gesture": "๐ŸคŸ", + "love-you_gesture_dark_skin_tone": "๐ŸคŸ๐Ÿฟ", + "love-you_gesture_light_skin_tone": "๐ŸคŸ๐Ÿป", + "love-you_gesture_medium-dark_skin_tone": "๐ŸคŸ๐Ÿพ", + "love-you_gesture_medium-light_skin_tone": "๐ŸคŸ๐Ÿผ", + "love-you_gesture_medium_skin_tone": "๐ŸคŸ๐Ÿฝ", + "love_hotel": "๐Ÿฉ", + "love_letter": "๐Ÿ’Œ", + "low_battery": "๐Ÿชซ", + "luggage": "๐Ÿงณ", + "lungs": "๐Ÿซ", + "lying_face": "๐Ÿคฅ", + "mage": "๐Ÿง™", + "mage_dark_skin_tone": "๐Ÿง™๐Ÿฟ", + "mage_light_skin_tone": "๐Ÿง™๐Ÿป", + "mage_medium-dark_skin_tone": "๐Ÿง™๐Ÿพ", + "mage_medium-light_skin_tone": "๐Ÿง™๐Ÿผ", + "mage_medium_skin_tone": "๐Ÿง™๐Ÿฝ", + "magic_wand": "๐Ÿช„", + "magnet": "๐Ÿงฒ", + "magnifying_glass_tilted_left": "๐Ÿ”", + "magnifying_glass_tilted_right": "๐Ÿ”Ž", + "mahjong_red_dragon": "๐Ÿ€„", + "male_sign": "โ™‚", + "mammoth": "๐Ÿฆฃ", + "man": "๐Ÿ‘จ", + "man_artist": "๐Ÿ‘จโ€๐ŸŽจ", + "man_artist_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐ŸŽจ", + "man_artist_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐ŸŽจ", + "man_artist_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐ŸŽจ", + "man_artist_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐ŸŽจ", + "man_artist_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐ŸŽจ", + "man_astronaut": "๐Ÿ‘จโ€๐Ÿš€", + "man_astronaut_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿš€", + "man_astronaut_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿš€", + "man_astronaut_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿš€", + "man_astronaut_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿš€", + "man_astronaut_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿš€", + "man_bald": "๐Ÿ‘จโ€๐Ÿฆฒ", + "man_beard": "๐Ÿง”โ€โ™‚", + "man_biking": "๐Ÿšดโ€โ™‚", + "man_biking_dark_skin_tone": "๐Ÿšด๐Ÿฟโ€โ™‚", + "man_biking_light_skin_tone": "๐Ÿšด๐Ÿปโ€โ™‚", + "man_biking_medium-dark_skin_tone": "๐Ÿšด๐Ÿพโ€โ™‚", + "man_biking_medium-light_skin_tone": "๐Ÿšด๐Ÿผโ€โ™‚", + "man_biking_medium_skin_tone": "๐Ÿšด๐Ÿฝโ€โ™‚", + "man_blond_hair": "๐Ÿ‘ฑโ€โ™‚", + "man_bouncing_ball": "โ›นโ€โ™‚", + "man_bouncing_ball_dark_skin_tone": "โ›น๐Ÿฟโ€โ™‚", + "man_bouncing_ball_light_skin_tone": "โ›น๐Ÿปโ€โ™‚", + "man_bouncing_ball_medium-dark_skin_tone": "โ›น๐Ÿพโ€โ™‚", + "man_bouncing_ball_medium-light_skin_tone": "โ›น๐Ÿผโ€โ™‚", + "man_bouncing_ball_medium_skin_tone": "โ›น๐Ÿฝโ€โ™‚", + "man_bowing": "๐Ÿ™‡โ€โ™‚", + "man_bowing_dark_skin_tone": "๐Ÿ™‡๐Ÿฟโ€โ™‚", + "man_bowing_light_skin_tone": "๐Ÿ™‡๐Ÿปโ€โ™‚", + "man_bowing_medium-dark_skin_tone": "๐Ÿ™‡๐Ÿพโ€โ™‚", + "man_bowing_medium-light_skin_tone": "๐Ÿ™‡๐Ÿผโ€โ™‚", + "man_bowing_medium_skin_tone": "๐Ÿ™‡๐Ÿฝโ€โ™‚", + "man_cartwheeling": "๐Ÿคธโ€โ™‚", + "man_cartwheeling_dark_skin_tone": "๐Ÿคธ๐Ÿฟโ€โ™‚", + "man_cartwheeling_light_skin_tone": "๐Ÿคธ๐Ÿปโ€โ™‚", + "man_cartwheeling_medium-dark_skin_tone": "๐Ÿคธ๐Ÿพโ€โ™‚", + "man_cartwheeling_medium-light_skin_tone": "๐Ÿคธ๐Ÿผโ€โ™‚", + "man_cartwheeling_medium_skin_tone": "๐Ÿคธ๐Ÿฝโ€โ™‚", + "man_climbing": "๐Ÿง—โ€โ™‚", + "man_climbing_dark_skin_tone": "๐Ÿง—๐Ÿฟโ€โ™‚", + "man_climbing_light_skin_tone": "๐Ÿง—๐Ÿปโ€โ™‚", + "man_climbing_medium-dark_skin_tone": "๐Ÿง—๐Ÿพโ€โ™‚", + "man_climbing_medium-light_skin_tone": "๐Ÿง—๐Ÿผโ€โ™‚", + "man_climbing_medium_skin_tone": "๐Ÿง—๐Ÿฝโ€โ™‚", + "man_construction_worker": "๐Ÿ‘ทโ€โ™‚", + "man_construction_worker_dark_skin_tone": "๐Ÿ‘ท๐Ÿฟโ€โ™‚", + "man_construction_worker_light_skin_tone": "๐Ÿ‘ท๐Ÿปโ€โ™‚", + "man_construction_worker_medium-dark_skin_tone": "๐Ÿ‘ท๐Ÿพโ€โ™‚", + "man_construction_worker_medium-light_skin_tone": "๐Ÿ‘ท๐Ÿผโ€โ™‚", + "man_construction_worker_medium_skin_tone": "๐Ÿ‘ท๐Ÿฝโ€โ™‚", + "man_cook": "๐Ÿ‘จโ€๐Ÿณ", + "man_cook_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿณ", + "man_cook_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿณ", + "man_cook_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿณ", + "man_cook_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿณ", + "man_cook_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿณ", + "man_curly_hair": "๐Ÿ‘จโ€๐Ÿฆฑ", + "man_dancing": "๐Ÿ•บ", + "man_dancing_dark_skin_tone": "๐Ÿ•บ๐Ÿฟ", + "man_dancing_light_skin_tone": "๐Ÿ•บ๐Ÿป", + "man_dancing_medium-dark_skin_tone": "๐Ÿ•บ๐Ÿพ", + "man_dancing_medium-light_skin_tone": "๐Ÿ•บ๐Ÿผ", + "man_dancing_medium_skin_tone": "๐Ÿ•บ๐Ÿฝ", + "man_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟ", + "man_dark_skin_tone_bald": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฒ", + "man_dark_skin_tone_beard": "๐Ÿง”๐Ÿฟโ€โ™‚", + "man_dark_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿฟโ€โ™‚", + "man_dark_skin_tone_curly_hair": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฑ", + "man_dark_skin_tone_red_hair": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฐ", + "man_dark_skin_tone_white_hair": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆณ", + "man_detective": "๐Ÿ•ตโ€โ™‚", + "man_detective_dark_skin_tone": "๐Ÿ•ต๐Ÿฟโ€โ™‚", + "man_detective_light_skin_tone": "๐Ÿ•ต๐Ÿปโ€โ™‚", + "man_detective_medium-dark_skin_tone": "๐Ÿ•ต๐Ÿพโ€โ™‚", + "man_detective_medium-light_skin_tone": "๐Ÿ•ต๐Ÿผโ€โ™‚", + "man_detective_medium_skin_tone": "๐Ÿ•ต๐Ÿฝโ€โ™‚", + "man_elf": "๐Ÿงโ€โ™‚", + "man_elf_dark_skin_tone": "๐Ÿง๐Ÿฟโ€โ™‚", + "man_elf_light_skin_tone": "๐Ÿง๐Ÿปโ€โ™‚", + "man_elf_medium-dark_skin_tone": "๐Ÿง๐Ÿพโ€โ™‚", + "man_elf_medium-light_skin_tone": "๐Ÿง๐Ÿผโ€โ™‚", + "man_elf_medium_skin_tone": "๐Ÿง๐Ÿฝโ€โ™‚", + "man_facepalming": "๐Ÿคฆโ€โ™‚", + "man_facepalming_dark_skin_tone": "๐Ÿคฆ๐Ÿฟโ€โ™‚", + "man_facepalming_light_skin_tone": "๐Ÿคฆ๐Ÿปโ€โ™‚", + "man_facepalming_medium-dark_skin_tone": "๐Ÿคฆ๐Ÿพโ€โ™‚", + "man_facepalming_medium-light_skin_tone": "๐Ÿคฆ๐Ÿผโ€โ™‚", + "man_facepalming_medium_skin_tone": "๐Ÿคฆ๐Ÿฝโ€โ™‚", + "man_factory_worker": "๐Ÿ‘จโ€๐Ÿญ", + "man_factory_worker_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿญ", + "man_factory_worker_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿญ", + "man_factory_worker_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿญ", + "man_factory_worker_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿญ", + "man_factory_worker_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿญ", + "man_fairy": "๐Ÿงšโ€โ™‚", + "man_fairy_dark_skin_tone": "๐Ÿงš๐Ÿฟโ€โ™‚", + "man_fairy_light_skin_tone": "๐Ÿงš๐Ÿปโ€โ™‚", + "man_fairy_medium-dark_skin_tone": "๐Ÿงš๐Ÿพโ€โ™‚", + "man_fairy_medium-light_skin_tone": "๐Ÿงš๐Ÿผโ€โ™‚", + "man_fairy_medium_skin_tone": "๐Ÿงš๐Ÿฝโ€โ™‚", + "man_farmer": "๐Ÿ‘จโ€๐ŸŒพ", + "man_farmer_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐ŸŒพ", + "man_farmer_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐ŸŒพ", + "man_farmer_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐ŸŒพ", + "man_farmer_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐ŸŒพ", + "man_farmer_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐ŸŒพ", + "man_feeding_baby": "๐Ÿ‘จโ€๐Ÿผ", + "man_feeding_baby_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿผ", + "man_feeding_baby_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿผ", + "man_feeding_baby_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿผ", + "man_feeding_baby_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿผ", + "man_feeding_baby_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿผ", + "man_firefighter": "๐Ÿ‘จโ€๐Ÿš’", + "man_firefighter_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿš’", + "man_firefighter_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿš’", + "man_firefighter_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿš’", + "man_firefighter_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿš’", + "man_firefighter_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿš’", + "man_frowning": "๐Ÿ™โ€โ™‚", + "man_frowning_dark_skin_tone": "๐Ÿ™๐Ÿฟโ€โ™‚", + "man_frowning_light_skin_tone": "๐Ÿ™๐Ÿปโ€โ™‚", + "man_frowning_medium-dark_skin_tone": "๐Ÿ™๐Ÿพโ€โ™‚", + "man_frowning_medium-light_skin_tone": "๐Ÿ™๐Ÿผโ€โ™‚", + "man_frowning_medium_skin_tone": "๐Ÿ™๐Ÿฝโ€โ™‚", + "man_genie": "๐Ÿงžโ€โ™‚", + "man_gesturing_NO": "๐Ÿ™…โ€โ™‚", + "man_gesturing_NO_dark_skin_tone": "๐Ÿ™…๐Ÿฟโ€โ™‚", + "man_gesturing_NO_light_skin_tone": "๐Ÿ™…๐Ÿปโ€โ™‚", + "man_gesturing_NO_medium-dark_skin_tone": "๐Ÿ™…๐Ÿพโ€โ™‚", + "man_gesturing_NO_medium-light_skin_tone": "๐Ÿ™…๐Ÿผโ€โ™‚", + "man_gesturing_NO_medium_skin_tone": "๐Ÿ™…๐Ÿฝโ€โ™‚", + "man_gesturing_OK": "๐Ÿ™†โ€โ™‚", + "man_gesturing_OK_dark_skin_tone": "๐Ÿ™†๐Ÿฟโ€โ™‚", + "man_gesturing_OK_light_skin_tone": "๐Ÿ™†๐Ÿปโ€โ™‚", + "man_gesturing_OK_medium-dark_skin_tone": "๐Ÿ™†๐Ÿพโ€โ™‚", + "man_gesturing_OK_medium-light_skin_tone": "๐Ÿ™†๐Ÿผโ€โ™‚", + "man_gesturing_OK_medium_skin_tone": "๐Ÿ™†๐Ÿฝโ€โ™‚", + "man_getting_haircut": "๐Ÿ’‡โ€โ™‚", + "man_getting_haircut_dark_skin_tone": "๐Ÿ’‡๐Ÿฟโ€โ™‚", + "man_getting_haircut_light_skin_tone": "๐Ÿ’‡๐Ÿปโ€โ™‚", + "man_getting_haircut_medium-dark_skin_tone": "๐Ÿ’‡๐Ÿพโ€โ™‚", + "man_getting_haircut_medium-light_skin_tone": "๐Ÿ’‡๐Ÿผโ€โ™‚", + "man_getting_haircut_medium_skin_tone": "๐Ÿ’‡๐Ÿฝโ€โ™‚", + "man_getting_massage": "๐Ÿ’†โ€โ™‚", + "man_getting_massage_dark_skin_tone": "๐Ÿ’†๐Ÿฟโ€โ™‚", + "man_getting_massage_light_skin_tone": "๐Ÿ’†๐Ÿปโ€โ™‚", + "man_getting_massage_medium-dark_skin_tone": "๐Ÿ’†๐Ÿพโ€โ™‚", + "man_getting_massage_medium-light_skin_tone": "๐Ÿ’†๐Ÿผโ€โ™‚", + "man_getting_massage_medium_skin_tone": "๐Ÿ’†๐Ÿฝโ€โ™‚", + "man_golfing": "๐ŸŒโ€โ™‚", + "man_golfing_dark_skin_tone": "๐ŸŒ๐Ÿฟโ€โ™‚", + "man_golfing_light_skin_tone": "๐ŸŒ๐Ÿปโ€โ™‚", + "man_golfing_medium-dark_skin_tone": "๐ŸŒ๐Ÿพโ€โ™‚", + "man_golfing_medium-light_skin_tone": "๐ŸŒ๐Ÿผโ€โ™‚", + "man_golfing_medium_skin_tone": "๐ŸŒ๐Ÿฝโ€โ™‚", + "man_guard": "๐Ÿ’‚โ€โ™‚", + "man_guard_dark_skin_tone": "๐Ÿ’‚๐Ÿฟโ€โ™‚", + "man_guard_light_skin_tone": "๐Ÿ’‚๐Ÿปโ€โ™‚", + "man_guard_medium-dark_skin_tone": "๐Ÿ’‚๐Ÿพโ€โ™‚", + "man_guard_medium-light_skin_tone": "๐Ÿ’‚๐Ÿผโ€โ™‚", + "man_guard_medium_skin_tone": "๐Ÿ’‚๐Ÿฝโ€โ™‚", + "man_health_worker": "๐Ÿ‘จโ€โš•", + "man_health_worker_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€โš•", + "man_health_worker_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€โš•", + "man_health_worker_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€โš•", + "man_health_worker_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€โš•", + "man_health_worker_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€โš•", + "man_in_lotus_position": "๐Ÿง˜โ€โ™‚", + "man_in_lotus_position_dark_skin_tone": "๐Ÿง˜๐Ÿฟโ€โ™‚", + "man_in_lotus_position_light_skin_tone": "๐Ÿง˜๐Ÿปโ€โ™‚", + "man_in_lotus_position_medium-dark_skin_tone": "๐Ÿง˜๐Ÿพโ€โ™‚", + "man_in_lotus_position_medium-light_skin_tone": "๐Ÿง˜๐Ÿผโ€โ™‚", + "man_in_lotus_position_medium_skin_tone": "๐Ÿง˜๐Ÿฝโ€โ™‚", + "man_in_manual_wheelchair": "๐Ÿ‘จโ€๐Ÿฆฝ", + "man_in_manual_wheelchair_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฝ", + "man_in_manual_wheelchair_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฝ", + "man_in_manual_wheelchair_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฝ", + "man_in_manual_wheelchair_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฝ", + "man_in_manual_wheelchair_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฝ", + "man_in_motorized_wheelchair": "๐Ÿ‘จโ€๐Ÿฆผ", + "man_in_motorized_wheelchair_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆผ", + "man_in_motorized_wheelchair_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆผ", + "man_in_motorized_wheelchair_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆผ", + "man_in_motorized_wheelchair_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆผ", + "man_in_motorized_wheelchair_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆผ", + "man_in_steamy_room": "๐Ÿง–โ€โ™‚", + "man_in_steamy_room_dark_skin_tone": "๐Ÿง–๐Ÿฟโ€โ™‚", + "man_in_steamy_room_light_skin_tone": "๐Ÿง–๐Ÿปโ€โ™‚", + "man_in_steamy_room_medium-dark_skin_tone": "๐Ÿง–๐Ÿพโ€โ™‚", + "man_in_steamy_room_medium-light_skin_tone": "๐Ÿง–๐Ÿผโ€โ™‚", + "man_in_steamy_room_medium_skin_tone": "๐Ÿง–๐Ÿฝโ€โ™‚", + "man_in_tuxedo": "๐Ÿคตโ€โ™‚", + "man_in_tuxedo_dark_skin_tone": "๐Ÿคต๐Ÿฟโ€โ™‚", + "man_in_tuxedo_light_skin_tone": "๐Ÿคต๐Ÿปโ€โ™‚", + "man_in_tuxedo_medium-dark_skin_tone": "๐Ÿคต๐Ÿพโ€โ™‚", + "man_in_tuxedo_medium-light_skin_tone": "๐Ÿคต๐Ÿผโ€โ™‚", + "man_in_tuxedo_medium_skin_tone": "๐Ÿคต๐Ÿฝโ€โ™‚", + "man_judge": "๐Ÿ‘จโ€โš–", + "man_judge_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€โš–", + "man_judge_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€โš–", + "man_judge_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€โš–", + "man_judge_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€โš–", + "man_judge_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€โš–", + "man_juggling": "๐Ÿคนโ€โ™‚", + "man_juggling_dark_skin_tone": "๐Ÿคน๐Ÿฟโ€โ™‚", + "man_juggling_light_skin_tone": "๐Ÿคน๐Ÿปโ€โ™‚", + "man_juggling_medium-dark_skin_tone": "๐Ÿคน๐Ÿพโ€โ™‚", + "man_juggling_medium-light_skin_tone": "๐Ÿคน๐Ÿผโ€โ™‚", + "man_juggling_medium_skin_tone": "๐Ÿคน๐Ÿฝโ€โ™‚", + "man_kneeling": "๐ŸงŽโ€โ™‚", + "man_kneeling_dark_skin_tone": "๐ŸงŽ๐Ÿฟโ€โ™‚", + "man_kneeling_light_skin_tone": "๐ŸงŽ๐Ÿปโ€โ™‚", + "man_kneeling_medium-dark_skin_tone": "๐ŸงŽ๐Ÿพโ€โ™‚", + "man_kneeling_medium-light_skin_tone": "๐ŸงŽ๐Ÿผโ€โ™‚", + "man_kneeling_medium_skin_tone": "๐ŸงŽ๐Ÿฝโ€โ™‚", + "man_lifting_weights": "๐Ÿ‹โ€โ™‚", + "man_lifting_weights_dark_skin_tone": "๐Ÿ‹๐Ÿฟโ€โ™‚", + "man_lifting_weights_light_skin_tone": "๐Ÿ‹๐Ÿปโ€โ™‚", + "man_lifting_weights_medium-dark_skin_tone": "๐Ÿ‹๐Ÿพโ€โ™‚", + "man_lifting_weights_medium-light_skin_tone": "๐Ÿ‹๐Ÿผโ€โ™‚", + "man_lifting_weights_medium_skin_tone": "๐Ÿ‹๐Ÿฝโ€โ™‚", + "man_light_skin_tone": "๐Ÿ‘จ๐Ÿป", + "man_light_skin_tone_bald": "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฒ", + "man_light_skin_tone_beard": "๐Ÿง”๐Ÿปโ€โ™‚", + "man_light_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿปโ€โ™‚", + "man_light_skin_tone_curly_hair": "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฑ", + "man_light_skin_tone_red_hair": "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฐ", + "man_light_skin_tone_white_hair": "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆณ", + "man_mage": "๐Ÿง™โ€โ™‚", + "man_mage_dark_skin_tone": "๐Ÿง™๐Ÿฟโ€โ™‚", + "man_mage_light_skin_tone": "๐Ÿง™๐Ÿปโ€โ™‚", + "man_mage_medium-dark_skin_tone": "๐Ÿง™๐Ÿพโ€โ™‚", + "man_mage_medium-light_skin_tone": "๐Ÿง™๐Ÿผโ€โ™‚", + "man_mage_medium_skin_tone": "๐Ÿง™๐Ÿฝโ€โ™‚", + "man_mechanic": "๐Ÿ‘จโ€๐Ÿ”ง", + "man_mechanic_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿ”ง", + "man_mechanic_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿ”ง", + "man_mechanic_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿ”ง", + "man_mechanic_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿ”ง", + "man_mechanic_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿ”ง", + "man_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพ", + "man_medium-dark_skin_tone_bald": "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฒ", + "man_medium-dark_skin_tone_beard": "๐Ÿง”๐Ÿพโ€โ™‚", + "man_medium-dark_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿพโ€โ™‚", + "man_medium-dark_skin_tone_curly_hair": "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฑ", + "man_medium-dark_skin_tone_red_hair": "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฐ", + "man_medium-dark_skin_tone_white_hair": "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆณ", + "man_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผ", + "man_medium-light_skin_tone_bald": "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฒ", + "man_medium-light_skin_tone_beard": "๐Ÿง”๐Ÿผโ€โ™‚", + "man_medium-light_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿผโ€โ™‚", + "man_medium-light_skin_tone_curly_hair": "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฑ", + "man_medium-light_skin_tone_red_hair": "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฐ", + "man_medium-light_skin_tone_white_hair": "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆณ", + "man_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝ", + "man_medium_skin_tone_bald": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฒ", + "man_medium_skin_tone_beard": "๐Ÿง”๐Ÿฝโ€โ™‚", + "man_medium_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿฝโ€โ™‚", + "man_medium_skin_tone_curly_hair": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฑ", + "man_medium_skin_tone_red_hair": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฐ", + "man_medium_skin_tone_white_hair": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆณ", + "man_mountain_biking": "๐Ÿšตโ€โ™‚", + "man_mountain_biking_dark_skin_tone": "๐Ÿšต๐Ÿฟโ€โ™‚", + "man_mountain_biking_light_skin_tone": "๐Ÿšต๐Ÿปโ€โ™‚", + "man_mountain_biking_medium-dark_skin_tone": "๐Ÿšต๐Ÿพโ€โ™‚", + "man_mountain_biking_medium-light_skin_tone": "๐Ÿšต๐Ÿผโ€โ™‚", + "man_mountain_biking_medium_skin_tone": "๐Ÿšต๐Ÿฝโ€โ™‚", + "man_office_worker": "๐Ÿ‘จโ€๐Ÿ’ผ", + "man_office_worker_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿ’ผ", + "man_office_worker_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ผ", + "man_office_worker_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿ’ผ", + "man_office_worker_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿ’ผ", + "man_office_worker_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ผ", + "man_pilot": "๐Ÿ‘จโ€โœˆ", + "man_pilot_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€โœˆ", + "man_pilot_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€โœˆ", + "man_pilot_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€โœˆ", + "man_pilot_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€โœˆ", + "man_pilot_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€โœˆ", + "man_playing_handball": "๐Ÿคพโ€โ™‚", + "man_playing_handball_dark_skin_tone": "๐Ÿคพ๐Ÿฟโ€โ™‚", + "man_playing_handball_light_skin_tone": "๐Ÿคพ๐Ÿปโ€โ™‚", + "man_playing_handball_medium-dark_skin_tone": "๐Ÿคพ๐Ÿพโ€โ™‚", + "man_playing_handball_medium-light_skin_tone": "๐Ÿคพ๐Ÿผโ€โ™‚", + "man_playing_handball_medium_skin_tone": "๐Ÿคพ๐Ÿฝโ€โ™‚", + "man_playing_water_polo": "๐Ÿคฝโ€โ™‚", + "man_playing_water_polo_dark_skin_tone": "๐Ÿคฝ๐Ÿฟโ€โ™‚", + "man_playing_water_polo_light_skin_tone": "๐Ÿคฝ๐Ÿปโ€โ™‚", + "man_playing_water_polo_medium-dark_skin_tone": "๐Ÿคฝ๐Ÿพโ€โ™‚", + "man_playing_water_polo_medium-light_skin_tone": "๐Ÿคฝ๐Ÿผโ€โ™‚", + "man_playing_water_polo_medium_skin_tone": "๐Ÿคฝ๐Ÿฝโ€โ™‚", + "man_police_officer": "๐Ÿ‘ฎโ€โ™‚", + "man_police_officer_dark_skin_tone": "๐Ÿ‘ฎ๐Ÿฟโ€โ™‚", + "man_police_officer_light_skin_tone": "๐Ÿ‘ฎ๐Ÿปโ€โ™‚", + "man_police_officer_medium-dark_skin_tone": "๐Ÿ‘ฎ๐Ÿพโ€โ™‚", + "man_police_officer_medium-light_skin_tone": "๐Ÿ‘ฎ๐Ÿผโ€โ™‚", + "man_police_officer_medium_skin_tone": "๐Ÿ‘ฎ๐Ÿฝโ€โ™‚", + "man_pouting": "๐Ÿ™Žโ€โ™‚", + "man_pouting_dark_skin_tone": "๐Ÿ™Ž๐Ÿฟโ€โ™‚", + "man_pouting_light_skin_tone": "๐Ÿ™Ž๐Ÿปโ€โ™‚", + "man_pouting_medium-dark_skin_tone": "๐Ÿ™Ž๐Ÿพโ€โ™‚", + "man_pouting_medium-light_skin_tone": "๐Ÿ™Ž๐Ÿผโ€โ™‚", + "man_pouting_medium_skin_tone": "๐Ÿ™Ž๐Ÿฝโ€โ™‚", + "man_raising_hand": "๐Ÿ™‹โ€โ™‚", + "man_raising_hand_dark_skin_tone": "๐Ÿ™‹๐Ÿฟโ€โ™‚", + "man_raising_hand_light_skin_tone": "๐Ÿ™‹๐Ÿปโ€โ™‚", + "man_raising_hand_medium-dark_skin_tone": "๐Ÿ™‹๐Ÿพโ€โ™‚", + "man_raising_hand_medium-light_skin_tone": "๐Ÿ™‹๐Ÿผโ€โ™‚", + "man_raising_hand_medium_skin_tone": "๐Ÿ™‹๐Ÿฝโ€โ™‚", + "man_red_hair": "๐Ÿ‘จโ€๐Ÿฆฐ", + "man_rowing_boat": "๐Ÿšฃโ€โ™‚", + "man_rowing_boat_dark_skin_tone": "๐Ÿšฃ๐Ÿฟโ€โ™‚", + "man_rowing_boat_light_skin_tone": "๐Ÿšฃ๐Ÿปโ€โ™‚", + "man_rowing_boat_medium-dark_skin_tone": "๐Ÿšฃ๐Ÿพโ€โ™‚", + "man_rowing_boat_medium-light_skin_tone": "๐Ÿšฃ๐Ÿผโ€โ™‚", + "man_rowing_boat_medium_skin_tone": "๐Ÿšฃ๐Ÿฝโ€โ™‚", + "man_running": "๐Ÿƒโ€โ™‚", + "man_running_dark_skin_tone": "๐Ÿƒ๐Ÿฟโ€โ™‚", + "man_running_light_skin_tone": "๐Ÿƒ๐Ÿปโ€โ™‚", + "man_running_medium-dark_skin_tone": "๐Ÿƒ๐Ÿพโ€โ™‚", + "man_running_medium-light_skin_tone": "๐Ÿƒ๐Ÿผโ€โ™‚", + "man_running_medium_skin_tone": "๐Ÿƒ๐Ÿฝโ€โ™‚", + "man_scientist": "๐Ÿ‘จโ€๐Ÿ”ฌ", + "man_scientist_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿ”ฌ", + "man_scientist_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿ”ฌ", + "man_scientist_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿ”ฌ", + "man_scientist_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿ”ฌ", + "man_scientist_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿ”ฌ", + "man_shrugging": "๐Ÿคทโ€โ™‚", + "man_shrugging_dark_skin_tone": "๐Ÿคท๐Ÿฟโ€โ™‚", + "man_shrugging_light_skin_tone": "๐Ÿคท๐Ÿปโ€โ™‚", + "man_shrugging_medium-dark_skin_tone": "๐Ÿคท๐Ÿพโ€โ™‚", + "man_shrugging_medium-light_skin_tone": "๐Ÿคท๐Ÿผโ€โ™‚", + "man_shrugging_medium_skin_tone": "๐Ÿคท๐Ÿฝโ€โ™‚", + "man_singer": "๐Ÿ‘จโ€๐ŸŽค", + "man_singer_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐ŸŽค", + "man_singer_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐ŸŽค", + "man_singer_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐ŸŽค", + "man_singer_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐ŸŽค", + "man_singer_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐ŸŽค", + "man_standing": "๐Ÿงโ€โ™‚", + "man_standing_dark_skin_tone": "๐Ÿง๐Ÿฟโ€โ™‚", + "man_standing_light_skin_tone": "๐Ÿง๐Ÿปโ€โ™‚", + "man_standing_medium-dark_skin_tone": "๐Ÿง๐Ÿพโ€โ™‚", + "man_standing_medium-light_skin_tone": "๐Ÿง๐Ÿผโ€โ™‚", + "man_standing_medium_skin_tone": "๐Ÿง๐Ÿฝโ€โ™‚", + "man_student": "๐Ÿ‘จโ€๐ŸŽ“", + "man_student_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐ŸŽ“", + "man_student_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐ŸŽ“", + "man_student_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐ŸŽ“", + "man_student_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐ŸŽ“", + "man_student_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐ŸŽ“", + "man_superhero": "๐Ÿฆธโ€โ™‚", + "man_superhero_dark_skin_tone": "๐Ÿฆธ๐Ÿฟโ€โ™‚", + "man_superhero_light_skin_tone": "๐Ÿฆธ๐Ÿปโ€โ™‚", + "man_superhero_medium-dark_skin_tone": "๐Ÿฆธ๐Ÿพโ€โ™‚", + "man_superhero_medium-light_skin_tone": "๐Ÿฆธ๐Ÿผโ€โ™‚", + "man_superhero_medium_skin_tone": "๐Ÿฆธ๐Ÿฝโ€โ™‚", + "man_supervillain": "๐Ÿฆนโ€โ™‚", + "man_supervillain_dark_skin_tone": "๐Ÿฆน๐Ÿฟโ€โ™‚", + "man_supervillain_light_skin_tone": "๐Ÿฆน๐Ÿปโ€โ™‚", + "man_supervillain_medium-dark_skin_tone": "๐Ÿฆน๐Ÿพโ€โ™‚", + "man_supervillain_medium-light_skin_tone": "๐Ÿฆน๐Ÿผโ€โ™‚", + "man_supervillain_medium_skin_tone": "๐Ÿฆน๐Ÿฝโ€โ™‚", + "man_surfing": "๐Ÿ„โ€โ™‚", + "man_surfing_dark_skin_tone": "๐Ÿ„๐Ÿฟโ€โ™‚", + "man_surfing_light_skin_tone": "๐Ÿ„๐Ÿปโ€โ™‚", + "man_surfing_medium-dark_skin_tone": "๐Ÿ„๐Ÿพโ€โ™‚", + "man_surfing_medium-light_skin_tone": "๐Ÿ„๐Ÿผโ€โ™‚", + "man_surfing_medium_skin_tone": "๐Ÿ„๐Ÿฝโ€โ™‚", + "man_swimming": "๐ŸŠโ€โ™‚", + "man_swimming_dark_skin_tone": "๐ŸŠ๐Ÿฟโ€โ™‚", + "man_swimming_light_skin_tone": "๐ŸŠ๐Ÿปโ€โ™‚", + "man_swimming_medium-dark_skin_tone": "๐ŸŠ๐Ÿพโ€โ™‚", + "man_swimming_medium-light_skin_tone": "๐ŸŠ๐Ÿผโ€โ™‚", + "man_swimming_medium_skin_tone": "๐ŸŠ๐Ÿฝโ€โ™‚", + "man_teacher": "๐Ÿ‘จโ€๐Ÿซ", + "man_teacher_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿซ", + "man_teacher_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿซ", + "man_teacher_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿซ", + "man_teacher_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿซ", + "man_teacher_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿซ", + "man_technologist": "๐Ÿ‘จโ€๐Ÿ’ป", + "man_technologist_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿ’ป", + "man_technologist_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿ’ป", + "man_technologist_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿ’ป", + "man_technologist_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿ’ป", + "man_technologist_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿ’ป", + "man_tipping_hand": "๐Ÿ’โ€โ™‚", + "man_tipping_hand_dark_skin_tone": "๐Ÿ’๐Ÿฟโ€โ™‚", + "man_tipping_hand_light_skin_tone": "๐Ÿ’๐Ÿปโ€โ™‚", + "man_tipping_hand_medium-dark_skin_tone": "๐Ÿ’๐Ÿพโ€โ™‚", + "man_tipping_hand_medium-light_skin_tone": "๐Ÿ’๐Ÿผโ€โ™‚", + "man_tipping_hand_medium_skin_tone": "๐Ÿ’๐Ÿฝโ€โ™‚", + "man_vampire": "๐Ÿง›โ€โ™‚", + "man_vampire_dark_skin_tone": "๐Ÿง›๐Ÿฟโ€โ™‚", + "man_vampire_light_skin_tone": "๐Ÿง›๐Ÿปโ€โ™‚", + "man_vampire_medium-dark_skin_tone": "๐Ÿง›๐Ÿพโ€โ™‚", + "man_vampire_medium-light_skin_tone": "๐Ÿง›๐Ÿผโ€โ™‚", + "man_vampire_medium_skin_tone": "๐Ÿง›๐Ÿฝโ€โ™‚", + "man_walking": "๐Ÿšถโ€โ™‚", + "man_walking_dark_skin_tone": "๐Ÿšถ๐Ÿฟโ€โ™‚", + "man_walking_light_skin_tone": "๐Ÿšถ๐Ÿปโ€โ™‚", + "man_walking_medium-dark_skin_tone": "๐Ÿšถ๐Ÿพโ€โ™‚", + "man_walking_medium-light_skin_tone": "๐Ÿšถ๐Ÿผโ€โ™‚", + "man_walking_medium_skin_tone": "๐Ÿšถ๐Ÿฝโ€โ™‚", + "man_wearing_turban": "๐Ÿ‘ณโ€โ™‚", + "man_wearing_turban_dark_skin_tone": "๐Ÿ‘ณ๐Ÿฟโ€โ™‚", + "man_wearing_turban_light_skin_tone": "๐Ÿ‘ณ๐Ÿปโ€โ™‚", + "man_wearing_turban_medium-dark_skin_tone": "๐Ÿ‘ณ๐Ÿพโ€โ™‚", + "man_wearing_turban_medium-light_skin_tone": "๐Ÿ‘ณ๐Ÿผโ€โ™‚", + "man_wearing_turban_medium_skin_tone": "๐Ÿ‘ณ๐Ÿฝโ€โ™‚", + "man_white_hair": "๐Ÿ‘จโ€๐Ÿฆณ", + "man_with_veil": "๐Ÿ‘ฐโ€โ™‚", + "man_with_veil_dark_skin_tone": "๐Ÿ‘ฐ๐Ÿฟโ€โ™‚", + "man_with_veil_light_skin_tone": "๐Ÿ‘ฐ๐Ÿปโ€โ™‚", + "man_with_veil_medium-dark_skin_tone": "๐Ÿ‘ฐ๐Ÿพโ€โ™‚", + "man_with_veil_medium-light_skin_tone": "๐Ÿ‘ฐ๐Ÿผโ€โ™‚", + "man_with_veil_medium_skin_tone": "๐Ÿ‘ฐ๐Ÿฝโ€โ™‚", + "man_with_white_cane": "๐Ÿ‘จโ€๐Ÿฆฏ", + "man_with_white_cane_dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿฆฏ", + "man_with_white_cane_light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿฆฏ", + "man_with_white_cane_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿฆฏ", + "man_with_white_cane_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿฆฏ", + "man_with_white_cane_medium_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿฆฏ", + "man_zombie": "๐ŸงŸโ€โ™‚", + "mango": "๐Ÿฅญ", + "mantelpiece_clock": "๐Ÿ•ฐ", + "manual_wheelchair": "๐Ÿฆฝ", + "manโ€™s_shoe": "๐Ÿ‘ž", + "map_of_Japan": "๐Ÿ—พ", + "maple_leaf": "๐Ÿ", + "maracas": "๐Ÿช‡", + "martial_arts_uniform": "๐Ÿฅ‹", + "mate": "๐Ÿง‰", + "meat_on_bone": "๐Ÿ–", + "mechanic": "๐Ÿง‘โ€๐Ÿ”ง", + "mechanic_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿ”ง", + "mechanic_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿ”ง", + "mechanic_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿ”ง", + "mechanic_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿ”ง", + "mechanic_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿ”ง", + "mechanical_arm": "๐Ÿฆพ", + "mechanical_leg": "๐Ÿฆฟ", + "medical_symbol": "โš•", + "medium-dark_skin_tone": "๐Ÿพ", + "medium-light_skin_tone": "๐Ÿผ", + "medium_skin_tone": "๐Ÿฝ", + "megaphone": "๐Ÿ“ฃ", + "melon": "๐Ÿˆ", + "melting_face": "๐Ÿซ ", + "memo": "๐Ÿ“", + "men_holding_hands": "๐Ÿ‘ฌ", + "men_holding_hands_dark_skin_tone": "๐Ÿ‘ฌ๐Ÿฟ", + "men_holding_hands_dark_skin_tone_light_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", + "men_holding_hands_dark_skin_tone_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", + "men_holding_hands_dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", + "men_holding_hands_dark_skin_tone_medium_skin_tone": "๐Ÿ‘จ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", + "men_holding_hands_light_skin_tone": "๐Ÿ‘ฌ๐Ÿป", + "men_holding_hands_light_skin_tone_dark_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", + "men_holding_hands_light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", + "men_holding_hands_light_skin_tone_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", + "men_holding_hands_light_skin_tone_medium_skin_tone": "๐Ÿ‘จ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", + "men_holding_hands_medium-dark_skin_tone": "๐Ÿ‘ฌ๐Ÿพ", + "men_holding_hands_medium-dark_skin_tone_dark_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", + "men_holding_hands_medium-dark_skin_tone_light_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", + "men_holding_hands_medium-dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", + "men_holding_hands_medium-dark_skin_tone_medium_skin_tone": "๐Ÿ‘จ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", + "men_holding_hands_medium-light_skin_tone": "๐Ÿ‘ฌ๐Ÿผ", + "men_holding_hands_medium-light_skin_tone_dark_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", + "men_holding_hands_medium-light_skin_tone_light_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", + "men_holding_hands_medium-light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", + "men_holding_hands_medium-light_skin_tone_medium_skin_tone": "๐Ÿ‘จ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", + "men_holding_hands_medium_skin_tone": "๐Ÿ‘ฌ๐Ÿฝ", + "men_holding_hands_medium_skin_tone_dark_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", + "men_holding_hands_medium_skin_tone_light_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", + "men_holding_hands_medium_skin_tone_medium-dark_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", + "men_holding_hands_medium_skin_tone_medium-light_skin_tone": "๐Ÿ‘จ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", + "men_with_bunny_ears": "๐Ÿ‘ฏโ€โ™‚", + "men_wrestling": "๐Ÿคผโ€โ™‚", + "mending_heart": "โคโ€๐Ÿฉน", + "menorah": "๐Ÿ•Ž", + "menโ€™s_room": "๐Ÿšน", + "mermaid": "๐Ÿงœโ€โ™€", + "mermaid_dark_skin_tone": "๐Ÿงœ๐Ÿฟโ€โ™€", + "mermaid_light_skin_tone": "๐Ÿงœ๐Ÿปโ€โ™€", + "mermaid_medium-dark_skin_tone": "๐Ÿงœ๐Ÿพโ€โ™€", + "mermaid_medium-light_skin_tone": "๐Ÿงœ๐Ÿผโ€โ™€", + "mermaid_medium_skin_tone": "๐Ÿงœ๐Ÿฝโ€โ™€", + "merman": "๐Ÿงœโ€โ™‚", + "merman_dark_skin_tone": "๐Ÿงœ๐Ÿฟโ€โ™‚", + "merman_light_skin_tone": "๐Ÿงœ๐Ÿปโ€โ™‚", + "merman_medium-dark_skin_tone": "๐Ÿงœ๐Ÿพโ€โ™‚", + "merman_medium-light_skin_tone": "๐Ÿงœ๐Ÿผโ€โ™‚", + "merman_medium_skin_tone": "๐Ÿงœ๐Ÿฝโ€โ™‚", + "merperson": "๐Ÿงœ", + "merperson_dark_skin_tone": "๐Ÿงœ๐Ÿฟ", + "merperson_light_skin_tone": "๐Ÿงœ๐Ÿป", + "merperson_medium-dark_skin_tone": "๐Ÿงœ๐Ÿพ", + "merperson_medium-light_skin_tone": "๐Ÿงœ๐Ÿผ", + "merperson_medium_skin_tone": "๐Ÿงœ๐Ÿฝ", + "metro": "๐Ÿš‡", + "microbe": "๐Ÿฆ ", + "microphone": "๐ŸŽค", + "microscope": "๐Ÿ”ฌ", + "middle_finger": "๐Ÿ–•", + "middle_finger_dark_skin_tone": "๐Ÿ–•๐Ÿฟ", + "middle_finger_light_skin_tone": "๐Ÿ–•๐Ÿป", + "middle_finger_medium-dark_skin_tone": "๐Ÿ–•๐Ÿพ", + "middle_finger_medium-light_skin_tone": "๐Ÿ–•๐Ÿผ", + "middle_finger_medium_skin_tone": "๐Ÿ–•๐Ÿฝ", + "military_helmet": "๐Ÿช–", + "military_medal": "๐ŸŽ–", + "milky_way": "๐ŸŒŒ", + "minibus": "๐Ÿš", + "minus": "โž–", + "mirror": "๐Ÿชž", + "mirror_ball": "๐Ÿชฉ", + "moai": "๐Ÿ—ฟ", + "mobile_phone": "๐Ÿ“ฑ", + "mobile_phone_off": "๐Ÿ“ด", + "mobile_phone_with_arrow": "๐Ÿ“ฒ", + "money-mouth_face": "๐Ÿค‘", + "money_bag": "๐Ÿ’ฐ", + "money_with_wings": "๐Ÿ’ธ", + "monkey": "๐Ÿ’", + "monkey_face": "๐Ÿต", + "monorail": "๐Ÿš", + "moon_cake": "๐Ÿฅฎ", + "moon_viewing_ceremony": "๐ŸŽ‘", + "moose": "๐ŸซŽ", + "mosque": "๐Ÿ•Œ", + "mosquito": "๐ŸฆŸ", + "motor_boat": "๐Ÿ›ฅ", + "motor_scooter": "๐Ÿ›ต", + "motorcycle": "๐Ÿ", + "motorized_wheelchair": "๐Ÿฆผ", + "motorway": "๐Ÿ›ฃ", + "mount_fuji": "๐Ÿ—ป", + "mountain": "โ›ฐ", + "mountain_cableway": "๐Ÿš ", + "mountain_railway": "๐Ÿšž", + "mouse": "๐Ÿ", + "mouse_face": "๐Ÿญ", + "mouse_trap": "๐Ÿชค", + "mouth": "๐Ÿ‘„", + "movie_camera": "๐ŸŽฅ", + "multiply": "โœ–", + "mushroom": "๐Ÿ„", + "musical_keyboard": "๐ŸŽน", + "musical_note": "๐ŸŽต", + "musical_notes": "๐ŸŽถ", + "musical_score": "๐ŸŽผ", + "muted_speaker": "๐Ÿ”‡", + "mx_claus": "๐Ÿง‘โ€๐ŸŽ„", + "mx_claus_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐ŸŽ„", + "mx_claus_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐ŸŽ„", + "mx_claus_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐ŸŽ„", + "mx_claus_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐ŸŽ„", + "mx_claus_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐ŸŽ„", + "nail_polish": "๐Ÿ’…", + "nail_polish_dark_skin_tone": "๐Ÿ’…๐Ÿฟ", + "nail_polish_light_skin_tone": "๐Ÿ’…๐Ÿป", + "nail_polish_medium-dark_skin_tone": "๐Ÿ’…๐Ÿพ", + "nail_polish_medium-light_skin_tone": "๐Ÿ’…๐Ÿผ", + "nail_polish_medium_skin_tone": "๐Ÿ’…๐Ÿฝ", + "name_badge": "๐Ÿ“›", + "national_park": "๐Ÿž", + "nauseated_face": "๐Ÿคข", + "nazar_amulet": "๐Ÿงฟ", + "necktie": "๐Ÿ‘”", + "nerd_face": "๐Ÿค“", + "nest_with_eggs": "๐Ÿชบ", + "nesting_dolls": "๐Ÿช†", + "neutral_face": "๐Ÿ˜", + "new_moon": "๐ŸŒ‘", + "new_moon_face": "๐ŸŒš", + "newspaper": "๐Ÿ“ฐ", + "next_track_button": "โญ", + "night_with_stars": "๐ŸŒƒ", + "nine-thirty": "๐Ÿ•ค", + "nine_oโ€™clock": "๐Ÿ•˜", + "ninja": "๐Ÿฅท", + "ninja_dark_skin_tone": "๐Ÿฅท๐Ÿฟ", + "ninja_light_skin_tone": "๐Ÿฅท๐Ÿป", + "ninja_medium-dark_skin_tone": "๐Ÿฅท๐Ÿพ", + "ninja_medium-light_skin_tone": "๐Ÿฅท๐Ÿผ", + "ninja_medium_skin_tone": "๐Ÿฅท๐Ÿฝ", + "no_bicycles": "๐Ÿšณ", + "no_entry": "โ›”", + "no_littering": "๐Ÿšฏ", + "no_mobile_phones": "๐Ÿ“ต", + "no_one_under_eighteen": "๐Ÿ”ž", + "no_pedestrians": "๐Ÿšท", + "no_smoking": "๐Ÿšญ", + "non-potable_water": "๐Ÿšฑ", + "nose": "๐Ÿ‘ƒ", + "nose_dark_skin_tone": "๐Ÿ‘ƒ๐Ÿฟ", + "nose_light_skin_tone": "๐Ÿ‘ƒ๐Ÿป", + "nose_medium-dark_skin_tone": "๐Ÿ‘ƒ๐Ÿพ", + "nose_medium-light_skin_tone": "๐Ÿ‘ƒ๐Ÿผ", + "nose_medium_skin_tone": "๐Ÿ‘ƒ๐Ÿฝ", + "notebook": "๐Ÿ““", + "notebook_with_decorative_cover": "๐Ÿ“”", + "nut_and_bolt": "๐Ÿ”ฉ", + "octopus": "๐Ÿ™", + "oden": "๐Ÿข", + "office_building": "๐Ÿข", + "office_worker": "๐Ÿง‘โ€๐Ÿ’ผ", + "office_worker_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿ’ผ", + "office_worker_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿ’ผ", + "office_worker_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿ’ผ", + "office_worker_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿ’ผ", + "office_worker_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿ’ผ", + "ogre": "๐Ÿ‘น", + "oil_drum": "๐Ÿ›ข", + "old_key": "๐Ÿ—", + "old_man": "๐Ÿ‘ด", + "old_man_dark_skin_tone": "๐Ÿ‘ด๐Ÿฟ", + "old_man_light_skin_tone": "๐Ÿ‘ด๐Ÿป", + "old_man_medium-dark_skin_tone": "๐Ÿ‘ด๐Ÿพ", + "old_man_medium-light_skin_tone": "๐Ÿ‘ด๐Ÿผ", + "old_man_medium_skin_tone": "๐Ÿ‘ด๐Ÿฝ", + "old_woman": "๐Ÿ‘ต", + "old_woman_dark_skin_tone": "๐Ÿ‘ต๐Ÿฟ", + "old_woman_light_skin_tone": "๐Ÿ‘ต๐Ÿป", + "old_woman_medium-dark_skin_tone": "๐Ÿ‘ต๐Ÿพ", + "old_woman_medium-light_skin_tone": "๐Ÿ‘ต๐Ÿผ", + "old_woman_medium_skin_tone": "๐Ÿ‘ต๐Ÿฝ", + "older_person": "๐Ÿง“", + "older_person_dark_skin_tone": "๐Ÿง“๐Ÿฟ", + "older_person_light_skin_tone": "๐Ÿง“๐Ÿป", + "older_person_medium-dark_skin_tone": "๐Ÿง“๐Ÿพ", + "older_person_medium-light_skin_tone": "๐Ÿง“๐Ÿผ", + "older_person_medium_skin_tone": "๐Ÿง“๐Ÿฝ", + "olive": "๐Ÿซ’", + "om": "๐Ÿ•‰", + "oncoming_automobile": "๐Ÿš˜", + "oncoming_bus": "๐Ÿš", + "oncoming_fist": "๐Ÿ‘Š", + "oncoming_fist_dark_skin_tone": "๐Ÿ‘Š๐Ÿฟ", + "oncoming_fist_light_skin_tone": "๐Ÿ‘Š๐Ÿป", + "oncoming_fist_medium-dark_skin_tone": "๐Ÿ‘Š๐Ÿพ", + "oncoming_fist_medium-light_skin_tone": "๐Ÿ‘Š๐Ÿผ", + "oncoming_fist_medium_skin_tone": "๐Ÿ‘Š๐Ÿฝ", + "oncoming_police_car": "๐Ÿš”", + "oncoming_taxi": "๐Ÿš–", + "one-piece_swimsuit": "๐Ÿฉฑ", + "one-thirty": "๐Ÿ•œ", + "one_oโ€™clock": "๐Ÿ•", + "onion": "๐Ÿง…", + "open_book": "๐Ÿ“–", + "open_file_folder": "๐Ÿ“‚", + "open_hands": "๐Ÿ‘", + "open_hands_dark_skin_tone": "๐Ÿ‘๐Ÿฟ", + "open_hands_light_skin_tone": "๐Ÿ‘๐Ÿป", + "open_hands_medium-dark_skin_tone": "๐Ÿ‘๐Ÿพ", + "open_hands_medium-light_skin_tone": "๐Ÿ‘๐Ÿผ", + "open_hands_medium_skin_tone": "๐Ÿ‘๐Ÿฝ", + "open_mailbox_with_lowered_flag": "๐Ÿ“ญ", + "open_mailbox_with_raised_flag": "๐Ÿ“ฌ", + "optical_disk": "๐Ÿ’ฟ", + "orange_book": "๐Ÿ“™", + "orange_circle": "๐ŸŸ ", + "orange_heart": "๐Ÿงก", + "orange_square": "๐ŸŸง", + "orangutan": "๐Ÿฆง", + "orthodox_cross": "โ˜ฆ", + "otter": "๐Ÿฆฆ", + "outbox_tray": "๐Ÿ“ค", + "owl": "๐Ÿฆ‰", + "ox": "๐Ÿ‚", + "oyster": "๐Ÿฆช", + "package": "๐Ÿ“ฆ", + "page_facing_up": "๐Ÿ“„", + "page_with_curl": "๐Ÿ“ƒ", + "pager": "๐Ÿ“Ÿ", + "paintbrush": "๐Ÿ–Œ", + "palm_down_hand": "๐Ÿซณ", + "palm_down_hand_dark_skin_tone": "๐Ÿซณ๐Ÿฟ", + "palm_down_hand_light_skin_tone": "๐Ÿซณ๐Ÿป", + "palm_down_hand_medium-dark_skin_tone": "๐Ÿซณ๐Ÿพ", + "palm_down_hand_medium-light_skin_tone": "๐Ÿซณ๐Ÿผ", + "palm_down_hand_medium_skin_tone": "๐Ÿซณ๐Ÿฝ", + "palm_tree": "๐ŸŒด", + "palm_up_hand": "๐Ÿซด", + "palm_up_hand_dark_skin_tone": "๐Ÿซด๐Ÿฟ", + "palm_up_hand_light_skin_tone": "๐Ÿซด๐Ÿป", + "palm_up_hand_medium-dark_skin_tone": "๐Ÿซด๐Ÿพ", + "palm_up_hand_medium-light_skin_tone": "๐Ÿซด๐Ÿผ", + "palm_up_hand_medium_skin_tone": "๐Ÿซด๐Ÿฝ", + "palms_up_together": "๐Ÿคฒ", + "palms_up_together_dark_skin_tone": "๐Ÿคฒ๐Ÿฟ", + "palms_up_together_light_skin_tone": "๐Ÿคฒ๐Ÿป", + "palms_up_together_medium-dark_skin_tone": "๐Ÿคฒ๐Ÿพ", + "palms_up_together_medium-light_skin_tone": "๐Ÿคฒ๐Ÿผ", + "palms_up_together_medium_skin_tone": "๐Ÿคฒ๐Ÿฝ", + "pancakes": "๐Ÿฅž", + "panda": "๐Ÿผ", + "paperclip": "๐Ÿ“Ž", + "parachute": "๐Ÿช‚", + "parrot": "๐Ÿฆœ", + "part_alternation_mark": "ใ€ฝ", + "party_popper": "๐ŸŽ‰", + "partying_face": "๐Ÿฅณ", + "passenger_ship": "๐Ÿ›ณ", + "passport_control": "๐Ÿ›‚", + "pause_button": "โธ", + "paw_prints": "๐Ÿพ", + "pea_pod": "๐Ÿซ›", + "peace_symbol": "โ˜ฎ", + "peach": "๐Ÿ‘", + "peacock": "๐Ÿฆš", + "peanuts": "๐Ÿฅœ", + "pear": "๐Ÿ", + "pen": "๐Ÿ–Š", + "pencil": "โœ", + "penguin": "๐Ÿง", + "pensive_face": "๐Ÿ˜”", + "people_holding_hands": "๐Ÿง‘โ€๐Ÿคโ€๐Ÿง‘", + "people_holding_hands_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ", + "people_holding_hands_dark_skin_tone_light_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿป", + "people_holding_hands_dark_skin_tone_medium-dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ", + "people_holding_hands_dark_skin_tone_medium-light_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ", + "people_holding_hands_dark_skin_tone_medium_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ", + "people_holding_hands_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿป", + "people_holding_hands_light_skin_tone_dark_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ", + "people_holding_hands_light_skin_tone_medium-dark_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ", + "people_holding_hands_light_skin_tone_medium-light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ", + "people_holding_hands_light_skin_tone_medium_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ", + "people_holding_hands_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ", + "people_holding_hands_medium-dark_skin_tone_dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ", + "people_holding_hands_medium-dark_skin_tone_light_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿป", + "people_holding_hands_medium-dark_skin_tone_medium-light_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ", + "people_holding_hands_medium-dark_skin_tone_medium_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ", + "people_holding_hands_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ", + "people_holding_hands_medium-light_skin_tone_dark_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ", + "people_holding_hands_medium-light_skin_tone_light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿป", + "people_holding_hands_medium-light_skin_tone_medium-dark_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ", + "people_holding_hands_medium-light_skin_tone_medium_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ", + "people_holding_hands_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿฝ", + "people_holding_hands_medium_skin_tone_dark_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿฟ", + "people_holding_hands_medium_skin_tone_light_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿป", + "people_holding_hands_medium_skin_tone_medium-dark_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿพ", + "people_holding_hands_medium_skin_tone_medium-light_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿคโ€๐Ÿง‘๐Ÿผ", + "people_hugging": "๐Ÿซ‚", + "people_with_bunny_ears": "๐Ÿ‘ฏ", + "people_wrestling": "๐Ÿคผ", + "performing_arts": "๐ŸŽญ", + "persevering_face": "๐Ÿ˜ฃ", + "person": "๐Ÿง‘", + "person_bald": "๐Ÿง‘โ€๐Ÿฆฒ", + "person_beard": "๐Ÿง”", + "person_biking": "๐Ÿšด", + "person_biking_dark_skin_tone": "๐Ÿšด๐Ÿฟ", + "person_biking_light_skin_tone": "๐Ÿšด๐Ÿป", + "person_biking_medium-dark_skin_tone": "๐Ÿšด๐Ÿพ", + "person_biking_medium-light_skin_tone": "๐Ÿšด๐Ÿผ", + "person_biking_medium_skin_tone": "๐Ÿšด๐Ÿฝ", + "person_blond_hair": "๐Ÿ‘ฑ", + "person_bouncing_ball": "โ›น", + "person_bouncing_ball_dark_skin_tone": "โ›น๐Ÿฟ", + "person_bouncing_ball_light_skin_tone": "โ›น๐Ÿป", + "person_bouncing_ball_medium-dark_skin_tone": "โ›น๐Ÿพ", + "person_bouncing_ball_medium-light_skin_tone": "โ›น๐Ÿผ", + "person_bouncing_ball_medium_skin_tone": "โ›น๐Ÿฝ", + "person_bowing": "๐Ÿ™‡", + "person_bowing_dark_skin_tone": "๐Ÿ™‡๐Ÿฟ", + "person_bowing_light_skin_tone": "๐Ÿ™‡๐Ÿป", + "person_bowing_medium-dark_skin_tone": "๐Ÿ™‡๐Ÿพ", + "person_bowing_medium-light_skin_tone": "๐Ÿ™‡๐Ÿผ", + "person_bowing_medium_skin_tone": "๐Ÿ™‡๐Ÿฝ", + "person_cartwheeling": "๐Ÿคธ", + "person_cartwheeling_dark_skin_tone": "๐Ÿคธ๐Ÿฟ", + "person_cartwheeling_light_skin_tone": "๐Ÿคธ๐Ÿป", + "person_cartwheeling_medium-dark_skin_tone": "๐Ÿคธ๐Ÿพ", + "person_cartwheeling_medium-light_skin_tone": "๐Ÿคธ๐Ÿผ", + "person_cartwheeling_medium_skin_tone": "๐Ÿคธ๐Ÿฝ", + "person_climbing": "๐Ÿง—", + "person_climbing_dark_skin_tone": "๐Ÿง—๐Ÿฟ", + "person_climbing_light_skin_tone": "๐Ÿง—๐Ÿป", + "person_climbing_medium-dark_skin_tone": "๐Ÿง—๐Ÿพ", + "person_climbing_medium-light_skin_tone": "๐Ÿง—๐Ÿผ", + "person_climbing_medium_skin_tone": "๐Ÿง—๐Ÿฝ", + "person_curly_hair": "๐Ÿง‘โ€๐Ÿฆฑ", + "person_dark_skin_tone": "๐Ÿง‘๐Ÿฟ", + "person_dark_skin_tone_bald": "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฒ", + "person_dark_skin_tone_beard": "๐Ÿง”๐Ÿฟ", + "person_dark_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿฟ", + "person_dark_skin_tone_curly_hair": "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฑ", + "person_dark_skin_tone_red_hair": "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฐ", + "person_dark_skin_tone_white_hair": "๐Ÿง‘๐Ÿฟโ€๐Ÿฆณ", + "person_facepalming": "๐Ÿคฆ", + "person_facepalming_dark_skin_tone": "๐Ÿคฆ๐Ÿฟ", + "person_facepalming_light_skin_tone": "๐Ÿคฆ๐Ÿป", + "person_facepalming_medium-dark_skin_tone": "๐Ÿคฆ๐Ÿพ", + "person_facepalming_medium-light_skin_tone": "๐Ÿคฆ๐Ÿผ", + "person_facepalming_medium_skin_tone": "๐Ÿคฆ๐Ÿฝ", + "person_feeding_baby": "๐Ÿง‘โ€๐Ÿผ", + "person_feeding_baby_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿผ", + "person_feeding_baby_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿผ", + "person_feeding_baby_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿผ", + "person_feeding_baby_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿผ", + "person_feeding_baby_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿผ", + "person_fencing": "๐Ÿคบ", + "person_frowning": "๐Ÿ™", + "person_frowning_dark_skin_tone": "๐Ÿ™๐Ÿฟ", + "person_frowning_light_skin_tone": "๐Ÿ™๐Ÿป", + "person_frowning_medium-dark_skin_tone": "๐Ÿ™๐Ÿพ", + "person_frowning_medium-light_skin_tone": "๐Ÿ™๐Ÿผ", + "person_frowning_medium_skin_tone": "๐Ÿ™๐Ÿฝ", + "person_gesturing_NO": "๐Ÿ™…", + "person_gesturing_NO_dark_skin_tone": "๐Ÿ™…๐Ÿฟ", + "person_gesturing_NO_light_skin_tone": "๐Ÿ™…๐Ÿป", + "person_gesturing_NO_medium-dark_skin_tone": "๐Ÿ™…๐Ÿพ", + "person_gesturing_NO_medium-light_skin_tone": "๐Ÿ™…๐Ÿผ", + "person_gesturing_NO_medium_skin_tone": "๐Ÿ™…๐Ÿฝ", + "person_gesturing_OK": "๐Ÿ™†", + "person_gesturing_OK_dark_skin_tone": "๐Ÿ™†๐Ÿฟ", + "person_gesturing_OK_light_skin_tone": "๐Ÿ™†๐Ÿป", + "person_gesturing_OK_medium-dark_skin_tone": "๐Ÿ™†๐Ÿพ", + "person_gesturing_OK_medium-light_skin_tone": "๐Ÿ™†๐Ÿผ", + "person_gesturing_OK_medium_skin_tone": "๐Ÿ™†๐Ÿฝ", + "person_getting_haircut": "๐Ÿ’‡", + "person_getting_haircut_dark_skin_tone": "๐Ÿ’‡๐Ÿฟ", + "person_getting_haircut_light_skin_tone": "๐Ÿ’‡๐Ÿป", + "person_getting_haircut_medium-dark_skin_tone": "๐Ÿ’‡๐Ÿพ", + "person_getting_haircut_medium-light_skin_tone": "๐Ÿ’‡๐Ÿผ", + "person_getting_haircut_medium_skin_tone": "๐Ÿ’‡๐Ÿฝ", + "person_getting_massage": "๐Ÿ’†", + "person_getting_massage_dark_skin_tone": "๐Ÿ’†๐Ÿฟ", + "person_getting_massage_light_skin_tone": "๐Ÿ’†๐Ÿป", + "person_getting_massage_medium-dark_skin_tone": "๐Ÿ’†๐Ÿพ", + "person_getting_massage_medium-light_skin_tone": "๐Ÿ’†๐Ÿผ", + "person_getting_massage_medium_skin_tone": "๐Ÿ’†๐Ÿฝ", + "person_golfing": "๐ŸŒ", + "person_golfing_dark_skin_tone": "๐ŸŒ๐Ÿฟ", + "person_golfing_light_skin_tone": "๐ŸŒ๐Ÿป", + "person_golfing_medium-dark_skin_tone": "๐ŸŒ๐Ÿพ", + "person_golfing_medium-light_skin_tone": "๐ŸŒ๐Ÿผ", + "person_golfing_medium_skin_tone": "๐ŸŒ๐Ÿฝ", + "person_in_bed": "๐Ÿ›Œ", + "person_in_bed_dark_skin_tone": "๐Ÿ›Œ๐Ÿฟ", + "person_in_bed_light_skin_tone": "๐Ÿ›Œ๐Ÿป", + "person_in_bed_medium-dark_skin_tone": "๐Ÿ›Œ๐Ÿพ", + "person_in_bed_medium-light_skin_tone": "๐Ÿ›Œ๐Ÿผ", + "person_in_bed_medium_skin_tone": "๐Ÿ›Œ๐Ÿฝ", + "person_in_lotus_position": "๐Ÿง˜", + "person_in_lotus_position_dark_skin_tone": "๐Ÿง˜๐Ÿฟ", + "person_in_lotus_position_light_skin_tone": "๐Ÿง˜๐Ÿป", + "person_in_lotus_position_medium-dark_skin_tone": "๐Ÿง˜๐Ÿพ", + "person_in_lotus_position_medium-light_skin_tone": "๐Ÿง˜๐Ÿผ", + "person_in_lotus_position_medium_skin_tone": "๐Ÿง˜๐Ÿฝ", + "person_in_manual_wheelchair": "๐Ÿง‘โ€๐Ÿฆฝ", + "person_in_manual_wheelchair_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฝ", + "person_in_manual_wheelchair_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿฆฝ", + "person_in_manual_wheelchair_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿฆฝ", + "person_in_manual_wheelchair_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿฆฝ", + "person_in_manual_wheelchair_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฝ", + "person_in_motorized_wheelchair": "๐Ÿง‘โ€๐Ÿฆผ", + "person_in_motorized_wheelchair_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿฆผ", + "person_in_motorized_wheelchair_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿฆผ", + "person_in_motorized_wheelchair_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿฆผ", + "person_in_motorized_wheelchair_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿฆผ", + "person_in_motorized_wheelchair_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿฆผ", + "person_in_steamy_room": "๐Ÿง–", + "person_in_steamy_room_dark_skin_tone": "๐Ÿง–๐Ÿฟ", + "person_in_steamy_room_light_skin_tone": "๐Ÿง–๐Ÿป", + "person_in_steamy_room_medium-dark_skin_tone": "๐Ÿง–๐Ÿพ", + "person_in_steamy_room_medium-light_skin_tone": "๐Ÿง–๐Ÿผ", + "person_in_steamy_room_medium_skin_tone": "๐Ÿง–๐Ÿฝ", + "person_in_suit_levitating": "๐Ÿ•ด", + "person_in_suit_levitating_dark_skin_tone": "๐Ÿ•ด๐Ÿฟ", + "person_in_suit_levitating_light_skin_tone": "๐Ÿ•ด๐Ÿป", + "person_in_suit_levitating_medium-dark_skin_tone": "๐Ÿ•ด๐Ÿพ", + "person_in_suit_levitating_medium-light_skin_tone": "๐Ÿ•ด๐Ÿผ", + "person_in_suit_levitating_medium_skin_tone": "๐Ÿ•ด๐Ÿฝ", + "person_in_tuxedo": "๐Ÿคต", + "person_in_tuxedo_dark_skin_tone": "๐Ÿคต๐Ÿฟ", + "person_in_tuxedo_light_skin_tone": "๐Ÿคต๐Ÿป", + "person_in_tuxedo_medium-dark_skin_tone": "๐Ÿคต๐Ÿพ", + "person_in_tuxedo_medium-light_skin_tone": "๐Ÿคต๐Ÿผ", + "person_in_tuxedo_medium_skin_tone": "๐Ÿคต๐Ÿฝ", + "person_juggling": "๐Ÿคน", + "person_juggling_dark_skin_tone": "๐Ÿคน๐Ÿฟ", + "person_juggling_light_skin_tone": "๐Ÿคน๐Ÿป", + "person_juggling_medium-dark_skin_tone": "๐Ÿคน๐Ÿพ", + "person_juggling_medium-light_skin_tone": "๐Ÿคน๐Ÿผ", + "person_juggling_medium_skin_tone": "๐Ÿคน๐Ÿฝ", + "person_kneeling": "๐ŸงŽ", + "person_kneeling_dark_skin_tone": "๐ŸงŽ๐Ÿฟ", + "person_kneeling_light_skin_tone": "๐ŸงŽ๐Ÿป", + "person_kneeling_medium-dark_skin_tone": "๐ŸงŽ๐Ÿพ", + "person_kneeling_medium-light_skin_tone": "๐ŸงŽ๐Ÿผ", + "person_kneeling_medium_skin_tone": "๐ŸงŽ๐Ÿฝ", + "person_lifting_weights": "๐Ÿ‹", + "person_lifting_weights_dark_skin_tone": "๐Ÿ‹๐Ÿฟ", + "person_lifting_weights_light_skin_tone": "๐Ÿ‹๐Ÿป", + "person_lifting_weights_medium-dark_skin_tone": "๐Ÿ‹๐Ÿพ", + "person_lifting_weights_medium-light_skin_tone": "๐Ÿ‹๐Ÿผ", + "person_lifting_weights_medium_skin_tone": "๐Ÿ‹๐Ÿฝ", + "person_light_skin_tone": "๐Ÿง‘๐Ÿป", + "person_light_skin_tone_bald": "๐Ÿง‘๐Ÿปโ€๐Ÿฆฒ", + "person_light_skin_tone_beard": "๐Ÿง”๐Ÿป", + "person_light_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿป", + "person_light_skin_tone_curly_hair": "๐Ÿง‘๐Ÿปโ€๐Ÿฆฑ", + "person_light_skin_tone_red_hair": "๐Ÿง‘๐Ÿปโ€๐Ÿฆฐ", + "person_light_skin_tone_white_hair": "๐Ÿง‘๐Ÿปโ€๐Ÿฆณ", + "person_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพ", + "person_medium-dark_skin_tone_bald": "๐Ÿง‘๐Ÿพโ€๐Ÿฆฒ", + "person_medium-dark_skin_tone_beard": "๐Ÿง”๐Ÿพ", + "person_medium-dark_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿพ", + "person_medium-dark_skin_tone_curly_hair": "๐Ÿง‘๐Ÿพโ€๐Ÿฆฑ", + "person_medium-dark_skin_tone_red_hair": "๐Ÿง‘๐Ÿพโ€๐Ÿฆฐ", + "person_medium-dark_skin_tone_white_hair": "๐Ÿง‘๐Ÿพโ€๐Ÿฆณ", + "person_medium-light_skin_tone": "๐Ÿง‘๐Ÿผ", + "person_medium-light_skin_tone_bald": "๐Ÿง‘๐Ÿผโ€๐Ÿฆฒ", + "person_medium-light_skin_tone_beard": "๐Ÿง”๐Ÿผ", + "person_medium-light_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿผ", + "person_medium-light_skin_tone_curly_hair": "๐Ÿง‘๐Ÿผโ€๐Ÿฆฑ", + "person_medium-light_skin_tone_red_hair": "๐Ÿง‘๐Ÿผโ€๐Ÿฆฐ", + "person_medium-light_skin_tone_white_hair": "๐Ÿง‘๐Ÿผโ€๐Ÿฆณ", + "person_medium_skin_tone": "๐Ÿง‘๐Ÿฝ", + "person_medium_skin_tone_bald": "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฒ", + "person_medium_skin_tone_beard": "๐Ÿง”๐Ÿฝ", + "person_medium_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿฝ", + "person_medium_skin_tone_curly_hair": "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฑ", + "person_medium_skin_tone_red_hair": "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฐ", + "person_medium_skin_tone_white_hair": "๐Ÿง‘๐Ÿฝโ€๐Ÿฆณ", + "person_mountain_biking": "๐Ÿšต", + "person_mountain_biking_dark_skin_tone": "๐Ÿšต๐Ÿฟ", + "person_mountain_biking_light_skin_tone": "๐Ÿšต๐Ÿป", + "person_mountain_biking_medium-dark_skin_tone": "๐Ÿšต๐Ÿพ", + "person_mountain_biking_medium-light_skin_tone": "๐Ÿšต๐Ÿผ", + "person_mountain_biking_medium_skin_tone": "๐Ÿšต๐Ÿฝ", + "person_playing_handball": "๐Ÿคพ", + "person_playing_handball_dark_skin_tone": "๐Ÿคพ๐Ÿฟ", + "person_playing_handball_light_skin_tone": "๐Ÿคพ๐Ÿป", + "person_playing_handball_medium-dark_skin_tone": "๐Ÿคพ๐Ÿพ", + "person_playing_handball_medium-light_skin_tone": "๐Ÿคพ๐Ÿผ", + "person_playing_handball_medium_skin_tone": "๐Ÿคพ๐Ÿฝ", + "person_playing_water_polo": "๐Ÿคฝ", + "person_playing_water_polo_dark_skin_tone": "๐Ÿคฝ๐Ÿฟ", + "person_playing_water_polo_light_skin_tone": "๐Ÿคฝ๐Ÿป", + "person_playing_water_polo_medium-dark_skin_tone": "๐Ÿคฝ๐Ÿพ", + "person_playing_water_polo_medium-light_skin_tone": "๐Ÿคฝ๐Ÿผ", + "person_playing_water_polo_medium_skin_tone": "๐Ÿคฝ๐Ÿฝ", + "person_pouting": "๐Ÿ™Ž", + "person_pouting_dark_skin_tone": "๐Ÿ™Ž๐Ÿฟ", + "person_pouting_light_skin_tone": "๐Ÿ™Ž๐Ÿป", + "person_pouting_medium-dark_skin_tone": "๐Ÿ™Ž๐Ÿพ", + "person_pouting_medium-light_skin_tone": "๐Ÿ™Ž๐Ÿผ", + "person_pouting_medium_skin_tone": "๐Ÿ™Ž๐Ÿฝ", + "person_raising_hand": "๐Ÿ™‹", + "person_raising_hand_dark_skin_tone": "๐Ÿ™‹๐Ÿฟ", + "person_raising_hand_light_skin_tone": "๐Ÿ™‹๐Ÿป", + "person_raising_hand_medium-dark_skin_tone": "๐Ÿ™‹๐Ÿพ", + "person_raising_hand_medium-light_skin_tone": "๐Ÿ™‹๐Ÿผ", + "person_raising_hand_medium_skin_tone": "๐Ÿ™‹๐Ÿฝ", + "person_red_hair": "๐Ÿง‘โ€๐Ÿฆฐ", + "person_rowing_boat": "๐Ÿšฃ", + "person_rowing_boat_dark_skin_tone": "๐Ÿšฃ๐Ÿฟ", + "person_rowing_boat_light_skin_tone": "๐Ÿšฃ๐Ÿป", + "person_rowing_boat_medium-dark_skin_tone": "๐Ÿšฃ๐Ÿพ", + "person_rowing_boat_medium-light_skin_tone": "๐Ÿšฃ๐Ÿผ", + "person_rowing_boat_medium_skin_tone": "๐Ÿšฃ๐Ÿฝ", + "person_running": "๐Ÿƒ", + "person_running_dark_skin_tone": "๐Ÿƒ๐Ÿฟ", + "person_running_light_skin_tone": "๐Ÿƒ๐Ÿป", + "person_running_medium-dark_skin_tone": "๐Ÿƒ๐Ÿพ", + "person_running_medium-light_skin_tone": "๐Ÿƒ๐Ÿผ", + "person_running_medium_skin_tone": "๐Ÿƒ๐Ÿฝ", + "person_shrugging": "๐Ÿคท", + "person_shrugging_dark_skin_tone": "๐Ÿคท๐Ÿฟ", + "person_shrugging_light_skin_tone": "๐Ÿคท๐Ÿป", + "person_shrugging_medium-dark_skin_tone": "๐Ÿคท๐Ÿพ", + "person_shrugging_medium-light_skin_tone": "๐Ÿคท๐Ÿผ", + "person_shrugging_medium_skin_tone": "๐Ÿคท๐Ÿฝ", + "person_standing": "๐Ÿง", + "person_standing_dark_skin_tone": "๐Ÿง๐Ÿฟ", + "person_standing_light_skin_tone": "๐Ÿง๐Ÿป", + "person_standing_medium-dark_skin_tone": "๐Ÿง๐Ÿพ", + "person_standing_medium-light_skin_tone": "๐Ÿง๐Ÿผ", + "person_standing_medium_skin_tone": "๐Ÿง๐Ÿฝ", + "person_surfing": "๐Ÿ„", + "person_surfing_dark_skin_tone": "๐Ÿ„๐Ÿฟ", + "person_surfing_light_skin_tone": "๐Ÿ„๐Ÿป", + "person_surfing_medium-dark_skin_tone": "๐Ÿ„๐Ÿพ", + "person_surfing_medium-light_skin_tone": "๐Ÿ„๐Ÿผ", + "person_surfing_medium_skin_tone": "๐Ÿ„๐Ÿฝ", + "person_swimming": "๐ŸŠ", + "person_swimming_dark_skin_tone": "๐ŸŠ๐Ÿฟ", + "person_swimming_light_skin_tone": "๐ŸŠ๐Ÿป", + "person_swimming_medium-dark_skin_tone": "๐ŸŠ๐Ÿพ", + "person_swimming_medium-light_skin_tone": "๐ŸŠ๐Ÿผ", + "person_swimming_medium_skin_tone": "๐ŸŠ๐Ÿฝ", + "person_taking_bath": "๐Ÿ›€", + "person_taking_bath_dark_skin_tone": "๐Ÿ›€๐Ÿฟ", + "person_taking_bath_light_skin_tone": "๐Ÿ›€๐Ÿป", + "person_taking_bath_medium-dark_skin_tone": "๐Ÿ›€๐Ÿพ", + "person_taking_bath_medium-light_skin_tone": "๐Ÿ›€๐Ÿผ", + "person_taking_bath_medium_skin_tone": "๐Ÿ›€๐Ÿฝ", + "person_tipping_hand": "๐Ÿ’", + "person_tipping_hand_dark_skin_tone": "๐Ÿ’๐Ÿฟ", + "person_tipping_hand_light_skin_tone": "๐Ÿ’๐Ÿป", + "person_tipping_hand_medium-dark_skin_tone": "๐Ÿ’๐Ÿพ", + "person_tipping_hand_medium-light_skin_tone": "๐Ÿ’๐Ÿผ", + "person_tipping_hand_medium_skin_tone": "๐Ÿ’๐Ÿฝ", + "person_walking": "๐Ÿšถ", + "person_walking_dark_skin_tone": "๐Ÿšถ๐Ÿฟ", + "person_walking_light_skin_tone": "๐Ÿšถ๐Ÿป", + "person_walking_medium-dark_skin_tone": "๐Ÿšถ๐Ÿพ", + "person_walking_medium-light_skin_tone": "๐Ÿšถ๐Ÿผ", + "person_walking_medium_skin_tone": "๐Ÿšถ๐Ÿฝ", + "person_wearing_turban": "๐Ÿ‘ณ", + "person_wearing_turban_dark_skin_tone": "๐Ÿ‘ณ๐Ÿฟ", + "person_wearing_turban_light_skin_tone": "๐Ÿ‘ณ๐Ÿป", + "person_wearing_turban_medium-dark_skin_tone": "๐Ÿ‘ณ๐Ÿพ", + "person_wearing_turban_medium-light_skin_tone": "๐Ÿ‘ณ๐Ÿผ", + "person_wearing_turban_medium_skin_tone": "๐Ÿ‘ณ๐Ÿฝ", + "person_white_hair": "๐Ÿง‘โ€๐Ÿฆณ", + "person_with_crown": "๐Ÿซ…", + "person_with_crown_dark_skin_tone": "๐Ÿซ…๐Ÿฟ", + "person_with_crown_light_skin_tone": "๐Ÿซ…๐Ÿป", + "person_with_crown_medium-dark_skin_tone": "๐Ÿซ…๐Ÿพ", + "person_with_crown_medium-light_skin_tone": "๐Ÿซ…๐Ÿผ", + "person_with_crown_medium_skin_tone": "๐Ÿซ…๐Ÿฝ", + "person_with_skullcap": "๐Ÿ‘ฒ", + "person_with_skullcap_dark_skin_tone": "๐Ÿ‘ฒ๐Ÿฟ", + "person_with_skullcap_light_skin_tone": "๐Ÿ‘ฒ๐Ÿป", + "person_with_skullcap_medium-dark_skin_tone": "๐Ÿ‘ฒ๐Ÿพ", + "person_with_skullcap_medium-light_skin_tone": "๐Ÿ‘ฒ๐Ÿผ", + "person_with_skullcap_medium_skin_tone": "๐Ÿ‘ฒ๐Ÿฝ", + "person_with_veil": "๐Ÿ‘ฐ", + "person_with_veil_dark_skin_tone": "๐Ÿ‘ฐ๐Ÿฟ", + "person_with_veil_light_skin_tone": "๐Ÿ‘ฐ๐Ÿป", + "person_with_veil_medium-dark_skin_tone": "๐Ÿ‘ฐ๐Ÿพ", + "person_with_veil_medium-light_skin_tone": "๐Ÿ‘ฐ๐Ÿผ", + "person_with_veil_medium_skin_tone": "๐Ÿ‘ฐ๐Ÿฝ", + "person_with_white_cane": "๐Ÿง‘โ€๐Ÿฆฏ", + "person_with_white_cane_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿฆฏ", + "person_with_white_cane_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿฆฏ", + "person_with_white_cane_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿฆฏ", + "person_with_white_cane_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿฆฏ", + "person_with_white_cane_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿฆฏ", + "petri_dish": "๐Ÿงซ", + "pick": "โ›", + "pickup_truck": "๐Ÿ›ป", + "pie": "๐Ÿฅง", + "pig": "๐Ÿ–", + "pig_face": "๐Ÿท", + "pig_nose": "๐Ÿฝ", + "pile_of_poo": "๐Ÿ’ฉ", + "pill": "๐Ÿ’Š", + "pilot": "๐Ÿง‘โ€โœˆ", + "pilot_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€โœˆ", + "pilot_light_skin_tone": "๐Ÿง‘๐Ÿปโ€โœˆ", + "pilot_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€โœˆ", + "pilot_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€โœˆ", + "pilot_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€โœˆ", + "pinched_fingers": "๐ŸคŒ", + "pinched_fingers_dark_skin_tone": "๐ŸคŒ๐Ÿฟ", + "pinched_fingers_light_skin_tone": "๐ŸคŒ๐Ÿป", + "pinched_fingers_medium-dark_skin_tone": "๐ŸคŒ๐Ÿพ", + "pinched_fingers_medium-light_skin_tone": "๐ŸคŒ๐Ÿผ", + "pinched_fingers_medium_skin_tone": "๐ŸคŒ๐Ÿฝ", + "pinching_hand": "๐Ÿค", + "pinching_hand_dark_skin_tone": "๐Ÿค๐Ÿฟ", + "pinching_hand_light_skin_tone": "๐Ÿค๐Ÿป", + "pinching_hand_medium-dark_skin_tone": "๐Ÿค๐Ÿพ", + "pinching_hand_medium-light_skin_tone": "๐Ÿค๐Ÿผ", + "pinching_hand_medium_skin_tone": "๐Ÿค๐Ÿฝ", + "pine_decoration": "๐ŸŽ", + "pineapple": "๐Ÿ", + "ping_pong": "๐Ÿ“", + "pink_heart": "๐Ÿฉท", + "pirate_flag": "๐Ÿดโ€โ˜ ", + "pizza": "๐Ÿ•", + "piรฑata": "๐Ÿช…", + "placard": "๐Ÿชง", + "place_of_worship": "๐Ÿ›", + "play_button": "โ–ถ", + "play_or_pause_button": "โฏ", + "playground_slide": "๐Ÿ›", + "pleading_face": "๐Ÿฅบ", + "plunger": "๐Ÿช ", + "plus": "โž•", + "polar_bear": "๐Ÿปโ€โ„", + "police_car": "๐Ÿš“", + "police_car_light": "๐Ÿšจ", + "police_officer": "๐Ÿ‘ฎ", + "police_officer_dark_skin_tone": "๐Ÿ‘ฎ๐Ÿฟ", + "police_officer_light_skin_tone": "๐Ÿ‘ฎ๐Ÿป", + "police_officer_medium-dark_skin_tone": "๐Ÿ‘ฎ๐Ÿพ", + "police_officer_medium-light_skin_tone": "๐Ÿ‘ฎ๐Ÿผ", + "police_officer_medium_skin_tone": "๐Ÿ‘ฎ๐Ÿฝ", + "poodle": "๐Ÿฉ", + "pool_8_ball": "๐ŸŽฑ", + "popcorn": "๐Ÿฟ", + "post_office": "๐Ÿค", + "postal_horn": "๐Ÿ“ฏ", + "postbox": "๐Ÿ“ฎ", + "pot_of_food": "๐Ÿฒ", + "potable_water": "๐Ÿšฐ", + "potato": "๐Ÿฅ”", + "potted_plant": "๐Ÿชด", + "poultry_leg": "๐Ÿ—", + "pound_banknote": "๐Ÿ’ท", + "pouring_liquid": "๐Ÿซ—", + "pouting_cat": "๐Ÿ˜พ", + "prayer_beads": "๐Ÿ“ฟ", + "pregnant_man": "๐Ÿซƒ", + "pregnant_man_dark_skin_tone": "๐Ÿซƒ๐Ÿฟ", + "pregnant_man_light_skin_tone": "๐Ÿซƒ๐Ÿป", + "pregnant_man_medium-dark_skin_tone": "๐Ÿซƒ๐Ÿพ", + "pregnant_man_medium-light_skin_tone": "๐Ÿซƒ๐Ÿผ", + "pregnant_man_medium_skin_tone": "๐Ÿซƒ๐Ÿฝ", + "pregnant_person": "๐Ÿซ„", + "pregnant_person_dark_skin_tone": "๐Ÿซ„๐Ÿฟ", + "pregnant_person_light_skin_tone": "๐Ÿซ„๐Ÿป", + "pregnant_person_medium-dark_skin_tone": "๐Ÿซ„๐Ÿพ", + "pregnant_person_medium-light_skin_tone": "๐Ÿซ„๐Ÿผ", + "pregnant_person_medium_skin_tone": "๐Ÿซ„๐Ÿฝ", + "pregnant_woman": "๐Ÿคฐ", + "pregnant_woman_dark_skin_tone": "๐Ÿคฐ๐Ÿฟ", + "pregnant_woman_light_skin_tone": "๐Ÿคฐ๐Ÿป", + "pregnant_woman_medium-dark_skin_tone": "๐Ÿคฐ๐Ÿพ", + "pregnant_woman_medium-light_skin_tone": "๐Ÿคฐ๐Ÿผ", + "pregnant_woman_medium_skin_tone": "๐Ÿคฐ๐Ÿฝ", + "pretzel": "๐Ÿฅจ", + "prince": "๐Ÿคด", + "prince_dark_skin_tone": "๐Ÿคด๐Ÿฟ", + "prince_light_skin_tone": "๐Ÿคด๐Ÿป", + "prince_medium-dark_skin_tone": "๐Ÿคด๐Ÿพ", + "prince_medium-light_skin_tone": "๐Ÿคด๐Ÿผ", + "prince_medium_skin_tone": "๐Ÿคด๐Ÿฝ", + "princess": "๐Ÿ‘ธ", + "princess_dark_skin_tone": "๐Ÿ‘ธ๐Ÿฟ", + "princess_light_skin_tone": "๐Ÿ‘ธ๐Ÿป", + "princess_medium-dark_skin_tone": "๐Ÿ‘ธ๐Ÿพ", + "princess_medium-light_skin_tone": "๐Ÿ‘ธ๐Ÿผ", + "princess_medium_skin_tone": "๐Ÿ‘ธ๐Ÿฝ", + "printer": "๐Ÿ–จ", + "prohibited": "๐Ÿšซ", + "purple_circle": "๐ŸŸฃ", + "purple_heart": "๐Ÿ’œ", + "purple_square": "๐ŸŸช", + "purse": "๐Ÿ‘›", + "pushpin": "๐Ÿ“Œ", + "puzzle_piece": "๐Ÿงฉ", + "rabbit": "๐Ÿ‡", + "rabbit_face": "๐Ÿฐ", + "raccoon": "๐Ÿฆ", + "racing_car": "๐ŸŽ", + "radio": "๐Ÿ“ป", + "radio_button": "๐Ÿ”˜", + "radioactive": "โ˜ข", + "railway_car": "๐Ÿšƒ", + "railway_track": "๐Ÿ›ค", + "rainbow": "๐ŸŒˆ", + "rainbow_flag": "๐Ÿณโ€๐ŸŒˆ", + "raised_back_of_hand": "๐Ÿคš", + "raised_back_of_hand_dark_skin_tone": "๐Ÿคš๐Ÿฟ", + "raised_back_of_hand_light_skin_tone": "๐Ÿคš๐Ÿป", + "raised_back_of_hand_medium-dark_skin_tone": "๐Ÿคš๐Ÿพ", + "raised_back_of_hand_medium-light_skin_tone": "๐Ÿคš๐Ÿผ", + "raised_back_of_hand_medium_skin_tone": "๐Ÿคš๐Ÿฝ", + "raised_fist": "โœŠ", + "raised_fist_dark_skin_tone": "โœŠ๐Ÿฟ", + "raised_fist_light_skin_tone": "โœŠ๐Ÿป", + "raised_fist_medium-dark_skin_tone": "โœŠ๐Ÿพ", + "raised_fist_medium-light_skin_tone": "โœŠ๐Ÿผ", + "raised_fist_medium_skin_tone": "โœŠ๐Ÿฝ", + "raised_hand": "โœ‹", + "raised_hand_dark_skin_tone": "โœ‹๐Ÿฟ", + "raised_hand_light_skin_tone": "โœ‹๐Ÿป", + "raised_hand_medium-dark_skin_tone": "โœ‹๐Ÿพ", + "raised_hand_medium-light_skin_tone": "โœ‹๐Ÿผ", + "raised_hand_medium_skin_tone": "โœ‹๐Ÿฝ", + "raising_hands": "๐Ÿ™Œ", + "raising_hands_dark_skin_tone": "๐Ÿ™Œ๐Ÿฟ", + "raising_hands_light_skin_tone": "๐Ÿ™Œ๐Ÿป", + "raising_hands_medium-dark_skin_tone": "๐Ÿ™Œ๐Ÿพ", + "raising_hands_medium-light_skin_tone": "๐Ÿ™Œ๐Ÿผ", + "raising_hands_medium_skin_tone": "๐Ÿ™Œ๐Ÿฝ", + "ram": "๐Ÿ", + "rat": "๐Ÿ€", + "razor": "๐Ÿช’", + "receipt": "๐Ÿงพ", + "record_button": "โบ", + "recycling_symbol": "โ™ป", + "red_apple": "๐ŸŽ", + "red_circle": "๐Ÿ”ด", + "red_envelope": "๐Ÿงง", + "red_exclamation_mark": "โ—", + "red_hair": "๐Ÿฆฐ", + "red_heart": "โค", + "red_paper_lantern": "๐Ÿฎ", + "red_question_mark": "โ“", + "red_square": "๐ŸŸฅ", + "red_triangle_pointed_down": "๐Ÿ”ป", + "red_triangle_pointed_up": "๐Ÿ”บ", + "registered": "ยฎ", + "relieved_face": "๐Ÿ˜Œ", + "reminder_ribbon": "๐ŸŽ—", + "repeat_button": "๐Ÿ”", + "repeat_single_button": "๐Ÿ”‚", + "rescue_workerโ€™s_helmet": "โ›‘", + "restroom": "๐Ÿšป", + "reverse_button": "โ—€", + "revolving_hearts": "๐Ÿ’ž", + "rhinoceros": "๐Ÿฆ", + "ribbon": "๐ŸŽ€", + "rice_ball": "๐Ÿ™", + "rice_cracker": "๐Ÿ˜", + "right-facing_fist": "๐Ÿคœ", + "right-facing_fist_dark_skin_tone": "๐Ÿคœ๐Ÿฟ", + "right-facing_fist_light_skin_tone": "๐Ÿคœ๐Ÿป", + "right-facing_fist_medium-dark_skin_tone": "๐Ÿคœ๐Ÿพ", + "right-facing_fist_medium-light_skin_tone": "๐Ÿคœ๐Ÿผ", + "right-facing_fist_medium_skin_tone": "๐Ÿคœ๐Ÿฝ", + "right_anger_bubble": "๐Ÿ—ฏ", + "right_arrow": "โžก", + "right_arrow_curving_down": "โคต", + "right_arrow_curving_left": "โ†ฉ", + "right_arrow_curving_up": "โคด", + "rightwards_hand": "๐Ÿซฑ", + "rightwards_hand_dark_skin_tone": "๐Ÿซฑ๐Ÿฟ", + "rightwards_hand_light_skin_tone": "๐Ÿซฑ๐Ÿป", + "rightwards_hand_medium-dark_skin_tone": "๐Ÿซฑ๐Ÿพ", + "rightwards_hand_medium-light_skin_tone": "๐Ÿซฑ๐Ÿผ", + "rightwards_hand_medium_skin_tone": "๐Ÿซฑ๐Ÿฝ", + "rightwards_pushing_hand": "๐Ÿซธ", + "rightwards_pushing_hand_dark_skin_tone": "๐Ÿซธ๐Ÿฟ", + "rightwards_pushing_hand_light_skin_tone": "๐Ÿซธ๐Ÿป", + "rightwards_pushing_hand_medium-dark_skin_tone": "๐Ÿซธ๐Ÿพ", + "rightwards_pushing_hand_medium-light_skin_tone": "๐Ÿซธ๐Ÿผ", + "rightwards_pushing_hand_medium_skin_tone": "๐Ÿซธ๐Ÿฝ", + "ring": "๐Ÿ’", + "ring_buoy": "๐Ÿ›Ÿ", + "ringed_planet": "๐Ÿช", + "roasted_sweet_potato": "๐Ÿ ", + "robot": "๐Ÿค–", + "rock": "๐Ÿชจ", + "rocket": "๐Ÿš€", + "roll_of_paper": "๐Ÿงป", + "rolled-up_newspaper": "๐Ÿ—ž", + "roller_coaster": "๐ŸŽข", + "roller_skate": "๐Ÿ›ผ", + "rolling_on_the_floor_laughing": "๐Ÿคฃ", + "rooster": "๐Ÿ“", + "rose": "๐ŸŒน", + "rosette": "๐Ÿต", + "round_pushpin": "๐Ÿ“", + "rugby_football": "๐Ÿ‰", + "running_shirt": "๐ŸŽฝ", + "running_shoe": "๐Ÿ‘Ÿ", + "sad_but_relieved_face": "๐Ÿ˜ฅ", + "safety_pin": "๐Ÿงท", + "safety_vest": "๐Ÿฆบ", + "sailboat": "โ›ต", + "sake": "๐Ÿถ", + "salt": "๐Ÿง‚", + "saluting_face": "๐Ÿซก", + "sandwich": "๐Ÿฅช", + "sari": "๐Ÿฅป", + "satellite": "๐Ÿ›ฐ", + "satellite_antenna": "๐Ÿ“ก", + "sauropod": "๐Ÿฆ•", + "saxophone": "๐ŸŽท", + "scarf": "๐Ÿงฃ", + "school": "๐Ÿซ", + "scientist": "๐Ÿง‘โ€๐Ÿ”ฌ", + "scientist_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿ”ฌ", + "scientist_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿ”ฌ", + "scientist_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿ”ฌ", + "scientist_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿ”ฌ", + "scientist_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿ”ฌ", + "scissors": "โœ‚", + "scorpion": "๐Ÿฆ‚", + "screwdriver": "๐Ÿช›", + "scroll": "๐Ÿ“œ", + "seal": "๐Ÿฆญ", + "seat": "๐Ÿ’บ", + "see-no-evil_monkey": "๐Ÿ™ˆ", + "see_no_evil": "๐Ÿ™ˆ", + "seedling": "๐ŸŒฑ", + "selfie": "๐Ÿคณ", + "selfie_dark_skin_tone": "๐Ÿคณ๐Ÿฟ", + "selfie_light_skin_tone": "๐Ÿคณ๐Ÿป", + "selfie_medium-dark_skin_tone": "๐Ÿคณ๐Ÿพ", + "selfie_medium-light_skin_tone": "๐Ÿคณ๐Ÿผ", + "selfie_medium_skin_tone": "๐Ÿคณ๐Ÿฝ", + "service_dog": "๐Ÿ•โ€๐Ÿฆบ", + "seven-thirty": "๐Ÿ•ข", + "seven_oโ€™clock": "๐Ÿ•–", + "sewing_needle": "๐Ÿชก", + "shaking_face": "๐Ÿซจ", + "shallow_pan_of_food": "๐Ÿฅ˜", + "shamrock": "โ˜˜", + "shark": "๐Ÿฆˆ", + "shaved_ice": "๐Ÿง", + "sheaf_of_rice": "๐ŸŒพ", + "shield": "๐Ÿ›ก", + "shinto_shrine": "โ›ฉ", + "ship": "๐Ÿšข", + "shooting_star": "๐ŸŒ ", + "shopping_bags": "๐Ÿ›", + "shopping_cart": "๐Ÿ›’", + "shortcake": "๐Ÿฐ", + "shorts": "๐Ÿฉณ", + "shower": "๐Ÿšฟ", + "shrimp": "๐Ÿฆ", + "shuffle_tracks_button": "๐Ÿ”€", + "shushing_face": "๐Ÿคซ", + "sign_of_the_horns": "๐Ÿค˜", + "sign_of_the_horns_dark_skin_tone": "๐Ÿค˜๐Ÿฟ", + "sign_of_the_horns_light_skin_tone": "๐Ÿค˜๐Ÿป", + "sign_of_the_horns_medium-dark_skin_tone": "๐Ÿค˜๐Ÿพ", + "sign_of_the_horns_medium-light_skin_tone": "๐Ÿค˜๐Ÿผ", + "sign_of_the_horns_medium_skin_tone": "๐Ÿค˜๐Ÿฝ", + "singer": "๐Ÿง‘โ€๐ŸŽค", + "singer_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐ŸŽค", + "singer_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐ŸŽค", + "singer_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐ŸŽค", + "singer_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐ŸŽค", + "singer_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐ŸŽค", + "six-thirty": "๐Ÿ•ก", + "six_oโ€™clock": "๐Ÿ••", + "skateboard": "๐Ÿ›น", + "skier": "โ›ท", + "skis": "๐ŸŽฟ", + "skull": "๐Ÿ’€", + "skull_and_crossbones": "โ˜ ", + "skunk": "๐Ÿฆจ", + "sled": "๐Ÿ›ท", + "sleeping_face": "๐Ÿ˜ด", + "sleepy_face": "๐Ÿ˜ช", + "slightly_frowning_face": "๐Ÿ™", + "slightly_smiling_face": "๐Ÿ™‚", + "slot_machine": "๐ŸŽฐ", + "sloth": "๐Ÿฆฅ", + "small_airplane": "๐Ÿ›ฉ", + "small_blue_diamond": "๐Ÿ”น", + "small_orange_diamond": "๐Ÿ”ธ", + "smiling_cat_with_heart-eyes": "๐Ÿ˜ป", + "smiling_face": "โ˜บ", + "smiling_face_with_halo": "๐Ÿ˜‡", + "smiling_face_with_heart-eyes": "๐Ÿ˜", + "smiling_face_with_hearts": "๐Ÿฅฐ", + "smiling_face_with_horns": "๐Ÿ˜ˆ", + "smiling_face_with_open_hands": "๐Ÿค—", + "smiling_face_with_smiling_eyes": "๐Ÿ˜Š", + "smiling_face_with_sunglasses": "๐Ÿ˜Ž", + "smiling_face_with_tear": "๐Ÿฅฒ", + "smirking_face": "๐Ÿ˜", + "snail": "๐ŸŒ", + "snake": "๐Ÿ", + "sneezing_face": "๐Ÿคง", + "snow-capped_mountain": "๐Ÿ”", + "snowboarder": "๐Ÿ‚", + "snowboarder_dark_skin_tone": "๐Ÿ‚๐Ÿฟ", + "snowboarder_light_skin_tone": "๐Ÿ‚๐Ÿป", + "snowboarder_medium-dark_skin_tone": "๐Ÿ‚๐Ÿพ", + "snowboarder_medium-light_skin_tone": "๐Ÿ‚๐Ÿผ", + "snowboarder_medium_skin_tone": "๐Ÿ‚๐Ÿฝ", + "snowflake": "โ„", + "snowman": "โ˜ƒ", + "snowman_without_snow": "โ›„", + "soap": "๐Ÿงผ", + "soccer_ball": "โšฝ", + "socks": "๐Ÿงฆ", + "soft_ice_cream": "๐Ÿฆ", + "softball": "๐ŸฅŽ", + "spade_suit": "โ™ ", + "spaghetti": "๐Ÿ", + "sparkle": "โ‡", + "sparkler": "๐ŸŽ‡", + "sparkles": "โœจ", + "sparkling_heart": "๐Ÿ’–", + "speak-no-evil_monkey": "๐Ÿ™Š", + "speaker_high_volume": "๐Ÿ”Š", + "speaker_low_volume": "๐Ÿ”ˆ", + "speaker_medium_volume": "๐Ÿ”‰", + "speaking_head": "๐Ÿ—ฃ", + "speech_balloon": "๐Ÿ’ฌ", + "speedboat": "๐Ÿšค", + "spider": "๐Ÿ•ท", + "spider_web": "๐Ÿ•ธ", + "spiral_calendar": "๐Ÿ—“", + "spiral_notepad": "๐Ÿ—’", + "spiral_shell": "๐Ÿš", + "sponge": "๐Ÿงฝ", + "spoon": "๐Ÿฅ„", + "sport_utility_vehicle": "๐Ÿš™", + "sports_medal": "๐Ÿ…", + "spouting_whale": "๐Ÿณ", + "squid": "๐Ÿฆ‘", + "squinting_face_with_tongue": "๐Ÿ˜", + "stadium": "๐ŸŸ", + "star": "โญ", + "star-struck": "๐Ÿคฉ", + "star_and_crescent": "โ˜ช", + "star_of_David": "โœก", + "station": "๐Ÿš‰", + "steaming_bowl": "๐Ÿœ", + "stethoscope": "๐Ÿฉบ", + "stop_button": "โน", + "stop_sign": "๐Ÿ›‘", + "stopwatch": "โฑ", + "straight_ruler": "๐Ÿ“", + "strawberry": "๐Ÿ“", + "student": "๐Ÿง‘โ€๐ŸŽ“", + "student_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐ŸŽ“", + "student_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐ŸŽ“", + "student_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐ŸŽ“", + "student_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐ŸŽ“", + "student_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐ŸŽ“", + "studio_microphone": "๐ŸŽ™", + "stuffed_flatbread": "๐Ÿฅ™", + "sun": "โ˜€", + "sun_behind_cloud": "โ›…", + "sun_behind_large_cloud": "๐ŸŒฅ", + "sun_behind_rain_cloud": "๐ŸŒฆ", + "sun_behind_small_cloud": "๐ŸŒค", + "sun_with_face": "๐ŸŒž", + "sunflower": "๐ŸŒป", + "sunglasses": "๐Ÿ•ถ", + "sunrise": "๐ŸŒ…", + "sunrise_over_mountains": "๐ŸŒ„", + "sunset": "๐ŸŒ‡", + "superhero": "๐Ÿฆธ", + "superhero_dark_skin_tone": "๐Ÿฆธ๐Ÿฟ", + "superhero_light_skin_tone": "๐Ÿฆธ๐Ÿป", + "superhero_medium-dark_skin_tone": "๐Ÿฆธ๐Ÿพ", + "superhero_medium-light_skin_tone": "๐Ÿฆธ๐Ÿผ", + "superhero_medium_skin_tone": "๐Ÿฆธ๐Ÿฝ", + "supervillain": "๐Ÿฆน", + "supervillain_dark_skin_tone": "๐Ÿฆน๐Ÿฟ", + "supervillain_light_skin_tone": "๐Ÿฆน๐Ÿป", + "supervillain_medium-dark_skin_tone": "๐Ÿฆน๐Ÿพ", + "supervillain_medium-light_skin_tone": "๐Ÿฆน๐Ÿผ", + "supervillain_medium_skin_tone": "๐Ÿฆน๐Ÿฝ", + "sushi": "๐Ÿฃ", + "suspension_railway": "๐ŸšŸ", + "swan": "๐Ÿฆข", + "sweat_droplets": "๐Ÿ’ฆ", + "synagogue": "๐Ÿ•", + "syringe": "๐Ÿ’‰", + "t-shirt": "๐Ÿ‘•", + "taco": "๐ŸŒฎ", + "takeout_box": "๐Ÿฅก", + "tamale": "๐Ÿซ”", + "tanabata_tree": "๐ŸŽ‹", + "tangerine": "๐ŸŠ", + "taxi": "๐Ÿš•", + "teacher": "๐Ÿง‘โ€๐Ÿซ", + "teacher_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿซ", + "teacher_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿซ", + "teacher_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿซ", + "teacher_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿซ", + "teacher_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿซ", + "teacup_without_handle": "๐Ÿต", + "teapot": "๐Ÿซ–", + "tear-off_calendar": "๐Ÿ“†", + "technologist": "๐Ÿง‘โ€๐Ÿ’ป", + "technologist_dark_skin_tone": "๐Ÿง‘๐Ÿฟโ€๐Ÿ’ป", + "technologist_light_skin_tone": "๐Ÿง‘๐Ÿปโ€๐Ÿ’ป", + "technologist_medium-dark_skin_tone": "๐Ÿง‘๐Ÿพโ€๐Ÿ’ป", + "technologist_medium-light_skin_tone": "๐Ÿง‘๐Ÿผโ€๐Ÿ’ป", + "technologist_medium_skin_tone": "๐Ÿง‘๐Ÿฝโ€๐Ÿ’ป", + "teddy_bear": "๐Ÿงธ", + "telephone": "โ˜Ž", + "telephone_receiver": "๐Ÿ“ž", + "telescope": "๐Ÿ”ญ", + "television": "๐Ÿ“บ", + "ten-thirty": "๐Ÿ•ฅ", + "ten_oโ€™clock": "๐Ÿ•™", + "tennis": "๐ŸŽพ", + "tent": "โ›บ", + "test_tube": "๐Ÿงช", + "thermometer": "๐ŸŒก", + "thinking_face": "๐Ÿค”", + "thong_sandal": "๐Ÿฉด", + "thought_balloon": "๐Ÿ’ญ", + "thread": "๐Ÿงต", + "three-thirty": "๐Ÿ•ž", + "three_oโ€™clock": "๐Ÿ•’", + "thumbs_down": "๐Ÿ‘Ž", + "thumbs_down_dark_skin_tone": "๐Ÿ‘Ž๐Ÿฟ", + "thumbs_down_light_skin_tone": "๐Ÿ‘Ž๐Ÿป", + "thumbs_down_medium-dark_skin_tone": "๐Ÿ‘Ž๐Ÿพ", + "thumbs_down_medium-light_skin_tone": "๐Ÿ‘Ž๐Ÿผ", + "thumbs_down_medium_skin_tone": "๐Ÿ‘Ž๐Ÿฝ", + "thumbs_up": "๐Ÿ‘", + "thumbs_up_dark_skin_tone": "๐Ÿ‘๐Ÿฟ", + "thumbs_up_light_skin_tone": "๐Ÿ‘๐Ÿป", + "thumbs_up_medium-dark_skin_tone": "๐Ÿ‘๐Ÿพ", + "thumbs_up_medium-light_skin_tone": "๐Ÿ‘๐Ÿผ", + "thumbs_up_medium_skin_tone": "๐Ÿ‘๐Ÿฝ", + "ticket": "๐ŸŽซ", + "tiger": "๐Ÿ…", + "tiger_face": "๐Ÿฏ", + "timer_clock": "โฒ", + "tired_face": "๐Ÿ˜ซ", + "toilet": "๐Ÿšฝ", + "tomato": "๐Ÿ…", + "tongue": "๐Ÿ‘…", + "toolbox": "๐Ÿงฐ", + "tooth": "๐Ÿฆท", + "toothbrush": "๐Ÿชฅ", + "top_hat": "๐ŸŽฉ", + "tornado": "๐ŸŒช", + "trackball": "๐Ÿ–ฒ", + "tractor": "๐Ÿšœ", + "trade_mark": "โ„ข", + "train": "๐Ÿš†", + "tram": "๐ŸšŠ", + "tram_car": "๐Ÿš‹", + "transgender_flag": "๐Ÿณโ€โšง", + "transgender_symbol": "โšง", + "triangular_flag": "๐Ÿšฉ", + "triangular_ruler": "๐Ÿ“", + "trident_emblem": "๐Ÿ”ฑ", + "troll": "๐ŸงŒ", + "trolleybus": "๐ŸšŽ", + "trophy": "๐Ÿ†", + "tropical_drink": "๐Ÿน", + "tropical_fish": "๐Ÿ ", + "trumpet": "๐ŸŽบ", + "tulip": "๐ŸŒท", + "tumbler_glass": "๐Ÿฅƒ", + "turkey": "๐Ÿฆƒ", + "turtle": "๐Ÿข", + "twelve-thirty": "๐Ÿ•ง", + "twelve_oโ€™clock": "๐Ÿ•›", + "two-hump_camel": "๐Ÿซ", + "two-thirty": "๐Ÿ•", + "two_hearts": "๐Ÿ’•", + "two_oโ€™clock": "๐Ÿ•‘", + "umbrella": "โ˜‚", + "umbrella_on_ground": "โ›ฑ", + "umbrella_with_rain_drops": "โ˜”", + "unamused_face": "๐Ÿ˜’", + "unicorn": "๐Ÿฆ„", + "unlocked": "๐Ÿ”“", + "up-down_arrow": "โ†•", + "up-left_arrow": "โ†–", + "up-right_arrow": "โ†—", + "up_arrow": "โฌ†", + "upside-down_face": "๐Ÿ™ƒ", + "upwards_button": "๐Ÿ”ผ", + "vampire": "๐Ÿง›", + "vampire_dark_skin_tone": "๐Ÿง›๐Ÿฟ", + "vampire_light_skin_tone": "๐Ÿง›๐Ÿป", + "vampire_medium-dark_skin_tone": "๐Ÿง›๐Ÿพ", + "vampire_medium-light_skin_tone": "๐Ÿง›๐Ÿผ", + "vampire_medium_skin_tone": "๐Ÿง›๐Ÿฝ", + "vertical_traffic_light": "๐Ÿšฆ", + "vibration_mode": "๐Ÿ“ณ", + "victory_hand": "โœŒ", + "victory_hand_dark_skin_tone": "โœŒ๐Ÿฟ", + "victory_hand_light_skin_tone": "โœŒ๐Ÿป", + "victory_hand_medium-dark_skin_tone": "โœŒ๐Ÿพ", + "victory_hand_medium-light_skin_tone": "โœŒ๐Ÿผ", + "victory_hand_medium_skin_tone": "โœŒ๐Ÿฝ", + "video_camera": "๐Ÿ“น", + "video_game": "๐ŸŽฎ", + "videocassette": "๐Ÿ“ผ", + "violin": "๐ŸŽป", + "volcano": "๐ŸŒ‹", + "volleyball": "๐Ÿ", + "vulcan_salute": "๐Ÿ––", + "vulcan_salute_dark_skin_tone": "๐Ÿ––๐Ÿฟ", + "vulcan_salute_light_skin_tone": "๐Ÿ––๐Ÿป", + "vulcan_salute_medium-dark_skin_tone": "๐Ÿ––๐Ÿพ", + "vulcan_salute_medium-light_skin_tone": "๐Ÿ––๐Ÿผ", + "vulcan_salute_medium_skin_tone": "๐Ÿ––๐Ÿฝ", + "waffle": "๐Ÿง‡", + "waning_crescent_moon": "๐ŸŒ˜", + "waning_gibbous_moon": "๐ŸŒ–", + "warning": "โš ", + "wastebasket": "๐Ÿ—‘", + "watch": "โŒš", + "water_buffalo": "๐Ÿƒ", + "water_closet": "๐Ÿšพ", + "water_pistol": "๐Ÿ”ซ", + "water_wave": "๐ŸŒŠ", + "watermelon": "๐Ÿ‰", + "waving_hand": "๐Ÿ‘‹", + "waving_hand_dark_skin_tone": "๐Ÿ‘‹๐Ÿฟ", + "waving_hand_light_skin_tone": "๐Ÿ‘‹๐Ÿป", + "waving_hand_medium-dark_skin_tone": "๐Ÿ‘‹๐Ÿพ", + "waving_hand_medium-light_skin_tone": "๐Ÿ‘‹๐Ÿผ", + "waving_hand_medium_skin_tone": "๐Ÿ‘‹๐Ÿฝ", + "wavy_dash": "ใ€ฐ", + "waxing_crescent_moon": "๐ŸŒ’", + "waxing_gibbous_moon": "๐ŸŒ”", + "weary_cat": "๐Ÿ™€", + "weary_face": "๐Ÿ˜ฉ", + "wedding": "๐Ÿ’’", + "whale": "๐Ÿ‹", + "wheel": "๐Ÿ›ž", + "wheel_of_dharma": "โ˜ธ", + "wheelchair_symbol": "โ™ฟ", + "white_cane": "๐Ÿฆฏ", + "white_circle": "โšช", + "white_exclamation_mark": "โ•", + "white_flag": "๐Ÿณ", + "white_flower": "๐Ÿ’ฎ", + "white_hair": "๐Ÿฆณ", + "white_heart": "๐Ÿค", + "white_large_square": "โฌœ", + "white_medium-small_square": "โ—ฝ", + "white_medium_square": "โ—ป", + "white_question_mark": "โ”", + "white_small_square": "โ–ซ", + "white_square_button": "๐Ÿ”ณ", + "wilted_flower": "๐Ÿฅ€", + "wind_chime": "๐ŸŽ", + "wind_face": "๐ŸŒฌ", + "window": "๐ŸชŸ", + "wine_glass": "๐Ÿท", + "wing": "๐Ÿชฝ", + "winking_face": "๐Ÿ˜‰", + "winking_face_with_tongue": "๐Ÿ˜œ", + "wireless": "๐Ÿ›œ", + "wolf": "๐Ÿบ", + "woman": "๐Ÿ‘ฉ", + "woman_and_man_holding_hands": "๐Ÿ‘ซ", + "woman_and_man_holding_hands_dark_skin_tone": "๐Ÿ‘ซ๐Ÿฟ", + "woman_and_man_holding_hands_dark_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", + "woman_and_man_holding_hands_dark_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", + "woman_and_man_holding_hands_dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", + "woman_and_man_holding_hands_dark_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", + "woman_and_man_holding_hands_light_skin_tone": "๐Ÿ‘ซ๐Ÿป", + "woman_and_man_holding_hands_light_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", + "woman_and_man_holding_hands_light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", + "woman_and_man_holding_hands_light_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", + "woman_and_man_holding_hands_light_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", + "woman_and_man_holding_hands_medium-dark_skin_tone": "๐Ÿ‘ซ๐Ÿพ", + "woman_and_man_holding_hands_medium-dark_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", + "woman_and_man_holding_hands_medium-dark_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", + "woman_and_man_holding_hands_medium-dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", + "woman_and_man_holding_hands_medium-dark_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", + "woman_and_man_holding_hands_medium-light_skin_tone": "๐Ÿ‘ซ๐Ÿผ", + "woman_and_man_holding_hands_medium-light_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", + "woman_and_man_holding_hands_medium-light_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", + "woman_and_man_holding_hands_medium-light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", + "woman_and_man_holding_hands_medium-light_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฝ", + "woman_and_man_holding_hands_medium_skin_tone": "๐Ÿ‘ซ๐Ÿฝ", + "woman_and_man_holding_hands_medium_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿฟ", + "woman_and_man_holding_hands_medium_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿป", + "woman_and_man_holding_hands_medium_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿพ", + "woman_and_man_holding_hands_medium_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘จ๐Ÿผ", + "woman_artist": "๐Ÿ‘ฉโ€๐ŸŽจ", + "woman_artist_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽจ", + "woman_artist_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽจ", + "woman_artist_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽจ", + "woman_artist_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽจ", + "woman_artist_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽจ", + "woman_astronaut": "๐Ÿ‘ฉโ€๐Ÿš€", + "woman_astronaut_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿš€", + "woman_astronaut_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿš€", + "woman_astronaut_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿš€", + "woman_astronaut_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿš€", + "woman_astronaut_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿš€", + "woman_bald": "๐Ÿ‘ฉโ€๐Ÿฆฒ", + "woman_beard": "๐Ÿง”โ€โ™€", + "woman_biking": "๐Ÿšดโ€โ™€", + "woman_biking_dark_skin_tone": "๐Ÿšด๐Ÿฟโ€โ™€", + "woman_biking_light_skin_tone": "๐Ÿšด๐Ÿปโ€โ™€", + "woman_biking_medium-dark_skin_tone": "๐Ÿšด๐Ÿพโ€โ™€", + "woman_biking_medium-light_skin_tone": "๐Ÿšด๐Ÿผโ€โ™€", + "woman_biking_medium_skin_tone": "๐Ÿšด๐Ÿฝโ€โ™€", + "woman_blond_hair": "๐Ÿ‘ฑโ€โ™€", + "woman_bouncing_ball": "โ›นโ€โ™€", + "woman_bouncing_ball_dark_skin_tone": "โ›น๐Ÿฟโ€โ™€", + "woman_bouncing_ball_light_skin_tone": "โ›น๐Ÿปโ€โ™€", + "woman_bouncing_ball_medium-dark_skin_tone": "โ›น๐Ÿพโ€โ™€", + "woman_bouncing_ball_medium-light_skin_tone": "โ›น๐Ÿผโ€โ™€", + "woman_bouncing_ball_medium_skin_tone": "โ›น๐Ÿฝโ€โ™€", + "woman_bowing": "๐Ÿ™‡โ€โ™€", + "woman_bowing_dark_skin_tone": "๐Ÿ™‡๐Ÿฟโ€โ™€", + "woman_bowing_light_skin_tone": "๐Ÿ™‡๐Ÿปโ€โ™€", + "woman_bowing_medium-dark_skin_tone": "๐Ÿ™‡๐Ÿพโ€โ™€", + "woman_bowing_medium-light_skin_tone": "๐Ÿ™‡๐Ÿผโ€โ™€", + "woman_bowing_medium_skin_tone": "๐Ÿ™‡๐Ÿฝโ€โ™€", + "woman_cartwheeling": "๐Ÿคธโ€โ™€", + "woman_cartwheeling_dark_skin_tone": "๐Ÿคธ๐Ÿฟโ€โ™€", + "woman_cartwheeling_light_skin_tone": "๐Ÿคธ๐Ÿปโ€โ™€", + "woman_cartwheeling_medium-dark_skin_tone": "๐Ÿคธ๐Ÿพโ€โ™€", + "woman_cartwheeling_medium-light_skin_tone": "๐Ÿคธ๐Ÿผโ€โ™€", + "woman_cartwheeling_medium_skin_tone": "๐Ÿคธ๐Ÿฝโ€โ™€", + "woman_climbing": "๐Ÿง—โ€โ™€", + "woman_climbing_dark_skin_tone": "๐Ÿง—๐Ÿฟโ€โ™€", + "woman_climbing_light_skin_tone": "๐Ÿง—๐Ÿปโ€โ™€", + "woman_climbing_medium-dark_skin_tone": "๐Ÿง—๐Ÿพโ€โ™€", + "woman_climbing_medium-light_skin_tone": "๐Ÿง—๐Ÿผโ€โ™€", + "woman_climbing_medium_skin_tone": "๐Ÿง—๐Ÿฝโ€โ™€", + "woman_construction_worker": "๐Ÿ‘ทโ€โ™€", + "woman_construction_worker_dark_skin_tone": "๐Ÿ‘ท๐Ÿฟโ€โ™€", + "woman_construction_worker_light_skin_tone": "๐Ÿ‘ท๐Ÿปโ€โ™€", + "woman_construction_worker_medium-dark_skin_tone": "๐Ÿ‘ท๐Ÿพโ€โ™€", + "woman_construction_worker_medium-light_skin_tone": "๐Ÿ‘ท๐Ÿผโ€โ™€", + "woman_construction_worker_medium_skin_tone": "๐Ÿ‘ท๐Ÿฝโ€โ™€", + "woman_cook": "๐Ÿ‘ฉโ€๐Ÿณ", + "woman_cook_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿณ", + "woman_cook_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿณ", + "woman_cook_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿณ", + "woman_cook_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿณ", + "woman_cook_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿณ", + "woman_curly_hair": "๐Ÿ‘ฉโ€๐Ÿฆฑ", + "woman_dancing": "๐Ÿ’ƒ", + "woman_dancing_dark_skin_tone": "๐Ÿ’ƒ๐Ÿฟ", + "woman_dancing_light_skin_tone": "๐Ÿ’ƒ๐Ÿป", + "woman_dancing_medium-dark_skin_tone": "๐Ÿ’ƒ๐Ÿพ", + "woman_dancing_medium-light_skin_tone": "๐Ÿ’ƒ๐Ÿผ", + "woman_dancing_medium_skin_tone": "๐Ÿ’ƒ๐Ÿฝ", + "woman_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟ", + "woman_dark_skin_tone_bald": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฒ", + "woman_dark_skin_tone_beard": "๐Ÿง”๐Ÿฟโ€โ™€", + "woman_dark_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿฟโ€โ™€", + "woman_dark_skin_tone_curly_hair": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฑ", + "woman_dark_skin_tone_red_hair": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฐ", + "woman_dark_skin_tone_white_hair": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆณ", + "woman_detective": "๐Ÿ•ตโ€โ™€", + "woman_detective_dark_skin_tone": "๐Ÿ•ต๐Ÿฟโ€โ™€", + "woman_detective_light_skin_tone": "๐Ÿ•ต๐Ÿปโ€โ™€", + "woman_detective_medium-dark_skin_tone": "๐Ÿ•ต๐Ÿพโ€โ™€", + "woman_detective_medium-light_skin_tone": "๐Ÿ•ต๐Ÿผโ€โ™€", + "woman_detective_medium_skin_tone": "๐Ÿ•ต๐Ÿฝโ€โ™€", + "woman_elf": "๐Ÿงโ€โ™€", + "woman_elf_dark_skin_tone": "๐Ÿง๐Ÿฟโ€โ™€", + "woman_elf_light_skin_tone": "๐Ÿง๐Ÿปโ€โ™€", + "woman_elf_medium-dark_skin_tone": "๐Ÿง๐Ÿพโ€โ™€", + "woman_elf_medium-light_skin_tone": "๐Ÿง๐Ÿผโ€โ™€", + "woman_elf_medium_skin_tone": "๐Ÿง๐Ÿฝโ€โ™€", + "woman_facepalming": "๐Ÿคฆโ€โ™€", + "woman_facepalming_dark_skin_tone": "๐Ÿคฆ๐Ÿฟโ€โ™€", + "woman_facepalming_light_skin_tone": "๐Ÿคฆ๐Ÿปโ€โ™€", + "woman_facepalming_medium-dark_skin_tone": "๐Ÿคฆ๐Ÿพโ€โ™€", + "woman_facepalming_medium-light_skin_tone": "๐Ÿคฆ๐Ÿผโ€โ™€", + "woman_facepalming_medium_skin_tone": "๐Ÿคฆ๐Ÿฝโ€โ™€", + "woman_factory_worker": "๐Ÿ‘ฉโ€๐Ÿญ", + "woman_factory_worker_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿญ", + "woman_factory_worker_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿญ", + "woman_factory_worker_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿญ", + "woman_factory_worker_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿญ", + "woman_factory_worker_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿญ", + "woman_fairy": "๐Ÿงšโ€โ™€", + "woman_fairy_dark_skin_tone": "๐Ÿงš๐Ÿฟโ€โ™€", + "woman_fairy_light_skin_tone": "๐Ÿงš๐Ÿปโ€โ™€", + "woman_fairy_medium-dark_skin_tone": "๐Ÿงš๐Ÿพโ€โ™€", + "woman_fairy_medium-light_skin_tone": "๐Ÿงš๐Ÿผโ€โ™€", + "woman_fairy_medium_skin_tone": "๐Ÿงš๐Ÿฝโ€โ™€", + "woman_farmer": "๐Ÿ‘ฉโ€๐ŸŒพ", + "woman_farmer_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŒพ", + "woman_farmer_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐ŸŒพ", + "woman_farmer_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐ŸŒพ", + "woman_farmer_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐ŸŒพ", + "woman_farmer_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŒพ", + "woman_feeding_baby": "๐Ÿ‘ฉโ€๐Ÿผ", + "woman_feeding_baby_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿผ", + "woman_feeding_baby_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿผ", + "woman_feeding_baby_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿผ", + "woman_feeding_baby_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿผ", + "woman_feeding_baby_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿผ", + "woman_firefighter": "๐Ÿ‘ฉโ€๐Ÿš’", + "woman_firefighter_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿš’", + "woman_firefighter_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿš’", + "woman_firefighter_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿš’", + "woman_firefighter_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿš’", + "woman_firefighter_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿš’", + "woman_frowning": "๐Ÿ™โ€โ™€", + "woman_frowning_dark_skin_tone": "๐Ÿ™๐Ÿฟโ€โ™€", + "woman_frowning_light_skin_tone": "๐Ÿ™๐Ÿปโ€โ™€", + "woman_frowning_medium-dark_skin_tone": "๐Ÿ™๐Ÿพโ€โ™€", + "woman_frowning_medium-light_skin_tone": "๐Ÿ™๐Ÿผโ€โ™€", + "woman_frowning_medium_skin_tone": "๐Ÿ™๐Ÿฝโ€โ™€", + "woman_genie": "๐Ÿงžโ€โ™€", + "woman_gesturing_NO": "๐Ÿ™…โ€โ™€", + "woman_gesturing_NO_dark_skin_tone": "๐Ÿ™…๐Ÿฟโ€โ™€", + "woman_gesturing_NO_light_skin_tone": "๐Ÿ™…๐Ÿปโ€โ™€", + "woman_gesturing_NO_medium-dark_skin_tone": "๐Ÿ™…๐Ÿพโ€โ™€", + "woman_gesturing_NO_medium-light_skin_tone": "๐Ÿ™…๐Ÿผโ€โ™€", + "woman_gesturing_NO_medium_skin_tone": "๐Ÿ™…๐Ÿฝโ€โ™€", + "woman_gesturing_OK": "๐Ÿ™†โ€โ™€", + "woman_gesturing_OK_dark_skin_tone": "๐Ÿ™†๐Ÿฟโ€โ™€", + "woman_gesturing_OK_light_skin_tone": "๐Ÿ™†๐Ÿปโ€โ™€", + "woman_gesturing_OK_medium-dark_skin_tone": "๐Ÿ™†๐Ÿพโ€โ™€", + "woman_gesturing_OK_medium-light_skin_tone": "๐Ÿ™†๐Ÿผโ€โ™€", + "woman_gesturing_OK_medium_skin_tone": "๐Ÿ™†๐Ÿฝโ€โ™€", + "woman_getting_haircut": "๐Ÿ’‡โ€โ™€", + "woman_getting_haircut_dark_skin_tone": "๐Ÿ’‡๐Ÿฟโ€โ™€", + "woman_getting_haircut_light_skin_tone": "๐Ÿ’‡๐Ÿปโ€โ™€", + "woman_getting_haircut_medium-dark_skin_tone": "๐Ÿ’‡๐Ÿพโ€โ™€", + "woman_getting_haircut_medium-light_skin_tone": "๐Ÿ’‡๐Ÿผโ€โ™€", + "woman_getting_haircut_medium_skin_tone": "๐Ÿ’‡๐Ÿฝโ€โ™€", + "woman_getting_massage": "๐Ÿ’†โ€โ™€", + "woman_getting_massage_dark_skin_tone": "๐Ÿ’†๐Ÿฟโ€โ™€", + "woman_getting_massage_light_skin_tone": "๐Ÿ’†๐Ÿปโ€โ™€", + "woman_getting_massage_medium-dark_skin_tone": "๐Ÿ’†๐Ÿพโ€โ™€", + "woman_getting_massage_medium-light_skin_tone": "๐Ÿ’†๐Ÿผโ€โ™€", + "woman_getting_massage_medium_skin_tone": "๐Ÿ’†๐Ÿฝโ€โ™€", + "woman_golfing": "๐ŸŒโ€โ™€", + "woman_golfing_dark_skin_tone": "๐ŸŒ๐Ÿฟโ€โ™€", + "woman_golfing_light_skin_tone": "๐ŸŒ๐Ÿปโ€โ™€", + "woman_golfing_medium-dark_skin_tone": "๐ŸŒ๐Ÿพโ€โ™€", + "woman_golfing_medium-light_skin_tone": "๐ŸŒ๐Ÿผโ€โ™€", + "woman_golfing_medium_skin_tone": "๐ŸŒ๐Ÿฝโ€โ™€", + "woman_guard": "๐Ÿ’‚โ€โ™€", + "woman_guard_dark_skin_tone": "๐Ÿ’‚๐Ÿฟโ€โ™€", + "woman_guard_light_skin_tone": "๐Ÿ’‚๐Ÿปโ€โ™€", + "woman_guard_medium-dark_skin_tone": "๐Ÿ’‚๐Ÿพโ€โ™€", + "woman_guard_medium-light_skin_tone": "๐Ÿ’‚๐Ÿผโ€โ™€", + "woman_guard_medium_skin_tone": "๐Ÿ’‚๐Ÿฝโ€โ™€", + "woman_health_worker": "๐Ÿ‘ฉโ€โš•", + "woman_health_worker_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โš•", + "woman_health_worker_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โš•", + "woman_health_worker_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โš•", + "woman_health_worker_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โš•", + "woman_health_worker_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โš•", + "woman_in_lotus_position": "๐Ÿง˜โ€โ™€", + "woman_in_lotus_position_dark_skin_tone": "๐Ÿง˜๐Ÿฟโ€โ™€", + "woman_in_lotus_position_light_skin_tone": "๐Ÿง˜๐Ÿปโ€โ™€", + "woman_in_lotus_position_medium-dark_skin_tone": "๐Ÿง˜๐Ÿพโ€โ™€", + "woman_in_lotus_position_medium-light_skin_tone": "๐Ÿง˜๐Ÿผโ€โ™€", + "woman_in_lotus_position_medium_skin_tone": "๐Ÿง˜๐Ÿฝโ€โ™€", + "woman_in_manual_wheelchair": "๐Ÿ‘ฉโ€๐Ÿฆฝ", + "woman_in_manual_wheelchair_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฝ", + "woman_in_manual_wheelchair_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฝ", + "woman_in_manual_wheelchair_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฝ", + "woman_in_manual_wheelchair_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฝ", + "woman_in_manual_wheelchair_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฝ", + "woman_in_motorized_wheelchair": "๐Ÿ‘ฉโ€๐Ÿฆผ", + "woman_in_motorized_wheelchair_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆผ", + "woman_in_motorized_wheelchair_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆผ", + "woman_in_motorized_wheelchair_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆผ", + "woman_in_motorized_wheelchair_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆผ", + "woman_in_motorized_wheelchair_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆผ", + "woman_in_steamy_room": "๐Ÿง–โ€โ™€", + "woman_in_steamy_room_dark_skin_tone": "๐Ÿง–๐Ÿฟโ€โ™€", + "woman_in_steamy_room_light_skin_tone": "๐Ÿง–๐Ÿปโ€โ™€", + "woman_in_steamy_room_medium-dark_skin_tone": "๐Ÿง–๐Ÿพโ€โ™€", + "woman_in_steamy_room_medium-light_skin_tone": "๐Ÿง–๐Ÿผโ€โ™€", + "woman_in_steamy_room_medium_skin_tone": "๐Ÿง–๐Ÿฝโ€โ™€", + "woman_in_tuxedo": "๐Ÿคตโ€โ™€", + "woman_in_tuxedo_dark_skin_tone": "๐Ÿคต๐Ÿฟโ€โ™€", + "woman_in_tuxedo_light_skin_tone": "๐Ÿคต๐Ÿปโ€โ™€", + "woman_in_tuxedo_medium-dark_skin_tone": "๐Ÿคต๐Ÿพโ€โ™€", + "woman_in_tuxedo_medium-light_skin_tone": "๐Ÿคต๐Ÿผโ€โ™€", + "woman_in_tuxedo_medium_skin_tone": "๐Ÿคต๐Ÿฝโ€โ™€", + "woman_judge": "๐Ÿ‘ฉโ€โš–", + "woman_judge_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โš–", + "woman_judge_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โš–", + "woman_judge_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โš–", + "woman_judge_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โš–", + "woman_judge_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โš–", + "woman_juggling": "๐Ÿคนโ€โ™€", + "woman_juggling_dark_skin_tone": "๐Ÿคน๐Ÿฟโ€โ™€", + "woman_juggling_light_skin_tone": "๐Ÿคน๐Ÿปโ€โ™€", + "woman_juggling_medium-dark_skin_tone": "๐Ÿคน๐Ÿพโ€โ™€", + "woman_juggling_medium-light_skin_tone": "๐Ÿคน๐Ÿผโ€โ™€", + "woman_juggling_medium_skin_tone": "๐Ÿคน๐Ÿฝโ€โ™€", + "woman_kneeling": "๐ŸงŽโ€โ™€", + "woman_kneeling_dark_skin_tone": "๐ŸงŽ๐Ÿฟโ€โ™€", + "woman_kneeling_light_skin_tone": "๐ŸงŽ๐Ÿปโ€โ™€", + "woman_kneeling_medium-dark_skin_tone": "๐ŸงŽ๐Ÿพโ€โ™€", + "woman_kneeling_medium-light_skin_tone": "๐ŸงŽ๐Ÿผโ€โ™€", + "woman_kneeling_medium_skin_tone": "๐ŸงŽ๐Ÿฝโ€โ™€", + "woman_lifting_weights": "๐Ÿ‹โ€โ™€", + "woman_lifting_weights_dark_skin_tone": "๐Ÿ‹๐Ÿฟโ€โ™€", + "woman_lifting_weights_light_skin_tone": "๐Ÿ‹๐Ÿปโ€โ™€", + "woman_lifting_weights_medium-dark_skin_tone": "๐Ÿ‹๐Ÿพโ€โ™€", + "woman_lifting_weights_medium-light_skin_tone": "๐Ÿ‹๐Ÿผโ€โ™€", + "woman_lifting_weights_medium_skin_tone": "๐Ÿ‹๐Ÿฝโ€โ™€", + "woman_light_skin_tone": "๐Ÿ‘ฉ๐Ÿป", + "woman_light_skin_tone_bald": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฒ", + "woman_light_skin_tone_beard": "๐Ÿง”๐Ÿปโ€โ™€", + "woman_light_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿปโ€โ™€", + "woman_light_skin_tone_curly_hair": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฑ", + "woman_light_skin_tone_red_hair": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฐ", + "woman_light_skin_tone_white_hair": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆณ", + "woman_mage": "๐Ÿง™โ€โ™€", + "woman_mage_dark_skin_tone": "๐Ÿง™๐Ÿฟโ€โ™€", + "woman_mage_light_skin_tone": "๐Ÿง™๐Ÿปโ€โ™€", + "woman_mage_medium-dark_skin_tone": "๐Ÿง™๐Ÿพโ€โ™€", + "woman_mage_medium-light_skin_tone": "๐Ÿง™๐Ÿผโ€โ™€", + "woman_mage_medium_skin_tone": "๐Ÿง™๐Ÿฝโ€โ™€", + "woman_mechanic": "๐Ÿ‘ฉโ€๐Ÿ”ง", + "woman_mechanic_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ”ง", + "woman_mechanic_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ”ง", + "woman_mechanic_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ”ง", + "woman_mechanic_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ”ง", + "woman_mechanic_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ”ง", + "woman_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพ", + "woman_medium-dark_skin_tone_bald": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฒ", + "woman_medium-dark_skin_tone_beard": "๐Ÿง”๐Ÿพโ€โ™€", + "woman_medium-dark_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿพโ€โ™€", + "woman_medium-dark_skin_tone_curly_hair": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฑ", + "woman_medium-dark_skin_tone_red_hair": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฐ", + "woman_medium-dark_skin_tone_white_hair": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆณ", + "woman_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผ", + "woman_medium-light_skin_tone_bald": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฒ", + "woman_medium-light_skin_tone_beard": "๐Ÿง”๐Ÿผโ€โ™€", + "woman_medium-light_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿผโ€โ™€", + "woman_medium-light_skin_tone_curly_hair": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฑ", + "woman_medium-light_skin_tone_red_hair": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฐ", + "woman_medium-light_skin_tone_white_hair": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆณ", + "woman_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝ", + "woman_medium_skin_tone_bald": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฒ", + "woman_medium_skin_tone_beard": "๐Ÿง”๐Ÿฝโ€โ™€", + "woman_medium_skin_tone_blond_hair": "๐Ÿ‘ฑ๐Ÿฝโ€โ™€", + "woman_medium_skin_tone_curly_hair": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฑ", + "woman_medium_skin_tone_red_hair": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฐ", + "woman_medium_skin_tone_white_hair": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆณ", + "woman_mountain_biking": "๐Ÿšตโ€โ™€", + "woman_mountain_biking_dark_skin_tone": "๐Ÿšต๐Ÿฟโ€โ™€", + "woman_mountain_biking_light_skin_tone": "๐Ÿšต๐Ÿปโ€โ™€", + "woman_mountain_biking_medium-dark_skin_tone": "๐Ÿšต๐Ÿพโ€โ™€", + "woman_mountain_biking_medium-light_skin_tone": "๐Ÿšต๐Ÿผโ€โ™€", + "woman_mountain_biking_medium_skin_tone": "๐Ÿšต๐Ÿฝโ€โ™€", + "woman_office_worker": "๐Ÿ‘ฉโ€๐Ÿ’ผ", + "woman_office_worker_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ผ", + "woman_office_worker_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ผ", + "woman_office_worker_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ’ผ", + "woman_office_worker_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ’ผ", + "woman_office_worker_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ผ", + "woman_pilot": "๐Ÿ‘ฉโ€โœˆ", + "woman_pilot_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€โœˆ", + "woman_pilot_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€โœˆ", + "woman_pilot_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€โœˆ", + "woman_pilot_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€โœˆ", + "woman_pilot_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€โœˆ", + "woman_playing_handball": "๐Ÿคพโ€โ™€", + "woman_playing_handball_dark_skin_tone": "๐Ÿคพ๐Ÿฟโ€โ™€", + "woman_playing_handball_light_skin_tone": "๐Ÿคพ๐Ÿปโ€โ™€", + "woman_playing_handball_medium-dark_skin_tone": "๐Ÿคพ๐Ÿพโ€โ™€", + "woman_playing_handball_medium-light_skin_tone": "๐Ÿคพ๐Ÿผโ€โ™€", + "woman_playing_handball_medium_skin_tone": "๐Ÿคพ๐Ÿฝโ€โ™€", + "woman_playing_water_polo": "๐Ÿคฝโ€โ™€", + "woman_playing_water_polo_dark_skin_tone": "๐Ÿคฝ๐Ÿฟโ€โ™€", + "woman_playing_water_polo_light_skin_tone": "๐Ÿคฝ๐Ÿปโ€โ™€", + "woman_playing_water_polo_medium-dark_skin_tone": "๐Ÿคฝ๐Ÿพโ€โ™€", + "woman_playing_water_polo_medium-light_skin_tone": "๐Ÿคฝ๐Ÿผโ€โ™€", + "woman_playing_water_polo_medium_skin_tone": "๐Ÿคฝ๐Ÿฝโ€โ™€", + "woman_police_officer": "๐Ÿ‘ฎโ€โ™€", + "woman_police_officer_dark_skin_tone": "๐Ÿ‘ฎ๐Ÿฟโ€โ™€", + "woman_police_officer_light_skin_tone": "๐Ÿ‘ฎ๐Ÿปโ€โ™€", + "woman_police_officer_medium-dark_skin_tone": "๐Ÿ‘ฎ๐Ÿพโ€โ™€", + "woman_police_officer_medium-light_skin_tone": "๐Ÿ‘ฎ๐Ÿผโ€โ™€", + "woman_police_officer_medium_skin_tone": "๐Ÿ‘ฎ๐Ÿฝโ€โ™€", + "woman_pouting": "๐Ÿ™Žโ€โ™€", + "woman_pouting_dark_skin_tone": "๐Ÿ™Ž๐Ÿฟโ€โ™€", + "woman_pouting_light_skin_tone": "๐Ÿ™Ž๐Ÿปโ€โ™€", + "woman_pouting_medium-dark_skin_tone": "๐Ÿ™Ž๐Ÿพโ€โ™€", + "woman_pouting_medium-light_skin_tone": "๐Ÿ™Ž๐Ÿผโ€โ™€", + "woman_pouting_medium_skin_tone": "๐Ÿ™Ž๐Ÿฝโ€โ™€", + "woman_raising_hand": "๐Ÿ™‹โ€โ™€", + "woman_raising_hand_dark_skin_tone": "๐Ÿ™‹๐Ÿฟโ€โ™€", + "woman_raising_hand_light_skin_tone": "๐Ÿ™‹๐Ÿปโ€โ™€", + "woman_raising_hand_medium-dark_skin_tone": "๐Ÿ™‹๐Ÿพโ€โ™€", + "woman_raising_hand_medium-light_skin_tone": "๐Ÿ™‹๐Ÿผโ€โ™€", + "woman_raising_hand_medium_skin_tone": "๐Ÿ™‹๐Ÿฝโ€โ™€", + "woman_red_hair": "๐Ÿ‘ฉโ€๐Ÿฆฐ", + "woman_rowing_boat": "๐Ÿšฃโ€โ™€", + "woman_rowing_boat_dark_skin_tone": "๐Ÿšฃ๐Ÿฟโ€โ™€", + "woman_rowing_boat_light_skin_tone": "๐Ÿšฃ๐Ÿปโ€โ™€", + "woman_rowing_boat_medium-dark_skin_tone": "๐Ÿšฃ๐Ÿพโ€โ™€", + "woman_rowing_boat_medium-light_skin_tone": "๐Ÿšฃ๐Ÿผโ€โ™€", + "woman_rowing_boat_medium_skin_tone": "๐Ÿšฃ๐Ÿฝโ€โ™€", + "woman_running": "๐Ÿƒโ€โ™€", + "woman_running_dark_skin_tone": "๐Ÿƒ๐Ÿฟโ€โ™€", + "woman_running_light_skin_tone": "๐Ÿƒ๐Ÿปโ€โ™€", + "woman_running_medium-dark_skin_tone": "๐Ÿƒ๐Ÿพโ€โ™€", + "woman_running_medium-light_skin_tone": "๐Ÿƒ๐Ÿผโ€โ™€", + "woman_running_medium_skin_tone": "๐Ÿƒ๐Ÿฝโ€โ™€", + "woman_scientist": "๐Ÿ‘ฉโ€๐Ÿ”ฌ", + "woman_scientist_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ”ฌ", + "woman_scientist_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ”ฌ", + "woman_scientist_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ”ฌ", + "woman_scientist_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ”ฌ", + "woman_scientist_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ”ฌ", + "woman_shrugging": "๐Ÿคทโ€โ™€", + "woman_shrugging_dark_skin_tone": "๐Ÿคท๐Ÿฟโ€โ™€", + "woman_shrugging_light_skin_tone": "๐Ÿคท๐Ÿปโ€โ™€", + "woman_shrugging_medium-dark_skin_tone": "๐Ÿคท๐Ÿพโ€โ™€", + "woman_shrugging_medium-light_skin_tone": "๐Ÿคท๐Ÿผโ€โ™€", + "woman_shrugging_medium_skin_tone": "๐Ÿคท๐Ÿฝโ€โ™€", + "woman_singer": "๐Ÿ‘ฉโ€๐ŸŽค", + "woman_singer_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽค", + "woman_singer_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽค", + "woman_singer_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽค", + "woman_singer_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽค", + "woman_singer_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽค", + "woman_standing": "๐Ÿงโ€โ™€", + "woman_standing_dark_skin_tone": "๐Ÿง๐Ÿฟโ€โ™€", + "woman_standing_light_skin_tone": "๐Ÿง๐Ÿปโ€โ™€", + "woman_standing_medium-dark_skin_tone": "๐Ÿง๐Ÿพโ€โ™€", + "woman_standing_medium-light_skin_tone": "๐Ÿง๐Ÿผโ€โ™€", + "woman_standing_medium_skin_tone": "๐Ÿง๐Ÿฝโ€โ™€", + "woman_student": "๐Ÿ‘ฉโ€๐ŸŽ“", + "woman_student_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐ŸŽ“", + "woman_student_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐ŸŽ“", + "woman_student_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐ŸŽ“", + "woman_student_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐ŸŽ“", + "woman_student_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐ŸŽ“", + "woman_superhero": "๐Ÿฆธโ€โ™€", + "woman_superhero_dark_skin_tone": "๐Ÿฆธ๐Ÿฟโ€โ™€", + "woman_superhero_light_skin_tone": "๐Ÿฆธ๐Ÿปโ€โ™€", + "woman_superhero_medium-dark_skin_tone": "๐Ÿฆธ๐Ÿพโ€โ™€", + "woman_superhero_medium-light_skin_tone": "๐Ÿฆธ๐Ÿผโ€โ™€", + "woman_superhero_medium_skin_tone": "๐Ÿฆธ๐Ÿฝโ€โ™€", + "woman_supervillain": "๐Ÿฆนโ€โ™€", + "woman_supervillain_dark_skin_tone": "๐Ÿฆน๐Ÿฟโ€โ™€", + "woman_supervillain_light_skin_tone": "๐Ÿฆน๐Ÿปโ€โ™€", + "woman_supervillain_medium-dark_skin_tone": "๐Ÿฆน๐Ÿพโ€โ™€", + "woman_supervillain_medium-light_skin_tone": "๐Ÿฆน๐Ÿผโ€โ™€", + "woman_supervillain_medium_skin_tone": "๐Ÿฆน๐Ÿฝโ€โ™€", + "woman_surfing": "๐Ÿ„โ€โ™€", + "woman_surfing_dark_skin_tone": "๐Ÿ„๐Ÿฟโ€โ™€", + "woman_surfing_light_skin_tone": "๐Ÿ„๐Ÿปโ€โ™€", + "woman_surfing_medium-dark_skin_tone": "๐Ÿ„๐Ÿพโ€โ™€", + "woman_surfing_medium-light_skin_tone": "๐Ÿ„๐Ÿผโ€โ™€", + "woman_surfing_medium_skin_tone": "๐Ÿ„๐Ÿฝโ€โ™€", + "woman_swimming": "๐ŸŠโ€โ™€", + "woman_swimming_dark_skin_tone": "๐ŸŠ๐Ÿฟโ€โ™€", + "woman_swimming_light_skin_tone": "๐ŸŠ๐Ÿปโ€โ™€", + "woman_swimming_medium-dark_skin_tone": "๐ŸŠ๐Ÿพโ€โ™€", + "woman_swimming_medium-light_skin_tone": "๐ŸŠ๐Ÿผโ€โ™€", + "woman_swimming_medium_skin_tone": "๐ŸŠ๐Ÿฝโ€โ™€", + "woman_teacher": "๐Ÿ‘ฉโ€๐Ÿซ", + "woman_teacher_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿซ", + "woman_teacher_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿซ", + "woman_teacher_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿซ", + "woman_teacher_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿซ", + "woman_teacher_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿซ", + "woman_technologist": "๐Ÿ‘ฉโ€๐Ÿ’ป", + "woman_technologist_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿ’ป", + "woman_technologist_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป", + "woman_technologist_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿ’ป", + "woman_technologist_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿ’ป", + "woman_technologist_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿ’ป", + "woman_tipping_hand": "๐Ÿ’โ€โ™€", + "woman_tipping_hand_dark_skin_tone": "๐Ÿ’๐Ÿฟโ€โ™€", + "woman_tipping_hand_light_skin_tone": "๐Ÿ’๐Ÿปโ€โ™€", + "woman_tipping_hand_medium-dark_skin_tone": "๐Ÿ’๐Ÿพโ€โ™€", + "woman_tipping_hand_medium-light_skin_tone": "๐Ÿ’๐Ÿผโ€โ™€", + "woman_tipping_hand_medium_skin_tone": "๐Ÿ’๐Ÿฝโ€โ™€", + "woman_vampire": "๐Ÿง›โ€โ™€", + "woman_vampire_dark_skin_tone": "๐Ÿง›๐Ÿฟโ€โ™€", + "woman_vampire_light_skin_tone": "๐Ÿง›๐Ÿปโ€โ™€", + "woman_vampire_medium-dark_skin_tone": "๐Ÿง›๐Ÿพโ€โ™€", + "woman_vampire_medium-light_skin_tone": "๐Ÿง›๐Ÿผโ€โ™€", + "woman_vampire_medium_skin_tone": "๐Ÿง›๐Ÿฝโ€โ™€", + "woman_walking": "๐Ÿšถโ€โ™€", + "woman_walking_dark_skin_tone": "๐Ÿšถ๐Ÿฟโ€โ™€", + "woman_walking_light_skin_tone": "๐Ÿšถ๐Ÿปโ€โ™€", + "woman_walking_medium-dark_skin_tone": "๐Ÿšถ๐Ÿพโ€โ™€", + "woman_walking_medium-light_skin_tone": "๐Ÿšถ๐Ÿผโ€โ™€", + "woman_walking_medium_skin_tone": "๐Ÿšถ๐Ÿฝโ€โ™€", + "woman_wearing_turban": "๐Ÿ‘ณโ€โ™€", + "woman_wearing_turban_dark_skin_tone": "๐Ÿ‘ณ๐Ÿฟโ€โ™€", + "woman_wearing_turban_light_skin_tone": "๐Ÿ‘ณ๐Ÿปโ€โ™€", + "woman_wearing_turban_medium-dark_skin_tone": "๐Ÿ‘ณ๐Ÿพโ€โ™€", + "woman_wearing_turban_medium-light_skin_tone": "๐Ÿ‘ณ๐Ÿผโ€โ™€", + "woman_wearing_turban_medium_skin_tone": "๐Ÿ‘ณ๐Ÿฝโ€โ™€", + "woman_white_hair": "๐Ÿ‘ฉโ€๐Ÿฆณ", + "woman_with_headscarf": "๐Ÿง•", + "woman_with_headscarf_dark_skin_tone": "๐Ÿง•๐Ÿฟ", + "woman_with_headscarf_light_skin_tone": "๐Ÿง•๐Ÿป", + "woman_with_headscarf_medium-dark_skin_tone": "๐Ÿง•๐Ÿพ", + "woman_with_headscarf_medium-light_skin_tone": "๐Ÿง•๐Ÿผ", + "woman_with_headscarf_medium_skin_tone": "๐Ÿง•๐Ÿฝ", + "woman_with_veil": "๐Ÿ‘ฐโ€โ™€", + "woman_with_veil_dark_skin_tone": "๐Ÿ‘ฐ๐Ÿฟโ€โ™€", + "woman_with_veil_light_skin_tone": "๐Ÿ‘ฐ๐Ÿปโ€โ™€", + "woman_with_veil_medium-dark_skin_tone": "๐Ÿ‘ฐ๐Ÿพโ€โ™€", + "woman_with_veil_medium-light_skin_tone": "๐Ÿ‘ฐ๐Ÿผโ€โ™€", + "woman_with_veil_medium_skin_tone": "๐Ÿ‘ฐ๐Ÿฝโ€โ™€", + "woman_with_white_cane": "๐Ÿ‘ฉโ€๐Ÿฆฏ", + "woman_with_white_cane_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿฆฏ", + "woman_with_white_cane_light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿฆฏ", + "woman_with_white_cane_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿฆฏ", + "woman_with_white_cane_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿฆฏ", + "woman_with_white_cane_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿฆฏ", + "woman_zombie": "๐ŸงŸโ€โ™€", + "womanโ€™s_boot": "๐Ÿ‘ข", + "womanโ€™s_clothes": "๐Ÿ‘š", + "womanโ€™s_hat": "๐Ÿ‘’", + "womanโ€™s_sandal": "๐Ÿ‘ก", + "women_holding_hands": "๐Ÿ‘ญ", + "women_holding_hands_dark_skin_tone": "๐Ÿ‘ญ๐Ÿฟ", + "women_holding_hands_dark_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป", + "women_holding_hands_dark_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ", + "women_holding_hands_dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ", + "women_holding_hands_dark_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿฟโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ", + "women_holding_hands_light_skin_tone": "๐Ÿ‘ญ๐Ÿป", + "women_holding_hands_light_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ", + "women_holding_hands_light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ", + "women_holding_hands_light_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ", + "women_holding_hands_light_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿปโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ", + "women_holding_hands_medium-dark_skin_tone": "๐Ÿ‘ญ๐Ÿพ", + "women_holding_hands_medium-dark_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ", + "women_holding_hands_medium-dark_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป", + "women_holding_hands_medium-dark_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ", + "women_holding_hands_medium-dark_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿพโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ", + "women_holding_hands_medium-light_skin_tone": "๐Ÿ‘ญ๐Ÿผ", + "women_holding_hands_medium-light_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ", + "women_holding_hands_medium-light_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป", + "women_holding_hands_medium-light_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ", + "women_holding_hands_medium-light_skin_tone_medium_skin_tone": "๐Ÿ‘ฉ๐Ÿผโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฝ", + "women_holding_hands_medium_skin_tone": "๐Ÿ‘ญ๐Ÿฝ", + "women_holding_hands_medium_skin_tone_dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿฟ", + "women_holding_hands_medium_skin_tone_light_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿป", + "women_holding_hands_medium_skin_tone_medium-dark_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿพ", + "women_holding_hands_medium_skin_tone_medium-light_skin_tone": "๐Ÿ‘ฉ๐Ÿฝโ€๐Ÿคโ€๐Ÿ‘ฉ๐Ÿผ", + "women_with_bunny_ears": "๐Ÿ‘ฏโ€โ™€", + "women_wrestling": "๐Ÿคผโ€โ™€", + "womenโ€™s_room": "๐Ÿšบ", + "wood": "๐Ÿชต", + "woozy_face": "๐Ÿฅด", + "flushed": "๐Ÿฅด", + "world_map": "๐Ÿ—บ", + "worm": "๐Ÿชฑ", + "worried_face": "๐Ÿ˜Ÿ", + "wrapped_gift": "๐ŸŽ", + "wrench": "๐Ÿ”ง", + "writing_hand": "โœ", + "writing_hand_dark_skin_tone": "โœ๐Ÿฟ", + "writing_hand_light_skin_tone": "โœ๐Ÿป", + "writing_hand_medium-dark_skin_tone": "โœ๐Ÿพ", + "writing_hand_medium-light_skin_tone": "โœ๐Ÿผ", + "writing_hand_medium_skin_tone": "โœ๐Ÿฝ", + "x-ray": "๐Ÿฉป", + "yarn": "๐Ÿงถ", + "yawning_face": "๐Ÿฅฑ", + "yellow_circle": "๐ŸŸก", + "yellow_heart": "๐Ÿ’›", + "yellow_square": "๐ŸŸจ", + "yen_banknote": "๐Ÿ’ด", + "yin_yang": "โ˜ฏ", + "yo-yo": "๐Ÿช€", + "zany_face": "๐Ÿคช", + "zebra": "๐Ÿฆ“", + "zipper-mouth_face": "๐Ÿค", + "zombie": "๐ŸงŸ", + "ร…land_Islands": "๐Ÿ‡ฆ๐Ÿ‡ฝ", +} diff --git a/guide/content/en/guide/advanced/class-based-views.md b/guide/content/en/guide/advanced/class-based-views.md new file mode 100644 index 00000000..1a3c9683 --- /dev/null +++ b/guide/content/en/guide/advanced/class-based-views.md @@ -0,0 +1,202 @@ +# Class Based Views + +## Why use them? + +.. column:: + + ### The problem + + A common pattern when designing an API is to have multiple functionality on the same endpoint that depends upon the HTTP method. + + While both of these options work, they are not good design practices and may be hard to maintain over time as your project grows. + +.. column:: + + ```python + @app.get("/foo") + async def foo_get(request): + ... + + @app.post("/foo") + async def foo_post(request): + ... + + @app.put("/foo") + async def foo_put(request): + ... + + @app.route("/bar", methods=["GET", "POST", "PATCH"]) + async def bar(request): + if request.method == "GET": + ... + + elif request.method == "POST": + ... + + elif request.method == "PATCH": + ... + ``` + + +.. column:: + + ### The solution + + Class-based views are simply classes that implement response behavior to requests. They provide a way to compartmentalize handling of different HTTP request types at the same endpoint. + +.. column:: + + ```python + from sanic.views import HTTPMethodView + + class FooBar(HTTPMethodView): + async def get(self, request): + ... + + async def post(self, request): + ... + + async def put(self, request): + ... + + app.add_route(FooBar.as_view(), "/foobar") + ``` + +## Defining a view + +A class-based view should subclass `HTTPMethodView`. You can then implement class methods with the name of the corresponding HTTP method. If a request is received that has no defined method, a `405: Method not allowed` response will be generated. + +.. column:: + + To register a class-based view on an endpoint, the `app.add_route` method is used. The first argument should be the defined class with the method `as_view` invoked, and the second should be the URL endpoint. + + The available methods are: + + - get + - post + - put + - patch + - delete + - head + - options + +.. column:: + + ```python + from sanic.views import HTTPMethodView + from sanic.response import text + + class SimpleView(HTTPMethodView): + + def get(self, request): + return text("I am get method") + + # You can also use async syntax + async def post(self, request): + return text("I am post method") + + def put(self, request): + return text("I am put method") + + def patch(self, request): + return text("I am patch method") + + def delete(self, request): + return text("I am delete method") + + app.add_route(SimpleView.as_view(), "/") + ``` + +## Path parameters + +.. column:: + + You can use path parameters exactly as discussed in [the routing section](/guide/basics/routing.md). + +.. column:: + + ```python + class NameView(HTTPMethodView): + + def get(self, request, name): + return text("Hello {}".format(name)) + + app.add_route(NameView.as_view(), "/") + ``` + +## Decorators + +As discussed in [the decorators section](/guide/best-practices/decorators.md), often you will need to add functionality to endpoints with the use of decorators. You have two options with CBV: + +1. Apply to _all_ HTTP methods in the view +2. Apply individually to HTTP methods in the view + +Let's see what the options look like: + +.. column:: + + ### Apply to all methods + + If you want to add any decorators to the class, you can set the `decorators` class variable. These will be applied to the class when `as_view` is called. + +.. column:: + + ```python + class ViewWithDecorator(HTTPMethodView): + decorators = [some_decorator_here] + + def get(self, request, name): + return text("Hello I have a decorator") + + def post(self, request, name): + return text("Hello I also have a decorator") + + app.add_route(ViewWithDecorator.as_view(), "/url") + ``` + + +.. column:: + + ### Apply to individual methods + + But if you just want to decorate some methods and not all methods, you can as shown here. + +.. column:: + + ```python + class ViewWithSomeDecorator(HTTPMethodView): + + @staticmethod + @some_decorator_here + def get(request, name): + return text("Hello I have a decorator") + + def post(self, request, name): + return text("Hello I do not have any decorators") + + @some_decorator_here + def patch(self, request, name): + return text("Hello I have a decorator") + ``` + +## Generating a URL + +.. column:: + + This works just like [generating any other URL](/guide/basics/routing.md#generating-a-url), except that the class name is a part of the endpoint. + +.. column:: + + ```python + @app.route("/") + def index(request): + url = app.url_for("SpecialClassView") + return redirect(url) + + class SpecialClassView(HTTPMethodView): + def get(self, request): + return text("Hello from the Special Class View!") + + app.add_route(SpecialClassView.as_view(), "/special_class_view") + ``` + diff --git a/guide/content/en/guide/advanced/proxy-headers.md b/guide/content/en/guide/advanced/proxy-headers.md new file mode 100644 index 00000000..b4f9eed4 --- /dev/null +++ b/guide/content/en/guide/advanced/proxy-headers.md @@ -0,0 +1,477 @@ +# Proxy configuration + +When you use a reverse proxy server (e.g. nginx), the value of `request.ip` will contain the IP of a proxy, typically `127.0.0.1`. Almost always, this is **not** what you will want. + +Sanic may be configured to use proxy headers for determining the true client IP, available as `request.remote_addr`. The full external URL is also constructed from header fields _if available_. + + +.. tip:: Heads up + + Without proper precautions, a malicious client may use proxy headers to spoof its own IP. To avoid such issues, Sanic does not use any proxy headers unless explicitly enabled. + + + +.. column:: + + Services behind reverse proxies must configure one or more of the following [configuration values](/guide/deployment/configuration.md): + + - `FORWARDED_SECRET` + - `REAL_IP_HEADER` + - `PROXIES_COUNT` + +.. column:: + + ```python + app.config.FORWARDED_SECRET = "super-duper-secret" + app.config.REAL_IP_HEADER = "CF-Connecting-IP" + app.config.PROXIES_COUNT = 2 + ``` + +## Forwarded header + +In order to use the `Forwarded` header, you should set `app.config.FORWARDED_SECRET` to a value known to the trusted proxy server. The secret is used to securely identify a specific proxy server. + +Sanic ignores any elements without the secret key, and will not even parse the header if no secret is set. + +All other proxy headers are ignored once a trusted forwarded element is found, as it already carries complete information about the client. + +To learn more about the `Forwarded` header, read the related [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Forwarded) and [Nginx](https://www.nginx.com/resources/wiki/start/topics/examples/forwarded/) articles. + +## Traditional proxy headers + +### IP Headers + +When your proxy forwards you the IP address in a known header, you can tell Sanic what that is with the `REAL_IP_HEADER` config value. + +### X-Forwarded-For + +This header typically contains a chain of IP addresses through each layer of a proxy. Setting `PROXIES_COUNT` tells Sanic how deep to look to get an actual IP address for the client. This value should equal the _expected_ number of IP addresses in the chain. + +### Other X-headers + +If a client IP is found by one of these methods, Sanic uses the following headers for URL parts: + +- x-forwarded-proto +- x-forwarded-host +- x-forwarded-port +- x-forwarded-path +- x-scheme + +## Examples + +In the following examples, all requests will assume that the endpoint looks like this: +```python +@app.route("/fwd") +async def forwarded(request): + return json( + { + "remote_addr": request.remote_addr, + "scheme": request.scheme, + "server_name": request.server_name, + "server_port": request.server_port, + "forwarded": request.forwarded, + } + ) +``` + +.. column:: + + --- + + ##### Example 1 + Without configured FORWARDED_SECRET, x-headers should be respected + ```python + app.config.PROXIES_COUNT = 1 + app.config.REAL_IP_HEADER = "x-real-ip" + ``` + ```bash + $ curl localhost:8000/fwd \ + -H 'Forwarded: for=1.1.1.1, for=injected;host=", for="[::2]";proto=https;host=me.tld;path="/app/";secret=mySecret,for=broken;;secret=b0rked, for=127.0.0.3;scheme=http;port=1234' \ + -H "X-Real-IP: 127.0.0.2" \ + -H "X-Forwarded-For: 127.0.1.1" \ + -H "X-Scheme: ws" \ + -H "Host: local.site" | jq + ``` + +.. column:: + + ```bash + # curl response + { + "remote_addr": "127.0.0.2", + "scheme": "ws", + "server_name": "local.site", + "server_port": 80, + "forwarded": { + "for": "127.0.0.2", + "proto": "ws" + } + } + ``` + +--- + +.. column:: + + ##### Example 2 + FORWARDED_SECRET now configured + ```python + app.config.PROXIES_COUNT = 1 + app.config.REAL_IP_HEADER = "x-real-ip" + app.config.FORWARDED_SECRET = "mySecret" + ``` + ```bash + $ curl localhost:8000/fwd \ + -H 'Forwarded: for=1.1.1.1, for=injected;host=", for="[::2]";proto=https;host=me.tld;path="/app/";secret=mySecret,for=broken;;secret=b0rked, for=127.0.0.3;scheme=http;port=1234' \ + -H "X-Real-IP: 127.0.0.2" \ + -H "X-Forwarded-For: 127.0.1.1" \ + -H "X-Scheme: ws" \ + -H "Host: local.site" | jq + ``` + +.. column:: + + ```bash + # curl response + { + "remote_addr": "[::2]", + "scheme": "https", + "server_name": "me.tld", + "server_port": 443, + "forwarded": { + "for": "[::2]", + "proto": "https", + "host": "me.tld", + "path": "/app/", + "secret": "mySecret" + } + } + ``` + +--- + +.. column:: + + ##### Example 3 + Empty Forwarded header -> use X-headers + ```python + app.config.PROXIES_COUNT = 1 + app.config.REAL_IP_HEADER = "x-real-ip" + app.config.FORWARDED_SECRET = "mySecret" + ``` + ```bash + $ curl localhost:8000/fwd \ + -H "X-Real-IP: 127.0.0.2" \ + -H "X-Forwarded-For: 127.0.1.1" \ + -H "X-Scheme: ws" \ + -H "Host: local.site" | jq + ``` + +.. column:: + + ```bash + # curl response + { + "remote_addr": "127.0.0.2", + "scheme": "ws", + "server_name": "local.site", + "server_port": 80, + "forwarded": { + "for": "127.0.0.2", + "proto": "ws" + } + } + ``` + +--- + +.. column:: + + ##### Example 4 + Header present but not matching anything + ```python + app.config.PROXIES_COUNT = 1 + app.config.REAL_IP_HEADER = "x-real-ip" + app.config.FORWARDED_SECRET = "mySecret" + ``` + ```bash + $ curl localhost:8000/fwd \ + -H "Forwarded: nomatch" | jq + ``` + +.. column:: + + ```bash + # curl response + { + "remote_addr": "", + "scheme": "http", + "server_name": "localhost", + "server_port": 8000, + "forwarded": {} + } + + ``` + +--- + +.. column:: + + ##### Example 5 + Forwarded header present but no matching secret -> use X-headers + ```python + app.config.PROXIES_COUNT = 1 + app.config.REAL_IP_HEADER = "x-real-ip" + app.config.FORWARDED_SECRET = "mySecret" + ``` + ```bash + $ curl localhost:8000/fwd \ + -H "Forwarded: for=1.1.1.1;secret=x, for=127.0.0.1" \ + -H "X-Real-IP: 127.0.0.2" | jq + ``` + +.. column:: + + ```bash + # curl response + { + "remote_addr": "127.0.0.2", + "scheme": "http", + "server_name": "localhost", + "server_port": 8000, + "forwarded": { + "for": "127.0.0.2" + } + } + ``` + +--- + +.. column:: + + ##### Example 6 + Different formatting and hitting both ends of the header + ```python + app.config.PROXIES_COUNT = 1 + app.config.REAL_IP_HEADER = "x-real-ip" + app.config.FORWARDED_SECRET = "mySecret" + ``` + ```bash + $ curl localhost:8000/fwd \ + -H 'Forwarded: Secret="mySecret";For=127.0.0.4;Port=1234' | jq + ``` + +.. column:: + + ```bash + # curl response + { + "remote_addr": "127.0.0.4", + "scheme": "http", + "server_name": "localhost", + "server_port": 1234, + "forwarded": { + "secret": "mySecret", + "for": "127.0.0.4", + "port": 1234 + } + } + ``` + +--- + +.. column:: + + ##### Example 7 + Test escapes (modify this if you see anyone implementing quoted-pairs) + ```python + app.config.PROXIES_COUNT = 1 + app.config.REAL_IP_HEADER = "x-real-ip" + app.config.FORWARDED_SECRET = "mySecret" + ``` + ```bash + $ curl localhost:8000/fwd \ + -H 'Forwarded: for=test;quoted="\,x=x;y=\";secret=mySecret' | jq + ``` + +.. column:: + + ```bash + # curl response + { + "remote_addr": "test", + "scheme": "http", + "server_name": "localhost", + "server_port": 8000, + "forwarded": { + "for": "test", + "quoted": "\\,x=x;y=\\", + "secret": "mySecret" + } + } + ``` + +--- + +.. column:: + + ##### Example 8 + Secret insulated by malformed field #1 + ```python + app.config.PROXIES_COUNT = 1 + app.config.REAL_IP_HEADER = "x-real-ip" + app.config.FORWARDED_SECRET = "mySecret" + ``` + ```bash + $ curl localhost:8000/fwd \ + -H 'Forwarded: for=test;secret=mySecret;b0rked;proto=wss;' | jq + ``` + +.. column:: + + ```bash + # curl response + { + "remote_addr": "test", + "scheme": "http", + "server_name": "localhost", + "server_port": 8000, + "forwarded": { + "for": "test", + "secret": "mySecret" + } + } + ``` + +--- + +.. column:: + + ##### Example 9 + Secret insulated by malformed field #2 + ```python + app.config.PROXIES_COUNT = 1 + app.config.REAL_IP_HEADER = "x-real-ip" + app.config.FORWARDED_SECRET = "mySecret" + ``` + ```bash + $ curl localhost:8000/fwd \ + -H 'Forwarded: for=test;b0rked;secret=mySecret;proto=wss' | jq + ``` + +.. column:: + + ```bash + # curl response + { + "remote_addr": "", + "scheme": "wss", + "server_name": "localhost", + "server_port": 8000, + "forwarded": { + "secret": "mySecret", + "proto": "wss" + } + } + ``` + +--- + +.. column:: + + ##### Example 10 + Unexpected termination should not lose existing acceptable values + ```python + app.config.PROXIES_COUNT = 1 + app.config.REAL_IP_HEADER = "x-real-ip" + app.config.FORWARDED_SECRET = "mySecret" + ``` + ```bash + $ curl localhost:8000/fwd \ + -H 'Forwarded: b0rked;secret=mySecret;proto=wss' | jq + ``` + +.. column:: + + ```bash + # curl response + { + "remote_addr": "", + "scheme": "wss", + "server_name": "localhost", + "server_port": 8000, + "forwarded": { + "secret": "mySecret", + "proto": "wss" + } + } + ``` + +--- + +.. column:: + + ##### Example 11 + Field normalization + ```python + app.config.PROXIES_COUNT = 1 + app.config.REAL_IP_HEADER = "x-real-ip" + app.config.FORWARDED_SECRET = "mySecret" + ``` + ```bash + $ curl localhost:8000/fwd \ + -H 'Forwarded: PROTO=WSS;BY="CAFE::8000";FOR=unknown;PORT=X;HOST="A:2";PATH="/With%20Spaces%22Quoted%22/sanicApp?key=val";SECRET=mySecret' | jq + ``` + +.. column:: + + ```bash + # curl response + { + "remote_addr": "", + "scheme": "wss", + "server_name": "a", + "server_port": 2, + "forwarded": { + "proto": "wss", + "by": "[cafe::8000]", + "host": "a:2", + "path": "/With Spaces\"Quoted\"/sanicApp?key=val", + "secret": "mySecret" + } + } + ``` + +--- + +.. column:: + + ##### Example 12 + Using "by" field as secret + ```python + app.config.PROXIES_COUNT = 1 + app.config.REAL_IP_HEADER = "x-real-ip" + app.config.FORWARDED_SECRET = "_proxySecret" + ``` + ```bash + $ curl localhost:8000/fwd \ + -H 'Forwarded: for=1.2.3.4; by=_proxySecret' | jq + ``` + +.. column:: + + ```bash + # curl response + { + "remote_addr": "1.2.3.4", + "scheme": "http", + "server_name": "localhost", + "server_port": 8000, + "forwarded": { + "for": "1.2.3.4", + "by": "_proxySecret" + } + } + + ``` + diff --git a/guide/content/en/guide/advanced/signals.md b/guide/content/en/guide/advanced/signals.md new file mode 100644 index 00000000..edb9a040 --- /dev/null +++ b/guide/content/en/guide/advanced/signals.md @@ -0,0 +1,346 @@ +# Signals + +Signals provide a way for one part of your application to tell another part that something happened. + +```python +@app.signal("user.registration.created") +async def send_registration_email(**context): + await send_email(context["email"], template="registration") + +@app.post("/register") +async def handle_registration(request): + await do_registration(request) + await request.app.dispatch( + "user.registration.created", + context={"email": request.json.email} + }) +``` + +## Adding a signal + +.. column:: + + The API for adding a signal is very similar to adding a route. + +.. column:: + + ```python + async def my_signal_handler(): + print("something happened") + + app.add_signal(my_signal_handler, "something.happened.ohmy") + ``` + + +.. column:: + + But, perhaps a slightly more convenient method is to use the built-in decorators. + +.. column:: + + ```python + @app.signal("something.happened.ohmy") + async def my_signal_handler(): + print("something happened") + ``` + + +.. column:: + + If the signal requires conditions, make sure to add them while adding the handler. + +.. column:: + + ```python + async def my_signal_handler1(): + print("something happened") + + app.add_signal( + my_signal_handler, + "something.happened.ohmy1", + conditions={"some_condition": "value"} + ) + + @app.signal("something.happened.ohmy2", conditions={"some_condition": "value"}) + async def my_signal_handler2(): + print("something happened") + ``` + + +.. column:: + + Signals can also be declared on blueprints + +.. column:: + + ```python + bp = Blueprint("foo") + + @bp.signal("something.happened.ohmy") + async def my_signal_handler(): + print("something happened") + ``` + +## Built-in signals + +In addition to creating a new signal, there are a number of built-in signals that are dispatched from Sanic itself. These signals exist to provide developers with more opportunities to add functionality into the request and server lifecycles. + +*Added in v21.9* + +.. column:: + + You can attach them just like any other signal to an application or blueprint instance. + +.. column:: + + ```python + @app.signal("http.lifecycle.complete") + async def my_signal_handler(conn_info): + print("Connection has been closed") + ``` + +These signals are the signals that are available, along with the arguments that the handlers take, and the conditions that attach (if any). + +| Event name | Arguments | Conditions | +| -------------------------- | ------------------------------- | --------------------------------------------------------- | +| `http.routing.before` | request | | +| `http.routing.after` | request, route, kwargs, handler | | +| `http.handler.before` | request | | +| `http.handler.after` | request | | +| `http.lifecycle.begin` | conn_info | | +| `http.lifecycle.read_head` | head | | +| `http.lifecycle.request` | request | | +| `http.lifecycle.handle` | request | | +| `http.lifecycle.read_body` | body | | +| `http.lifecycle.exception` | request, exception | | +| `http.lifecycle.response` | request, response | | +| `http.lifecycle.send` | data | | +| `http.lifecycle.complete` | conn_info | | +| `http.middleware.before` | request, response | `{"attach_to": "request"}` or `{"attach_to": "response"}` | +| `http.middleware.after` | request, response | `{"attach_to": "request"}` or `{"attach_to": "response"}` | +| `server.exception.report` | app, exception | | +| `server.init.before` | app, loop | | +| `server.init.after` | app, loop | | +| `server.shutdown.before` | app, loop | | +| `server.shutdown.after` | app, loop | | + +Version 22.9 added `http.handler.before` and `http.handler.after`. + +Version 23.6 added `server.exception.report`. + +.. column:: + + To make using the built-in signals easier, there is an `Enum` object that contains all of the allowed built-ins. With a modern IDE this will help so that you do not need to remember the full list of event names as strings. + + *Added in v21.12* + +.. column:: + + ```python + from sanic.signals import Event + + @app.signal(Event.HTTP_LIFECYCLE_COMPLETE) + async def my_signal_handler(conn_info): + print("Connection has been closed") + ``` + +## Events + +.. column:: + + Signals are based off of an _event_. An event, is simply a string in the following pattern: + +.. column:: + + ``` + namespace.reference.action + ``` + + + +.. tip:: Events must have three parts. If you do not know what to use, try these patterns: + + - `my_app.something.happened` + - `sanic.notice.hello` + + +### Event parameters + +.. column:: + + An event can be "dynamic" and declared using the same syntax as [path parameters](../basics/routing.md#path-parameters). This allows matching based upon arbitrary values. + +.. column:: + + ```python + @app.signal("foo.bar.") + async def signal_handler(thing): + print(f"[signal_handler] {thing=}") + + @app.get("/") + async def trigger(request): + await app.dispatch("foo.bar.baz") + return response.text("Done.") + ``` + +Checkout [path parameters](../basics/routing.md#path-parameters) for more information on allowed type definitions. + + +.. warning:: Only the third part of an event (the action) may be dynamic: + + - `foo.bar.` ๐Ÿ†— + - `foo..baz` โŒ + + +### Waiting + +.. column:: + + In addition to executing a signal handler, your application can wait for an event to be triggered. + +.. column:: + + ```python + await app.event("foo.bar.baz") + ``` + + +.. column:: + + **IMPORTANT**: waiting is a blocking function. Therefore, you likely will want this to run in a [background task](../basics/tasks.md). + +.. column:: + + ```python + async def wait_for_event(app): + while True: + print("> waiting") + await app.event("foo.bar.baz") + print("> event found\n") + + @app.after_server_start + async def after_server_start(app, loop): + app.add_task(wait_for_event(app)) + ``` + + +.. column:: + + If your event was defined with a dynamic path, you can use `*` to catch any action. + +.. column:: + + ```python + @app.signal("foo.bar.") + + ... + + await app.event("foo.bar.*") + ``` + +## Dispatching + +*In the future, Sanic will dispatch some events automatically to assist developers to hook into life cycle events.* + +.. column:: + + Dispatching an event will do two things: + + 1. execute any signal handlers defined on the event, and + 2. resolve anything that is "waiting" for the event to complete. + +.. column:: + + ```python + @app.signal("foo.bar.") + async def foo_bar(thing): + print(f"{thing=}") + + await app.dispatch("foo.bar.baz") + ``` + ``` + thing=baz + ``` + +### Context + +.. column:: + + Sometimes you may find the need to pass extra information into the signal handler. In our first example above, we wanted our email registration process to have the email address for the user. + +.. column:: + + ```python + @app.signal("user.registration.created") + async def send_registration_email(**context): + print(context) + + await app.dispatch( + "user.registration.created", + context={"hello": "world"} + ) + ``` + ``` + {'hello': 'world'} + ``` + + + +.. tip:: FYI + + Signals are dispatched in a background task. + + +### Blueprints + +Dispatching blueprint signals works similar in concept to [middleware](../basics/middleware.md). Anything that is done from the app level, will trickle down to the blueprints. However, dispatching on a blueprint, will only execute the signals that are defined on that blueprint. + +.. column:: + + Perhaps an example is easier to explain: + +.. column:: + + ```python + bp = Blueprint("bp") + + app_counter = 0 + bp_counter = 0 + + @app.signal("foo.bar.baz") + def app_signal(): + nonlocal app_counter + app_counter += 1 + + @bp.signal("foo.bar.baz") + def bp_signal(): + nonlocal bp_counter + bp_counter += 1 + ``` + + +.. column:: + + Running `app.dispatch("foo.bar.baz")` will execute both signals. + +.. column:: + + ```python + await app.dispatch("foo.bar.baz") + assert app_counter == 1 + assert bp_counter == 1 + ``` + + +.. column:: + + Running `bp.dispatch("foo.bar.baz")` will execute only the blueprint signal. + +.. column:: + + ```python + await bp.dispatch("foo.bar.baz") + assert app_counter == 1 + assert bp_counter == 2 + ``` + diff --git a/guide/content/en/guide/advanced/streaming.md b/guide/content/en/guide/advanced/streaming.md new file mode 100644 index 00000000..04962f5f --- /dev/null +++ b/guide/content/en/guide/advanced/streaming.md @@ -0,0 +1,151 @@ +# Streaming + +## Request streaming + +Sanic allows you to stream data sent by the client to begin processing data as the bytes arrive. + +.. column:: + + When enabled on an endpoint, you can stream the request body using `await request.stream.read()`. + + That method will return `None` when the body is completed. + +.. column:: + + ```python + from sanic.views import stream + + class SimpleView(HTTPMethodView): + @stream + async def post(self, request): + result = "" + while True: + body = await request.stream.read() + if body is None: + break + result += body.decode("utf-8") + return text(result) + ``` + + +.. column:: + + It also can be enabled with a keyword argument in the decorator... + +.. column:: + + ```python + @app.post("/stream", stream=True) + async def handler(request): + ... + body = await request.stream.read() + ... + ``` + + +.. column:: + + ... or the `add_route()` method. + +.. column:: + + ```python + bp.add_route( + bp_handler, + "/bp_stream", + methods=["POST"], + stream=True, + ) + ``` + + + +.. tip:: FYI + + Only post, put and patch decorators have stream argument. + + +## Response streaming + +.. column:: + + Sanic allows you to stream content to the client. + +.. column:: + + ```python + @app.route("/") + async def test(request): + response = await request.respond(content_type="text/csv") + await response.send("foo,") + await response.send("bar") + + # Optionally, you can explicitly end the stream by calling: + await response.eof() + ``` + +This is useful in situations where you want to stream content to the client that originates in an external service, like a database. For example, you can stream database records to the client with the asynchronous cursor that `asyncpg` provides. + +```python +@app.route("/") +async def index(request): + response = await request.respond() + conn = await asyncpg.connect(database='test') + async with conn.transaction(): + async for record in conn.cursor('SELECT generate_series(0, 10)'): + await response.send(record[0]) +``` + + +You can explicitly end a stream by calling `await response.eof()`. It a convenience method to replace `await response.send("", True)`. It should be called **one time** *after* your handler has determined that it has nothing left to send back to the client. While it is *optional* to use with Sanic server, if you are running Sanic in ASGI mode, then you **must** explicitly terminate the stream. + +*Calling `eof` became optional in v21.6* + +## File streaming + +.. column:: + + Sanic provides `sanic.response.file_stream` function that is useful when you want to send a large file. It returns a `StreamingHTTPResponse` object and will use chunked transfer encoding by default; for this reason Sanic doesnโ€™t add `Content-Length` HTTP header in the response. + + A typical use case might be streaming an video file. + +.. column:: + + ```python + @app.route("/mp4") + async def handler_file_stream(request): + return await response.file_stream( + "/path/to/sample.mp4", + chunk_size=1024, + mime_type="application/metalink4+xml", + headers={ + "Content-Disposition": 'Attachment; filename="nicer_name.meta4"', + "Content-Type": "application/metalink4+xml", + }, + ) + ``` + + +.. column:: + + If you want to use the `Content-Length` header, you can disable chunked transfer encoding and add it manually simply by adding the `Content-Length` header. + +.. column:: + + ```python + from aiofiles import os as async_os + from sanic.response import file_stream + + @app.route("/") + async def index(request): + file_path = "/srv/www/whatever.png" + + file_stat = await async_os.stat(file_path) + headers = {"Content-Length": str(file_stat.st_size)} + + return await file_stream( + file_path, + headers=headers, + ) + ``` + diff --git a/guide/content/en/guide/advanced/versioning.md b/guide/content/en/guide/advanced/versioning.md new file mode 100644 index 00000000..e630e332 --- /dev/null +++ b/guide/content/en/guide/advanced/versioning.md @@ -0,0 +1,170 @@ +# Versioning + +It is standard practice in API building to add versions to your endpoints. This allows you to easily differentiate incompatible endpoints when you try and change your API down the road in a breaking manner. + +Adding a version will add a `/v{version}` url prefix to your endpoints. + +The version can be a `int`, `float`, or `str`. Acceptable values: + +- `1`, `2`, `3` +- `1.1`, `2.25`, `3.0` +- `"1"`, `"v1"`, `"v1.1"` + +## Per route + +.. column:: + + You can pass a version number to the routes directly. + +.. column:: + + ```python + # /v1/text + @app.route("/text", version=1) + def handle_request(request): + return response.text("Hello world! Version 1") + + # /v2/text + @app.route("/text", version=2) + def handle_request(request): + return response.text("Hello world! Version 2") + ``` + +## Per Blueprint + +.. column:: + + You can also pass a version number to the blueprint, which will apply to all routes in that blueprint. + +.. column:: + + ```python + bp = Blueprint("test", url_prefix="/foo", version=1) + + # /v1/foo/html + @bp.route("/html") + def handle_request(request): + return response.html("

Hello world!

") + ``` + +## Per Blueprint Group + +.. column:: + + In order to simplify the management of the versioned blueprints, you can provide a version number in the blueprint + group. The same will be inherited to all the blueprint grouped under it if the blueprints don't already override the + same information with a value specified while creating a blueprint instance. + + When using blueprint groups for managing the versions, the following order is followed to apply the Version prefix to + the routes being registered. + + 1. Route Level configuration + 2. Blueprint level configuration + 3. Blueprint Group level configuration + + If we find a more pointed versioning specification, we will pick that over the more generic versioning specification + provided under the Blueprint or Blueprint Group + +.. column:: + + ```python + from sanic.blueprints import Blueprint + from sanic.response import json + + bp1 = Blueprint( + name="blueprint-1", + url_prefix="/bp1", + version=1.25, + ) + bp2 = Blueprint( + name="blueprint-2", + url_prefix="/bp2", + ) + + group = Blueprint.group( + [bp1, bp2], + url_prefix="/bp-group", + version="v2", + ) + + # GET /v1.25/bp-group/bp1/endpoint-1 + @bp1.get("/endpoint-1") + async def handle_endpoint_1_bp1(request): + return json({"Source": "blueprint-1/endpoint-1"}) + + # GET /v2/bp-group/bp2/endpoint-2 + @bp2.get("/endpoint-1") + async def handle_endpoint_1_bp2(request): + return json({"Source": "blueprint-2/endpoint-1"}) + + # GET /v1/bp-group/bp2/endpoint-2 + @bp2.get("/endpoint-2", version=1) + async def handle_endpoint_2_bp2(request): + return json({"Source": "blueprint-2/endpoint-2"}) + ``` + +## Version prefix + +As seen above, the `version` that is applied to a route is **always** the first segment in the generated URI path. Therefore, to make it possible to add path segments before the version, every place that a `version` argument is passed, you can also pass `version_prefix`. + +The `version_prefix` argument can be defined in: + +- `app.route` and `bp.route` decorators (and all the convenience decorators also) +- `Blueprint` instantiation +- `Blueprint.group` constructor +- `BlueprintGroup` instantiation +- `app.blueprint` registration + +If there are definitions in multiple places, a more specific definition overrides a more general. This list provides that hierarchy. + +The default value of `version_prefix` is `/v`. + +.. column:: + + An often requested feature is to be able to mount versioned routes on `/api`. This can easily be accomplished with `version_prefix`. + +.. column:: + + ```python + # /v1/my/path + app.route("/my/path", version=1, version_prefix="/api/v") + ``` + + +.. column:: + + Perhaps a more compelling usage is to load all `/api` routes into a single `BlueprintGroup`. + +.. column:: + + ```python + # /v1/my/path + app = Sanic(__name__) + v2ip = Blueprint("v2ip", url_prefix="/ip", version=2) + api = Blueprint.group(v2ip, version_prefix="/api/version") + + # /api/version2/ip + @v2ip.get("/") + async def handler(request): + return text(request.ip) + + app.blueprint(api) + ``` + +We can therefore learn that a route's URI is: + +``` +version_prefix + version + url_prefix + URI definition +``` + + +.. tip:: + + Just like with `url_prefix`, it is possible to define path parameters inside a `version_prefix`. It is perfectly legitimate to do this. Just remember that every route will have that parameter injected into the handler. + + ```python + version_prefix="//v" + ``` + + +*Added in v21.6* diff --git a/guide/content/en/guide/advanced/websockets.md b/guide/content/en/guide/advanced/websockets.md new file mode 100644 index 00000000..f7436fa5 --- /dev/null +++ b/guide/content/en/guide/advanced/websockets.md @@ -0,0 +1,82 @@ +# Websockets + +Sanic provides an easy to use abstraction on top of [websockets](https://websockets.readthedocs.io/en/stable/). + +## Routing + +.. column:: + + Websocket handlers can be hooked up to the router similar to regular handlers. + +.. column:: + + ```python + from sanic import Request, Websocket + + async def feed(request: Request, ws: Websocket): + pass + + app.add_websocket_route(feed, "/feed") + ``` + ```python + from sanic import Request, Websocket + + @app.websocket("/feed") + async def feed(request: Request, ws: Websocket): + pass + ``` + +## Handler + + +.. column:: + + Typically, a websocket handler will want to hold open a loop. + + It can then use the `send()` and `recv()` methods on the second object injected into the handler. + + This example is a simple endpoint that echos back to the client messages that it receives. + +.. column:: + + ```python + from sanic import Request, Websocket + + @app.websocket("/feed") + async def feed(request: Request, ws: Websocket): + while True: + data = "hello!" + print("Sending: " + data) + await ws.send(data) + data = await ws.recv() + print("Received: " + data) + ``` + + +.. column:: + + You can simplify your loop by just iterating over the `Websocket` object in a for loop. + + *Added in v22.9* + +.. column:: + + ```python + from sanic import Request, Websocket + + @app.websocket("/feed") + async def feed(request: Request, ws: Websocket): + async for msg in ws: + await ws.send(msg) + ``` + + +## Configuration + +See [configuration section](/guide/deployment/configuration.md) for more details, however the defaults are shown below. + +```python +app.config.WEBSOCKET_MAX_SIZE = 2 ** 20 +app.config.WEBSOCKET_PING_INTERVAL = 20 +app.config.WEBSOCKET_PING_TIMEOUT = 20 +``` diff --git a/guide/content/en/guide/basics/README.md b/guide/content/en/guide/basics/README.md new file mode 100644 index 00000000..25dcc520 --- /dev/null +++ b/guide/content/en/guide/basics/README.md @@ -0,0 +1 @@ +# Basics diff --git a/guide/content/en/guide/basics/app.md b/guide/content/en/guide/basics/app.md new file mode 100644 index 00000000..943740d5 --- /dev/null +++ b/guide/content/en/guide/basics/app.md @@ -0,0 +1,517 @@ +# Sanic Application + +## Instance + +.. column:: + + The most basic building block is the `Sanic()` instance. It is not required, but the custom is to instantiate this in a file called `server.py`. + +.. column:: + + ```python + # /path/to/server.py + + from sanic import Sanic + + app = Sanic("MyHelloWorldApp") + ``` + +## Application context + +Most applications will have the need to share/reuse data or objects across different parts of the code base. The most common example is DB connections. + +.. column:: + + In versions of Sanic prior to v21.3, this was commonly done by attaching an attribute to the application instance + +.. column:: + + ```python + # Raises a warning as deprecated feature in 21.3 + app = Sanic("MyApp") + app.db = Database() + ``` + + +.. column:: + + Because this can create potential problems with name conflicts, and to be consistent with [request context](./request.md#context) objects, v21.3 introduces application level context object. + +.. column:: + + ```python + # Correct way to attach objects to the application + app = Sanic("MyApp") + app.ctx.db = Database() + ``` + +## App Registry + +.. column:: + + When you instantiate a Sanic instance, that can be retrieved at a later time from the Sanic app registry. This can be useful, for example, if you need to access your Sanic instance from a location where it is not otherwise accessible. + +.. column:: + + ```python + # ./path/to/server.py + from sanic import Sanic + + app = Sanic("my_awesome_server") + + # ./path/to/somewhere_else.py + from sanic import Sanic + + app = Sanic.get_app("my_awesome_server") + ``` + + +.. column:: + + If you call `Sanic.get_app("non-existing")` on an app that does not exist, it will raise `SanicException` by default. You can, instead, force the method to return a new instance of Sanic with that name. + +.. column:: + + ```python + app = Sanic.get_app( + "non-existing", + force_create=True, + ) + ``` + + +.. column:: + + If there is **only one** Sanic instance registered, then calling `Sanic.get_app()` with no arguments will return that instance + +.. column:: + + ```python + Sanic("My only app") + + app = Sanic.get_app() + ``` + +## Configuration + +.. column:: + + Sanic holds the configuration in the `config` attribute of the `Sanic` instance. Configuration can be modified **either** using dot-notation **OR** like a dictionary. + +.. column:: + + ```python + app = Sanic('myapp') + + app.config.DB_NAME = 'appdb' + app.config['DB_USER'] = 'appuser' + + db_settings = { + 'DB_HOST': 'localhost', + 'DB_NAME': 'appdb', + 'DB_USER': 'appuser' + } + app.config.update(db_settings) + ``` + + + +.. note:: Heads up + + Config keys _should_ be uppercase. But, this is mainly by convention, and lowercase will work most of the time. + ``` + app.config.GOOD = "yay!" + app.config.bad = "boo" + ``` + + +There is much [more detail about configuration](/guide/deployment/configuration.md) later on. + +## Customization + +The Sanic application instance can be customized for your application needs in a variety of ways at instantiation. + +### Custom configuration + +.. column:: + + This simplest form of custom configuration would be to pass your own object directly into that Sanic application instance + + If you create a custom configuration object, it is *highly* recommended that you subclass the Sanic `Config` option to inherit its behavior. You could use this option for adding properties, or your own set of custom logic. + + *Added in v21.6* + +.. column:: + + ```python + from sanic.config import Config + + class MyConfig(Config): + FOO = "bar" + + app = Sanic(..., config=MyConfig()) + ``` + + +.. column:: + + A useful example of this feature would be if you wanted to use a config file in a form that differs from what is [supported](../deployment/configuration.md#using-sanic-update-config). + +.. column:: + + ```python + from sanic import Sanic, text + from sanic.config import Config + + class TomlConfig(Config): + def __init__(self, *args, path: str, **kwargs): + super().__init__(*args, **kwargs) + + with open(path, "r") as f: + self.apply(toml.load(f)) + + def apply(self, config): + self.update(self._to_uppercase(config)) + + def _to_uppercase(self, obj: Dict[str, Any]) -> Dict[str, Any]: + retval: Dict[str, Any] = {} + for key, value in obj.items(): + upper_key = key.upper() + if isinstance(value, list): + retval[upper_key] = [ + self._to_uppercase(item) for item in value + ] + elif isinstance(value, dict): + retval[upper_key] = self._to_uppercase(value) + else: + retval[upper_key] = value + return retval + + toml_config = TomlConfig(path="/path/to/config.toml") + app = Sanic(toml_config.APP_NAME, config=toml_config) + ``` + +### Custom context + +.. column:: + + By default, the application context is a [`SimpleNamespace()`](https://docs.python.org/3/library/types.html#types.SimpleNamespace) that allows you to set any properties you want on it. However, you also have the option of passing any object whatsoever instead. + + *Added in v21.6* + +.. column:: + + ```python + app = Sanic(..., ctx=1) + ``` + + ```python + app = Sanic(..., ctx={}) + ``` + + ```python + class MyContext: + ... + + app = Sanic(..., ctx=MyContext()) + ``` + +### Custom requests + +.. column:: + + It is sometimes helpful to have your own `Request` class, and tell Sanic to use that instead of the default. One example is if you wanted to modify the default `request.id` generator. + + + + .. note:: Important + + It is important to remember that you are passing the *class* not an instance of the class. + + +.. column:: + + ```python + import time + + from sanic import Request, Sanic, text + + class NanoSecondRequest(Request): + @classmethod + def generate_id(*_): + return time.time_ns() + + app = Sanic(..., request_class=NanoSecondRequest) + + @app.get("/") + async def handler(request): + return text(str(request.id)) + ``` + +### Custom error handler + +.. column:: + + See [exception handling](../best-practices/exceptions.md#custom-error-handling) for more + +.. column:: + + ```python + from sanic.handlers import ErrorHandler + + class CustomErrorHandler(ErrorHandler): + def default(self, request, exception): + ''' handles errors that have no error handlers assigned ''' + # You custom error handling logic... + return super().default(request, exception) + + app = Sanic(..., error_handler=CustomErrorHandler()) + ``` + +### Custom dumps function + +.. column:: + + It may sometimes be necessary or desirable to provide a custom function that serializes an object to JSON data. + +.. column:: + + ```python + import ujson + + dumps = partial(ujson.dumps, escape_forward_slashes=False) + app = Sanic(__name__, dumps=dumps) + ``` + + +.. column:: + + Or, perhaps use another library or create your own. + +.. column:: + + ```python + from orjson import dumps + + app = Sanic(__name__, dumps=dumps) + ``` + +### Custom loads function + +.. column:: + + Similar to `dumps`, you can also provide a custom function for deserializing data. + + *Added in v22.9* + +.. column:: + + ```python + from orjson import loads + + app = Sanic(__name__, loads=loads) + ``` + + + +.. new:: NEW in v23.6 + + ### Custom typed application + +The correct, default type of a Sanic application instance is: + +```python +sanic.app.Sanic[sanic.config.Config, types.SimpleNamespace] +``` + +It refers to two generic types: + +1. The first is the type of the configuration object. It defaults to `sanic.config.Config`, but can be any subclass of that. +2. The second is the type of the application context. It defaults to `types.SimpleNamespace`, but can be **any object** as show above. + +Let's look at some examples of how the type will change. + +.. column:: + + Consider this example where we pass a custom subclass of `Config` and a custom context object. + +.. column:: + + ```python + from sanic import Sanic + from sanic.config import Config + + class CustomConfig(Config): + pass + + app = Sanic("test", config=CustomConfig()) + reveal_type(app) # N: Revealed type is "sanic.app.Sanic[main.CustomConfig, types.SimpleNamespace]" + ``` + ``` + sanic.app.Sanic[main.CustomConfig, types.SimpleNamespace] + ``` + + +.. column:: + + Similarly, when passing a custom context object, the type will change to reflect that. + +.. column:: + + ```python + from sanic import Sanic + + class Foo: + pass + + app = Sanic("test", ctx=Foo()) + reveal_type(app) # N: Revealed type is "sanic.app.Sanic[sanic.config.Config, main.Foo]" + ``` + ``` + sanic.app.Sanic[sanic.config.Config, main.Foo] + ``` + + +.. column:: + + Of course, you can set both the config and context to custom types. + +.. column:: + + ```python + from sanic import Sanic + from sanic.config import Config + + class CustomConfig(Config): + pass + + class Foo: + pass + + app = Sanic("test", config=CustomConfig(), ctx=Foo()) + reveal_type(app) # N: Revealed type is "sanic.app.Sanic[main.CustomConfig, main.Foo]" + ``` + ``` + sanic.app.Sanic[main.CustomConfig, main.Foo] + ``` + +This pattern is particularly useful if you create a custom type alias for your application instance so that you can use it to annotate listeners and handlers. + +```python +# ./path/to/types.py +from sanic.app import Sanic +from sanic.config import Config +from myapp.context import MyContext +from typing import TypeAlias + +MyApp = TypeAlias("MyApp", Sanic[Config, MyContext]) +``` + +```python +# ./path/to/listeners.py +from myapp.types import MyApp + +def add_listeners(app: MyApp): + @app.before_server_start + async def before_server_start(app: MyApp): + # do something with your fully typed app instance + await app.ctx.db.connect() +``` + +```python +# ./path/to/server.py +from myapp.types import MyApp +from myapp.context import MyContext +from myapp.config import MyConfig +from myapp.listeners import add_listeners + +app = Sanic("myapp", config=MyConfig(), ctx=MyContext()) +add_listeners(app) +``` + +*Added in v23.6* + +### Custom typed request + +Sanic also allows you to customize the type of the request object. This is useful if you want to add custom properties to the request object, or be able to access your custom properties of a typed application instance. + +The correct, default type of a Sanic request instance is: + +```python +sanic.request.Request[ + sanic.app.Sanic[sanic.config.Config, types.SimpleNamespace], + types.SimpleNamespace +] +``` + +It refers to two generic types: + +1. The first is the type of the application instance. It defaults to `sanic.app.Sanic[sanic.config.Config, types.SimpleNamespace]`, but can be any subclass of that. +2. The second is the type of the request context. It defaults to `types.SimpleNamespace`, but can be **any object** as show above in [custom requests](#custom-requests). + +Let's look at some examples of how the type will change. + +.. column:: + + Expanding upon the full example above where there is a type alias for a customized application instance, we can also create a custom request type so that we can access those same type annotations. + + Of course, you do not need type aliases for this to work. We are only showing them here to cut down on the amount of code shown. + +.. column:: + + ```python + from sanic import Request + from myapp.types import MyApp + from types import SimpleNamespace + + def add_routes(app: MyApp): + @app.get("/") + async def handler(request: Request[MyApp, SimpleNamespace]): + # do something with your fully typed app instance + results = await request.app.ctx.db.query("SELECT * FROM foo") + ``` + + +.. column:: + + Perhaps you have a custom request object that generates a custom context object. You can type annotate it to properly access those properties with your IDE as shown here. + +.. column:: + + ```python + from sanic import Request, Sanic + from sanic.config import Config + + class CustomConfig(Config): + pass + + class Foo: + pass + + class RequestContext: + foo: Foo + + class CustomRequest(Request[Sanic[CustomConfig, Foo], RequestContext]): + @staticmethod + def make_context() -> RequestContext: + ctx = RequestContext() + ctx.foo = Foo() + return ctx + + app = Sanic( + "test", config=CustomConfig(), ctx=Foo(), request_class=CustomRequest + ) + + @app.get("/") + async def handler(request: CustomRequest): + # Full access to typed: + # - custom application configuration object + # - custom application context object + # - custom request context object + pass + ``` + +See more information in the [custom request context](./request.md#custom-request-context) section. + +*Added in v23.6* + diff --git a/guide/content/en/guide/basics/cookies.md b/guide/content/en/guide/basics/cookies.md new file mode 100644 index 00000000..708ea1aa --- /dev/null +++ b/guide/content/en/guide/basics/cookies.md @@ -0,0 +1,108 @@ +# Cookies + +## Reading + +.. column:: + + Cookies can be accessed via the `Request` objectโ€™s `cookies` dictionary. + +.. column:: + + ```python + @app.route("/cookie") + async def test(request): + test_cookie = request.cookies.get("test") + return text(f"Test cookie: {test_cookie}") + ``` + + + +.. tip:: FYI + + ๐Ÿ’ก The `request.cookies` object is one of a few types that is a dictionary with each value being a `list`. This is because HTTP allows a single key to be reused to send multiple values. + + Most of the time you will want to use the `.get()` method to access the first element and not a `list`. If you do want a `list` of all items, you can use `.getlist()`. + + *Added in v23.3* + + + +## Writing + +.. column:: + + When returning a response, cookies can be set on the `Response` object: `response.cookies`. This object is an instance of `CookieJar` which is a special sort of dictionary that automatically will write the response headers for you. + +.. column:: + + ```python + @app.route("/cookie") + async def test(request): + response = text("There's a cookie up in this response") + response.add_cookie( + "test", + "It worked!", + domain=".yummy-yummy-cookie.com", + httponly=True + ) + return response + ``` + +Response cookies can be set like dictionary values and have the following parameters available: + +- `path: str` - The subset of URLs to which this cookie applies. Defaults to `/`. +- `domain: str` - Specifies the domain for which the cookie is valid. An explicitly specified domain must always start with a dot. +- `max_age: int` - Number of seconds the cookie should live for. +- `expires: datetime` - The time for the cookie to expire on the clientโ€™s browser. Usually it is better to use max-age instead. +- `secure: bool` - Specifies whether the cookie will only be sent via HTTPS. Defaults to `True`. +- `httponly: bool` - Specifies whether the cookie cannot be read by JavaScript. +- `samesite: str` - Available values: Lax, Strict, and None. Defaults to `Lax`. +- `comment: str` - A comment (metadata). +- `host_prefix: bool` - Whether to add the `__Host-` prefix to the cookie. +- `secure_prefix: bool` - Whether to add the `__Secure-` prefix to the cookie. +- `partitioned: bool` - Whether to mark the cookie as partitioned. + +To better understand the implications and usage of these values, it might be helpful to read the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies) on [setting cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie). + + +.. tip:: FYI + + By default, Sanic will set the `secure` flag to `True` to ensure that cookies are only sent over HTTPS as a sensible default. This should not be impactful for local development since secure cookies over HTTP should still be sent to `localhost`. For more information, you should read the [MDN documentation](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#restrict_access_to_cookies) on [secure cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#Secure). + + +## Deleting + +.. column:: + + Cookies can be removed semantically or explicitly. + +.. column:: + + ```python + @app.route("/cookie") + async def test(request): + response = text("Time to eat some cookies muahaha") + + # This cookie will be set to expire in 0 seconds + response.delete_cookie("eat_me") + + # This cookie will self destruct in 5 seconds + response.add_cookie("fast_bake", "Be quick!", max_age=5) + + return response + ``` + + *Don't forget to add `path` or `domain` if needed!* + +## Eating + +.. column:: + + Sanic likes cookies + +.. column:: + + .. attrs:: + :class: is-size-1 has-text-centered + + ๐Ÿช diff --git a/guide/content/en/guide/basics/handlers.md b/guide/content/en/guide/basics/handlers.md new file mode 100644 index 00000000..044d824f --- /dev/null +++ b/guide/content/en/guide/basics/handlers.md @@ -0,0 +1,131 @@ +# Handlers + +The next important building block are your _handlers_. These are also sometimes called "views". + +In Sanic, a handler is any callable that takes at least a `Request` instance as an argument, and returns either an `HTTPResponse` instance, or a coroutine that does the same. + + + +.. column:: + + Huh? ๐Ÿ˜• + + It is a **function**; either synchronous or asynchronous. + + The job of the handler is to respond to an endpoint and do something. This is where the majority of your business logic will go. + +.. column:: + + ```python + def i_am_a_handler(request): + return HTTPResponse() + + async def i_am_ALSO_a_handler(request): + return HTTPResponse() + ``` + +.. tip:: Heads up + + If you want to learn more about encapsulating your logic, checkout [class based views](/guide/advanced/class-based-views.md). + + +.. column:: + + Then, all you need to do is wire it up to an endpoint. We'll learn more about [routing soon](./routing.md). + + Let's look at a practical example. + + - We use a convenience decorator on our app instance: `@app.get()` + - And a handy convenience method for generating out response object: `text()` + + Mission accomplished :muscle: + +.. column:: + + ```python + from sanic.response import text + + @app.get("/foo") + async def foo_handler(request): + return text("I said foo!") + ``` + +--- + +## A word about _async_... + +.. column:: + + It is entirely possible to write handlers that are synchronous. + + In this example, we are using the _blocking_ `time.sleep()` to simulate 100ms of processing time. Perhaps this represents fetching data from a DB, or a 3rd-party website. + + Using four (4) worker processes and a common benchmarking tool: + + - **956** requests in 30.10s + - Or, about **31.76** requests/second + +.. column:: + + ```python + @app.get("/sync") + def sync_handler(request): + time.sleep(0.1) + return text("Done.") + ``` + + +.. column:: + + Just by changing to the asynchronous alternative `asyncio.sleep()`, we see an incredible change in performance. ๐Ÿš€ + + Using the same four (4) worker processes: + + - **115,590** requests in 30.08s + - Or, about **3,843.17** requests/second + + .. attrs:: + :class: is-size-3 + + ๐Ÿคฏ + + Okay... this is a ridiculously overdramatic result. And any benchmark you see is inherently very biased. This example is meant to over-the-top show the benefit of `async/await` in the web world. Results will certainly vary. Tools like Sanic and other async Python libraries are not magic bullets that make things faster. They make them _more efficient_. + + In our example, the asynchronous version is so much better because while one request is sleeping, it is able to start another one, and another one, and another one, and another one... + + But, this is the point! Sanic is fast because it takes the available resources and squeezes performance out of them. It can handle many requests concurrently, which means more requests per second. + +.. column:: + + ```python + @app.get("/async") + async def async_handler(request): + await asyncio.sleep(0.1) + return text("Done.") + ``` + + + +.. warning:: A common mistake! + + Don't do this! You need to ping a website. What do you use? `pip install your-fav-request-library` ๐Ÿ™ˆ + + Instead, try using a client that is `async/await` capable. Your server will thank you. Avoid using blocking tools, and favor those that play well in the asynchronous ecosystem. If you need recommendations, check out [Awesome Sanic](https://github.com/mekicha/awesome-sanic). + + Sanic uses [httpx](https://www.python-httpx.org/) inside of its testing package (sanic-testing) :wink:. + + +--- + +## A fully annotated handler + +For those that are using type annotations... + +```python +from sanic.response import HTTPResponse, text +from sanic.request import Request + +@app.get("/typed") +async def typed_handler(request: Request) -> HTTPResponse: + return text("Done.") +``` diff --git a/guide/content/en/guide/basics/headers.md b/guide/content/en/guide/basics/headers.md new file mode 100644 index 00000000..234710cc --- /dev/null +++ b/guide/content/en/guide/basics/headers.md @@ -0,0 +1,229 @@ +# Headers + +Request and response headers are available in the `Request` and `HTTPResponse` objects, respectively. They make use of the [`multidict` package](https://multidict.readthedocs.io/en/stable/multidict.html#cimultidict) that allows a single key to have multiple values. + + +.. tip:: FYI + + Header keys are converted to *lowercase* when parsed. Capitalization is not considered for headers. + + +## Request + +Sanic does attempt to do some normalization on request headers before presenting them to the developer, and also make some potentially meaningful extractions for common use cases. + +.. column:: + + #### Tokens + + Authorization tokens in the form `Token ` or `Bearer ` are extracted to the request object: `request.token`. + +.. column:: + + ```python + @app.route("/") + async def handler(request): + return text(request.token) + ``` + + ```bash + $ curl localhost:8000 \ + -H "Authorization: Token ABCDEF12345679" + ABCDEF12345679 + ``` + + ```bash + $ curl localhost:8000 \ + -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c" + eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c + ``` + +### Proxy headers + +Sanic has special handling for proxy headers. See the [proxy headers](/guide/advanced/proxy-headers.md) section for more details. + +### Host header and dynamic URL construction + +.. column:: + + The *effective host* is available via `request.host`. This is not necessarily the same as the host header, as it prefers proxy-forwarded host and can be forced by the server name setting. + + Webapps should generally use this accessor so that they can function the same no matter how they are deployed. The actual host header, if needed, can be found via `request.headers` + + The effective host is also used in dynamic URL construction via `request.url_for`, which uses the request to determine the external address of a handler. + + .. tip:: Be wary of malicious clients + + These URLs can be manipulated by sending misleading host headers. `app.url_for` should be used instead if this is a concern. + +.. column:: + + ```python + app.config.SERVER_NAME = "https://example.com" + + @app.route("/hosts", name="foo") + async def handler(request): + return json( + { + "effective host": request.host, + "host header": request.headers.get("host"), + "forwarded host": request.forwarded.get("host"), + "you are here": request.url_for("foo"), + } + ) + ``` + + ```bash + $ curl localhost:8000/hosts + { + "effective host": "example.com", + "host header": "localhost:8000", + "forwarded host": null, + "you are here": "https://example.com/hosts" + } + ``` + +### Other headers + +.. column:: + + + All request headers are available on `request.headers`, and can be accessed in dictionary form. Capitalization is not considered for headers, and can be accessed using either uppercase or lowercase keys. + +.. column:: + + ```python + @app.route("/") + async def handler(request): + return json( + { + "foo_weakref": request.headers["foo"], + "foo_get": request.headers.get("Foo"), + "foo_getone": request.headers.getone("FOO"), + "foo_getall": request.headers.getall("fOo"), + "all": list(request.headers.items()), + } + ) + ``` + + ```bash + $ curl localhost:9999/headers -H "Foo: one" -H "FOO: two"|jq + { + "foo_weakref": "one", + "foo_get": "one", + "foo_getone": "one", + "foo_getall": [ + "one", + "two" + ], + "all": [ + [ + "host", + "localhost:9999" + ], + [ + "user-agent", + "curl/7.76.1" + ], + [ + "accept", + "*/*" + ], + [ + "foo", + "one" + ], + [ + "foo", + "two" + ] + ] + } + ``` + + + +.. tip:: FYI + + ๐Ÿ’ก The request.headers object is one of a few types that is a dictionary with each value being a list. This is because HTTP allows a single key to be reused to send multiple values. + + Most of the time you will want to use the .get() or .getone() methods to access the first element and not a list. If you do want a list of all items, you can use .getall(). + + +### Request ID + +.. column:: + + Often it is convenient or necessary to track a request by its `X-Request-ID` header. You can easily access that as: `request.id`. + +.. column:: + + ```python + @app.route("/") + async def handler(request): + return text(request.id) + ``` + + ```bash + $ curl localhost:8000 \ + -H "X-Request-ID: ABCDEF12345679" + ABCDEF12345679 + ``` + +## Response + +Sanic will automatically set the following response headers (when appropriate) for you: + +- `content-length` +- `content-type` +- `connection` +- `transfer-encoding` + +In most circumstances, you should never need to worry about setting these headers. + +.. column:: + + Any other header that you would like to set can be done either in the route handler, or a response middleware. + +.. column:: + + ```python + @app.route("/") + async def handler(request): + return text("Done.", headers={"content-language": "en-US"}) + + @app.middleware("response") + async def add_csp(request, response): + response.headers["content-security-policy"] = "default-src 'none'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self';base-uri 'self';form-action 'self'" + ``` + + +.. column:: + + A common [middleware](middleware.md) you might want is to add a `X-Request-ID` header to every response. As stated above: `request.id` will provide the ID from the incoming request. But, even if no ID was supplied in the request headers, one will be automatically supplied for you. + + [See API docs for more details](https://sanic.readthedocs.io/en/latest/sanic/api_reference.html#sanic.request.Request.id) + +.. column:: + + ```python + @app.route("/") + async def handler(request): + return text(str(request.id)) + + @app.on_response + async def add_request_id_header(request, response): + response.headers["X-Request-ID"] = request.id + ``` + + ```bash + $ curl localhost:8000 -i + HTTP/1.1 200 OK + X-Request-ID: 805a958e-9906-4e7a-8fe0-cbe83590431b + content-length: 36 + connection: keep-alive + content-type: text/plain; charset=utf-8 + + 805a958e-9906-4e7a-8fe0-cbe83590431b + ``` + diff --git a/guide/content/en/guide/basics/listeners.md b/guide/content/en/guide/basics/listeners.md new file mode 100644 index 00000000..4ff7361a --- /dev/null +++ b/guide/content/en/guide/basics/listeners.md @@ -0,0 +1,243 @@ +# Listeners + +Sanic provides you with eight (8) opportunities to inject an operation into the life cycle of your application server. This does not include the [signals](../advanced/signals.md), which allow further injection customization. + +There are two (2) that run **only** on your main Sanic process (ie, once per call to `sanic server.app`.) + +- `main_process_start` +- `main_process_stop` + +There are also two (2) that run **only** in a reloader process if auto-reload has been turned on. + +- `reload_process_start` +- `reload_process_stop` + +*Added `reload_process_start` and `reload_process_stop` in v22.3* + +There are four (4) that enable you to execute startup/teardown code as your server starts or closes. + +- `before_server_start` +- `after_server_start` +- `before_server_stop` +- `after_server_stop` + +The life cycle of a worker process looks like this: + +.. mermaid:: + + sequenceDiagram + autonumber + participant Process + participant Worker + participant Listener + participant Handler + Note over Process: sanic server.app + loop + Process->>Listener: @app.main_process_start + Listener->>Handler: Invoke event handler + end + Process->>Worker: Run workers + loop Start each worker + loop + Worker->>Listener: @app.before_server_start + Listener->>Handler: Invoke event handler + end + Note over Worker: Server status: started + loop + Worker->>Listener: @app.after_server_start + Listener->>Handler: Invoke event handler + end + Note over Worker: Server status: ready + end + Process->>Worker: Graceful shutdown + loop Stop each worker + loop + Worker->>Listener: @app.before_server_stop + Listener->>Handler: Invoke event handler + end + Note over Worker: Server status: stopped + loop + Worker->>Listener: @app.after_server_stop + Listener->>Handler: Invoke event handler + end + Note over Worker: Server status: closed + end + loop + Process->>Listener: @app.main_process_stop + Listener->>Handler: Invoke event handler + end + Note over Process: exit + + +The reloader process live outside of this worker process inside of a process that is responsible for starting and stopping the Sanic processes. Consider the following example: + +```python +@app.reload_process_start +async def reload_start(*_): + print(">>>>>> reload_start <<<<<<") + +@app.main_process_start +async def main_start(*_): + print(">>>>>> main_start <<<<<<") +``` + +If this application were run with auto-reload turned on, the `reload_start` function would be called once. This is contrasted with `main_start`, which would be run every time a file is save and the reloader restarts the applicaition process. + +## Attaching a listener + +.. column:: + + The process to setup a function as a listener is similar to declaring a route. + + The currently running `Sanic()` instance is injected into the listener. + +.. column:: + + ```python + async def setup_db(app): + app.ctx.db = await db_setup() + + app.register_listener(setup_db, "before_server_start") + ``` + + +.. column:: + + The `Sanic` app instance also has a convenience decorator. + +.. column:: + + ```python + @app.listener("before_server_start") + async def setup_db(app): + app.ctx.db = await db_setup() + ``` + + +.. column:: + + Prior to v22.3, both the application instance and the current event loop were injected into the function. However, only the application instance is injected by default. If your function signature will accept both, then both the application and the loop will be injected as shown here. + +.. column:: + + ```python + @app.listener("before_server_start") + async def setup_db(app, loop): + app.ctx.db = await db_setup() + ``` + + +.. column:: + + You can shorten the decorator even further. This is helpful if you have an IDE with autocomplete. + +.. column:: + + ```python + @app.before_server_start + async def setup_db(app): + app.ctx.db = await db_setup() + ``` + +## Order of execution + +Listeners are executed in the order they are declared during startup, and reverse order of declaration during teardown + +| | Phase | Order | +|-----------------------|-----------------|---------| +| `main_process_start` | main startup | regular ๐Ÿ™‚ โฌ‡๏ธ | +| `before_server_start` | worker startup | regular ๐Ÿ™‚ โฌ‡๏ธ | +| `after_server_start` | worker startup | regular ๐Ÿ™‚ โฌ‡๏ธ | +| `before_server_stop` | worker shutdown | ๐Ÿ™ƒ โฌ†๏ธ reverse | +| `after_server_stop` | worker shutdown | ๐Ÿ™ƒ โฌ†๏ธ reverse | +| `main_process_stop` | main shutdown | ๐Ÿ™ƒ โฌ†๏ธ reverse | + +Given the following setup, we should expect to see this in the console if we run two workers. + +.. column:: + + ```python + @app.listener("before_server_start") + async def listener_1(app, loop): + print("listener_1") + + @app.before_server_start + async def listener_2(app, loop): + print("listener_2") + + @app.listener("after_server_start") + async def listener_3(app, loop): + print("listener_3") + + @app.after_server_start + async def listener_4(app, loop): + print("listener_4") + + @app.listener("before_server_stop") + async def listener_5(app, loop): + print("listener_5") + + @app.before_server_stop + async def listener_6(app, loop): + print("listener_6") + + @app.listener("after_server_stop") + async def listener_7(app, loop): + print("listener_7") + + @app.after_server_stop + async def listener_8(app, loop): + print("listener_8") + ``` + +.. column:: + + ```bash + [pid: 1000000] [INFO] Goin' Fast @ http://127.0.0.1:9999 + [pid: 1000000] [INFO] listener_0 + [pid: 1111111] [INFO] listener_1 + [pid: 1111111] [INFO] listener_2 + [pid: 1111111] [INFO] listener_3 + [pid: 1111111] [INFO] listener_4 + [pid: 1111111] [INFO] Starting worker [1111111] + [pid: 1222222] [INFO] listener_1 + [pid: 1222222] [INFO] listener_2 + [pid: 1222222] [INFO] listener_3 + [pid: 1222222] [INFO] listener_4 + [pid: 1222222] [INFO] Starting worker [1222222] + [pid: 1111111] [INFO] Stopping worker [1111111] + [pid: 1222222] [INFO] Stopping worker [1222222] + [pid: 1222222] [INFO] listener_6 + [pid: 1222222] [INFO] listener_5 + [pid: 1222222] [INFO] listener_8 + [pid: 1222222] [INFO] listener_7 + [pid: 1111111] [INFO] listener_6 + [pid: 1111111] [INFO] listener_5 + [pid: 1111111] [INFO] listener_8 + [pid: 1111111] [INFO] listener_7 + [pid: 1000000] [INFO] listener_9 + [pid: 1000000] [INFO] Server Stopped + ``` + In the above example, notice how there are three processes running: + + - `pid: 1000000` - The *main* process + - `pid: 1111111` - Worker 1 + - `pid: 1222222` - Worker 2 + + *Just because our example groups all of one worker and then all of another, in reality since these are running on separate processes, the ordering between processes is not guaranteed. But, you can be sure that a single worker will **always** maintain its order.* + + + +.. tip:: FYI + + The practical result of this is that if the first listener in `before_server_start` handler setups a database connection, listeners that are registered after it can rely upon that connection being alive both when they are started and stopped. + + +## ASGI Mode + +If you are running your application with an ASGI server, then make note of the following changes: + +- `reload_process_start` and `reload_process_stop` will be **ignored** +- `main_process_start` and `main_process_stop` will be **ignored** +- `before_server_start` will run as early as it can, and will be before `after_server_start`, but technically, the server is already running at that point +- `after_server_stop` will run as late as it can, and will be after `before_server_stop`, but technically, the server is still running at that point diff --git a/guide/content/en/guide/basics/middleware.md b/guide/content/en/guide/basics/middleware.md new file mode 100644 index 00000000..a5ce52c1 --- /dev/null +++ b/guide/content/en/guide/basics/middleware.md @@ -0,0 +1,229 @@ +# Middleware + +Whereas listeners allow you to attach functionality to the lifecycle of a worker process, middleware allows you to attach functionality to the lifecycle of an HTTP stream. + +You can execute middleware either _before_ the handler is executed, or _after_. + +.. mermaid:: + + sequenceDiagram + autonumber + participant Worker + participant Middleware + participant MiddlewareHandler + participant RouteHandler + Note over Worker: Incoming HTTP request + loop + Worker->>Middleware: @app.on_request + Middleware->>MiddlewareHandler: Invoke middleware handler + MiddlewareHandler-->>Worker: Return response (optional) + end + rect rgba(255, 13, 104, .1) + Worker->>RouteHandler: Invoke route handler + RouteHandler->>Worker: Return response + end + loop + Worker->>Middleware: @app.on_response + Middleware->>MiddlewareHandler: Invoke middleware handler + MiddlewareHandler-->>Worker: Return response (optional) + end + Note over Worker: Deliver response + +## Attaching middleware + +.. column:: + + This should probably look familiar by now. All you need to do is declare when you would like the middleware to execute: on the `request` or on the `response`. + +.. column:: + + ```python + async def extract_user(request): + request.ctx.user = await extract_user_from_request(request) + + app.register_middleware(extract_user, "request") + ``` + +.. column:: + + Again, the `Sanic` app instance also has a convenience decorator. + +.. column:: + + ```python + @app.middleware("request") + async def extract_user(request): + request.ctx.user = await extract_user_from_request(request) + ``` + +.. column:: + + Response middleware receives both the `request` and `response` arguments. + +.. column:: + + ```python + @app.middleware('response') + async def prevent_xss(request, response): + response.headers["x-xss-protection"] = "1; mode=block" + ``` + +.. column:: + + You can shorten the decorator even further. This is helpful if you have an IDE with autocomplete. + + This is the preferred usage, and is what we will use going forward. + +.. column:: + + ```python + @app.on_request + async def extract_user(request): + ... + + @app.on_response + async def prevent_xss(request, response): + ... + ``` + +## Modification + +Middleware can modify the request or response parameter it is given, _as long as it does not return it_. + + +.. column:: + + #### Order of execution + + 1. Request middleware: `add_key` + 2. Route handler: `index` + 3. Response middleware: `prevent_xss` + 4. Response middleware: `custom_banner` + +.. column:: + + ```python + @app.on_request + async def add_key(request): + # Arbitrary data may be stored in request context: + request.ctx.foo = "bar" + + @app.on_response + async def custom_banner(request, response): + response.headers["Server"] = "Fake-Server" + + @app.on_response + async def prevent_xss(request, response): + response.headers["x-xss-protection"] = "1; mode=block" + + @app.get("/") + async def index(request): + return text(request.ctx.foo) + + ``` + +.. column:: + + You can modify the `request.match_info`. A useful feature that could be used, for example, in middleware to convert `a-slug` to `a_slug`. + +.. column:: + + ```python + @app.on_request + def convert_slug_to_underscore(request: Request): + request.match_info["slug"] = request.match_info["slug"].replace("-", "_") + + @app.get("/") + async def handler(request, slug): + return text(slug) + ``` + ``` + $ curl localhost:9999/foo-bar-baz + foo_bar_baz + ``` + +## Responding early + +.. column:: + + If middleware returns a `HTTPResponse` object, the request will stop processing and the response will be returned. If this occurs to a request before the route handler is reached, the handler will **not** be called. Returning a response will also prevent any further middleware from running. + + + +.. tip:: + + You can return a `None` value to stop the execution of the middleware handler to allow the request to process as normal. This can be useful when using early return to avoid processing requests inside of that middleware handler. + +.. column:: + + ```python + @app.on_request + async def halt_request(request): + return text("I halted the request") + + @app.on_response + async def halt_response(request, response): + return text("I halted the response") + ``` + +## Order of execution + +Request middleware is executed in the order declared. Response middleware is executed in **reverse order**. + +Given the following setup, we should expect to see this in the console. + +.. column:: + + ```python + @app.on_request + async def middleware_1(request): + print("middleware_1") + + @app.on_request + async def middleware_2(request): + print("middleware_2") + + @app.on_response + async def middleware_3(request, response): + print("middleware_3") + + @app.on_response + async def middleware_4(request, response): + print("middleware_4") + + @app.get("/handler") + async def handler(request): + print("~ handler ~") + return text("Done.") + ``` + +.. column:: + + ```bash + middleware_1 + middleware_2 + ~ handler ~ + middleware_4 + middleware_3 + [INFO][127.0.0.1:44788]: GET http://localhost:8000/handler 200 5 + ``` + +### Middleware priority + +.. column:: + + You can modify the order of execution of middleware by assigning it a higher priority. This happens inside of the middleware definition. The higher the value, the earlier it will execute relative to other middleware. The default priority for middleware is `0`. + +.. column:: + + ```python + @app.on_request + async def low_priority(request): + ... + + @app.on_request(priority=99) + async def high_priority(request): + ... + ``` + +*Added in v22.9* diff --git a/guide/content/en/guide/basics/request.md b/guide/content/en/guide/basics/request.md new file mode 100644 index 00000000..aa4f5900 --- /dev/null +++ b/guide/content/en/guide/basics/request.md @@ -0,0 +1,327 @@ +# Request + +The `Request` instance contains **a lot** of helpful information available on its parameters. Refer to the [API documentation](https://sanic.readthedocs.io/) for full details. + +## Body + +The `Request` object allows you to access the content of the request body in a few different ways. + +### JSON + +.. column:: + + **Parameter**: `request.json` + **Description**: The parsed JSON object + +.. column:: + + ```bash + $ curl localhost:8000 -d '{"foo": "bar"}' + ``` + + ```python + >>> print(request.json) + {'foo': 'bar'} + ``` + +### Raw + +.. column:: + + **Parameter**: `request.body` + **Description**: The raw bytes from the request body + +.. column:: + + ```bash + $ curl localhost:8000 -d '{"foo": "bar"}' + ``` + + ```python + >>> print(request.body) + b'{"foo": "bar"}' + ``` + +### Form + +.. column:: + + **Parameter**: `request.form` + **Description**: The form data + + .. tip:: FYI + + The `request.form` object is one of a few types that is a dictionary with each value being a list. This is because HTTP allows a single key to be reused to send multiple values. + + Most of the time you will want to use the `.get()` method to access the first element and not a list. If you do want a list of all items, you can use `.getlist()`. + +.. column:: + + ```bash + $ curl localhost:8000 -d 'foo=bar' + ``` + + ```python + >>> print(request.body) + b'foo=bar' + + >>> print(request.form) + {'foo': ['bar']} + + >>> print(request.form.get("foo")) + bar + + >>> print(request.form.getlist("foo")) + ['bar'] + ``` + +### Uploaded + +.. column:: + + **Parameter**: `request.files` + **Description**: The files uploaded to the server + + .. tip:: FYI + + The `request.files` object is one of a few types that is a dictionary with each value being a list. This is because HTTP allows a single key to be reused to send multiple values. + + Most of the time you will want to use the `.get()` method to access the first element and not a list. If you do want a list of all items, you can use `.getlist()`. + +.. column:: + + ```bash + $ curl -F 'my_file=@/path/to/TEST' http://localhost:8000 + ``` + + ```python + >>> print(request.body) + b'--------------------------cb566ad845ad02d3\r\nContent-Disposition: form-data; name="my_file"; filename="TEST"\r\nContent-Type: application/octet-stream\r\n\r\nhello\n\r\n--------------------------cb566ad845ad02d3--\r\n' + + >>> print(request.files) + {'my_file': [File(type='application/octet-stream', body=b'hello\n', name='TEST')]} + + >>> print(request.files.get("my_file")) + File(type='application/octet-stream', body=b'hello\n', name='TEST') + + >>> print(request.files.getlist("my_file")) + [File(type='application/octet-stream', body=b'hello\n', name='TEST')] + ``` + +## Context + +### Request context + +The `request.ctx` object is your playground to store whatever information you need to about the request. + +This is often used to store items like authenticated user details. We will get more into [middleware](./middleware.md) later, but here is a simple example. + +```python +@app.on_request +async def run_before_handler(request): + request.ctx.user = await fetch_user_by_token(request.token) + +@app.route('/hi') +async def hi_my_name_is(request): + return text("Hi, my name is {}".format(request.ctx.user.name)) +``` + +A typical use case would be to store the user object acquired from database in an authentication middleware. Keys added are accessible to all later middleware as well as the handler over the duration of the request. + +Custom context is reserved for applications and extensions. Sanic itself makes no use of it. + +### Connection context + +.. column:: + + Often times your API will need to serve multiple concurrent (or consecutive) requests to the same client. This happens, for example, very often with progressive web apps that need to query multiple endpoints to get data. + + The HTTP protocol calls for an easing of overhead time caused by the connection with the use of [keep alive headers](../deployment/configuration.md#keep-alive-timeout). + + When multiple requests share a single connection, Sanic provides a context object to allow those requests to share state. + +.. column:: + + ```python + @app.on_request + async def increment_foo(request): + if not hasattr(request.conn_info.ctx, "foo"): + request.conn_info.ctx.foo = 0 + request.conn_info.ctx.foo += 1 + + @app.get("/") + async def count_foo(request): + return text(f"request.conn_info.ctx.foo={request.conn_info.ctx.foo}") + ``` + + ```bash + $ curl localhost:8000 localhost:8000 localhost:8000 + request.conn_info.ctx.foo=1 + request.conn_info.ctx.foo=2 + request.conn_info.ctx.foo=3 + ``` + +### Custom Request Objects + +As dicussed in [application customization](./app.md#custom-requests), you can create a subclass of `sanic.Request` to add additional functionality to the request object. This is useful for adding additional attributes or methods that are specific to your application. + +.. column:: + + For example, imagine your application sends a custom header that contains a user ID. You can create a custom request object that will parse that header and store the user ID for you. + +.. column:: + + ```python + from sanic import Sanic, Request + + class CustomRequest(Request): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.user_id = self.headers.get("X-User-ID") + + app = Sanic("Example", request_class=CustomRequest) + ``` + + +.. column:: + + Now, in your handlers, you can access the `user_id` attribute. + +.. column:: + + ```python + @app.route("/") + async def handler(request: CustomRequest): + return text(f"User ID: {request.user_id}") + ``` + + + +.. new:: NEW in v23.6 + + ### Custom Request Context + +By default, the request context (`request.ctx`) is a `SimpleNamespace` object allowing you to set arbitrary attributes on it. While this is super helpful to reuse logic across your application, it can be difficult in the development experience since the IDE will not know what attributes are available. + +To help with this, you can create a custom request context object that will be used instead of the default `SimpleNamespace`. This allows you to add type hints to the context object and have them be available in your IDE. + +.. column:: + + Start by subclassing the `sanic.Request` class to create a custom request type. Then, you will need to add a `make_context()` method that returns an instance of your custom context object. *NOTE: the `make_context` method should be a static method.* + +.. column:: + + ```python + from sanic import Sanic, Request + from types import SimpleNamespace + + class CustomRequest(Request): + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.ctx.user_id = self.headers.get("X-User-ID") + + @staticmethod + def make_context() -> CustomContext: + return CustomContext() + + @dataclass + class CustomContext: + user_id: str = None + ``` + +*Added in v23.6* + + +## Parameters + +.. column:: + + Values that are extracted from the path are injected into the handler as parameters, or more specifically as keyword arguments. There is much more detail about this in the [Routing section](./routing.md). + +.. column:: + + ```python + @app.route('/tag/') + async def tag_handler(request, tag): + return text("Tag - {}".format(tag)) + ``` + + +## Arguments + +There are two attributes on the `request` instance to get query parameters: + +- `request.args` +- `request.query_args` + +```bash +$ curl http://localhost:8000\?key1\=val1\&key2\=val2\&key1\=val3 +``` + +```python +>>> print(request.args) +{'key1': ['val1', 'val3'], 'key2': ['val2']} + +>>> print(request.args.get("key1")) +val1 + +>>> print(request.args.getlist("key1")) +['val1', 'val3'] + +>>> print(request.query_args) +[('key1', 'val1'), ('key2', 'val2'), ('key1', 'val3')] + +>>> print(request.query_string) +key1=val1&key2=val2&key1=val3 + +``` + + +.. tip:: FYI + + The `request.args` object is one of a few types that is a dictionary with each value being a list. This is because HTTP allows a single key to be reused to send multiple values. + + Most of the time you will want to use the `.get()` method to access the first element and not a list. If you do want a list of all items, you can use `.getlist()`. + + +## Current request getter + +Sometimes you may find that you need access to the current request in your application in a location where it is not accessible. A typical example might be in a `logging` format. You can use `Request.get_current()` to fetch the current request (if any). + +```python +import logging + +from sanic import Request, Sanic, json +from sanic.exceptions import SanicException +from sanic.log import LOGGING_CONFIG_DEFAULTS + +LOGGING_FORMAT = ( + "%(asctime)s - (%(name)s)[%(levelname)s][%(host)s]: " + "%(request_id)s %(request)s %(message)s %(status)d %(byte)d" +) + +old_factory = logging.getLogRecordFactory() + +def record_factory(*args, **kwargs): + record = old_factory(*args, **kwargs) + record.request_id = "" + + try: + request = Request.get_current() + except SanicException: + ... + else: + record.request_id = str(request.id) + + return record + +logging.setLogRecordFactory(record_factory) + +LOGGING_CONFIG_DEFAULTS["formatters"]["access"]["format"] = LOGGING_FORMAT + +app = Sanic("Example", log_config=LOGGING_CONFIG_DEFAULTS) +``` + +In this example, we are adding the `request.id` to every access log message. + +*Added in v22.6* diff --git a/guide/content/en/guide/basics/response.md b/guide/content/en/guide/basics/response.md new file mode 100644 index 00000000..b1fe05c1 --- /dev/null +++ b/guide/content/en/guide/basics/response.md @@ -0,0 +1,265 @@ +# Response + +All [handlers](./handlers.md) *usually* return a response object, and [middleware](./middleware.md) may optionally return a response object. + +To clarify that statement: +- unless the handler is a streaming endpoint handling its own pattern for sending bytes to the client, the return value must be an instance of `sanic.HTTPResponse` (to learn more about this exception see [streaming responses](../advanced/streaming.md#response-streaming)) +- if a middleware returns a response object, that will be used instead of whatever the handler would do (see [middleware](./middleware.md) to learn more) + +A most basic handler would look like the following. The `HTTPResponse` object will allow you to set the status, body, and headers to be returned to the client. + +```python +from sanic import HTTPResponse, Sanic + +app = Sanic("TestApp") + +@app.route("") +def handler(_): + return HTTPResponse() +``` + +However, usually it is easier to use one of the convenience methods discussed below. + +## Methods + +The easiest way to generate a response object is to use one of the nine (9) convenience methods. + +### Text + +.. column:: + + **Default Content-Type**: `text/plain; charset=utf-8` + **Description**: Returns plain text + +.. column:: + + ```python + from sanic import text + + @app.route("/") + async def handler(request): + return text("Hi ๐Ÿ˜Ž") + ``` + +### HTML + +.. column:: + + **Default Content-Type**: `text/html; charset=utf-8` + **Description**: Returns an HTML document + +.. column:: + + ```python + from sanic import html + + @app.route("/") + async def handler(request): + return html('
Hi ๐Ÿ˜Ž
') + ``` + +### JSON + +.. column:: + + **Default Content-Type**: `application/json` + **Description**: Returns a JSON document + +.. column:: + + ```python + from sanic import json + + @app.route("/") + async def handler(request): + return json({"foo": "bar"}) + ``` + + By default, Sanic ships with [`ujson`](https://github.com/ultrajson/ultrajson) as its JSON encoder of choice. It is super simple to change this if you want. + + ```python + from orjson import dumps + + json({"foo": "bar"}, dumps=dumps) + ``` + + If `ujson` is not installed, it will fall back to the standard library `json` module. + + You may additionally declare which implementation to use globally across your application at initialization: + + ```python + from orjson import dumps + + app = Sanic(..., dumps=dumps) + ``` + +### File + +.. column:: + + **Default Content-Type**: N/A + **Description**: Returns a file + +.. column:: + + ```python + from sanic import file + + @app.route("/") + async def handler(request): + return await file("/path/to/whatever.png") + ``` + + Sanic will examine the file, and try and guess its mime type and use an appropriate value for the content type. You could be explicit, if you would like: + + ```python + file("/path/to/whatever.png", mime_type="image/png") + ``` + + You can also choose to override the file name: + + ```python + file("/path/to/whatever.png", filename="super-awesome-incredible.png") + ``` + +### File Streaming + +.. column:: + + **Default Content-Type**: N/A + **Description**: Streams a file to a client, useful when streaming large files, like a video + +.. column:: + + ```python + from sanic.response import file_stream + + @app.route("/") + async def handler(request): + return await file_stream("/path/to/whatever.mp4") + ``` + + Like the `file()` method, `file_stream()` will attempt to determine the mime type of the file. + + + +### Raw + +.. column:: + + **Default Content-Type**: `application/octet-stream` + **Description**: Send raw bytes without encoding the body + +.. column:: + + ```python + from sanic import raw + + @app.route("/") + async def handler(request): + return raw(b"raw bytes") + ``` + +### Redirect + +.. column:: + + **Default Content-Type**: `text/html; charset=utf-8` + **Description**: Send a `302` response to redirect the client to a different path + +.. column:: + + ```python + from sanic import redirect + + @app.route("/") + async def handler(request): + return redirect("/login") + ``` + +### Empty + +.. column:: + + **Default Content-Type**: N/A + **Description**: For responding with an empty message as defined by [RFC 2616](https://tools.ietf.org/search/rfc2616#section-7.2.1) + +.. column:: + + ```python + from sanic import empty + + @app.route("/") + async def handler(request): + return empty() + ``` + + Defaults to a `204` status. + +## Default status + +The default HTTP status code for the response is `200`. If you need to change it, it can be done by the response method. + +```python +@app.post("/") +async def create_new(request): + new_thing = await do_create(request) + return json({"created": True, "id": new_thing.thing_id}, status=201) +``` + +## Returning JSON data + +Starting in v22.12, When you use the `sanic.json` convenience method, it will return a subclass of `HTTPResponse` called `JSONResponse`. This object will +have several convenient methods available to modify common JSON body. + +```python +from sanic import json + +resp = json(...) +``` + +- `resp.set_body()` - Set the body of the JSON object to the value passed +- `resp.append()` - Append a value to the body like `list.append` (only works if the root JSON is an array) +- `resp.extend()` - Extend a value to the body like `list.extend` (only works if the root JSON is an array) +- `resp.update()` - Update the body with a value like `dict.update` (only works if the root JSON is an object) +- `resp.pop()` - Pop a value like `list.pop` or `dict.pop` (only works if the root JSON is an array or an object) + +.. warning:: + + The raw Python object is stored on the `JSONResponse` object as `raw_body`. While it is safe to overwrite this value with a new one, you should **not** attempt to mutate it. You should instead use the methods listed above. + +```python +resp = json({"foo": "bar"}) + +# This is OKAY +resp.raw_body = {"foo": "bar", "something": "else"} + +# This is better +resp.set_body({"foo": "bar", "something": "else"}) + +# This is also works well +resp.update({"something": "else"}) + +# This is NOT OKAY +resp.raw_body.update({"something": "else"}) +``` + +```python +# Or, even treat it like a list +resp = json(["foo", "bar"]) + +# This is OKAY +resp.raw_body = ["foo", "bar", "something", "else"] + +# This is better +resp.extend(["something", "else"]) + +# This is also works well +resp.append("something") +resp.append("else") + +# This is NOT OKAY +resp.raw_body.append("something") +``` + +*Added in v22.9* diff --git a/guide/content/en/guide/basics/routing.md b/guide/content/en/guide/basics/routing.md new file mode 100644 index 00000000..cafaf7a5 --- /dev/null +++ b/guide/content/en/guide/basics/routing.md @@ -0,0 +1,798 @@ +# Routing + +.. column:: + + So far we have seen a lot of this decorator in different forms. + + But what is it? And how do we use it? + +.. column:: + + ```python + @app.route("/stairway") + ... + + @app.get("/to") + ... + + @app.post("/heaven") + ... + ``` + +## Adding a route + +.. column:: + + The most basic way to wire up a handler to an endpoint is with `app.add_route()`. + + See [API docs](https://sanic.readthedocs.io/en/stable/sanic/api_reference.html#sanic.app.Sanic.url_for) for more details. + +.. column:: + + ```python + async def handler(request): + return text("OK") + + app.add_route(handler, "/test") + ``` + + +.. column:: + + By default, routes are available as an HTTP `GET` call. You can change a handler to respond to one or more HTTP methods. + +.. column:: + + ```python + app.add_route( + handler, + '/test', + methods=["POST", "PUT"], + ) + ``` + + +.. column:: + + Using the decorator syntax, the previous example is identical to this. + +.. column:: + + ```python + @app.route('/test', methods=["POST", "PUT"]) + async def handler(request): + return text('OK') + ``` + +## HTTP methods + +Each of the standard HTTP methods has a convenience decorator. + +### GET + +```python +@app.get('/test') +async def handler(request): + return text('OK') +``` + +[MDN Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/GET) + +### POST + +```python +@app.post('/test') +async def handler(request): + return text('OK') +``` + +[MDN Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/POST) + +### PUT + +```python +@app.put('/test') +async def handler(request): + return text('OK') +``` + +[MDN Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PUT) + +### PATCH + +```python +@app.patch('/test') +async def handler(request): + return text('OK') +``` + +[MDN Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/PATCH) + +### DELETE + +```python +@app.delete('/test') +async def handler(request): + return text('OK') +``` + +[MDN Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/DELETE) + +### HEAD + +```python +@app.head('/test') +async def handler(request): + return empty() +``` + +[MDN Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/HEAD) + +### OPTIONS + +```python +@app.options('/test') +async def handler(request): + return empty() +``` + +[MDN Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS) + + +.. warning:: + + By default, Sanic will **only** consume the incoming request body on non-safe HTTP methods (`POST`, `PUT`, `PATCH`, `DELETE`). If you want to receive data in the HTTP request on any other method, you will need to do one of the following two options: + + **Option #1 - Tell Sanic to consume the body using `ignore_body`** + ```python + @app.request("/path", ignore_body=False) + async def handler(_): + ... + ``` + + **Option #2 - Manually consume the body in the handler using `receive_body`** + ```python + @app.get("/path") + async def handler(request: Request): + await request.receive_body() + ``` + + +## Path parameters + +.. column:: + + Sanic allows for pattern matching, and for extracting values from URL paths. These parameters are then injected as keyword arguments in the route handler. + +.. column:: + + ```python + @app.get("/tag/") + async def tag_handler(request, tag): + return text("Tag - {}".format(tag)) + ``` + + +.. column:: + + You can declare a type for the parameter. This will be enforced when matching, and also will type cast the variable. + +.. column:: + + ```python + @app.get("/foo/") + async def uuid_handler(request, foo_id: UUID): + return text("UUID - {}".format(foo_id)) + ``` + +### Supported types + +### `str` + +.. column:: + + **Regular expression applied**: `r"[^/]+"` + **Cast type**: `str` + **Example matches**: + + - `/path/to/Bob` + - `/path/to/Python%203` + + Beginning in v22.3 `str` will *not* match on empty strings. See `strorempty` for this behavior. + +.. column:: + + ```python + @app.route("/path/to/") + async def handler(request, foo: str): + ... + ``` + +### `strorempty` + +.. column:: + + **Regular expression applied**: `r"[^/]*"` + **Cast type**: `str` + **Example matches**: + + - `/path/to/Bob` + - `/path/to/Python%203` + - `/path/to/` + + Unlike the `str` path parameter type, `strorempty` can also match on an empty string path segment. + + *Added in v22.3* + +.. column:: + + ```python + @app.route("/path/to/") + async def handler(request, foo: str): + ... + ``` + +### `int` + +.. column:: + + **Regular expression applied**: `r"-?\d+"` + **Cast type**: `int` + **Example matches**: + + - `/path/to/10` + - `/path/to/-10` + + _Does not match float, hex, octal, etc_ + +.. column:: + + ```python + @app.route("/path/to/") + async def handler(request, foo: int): + ... + ``` + +### `float` + +.. column:: + + **Regular expression applied**: `r"-?(?:\d+(?:\.\d*)?|\.\d+)"` + **Cast type**: `float` + **Example matches**: + + - `/path/to/10` + - `/path/to/-10` + - `/path/to/1.5` + +.. column:: + + ```python + @app.route("/path/to/") + async def handler(request, foo: float): + ... + ``` + +### `alpha` + +.. column:: + + **Regular expression applied**: `r"[A-Za-z]+"` + **Cast type**: `str` + **Example matches**: + + - `/path/to/Bob` + - `/path/to/Python` + + _Does not match a digit, or a space or other special character_ + +.. column:: + + ```python + @app.route("/path/to/") + async def handler(request, foo: str): + ... + ``` + +### `slug` + +.. column:: + + **Regular expression applied**: `r"[a-z0-9]+(?:-[a-z0-9]+)*"` + **Cast type**: `str` + **Example matches**: + + - `/path/to/some-news-story` + - `/path/to/or-has-digits-123` + + *Added in v21.6* + +.. column:: + + + ```python + @app.route("/path/to/") + async def handler(request, article: str): + ... + ``` + +### `path` + +.. column:: + + **Regular expression applied**: `r"[^/].*?"` + **Cast type**: `str` + **Example matches**: + - `/path/to/hello` + - `/path/to/hello.txt` + - `/path/to/hello/world.txt` + + +.. column:: + + ```python + @app.route("/path/to/") + async def handler(request, foo: str): + ... + ``` +.. warning:: + + Because this will match on `/`, you should be careful and thoroughly test your patterns that use `path` so they do not capture traffic intended for another endpoint. Additionally, depending on how you use this type, you may be creating a path traversal vulnerability in your application. It is your job to protect your endpoint against this, but feel free to ask in our community channels for help if you need it :) + +### `ymd` + +.. column:: + + **Regular expression applied**: `r"^([12]\d{3}-(0[1-9]|1[0-2])-(0[1-9]|[12]\d|3[01]))"` + **Cast type**: `datetime.date` + **Example matches**: + + - `/path/to/2021-03-28` + +.. column:: + + ```python + @app.route("/path/to/") + async def handler(request, foo: datetime.date): + ... + ``` + +### `uuid` + +.. column:: + + **Regular expression applied**: `r"[A-Fa-f0-9]{8}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{4}-[A-Fa-f0-9]{12}"` + **Cast type**: `UUID` + **Example matches**: + + - `/path/to/123a123a-a12a-1a1a-a1a1-1a12a1a12345` + +.. column:: + + ```python + @app.route("/path/to/") + async def handler(request, foo: UUID): + ... + ``` + +### ext + +.. column:: + + **Regular expression applied**: n/a + **Cast type**: *varies* + **Example matches**: + +.. column:: + + ```python + @app.route("/path/to/") + async def handler(request, foo: str, ext: str): + ... + ``` + +| definition | example | filename | extension | +| --------------------------------- | ----------- | ----------- | ---------- | +| \ | page.txt | `"page"` | `"txt"` | +| \ | cat.jpg | `"cat"` | `"jpg"` | +| \ | cat.jpg | `"cat"` | `"jpg"` | +| | 123.txt | `123` | `"txt"` | +| | 123.svg | `123` | `"svg"` | +| | 3.14.tar.gz | `3.14` | `"tar.gz"` | + +File extensions can be matched using the special `ext` parameter type. It uses a special format that allows you to specify other types of parameter types as the file name, and one or more specific extensions as shown in the example table above. + +It does *not* support the `path` parameter type. + +*Added in v22.3* + +### regex + +.. column:: + + **Regular expression applied**: _whatever you insert_ + **Cast type**: `str` + **Example matches**: + + - `/path/to/2021-01-01` + + This gives you the freedom to define specific matching patterns for your use case. + + In the example shown, we are looking for a date that is in `YYYY-MM-DD` format. + +.. column:: + + ```python + @app.route(r"/path/to/") + async def handler(request, foo: str): + ... + ``` + +### Regex Matching + + +More often than not, compared with complex routing, the above example is too simple, and we use a completely different routing matching pattern, so here we will explain the advanced usage of regex matching in detail. + +Sometimes, you want to match a part of a route: + +```text +/image/123456789.jpg +``` + +If you wanted to match the file pattern, but only capture the numeric portion, you need to do some regex fun ๐Ÿ˜„: + +```python +app.route(r"/image/\d+)\.jpg>") +``` + +Further, these should all be acceptable: + +```python +@app.get(r"/") # matching on the full pattern +@app.get(r"/") # defining a single matching group +@app.get(r"/[a-z]{3}).txt>") # defining a single named matching group +@app.get(r"/[a-z]{3}).(?:txt)>") # defining a single named matching group, with one or more non-matching groups +``` + +Also, if using a named matching group, it must be the same as the segment label. + +```python +@app.get(r"/\d+).jpg>") # OK +@app.get(r"/\d+).jpg>") # NOT OK +``` + +For more regular usage methods, please refer to [Regular expression operations](https://docs.python.org/3/library/re.html) + +## Generating a URL + +.. column:: + + Sanic provides a method to generate URLs based on the handler method name: `app.url_for()`. This is useful if you want to avoid hardcoding url paths into your app; instead, you can just reference the handler name. + +.. column:: + + ```python + @app.route('/') + async def index(request): + # generate a URL for the endpoint `post_handler` + url = app.url_for('post_handler', post_id=5) + + # Redirect to `/posts/5` + return redirect(url) + + @app.route('/posts/') + async def post_handler(request, post_id): + ... + ``` + + +.. column:: + + You can pass any arbitrary number of keyword arguments. Anything that is _not_ a request parameter will be implemented as a part of the query string. + +.. column:: + + ```python + assert app.url_for( + "post_handler", + post_id=5, + arg_one="one", + arg_two="two", + ) == "/posts/5?arg_one=one&arg_two=two" + ``` + + +.. column:: + + Also supported is passing multiple values for a single query key. + +.. column:: + + ```python + assert app.url_for( + "post_handler", + post_id=5, + arg_one=["one", "two"], + ) == "/posts/5?arg_one=one&arg_one=two" + ``` + +### Special keyword arguments + +See [API Docs]() for more details. + +```python +app.url_for("post_handler", post_id=5, arg_one="one", _anchor="anchor") +# '/posts/5?arg_one=one#anchor' + +# _external requires you to pass an argument _server or set SERVER_NAME in app.config if not url will be same as no _external +app.url_for("post_handler", post_id=5, arg_one="one", _external=True) +# '//server/posts/5?arg_one=one' + +# when specifying _scheme, _external must be True +app.url_for("post_handler", post_id=5, arg_one="one", _scheme="http", _external=True) +# 'http://server/posts/5?arg_one=one' + +# you can pass all special arguments at once +app.url_for("post_handler", post_id=5, arg_one=["one", "two"], arg_two=2, _anchor="anchor", _scheme="http", _external=True, _server="another_server:8888") +# 'http://another_server:8888/posts/5?arg_one=one&arg_one=two&arg_two=2#anchor' +``` + +### Customizing a route name + +.. column:: + + A custom route name can be used by passing a `name` argument while registering the route. + +.. column:: + + ```python + @app.get("/get", name="get_handler") + def handler(request): + return text("OK") + ``` + + +.. column:: + + Now, use this custom name to retrieve the URL + +.. column:: + + ```python + assert app.url_for("get_handler", foo="bar") == "/get?foo=bar" + ``` + +## Websockets routes + +.. column:: + + Websocket routing works similar to HTTP methods. + +.. column:: + + ```python + async def handler(request, ws): + message = "Start" + while True: + await ws.send(message) + message = await ws.recv() + + app.add_websocket_route(handler, "/test") + ``` + + +.. column:: + + It also has a convenience decorator. + +.. column:: + + ```python + @app.websocket("/test") + async def handler(request, ws): + message = "Start" + while True: + await ws.send(message) + message = await ws.recv() + ``` + +Read the [websockets section](/guide/advanced/websockets.md) to learn more about how they work. + +## Strict slashes + + +.. column:: + + Sanic routes can be configured to strictly match on whether or not there is a trailing slash: `/`. This can be configured at a few levels and follows this order of precedence: + + 1. Route + 2. Blueprint + 3. BlueprintGroup + 4. Application + +.. column:: + + ```python + # provide default strict_slashes value for all routes + app = Sanic(__file__, strict_slashes=True) + ``` + + ```python + # overwrite strict_slashes value for specific route + @app.get("/get", strict_slashes=False) + def handler(request): + return text("OK") + ``` + + ```python + # it also works for blueprints + bp = Blueprint(__file__, strict_slashes=True) + + @bp.get("/bp/get", strict_slashes=False) + def handler(request): + return text("OK") + ``` + + ```python + bp1 = Blueprint(name="bp1", url_prefix="/bp1") + bp2 = Blueprint( + name="bp2", + url_prefix="/bp2", + strict_slashes=False, + ) + + # This will enforce strict slashes check on the routes + # under bp1 but ignore bp2 as that has an explicitly + # set the strict slashes check to false + group = Blueprint.group([bp1, bp2], strict_slashes=True) + ``` + +## Static files + +.. column:: + + In order to serve static files from Sanic, use `app.static()`. + + The order of arguments is important: + + 1. Route the files will be served from + 2. Path to the files on the server + + See [API docs](https://sanic.readthedocs.io/en/stable/sanic/api/app.html#sanic.app.Sanic.static) for more details. + +.. column:: + + ```python + app.static("/static/", "/path/to/directory/") + ``` + + + +.. tip:: + + It is generally best practice to end your directory paths with a trailing slash (`/this/is/a/directory/`). This removes ambiguity by being more explicit. + + + + +.. column:: + + You can also serve individual files. + +.. column:: + + ```python + app.static("/", "/path/to/index.html") + ``` + + +.. column:: + + It is also sometimes helpful to name your endpoint + +.. column:: + + ```python + app.static( + "/user/uploads/", + "/path/to/uploads/", + name="uploads", + ) + ``` + + +.. column:: + + Retrieving the URLs works similar to handlers. But, we can also add the `filename` argument when we need a specific file inside a directory. + +.. column:: + + ```python + assert app.url_for( + "static", + name="static", + filename="file.txt", + ) == "/static/file.txt" + ``` + ```python + assert app.url_for( + "static", + name="uploads", + filename="image.png", + ) == "/user/uploads/image.png" + + ``` + + + +.. tip:: + + If you are going to have multiple `static()` routes, then it is *highly* suggested that you manually name them. This will almost certainly alleviate potential hard to discover bugs. + + ```python + app.static("/user/uploads/", "/path/to/uploads/", name="uploads") + app.static("/user/profile/", "/path/to/profile/", name="profile_pics") + ``` + + +#### Auto index serving + +.. column:: + + If you have a directory of static files that should be served by an index page, you can provide the filename of the index. Now, when reaching that directory URL, the index page will be served. + +.. column:: + + ```python + app.static("/foo/", "/path/to/foo/", index="index.html") + ``` + +*Added in v23.3* + +#### File browser + +.. column:: + + When serving a directory from a static handler, Sanic can be configured to show a basic file browser instead using `directory_view=True`. + +.. column:: + + ```python + app.static("/uploads/", "/path/to/dir", directory_view=True) + ``` + +You now have a browsable directory in your web browser: + +![image](/assets/images/directory-view.png) + +*Added in v23.3* + +## Route context + + +.. column:: + + When a route is defined, you can add any number of keyword arguments with a `ctx_` prefix. These values will be injected into the route `ctx` object. + +.. column:: + + ```python + @app.get("/1", ctx_label="something") + async def handler1(request): + ... + + @app.get("/2", ctx_label="something") + async def handler2(request): + ... + + @app.get("/99") + async def handler99(request): + ... + + @app.on_request + async def do_something(request): + if request.route.ctx.label == "something": + ... + ``` + +*Added in v21.12* diff --git a/guide/content/en/guide/basics/tasks.md b/guide/content/en/guide/basics/tasks.md new file mode 100644 index 00000000..a42c5297 --- /dev/null +++ b/guide/content/en/guide/basics/tasks.md @@ -0,0 +1,135 @@ +# Background tasks + +## Creating Tasks +It is often desirable and very convenient to make usage of [tasks](https://docs.python.org/3/library/asyncio-task.html#asyncio.create_task) in async Python. Sanic provides a convenient method to add tasks to the currently **running** loop. It is somewhat similar to `asyncio.create_task`. For adding tasks before the 'App' loop is running, see next section. + +```python +async def notify_server_started_after_five_seconds(): + await asyncio.sleep(5) + print('Server successfully started!') + +app.add_task(notify_server_started_after_five_seconds()) +``` + +.. column:: + + Sanic will attempt to automatically inject the app, passing it as an argument to the task. + +.. column:: + + ```python + async def auto_inject(app): + await asyncio.sleep(5) + print(app.name) + + app.add_task(auto_inject) + ``` + + +.. column:: + + Or you can pass the `app` argument explicitly. + +.. column:: + + ```python + async def explicit_inject(app): + await asyncio.sleep(5) + print(app.name) + + app.add_task(explicit_inject(app)) + ``` + +## Adding tasks before `app.run` + +It is possible to add background tasks before the App is run ie. before `app.run`. To add a task before the App is run, it is recommended to not pass the coroutine object (ie. one created by calling the `async` callable), but instead just pass the callable and Sanic will create the coroutine object on **each worker**. Note: the tasks that are added such are run as `before_server_start` jobs and thus run on every worker (and not in the main process). This has certain consequences, please read [this comment](https://github.com/sanic-org/sanic/issues/2139#issuecomment-868993668) on [this issue](https://github.com/sanic-org/sanic/issues/2139) for further details. + +To add work on the main process, consider adding work to [`@app.main_process_start`](./listeners.md). Note: the workers won't start until this work is completed. + +.. column:: + + Example to add a task before `app.run` + +.. column:: + + ```python + async def slow_work(): + ... + + async def even_slower(num): + ... + + app = Sanic(...) + app.add_task(slow_work) # Note: we are passing the callable and not coroutine object ... + app.add_task(even_slower(10)) # ... or we can call the function and pass the coroutine. + app.run(...) + ``` + +## Named tasks + +.. column:: + + When creating a task, you can ask Sanic to keep track of it for you by providing a `name`. + +.. column:: + + ```python + app.add_task(slow_work, name="slow_task") + ``` + + +.. column:: + + You can now retrieve that task instance from anywhere in your application using `get_task`. + +.. column:: + + ```python + task = app.get_task("slow_task") + ``` + +.. column:: + + If that task needs to be cancelled, you can do that with `cancel_task`. Make sure that you `await` it. + +.. column:: + + ```python + await app.cancel_task("slow_task") + ``` + +.. column:: + + All registered tasks can be found in the `app.tasks` property. To prevent cancelled tasks from filling up, you may want to run `app.purge_tasks` that will clear out any completed or cancelled tasks. + +.. column:: + + ```python + app.purge_tasks() + ``` + +This pattern can be particularly useful with `websockets`: + +```python +async def receiver(ws): + while True: + message = await ws.recv() + if not message: + break + print(f"Received: {message}") + +@app.websocket("/feed") +async def feed(request, ws): + task_name = f"receiver:{request.id}" + request.app.add_task(receiver(ws), name=task_name) + try: + while True: + await request.app.event("my.custom.event") + await ws.send("A message") + finally: + # When the websocket closes, let's cleanup the task + await request.app.cancel_task(task_name) + request.app.purge_tasks() +``` + +*Added in v21.12* diff --git a/guide/content/en/guide/best-practices/blueprints.md b/guide/content/en/guide/best-practices/blueprints.md new file mode 100644 index 00000000..1c716c04 --- /dev/null +++ b/guide/content/en/guide/best-practices/blueprints.md @@ -0,0 +1,453 @@ +# Blueprints + +## Overview + +Blueprints are objects that can be used for sub-routing within an application. Instead of adding routes to the application instance, blueprints define similar methods for adding routes, which are then registered with the application in a flexible and pluggable manner. + +Blueprints are especially useful for larger applications, where your application logic can be broken down into several groups or areas of responsibility. + +## Creating and registering + +.. column:: + + First, you must create a blueprint. It has a very similar API as the `Sanic()` app instance with many of the same decorators. + +.. column:: + + ```python + # ./my_blueprint.py + from sanic.response import json + from sanic import Blueprint + + bp = Blueprint("my_blueprint") + + @bp.route("/") + async def bp_root(request): + return json({"my": "blueprint"}) + ``` + + + +.. column:: + + Next, you register it with the app instance. + +.. column:: + + ```python + from sanic import Sanic + from my_blueprint import bp + + app = Sanic(__name__) + app.blueprint(bp) + ``` + +Blueprints also have the same `websocket()` decorator and `add_websocket_route` method for implementing websockets. + +.. column:: + + Beginning in v21.12, a Blueprint may be registered before or after adding objects to it. Previously, only objects attached to the Blueprint at the time of registration would be loaded into application instance. + +.. column:: + + ```python + app.blueprint(bp) + + @bp.route("/") + async def bp_root(request): + ... + ``` + +## Copying + +.. column:: + + Blueprints along with everything that is attached to them can be copied to new instances using the `copy()` method. The only required argument is to pass it a new `name`. However, you could also use this to override any of the values from the old blueprint. + +.. column:: + + ```python + v1 = Blueprint("Version1", version=1) + + @v1.route("/something") + def something(request): + pass + + v2 = v1.copy("Version2", version=2) + + app.blueprint(v1) + app.blueprint(v2) + ``` + + ``` + Available routes: + /v1/something + /v2/something + + ``` + +*Added in v21.9* + +## Blueprint groups + +Blueprints may also be registered as part of a list or tuple, where the registrar will recursively cycle through any sub-sequences of blueprints and register them accordingly. The Blueprint.group method is provided to simplify this process, allowing a โ€˜mockโ€™ backend directory structure mimicking whatโ€™s seen from the front end. Consider this (quite contrived) example: + +```text +api/ +โ”œโ”€โ”€content/ +โ”‚ โ”œโ”€โ”€authors.py +โ”‚ โ”œโ”€โ”€static.py +โ”‚ โ””โ”€โ”€__init__.py +โ”œโ”€โ”€info.py +โ””โ”€โ”€__init__.py +app.py +``` + +.. column:: + + #### First blueprint + +.. column:: + + ```python + # api/content/authors.py + from sanic import Blueprint + + authors = Blueprint("content_authors", url_prefix="/authors") + ``` + + +.. column:: + + #### Second blueprint + +.. column:: + + ```python + # api/content/static.py + from sanic import Blueprint + + static = Blueprint("content_static", url_prefix="/static") + ``` + + +.. column:: + + #### Blueprint group + +.. column:: + + ```python + # api/content/__init__.py + from sanic import Blueprint + from .static import static + from .authors import authors + + content = Blueprint.group(static, authors, url_prefix="/content") + ``` + + +.. column:: + + #### Third blueprint + +.. column:: + + ```python + # api/info.py + from sanic import Blueprint + + info = Blueprint("info", url_prefix="/info") + ``` + + +.. column:: + + #### Another blueprint group + +.. column:: + + ```python + # api/__init__.py + from sanic import Blueprint + from .content import content + from .info import info + + api = Blueprint.group(content, info, url_prefix="/api") + ``` + + +.. column:: + + #### Main server + + All blueprints are now registered + +.. column:: + + ```python + # app.py + from sanic import Sanic + from .api import api + + app = Sanic(__name__) + app.blueprint(api) + ``` + +### Blueprint group prefixes and composability + +As shown in the code above, when you create a group of blueprints you can extend the URL prefix of all the blueprints in the group by passing the `url_prefix` argument to the `Blueprint.group` method. This is useful for creating a mock directory structure for your API. + + +.. new:: NEW in v23.6 + + In addition, there is a `name_prefix` argument that can be used to make blueprints reusable and composable. The is specifically necessary when applying a single blueprint to multiple groups. By doing this, the blueprint will be registered with a unique name for each group, which allows the blueprint to be registered multiple times and have its routes each properly named with a unique identifier. + +.. column:: + + Consider this example. The routes built will be named as follows: + - `TestApp.group-a_bp1.route1` + - `TestApp.group-a_bp2.route2` + - `TestApp.group-b_bp1.route1` + - `TestApp.group-b_bp2.route2` + +.. column:: + + ```python + bp1 = Blueprint("bp1", url_prefix="/bp1") + bp2 = Blueprint("bp2", url_prefix="/bp2") + + bp1.add_route(lambda _: ..., "/", name="route1") + bp2.add_route(lambda _: ..., "/", name="route2") + + group_a = Blueprint.group( + bp1, bp2, url_prefix="/group-a", name_prefix="group-a" + ) + group_b = Blueprint.group( + bp1, bp2, url_prefix="/group-b", name_prefix="group-b" + ) + + app = Sanic("TestApp") + app.blueprint(group_a) + app.blueprint(group_b) + ``` + +*Name prefixing added in v23.6* + + +## Middleware + +.. column:: + + Blueprints can also have middleware that is specifically registered for its endpoints only. + +.. column:: + + ```python + @bp.middleware + async def print_on_request(request): + print("I am a spy") + + @bp.middleware("request") + async def halt_request(request): + return text("I halted the request") + + @bp.middleware("response") + async def halt_response(request, response): + return text("I halted the response") + ``` + + +.. column:: + + Similarly, using blueprint groups, it is possible to apply middleware to an entire group of nested blueprints. + +.. column:: + + ```python + bp1 = Blueprint("bp1", url_prefix="/bp1") + bp2 = Blueprint("bp2", url_prefix="/bp2") + + @bp1.middleware("request") + async def bp1_only_middleware(request): + print("applied on Blueprint : bp1 Only") + + @bp1.route("/") + async def bp1_route(request): + return text("bp1") + + @bp2.route("/") + async def bp2_route(request, param): + return text(param) + + group = Blueprint.group(bp1, bp2) + + @group.middleware("request") + async def group_middleware(request): + print("common middleware applied for both bp1 and bp2") + + # Register Blueprint group under the app + app.blueprint(group) + ``` + +## Exceptions + +.. column:: + + Just like other [exception handling](./exceptions.md), you can define blueprint specific handlers. + +.. column:: + + ```python + @bp.exception(NotFound) + def ignore_404s(request, exception): + return text("Yep, I totally found the page: {}".format(request.url)) + ``` + +## Static files + +.. column:: + + Blueprints can also have their own static handlers + +.. column:: + + ```python + bp = Blueprint("bp", url_prefix="/bp") + bp.static("/web/path", "/folder/to/serve") + bp.static("/web/path", "/folder/to/server", name="uploads") + ``` + + +.. column:: + + Which can then be retrieved using `url_for()`. See [routing](/guide/basics/routing.md) for more information. + +.. column:: + + ```python + >>> print(app.url_for("static", name="bp.uploads", filename="file.txt")) + '/bp/web/path/file.txt' + ``` + +## Listeners + +.. column:: + + Blueprints can also implement [listeners](/guide/basics/listeners.md). + +.. column:: + + ```python + @bp.listener("before_server_start") + async def before_server_start(app, loop): + ... + + @bp.listener("after_server_stop") + async def after_server_stop(app, loop): + ... + ``` + +## Versioning + +As discussed in the [versioning section](/guide/advanced/versioning.md), blueprints can be used to implement different versions of a web API. + +.. column:: + + The `version` will be prepended to the routes as `/v1` or `/v2`, etc. + +.. column:: + + ```python + auth1 = Blueprint("auth", url_prefix="/auth", version=1) + auth2 = Blueprint("auth", url_prefix="/auth", version=2) + ``` + + +.. column:: + + When we register our blueprints on the app, the routes `/v1/auth` and `/v2/auth` will now point to the individual blueprints, which allows the creation of sub-sites for each API version. + +.. column:: + + ```python + from auth_blueprints import auth1, auth2 + + app = Sanic(__name__) + app.blueprint(auth1) + app.blueprint(auth2) + ``` + + +.. column:: + + It is also possible to group the blueprints under a `BlueprintGroup` entity and version multiple of them together at the + same time. + +.. column:: + + ```python + auth = Blueprint("auth", url_prefix="/auth") + metrics = Blueprint("metrics", url_prefix="/metrics") + + group = Blueprint.group(auth, metrics, version="v1") + + # This will provide APIs prefixed with the following URL path + # /v1/auth/ and /v1/metrics + ``` + +## Composable + +A `Blueprint` may be registered to multiple groups, and each of `BlueprintGroup` itself could be registered and nested further. This creates a limitless possibility `Blueprint` composition. + +*Added in v21.6* + +.. column:: + + Take a look at this example and see how the two handlers are actually mounted as five (5) distinct routes. + +.. column:: + + ```python + app = Sanic(__name__) + blueprint_1 = Blueprint("blueprint_1", url_prefix="/bp1") + blueprint_2 = Blueprint("blueprint_2", url_prefix="/bp2") + group = Blueprint.group( + blueprint_1, + blueprint_2, + version=1, + version_prefix="/api/v", + url_prefix="/grouped", + strict_slashes=True, + ) + primary = Blueprint.group(group, url_prefix="/primary") + + @blueprint_1.route("/") + def blueprint_1_default_route(request): + return text("BP1_OK") + + @blueprint_2.route("/") + def blueprint_2_default_route(request): + return text("BP2_OK") + + app.blueprint(group) + app.blueprint(primary) + app.blueprint(blueprint_1) + + # The mounted paths: + # /api/v1/grouped/bp1/ + # /api/v1/grouped/bp2/ + # /api/v1/primary/grouped/bp1 + # /api/v1/primary/grouped/bp2 + # /bp1 + + ``` + + +## Generating a URL + +When generating a url with `url_for()`, the endpoint name will be in the form: + +```text +{blueprint_name}.{handler_name} +``` diff --git a/guide/content/en/guide/best-practices/decorators.md b/guide/content/en/guide/best-practices/decorators.md new file mode 100644 index 00000000..2dc4973e --- /dev/null +++ b/guide/content/en/guide/best-practices/decorators.md @@ -0,0 +1,176 @@ +# Decorators + +One of the best ways to create a consistent and DRY web API is to make use of decorators to remove functionality from the handlers, and make it repeatable across your views. + +.. column:: + + Therefore, it is very common to see a Sanic view handler with several decorators on it. + +.. column:: + + ```python + @app.get("/orders") + @authorized("view_order") + @validate_list_params() + @inject_user() + async def get_order_details(request, params, user): + ... + ``` + + +## Example + +Here is a starter template to help you create decorators. + +In this example, letโ€™s say you want to check that a user is authorized to access a particular endpoint. You can create a decorator that wraps a handler function, checks a request if the client is authorized to access a resource, and sends the appropriate response. +```python +from functools import wraps +from sanic.response import json + +def authorized(): + def decorator(f): + @wraps(f) + async def decorated_function(request, *args, **kwargs): + # run some method that checks the request + # for the client's authorization status + is_authorized = await check_request_for_authorization_status(request) + + if is_authorized: + # the user is authorized. + # run the handler method and return the response + response = await f(request, *args, **kwargs) + return response + else: + # the user is not authorized. + return json({"status": "not_authorized"}, 403) + return decorated_function + return decorator + +@app.route("/") +@authorized() +async def test(request): + return json({"status": "authorized"}) +``` + +## Templates + +Decorators are **fundamental** to building applications with Sanic. They increase the portability and maintainablity of your code. + +In paraphrasing the Zen of Python: "[decorators] are one honking great idea -- let's do more of those!" + +To make it easier to implement them, here are three examples of copy/pastable code to get you started. + +.. column:: + + Don't forget to add these import statements. Although it is *not* necessary, using `@wraps` helps keep some of the metadata of your function intact. [See docs](https://docs.python.org/3/library/functools.html#functools.wraps). Also, we use the `isawaitable` pattern here to allow the route handlers to by regular or asynchronous functions. + +.. column:: + + ```python + from inspect import isawaitable + from functools import wraps + ``` + +### With args + +.. column:: + + Often, you will want a decorator that will *always* need arguments. Therefore, when it is implemented you will always be calling it. + + ```python + @app.get("/") + @foobar(1, 2) + async def handler(request: Request): + return text("hi") + ``` + +.. column:: + + ```python + def foobar(arg1, arg2): + def decorator(f): + @wraps(f) + async def decorated_function(request, *args, **kwargs): + + response = f(request, *args, **kwargs) + if isawaitable(response): + response = await response + + return response + + return decorated_function + + return decorator + ``` + +### Without args + +.. column:: + + Sometimes you want a decorator that will not take arguments. When this is the case, it is a nice convenience not to have to call it + + ```python + @app.get("/") + @foobar + async def handler(request: Request): + return text("hi") + ``` + +.. column:: + + ```python + def foobar(func): + def decorator(f): + @wraps(f) + async def decorated_function(request, *args, **kwargs): + + response = f(request, *args, **kwargs) + if isawaitable(response): + response = await response + + return response + + return decorated_function + + return decorator(func) + ``` + +### With or Without args + +.. column:: + + If you want a decorator with the ability to be called or not, you can follow this pattern. Using keyword only arguments is not necessary, but might make implementation simpler. + + ```python + @app.get("/") + @foobar(arg1=1, arg2=2) + async def handler(request: Request): + return text("hi") + ``` + + ```python + @app.get("/") + @foobar + async def handler(request: Request): + return text("hi") + ``` + +.. column:: + + ```python + def foobar(maybe_func=None, *, arg1=None, arg2=None): + def decorator(f): + @wraps(f) + async def decorated_function(request, *args, **kwargs): + + response = f(request, *args, **kwargs) + if isawaitable(response): + response = await response + + return response + + return decorated_function + + return decorator(maybe_func) if maybe_func else decorator + ``` + diff --git a/guide/content/en/guide/best-practices/exceptions.md b/guide/content/en/guide/best-practices/exceptions.md new file mode 100644 index 00000000..ffd5a970 --- /dev/null +++ b/guide/content/en/guide/best-practices/exceptions.md @@ -0,0 +1,580 @@ +# Exceptions + +## Using Sanic exceptions + +Sometimes you just need to tell Sanic to halt execution of a handler and send back a status code response. You can raise a `SanicException` for this and Sanic will do the rest for you. + +You can pass an optional `status_code` argument. By default, a SanicException will return an internal server error 500 response. + +```python +from sanic.exceptions import SanicException + +@app.route("/youshallnotpass") +async def no_no(request): + raise SanicException("Something went wrong.", status_code=501) +``` + +Sanic provides a number of standard exceptions. They each automatically will raise the appropriate HTTP status code in your response. [Check the API reference](https://sanic.readthedocs.io/en/latest/sanic/api_reference.html#module-sanic.exceptions) for more details. + +.. column:: + + The more common exceptions you _should_ implement yourself include: + + - `BadRequest` (400) + - `Unauthorized` (401) + - `Forbidden` (403) + - `NotFound` (404) + - `ServerError` (500) + +.. column:: + + ```python + from sanic import exceptions + + @app.route("/login") + async def login(request): + user = await some_login_func(request) + if not user: + raise exceptions.NotFound( + f"Could not find user with username={request.json.username}" + ) + ``` + +## Exception properties + +All exceptions in Sanic derive from `SanicException`. That class has a few properties on it that assist the developer in consistently reporting their exceptions across an application. + +- `message` +- `status_code` +- `quiet` +- `headers` +- `context` +- `extra` + +All of these properties can be passed to the exception when it is created, but the first three can also be used as class variables as we will see. + +.. column:: + + ### `message` + + The `message` property obviously controls the message that will be displayed as with any other exception in Python. What is particularly useful is that you can set the `message` property on the class definition allowing for easy standardization of language across an application + +.. column:: + + ```python + class CustomError(SanicException): + message = "Something bad happened" + + raise CustomError + # or + raise CustomError("Override the default message with something else") + ``` + + +.. column:: + + ### `status_code` + + This property is used to set the response code when the exception is raised. This can particularly be useful when creating custom 400 series exceptions that are usually in response to bad information coming from the client. + +.. column:: + + ```python + class TeapotError(SanicException): + status_code = 418 + message = "Sorry, I cannot brew coffee" + + raise TeapotError + # or + raise TeapotError(status_code=400) + ``` + + +.. column:: + + ### `quiet` + + By default, exceptions will be output by Sanic to the `error_logger`. Sometimes this may not be desirable, especially if you are using exceptions to trigger events in exception handlers (see [the following section](./exceptions.md#handling)). You can suppress the log output using `quiet=True`. + +.. column:: + + ```python + class SilentError(SanicException): + message = "Something happened, but not shown in logs" + quiet = True + + raise SilentError + # or + raise InvalidUsage("blah blah", quiet=True) + ``` + + +.. column:: + + Sometimes while debugging you may want to globally ignore the `quiet=True` property. You can force Sanic to log out all exceptions regardless of this property using `NOISY_EXCEPTIONS` + + *Added in v21.12* + +.. column:: + + ```python + app.config.NOISY_EXCEPTIONS = True + ``` + + +.. column:: + + ### `headers` + + Using `SanicException` as a tool for creating responses is super powerful. This is in part because not only can you control the `status_code`, but you can also control reponse headers directly from the exception. + +.. column:: + + ```python + class MyException(SanicException): + headers = { + "X-Foo": "bar" + } + + raise MyException + # or + raise InvalidUsage("blah blah", headers={ + "X-Foo": "bar" + }) + ``` + + +.. column:: + + ### `extra` + + See [contextual exceptions](./exceptions.md#contextual-exceptions) + + *Added in v21.12* + +.. column:: + + ```python + raise SanicException(..., extra={"name": "Adam"}) + ``` + + +.. column:: + + ### `context` + + See [contextual exceptions](./exceptions.md#contextual-exceptions) + + *Added in v21.12* + +.. column:: + + ```python + raise SanicException(..., context={"foo": "bar"}) + ``` + + +## Handling + +Sanic handles exceptions automatically by rendering an error page, so in many cases you don't need to handle them yourself. However, if you would like more control on what to do when an exception is raised, you can implement a handler yourself. + +Sanic provides a decorator for this, which applies to not only the Sanic standard exceptions, but **any** exception that your application might throw. + +.. column:: + + The easiest method to add a handler is to use `@app.exception()` and pass it one or more exceptions. + +.. column:: + + ```python + from sanic.exceptions import NotFound + + @app.exception(NotFound, SomeCustomException) + async def ignore_404s(request, exception): + return text("Yep, I totally found the page: {}".format(request.url)) + ``` + + +.. column:: + + You can also create a catchall handler by catching `Exception`. + +.. column:: + + ```python + @app.exception(Exception) + async def catch_anything(request, exception): + ... + ``` + + +.. column:: + + You can also use `app.error_handler.add()` to add error handlers. + +.. column:: + + ```python + async def server_error_handler(request, exception): + return text("Oops, server error", status=500) + + app.error_handler.add(Exception, server_error_handler) + ``` + +## Built-in error handling + +Sanic ships with three formats for exceptions: HTML, JSON, and text. You can see examples of them below in the [Fallback handler](#fallback-handler) section. + +.. column:: + + You can control _per route_ which format to use with the `error_format` keyword argument. + + *Added in v21.9* + +.. column:: + + ```python + @app.request("/", error_format="text") + async def handler(request): + ... + ``` + + +## Custom error handling + +In some cases, you might want to add some more error handling functionality to what is provided by default. In that case, you can subclass Sanic's default error handler as such: + +```python +from sanic.handlers import ErrorHandler + +class CustomErrorHandler(ErrorHandler): + def default(self, request: Request, exception: Exception) -> HTTPResponse: + ''' handles errors that have no error handlers assigned ''' + # You custom error handling logic... + status_code = getattr(exception, "status_code", 500) + return json({ + "error": str(exception), + "foo": "bar" + }, status=status_code) + +app.error_handler = CustomErrorHandler() +``` + +## Fallback handler + +Sanic comes with three fallback exception handlers: + +1. HTML +2. Text +3. JSON + +These handlers present differing levels of detail depending upon whether your application is in [debug mode](/guide/deployment/development.md) or not. + +By default, Sanic will be in "auto" mode, which means that it will using the incoming request and potential matching handler to choose the appropriate response format. For example, when in a browser it should always provide an HTML error page. When using curl, you might see JSON or plain text. + +### HTML + +```python +app.config.FALLBACK_ERROR_FORMAT = "html" +``` + +.. column:: + + ```python + app.config.DEBUG = True + ``` + + ![Error](/assets/images/error-display-html-debug.png) + +.. column:: + + ```python + app.config.DEBUG = False + ``` + + ![Error](/assets/images/error-display-html-prod.png) + +### Text + +```python +app.config.FALLBACK_ERROR_FORMAT = "text" +``` + +.. column:: + + ```python + app.config.DEBUG = True + ``` + + ```sh + curl localhost:8000/exc -i + HTTP/1.1 500 Internal Server Error + content-length: 620 + connection: keep-alive + content-type: text/plain; charset=utf-8 + + โš ๏ธ 500 โ€” Internal Server Error + ============================== + That time when that thing broke that other thing? That happened. + + ServerError: That time when that thing broke that other thing? That happened. while handling path /exc + Traceback of TestApp (most recent call last): + + ServerError: That time when that thing broke that other thing? That happened. + File /path/to/sanic/app.py, line 979, in handle_request + response = await response + + File /path/to/server.py, line 16, in handler + do_something(cause_error=True) + + File /path/to/something.py, line 9, in do_something + raise ServerError( + ``` + +.. column:: + + ```python + app.config.DEBUG = False + ``` + + ```sh + curl localhost:8000/exc -i + HTTP/1.1 500 Internal Server Error + content-length: 134 + connection: keep-alive + content-type: text/plain; charset=utf-8 + + โš ๏ธ 500 โ€” Internal Server Error + ============================== + That time when that thing broke that other thing? That happened. + ``` + +### JSON + +```python +app.config.FALLBACK_ERROR_FORMAT = "json" +``` + +.. column:: + + ```python + app.config.DEBUG = True + ``` + + ```sh + curl localhost:8000/exc -i + HTTP/1.1 500 Internal Server Error + content-length: 572 + connection: keep-alive + content-type: application/jso + + { + "description": "Internal Server Error", + "status": 500, + "message": "That time when that thing broke that other thing? That happened.", + "path": "/exc", + "args": {}, + "exceptions": [ + { + "type": "ServerError", + "exception": "That time when that thing broke that other thing? That happened.", + "frames": [ + { + "file": "/path/to/sanic/app.py", + "line": 979, + "name": "handle_request", + "src": "response = await response" + }, + { + "file": "/path/to/server.py", + "line": 16, + "name": "handler", + "src": "do_something(cause_error=True)" + }, + { + "file": "/path/to/something.py", + "line": 9, + "name": "do_something", + "src": "raise ServerError(" + } + ] + } + ] + } + ``` + +.. column:: + + ```python + app.config.DEBUG = False + ``` + + ```sh + curl localhost:8000/exc -i + HTTP/1.1 500 Internal Server Error + content-length: 129 + connection: keep-alive + content-type: application/json + + { + "description": "Internal Server Error", + "status": 500, + "message": "That time when that thing broke that other thing? That happened." + } + + ``` + +### Auto + +Sanic also provides an option for guessing which fallback option to use. + +```python +app.config.FALLBACK_ERROR_FORMAT = "auto" +``` +## Contextual Exceptions + +Default exception messages that simplify the ability to consistently raise exceptions throughout your application. + +```python +class TeapotError(SanicException): + status_code = 418 + message = "Sorry, I cannot brew coffee" + +raise TeapotError +``` + +But this lacks two things: + +1. A dynamic and predictable message format +2. The ability to add additional context to an error message (more on this in a moment) + +*Added in v21.12* + +Using one of Sanic's exceptions, you have two options to provide additional details at runtime: + +```python +raise TeapotError(extra={"foo": "bar"}, context={"foo": "bar"}) +``` + +What's the difference and when should you decide to use each? + +- `extra` - The object itself will **never** be sent to a production client. It is meant for internal use only. What could it be used for? + - Generating (as we will see in a minute) a dynamic error message + - Providing runtime details to a logger + - Debug information (when in development mode, it is rendered) +- `context` - This object is **always** sent to production clients. It is generally meant to be used to send additional details about the context of what happened. What could it be used for? + - Providing alternative values on a `BadRequest` validation issue + - Responding with helpful details for your customers to open a support ticket + - Displaying state information like current logged in user info + +### Dynamic and predictable message using `extra` + +Sanic exceptions can be raised using `extra` keyword arguments to provide additional information to a raised exception instance. + +```python +class TeapotError(SanicException): + status_code = 418 + + @property + def message(self): + return f"Sorry {self.extra['name']}, I cannot make you coffee" + +raise TeapotError(extra={"name": "Adam"}) +``` + +The new feature allows the passing of `extra` meta to the exception instance, which can be particularly useful as in the above example to pass dynamic data into the message text. This `extra` info object **will be suppressed** when in `PRODUCTION` mode, but displayed in `DEVELOPMENT` mode. + +.. column:: + + **DEVELOPMENT** + + ![image](~@assets/images/error-extra-debug.png) + +.. column:: + + **PRODUCTION** + + ![image](~@assets/images/error-extra-prod.png) + +### Additional `context` to an error message + +Sanic exceptions can also be raised with a `context` argument to pass intended information along to the user about what happened. This is particularly useful when creating microservices or an API intended to pass error messages in JSON format. In this use case, we want to have some context around the exception beyond just a parseable error message to return details to the client. + +```python +raise TeapotError(context={"foo": "bar"}) +``` + +This is information **that we want** to always be passed in the error (when it is available). Here is what it should look like: + +.. column:: + + **PRODUCTION** + + ```json + { + "description": "I'm a teapot", + "status": 418, + "message": "Sorry Adam, I cannot make you coffee", + "context": { + "foo": "bar" + } + } + ``` + +.. column:: + + **DEVELOPMENT** + + ```json + { + "description": "I'm a teapot", + "status": 418, + "message": "Sorry Adam, I cannot make you coffee", + "context": { + "foo": "bar" + }, + "path": "/", + "args": {}, + "exceptions": [ + { + "type": "TeapotError", + "exception": "Sorry Adam, I cannot make you coffee", + "frames": [ + { + "file": "handle_request", + "line": 83, + "name": "handle_request", + "src": "" + }, + { + "file": "/tmp/p.py", + "line": 17, + "name": "handler", + "src": "raise TeapotError(" + } + ] + } + ] + } + ``` + + + +.. new:: NEW in v23.6 + + ## Error reporting + + Sanic has a [signal](../advanced/signals.md#built-in-signals) that allows you to hook into the exception reporting process. This is useful if you want to send exception information to a third party service like Sentry or Rollbar. This can be conveniently accomplished by attaching an error reporting handler as show below: + + ```python + @app.report_exception + async def catch_any_exception(app: Sanic, exception: Exception): + print("Caught exception:", exception) + ``` + +.. note:: + + This handler will be dispatched into a background task and **IS NOT** intended for use to manipulate any response data. It is intended to be used for logging or reporting purposes only, and should not impact the ability of your application to return the error response to the client. + +*Added in v23.6* + diff --git a/guide/content/en/guide/best-practices/logging.md b/guide/content/en/guide/best-practices/logging.md new file mode 100644 index 00000000..3630e057 --- /dev/null +++ b/guide/content/en/guide/best-practices/logging.md @@ -0,0 +1,97 @@ +# Logging + +Sanic allows you to do different types of logging (access log, error log) on the requests based on the [Python logging API](https://docs.python.org/3/howto/logging.html). You should have some basic knowledge on Python logging if you want to create a new configuration. + +## Quick Start + +.. column:: + + A simple example using default settings would be like this: + +.. column:: + + ```python + from sanic import Sanic + from sanic.log import logger + from sanic.response import text + + app = Sanic('logging_example') + + @app.route('/') + async def test(request): + logger.info('Here is your log') + return text('Hello World!') + + if __name__ == "__main__": + app.run(debug=True, access_log=True) + ``` + +After the server is running, you should see logs like this. +```text +[2021-01-04 15:26:26 +0200] [1929659] [INFO] Goin' Fast @ http://127.0.0.1:8000 +[2021-01-04 15:26:26 +0200] [1929659] [INFO] Starting worker [1929659] +``` + +You can send a request to server and it will print the log messages. +```text +[2021-01-04 15:26:28 +0200] [1929659] [INFO] Here is your log +[2021-01-04 15:26:28 +0200] - (sanic.access)[INFO][127.0.0.1:44228]: GET http://localhost:8000/ 200 -1 +``` + +## Changing Sanic loggers + +To use your own logging config, simply use `logging.config.dictConfig`, or pass `log_config` when you initialize Sanic app. + +```python +app = Sanic('logging_example', log_config=LOGGING_CONFIG) + +if __name__ == "__main__": + app.run(access_log=False) +``` + + +.. tip:: FYI + + Logging in Python is a relatively cheap operation. However, if you are serving a high number of requests and performance is a concern, all of that time logging out access logs adds up and becomes quite expensive. + + This is a good opportunity to place Sanic behind a proxy (like nginx) and to do your access logging there. You will see a *significant* increase in overall performance by disabling the `access_log`. + + For optimal production performance, it is advised to run Sanic with `debug` and `access_log` disabled: `app.run(debug=False, access_log=False)` + + +## Configuration + +Sanic's default logging configuration is: `sanic.log.LOGGING_CONFIG_DEFAULTS`. + +.. column:: + + There are three loggers used in sanic, and must be defined if you want to create your own logging configuration: + + | **Logger Name** | **Use Case** | + |-----------------|-------------------------------| + | `sanic.root` | Used to log internal messages. | + | `sanic.error` | Used to log error logs. | + | `sanic.access` | Used to log access logs. | + +.. column:: + + + +### Log format + +In addition to default parameters provided by Python (`asctime`, `levelname`, `message`), Sanic provides additional parameters for access logger with. + +| Log Context Parameter | Parameter Value | Datatype | +|-----------------------|---------------------------------------|----------| +| `host` | `request.ip` | `str` | +| `request` | `request.method + " " + request.url` | `str` | +| `status` | `response` | `int` | +| `byte` | `len(response.body)` | `int` | + + + +The default access log format is: + +```text +%(asctime)s - (%(name)s)[%(levelname)s][%(host)s]: %(request)s %(message)s %(status)d %(byte)d +``` diff --git a/guide/content/en/guide/best-practices/testing.md b/guide/content/en/guide/best-practices/testing.md new file mode 100644 index 00000000..a7ac6fda --- /dev/null +++ b/guide/content/en/guide/best-practices/testing.md @@ -0,0 +1,3 @@ +# Testing + +See [sanic-testing](../../plugins/sanic-testing/getting-started.md) diff --git a/guide/content/en/guide/deployment/caddy.md b/guide/content/en/guide/deployment/caddy.md new file mode 100644 index 00000000..adc4583d --- /dev/null +++ b/guide/content/en/guide/deployment/caddy.md @@ -0,0 +1,74 @@ +# Caddy Deployment + +## Introduction + +Caddy is a state-of-the-art web server and proxy that supports up to HTTP/3. Its simplicity lies in its minimalistic configuration and the inbuilt ability to automatically procure TLS certificates for your domains from Let's Encrypt. In this setup, we will configure the Sanic application to serve locally at 127.0.0.1:8001, with Caddy playing the role of the public-facing server for the domain example.com. + +You may install Caddy from your favorite package menager on Windows, Linux and Mac. The package is named `caddy`. + +## Proxied Sanic app + +```python +from sanic import Sanic +from sanic.response import text + +app = Sanic("proxied_example") + +@app.get("/") +def index(request): + # This should display external (public) addresses: + return text( + f"{request.remote_addr} connected to {request.url_for('index')}\n" + f"Forwarded: {request.forwarded}\n" + ) +``` + +To run this application, save as `proxied_example.py`, and use the sanic command-line interface as follows: + +```bash +SANIC_PROXIES_COUNT=1 sanic proxied_example --port 8001 +``` + +Setting the SANIC_PROXIES_COUNT environment variable instructs Sanic to trust the X-Forwarded-* headers sent by Caddy, allowing it to correctly identify the client's IP address and other information. + +## Caddy is simple + +If you have no other web servers running, you can simply run Caddy CLI (needs `sudo` on Linux): + +```bash +caddy reverse-proxy --from example.com --to :8001 +``` + +This is a complete server that includes a certificate for your domain, http-to-https redirect, proxy headers, streaming and WebSockets. Your Sanic application should now be available on the domain you specified by HTTP versions 1, 2 and 3. Remember to open up UDP/443 on your firewall to enable H3 communications. + +All done? + +Soon enough you'll be needing more than one server, or more control over details, which is where the configuration files come in. The above command is equivalent to this `Caddyfile`, serving as a good starting point for your install: + +``` +example.com { + reverse_proxy localhost:8001 +} +``` + +Some Linux distributions install Caddy such that it reads configuration from `/etc/caddy/Caddyfile`, which `import /etc/caddy/conf.d/*` for each site you are running. If not, you'll need to manually run `caddy run` as a system service, pointing it at the proper config file. Alternatively, use Caddy API mode with `caddy run --resume` for persistent config changes. Note that any Caddyfile loading will replace all prior configuration and thus `caddy-api` is not configurable in this traditional manner. + +## Advanced configuration + +At times, you might need to mix static files and handlers at the site root for cleaner URLs. In Sanic, you'd use `app.static("/", "static", index="index.html")` to achieve this. However, for improved performance, you can offload serving static files to Caddy: + +``` +app.example.com { + # Look for static files first, proxy to Sanic if not found + route { + file_server { + root /srv/sanicexample/static + precompress br # brotli your large scripts and styles + pass_thru + } + reverse_proxy unix//tmp/sanic.socket # sanic --unix /tmp/sanic.socket + } +} +``` + +Please refer to [Caddy documentation](https://caddyserver.com/docs/) for more options. diff --git a/guide/content/en/guide/deployment/docker.md b/guide/content/en/guide/deployment/docker.md new file mode 100644 index 00000000..fc2bb05b --- /dev/null +++ b/guide/content/en/guide/deployment/docker.md @@ -0,0 +1,175 @@ +# Docker Deployment + +## Introduction + +For a long time, the environment has always been a difficult problem for deployment. If there are conflicting configurations in your project, you have to spend a lot of time resolving them. Fortunately, virtualization provides us with a good solution. Docker is one of them. If you don't know Docker, you can visit [Docker official website](https://www.docker.com/) to learn more. + +## Build Image + +Let's start with a simple project. We will use a Sanic project as an example. Assume the project path is `/path/to/SanicDocker`. + +.. column:: + + The directory structure looks like this: + +.. column:: + + ```text + # /path/to/SanicDocker + SanicDocker + โ”œโ”€โ”€ requirements.txt + โ”œโ”€โ”€ dockerfile + โ””โ”€โ”€ server.py + ``` + + +.. column:: + + And the `server.py` code looks like this: + +.. column:: + + ```python + app = Sanic("MySanicApp") + + @app.get('/') + async def hello(request): + return text("OK!") + + if __name__ == '__main__': + app.run(host='0.0.0.0', port=8000) + ``` + + + +.. note:: + + Please note that the host cannot be 127.0.0.1 . In docker container, 127.0.0.1 is the default network interface of the container, only the container can communicate with other containers. more information please visit [Docker network](https://docs.docker.com/engine/reference/commandline/network/) + + + +Code is ready, let's write the `Dockerfile`: + +```Dockerfile + +FROM sanicframework/sanic:3.8-latest + +WORKDIR /sanic + +COPY . . + +RUN pip install -r requirements.txt + +EXPOSE 8000 + +CMD ["python", "server.py"] +``` + +Run the following command to build the image: + +```shell +docker build -t my-sanic-image . +``` + +## Start Container + +.. column:: + + After the image built, we can start the container use `my-sanic-image`: + +.. column:: + + ```shell + docker run --name mysanic -p 8000:8000 -d my-sanic-image + ``` + + +.. column:: + + Now we can visit `http://localhost:8000` to see the result: + +.. column:: + + ```text + OK! + ``` + +## Use docker-compose + +If your project consist of multiple services, you can use [docker-compose](https://docs.docker.com/compose/) to manage them. + +for example, we will deploy `my-sanic-image` and `nginx`, achieve through nginx access sanic server. + +.. column:: + + First of all, we need prepare nginx configuration file. create a file named `mysanic.conf`: + +.. column:: + + ```nginx + server { + listen 80; + listen [::]:80; + location / { + proxy_pass http://mysanic:8000/; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection upgrade; + proxy_set_header Accept-Encoding gzip; + } + } + ``` + + +.. column:: + + Then, we need to prepare `docker-compose.yml` file. The content follows: + +.. column:: + + ```yaml + version: "3" + + services: + mysanic: + image: my-sanic-image + ports: + - "8000:8000" + restart: always + + mynginx: + image: nginx:1.13.6-alpine + ports: + - "80:80" + depends_on: + - mysanic + volumes: + - ./mysanic.conf:/etc/nginx/conf.d/mysanic.conf + restart: always + + networks: + default: + driver: bridge + ``` + + +.. column:: + + After that, we can start them: + +.. column:: + + ```shell + docker-compose up -d + ``` + + +.. column:: + + Now, we can visit `http://localhost:80` to see the result: + +.. column:: + + ```text + OK! + ``` + diff --git a/guide/content/en/guide/deployment/kubernetes.md b/guide/content/en/guide/deployment/kubernetes.md new file mode 100644 index 00000000..8d6340de --- /dev/null +++ b/guide/content/en/guide/deployment/kubernetes.md @@ -0,0 +1 @@ +# Kubernetes diff --git a/guide/content/en/guide/deployment/nginx.md b/guide/content/en/guide/deployment/nginx.md new file mode 100644 index 00000000..9496a2b6 --- /dev/null +++ b/guide/content/en/guide/deployment/nginx.md @@ -0,0 +1,172 @@ +# Nginx Deployment + +## Introduction + +Although Sanic can be run directly on Internet, it may be useful to use a proxy +server such as Nginx in front of it. This is particularly useful for running +multiple virtual hosts on the same IP, serving NodeJS or other services beside +a single Sanic app, and it also allows for efficient serving of static files. +TLS and HTTP/2 are also easily implemented on such proxy. + +We are setting the Sanic app to serve only locally at 127.0.0.1:8001, while the +Nginx installation is responsible for providing the service to public Internet +on domain example.com. Static files will be served by Nginx for maximal +performance. + +## Proxied Sanic app + +```python +from sanic import Sanic +from sanic.response import text + +app = Sanic("proxied_example") + +@app.get("/") +def index(request): + # This should display external (public) addresses: + return text( + f"{request.remote_addr} connected to {request.url_for('index')}\n" + f"Forwarded: {request.forwarded}\n" + ) +``` + +Since this is going to be a system service, save your code to +`/srv/sanicservice/proxied_example.py`. + +For testing, run your app in a terminal using the `sanic` CLI in the folder where you saved the file. + +```bash +SANIC_FORWARDED_SECRET=_hostname sanic proxied_example --port 8001 +``` + +We provide Sanic config `FORWARDED_SECRET` to identify which proxy it gets +the remote addresses from. Note the `_` in front of the local hostname. +This gives basic protection against users spoofing these headers and faking +their IP addresses and more. + +## SSL certificates + +Install Certbot and obtain a certicate for all your domains. This will spin up its own webserver on port 80 for a moment to verify you control the given domain names. + +```bash +certbot -d example.com -d www.example.com +``` + +## Nginx configuration + +Quite much configuration is required to allow fast transparent proxying, but +for the most part these don't need to be modified, so bear with me. + + +.. tip:: Note + + Separate upstream section, rather than simply adding the IP after `proxy_pass` + as in most tutorials, is needed for HTTP keep-alive. We also enable streaming, + WebSockets and Nginx serving static files. + + +The following config goes inside the `http` section of `nginx.conf` or if your +system uses multiple config files, `/etc/nginx/sites-available/default` or +your own files (be sure to symlink them to `sites-enabled`): + +```nginx +# Files managed by Certbot +ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; +ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; + +# Sanic service +upstream example.com { + keepalive 100; + server 127.0.0.1:8001; + #server unix:/tmp//sanic.sock; +} + +server { + server_name example.com; + listen 443 ssl http2 default_server; + listen [::]:443 ssl http2 default_server; + # Serve static files if found, otherwise proxy to Sanic + location / { + root /srv/sanicexample/static; + try_files $uri @sanic; + } + location @sanic { + proxy_pass http://$server_name; + # Allow fast streaming HTTP/1.1 pipes (keep-alive, unbuffered) + proxy_http_version 1.1; + proxy_request_buffering off; + proxy_buffering off; + proxy_set_header forwarded by=\"_$hostname\";$for_addr;proto=$scheme;host=\"$http_host\"; + # Allow websockets and keep-alive (avoid connection: close) + proxy_set_header connection "upgrade"; + proxy_set_header upgrade $http_upgrade; + } +} + +# Redirect WWW to no-WWW +server { + listen 443 ssl http2; + listen [::]:443 ssl http2; + server_name ~^www\.(.*)$; + return 308 $scheme://$1$request_uri; +} + +# Redirect all HTTP to HTTPS with no-WWW +server { + listen 80 default_server; + listen [::]:80 default_server; + server_name ~^(?:www\.)?(.*)$; + return 308 https://$1$request_uri; +} + +# Forwarded for= client IP address formatting +map $remote_addr $for_addr { + ~^[0-9.]+$ "for=$remote_addr"; # IPv4 client address + ~^[0-9A-Fa-f:.]+$ "for=\"[$remote_addr]\""; # IPv6 bracketed and quoted + default "for=unknown"; # Unix socket +} +``` + +Start or restart Nginx for changes to take effect. E.g. + +```bash +systemctl restart nginx +``` + +You should be able to connect your app on `https://example.com`. Any 404 +errors and such will be handled by Sanic's error pages, and whenever a static +file is present at a given path, it will be served by Nginx. + +## Running as a service + +This part is for Linux distributions based on `systemd`. Create a unit file +`/etc/systemd/system/sanicexample.service` + +``` +[Unit] +Description=Sanic Example + +[Service] +DynamicUser=Yes +WorkingDirectory=/srv/sanicservice +Environment=SANIC_PROXY_SECRET=_hostname +ExecStart=sanic proxied_example --port 8001 --fast +Restart=always + +[Install] +WantedBy=multi-user.target +``` + +Then reload service files, start your service and enable it on boot: + +```bash +systemctl daemon-reload +systemctl start sanicexample +systemctl enable sanicexample +``` + + +.. tip:: Note + + For brevity we skipped setting up a separate user account and a Python virtual environment or installing your app as a Python module. There are good tutorials on those topics elsewhere that easily apply to Sanic as well. The DynamicUser setting creates a strong sandbox which basically means your application cannot store its data in files, so you may consider setting `User=sanicexample` instead if you need that. + diff --git a/guide/content/en/guide/getting-started.md b/guide/content/en/guide/getting-started.md new file mode 100644 index 00000000..ed8b6bb8 --- /dev/null +++ b/guide/content/en/guide/getting-started.md @@ -0,0 +1,93 @@ +# Getting Started + +Before we begin, make sure you are running Python 3.8 or higher. Currently, Sanic is works with Python versions 3.8 โ€“ 3.11. + +## Install + +```sh +pip install sanic +``` + +## Hello, world application + +.. column:: + + If you have ever used one of the many decorator based frameworks, this probably looks somewhat familiar to you. + + + + .. note:: + + If you are coming from Flask or another framework, there are a few important things to point out. Remember, Sanic aims for performance, flexibility, and ease of use. These guiding principles have tangible impact on the API and how it works. + +.. column:: + + ```python + from sanic import Sanic + from sanic.response import text + + app = Sanic("MyHelloWorldApp") + + @app.get("/") + async def hello_world(request): + return text("Hello, world.") + ``` + +### Important to note + +- Every request handler can either be sync (`def hello_world`) or async (`async def hello_world`). Unless you have a clear reason for it, always go with `async`. +- The `request` object is always the first argument of your handler. Other frameworks pass this around in a context variable to be imported. In the `async` world, this would not work so well and it is far easier (not to mention cleaner and more performant) to be explicit about it. +- You **must** use a response type. MANY other frameworks allow you to have a return value like this: `return "Hello, world."` or this: `return {"foo": "bar"}`. But, in order to do this implicit calling, somewhere in the chain needs to spend valuable time trying to determine what you meant. So, at the expense of this ease, Sanic has decided to require an explicit call. + +### Running + +.. column:: + + Let's save the above file as `server.py`. And launch it. + +.. column:: + + ```sh + sanic server + ``` + +.. note:: + + This **another** important distinction. Other frameworks come with a built in development server and explicitly say that it is _only_ intended for development use. The opposite is true with Sanic. + + **The packaged server is production ready.** + + +## Sanic Extensions + +Sanic intentionally aims for a clean and unopinionated feature list. The project does not want to require you to build your application in a certain way, and tries to avoid prescribing specific development patterns. There are a number of third-party plugins that are built and maintained by the community to add additional features that do not otherwise meet the requirements of the core repository. + +However, in order **to help API developers**, the Sanic organization maintains an official plugin called [Sanic Extensions](../plugins/sanic-ext/getting-started.md) to provide all sorts of goodies, including: + +- **OpenAPI** documentation with Redoc and/or Swagger +- **CORS** protection +- **Dependency injection** into route handlers +- Request query arguments and body input **validation** +- Auto create `HEAD`, `OPTIONS`, and `TRACE` endpoints +- Predefined, endpoint-specific response serializers + +The preferred method to set it up is to install it along with Sanic, but you can also install the packages on their own. + +.. column:: + + ```sh + pip install sanic[ext] + ``` + +.. column:: + + ```sh + pip install sanic sanic-ext + ``` + +Starting in v21.12, Sanic will automatically setup Sanic Extensions if it is in the same environment. You will also have access to two additional application properties: + +- `app.extend()` - used to configure Sanic Extensions +- `app.ext` - the `Extend` instance attached to the application + +See [the plugin documentation](../plugins/sanic-ext/getting-started.md) for more information about how to use and work with the plugin diff --git a/guide/content/en/guide/how-to/README.md b/guide/content/en/guide/how-to/README.md new file mode 100644 index 00000000..8e66fc04 --- /dev/null +++ b/guide/content/en/guide/how-to/README.md @@ -0,0 +1 @@ +# How to ... diff --git a/guide/content/en/guide/how-to/authentication.md b/guide/content/en/guide/how-to/authentication.md new file mode 100644 index 00000000..61cc8f30 --- /dev/null +++ b/guide/content/en/guide/how-to/authentication.md @@ -0,0 +1,117 @@ +# Authentication + +> How do I control authentication and authorization? + +This is an _extremely_ complicated subject to cram into a few snippets. But, this should provide you with an idea on ways to tackle this problem. This example uses [JWTs](https://jwt.io/), but the concepts should be equally applicable to sessions or some other scheme. + +## `server.py` + +```python +from sanic import Sanic, text + +from auth import protected +from login import login + +app = Sanic("AuthApp") +app.config.SECRET = "KEEP_IT_SECRET_KEEP_IT_SAFE" +app.blueprint(login) + +@app.get("/secret") +@protected +async def secret(request): + return text("To go fast, you must be fast.") +``` + +## `login.py` + +```python +import jwt +from sanic import Blueprint, text + +login = Blueprint("login", url_prefix="/login") + +@login.post("/") +async def do_login(request): + token = jwt.encode({}, request.app.config.SECRET) + return text(token) +``` + + + +## `auth.py` + +```python +from functools import wraps + +import jwt +from sanic import text + +def check_token(request): + if not request.token: + return False + + try: + jwt.decode( + request.token, request.app.config.SECRET, algorithms=["HS256"] + ) + except jwt.exceptions.InvalidTokenError: + return False + else: + return True + +def protected(wrapped): + def decorator(f): + @wraps(f) + async def decorated_function(request, *args, **kwargs): + is_authenticated = check_token(request) + + if is_authenticated: + response = await f(request, *args, **kwargs) + return response + else: + return text("You are unauthorized.", 401) + + return decorated_function + + return decorator(wrapped) +``` +This decorator pattern is taken from the [decorators page](/en/guide/best-practices/decorators.md). + +--- + +```bash +$ curl localhost:9999/secret -i +HTTP/1.1 401 Unauthorized +content-length: 21 +connection: keep-alive +content-type: text/plain; charset=utf-8 + +You are unauthorized. + + +$ curl localhost:9999/login -X POST +eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.e30.rjxS7ztIGt5tpiRWS8BGLUqjQFca4QOetHcZTi061DE + + +$ curl localhost:9999/secret -i -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.e30.rjxS7ztIGt5tpiRWS8BGLUqjQFca4QOetHcZTi061DE" +HTTP/1.1 200 OK +content-length: 29 +connection: keep-alive +content-type: text/plain; charset=utf-8 + +To go fast, you must be fast. + + +$ curl localhost:9999/secret -i -H "Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.e30.BAD" +HTTP/1.1 401 Unauthorized +content-length: 21 +connection: keep-alive +content-type: text/plain; charset=utf-8 + +You are unauthorized. +``` + +Also, checkout some resources from the community: + +- Awesome Sanic - [Authorization](https://github.com/mekicha/awesome-sanic/blob/master/README.md#authentication) & [Session](https://github.com/mekicha/awesome-sanic/blob/master/README.md#session) +- [EuroPython 2020 - Overcoming access control in web APIs](https://www.youtube.com/watch?v=Uqgoj43ky6A) diff --git a/guide/content/en/guide/how-to/autodiscovery.md b/guide/content/en/guide/how-to/autodiscovery.md new file mode 100644 index 00000000..56aa16c5 --- /dev/null +++ b/guide/content/en/guide/how-to/autodiscovery.md @@ -0,0 +1,197 @@ +--- +title: Autodiscovery +--- + +# Autodiscovery of Blueprints, Middleware, and Listeners + +> How do I autodiscover the components I am using to build my application? + +One of the first problems someone faces when building an application, is *how* to structure the project. Sanic makes heavy use of decorators to register route handlers, middleware, and listeners. And, after creating blueprints, they need to be mounted to the application. + +A possible solution is a single file in which **everything** is imported and applied to the Sanic instance. Another is passing around the Sanic instance as a global variable. Both of these solutions have their drawbacks. + +An alternative is autodiscovery. You point your application at modules (already imported, or strings), and let it wire everything up. + +## `server.py` + +```python +from sanic import Sanic +from sanic.response import empty + +import blueprints +from utility import autodiscover + +app = Sanic("auto", register=True) +autodiscover( + app, + blueprints, + "parent.child", + "listeners.something", + recursive=True, +) + +app.route("/")(lambda _: empty()) +``` +```bash +[2021-03-02 21:37:02 +0200] [880451] [INFO] Goin' Fast @ http://127.0.0.1:9999 +[2021-03-02 21:37:02 +0200] [880451] [DEBUG] something +[2021-03-02 21:37:02 +0200] [880451] [DEBUG] something @ nested +[2021-03-02 21:37:02 +0200] [880451] [DEBUG] something @ level1 +[2021-03-02 21:37:02 +0200] [880451] [DEBUG] something @ level3 +[2021-03-02 21:37:02 +0200] [880451] [DEBUG] something inside __init__.py +[2021-03-02 21:37:02 +0200] [880451] [INFO] Starting worker [880451] +``` + +## `utility.py` + +```python + +from glob import glob +from importlib import import_module, util +from inspect import getmembers +from pathlib import Path +from types import ModuleType +from typing import Union + +from sanic.blueprints import Blueprint + +def autodiscover( + app, *module_names: Union[str, ModuleType], recursive: bool = False +): + mod = app.__module__ + blueprints = set() + _imported = set() + + def _find_bps(module): + nonlocal blueprints + + for _, member in getmembers(module): + if isinstance(member, Blueprint): + blueprints.add(member) + + for module in module_names: + if isinstance(module, str): + module = import_module(module, mod) + _imported.add(module.__file__) + _find_bps(module) + + if recursive: + base = Path(module.__file__).parent + for path in glob(f"{base}/**/*.py", recursive=True): + if path not in _imported: + name = "module" + if "__init__" in path: + *_, name, __ = path.split("/") + spec = util.spec_from_file_location(name, path) + specmod = util.module_from_spec(spec) + _imported.add(path) + spec.loader.exec_module(specmod) + _find_bps(specmod) + + for bp in blueprints: + app.blueprint(bp) +``` + +## `blueprints/level1.py` + +```python +from sanic import Blueprint +from sanic.log import logger + +level1 = Blueprint("level1") + +@level1.after_server_start +def print_something(app, loop): + logger.debug("something @ level1") +``` + +## `blueprints/one/two/level3.py` + +```python +from sanic import Blueprint +from sanic.log import logger + +level3 = Blueprint("level3") + +@level3.after_server_start +def print_something(app, loop): + logger.debug("something @ level3") +``` + +## `listeners/something.py` + +```python +from sanic import Sanic +from sanic.log import logger + +app = Sanic.get_app("auto") + +@app.after_server_start +def print_something(app, loop): + logger.debug("something") +``` + +## `parent/child/__init__.py` + +```python +from sanic import Blueprint +from sanic.log import logger + +bp = Blueprint("__init__") + +@bp.after_server_start +def print_something(app, loop): + logger.debug("something inside __init__.py") +``` + +## `parent/child/nested.py` + +```python +from sanic import Blueprint +from sanic.log import logger + +nested = Blueprint("nested") + +@nested.after_server_start +def print_something(app, loop): + logger.debug("something @ nested") +``` + +--- + +```text +here is the dir tree +generate with 'find . -type d -name "__pycache__" -exec rm -rf {} +; tree' + +. # run 'sanic sever -d' here +โ”œโ”€โ”€ blueprints +โ”‚ โ”œโ”€โ”€ __init__.py # you need add this file, just empty +โ”‚ โ”œโ”€โ”€ level1.py +โ”‚ โ””โ”€โ”€ one +โ”‚ โ””โ”€โ”€ two +โ”‚ โ””โ”€โ”€ level3.py +โ”œโ”€โ”€ listeners +โ”‚ โ””โ”€โ”€ something.py +โ”œโ”€โ”€ parent +โ”‚ โ””โ”€โ”€ child +โ”‚ โ”œโ”€โ”€ __init__.py +โ”‚ โ””โ”€โ”€ nested.py +โ”œโ”€โ”€ server.py +โ””โ”€โ”€ utility.py +``` + +```sh +source ./.venv/bin/activate # activate the python venv which sanic is installed in +sanic sever -d # run this in the directory containing server.py +``` + +```text +you will see "something ***" like this: + +[2023-07-12 11:23:36 +0000] [113704] [DEBUG] something +[2023-07-12 11:23:36 +0000] [113704] [DEBUG] something inside __init__.py +[2023-07-12 11:23:36 +0000] [113704] [DEBUG] something @ level3 +[2023-07-12 11:23:36 +0000] [113704] [DEBUG] something @ level1 +[2023-07-12 11:23:36 +0000] [113704] [DEBUG] something @ nested +``` + diff --git a/guide/content/en/guide/how-to/cors.md b/guide/content/en/guide/how-to/cors.md new file mode 100644 index 00000000..5fae6808 --- /dev/null +++ b/guide/content/en/guide/how-to/cors.md @@ -0,0 +1,135 @@ +--- +title: CORS +--- + +# Cross-origin resource sharing (CORS) + +> How do I configure my application for CORS? + +.. note:: + + ๐Ÿ† The best solution is to use [Sanic Extensions](../../plugins/sanic-ext/http/cors.md). + + However, if you would like to build your own version, you could use this limited example as a starting point. + +### `server.py` + +```python +from sanic import Sanic, text + +from cors import add_cors_headers +from options import setup_options + +app = Sanic("app") + +@app.route("/", methods=["GET", "POST"]) +async def do_stuff(request): + return text("...") + +# Add OPTIONS handlers to any route that is missing it +app.register_listener(setup_options, "before_server_start") + +# Fill in CORS headers +app.register_middleware(add_cors_headers, "response") +``` + +## `cors.py` + +```python +from typing import Iterable + +def _add_cors_headers(response, methods: Iterable[str]) -> None: + allow_methods = list(set(methods)) + if "OPTIONS" not in allow_methods: + allow_methods.append("OPTIONS") + headers = { + "Access-Control-Allow-Methods": ",".join(allow_methods), + "Access-Control-Allow-Origin": "mydomain.com", + "Access-Control-Allow-Credentials": "true", + "Access-Control-Allow-Headers": ( + "origin, content-type, accept, " + "authorization, x-xsrf-token, x-request-id" + ), + } + response.headers.extend(headers) + +def add_cors_headers(request, response): + if request.method != "OPTIONS": + methods = [method for method in request.route.methods] + _add_cors_headers(response, methods) +``` + +## `options.py` + +```python +from collections import defaultdict +from typing import Dict, FrozenSet + +from sanic import Sanic, response +from sanic.router import Route + +from cors import _add_cors_headers + +def _compile_routes_needing_options( + routes: Dict[str, Route] +) -> Dict[str, FrozenSet]: + needs_options = defaultdict(list) + # This is 21.12 and later. You will need to change this for older versions. + for route in routes.values(): + if "OPTIONS" not in route.methods: + needs_options[route.uri].extend(route.methods) + + return { + uri: frozenset(methods) for uri, methods in dict(needs_options).items() + } + +def _options_wrapper(handler, methods): + def wrapped_handler(request, *args, **kwargs): + nonlocal methods + return handler(request, methods) + + return wrapped_handler + +async def options_handler(request, methods) -> response.HTTPResponse: + resp = response.empty() + _add_cors_headers(resp, methods) + return resp + +def setup_options(app: Sanic, _): + app.router.reset() + needs_options = _compile_routes_needing_options(app.router.routes_all) + for uri, methods in needs_options.items(): + app.add_route( + _options_wrapper(options_handler, methods), + uri, + methods=["OPTIONS"], + ) + app.router.finalize() +``` + +--- + +``` +$ curl localhost:9999/ -i +HTTP/1.1 200 OK +Access-Control-Allow-Methods: OPTIONS,POST,GET +Access-Control-Allow-Origin: mydomain.com +Access-Control-Allow-Credentials: true +Access-Control-Allow-Headers: origin, content-type, accept, authorization, x-xsrf-token, x-request-id +content-length: 3 +connection: keep-alive +content-type: text/plain; charset=utf-8 + +... + +$ curl localhost:9999/ -i -X OPTIONS +HTTP/1.1 204 No Content +Access-Control-Allow-Methods: GET,POST,OPTIONS +Access-Control-Allow-Origin: mydomain.com +Access-Control-Allow-Credentials: true +Access-Control-Allow-Headers: origin, content-type, accept, authorization, x-xsrf-token, x-request-id +connection: keep-alive +``` +Also, checkout some resources from the community: + +- [Awesome Sanic](https://github.com/mekicha/awesome-sanic/blob/master/README.md#frontend) diff --git a/guide/content/en/guide/how-to/csrf.md b/guide/content/en/guide/how-to/csrf.md new file mode 100644 index 00000000..7f982ff1 --- /dev/null +++ b/guide/content/en/guide/how-to/csrf.md @@ -0,0 +1 @@ +csrf diff --git a/guide/content/en/guide/how-to/db.md b/guide/content/en/guide/how-to/db.md new file mode 100644 index 00000000..60ca822e --- /dev/null +++ b/guide/content/en/guide/how-to/db.md @@ -0,0 +1 @@ +connecting to data sources diff --git a/guide/content/en/guide/how-to/decorators.md b/guide/content/en/guide/how-to/decorators.md new file mode 100644 index 00000000..9ef31813 --- /dev/null +++ b/guide/content/en/guide/how-to/decorators.md @@ -0,0 +1 @@ +decorators diff --git a/guide/content/en/guide/how-to/ipv6.md b/guide/content/en/guide/how-to/ipv6.md new file mode 100644 index 00000000..e69de29b diff --git a/guide/content/en/guide/how-to/mounting.md b/guide/content/en/guide/how-to/mounting.md new file mode 100644 index 00000000..8c62eb72 --- /dev/null +++ b/guide/content/en/guide/how-to/mounting.md @@ -0,0 +1,51 @@ +# Application Mounting + +> How do I mount my application at some path above the root? + +```python +# server.py +from sanic import Sanic, text + +app = Sanic("app") +app.config.SERVER_NAME = "example.com/api" + +@app.route("/foo") +def handler(request): + url = app.url_for("handler", _external=True) + return text(f"URL: {url}") +``` + +```yaml +# docker-compose.yml +version: "3.7" +services: + app: + image: nginx:alpine + ports: + - 80:80 + volumes: + - type: bind + source: ./conf + target: /etc/nginx/conf.d/default.conf +``` + +```nginx +# conf +server { + listen 80; + + # Computed data service + location /api/ { + proxy_pass http://:9999/; + proxy_set_header Host example.com; + } +} +``` +```bash +$ docker-compose up -d +$ sanic server.app --port=9999 --host=0.0.0.0 +``` +```bash +$ curl localhost/api/foo +URL: http://example.com/api/foo +``` diff --git a/guide/content/en/guide/how-to/orm.md b/guide/content/en/guide/how-to/orm.md new file mode 100644 index 00000000..07259ea8 --- /dev/null +++ b/guide/content/en/guide/how-to/orm.md @@ -0,0 +1,418 @@ +# ORM + +> How do I use SQLAlchemy with Sanic ? + +All ORM tools can work with Sanic, but non-async ORM tool have a impact on Sanic performance. +There are some orm packages who support + +At present, there are many ORMs that support Python's `async`/`await` keywords. Some possible choices include๏ผš + +- [Mayim](https://ahopkins.github.io/mayim/) +- [SQLAlchemy 1.4](https://docs.sqlalchemy.org/en/14/changelog/changelog_14.html) +- [tortoise-orm](https://github.com/tortoise/tortoise-orm) + +Integration in to your Sanic application is fairly simple: + +## Mayim + +Mayim ships with [an extension for Sanic Extensions](https://ahopkins.github.io/mayim/guide/extensions.html#sanic), which makes it super simple to get started with Sanic. It is certainly possible to run Mayim with Sanic without the extension, but it is recommended because it handles all of the [lifecycle events](https://sanic.dev/en/guide/basics/listeners.html) and [dependency injections](https://sanic.dev/en/plugins/sanic-ext/injection.html). + +.. column:: + + ### Dependencies + + First, we need to install the required dependencies. See [Mayim docs](https://ahopkins.github.io/mayim/guide/install.html#postgres) for the installation needed for your DB driver. + +.. column:: + + ```shell + pip install sanic-ext + pip install mayim[postgres] + ``` + + +.. column:: + + ### Define ORM Model + + Mayim allows you to use whatever you want for models. Whether it is [dataclasses](https://docs.python.org/3/library/dataclasses.html), [pydantic](https://pydantic-docs.helpmanual.io/), [attrs](https://www.attrs.org/en/stable/), or even just plain `dict` objects. Since it works very nicely [out of the box with Pydantic](https://ahopkins.github.io/mayim/guide/pydantic.html), that is what we will use here. + +.. column:: + + ```python + # ./models.py + from pydantic import BaseModel + + class City(BaseModel): + id: int + name: str + district: str + population: int + + class Country(BaseModel): + code: str + name: str + continent: str + region: str + capital: City + ``` + + +.. column:: + + ### Define SQL + + If you are unfamiliar, Mayim is different from other ORMs in that it is one-way, SQL-first. This means you define your own queries either inline, or in a separate `.sql` file, which is what we will do here. + +.. column:: + + ```sql + -- ./queries/select_all_countries.sql + SELECT country.code, + country.name, + country.continent, + country.region, + ( + SELECT row_to_json(q) + FROM ( + SELECT city.id, + city.name, + city.district, + city.population + ) q + ) capital + FROM country + JOIN city ON country.capital = city.id + ORDER BY country.name ASC + LIMIT $limit OFFSET $offset; + ``` + + +.. column:: + + ### Create Sanic App and Async Engine + + We need to create the app instance and attach the `SanicMayimExtension` with any executors. + +.. column:: + + ```python + # ./server.py + from sanic import Sanic, Request, json + from sanic_ext import Extend + from mayim.executor import PostgresExecutor + from mayim.extensions import SanicMayimExtension + from models import Country + + class CountryExecutor(PostgresExecutor): + async def select_all_countries( + self, limit: int = 4, offset: int = 0 + ) -> list[Country]: + ... + + app = Sanic("Test") + Extend.register( + SanicMayimExtension( + executors=[CountryExecutor], + dsn="postgres://...", + ) + ) + ``` + + +.. column:: + + ### Register Routes + + Because we are using Mayim's extension for Sanic, we have the automatic `CountryExecutor` injection into the route handler. It makes for an easy, type-annotated development experience. + +.. column:: + + ```python + @app.get("/") + async def handler(request: Request, executor: CountryExecutor): + countries = await executor.select_all_countries() + return json({"countries": [country.dict() for country in co + ``` + + +.. column:: + + ### Send Requests + +.. column:: + + ```sh + curl 'http://127.0.0.1:8000' + {"countries":[{"code":"AFG","name":"Afghanistan","continent":"Asia","region":"Southern and Central Asia","capital":{"id":1,"name":"Kabul","district":"Kabol","population":1780000}},{"code":"ALB","name":"Albania","continent":"Europe","region":"Southern Europe","capital":{"id":34,"name":"Tirana","district":"Tirana","population":270000}},{"code":"DZA","name":"Algeria","continent":"Africa","region":"Northern Africa","capital":{"id":35,"name":"Alger","district":"Alger","population":2168000}},{"code":"ASM","name":"American Samoa","continent":"Oceania","region":"Polynesia","capital":{"id":54,"name":"Fagatogo","district":"Tutuila","population":2323}}]} + ``` + + +## SQLAlchemy + +Because [SQLAlchemy 1.4](https://docs.sqlalchemy.org/en/14/changelog/changelog_14.html) has added native support for `asyncio`, Sanic can finally work well with SQLAlchemy. Be aware that this functionality is still considered *beta* by the SQLAlchemy project. + + +.. column:: + + ### Dependencies + + First, we need to install the required dependencies. In the past, the dependencies installed were `sqlalchemy` and `pymysql`, but now `sqlalchemy` and `aiomysql` are needed. + +.. column:: + + ```shell + pip install -U sqlalchemy + pip install -U aiomysql + ``` + + +.. column:: + + ### Define ORM Model + + ORM model creation remains the same. + +.. column:: + + ```python + # ./models.py + from sqlalchemy import INTEGER, Column, ForeignKey, String + from sqlalchemy.orm import declarative_base, relationship + + Base = declarative_base() + + class BaseModel(Base): + __abstract__ = True + id = Column(INTEGER(), primary_key=True) + + class Person(BaseModel): + __tablename__ = "person" + name = Column(String()) + cars = relationship("Car") + + def to_dict(self): + return {"name": self.name, "cars": [{"brand": car.brand} for car in self.cars]} + + class Car(BaseModel): + __tablename__ = "car" + + brand = Column(String()) + user_id = Column(ForeignKey("person.id")) + user = relationship("Person", back_populates="cars") + ``` + + +.. column:: + + ### Create Sanic App and Async Engine + + Here we use mysql as the database, and you can also choose PostgreSQL/SQLite. Pay attention to changing the driver from `aiomysql` to `asyncpg`/`aiosqlite`. + +.. column:: + + ```python + # ./server.py + from sanic import Sanic + from sqlalchemy.ext.asyncio import create_async_engine + + app = Sanic("my_app") + + bind = create_async_engine("mysql+aiomysql://root:root@localhost/test", echo=True) + ``` + + +.. column:: + + ### Register Middlewares + + The request middleware creates an usable `AsyncSession` object and set it to `request.ctx` and `_base_model_session_ctx`. + + Thread-safe variable `_base_model_session_ctx` helps you to use the session object instead of fetching it from `request.ctx`. + +.. column:: + + ```python + # ./server.py + from contextvars import ContextVar + + from sqlalchemy.ext.asyncio import AsyncSession + from sqlalchemy.orm import sessionmaker + + _sessionmaker = sessionmaker(bind, AsyncSession, expire_on_commit=False) + + _base_model_session_ctx = ContextVar("session") + + @app.middleware("request") + async def inject_session(request): + request.ctx.session = _sessionmaker() + request.ctx.session_ctx_token = _base_model_session_ctx.set(request.ctx.session) + + @app.middleware("response") + async def close_session(request, response): + if hasattr(request.ctx, "session_ctx_token"): + _base_model_session_ctx.reset(request.ctx.session_ctx_token) + await request.ctx.session.close() + ``` + + +.. column:: + + ### Register Routes + + According to sqlalchemy official docs, `session.query` will be legacy in 2.0, and the 2.0 way to query an ORM object is using `select`. + +.. column:: + + ```python + # ./server.py + from sqlalchemy import select + from sqlalchemy.orm import selectinload + from sanic.response import json + + from models import Car, Person + + @app.post("/user") + async def create_user(request): + session = request.ctx.session + async with session.begin(): + car = Car(brand="Tesla") + person = Person(name="foo", cars=[car]) + session.add_all([person]) + return json(person.to_dict()) + + @app.get("/user/") + async def get_user(request, pk): + session = request.ctx.session + async with session.begin(): + stmt = select(Person).where(Person.id == pk).options(selectinload(Person.cars)) + result = await session.execute(stmt) + person = result.scalar() + + if not person: + return json({}) + + return json(person.to_dict()) + ``` + + +.. column:: + + ### Send Requests + +.. column:: + + ```sh + curl --location --request POST 'http://127.0.0.1:8000/user' + {"name":"foo","cars":[{"brand":"Tesla"}]} + ``` + + ```sh + curl --location --request GET 'http://127.0.0.1:8000/user/1' + {"name":"foo","cars":[{"brand":"Tesla"}]} + ``` + + +## Tortoise-ORM + +.. column:: + + ### Dependencies + + tortoise-orm's dependency is very simple, you just need install tortoise-orm. + +.. column:: + + ```shell + pip install -U tortoise-orm + ``` + + +.. column:: + + ### Define ORM Model + + If you are familiar with Django, you should find this part very familiar. + +.. column:: + + ```python + # ./models.py + from tortoise import Model, fields + + class Users(Model): + id = fields.IntField(pk=True) + name = fields.CharField(50) + + def __str__(self): + return f"I am {self.name}" + ``` + + + +.. column:: + + ### Create Sanic App and Async Engine + + Tortoise-orm provides a set of registration interface, which is convenient for users, and you can use it to create database connection easily. + +.. column:: + + ```python + # ./main.py + + from models import Users + from tortoise.contrib.sanic import register_tortoise + + app = Sanic(__name__) + + register_tortoise( + app, db_url="mysql://root:root@localhost/test", modules={"models": ["models"]}, generate_schemas=True + ) + + ``` + + +.. column:: + + ### Register Routes + +.. column:: + + ```python + # ./main.py + + from models import Users + from sanic import Sanic, response + + @app.route("/user") + async def list_all(request): + users = await Users.all() + return response.json({"users": [str(user) for user in users]}) + + @app.route("/user/") + async def get_user(request, pk): + user = await Users.query(pk=pk) + return response.json({"user": str(user)}) + + if __name__ == "__main__": + app.run(port=5000) + ``` + + +.. column:: + + ### Send Requests + +.. column:: + + ```sh + curl --location --request POST 'http://127.0.0.1:8000/user' + {"users":["I am foo", "I am bar"]} + ``` + + ```sh + curl --location --request GET 'http://127.0.0.1:8000/user/1' + {"user": "I am foo"} + ``` + diff --git a/guide/content/en/guide/how-to/request-id-logging.md b/guide/content/en/guide/how-to/request-id-logging.md new file mode 100644 index 00000000..e69de29b diff --git a/guide/content/en/guide/how-to/serialization.md b/guide/content/en/guide/how-to/serialization.md new file mode 100644 index 00000000..0dfc62d3 --- /dev/null +++ b/guide/content/en/guide/how-to/serialization.md @@ -0,0 +1 @@ +# Serialization diff --git a/guide/content/en/guide/how-to/server-sent-events.md b/guide/content/en/guide/how-to/server-sent-events.md new file mode 100644 index 00000000..7daf8674 --- /dev/null +++ b/guide/content/en/guide/how-to/server-sent-events.md @@ -0,0 +1 @@ +sse diff --git a/guide/content/en/guide/how-to/static-redirects.md b/guide/content/en/guide/how-to/static-redirects.md new file mode 100644 index 00000000..d177756b --- /dev/null +++ b/guide/content/en/guide/how-to/static-redirects.md @@ -0,0 +1,112 @@ +# "Static" Redirects + +> How do I configure static redirects? + +## `app.py` + +```python +### SETUP ### +import typing +import sanic, sanic.response + +# Create the Sanic app +app = sanic.Sanic(__name__) + +# This dictionary represents your "static" +# redirects. For example, these values +# could be pulled from a configuration file. +REDIRECTS = { + '/':'/hello_world', # Redirect '/' to '/hello_world' + '/hello_world':'/hello_world.html' # Redirect '/hello_world' to 'hello_world.html' +} + +# This function will return another function +# that will return the configured value +# regardless of the arguments passed to it. +def get_static_function(value:typing.Any) -> typing.Callable[..., typing.Any]: + return lambda *_, **__: value + +### ROUTING ### +# Iterate through the redirects +for src, dest in REDIRECTS.items(): + # Create the redirect response object + response:sanic.HTTPResponse = sanic.response.redirect(dest) + + # Create the handler function. Typically, + # only a sanic.Request object is passed + # to the function. This object will be + # ignored. + handler = get_static_function(response) + + # Route the src path to the handler + app.route(src)(handler) + +# Route some file and client resources +app.static('/files/', 'files') +app.static('/', 'client') + +### RUN ### +if __name__ == '__main__': + app.run( + '127.0.0.1', + 10000 + ) +``` + +## `client/hello_world.html` + +```html + + + + + + + Hello World + + + +
+ Hello world! +
+ + +``` + +## `client/hello_world.css` + +```css +#hello_world { + width: 1000px; + margin-left: auto; + margin-right: auto; + margin-top: 100px; + + padding: 100px; + color: aqua; + text-align: center; + font-size: 100px; + font-family: monospace; + + background-color: rgba(0, 0, 0, 0.75); + + border-radius: 10px; + box-shadow: 0 4px 8px 0 rgba(0, 0, 0, 0.75); +} + +body { + background-image: url("/files/grottoes.jpg"); + background-repeat: no-repeat; + background-size: cover; +} +``` + +## `files/grottoes.jpg` + +![lake](/assets/images/grottoes.jpg) + +--- + +Also, checkout some resources from the community: + +- [Static Routing Example](https://github.com/Perzan/sanic-static-routing-example) diff --git a/guide/content/en/guide/how-to/table-of-contents.md b/guide/content/en/guide/how-to/table-of-contents.md new file mode 100644 index 00000000..0f92497c --- /dev/null +++ b/guide/content/en/guide/how-to/table-of-contents.md @@ -0,0 +1,13 @@ +# Table of Contents + +We have compiled fully working examples to answer common questions and user cases. For the most part, the examples are as minimal as possible, but should be complete and runnable solutions. + +| Page | How do I ... | +|:-----|:------------| +| [Application mounting](./mounting.md) | ... mount my application at some path above the root? | +| [Authentication](./authentication.md) | ... control authentication and authorization? | +| [Autodiscovery](./autodiscovery.md) | ... autodiscover the components I am using to build my application? | +| [CORS](./cors.md) | ... configure my application for CORS? | +| [ORM](./orm) | ... use an ORM with Sanic? | +| ["Static" Redirects](./static-redirects.md) | ... configure static redirects | +| [TLS/SSL/HTTPS](./tls.md) | ... run Sanic via HTTPS?
... redirect HTTP to HTTPS? | diff --git a/guide/content/en/guide/how-to/task-queue.md b/guide/content/en/guide/how-to/task-queue.md new file mode 100644 index 00000000..c5ee7c54 --- /dev/null +++ b/guide/content/en/guide/how-to/task-queue.md @@ -0,0 +1 @@ +task queue diff --git a/guide/content/en/guide/how-to/tls.md b/guide/content/en/guide/how-to/tls.md new file mode 100644 index 00000000..e77827e7 --- /dev/null +++ b/guide/content/en/guide/how-to/tls.md @@ -0,0 +1,176 @@ +# TLS/SSL/HTTPS + +> How do I run Sanic via HTTPS? + +If you do not have TLS certificates yet, [see the end of this page](./tls.md#get-certificates-for-your-domain-names). + +## Single domain and single certificate + +.. column:: + + Let Sanic automatically load your certificate files, which need to be named `fullchain.pem` and `privkey.pem` in the given folder: + +.. column:: + + ```sh + sudo sanic myserver:app -H :: -p 443 \ + --tls /etc/letsencrypt/live/example.com/ + ``` + ```python + app.run("::", 443, ssl="/etc/letsencrypt/live/example.com/") + ``` + + +.. column:: + + Or, you can pass cert and key filenames separately as a dictionary: + + Additionally, `password` may be added if the key is encrypted, all fields except for the password are passed to `request.conn_info.cert`. + +.. column:: + + ```python + ssl = { + "cert": "/path/to/fullchain.pem", + "key": "/path/to/privkey.pem", + "password": "for encrypted privkey file", # Optional + } + app.run(host="0.0.0.0", port=8443, ssl=ssl) + ``` + + +.. column:: + + Alternatively, [`ssl.SSLContext`](https://docs.python.org/3/library/ssl.html) may be passed, if you need full control over details such as which crypto algorithms are permitted. By default Sanic only allows secure algorithms, which may restrict access from very old devices. + +.. column:: + + ```python + import ssl + + context = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH) + context.load_cert_chain("certs/fullchain.pem", "certs/privkey.pem") + + app.run(host="0.0.0.0", port=8443, ssl=context) + ``` + + +## Multiple domains with separate certificates + +.. column:: + + A list of multiple certificates may be provided, in which case Sanic chooses the one matching the hostname the user is connecting to. This occurs so early in the TLS handshake that Sanic has not sent any packets to the client yet. + + If the client sends no SNI (Server Name Indication), the first certificate on the list will be used even though on the client browser it will likely fail with a TLS error due to name mismatch. To prevent this fallback and to cause immediate disconnection of clients without a known hostname, add `None` as the first entry on the list. `--tls-strict-host` is the equivalent CLI option. + +.. column:: + + ```python + ssl = ["certs/example.com/", "certs/bigcorp.test/"] + app.run(host="0.0.0.0", port=8443, ssl=ssl) + ``` + ```sh + sanic myserver:app + --tls certs/example.com/ + --tls certs/bigcorp.test/ + --tls-strict-host + ``` + +.. tip:: + + You may also use `None` in front of a single certificate if you do not wish to reveal your certificate, true hostname or site content to anyone connecting to the IP address instead of the proper DNS name. + +.. column:: + + Dictionaries can be used on the list. This allows also specifying which domains a certificate matches to, although the names present on the certificate itself cannot be controlled from here. If names are not specified, the names from the certificate itself are used. + + To only allow connections to the main domain **example.com** and only to subdomains of **bigcorp.test**: + +.. column:: + + ```python + ssl = [ + None, # No fallback if names do not match! + { + "cert": "certs/example.com/fullchain.pem", + "key": "certs/example.com/privkey.pem", + "names": ["example.com", "*.bigcorp.test"], + } + ] + app.run(host="0.0.0.0", port=8443, ssl=ssl) + ``` + +## Accessing TLS information in handlers via `request.conn_info` fields + +* `.ssl` - is the connection secure (bool) +* `.cert` - certificate info and dict fields of the currently active cert (dict) +* `.server_name` - the SNI sent by the client (str, may be empty) + +Do note that all `conn_info` fields are per connection, where there may be many requests over time. If a proxy is used in front of your server, these requests on the same pipe may even come from different users. + +## Redirect HTTP to HTTPS, with certificate requests still over HTTP + +In addition to your normal server(s) running HTTPS, run another server for redirection, `http_redir.py`: + +```python +from sanic import Sanic, exceptions, response + +app = Sanic("http_redir") + +# Serve ACME/certbot files without HTTPS, for certificate renewals +app.static("/.well-known", "/var/www/.well-known", resource_type="dir") + +@app.exception(exceptions.NotFound, exceptions.MethodNotSupported) +def redirect_everything_else(request, exception): + server, path = request.server_name, request.path + if server and path.startswith("/"): + return response.redirect(f"https://{server}{path}", status=308) + return response.text("Bad Request. Please use HTTPS!", status=400) +``` + +It is best to setup this as a systemd unit separate of your HTTPS servers. You may need to run HTTP while initially requesting your certificates, while you cannot run the HTTPS server yet. Start for IPv4 and IPv6: + +``` +sanic http_redir:app -H 0.0.0.0 -p 80 +sanic http_redir:app -H :: -p 80 +``` + +Alternatively, it is possible to run the HTTP redirect application from the main application: + +```python +# app == Your main application +# redirect == Your http_redir application +@app.before_server_start +async def start(app, _): + app.ctx.redirect = await redirect.create_server( + port=80, return_asyncio_server=True + ) + app.add_task(runner(redirect, app.ctx.redirect)) + +@app.before_server_stop +async def stop(app, _): + await app.ctx.redirect.close() + +async def runner(app, app_server): + app.is_running = True + try: + app.signalize() + app.finalize() + app.state.is_started = True + await app_server.serve_forever() + finally: + app.is_running = False + app.is_stopping = True +``` + +## Get certificates for your domain names + +You can get free certificates from [Let's Encrypt](https://letsencrypt.org/). Install [certbot](https://certbot.eff.org/) via your package manager, and request a certificate: + +```sh +sudo certbot certonly --key-type ecdsa --preferred-chain "ISRG Root X1" -d example.com -d www.example.com +``` + +Multiple domain names may be added by further `-d` arguments, all stored into a single certificate which gets saved to `/etc/letsencrypt/live/example.com/` as per **the first domain** that you list here. + +The key type and preferred chain options are necessary for getting a minimal size certificate file, essential for making your server run as *fast* as possible. The chain will still contain one RSA certificate until when Let's Encrypt gets their new EC chain trusted in all major browsers. diff --git a/guide/content/en/guide/how-to/validation.md b/guide/content/en/guide/how-to/validation.md new file mode 100644 index 00000000..d45b2dea --- /dev/null +++ b/guide/content/en/guide/how-to/validation.md @@ -0,0 +1 @@ +validation diff --git a/guide/content/en/guide/how-to/websocket-feed.md b/guide/content/en/guide/how-to/websocket-feed.md new file mode 100644 index 00000000..ae2abc2d --- /dev/null +++ b/guide/content/en/guide/how-to/websocket-feed.md @@ -0,0 +1 @@ +websocket feed diff --git a/guide/content/en/guide/introduction.md b/guide/content/en/guide/introduction.md new file mode 100644 index 00000000..3b9ca0d8 --- /dev/null +++ b/guide/content/en/guide/introduction.md @@ -0,0 +1,67 @@ +# Introduction + +Sanic is a Python 3.7+ web server and web framework thatโ€™s written to go fast. It allows the usage of the async/await syntax added in Python 3.5, which makes your code non-blocking and speedy. + +.. attrs:: + :class: introduction-table + + | | | + |--|--| + | Build | [![Tests](https://github.com/sanic-org/sanic/actions/workflows/tests.yml/badge.svg?branch=main)](https://github.com/sanic-org/sanic/actions/workflows/tests.yml) | + | Docs | [![User Guide](https://img.shields.io/badge/user%20guide-sanic-ff0068)](https://sanicframework.org/) [![Documentation](https://readthedocs.org/projects/sanic/badge/?version=latest)](http://sanic.readthedocs.io/en/latest/?badge=latest) | + | Package | [![PyPI](https://img.shields.io/pypi/v/sanic.svg)](https://pypi.python.org/pypi/sanic/) [![PyPI version](https://img.shields.io/pypi/pyversions/sanic.svg)](https://pypi.python.org/pypi/sanic/) [![Wheel](https://img.shields.io/pypi/wheel/sanic.svg)](https://pypi.python.org/pypi/sanic) [![Supported implementations](https://img.shields.io/pypi/implementation/sanic.svg)](https://pypi.python.org/pypi/sanic) [![Code style black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black) | + | Support | [![Forums](https://img.shields.io/badge/forums-community-ff0068.svg)](https://community.sanicframework.org/) [![Discord](https://img.shields.io/discord/812221182594121728?logo=discord)](https://discord.gg/FARQzAEMAA) [![Awesome](https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg)](https://github.com/mekicha/awesome-sanic) | + | Stats | [![Monthly Downloads](https://img.shields.io/pypi/dm/sanic.svg)](https://pepy.tech/project/sanic) [![Weekly Downloads](https://img.shields.io/pypi/dw/sanic.svg)](https://pepy.tech/project/sanic) [![Conda downloads](https://img.shields.io/conda/dn/conda-forge/sanic.svg)](https://anaconda.org/conda-forge/sanic) | + + + +## What is it? + +First things first, before you jump in the water, you should know that Sanic is different than other frameworks. + +Right there in that first sentence there is a huge mistake because Sanic is _both_ a **framework** and a **web server**. In the deployment section we will talk a little bit more about this. + +But, remember, out of the box Sanic comes with everything you need to write, deploy, and scale a production grade web application. :rocket: + +## Goal + +> To provide a simple way to get up and running a highly performant HTTP server that is easy to build, to expand, and ultimately to scale. +## Features + +.. column:: + + ### Core + + - Built in, **_fast_** web server + - Production ready + - Highly scalable + - ASGI compliant + - Simple and intuitive API design + - By the community, for the community + +.. column:: + + ### Sanic Extensions [[learn more](../plugins/sanic-ext/getting-started.md)] + + - CORS protection + - Template rendering with Jinja + - Dependency injection into route handlers + - OpenAPI documentation with Redoc and/or Swagger + - Predefined, endpoint-specific response serializers + - Request query arguments and body input validation + - Auto create `HEAD`, `OPTIONS`, and `TRACE` endpoints + +## Sponsor + +Check out [open collective](https://opencollective.com/sanic-org) to learn more about helping to fund Sanic. + + +## Join the Community + +The main channel for discussion is at the [community forums](https://community.sanicframework.org/). There also is a [Discord Server](https://discord.gg/FARQzAEMAA) for live discussion and chat. + +The Stackoverflow `[sanic]` tag is [actively monitored](https://stackoverflow.com/questions/tagged/sanic) by project maintainers. + +## Contribution + +We are always happy to have new contributions. We have [marked issues good for anyone looking to get started](https://github.com/sanic-org/sanic/issues?q=is%3Aopen+is%3Aissue+label%3Abeginner), and welcome [questions/answers/discussion on the forums](https://community.sanicframework.org/). Please take a look at our [Contribution guidelines](https://github.com/sanic-org/sanic/blob/master/CONTRIBUTING.rst). diff --git a/guide/content/en/guide/running/app-loader.md b/guide/content/en/guide/running/app-loader.md new file mode 100644 index 00000000..d0ebe41d --- /dev/null +++ b/guide/content/en/guide/running/app-loader.md @@ -0,0 +1,85 @@ +# Dynamic Applications + +Running Sanic has been optimized to work with the CLI. If you have not read it yet, you should read [Running Sanic](./running.md#sanic-server) to become familiar with the options. + +.. column:: + + This includes running it as a global scope object... + +.. column:: + + ```sh + sanic path.to.server:app + ``` + ```python + # server.py + app = Sanic("TestApp") + + @app.get("/") + async def handler(request: Request): + return json({"foo": "bar"}) + ``` + + + +.. column:: + + ...or, a factory function that creates the `Sanic` application object. + +.. column:: + + ```sh + sanic path.to.server:create_app --factory + ``` + ```python + # server.py + def create_app(): + app = Sanic("TestApp") + + @app.get("/") + async def handler(request: Request): + return json({"foo": "bar"}) + + return app + ``` + + +**Sometimes, this is not enough ... ๐Ÿค”** + +Introduced in [v22.9](../release-notes/v22.9.md), Sanic has an `AppLoader` object that is responsible for creating an application in the various [worker processes](./manager.md#how-sanic-server-starts-processes). You can take advantage of this if you need to create a more dynamic startup experience for your application. + +.. column:: + + An `AppLoader` can be passed a callable that returns a `Sanic` instance. That `AppLoader` could be used with the low-level application running API. + +.. column:: + + ```python + import sys + from functools import partial + + from sanic import Request, Sanic, json + from sanic.worker.loader import AppLoader + + def attach_endpoints(app: Sanic): + @app.get("/") + async def handler(request: Request): + return json({"app_name": request.app.name}) + + def create_app(app_name: str) -> Sanic: + app = Sanic(app_name) + attach_endpoints(app) + return app + + if __name__ == "__main__": + app_name = sys.argv[-1] + loader = AppLoader(factory=partial(create_app, app_name)) + app = loader.load() + app.prepare(port=9999, dev=True) + Sanic.serve(primary=app, app_loader=loader) + ``` + ```sh + python path/to/server.py MyTestAppName + ``` + +In the above example, the `AppLoader` is created with a `factory` that can be used to create copies of the same application across processes. When doing this, you should explicitly use the `Sanic.serve` pattern shown above so that the `AppLoader` that you create is not replaced. diff --git a/guide/content/en/guide/running/configuration.md b/guide/content/en/guide/running/configuration.md new file mode 100644 index 00000000..71654c87 --- /dev/null +++ b/guide/content/en/guide/running/configuration.md @@ -0,0 +1,291 @@ +# Configuration + +## Basics + + +.. column:: + + Sanic holds the configuration in the config attribute of the application object. The configuration object is merely an object that can be modified either using dot-notation or like a dictionary. + +.. column:: + + ```python + app = Sanic("myapp") + app.config.DB_NAME = "appdb" + app.config["DB_USER"] = "appuser" + ``` + + +.. column:: + + You can also use the `update()` method like on regular dictionaries. + +.. column:: + + ```python + db_settings = { + 'DB_HOST': 'localhost', + 'DB_NAME': 'appdb', + 'DB_USER': 'appuser' + } + app.config.update(db_settings) + ``` + + + +.. note:: + + It is standard practice in Sanic to name your config values in **uppercase letters**. Indeed, you may experience weird behaviors if you start mixing uppercase and lowercase names. + + + +## Loading + +### Environment variables + +.. column:: + + Any environment variables defined with the `SANIC_` prefix will be applied to the Sanic config. For example, setting `SANIC_REQUEST_TIMEOUT` will be loaded by the application automatically and fed into the `REQUEST_TIMEOUT` config variable. + +.. column:: + + ```bash + $ export SANIC_REQUEST_TIMEOUT=10 + ``` + ```python + >>> print(app.config.REQUEST_TIMEOUT) + 10 + ``` + + +.. column:: + + You can change the prefix that Sanic is expecting at startup. + +.. column:: + + ```bash + $ export MYAPP_REQUEST_TIMEOUT=10 + ``` + ```python + >>> app = Sanic(__name__, env_prefix='MYAPP_') + >>> print(app.config.REQUEST_TIMEOUT) + 10 + ``` + + +.. column:: + + You can also disable environment variable loading completely. + +.. column:: + + ```python + app = Sanic(__name__, load_env=False) + ``` + +### Using Sanic.update_config + +The `Sanic` instance has a _very_ versatile method for loading config: `app.update_config`. You can feed it a path to a file, a dictionary, a class, or just about any other sort of object. + +#### From a file + +.. column:: + + Let's say you have `my_config.py` file that looks like this. + +.. column:: + + ```python + # my_config.py + A = 1 + B = 2 + ``` + + +.. column:: + + You can load this as config values by passing its path to `app.update_config`. + +.. column:: + + ```python + >>> app.update_config("/path/to/my_config.py") + >>> print(app.config.A) + 1 + ``` + + +.. column:: + + This path also accepts bash style environment variables. + +.. column:: + + ```bash + $ export my_path="/path/to" + ``` + ```python + app.update_config("${my_path}/my_config.py") + ``` + + + +.. note:: + + Just remember that you have to provide environment variables in the format `${environment_variable}` and that `$environment_variable` is not expanded (is treated as "plain" text). + + + +#### From a dict + +.. column:: + + The `app.update_config` method also works on plain dictionaries. + +.. column:: + + ```python + app.update_config({"A": 1, "B": 2}) + ``` + +#### From a class or object + +.. column:: + + You can define your own config class, and pass it to `app.update_config` + +.. column:: + + ```python + class MyConfig: + A = 1 + B = 2 + + app.update_config(MyConfig) + ``` + + +.. column:: + + It even could be instantiated. + +.. column:: + + ```python + app.update_config(MyConfig()) + ``` + +### Type casting + +When loading from environment variables, Sanic will attempt to cast the values to expected Python types. This particularly applies to: + +- `int` +- `float` +- `bool` + +In regards to `bool`, the following _case insensitive_ values are allowed: + +- **`True`**: `y`, `yes`, `yep`, `yup`, `t`, `true`, `on`, `enable`, `enabled`, `1` +- **`False`**: `n`, `no`, `f`, `false`, `off`, `disable`, `disabled`, `0` + +If a value cannot be cast, it will default to a `str`. + +.. column:: + + Additionally, Sanic can be configured to cast additional types using additional type converters. This should be any callable that returns the value or raises a `ValueError`. + + *Added in v21.12* + +.. column:: + + ```python + app = Sanic(..., config=Config(converters=[UUID])) + ``` + +## Builtin values + +| **Variable** | **Default** | **Description** | +|---------------------------|------------------|---------------------------------------------------------------------------------------------------------------------------------------| +| ACCESS_LOG | True | Disable or enable access log | +| AUTO_EXTEND | True | Control whether [Sanic Extensions](../../plugins/sanic-ext/getting-started.md) will load if it is in the existing virtual environment | +| AUTO_RELOAD | True | Control whether the application will automatically reload when a file changes | +| EVENT_AUTOREGISTER | True | When `True` using the `app.event()` method on a non-existing signal will automatically create it and not raise an exception | +| FALLBACK_ERROR_FORMAT | html | Format of error response if an exception is not caught and handled | +| FORWARDED_FOR_HEADER | X-Forwarded-For | The name of "X-Forwarded-For" HTTP header that contains client and proxy ip | +| FORWARDED_SECRET | None | Used to securely identify a specific proxy server (see below) | +| GRACEFUL_SHUTDOWN_TIMEOUT | 15.0 | How long to wait to force close non-idle connection (sec) | +| INSPECTOR | False | Whether to enable the Inspector | +| INSPECTOR_HOST | localhost | The host for the Inspector | +| INSPECTOR_PORT | 6457 | The port for the Inspector | +| INSPECTOR_TLS_KEY | - | The TLS key for the Inspector | +| INSPECTOR_TLS_CERT | - | The TLS certificate for the Inspector | +| INSPECTOR_API_KEY | - | The API key for the Inspector | +| KEEP_ALIVE_TIMEOUT | 120 | How long to hold a TCP connection open (sec) | +| KEEP_ALIVE | True | Disables keep-alive when False | +| MOTD | True | Whether to display the MOTD (message of the day) at startup | +| MOTD_DISPLAY | {} | Key/value pairs to display additional, arbitrary data in the MOTD | +| NOISY_EXCEPTIONS | False | Force all `quiet` exceptions to be logged | +| PROXIES_COUNT | None | The number of proxy servers in front of the app (e.g. nginx; see below) | +| REAL_IP_HEADER | None | The name of "X-Real-IP" HTTP header that contains real client ip | +| REGISTER | True | Whether the app registry should be enabled | +| REQUEST_BUFFER_SIZE | 65536 | Request buffer size before request is paused, default is 64 Kib | +| REQUEST_ID_HEADER | X-Request-ID | The name of "X-Request-ID" HTTP header that contains request/correlation ID | +| REQUEST_MAX_SIZE | 100000000 | How big a request may be (bytes), default is 100 megabytes | +| REQUEST_MAX_HEADER_SIZE | 8192 | How big a request header may be (bytes), default is 8192 bytes | +| REQUEST_TIMEOUT | 60 | How long a request can take to arrive (sec) | +| RESPONSE_TIMEOUT | 60 | How long a response can take to process (sec) | +| USE_UVLOOP | True | Whether to override the loop policy to use `uvloop`. Supported only with `app.run`. | +| WEBSOCKET_MAX_SIZE | 2^20 | Maximum size for incoming messages (bytes) | +| WEBSOCKET_PING_INTERVAL | 20 | A Ping frame is sent every ping_interval seconds. | +| WEBSOCKET_PING_TIMEOUT | 20 | Connection is closed when Pong is not received after ping_timeout seconds | + + +.. tip:: FYI + + - The `USE_UVLOOP` value will be ignored if running with Gunicorn. Defaults to `False` on non-supported platforms (Windows). + - The `WEBSOCKET_` values will be ignored if in ASGI mode. + - v21.12 added: `AUTO_EXTEND`, `MOTD`, `MOTD_DISPLAY`, `NOISY_EXCEPTIONS` + - v22.9 added: `INSPECTOR` + - v22.12 added: `INSPECTOR_HOST`, `INSPECTOR_PORT`, `INSPECTOR_TLS_KEY`, `INSPECTOR_TLS_CERT`, `INSPECTOR_API_KEY` + + +## Timeouts + +### REQUEST_TIMEOUT + +A request timeout measures the duration of time between the instant when a new open TCP connection is passed to the +Sanic backend server, and the instant when the whole HTTP request is received. If the time taken exceeds the +`REQUEST_TIMEOUT` value (in seconds), this is considered a Client Error so Sanic generates an `HTTP 408` response +and sends that to the client. Set this parameter's value higher if your clients routinely pass very large request payloads +or upload requests very slowly. + +### RESPONSE_TIMEOUT + +A response timeout measures the duration of time between the instant the Sanic server passes the HTTP request to the Sanic App, and the instant a HTTP response is sent to the client. If the time taken exceeds the `RESPONSE_TIMEOUT` value (in seconds), this is considered a Server Error so Sanic generates an `HTTP 503` response and sends that to the client. Set this parameter's value higher if your application is likely to have long-running process that delay the +generation of a response. + +### KEEP_ALIVE_TIMEOUT + +#### What is Keep Alive? And what does the Keep Alive Timeout value do? + +`Keep-Alive` is a HTTP feature introduced in `HTTP 1.1`. When sending a HTTP request, the client (usually a web browser application) can set a `Keep-Alive` header to indicate the http server (Sanic) to not close the TCP connection after it has send the response. This allows the client to reuse the existing TCP connection to send subsequent HTTP requests, and ensures more efficient network traffic for both the client and the server. + +The `KEEP_ALIVE` config variable is set to `True` in Sanic by default. If you don't need this feature in your application, set it to `False` to cause all client connections to close immediately after a response is sent, regardless of the `Keep-Alive` header on the request. + +The amount of time the server holds the TCP connection open is decided by the server itself. In Sanic, that value is configured using the `KEEP_ALIVE_TIMEOUT` value. By default, **it is set to 120 seconds**. This means that if the client sends a `Keep-Alive` header, the server will hold the TCP connection open for 120 seconds after sending the response, and the client can reuse the connection to send another HTTP request within that time. + +For reference: + +* Apache httpd server default keepalive timeout = 5 seconds +* Nginx server default keepalive timeout = 75 seconds +* Nginx performance tuning guidelines uses keepalive = 15 seconds +* Caddy server default keepalive timeout = 120 seconds +* IE (5-9) client hard keepalive limit = 60 seconds +* Firefox client hard keepalive limit = 115 seconds +* Opera 11 client hard keepalive limit = 120 seconds +* Chrome 13+ client keepalive limit > 300+ seconds + +## Proxy configuration + +See [proxy configuration section](/guide/advanced/proxy-headers.md) diff --git a/guide/content/en/guide/running/development.md b/guide/content/en/guide/running/development.md new file mode 100644 index 00000000..0cd08ecb --- /dev/null +++ b/guide/content/en/guide/running/development.md @@ -0,0 +1,126 @@ +# Development + +The first thing that should be mentioned is that the webserver that is integrated into Sanic is **not** just a development server. + +It is production ready out-of-the-box, *unless you enable in debug mode*. + +## Debug mode + +By setting the debug mode, Sanic will be more verbose in its output and will disable several run-time optimizations. + +```python +# server.py +from sanic import Sanic +from sanic.response import json + +app = Sanic(__name__) + +@app.route("/") +async def hello_world(request): + return json({"hello": "world"}) +``` +```sh +sanic server:app --host=0.0.0.0 --port=1234 --debug +``` + + +.. danger:: + + Sanic's debug mode will slow down the server's performance, and is **NOT** intended for production environments. + + **DO NOT** enable debug mode in production. + + + +## Automatic Reloader + +.. column:: + + Sanic offers a way to enable or disable the Automatic Reloader. The easiest way to enable it is using the CLI's `--reload` argument to activate the Automatic Reloader. Every time a Python file is changed, the reloader will restart your application automatically. This is very convenient while developing. + + .. note:: + + The reloader is only available when using Sanic's [worker manager](./manager.md). If you have disabled it using `--single-process` then the reloader will not be available to you. + +.. column:: + + ```sh + sanic path.to:app --reload + ``` + You can also use the shorthand property + ```sh + sanic path.to:app -r + ``` + + +.. column:: + + If you have additional directories that you would like to automatically reload on file save (for example, a directory of HTML templates), you can add that using `--reload-dir`. + +.. column:: + + ```sh + sanic path.to:app --reload --reload-dir=/path/to/templates + ``` + Or multiple directories, shown here using the shorthand properties + ```sh + sanic path.to:app -r -R /path/to/one -R /path/to/two + ``` + +## Best of both worlds + +.. column:: + + If you would like to be in debug mode **and** have the Automatic Reloader running, you can pass `dev=True`. This is equivalent to **debug + auto reload**. + + *Added in v22.3* + +.. column:: + + ```sh + sanic path.to:app --dev + ``` + You can also use the shorthand property + ```sh + sanic path.to:app -d + ``` + +## Automatic TLS certificate + +When running in `DEBUG` mode, you can ask Sanic to handle setting up localhost temporary TLS certificates. This is helpful if you want to access your local development environment with `https://`. + +This functionality is provided by either [mkcert](https://github.com/FiloSottile/mkcert) or [trustme](https://github.com/python-trio/trustme). Both are good choices, but there are some differences. `trustme` is a Python library and can be installed into your environment with `pip`. This makes for easy envrionment handling, but it is not compatible when running a HTTP/3 server. `mkcert` might be a more involved installation process, but can install a local CA and make it easier to use. + +.. column:: + + You can choose which platform to use by setting `config.LOCAL_CERT_CREATOR`. When set to `"auto"`, it will select either option, preferring `mkcert` if possible. + +.. column:: + + ```python + app.config.LOCAL_CERT_CREATOR = "auto" + app.config.LOCAL_CERT_CREATOR = "mkcert" + app.config.LOCAL_CERT_CREATOR = "trustme" + ``` + + + +.. column:: + + Automatic TLS can be enabled at Sanic server run time: + +.. column:: + + ```sh + sanic path.to.server:app --auto-tls --debug + ``` + + + +.. warning:: + + Localhost TLS certificates (like those generated by both `mkcert` and `trustme`) are **NOT** suitable for production environments. If you are not familiar with how to obtain a *real* TLS certificate, checkout the [How to...](../how-to/tls.md) section. + + + +*Added in v22.6* diff --git a/guide/content/en/guide/running/inspector.md b/guide/content/en/guide/running/inspector.md new file mode 100644 index 00000000..c876ae2d --- /dev/null +++ b/guide/content/en/guide/running/inspector.md @@ -0,0 +1,214 @@ +# Inspector + +The Sanic Inspector is a feature of Sanic Server. It is *only* available when running Sanic with the built-in [worker manager](./manager.md). + +It is an HTTP application that *optionally* runs in the background of your application to allow you to interact with the running instance of your application. + + +.. tip:: INFO + + The Inspector was introduced in limited capacity in v22.9, but the documentation on this page assumes you are using v22.12 or higher. + + +## Getting Started + +The inspector is disabled by default. To enable it, you have two options. + +.. column:: + + Set a flag when creating your application instance. + +.. column:: + + ```python + app = Sanic("TestApp", inspector=True) + ``` + + +.. column:: + + Or, set a configuration value. + +.. column:: + + ```python + app = Sanic("TestApp") + app.config.INSPECTOR = True + ``` + + + +.. warning:: + + If you are using the configuration value, it *must* be done early and before the main worker process starts. This means that it should either be an environment variable, or it should be set shortly after creating the application instance as shown above. + + + +## Using the Inspector + +Once the inspector is running, you will have access to it via the CLI or by directly accessing its web API via HTTP. + +.. column:: + + **Via CLI** + ```sh + sanic inspect + ``` + +.. column:: + + **Via HTTP** + ```sh + curl http://localhost:6457 + ``` + + + +.. note:: + + Remember, the Inspector is not running on your Sanic application. It is a seperate process, with a seperate application, and exposed on a seperate socket. + + + +## Built-in Commands + +The Inspector comes with the following built-in commands. + +| CLI Command | HTTP Action | Description | +|--------------------|------------------------------------|--------------------------------------------------------------------------| +| `inspect` | `GET /` | Display basic details about the running application. | +| `inspect reload` | `POST /reload` | Trigger a reload of all server workers. | +| `inspect shutdown` | `POST /shutdown` | Trigger a shutdown of all processes. | +| `inspect scale N` | `POST /scale`
`{"replicas": N}` | Scale the number of workers. Where `N` is the target number of replicas. | + +## Custom Commands + +The Inspector is easily extendable to add custom commands (and endpoints). + +.. column:: + + Subclass the `Inspector` class and create arbitrary methods. As long as the method name is not preceded by an underscore (`_`), then the name of the method will be a new subcommand on the inspector. + +.. column:: + + ```python + from sanic import json + from sanic.worker.inspector import Inspector + + class MyInspector(Inspector): + async def something(self, *args, **kwargs): + print(args) + print(kwargs) + + app = Sanic("TestApp", inspector_class=MyInspector, inspector=True) + ``` + +This will expose custom methods in the general pattern: + +- CLI: `sanic inspect ` +- HTTP: `POST /` + +It is important to note that the arguments that the new method accepts are derived from how you intend to use the command. For example, the above `something` method accepts all positional and keyword based parameters. + +.. column:: + + In the CLI, the positional and keyword parameters are passed as either positional or keyword arguments to your method. All values will be a `str` with the following exceptions: + + - A keyword parameter with no assigned value will be: `True` + - Unless the parameter is prefixed with `no-`, then it will be: `False` + +.. column:: + + ```sh + sanic inspect something one two three --four --no-five --six=6 + ``` + In your application log console, you will see: + ``` + ('one', 'two', 'three') + {'four': True, 'five': False, 'six': '6'} + ``` + + +.. column:: + + The same can be achieved by hitting the API directly. You can pass arguments to the method by exposing them in a JSON payload. The only thing to note is that the positional arguments should be exposed as `{"args": [...]}`. + +.. column:: + + ```sh + curl http://localhost:6457/something \ + --json '{"args":["one", "two", "three"], "four":true, "five":false, "six":6}' + ``` + In your application log console, you will see: + ``` + ('one', 'two', 'three') + {'four': True, 'five': False, 'six': 6} + ``` + + +## Using in production + + +.. danger:: + + Before exposing the Inspector on a product, please consider all of the options in this section carefully. + + +When running Inspector on a remote production instance, you can protect the endpoints by requiring TLS encryption, and requiring API key authentication. + +### TLS encryption + +.. column:: + + To the Inspector HTTP instance over TLS, pass the paths to your certificate and key. + +.. column:: + + ```python + app.config.INSPECTOR_TLS_CERT = "/path/to/cert.pem" + app.config.INSPECTOR_TLS_KEY = "/path/to/key.pem" + ``` + + +.. column:: + + This will require use of the `--secure` flag, or `https://`. + +.. column:: + + ```sh + sanic inspect --secure --host= + ``` + ```sh + curl https://:6457 + ``` + +### API Key Authentication + +.. column:: + + You can secure the API with bearer token authentication. + +.. column:: + + ```python + app.config.INSPECTOR_API_KEY = "Super-Secret-200" + ``` + + +.. column:: + + This will require the `--api-key` parameter, or bearer token authorization header. + +.. column:: + + ```sh + sanic inspect --api-key=Super-Secret-200 + ``` + ```sh + curl http://localhost:6457 -H "Authorization: Bearer Super-Secret-200" + ``` + +## Configuration + +See [configuration](./configuration.md) diff --git a/guide/content/en/guide/running/manager.md b/guide/content/en/guide/running/manager.md new file mode 100644 index 00000000..293534c7 --- /dev/null +++ b/guide/content/en/guide/running/manager.md @@ -0,0 +1,343 @@ +# Worker Manager + +The worker manager and its functionality was introduced in version 22.9. + +*The details of this section are intended for more advanced usages and **not** necessary to get started.* + +The purpose of the manager is to create consistency and flexibility between development and production environments. Whether you intend to run a single worker, or multiple workers, whether with, or without auto-reload: the experience will be the same. + +In general it looks like this: + +![](https://user-images.githubusercontent.com/166269/178677618-3b4089c3-6c6a-4ecc-8d7a-7eba2a7f29b0.png) + +When you run Sanic, the main process instantiates a `WorkerManager`. That manager is in charge of running one or more `WorkerProcess`. There generally are two kinds of processes: + +- server processes, and +- non-server processes. + +For the sake of ease, the User Guide generally will use the term "worker" or "worker process" to mean a server process, and "Manager" to mean the single worker manager running in your main process. + +## How Sanic Server starts processes + +Sanic will start processes using the [spawn](https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods) start method. This means that for every process/worker, the global scope of your application will be run on its own thread. The practical impact of this that *if* you do not run Sanic with the CLI, you will need to nest the execution code inside a block to make sure it only runs on `__main__`. + +```python +if __name__ == "__main__": + app.run() +``` + +If you do not, you are likely to see an error message like this: + +``` +sanic.exceptions.ServerError: Sanic server could not start: [Errno 98] Address already in use. + +This may have happened if you are running Sanic in the global scope and not inside of a `if __name__ == "__main__"` block. + +See more information: https://sanic.dev/en/guide/deployment/manager.html#how-sanic-server-starts-processes +``` + +The likely fix for this problem is nesting your Sanic run call inside of the `__name__ == "__main__"` block. If you continue to receive this message after nesting, or if you see this while using the CLI, then it means the port you are trying to use is not available on your machine and you must select another port. + +### Starting a worker + +All worker processes *must* send an acknowledgement when starting. This happens under the hood, and you as a developer do not need to do anything. However, the Manager will exit with a status code `1` if one or more workers do not send that `ack` message, or a worker process throws an exception while trying to start. If no exceptions are encountered, the Manager will wait for up to thirty (30) seconds for the acknowledgement. + +.. column:: + + In the situation when you know that you will need more time to start, you can monkeypatch the Manager. The threshold does not include anything inside of a listener, and is limited to the execution time of everything in the global scope of your application. + + If you run into this issue, it may indicate a need to look deeper into what is causing the slow startup. + +.. column:: + + ```python + from sanic.worker.manager import WorkerManager + + WorkerManager.THRESHOLD = 100 # Value is in 0.1s + ``` + +See [worker ack](#worker-ack) for more information. + +.. column:: + + As stated above, Sanic will use [spawn](https://docs.python.org/3/library/multiprocessing.html#contexts-and-start-methods) to start worker processes. If you would like to change this behavior and are aware of the implications of using different start methods, you can modify as shown here. + +.. column:: + + ```python + from sanic import Sanic + + Sanic.start_method = "fork" + ``` + + +### Worker ack + +When all of your workers are running in a subprocess a potential problem is created: deadlock. This can occur when the child processes cease to function, but the main process is unaware that this happened. Therefore, Sanic servers will automatically send an `ack` message (short for acknowledge) to the main process after startup. + +In version 22.9, the `ack` timeout was short and limited to `5s`. In version 22.12, the timeout was lengthened to `30s`. If your application is shutting down after thirty seconds then it might be necessary to manually increase this threshhold. + +.. column:: + + The value of `WorkerManager.THRESHOLD` is in `0.1s` increments. Therefore, to set it to one minute, you should set the value to `600`. + + This value should be set as early as possible in your application, and should ideally happen in the global scope. Setting it after the main process has started will not work. + +.. column:: + + ```python + from sanic.worker.manager import WorkerManager + + WorkerManager.THRESHOLD = 600 + ``` + +### Zero downtime restarts + +By default, when restarting workers, Sanic will teardown the existing process first before starting a new one. + +If you are intending to use the restart functionality in production then you may be interested in having zero-downtime reloading. This can be accomplished by forcing the reloader to change the order to start a new process, wait for it to [ack](#worker-ack), and then teardown the old process. + +.. column:: + + From the multiplexer, use the `zero_downtime` argument + +.. column:: + + ```python + app.m.restart(zero_downtime=True) + ``` + +*Added in v22.12* + +## Using shared context between worker processes + +Python provides a few methods for [exchanging objects](https://docs.python.org/3/library/multiprocessing.html#exchanging-objects-between-processes), [synchronizing](https://docs.python.org/3/library/multiprocessing.html#synchronization-between-processes), and [sharing state](https://docs.python.org/3/library/multiprocessing.html#sharing-state-between-processes) between processes. This usually involves objects from the `multiprocessing` and `ctypes` modules. + +If you are familiar with these objects and how to work with them, you will be happy to know that Sanic provides an API for sharing these objects between your worker processes. If you are not familiar, you are encouraged to read through the Python documentation linked above and try some of the examples before proceeding with implementing shared context. + +Similar to how [application context](../basics/app.md#application-context) allows an applicaiton to share state across the lifetime of the application with `app.ctx`, shared context provides the same for the special objects mentioned above. This context is available as `app.shared_ctx` and should **ONLY** be used to share objects intended for this purpose. + +The `shared_ctx` will: + +- *NOT* share regular objects like `int`, `dict`, or `list` +- *NOT* share state between Sanic instances running on different machines +- *NOT* share state to non-worker processes +- **only** share state between server workers managed by the same Manager + +Attaching an inappropriate object to `shared_ctx` will likely result in a warning, and not an error. You should be careful to not accidentally add an unsafe object to `shared_ctx` as it may not work as expected. If you are directed here because of one of those warnings, you might have accidentally used an unsafe object in `shared_ctx`. + +.. column:: + + In order to create a shared object you **must** create it in the main process and attach it inside of the `main_process_start` listener. + +.. column:: + + ```python + from multiprocessing import Queue + + @app.main_process_start + async def main_process_start(app): + app.shared_ctx.queue = Queue() + ``` + +Trying to attach to the `shared_ctx` object outside of this listener may result in a `RuntimeError`. + +.. column:: + + After creating the objects in the `main_process_start` listener and attaching to the `shared_ctx`, they will be available in your workers wherever the application instance is available (example: listeners, middleware, request handlers). + +.. column:: + + ```python + from multiprocessing import Queue + + @app.get("") + async def handler(request): + request.app.shared_ctx.queue.put(1) + ... + ``` + +## Access to the multiplexer + +The application instance has access to an object that provides access to interacting with the Manager and other worker processes. The object is attached as the `app.multiplexer` property, but it is more easily accessed by its alias: `app.m`. + +.. column:: + + For example, you can get access to the current worker state. + +.. column:: + + ```python + @app.on_request + async def print_state(request: Request): + print(request.app.m.name) + print(request.app.m.pid) + print(request.app.m.state) + ``` + ``` + Sanic-Server-0-0 + 99999 + {'server': True, 'state': 'ACKED', 'pid': 99999, 'start_at': datetime.datetime(2022, 10, 1, 0, 0, 0, 0, tzinfo=datetime.timezone.utc), 'starts': 2, 'restart_at': datetime.datetime(2022, 10, 1, 0, 0, 12, 861332, tzinfo=datetime.timezone.utc)} + ``` + + +.. column:: + + The `multiplexer` also has access to terminate the Manager, or restart worker processes + +.. column:: + + ```python + # shutdown the entire application and all processes + app.m.name.terminate() + + # restart the current worker only + app.m.name.restart() + + # restart specific workers only (comma delimited) + app.m.name.restart("Sanic-Server-4-0,Sanic-Server-7-0") + + # restart ALL workers + app.m.name.restart(all_workers=True) # Available v22.12+ + ``` + +## Worker state + +.. column:: + + As shown above, the `multiplexer` has access to report upon the state of the current running worker. However, it also contains the state for ALL processes running. + +.. column:: + + ```python + @app.on_request + async def print_state(request: Request): + print(request.app.m.workers) + ``` + ``` + { + 'Sanic-Main': {'pid': 99997}, + 'Sanic-Server-0-0': { + 'server': True, + 'state': 'ACKED', + 'pid': 9999, + 'start_at': datetime.datetime(2022, 10, 1, 0, 0, 0, 0, tzinfo=datetime.timezone.utc), + 'starts': 2, + 'restart_at': datetime.datetime(2022, 10, 1, 0, 0, 12, 861332, tzinfo=datetime.timezone.utc) + }, + 'Sanic-Reloader-0': { + 'server': False, + 'state': 'STARTED', + 'pid': 99998, + 'start_at': datetime.datetime(2022, 10, 1, 0, 0, 0, 0, tzinfo=datetime.timezone.utc), + 'starts': 1 + } + } + ``` + + +## Built-in non-server processes + +As mentioned, the Manager also has the ability to run non-server processes. Sanic comes with two built-in types of non-server processes, and allows for [creating custom processes](#running-custom-processes). + +The two built-in processes are + +- the [auto-reloader](./development.md#automatic-reloader), optionally enabled to watch the file system for changes and trigger a restart +- [inspector](#inspector), optionally enabled to provide external access to the state of the running instance + +## Inspector + +Sanic has the ability to expose the state and the functionality of the `multiplexer` to the CLI. Currently, this requires the CLI command to be run on the same machine as the running Sanic instance. By default the inspector is disabled. + +.. column:: + + To enable it, set the config value to `True`. + +.. column:: + + ```python + app.config.INSPECTOR = True + ``` + +You will now have access to execute any of these CLI commands: + +``` +sanic inspect reload Trigger a reload of the server workers +sanic inspect shutdown Shutdown the application and all processes +sanic inspect scale N Scale the number of workers to N +sanic inspect Run a custom command +``` + +![](https://user-images.githubusercontent.com/166269/190099384-2f2f3fae-22d5-4529-b279-8446f6b5f9bd.png) + +.. column:: + + This works by exposing a small HTTP service on your machine. You can control the location using configuration values: + +.. column:: + + ```python + app.config.INSPECTOR_HOST = "localhost" + app.config.INSPECTOR_PORT = 6457 + ``` + +[Learn more](./inspector.md) to find out what is possible with the Inspector. + +## Running custom processes + +To run a managed custom process on Sanic, you must create a callable. If that process is meant to be long-running, then it should handle a shutdown call by a `SIGINT` or `SIGTERM` signal. + +.. column:: + + The simplest method for doing that in Python will be to just wrap your loop in `KeyboardInterrupt`. + + If you intend to run another application, like a bot, then it is likely that it already has capability to handle this signal and you likely do not need to do anything. + +.. column:: + + ```python + from time import sleep + + def my_process(foo): + try: + while True: + sleep(1) + except KeyboardInterrupt: + print("done") + ``` + + +.. column:: + + That callable must be registered in the `main_process_ready` listener. It is important to note that is is **NOT** the same location that you should register [shared context](#using-shared-context-between-worker-processes) objects. + +.. column:: + + ```python + @app.main_process_ready + async def ready(app: Sanic, _): + # app.manager.manage(, , ) + app.manager.manage("MyProcess", my_process, {"foo": "bar"}) + ``` + +## Single process mode + +.. column:: + + If you would like to opt out of running multiple processes, you can run Sanic in a single process only. In this case, the Manager will not run. You will also not have access to any features that require processes (auto-reload, the inspector, etc). + +.. column:: + + ```sh + sanic path.to.server:app --single-process + ``` + ```python + if __name__ == "__main__": + app.run(single_process=True) + ``` + ```python + if __name__ == "__main__": + app.prepare(single_process=True) + Sanic.serve_single() + ``` + diff --git a/guide/content/en/guide/running/running.md b/guide/content/en/guide/running/running.md new file mode 100644 index 00000000..9c0fba4e --- /dev/null +++ b/guide/content/en/guide/running/running.md @@ -0,0 +1,521 @@ +# Running Sanic + +Sanic ships with its own internal web server. Under most circumstances, this is the preferred method for deployment. In addition, you can also deploy Sanic as an ASGI app bundled with an ASGI-able web server. + +## Sanic Server + +The main way to run Sanic is to use the included [CLI](#sanic-cli). + +```sh +sanic path.to.server:app +``` + +In this example, Sanic is instructed to look for a python module called `path.to.server`. Inside of that module, it will look for a global variable called `app`, which should be an instance of `Sanic(...)`. + +```python +# ./path/to/server.py +from sanic import Sanic, Request, json + +app = Sanic("TestApp") + +@app.get("/") +async def handler(request: Request): + return json({"foo": "bar"}) +``` + +You may also dropdown to the [lower level API](#low-level-apprun) to call `app.run` as a script. However, if you choose this option you should be more comfortable handling issues that may arise with `multiprocessing`. + +### Workers + +.. column:: + + By default, Sanic runs a main process and a single worker process (see [worker manager](./manager.md) for more details). + + To crank up the juice, just specify the number of workers in the run arguments. + +.. column:: + + ```sh + sanic server:app --host=0.0.0.0 --port=1337 --workers=4 + ``` + +Sanic will automatically spin up multiple processes and route traffic between them. We recommend as many workers as you have available processors. + +.. column:: + + The easiest way to get the maximum CPU performance is to use the `--fast` option. This will automatically run the maximum number of workers given the system constraints. + + *Added in v21.12* + +.. column:: + + ```sh + sanic server:app --host=0.0.0.0 --port=1337 --fast + ``` + +In version 22.9, Sanic introduced a new worker manager to provide more consistency and flexibility between development and production servers. Read [about the manager](./manager.md) for more details about workers. + +.. column:: + + If you only want to run Sanic with a single process, specify `single_process` in the run arguments. This means that auto-reload, and the worker manager will be unavailable. + + *Added in v22.9* + +.. column:: + + ```sh + sanic server:app --host=0.0.0.0 --port=1337 --single-process + ``` + +### Running via command + +#### Sanic CLI + +Use `sanic --help` to see all the options. + + +.. attrs:: + :title: Sanic CLI help output + :class: details + + ```text + $ sanic --help + + โ–„โ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ โ–„โ–ˆโ–„ โ–ˆโ–ˆ โ–ˆ โ–ˆ โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ + โ–ˆโ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆโ–ˆ โ–ˆ โ–ˆ โ–ˆโ–ˆ + โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–„ โ–€ โ–ˆ โ–ˆ โ–ˆโ–ˆ โ–„ โ–ˆ โ–ˆโ–ˆ + โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆ โ–ˆโ–ˆ โ–ˆ โ–ˆ โ–„โ–„ + โ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€ โ–ˆ โ–ˆ โ–ˆ โ–ˆโ–ˆ โ–ˆ โ–€โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ + + To start running a Sanic application, provide a path to the module, where + app is a Sanic() instance: + + $ sanic path.to.server:app + + Or, a path to a callable that returns a Sanic() instance: + + $ sanic path.to.factory:create_app --factory + + Or, a path to a directory to run as a simple HTTP server: + + $ sanic ./path/to/static --simple + + Required + ======== + Positional: + module Path to your Sanic app. Example: path.to.server:app + If running a Simple Server, path to directory to serve. Example: ./ + + Optional + ======== + General: + -h, --help show this help message and exit + --version show program's version number and exit + + Application: + --factory Treat app as an application factory, i.e. a () -> callable + -s, --simple Run Sanic as a Simple Server, and serve the contents of a directory + (module arg should be a path) + --inspect Inspect the state of a running instance, human readable + --inspect-raw Inspect the state of a running instance, JSON output + --trigger-reload Trigger worker processes to reload + --trigger-shutdown Trigger all processes to shutdown + + HTTP version: + --http {1,3} Which HTTP version to use: HTTP/1.1 or HTTP/3. Value should + be either 1, or 3. [default 1] + -1 Run Sanic server using HTTP/1.1 + -3 Run Sanic server using HTTP/3 + + Socket binding: + -H HOST, --host HOST + Host address [default 127.0.0.1] + -p PORT, --port PORT + Port to serve on [default 8000] + -u UNIX, --unix UNIX + location of unix socket + + TLS certificate: + --cert CERT Location of fullchain.pem, bundle.crt or equivalent + --key KEY Location of privkey.pem or equivalent .key file + --tls DIR TLS certificate folder with fullchain.pem and privkey.pem + May be specified multiple times to choose multiple certificates + --tls-strict-host Only allow clients that send an SNI matching server certs + + Worker: + -w WORKERS, --workers WORKERS + Number of worker processes [default 1] + --fast Set the number of workers to max allowed + --single-process Do not use multiprocessing, run server in a single process + --legacy Use the legacy server manager + --access-logs Display access logs + --no-access-logs No display access logs + + Development: + --debug Run the server in debug mode + -r, --reload, --auto-reload + Watch source directory for file changes and reload on changes + -R PATH, --reload-dir PATH + Extra directories to watch and reload on changes + -d, --dev debug + auto reload + --auto-tls Create a temporary TLS certificate for local development (requires mkcert or trustme) + + Output: + --coffee Uhm, coffee? + --no-coffee No uhm, coffee? + --motd Show the startup display + --no-motd No show the startup display + -v, --verbosity Control logging noise, eg. -vv or --verbosity=2 [default 0] + --noisy-exceptions Output stack traces for all exceptions + --no-noisy-exceptions + No output stack traces for all exceptions + + ``` + + +#### As a module + +.. column:: + + Sanic applications can also be called directly as a module. + +.. column:: + + ```bash + python -m sanic server.app --host=0.0.0.0 --port=1337 --workers=4 + ``` + +#### Using a factory + +A very common solution is to develop your application *not* as a global variable, but instead using the factory pattern. In this context, "factory" means a function that returns an instance of `Sanic(...)`. + +.. column:: + + Suppose that you have this in your `server.py` + +.. column:: + + ```python + from sanic import Sanic + + def create_app() -> Sanic: + app = Sanic("MyApp") + + return app + ``` + + +.. column:: + + You can run this application now by referencing it in the CLI explicitly as a factory: + +.. column:: + + ```sh + sanic server:create_app --factory + ``` + Or, explicitly like this: + ```sh + sanic "server:create_app()" + ``` + Or, implicitly like this: + ```sh + sanic server:create_app + ``` + + *Implicit command added in v23.3* + +### Low level `app.run` + +When using `app.run` you will just call your Python file like any other script. + +.. column:: + + `app.run` must be properly nested inside of a name-main block. + +.. column:: + + ```python + # server.py + app = Sanic("MyApp") + + if __name__ == "__main__": + app.run() + ``` + + + +.. danger:: + + Be *careful* when using this pattern. A very common mistake is to put too much logic inside of the `if __name__ == "__main__":` block. + + ๐Ÿšซ This is a mistake + + ```python + from sanic import Sanic + from my.other.module import bp + + app = Sanic("MyApp") + + if __name__ == "__main__": + app.blueprint(bp) + app.run() + ``` + + If you do this, your [blueprint](../best-practices/blueprints.md) will not be attached to your application. This is because the `__main__` block will only run on Sanic's main worker process, **NOT** any of its [worker processes](../deployment/manager.md). This goes for anything else that might impact your application (like attaching listeners, signals, middleware, etc). The only safe operations are anything that is meant for the main process, like the `app.main_*` listeners. + + Perhaps something like this is more appropriate: + + ```python + from sanic import Sanic + from my.other.module import bp + + app = Sanic("MyApp") + + if __name__ == "__mp_main__": + app.blueprint(bp) + elif __name__ == "__main__": + app.run() + ``` + + +To use the low-level `run` API, after defining an instance of `sanic.Sanic`, we can call the run method with the following keyword arguments: + +| Parameter | Default | Description | +| :-------------------: | :--------------: | :---------------------------------------------------------------------------------------- | +| **host** | `"127.0.0.1"` | Address to host the server on. | +| **port** | `8000` | Port to host the server on. | +| **unix** | `None` | Unix socket name to host the server on (instead of TCP). | +| **dev** | `False` | Equivalent to `debug=True` and `auto_reload=True`. | +| **debug** | `False` | Enables debug output (slows server). | +| **ssl** | `None` | SSLContext for SSL encryption of worker(s). | +| **sock** | `None` | Socket for the server to accept connections from. | +| **workers** | `1` | Number of worker processes to spawn. Cannot be used with fast. | +| **loop** | `None` | An asyncio-compatible event loop. If none is specified, Sanic creates its own event loop. | +| **protocol** | `HttpProtocol` | Subclass of asyncio.protocol. | +| **version** | `HTTP.VERSION_1` | The HTTP version to use (`HTTP.VERSION_1` or `HTTP.VERSION_3`). | +| **access_log** | `True` | Enables log on handling requests (significantly slows server). | +| **auto_reload** | `None` | Enables auto-reload on the source directory. | +| **reload_dir** | `None` | A path or list of paths to directories the auto-reloader should watch. | +| **noisy_exceptions** | `None` | Whether to set noisy exceptions globally. None means leave as default. | +| **motd** | `True` | Whether to display the startup message. | +| **motd_display** | `None` | A dict with extra key/value information to display in the startup message | +| **fast** | `False` | Whether to maximize worker processes. Cannot be used with workers. | +| **verbosity** | `0` | Level of logging detail. Max is 2. | +| **auto_tls** | `False` | Whether to auto-create a TLS certificate for local development. Not for production. | +| **single_process** | `False` | Whether to run Sanic in a single process. | + +.. column:: + + For example, we can turn off the access log in order to increase performance, and bind to a custom host and port. + +.. column:: + + ```python + # server.py + app = Sanic("MyApp") + + if __name__ == "__main__": + app.run(host='0.0.0.0', port=1337, access_log=False) + ``` + + +.. column:: + + Now, just execute the python script that has `app.run(...)` + +.. column:: + + ```sh + python server.py + ``` + +For a slightly more advanced implementation, it is good to know that `app.run` will call `app.prepare` and `Sanic.serve` under the hood. + +.. column:: + + Therefore, these are equivalent: + +.. column:: + + ```python + if __name__ == "__main__": + app.run(host='0.0.0.0', port=1337, access_log=False) + ``` + ```python + if __name__ == "__main__": + app.prepare(host='0.0.0.0', port=1337, access_log=False) + Sanic.serve() + ``` + +.. column:: + + This can be useful if you need to bind your appliction(s) to multiple ports. + +.. column:: + + ```python + if __name__ == "__main__": + app1.prepare(host='0.0.0.0', port=9990) + app1.prepare(host='0.0.0.0', port=9991) + app2.prepare(host='0.0.0.0', port=5555) + Sanic.serve() + ``` + +### Sanic Simple Server + +.. column:: + + Sometimes you just have a directory of static files that need to be served. This especially can be handy for quickly standing up a localhost server. Sanic ships with a Simple Server, where you only need to point it at a directory. + +.. column:: + + ```sh + sanic ./path/to/dir --simple + ``` + + +.. column:: + + This could also be paired with auto-reloading. + +.. column:: + + ```sh + sanic ./path/to/dir --simple --reload --reload-dir=./path/to/dir + ``` + +*Added in v21.6* + +### HTTP/3 + +Sanic server offers HTTP/3 support using [aioquic](https://github.com/aiortc/aioquic). This **must** be installed to use HTTP/3: + +```sh +pip install sanic aioquic +``` + +```sh +pip install sanic[http3] +``` + +To start HTTP/3, you must explicitly request it when running your application. + +.. column:: + + ```sh + sanic path.to.server:app --http=3 + ``` + + ```sh + sanic path.to.server:app -3 + ``` + +.. column:: + + ```python + app.run(version=3) + ``` + +To run both an HTTP/3 and HTTP/1.1 server simultaneously, you can use [application multi-serve](../release-notes/v22.3.html#application-multi-serve) introduced in v22.3. This will automatically add an [Alt-Svc](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Alt-Svc) header to your HTTP/1.1 requests to let the client know that it is also available as HTTP/3. + + +.. column:: + + ```sh + sanic path.to.server:app --http=3 --http=1 + ``` + + ```sh + sanic path.to.server:app -3 -1 + ``` + +.. column:: + + ```python + app.prepare(version=3) + app.prepare(version=1) + Sanic.serve() + ``` + +Because HTTP/3 requires TLS, you cannot start a HTTP/3 server without a TLS certificate. You should [set it up yourself](../how-to/tls.html) or use `mkcert` if in `DEBUG` mode. Currently, automatic TLS setup for HTTP/3 is not compatible with `trustme`. See [development](./development.md) for more details. + +*Added in v22.6* + +## ASGI + +Sanic is also ASGI-compliant. This means you can use your preferred ASGI webserver to run Sanic. The three main implementations of ASGI are [Daphne](http://github.com/django/daphne), [Uvicorn](https://www.uvicorn.org/), and [Hypercorn](https://pgjones.gitlab.io/hypercorn/index.html). + + +.. warning:: + + Daphne does not support the ASGI `lifespan` protocol, and therefore cannot be used to run Sanic. See [Issue #264](https://github.com/django/daphne/issues/264) for more details. + + + +Follow their documentation for the proper way to run them, but it should look something like: + +```sh +uvicorn myapp:app +``` +```sh +hypercorn myapp:app +``` + +A couple things to note when using ASGI: + +1. When using the Sanic webserver, websockets will run using the `websockets` package. In ASGI mode, there is no need for this package since websockets are managed in the ASGI server. +2. The ASGI lifespan protocol , supports only two server events: startup and shutdown. Sanic has four: before startup, after startup, before shutdown, and after shutdown. Therefore, in ASGI mode, the startup and shutdown events will run consecutively and not actually around the server process beginning and ending (since that is now controlled by the ASGI server). Therefore, it is best to use `after_server_start` and `before_server_stop`. + +### Trio + +Sanic has experimental support for running on Trio with: + +```sh +hypercorn -k trio myapp:app +``` + +## Gunicorn + +[Gunicorn](http://gunicorn.org/) ("Green Unicorn") is a WSGI HTTP Server for UNIX based operating systems. It is a pre-fork worker model ported from Rubyโ€™s Unicorn project. + +In order to run Sanic application with Gunicorn, you need to use it with the adapter from [uvicorn](https://www.uvicorn.org/). Make sure uvicorn is installed and run it with `uvicorn.workers.UvicornWorker` for Gunicorn worker-class argument: + +```sh +gunicorn myapp:app --bind 0.0.0.0:1337 --worker-class uvicorn.workers.UvicornWorker +``` + +See the [Gunicorn Docs](http://docs.gunicorn.org/en/latest/settings.html#max-requests) for more information. + + +.. warning:: + + It is generally advised to not use `gunicorn` unless you need it. The Sanic Server is primed for running Sanic in production. Weigh your considerations carefully before making this choice. Gunicorn does provide a lot of configuration options, but it is not the best choice for getting Sanic to run at its fastest. + + + +## Performance considerations + +.. column:: + + When running in production, make sure you turn off `debug`. + +.. column:: + + ```sh + sanic path.to.server:app + ``` + + +.. column:: + + Sanic will also perform fastest if you turn off `access_log`. + + If you still require access logs, but want to enjoy this performance boost, consider using [Nginx as a proxy](./nginx.md), and letting that handle your access logging. It will be much faster than anything Python can handle. + +.. column:: + + ```sh + sanic path.to.server:app --no-access-logs + ``` + diff --git a/guide/content/en/help.md b/guide/content/en/help.md new file mode 100644 index 00000000..8ab7d81d --- /dev/null +++ b/guide/content/en/help.md @@ -0,0 +1,27 @@ +--- +layout: main +--- + +# Need some help? + +As an active community of developers, we try to support each other. If you need some help, try one of the following: + +.. column:: + + ### Discord ๐Ÿ’ฌ + + Best place to turn for quick answers and live chat + + `#sanic-support` channel on the [Discord server](https://discord.gg/FARQzAEMAA) + +.. column:: + + ### Community Forums ๐Ÿ‘ฅ + + Good for sharing snippets of code and longer support queries + + `Questions and Help` category on the [Forums](https://community.sanicframework.org/c/questions-and-help/6) + +--- + +We also actively monitor the `[sanic]` tag on [Stack Overflow](https://stackoverflow.com/questions/tagged/sanic). diff --git a/guide/content/en/index.md b/guide/content/en/index.md new file mode 100644 index 00000000..4c4d73e7 --- /dev/null +++ b/guide/content/en/index.md @@ -0,0 +1,311 @@ +--- +layout: home +features: +- title: Simple and lightweight + details: Intuitive API with smart defaults and no bloat allows you to get straight to work building your app. +- title: Unopinionated and flexible + details: Build the way you want to build without letting your tooling constrain you. +- title: Performant and scalable + details: Built from the ground up with speed and scalability as a main concern. It is ready to power web applications big and small. +- title: Production ready + details: Out of the box, it comes bundled with a web server ready to power your web applications. +- title: Trusted by millions + details: Sanic is one of the overall most popular frameworks on PyPI, and the top async enabled framework +- title: Community driven + details: The project is maintained and run by the community for the community. +--- + +## โšก The lightning-fast asynchronous Python web framework + +.. attrs:: + :class: columns is-multiline mt-6 + + .. attrs:: + :class: column is-4 + + #### Simple and lightweight + + Intuitive API with smart defaults and no bloat allows you to get straight to work building your app. + + .. attrs:: + :class: column is-4 + + #### Unopinionated and flexible + + Build the way you want to build without letting your tooling constrain you. + + .. attrs:: + :class: column is-4 + + #### Performant and scalable + + Built from the ground up with speed and scalability as a main concern. It is ready to power web applications big and small. + + .. attrs:: + :class: column is-4 + + #### Production ready + + Out of the box, it comes bundled with a web server ready to power your web applications. + + .. attrs:: + :class: column is-4 + + #### Trusted by millions + + Sanic is one of the overall most popular frameworks on PyPI, and the top async enabled framework + + .. attrs:: + :class: column is-4 + + #### Community driven + + The project is maintained and run by the community for the community. + + +.. attrs:: + :class: is-size-3 mt-6 + + **With the features and tools you'd expect.** + +.. attrs:: + :class: is-size-3 ml-6 + + **And some {span:has-text-primary:you wouldn't believe}.** + + +.. tab:: Production-grade + + After installing, Sanic has all the tools you need for a scalable, production-grade serverโ€”out of the box! + + Including [full TLS support](/en/guide/how-to/tls). + + ```python + from sanic import Sanic + from sanic.response import text + + app = Sanic("MyHelloWorldApp") + + @app.get("/") + async def hello_world(request): + return text("Hello, world.") + ``` + + ```sh + sanic path.to.server:app + [2023-01-31 12:34:56 +0000] [999996] [INFO] Sanic v22.12.0 + [2023-01-31 12:34:56 +0000] [999996] [INFO] Goin' Fast @ http://127.0.0.1:8000 + [2023-01-31 12:34:56 +0000] [999996] [INFO] mode: production, single worker + [2023-01-31 12:34:56 +0000] [999996] [INFO] server: sanic, HTTP/1.1 + [2023-01-31 12:34:56 +0000] [999996] [INFO] python: 3.10.9 + [2023-01-31 12:34:56 +0000] [999996] [INFO] platform: SomeOS-9.8.7 + [2023-01-31 12:34:56 +0000] [999996] [INFO] packages: sanic-routing==22.8.0 + [2023-01-31 12:34:56 +0000] [999997] [INFO] Starting worker [999997] + ``` + +.. tab:: TLS server + + Running Sanic with TLS enabled is as simple as passing it the file paths... + ```sh + sanic path.to.server:app --cert=/path/to/bundle.crt --key=/path/to/privkey.pem + ``` + + ... or the a directory containing `fullchain.pem` and `privkey.pem` + + ```sh + sanic path.to.server:app --tls=/path/to/certs + ``` + + **Even better**, while you are developing, let Sanic handle setting up local TLS certificates so you can access your site over TLS at [https://localhost:8443](https://localhost:8443) + + ```sh + sanic path.to.server:app --dev --auto-tls + ``` + +.. tab:: Websockets + + Up and running with websockets in no time using the [websockets](https://websockets.readthedocs.io) package. + ```python + from sanic import Request, Websocket + + @app.websocket("/feed") + async def feed(request: Request, ws: Websocket): + async for msg in ws: + await ws.send(msg) + ``` + +.. tab:: Static files + + Serving static files is of course intuitive and easy. Just name an endpoint and either a file or directory that should be served. + + ```python + app.static("/", "/path/to/index.html") + app.static("/uploads/", "/path/to/uploads/") + ``` + + Moreover, serving a directory has two additional features: automatically serving an index, and automatically serving a file browser. + + Sanic can automatically serve `index.html` (or any other named file) as an index page in a directory or its subdirectories. + + ```python + app.static( + "/uploads/", + "/path/to/uploads/", + index="index.html" + ) + ``` + + And/or, setup Sanic to display a file browser. + + + ![image](/assets/images/directory-view.png) + + ```python + app.static( + "/uploads/", + "/path/to/uploads/", + directory_view=True + ) + ``` + +.. tab:: Lifecycle + + Beginning or ending a route with functionality is as simple as adding a decorator. + + ```python + @app.on_request + async def add_key(request): + request.ctx.foo = "bar" + + @app.on_response + async def custom_banner(request, response): + response.headers["X-Foo"] = request.ctx.foo + ``` + + Same with server events. + + ```python + @app.before_server_start + async def setup_db(app): + app.ctx.db_pool = await db_setup() + + @app.after_server_stop + async def setup_db(app): + await app.ctx.db_pool.shutdown() + ``` + + But, Sanic also allows you to tie into a bunch of built-in events (called signals), or create and dispatch your own. + + ```python + @app.signal("http.lifecycle.complete") # built-in + async def my_signal_handler(conn_info): + print("Connection has been closed") + + @app.signal("something.happened.ohmy") # custom + async def my_signal_handler(): + print("something happened") + + await app.dispatch("something.happened.ohmy") + ``` + +.. tab:: Smart error handling + + Raising errors will intuitively result in proper HTTP errors: + + ```python + raise sanic.exceptions.NotFound # Automatically responds with HTTP 404 + ``` + + Or, make your own: + + ```python + from sanic.exceptions import SanicException + + class TeapotError(SanicException): + status_code = 418 + message = "Sorry, I cannot brew coffee" + + raise TeapotError + ``` + + And, when an error does happen, Sanic's beautiful DEV mode error page will help you drill down to the bug quickly. + + ![image](../assets/images/error-div-by-zero.png) + + Regardless, Sanic comes with an algorithm that attempts to respond with HTML, JSON, or text-based errors as appropriate. Don't worry, it is super easy to setup and customize your error handling to your exact needs. + +.. tab:: App Inspector + + Check in on your live, running applications (whether local or remote). + ```sh + sanic inspect + + โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” + โ”‚ Sanic โ”‚ + โ”‚ Inspecting @ http://localhost:6457 โ”‚ + โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค + โ”‚ โ”‚ mode: production, single worker โ”‚ + โ”‚ โ–„โ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ โ”‚ server: unknown โ”‚ + โ”‚ โ–ˆโ–ˆ โ”‚ python: 3.10.9 โ”‚ + โ”‚ โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–„ โ”‚ platform: SomeOS-9.8.7 + โ”‚ โ–ˆโ–ˆ โ”‚ packages: sanic==22.12.0, sanic-routing==22.8.0, sanic-testing==22.12.0, sanic-ext==22.12.0 โ”‚ + โ”‚ โ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€ โ”‚ โ”‚ + โ”‚ โ”‚ โ”‚ + โ”‚ Build Fast. Run Fast. โ”‚ โ”‚ + โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ + + Sanic-Main + pid: 999996 + + Sanic-Server-0-0 + server: True + state: ACKED + pid: 999997 + start_at: 2023-01-31T12:34:56.00000+00:00 + starts: 1 + + Sanic-Inspector-0 + server: False + state: STARTED + pid: 999998 + start_at: 2023-01-31T12:34:56.00000+00:00 + starts: 1 + ``` + + And, issue commands like `reload`, `shutdown`, `scale`... + + ```sh + sanic inspect scale 4 + ``` + + ... or even create your own! + + ```sh + sanic inspect migrations + ``` + +.. tab:: Extendable + + In addition to the tools that Sanic comes with, the officially supported [Sanic Extensions](./plugins/sanic-ext/getting-started.md) provides lots of extra goodies to make development easier. + + - **CORS** protection + - Template rendering with **Jinja** + - **Dependency injection** into route handlers + - OpenAPI documentation with **Redoc** and/or **Swagger** + - Predefined, endpoint-specific response **serializers** + - Request query arguments and body input **validation** + - **Auto create** HEAD, OPTIONS, and TRACE endpoints + - Live **health monitor** + +.. tab:: Developer Experience + + Sanic is **built for building**. + + From the moment it is installed, Sanic includes helpful tools to help the developer get their job done. + + - **One server** - Develop locally in DEV mode on the same server that will run your PRODUCTION application + - **Auto reload** - Reload running applications every time you save a Python fil, but also auto-reload **on any arbitrary directory** like HTML template directories + - **Debuggin tools** - Super helpful (and beautiful) [error pages](/en/guide/best-practices/exceptions) that help you traverse the trace stack easily + - **Auto TLS** - Running a localhost website with `https` can be difficult, [Sanic makes it easy](/en/guide/how-to/tls) + - **Streamlined testing** - Built-in testing capabilities, making it easier for developers to create and run tests, ensuring the quality and reliability of their services + - **Modern Python** - Thoughtful use of type hints to help the developer IDE experience diff --git a/guide/content/en/migrate.py b/guide/content/en/migrate.py new file mode 100644 index 00000000..e0510af4 --- /dev/null +++ b/guide/content/en/migrate.py @@ -0,0 +1,119 @@ +import re +from pathlib import Path +from textwrap import indent + +from emoji import EMOJI + +COLUMN_PATTERN = re.compile(r"---:1\s*(.*?)\s*:--:1\s*(.*?)\s*:---", re.DOTALL) +PYTHON_HIGHLIGHT_PATTERN = re.compile(r"```python\{+.*?\}", re.DOTALL) +BASH_HIGHLIGHT_PATTERN = re.compile(r"```bash\{+.*?\}", re.DOTALL) +NOTIFICATION_PATTERN = re.compile( + r":::\s*(\w+)\s*(.*?)\n([\s\S]*?):::", re.MULTILINE +) +EMOJI_PATTERN = re.compile(r":(\w+):") +CURRENT_DIR = Path(__file__).parent +SOURCE_DIR = ( + CURRENT_DIR.parent.parent.parent.parent / "sanic-guide" / "src" / "en" +) + + +def convert_columns(content: str): + def replacer(match: re.Match): + left, right = match.groups() + left = indent(left.strip(), " " * 4) + right = indent(right.strip(), " " * 4) + return f""" +.. column:: + +{left} + +.. column:: + +{right} +""" + + return COLUMN_PATTERN.sub(replacer, content) + + +def cleanup_highlights(content: str): + content = PYTHON_HIGHLIGHT_PATTERN.sub("```python", content) + content = BASH_HIGHLIGHT_PATTERN.sub("```bash", content) + return content + + +def convert_notifications(content: str): + def replacer(match: re.Match): + type_, title, body = match.groups() + body = indent(body.strip(), " " * 4) + return f""" + +.. {type_}:: {title} + +{body} + +""" + + return NOTIFICATION_PATTERN.sub(replacer, content) + + +def convert_emoji(content: str): + def replace(match): + return EMOJI.get(match.group(1), match.group(0)) + + return EMOJI_PATTERN.sub(replace, content) + + +def convert_code_blocks(content: str): + for src, dest in ( + ("yml", "yaml"), + ("caddy", ""), + ("systemd", ""), + ("mermaid", "\nmermaid"), + ): + content = content.replace(f"```{src}", f"```{dest}") + return content + + +def cleanup_multibreaks(content: str): + return content.replace("\n\n\n", "\n\n") + + +def convert(content: str): + content = convert_emoji(content) + content = convert_columns(content) + content = cleanup_highlights(content) + content = convert_code_blocks(content) + content = convert_notifications(content) + content = cleanup_multibreaks(content) + return content + + +def convert_file(src: Path, dest: Path): + short_src = src.relative_to(SOURCE_DIR) + short_dest = dest.relative_to(CURRENT_DIR) + print(f"Converting {short_src} -> {short_dest}") + content = src.read_text() + new_content = convert(content) + dest.parent.mkdir(parents=True, exist_ok=True) + dest.touch() + dest.write_text(new_content) + + +def translate_path(source_dir: Path, source_path: Path, dest_dir: Path): + rel_path = source_path.relative_to(source_dir) + dest_path = dest_dir / rel_path + return dest_path + + +def main(): + print(f"Source: {SOURCE_DIR}") + + for path in SOURCE_DIR.glob("**/*.md"): + if path.name in ("index.md", "README.md"): + continue + dest_path = translate_path(SOURCE_DIR, path, CURRENT_DIR) + convert_file(path, dest_path) + + +if __name__ == "__main__": + main() diff --git a/guide/content/en/org/README.md b/guide/content/en/org/README.md new file mode 100644 index 00000000..dab306f4 --- /dev/null +++ b/guide/content/en/org/README.md @@ -0,0 +1 @@ +# Project diff --git a/guide/content/en/org/feature_requests.md b/guide/content/en/org/feature_requests.md new file mode 100644 index 00000000..5c57ea1f --- /dev/null +++ b/guide/content/en/org/feature_requests.md @@ -0,0 +1,9 @@ +# Feature Requests + +[Create new feature request](https://github.com/sanic-org/sanic/issues/new?assignees=&labels=feature+request&template=feature_request.md) + +To vote on a feature request, visit the [GitHub Issues](https://github.com/sanic-org/sanic/issues?q=is%3Aissue+is%3Aopen+label%3A%22feature+request%22%2CRFC+sort%3Areactions-%2B1-desc) and add a reaction + +--- + + diff --git a/guide/content/en/org/policies.md b/guide/content/en/org/policies.md new file mode 100644 index 00000000..cb084c0a --- /dev/null +++ b/guide/content/en/org/policies.md @@ -0,0 +1,65 @@ +# Policies + +## Versioning + +Sanic uses [calendar versioning](https://calver.org/), aka "calver". To be more specific, the pattern follows: + +``` +YY.MM.MICRO +``` + +Generally, versions are referred to in their ``YY.MM`` form. The `MICRO` number indicates an incremental patch version, starting at `0`. + +## Release Schedule + +There are four (4) scheduled releases per year: March, June, September, and December. Therefore, there are four (4) released versions per year: `YY.3`, `YY.6`, `YY.9`, and `YY.12`. + +This release schedule provides: + +- a predictable release cadence, +- relatively short development windows allowing features to be regularly released, +- controlled [deprecations](#deprecation), and +- consistent stability with a yearly LTS. + +We also use the yearly release cycle in conjunction with our governance model, covered by the [S.C.O.P.E.](./scope.md) + +### Long term support v Interim releases + +Sanic releases a long term support release (aka "LTS") once a year in December. The LTS releases receive bug fixes and security updates for **24 months**. Interim releases throughout the year occur every three months, and are supported until the subsequent release. + +| Version | LTS | Supported | +| ------- | ------------- | ----------------------- | +| 22.12 | until 2024-12 | :white_check_mark: | +| 22.9 | | :x: | +| 22.6 | | :x: | +| 22.3 | | :x: | +| 21.12 | until 2023-12 | :ballot_box_with_check: | +| 21.9 | | :x: | +| 21.6 | | :x: | +| 21.3 | | :x: | +| 20.12 | | :x: | +| 20.9 | | :x: | +| 20.6 | | :x: | +| 20.3 | | :x: | +| 19.12 | | :x: | +| 19.9 | | :x: | +| 19.6 | | :x: | +| 19.3 | | :x: | +| 18.12 | | :x: | +| 0.8.3 | | :x: | +| 0.7.0 | | :x: | +| 0.6.0 | | :x: | +| 0.5.4 | | :x: | +| 0.4.1 | | :x: | +| 0.3.1 | | :x: | +| 0.2.0 | | :x: | +| 0.1.9 | | :x: | + +:ballot_box_with_check: = security fixes +:white_check_mark: = full support + +## Deprecation + +Before a feature is deprecated, or breaking changes are introduced into the API, it shall be publicized and shall appear with deprecation warnings through two release cycles. No deprecations shall be made in an LTS release. + +Breaking changes or feature removal may happen outside of these guidelines when absolutely warranted. These circumstances should be rare. For example, it might happen when no alternative is available to curtail a major security issue. diff --git a/guide/content/en/org/scope.md b/guide/content/en/org/scope.md new file mode 100644 index 00000000..e5f895d3 --- /dev/null +++ b/guide/content/en/org/scope.md @@ -0,0 +1,263 @@ +--- +title: S.C.O.P.E +--- + +Sanic Community Organization Policy E-manual +============================================ + +December 2019, version 1 + +Goals +----- + +To create a sustainable, community-driven organization around the Sanic projects that promote: (1) stability and predictability, (2) quick iteration and enhancement cycles, (3) engagement from outside contributors, (4) overall reliable software, and (5) a safe, rewarding environment for the community members. + +Overview +-------- + +This Policy is the governance model for the Sanic Community Organization (โ€œSCOโ€). The SCO is a meritocratic, consensus-based community organization responsible for all projects adopted by it. Anyone with an interest in one of the projects can join the community, contribute to the community or projects, and participate in the decision making process. This document describes how that participation takes place and how to set about earning merit within the project community. + +Structure +--------- + +The SCO has multiple **projects**. Each project is represented by a single GitHub repository under the Sanic community umbrella. These projects are used by **users**, developed by **contributors**, governed by **core developers**, released by **release managers**, and ultimately overseen by a **steering council**. If this sounds similar to the Python project and PEP 8016 that is because it is intentionally designed that way. + +Roles and responsibilities +-------------------------- + +### Users + +Users are community members who have a need for the projects. They are the developers and personnel that download and install the packages. Users are the **most important** members of the community and without them the projects would have no purpose. Anyone can be a user and the licenses adopted by the projects shall be appropriate open source licenses. + +_The SCO asks its users to participate in the project and community as much as possible._ + +User contributions enable the project team to ensure that they are satisfying the needs of those users. Common user contributions include (but are not limited to): + +* evangelizing about the project (e.g. a link on a website and word-of-mouth awareness raising) +* informing developers of strengths and weaknesses from a new user perspective +* providing moral support (a โ€˜thank youโ€™ goes a long way) +* providing financial support (the software is open source, but its developers need to eat) + +Users who continue to engage with the SCO, its projects, and its community will often become more and more involved. Such users may find themselves becoming contributors, as described in the next section. + +### Contributors + +Contributors are community members who contribute in concrete ways to one or more of the projects. Anyone can become a contributor and contributions can take many forms. Contributions and requirements are governed by each project separately by a contribution policy. + +There is **no expectation** of commitment to the project, **no specific skill requirements** and **no selection process**. + +In addition to their actions as users, contributors may also find themselves doing one or more of the following: + +* supporting new users (existing users are often the best people to support new users) +* reporting bugs +* identifying requirements +* providing graphics and web design +* Programming +* example use cases +* assisting with project infrastructure +* writing documentation +* fixing bugs +* adding features +* providing constructive opinions and engaging in community discourse + +Contributors engage with the projects through GitHub and the Community Forums. They submit changes to the projects itself via pull requests, which will be considered for inclusion in the project by the community at large. The Community Forums are the most appropriate place to ask for help when making that first contribution. + +Indeed one of the most important roles of a contributor may be to **simply engage in the community conversation**. Most decisions about the direction of a project are made by consensus. This is discussed in more detail below. In general, however, it is helpful for the health and direction of the projects for the contributors to **speak freely** (within the confines of the code of conduct) and **express their opinions and experiences** to help drive the consensus building. + +As contributors gain experience and familiarity with a project, their profile within, and commitment to, the community will increase. At some stage, they may find themselves being nominated for a core developer team. + +### Core Developer + +Each project under the SCO umbrella has its own team of core developers. They are the people in charge of that project. + +_What is a core developer?_ + +Core developers are community members who have shown that they are committed to the continued development of the project through ongoing engagement with the community. Being a core developer allows contributors to more easily carry on with their project related activities by giving them direct access to the projectโ€™s resources. They can make changes directly to the project repository without having to submit changes via pull requests from a fork. + +This does not mean that a core developer is free to do what they want. In fact, core developers have no more direct authority over the final release of a package than do contributors. While this honor does indicate a valued member of the community who has demonstrated a healthy respect for the projectโ€™s aims and objectives, their work continues to be reviewed by the community before acceptance in an official release. + +_What can a core developer do on a project?_ + +Each project might define this role slightly differently. However, the general usage of this designation is that an individual has risen to a level of trust within the community such that they now are given some control. This comes in the form of push rights to non-protected branches, and the ability to have a voice in the approval of pull requests. + +The projects employ various communication mechanisms to ensure that all contributions are reviewed by the community as a whole. This includes tools provided by GitHub, as well as the Community Forums. By the time a contributor is invited to become a core developer, they should be familiar with the various tools and workflows as a user and then as a contributor. + +_How to become a core developer?_ + +Anyone can become a core developer; there are no special requirements, other than to have shown a willingness and ability to positively participate in the project as a team player. + +Typically, a potential core developer will need to show that they have an understanding of the project, its objectives and its strategy. They will also have provided valuable contributions to the project over a period of time. However, there is **no technical or other skill** requirement for eligibility. + +New core developers can be **nominated by any existing core developer** at any time. At least twice a year (April and October) there will be a ballot process run by the Steering Council. Voting should be done by secret ballot. Each existing core developer for that project receives a number of votes equivalent to the number of nominees on the ballot. For example, if there are four nominees, then each existing core developer has four votes. The core developer may cast those votes however they choose, but may not vote for a single nominee more than once. A nominee must receive two-thirds approval from the number of cast ballots (not the number of eligible ballots). Once accepted by the core developers, it is the responsibility of the Steering Council to approve and finalize the nomination. The Steering Council does not have the right to determine whether a nominee is meritorious enough to receive the core developer title. However, they do retain the right to override a vote in cases where the health of the community would so require. + +Once the vote has been held, the aggregated voting results are published on the Community Forums. The nominee is entitled to request an explanation of any override against them. A nominee that fails to be admitted as a core developer may be nominated again in the future. + +It is important to recognize that being a core developer is a privilege, not a right. That privilege must be earned and once earned it can be removed by the Steering Council (see next section) in extreme circumstances. However, under normal circumstances the core developer title exists for as long as the individual wishes to continue engaging with the project and community. + +A committer who shows an above-average level of contribution to the project, particularly with respect to its strategic direction and long-term health, may be nominated to become a member of the Steering Council, or a Release Manager. This role is described below. + +_What are the rights and responsibilities of core developers?_ + +As discussed, the majority of decisions to be made are by consensus building. In certain circumstances where an issue has become more contentious, or a major decision needs to be made, the Release Manager or Steering Council may decide (or be required) to implement the RFC process, which is outlined in more detail below. + +It is also incumbent upon core developers to have a voice in the governance of the community. All core developers for all of the projects have the ability to be nominated to be on the Steering Council and vote in their elections. + +This Policy (the โ€œSCOPEโ€) may only be changed under the authority of two-thirds of active core developers, except that in the first six (6) months after adoption, the core developers reserve the right to make changes under the authority of a simple majority of active core developers. + +_What if a core developer becomes inactive?_ + +It is hoped that all core developers participate and remain active on a regular basis in their projects. However, it is also understood that such commitments may not be realistic or possible from time to time. + +Therefore, the Steering Council has the duty to encourage participation and the responsibility to place core developers into an inactive status if they are no longer willing or capable to participate. The main purpose of this is **not to punish** a person for behavior, but to help the development process to continue for those that do remain active. + +To this end, a core developer that becomes โ€œinactiveโ€ shall not have commit rights to a repository, and shall not participate in any votes. To be eligible to vote in an election, a core developer **must have been active** at the time of the previous scheduled project release. + +Inactive members may ask the Steering Council to reinstate their status at any time, and upon such request the Steering Council shall make the core developer active again. + +Individuals that know they will be unable to maintain their active status for a period are asked to be in communication with the Steering Council and declare themselves inactive if necessary. + +An โ€œactiveโ€ core developer is an individual that has participated in a meaningful way during the previous six months. Any further definition is within the discretion of the Steering Council. + +### Release Manager + +Core developers shall have access only to make commits and merges on non-protected branches. The โ€œmasterโ€ branch and other protected branches are controlled by the release management team for that project. Release managers shall be elected from the core development team by the core development team, and shall serve for a full release cycle. + +Each core developer team may decide how many release managers to have for each release cycle. It is highly encouraged that there be at least two release managers for a release cycle to help divide the responsibilities and not force too much effort upon a single person. However, there also should not be so many managers that their efforts are impeded. + +The main responsibilities of the release management team include: + +* push the development cycle forward by monitoring and facilitating technical discussions +* establish a release calendar and perform actions required to release packages +* approve pull requests to the master branch and other protected branches +* merge pull requests to the master branch and other protected branches + +The release managers **do not have the authority to veto or withhold a merge** of a pull request that otherwise meets contribution criteria and has been accepted by the community. It is not their responsibility to decide what should be developed, but rather that the decisions of the community are carried out and that the project is being moved forward. + +From time to time, a decision may need to be made that cannot be achieved through consensus. In that case, the release managers have the authority to call upon the removal of the decision to the RFC process. This should not occur regularly (unless required as discussed below), and its use should be discouraged in favor of the more communal consensus building strategy. + +Since not all projects have the same requirements, the specifics governing release managers on a project shall be set forth in an Appendix to this Policy, or in the projectโ€™s contribution guidelines. + +If necessary, the Steering Council has the right to remove a release manager that is derelict in their duties, or for other good cause. + +### Steering Council + +The Steering Council is the governing body consisting of those individuals identified as the โ€œproject ownerโ€ and having control of the resources and assets of the SCO. Their ultimate goal is to ensure the smooth operation of the projects by removing impediments, and assisting the members as needed. It is expected that they will be regular voices in the community. + +_What can the Steering Council do?_ + +The members of the Steering Council **do not individually have any more authority than any other core developer**, and shall not have any additional rights to make decisions, commits, merges, or the like on a project. + +However, as a body, the Steering Council has the following capacity: + +* accept, remand, and reject all RFCs +* enforce the community code of conduct +* administer community assets such as repositories, servers, forums, integration services, and the like (or, to delegate such authority to someone else) +* place core developers into inactive status where appropriate take any other enforcement measures afforded to it in this Policy, including, in extreme cases, removing core developers +* adopt or remove projects from the community umbrella + +It is highly encouraged that the Steering Council delegate its authority as much as possible, and where appropriate, to other willing community members. + +The Steering Council **does not have the authority** to change this Policy. + +_How many members are on the Steering Council?_ + +Four. + +While it seems like a committee with four votes may potentially end in a deadlock with no way to break a majority vote, the Steering Council is discouraged from voting as much as possible. Instead, it should try to work by consensus, and requires three consenting votes when it is necessary to vote on a matter. + +_How long do members serve on the Steering Council?_ + +A single term shall be for two calendar years starting in January. Terms shall be staggered so that each year there are two members continuing from the previous yearโ€™s council. + +Therefore, the inaugural vote shall have two positions available for a two year term, and two positions available for a one year term. + +There are no limits to the number of terms that can be served, and it is possible for an individual to serve consecutive terms. + +_Who runs the Steering Council?_ + +After the Steering Council is elected, the group shall collectively decide upon one person to act as the Chair. The Chair does not have any additional rights or authority over any other member of the Steering Council. + +The role of the Chair is merely as a coordinator and facilitator. The Chair is expected to ensure that all governance processes are adhered to. The position is more administrative and clerical, and is expected that the Chair sets agendas and coordinates discussion of the group. + +_How are council members elected?_ + +Once a year, **all eligible core developers** for each of the projects shall have the right to elect members to the Steering Council. + +Nominations shall be open from September 1 and shall close on September 30. After that, voting shall begin on October 1 and shall close on October 31. Every core developer active on the date of the June release of the Sanic Framework for that year shall be eligible to receive one vote per vacant seat on the Steering Council. For the sake of clarity, to be eligible to vote, a core developer **does not** need to be a core developer on Sanic Framework, but rather just have been active within their respective project on that date. + +The top recipients of votes shall be declared the winners. If there is any tie, it is highly encouraged that the tied nominees themselves resolve the dispute before a decision is made at random. + +In regards to the inaugural vote of the Steering Council, the top two vote-recipients shall serve for two years, and the next two vote-recipients shall assume the one-year seats. + +To be an eligible candidate for the Steering Council, the individual must have been a core developer in active status on at least one project for the previous twelve months. + +_What if there is a vacancy?_ + +If a vacancy on the Steering Council exists during a term, then the next highest vote-recipient in the previous election shall be offered to complete the remainder of the term. If one cannot be found this way, the Steering Council may decide the most appropriate course of action to fill the seat (whether by appointment, vote, or other means). + +If a member of the Steering Council becomes inactive, then that individual shall be removed from the Steering Council immediately and the seat shall become vacant. + +In extreme cases, the body of all core developers has the right to bring a vote to remove a member of the Steering Council for cause by a two-thirds majority of all eligible voting core developers. + +_How shall the Steering Council conduct its business?_ + +As much as possible, the Steering Council shall conduct its business and discussions in the open. Any member of the community should be allowed to enter the conversation with them. However, at times it may be necessary or appropriate for discussions to be held privately. Selecting the proper venue for conversations is part of the administrative duties of the Chair. + +While the specifics of how to operate are beyond the scope of the Policy, it is encouraged that the Steering Council attempt to meet at least one time per quarter in a โ€œreal-timeโ€ discussion. This could be achieved via video conferencing, live chatting, or other appropriate means. + +Support +------- + +All participants in the community are encouraged to provide support for users within the project management infrastructure. This support is provided as a way of growing the community. Those seeking support should recognize that all support activity within the project is voluntary and is therefore provided as and when time allows. A user requiring guaranteed response times or results should therefore seek to purchase a support contract from a community member. However, for those willing to engage with the project on its own terms, and willing to help support other users, the community support channels are ideal. + +Decision making process +----------------------- + +Decisions about the future of the projects are made through discussion with all members of the community, from the newest user to the most experienced member. Everyone has a voice. + +All non-sensitive project management discussion takes place on the community forums, or other designated channels. Occasionally, sensitive discussions may occur in private. + +In order to ensure that the project is not bogged down by endless discussion and continual voting, the project operates a policy of **lazy consensus**. This allows the majority of decisions to be made without resorting to a formal vote. For any **major decision** (as defined below), there is a separate Request for Comment (RFC) process. + +### Technical decisions + +Pull requests and technical decisions should generally fall into the following categories. + +* **Routine**: Documentation fixes, code changes that are for cleanup or additional testing. No functionality changes. +* **Minor**: Changes to the code base that either fix a bug, or introduce a trivial feature. No breaking changes. +* **Major**: Any change to the code base that breaks or deprecates existing API, alters operation in a non-trivial manner, or adds a significant feature. + +It is generally the responsibility of the release managers to make sure that changes to the repositories receive the proper authorization before merge. + +The release managers retain the authority to individually review and accept routine decisions that meet standards for code quality without additional input. + +### Lazy consensus + +Decision making (whether by the community or Steering Council) typically involves the following steps: + +* proposal +* discussion +* vote (if consensus is not reached through discussion) +* decision + +Any community member can make a proposal for consideration by the community. In order to initiate a discussion about a new idea, they should post a message on the appropriate channel on the Community forums, or submit a pull request implementing the idea on GitHub. This will prompt a review and, if necessary, a discussion of the idea. + +The goal of this review and discussion is to gain approval for the contribution. Since most people in the project community have a shared vision, there is often little need for discussion in order to reach consensus. + +In general, as long as nobody explicitly opposes a proposal or patch, it is recognized as having the support of the community. This is called lazy consensus; that is, those who have not stated their opinion explicitly have implicitly agreed to the implementation of the proposal. + +Lazy consensus is a very important concept within the SCO. It is this process that allows a large group of people to efficiently reach consensus, as someone with no objections to a proposal need not spend time stating their position, and others need not spend time reading such messages. + +For lazy consensus to be effective, it is necessary to allow an appropriate amount of time before assuming that there are no objections to the proposal. This is somewhat dependent upon the circumstances, but it is generally assumed that 72 hours is reasonable. This requirement ensures that everyone is given enough time to read, digest and respond to the proposal. This time period is chosen so as to be as inclusive as possible of all participants, regardless of their location and time commitments. The facilitators of discussion (whether it be the Chair or the Release Managers, where applicable) shall be charged with determining the proper length of time for such consensus to be reached. + +As discussed above regarding so-called routine decisions, the release managers have the right to make decisions within a shorter period of time. In such cases, lazy consensus shall be implied. + +### Request for Comment (RFC) + +The Steering Council shall be in charge of overseeing the RFC process. It shall be a process that remains open to debate to all members of the community, and shall allow for ample time to consider a proposal and for members to respond and engage in meaningful discussion. + +The final decision is vested with the Steering Council. However, it is strongly discouraged that the Steering Council adopt a decision that is contrary to any consensus that may exist in the community. From time to time this may happen if there is a conflict between consensus and the overall project and community goals. + +An RFC shall be initiated by submission to the Steering Council in the public manner as set forth by the Steering Council. Debate shall continue and be facilitated by the Steering Council in general, and the Chair specifically. + +In circumstances that the Steering Council feels it is appropriate, the RFC process may be waived in favor of lazy consensus. diff --git a/guide/content/en/organization/code-of-conduct.md b/guide/content/en/organization/code-of-conduct.md new file mode 100644 index 00000000..a7d7ae07 --- /dev/null +++ b/guide/content/en/organization/code-of-conduct.md @@ -0,0 +1,74 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as +contributors and maintainers pledge to making participation in our project and +our community a harassment-free experience for everyone, regardless of age, body +size, disability, ethnicity, gender identity and expression, level of experience, +nationality, personal appearance, race, religion, or sexual identity and +orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment +include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or +advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic + address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable +behavior and are expected to take appropriate and fair corrective action in +response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or +reject comments, commits, code, wiki edits, issues, and other contributions +that are not aligned to this Code of Conduct, or to ban temporarily or +permanently any contributor for other behaviors that they deem inappropriate, +threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces +when an individual is representing the project or its community. Examples of +representing a project or community include using an official project e-mail +address, posting via an official social media account, or acting as an appointed +representative at an online or offline event. Representation of a project may be +further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported by contacting the project team at adam@sanicframework.org. All +complaints will be reviewed and investigated and will result in a response that +is deemed necessary and appropriate to the circumstances. The project team is +obligated to maintain confidentiality with regard to the reporter of an incident. +Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good +faith may face temporary or permanent repercussions as determined by other +members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, +available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/guide/content/en/organization/contributing.md b/guide/content/en/organization/contributing.md new file mode 100644 index 00000000..c65deba9 --- /dev/null +++ b/guide/content/en/organization/contributing.md @@ -0,0 +1,166 @@ +# Contributing + +Thank you for your interest! Sanic is always looking for contributors. If you don't feel comfortable contributing code, adding docstrings to the source files, or helping with the [Sanic User Guide](https://github.com/sanic-org/sanic-guide) by providing documentation or implementation examples would be appreciated! + +We are committed to providing a friendly, safe and welcoming environment for all, regardless of gender, sexual orientation, disability, ethnicity, religion, or similar personal characteristic. Our [code of conduct](https://github.com/sanic-org/sanic/blob/master/CONDUCT.md) sets the standards for behavior. + +## Installation + +To develop on Sanic (and mainly to just run the tests) it is highly recommend to install from sources. + +So assume you have already cloned the repo and are in the working directory with a virtual environment already set up, then run: + +```sh +pip install -e ".[dev]" +``` + +## Dependency Changes + +`Sanic` doesn't use `requirements*.txt` files to manage any kind of dependencies related to it in order to simplify the effort required in managing the dependencies. Please make sure you have read and understood the following section of the document that explains the way `sanic` manages dependencies inside the `setup.py` file. + +| Dependency Type | Usage | Installation | +| ------------------------------- | ------------------------------------------------- | ---------------------------- | +| requirements | Bare minimum dependencies required for sanic to function | `pip3 install -e .` | +| tests_require / extras_require['test'] | Dependencies required to run the Unit Tests for `sanic` | `pip3 install -e '.[test]'` | +| extras_require['dev'] | Additional Development requirements to add contributing | `pip3 install -e '.[dev]'` | +| extras_require['docs'] | Dependencies required to enable building and enhancing sanic documentation | `pip3 install -e '.[docs]'` | + +## Running all tests + +To run the tests for Sanic it is recommended to use tox like so: + +```sh +tox +``` + +See it's that simple! + +`tox.ini` contains different environments. Running `tox` without any arguments will +run all unittests, perform lint and other checks. + +## Run unittests + +`tox` environment -> `[testenv]` + +To execute only unittests, run `tox` with environment like so: + +```sh + +tox -e py37 -v -- tests/test_config.py +# or +tox -e py310 -v -- tests/test_config.py +``` + +## Run lint checks + +`tox` environment -> `[testenv:lint]` + +Permform `flake8`\ , `black` and `isort` checks. + + +```sh +tox -e lint +``` + +## Run type annotation checks + +`tox` environment -> `[testenv:type-checking]` + +Permform `mypy` checks. + +```sh +tox -e type-checking +``` + +## Run other checks + +`tox` environment -> `[testenv:check]` + +Perform other checks. + +```sh +tox -e check +``` + +## Run Static Analysis + +`tox` environment -> `[testenv:security]` + +Perform static analysis security scan + +```sh +tox -e security +``` + +## Run Documentation sanity check + +`tox` environment -> `[testenv:docs]` + +Perform sanity check on documentation + +```sh +tox -e docs +``` +## Code Style + +To maintain the code consistency, Sanic uses the following tools: + +1. [isort](https://github.com/timothycrosley/isort) +2. [black](https://github.com/python/black) +3. [flake8](https://github.com/PyCQA/flake8) +4. [slotscheck](https://github.com/ariebovenberg/slotscheck) + +### isort + +`isort` sorts Python imports. It divides imports into three categories sorted each in alphabetical order: + +1. built-in +2. third-party +3. project-specific + +### black + +`black` is a Python code formatter. + +### flake8 + +`flake8` is a Python style guide that wraps the following tools into one: + +1. PyFlakes +2. pycodestyle +3. Ned Batchelder's McCabe script + +### slotscheck + +`slotscheck` ensures that there are no problems with `__slots__` (e.g., overlaps, or missing slots in base classes). + +`isort`, `black`, `flake8`, and `slotscheck` checks are performed during `tox` lint checks. + +The **easiest** way to make your code conform is to run the following before committing: + +```bash +make pretty +``` + +Refer to [tox documentation](https://tox.readthedocs.io/en/latest/index.html) for more details. + +## Pull requests + +So the pull request approval rules are pretty simple: + +1. All pull requests must pass unit tests. +2. All pull requests must be reviewed and approved by at least one current member of the Core Developer team. +3. All pull requests must pass flake8 checks. +4. All pull requests must match `isort` and `black` requirements. +5. All pull requests must be **PROPERLY** type annotated, unless exemption is given. +6. All pull requests must be consistent with the existing code. +7. If you decide to remove/change anything from any common interface a deprecation message should accompany it in accordance with our [deprecation policy](https://sanicframework.org/en/guide/project/policies.html#deprecation). +8. If you implement a new feature you should have at least one unit test to accompany it. +9. An example must be one of the following: + * Example of how to use Sanic + * Example of how to use Sanic extensions + * Example of how to use Sanic and asynchronous library + +## Documentation + +_Check back. We are reworking our documentation so this will change._ diff --git a/guide/content/en/organization/policies.md b/guide/content/en/organization/policies.md new file mode 100644 index 00000000..cf58c857 --- /dev/null +++ b/guide/content/en/organization/policies.md @@ -0,0 +1,68 @@ +# Policies + +## Versioning + +Sanic uses [calendar versioning](https://calver.org/), aka "calver". To be more specific, the pattern follows: + +``` +YY.MM.MICRO +``` + +Generally, versions are referred to in their ``YY.MM`` form. The `MICRO` number indicates an incremental patch version, starting at `0`. + +## Release Schedule + +There are four (4) scheduled releases per year: March, June, September, and December. Therefore, there are four (4) released versions per year: `YY.3`, `YY.6`, `YY.9`, and `YY.12`. + +This release schedule provides: + +- a predictable release cadence, +- relatively short development windows allowing features to be regularly released, +- controlled [deprecations](#deprecation), and +- consistent stability with a yearly LTS. + +We also use the yearly release cycle in conjunction with our governance model, covered by the [S.C.O.P.E.](./scope.md) + +### Long term support v Interim releases + +Sanic releases a long term support release (aka "LTS") once a year in December. The LTS releases receive bug fixes and security updates for **24 months**. Interim releases throughout the year occur every three months, and are supported until the subsequent release. + +| Version | LTS | Supported | +| ------- | ------------- | --------- | +| 23.6 | | โœ… | +| 23.3 | | โšช | +| 22.12 | until 2024-12 | โ˜‘๏ธ | +| 22.9 | | โšช | +| 22.6 | | โšช | +| 22.3 | | โšช | +| 21.12 | until 2023-12 | โ˜‘๏ธ | +| 21.9 | | โšช | +| 21.6 | | โšช | +| 21.3 | | โšช | +| 20.12 | | โšช | +| 20.9 | | โšช | +| 20.6 | | โšช | +| 20.3 | | โšช | +| 19.12 | | โšช | +| 19.9 | | โšช | +| 19.6 | | โšช | +| 19.3 | | โšช | +| 18.12 | | โšช | +| 0.8.3 | | โšช | +| 0.7.0 | | โšช | +| 0.6.0 | | โšช | +| 0.5.4 | | โšช | +| 0.4.1 | | โšช | +| 0.3.1 | | โšช | +| 0.2.0 | | โšช | +| 0.1.9 | | โšช | + +โ˜‘๏ธ = security fixes +โœ… = full support +โšช = no support + +## Deprecation + +Before a feature is deprecated, or breaking changes are introduced into the API, it shall be publicized and shall appear with deprecation warnings through two release cycles. No deprecations shall be made in an LTS release. + +Breaking changes or feature removal may happen outside of these guidelines when absolutely warranted. These circumstances should be rare. For example, it might happen when no alternative is available to curtail a major security issue. diff --git a/guide/content/en/organization/scope.md b/guide/content/en/organization/scope.md new file mode 100644 index 00000000..e6c1917b --- /dev/null +++ b/guide/content/en/organization/scope.md @@ -0,0 +1,258 @@ + +# Sanic Community Organization Policy E-manual (SCOPE) + +.. attrs:: + :class: is-size-7 + + _December 2019, version 1_ + +## Goals + +To create a sustainable, community-driven organization around the Sanic projects that promote: (1) stability and predictability, (2) quick iteration and enhancement cycles, (3) engagement from outside contributors, (4) overall reliable software, and (5) a safe, rewarding environment for the community members. + +## Overview + +This Policy is the governance model for the Sanic Community Organization (โ€œSCOโ€). The SCO is a meritocratic, consensus-based community organization responsible for all projects adopted by it. Anyone with an interest in one of the projects can join the community, contribute to the community or projects, and participate in the decision making process. This document describes how that participation takes place and how to set about earning merit within the project community. + +## Structure + +The SCO has multiple **projects**. Each project is represented by a single GitHub repository under the Sanic community umbrella. These projects are used by **users**, developed by **contributors**, governed by **core developers**, released by **release managers**, and ultimately overseen by a **steering council**. If this sounds similar to the Python project and PEP 8016 that is because it is intentionally designed that way. + +## Roles and responsibilities + +### Users + +Users are community members who have a need for the projects. They are the developers and personnel that download and install the packages. Users are the **most important** members of the community and without them the projects would have no purpose. Anyone can be a user and the licenses adopted by the projects shall be appropriate open source licenses. + +_The SCO asks its users to participate in the project and community as much as possible._ + +User contributions enable the project team to ensure that they are satisfying the needs of those users. Common user contributions include (but are not limited to): + +* evangelizing about the project (e.g. a link on a website and word-of-mouth awareness raising) +* informing developers of strengths and weaknesses from a new user perspective +* providing moral support (a โ€˜thank youโ€™ goes a long way) +* providing financial support (the software is open source, but its developers need to eat) + +Users who continue to engage with the SCO, its projects, and its community will often become more and more involved. Such users may find themselves becoming contributors, as described in the next section. + +### Contributors + +Contributors are community members who contribute in concrete ways to one or more of the projects. Anyone can become a contributor and contributions can take many forms. Contributions and requirements are governed by each project separately by a contribution policy. + +There is **no expectation** of commitment to the project, **no specific skill requirements** and **no selection process**. + +In addition to their actions as users, contributors may also find themselves doing one or more of the following: + +* supporting new users (existing users are often the best people to support new users) +* reporting bugs +* identifying requirements +* providing graphics and web design +* Programming +* example use cases +* assisting with project infrastructure +* writing documentation +* fixing bugs +* adding features +* providing constructive opinions and engaging in community discourse + +Contributors engage with the projects through GitHub and the Community Forums. They submit changes to the projects itself via pull requests, which will be considered for inclusion in the project by the community at large. The Community Forums are the most appropriate place to ask for help when making that first contribution. + +Indeed one of the most important roles of a contributor may be to **simply engage in the community conversation**. Most decisions about the direction of a project are made by consensus. This is discussed in more detail below. In general, however, it is helpful for the health and direction of the projects for the contributors to **speak freely** (within the confines of the code of conduct) and **express their opinions and experiences** to help drive the consensus building. + +As contributors gain experience and familiarity with a project, their profile within, and commitment to, the community will increase. At some stage, they may find themselves being nominated for a core developer team. + +### Core Developer + +Each project under the SCO umbrella has its own team of core developers. They are the people in charge of that project. + +_What is a core developer?_ + +Core developers are community members who have shown that they are committed to the continued development of the project through ongoing engagement with the community. Being a core developer allows contributors to more easily carry on with their project related activities by giving them direct access to the projectโ€™s resources. They can make changes directly to the project repository without having to submit changes via pull requests from a fork. + +This does not mean that a core developer is free to do what they want. In fact, core developers have no more direct authority over the final release of a package than do contributors. While this honor does indicate a valued member of the community who has demonstrated a healthy respect for the projectโ€™s aims and objectives, their work continues to be reviewed by the community before acceptance in an official release. + +_What can a core developer do on a project?_ + +Each project might define this role slightly differently. However, the general usage of this designation is that an individual has risen to a level of trust within the community such that they now are given some control. This comes in the form of push rights to non-protected branches, and the ability to have a voice in the approval of pull requests. + +The projects employ various communication mechanisms to ensure that all contributions are reviewed by the community as a whole. This includes tools provided by GitHub, as well as the Community Forums. By the time a contributor is invited to become a core developer, they should be familiar with the various tools and workflows as a user and then as a contributor. + +_How to become a core developer?_ + +Anyone can become a core developer; there are no special requirements, other than to have shown a willingness and ability to positively participate in the project as a team player. + +Typically, a potential core developer will need to show that they have an understanding of the project, its objectives and its strategy. They will also have provided valuable contributions to the project over a period of time. However, there is **no technical or other skill** requirement for eligibility. + +New core developers can be **nominated by any existing core developer** at any time. At least twice a year (April and October) there will be a ballot process run by the Steering Council. Voting should be done by secret ballot. Each existing core developer for that project receives a number of votes equivalent to the number of nominees on the ballot. For example, if there are four nominees, then each existing core developer has four votes. The core developer may cast those votes however they choose, but may not vote for a single nominee more than once. A nominee must receive two-thirds approval from the number of cast ballots (not the number of eligible ballots). Once accepted by the core developers, it is the responsibility of the Steering Council to approve and finalize the nomination. The Steering Council does not have the right to determine whether a nominee is meritorious enough to receive the core developer title. However, they do retain the right to override a vote in cases where the health of the community would so require. + +Once the vote has been held, the aggregated voting results are published on the Community Forums. The nominee is entitled to request an explanation of any override against them. A nominee that fails to be admitted as a core developer may be nominated again in the future. + +It is important to recognize that being a core developer is a privilege, not a right. That privilege must be earned and once earned it can be removed by the Steering Council (see next section) in extreme circumstances. However, under normal circumstances the core developer title exists for as long as the individual wishes to continue engaging with the project and community. + +A committer who shows an above-average level of contribution to the project, particularly with respect to its strategic direction and long-term health, may be nominated to become a member of the Steering Council, or a Release Manager. This role is described below. + +_What are the rights and responsibilities of core developers?_ + +As discussed, the majority of decisions to be made are by consensus building. In certain circumstances where an issue has become more contentious, or a major decision needs to be made, the Release Manager or Steering Council may decide (or be required) to implement the RFC process, which is outlined in more detail below. + +It is also incumbent upon core developers to have a voice in the governance of the community. All core developers for all of the projects have the ability to be nominated to be on the Steering Council and vote in their elections. + +This Policy (the โ€œSCOPEโ€) may only be changed under the authority of two-thirds of active core developers, except that in the first six (6) months after adoption, the core developers reserve the right to make changes under the authority of a simple majority of active core developers. + +_What if a core developer becomes inactive?_ + +It is hoped that all core developers participate and remain active on a regular basis in their projects. However, it is also understood that such commitments may not be realistic or possible from time to time. + +Therefore, the Steering Council has the duty to encourage participation and the responsibility to place core developers into an inactive status if they are no longer willing or capable to participate. The main purpose of this is **not to punish** a person for behavior, but to help the development process to continue for those that do remain active. + +To this end, a core developer that becomes โ€œinactiveโ€ shall not have commit rights to a repository, and shall not participate in any votes. To be eligible to vote in an election, a core developer **must have been active** at the time of the previous scheduled project release. + +Inactive members may ask the Steering Council to reinstate their status at any time, and upon such request the Steering Council shall make the core developer active again. + +Individuals that know they will be unable to maintain their active status for a period are asked to be in communication with the Steering Council and declare themselves inactive if necessary. + +An โ€œactiveโ€ core developer is an individual that has participated in a meaningful way during the previous six months. Any further definition is within the discretion of the Steering Council. + +### Release Manager + +Core developers shall have access only to make commits and merges on non-protected branches. The โ€œmasterโ€ branch and other protected branches are controlled by the release management team for that project. Release managers shall be elected from the core development team by the core development team, and shall serve for a full release cycle. + +Each core developer team may decide how many release managers to have for each release cycle. It is highly encouraged that there be at least two release managers for a release cycle to help divide the responsibilities and not force too much effort upon a single person. However, there also should not be so many managers that their efforts are impeded. + +The main responsibilities of the release management team include: + +* push the development cycle forward by monitoring and facilitating technical discussions +* establish a release calendar and perform actions required to release packages +* approve pull requests to the master branch and other protected branches +* merge pull requests to the master branch and other protected branches + +The release managers **do not have the authority to veto or withhold a merge** of a pull request that otherwise meets contribution criteria and has been accepted by the community. It is not their responsibility to decide what should be developed, but rather that the decisions of the community are carried out and that the project is being moved forward. + +From time to time, a decision may need to be made that cannot be achieved through consensus. In that case, the release managers have the authority to call upon the removal of the decision to the RFC process. This should not occur regularly (unless required as discussed below), and its use should be discouraged in favor of the more communal consensus building strategy. + +Since not all projects have the same requirements, the specifics governing release managers on a project shall be set forth in an Appendix to this Policy, or in the projectโ€™s contribution guidelines. + +If necessary, the Steering Council has the right to remove a release manager that is derelict in their duties, or for other good cause. + +### Steering Council + +The Steering Council is the governing body consisting of those individuals identified as the โ€œproject ownerโ€ and having control of the resources and assets of the SCO. Their ultimate goal is to ensure the smooth operation of the projects by removing impediments, and assisting the members as needed. It is expected that they will be regular voices in the community. + +_What can the Steering Council do?_ + +The members of the Steering Council **do not individually have any more authority than any other core developer**, and shall not have any additional rights to make decisions, commits, merges, or the like on a project. + +However, as a body, the Steering Council has the following capacity: + +* accept, remand, and reject all RFCs +* enforce the community code of conduct +* administer community assets such as repositories, servers, forums, integration services, and the like (or, to delegate such authority to someone else) +* place core developers into inactive status where appropriate take any other enforcement measures afforded to it in this Policy, including, in extreme cases, removing core developers +* adopt or remove projects from the community umbrella + +It is highly encouraged that the Steering Council delegate its authority as much as possible, and where appropriate, to other willing community members. + +The Steering Council **does not have the authority** to change this Policy. + +_How many members are on the Steering Council?_ + +Four. + +While it seems like a committee with four votes may potentially end in a deadlock with no way to break a majority vote, the Steering Council is discouraged from voting as much as possible. Instead, it should try to work by consensus, and requires three consenting votes when it is necessary to vote on a matter. + +_How long do members serve on the Steering Council?_ + +A single term shall be for two calendar years starting in January. Terms shall be staggered so that each year there are two members continuing from the previous yearโ€™s council. + +Therefore, the inaugural vote shall have two positions available for a two year term, and two positions available for a one year term. + +There are no limits to the number of terms that can be served, and it is possible for an individual to serve consecutive terms. + +_Who runs the Steering Council?_ + +After the Steering Council is elected, the group shall collectively decide upon one person to act as the Chair. The Chair does not have any additional rights or authority over any other member of the Steering Council. + +The role of the Chair is merely as a coordinator and facilitator. The Chair is expected to ensure that all governance processes are adhered to. The position is more administrative and clerical, and is expected that the Chair sets agendas and coordinates discussion of the group. + +_How are council members elected?_ + +Once a year, **all eligible core developers** for each of the projects shall have the right to elect members to the Steering Council. + +Nominations shall be open from September 1 and shall close on September 30. After that, voting shall begin on October 1 and shall close on October 31. Every core developer active on the date of the June release of the Sanic Framework for that year shall be eligible to receive one vote per vacant seat on the Steering Council. For the sake of clarity, to be eligible to vote, a core developer **does not** need to be a core developer on Sanic Framework, but rather just have been active within their respective project on that date. + +The top recipients of votes shall be declared the winners. If there is any tie, it is highly encouraged that the tied nominees themselves resolve the dispute before a decision is made at random. + +In regards to the inaugural vote of the Steering Council, the top two vote-recipients shall serve for two years, and the next two vote-recipients shall assume the one-year seats. + +To be an eligible candidate for the Steering Council, the individual must have been a core developer in active status on at least one project for the previous twelve months. + +_What if there is a vacancy?_ + +If a vacancy on the Steering Council exists during a term, then the next highest vote-recipient in the previous election shall be offered to complete the remainder of the term. If one cannot be found this way, the Steering Council may decide the most appropriate course of action to fill the seat (whether by appointment, vote, or other means). + +If a member of the Steering Council becomes inactive, then that individual shall be removed from the Steering Council immediately and the seat shall become vacant. + +In extreme cases, the body of all core developers has the right to bring a vote to remove a member of the Steering Council for cause by a two-thirds majority of all eligible voting core developers. + +_How shall the Steering Council conduct its business?_ + +As much as possible, the Steering Council shall conduct its business and discussions in the open. Any member of the community should be allowed to enter the conversation with them. However, at times it may be necessary or appropriate for discussions to be held privately. Selecting the proper venue for conversations is part of the administrative duties of the Chair. + +While the specifics of how to operate are beyond the scope of the Policy, it is encouraged that the Steering Council attempt to meet at least one time per quarter in a โ€œreal-timeโ€ discussion. This could be achieved via video conferencing, live chatting, or other appropriate means. + +Support +------- + +All participants in the community are encouraged to provide support for users within the project management infrastructure. This support is provided as a way of growing the community. Those seeking support should recognize that all support activity within the project is voluntary and is therefore provided as and when time allows. A user requiring guaranteed response times or results should therefore seek to purchase a support contract from a community member. However, for those willing to engage with the project on its own terms, and willing to help support other users, the community support channels are ideal. + +Decision making process +----------------------- + +Decisions about the future of the projects are made through discussion with all members of the community, from the newest user to the most experienced member. Everyone has a voice. + +All non-sensitive project management discussion takes place on the community forums, or other designated channels. Occasionally, sensitive discussions may occur in private. + +In order to ensure that the project is not bogged down by endless discussion and continual voting, the project operates a policy of **lazy consensus**. This allows the majority of decisions to be made without resorting to a formal vote. For any **major decision** (as defined below), there is a separate Request for Comment (RFC) process. + +### Technical decisions + +Pull requests and technical decisions should generally fall into the following categories. + +* **Routine**: Documentation fixes, code changes that are for cleanup or additional testing. No functionality changes. +* **Minor**: Changes to the code base that either fix a bug, or introduce a trivial feature. No breaking changes. +* **Major**: Any change to the code base that breaks or deprecates existing API, alters operation in a non-trivial manner, or adds a significant feature. + +It is generally the responsibility of the release managers to make sure that changes to the repositories receive the proper authorization before merge. + +The release managers retain the authority to individually review and accept routine decisions that meet standards for code quality without additional input. + +### Lazy consensus + +Decision making (whether by the community or Steering Council) typically involves the following steps: + +* proposal +* discussion +* vote (if consensus is not reached through discussion) +* decision + +Any community member can make a proposal for consideration by the community. In order to initiate a discussion about a new idea, they should post a message on the appropriate channel on the Community forums, or submit a pull request implementing the idea on GitHub. This will prompt a review and, if necessary, a discussion of the idea. + +The goal of this review and discussion is to gain approval for the contribution. Since most people in the project community have a shared vision, there is often little need for discussion in order to reach consensus. + +In general, as long as nobody explicitly opposes a proposal or patch, it is recognized as having the support of the community. This is called lazy consensus; that is, those who have not stated their opinion explicitly have implicitly agreed to the implementation of the proposal. + +Lazy consensus is a very important concept within the SCO. It is this process that allows a large group of people to efficiently reach consensus, as someone with no objections to a proposal need not spend time stating their position, and others need not spend time reading such messages. + +For lazy consensus to be effective, it is necessary to allow an appropriate amount of time before assuming that there are no objections to the proposal. This is somewhat dependent upon the circumstances, but it is generally assumed that 72 hours is reasonable. This requirement ensures that everyone is given enough time to read, digest and respond to the proposal. This time period is chosen so as to be as inclusive as possible of all participants, regardless of their location and time commitments. The facilitators of discussion (whether it be the Chair or the Release Managers, where applicable) shall be charged with determining the proper length of time for such consensus to be reached. + +As discussed above regarding so-called routine decisions, the release managers have the right to make decisions within a shorter period of time. In such cases, lazy consensus shall be implied. + +### Request for Comment (RFC) + +The Steering Council shall be in charge of overseeing the RFC process. It shall be a process that remains open to debate to all members of the community, and shall allow for ample time to consider a proposal and for members to respond and engage in meaningful discussion. + +The final decision is vested with the Steering Council. However, it is strongly discouraged that the Steering Council adopt a decision that is contrary to any consensus that may exist in the community. From time to time this may happen if there is a conflict between consensus and the overall project and community goals. + +An RFC shall be initiated by submission to the Steering Council in the public manner as set forth by the Steering Council. Debate shall continue and be facilitated by the Steering Council in general, and the Chair specifically. + +In circumstances that the Steering Council feels it is appropriate, the RFC process may be waived in favor of lazy consensus. diff --git a/guide/content/en/plugins/sanic-ext/configuration.md b/guide/content/en/plugins/sanic-ext/configuration.md new file mode 100644 index 00000000..ef25e920 --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/configuration.md @@ -0,0 +1,270 @@ +# Configuration + +Sanic Extensions can be configured in all of the same ways that [you can configure Sanic](../../guide/deployment/configuration.md). That makes configuring Sanic Extensions very easy. + +```python +app = Sanic("MyApp") +app.config.OAS_URL_PREFIX = "/apidocs" +``` + +However, there are a few more configuration options that should be considered. + +## Manual `extend` + +.. column:: + + Even though Sanic Extensions will automatically attach to your application, you can manually choose `extend`. When you do that, you can pass all of the configuration values as a keyword arguments (lowercase). + +.. column:: + + ```python + app = Sanic("MyApp") + app.extend(oas_url_prefix="/apidocs") + ``` + +.. column:: + + Or, alternatively they could be passed all at once as a single `dict`. + +.. column:: + + ```python + app = Sanic("MyApp") + app.extend(config={"oas_url_prefix": "/apidocs"}) + ``` + +.. column:: + + Both of these solutions suffers from the fact that the names of the configuration settings are not discoverable by an IDE. Therefore, there is also a type annotated object that you can use. This should help the development experience. + +.. column:: + + ```python + from sanic_ext import Config + + app = Sanic("MyApp") + app.extend(config=Config(oas_url_prefix="/apidocs")) + ``` + +## Settings + +.. note:: + + Often, the easiest way to change these for an application (since they likely are not going to change dependent upon an environment), is to set them directly on the `app.config` object. + + Simply use the capitalized version of the configuration key as shown here: + + ```python + app = Sanic("MyApp") + app.config.OAS_URL_PREFIX = "/apidocs" + ``` + +### `cors` + +- **Type**: `bool` +- **Default**: `True` +- **Description**: Whether to enable CORS protection + +### `cors_allow_headers` + +- **Type**: `str` +- **Default**: `"*"` +- **Description**: Value of the header: `access-control-allow-headers` + +### `cors_always_send` + +- **Type**: `bool` +- **Default**: `True` +- **Description**: Whether to always send the header: `access-control-allow-origin` + +### `cors_automatic_options` + +- **Type**: `bool` +- **Default**: `True` +- **Description**: Whether to automatically generate `OPTIONS` endpoints for routes that do *not* already have one defined + +### `cors_expose_headers` + +- **Type**: `str` +- **Default**: `""` +- **Description**: Value of the header: `access-control-expose-headers` + +### `cors_max_age` + +- **Type**: `int` +- **Default**: `5` +- **Description**: Value of the header: `access-control-max-age` + +### `cors_methods` + +- **Type**: `str` +- **Default**: `""` +- **Description**: Value of the header: `access-control-access-control-allow-methods` + +### `cors_origins` + +- **Type**: `str` +- **Default**: `""` +- **Description**: Value of the header: `access-control-allow-origin` + + +.. warning:: + + Be very careful if you place `*` here. Do not do this unless you know what you are doing as it can be a security issue. + + +### `cors_send_wildcard` + +- **Type**: `bool` +- **Default**: `False` +- **Description**: Whether to send a wildcard origin instead of the incoming request origin + +### `cors_supports_credentials` + +- **Type**: `bool` +- **Default**: `False` +- **Description**: Value of the header: `access-control-allow-credentials` + +### `cors_vary_header` + +- **Type**: `bool` +- **Default**: `True` +- **Description**: Whether to add the `vary` header + +### `http_all_methods` + +- **Type**: `bool` +- **Default**: `True` +- **Description**: Adds the HTTP `CONNECT` and `TRACE` methods as allowable + +### `http_auto_head` + +- **Type**: `bool` +- **Default**: `True` +- **Description**: Automatically adds `HEAD` handlers to any `GET` routes + +### `http_auto_options` + +- **Type**: `bool` +- **Default**: `True` +- **Description**: Automatically adds `OPTIONS` handlers to any routes without + +### `http_auto_trace` + +- **Type**: `bool` +- **Default**: `False` +- **Description**: Automatically adds `TRACE` handlers to any routes without + +### `oas` + +- **Type**: `bool` +- **Default**: `True` +- **Description**: Whether to enable OpenAPI specification generation + +### `oas_autodoc` + +- **Type**: `bool` +- **Default**: `True` +- **Description**: Whether to automatically extract OpenAPI details from the docstring of a route function + +### `oas_ignore_head` + +- **Type**: `bool` +- **Default**: `True` +- **Description**: WHen `True`, it will not add `HEAD` endpoints into the OpenAPI specification + +### `oas_ignore_options` + +- **Type**: `bool` +- **Default**: `True` +- **Description**: WHen `True`, it will not add `OPTIONS` endpoints into the OpenAPI specification + +### `oas_path_to_redoc_html` + +- **Type**: `Optional[str]` +- **Default**: `None` +- **Description**: Path to HTML file to override the existing Redoc HTML + +### `oas_path_to_swagger_html` + +- **Type**: `Optional[str]` +- **Default**: `None` +- **Description**: Path to HTML file to override the existing Swagger HTML + +### `oas_ui_default` + +- **Type**: `Optional[str]` +- **Default**: `"redoc"` +- **Description**: Which OAS documentation to serve on the bare `oas_url_prefix` endpoint; when `None` there will be no documentation at that location + +### `oas_ui_redoc` + +- **Type**: `bool` +- **Default**: `True` +- **Description**: Whether to enable the Redoc UI + +### `oas_ui_swagger` + +- **Type**: `bool` +- **Default**: `True` +- **Description**: Whether to enable the Swagger UI + +### `oas_ui_swagger_version` + +- **Type**: `str` +- **Default**: `"4.1.0"` +- **Description**: Which Swagger version to use + +### `oas_uri_to_config` + +- **Type**: `str` +- **Default**: `"/swagger-config"` +- **Description**: Path to serve the Swagger configurtaion + +### `oas_uri_to_json` + +- **Type**: `str` +- **Default**: `"/openapi.json"` +- **Description**: Path to serve the OpenAPI JSON + +### `oas_uri_to_redoc` + +- **Type**: `str` +- **Default**: `"/redoc"` +- **Description**: Path to Redoc + +### `oas_uri_to_swagger` + +- **Type**: `str` +- **Default**: `"/swagger"` +- **Description**: Path to Swagger + +### `oas_url_prefix` + +- **Type**: `str` +- **Default**: `"/docs"` +- **Description**: URL prefix for the Blueprint that all of the OAS documentation witll attach to + +### `swagger_ui_configuration` + +- **Type**: `Dict[str, Any]` +- **Default**: `{"apisSorter": "alpha", "operationsSorter": "alpha", "docExpansion": "full"}` +- **Description**: The Swagger documentation to be served to the frontend + +### `templating_enable_async` + +- **Type**: `bool` +- **Default**: `True` +- **Description**: Whether to set `enable_async` on the Jinja `Environment` + +### `templating_path_to_templates` + +- **Type**: `Union[str, os.PathLike, Sequence[Union[str, os.PathLike]]] ` +- **Default**: `templates` +- **Description**: A single path, or multiple paths to where your template files are located + +### `trace_excluded_headers` + +- **Type**: `Sequence[str]` +- **Default**: `("authorization", "cookie")` +- **Description**: Which headers should be suppresed from responses to `TRACE` requests diff --git a/guide/content/en/plugins/sanic-ext/convenience.md b/guide/content/en/plugins/sanic-ext/convenience.md new file mode 100644 index 00000000..20b6a8fa --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/convenience.md @@ -0,0 +1,111 @@ +# Convenience + +## Fixed serializer + +.. column:: + + Often when developing an application, there will be certain routes that always return the same sort of response. When this is the case, you can predefine the return serializer and on the endpoint, and then all that needs to be returned is the content. + +.. column:: + + ```python + from sanic_ext import serializer + + @app.get("/") + @serializer(text) + async def hello_world(request, name: str): + if name.isnumeric(): + return "hello " * int(name) + return f"Hello, {name}" + ``` + + + +.. column:: + + The `serializer` decorator also can add status codes. + +.. column:: + + ```python + from sanic_ext import serializer + + @app.post("/") + @serializer(text, status=202) + async def create_something(request): + ... + ``` + +## Custom serializer + +.. column:: + + Using the `@serializer` decorator, you can also pass your own custom functions as long as they also return a valid type (`HTTPResonse`). + +.. column:: + + ```python + def message(retval, request, action, status): + return json( + { + "request_id": str(request.id), + "action": action, + "message": retval, + }, + status=status, + ) + + @app.post("/") + @serializer(message) + async def do_action(request, action: str): + return "This is a message" + ``` + + +.. column:: + + Now, returning just a string should return a nice serialized output. + +.. column:: + + ```python + $ curl localhost:8000/eat_cookies -X POST + { + "request_id": "ef81c45b-235c-46dd-9dbd-b550f8fa77f9", + "action": "eat_cookies", + "message": "This is a message" + } + + ``` + + +## Request counter + +.. column:: + + Sanic Extensions comes with a subclass of `Request` that can be setup to automatically keep track of the number of requests processed per worker process. To enable this, you should pass the `CountedRequest` class to your application contructor. + +.. column:: + + ```python + from sanic_ext import CountedRequest + + app = Sanic(..., request_class=CountedRequest) + ``` + + +.. column:: + + You will now have access to the number of requests served during the lifetime of the worker process. + +.. column:: + + ```python + @app.get("/") + async def handler(request: CountedRequest): + return json({"count": request.count}) + ``` + +If possible, the request count will also be added to the [worker state](../../guide/deployment/manager.md#worker-state). + +![](https://user-images.githubusercontent.com/166269/190922460-43bd2cfc-f81a-443b-b84f-07b6ce475cbf.png) diff --git a/guide/content/en/plugins/sanic-ext/custom.md b/guide/content/en/plugins/sanic-ext/custom.md new file mode 100644 index 00000000..a2dba1c1 --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/custom.md @@ -0,0 +1,84 @@ +# Custom extensions + +It is possible to create your own custom extensions. + +Version 22.9 added the `Extend.register` [method](#extension-preregistration). This makes it extremely easy to add custom expensions to an application. + +## Anatomy of an extension + +All extensions must subclass `Extension`. + +### Required + +- `name`: By convention, the name is an all-lowercase string +- `startup`: A method that runs when the extension is added + +### Optional + +- `label`: A method that returns additional information about the extension in the MOTD +- `included`: A method that returns a boolean whether the extension should be enabled or not (could be used for example to check config state) + +### Example + +```python +from sanic import Request, Sanic, json +from sanic_ext import Extend, Extension + +app = Sanic(__name__) +app.config.MONITOR = True + +class AutoMonitor(Extension): + name = "automonitor" + + def startup(self, bootstrap) -> None: + if self.included(): + self.app.before_server_start(self.ensure_monitor_set) + self.app.on_request(self.monitor) + + @staticmethod + async def monitor(request: Request): + if request.route and request.route.ctx.monitor: + print("....") + + @staticmethod + async def ensure_monitor_set(app: Sanic): + for route in app.router.routes: + if not hasattr(route.ctx, "monitor"): + route.ctx.monitor = False + + def label(self): + has_monitor = [ + route + for route in self.app.router.routes + if getattr(route.ctx, "monitor", None) + ] + return f"{len(has_monitor)} endpoint(s)" + + def included(self): + return self.app.config.MONITOR + +Extend.register(AutoMonitor) + +@app.get("/", ctx_monitor=True) +async def handler(request: Request): + return json({"foo": "bar"}) +``` + +## Extension preregistration + +.. column:: + + `Extend.register` simplifies the addition of custom extensions. + +.. column:: + + ```python + from sanic_ext import Extend, Extension + + class MyCustomExtension(Extension): + ... + + Extend.register(MyCustomExtension()) + ``` + +*Added in v22.9* diff --git a/guide/content/en/plugins/sanic-ext/getting-started.md b/guide/content/en/plugins/sanic-ext/getting-started.md new file mode 100644 index 00000000..e91d909c --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/getting-started.md @@ -0,0 +1,81 @@ +# Getting Started + +Sanic Extensions is an *officially supported* plugin developed, and maintained by the SCO. The primary goal of this project is to add additional features to help Web API and Web application development easier. + +## Features + +- CORS protection +- Template rendering with Jinja +- Dependency injection into route handlers +- OpenAPI documentation with Redoc and/or Swagger +- Predefined, endpoint-specific response serializers +- Request query arguments and body input validation +- Auto create `HEAD`, `OPTIONS`, and `TRACE` endpoints + +## Minimum requirements + +- **Python**: 3.8+ +- **Sanic**: 21.9+ + +## Install + +The best method is to just install Sanic Extensions along with Sanic itself: + +```bash +pip install sanic[ext] +``` + +You can of course also just install it by itself. + +```bash +pip install sanic-ext +``` + +## Extend your application + +Out of the box, Sanic Extensions will enable a bunch of features for you. + +.. column:: + + To setup Sanic Extensions (v21.12+), you need to do: **nothing**. If it is installed in the environment, it is setup and ready to go. + + This code is the Hello, world app in the [Sanic Getting Started page](../../guide/getting-started.md) _without any changes_, but using Sanic Extensions with `sanic-ext` installed in the background. + +.. column:: + + ```python + from sanic import Sanic + from sanic.response import text + + app = Sanic("MyHelloWorldApp") + + @app.get("/") + async def hello_world(request): + return text("Hello, world.") + ``` + + +.. column:: + + **_OLD DEPRECATED SETUP_** + + In v21.9, the easiest way to get started is to instantiate it with `Extend`. + + If you look back at the Hello, world app in the [Sanic Getting Started page](../../guide/getting-started.md), you will see the only additions here are the two highlighted lines. + +.. column:: + + ```python + from sanic import Sanic + from sanic.response import text + from sanic_ext import Extend + + app = Sanic("MyHelloWorldApp") + Extend(app) + + @app.get("/") + async def hello_world(request): + return text("Hello, world.") + ``` + +Regardless of how it is setup, you should now be able to view the OpenAPI documentation and see some of the functionality in action: [http://localhost:8000/docs](http://localhost:8000/docs). diff --git a/guide/content/en/plugins/sanic-ext/health-monitor.md b/guide/content/en/plugins/sanic-ext/health-monitor.md new file mode 100644 index 00000000..b6f86640 --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/health-monitor.md @@ -0,0 +1,69 @@ +# Health monitor + +The health monitor requires both `sanic>=22.9` and `sanic-ext>=22.9`. + +You can setup Sanic Extensions to monitor the health of your worker processes. This requires that you not be in [single process mode](../../guide/deployment/manager.md#single-process-mode). + +## Setup + +.. column:: + + Out of the box, the health monitor is disabled. You will need to opt-in if you would like to use it. + +.. column:: + + ```python + app.config.HEALTH = True + ``` + +## How does it work + +The monitor sets up a new background process that will periodically receive acknowledgements of liveliness from each worker process. If a worker process misses a report too many times, then the monitor will restart that one worker. + +## Diagnostics endpoint + +.. column:: + + The health monitor will also enable a diagnostics endpoint that outputs the [worker state](../../guide/deployment/manager.md#worker-state). By default is id disabled. + + .. danger:: + + The diagnostics endpoint is not secured. If you are deploying it in a production environment, you should take steps to protect it with a proxy server if you are using one. If not, you may want to consider disabling this feature in production since it will leak details about your server state. + +.. column:: + + ``` + $ curl http://localhost:8000/__health__ + { + 'Sanic-Main': {'pid': 99997}, + 'Sanic-Server-0-0': { + 'server': True, + 'state': 'ACKED', + 'pid': 9999, + 'start_at': datetime.datetime(2022, 10, 1, 0, 0, 0, 0, tzinfo=datetime.timezone.utc), + 'starts': 2, + 'restart_at': datetime.datetime(2022, 10, 1, 0, 0, 12, 861332, tzinfo=datetime.timezone.utc) + }, + 'Sanic-Reloader-0': { + 'server': False, + 'state': 'STARTED', + 'pid': 99998, + 'start_at': datetime.datetime(2022, 10, 1, 0, 0, 0, 0, tzinfo=datetime.timezone.utc), + 'starts': 1 + } + } + ``` + + +## Configuration + +| Key | Type | Default| Description | +|--|--|--|--| +| HEALTH | `bool` | `False` | Whether to enable this extension. | +| HEALTH_ENDPOINT | `bool` | `False` | Whether to enable the diagnostics endpoint. | +| HEALTH_MAX_MISSES | `int` | `3` | The number of consecutive misses before a worker process is restarted. | +| HEALTH_MISSED_THRESHHOLD | `int` | `10` | The number of seconds the monitor checks for worker process health. | +| HEALTH_MONITOR | `bool` | `True` | Whether to enable the health monitor. | +| HEALTH_REPORT_INTERVAL | `int` | `5` | The number of seconds between reporting each acknowledgement of liveliness. | +| HEALTH_URI_TO_INFO | `str` | `""` | The URI path of the diagnostics endpoint. | +| HEALTH_URL_PREFIX | `str` | `"/__health__"` | The URI prefix of the diagnostics blueprint. | diff --git a/guide/content/en/plugins/sanic-ext/http/cors.md b/guide/content/en/plugins/sanic-ext/http/cors.md new file mode 100644 index 00000000..551ab202 --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/http/cors.md @@ -0,0 +1,86 @@ +# CORS protection + +Cross-Origin Resource Sharing (aka CORS) is a *huge* topic by itself. The documentation here cannot go into enough detail about *what* it is. You are highly encouraged to do some research on your own to understand the security problem presented by it, and the theory behind the solutions. [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) are a great first step. + +In super brief terms, CORS protection is a framework that browsers use to facilitate how and when a web page can access information from another domain. It is extremely relevant to anyone building a single-page application. Often times your frontend might be on a domain like `https://portal.myapp.com`, but it needs to access the backend from `https://api.myapp.com`. + +The implementation here is heavily inspired by [`sanic-cors`](https://github.com/ashleysommer/sanic-cors), which is in turn based upon [`flask-cors`](https://github.com/corydolphin/flask-cors). It is therefore very likely that you can achieve a near drop-in replacement of `sanic-cors` with `sanic-ext`. + +## Basic implementation + +.. column:: + + As shown in the example in the [auto-endpoints example](methods.md#options), Sanic Extensions will automatically enable CORS protection without further action. But, it does not offer too much out of the box. + + At a *bare minimum*, it is **highly** recommended that you set `config.CORS_ORIGINS` to the intended origin(s) that will be accessing the application. + +.. column:: + + ```python + from sanic import Sanic, text + from sanic_ext import Extend + + app = Sanic(__name__) + app.config.CORS_ORIGINS = "http://foobar.com,http://bar.com" + Extend(app) + + @app.get("/") + async def hello_world(request): + return text("Hello, world.") + ``` + + ``` + $ curl localhost:8000 -X OPTIONS -i + HTTP/1.1 204 No Content + allow: GET,HEAD,OPTIONS + access-control-allow-origin: http://foobar.com + connection: keep-alive + ``` + +## Configuration + +The true power of CORS protection, however, comes into play once you start configuring it. Here is a table of all of the options. + +| Key | Type | Default| Description | +|--|--|--|--| +| `CORS_ALLOW_HEADERS` | `str` or `List[str]` | `"*"` | The list of headers that will appear in `access-control-allow-headers`. | +| `CORS_ALWAYS_SEND` | `bool` | `True` | When `True`, will always set a value for `access-control-allow-origin`. When `False`, will only set it if there is an `Origin` header. | +| `CORS_AUTOMATIC_OPTIONS` | `bool` | `True` | When the incoming preflight request is received, whether to automatically set values for `access-control-allow-headers`, `access-control-max-age`, and `access-control-allow-methods` headers. If `False` these values will only be set on routes that are decorated with the `@cors` decorator. | +| `CORS_EXPOSE_HEADERS` | `str` or `List[str]` | `""` | Specific list of headers to be set in `access-control-expose-headers` header. | +| `CORS_MAX_AGE` | `str`, `int`, `timedelta` | `0` | The maximum number of seconds the preflight response may be cached using the `access-control-max-age` header. A falsey value will cause the header to not be set. | +| `CORS_METHODS` | `str` or `List[str]` | `""` | The HTTP methods that the allowed origins can access, as set on the `access-control-allow-methods` header. | +| `CORS_ORIGINS` | `str`, `List[str]`, `re.Pattern` | `"*"` | The origins that are allowed to access the resource, as set on the `access-control-allow-origin` header. | +| `CORS_SEND_WILDCARD` | `bool` | `False` | If `True`, will send the wildcard `*` origin instead of the `origin` request header. | +| `CORS_SUPPORTS_CREDENTIALS` | `bool` | `False` | Whether to set the `access-control-allow-credentials` header. | +| `CORS_VARY_HEADER` | `bool` | `True` | Whether to add `vary` header, when appropriate. | + +*For the sake of brevity, where the above says `List[str]` any instance of a `list`, `set`, `frozenset`, or `tuple` will be acceptable. Alternatively, if the value is a `str`, it can be a comma delimited list.* + +## Route level overrides + +.. column:: + + It may sometimes be necessary to override app-wide settings for a specific route. To allow for this, you can use the `@sanic_ext.cors()` decorator to set different route-specific values. + + The values that can be overridden with this decorator are: + + - `origins` + - `expose_headers` + - `allow_headers` + - `allow_methods` + - `supports_credentials` + - `max_age` + +.. column:: + + ```python + from sanic_ext import cors + + app.config.CORS_ORIGINS = "https://foo.com" + + @app.get("/", host="bar.com") + @cors(origins="https://bar.com") + async def hello_world(request): + return text("Hello, world.") + ``` + diff --git a/guide/content/en/plugins/sanic-ext/http/methods.md b/guide/content/en/plugins/sanic-ext/http/methods.md new file mode 100644 index 00000000..0887fec8 --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/http/methods.md @@ -0,0 +1,142 @@ +# HTTP Methods + +## Auto-endpoints + +The default behavior is to automatically generate `HEAD` endpoints for all `GET` routes, and `OPTIONS` endpoints for all +routes. Additionally, there is the option to automatically generate `TRACE` endpoints. However, these are not enabled by +default. + +### HEAD + +.. column:: + + - **Configuration**: `AUTO_HEAD` (default `True`) + - **MDN**: [Read more](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/HEAD) + + A `HEAD` request provides the headers and an otherwise identical response to what a `GET` request would provide. + However, it does not actually return the body. + +.. column:: + + ```python + @app.get("/") + async def hello_world(request): + return text("Hello, world.") + ``` + + Given the above route definition, Sanic Extensions will enable `HEAD` responses, as seen here. + + ``` + $ curl localhost:8000 --head + HTTP/1.1 200 OK + access-control-allow-origin: * + content-length: 13 + connection: keep-alive + content-type: text/plain; charset=utf-8 + ``` + +### OPTIONS + +.. column:: + + - **Configuration**: `AUTO_OPTIONS` (default `True`) + - **MDN**: [Read more](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/OPTIONS) + + `OPTIONS` requests provide the recipient with details about how the client is allowed to communicate with a given + endpoint. + +.. column:: + + ```python + @app.get("/") + async def hello_world(request): + return text("Hello, world.") + ``` + + Given the above route definition, Sanic Extensions will enable `OPTIONS` responses, as seen here. + + It is important to note that we also see `access-control-allow-origins` in this example. This is because + the [CORS protection](cors.md) is enabled by default. + + ``` + $ curl localhost:8000 -X OPTIONS -i + HTTP/1.1 204 No Content + allow: GET,HEAD,OPTIONS + access-control-allow-origin: * + connection: keep-alive + ``` + +.. tip:: + + Even though Sanic Extensions will setup these routes for you automatically, if you decide to manually create an `@app.options` route, it will *not* be overridden. + +### TRACE + +.. column:: + + - **Configuration**: `AUTO_TRACE` (default `False`) + - **MDN**: [Read more](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods/TRACE) + + By default, `TRACE` endpoints will **not** be automatically created. However, Sanic Extensions **will allow** you to + create them if you wanted. This is something that is not allowed in vanilla Sanic. + +.. column:: + + ```python + @app.route("/", methods=["trace"]) + async def handler(request): + ... + ``` + + To enable auto-creation of these endpoints, you must first enable them when extending Sanic. + + ```python + from sanic_ext import Extend, Config + + app.extend(config=Config(http_auto_trace=True)) + ``` + + Now, assuming you have some endpoints setup, you can trace them as shown here: + + ``` + $ curl localhost:8000 -X TRACE + TRACE / HTTP/1.1 + Host: localhost:9999 + User-Agent: curl/7.76.1 + Accept: */* + ``` + +.. tip:: + + Setting up `AUTO_TRACE` can be super helpful, especially when your application is deployed behind a proxy since it will help you determine how the proxy is behaving. + +## Additional method support + +Vanilla Sanic allows you to build endpoints with the following HTTP methods: + +- [GET](/en/guide/basics/routing.html#get) +- [POST](/en/guide/basics/routing.html#post) +- [PUT](/en/guide/basics/routing.html#put) +- [HEAD](/en/guide/basics/routing.html#head) +- [OPTIONS](/en/guide/basics/routing.html#options) +- [PATCH](/en/guide/basics/routing.html#patch) +- [DELETE](/en/guide/basics/routing.html#delete) + +See [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) for more. + +.. column:: + + There are, however, two more "standard" HTTP methods: `TRACE` and `CONNECT`. Sanic Extensions will allow you to build + endpoints using these methods, which would otherwise not be allowed. + + It is worth pointing out that this will *NOT* enable convenience methods: `@app.trace` or `@app.connect`. You need to + use `@app.route` as shown in the example here. + +.. column:: + + ```python + @app.route("/", methods=["trace", "connect"]) + async def handler(_): + return empty() + ``` + diff --git a/guide/content/en/plugins/sanic-ext/injection.md b/guide/content/en/plugins/sanic-ext/injection.md new file mode 100644 index 00000000..238f4e5a --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/injection.md @@ -0,0 +1,356 @@ +# Dependency Injection + +Dependency injection is a method to add arguments to a route handler based upon the defined function signature. Specifically, it looks at the **type annotations** of the arguments in the handler. This can be useful in a number of cases like: + +- Fetching an object based upon request headers (like the current session user) +- Recasting certain objects into a specific type +- Using the request object to prefetch data +- Auto inject services + +The `Extend` instance has two basic methods on it used for dependency injection: a lower level `add_dependency`, and a higher level `dependency`. + +**Lower level**: `app.ext.add_dependency(...)` + +- `type: Type,`: some unique class that will be the type of the object +- `constructor: Optional[Callable[..., Any]],` (OPTIONAL): a function that will return that type + +**Higher level**: `app.ext.dependency(...)` + +- `obj: Any`: any object that you would like injected +- `name: Optional[str]`: some name that could alternately be used as a reference + +Let's explore some use cases here. + + +.. warning:: + + If you used dependency injection prior to v21.12, the lower level API method was called `injection`. It has since been renamed to `add_dependency` and starting in v21.12 `injection` is an alias for `add_dependency`. The `injection` method has been deprecated for removal in v22.6. + + + +## Basic implementation + +The simplest use case would be simply to recast a value. + +.. column:: + + This could be useful if you have a model that you want to generate based upon the matched path parameters. + +.. column:: + + ```python + @dataclass + class IceCream: + flavor: str + + def __str__(self) -> str: + return f"{self.flavor.title()} (Yum!)" + + app.ext.add_dependency(IceCream) + + @app.get("/") + async def ice_cream(request, flavor: IceCream): + return text(f"You chose: {flavor}") + ``` + + ``` + $ curl localhost:8000/chocolate + You chose Chocolate (Yum!) + ``` + + +.. column:: + + This works by passing a keyword argument to the constructor of the `type` argument. The previous example is equivalent to this. + +.. column:: + + ```python + flavor = IceCream(flavor="chocolate") + ``` + +## Additional constructors + +.. column:: + + Sometimes you may need to also pass a constructor. This could be a function, or perhaps even a classmethod that acts as a constructor. In this example, we are creating an injection that will call `Person.create` first. + + Also important to note on this example, we are actually injecting **two (2)** objects! It of course does not need to be this way, but we will inject objects based upon the function signature. + +.. column:: + + ```python + @dataclass + class PersonID: + person_id: int + + @dataclass + class Person: + person_id: PersonID + name: str + age: int + + @classmethod + async def create(cls, request: Request, person_id: int): + return cls(person_id=PersonID(person_id), name="noname", age=111) + + + app.ext.add_dependency(Person, Person.create) + app.ext.add_dependency(PersonID) + + @app.get("/person/") + async def person_details( + request: Request, person_id: PersonID, person: Person + ): + return text(f"{person_id}\n{person}") + ``` + + ``` + $ curl localhost:8000/person/123 + PersonID(person_id=123) + Person(person_id=PersonID(person_id=123), name='noname', age=111) + ``` + +When a `constructor` is passed to `ext.add_dependency` (like in this example) that will be called. If not, then the object will be created by calling the `type`. A couple of important things to note about passing a `constructor`: + +1. A positional `request: Request` argument is *usually* expected. See the `Person.create` method above as an example using a `request` and [arbitrary constructors](#arbitrary-constructors) for how to use a callable that does not require a `request`. +1. All matched path parameters are injected as keyword arguments. +1. Dependencies can be chained and nested. Notice how in the previous example the `Person` dataclass has a `PersonID`? That means that `PersonID` will be called first, and that value is added to the keyword arguments when calling `Person.create`. + +## Arbitrary constructors + +.. column:: + + Sometimes you may want to construct your injectable _without_ the `Request` object. This is useful if you have arbitrary classes or functions that create your objects. If the callable does have any required arguments, then they should themselves be injectable objects. + + This is very useful if you have services or other types of objects that should only exist for the lifetime of a single request. For example, you might use this pattern to pull a single connection from your database pool. + +.. column:: + + ```python + class Alpha: + ... + + class Beta: + def __init__(self, alpha: Alpha) -> None: + self.alpha = alpha + + app.ext.add_dependency(Alpha) + app.ext.add_dependency(Beta) + + @app.get("/beta") + async def handler(request: Request, beta: Beta): + assert isinstance(beta.alpha, Alpha) + ``` + +*Added in v22.9* + +## Objects from the `Request` + +.. column:: + + Sometimes you may want to extract details from the request and preprocess them. You could, for example, cast the request JSON to a Python object, and then add some additional logic based upon DB queries. + + .. warning:: + + If you plan to use this method, you should note that the injection actually happens *before* Sanic has had a chance to read the request body. The headers should already have been consumed. So, if you do want access to the body, you will need to manually consume as seen in this example. + + ```python + await request.receive_body() + ``` + + + This could be used in cases where you otherwise might: + + - use middleware to preprocess and add something to the `request.ctx` + - use decorators to preprocess and inject arguments into the request handler + + In this example, we are using the `Request` object in the `compile_profile` constructor to run a fake DB query to generate and return a `UserProfile` object. + +.. column:: + + ```python + @dataclass + class User: + name: str + + @dataclass + class UserProfile: + user: User + age: int = field(default=0) + email: str = field(default="") + + def __json__(self): + return ujson.dumps( + { + "name": self.user.name, + "age": self.age, + "email": self.email, + } + ) + + async def fake_request_to_db(body): + today = date.today() + email = f'{body["name"]}@something.com'.lower() + difference = today - date.fromisoformat(body["birthday"]) + age = int(difference.days / 365) + return UserProfile( + User(body["name"]), + age=age, + email=email, + ) + + async def compile_profile(request: Request): + await request.receive_body() + profile = await fake_request_to_db(request.json) + return profile + + app.ext.add_dependency(UserProfile, compile_profile) + + @app.patch("/profile") + async def update_profile(request, profile: UserProfile): + return json(profile) + ``` + + ``` + $ curl localhost:8000/profile -X PATCH -d '{"name": "Alice", "birthday": "2000-01-01"}' + { + "name":"Alice", + "age":21, + "email":"alice@something.com" + } + ``` + +## Injecting services + +It is a common pattern to create things like database connection pools and store them on the `app.ctx` object. This makes them available throughout your application, which is certainly a convenience. One downside, however, is that you no longer have a typed object to work with. You can use dependency injections to fix this. First we will show the concept using the lower level `add_dependency` like we have been using in the previous examples. But, there is a better way using the higher level `dependency` method. + +### The lower level API using `add_dependency` + +.. column:: + + + This works very similar to the [last example](#objects-from-the-request) where the goal is the extract something from the `Request` object. In this example, a database object was created on the `app.ctx` instance, and is being returned in the dependency injection constructor. + +.. column:: + + ```python + class FakeConnection: + async def execute(self, query: str, **arguments): + return "result" + + @app.before_server_start + async def setup_db(app, _): + app.ctx.db_conn = FakeConnection() + app.ext.add_dependency(FakeConnection, get_db) + + def get_db(request: Request): + return request.app.ctx.db_conn + + + + @app.get("/") + async def handler(request, conn: FakeConnection): + response = await conn.execute("...") + return text(response) + ``` + ``` + $ curl localhost:8000/ + result + ``` + +### The higher level API using `dependency` + +.. column:: + + Since we have an actual *object* that is available when adding the dependency injection, we can use the higher level `dependency` method. This will make the pattern much easier to write. + + This method should always be used when you want to inject something that exists throughout the lifetime of the application instance and is not request specific. It is very useful for services, third party clients, and connection pools since they are not request specific. + +.. column:: + + ```python + class FakeConnection: + async def execute(self, query: str, **arguments): + return "result" + + @app.before_server_start + async def setup_db(app, _): + db_conn = FakeConnection() + app.ext.dependency(db_conn) + + @app.get("/") + async def handler(request, conn: FakeConnection): + response = await conn.execute("...") + return text(response) + ``` + ``` + $ curl localhost:8000/ + result + ``` + +## Generic types + +Be carefule when using a [generic type](https://docs.python.org/3/library/typing.html#typing.Generic). The way that Sanic's dependency injection works is by matching the entire type definition. Therefore, `Foo` is not the same as `Foo[str]`. This can be particularly tricky when trying to use the [higher-level `dependency` method](#the-higher-level-api-using-dependency) since the type is inferred. + +.. column:: + + For example, this will **NOT** work as expected since there is no definition for `Test[str]`. + +.. column:: + + ```python + import typing + from sanic import Sanic, text + + T = typing.TypeVar("T") + + class Test(typing.Generic[T]): + test: T + + app = Sanic("testapp") + app.ext.dependency(Test()) + + @app.get("/") + def test(request, test: Test[str]): + ... + ``` + + +.. column:: + + To get this example to work, you will need to add an explicit definition for the type you intend to be injected. + +.. column:: + + ```python + import typing + from sanic import Sanic, text + + T = typing.TypeVar("T") + + class Test(typing.Generic[T]): + test: T + + app = Sanic("testapp") + _singleton = Test() + app.ext.add_dependency(Test[str], lambda: _singleton) + + @app.get("/") + def test(request, test: Test[str]): + ... + ``` + +## Configuration + +.. column:: + + By default, dependencies will be injected after the `http.routing.after` [signal](../../guide/advanced/signals.md#built-in-signals). Starting in v22.9, you can change this to the `http.handler.before` signal. + +.. column:: + + ```python + app.config.INJECTION_SIGNAL = "http.handler.before" + ``` + +*Added in v22.9* diff --git a/guide/content/en/plugins/sanic-ext/logger.md b/guide/content/en/plugins/sanic-ext/logger.md new file mode 100644 index 00000000..83d42ad7 --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/logger.md @@ -0,0 +1,30 @@ +# Background logger + +The background logger requires both `sanic>=22.9` and `sanic-ext>=22.9`. + +You can setup Sanic Extensions to log all of your messages from a background process. This requires that you not be in [single process mode](../../guide/deployment/manager.md#single-process-mode). + +Logging can sometimes be an expensive operation. By pushing all logging off to a background process, you can potentially gain some performance benefits. + +## Setup + +.. column:: + + Out of the box, the background logger is disabled. You will need to opt-in if you would like to use it. + +.. column:: + + ```python + app.config.LOGGING = True + ``` + +## How does it work + +When enabled, the extension will create a `multoprocessing.Queue`. It will remove all handlers on the [default Sanic loggers](../../guide/best-practices/logging.md) and replace them with a [`QueueHandler`](https://docs.python.org/3/library/logging.handlers.html#queuehandler). When a message is logged, it will be pushed into the queue by the handler, and read by the background process to the log handlers that were originally in place. This means you can still configure logging as normal and it should "just work." + +## Configuration + +| Key | Type | Default| Description | +|--|--|--|--| +| LOGGING | `bool` | `False` | Whether to enable this extension. | +| LOGGING_QUEUE_MAX_SIZE | `int` | `4096` | The max size of the queue before messages are rejected. | diff --git a/guide/content/en/plugins/sanic-ext/openapi.md b/guide/content/en/plugins/sanic-ext/openapi.md new file mode 100644 index 00000000..7e3314aa --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/openapi.md @@ -0,0 +1,7 @@ +# Openapi + +- Adding documentation with decorators +- Documenting CBV +- Using autodoc +- Rendering docs with redoc/swagger +- Validation diff --git a/guide/content/en/plugins/sanic-ext/openapi/README.md b/guide/content/en/plugins/sanic-ext/openapi/README.md new file mode 100644 index 00000000..e69de29b diff --git a/guide/content/en/plugins/sanic-ext/openapi/advanced.md b/guide/content/en/plugins/sanic-ext/openapi/advanced.md new file mode 100644 index 00000000..58987f6e --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/openapi/advanced.md @@ -0,0 +1,9 @@ +# Advanced + +_Documentation coming EOQ1 2023_ + +## CBV + +## Blueprints + +## Components diff --git a/guide/content/en/plugins/sanic-ext/openapi/autodoc.md b/guide/content/en/plugins/sanic-ext/openapi/autodoc.md new file mode 100644 index 00000000..d575b7b9 --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/openapi/autodoc.md @@ -0,0 +1,141 @@ +# Auto-documentation + +To make documenting endpoints easier, Sanic Extensions will use a function's docstring to populate your documentation. + +## Summary and description + +.. column:: + + A function's docstring will be used to create the summary and description. As you can see from this example here, the docstring has been parsed to use the first line as the summary, and the remainder of the string as the description. + +.. column:: + + ```python + @app.get("/foo") + async def handler(request, something: str): + """This is a simple foo handler + + It is helpful to know that you could also use **markdown** inside your + docstrings. + + - one + - two + - three""" + return text(">>>") + ``` + ```json + "paths": { + "/foo": { + "get": { + "summary": "This is a simple foo handler", + "description": "It is helpful to know that you could also use **markdown** inside your
docstrings.

- one
- two
- three", + "responses": { + "default": { + "description": "OK" + } + }, + "operationId": "get_handler" + } + } + } + ``` + +## Operation level YAML + +.. column:: + + You can expand upon this by adding valid OpenAPI YAML to the docstring. Simply add a line that contains `openapi:`, followed by your YAML. + + The `---` shown in the example is *not* necessary. It is just there to help visually identify the YAML as a distinct section of the docstring. + +.. column:: + + ```python + @app.get("/foo") + async def handler(request, something: str): + """This is a simple foo handler + + Now we will add some more details + + openapi: + --- + operationId: fooDots + tags: + - one + - two + parameters: + - name: limit + in: query + description: How many items to return at one time (max 100) + required: false + schema: + type: integer + format: int32 + responses: + '200': + description: Just some dots + """ + return text("...") + ``` + ```json + "paths": { + "/foo": { + "get": { + "operationId": "fooDots", + "summary": "This is a simple foo handler", + "description": "Now we will add some more details", + "tags": [ + "one", + "two" + ], + "parameters": [ + { + "name": "limit", + "in": "query", + "description": "How many items to return at one time (max 100)", + "required": false, + "schema": { + "type": "integer", + "format": "int32" + } + } + ], + "responses": { + "200": { + "description": "Just some dots" + } + } + } + } + } + ``` + + + +.. note:: + + When both YAML documentation and decorators are used, it is the content from the decorators that will take priority when generating the documentation. + + + +## Excluding docstrings + +.. column:: + + Sometimes a function may contain a docstring that is not meant to be consumed inside the documentation. + + **Option 1**: Globally turn off auto-documentation `app.config.OAS_AUTODOC = False` + + **Option 2**: Disable it for the single handler with the `@openapi.no_autodoc` decorator + +.. column:: + + ```python + @app.get("/foo") + @openapi.no_autodoc + async def handler(request, something: str): + """This is a docstring about internal info only. Do not parse it. + """ + return text("...") + ``` + diff --git a/guide/content/en/plugins/sanic-ext/openapi/basics.md b/guide/content/en/plugins/sanic-ext/openapi/basics.md new file mode 100644 index 00000000..e4a209d1 --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/openapi/basics.md @@ -0,0 +1,70 @@ +# Basics + + +.. note:: + + The OpenAPI implementation in Sanic Extensions is based upon the OAS3 implementation from [`sanic-openapi`](https://github.com/sanic-org/sanic-openapi). In fact, Sanic Extensions is in a large way the successor to that project, which entered maintenance mode upon the release of Sanic Extensions. If you were previously using OAS3 with `sanic-openapi` you should have an easy path to upgrading to Sanic Extensions. Unfortunately, this project does *NOT* support the OAS2 specification. + + + +.. column:: + + Out of the box, Sanic Extensions provides automatically generated API documentation using the [v3.0 OpenAPI specification](https://swagger.io/specification/). There is nothing special that you need to do + +.. column:: + + ```python + from sanic import Sanic + + app = Sanic("MyApp") + + # Add all of your views + ``` + +After doing this, you will now have beautiful documentation already generated for you based upon your existing application: + +- [http://localhost:8000/docs](http://localhost:8000/docs) +- [http://localhost:8000/docs/redoc](http://localhost:8000/docs/redoc) +- [http://localhost:8000/docs/swagger](http://localhost:8000/docs/swagger) + +Checkout the [section on configuration](../configuration.md) to learn about changing the routes for the docs. You can also turn off one of the two UIs, and customize which UI will be available on the `/docs` route. + +.. column:: + + Using [Redoc](https://github.com/Redocly/redoc) + + ![Redoc](/assets/images/sanic-ext-redoc.png) + +.. column:: + + or [Swagger UI](https://github.com/swagger-api/swagger-ui) + + ![Swagger UI](/assets/images/sanic-ext-swagger.png) + +## Changing specification metadata + +.. column:: + + If you want to change any of the metada, you should use the `describe` method. + + In this example `dedent` is being used with the `description` argument to make multi-line strings a little cleaner. This is not necessary, you can pass any string value here. + +.. column:: + + ```python + from textwrap import dedent + + app.ext.openapi.describe( + "Testing API", + version="1.2.3", + description=dedent( + """ + # Info + This is a description. It is a good place to add some _extra_ doccumentation. + + **MARKDOWN** is supported. + """ + ), + ) + ``` + diff --git a/guide/content/en/plugins/sanic-ext/openapi/decorators.md b/guide/content/en/plugins/sanic-ext/openapi/decorators.md new file mode 100644 index 00000000..90d89933 --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/openapi/decorators.md @@ -0,0 +1,468 @@ +# Decorators + +The primary mechanism for adding content to your schema is by decorating your endpoints. If you have +used `sanic-openapi` in the past, this should be familiar to you. The decorators and their arguments match closely +the [OAS v3.0 specification](https://swagger.io/specification/). + +.. column:: + + All of the examples show will wrap around a route definition. When you are creating these, you should make sure that + your Sanic route decorator (`@app.route`, `@app.get`, etc) is the outermost decorator. That is to say that you should + put that first and then one or more of the below decorators after. + +.. column:: + + ```python + from sanic_ext import openapi + + @app.get("/path/to/") + @openapi.summary("This is a summary") + @openapi.description("This is a description") + async def handler(request, something: str): + ... + ``` + + +.. column:: + + You will also see a lot of the below examples reference a model object. For the sake of simplicity, the examples will + use `UserProfile` that will look like this. The point is that it can be any well-typed class. You could easily imagine + this being a `dataclass` or some other kind of model object. + +.. column:: + + ```python + class UserProfile: + name: str + age: int + email: str + ``` + +## Definition decorator + +### `@openapi.definition` + +The `@openapi.definition` decorator allows you to define all parts of an operations on a path at once. It is an omnibums +decorator in that it has the same capabilities to create operation definitions as the rest of the decorators. Using +multiple field-specific decorators or a single decorator is a style choice for you the developer. + +The fields are purposely permissive in accepting multiple types to make it easiest for you to define your operation. + +**Arguments** + +| Field | Type | +| ------------- | --------------------------------------------------------------------------| +| `body` | **dict, RequestBody, *YourModel*** | +| `deprecated` | **bool** | +| `description` | **str** | +| `document` | **str, ExternalDocumentation** | +| `exclude` | **bool** | +| `operation` | **str** | +| `parameter` | **str, dict, Parameter, [str], [dict], [Parameter]** | +| `response` | **dict, Response, *YourModel*, [dict], [Response]** | +| `summary` | **str** | +| `tag` | **str, Tag, [str], [Tag]** | +| `secured` | **Dict[str, Any]** | + +**Examples** + +.. column:: + + ```python + @openapi.definition( + body=RequestBody(UserProfile, required=True), + summary="User profile update", + tag="one", + response=[Success, Response(Failure, status=400)], + ) + ``` + +.. column:: + + + +*See below examples for more examples. Any of the values for the below decorators can be used in the corresponding +keyword argument.* + +## Field-specific decorators + +All the following decorators are based on `@openapi` + +### body + +**Arguments** + +| Field | Type | +| ----------- | ---------------------------------- | +| **content** | ***YourModel*, dict, RequestBody** | + +**Examples** + +.. column:: + + ```python + @openapi.body(UserProfile) + ``` + + ```python + @openapi.body({"application/json": UserProfile}) + ``` + + ```python + @openapi.body(RequestBody({"application/json": UserProfile})) + ``` + +.. column:: + + ```python + @openapi.body({"content": UserProfile}) + ``` + + ```python + @openapi.body(RequestBody(UserProfile)) + ``` + + ```python + @openapi.body({"application/json": {"description": ...}}) + ``` + +### deprecated + +**Arguments** + +*None* + +**Examples** + +.. column:: + + ```python + @openapi.deprecated() + ``` + +.. column:: + + ```python + @openapi.deprecated + ``` + +### description + +**Arguments** + +| Field | Type | +| ------ | ------- | +| `text` | **str** | + +**Examples** + +.. column:: + + ```python + @openapi.description( + """This is a **description**. + + ## You can use `markdown` + + - And + - make + - lists. + """ + ) + ``` + +.. column:: + + +### document + +**Arguments** + +| Field | Type | +| ------------- | ------- | +| `url` | **str** | +| `description` | **str** | + +**Examples** + +.. column:: + + ```python + @openapi.document("http://example.com/docs") + ``` + +.. column:: + + ```python + @openapi.document(ExternalDocumentation("http://example.com/more")) + ``` + +### exclude + +Can be used on route definitions like all of the other decorators, or can be called on a Blueprint + +**Arguments** + +| Field | Type | Default | +| ------ | ------------- | -------- | +| `flag` | **bool** | **True** | +| `bp` | **Blueprint** | | + +**Examples** + +.. column:: + + ```python + @openapi.exclude() + ``` + +.. column:: + + ```python + openapi.exclude(bp=some_blueprint) + ``` + +### operation + +Sets the operation ID. + +**Arguments** + +| Field | Type | +| ------ | ------- | +| `name` | **str** | + +**Examples** + +.. column:: + + ```python + @openapi.operation("doNothing") + ``` + +.. column:: + + + + +**Arguments** + +| Field | Type | Default | +| ---------- | ----------------------------------------- | ----------- | +| `name` | **str** | | +| `schema` | ***type*** | **str** | +| `location` | **"query", "header", "path" or "cookie"** | **"query"** | + +**Examples** + +.. column:: + + ```python + @openapi.parameter("thing") + ``` + + ```python + @openapi.parameter(parameter=Parameter("foobar", deprecated=True)) + ``` + +.. column:: + + ```python + @openapi.parameter("Authorization", str, "header") + ``` + + ```python + @openapi.parameter("thing", required=True, allowEmptyValue=False) + ``` + +### response + +**Arguments** + +If using a `Response` object, you should not pass any other arguments. + +| Field | Type | +| ------------- | ----------------------------- | +| `status` | **int** | +| `content` | ***type*, *YourModel*, dict** | +| `description` | **str** | +| `response` | **Response** | + +**Examples** + +.. column:: + + ```python + @openapi.response(200, str, "This is endpoint returns a string") + ``` + + ```python + @openapi.response(200, {"text/plain": str}, "...") + ``` + + ```python + @openapi.response(response=Response(UserProfile, description="...")) + ``` + + ```python + @openapi.response( + response=Response( + { + "application/json": UserProfile, + }, + description="...", + status=201, + ) + ) + ``` + +.. column:: + + ```python + @openapi.response(200, UserProfile, "...") + ``` + + ```python + @openapi.response( + 200, + { + "application/json": UserProfile, + }, + "Description...", + ) + ``` + +### summary + +**Arguments** + +| Field | Type | +| ------ | ------- | +| `text` | **str** | + +**Examples** + +.. column:: + + ```python + @openapi.summary("This is an endpoint") + ``` + +.. column:: + + +### tag + +**Arguments** + +| Field | Type | +| ------- | ------------ | +| `*args` | **str, Tag** | + +**Examples** + +.. column:: + + ```python + @openapi.tag("foo") + ``` + +.. column:: + + ```python + @openapi.tag("foo", Tag("bar")) + ``` + + +### secured + +**Arguments** + +| Field | Type | +| ----------------- | ----------------------- | +| `*args, **kwargs` | **str, Dict[str, Any]** | + +**Examples** + +.. column:: + + ```python + @openapi.secured() + ``` + +.. column:: + + + +.. column:: + + ```python + @openapi.secured("foo") + ``` + +.. column:: + + ```python + @openapi.secured("token1", "token2") + ``` + + +.. column:: + + ```python + @openapi.secured({"my_api_key": []}) + ``` + +.. column:: + + ```python + @openapi.secured(my_api_key=[]) + ``` + +Do not forget to use `add_security_scheme`. See [security](./security.md) for more details. +`` + +## Integration with Pydantic + +Pydantic models have the ability to [generate OpenAPI schema](https://pydantic-docs.helpmanual.io/usage/schema/). + +.. column:: + + To take advantage of Pydantic model schema generation, pass the output in place of the schema. + +.. column:: + + ```python + from sanic import Sanic, json + from sanic_ext import validate, openapi + from pydantic import BaseModel, Field + + @openapi.component + class Item(BaseModel): + name: str + description: str = None + price: float + tax: float = None + + class ItemList(BaseModel): + items: List[Item] + + app = Sanic("test") + + @app.get("/") + @openapi.definition( + body={ + "application/json": ItemList.schema( + ref_template="#/components/schemas/{model}" + ) + }, + ) + async def get(request): + return json({}) + ``` + +.. note:: + + It is important to set that `ref_template`. By default Pydantic will select a template that is not standard OAS. This will cause the schema to not be found when generating the final document. + +*Added in v22.9* diff --git a/guide/content/en/plugins/sanic-ext/openapi/security.md b/guide/content/en/plugins/sanic-ext/openapi/security.md new file mode 100644 index 00000000..bef264c3 --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/openapi/security.md @@ -0,0 +1,96 @@ +# Security Schemes + +To document authentication schemes, there are two steps. + +_Security is only available starting in v21.12.2_ + +## Document the scheme + +.. column:: + + The first thing that you need to do is define one or more security schemes. The basic pattern will be to define it as: + + ```python + add_security_scheme("", "") + ``` + + The `type` should correspond to one of the allowed security schemes: `"apiKey"`, `"http"`, `"oauth2"`, `"openIdConnect"`. You can then pass appropriate keyword arguments as allowed by the specification. + + You should consult the [OpenAPI Specification](https://swagger.io/specification/) for details on what values are appropriate. + +.. column:: + + ```python + app.ext.openapi.add_security_scheme("api_key", "apiKey") + app.ext.openapi.add_security_scheme( + "token", + "http", + scheme="bearer", + bearer_format="JWT", + ) + app.ext.openapi.add_security_scheme("token2", "http") + app.ext.openapi.add_security_scheme( + "oldschool", + "http", + scheme="basic", + ) + app.ext.openapi.add_security_scheme( + "oa2", + "oauth2", + flows={ + "implicit": { + "authorizationUrl": "http://example.com/auth", + "scopes": { + "on:two": "something", + "three:four": "something else", + "threefour": "something else...", + }, + } + }, + ) + ``` + +## Document the endpoints + +.. column:: + + There are two options, document _all_ endpoints. + +.. column:: + + ```python + app.ext.openapi.secured() + app.ext.openapi.secured("token") + ``` + + +.. column:: + + Or, document only specific routes. + +.. column:: + + ```python + @app.route("/one") + async def handler1(request): + """ + openapi: + --- + security: + - foo: [] + """ + + @app.route("/two") + @openapi.secured("foo") + @openapi.secured({"bar": []}) + @openapi.secured(baz=[]) + async def handler2(request): + ... + + @app.route("/three") + @openapi.definition(secured="foo") + @openapi.definition(secured={"bar": []}) + async def handler3(request): + ... + ``` + diff --git a/guide/content/en/plugins/sanic-ext/openapi/ui.md b/guide/content/en/plugins/sanic-ext/openapi/ui.md new file mode 100644 index 00000000..8651d525 --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/openapi/ui.md @@ -0,0 +1,26 @@ +# UI + +Sanic Extensions comes with both Redoc and Swagger interfaces. You have a choice to use one, or both of them. Out of the box, the following endpoints are setup for you, with the bare `/docs` displaying Redoc. + +- `/docs` +- `/docs/openapi.json` +- `/docs/redoc` +- `/docs/swagger` +- `/docs/openapi-config` + +## Config options + +| **Key** | **Type** | **Default** | **Desctiption** | +| -------------------------- | --------------- | ------------------- | ------------------------------------------------------------ | +| `OAS_IGNORE_HEAD` | `bool` | `True` | Whether to display `HEAD` endpoints. | +| `OAS_IGNORE_OPTIONS` | `bool` | `True` | Whether to display `OPTIONS` endpoints. | +| `OAS_PATH_TO_REDOC_HTML` | `Optional[str]` | `None` | Path to HTML to override the default Redoc HTML | +| `OAS_PATH_TO_SWAGGER_HTML` | `Optional[str]` | `None` | Path to HTML to override the default Swagger HTML | +| `OAS_UI_DEFAULT` | `Optional[str]` | `"redoc"` | Can be set to `redoc` or `swagger`. Controls which UI to display on the base route. If set to `None`, then the base route will not be setup. | +| `OAS_UI_REDOC` | `bool` | `True` | Whether to enable Redoc UI. | +| `OAS_UI_SWAGGER` | `bool` | `True` | Whether to enable Swagger UI. | +| `OAS_URI_TO_CONFIG` | `str` | `"/openapi-config"` | URI path to the OpenAPI config used by Swagger | +| `OAS_URI_TO_JSON` | `str` | `"/openapi.json"` | URI path to the JSON document. | +| `OAS_URI_TO_REDOC` | `str` | `"/redoc"` | URI path to Redoc. | +| `OAS_URI_TO_SWAGGER` | `str` | `"/swagger"` | URI path to Swagger. | +| `OAS_URL_PREFIX` | `str` | `"/docs"` | URL prefix to use for the Blueprint for OpenAPI docs. | diff --git a/guide/content/en/plugins/sanic-ext/templating/html5tagger.md b/guide/content/en/plugins/sanic-ext/templating/html5tagger.md new file mode 100644 index 00000000..91f12c93 --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/templating/html5tagger.md @@ -0,0 +1 @@ +# Coming soon diff --git a/guide/content/en/plugins/sanic-ext/templating/jinja.md b/guide/content/en/plugins/sanic-ext/templating/jinja.md new file mode 100644 index 00000000..9d0ccafa --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/templating/jinja.md @@ -0,0 +1,153 @@ +# Templating + +Sanic Extensions can easily help you integrate templates into your route handlers. + +## Dependencies + +**Currently, we only support [Jinja](https://github.com/pallets/jinja/).** + +[Read the Jinja docs first](https://jinja.palletsprojects.com/en/3.1.x/) if you are unfamiliar with how to create templates. + +Sanic Extensions will automatically setup and load Jinja for you if it is installed in your environment. Therefore, the only setup that you need to do is install Jinja: + +``` +pip install Jinja2 +``` + +## Rendering a template from a file + +There are three (3) ways for you: + +1. Using a decorator to pre-load the template file +1. Returning a rendered `HTTPResponse` object +1. Hybrid pattern that creates a `LazyResponse` + +Let's imagine you have a file called `./templates/foo.html`: + +```html + + + + + My Webpage + + + +

Hello, world!!!!

+
    + {% for item in seq %} +
  • {{ item }}
  • + {% endfor %} +
+ + + +``` + +Let's see how you could render it with Sanic + Jinja. + +### Option 1 - as a decorator + +.. column:: + + The benefit of this approach is that the templates can be predefined at startup time. This will mean that less fetching needs to happen in the handler, and should therefore be the fastest option. + +.. column:: + + ```python + @app.get("/") + @app.ext.template("foo.html") + async def handler(request: Request): + return {"seq": ["one", "two"]} + ``` + +### Option 2 - as a return object + +.. column:: + + This is meant to mimic the `text`, `json`, `html`, `file`, etc pattern of core Sanic. It will allow the most customization to the response object since it has direct control of it. Just like in other `HTTPResponse` objects, you can control headers, cookies, etc. + +.. column:: + + ```python + from sanic_ext import render + + @app.get("/alt") + async def handler(request: Request): + return await render( + "foo.html", context={"seq": ["three", "four"]}, status=400 + ) + ``` + +### Option 3 - hybrid/lazy + +.. column:: + + In this approach, the template is defined up front and not inside the handler (for performance). Then, the `render` function returns a `LazyResponse` that can be used to build a proper `HTTPResponse` inside the decorator. + +.. column:: + + ```python + from sanic_ext import render + + @app.get("/") + @app.ext.template("foo.html") + async def handler(request: Request): + return await render(context={"seq": ["five", "six"]}, status=400) + ``` + +## Rendering a template from a string + +.. column:: + + Sometimes you may want to write (or generate) your template inside of Python code and _not_ read it from an HTML file. In this case, you can still use the `render` function we saw above. Just use `template_source`. + +.. column:: + + ```python + from sanic_ext import render + from textwrap import dedent + + @app.get("/") + async def handler(request): + template = dedent(""" + + + + + My Webpage + + + +

Hello, world!!!!

+
    + {% for item in seq %} +
  • {{ item }}
  • + {% endfor %} +
+ + + + """) + return await render( + template_source=template, + context={"seq": ["three", "four"]}, + app=app, + ) + ``` + + + +.. note:: + + In this example, we use `textwrap.dedent` to remove the whitespace in the beginning of each line of the multi-line string. It is not necessary, but just a nice touch to keep both the code and the generated source clean. + + + +## Development and auto-reload + +If auto-reload is turned on, then changes to your template files should trigger a reload of the server. + +## Configuration + +See `templating_enable_async` and `templating_path_to_templates` in [settings](./configuration.md#settings). diff --git a/guide/content/en/plugins/sanic-ext/validation.md b/guide/content/en/plugins/sanic-ext/validation.md new file mode 100644 index 00000000..7081fec5 --- /dev/null +++ b/guide/content/en/plugins/sanic-ext/validation.md @@ -0,0 +1,164 @@ +# Validation + +One of the most commonly implemented features of a web application is user-input validation. For obvious reasons, this is not only a security issue, but also just plain good practice. You want to make sure your data conforms to expectations, and throw a `400` response when it does not. + +## Implementation + +### Validation with Dataclasses + +With the introduction of [Data Classes](https://docs.python.org/3/library/dataclasses.html), Python made it super simple to create objects that meet a defined schema. However, the standard library only supports type checking validation, **not** runtime validation. Sanic Extensions adds the ability to do runtime validations on incoming requests using `dataclasses` out of the box. If you also have either `pydantic` or `attrs` installed, you can alternatively use one of those libraries. + +.. column:: + + First, define a model. + +.. column:: + + ```python + @dataclass + class SearchParams: + q: str + ``` + + +.. column:: + + Then, attach it to your route + +.. column:: + + ```python + from sanic_ext import validate + + @app.route("/search") + @validate(query=SearchParams) + async def handler(request, query: SearchParams): + return json(asdict(query)) + ``` + + +.. column:: + + You should now have validation on the incoming request. + +.. column:: + + ``` + $ curl localhost:8000/search + โš ๏ธ 400 โ€” Bad Request + ==================== + Invalid request body: SearchParams. Error: missing a required argument: 'q' + ``` + ``` + $ curl localhost:8000/search\?q=python + {"q":"python"} + ``` + +### Validation with Pydantic + +You can use Pydantic models also. + +.. column:: + + First, define a model. + +.. column:: + + ```python + class Person(BaseModel): + name: str + age: int + ``` + + +.. column:: + + Then, attach it to your route + +.. column:: + + ```python + from sanic_ext import validate + + @app.post("/person") + @validate(json=Person) + async def handler(request, body: Person): + return json(body.dict()) + ``` + + +.. column:: + + You should now have validation on the incoming request. + +.. column:: + + ``` + $ curl localhost:8000/person -d '{"name": "Alice", "age": 21}' -X POST + {"name":"Alice","age":21} + ``` + +### Validation with Attrs + +You can use Attrs also. + +.. column:: + + First, define a model. + +.. column:: + + ```python + @attrs.define + class Person: + name: str + age: int + + ``` + + +.. column:: + + Then, attach it to your route + +.. column:: + + ```python + from sanic_ext import validate + + @app.post("/person") + @validate(json=Person) + async def handler(request, body: Person): + return json(attrs.asdict(body)) + ``` + + +.. column:: + + You should now have validation on the incoming request. + +.. column:: + + ``` + $ curl localhost:8000/person -d '{"name": "Alice", "age": 21}' -X POST + {"name":"Alice","age":21} + ``` + +## What can be validated? + +The `validate` decorator can be used to validate incoming user data from three places: JSON body data (`request.json`), form body data (`request.form`), and query parameters (`request.args`). + +.. column:: + + As you might expect, you can attach your model using the keyword arguments of the decorator. + +.. column:: + + ```python + @validate( + json=ModelA, + query=ModelB, + form=ModelC, + ) + ``` + diff --git a/guide/content/en/plugins/sanic-testing/README.md b/guide/content/en/plugins/sanic-testing/README.md new file mode 100644 index 00000000..e69de29b diff --git a/guide/content/en/plugins/sanic-testing/clients.md b/guide/content/en/plugins/sanic-testing/clients.md new file mode 100644 index 00000000..00ecd362 --- /dev/null +++ b/guide/content/en/plugins/sanic-testing/clients.md @@ -0,0 +1,124 @@ +# Test Clients + +There are three different test clients available to you, each of them presents different capabilities. + +## Regular sync client: `SanicTestClient` + +The `SanicTestClient` runs an actual version of the Sanic Server on your local network to run its tests. Each time it calls an endpoint it will spin up a version of the application and bind it to a socket on the host OS. Then, it will use `httpx` to make calls directly to that application. + +This is the typical way that Sanic applications are tested. + +.. column:: + + Once installing Sanic Testing, the regular `SanicTestClient` can be used without further setup. This is because Sanic does the leg work for you under the hood. + +.. column:: + + ```python + app.test_client.get("/path/to/endpoint") + ``` + +.. column:: + + However, you may find it desirable to instantiate the client yourself. + +.. column:: + + ```python + from sanic_testing.testing import SanicTestClient + + test_client = SanicTestClient(app) + test_client.get("/path/to/endpoint") + ``` + +.. column:: + + A third option for starting the test client is to use the `TestManager`. This is a convenience object that sets up both the `SanicTestClient` and the `SanicASGITestClient`. + +.. column:: + + ```python + from sanic_testing import TestManager + + mgr = TestManager(app) + app.test_client.get("/path/to/endpoint") + # or + mgr.test_client.get("/path/to/endpoint") + ``` + +You can make a request by using one of the following methods + +- `SanicTestClient.get` +- `SanicTestClient.post` +- `SanicTestClient.put` +- `SanicTestClient.patch` +- `SanicTestClient.delete` +- `SanicTestClient.options` +- `SanicTestClient.head` +- `SanicTestClient.websocket` +- `SanicTestClient.request` + +You can use these methods *almost* identically as you would when using `httpx`. Any argument that you would pass to `httpx` will be accepted, **with one caveat**: If you are using `test_client.request` and want to manually specify the HTTP method, you should use: `http_method`: + +```python +test_client.request("/path/to/endpoint", http_method="get") +``` + +## ASGI async client: `SanicASGITestClient` + +Unlike the `SanicTestClient` that spins up a server on every request, the `SanicASGITestClient` does not. Instead it makes use of the `httpx` library to execute Sanic as an ASGI application to reach inside and execute the route handlers. + +.. column:: + + This test client provides all of the same methods and generally works as the `SanicTestClient`. The only difference is that you will need to add an `await` to each call: + +.. column:: + + ```python + await app.test_client.get("/path/to/endpoint") + ``` + +The `SanicASGITestClient` can be used in the exact same three ways as the `SanicTestClient`. + + +.. note:: + + The `SanicASGITestClient` does not need to only be used with ASGI applications. The same way that the `SanicTestClient` does not need to only test sync endpoints. Both of these clients are capable of testing *any* Sanic application. + + +## Persistent service client: `ReusableClient` + +This client works under a similar premise as the `SanicTestClient` in that it stands up an instance of your application and makes real HTTP requests to it. However, unlike the `SanicTestClient`, when using the `ReusableClient` you control the lifecycle of the application. + +That means that every request **does not** start a new web server. Instead you will start the server and stop it as needed and can make multiple requests to the same running instance. + +.. column:: + + Unlike the other two clients, you **must** instantiate this client for use: + +.. column:: + + ```python + from sanic_testing.reusable import ReusableClient + + client = ReusableClient(app) + ``` + +.. column:: + + Once created, you will use the client inside of a context manager. Once outside of the scope of the manager, the server will shutdown. + +.. column:: + + ```python + from sanic_testing.reusable import ReusableClient + + def test_multiple_endpoints_on_same_server(app): + client = ReusableClient(app) + with client: + _, response = client.get("/path/to/1") + assert response.status == 200 + + _, response = client.get("/path/to/2") + assert response.status == 200 + ``` diff --git a/guide/content/en/plugins/sanic-testing/getting-started.md b/guide/content/en/plugins/sanic-testing/getting-started.md new file mode 100644 index 00000000..b1ceb3cb --- /dev/null +++ b/guide/content/en/plugins/sanic-testing/getting-started.md @@ -0,0 +1,81 @@ +# Getting Started + +Sanic Testing is the *official* testing client for Sanic. Its primary use is to power the tests of the Sanic project itself. However, it is also meant as an easy-to-use client for getting your API tests up and running quickly. + +## Minimum requirements + +- **Python**: 3.7+ +- **Sanic**: 21.3+ + +Versions of Sanic older than 21.3 have this module integrated into Sanic itself as `sanic.testing`. + +## Install + +Sanic Testing can be installed from PyPI: + +``` +pip install sanic-testing +``` + +## Basic Usage + +As long as the `sanic-testing` package is in the environment, there is nothing you need to do to start using it. + +### Writing a sync test + +In order to use the test client, you just need to access the property `test_client` on your application instance: + +```python +import pytest +from sanic import Sanic, response + +@pytest.fixture +def app(): + sanic_app = Sanic("TestSanic") + + @sanic_app.get("/") + def basic(request): + return response.text("foo") + + return sanic_app + +def test_basic_test_client(app): + request, response = app.test_client.get("/") + + assert request.method.lower() == "get" + assert response.body == b"foo" + assert response.status == 200 +``` + +### Writing an async test + +In order to use the async test client in `pytest`, you should install the `pytest-asyncio` plugin. + +``` +pip install pytest-asyncio +``` + +You can then create an async test and use the ASGI client: + +```python +import pytest +from sanic import Sanic, response + +@pytest.fixture +def app(): + sanic_app = Sanic(__name__) + + @sanic_app.get("/") + def basic(request): + return response.text("foo") + + return sanic_app + +@pytest.mark.asyncio +async def test_basic_asgi_client(app): + request, response = await app.asgi_client.get("/") + + assert request.method.lower() == "get" + assert response.body == b"foo" + assert response.status == 200 +``` diff --git a/guide/content/en/release-notes/2021/v21.12.md b/guide/content/en/release-notes/2021/v21.12.md new file mode 100644 index 00000000..766cd659 --- /dev/null +++ b/guide/content/en/release-notes/2021/v21.12.md @@ -0,0 +1,510 @@ +# Version 21.12 (LTS) + +.. toc:: + +## Introduction + +This is the final release of the version 21 [release cycle](../../org/policies.md#release-schedule). Version 21 will now enter long-term support and will be supported for two years until December 2023. + +## What to know + +More details in the [Changelog](https://sanic.readthedocs.io/en/stable/sanic/changelog.html). Notable new or breaking features, and what to upgrade... + +### Strict application and blueprint names + +In [v21.6](./v21.6.md#stricter-application-and-blueprint-names-and-deprecation) application and blueprint names were required to conform to a new set of restrictions. That change is now being enforced at startup time. + +Names **must**: + +1. Only use alphanumeric characters (`a-zA-Z0-9`) +2. May contain a hyphen (`-`) or an underscore (`_`) +3. Must begin with a letter or underscore (`a-zA-Z_`) + +### Strict application and blueprint properties + +The old leniency to allow directly setting properties of a `Sanic` or `Blueprint` object was deprecated and no longer allowed. You must use the `ctx` object. + +```python +app = Sanic("MyApp") +app.ctx.db = Database() +``` + +### Removals + +The following deprecated features no longer exist: + +- `sanic.exceptions.abort` +- `sanic.views.CompositionView` +- `sanic.response.StreamingHTTPResponse` + +### Upgrade your streaming responses (if not already) + +The `sanic.response.stream` response method has been **deprecated** and will be removed in v22.6. If you are sill using an old school streaming response, please upgrade it. + +**OLD - Deprecated** + +```python +async def sample_streaming_fn(response): + await response.write("foo,") + await response.write("bar") + +@app.route("/") +async def test(request: Request): + return stream(sample_streaming_fn, content_type="text/csv") +``` + +**Current** + +```python +async def sample_streaming_fn(response): + await response.write("foo,") + await response.write("bar") + +@app.route("/") +async def test(request: Request): + response = await request.respond(content_type="text/csv") + await response.send("foo,") + await response.send("bar") +``` + +### CLI overhaul and MOTD (Message of the Day) + +The Sanic CLI has received a fairly extensive upgrade. It adds a bunch of new features to make it on par with `app.run()`. It also includes a new MOTD display to provide quick, at-a-glance highlights about your running environment. The MOTD is TTY-aware, and therefore will be less verbose in server logs. It is mainly intended as a convenience during application development. + +``` +$ sanic --help +usage: sanic [-h] [--version] [--factory] [-s] [-H HOST] [-p PORT] [-u UNIX] [--cert CERT] [--key KEY] [--tls DIR] [--tls-strict-host] + [-w WORKERS | --fast] [--access-logs | --no-access-logs] [--debug] [-d] [-r] [-R PATH] [--motd | --no-motd] [-v] + [--noisy-exceptions | --no-noisy-exceptions] + module + + โ–„โ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ โ–„โ–ˆโ–„ โ–ˆโ–ˆ โ–ˆ โ–ˆ โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ + โ–ˆโ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆโ–ˆ โ–ˆ โ–ˆ โ–ˆโ–ˆ + โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–„ โ–€ โ–ˆ โ–ˆ โ–ˆโ–ˆ โ–„ โ–ˆ โ–ˆโ–ˆ + โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆ โ–ˆโ–ˆ โ–ˆ โ–ˆ โ–„โ–„ + โ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€ โ–ˆ โ–ˆ โ–ˆ โ–ˆโ–ˆ โ–ˆ โ–€โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ + + To start running a Sanic application, provide a path to the module, where + app is a Sanic() instance: + + $ sanic path.to.server:app + + Or, a path to a callable that returns a Sanic() instance: + + $ sanic path.to.factory:create_app --factory + + Or, a path to a directory to run as a simple HTTP server: + + $ sanic ./path/to/static --simple + +Required +======== + Positional: + module Path to your Sanic app. Example: path.to.server:app + If running a Simple Server, path to directory to serve. Example: ./ + +Optional +======== + General: + -h, --help show this help message and exit + --version show program's version number and exit + + Application: + --factory Treat app as an application factory, i.e. a () -> callable + -s, --simple Run Sanic as a Simple Server, and serve the contents of a directory + (module arg should be a path) + + Socket binding: + -H HOST, --host HOST Host address [default 127.0.0.1] + -p PORT, --port PORT Port to serve on [default 8000] + -u UNIX, --unix UNIX location of unix socket + + TLS certificate: + --cert CERT Location of fullchain.pem, bundle.crt or equivalent + --key KEY Location of privkey.pem or equivalent .key file + --tls DIR TLS certificate folder with fullchain.pem and privkey.pem + May be specified multiple times to choose multiple certificates + --tls-strict-host Only allow clients that send an SNI matching server certs + + Worker: + -w WORKERS, --workers WORKERS Number of worker processes [default 1] + --fast Set the number of workers to max allowed + --access-logs Display access logs + --no-access-logs No display access logs + + Development: + --debug Run the server in debug mode + -d, --dev Currently is an alias for --debug. But starting in v22.3, + --debug will no longer automatically trigger auto_restart. + However, --dev will continue, effectively making it the + same as debug + auto_reload. + -r, --reload, --auto-reload Watch source directory for file changes and reload on changes + -R PATH, --reload-dir PATH Extra directories to watch and reload on changes + + Output: + --motd Show the startup display + --no-motd No show the startup display + -v, --verbosity Control logging noise, eg. -vv or --verbosity=2 [default 0] + --noisy-exceptions Output stack traces for all exceptions + --no-noisy-exceptions No output stack traces for all exceptions +``` + +### Server running modes and changes coming to `debug` + +There are now two running modes: `DEV` and `PRODUCTION`. By default, Sanic server will run under `PRODUCTION` mode. This is intended for deployments. + +Currently, `DEV` mode will operate very similarly to how `debug=True` does in older Sanic versions. However, in v22.3. `debug=True` will **no longer** enable auto-reload. If you would like to have debugging and auto-reload, you should enable `DEV` mode. + +**DEVELOPMENT** + +``` +$ sanic server:app --dev +``` + +```python +app.run(debug=True, auto_reload=True) +``` + +**PRODUCTION** + +``` +$ sanic server:app +``` + +```python +app.run() +``` + +Beginning in v22.3, `PRODUCTION` mode will no longer enable access logs by default. + +A summary of the changes are as follows: + +| Flag | Mode | Tracebacks | Logging | Access logs | Reload | Max workers | +|---------|-------|------------|---------|-------------|--------|-------------| +| --debug | DEBUG | yes | DEBUG | yes | ^1 | | +| | PROD | no | INFO ^2 | ^3 | | | +| --dev | DEBUG | yes | DEBUG | yes | yes | | +| --fast | | | | | | yes | + +- ^1 `--debug` to deprecate auto-reloading and remove in 22.3 +- ^2 After 22.3 this moves to WARNING +- ^3 After 22.3: no + +### Max allowed workers + +You can easily spin up the maximum number of allowed workers using `--fast`. + +``` +$ sanic server:app --fast +``` + +```python +app.run(fast=True) +``` + +### First-class Sanic Extensions support + +[Sanic Extensions](../../plugins/sanic-ext/getting-started.md) provides a number of additional features specifically intended for API developers. You can now easily implement all of the functionality it has to offer without additional setup as long as the package is in the environment. These features include: + +- Auto create `HEAD`, `OPTIONS`, and `TRACE` endpoints +- CORS protection +- Predefined, endpoint-specific response serializers +- Dependency injection into route handlers +- OpenAPI documentation with Redoc and/or Swagger +- Request query arguments and body input validation + +The preferred method is to install it along with Sanic, but you can also install the packages on their own. + +.. column:: + + ``` + $ pip install sanic[ext] + ``` + +.. column:: + + ``` + $ pip install sanic sanic-ext + ``` + +After that, no additional configuration is required. Sanic Extensions will be attached to your application and provide all of the additional functionality with **no further configuration**. + +If you want to change how it works, or provide additional configuration, you can change Sanic extensions using `app.extend`. The following examples are equivalent. The `Config` object is to provide helpful type annotations for IDE development. + +.. column:: + + ```python + # This is optional, not required + app = Sanic("MyApp") + app.extend(config={"oas_url_prefix": "/apidocs"}) + ``` + +.. column:: + + ```python + # This is optional, not required + app = Sanic("MyApp") + app.config.OAS_URL_PREFIX = "/apidocs" + ``` + +.. column:: + + ```python + # This is optional, not required + from sanic_ext import Config + + app = Sanic("MyApp") + app.extend(config=Config(oas_url_prefix="/apidocs")) + ``` + +.. column:: + + + ### Contextual exceptions + + In [v21.9](./v21.9.md#default-exception-messages) we added default messages to exceptions that simplify the ability to consistently raise exceptions throughout your application. + + ```python + class TeapotError(SanicException): + status_code = 418 + message = "Sorry, I cannot brew coffee" + + raise TeapotError + ``` + + But this lacked two things: + + 1. A dynamic and predictable message format + 2. The ability to add additional context to an error message (more on this in a moment) + + The current release allows any Sanic exception to have additional information to when raised to provide context when writing an error message: + + ```python + class TeapotError(SanicException): + status_code = 418 + + @property + def message(self): + return f"Sorry {self.extra['name']}, I cannot make you coffee" + + raise TeapotError(extra={"name": "Adam"}) + ``` + + The new feature allows the passing of `extra` meta to the exception instance. This `extra` info object **will be suppressed** when in `PRODUCTION` mode, but displayed in `DEVELOPMENT` mode. + +.. column:: + + **PRODUCTION** + + ![image](https://user-images.githubusercontent.com/166269/139014161-cda67cd1-843f-4ad2-9fa1-acb94a59fc4d.png) + +.. column:: + + **DEVELOPMENT** + + ![image](https://user-images.githubusercontent.com/166269/139014121-0596b084-b3c5-4adb-994e-31ba6eba6dad.png) + +Getting back to item 2 from above: _The ability to add additional context to an error message_ + +This is particularly useful when creating microservices or an API that you intend to pass error messages back in JSON format. In this use case, we want to have some context around the exception beyond just a parseable error message to return details to the client. + +```python +raise TeapotError(context={"foo": "bar"}) +``` + +This is information **that we want** to always be passed in the error (when it is available). Here is what it should look like: + +.. column:: + + **PRODUCTION** + + ```json + { + "description": "I'm a teapot", + "status": 418, + "message": "Sorry Adam, I cannot make you coffee", + "context": { + "foo": "bar" + } + } + ``` + +.. column:: + + **DEVELOPMENT** + + ```json + { + "description": "I'm a teapot", + "status": 418, + "message": "Sorry Adam, I cannot make you coffee", + "context": { + "foo": "bar" + }, + "extra": { + "name": "Adam", + "more": "lines", + "complex": { + "one": "two" + } + }, + "path": "/", + "args": {}, + "exceptions": [ + { + "type": "TeapotError", + "exception": "Sorry Adam, I cannot make you coffee", + "frames": [ + { + "file": "handle_request", + "line": 83, + "name": "handle_request", + "src": "" + }, + { + "file": "/tmp/p.py", + "line": 17, + "name": "handler", + "src": "raise TeapotError(" + } + ] + } + ] + } + ``` + +### Background task management + +When using the `app.add_task` method to create a background task, there now is the option to pass an optional `name` keyword argument that allows it to be fetched, or cancelled. + +```python +app.add_task(dummy, name="dummy_task") +task = app.get_task("dummy_task") + +app.cancel_task("dummy_task") +``` + +### Route context kwargs in definitions + +When a route is defined, you can add any number of keyword arguments with a `ctx_` prefix. These values will be injected into the route `ctx` object. + +```python +@app.get("/1", ctx_label="something") +async def handler1(request): + ... + +@app.get("/2", ctx_label="something") +async def handler2(request): + ... + +@app.get("/99") +async def handler99(request): + ... + +@app.on_request +async def do_something(request): + if request.route.ctx.label == "something": + ... +``` + +### Blueprints can be registered at any time + +In previous versions of Sanic, there was a strict ordering of when a Blueprint could be attached to an application. If you ran `app.blueprint(bp)` *before* attaching all objects to the Blueprint instance, they would be missed. + +Now, you can attach a Blueprint at anytime and everything attached to it will be included at startup. + +### Noisy exceptions (force all exceptions to logs) + +There is a new `NOISY_EXCEPTIONS` config value. When it is `False` (which is the default), Sanic will respect the `quiet` property of any `SanicException`. This means that an exception with `quiet=True` will not be displayed to the log output. + +However, when setting `NOISY_EXCEPTIONS=True`, all exceptions will be logged regardless of the `quiet` value. + +This can be helpful when debugging. + +```python +app.config.NOISY_EXCEPTIONS = True +``` + +### Signal events as `Enum` + +There is an `Enum` with all of the built-in signal values for convenience. + +```python +from sanic.signals import Event + +@app.signal(Event.HTTP_LIFECYCLE_BEGIN) +async def connection_opened(conn_info): + ... +``` + +### Custom type casting of environment variables + +By default, Sanic will convert an `int`, `float`, or a `bool` value when applying environment variables to the `config` instance. You can extend this with your own converter: + +```python +app = Sanic(..., config=Config(converters=[UUID])) +``` + +### Disable `uvloop` by configuration value + +The usage of `uvloop` can be controlled by configuration value: + +```python +app.config.USE_UVLOOP = False +``` + +### Run Sanic server with multiple TLS certificates + +Sanic can be run with multiple TLS certificates: + +```python +app.run( + ssl=[ + "/etc/letsencrypt/live/example.com/", + "/etc/letsencrypt/live/mysite.example/", + ] +) +``` + +## News + +### Coming Soon: Python Web Development with Sanic + +A book about Sanic is coming soon by one of the core developers, [@ahopkins](https://github.com/ahopkins). + +Learn more at [sanicbook.com](https://sanicbook.com). + +> Get equipped with the practical knowledge of working with Sanic to increase the performance and scalability of your web applications. While doing that, we will level-up your development skills as you learn to customize your application to meet the changing business needs without having to significantly over-engineer the app. + +A portion of book proceeds goes into the Sanic Community Organization to help fund the development and operation of Sanic. So, buying the book is another way you can support Sanic. + +### Dark mode for the docs + +If you have not already noticed, this Sanic website is now available in a native dark mode. You can toggle the theme at the top right of the page. + +## Thank you + +Thank you to everyone that participated in this release: :clap: + +[@adarsharegmi](https://github.com/adarsharegmi) +[@ahopkins](https://github.com/ahopkins) +[@ashleysommer](https://github.com/ashleysommer) +[@ChihweiLHBird](https://github.com/ChihweiLHBird) +[@cnicodeme](https://github.com/cnicodeme) +[@kianmeng](https://github.com/kianmeng) +[@meysam81](https://github.com/meysam81) +[@nuxion](https://github.com/nuxion) +[@prryplatypus](https://github.com/prryplatypus) +[@realDragonium](https://github.com/realDragonium) +[@SaidBySolo](https://github.com/SaidBySolo) +[@sjsadowski](https://github.com/sjsadowski) +[@Tronic](https://github.com/tronic) +[@Varriount](https://github.com/Varriount) +[@vltr](https://github.com/vltr) +[@whos4n3](https://github.com/whos4n3) + +And, a special thank you to [@miss85246](https://github.com/miss85246) and [@ZinkLu](https://github.com/ZinkLu) for their tremendous work keeping the documentation synced and translated into Chinese. + +--- + +If you enjoy the project, please consider contributing. Of course we love code contributions, but we also love contributions in any form. Consider writing some documentation, showing off use cases, joining conversations and making your voice known, and if you are able: [financial contributions](https://opencollective.com/sanic-org/). diff --git a/guide/content/en/release-notes/2021/v21.3.md b/guide/content/en/release-notes/2021/v21.3.md new file mode 100644 index 00000000..ee21b6c8 --- /dev/null +++ b/guide/content/en/release-notes/2021/v21.3.md @@ -0,0 +1,268 @@ +# Version 21.3 + +.. toc:: + +## Introduction + +Sanic is now faster. + +Well, it already was fast. But with the first iteration of the v21 release, we incorporated a few major milestones that have made some tangible improvements. These encompass some ideas that have been in the works for years, and have finally made it into the released version. + + +.. warning:: Breaking changes + + Version 21.3 introduces a lot of new features. But, it also includes some breaking changes. This is why these changes were introduced after the last LTS. If you rely upon something that has been removed, you should continue to use v20.12LTS until you are able to upgrade. + + ```bash + pip install "sanic>=20.12,<20.13" + pip freeze > requirements.txt + ``` + + For most typical installations, you should be able to upgrade without a problem. + + +## What to know + +Notable new or breaking features, and what to upgrade... + +### Python 3.7+ Only + +This version drops Python 3.6 support. Version 20.12LTS will continue to support Python 3.6 until its EOL in December, 2022, and version 19.12LTS will support it until its EOL in December, 2021. + +Read more about our [LTS policy](../project/policies.md#long-term-support-v-interim-releases). + +### Streaming as first class citizen + +The biggest speed improvement came from unifying the request/response cycle into a single flow. Previously, there was a difference between regular cycles, and streaming cycles. This has been simplified under the hood, even though the API is staying the same right now for compatibility. The net benefit is that **all** requests now should see a new benefit. + +Read more about [streaming changes](../advanced/streaming.md#response-streaming). + +### Router overhaul + +The old Sanic router was based upon regular expressions. In addition it suffered from a number of quirks that made it hard to modify at run time, and resulted in some performance issues. This change has been years in the making and now [converts the router to a compiled tree at startup](https://community.sanicframework.org/t/a-fast-new-router/649/41). Look for additional improvements throughout the year. + +The outward facing API has kept backwards compatibility. However, if you were accessing anything inside the router specifically, you many notice some changes. For example: + +1. `Router.get()` has a new return value +2. `Route` is now a proper class object and not a `namedtuple` +3. If building the router manually, you will need to call `Router.finalize()` before it is usable +4. There is a new `` pattern that can be matched in your routes +5. You cannot startup an application without at least one route defined + +The router is now located in its own repository: [sanic-org/sanic-router](https://github.com/sanic-org/sanic-router) and is also its own [standalone package on PyPI](https://pypi.org/project/sanic-routing/). + +### Signals API โญ๏ธ + +_BETA Feature: API to be finalized in v21.6_ + +A side benefit of the new router is that it can do double duty also powering the [new signals API](https://github.com/sanic-org/sanic/issues/1630). This feature is being released for public usage now, and likely the public API will not change in its final form. + +The core ideas of this feature are: + +1. to allow the developer greater control and access to plugging into the server and request lifecycles, +2. to provide new tools to synchronize and send messages through your application, and +3. to ultimately further increase performance. + +The API introduces three new methods: + +- `@app.signal(...)` - For defining a signal handler. It looks and operates very much like a route. Whenever that signal is dispatched, this handler will be executed. +- `app.event(...)` - An awaitable that can be used anywhere in your application to pause execution until the event is triggered. +- `app.dispatch(...)` - Trigger an event and cause the signal handlers to execute. + +```python +@app.signal("foo.bar.") +async def signal_handler(thing, **kwargs): + print(f"[signal_handler] {thing=}", kwargs) + +async def wait_for_event(app): + while True: + print("> waiting") + await app.event("foo.bar.*") + print("> event found\n") + +@app.after_server_start +async def after_server_start(app, loop): + app.add_task(wait_for_event(app)) + +@app.get("/") +async def trigger(request): + await app.dispatch("foo.bar.baz") + return response.text("Done.") +``` + +### Route naming + +Routes used to be referenced by both `route.name` and `route.endpoint`. While similar, they were slightly different. Now, all routes will be **consistently** namespaced and referenced. + +```text +.[optional:.] +``` + +This new "name" is assigned to the property `route.name`. We are deprecating `route.endpoint`, and will remove that property in v21.9. Until then, it will be an alias for `route.name`. + +In addition, naming prefixes that had been in use for things like static, websocket, and blueprint routes have been removed. + +### New decorators + +Several new convenience decorators to help IDEs with autocomplete. + +```python +# Alias to @app.listener("...") +@app.before_server_start +@app.after_server_stop +@app.before_server_start +@app.after_server_stop + +# Alias to @app.middleware("...") +@app.on_request +@app.on_response +``` + +### Unquote in route + +If you have a route that uses non-ascii characters, Sanic will no longer `unquote` the text for you. You will need to specifically tell the route definition that it should do so. + +```python +@app.route("/overload/", methods=["GET"], unquote=True) +async def handler2(request, param): + return text("OK2 " + param) + +request, response = app.test_client.get("/overload/ๆ‚จๅฅฝ") +assert response.text == "OK2 ๆ‚จๅฅฝ" +``` + +If you forget to do so, your text will remain encoded. + +### Alter `Request.match_info` + +The `match_info` has always provided the data for the matched path parameters. You now have access to modify that, for example in middleware. + +```python +@app.on_request +def convert_to_snake_case(request): + request.match_info = to_snake(request.match_info) +``` + +### Version types in routes + +The `version` argument in routes can now be: + +- `str` +- `int` +- `float` + +```python +@app.route("/foo", version="2.1.1") +@app.route("/foo", version=2) +@app.route("/foo", version=2.1) +``` +### Safe method handling with body + +Route handlers for `GET`, `HEAD`, `OPTIONS` and `DELETE` will not decode any HTTP body passed to it. You can override this: + +```python +@app.delete(..., ignore_body=False) +``` + +### Application, Blueprint and Blueprint Group parity + +The `Sanic` and `Blueprint` classes share a common base. Previously they duplicated a lot of functionality, that lead to slightly different implementations between them. Now that they both inherit the same base class, developers and plugins should have a more consistent API to work with. + +Also, Blueprint Groups now also support common URL extensions like the `version` and `strict_slashes` keyword arguments. + +### Dropped `httpx` from dependencies + +There is no longer a dependency on `httpx`. + +### Removed `testing` library + +Sanic internal testing client has been removed. It is now located in its own repository: [sanic-org/sanic-testing](https://github.com/sanic-org/sanic-testing) and is also its own [standalone package on PyPI](https://pypi.org/project/sanic-testing/). + +If you have `sanic-testing` installed, it will be available and usable on your `Sanic()` application instances as before. So, the **only** change you will need to make is to add `sanic-testing` to your test suite requirements. + +### Application and connection level context (`ctx`) objects + +Version 19.9 [added ](https://github.com/sanic-org/sanic/pull/1666/files) the `request.ctx` API. This helpful construct easily allows for attaching properties and data to a request object (for example, in middleware), and reusing the information elsewhere int he application. + +Similarly, this concept is being extended in two places: + +1. the application instance, and +2. a transport connection. + +#### Application context + +A common use case is to attach properties to the app instance. For the sake of consistency, and to avoid the issue of name collision with Sanic properties, the `ctx` object now exists on `Sanic` instances. + +```python +@app.before_server_startup +async def startup_db(app, _): + # WRONG + app.db = await connect_to_db() + + # CORRECT + app.ctx.db = await connect_to_db() +``` + +#### Connection context + +When a client sends a keep alive header, Sanic will attempt to keep the transport socket [open for a period of time](../deployment/configuration.md#keep-alive-timeout). That transport object now has a `ctx` object available on it. This effectively means that multiple requests from a single client (where the transport layer is being reused) may share state. + +```python +@app.on_request +async def increment_foo(request): + if not hasattr(request.conn_info.ctx, "foo"): + request.conn_info.ctx.foo = 0 + request.conn_info.ctx.foo += 1 + +@app.get("/") +async def count_foo(request): + return text(f"request.conn_info.ctx.foo={request.conn_info.ctx.foo}") +``` + +```bash +$ curl localhost:8000 localhost:8000 localhost:8000 +request.conn_info.ctx.foo=1 +request.conn_info.ctx.foo=2 +request.conn_info.ctx.foo=3 +``` + + +.. warning:: + + Connection level context is an experimental feature, and should be finalized in v21.6. + + + +## News + +### A NEW frontpage ๐ŸŽ‰ + +We have split the documentation into two. The docstrings inside the codebase will still continue to build sphinx docs to ReadTheDocs. However, it will be limited to API documentation. The new frontpage will house the "Sanic User Guide". + +The new site runs on Vuepress. Contributions are welcome. We also invite help in translating the documents. + +As a part of this, we also freshened up the RTD documentation and changed it to API docs only. + +### Chat has moved to Discord + +The Gitter chatroom has taken one step closer to being phased out. In its place we opened a [Discord server](https://discord.gg/FARQzAEMAA). + +### Open Collective + +The Sanic Community Organization has [opened a page on Open Collective](https://opencollective.com/sanic-org) to enable anyone that would like to financially support the development of Sanic. + +### 2021 Release Managers + +Thank you to @sjsadowski and @yunstanford for acting as release managers for both 2019 and 2020. This year's release managers are @ahopkins and @vltr. + +## Thank you + +Thank you to everyone that participated in this release: :clap: + +[@ahopkins](https://github.com/ahopkins) [@akshgpt7](https://github.com/akshgpt7) [@artcg](https://github.com/artcg) [@ashleysommer](https://github.com/ashleysommer) [@elis-k](https://github.com/elis-k) [@harshanarayana](https://github.com/harshanarayana) [@sjsadowski](https://github.com/sjsadowski) [@tronic](https://github.com/tronic) [@vltr](https://github.com/vltr), + +To [@ConnorZhang](https://github.com/miss85246) and [@ZinkLu](https://github.com/ZinkLu) for translating our documents into Chinese, + +--- + +Make sure to checkout the changelog to get links to all the PRs, etc. diff --git a/guide/content/en/release-notes/2021/v21.6.md b/guide/content/en/release-notes/2021/v21.6.md new file mode 100644 index 00000000..34c8167d --- /dev/null +++ b/guide/content/en/release-notes/2021/v21.6.md @@ -0,0 +1,346 @@ +# Version 21.6 + +.. toc:: + +## Introduction + +This is the second release of the version 21 [release cycle](../project/policies.md#release-schedule). There will be one more release in September before version 21 is "finalized" in the December long-term support version. One thing users may have noticed starting in 21.3, the router was moved to its own package: [`sanic-routing`](https://pypi.org/project/sanic-routing). This change is likely to stay for now. Starting with this release, the minimum required version is 0.7.0. + +## What to know + +More details in the [Changelog](https://sanic.readthedocs.io/en/stable/sanic/changelog.html). Notable new or breaking features, and what to upgrade... + +### Deprecation of `StreamingHTTPResponse` + +The use of `StreamingHTTPResponse` has been deprecated and will be removed in the 21.12 release. This impacts both `sanic.response.stream` and `sanic.response.file_stream`, which both under the hood instantiate `StreamingHTTPResponse`. + +Although the exact migration path has yet to be determined, `sanic.response.stream` and `sanic.response.file_stream` will continue to exist in v21.12 in some form as convenience operators. Look for more details throughout this Summer as we hope to have this finalized by the September release. + +### Deprecation of `CompositionView` + +Usage of `CompositionView` has been deprecated and will be removed in 21.12. + +### Deprecation of path parameter types: `string` and `number` + +Going forward, you should use `str` and `float` for path param types instead of `string` and `number`. + +```python +@app.get("//") +async def handler(request, foo: str, bar: float): + ... +``` + +Existing `string` and `number` types are aliased and will continue to work, but will be removed in v21.12. + +### Version 0.7 router upgrades + +This includes a number of bug fixes and more gracefully handles a wider array of edge cases than v0.6. If you experience any patterns that are not supported, [please report them](https://github.com/sanic-org/sanic-routing/issues). You can see some of the issues resolved on the `sanic-routing` [release notes](https://github.com/sanic-org/sanic-routing/releases). + +### Inline streaming with `eof()` + +Version 21.3 included [big changes in how streaming is handled](https://sanic.dev/en/guide/release-notes/v21.3.html#what-to-know). The pattern introduced will become the default (see below). As a convenience, a new `response.eof()` method has been included. It should be called once the final data has been pushed to the client: + +```python +@app.route("/") +async def test(request): + response = await request.respond(content_type="text/csv") + await response.send("foo,") + await response.send("bar") + await response.eof() + return response +``` + +### New path parameter type: `slug` + +You can now specify a dynamic path segment as a `slug` with appropriate matching: + +```python +@app.get("/articles/") +async def article(request, article_slug: str): + ... +``` + +Slugs must consist of lowercase letters or digits. They may contain a hyphen (`-`), but it cannot be the first character. + +``` +this-is-a-slug +with-123-is-also-a-slug +111-at-start-is-a-slug +NOT-a-slug +-NOT-a-slug +``` + +### Stricter application and blueprint names, and deprecation + +Your application and `Blueprint` instances must conform to a stricter set of requirements: + +1. Only consisting of alphanumeric characters +2. May contain a hyphen (`-`) or an underscore (`_`) +3. Must begin with a letter (uppercase or lowercase) + +The naming convention is similar to Python variable naming conventions, with the addition of allowing hyphens (`-`). + +The looser standard has been deprecatated. Beginning in 21.12, non-conformance will be a startup time error. + +### A new access on `Route` object: `route.uri` + +The `Route` object in v21.3 no longer had a `uri` attribute. Instead, the closes you could get was `route.path`. However, because of how `sanic-routing` works, the `path` property does *not* have a leading `/`. This has been corrected so that now there is a `route.uri` with a leading slash: + +```python +route.uri == f"/{route.path}" +``` + +### A new accessor on `Request` object impacting IPs + +To access the IP address of the incoming request, Sanic has had a convenience accessor on the request object: `request.ip`. That is not new, and comes from an underlying object that provides details about the open HTTP connection: `request.conn_info`. + +The current version adds a new `client_ip` accessor to that `conn_info` object. For IPv4, you will not notice a difference. However, for IPv6 applications, the new accessor will provide an "unwrapped" version of the address. Consider the following example: + +```python +@app.get("/") +async def handler(request): + return json( + { + "request.ip": request.ip, + "request.conn_info.client": request.conn_info.client, + "request.conn_info.client_ip": request.conn_info.client_ip, + } + ) + +app.run(sock=my_ipv6_sock) +``` + +```bash +$ curl http://\[::1\]:8000 +{ + "request.ip": "::1", + "request.conn_info.client": "[::1]", + "request.conn_info.client_ip": "::1" +} + +``` + +### Alternate `Config` and `Sanic.ctx` objects + +You can now pass your own config and context objects to your Sanic applications. A custom configuration *should* be a subclass of `sanic.config.Config`. The context object can be anything you want, with no restrictions whatsoever. + +```python +class CustomConfig(Config): + ... + +config = CustomConfig() +app = Sanic("custom", config=config) +assert isinstance(app.config, CustomConfig) +``` + +And... + +```python +class CustomContext: + ... + +ctx = CustomContext() +app = Sanic("custom", ctx=ctx) +assert isinstance(app.ctx, CustomContext) +``` + +### Sanic CLI improvements + +1. New flag for existing feature: `--auto-reload` +2. Some new shorthand flags for existing arguments +3. New feature: `--factory` +4. New feature: `--simple` +5. New feature: `--reload-dir` + +#### Factory applications + +For applications that follow the factory pattern (a function that returns a `sanic.Sanic` instance), you can now launch your application from the Sanic CLI using the `--factory` flag. + +```python +from sanic import Blueprint, Sanic, text + +bp = Blueprint(__file__) + +@bp.get("/") +async def handler(request): + return text("๐Ÿ˜Ž") + +def create_app() -> Sanic: + app = Sanic(__file__) + app.blueprint(bp) + return app +``` + +You can now run it: + +```bash +$ sanic path.to:create_app --factory +``` + +#### Sanic Simple Server + +Sanic CLI now includes a simple pattern to serve a directory as a web server. It will look for an `index.html` at the directory root. + +```bash +$ sanic ./path/to/dir --simple +``` + + +.. warning:: + + This feature is still in early *beta* mode. It is likely to change in scope. + + +#### Additional reload directories + +When using either `debug` or `auto-reload`, you can include additional directories for Sanic to watch for new files. + +```bash +sanic ... --reload-dir=/path/to/foo --reload-dir=/path/to/bar +``` + + +.. tip:: + + You do *NOT* need to include this on your application directory. Sanic will automatically reload when any Python file in your application changes. You should use the `reload-dir` argument when you want to listen and update your application when static files are updated. + + + +### Version prefix + +When adding `version`, your route is prefixed with `/v`. This will always be at the beginning of the path. This is not new. + +```python +# /v1/my/path +app.route("/my/path", version=1) +``` + +Now, you can alter the prefix (and therefore add path segments *before* the version). + +```python +# /api/v1/my/path +app.route("/my/path", version=1, version_prefix="/api/v") +``` + +The `version_prefix` argument is can be defined in: + +- `app.route` and `bp.route` decorators (and all the convenience decorators also) +- `Blueprint` instantiation +- `Blueprint.group` constructor +- `BlueprintGroup` instantiation +- `app.blueprint` registration + +### Signal event auto-registration + +Setting `config.EVENT_AUTOREGISTER` to `True` will allow you to await any signal event even if it has not previously been defined with a signal handler. + +```python +@app.signal("do.something.start") +async def signal_handler(): + await do_something() + await app.dispatch("do.something.complete") + +# somethere else in your app: +await app.event("do.something.complete") +``` + +### Infinitely reusable and nestable `Blueprint` and `BlueprintGroup` + +A single `Blueprint` may not be assigned and reused to multiple groups. The groups themselves can also by infinitely nested into one or more other groups. This allows for an unlimited range of composition. + +### HTTP methods as `Enum` + +Sanic now has `sanic.HTTPMethod`, which is an `Enum`. It can be used interchangeably with strings: + +```python +from sanic import Sanic, HTTPMethod + +@app.route("/", methods=["post", "PUT", HTTPMethod.PATCH]) +async def handler(...): + ... +``` + +### Expansion of `HTTPMethodView` + +Class based views may be attached now in one of three ways: + +**Option 1 - Existing** +```python +class DummyView(HTTPMethodView): + ... + +app.add_route(DummyView.as_view(), "/dummy") +``` + +**Option 2 - From `attach` method** +```python +class DummyView(HTTPMethodView): + ... + +DummyView.attach(app, "/") +``` + +**Option 3 - From class definition at `__init_subclass__`** +```python +class DummyView(HTTPMethodView, attach=app, uri="/"): + ... +``` + +Options 2 and 3 are useful if your CBV is located in another file: + +```python +from sanic import Sanic, HTTPMethodView + +class DummyView(HTTPMethodView, attach=Sanic.get_app(), uri="/"): + ... +``` + +## News + +### Discord and support forums + +If you have not already joined our community, you can become a part by joining the [Discord server](https://discord.gg/FARQzAEMAA) and the [Community Forums](https://community.sanicframework.org/). Also, follow [@sanicframework](https://twitter.com/sanicframework) on Twitter. + +### SCO 2022 elections + +The Summer ๐Ÿ/Winter โ„๏ธ (choose your Hemisphere) is upon us. That means we will be holding elections for the SCO. This year, we will have the following positions to fill: + +- Steering Council Member (2 year term) +- Steering Council Member (2 year term) +- Steering Council Member (1 year term) +- Release Manager v22 +- Release Manager v22 + +[@vltr](https://github.com/vltr) will be staying on to complete his second year on the Steering Council. + +If you are interested in learning more, you can read about the SCO [roles and responsibilities](../project/scope.md#roles-and-responsibilities), or Adam Hopkins on Discord. + +Nominations will begin September 1. More details will be available on the Forums as we get closer. + +### New project underway + +We have added a new project to the SCO umbrella: [`sanic-ext`](https://github.com/sanic-org/sanic-ext). It is not yet released, and in heavy active development. The goal for the project will ultimately be to replace [`sanic-openapi`](https://github.com/sanic-org/sanic-openapi) with something that provides more features for web application developers, including input validation, CORS handling, and HTTP auto-method handlers. If you are interested in helping out, let us know on Discord. Look for an initial release of this project sometime (hopefully) before the September release. + +## Thank you + +Thank you to everyone that participated in this release: :clap: + +[@aaugustin](https://github.com/aaugustin) +[@ahopkins](https://github.com/ahopkins) +[@ajaygupta2790](https://github.com/ajaygupta2790) +[@ashleysommer](https://github.com/ashleysommer) +[@ENT8R](https://github.com/ent8r) +[@fredlllll](https://github.com/fredlllll) +[@graingert](https://github.com/graingert) +[@harshanarayana](https://github.com/harshanarayana) +[@jdraymon](https://github.com/jdraymon) +[@Kyle-Verhoog](https://github.com/kyle-verhoog) +[@sanjeevanahilan](https://github.com/sanjeevanahilan) +[@sjsadowski](https://github.com/sjsadowski) +[@Tronic](https://github.com/tronic) +[@vltr](https://github.com/vltr) +[@ZinkLu](https://github.com/zinklu) + +--- + +If you enjoy the project, please consider contributing. Of course we love code contributions, but we also love contributions in any form. Consider writing some documentation, showing off use cases, joining conversations and making your voice known, and if you are able, [financial contributions](https://opencollective.com/sanic-org/). diff --git a/guide/content/en/release-notes/2021/v21.9.md b/guide/content/en/release-notes/2021/v21.9.md new file mode 100644 index 00000000..e3daada0 --- /dev/null +++ b/guide/content/en/release-notes/2021/v21.9.md @@ -0,0 +1,234 @@ +# Version 21.9 + +.. toc:: + +## Introduction + +This is the third release of the version 21 [release cycle](../../org/policies.md#release-schedule). Version 21 will be "finalized" in the December long-term support version release. + +## What to know + +More details in the [Changelog](https://sanic.readthedocs.io/en/stable/sanic/changelog.html). Notable new or breaking features, and what to upgrade... + +### Removal of config values: `WEBSOCKET_READ_LIMIT`, `WEBSOCKET_WRITE_LIMIT` and `WEBSOCKET_MAX_QUEUE` + +With the complete overhaul of the websocket implementation, these configuration values were removed. There currently is not a plan to replace them. + +### Deprecation of default value of `FALLBACK_ERROR_FORMAT` + +When no error handler is attached, Sanic has used `html` as the fallback format-type. This has been deprecated and will change to `text` starting in v22.3. While the value of this has changed to `auto`, it will still continue to use HTML as the last resort thru v21.12LTS before changing. + +### `ErrorHandler.lookup` signature deprecation + +The `ErrorHandler.lookup` now **requires** two positional arguments: + +```python +def lookup(self, exception, route_name: Optional[str]): +``` + +A non-conforming method will cause Blueprint-specific exception handlers to not properly attach. + +### Reminder of upcoming removals + +As a reminder, the following items have already been deprecated, and will be removed in version 21.12LTS + +- `CompositionView` +- `load_env` (use `env_prefix` instead) +- Sanic objects (application instances, blueprints, and routes) must by alphanumeric conforming to: `^[a-zA-Z][a-zA-Z0-9_\-]*$` +- Arbitrary assignment of objects to application and blueprint instances (use `ctx` instead; removal of this has been bumped from 21.9 to 21.12) + +### Overhaul of websockets + +There has been a huge overhaul to the handling of websocket connections. Thanks to [@aaugustin](https://github.com/aaugustin) the [`websockets`](https://websockets.readthedocs.io/en/stable/index.html) now has a new implementation that allows Sanic to handle the I/O of websocket connections on its own. Therefore, Sanic has bumped the minimum version to `websockets>=10.0`. + +The change should mostly be unnoticeable to developers, except that some of the oddities around websocket handlers in Sanic have been corrected. For example, you now should be able to catch the `CancellError` yourself when someone disconnects: + +```python +@app.websocket("/") +async def handler(request, ws): + try: + while True: + await asyncio.sleep(0.25) + except asyncio.CancelledError: + print("User closed connection") +``` + +### Built-in signals + +Version [21.3](./v21.3.md) introduced [signals](../advanced/signals.md). Now, Sanic dispatches signal events **from within the codebase** itself. This means that developers now have the ability to hook into the request/response cycle at a much closer level than before. + +Previously, if you wanted to inject some logic you were limited to middleware. Think of integrated signals as _super_-middleware. The events that are dispatched now include: + +- `http.lifecycle.begin` +- `http.lifecycle.complete` +- `http.lifecycle.exception` +- `http.lifecycle.handle` +- `http.lifecycle.read_body` +- `http.lifecycle.read_head` +- `http.lifecycle.request` +- `http.lifecycle.response` +- `http.lifecycle.send` +- `http.middleware.after` +- `http.middleware.before` +- `http.routing.after` +- `http.routing.before` +- `server.init.after` +- `server.init.before` +- `server.shutdown.after` +- `server.shutdown.before` + + +.. note:: + + The `server` signals are the same as the four (4) main server listener events. In fact, those listeners themselves are now just convenience wrappers to signal implementations. + + +### Smarter `auto` exception formatting + +Sanic will now try to respond with an appropriate exception format based upon the endpoint and the client. For example, if your endpoint always returns a `sanic.response.json` object, then any exceptions will automatically be formatted in JSON. The same is true for `text` and `html` responses. + +Furthermore, you now can _explicitly_ control which formatter to use on a route-by-route basis using the route definition: + +```python +@app.route("/", error_format="json") +async def handler(request): + pass +``` + +### Blueprint copying + +Blueprints can be copied to new instances. This will carry forward everything attached to it, like routes, middleware, etc. + +```python +v1 = Blueprint("Version1", version=1) + +@v1.route("/something") +def something(request): + pass + +v2 = v1.copy("Version2", version=2) + +app.blueprint(v1) +app.blueprint(v2) +``` + +``` +/v1/something +/v2/something +``` +### Blueprint group convenience methods + +Blueprint groups should now have all of the same methods available to them as regular Blueprints. With this, along with Blueprint copying, Blueprints should now be very composable and flexible. + +### Accept header parsing + +Sanic `Request` objects can parse an `Accept` header to provide an ordered list of the client's content-type preference. You can simply access it as an accessor: + +```python +print(request.accept) +# ["*/*"] +``` + +It also is capable of handling wildcard matching. For example, assuming the incoming request included: + +``` +Accept: */* +``` + +Then, the following is `True`: + +```python +"text/plain" in request.accept +``` + +### Default exception messages + +Any exception that derives from `SanicException` can now define a default exception message. This makes it more convenient and maintainable to reuse the same exception in multiple places without running into DRY issues with the message that the exception provides. + +```python +class TeaError(SanicException): + message = "Tempest in a teapot" + +raise TeaError +``` + +### Type annotation conveniences + +It is now possible to control the path parameter types using Python's type annotations. Instead of doing this: + +```python +@app.route("///") +def handler(request: Request, one: int, two: float, three: UUID): + ... +``` + +You can now simply do this: + +```python +@app.route("///") +def handler(request: Request, one: int, two: float, three: UUID): + ... +``` + +Both of these examples will result in the same routing principles to be applied. + +### Explicit static resource type + +You can now explicitly tell a `static` endpoint whether it is supposed to treat the resource as a file or a directory: + +```python +static("/", "/path/to/some/file", resource_type="file")) +``` + +## News + +### Release of `sanic-ext` and deprecation of `sanic-openapi` + +One of the core principles of Sanic is that it is meant to be a tool, not a dictator. As the frontpage of this website states: + +> Build the way you want to build without letting your tooling constrain you. + +This means that a lot of common features used (specifically by Web API developers) do not exist in the `sanic` repository. This is for good reason. Being unopinionated provides the developer freedom and flexibility. + +But, sometimes you do not want to have to build and rebuild the same things. Sanic has until now really relied upon the awesome support of the community to fill in the gaps with plugins. + +From the early days, there has been an official `sanic-openapi` package that offered the ability to create OpenAPI documentation based upon your application. But, that project has been plagued over the years and has not been given as much priority as the main project. + +Starting with the release of v21.9, the SCO is deprecating the `sanic-openapi` package and moving it to maintenance mode. This means that it will continue to get updates as needed to maintain it for the current future, but it will not receive any new feature enhancements. + +A new project called `sanic-ext` is taking its place. This package provides not only the ability to build OAS3 documentation, but fills in many of the gaps that API developers may want in their applications. For example, out of the box it will setup CORS, and auto enable `HEAD` and `OPTIONS` responses where needed. It also has the ability validate incoming data using either standard library Dataclasses or Pydantic models. + +The list of goodies includes: +- CORS protection +- incoming request validation +- auto OAS3 documentation using Redoc and/or Swagger UI +- auto `HEAD`, `OPTIONS`, and `TRACE` responses +- dependency injection +- response serialization + +This project is still in `alpha` mode for now and is subject to change. While it is considered to be production capable, there may be some need to change the API as we continue to add features. + +Checkout the [documentation](../../plugins/sanic-ext/getting-started.md) for more details. + +## Thank you + +Thank you to everyone that participated in this release: :clap: + +[@aaugustin](https://github.com/aaugustin) +[@ahopkins](https://github.com/ahopkins) +[@ashleysommer](https://github.com/ashleysommer) +[@cansarigol3megawatt](https://github.com/cansarigol3megawatt) +[@ChihweiLHBird](https://github.com/ChihweiLHBird) +[@gluhar2006](https://github.com/gluhar2006) +[@komar007](https://github.com/komar007) +[@ombe1229](https://github.com/ombe1229) +[@prryplatypus](https://github.com/prryplatypus) +[@SaidBySolo](https://github.com/SaidBySolo) +[@Tronic](https://github.com/tronic) +[@vltr](https://github.com/vltr) + +And, a special thank you to [@miss85246](https://github.com/miss85246) and [@ZinkLu](https://github.com/ZinkLu) for their tremendous work keeping the documentation synced and translated into Chinese. + +--- + +If you enjoy the project, please consider contributing. Of course we love code contributions, but we also love contributions in any form. Consider writing some documentation, showing off use cases, joining conversations and making your voice known, and if you are able, [financial contributions](https://opencollective.com/sanic-org/). diff --git a/guide/content/en/release-notes/2022/v22.12.md b/guide/content/en/release-notes/2022/v22.12.md new file mode 100644 index 00000000..1761c483 --- /dev/null +++ b/guide/content/en/release-notes/2022/v22.12.md @@ -0,0 +1,185 @@ +# Version 22.12 + +.. toc:: + +## Introduction + +This is the final release of the version 22 [release cycle](../../org/policies.md#release-schedule). As such it is a **long-term support** release, and will be supported as stated in the [policies](../../org/policies.md#long-term-support-v-interim-releases). + +## What to know + +More details in the [Changelog](https://sanic.readthedocs.io/en/stable/sanic/changelog.html). Notable new or breaking features, and what to upgrade... + +### ๐Ÿšจ *BREAKING CHANGE* - Sanic Inspector is now an HTTP server + +Sanic v22.9 introduced the [Inspector](./v22.9.md#inspector) to allow live inspection of a running Sanic instance. This feature relied upon opening a TCP socket and communicating over a custom protocol. That basic TCP protocol has been dropped in favor of running a full HTTP service in its place. [Learn more about the Inspector](../deployment/inspector.md). + +The current release introduces a new HTTP server and a refreshed CLI experience. This enables several new features highlighted here. Perhaps the most significant change, however, is to move all of the Inspector's commands to a subparser on the CLI instance. + +``` +$ sanic inspect --help + + โ–„โ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆ โ–„โ–ˆโ–„ โ–ˆโ–ˆ โ–ˆ โ–ˆ โ–„โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ + โ–ˆโ–ˆ โ–ˆ โ–ˆ โ–ˆ โ–ˆโ–ˆ โ–ˆ โ–ˆ โ–ˆโ–ˆ + โ–€โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–„ โ–€ โ–ˆ โ–ˆ โ–ˆโ–ˆ โ–„ โ–ˆ โ–ˆโ–ˆ + โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆ โ–ˆโ–ˆ โ–ˆ โ–ˆ โ–„โ–„ + โ–ˆโ–ˆโ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–€ โ–ˆ โ–ˆ โ–ˆ โ–ˆโ–ˆ โ–ˆ โ–€โ–ˆโ–ˆ โ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆโ–ˆ + +Optional +======== + General: + -h, --help show this help message and exit + --host HOST, -H HOST Inspector host address [default 127.0.0.1] + --port PORT, -p PORT Inspector port [default 6457] + --secure, -s Whether to access the Inspector via TLS encryption + --api-key API_KEY, -k API_KEY Inspector authentication key + --raw Whether to output the raw response information + + Subcommands: + Run one or none of the below subcommands. Using inspect without a subcommand will fetch general information about the state of the application instance. + + Or, you can optionally follow inspect with a subcommand. If you have created a custom Inspector instance, then you can run custom commands. See https://sanic.dev/en/guide/deployment/inspector.html for more details. + + {reload,shutdown,scale,} + reload Trigger a reload of the server workers + shutdown Shutdown the application and all processes + scale Scale the number of workers + Run a custom command +``` + +#### CLI remote access now available + +The `host` and `port` of the Inspector are now explicitly exposed on the CLI as shown above. Previously in v22.9, they were inferred by reference to the application instance. Because of this change, it will be more possible to expose the Inspector on live production instances and access from a remote installation of the CLI. + +For example, you can check your running production deployment from your local development machine. + +``` +$ sanic inspect --host=1.2.3.4 +``` + + +.. warning:: + + For **production** instances, make sure you are _using TLS and authentication_ described below. + +#### TLS encryption now available + +You can secure your remote Inspector access by providing a TLS certificate to encrypt the web traffic. + +```python +app.config.INSPECTOR_TLS_CERT = "/path/to/cert.pem" +app.config.INSPECTOR_TLS_KEY = "/path/to/key.pem" +``` + +To access an encrypted installation via the CLI, use the `--secure` flag. + +``` +$ sanic inspect --secure +``` + +#### Authentication now available + +To control access to the remote Inspector, you can protect the endpoints using an API key. + +```python +app.config.INSPECTOR_API_KEY = "Super-Secret-200" +``` + +To access a protected installation via the CLI, use the `--api-key` flag. + +``` +$ sanic inspect --api-key=Super-Secret-200 +``` + +This is equivalent to the header: `Authorization: Bearer `. + +``` +$ curl http://localhost:6457 -H "Authorization: Bearer Super-Secret-200" +``` + +### Scale number of running server workers + +The Inspector is now capable of scaling the number of worker processes. For example, to scale to 3 replicas, use the following command: + +``` +$ sanic inspect scale 3 +``` + +### Extend Inspector with custom commands + +The Inspector is now fully extendable to allow for adding custom commands to the CLI. For more information see [Custom Commands](../deployment/inspector.md#custom-commands). + +``` +$ sanic inspect foo --bar +``` + +### Early worker exit on failure + +The process manager shipped with v22.9 had a very short startup timeout. This was to protect against deadlock. This was increased to 30s, and a new mechanism has been added to fail early if there is a crash in a worker process on startup. + +### Introduce `JSONResponse` with convenience methods to update a JSON response body + +The `sanic.response.json` convenience method now returns a new subclass of `HTTPResponse` appropriately named: `JSONResponse`. This new type has some convenient methods for handling changes to a response body after its creation. + +```python +resp = json({"foo": "bar"}) +resp.update({"another": "value"}) +``` + +See [Returning JSON Data](../basics/response.md#returning-json-data) for more information. + +### Updates to downstream requirements: `uvloop` and `websockets` + +Minimum `uvloop` was set to `0.15.0`. Changes were added to make Sanic compliant with `websockets` version `11.0`. + +### Force exit on 2nd `ctrl+c` + +On supporting operating systems, the existing behavior is for Sanic server to try to perform a graceful shutdown when hitting `ctrl+c`. This new release will perform an immediate shutdown on subsequent `ctrl+c` after the initial shutdown has begun. + +### Deprecations and Removals + +1. *DEPRECATED* - The `--inspect*` commands introduced in v22.9 have been replaced with a new subcommand parser available as `inspect`. The flag versions will continue to operate until v23.3. You are encouraged to use the replacements. While this short deprecation period is a deviation from the standard two-cycles, we hope this change will be minimally disruptive. + ``` + OLD sanic ... --inspect + NEW sanic ... inspect + + OLD sanic ... --inspect-raw + NEW sanic ... inspect --raw + + OLD sanic ... --inspect-reload + NEW sanic ... inspect reload + + OLD sanic ... --inspect-shutdown + NEW sanic ... inspect shutdown + ``` + +## News + +The Sanic Community Organization will be headed by a new Steering Council for 2023. There are two returning and two new members. + +[@ahopkins](https://github.com/ahopkins) *returning* \ +[@prryplatypus](https://github.com/prryplatypus) *returning* \ +[@sjsadowski](https://github.com/sjsadowski) *NEW* \ +[@Tronic](https://github.com/Tronic) *NEW* + +The 2023 release managers are [@ahopkins](https://github.com/ahopkins) and [@sjsadowski](https://github.com/sjsadowski). + +If you are interested in getting more involved with Sanic, contact us on the [Discord server](https://discord.gg/FARQzAEMAA). + +## Thank you + +Thank you to everyone that participated in this release: :clap: + +[@aaugustin](https://github.com/aaugustin) +[@ahopkins](https://github.com/ahopkins) +[@ChihweiLHBird](https://github.com/ChihweiLHBird) +[@kijk2869](https://github.com/kijk2869) +[@LiraNuna](https://github.com/LiraNuna) +[@prryplatypus](https://github.com/prryplatypus) +[@sjsadowski](https://github.com/sjsadowski) +[@todddialpad](https://github.com/todddialpad) +[@Tronic](https://github.com/Tronic) + +--- + +If you enjoy the project, please consider contributing. Of course we love code contributions, but we also love contributions in any form. Consider writing some documentation, showing off use cases, joining conversations and making your voice known, and if you are able: [financial contributions](https://opencollective.com/sanic-org/). diff --git a/guide/content/en/release-notes/2022/v22.3.md b/guide/content/en/release-notes/2022/v22.3.md new file mode 100644 index 00000000..3a69e61c --- /dev/null +++ b/guide/content/en/release-notes/2022/v22.3.md @@ -0,0 +1,221 @@ +# Version 22.3 + +.. toc:: + +## Introduction + +This is the first release of the version 22 [release cycle](../../org/policies.md#release-schedule). All of the standard SCO libraries are now entering the same release cycle and will follow the same versioning pattern. Those packages are: + +- [`sanic-routing`](https://github.com/sanic-org/sanic-routing) +- [`sanic-testing`](https://github.com/sanic-org/sanic-testing) +- [`sanic-ext`](https://github.com/sanic-org/sanic-ext) + +## What to know + +More details in the [Changelog](https://sanic.readthedocs.io/en/stable/sanic/changelog.html). Notable new or breaking features, and what to upgrade... + +### Application multi-serve + +The Sanic server now has an API to allow you to run multiple applications side-by-side in the same process. This is done by calling `app.prepare(...)` on one or more application instances, one or many times. Each time it should be bound to a unique host/port combination. Then, you begin serving the applications by calling `Sanic.serve()`. + +```python +app = Sanic("One") +app2 = Sanic("Two") + +app.prepare(port=9999) +app.prepare(port=9998) +app.prepare(port=9997) +app2.prepare(port=8888) +app2.prepare(port=8887) + +Sanic.serve() +``` + +In the above snippet, there are two applications that will be run concurrently and bound to multiple ports. This feature is *not* supported in the CLI. + +This pattern is meant to be an alternative to running `app.run(...)`. It should be noted that `app.run` is now just a shorthand for the above pattern and is still fully supported. + +### ๐Ÿ‘ถ *BETA FEATURE* - New path parameter type: file extensions + +A very common pattern is to create a route that dynamically generates a file. The endpoint is meant to match on a file with an extension. There is a new path parameter to match files: ``. + +```python +@app.get("/path/to/") +async def handler(request, filename, ext): + ... +``` + +This will catch any pattern that ends with a file extension. You may, however want to expand this by specifying which extensions, and also by using other path parameter types for the file name. + +For example, if you want to catch a `.jpg` file that is only numbers: + +```python +@app.get("/path/to/") +async def handler(request, filename, ext): + ... +``` + +Some potential examples: + +| definition | example | filename | extension | +| --------------------------------- | ----------- | ----------- | ---------- | +| \ | page.txt | `"page"` | `"txt"` | +| \ | cat.jpg | `"cat"` | `"jpg"` | +| \ | cat.jpg | `"cat"` | `"jpg"` | +| | 123.txt | `123` | `"txt"` | +| | 123.svg | `123` | `"svg"` | +| | 3.14.tar.gz | `3.14` | `"tar.gz"` | + +### ๐Ÿšจ *BREAKING CHANGE* - Path parameter matching of non-empty strings + +A dynamic path parameter will only match on a non-empty string. + +Previously a route with a dynamic string parameter (`/` or `/`) would match on any string, including empty strings. It will now only match a non-empty string. To retain the old behavior, you should use the new parameter type: `/`. + +```python +@app.get("/path/to/") +async def handler(request, foo) + ... +``` + +### ๐Ÿšจ *BREAKING CHANGE* - `sanic.worker.GunicornWorker` has been removed + +Departing from our normal deprecation policy, the `GunicornWorker` was removed as a part of the process of upgrading the Sanic server to include multi-serve. This decision was made largely in part because even while it existed it was not an optimal strategy for deploying Sanic. + +If you want to deploy Sanic using `gunicorn`, then you are advised to do it using [the strategy implemented by `uvicorn`](https://www.uvicorn.org/#running-with-gunicorn). This will effectively run Sanic as an ASGI application through `uvicorn`. You can upgrade to this pattern by installing `uvicorn`: + +``` +pip install uvicorn +``` + +Then, you should be able to run it with a pattern like this: + +``` +gunicorn path.to.sanic:app -k uvicorn.workers.UvicornWorker +``` + +### Authorization header parsing + +The `Authorization` header has been partially parseable for some time now. You have been able to use `request.token` to gain access to a header that was in one of the following two forms: + +``` +Authorization: Token +Authorization: Bearer +``` + +Sanic can now parse more credential types like `BASIC`: + +``` +Authorization: Basic Z2lsLWJhdGVzOnBhc3N3b3JkMTIz +``` + +This can be accessed now as `request.credentials`: + +```python +print(request.credentials) +# Credentials(auth_type='Basic', token='Z2lsLWJhdGVzOnBhc3N3b3JkMTIz', _username='gil-bates', _password='password123') +``` + +### CLI arguments optionally injected into application factory + +Sanic will now attempt to inject the parsed CLI arguments into your factory if you are using one. + +```python +def create_app(args): + app = Sanic("MyApp") + print(args) + return app +``` +``` +$sanic p:create_app --factory +Namespace(module='p:create_app', factory=True, simple=False, host='127.0.0.1', port=8000, unix='', cert=None, key=None, tls=None, tlshost=False, workers=1, fast=False, access_log=False, debug=False, auto_reload=False, path=None, dev=False, motd=True, verbosity=None, noisy_exceptions=False) +``` + +If you are running the CLI with `--factory`, you also have the option of passing arbitrary arguments to the command, which will be injected into the argument `Namespace`. + +``` +sanic p:create_app --factory --foo=bar +Namespace(module='p:create_app', factory=True, simple=False, host='127.0.0.1', port=8000, unix='', cert=None, key=None, tls=None, tlshost=False, workers=1, fast=False, access_log=False, debug=False, auto_reload=False, path=None, dev=False, motd=True, verbosity=None, noisy_exceptions=False, foo='bar') +``` + +### New reloader process listener events + +When running Sanic server with auto-reload, there are two new events that trigger a listener *only* on the reloader process: + +- `reload_process_start` +- `reload_process_stop` + +These are only triggered if the reloader is running. + +```python +@app.reload_process_start +async def reload_start(*_): + print(">>>>>> reload_start <<<<<<") + +@app.reload_process_stop +async def reload_stop(*_): + print(">>>>>> reload_stop <<<<<<") +``` + +### The event loop is no longer a required argument of a listener + +You can leave out the `loop` argument of a listener. Both of these examples work as expected: + +```python +@app.before_server_start +async def without(app): + ... + +@app.before_server_start +async def with(app, loop): + ... +``` + +### Removal - Debug mode does not automatically start the reloader + +When running with `--debug` or `debug=True`, the Sanic server will not automatically start the auto-reloader. This feature of doing both on debug was deprecated in v21 and removed in this release. If you would like to have *both* debug mode and auto-reload, you can use `--dev` or `dev=True`. + +**dev = debug mode + auto reloader** + +### Deprecation - Loading of lower case environment variables + +Sanic loads prefixed environment variables as configuration values. It has not distinguished between uppercase and lowercase as long as the prefix matches. However, it has always been the convention that the keys should be uppercase. This is deprecated and you will receive a warning if the value is not uppercase. In v22.9 only uppercase and prefixed keys will be loaded. + +## News + +### Packt publishes new book on Sanic web development + +.. column:: + + There is a new book on **Python Web Development with Sanic** by [@ahopkins](https://github.com/ahopkins). The book is endorsed by the SCO and part of the proceeds of all sales go directly to the SCO for further development of Sanic. + + You can learn more at [sanicbook.com](https://sanicbook.com/) + +.. column:: + + ![Python Web Development with Sanic](https://sanicbook.com/images/SanicCoverFinal.png) + +## Thank you + +Thank you to everyone that participated in this release: :clap: + +[@aericson](https://github.com/aericson) +[@ahankinson](https://github.com/ahankinson) +[@ahopkins](https://github.com/ahopkins) +[@ariebovenberg](https://github.com/ariebovenberg) +[@ashleysommer](https://github.com/ashleysommer) +[@Bluenix2](https://github.com/Bluenix2) +[@ChihweiLHBird](https://github.com/ChihweiLHBird) +[@dotlambda](https://github.com/dotlambda) +[@eric-spitler](https://github.com/eric-spitler) +[@howzitcdf](https://github.com/howzitcdf) +[@jonra1993](https://github.com/jonra1993) +[@prryplatypus](https://github.com/prryplatypus) +[@raphaelauv](https://github.com/raphaelauv) +[@SaidBySolo](https://github.com/SaidBySolo) +[@SerGeRybakov](https://github.com/SerGeRybakov) +[@Tronic](https://github.com/Tronic) + +--- + +If you enjoy the project, please consider contributing. Of course we love code contributions, but we also love contributions in any form. Consider writing some documentation, showing off use cases, joining conversations and making your voice known, and if you are able: [financial contributions](https://opencollective.com/sanic-org/). diff --git a/guide/content/en/release-notes/2022/v22.6.md b/guide/content/en/release-notes/2022/v22.6.md new file mode 100644 index 00000000..b193c63d --- /dev/null +++ b/guide/content/en/release-notes/2022/v22.6.md @@ -0,0 +1,159 @@ +# Version 22.6 + +.. toc:: + +## Introduction + +This is the second release of the version 22 [release cycle](../../org/policies.md#release-schedule). Version 22 will be "finalized" in the December long-term support version release. + +## What to know + +More details in the [Changelog](https://sanic.readthedocs.io/en/stable/sanic/changelog.html). Notable new or breaking features, and what to upgrade... + +### Automatic TLS setup in `DEBUG` mode + +The Sanic server can automatically setup a TLS certificate using either [mkcert](https://github.com/FiloSottile/mkcert) or [trustme](https://github.com/python-trio/trustme). This certificate will enable `https://localhost` (or another local address) for local development environments. You must install either `mkcert` or `trustme` on your own for this to work. + +.. column:: + + ``` + $ sanic path.to.server:app --auto-tls --debug + ``` + +.. column:: + + ```python + app.run(debug=True, auto_tls=True) + ``` + +This feature is not available when running in `ASGI` mode, or in `PRODUCTION` mode. When running Sanic in production, you should be using a real TLS certificate either purchased through a legitimate vendor, or using [Let's Encrypt](https://letsencrypt.org/). + +### HTTP/3 Server ๐Ÿš€ + +In June 2022, the IETF finalized and published [RFC 9114](https://www.rfc-editor.org/rfc/rfc9114.html), the specification for HTTP/3. In short, HTTP/3 is a **very** different protocol than HTTP/1.1 and HTTP/2 because it implements HTTP over UDP instead of TCP. The new HTTP protocol promises faster webpage load times and solving some of the problems of the older standards. You are encouraged to [read more about](https://http3-explained.haxx.se/) this new web technology. You likely will need to install a [capable client](https://curl.se/docs/http3.html) as traditional tooling will not work. + +Sanic server offers HTTP/3 support using [aioquic](https://github.com/aiortc/aioquic). This **must** be installed: + +``` +pip install sanic aioquic +``` + +``` +pip install sanic[http3] +``` + +To start HTTP/3, you must explicitly request it when running your application. + +.. column:: + + ``` + $ sanic path.to.server:app --http=3 + ``` + + ``` + $ sanic path.to.server:app -3 + ``` + +.. column:: + + ```python + app.run(version=3) + ``` + +To run both an HTTP/3 and HTTP/1.1 server simultaneously, you can use [application multi-serve](./v22.3.html#application-multi-serve) introduced in v22.3. + + +.. column:: + + ``` + $ sanic path.to.server:app --http=3 --http=1 + ``` + + ``` + $ sanic path.to.server:app -3 -1 + ``` + +.. column:: + + ```python + app.prepre(version=3) + app.prepre(version=1) + Sanic.serve() + ``` + +Because HTTP/3 requires TLS, you cannot start a HTTP/3 server without a TLS certificate. You should [set it up yourself](../how-to/tls.html) or use `mkcert` if in `DEBUG` mode. Currently, automatic TLS setup for HTTP/3 is not compatible with `trustme`. + +**๐Ÿ‘ถ This feature is being released as an *EARLY RELEASE FEATURE*.** It is **not** yet fully compliant with the HTTP/3 specification, lacking some features like [websockets](https://websockets.spec.whatwg.org/), [webtransport](https://w3c.github.io/webtransport/), and [push responses](https://http3-explained.haxx.se/en/h3/h3-push). Instead the intent of this release is to bring the existing HTTP request/response cycle towards feature parity with HTTP/3. Over the next several releases, more HTTP/3 features will be added and the API for it finalized. + +### Consistent exception naming + +Some of the Sanic exceptions have been renamed to be more compliant with standard HTTP response names. + +- `InvalidUsage` >> `BadRequest` +- `MethodNotSupported` >> `MethodNotAllowed` +- `ContentRangeError` >> `RangeNotSatisfiable` + +All old names have been aliased and will remain backwards compatible. + +### Current request getter + +Similar to the API to access an application (`Sanic.get_app()`), there is a new method for retrieving the current request when outside of a request handler. + +```python +from sanic import Request + +Request.get_current() +``` + +### Improved API support for setting cache control headers + +The `file` response helper has some added parameters to make it easier to handle setting of the [Cache-Control](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control) header. + +```python +file( + ..., + last_modified=..., + max_age=..., + no_store=..., +) +``` + +### Custom `loads` function + +Just like Sanic supports globally setting a custom `dumps`, you can now set a global custom `loads`. + +```python +from orjson import loads + +app = Sanic("Test", loads=loads) +``` + +### Deprecations and Removals + +1. *REMOVED* - Applications may no longer opt-out of the application registry +1. *REMOVED* - Custom exception handlers will no longer run after some part of an exception has been sent +1. *REMOVED* - Fallback error formats cannot be set on the `ErrorHandler` and must **only** be set in the `Config` +1. *REMOVED* - Setting a custom `LOGO` for startup is no longer allowed +1. *REMOVED* - The old `stream` response convenience method has been removed +1. *REMOVED* - `AsyncServer.init` is removed and no longer an alias of `AsyncServer.app.state.is_started` + + +## Thank you + +Thank you to everyone that participated in this release: :clap: + +[@ahopkins](https://github.com/ahopkins) +[@amitay87](https://github.com/amitay87 ) +[@ashleysommer](https://github.com/ashleysommer) +[@azimovMichael](https://github.com/azimovMichael) +[@ChihweiLHBird](https://github.com/ChihweiLHBird) +[@kijk2869](https://github.com/kijk2869) +[@prryplatypus](https://github.com/prryplatypus) +[@SaidBySolo](https://github.com/SaidBySolo) +[@sjsadowski](https://github.com/sjsadowski) +[@timmo001](https://github.com/timmo001) +[@zozzz](https://github.com/zozzz) + +--- + +If you enjoy the project, please consider contributing. Of course we love code contributions, but we also love contributions in any form. Consider writing some documentation, showing off use cases, joining conversations and making your voice known, and if you are able: [financial contributions](https://opencollective.com/sanic-org/). diff --git a/guide/content/en/release-notes/2022/v22.9.md b/guide/content/en/release-notes/2022/v22.9.md new file mode 100644 index 00000000..9ca03fd4 --- /dev/null +++ b/guide/content/en/release-notes/2022/v22.9.md @@ -0,0 +1,325 @@ +# Version 22.9 + +.. toc:: + +## Introduction + +This is the third release of the version 22 [release cycle](../../org/policies.md#release-schedule). Version 22 will be "finalized" in the December long-term support version release. + +## What to know + +More details in the [Changelog](https://sanic.readthedocs.io/en/stable/sanic/changelog.html). Notable new or breaking features, and what to upgrade... + +### โš  *IMPORTANT* - New worker manager ๐Ÿš€ + +Sanic server has been overhauled to provide more consistency and flexbility in how it operates. More details about the motivations are outlined in [PR #2499](https://github.com/sanic-org/sanic/pull/2499) and discussed in a live stream [discussion held on YouTube](https://youtu.be/m8HCO8NK7HE). + +This **does NOT apply** to Sanic in ASGI mode + +#### Overview of the changes + +- The worker servers will **always** run in a child process. + - Previously this could change depending upon one versus many workers, and the usage or not of the reloader. This should lead to much more predictable development environments that more closely match their production counterparts. +- Multi-workers is **now supported on Windows**. + - This was impossible because Sanic relied upon the `multiprocessing` module using `fork`, which is not available on Windows. + - Now, Sanic will always use `spawn`. This does have some noticeable differences, particularly if you are running Sanic in the global scope with `app.run` (see below re: upgrade issues). +- The application instance now has a new `multiplexer` object that can be used to restart one or many workers. This could, for example, be triggered by a request. +- There is a new Inspector that can provide details on the state of your server. +- Sanic worker manager can run arbitrary processes. + - This allows developers to add any process they want from within Sanic. + - Possible use cases: + - Health monitor, see [Sanic Extensions]() + - Logging queue, see [Sanic Extensions]() + - Background worker queue in a seperate process + - Running another application, like a bot +- There is a new listener called: `main_process_ready`. It really should only be used for adding arbitrary processes to Sanic. +- Passing shared objects between workers. + - Python does allow some types of objects to share state between processes, whether through shared memory, pipes, etc. + - Sanic will now allow these types of object to be shared on the `app.shared_ctx` object. + - Since this feature relies upon Pythons `multiprocessing` library, it obviously will only work to share state between Sanic worker instances that are instantiated from the same execution. This is *not* meant to provide an API for horizontal scaling across multiple machines for example. + +#### Adding a shared context object + +To share an object between worker processes, it *MUST* be assigned inside of the `main_process_start` listener. + +```python +from multiprocessing import Queue + +@app.main_process_start +async def main_process_start(app): + app.shared_ctx.queue = Queue() +``` + +All objects on `shared_ctx` will be available now within each worker process. + +```python +@app.before_server_starts +async def before_server_starts(app): + assert isinstance(app.shared_ctx.queue, Queue) + +@app.on_request +async def on_request(request): + assert isinstance(request.app.shared_ctx.queue, Queue) + +@app.get("/") +async def handler(request): + assert isinstance(request.app.shared_ctx.queue, Queue) +``` + +*NOTE: Sanic will not stop you from registering an unsafe object, but may warn you. Be careful not to just add a regular list object, for example, and expect it to work. You should have an understanding of how to share state between processes.* + +#### Running arbitrary processes + +Sanic can run any arbitrary process for you. It should be capable of being stopped by a `SIGINT` or `SIGTERM` OS signal. + +These processes should be registered inside of the `main_process_ready` listener. + +```python +@app.main_process_ready +async def ready(app: Sanic, _): + app.manager.manage("MyProcess", my_process, {"foo": "bar"}) +# app.manager.manage(, , ) +``` + +#### Inspector + +Sanic ships with an optional Inspector, which is a special process that allows for the CLI to inspect the running state of an application and issue commands. It currently will only work if the CLI is being run on the same machine as the Sanic instance. + +``` +sanic path.to:app --inspect +``` + +![Sanic inspector](https://user-images.githubusercontent.com/166269/190099384-2f2f3fae-22d5-4529-b279-8446f6b5f9bd.png) + +The new CLI commands are: + +``` + --inspect Inspect the state of a running instance, human readable + --inspect-raw Inspect the state of a running instance, JSON output + --trigger-reload Trigger worker processes to reload + --trigger-shutdown Trigger all processes to shutdown +``` + +This is not enabled by default. In order to have it available, you must opt in: + +```python +app.config.INSPECTOR = True +``` + +*Note: [Sanic Extensions]() provides a [custom request](../basics/app.md#custom-requests) class that will add a request counter to the server state. + +#### Application multiplexer + +Many of the same information and functionality is available on the application instance itself. There is a new `multiplexer` object on the application instance that has the ability to restart one or more workers, and fetch information about the current state. + +You can access it as `app.multiplexer`, or more likely by its short alias `app.m`. + +```python +@app.on_request +async def print_state(request: Request): + print(request.app.m.state) +``` + +#### Potential upgrade issues + +Because of the switch from `fork` to `spawn`, if you try running the server in the global scope you will receive an error. If you see something like this: + +``` +sanic.exceptions.ServerError: Sanic server could not start: [Errno 98] Address already in use. +This may have happened if you are running Sanic in the global scope and not inside of a `if __name__ == "__main__"` block. +``` + +... then the change is simple. Make sure `app.run` is inside a block. + +```python +if __name__ == "__main__": + app.run(port=9999, dev=True) +``` + +#### Opting out of the new functionality + +If you would like to run Sanic without the new process manager, you may easily use the legacy runners. Please note that support for them **will be removed** in the future. A date has not yet been set, but will likely be sometime in 2023. + +To opt out of the new server and use the legacy, choose the appropriate method depending upon how you run Sanic: + +.. column:: + + If you use the CLI... + +.. column:: + + ``` + sanic path.to:app --legacy + ``` + + +.. column:: + + If you use `app.run`... + +.. column:: + + ``` + app.run(..., legacy=True) + ``` + + +.. column:: + + If you `app.prepare`... + +.. column:: + + ``` + app.prepare(...) + Sanic.serve_legacy() + ``` + +Similarly, you can force Sanic to run in a single process. This however means there will not be any access to the auto-reloader. + +.. column:: + + If you use the CLI... + +.. column:: + + ``` + sanic path.to:app --single-process + ``` + + +.. column:: + + If you use `app.run`... + +.. column:: + + ``` + app.run(..., single_process=True) + ``` + + +.. column:: + + If you `app.prepare`... + +.. column:: + + ``` + app.prepare(...) + Sanic.serve_single() + ``` + +### Middleware priority + +Middleware is executed in an order based upon when it was defined. Request middleware are executed in sequence and response middleware in reverse. This could have an unfortunate impact if your ordering is strictly based upon import ordering with global variables for example. + +A new addition is to break-out of the strict construct and allow a priority to be assigned to a middleware. The higher the number for a middleware definition, the earlier in the sequence it will be executed. This applies to **both** request and response middleware. + +```python +@app.on_request +async def low_priority(_): + ... + +@app.on_request(priority=10) +async def high_priority(_): + ... +``` + +In the above example, even though `low_priority` is defined first, `high_priority` will run first. + +### Custom `loads` function + +Sanic has supported the ability to add a [custom `dumps` function](https://sanic.readthedocs.io/en/stable/sanic/api/app.html#sanic.app.Sanic) when instantiating an app. The same functionality has been extended to `loads`, which will be used when deserializing. + +```python +from json import loads + +Sanic("Test", loads=loads) +``` + +### Websocket objects are now iterable + +Rather than calling `recv` in a loop on a `Websocket` object, you can iterate on it in a `for` loop. + +```python +from sanic import Request, Websocket + +@app.websocket("/ws") +async def ws_echo_handler(request: Request, ws: Websocket): + async for msg in ws: + await ws.send(msg) +``` + +### Appropriately respond with 304 on static files + +When serving a static file, the Sanic server can respond appropriately to a request with `If-Modified-Since` using a `304` response instead of resending a file. + +### Two new signals to wrap handler execution + +Two new [signals](../advanced/signals.md) have been added that wrap the execution of a request handler. + +- `http.handler.before` - runs after request middleware but before the route handler +- `http.handler.after` - runs after the route handler + - In *most* circumstances, this also means that it will run before response middleware. However, if you call `request.respond` from inside of a route handler, then your middleware will come first + +### New Request properties for HTTP method information + +The HTTP specification defines which HTTP methods are: safe, idempotent, and cacheable. New properties have been added that will respond with a boolean flag to help identify the request property based upon the method. + +```python +request.is_safe +request.is_idempotent +request.is_cacheable +``` + +### ๐Ÿšจ *BREAKING CHANGE* - Improved cancel request exception + +In prior version of Sanic, if a `CancelledError` was caught it could bubble up and cause the server to respond with a `503`. This is not always the desired outcome, and it prevented the usage of that error in other circumstances. As a result, Sanic will now use a subclass of `CancelledError` called: `RequestCancelled` for this functionality. It likely should have little impact unless you were explicitly relying upon the old behavior. + +For more details on the specifics of these properties, checkout the [MDN docs](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods). + +### New deprecation warning filter + +You can control the level of deprecation warnings from Sanic using [standard library warning filter values](https://docs.python.org/3/library/warnings.html#the-warnings-filter). Default is `"once"`. + +```python +app.config.DEPRECATION_FILTER = "ignore" +``` + +### Deprecations and Removals + +1. *DEPRECATED* - Duplicate route names have been deprecated and will be removed in v23.3 +1. *DEPRECATED* - Registering duplicate exception handlers has been deprecated and will be removed in v23.3 +1. *REMOVED* - `route.ctx` not set by Sanic, and is a blank object for users, therefore ... + - `route.ctx.ignore_body` >> `route.extra.ignore_body` + - `route.ctx.stream` >> `route.extra.stream` + - `route.ctx.hosts` >> `route.extra.hosts` + - `route.ctx.static` >> `route.extra.static` + - `route.ctx.error_format` >> `route.extra.error_format` + - `route.ctx.websocket` >> `route.extra.websocket` +1. *REMOVED* - `app.debug` is READ-ONLY +1. *REMOVED* - `app.is_running` removed +1. *REMOVED* - `app.is_stopping` removed +1. *REMOVED* - `Sanic._uvloop_setting` removed +1. *REMOVED* - Prefixed environment variables will be ignored if not uppercase + +## Thank you + +Thank you to everyone that participated in this release: :clap: + +[@ahopkins](https://github.com/ahopkins) +[@azimovMichael](https://github.com/azimovMichael) +[@ChihweiLHBird](https://github.com/ChihweiLHBird) +[@huntzhan](https://github.com/huntzhan) +[@monosans](https://github.com/monosans) +[@prryplatypus](https://github.com/prryplatypus) +[@SaidBySolo](https://github.com/SaidBySolo) +[@seemethere](https://github.com/seemethere) +[@sjsadowski](https://github.com/sjsadowski) +[@timgates42](https://github.com/timgates42) +[@Tronic](https://github.com/Tronic) + +--- + +If you enjoy the project, please consider contributing. Of course we love code contributions, but we also love contributions in any form. Consider writing some documentation, showing off use cases, joining conversations and making your voice known, and if you are able: [financial contributions](https://opencollective.com/sanic-org/). diff --git a/guide/content/en/release-notes/2023/v23.3.md b/guide/content/en/release-notes/2023/v23.3.md new file mode 100644 index 00000000..f5d27ed6 --- /dev/null +++ b/guide/content/en/release-notes/2023/v23.3.md @@ -0,0 +1,389 @@ +# Version 23.3 + +.. toc:: + +## Introduction + +This is the first release of the version 23 [release cycle](../../org/policies.md#release-schedule). As such contains some deprecations and hopefully some *small* breaking changes. If you run into any issues, please raise a concern on [GitHub](https://github.com/sanic-org/sanic/issues/new/choose). + +## What to know + +More details in the [Changelog](https://sanic.readthedocs.io/en/stable/sanic/changelog.html). Notable new or breaking features, and what to upgrade... + +### Nicer traceback formatting + +The SCO adopted two projects into the Sanic namespace on GitHub: [tracerite](https://github.com/sanic-org/tracerite) and [html5tagger](https://github.com/sanic-org/html5tagger). These projects team up to provide and incredible new error page with more details to help the debugging process. + +This is provided out of the box, and will adjust to display only relevant information whether in DEBUG more or PROD mode. + +.. column:: + + **Using PROD mode** + ![image](/assets/images/error-html-no-debug.png) + +.. column:: + + **Using DEBUG mode** + ![image](/assets/images/error-html-debug.png) + +Light and dark mode HTML pages are available and will be used implicitly. + +### Basic file browser on directories + +When serving a directory from a static handler, Sanic can be configured to show a basic file browser instead using `directory_view=True`. + +.. column:: + + ```python + app.static("/uploads/", "/path/to/dir/", directory_view=True) + ``` + +.. column:: + + ![image](/assets/images/directory-view.png) + +Light and dark mode HTML pages are available and will be used implicitly. + +### HTML templating with Python + +Because Sanic is using [html5tagger](https://github.com/sanic-org/html5tagger) under the hood to render the [new error pages](#nicer-traceback-formatting), you now have the package available to you to easily generate HTML pages in Python code: + +.. column:: + + ```python + from html5tagger import Document + from sanic import Request, Sanic, html + + app = Sanic("TestApp") + + @app.get("/") + async def handler(request: Request): + doc = Document("My Website") + doc.h1("Hello, world.") + with doc.table(id="data"): + doc.tr.th("First").th("Second").th("Third") + doc.tr.td(1).td(2).td(3) + doc.p(class_="text")("A paragraph with ") + doc.a(href="/files")("a link")(" and ").em("formatting") + return html(doc) + ``` + +.. column:: + + ```html + + + My Website +

Hello, world.

+ + + +
First + Second + Third +
1 + 2 + 3 +
+

+ A paragraph with a link and formatting + ``` + +### Auto-index serving is available on static handlers + +Sanic can now be configured to serve an index file when serving a static directory. + +```python +app.static("/assets/", "/path/to/some/dir", index="index.html") +``` + +When using the above, requests to `http://example.com/assets/` will automatically serve the `index.html` file located in that directory. + +### Simpler CLI targets + +It is common practice for Sanic applications to use the variable `app` as the application instance. Because of this, the CLI application target (the second value of the `sanic` CLI command) now tries to infer the application instance based upon what the target is. If the target is a module that contains an `app` variable, it will use that. + +There are now four possible ways to launch a Sanic application from the CLI. + +#### 1. Application instance + +As normal, providing a path to a module and an application instance will work as expected. + +```sh +sanic path.to.module:app # global app instance +``` + +#### 2. Application factory + +Previously, to serve the factory pattern, you would need to use the `--factory` flag. This can be omitted now. + +```sh +sanic path.to.module:create_app # factory pattern +``` + +#### 3. Path to launch Sanic Simple Server + +Similarly, to launch the Sanic simple server (serve static directory), you previously needed to use the `--simple` flag. This can be omitted now, and instead simply provide the path to the directory. + +```sh +sanic ./path/to/directory/ # simple serve +``` + +#### 4. Python module containing an `app` variable + +As stated above, if the target is a module that contains an `app` variable, it will use that (assuming that `app` variable is a `Sanic` instance). + +```sh +sanic path.to.module # module with app instance +``` + +### More convenient methods for setting and deleting cookies + +The old cookie pattern was awkward and clunky. It didn't look like regular Python because of the "magic" going on under the hood. + +.. column:: + + ๐Ÿ˜ฑ This is not intuitive and is confusing for newcomers. + +.. column:: + + ```python + response = text("There's a cookie up in this response") + response.cookies["test"] = "It worked!" + response.cookies["test"]["domain"] = ".yummy-yummy-cookie.com" + response.cookies["test"]["httponly"] = True + ``` + +There are now new methods (and completely overhauled `Cookie` and `CookieJar` objects) to make this process more convenient. + +.. column:: + + ๐Ÿ˜Œ Ahh... Much nicer. + +.. column:: + + ```python + response = text("There's a cookie up in this response") + response.add_cookie( + "test", + "It worked!", + domain=".yummy-yummy-cookie.com", + httponly=True + ) + ``` + +### Better cookie compatibility + +Sanic has added support for [cookie prefixes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Cookies#cookie_prefixes), making it seemless and easy to read and write cookies with the values. + +While setting the cookie... + +```py +response.cookies.add_cookie("foo", "bar", host_prefix=True) +``` + +This will create the prefixed cookie: `__Host-foo`. However, when accessing the cookie on an incoming request, you can do so without knowing about the existence of the header. + +```py +request.cookies.get("foo") +``` + +It should also be noted, cookies can be accessed as properties just like [headers](#access-any-header-as-a-property). + +```python +request.cookies.foo +``` + +And, cookies are similar to the `request.args` and `request.form` objects in that multiple values can be retrieved using `getlist`. + +```py +request.cookies.getlist("foo") +``` + +Also added is support for creating [partitioned cookies](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Set-Cookie#partitioned_cookie). + +```py +response.cookies.add_cookie(..., partitioned=True) +``` + +### ๐Ÿšจ *BREAKING CHANGE* - More consistent and powerful `SanicException` + +Sanic has for a while included the `SanicException` as a base class exception. This could be extended to add `status_code`, etc. [See more details](http://localhost:8080/en/guide/best-practices/exceptions.html). + +**NOW**, using all of the various exceptions has become easier. The commonly used exceptions can be imported directly from the root level module. + +```python +from sanic import NotFound, Unauthorized, BadRequest, ServerError +``` + +In addition, all of these arguments are available as keyword arguments on every exception type: + +| argument | type | description | +|--|--|--| +| `quiet` | `bool` | Suppress the traceback from the logs | +| `context` | `dict` | Additional information shown in error pages *always* | +| `extra` | `dict` | Additional information shown in error pages in *DEBUG* mode | +| `headers` | `dict` | Additional headers sent in the response | + +None of these are themselves new features. However, they are more consistent in how you can use them, thus creating a powerful way to control error responses directly. + +```py +raise ServerError(headers={"foo": "bar"}) +``` + +The part of this that is a breaking change is that some formerly positional arguments are now keyword only. + +You are encouraged to look at the specific implementations for each error in the [API documents](https://sanic.readthedocs.io/en/stable/sanic/api/exceptions.html#module-sanic.exceptions). + +### ๐Ÿšจ *BREAKING CHANGE* - Refresh `Request.accept` functionality to be more performant and spec-compliant + +Parsing od the `Accept` headers into the `Request.accept` accessor has been improved. If you were using this property and relying upon its equality operation, this has changed. You should probably transition to using the `request.accept.match()` method. + +### Access any header as a property + +To simplify access to headers, you can access a raw (unparsed) version of the header as a property. The name of the header is the name of the property in all lowercase letters, and switching any hyphens (`-`) to underscores (`_`). + +For example: + +.. column:: + + ``` + GET /foo/bar HTTP/1.1 + Host: localhost + User-Agent: curl/7.88.1 + X-Request-ID: 123ABC + ``` + +.. column:: + + ```py + request.headers.host + request.headers.user_agent + request.headers.x_request_id + ``` + +### Consume `DELETE` body by default + +By default, the body of a `DELETE` request will now be consumed and read onto the `Request` object. This will make `body` available like on `POST`, `PUT`, and `PATCH` requests without any further action. + +### Custom `CertLoader` for direct control of creating `SSLContext` + +Sometimes you may want to create your own `SSLContext` object. To do this, you can create your own subclass of `CertLoader` that will generate your desired context object. + +```python +from sanic.worker.loader import CertLoader + +class MyCertLoader(CertLoader): + def load(self, app: Sanic) -> SSLContext: + ... + +app = Sanic(..., certloader_class=MyCertLoader) +``` + +### Deprecations and Removals + +1. *DEPRECATED* - Dict-style cookie setting +1. *DEPRECATED* - Using existence of JSON data on the request for one factor in using JSON error formatter +1. *REMOVED* - Remove deprecated `__blueprintname__` property +1. *REMOVED* - duplicate route names +1. *REMOVED* - duplicate exception handler definitions +1. *REMOVED* - inspector CLI with flags +1. *REMOVED* - legacy server (including `sanic.server.serve_single` and `sanic.server.serve_multiple`) +1. *REMOVED* - serving directory with bytes string +1. *REMOVED* - `Request.request_middleware_started` +1. *REMOVED* - `Websocket.connection` + +#### Duplicated route names are no longer allowed + +In version 22.9, Sanic announced that v23.3 would deprecate allowing routes to be registered with duplicate names. If you see the following error, it is because of that change: + +> sanic.exceptions.ServerError: Duplicate route names detected: SomeApp.some_handler. You should rename one or more of them explicitly by using the `name` param, or changing the implicit name derived from the class and function name. For more details, please see https://sanic.dev/en/guide/release-notes/v23.3.html#duplicated-route-names-are-no-longer-allowed + +If you are seeing this, you should opt-in to using explicit names for your routes. + +.. column:: + + **BAD** + ```python + app = Sanic("SomeApp") + + @app.get("/") + @app.get("/foo") + async def handler(request: Request): + ``` + +.. column:: + + **GOOD** + ```python + app = Sanic("SomeApp") + + @app.get("/", name="root") + @app.get("/foo", name="foo") + async def handler(request: Request): + ``` + +#### Response cookies + +Response cookies act as a `dict` for compatibility purposes only. In version 24.3, all `dict` methods will be removed and response cookies will be objects only. + +Therefore, if you are using this pattern to set cookie properties, you will need to upgrade it before version 24.3. + +```python +resp = HTTPResponse() +resp.cookies["foo"] = "bar" +resp.cookies["foo"]["httponly"] = True +``` + +Instead, you should be using the `add_cookie` method: + +```python +resp = HTTPResponse() +resp.add_cookie("foo", "bar", httponly=True) +``` + +#### Request cookies + +Sanic has added support for reading duplicated cookie keys to be more in compliance with RFC specifications. To retain backwards compatibility, accessing a cookie value using `__getitem__` will continue to work to fetch the first value sent. Therefore, in version 23.3 and prior versions this will be `True`. + +```python +assert request.cookies["foo"] == "bar" +assert request.cookies.get("foo") == "bar" +``` + +Version 23.3 added `getlist` + +```python +assert request.cookies.getlist("foo") == ["bar"] +``` + +As stated above, the `get` and `getlist` methods are available similar to how they exist on other request properties (`request.args`, `request.form`, etc). Starting in v24.3, the `__getitem__` method for cookies will work exactly like those properties. This means that `__getitem__` will return a list of values. + +Therefore, if you are relying upon this functionality to return only one value, you should upgrade to the following pattern before v24.3. + +```python +assert request.cookies["foo"] == ["bar"] +assert request.cookies.get("foo") == "bar" +assert request.cookies.getlist("foo") == ["bar"] +``` + +## Thank you + +Thank you to everyone that participated in this release: :clap: + +[@ahopkins](https://github.com/ahopkins) +[@ChihweiLHBird](https://github.com/ChihweiLHBird) +[@deounix](https://github.com/deounix) +[@Kludex](https://github.com/Kludex) +[@mbendiksen](https://github.com/mbendiksen) +[@prryplatypus](https://github.com/prryplatypus) +[@r0x0d](https://github.com/r0x0d) +[@SaidBySolo](https://github.com/SaidBySolo) +[@sjsadowski](https://github.com/sjsadowski) +[@stricaud](https://github.com/stricaud) +[@Tracyca209](https://github.com/Tracyca209) +[@Tronic](https://github.com/Tronic) + +--- + +If you enjoy the project, please consider contributing. Of course we love code contributions, but we also love contributions in any form. Consider writing some documentation, showing off use cases, joining conversations and making your voice known, and if you are able: [financial contributions](https://opencollective.com/sanic-org/). diff --git a/guide/content/en/release-notes/2023/v23.6.md b/guide/content/en/release-notes/2023/v23.6.md new file mode 100644 index 00000000..4406105e --- /dev/null +++ b/guide/content/en/release-notes/2023/v23.6.md @@ -0,0 +1,195 @@ +# Version 23.6 + +.. toc:: + + +## Introduction + +This is the second release of the version 23 [release cycle](../../org/policies.md#release-schedule). If you run into any issues, please raise a concern on [GitHub](https://github.com/sanic-org/sanic/issues/new/choose). + +## What to know + +More details in the [Changelog](https://sanic.readthedocs.io/en/stable/sanic/changelog.html). Notable new or breaking features, and what to upgrade... + +### Remove Python 3.7 support + +Python 3.7 is due to reach its scheduled upstream end-of-life on 2023-06-27. Sanic is now dropping support for Python 3.7, and requires Python 3.8 or newer. + +See [#2777](https://github.com/sanic-org/sanic/pull/2777). + +### Resolve pypy compatibility issues + +A small patch was added to the `os` module to once again allow for Sanic to run with PyPy. This workaround replaces the missing `readlink` function (missing in PyPy `os` module) with the function `os.path.realpath`, which serves to the same purpose. + +See [#2782](https://github.com/sanic-org/sanic/pull/2782). + +### Add custom typing to config and ctx objects + +The `sanic.Sanic` and `sanic.Request` object have become generic types that will make it more convenient to have fully typed `config` and `ctx` objects. + +In the most simple form, the `Sanic` object is typed as: + +```python +from sanic import Sanic +app = Sanic("test") +reveal_type(app) # N: Revealed type is "sanic.app.Sanic[sanic.config.Config, types.SimpleNamespace]" +``` + + +.. tip:: Note + + It should be noted, there is *no* requirement to use the generic types. The default types are `sanic.config.Config` and `types.SimpleNamespace`. This new feature is just an option for those that want to use it and existing types of `app: Sanic` and `request: Request` should work just fine. + + +Now it is possible to have a fully-type `app.config`, `app.ctx`, and `request.ctx` objects though generics. This allows for better integration with auto completion tools in IDEs improving the developer experience. + +```python +from sanic import Request, Sanic +from sanic.config import Config + +class CustomConfig(Config): + pass + +class Foo: + pass + +class RequestContext: + foo: Foo + +class CustomRequest(Request[Sanic[CustomConfig, Foo], RequestContext]): + @staticmethod + def make_context() -> RequestContext: + ctx = RequestContext() + ctx.foo = Foo() + return ctx + +app = Sanic( + "test", config=CustomConfig(), ctx=Foo(), request_class=CustomRequest +) + +@app.get("/") +async def handler(request: CustomRequest): + ... +``` + +As a side effect, now `request.ctx` is lazy initialized, which should reduce some overhead when the `request.ctx` is unused. + +One further change you may have noticed in the above snippet is the `make_context` method. This new method can be used by custom `Request` types to inject an object different from a `SimpleNamespace` similar to how Sanic has allowed custom application context objects for a while. + +For a more thorough discussion, see [custom typed application](../basics/app.md#custom-typed-application) and [custom typed request](../basics/app.md#custom-typed-request). + +See [#2785](https://github.com/sanic-org/sanic/pull/2785). + +### Universal exception signal + +A new exception signal added for **ALL** exceptions raised while the server is running: `"server.exception.reporting"`. This is a universal signal that will be emitted for any exception raised, and dispatched as its own task. This means that it will *not* block the request handler, and will *not* be affected by any middleware. + +This is useful for catching exceptions that may occur outside of the request handler (for example in signals, or in a background task), and it intended for use to create a consistent error handling experience for the user. + +```python +from sanic.signals import Event + +@app.signal(Event.SERVER_LIFECYCLE_EXCEPTION) +async def catch_any_exception(app: Sanic, exception: Exception): + app.ctx.my_error_reporter_utility.error(exception) +``` + +This pattern can be simplified with a new decorator `@app.report_exception`: + +```python +@app.report_exception +async def catch_any_exception(app: Sanic, exception: Exception): + print("Caught exception:", exception) +``` + +It should be pointed out that this happens in a background task and is **NOT** for manipulation of an error response. It is only for reporting, logging, or other purposes that should be triggered when an application error occurs. + +See [#2724](https://github.com/sanic-org/sanic/pull/2724) and [#2792](https://github.com/sanic-org/sanic/pull/2792). + +### Add name prefixing to BP groups + +Sanic had been raising a warning on duplicate route names for a while, and started to enforce route name uniqueness in [v23.3](https://sanic.dev/en/guide/release-notes/v23.3.html#deprecations-and-removals). This created a complication for blueprint composition. + +New name prefixing parameter for blueprints groups has been added to alleviate this issue. It allows nesting of blueprints and groups to make them composable. + +The addition is the new `name_prefix` parameter as shown in this snippet. + +```python +bp1 = Blueprint("bp1", url_prefix="/bp1") +bp2 = Blueprint("bp2", url_prefix="/bp2") + +bp1.add_route(lambda _: ..., "/", name="route1") +bp2.add_route(lambda _: ..., "/", name="route2") + +group_a = Blueprint.group( + bp1, bp2, url_prefix="/group-a", name_prefix="group-a" +) +group_b = Blueprint.group( + bp1, bp2, url_prefix="/group-b", name_prefix="group-b" +) + +app = Sanic("TestApp") +app.blueprint(group_a) +app.blueprint(group_b) +``` + +The routes built will be named as follows: +- `TestApp.group-a_bp1.route1` +- `TestApp.group-a_bp2.route2` +- `TestApp.group-b_bp1.route1` +- `TestApp.group-b_bp2.route2` + +See [#2727](https://github.com/sanic-org/sanic/pull/2727). + +### Add `request.client_ip` + +Sanic has introduced `request.client_ip`, a new accessor that provides client's IP address from both local and proxy data. It allows running the application directly on Internet or behind a proxy. This is equivalent to `request.remote_addr or request.ip`, providing the client IP regardless of how the application is deployed. + +See [#2790](https://github.com/sanic-org/sanic/pull/2790). + +### Increase of `KEEP_ALIVE_TIMEOUT` default to 120 seconds + +The default `KEEP_ALIVE_TIMEOUT` value changed from 5 seconds to 120 seconds. It is of course still configurable, but this change should improve performance on long latency connections, where reconnecting is expensive, and better fits typical user flow browsing pages with longer-than-5-second intervals. + +Sanic has historically used 5 second timeouts to quickly close idle connections. The chosen value of **120 seconds** is indeed larger than Nginx default of 75, and is the same value that Caddy server has by default. + +Related to [#2531](https://github.com/sanic-org/sanic/issues/2531) and +[#2681](https://github.com/sanic-org/sanic/issues/2681). + +See [#2670](https://github.com/sanic-org/sanic/pull/2670). + +### Set multiprocessing start method early + +Due to how Python handles `multiprocessing`, it may be confusing to some users how to properly create synchronization primitives. This is due to how Sanic creates the `multiprocessing` context. This change sets the start method early so that any primitives created will properly attach to the correct context. + +For most users, this should not be noticeable or impactful. But, it should make creation of something like this easier and work as expected. + +```python +from multiprocessing import Queue + +@app.main_process_start +async def main_process_start(app): + app.shared_ctx.queue = Queue() +``` + +See [#2776](https://github.com/sanic-org/sanic/pull/2776). + +## Thank you + +Thank you to everyone that participated in this release: :clap: + +[@ahopkins](https://github.com/ahopkins) +[@ChihweiLHBird](https://github.com/ChihweiLHBird) +[@chuckds](https://github.com/chuckds) +[@deounix](https://github.com/deounix) +[@guacs](https://github.com/guacs) +[@liamcoatman](https://github.com/liamcoatman) +[@moshe742](https://github.com/moshe742) +[@prryplatypus](https://github.com/prryplatypus) +[@SaidBySolo](https://github.com/SaidBySolo) +[@Thirumalai](https://github.com/Thirumalai) +[@Tronic](https://github.com/Tronic) + +--- + +If you enjoy the project, please consider contributing. Of course we love code contributions, but we also love contributions in any form. Consider writing some documentation, showing off use cases, joining conversations and making your voice known, and if you are able: [financial contributions](https://opencollective.com/sanic-org/). diff --git a/guide/public/assets/.gitkeep b/guide/public/assets/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/guide/public/assets/code.css b/guide/public/assets/code.css new file mode 100644 index 00000000..865fe9bf --- /dev/null +++ b/guide/public/assets/code.css @@ -0,0 +1,83 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.hll { background-color: #ffffcc } +.c { color: #a2a2a2; font-style: italic } /* Comment */ +.err { color: #777777 } /* Error */ +.esc { color: #777777 } /* Escape */ +.g { color: #777777 } /* Generic */ +.k { color: #ff0d68 } /* Keyword */ +.l { color: #777777 } /* Literal */ +.n { color: #333333 } /* Name */ +.o { color: #777777 } /* Operator */ +.x { color: #777777 } /* Other */ +.p { color: #777777 } /* Punctuation */ +.ch { color: #a2a2a2; font-style: italic } /* Comment.Hashbang */ +.cm { color: #a2a2a2; font-style: italic } /* Comment.Multiline */ +.cp { color: #a2a2a2; font-style: italic } /* Comment.Preproc */ +.cpf { color: #a2a2a2; font-style: italic } /* Comment.PreprocFile */ +.c1 { color: #a2a2a2; font-style: italic } /* Comment.Single */ +.cs { color: #a2a2a2; font-style: italic } /* Comment.Special */ +.gd { color: #777777 } /* Generic.Deleted */ +.ge { color: #777777 } /* Generic.Emph */ +.gr { color: #777777 } /* Generic.Error */ +.gh { color: #777777 } /* Generic.Heading */ +.gi { color: #777777 } /* Generic.Inserted */ +.go { color: #777777 } /* Generic.Output */ +.gp { color: #777777 } /* Generic.Prompt */ +.gs { color: #777777 } /* Generic.Strong */ +.gu { color: #777777 } /* Generic.Subheading */ +.gt { color: #777777 } /* Generic.Traceback */ +.kc { color: #ff0d68 } /* Keyword.Constant */ +.kd { color: #ff0d68 } /* Keyword.Declaration */ +.kn { color: #ff0d68 } /* Keyword.Namespace */ +.kp { color: #ff0d68 } /* Keyword.Pseudo */ +.kr { color: #ff0d68 } /* Keyword.Reserved */ +.kt { color: #ff0d68 } /* Keyword.Type */ +.ld { color: #777777 } /* Literal.Date */ +.m { color: #777777 } /* Literal.Number */ +.s { color: #833FE3; background-color: #eeeeee } /* Literal.String */ +.na { color: #333333 } /* Name.Attribute */ +.nb { color: #333333 } /* Name.Builtin */ +.nc { color: #37ae6f; font-weight: bold } /* Name.Class */ +.no { color: #333333 } /* Name.Constant */ +.nd { color: #333333 } /* Name.Decorator */ +.ni { color: #333333 } /* Name.Entity */ +.ne { color: #333333 } /* Name.Exception */ +.nf { color: #0092FF } /* Name.Function */ +.nl { color: #333333 } /* Name.Label */ +.nn { color: #333333 } /* Name.Namespace */ +.nx { color: #333333 } /* Name.Other */ +.py { color: #333333 } /* Name.Property */ +.nt { color: #333333 } /* Name.Tag */ +.nv { color: #333333 } /* Name.Variable */ +.ow { color: #777777 } /* Operator.Word */ +.pm { color: #777777 } /* Punctuation.Marker */ +.w { color: #777777 } /* Text.Whitespace */ +.mb { color: #777777 } /* Literal.Number.Bin */ +.mf { color: #777777 } /* Literal.Number.Float */ +.mh { color: #777777 } /* Literal.Number.Hex */ +.mi { color: #777777 } /* Literal.Number.Integer */ +.mo { color: #777777 } /* Literal.Number.Oct */ +.sa { color: #833FE3; background-color: #eeeeee } /* Literal.String.Affix */ +.sb { color: #833FE3; background-color: #eeeeee } /* Literal.String.Backtick */ +.sc { color: #833FE3; background-color: #eeeeee } /* Literal.String.Char */ +.dl { color: #833FE3; background-color: #eeeeee } /* Literal.String.Delimiter */ +.sd { color: #833FE3; background-color: #eeeeee } /* Literal.String.Doc */ +.s2 { color: #833FE3; background-color: #eeeeee } /* Literal.String.Double */ +.se { color: #833FE3; background-color: #eeeeee } /* Literal.String.Escape */ +.sh { color: #833FE3; background-color: #eeeeee } /* Literal.String.Heredoc */ +.si { color: #833FE3; background-color: #eeeeee } /* Literal.String.Interpol */ +.sx { color: #833FE3; background-color: #eeeeee } /* Literal.String.Other */ +.sr { color: #833FE3; background-color: #eeeeee } /* Literal.String.Regex */ +.s1 { color: #833FE3; background-color: #eeeeee } /* Literal.String.Single */ +.ss { color: #833FE3; background-color: #eeeeee } /* Literal.String.Symbol */ +.bp { color: #333333 } /* Name.Builtin.Pseudo */ +.fm { color: #0092FF } /* Name.Function.Magic */ +.vc { color: #333333 } /* Name.Variable.Class */ +.vg { color: #333333 } /* Name.Variable.Global */ +.vi { color: #333333 } /* Name.Variable.Instance */ +.vm { color: #333333 } /* Name.Variable.Magic */ +.il { color: #777777 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/guide/public/assets/docs.js b/guide/public/assets/docs.js new file mode 100644 index 00000000..a3496e68 --- /dev/null +++ b/guide/public/assets/docs.js @@ -0,0 +1,164 @@ +let burger; +let menu; +let menuLinks; +let menuGroups; +function trigger(el, eventType) { + if (typeof eventType === "string" && typeof el[eventType] === "function") { + el[eventType](); + } else { + const event = + typeof eventType === "string" + ? new Event(eventType, { bubbles: true }) + : eventType; + el.dispatchEvent(event); + } +} +function refreshBurger() { + burger = document.querySelector(".burger"); +} +function refreshMenu() { + menu = document.querySelector(".menu"); +} +function refreshMenuLinks() { + menuLinks = document.querySelectorAll(".menu a[hx-get]"); +} +function refreshMenuGroups() { + menuGroups = document.querySelectorAll(".menu li.is-group a:not([href])"); +} +function hasActiveLink(element) { + if (!element) { + return false; + } + let nextElementSibling = element.nextElementSibling; + let menuList = null; + while (!menuList && nextElementSibling) { + if (nextElementSibling.classList.contains("menu-list")) { + menuList = nextElementSibling; + } else { + nextElementSibling = nextElementSibling.nextElementSibling; + } + } + if (menuList) { + const siblinkLinks = [...menuList.querySelectorAll("a")]; + return siblinkLinks.some((el) => el.classList.contains("is-active")); + } + return false; +} +function initBurger() { + if (!burger || !menu) { + return; + } + burger.addEventListener("click", (e) => { + e.preventDefault(); + burger.classList.toggle("is-active"); + menu.classList.toggle("is-active"); + }); +} +function initMenuGroups() { + menuGroups.forEach((el) => { + el.addEventListener("click", (e) => { + e.preventDefault(); + menuGroups.forEach((g) => { + if (g === el) { + g.classList.toggle("is-open"); + } else { + g.classList.remove("is-open"); + } + }); + }); + }); +} +function initDetails() { + const detailsElements = document.querySelectorAll(".details"); + detailsElements.forEach((element) => { + element.addEventListener("click", function () { + this.classList.toggle("is-active"); + }); + }); +} +function initTabs() { + const tabsElements = document.querySelectorAll(".tabs"); + + tabsElements.forEach((element) => { + const tabTriggers = element.querySelectorAll("li>a"); + const tabs = element.querySelectorAll("li"); + tabTriggers.forEach((trigger) => { + trigger.addEventListener("click", function () { + tabs.forEach((tab) => { + tab.classList.remove("is-active"); + }); + const content = this.nextElementSibling; + // this.parentElement.querySelector(".tab-content"); + this.parentElement.classList.add("is-active"); + const tabDisplay = + this.parentElement.parentElement.parentElement + .nextElementSibling; + tabDisplay.innerHTML = content.innerHTML; + }); + }); + const firstTabTrigger = tabTriggers[0]; + firstTabTrigger.click(); + }); +} +function initSearch() { + const searchInput = document.querySelector("#search"); + searchInput.addEventListener("keyup", () => { + const value = searchInput.value; + searchInput.setAttribute( + "hx-vals", + `{"q": "${encodeURIComponent(value)}"}` + ); + }); +} +function setMenuLinkActive(href) { + burger.classList.remove("is-active"); + menu.classList.remove("is-active"); + menuLinks.forEach((element) => { + if (element.attributes.href.value === href) { + element.classList.add("is-active"); + } else { + element.classList.remove("is-active"); + } + }); + menuGroups.forEach((g) => { + if (hasActiveLink(g)) { + g.classList.add("is-open"); + } else { + g.classList.remove("is-open"); + } + }); +} +function copyCode(button) { + const codeBlock = button.parentElement; + const code = codeBlock.querySelector("code").innerText; + const textarea = document.createElement("textarea"); + textarea.value = code; + document.body.appendChild(textarea); + textarea.select(); + document.execCommand("copy"); + document.body.removeChild(textarea); + + button.classList.add("clicked"); // Add class for animation + + setTimeout(() => { + button.classList.remove("clicked"); // Remove class to revert to original state + }, 1500); +} +function init() { + refreshBurger(); + refreshMenu(); + refreshMenuLinks(); + refreshMenuGroups(); + initBurger(); + initMenuGroups(); + initDetails(); + initTabs(); + initSearch(); +} + +function afterSwap(e) { + setMenuLinkActive(e.detail.pathInfo.requestPath); + window.scrollTo(0, 0); +} +document.addEventListener("DOMContentLoaded", init); +document.body.addEventListener("htmx:afterSwap", afterSwap); diff --git a/guide/public/assets/images/directory-view.png b/guide/public/assets/images/directory-view.png new file mode 100644 index 0000000000000000000000000000000000000000..31fd1a28e73f5d96a5613963c275a5166d6f23f9 GIT binary patch literal 47234 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 literal 0 HcmV?d00001 diff --git a/guide/public/assets/images/error-display-html-debug.png b/guide/public/assets/images/error-display-html-debug.png new file mode 100644 index 0000000000000000000000000000000000000000..f2fa212fe77112c6ae04a38fc20897d03f3c67cb GIT binary patch literal 156952 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

2P|W#>=2K$eJZb)g^Gb=89r>Jr%y}DLB1d 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 R)~MjJYdVJ7xtDMK^`AZt@e2R| literal 0 HcmV?d00001 diff --git a/guide/public/assets/images/error-display-html-prod.png b/guide/public/assets/images/error-display-html-prod.png new file mode 100644 index 0000000000000000000000000000000000000000..3f6cdf553e4b0bce6227e2c292736435b26a2267 GIT binary patch literal 76580 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 z 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

d=YjWYf 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 L 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 w=~FvTfEK`UucaJ zS%jl#teEEl>JQZLUSv!-I*ezuSGm_>W5?#}-jqCer?GZaM7Fz9CV?>V9Yj10BkSPn z270gjb7%pM!88g-`Br7IGl#+((d!tTPi!=V{ax1nF3|*0K9~`NCR26!^pq?Vj1|k8K)G`=djX1?g(1PcC)=joOw8@KTvv;HF@_w zv_AUkN$f!3U=ZdpA$G`FY!xLh0MPIObJ1PAZys=b5I1Z!yj#-kDd(CUTmL zOP&W@ucARX6?7+0D9yuL8m$~kDFMRk>mpxnL=FY~Zsu(*3La3!ruVXmC0QP>YwD7T zB55i#bxcjIjW4yb>Va9Mw6Z5p@GeW}`9-A>o!S-nph=OgGbe zTRpiD-tk?navp;%F;YH}M8kgc9`rMqK4z3kt9hRMYxXR!k4#gW^y$CsTzbU3U z(=cwoJ~d)iW@y#$XXbwL`HF(Rgl`w6=AGXvzmihbjLl6yK3C);i115oXR3J7C+a^8 zi`j`EkF;G7H}q@9JbI+2rKiWn@Q5>CALOIETvrha(_nISbalMqzk9A(Ac?FDvPL$F6FT$1wZUI#ov_;7 z4BSGI3MK)17GV%zWR_3|l$Pg2y>y%t$6=2zTUtke2u9n72N79m_F%p-M#HU)!&mmc zR}^G4!MyMG+2#!SiC%T%P3onm^rXw=+kiWdZ`#>CT5!bShK+kvxc+h$+T10r{J!(_ zjhPT7JbP+WcBh(uX`T(%y~6RB?nmE7M6hEM!Jqn51U-}MaN(T4G1cV#_kL&pR@c+XAW)uol zkTbfgii7rY`|8ulyvcJqIaJ45=hKNTsMg557meFE5Zz2-u(P3dk7c&}XgGYMmfPyg>Ym{~`q&(6b5E`j_vqQ`Y48Pl(__n0 zj)&S@)kgy@_+2&_MI4Vlt2&Rx?w;1GM%I}IHOJAN4xKOm)zKfuHFR_?cz7Tgk`b7{ZTXM+ynbr(um2JgB6{BU_c29~ z7w4=0c1e2h%p&4uj=1BJfezI&?J_AL^gS;ue*#J9mn8-nhMhj7?37iS_5l9*8@w zzSO^{dPwq;N-A7wj=Sw>38d0k3lu`Ldw#ViQ8awRVL)`AA93%7rS-t%(|fz->n-!M z07fK$vcha>Wvxf`x9_G+T*ANKHX7qnWums8=C0pJzW)a<6j4WsMqAnObsWl{!#`*d zQ4djgeWC76`Pwsz##py+1a;WhHKRuwJ=3sbQ+MkZBH)J@j{r#Ul+c0vwB~V(;@>VR zevtz|AbtOjFL}*vz-lH=fth=hmv!ya&n4jJuNp2FZw4IW{UnNHv>TtmkI@uG$eZUu z7>`EeubL&%(HC4@SA@}qMit{d9*%MVe@60B)3pe51FD1({o=OV#o(yf^JK3-i!idP zW@tq>{PgC`$@SuNp@o&5qOs75>1(-%`+?=phI%rxV;gQ*sGeNe+ni$=P=6(HFnS6; zchzZoQopfz`fAgX>&?-sU?3jc!30<6pG*Jq%!HlfzOiEq*6#h<@@bPyWu4b5`prT$W`_)^cXn2BC2d5YV>kD;RS z%⁡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 z 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 E03%vp0{{R3 literal 0 HcmV?d00001 diff --git a/guide/public/assets/images/error-extra-prod.png b/guide/public/assets/images/error-extra-prod.png new file mode 100644 index 0000000000000000000000000000000000000000..b835d67fd7638c34be569703231aeffe2c1b737d GIT binary patch literal 73041 zcmd42bx<5z^e#%0LqbS!3m)7D_W;QRNN{%x?(QDJ2@u>N$l&fixV!rV9ei*bhIx~7 z-ml*M|5m+wcU4!f+Fjkfdau=ceS58Mhbt?7!onoOL_%5)JL29E_)^ z9_svvMAYe}(`Ox5G&JnqzsHkAHf(Ya;My7mxth_$v7$rJXy2eH2gK2cF=A@{J{Mf_Nnl2!TuLHJAD3>=>v zjq*;6Z$9p_l;jvc`}=BCdpodK0{Blvdr$OH;Q4>Dcc|U#|D<#5r8oac+mtoj|4D1*5n_5;mS4%R%ya4`KzwmrRmV_)@navs&( zNe!m^BW7RHNKOVMT2>*4j3qXNf^ZoI#2&kzh#mz=_)T{_f<>v)zK!W9F1#y(4_{;AZgR1Bgm<$T=o(azr6BCqD_;onxge9*{+Mc|{YM`6zqN0o8AZ)l7XjE~GzZ&7ZdK zX%AJRlJKj_s~p#&4*Ol)o+%!K3&ddHf-P&nJnshs7_-i9dv0JSR0T1ZPk%vz)~elju#OHCuIFozN1hnC0W!iZ0+*+H*VBDH9<(xu zClF!nDzsy1^_TdGm^I4t2!_n^VBw)=2@@z!%4zG1>j1)Sb0^(OMAiCk37>ICQ?~oH z(ugR@E~1s%Ltj^=G^C>9DV{CMSp=BT?qpJ<@{f+}7Y9iF{8=8J1dI+Ig)wV0TasBk z3=eG8cnS$uEi2HHQ<4jM^%U(l;a{t(7TE}_tuS-L9PQUwZVPvAi9H(l$1}rOxvf>+ ziI2&o@Tk5S+fpkFVqv@4E$HtncpTtKju=sl9(&9ZOww~=yqrJDY&@qvEl=>h=FwsZ zLY$wTUdJ;m%unP_=K7KtP|?^)>n7!v@NjU|9;(7`r`(n1oL0kJw;;%YQVN9Wn;0Lx6b<~t{yElbAtV~ z42mTZ{31aPPXhEP$*;5nPR=emI|aXSQm+Zs*=ehdeUAz<5CD6@zZBco<{wN(qjEbgM5x_eF}weOk0xl6|5FBr zPsfzzH(cO9nC+LzbMte?ZVfpSM;X6hWNt6`=!$;!3O8zN?F3 z_2uJQ3UjJK^`eT)ZU;$FTX1J`j6rlI>58t6tJKHVVq2wEuiMoHiNS>x#PSBesUC5M zzG1N1+;b|-*KP0W!&NF1p;>L$IM`l0?y%`^!E0EcgXqFFzuO4J0<{ku?0xmHk@$lx zM91m^_ME6w)6+AxEinty_tqT?mUa609_mPUuoVN z>}l5SP{Uzf=>N36^f{Z{nGJE)oQtr@RuwoA_Pp7Fb3XVXverbJErNnIb?Rk``Syf8 z;Zh5h0gi@XH?W7_*rEWxY|Ddsi^Ijs*CG-X6_?|L>_H$W7h=p8BKS$iP@Fe z3u_~-yI1@g@c{2hoz$HDwt@>7`dv14sS-&5-;X+ej((&sA{DY0Ox!1@a=Oo_%uibP zcpjfTaUrctkgL7maZnKNnbm=D8hEnd;xfXwB0{?_7;)f{+Ht&UKy73sF(C?VkZ%-p z;J#QU-+!`bPWTfS81`HGaH=#$-}nB(z4Or0fy84x{%(b~WW{?pNlh@j{qj}7*2U$0 zPGV2G^>h$!%XP}khss7bwcoS%M_7K)*1}L#QtE%uzP15dxzXO!=oUuiCDLA8H^?#5 z<>;?<{3Kr)%_&_k-pU5)_5L$vdD1wu@bk*k6`SNRtTFQ1MJYBb;NZ4ZZv9l)KSxSMCN?c?`_01v78LIO=*V#8cwzNEL z|0mf!ES&;Ks5dGc;MW$reQ^=mNX_J8bH!fXs<>>Uqc`oEC1)}|LNG!SNKs{`AIX_K zPkr{dovvPn7o%z~d^7v)CF4WTmkD1gXUr>h-J9&d&Vs&(99}@68Rj^|cqgFr`B_W_ z#p|)Msp;z0p1QT?t6!hA{^)4EOPH@W3iOl9Zo%}HfFxciEbpb)ovb6LA5=yROtpa+ zm5)^hP))Z<*4yLC3ftL|P?ZsYL7F0Y$FNwiObi@9RXeXBiB_s9V|(xRwzsVNT1`dn z#R}^Gv+JfyW^2raD>&G7Lj|4pRN;%Un;ZiP4iizKW1|;1Ju~$bEgMZ)Uj}C{(3zA_ zPMx##(;qR0bs<;kU?ym*v;m+{uTU~ z-&L9oa;Y;!mNPA^lrW%6cspIWhJ3HkX}$hILdm5@whS&387X&~Yq+?nv!cCj^0;)V zDQWhfP~3Xt#%C0&xE`hrDp~iw+P8mp$fFWK1yE9*i_&YL>S!|vWvmV5XiYyonLaR| zYPV3R9dEC-uhi2%O^$<$GxKG+{qg#^5h*(U31(a8bhK`L#7GyAu|)Q zdZ}flM)9`2_62Q<2<5%oVY?StQL*x6p+s#^7@3lYlSy>2%`Q|+Nnf1DhvSHZy8g8i zGXtesNm3vcM539SbNFV+enOonFNyLwKxnyPql`xGq<1(;d~M{)+9w8(X=g(rN|lO? zGZ}FZm}{DJ1$4cpX%l(YkgY${?BmfpQYhF{TPo;a${U~->d_zn$?;sa{L5i$r_*)? zIsu1wI9}x@k6Zvw`HJh>MtDOBODqjHDFqECqbUwWIz*R&dvD*rP$+nPHgQ!1_cXG=6W_YKDkwm^?2g#a-&h4ZC}jm#_2-MZ24 zhWM_I-^w9=II^t+as2IvthhskqI&Zbe#GTpwz>Szwgr|$5JU-#9?ZkD5>wRsc9_*Qt;4vHMjLJ^5^6~ja9{rSa%PM9tH;#66YTp1|M1!((_+H7X6n*H5M%PP8FZiw&;d> z*S4;w9>(dX_*wC*xq_G{)R<0!UZq`SWx_P}xtO%JZNAuJDTJB?jPfm@wXhwyxv#?YQ}F?NUbhYq zV`IVE`rHjMiL$CW9t1e|blLfd%7n(XETv2-vRU>N;#XEq&p%+W7z4Cs`e>qedz+H)V?P7RqN z$pTw%1i+ZVrr-L)K2+i;R4pOcTk4!I-fexLE54|u6j((h^x<`vN;vP7Y36=Km@?X5 z$(X#Pc`DWl#<7PCt7LWeUmaGz`CO zFAW>&=qPyDD_wc?&!V1hsv{Y|5%PXft;=r>{Jc1q7&va=v!@~5 zCF&v(;y1|fG`6TLpv3#uB3kS~WlF2jZsb*e5bhcDFg>P?u+(GETCe=KQo;7vzP%vr zd7vP#QI@ygm$2M86B*w!4Bdr*uTdfji?gEXNfhoEzT|tZt}EXI#cG6swoBJA{Y=_A z=`|5D6yQ|A@Vz>?DoxG;3}^z@+%~t1XDr{D4rfWrHkW@iq24S^f}@;r$yAdvDx$qr9aq%bU!L^D)i2Eds!pE2R6bb{_JRJq)BT zt8K+DCmAu_$Ua=^v^%q7P`GZs1EX2Lkogs)s;Zigp<*{Ppcwi}xc>T=(FZxJ>lHOU z#n3o153v>XOFGkT&PQJWpM+OU^~CBAhJ?>7l`C#i6@mcxQdee->BR&$^jIxhJ4sbt zGZ&*W>*GWLCTWaES(|zlG6QE}{v;qy!-P+xifpnK@bX>TftMi{V~|;}!Mf8agIaB= z|HUQ&n=6abiLd#~^c9cE;Z_s|TGp|x?gBLSya8G-T_62s45$tq15JKUlk;tMEOmXY zF;TrIr;8mClx@iMmJIAs;U7Gx;K@15UM)>@TdVaA;l=%MXRf-1`Eua4mLS~4xo-nDx20pO>M>!#3o+iFZ= z>`a?UNezX>&0f-d;X7Y5(+bX`nc9J}i|h{AJTcnW)enF1B2|lrU}(Y9YFN2w_N(bU zh(TjYEM1zA+nj_)QPCj>yl+LVfCjJzA3Drfr&J)bQRP&_pb7GZZcuX0O^^2ZzI&D6 zW@l%^P9F=R$eQM}&z%@)hHWv;EyW@>+x(hb*O9y%6AmE+z?XA2q;KXcwH7)jM;pN9 zCc(QIpgJ=CvJcSJ8y}9f$9`$Co5#ThE(fz-I`JUfZpJq6i{`!2rqv96pk$w?rn8@^ zE5Q>fl)1s%!52ADD zYmp1^hpgxeTZJ@SfjLBlCnHLIU)bY-jP%u=pBlX4{uB1F-{(>23Y4mFdm@L@9r4iP zP3c>r()~Q@;H=_~ILkR2+Bagn+4e%G5+H&elQt8ibSTK9ne$Z5EP{@U-?7(n-3u(s z>60eszQWbd0Yh#*oao=s1r@5dXXWI4`>^JNRZbDgw;g{oEy_~a-Mso1{H1!fXZ3qg z|BRzqnLK`$??~OA9I(xZQGxV}UG7BdO~vT&2*lXqS74ZWpm%uw-Uknq)9%IxzK>H! zCnQp~vQv#=I`h0q@JV%gxt`S(7cFf>6jbOquN`j|#GEdAZO4A)R=>(FJJJ-3eN3~$ zk|E~-hQ{05TCW&x)u`bYE)I`NN4^wtxq0>x12Qy!6?qAx%#I`$8QJN{p#b-;+|xBN zd^VIv;-v`i<5j8rtWcORl!E`B{l}UD{4Ja&#{04JxTooCO;GgEy?y___pt9m>q)kF zFr&H^6bq$Bbvlw-M zU-!Gs(9;7yW%^WFQZlJ8eU|CUB2&y>URV$Z0gRiQYc%1N(%!PN(ng@>sky6z5)$87 zRSm5zyf}o(N*xH3&EmSgtXPuGinQL1&t_l9Mj)Qd!*}I7$nq(#EZZ-e)|2_a3wH&z z`ZuC8C^X>3@7hbTq2@Q^fWjlfgn&f*#oN86+zEO?Mv+(=8$Vqcomj^FKj;8nfd(rx zZUPd55!~)VD=BlSh(R+`Ss4R`_th+Y;(N4i{3Efo(C8{hl~0LE^rX(zkmo_*7)LWe ztx7XdR(h(&`6COF22q5ZqGF z8MA;eck?0%4NG%ALGJAA9E)!I@pj;Hz*U;0f!YsRqlm(?$G^|ccH`mR^^{0#s%E)opX%_r7 zgzTc*_HsF0q~k!pZOKIf-)t~ZUYDfmrOG7J^$m*T}l#&x?2K2+E>573Cg!YxLMyaKbne@?>pa(uaxB$vP2b#`806V zA6ht>8EFSZ{GR2TH4Bt^HOEiL0^rU2GEAkbpq9xfBUSuEb3wUKn2|T{lD^lxz|uJ( zHv%)}SKMax;Q7Q4z5dw;7f09wU85MpPkzuOY|DY<8n17b%PzV4c zJ%gFjfrY`|-aKOa#u}!PoUmK zg*O>P>ZWu-bE@Rjq^=!*nY{e1x+C>O_SnHH^IabonQ&0c=n*PLzf{(CGZBPL* zqv{Vfmdp-Ui#e*gogSvy8s1-ne5aSaV>`-5o|t+u(Wmq$rw3bE{RKB$n5!Ijdv{dX_J z1rBmzIH|SyU7PGzDqJfExPp|w`(V8`8@MAD$W=L*Ut1|oTF=hdOkZ}7*Vzm$g!n6W ziCP&9&}6Dx0~gJ}TGLS@3BdFx{+Q7$HUdqJEHSu>6qg54vxvBN%{g5gs1Yz%+pj8J zy~-~9(7`0VU#zXISNz%VD6ReeGOv@f7^Ncc{5dA_&1hjGjA!qFI4OjO$$EAgm_Gd4 z8-51H=0Z3wkkd#$2yi8Aquk(brvWKST`(T&_T903EqOZidVxHoK3Bc% zTHN#5+G-rwoy_dAdqZ_~;}kx)?Kn-syq=yLsmoV|? zJTG^-=3^Ctr|Jy0-si%qpvU)1SYoH($72T45+?l=m7Un0Ss=6%+qsR0VO3S30DS-YY5`rL zCcy+=9O<(#W)z~OUU_q_Ge6w?M9_f*(#m&scqk~2k9gwBluE)U$0kV5p9_jxgj{Ga z8q?zgZ-<95(ZT7~?jsWY9?JO`3@g+LxpKE7fU|b*3%cSt*aRuZt0WWRIT+Y17sQ3w z=WlGvp52IxYWD3DOJqoh7&`)gY7i{8TZ+g)V86swX28CN=I2%<8UoyP}yG*HBJU5e_aygko zyc&2-!RLK7)t+~F!O~qIE*yAqp%vvIzj&PfXu=Vi%DZ9>rIud&GPyXeJNwBI_9nzw z2*^^*OcFqh>F%p^VwA1*FmvyqL$zSAwHHE193!AHzCs7G5eVoSe6F5xc*P_|nQ46h zf6S>oz0zEUORP2DvFi2t%ujb*o!4gk_PAk~DNmI1^DGFx$kYy~t$yXZPqIqBx$lmX-vD?V23!=cOT)3-OuSNgK@FpDV5ZWb09*@-p#lCQeHE6 z#^We~G?G!b-@t{VG=o_=7n$1MaN{LGlu;Xb+gt<$69Pf$kLDW zuDg1R23Xw872YOQbQR0`MCrQMs7GKZnUV98bNOqphP!5|=zDkw3<$y`eADh-Z(c3< zgS5DapfJDljZ*v7>~;}8POu)W4CLuAiTW91;?z}>6f&iqqjO6>UG;8ouAj!|UZJuY? zoGVbKnYf994lLOci1ATPG&;FVuE9cuC!kn@l_0=p2i!0K{VB3%w(;027%^)-Q*YoO z9Ahb%?K5K5zwQH4`CFP=fmF7`ZkxfWNQ>@Z@v3T|*bi7H^tfY(wB(dDF zT)Z>i@k()RZ}a2~pwO<8jy-mDi>D~pC^lXicT`5vT?!L&$2>efb{m4Hi_G!R>=-ys zjI8twT-aW_iEJx&_bztmHgx;9x63X^fljJDCFDE!73H-%se` zCR&jRswCoE+EZ)ULCrfWUvAHFwfGfb8xzVE;g-e^?rk336%Qymdd8$EBa z%yPmuaW8|4*<(Y*1bv!4yGY~H?&F}5R@FiQG_+q@O}-dtoxH~mMlnocAM5M%jYt-l zLmbU49W#<`nDR~xM^Y!LD?1a4McRBn&aI34KU{#zp3b6#qt(%%u(vpc_Pp?$ ztiwy1O1eh+quJRfrVANu7d-5Y{BrDgmIacbUXaz+FN>4z6X!1;c^*TPU`=oVakcKS z8PlzqdJ%U=&}Y1EkVN~Til65jFN|WGvZWV!Wo}cHg@D{n|e?9Fbmv_}XtO zFzy!am*Mc1=PdO=np@*aW?Xdja z(vugAIGKTySI@x4h2qbA>v#!+j0~zD^d*N#GoxC;etSh=MetzRTERkRhrktmfR;cM z^#gP+t|P%aCG5q`cZQ&m^A?Vkn{Rhs#`C{q^eWMv`x_9?-5hi9uJ-o2bMgdyb`@k2 zFKh-9QsJ<6bF#}f686iV;m?a3lO}|5Z;ikh`e`@wu^&mOya)^JttG79C--+(t+ZNT z-)?C;tz*3btXUo|;*BVYJ?4IyF1CzmsK+-D{F&+})U?;ML(I;!cbflg2HB2KnJTjd ze~9Lo&7-DHk+9otAlav&p+_v;bH_J|z%Ayg_a$5|aa#*=tI}5ruri#*k)l~!-ZscB zCEAhLnE}t@$Ob&LuazoTSmf&Nq-baXB&a&Kr_#@#D<*=Mg9CAa8?RdJt`}`#wN-1> zTB@wgPRjW8>o2k#>NMV(RL(WzDSb+OC_YOYZ*>k(6%!}-v?x2q#HlMpSP>f4`?!Cw zkvF-<$;6A8rg9r}x4*EwXqESreaKqJNqArH!~gfPhsM}e*>=-_t?MBwU&iV6b}cyP z;1w!7#W+DwZj2Vdsu)L1uJLFA39DEtFH8j9Z>`|Ockq62*{oaKqt+{;-b&_pgVu@U z|CeKOTYgF?`7YOi*S{>0Yro)PYdVP!MP0ci{tLs124r~RHn&u3WT{gJcMAFj`alnh z6?tfHgDb=~7c+y$Zi5ugmYZ%q95_-$HLuRz-UeN+LT(As&>jQ7wEZQsJSZ~HS^TiX z=GqY#Z}+-(_gB*UQ|aqjRmTH+f~7}fhN zl>btfE+KQl&z;84?MAFsQm#}_ne65AU-*!+40S2|M_BuseUd!VuYPT>qG_>?bk%8| zXj6sI<5AM_w=x15B5=D;r!#_WYF*fh_l4F>q5XQ!NbB!*fU|Yy!kD;o!O?hfkAV3- zuznsrD5h-J#Wb55S)1Jmt1ulYs}CG=I8)YX+7@MFI`TDe`!?nN{IS;F%ioX`_N_8Z ztnugSEq&{$-ltMeJ!dPMTB8#j`oClFzz$wk0t*?}_!=&5#i?nPg$dmR?_kiVk3I<% zu^cG2Q4Xql%uT?pPI6`#9ZuZx{IV7t#-nO;*GpYlrtM#wyPqZ(Q0D?%>S}VD8U0Pb zi<}hpyv8Bu3S_2!xb6+#c=Gtz92|3}Ls?r=B?M*xFwk~FBx;$-Z3Pv3dISHeaK61@ zU;7D-L&HLng_Ii z-Mc3lJabbqPw3z~>-EWIwL+lZGm8Z`Rn=Sl*vCsb#{A#hT!oX*d?xN)@wBf|0R`3m zfbT%dQFOsWRKdn#jE1z7_d=TZ@uPV5sO0A2+u(%GRhy_l3vmm&$}$L?=OP`uOV*`^ zSJgx!H1v6g-}Rqstj5kD$Dz|yLy}C1&+XqdZN(i%qMIA)F`;S0nBZoI`&`#9^uA4= zHckUy3A?n|47cB)I=4D+_0PtXXC;Tfm4yG*pVYOCO$U-J z9>`|rnura6JqLoW^`UCNq8S{sz5A57OK7NH#?J3g7IQ-`Ktix1Z+;PXTisYWp~IQ2 z$U?xX-!?f_;;$jKg(+UE)f`{&llJncSxnaG5e!ey7O$)MyoHUavmu>?8jG>}T@HJn z*OWGnC1*yCVqpYNsSUv!yIbVA6jYfBNlB@4Y(+&y8l@VLrdV$_y%(X;11V_Yxh^x-0J0>bG;Ulw@v!4-shVN%8SXj+p~3c znnn3#B`SH*Dn0!iA|8iReX>S(=@r8n%-Q6Y69&!~STW`6wsY+8d-sEd1vPjGSXp?g zl6uwM_vmB;E-oTY!>z!sJ~LgSnU|$gdQB{KYP+ z{XQ-&JvEK+f@N`F?C#cs>nTci{`HE3pG~sohM3E%t#OGt;g!m)--0 zh1>q0sj(Hwoqs7~&ZRG2lk;E2h!@zHE42@R(2XGN#)m^pJWNtGTXbq$bP{d;SAV7- zqxj37PiPC-D)TDbHAVdkOCSd%cbS7zqzi;DU=}|Yw~$&OKPk6D=oiyf#5Bm#<;I|MB9wfLQ;rW zFZ677HQj!w5pOE1A8M_5Kj)kPxg<=z9Ed zSeN-Nb=o_t{;Yu-QdOT5JxHF7#JqAXr*px0_Ja zFwpg3Tbwoj9r7$E@ujGS5ITuL`Qd|vsI~gh+jp7L_RB;w^YTjSQ?%!=Ut>j(F)h`- zN8&I@1)i-4Iz~QcP#eC&y4p6Y<3^ELvQ(JJpNZ21RXEIysj6T1Z$bw=#lkq~daGrW z=3kRFBg}1dauVbM>jNWQM+GOm``aYyoq|V_Bd~;_E)pW;t8Rj4Oa)xmBZyb=_GQ??zBD z!9thhE%i&-%#149?{CU@NC1PD}MG|16{O#@#GMy$W|}7vVX%0 zj#9yQJI|IAyMA54=IS9#!_=6;smqaCVX@L)?}wGQor-M)uKy4eG;hD&l3}GEhHrB~ zKCe3d^Zr(tTTOt>rFrR2p_|Z1sxj*uu}s)4ZYJYye&gn}m_t(^4n@fYN23W3_3;W4 zSiljtX*=6!V>|V`Anj>7DarNl8lBJwcK!(Q@vDb+uhtK9fwG+F0?XcGjE(;k2PvJo z>t2#iRc2NTWD@SWBSxiSaYZ4T&0U(jIzOu??L>a1ziId>0=aX z8~ELIO^WF+G*JxYdxpa9h#ebQ^`16=-&);a;VH+gW^nXq!ZHEV-BF#1`KQ|BXcrzy z>c2){Js=tE*RKM~c6t^(If(>DSXL;)sq25@CGWL(uk<{yG$o`d83=p^FJSE;s9WG9lh3EWmo=Br*U!Dub|68hTeNQmkqCGVo=c zL*z-juDYA8tac&1=D0K@#r70~MrT8CL0-p+CSMz-7opXDTo))HfAYKVJ%;h7|MggE z10r>{*D6D3Qt&g6I+Q#qZv3(h@m577oHb2B+{dm$V@k*naMibqM~CwdA^J2082Tjc zg8-3eglwjT{j!E>xRA)Hw|3m@XLknw3k!F3W+02eBoowUIQBvQ=g9mIP7%&pd^{j? zaGHhv${Br-f*+KULdy*jgg?tw&oliSVc;k7O(D<;~&NGYuZk z7%PRL=?Tb-O#Jzin$5w6$3)WgK#7FkQ~85{N`a>m$nn9y z^Y*iUv&&NiFh8Cdyzz(B|6us_9r4}`#jJ|KJ^NB`Q15vM zBw^6)JWFim{5xto)U=-sT+2x`D3v=78^IQGo&MNj>YlW)B$qS2lXL6-+m+c<$`_D@$V^E4^AwBeB)N#uRan~uVtrObWT+!Ad>7~UDczs(y(<&p4F z@C~ZoC!rBsOpbx8o=GGZTP@C2??e zwYkz2s&2lt@@Kq0(YUGW4sEW4i6w|L0c{t@vrNl19?F>OlV+eI!(~6l7+WEMj|z<< ze_inp(s1s&*uu+t{OPWQN7!!BQF?A!Luv#OrJt^>&U&`4Cq1*{Hmy=6GLBT!h#_^j zlkuKHpU)Ax6~tp3Jc1=EW?Oe#SuW>Gt|7x6NYJLcYcUtOX8!x1r{CoLawVhEW;vIxSFNXD2PWuVRHZ9r6Q)fwSa{Y zYkmkaY&|0U`*vtuE+PP;Dp<`)qft+2K(`&UMWu$jV&v0U2QDiwS<)s83V^F+ zj)%eV<8_4=<4x6`jgL{|Q@P)EZWkoh_RcznO;1jtz5dzOwg{A|D${ptV>v|<56Ff%dvAj+Kf>ko30=JN<*7lurL18@~ z#bvVzK$CS*Qq~A&$+49>+{{)3K3=j5hHZah>)iA5V04t>QON_1lqiNab<2&ImoF$1 zw`hlteif?&x732yv)vpo=0AC>IZcsKLfPGJh1JlLqr3xMPQFJ@ccp0ZlGkj*Qrput zN$`OwmpDp_j{40#S85+xDblyw{daXuq3#VkoV4inNT_E^HUlgI$f?m zlcxBHS`o(W)PbJaXmoMe0p{#)3>}N3D-$}cMmq@Pbc=~I@Rj;Hea^v5^@Ue@+q#oG zY4Lu|EyuUahdPWq4}++R2$i6dk+!hh*yBHbJuJx%W4!Sbuj5F)EcP?71c7WK;CZEP zP(i-G97n#LppBT0M;ZfK-n4j4ddi+(K%bUIS z%fL^w{GzUyLnAWuxna3@Z78*WRjt!!W+v=re^IX%8PhxYY%mw&!)2XHU@KGN>Rk3F z+XA2cf}!Ykgx;+Z*pvn@5J}^LIUmRv)z2gMs&QYEBu5G4bAZ zkm3`9W?}I&anZ$Y5exQHFqq z+i?~Alh$wF>Skj(H@Z67R-F@#Pw8us5U+PT0eHoLI~Xu!&9RllILGED7+hhm-1ODs zq*RPe37q`0pRioLv{}LOP?LDq!onizl0WF@f^2#^ry8qaOPl6#9H)^02ZKTbW-z8V zfwfwMtZa>=jDifu;oG6&ns0`e)J(9ysk*O7UX8e@+B=rU+nuPkGV9XDceh()HyN*^ zPv;V(6)KlN8B@I!L+%9Tixx#zk4?FnWCASQIwJol`;FOv@(oJT6!{}03B`9)5_-*& ztbT9Yl5_`j1f0pVTrRhE-}}!W8_cbI7MZGE(pgHJTGKU<^RN-_*x#f46q+DZ=t^26 z1`zU3IFVJbZAh#39jMb>o=&Dp&P3Qld;MO+J8=r;NEp>n}Xa9UW#Znx0 zvf_=b{;6zC+QIq5+$29~t2@y@g0rcwU%F2NIANIOAok3BSP*0-Te?`Jon#fbvPQUz z7+K)CalEx4&>}$rA*bT0DTqK@nnJ({B57Z_+ecPEt`Vx2+FW#pCI9mrY4P%azi5O` zYDB?VxFd_R7Vg37Tyj8RG@->)3b=3^No#)f_j|ULcN#OyFjVz#_0a?0)v|J(Z%#ZF762 z3?J1Je*zIwNTz@2pM&b4wt4xr1oX)XOp)<9YH~>Ra9so|epN@u(2O&xsFq^fjKyRdP4FK>MN zC0_rUifSexDb+65Wb4F1;#yb4L**f4EIpy2f=wMSDX|^d!`RzjonJAkk-Fh}0PIvs z35_(5fZC&Qz~OVh%FgeT!zh5%L_XtL<#6UGle8f5>=PwY`Hce$2;26Al8QF><=sI> zQ(03AVf5hTs0D3?;yRo8b@eni9*H33iKmT^>HbJccw2)p@>QzUXyrq)m5dU|E1&7EwILH$f zG@Y}~T8*}Yue|HE9M)w!^gYHw?Xg+}Y#z8nYAQaLfy`!exVqPMl?iB^yf(?wl1W{J);w>`HA^q)>@li6pBRZEZptC$y+@f)j{p7JT^=L9H+D2?+PUl zL7Jul!Za%SN5Y0b0)DVdNuh7@WSwYx?|+OQm2RfaNCJq{iRGqL%zIb0D?au~*=kiX zx_;aBp;$xES2MdtTmGmvQ_Ug^Bi?#=ckV!JwIJc!kd&0Hd?&5a zU#~yUcUg&YJz+)F5Wu7~L8e*oA$hf4bMtrJ1K3suvA8KCO3eV})VBan+!IczE}LmL za%kU8WQd!KeA~h|QnBcw`J&Ro50-t>eu~2Yfnd_UN>Q)t_mW#i(Js7^A@3Fzq-dfP z{OW455o6KzWDA<6TM%!tYp-PHM-i!-qeg)iRaz2hBZ)wa;_>k%G$6F zbmgOT;6Dg`fPSA>W}J7oMt0!5z}}lKt6-GiWjxx+j7-k<8~xSN$(*P;v+KcO7qmmF z!>5+l6Vc7Zge}b9_2}J-&GED36|Xp4%=_{{Zg;`;sCq}C^%Dk720d#3w(?Qzf#5Qu&R$#VlGvhdhS4>b}+eG1~gY=aVh|Nu0iKss+wnLq`GC0|`;{inb&6L*l|hQB+WNY1 z-L>M7FX+}M+Ex&&l1_uLPvDvFp(te{)zP>N{&y;2bTQVgjK$f(qRZ)dE7~AjLw?Gr z?WTW1==3$^e_6^a4}tbu{R{^-?b{PHp`gQ%_B5x1_F4Pq(PIzi57*65P=@B(w?j?$ z%CoD3{rZF1+;DYICjjqW_jx!82A+pLG{DTM9&#Z4FI@0z9kzAKuQ8C+A%f+9)?2Zi zOFogX&gY-a-;_{dXsfgBhB$P-RRY5bevGut0-QY#Hm&CRdm1TIAY_MR$hf^U1o2pv zD%;j8X%;f9)uus3i$uer(9%$cK0mz~ZpdhbTsdaGwQT!V+%sE>1B_wt7iJZNIC-@F zk&2o}Bkc%_9DHFT`7t1(aLr?U*|~tnpt3fLO7z62Uoacux4fKlHN0wj6)lHTaa5+$ z&6wZ=2Mu_huYA1YsZIn*E9We7vQgcQt zszh0YkQ8gx<7DvNC(}9A0dnPTvhw~1*ZpY;|HH_RfaJ*7#mYBx1TM5R5y1AJ+Xjy%91&F?|igKZ)U zBGh2Op+b76t6sXc7zLdu_n71~=NHO4Th!oXpXGk{x2EvkP(|j9NZaNXJR)33yra5= zO0kxXE~~i)R;mmH*W_hE+MQwHg)xp+W-7?aPpwo91!t1rLYmF7C<^ODyp_rovh@@(9S~-;po;RM%^r79F7vT}g-6S^Kd=(YWTMGzJP{6Y% zZvRC3b2nl&w(9P#GBOnCc~%Nfl1~Ql@5H4$atXAk00Eu*dpEdS3x%1o9c5>G1v>b^ z1!}a7+Y zu+8#r!#>R}*D&+#UlP=UDt4*jmdkh0RK&f%!eYtOk2=U>BaozT;mjWYhson(JWD=v z;!5B(TjA-s0hEO9Pg426ZpFZOC&w_LF%Wufq1mUUbhgetlk-hO%U?X~<0F+}E* z4%Efo$G?wB42<}K(MczDbIq>2V(rP1f9}U%!39SBle7NcW&g`uCI$W$d32=NJ#*pz zO=6M1#{Rz>?*B3M35yVgmA{YI=Z>}ebOQlCK5p)6J1cR!jbPUyGx~Ugu=i`C1|z?x zhr26Gkg!Z8nZ*`AA^se-HkDmt?Gd51#f*{Z;fB88DPoq==02FfRP)zunyL3i&^PhX ziYEa6V%534$W&!`OiSKPdeT@vkY~&?mZQ^I3&{J|G`<-B$zW;5F>?Z;1u!`X?j{#l zIE;aYTd4OVua?U~67YA0?wvkquM_9s&WH)1I?(l`^27TgC;|b0e*TTo{=vF753FBB z{_h#LhGWj^TPH*!QpU4?zPapAnzl@hyVKxjY~P%&phBUNjZiX(8ZFR?6lu(o(v$q2>R)-`C*{VGg|@6 zMKQ0_WVOol_to#vfkA0ZK;mGP)*xQP?s;MF+zTFnk4F{8+?Lvuh*OF;RH? zcUO9Z+S|3)IBf~FfAoFm^}Q3n9w^$KYICN{yz=$Ce=Pao_dmdif_A(9y!`yiz@8pL zQboZy{Z#I7(!pJ%bmcEcrbKct_p$N&bhd%}u0?RCj5F^i3!uZ7X-2@pJIlUj>3)>{^XDSL69QKLS2V9WkA?BtAeb9~`xnql*)=z=vf#)sD#8dTk zFNhs(gT;1y5JoB|2BOo3I&vCPUG08*MbGutZ(HMHSv!T2wr#8_bny+G1mV91T;3qK z_HR3r9r$I1_3dKCr2J=m8H)EbmeUfK<+N2P?97VtbAR(!xKYv~>N6!+>^EDnsBCq;!fTktA8Qz68N4=x#GgI{gG>cQxItFvYKEpNcRvOQC`FJ@w zkH%-M14<&@YTcAdu$syN$v?X2(A*kJx3Adu8>fo5j*DGuG_^D}Yc~wp^NY)dCbUP= zoLCakW?lceO-cyo{5eRfju>zDBkOcD_QjZMWgC8r3Op3>10>!bMN?9-u6@TB5L6(l&=isY$8RC&Ccj< zhmR{hD!q(O1)KKvqFyI5-T#2BxVUiOjcp}9{@d2*@~{ZM9oKXG@L+=g^{v&zGqLkp zcT)Siyb>i5F8h_qOB)%WqLpG}SjpiJB39E_Bt(oyRR>+s4?gT2IT=LPyN}nq)FrSC zhD8cjGOi5X?OOq;h#C6xKn|K>@EvnZ(8{c{Fk7p#NbR*3bn?=D6;GI~`(xn6%1Zg_ zJ+=>1?r7g+EzhcbFKp@YbGlU{h$w$5`)rZr-$%ox-d%;A5;Ly;aaU=^G_%HIJ?QT6Tt2%cTJ08E9>CWUP5d*+e~U67&c7-$m-L3U9l0m!4XX;w6Dby_fhUXeOwl5=$%OOaXQdM5m7|p!FW}xB|NO&&79pR(5&)RAC%6=H1C-e zdoVhkSyG)HamD9iXDXVC$|(u^cnw7!-5Abk&CkKFTc10hAfxxvb2*g>Bw47b)A<~- zAE5gj+7$M2rSrlhNF&g(nvQFIrb=s${>s7iYI6F(Lhv~$V<2SrV)NPn)f71kaw&xo zhQDm>3qSRMY*$b1wl0~i3Tu>Fll-Mdzd*+EeN}2Jc9LKMWmHBNeIGznGg&o1TtSlq zG;_$-8dTuA*mAk;#*vFgxgl7=^L3Ti@2;kpAm|JIH3xc4N@^z&ghvdMvQLD;nXNKc znbg>`GQ~t;)~Wt}OShffUu|rm4O9j^S_vH3O$1sTmK!U-rZsutuI$Z8g?qezs(ybd znY3_oHfHV&LEY`#( z4kJGmUPiX`9H0nv@M8r;Y+)pa=>bd)c}aU0nla~5N>O@UNz33<9x3(eBA=<|Z{N8V7Y+eHne4IYpkyzA0>5-*K-w$?tJ6f_(=|Zme^8rQRV5jA~W^3gD0OJ>N;Bjc^J)p9X2L3@%w% zn#U8d7hLc^#(c1Zfi>^4XJ6V_4Ygj~a zp}%1PeuB^A;`M^um~3uc^n+iEiJLhbuhHd7!(#hw)T<6~+|lzz~XKm zynb0uNJ2mzfEyWz4K&hL(TLff#SyqnvzamqetX6D@Eh!U(UOpE6`+BPI|=<^9+IIC zU5LxgFbBg$!_bk(dOT=B!FS8QfnQ1$m1+(QYUPU60iw6g+^YSPzncg;LpH+8nFV|-WdFQ9f`Z1C6wkgHO)=LM z?wF5&Mwk3{!&#!FCdxH@c=JOgl7nziv*J5MZE zFGM{-fsVGEX}4LJB}Ob{Iw&P~IxwI)1xb1I^zGs*Mh^7UY7xQyX6F^C;yTwMba}H@ ziqO}Qc*02zkNuSIohYfY4$Y4)vJL^K7Q5iwmF0nxpPT`YG)TykvAOAUb6>l8NJzN1 zL5WExE$|oH0$eQ}`+jWm*{|mPp1fvJAVk|gr+c28;dZxXA6HgZUIF#hC%yQyo;#K% zL-$-7p>wT(RjPp+Xm=RbmLy{PcjdNm-1vM9`CWEF4t;o5czBrg+w*OT+m$Rrv5r@X zud?AWmheWK2kBisrhxRCer9L!6Fw$wNJ#Xx7W{7H_L;40+Gkf z9?@I1tx9PxCFMVaX|PQ&2n;rQI?e!Ul+P;@N^TM_32KZ@#Xiep4I1~MJ-ca(LV zE=ws!;?*ZP>LN3)iCXuk}1bW_kBy?RDqj$(A0D>B4y8v-M}+N1Bi;ZoDZ?aFQ%{u z2d6=UA7zU&EK9(q3`bCdDkD?F5YO7U8D&M_w+At?1LwO`fA45hqGM}kzDP^L((ftS zs*D#Bk_rLakJ3t5MVjl<P2nR>_98veR z9pZ^@PSkcBvbvZ7hER?2TYgj+a{*wx%-7eX?dzqDJgd$PqXUV9OEUS3^WO13TZ(fz zZ3Tm-XMgwsQ{LWpS!gQ`nuXg-P_|FEe22#Us?M*3MT?n zL0jLNhsps+UB=iLmL2gj|5DjQLBT^zZr15ML1r>05N&-W+cJd=9SU(-e2PRr1jGv3IXo^5hTo_*nwj!)&6(e`Jp>nWo)cYHeV6rNPp ztLf}AIvtN}Az8IYDHDr3wiC97(wQ*<{Nvg-;%at)V zLB^_;<*C4rO?aOQc6j&xulcXu;wL-z2#`|haK0A)r=r4zxoV#4vPiSWJ%#!0`JJEI zJz~_w^QQhM#sJ?#cZ27Ag{?QV^|44r{gR~3cT$zO*CL*00Kc6n9GS8@fK0e?&O%c< z%XoFj#~MkqB9C2P@JS2^tmW++Kw zXG(WSGvCj>gzO)0Gv0MwY@Y*SJ(72#2FXJ_j10swD5g{up||d`N*{c^r>OVI$a*$C zGqlrqXC>jwoCO}|hzCmwsHol4hOJ5yCMyfB5u9!7KFqZmNXS+ap=Dl7Ew>ovt6wT= z)5e+iR++6PRBUn{%5%E6|7r+=sB$vz`DjJe(~6ZjB?$>IneiU#p zt83k-Wf_FkvB5RtDjMuz`tq%H)2CX4{_=Y?pAl}|elCYr92r^0W!Rki7G|_q%s`z% zG>)y`^YjYu2kFhGgapi9!Vdg{CtV2B3aj#zoKE^cU#b7HOYHoX3h;|l=O+99Xd;cQ z(#~7V3qm$~@Q7X!Yrv2-XH4Z8$6Vzgfk>tDT&6)UZ_Sy{)#>eL~Sls8}#a(1~3 zT%=M^ceqYRP+!F4@}LuZicKk;JkY3_jcU`^sSw}g;Y`;|J;OU=RU-hbtu2=+-g&uY zqNEeWa3{wdmj)Q3GUiq=-jbj0;JH`xrn(-S^*djp*CL^nZk}49o3lFo=}+Z*+cLuH z-00#k_xLudB;96IjB~HMr$E*cQJ+#U*q;p-@pIPZP=#%8lExY3j`}ZhAnAB!+&LfH zpt#(t3e}CKGl5-ni@vBwdb6%C4sJ^QFJiiRu)rL$qC}OzRnP6fDZA7`3+H@ahfUu1 z!UJ1^ZrgTrBlz{r^+@(Soa(v5bW-1h7iJpKt+zu@rC~qok}3{rQ2IBF)GM;^(Jnar zAg*SC1)>~V+N8s9wU4YtxoxGEnbmtmZcmQC(5p7~QrTuWVLU#bIiVe5U}tm?1lxTz z893>Gt)P+tXVQ-1{@EYeut)LoOn=txc4rlyp`yS((c%){hMAqyjfg@NdfC%6h4>dvU8Ss33Y@(;N`(%>wJ3F zTh*?|&|$}5v(qim;<>$F2uICV)PdP;QR_ue4lKrQRW?Du16l!}<>sOxsSZ ztU|;?w{;Mo51!OZmWu-=A#slrc zi1R;RF}{$rIg$STTnudC|4_@nbo-ZDe(PUq`Qd-5<$wKKT`KV}SN*qt6E;u&<*NVx z?gPb73k?2)1^9dM{_mRp|3Bsb8-)D7+2t=wE1MZ9zewCtsD$MN%L#qoEsz zQbSirV>01~`B(OQ)fS#YNMmiYq5#0@c+ET~3EFsKM!c6Z2m)|cq>PsZO%`Nx&V6F{ zQ)u1;OY!oiHKPP3@CBFq*vEO9(t30KKf{)~mOD$T)pXRfu1=#*C%{* z&mvFWu;x<_-V;VB%NsZAouR8{gV)95z}(9^$3|SB-ur`!`VwvG*F2 z)EM{W75DqkFj^2HGh^erUz3km7#I>Aha1n;$xwQ3ZZA}Ib(3OgsIIK$&Z7oV@Qi?>Ed-bF7hiGQSvc(za zH?8j3k<$pBTE}*F@WqangEMg*JBBZ31jS?Q_q0^5bk1R^Kiv>j2dZvI&hNK)CcEOpp`CO6p9dl0@*x9mW)A=EC$CovwYyHkH_U)zU0YcZJlDdqV z=v4O>AE&ax3=`uCc@_7UKZyk1j}g3GFO;XT(n{=<$#H6r*w33z4LhlNn|)%VI_)LI z%#89@(&8~|gf<%-iF%=0D^*B*?CkH1qRjk|RJU0irq$!_ywcKq?&G?(o=k5M)`~XA_=-RU7d!{(t)2t;(J9Z08%$&kG=OGTNXeA41BUfFWgiF!D z_IO6r?<}36(yJ~vNiOeXTwFKPO!jM`0mWU`lYvbX#S)M zg}HrBajuyuU>dyN6WDzHbfg3SR$z$C(kiQXfWKx(+<7MRP-j9pPV4IM@|CMQUa=5d z)dt?m`9ZkJAvm=(v@9<#qj2H-)tn>XVY0IfDu!CU>x8Us29=VvXpea=yaMXZT_YEm zQj2eOuIUS3oDYvx=y{6VcN@yl0qTMi${J5zl~V{!G<&LHi3ZP+?S8ISzK+uKIFOjh zHyXV8;o@=E|C^stSl_3UzwBUlke(D>E@!;UGVjS9LK?YaThupMUqK`0DYsQT>%Jyk zT2<79Y;f@O@_A_gCShsEj;DNQ^nz{!g$n|fO9(oms0;-=7d2H4$`i+OCh`dh&tHsa zqIToQV`Nt?>}Y-!+B7U#dIRUyDXDS`i?X<#{3?1@&pD8I;!rEWO6=K4SIIh?2T6)3Q=D?PPuV&Tr|F8DHsg2)Pm& zC;m;FwOKkgT}w;nLsE-NS?&&d&xPnVGfDv#vBTVa+< zVq!yJSEm;mg~iQ+GFvgzrK`c9z2`mlj`RLoEk?k;SYJSXguV|?eQp3#^B%$~%E;>t zo6ex!aKT7GgavZ`NKe#xId}Gv7w7E;J_O#wSzDC4{%5_PkGi8IK07s^pR3YQJ`c1v zF8u(p7wyA2S?LNg+3E99pg7&l{;(MsEPCs9+^&r9-hEm+?)WQtOQ2Q|9skOpgz))k zwXg~i<=?}!^oH8*jrc7`jd9q$#1g-ctVL!Vkf^^>bX`jsFmf%Kt37@*IQ|+w>k5Yv z#?IKctSB3Wr-{_xKRi0US&Gl@EEOWq$oae@+CHOO$hFa)f~)5;C}F>yLj)Ckzvf`ZuVpwcH3=C2YN;%$r4kino@Br?Iusk zIyFLm|EWQWd7m_Y??jP!z(<%~-VuGuZd+UFxj>^~v#EUh`KXBs7e;RWF=!x}Dk59KL*$GmLn${g<8I*gyt z=nDGG-k+*YQ5TJ#4_uwC^_4}%S`NH+U`rr!wpkyK|4NhM5XoOcO>0cOo-*?nul2=V zO;_52brrvvp^6+t?+{9foDY79jVX#@@#C!kLs%q+moW@o!S$#9hyZ8 z&{=iNT3$#X>`v2CW-qeBH+bjEeaa(2v~!sfIEVSi6AF!ve%%Z-eXAS7RDl$yweNcv z`=HYXln0Y1DtKUjK_cm;dU}o3)iRc3g5uDAdLDxW z0XpUeG2pef__BGwTvyDl|5Bu}a8tECk@>|8$RZYvpT}Mn6XTlgxEbu2LoIZ&{A^~; z$f!SAqndnx+1C`krVZqfpXaw8UCb_iagKm~jD8#VBkUuD6-Ih}59s&>h(%|M@2fK6 zU(_Av-$_c*JoJ_ctrmrLQgz{R-A7qN=b5&HIE+Z^8{E;EW+xX8PV)M#+05E5%&Q@_ zhigtfAlv-BptAv(Fg^kc&pFoqEY3YR=4ao_pCKXVi$6b!yl~zjZo#K3f2x*aG{L0S z#NyjQ?)KZ`TEDeApGP006sT2?ux6{I4=xobiL4^VKcGAQun+=(UDt*u(S{@W2(Mk+ zxpz=r>!A{%km^?<4kFO1XkX>m1uFN8VpnIq;e2CEK{ht$!8~56i2Criu`d@Z9NG-) z77&RxO&hIWoqHt%54&uYJ@l!FsO}=HN(SHIEL4qNG}`%>j~N6rhojpZtc(Y^=KDaV zo$R)9y;F?ch^f&!Y%v#JHSOVCt!PC;YkvPaJv2aoF>oF%W>CDDnEo}D_|CT_FMLr7 zidHOMW@n5qZh6E6PiH9EwPZ)o9U02uYEI{(aCcpN0?7{@*|8@~Wq8YKz3lV2Z0Uj*>f+n{=C z&lT7tu{k+M=fHVGM&-`~q9b>e(D<6>_O(IRs0{s2Y*GZ0Lwof$hc!GV5=UB(DG?@J z)>>!i1D+Dl+lGMWqd7?m6~gbhd>{|{A~KA$<_A9z!FY2No~$cv(<8^Hsn03u=2;Jf zY=$b``Ehdbn(tdwTRhOFG|O^E8BlOLSQ(|eYm?+VUdd?Flu<0~+Ata(2` zq+`U5N0K4Jr&zl2R>FFmd`doF$|0Atn#SX4|rp*x* z=Hi89a+e{5v$!$F1JHq&KbUgNEa_!g4wx)laFzklQG=Nx$p)vN2rcW4U~yzJ+yvWb zeaNYyfjkPDwhUfDr$+i3+?K`icegA~`gb~w1BFF6lC3z^UU>krYJPSM=X5n_Atuw_ z6RH!VLvv&%s>Xb|8|L3%zAbxin%u;FGBB_!&+b#l2UItdBqEUSf&O8vJroKm!!nwg zMo`IY-TvtF3=dMWDx)ma2hA$TlMS3ZX=Oo-U@7VX2GQ2MW((sfpXR*)p#{$3spq#P zKYq;8sybXpE|I!1b^Q^HJaJ-DnD<$HHg!-dgY8b$Y*$t*c(HueQUdwpV(h(^OM!ZK zhSO&?o_0Va*^Y)qQ0FVGFE&$ZsWcSol!@hv;OaHE6dlYMO9HXjT?7bOUf?&RKOB{$ zLMWG1_>{Z=UCXGX;WHgL$wa3$2C}9I}$$NVf#ZKx$ ziAZq|^yf5^fo$yPA7#9SXx&EApG$bRTJj{~ZL2j|w2ybPCI4DTVLix_)wWz|-kT2e zO?kN(-kx(I*-6w%QPCT-O5=n>8{gw>O-Tz|BpF2~y?-HLqaGaL38z{`z$Y4uF88Ri zFs-AnwC;2f5$A)5{`U!)HmOtNvwy}pvGf`Uu-_XL>6`=v%SCUT$C3X77qO`qBpBJU z&+Goh+ROU6)gQcSYK}fTuEK97&(#%Xoi0=8@zY0dGmR2_&Rl$8$j#^BV>Hy38^<7b>vJfT z;?QrE?bZ&W1CE);nCG?cdHA@;_r^7}Lebhq;6{Q3?RC%BNZq-#iQCRR*KrJir;Jon1f=?{PCke3uKj^2xh7J<>yz9!LD87C z#tyQrKA88vYzQmxRsAiF!O8RwaH3!m+0N$9v+8j(DBj<_ykmhLn#>+M?k@f%mvC}2 zGY?Vq`zmkg$d{5j^r$pHKE9?fOA_CAh2jbfCL5oaK_YIOTM|8wv8K=7^Keh<>=tBA zTApnp8mqkYeP*%52!=Qdu4@QpvsC?Rj|a}>V?EF+?rxDYb14gXiJc zM6GBtoW<;MtoXQy&k}3#UwmX-6gtS7`y)zRvKS_GsmPuQ3sdcaAsyEW{GYnFw>+*+ zg&5e_ls;JOkMgi21NxQXcH%qs987as`aeUPhvbvb_+K?9lgDau&sMSs(WVv%iA-x5 z%~3&qB(?EuU%%lfj3~6WFYJDkhSh^F7!lQ9PpiY>KWpPgAQ!eG*6Y z6e>xw6KjcUT?eY=CSC^DcDya`F5(<$VMiIIfR^TucyyWT@nra!U*U+LU!bHn%p zHpaK7Gq3*~=6NBTecFLHd37FNjaBM0&Yq5V+UZFT^EkfB= z<>ay>NX8c`ygscS%^4oc`EG^i_zDM$fr0Mqs6C8>g(d4shTw)o#`g%MZ6ZOS4COVj zSD5s>OAY{dQi+nfSsUjdjU;huHLA(DJwYdGP<(VNn9IRtbJ2@2*C4wEC%p8SO z7BMjiw^`HIXY_$DolpE=792?I#uJa;Cml7Z^)4SSwjaA8P{Z;)y$S+?%VssPu@=L( zVaL6)DEeD}A4x8tzM%q-nDHO2KdhPBekq14dgU^pnE|TO?b<#{%GbwcUY3X3(ws^q zS}hFK8&*j0IPI(XmxJlp63C~ba^DN%&G~8XwG3w8XKs1~W#lm{NN4PG`Tbr=1`GS^ z3>J2P+{G0w+GnkUMEJ2#7f`OHrEV2m$=STWWZ115Tt$W6?XWDd)We$&8k@s#Gz6wO z<_#)H!q}HlQ}bg#Q>3Mtf|6lLhsF^zH}^;E_C2Ll5L%OF9{rlafI;5Ff6ecuDK0Il01Ze$9i%!pc?b77q z`I%j%L8P(5y4sh#XOu@{g^_Z~Pl)$DEW)=%8Qeu$Eih3kl$zDf(9RsZR}r9=x~DH( zpY#?oc*yMR>>M_;a5o>B8;o>*Nw_^~HJK+?&7ZI)`a$7)c=JBW^JMrNR#41W3U-DZ z`geaV3nSI;-4_i*O%;t5Lc&+fXjuv~^>t3rLu8nQ+X;G2URwG;uz^&iwc zSiY#|8QWQ{reZ&@+y)Jacms1R+9^~e;)#_3YgZxJ^z;nxpal&%CZ9GFU&S9X>&ZI@ z2j)DHNhBtA#V+(bP)>YBJQf!yz5h%-OSt;QLAu!oGC(uns=WtKZeeg>q~uPRp=_t> zQ-0qgmF2OTz`&&Mzrsl$)ergTI`e<}`TGKqmsGgcyxa|OpfWx}$(F&Iz_w1}j$Iy_ zsb@WTtPcig*{ThX`SB`Ww@A?;&DGInub4e=OMto`hk=$>Wu&8n0Z%)GgPkK6(ZF?1 z9KoTj4S-#Aby-+xF_DJtP}o)nURh#hZLX}wAdgn7J_ixN_>ux&65u#9GT7BKUk`sw zmbE=~#<%X9>a1<>p-BXy{+1s9l@Dfpd1%`u=@n32Q!>^^hX?&eiJ#&PXu6`^OU(Zj zzzNd%H95?ZXewFRP~-mG#6{B3?eiDpL@X;Kf*4-s`EhQ~Gjj6wFVR7E{r>aaTNXiR zzsjZMG*-g0U6&(O9Ojn?4oVV?KR-aYRErsQST~Oe8omoTYFmu^+XwJ zvy7N4fgi|IYF%=Bh0sBdvp{rXZE59Vrr4V|w7I{3@iOi9z9?t6B2>IDT*%Iy zu-(faK=W%*%LGo;XeP~L9m${3EVcA}_;8mw(=d~;nHL&9v9HwY~JJ|Mx|B#{*vO z-uvkacUM>D<_h#x65kWgfoKA)PC&KFyUz{kS5=Z5 z8Vw#ea3w>-Le=IY3Z|i+BwAu(^}DxYoEePLCkUR~!)-^_KmR8f2|Bem%5Z@X%IIEU z6@;FXFtG(la4Zz+_@#PwjKhA{93KVYVXYK1lp5|6i$OT&7oC?KCr2%Qiqy|{XXDUn zkxiYWj%R(AkGfdd(we7G#i2jazA2^N<12o!?X7YK^qlZe;OFba)@{cc7mHT2-_X+r zetdTBFsW{li4Hg*CuFb(t55vPF8i1czTchjyz|!2}tQTIuV%zefd{Taz zCgkj<5ze-5YM)cAN}AHLXK|xM+{j3K4u!YR(PjEuH4WR?l%DhcjK`R}&k^{SwvM-5 z_1^K~f>l228HhIV5By@tEVWX*ND}RG?ty*g0h9CBXuws&;YJkVVBFyolu~AfZ<;`5OhNE{4GsoIKe~qo8Y_h!Hx|z|Z6d9$ zO`*m^MT=(T&V= zl~0){WB93egS!Sr5MCcUuNE!IpPlwi8+g(r^on@jFP0xM$3k=(15R|iz|K=qN>phx z<@G+GqC;o9Em%k{mEpodTymhg8?f%Q^DcfW@x@THx!EM}5@_S)H494EsBw2a4Z^XW zz!Cl1AS9=}UZGO-{FZJyG4LNOfa_gXiuSzW=d)eqSr_p1QDqoAB2>dr`xw}gMY~Pv zL*cn58X5WBUyaeW)}`b7Ag<&)07#_cWV4)&Qt$n^o?O+T#8&O_W|qSKYZ|e8Lru-N zmAnijG{1Y?C$1RoR?PG>EG&$0an%;&!PCz+FPp+zcYv!l>hasAKFRn_Ad>vG-JBw@ z=pD~{(Ieve-C;axFg?1X<~7fh$_vP{>!;q9cd3iQF2vDht!9w;o(mwNU-{?t%7(S< z=CXhParlC78|Vg*dN#Qu)uo@NOK~)nM0@mN1CZN*qLB@f7GEz`$~YK@vs?8MO14LC zvN^-VZqQMZv9c~E&xZps`6S~~Q5i5ywT?WO%j>G@*A467fQNiV#e40ar9PD2tjE^1 z#|3zZq_CIAGCCty!9lz*x2xZZq{gcH?&}w{$)xtm!m()$A~R6i+opL{?LFRg~N{=#n3Ao;;T+DPiA9$(S)~O+iXB*)58XT$SbKeyx%|3K02y zRQ`HzrkJsi+u*(b?VLy2zY^|2Q*X04fMcNA@1k5$$^Wsym(pE8W3ayl{5k7oxIBU6 zR`YXLJMG2nYm~w)->*{YwR;&p_~LP#g#Tt4yi4^?IJ0}AF8}jUcnzptBgp6crT;bk z@u`@9VP#pJSuhJ01r^2{NnxOZs%6z?9#(ibaO*ZrMMLY-q8#P z#9`Fm7nKL^+8Upd0G;H;k;XMdhD)*H`(nI#?PQLDA(>RP(dmL#Td(!V1$-g&igUeL zQ~@8eFgJY8Lh9ZzpU5x`dJk1-b%!GkKw|G;`neC~pt~2!6LvFtVp6|NV5sd{BBc)3 zw~q#a*r3)?in{SG$D1Ez>}eHB%ne@Y^W6Ce%yjRQy-Kr92P^I~Sq^cZ#lFUkh>#iZ zTGZHw0@5jDBJ zK{(X*m?H?VcII|(QICR$+Mp|-B<1Hyk7syipdhUn=8bdiUzM%~wrj7V=Xnci{O4hp4!Y9C201U3Q`-g`An>J3WzTpO2 zoc+dp;24UB^!{zN&BcHAuK&UC&v6RtaGYJ0o3h$+@Uv@A&-ijq*i8X&(_?_DpriZQ z5hCGZ5zl5ffv3A95l&$OJwiAxE;;@ymkiE!%GN}uhzVE&Oc2J!SIWK%7y?T7-5p-R z5a&8&4K!<;Aok1xDF~SXSk)`3=5R(6IZ4i5W<-}Vr;)}Mf@IOYXGk6xw%!3^7pnrx(p*jb?!u>p5hk*3)&W{j-Lr*^`zNhYX%W5I z4D5;Nf)!5R;alNch}EvaCwZC$4PJZV2v4PfKbCJUL?mlHlZ0n9nK}1{%T@^-;Z@ej z3)jM*tFRd?4~{#~h9p{3XFfYVe%MFT9Nt1$o6ef{({=%gi=rZ>25n=rJ3oT>^ZOs; zM}MB$u+sk*EN37JA^W8~(jm01`n(~JzGRK2 zjZ8ie?uB%!UOB2NRTw1FP-!Vs7DkKzqfT^#$rK6F zAYh|L`}^02>t@PVs0>8RN9}t#Oy}2cs}!(14@9W^IzE!7u0acZu48W>OKmU{@3?D{XZ5L7+8%MjV@pbj5c+? z3HG*@rH|2V@w9sAWK2ZBD@AjS4QJNd>HQdQoVfDIF@DL*kS?&3glG~e7=i|mT&aU! z<3GMEIPS2AP>KC00{DUj}@_&FAtf3Yc=m&+x zHgYr#L0>z}ks4F&p{wcvtiMVMI}q2Pnmp)4%9j79naI^n$F1x#zMU<_`)K{QzA{(w zLbEJ;-d`ugt*-{o4<9a$4K`?|ZU3p{7xYGM*6RIy^mP!xC!rzZdYQTDK9@Dob?CqH z`Z5~z83Usfo$1CX)uyg<@A(aSx`3quF`wH;T=C=jl_7m^;AR&&tCWTqPOHr!(?V>G zM$!*+d{?Bk5_F%+udHj9UPqPUV0^=N6vz59xw0t^(w25lZt%K$wCcb9x^;`o2ATec z;gQF~(r9BY$_UoWUPic9bLy{Hg6tgbwjt14=4Xj6WAi#W*19={MlMXQKfDri40QYo z+h7{WGP@K<@I7^rd;I0W5e>&2w&7JK3hOYvvz6*ps`OAWjRd2SG1i#jS7VVDCk=*S z9oLR3Ynk4LVjZS+>%D4ORSH@5x<=uB4_K2=@7YCFhzAI*+p?#J#zpSW%miuIAjqG8 zVCe7X3kE-K5ziH#mQroA1RGve+uC-Wj!Z%P#1NK0eyw;PE(V#Uvz<=QUc)H6Zs8)A zG7RWM(*a1tdd8d4r9t%tu7*yvF7=>w)qh(>znxEu{ojIPD55^bSzviJ;#ZANjd0gF zC)e!Q={pZ>-qtg9ft!&@e*?DK+#P4Lzr?qJc5Q5Ic2edV2Tq~qIV&3S&G?~AIx2gP znfckaJ6t{^%ipo`^FJ4ou|KoklNDG5J2J7SimwVblZMFIjF*_%rxzOs@1+T}PkxZ= z8XmRomxN5;`UoJwU@$^g;T%p&t{C zV^Y7T|D50T4(mC?x9cjqo+8UHb0n_Vbx9=? z%`ZVv{2lw2Nxmv7et$Wq$yy|yR&BoVyIUKLv5sxHEu)aZR^`n9VC^l#;`p9*?IB1Y zgaEBVaw(^|dNk6AHpF~S*yvJ&RA@!Mvm23N{|AdW5?Ld2EQ!Mu><*4SC z?j&e@74@lPP3Jn^%zm5WMsXf|YnQUV)w$Qgor23vd8erL2a%;g*BtqZ^U7E{Zd#AeZ^sN zg1vU&{Q6k_xEL`q8h)d}zt}q@sU@N{-etOyBZ7Jx5h&-iw4i+ec_#*%n{fgQ=U&3^ zNp?@3lKm`Y9qMkvEPt%dr%TcQv9JX^{GEin=|PYTA0!PhpeX2>=?~wY?yj{zA$kklq9Q=Khjc2X4_PVd2W8MLmvsj_mFUy;!P)(j8 z9%*>b4#)kC&aX??MESUES-FtE!R#}f38`xdFj_4_-w>(j)-)}XQtfH>{~&V z=*E!jH6=1`ns0JQ$&4*`x(C#5`s)d_VhOcaNORv*jAQVH;a})Y9-D5|2ne3SYbg~( z7~X4NrCjQq98FehV~=+Mo6MT4=GbN}c(9J%TkmE@a=SNNP&`?ie3X0#7T+SYxuAE7&;4 z9DRw5lx=Cqk0Zsl?-7F0n`XUaatZ`dA0mWUgU}_Ikv^76{iZwEm~*y^BJtijyRDkF zHeVCEZ{DW~W`@(J)C?gFXRs&iOV>%iPH;I7PKUoQdUSi_>RAogSKe*Lt>+kwYp705IynSn{RK793(Y=+#f6 zyaRZv612|h8!mL_Ry#@Hv-Y*ZgPLs*_)D09HKm_E01h77QOYP!GPRM-Bu3zyTJ+P% zQ2~F7WCRWlF|eyRRt~Q$Ov?`T;#Z6i=DiO**t_5X-mhC>%RPR`))X@>BQcN?B!ZP+ z`cz@Wo(|xN0UL;x?5)5+^8WqF6AR#Cnz&c&%g8U00cvCnNTD*_pIh5idqU5Cg?Mrw zLrz_(8nxXz%^P0r{*WT^!vL0+Tk-ZPnpYzb@773ytNL89HjgI!oDYWPDk^e=0TZPF zz)eYioU1VzyVmc|0Kl63`@(U~^w=n&WG+j19kkAxHjjLWxwGazciH0N8GZ@5|AoRZ z=uptO*z5MWLGyBqEJKrPd6nGMuIP==B`G|l!AdG!7c9p;qh4L-J~F|$5w(K_&2pc^ zViTPsVuhjp;33L?y}KCig=bDrIqgsm8#3pKFk~B)=K>xQwQfSHKjqT9_J2Lcd*!K6 zXlfUXfY_R0R};ezAK%`$H`IVUDru`*o`nzdu`0`_u!I4B+WM>=HC@QK=o?q{-XXUZ zghW=eY{(4;D*zi!@;+wQ(jnYm^SH>RSp+J*#{hTXVH{&U0p7^9}1gfoQ;=J(I6>t7$RG)YZ)72F-8`fCtiU6*Scz zgM0z~1#DEF4+>V?y28xYNC@gheL(<#rjCD^{rcx!XJE-Kd#rq8n5y=yS^F#S52>6d z3;^hOG6zd5;^&lR52_Up9q4-oXo2-uND%Mm>qY!KGP~ch*poMIFV)COQC4rWIWUJ~ z0RR_~XJ8OTbhKim+7V9f*UFk>sI(M^pE3vLdf>KsWZ7s)xwegPG2=uAP8Y-b-N8l= zW$>FP)H|PNXCJOv6nOtm4&d!wae4$3AZ%)RQ^ADU3eO{~h17)n5Wx!^ww+79E@Qq` zgmR)St8O+O6>|JaNIU2b9rQc7Tz&iNWCmWWx*t^9l4LIwhkyWsZEET_q*EPfTRs$x zELREoRn{_2*?=8&D0yEZFo_M0d-*YQM&wD%)p4azs^;cY(>&b3F!9M}tzAirlQ4?Y zDq1TB(J2c9BdUO??Cp6%PKSp|CQ|L3oS5HNzA&KjdV===H|IB1VC}{O#&N&2BmEhQ z5ML#mQeLYn5IXAjB{yYBmA1`u2~tD1ly;(GxW@4d1vR-BWKk&Oh7FcK#97SwUIEqm z6}|=Z%;fqUj{@bI4xpcve(mIn$7IhZ9R40je+m9mL{XYfajE8f#(UP^KkeCBBqZ5# zt+pt`l1UQ5$blE)n~=aR-zy%};-ZjvTxad;zxG7~9kuTAX5zs89V)(IQP@^_xg{sy zR70ruB`w$`sU!Iawm@(9K?ZD5UL}|!%YRCp+fS*Y^fyA>TT!f13gPgM#2m<6AxLhmH8Lng)e^5 zCYp}xuy=4Yh53_w7viF=zYUhxvONYO;15#G?47|rGSgF{55Lqkq%ic$YU(!0O#y(m zLlLpw(4nCrEQ(@OR3e-#78+SvI-s~jeHc>9a8JHz(Ww37i(vlI7Y2_`K}T6&TnIdF zQqkw_jD!SdfGcG11>-)ov}FX$)po==u(sy&e5NhbIbgL>g|oB zNf-M4!H)#OXlZ@!cof@$9UwA@B?1FD&r{RQb<&rnfH}Yh65T6{>tB z#M4hdOHO|V1|Ibk;m;XEWkIu#7B9|b(_o@XZ!(RLw29 zj#y864>*wB1%&<1%3o8+VBdt9qLLOM0Eml8aUsQXu*V%)k%54eEi0WN<3s$La54D6 zrH-F7C_ND6jxO0}NVCy4K+0JWe-@!=zr(}ALdYT&$!|YE-rOQ(+SOCWz?g^T-`&gM ziC(>Ws8;x4@C->Ljyt0K0RVuXqNL=DNqr3edfQ|z@YUlEhlrx{d%VSIkRQS$M>&Zxrr;ZX|z;Mh>lfS|67XH$;NzKZ{@3Oi#4R(u_aFz@Z*q~fZ77F#qz zm~s9touHg|t{pMTKo;N$GSpx;vCtoCQaW+*zF@CiKGd8aom-Iy&nhtjfZD$u8DOll zS*L7(z2yYvRvyk|_xo_Tg8u!dEw-w!4~tPv%Y{?j?*PKMIR#wPhWx2r%*luKN5{s9S{LOM`#d2Z8 z=O~U24Nq36!y%r_I=yKN&NRIFbrnbwO#%5Bv#h&;_9`mX*6+X#Kf~k1KW?I7o=qkO zXH^mVq~DTut>0avDC)h7sBfs-^!_#|ZImXQy#b?#N}~D-_oAYhf0x6TOLWek;ePOK zYT;#@Q=y|brAQ8&l}Kv zoX)h=omZgZ9Z_>eK@ua0nhbETT?GfnpoU4C_ISgD$3IrrXZrl}p2-@e|CTSdUx|#s ziHaVN?(pzxh%YoKa*NM9S7y(FF0%OJR4%LXEmZLcj|q?**Ty9^;Aa*_$*^PBUr*wH&Rm<`Zo%-ixsF!!Hy>#qv5yUS(u}Z2COU1i zuDd5RQ;`zVkp~Kks-HBgP#`@sxs^48UHsYF)ch~5E=f4^qnF5JgEQ&ns%Zx6X|x8 zfg)+(c+J$~231c2U*jbxV^NjISa#Ygb{x+>D{fzMZoriuH*k$HDZJ7Q zgKjHJFKU{uH`Q(Lt#*`bPhN5nB_h*h+=l^0-eC#x!|&F&v-?*9eIs#-4PO?92cU|| zQkaQUQxmlo=}OTn8AiMw(HfJh&8;($f6aix3Re{pa^mxhz4`{FOKJwdHxlDZgWK*3 zkPHL`q=OO=pQS9nxxAE>o`MZFPA5id!ef}EoVBv(c$*PotjI{I5auTu-8cQ_*fUII zo`^P+7BIDps5Zxi826$MVQowb=0@&Aq5ccJPd4wV{B%C$8J6mbiw)(P$+}-fkPQpHPh~S#g*aZ> zDeE!w_Y`gB)F4BCgB7=J*|`x{Cc_EoQ;u)S=McqcwV8!&L=)?6h0}GSq^IapRTFp^ z<|6NQCYX1J2#VvTQ<4`~PwiR8+L^+=cr`B^=bRp=Ql*T>m8*)b@2LnXmWsNensv9R z=_vk+)?BG~Sp;yPHXOT>(ca%{(>-6+tBAjVQ!w#SQL$d6Nb=|h_QsrITudj{%ne6W z@U}&sv!|)kPB?m*#^&TsmY1=@II=yd?2>eudXH*foVDFTLL!|THlV-!e)q@Z^@wSU zjv{fqZ$=NW!3h8m9B$-w&!V`UTy#gKhYEt4AG)$97|x~udBPG)3R9$PJp`+nH$EC4 zUsnBIB#2mJ>hKBBJyj*e zKasc!8S?730R3)osa!Ko3c)S%vErn&dhg}29O$NwYa@t4AA4SJvJ)hz?pBI_0XfPs z^mroqEGY3>7m%r{;*%{lS%u!Y0Znx!VQXhyAkRg1FTpchLCU%~=b-rTt5aN-0AB~y z15zu8@QA!%Pan4ie4XL0bHS&7*8*fL+JiB!XRJ=__a>oH&rugc zTh;!y<>wpUYcOf+4GcEX_Pym557r$%*zO0WyccjYGwb`F40RvarNcw9-X9f>;8xON zG_w4~hLHr401FB7q3h^UeAQke|9<7CKyc6Fd9IxpvQ>V*KC2I(S@eaW>xrhTd)V(M zksUK_@;P$V_#xGpz!6X?I5^V28r?*m+m`WgJ8`^SZSC3kdh<_`8GQoyGsHgFfZkIU zA&#;pK6E+%k#yubXPu%Q)*RBu_+4A?*DpnaMFYQcW%m7IcPIibXYf#7Ggx7~*3H1E zfOdFZ{fd#lF(s?optSY#2Ndd74K(@PmA0xshl?(VhNyX)Vou-9G-Bgw3q!wt@U+@V z8n@fUEWGKkI#1ceHaE=q^HR-7;a6f>{NuJNLG;Lcuf;NEP z)oK4GKN@jAf{@FtRN-VrL=BXFUG~+ncUi}P7f5Ml@FgZrfiwpm;QuNUFf_i}K)Uww z?c#f(Fd}W6-or8|=x`U^)32UqZzz|~=@JRwmmFLW4Y4r}uzAojc6w&|MZ;AhJUmPT z!aWst5u9lDpUnlnRO>5>Hb*0NV zJ`E8)$mIsY2E&+FgZb(&w941G*p~PAfc;acnBp{B56dU-BZpFYEMDfq-eP#de$xhH zo;#*O`tqy7^S7v!OOQ_yr*&&1J(l1?DiIG@kB4O2aZ{$eA&>N~A2EXGqlJicrN^UI zy%cj2lM-K-fa&l|v6TLep^Mf!Rw3oC>h(cciuKs=9*tg6FDKpFif`_=?T1^VZBCyByi`dg7an2XSEQCu zeM`s1NWRm17}*v&MsfjkF-+{YONsUvb-IfTw(QvV`%SIcZ=lv#S?dyu^qqa+Y7~vU zWToG-ntRWmPVMy`?%X~KQd|I@nI#g&DkH}SBQTQ(D@Iv<{_*%I{kUIMAx=WNdwhlZ z9N;a{O?$EQD#l)O3RyOEAL`S590nkahjD4hpi2>(G(uW`UV!F(GH6s;X(r z3DzxhI~xnc3Y0P-{DRL~Uh5_*zMOnP3ZK|8P5#KAIB#(yqpS>TopYd#&nk@*(1t5sNJ>eDM`+EbBU z=5O@0sX0et!Fi`0rcqqA!4VZsVwPoC6jZ9zW%2w zw}M$0=`#-h?!xG{Jv#37nOM&rM{w%sn&<5kC88dTO^$TK-L(?s&g*q*{a}9cO;>(7 zi=3D_3t8ol7R-1RDmJ6R%?TM9w&q10F$_NWG@b3DZrzuSsSq?QD*^GZul&_xH^-MS z2f@X!n?CJItWo=es3eLw=df~nXCT5B{grWfC0{|}w|nAS$IREdj}U+C>iCb=8lRg^ zsC4lc8PD4@6P)F;{Z-|K41Ctsd*Y?aAVpiVqaHHl$O(1bRiEAg?AyxU>#PWarbC{5 z&v0NH!?Psqc$Ny@6)RrOE8o{9&t(CA1~&yP73KKXr-A@Q;LPAIx}NKdB@u?p)3_H7 z@XRVzL#=17HxM}V>7<^pE;I8(ZgWFJyuy#Lk6@&CJ|E$+|2hh9mNsTJ>t&|XukE*Y z!>TeMdj1UD=z}JKSO>Aa;YsB>T~nmO-sXFRv3)_a&&BPLHZwGVW0AM(;YIo zT_1aE?ig-4AS=GW?}&`d)|{*G-W|d$jVr+Jq9yu9Kx`EpPCuhZ7#~46Y8Zqdu~=xV z^#v}EyJ;LJ&8-ck$8Ie>YRI~mmzCF!#0+vjuFx=2XI%~6+f`XLM6TDl#>ac%bN*eX zr5(%Bx55Ch<+JU}Rb+;M8XeOgudy2}s|dKMAK{hEq}F{MnALn6*~@R;nZ$lbCIWw3 zo#EX-v)vp2O-dN?8_VWk0E0k1>SOP2T{#uQU9vgpBh~sRW*P>D6#Ih3)0OaDTxh4w zi-Iej!WX|YBYroDUYCF%YP{vq+sll+8%PS}5HiKu=A6YdJs>sW-ZGkf0T@g2SqAlqd< zbKD|A`uy>aURZ!ERZ@$B=|%ly)wg`K-cgQe z`e@xO?{Zvt)OgO{_)4oO7L{UqlntHEyQA>T^>BaOsJr)68R+~BY5GrAdKK%c+Z{t= zZ@2FHrmROnM~&{v+$X${#(Yfw=hhiJu^rL`MZKDl|4@9Pr+z4<^|^r?%hHEOJxylx zzxout^CAMNql;bVlr|vutY`l^o<%(K4X_v~1YulaGB+~4v7vl1GuF6WV7&5sBxe!6?&gNBC(hXj@6wAP0f?f1jG zfa3cUz_YW-p(WaFO>;uRJM79zzTFW-NYJ8`0e-D{p?678Mnz@WW~2^7f(T@F?CzUT zJqrRia0BIl8wHPOqY}lXMdqmsV>-_C<$(};b5wEd$n4thxGEyZ>zKB<^Ih<{a8 z`=*P#I<-j4mW z$T6e58j|~C5_`Yb(^;p%N#|z?=eFF|Yx5k?jHcx1X)bop8j-%hDIwCMiMw^*Q$N9R za;@OULc_%1&^IkPF_HNZtGgxdo)Rcay;GHrui@oNO)GeA3G#&IWu@6U1^T~OR`)m3 z_qA>J<;|ZVveN}1l|G%E3Wl7YZEZtfV&hMw$V#gWOZ~k3f(mmk!`a6bpuFWCp1q;o zf<@Na?WCfzBljbyl<72*J?RVem&1n@^IxyNZHOuPB}M$S2inF8GrPLW)f1C;aS15} zKKZfx5v8t<+Q|1zXTS+n%pJY5vS012H-_&4SuYvm^DliTWstazjhU%`W?^nXMc~|* zV`|!n-o$n7+`^*vFCZU}{aeF*I)?3Mwec#ZN!9rYri_h-C4q)v`Nipdo9@)1T;xYt zJoBRR0;ZvnP7nQ`;-mAc*C)z-$&#bUbJ$;s)z60xGl(NN)~+X&zTCM9Pd4Pet>AH2hBN=`R_jY;cquzT5D8C-MH+QWMLC97I`UX)U)sdC|(78MsA zB`wKnZDu}K5ET+XZ|y<60ikzc|4>g5(;-o1skJFHT*F*9cI7qm=dtq9Auq4nm_|4V zBP*3#;5HYNq)_ae7@CZ^x0lkCo|wBCQS<4zgs2*yXk!TN+mr|5@JJ=RliXL zUQx>TM-|sk>xZxJ7?THibroK0A0Djc1^~sOF9LTgtz?APE~%5l)0ur%Zg}bVe{~o$ z?Jkwq16OkQ&M#wIoA=!-Zt6x6!wek*QLr(v+E(rirt@yf286;^+&^xYv|Hrz%$B5A6YiuC3N-X_TRM>hO0YW-nbV2+Aa;6x5zh zou7PzcbPl92!AYjZU>A#ms_QfIW$B41U28zpCH*1!J^BSr{^OO5f=7kYNTddpB?Q| zq|+3I+&XIED2`HDTbwfc9*gK~t>((q&_=9qpAd&YA{lEs?nc>e8bR&lrTtBT&#lfe z@8*>!dd{ubjNts2Gcz=SwN)B!zOAv!60YtBQ}uND=$%PqpGem~jFiy7TZ?LPyo;&2 zcmH6No8FJW%pY$|Ed<%MCKL@3S)|_mG2d=%dR%c2|1`_gSc`7*b$qO; zhVOJUHn-Cgjl9L;CDnGGV5u~<6!Sz18Z(svKZAbVjgU>I)WpMms{3U@Kc%Ulxh?*u zi0#s$VJ&&!7QT~4rPG=YaLoSfwTzMkHg|HYTgXx9X?1&;$f&H<&bAs@iF&&B;MBA^ zb0T7onNDr=akjpW1H-IjKpNrpT9Sbevu0g2=8wD~erS)ekue=QL3-SUgI_kG{jR@~ z(pjORV(()tYY6^mEWU4v?CKsBhUp+3e;K3CGpLWG=nZ$42nuZFTCgJk`cyVbq3leU#Xq5U)$ z!UeL}s2P`jSsqXzYonqACK6mufz)z(o8j>5iV)sAk#fGzOM77@`m{HB$H)5x#Q$n$ zfRWS6f7AEN6$0$7gLTiV$eEdsE~WXlH!11q>(WGg9%G&&D(Ji5v#?e`G0R^!aZ%dF z#j&9P6S`@(sV*0r<^Gz98Zj^9ow@*-DtA4kX3U-7k0yA-lS#6{`Q zzPg-*YX8d>L_6TTy&F46MNScC#Y!mlH>ybA@eO#`YhHR2fC8|oywpm^T$79#wscOK zn5OE~m{%ckqiDgM)yA_M)heD|H5*!hl;YsK6uJ~g>-K!*Bk?TMO-uPRwJj{*r~Uk6D*PHZm%alSQ$6&~U+Fu+4_`4&(@f3J^436gyvZBXuH7H)-!LslDXu zCwM)S(GELmZAWbAYdo%Ob8*j**0rLdE&a*c0piOF&faw-v4JQsAldv;lHR3Mv4zuKv1mK;3MRL5-DEgS5Vb(SZQ>BcP zdxa|#-2#?%H@ce>R&Nq4V7cQ6knGJ*=uLzlUG%6j1qwv`#<6BRD{1M>~ zN2s7D<8sA*>oKyJ3iUL(GI((@r!lwRH7UqXG;ViVa6Zl|{fGtdW|DDR%k#3^j-^Q~ zp{_ag`Trgw7jNrfh*{ia-e56o;96kbS;}d7{6WS}>opx*iNi^8xc9HA05G8$rxrHI*|HqGjnV9S%Lxb@S^;Si8<}MX`X<~g-wTiq*>lj%9scIJ zDjCrh&_XQ^2_G?eoSGrrjzCb2ZL;iq8i*XqC{&=E+k*C(ZdCcN3V}~_zDc`77!6&} zx-5)3{h}BRh!MK=olcz79pb%ZY79iQ6ROw*N`t0nmmJ;Ye6%M{6cg%ov$@kuaDXU` z0?V5jiS_<9+N^3-jW^LPmik7_J{>Ab2RXNy8*s65Oh&FB{?I1xBkjK#Jdd0__PaI( z6lSAZyX4(*LFB)CJZ-N@AmLA_zQ0aZiG|tMIm^k=;AG7rG$Kr_L`O!^ zQ0XNUl8mRDgCZ;EiIf4DzS^lP%q+<3=iovS_+6Lb8fP&Hfr|XGl?zke4qM;MAgeN$ zRavMwF$JOfYrpB$Ug5ceqgTk`)q>8>M$kZvR!wvlGN`wt}sdNhtlW>#agfs+F@pe`d%?P+QwwnA&8J@oof z?CH2fEgyshtwS5AzS5~HN@BC0Q)EBImD#6=?2e2yOfkB}p}f!g2p|NcJm59-3|*ye z+vLTV2JgN@q4dvjXr?NYi$$1Y3o?=?pNQixc0{k3GfjmAoDb#n7NYzO}p_XYFYg~3NIJ8qXf zU)GY?HY(%?!2PB9(sW^2q3;9k^iF|5`7;h?{C*$KS+EP*t9e z!y8jkxgA}F?|NE?&Law3r6rfMN88LgH~}fFfnZ_Jzm1A5>EiHm&W*3vIsG=>)aV}~ z6sP3NWx!|RzeM<8sZ4IlnMvKEfnCOC#&q~Nkg>3&CDl%G>uE-|IAZ7v0|nrAn|_(q z0G{;iA1n!d0ZmkL$HnpF2D}vfUZj?EVF-2je9RJv=<3fRd*qp|h5A zkp4<9{39b*`kBkiPgB3a2|u9DBW~`I<-*S=c_i;s-UBnx=+ZO8HsofERD}fPVKz1h z{UII*XtVPU7LQCTPJ1pRjipo4vWbxc${Jn^JyUyS`Sb-&&)C9pF$l8)bfdFmw73a- zSCC@&3-skcQr$e}s@(c{_^06lK8Sd8wvm;5eQ1EDXnUNtSAu>9O^o6eY3I)(=$WIJ z4OTfOBEOh;$}lCa&-z^lcD!&eiryJwkT)47DR`d0L$_LVZmPHGnrkQaPi0}pC3I8XA*Bwr7S1IUH&9lC8 z9W=Vj4H6ZnB5%_o*TGMf#;CF*r1b@SlD${!o?LkD9IPGhcb2MQS9{mbaw=#%wLbaR zz?bv}|D7;$d1+h0XPVFUs+tG{1jPkCV#?o?NSSD^e&e<>xK%Y?7T%pB%f2j_o5WvU zy$$Nm~AP!9-SHMzsF)Qy4`>F`BrJ zZwxr~VlKH5ly)KwC#9%eeaxtd8@_hh${tRku>L%A>bD|ocJ-x={M%RBVts6aM%0{iznKkh4Fe?*ZP8 ztc}lQ<5^WK?Ef9clkF1Ft)Hg6s@!x}frbAJd{3N-%fwB2Y|<80(XHVs9hAg@7?Di`R{v z!7JOe@a7oKRMWTKf8Oly|Ge2jY-~TBcg**gn@$aTDsl%$f272oV0;sGPYcZ#w4Vy` zlOk%JAF9ne@{a!^fNl%967BF$}fVSr5wo>*olKq>2IMrtf*bS61q*ewL zMTj(Z$3u4FCGv+RTna?Wo!Agf@2qtfkEh_1*35P7#%{pUkMMb+cGwe3CW*;C?P&+J z9&ab>?pq5>r8_JvN?E3DO1+SF=C$Fe-N6%7bj)f>{++;S!vSjg%jHwqcKy#b# zdgDxb@66+o1j%bc+HO&RdU@;d5^}$`(?^pf(veIub^ssu>$(>s<=A7Xc+~kIae&3K zI)M=eYkmmEVEvP31`p%=NoB`l=Xekh3UMHb0aBtu%G}glQ$MlqxT)B{j%b-@y32bs zSpa}-p&Z_JhQ%ihW~T9;AG$(KFJe!Ako7b*EKUq8J8)TvYG*}PI~tT~PI&|whbiXz zUl{}|>4qgo+ykgbbPZ^IZ(Mv081)N){$5iF#Y(Y#2g4T)?F{mAL*;vu8f@!nkirfq zgoK3tIu6$pQoplzKT`cmA`iGDak*R|;OYtKzkWI83=xTT06C2)XyCi_>3 z4lRp288WJ_Ze?$gBnA+R(Dj*K?qTAmb6f}1_S%T6sGhVvJ1HW3KaF(c^a%=r(PXK_ zhj+=hW?7eaJ-dsSvcJ#FFuorckyT5mtlrUcw_+30A5?XwKnD+g(avLc<4K;#GWQzI=hPa$W^H#(N%Fz#j87?Dl^!z3I#&|DoDy#H6H6+rZV)82y}fqk7OS>?1t+pgPw9YG zAsIiqE}J8YRrkz<`>nWGQ@I&L@4TE{jqk*o4 zg6!2qd^=7qX6!WEXBN+fg*07887Bg~yu99*TW5o4Fl18yA`-H< z$jCS8IX=7!5%3{HE(|8j&il6$1lv#Us}VzEcO6IjOyUL28)x-0La31?FtRIe&4i#% z<&9;DCe}oqraH%hViQZFop_n~oSLJ&zOP*PK+|HQePB!x-|DbD0v!^M>(f{*CNaP5 z`K-Rosmg_Mb!Q?&5P4kg(lm!QsChnObf}sEg+ytcmgA1T>hoKiJqPR7rc6#>-0i+~ zMpEa9=Km4QN{m}=vZvSf07c!#;J7 znz7}B3Q-rlJ?A~9p#2w5C{)(lHakNwzJ1738V_m+11!~9TZnw+dIDCz(rDNQZtvQ1FzR$=Jff zcA8OvgFR81^NJpzbjlTj_x^IcQ8xbq`{Qk2Dj~}*BDBy95!8-_f|8&+?rBg>kU9`4 zmtjF@Y+P|-v_!P4#z6#O%!E--Eec+ma1avPe-Nx|Sw-IGqPy2TDD0(~kO{Sh(%>Ro zpmo$~D`4Z`P|28LZm#v%(>uU80C+r~e!X;EbZaTfDPdj5nveLefSdEfUxs?63)9Zv z2jP<>2P*MIc@hy1u(Zx`3O_z@_d$3D-FY5(W^kAx!Gntr!Fs68^&XagWX631Vd5Wv z`rPXC*Q^`xf(6kV^+yz{mVSEOK`VhkS-7`@NBh~&(9ip_UYmO+#G|thG-Ovs&*rGh z(1a~%1rYJn-;=+=L11l^5K;l`uD#w zfHEIjeR!BI82t&H4o3~Y3wRl6X?Xj$G42jO-XY0Yn59h2IL|?R1JKBTdr(*!FC>7X zlag@xC{tL+N9`^y@o@8z&2!sa3@-h(zdNl%N{KT9+Fz3V_5H6ak2~zKEEdmfey>yF zKJ4}7EpN;1#&Hh(>rlrYxQ3UjW$sVA1f9+P!Gt%|R$PMdEJyM^nMgv2R|J5yb8zrC3^mE8w z?u^Pzy_|({B~PNN$o`HQm@o6(iDoOjH+y;YRJM+d_2z3juX7N8{!R18yjcUC73THM z9||HO!!{=~hVMI2Q_0|e!HIwPvaP?lO=EP&ddI|)`woq%A>F)O%#1;H_;4vwnt|4R z>Vu>vq{p*1VxWL#zZFq8%5sXbE=IkiAqjw45b=X`uoXTnm4sgo7f$MCB0;LK}YUsUzGc$`uj>)f=p zrQDh1MweU z64CB==o(?8+FGxxHbs0W=x-6%=u7Q+u`j=!QC6P4EvFh?$NVAtqN&)w98@?zp7JvX z0>$->IGnqCMR~#7c82k}(Sa$yOCpL#>o8si&krE0{>}vSQ>!LaI=hBv*Jy8ku?(Ge2L@JE~Gn0cPIn4(J7wY)! z$3VqYH~sOcLH%$?Hsu)yS&ITNKIj^he{9=u&A5#BkG_Rw3~IbMzw@{-$rPtd?%-!( z#8?cNmG`83c9HK6?|#*1VL6m#rcSl5emfjBbQWVKQM~cv4-L8M(wq31f(*A+57tI< zYevN1Vqk-@;8$iL^1`imVN3!KGI4F^C`b& z>^la9`P-Y<-Pw;A?G@reHJgoUksn7UH**p6~<>6p*cXSaWtSGeB z5MKNKhkA9+QEpaBek{#f;nv7WRU2Z>Pz2n0Z9MtkfBzR?9&Fjgv7CCyP)V2G%oo5c z+H2w4>>}g3SMON+E3es>_^Ry$hDqtZ{@AR8p7$~(Zdi@^xR<;a9(o>8sL!)Jb7B?k z{dv9mS1lGPDMcJuKxO#))}H+}8@F=*%Gmd;YF?i0p}V>ug$OvXT-3qQW<&pLMk4fZ z$mbd}(jOiYX^Qd1%g=eF$eFTx4cfI9Wxg$}P@wk!MjAg4BaHcyC3!odRn5;>w--+d zVsc$fK_`L4fVxB&`iw@7S}EnxU!YLVQ#mWMo5_4gvRl9LrdyuU_Lsxrd=A9ada5QK zDaW{e2})XqjwXNZXs}1prk5mK$pY8>WM-@={v47ov z{WbaP?y;TaM?RtK#cRj9U7=i^x+-=%e-_=2aMf@zK=7drD}T0^PS&}7k5k@npYHLf zbb^)$JSOapE6&L@=J(#M$>qVRul)Zyxu0oksoUdgy78rO6AySc8q*&vmEmH_3T)w| zN69}BTU$uIFXL9ZGI&hgz=4-4p%*x_F7?!Z#fGWvRbBAEI-yK0DcezI_dANJ-@}Km zJd2g!`7^CV>V0<_PzxasL*7{z;avt^j_9-gSFUgZJn6*8{0cofjx9sa3z89fu%P+y zFG-cXP>a@{dyMhdJypjW@}!ROY<=i0!?x`s^JY8;)J2{8rHF%_J?eiw`f^J855N=1 zv2T5mMoGk_!qLfl)(V`(edqZM70ncU=%@H5BxLkdE%gdCJh%PN zx)^FfJfU}&xk2E2AU^M&+1MDEDSQYpW&PB-A_}H>>pk5eRNva~8)7OI7NUb$^k)d& zah-mS*^cHd&$A_0rVM`d#@(cuB@ZOp2j2%=GwK@fndT)t@>2XWbcL4%;@Rl8*r`gI z{;H1FKtzJ&!pg_duiu}?7Ovt{zyKkS)+|Z|A%gV?1ede9CUleH@ zkNJFCT5`{yfQT=>ZXoRYxm}&~tRrHx2K}QgHa_VN*Tt;FkDLJjo{Uu3=~}&!)H&q^ zZoOXTXyo}nk0$s|Jrhyu_@L!>ZQ^z9_PaTNXEh(6K~x0zm{E{VitnAC=6HocNM2Eq zwE_)YPxk;$R8}n*Gi22D3Iht$bK*wtl@ZGa{f06ti6>%YSxS-HSuZ6z# zh%bX5PbO|he^#D!I63ca`>3T>avu-$IzIb-V*k%+Rl6G3Z#sd|?f>E7-$k_kG>rS} zCQ@NY1d;~ke`os*XLB4DywK;OHHE*Ow>PPW2X*fqogT=z;j(VOIjFzqQDn9Hou4Us z8Cmn6o}c))6X%=Ro!`b$pUQ{x&j^jNb*(-wIp;dN$&G3lRV}ptHM$*$JZ*!${qog_ zhzQyVa80T2XU^(*djXH_dc zoK$dZ@ED%S;vd&&mp}d1^db7T;pfUf^v7EtWQbSQR$T!+N}3XY-AMGGTy$x*_~Y~) z)7?pT3F-562V0?7<#6QfR^PN*^wG+*du|%pOI`Ew`LdT6=@4pL`K&i4*yXRZ(qCp7 zYr5U~Q3#4;mbtx9HK{bRZ-d zGLpxm+}>@ZhnGnx{3yw`Yiqv!;#qA?1bF$ldmi>Rp?82ZBty>#(+tns1Wk&;I(CWfs` zCS#TLdxmdh?UvWomApLj@PWzA`M4u_4Vc@rBPs*)0wxhwI|m0UB@mq%aP-iKYUIbP z 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 literal 0 HcmV?d00001 diff --git a/guide/public/assets/images/error-html-debug.png b/guide/public/assets/images/error-html-debug.png new file mode 100644 index 0000000000000000000000000000000000000000..a9bebc8f79797cb61ce7aac012f60664d1b1b826 GIT binary patch literal 134384 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�YRbjeLB+nO>)p2>^ygIyjJwosMV3ESVeo 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:eKOMPS1atMv;*3orZTQ;NpG> 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 literal 0 HcmV?d00001 diff --git a/guide/public/assets/images/error-html-no-debug.png b/guide/public/assets/images/error-html-no-debug.png new file mode 100644 index 0000000000000000000000000000000000000000..758b9acc8fce64baba9f1a16e2db7b0ae5039dcd GIT binary patch literal 63032 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

6hhrDpcyIjEgaraKB$19 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

}BP8#faZyt&h%|)^HqJMrEzD;_ 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

L;Ey$@Ysjh+ekY7Kg~!gxzfdb@G*i7 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 literal 0 HcmV?d00001 diff --git a/guide/public/assets/images/logo-white.svg b/guide/public/assets/images/logo-white.svg new file mode 100644 index 00000000..c0548398 --- /dev/null +++ b/guide/public/assets/images/logo-white.svg @@ -0,0 +1,54 @@ + + + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/public/assets/images/logo.svg b/guide/public/assets/images/logo.svg new file mode 100644 index 00000000..58531609 --- /dev/null +++ b/guide/public/assets/images/logo.svg @@ -0,0 +1,52 @@ + + + + + +image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/guide/public/assets/images/sanic-ext-redoc.png b/guide/public/assets/images/sanic-ext-redoc.png new file mode 100644 index 0000000000000000000000000000000000000000..5c9f26e6734c4b8495f21cdfbc59eed04f44af73 GIT binary patch literal 61275 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

*Aj4(-Q=5}Zpf>^6aa%DK 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 YtJ?8f!eQ)mcz7tMlupu*U%L4}0CA_r-v9sr literal 0 HcmV?d00001 diff --git a/guide/public/assets/images/sanic-ext-swagger.png b/guide/public/assets/images/sanic-ext-swagger.png new file mode 100644 index 0000000000000000000000000000000000000000..cd289710c3199e2f38e9b5ec7d816b1e93083e62 GIT binary patch literal 74918 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 z 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 PsHU!>eYfoPgXjMX^K|=# literal 0 HcmV?d00001 diff --git a/guide/public/assets/images/sanic-framework-logo-400x97.png b/guide/public/assets/images/sanic-framework-logo-400x97.png new file mode 100644 index 0000000000000000000000000000000000000000..f56cc941aa651de69bbf12e78dfcd9889c72dd8b GIT binary patch literal 13600 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 literal 0 HcmV?d00001 diff --git a/guide/public/assets/images/sanic-framework-logo-simple-400x97.png b/guide/public/assets/images/sanic-framework-logo-simple-400x97.png new file mode 100644 index 0000000000000000000000000000000000000000..8be21a83e1b9102e96dfba1145bb6101eb908445 GIT binary patch literal 10549 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 literal 0 HcmV?d00001 diff --git a/guide/public/assets/images/sanic-framework-logo-white-400x97.png b/guide/public/assets/images/sanic-framework-logo-white-400x97.png new file mode 100644 index 0000000000000000000000000000000000000000..a01796d6d53290249f5db6ad68e2e76795b5e364 GIT binary patch literal 13286 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 PasXvT4Oo@D<=g)O6rNpq literal 0 HcmV?d00001 diff --git a/guide/public/assets/style.css b/guide/public/assets/style.css new file mode 100644 index 00000000..462c81b2 --- /dev/null +++ b/guide/public/assets/style.css @@ -0,0 +1,13028 @@ +@charset "UTF-8"; +.has-text-purple { + color: #833FE3; } + +/*! bulma.io v0.9.4 | MIT License | github.com/jgthms/bulma */ +/* Bulma Utilities */ +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, .file-cta, +.file-name, .select select, .textarea, .input, .button { + -moz-appearance: none; + -webkit-appearance: none; + align-items: center; + border: 1px solid transparent; + border-radius: 4px; + box-shadow: none; + display: inline-flex; + font-size: 1rem; + height: 2.5em; + justify-content: flex-start; + line-height: 1.5; + padding-bottom: calc(0.5em - 1px); + padding-left: calc(0.75em - 1px); + padding-right: calc(0.75em - 1px); + padding-top: calc(0.5em - 1px); + position: relative; + vertical-align: top; } + .pagination-previous:focus, + .pagination-next:focus, + .pagination-link:focus, + .pagination-ellipsis:focus, .file-cta:focus, + .file-name:focus, .select select:focus, .textarea:focus, .input:focus, .button:focus, .is-focused.pagination-previous, + .is-focused.pagination-next, + .is-focused.pagination-link, + .is-focused.pagination-ellipsis, .is-focused.file-cta, + .is-focused.file-name, .select select.is-focused, .is-focused.textarea, .is-focused.input, .is-focused.button, .pagination-previous:active, + .pagination-next:active, + .pagination-link:active, + .pagination-ellipsis:active, .file-cta:active, + .file-name:active, .select select:active, .textarea:active, .input:active, .button:active, .is-active.pagination-previous, + .is-active.pagination-next, + .is-active.pagination-link, + .is-active.pagination-ellipsis, .is-active.file-cta, + .is-active.file-name, .select select.is-active, .is-active.textarea, .is-active.input, .is-active.button { + outline: none; } + [disabled].pagination-previous, + [disabled].pagination-next, + [disabled].pagination-link, + [disabled].pagination-ellipsis, [disabled].file-cta, + [disabled].file-name, .select select[disabled], [disabled].textarea, [disabled].input, [disabled].button, fieldset[disabled] .pagination-previous, + fieldset[disabled] .pagination-next, + fieldset[disabled] .pagination-link, + fieldset[disabled] .pagination-ellipsis, fieldset[disabled] .file-cta, + fieldset[disabled] .file-name, fieldset[disabled] .select select, .select fieldset[disabled] select, fieldset[disabled] .textarea, fieldset[disabled] .input, fieldset[disabled] .button { + cursor: not-allowed; } + +.is-unselectable, .tabs, .pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis, .breadcrumb, .file, .button { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } + +.navbar-link:not(.is-arrowless)::after, .select:not(.is-multiple):not(.is-loading)::after { + border: 3px solid transparent; + border-radius: 2px; + border-right: 0; + border-top: 0; + content: " "; + display: block; + height: 0.625em; + margin-top: -0.4375em; + pointer-events: none; + position: absolute; + top: 50%; + transform: rotate(-45deg); + transform-origin: center; + width: 0.625em; } + +.tabs:not(:last-child), .pagination:not(:last-child), .message:not(:last-child), .level:not(:last-child), .breadcrumb:not(:last-child), .block:not(:last-child), .title:not(:last-child), +.subtitle:not(:last-child), .table-container:not(:last-child), .table:not(:last-child), .progress:not(:last-child), .notification:not(:last-child), .content:not(:last-child), .box:not(:last-child) { + margin-bottom: 1.5rem; } + +.modal-close, .delete { + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + -moz-appearance: none; + -webkit-appearance: none; + background-color: rgba(10, 10, 10, 0.2); + border: none; + border-radius: 9999px; + cursor: pointer; + pointer-events: auto; + display: inline-block; + flex-grow: 0; + flex-shrink: 0; + font-size: 0; + height: 20px; + max-height: 20px; + max-width: 20px; + min-height: 20px; + min-width: 20px; + outline: none; + position: relative; + vertical-align: top; + width: 20px; } + .modal-close::before, .delete::before, .modal-close::after, .delete::after { + background-color: white; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; } + .modal-close::before, .delete::before { + height: 2px; + width: 50%; } + .modal-close::after, .delete::after { + height: 50%; + width: 2px; } + .modal-close:hover, .delete:hover, .modal-close:focus, .delete:focus { + background-color: rgba(10, 10, 10, 0.3); } + .modal-close:active, .delete:active { + background-color: rgba(10, 10, 10, 0.4); } + .is-small.modal-close, .is-small.delete { + height: 16px; + max-height: 16px; + max-width: 16px; + min-height: 16px; + min-width: 16px; + width: 16px; } + .is-medium.modal-close, .is-medium.delete { + height: 24px; + max-height: 24px; + max-width: 24px; + min-height: 24px; + min-width: 24px; + width: 24px; } + .is-large.modal-close, .is-large.delete { + height: 32px; + max-height: 32px; + max-width: 32px; + min-height: 32px; + min-width: 32px; + width: 32px; } + +.control.is-loading::after, .select.is-loading::after, .loader, .button.is-loading::after { + animation: spinAround 500ms infinite linear; + border: 2px solid #dbdbdb; + border-radius: 9999px; + border-right-color: transparent; + border-top-color: transparent; + content: ""; + display: block; + height: 1em; + position: relative; + width: 1em; } + +.hero-video, .is-overlay, .modal-background, .modal, .image.is-square img, +.image.is-square .has-ratio, .image.is-1by1 img, +.image.is-1by1 .has-ratio, .image.is-5by4 img, +.image.is-5by4 .has-ratio, .image.is-4by3 img, +.image.is-4by3 .has-ratio, .image.is-3by2 img, +.image.is-3by2 .has-ratio, .image.is-5by3 img, +.image.is-5by3 .has-ratio, .image.is-16by9 img, +.image.is-16by9 .has-ratio, .image.is-2by1 img, +.image.is-2by1 .has-ratio, .image.is-3by1 img, +.image.is-3by1 .has-ratio, .image.is-4by5 img, +.image.is-4by5 .has-ratio, .image.is-3by4 img, +.image.is-3by4 .has-ratio, .image.is-2by3 img, +.image.is-2by3 .has-ratio, .image.is-3by5 img, +.image.is-3by5 .has-ratio, .image.is-9by16 img, +.image.is-9by16 .has-ratio, .image.is-1by2 img, +.image.is-1by2 .has-ratio, .image.is-1by3 img, +.image.is-1by3 .has-ratio { + bottom: 0; + left: 0; + position: absolute; + right: 0; + top: 0; } + +.navbar-burger { + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + background: none; + border: none; + color: currentColor; + font-family: inherit; + font-size: 1em; + margin: 0; + padding: 0; } + +/* Bulma Base */ +/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */ +html, +body, +p, +ol, +ul, +li, +dl, +dt, +dd, +blockquote, +figure, +fieldset, +legend, +textarea, +pre, +iframe, +hr, +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 0; + padding: 0; } + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: 100%; + font-weight: normal; } + +ul { + list-style: none; } + +button, +input, +select, +textarea { + margin: 0; } + +html { + box-sizing: border-box; } + +*, *::before, *::after { + box-sizing: inherit; } + +img, +video { + height: auto; + max-width: 100%; } + +iframe { + border: 0; } + +table { + border-collapse: collapse; + border-spacing: 0; } + +td, +th { + padding: 0; } + td:not([align]), + th:not([align]) { + text-align: inherit; } + +html { + background-color: white; + font-size: 18px; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; + min-width: 300px; + overflow-x: hidden; + overflow-y: scroll; + text-rendering: optimizeLegibility; + text-size-adjust: 100%; } + +article, +aside, +figure, +footer, +header, +hgroup, +section { + display: block; } + +body, +button, +input, +optgroup, +select, +textarea { + font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif; } + +code, +pre { + -moz-osx-font-smoothing: auto; + -webkit-font-smoothing: auto; + font-family: monospace; } + +body { + color: #4a4a4a; + font-size: 1em; + font-weight: 400; + line-height: 1.5; } + +a { + color: #ff0d68; + cursor: pointer; + text-decoration: none; } + a strong { + color: currentColor; } + a:hover { + color: #363636; } + +code { + background-color: whitesmoke; + color: #da1039; + font-size: 0.875em; + font-weight: normal; + padding: 0.25em 0.5em 0.25em; } + +hr { + background-color: whitesmoke; + border: none; + display: block; + height: 2px; + margin: 1.5rem 0; } + +img { + height: auto; + max-width: 100%; } + +input[type="checkbox"], +input[type="radio"] { + vertical-align: baseline; } + +small { + font-size: 0.875em; } + +span { + font-style: inherit; + font-weight: inherit; } + +strong { + color: #363636; + font-weight: 700; } + +fieldset { + border: none; } + +pre { + -webkit-overflow-scrolling: touch; + background-color: whitesmoke; + color: #4a4a4a; + font-size: 0.875em; + overflow-x: auto; + padding: 1.25rem 1.5rem; + white-space: pre; + word-wrap: normal; } + pre code { + background-color: transparent; + color: currentColor; + font-size: 1em; + padding: 0; } + +table td, +table th { + vertical-align: top; } + table td:not([align]), + table th:not([align]) { + text-align: inherit; } + +table th { + color: #363636; } + +@keyframes spinAround { + from { + transform: rotate(0deg); } + to { + transform: rotate(359deg); } } + +/* Bulma Elements */ +.box { + background-color: white; + border-radius: 6px; + box-shadow: 0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1), 0 0px 0 1px rgba(10, 10, 10, 0.02); + color: #4a4a4a; + display: block; + padding: 1.25rem; } + +a.box:hover, a.box:focus { + box-shadow: 0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1), 0 0 0 1px #ff0d68; } + +a.box:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2), 0 0 0 1px #ff0d68; } + +.button { + background-color: white; + border-color: #dbdbdb; + border-width: 1px; + color: #363636; + cursor: pointer; + justify-content: center; + padding-bottom: calc(0.5em - 1px); + padding-left: 1em; + padding-right: 1em; + padding-top: calc(0.5em - 1px); + text-align: center; + white-space: nowrap; } + .button strong { + color: inherit; } + .button .icon, .button .icon.is-small, .button .icon.is-medium, .button .icon.is-large { + height: 1.5em; + width: 1.5em; } + .button .icon:first-child:not(:last-child) { + margin-left: calc(-0.5em - 1px); + margin-right: 0.25em; } + .button .icon:last-child:not(:first-child) { + margin-left: 0.25em; + margin-right: calc(-0.5em - 1px); } + .button .icon:first-child:last-child { + margin-left: calc(-0.5em - 1px); + margin-right: calc(-0.5em - 1px); } + .button:hover, .button.is-hovered { + border-color: #b5b5b5; + color: #363636; } + .button:focus, .button.is-focused { + border-color: #0092FF; + color: #363636; } + .button:focus:not(:active), .button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 13, 104, 0.25); } + .button:active, .button.is-active { + border-color: #4a4a4a; + color: #363636; } + .button.is-text { + background-color: transparent; + border-color: transparent; + color: #4a4a4a; + text-decoration: underline; } + .button.is-text:hover, .button.is-text.is-hovered, .button.is-text:focus, .button.is-text.is-focused { + background-color: whitesmoke; + color: #363636; } + .button.is-text:active, .button.is-text.is-active { + background-color: #e8e8e8; + color: #363636; } + .button.is-text[disabled], fieldset[disabled] .button.is-text { + background-color: transparent; + border-color: transparent; + box-shadow: none; } + .button.is-ghost { + background: none; + border-color: transparent; + color: #ff0d68; + text-decoration: none; } + .button.is-ghost:hover, .button.is-ghost.is-hovered { + color: #ff0d68; + text-decoration: underline; } + .button.is-white { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + .button.is-white:hover, .button.is-white.is-hovered { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + .button.is-white:focus, .button.is-white.is-focused { + border-color: transparent; + color: #0a0a0a; } + .button.is-white:focus:not(:active), .button.is-white.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .button.is-white:active, .button.is-white.is-active { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + .button.is-white[disabled], fieldset[disabled] .button.is-white { + background-color: white; + border-color: white; + box-shadow: none; } + .button.is-white.is-inverted { + background-color: #0a0a0a; + color: white; } + .button.is-white.is-inverted:hover, .button.is-white.is-inverted.is-hovered { + background-color: black; } + .button.is-white.is-inverted[disabled], fieldset[disabled] .button.is-white.is-inverted { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: white; } + .button.is-white.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-white.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + .button.is-white.is-outlined:hover, .button.is-white.is-outlined.is-hovered, .button.is-white.is-outlined:focus, .button.is-white.is-outlined.is-focused { + background-color: white; + border-color: white; + color: #0a0a0a; } + .button.is-white.is-outlined.is-loading::after { + border-color: transparent transparent white white !important; } + .button.is-white.is-outlined.is-loading:hover::after, .button.is-white.is-outlined.is-loading.is-hovered::after, .button.is-white.is-outlined.is-loading:focus::after, .button.is-white.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-white.is-outlined[disabled], fieldset[disabled] .button.is-white.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + .button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined.is-hovered, .button.is-white.is-inverted.is-outlined:focus, .button.is-white.is-inverted.is-outlined.is-focused { + background-color: #0a0a0a; + color: white; } + .button.is-white.is-inverted.is-outlined.is-loading:hover::after, .button.is-white.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-white.is-inverted.is-outlined.is-loading:focus::after, .button.is-white.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent white white !important; } + .button.is-white.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + .button.is-black { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + .button.is-black:hover, .button.is-black.is-hovered { + background-color: #040404; + border-color: transparent; + color: white; } + .button.is-black:focus, .button.is-black.is-focused { + border-color: transparent; + color: white; } + .button.is-black:focus:not(:active), .button.is-black.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .button.is-black:active, .button.is-black.is-active { + background-color: black; + border-color: transparent; + color: white; } + .button.is-black[disabled], fieldset[disabled] .button.is-black { + background-color: #0a0a0a; + border-color: #0a0a0a; + box-shadow: none; } + .button.is-black.is-inverted { + background-color: white; + color: #0a0a0a; } + .button.is-black.is-inverted:hover, .button.is-black.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-black.is-inverted[disabled], fieldset[disabled] .button.is-black.is-inverted { + background-color: white; + border-color: transparent; + box-shadow: none; + color: #0a0a0a; } + .button.is-black.is-loading::after { + border-color: transparent transparent white white !important; } + .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + .button.is-black.is-outlined:hover, .button.is-black.is-outlined.is-hovered, .button.is-black.is-outlined:focus, .button.is-black.is-outlined.is-focused { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .button.is-black.is-outlined.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-black.is-outlined.is-loading:hover::after, .button.is-black.is-outlined.is-loading.is-hovered::after, .button.is-black.is-outlined.is-loading:focus::after, .button.is-black.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent white white !important; } + .button.is-black.is-outlined[disabled], fieldset[disabled] .button.is-black.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + .button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined.is-hovered, .button.is-black.is-inverted.is-outlined:focus, .button.is-black.is-inverted.is-outlined.is-focused { + background-color: white; + color: #0a0a0a; } + .button.is-black.is-inverted.is-outlined.is-loading:hover::after, .button.is-black.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-black.is-inverted.is-outlined.is-loading:focus::after, .button.is-black.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-black.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + .button.is-light { + background-color: whitesmoke; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-light:hover, .button.is-light.is-hovered { + background-color: #eeeeee; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-light:focus, .button.is-light.is-focused { + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-light:focus:not(:active), .button.is-light.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .button.is-light:active, .button.is-light.is-active { + background-color: #e8e8e8; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-light[disabled], fieldset[disabled] .button.is-light { + background-color: whitesmoke; + border-color: whitesmoke; + box-shadow: none; } + .button.is-light.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: whitesmoke; } + .button.is-light.is-inverted:hover, .button.is-light.is-inverted.is-hovered { + background-color: rgba(0, 0, 0, 0.7); } + .button.is-light.is-inverted[disabled], fieldset[disabled] .button.is-light.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + box-shadow: none; + color: whitesmoke; } + .button.is-light.is-loading::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-light.is-outlined { + background-color: transparent; + border-color: whitesmoke; + color: whitesmoke; } + .button.is-light.is-outlined:hover, .button.is-light.is-outlined.is-hovered, .button.is-light.is-outlined:focus, .button.is-light.is-outlined.is-focused { + background-color: whitesmoke; + border-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .button.is-light.is-outlined.is-loading::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-light.is-outlined.is-loading:hover::after, .button.is-light.is-outlined.is-loading.is-hovered::after, .button.is-light.is-outlined.is-loading:focus::after, .button.is-light.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-light.is-outlined[disabled], fieldset[disabled] .button.is-light.is-outlined { + background-color: transparent; + border-color: whitesmoke; + box-shadow: none; + color: whitesmoke; } + .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); } + .button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined.is-hovered, .button.is-light.is-inverted.is-outlined:focus, .button.is-light.is-inverted.is-outlined.is-focused { + background-color: rgba(0, 0, 0, 0.7); + color: whitesmoke; } + .button.is-light.is-inverted.is-outlined.is-loading:hover::after, .button.is-light.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-light.is-inverted.is-outlined.is-loading:focus::after, .button.is-light.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-light.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + box-shadow: none; + color: rgba(0, 0, 0, 0.7); } + .button.is-dark { + background-color: #363636; + border-color: transparent; + color: #fff; } + .button.is-dark:hover, .button.is-dark.is-hovered { + background-color: #2f2f2f; + border-color: transparent; + color: #fff; } + .button.is-dark:focus, .button.is-dark.is-focused { + border-color: transparent; + color: #fff; } + .button.is-dark:focus:not(:active), .button.is-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .button.is-dark:active, .button.is-dark.is-active { + background-color: #292929; + border-color: transparent; + color: #fff; } + .button.is-dark[disabled], fieldset[disabled] .button.is-dark { + background-color: #363636; + border-color: #363636; + box-shadow: none; } + .button.is-dark.is-inverted { + background-color: #fff; + color: #363636; } + .button.is-dark.is-inverted:hover, .button.is-dark.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-dark.is-inverted[disabled], fieldset[disabled] .button.is-dark.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #363636; } + .button.is-dark.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-dark.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; } + .button.is-dark.is-outlined:hover, .button.is-dark.is-outlined.is-hovered, .button.is-dark.is-outlined:focus, .button.is-dark.is-outlined.is-focused { + background-color: #363636; + border-color: #363636; + color: #fff; } + .button.is-dark.is-outlined.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-dark.is-outlined.is-loading:hover::after, .button.is-dark.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-outlined.is-loading:focus::after, .button.is-dark.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-dark.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; } + .button.is-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-dark.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined.is-hovered, .button.is-dark.is-inverted.is-outlined:focus, .button.is-dark.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #363636; } + .button.is-dark.is-inverted.is-outlined.is-loading:hover::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-dark.is-inverted.is-outlined.is-loading:focus::after, .button.is-dark.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-dark.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-primary { + background-color: #ff0d68; + border-color: transparent; + color: #fff; } + .button.is-primary:hover, .button.is-primary.is-hovered { + background-color: #ff0060; + border-color: transparent; + color: #fff; } + .button.is-primary:focus, .button.is-primary.is-focused { + border-color: transparent; + color: #fff; } + .button.is-primary:focus:not(:active), .button.is-primary.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 13, 104, 0.25); } + .button.is-primary:active, .button.is-primary.is-active { + background-color: #f3005b; + border-color: transparent; + color: #fff; } + .button.is-primary[disabled], fieldset[disabled] .button.is-primary { + background-color: #ff0d68; + border-color: #ff0d68; + box-shadow: none; } + .button.is-primary.is-inverted { + background-color: #fff; + color: #ff0d68; } + .button.is-primary.is-inverted:hover, .button.is-primary.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-primary.is-inverted[disabled], fieldset[disabled] .button.is-primary.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #ff0d68; } + .button.is-primary.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-primary.is-outlined { + background-color: transparent; + border-color: #ff0d68; + color: #ff0d68; } + .button.is-primary.is-outlined:hover, .button.is-primary.is-outlined.is-hovered, .button.is-primary.is-outlined:focus, .button.is-primary.is-outlined.is-focused { + background-color: #ff0d68; + border-color: #ff0d68; + color: #fff; } + .button.is-primary.is-outlined.is-loading::after { + border-color: transparent transparent #ff0d68 #ff0d68 !important; } + .button.is-primary.is-outlined.is-loading:hover::after, .button.is-primary.is-outlined.is-loading.is-hovered::after, .button.is-primary.is-outlined.is-loading:focus::after, .button.is-primary.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-primary.is-outlined[disabled], fieldset[disabled] .button.is-primary.is-outlined { + background-color: transparent; + border-color: #ff0d68; + box-shadow: none; + color: #ff0d68; } + .button.is-primary.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-primary.is-inverted.is-outlined:hover, .button.is-primary.is-inverted.is-outlined.is-hovered, .button.is-primary.is-inverted.is-outlined:focus, .button.is-primary.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #ff0d68; } + .button.is-primary.is-inverted.is-outlined.is-loading:hover::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-primary.is-inverted.is-outlined.is-loading:focus::after, .button.is-primary.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ff0d68 #ff0d68 !important; } + .button.is-primary.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-primary.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-primary.is-light { + background-color: #ffebf2; + color: #e60056; } + .button.is-primary.is-light:hover, .button.is-primary.is-light.is-hovered { + background-color: #ffdeea; + border-color: transparent; + color: #e60056; } + .button.is-primary.is-light:active, .button.is-primary.is-light.is-active { + background-color: #ffd1e2; + border-color: transparent; + color: #e60056; } + .button.is-link { + background-color: #ff0d68; + border-color: transparent; + color: #fff; } + .button.is-link:hover, .button.is-link.is-hovered { + background-color: #ff0060; + border-color: transparent; + color: #fff; } + .button.is-link:focus, .button.is-link.is-focused { + border-color: transparent; + color: #fff; } + .button.is-link:focus:not(:active), .button.is-link.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 13, 104, 0.25); } + .button.is-link:active, .button.is-link.is-active { + background-color: #f3005b; + border-color: transparent; + color: #fff; } + .button.is-link[disabled], fieldset[disabled] .button.is-link { + background-color: #ff0d68; + border-color: #ff0d68; + box-shadow: none; } + .button.is-link.is-inverted { + background-color: #fff; + color: #ff0d68; } + .button.is-link.is-inverted:hover, .button.is-link.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-link.is-inverted[disabled], fieldset[disabled] .button.is-link.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #ff0d68; } + .button.is-link.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-link.is-outlined { + background-color: transparent; + border-color: #ff0d68; + color: #ff0d68; } + .button.is-link.is-outlined:hover, .button.is-link.is-outlined.is-hovered, .button.is-link.is-outlined:focus, .button.is-link.is-outlined.is-focused { + background-color: #ff0d68; + border-color: #ff0d68; + color: #fff; } + .button.is-link.is-outlined.is-loading::after { + border-color: transparent transparent #ff0d68 #ff0d68 !important; } + .button.is-link.is-outlined.is-loading:hover::after, .button.is-link.is-outlined.is-loading.is-hovered::after, .button.is-link.is-outlined.is-loading:focus::after, .button.is-link.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-link.is-outlined[disabled], fieldset[disabled] .button.is-link.is-outlined { + background-color: transparent; + border-color: #ff0d68; + box-shadow: none; + color: #ff0d68; } + .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-link.is-inverted.is-outlined:hover, .button.is-link.is-inverted.is-outlined.is-hovered, .button.is-link.is-inverted.is-outlined:focus, .button.is-link.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #ff0d68; } + .button.is-link.is-inverted.is-outlined.is-loading:hover::after, .button.is-link.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-link.is-inverted.is-outlined.is-loading:focus::after, .button.is-link.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #ff0d68 #ff0d68 !important; } + .button.is-link.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-link.is-light { + background-color: #ffebf2; + color: #e60056; } + .button.is-link.is-light:hover, .button.is-link.is-light.is-hovered { + background-color: #ffdeea; + border-color: transparent; + color: #e60056; } + .button.is-link.is-light:active, .button.is-link.is-light.is-active { + background-color: #ffd1e2; + border-color: transparent; + color: #e60056; } + .button.is-info { + background-color: #0092FF; + border-color: transparent; + color: #fff; } + .button.is-info:hover, .button.is-info.is-hovered { + background-color: #008bf2; + border-color: transparent; + color: #fff; } + .button.is-info:focus, .button.is-info.is-focused { + border-color: transparent; + color: #fff; } + .button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(0, 146, 255, 0.25); } + .button.is-info:active, .button.is-info.is-active { + background-color: #0083e6; + border-color: transparent; + color: #fff; } + .button.is-info[disabled], fieldset[disabled] .button.is-info { + background-color: #0092FF; + border-color: #0092FF; + box-shadow: none; } + .button.is-info.is-inverted { + background-color: #fff; + color: #0092FF; } + .button.is-info.is-inverted:hover, .button.is-info.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-info.is-inverted[disabled], fieldset[disabled] .button.is-info.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #0092FF; } + .button.is-info.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-info.is-outlined { + background-color: transparent; + border-color: #0092FF; + color: #0092FF; } + .button.is-info.is-outlined:hover, .button.is-info.is-outlined.is-hovered, .button.is-info.is-outlined:focus, .button.is-info.is-outlined.is-focused { + background-color: #0092FF; + border-color: #0092FF; + color: #fff; } + .button.is-info.is-outlined.is-loading::after { + border-color: transparent transparent #0092FF #0092FF !important; } + .button.is-info.is-outlined.is-loading:hover::after, .button.is-info.is-outlined.is-loading.is-hovered::after, .button.is-info.is-outlined.is-loading:focus::after, .button.is-info.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-info.is-outlined[disabled], fieldset[disabled] .button.is-info.is-outlined { + background-color: transparent; + border-color: #0092FF; + box-shadow: none; + color: #0092FF; } + .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined.is-hovered, .button.is-info.is-inverted.is-outlined:focus, .button.is-info.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #0092FF; } + .button.is-info.is-inverted.is-outlined.is-loading:hover::after, .button.is-info.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-info.is-inverted.is-outlined.is-loading:focus::after, .button.is-info.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #0092FF #0092FF !important; } + .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-info.is-light { + background-color: #ebf6ff; + color: #0075cc; } + .button.is-info.is-light:hover, .button.is-info.is-light.is-hovered { + background-color: #def1ff; + border-color: transparent; + color: #0075cc; } + .button.is-info.is-light:active, .button.is-info.is-light.is-active { + background-color: #d1ebff; + border-color: transparent; + color: #0075cc; } + .button.is-success { + background-color: #16DB93; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-success:hover, .button.is-success.is-hovered { + background-color: #15cf8b; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-success:focus, .button.is-success.is-focused { + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-success:focus:not(:active), .button.is-success.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(22, 219, 147, 0.25); } + .button.is-success:active, .button.is-success.is-active { + background-color: #14c483; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-success[disabled], fieldset[disabled] .button.is-success { + background-color: #16DB93; + border-color: #16DB93; + box-shadow: none; } + .button.is-success.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: #16DB93; } + .button.is-success.is-inverted:hover, .button.is-success.is-inverted.is-hovered { + background-color: rgba(0, 0, 0, 0.7); } + .button.is-success.is-inverted[disabled], fieldset[disabled] .button.is-success.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + box-shadow: none; + color: #16DB93; } + .button.is-success.is-loading::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-success.is-outlined { + background-color: transparent; + border-color: #16DB93; + color: #16DB93; } + .button.is-success.is-outlined:hover, .button.is-success.is-outlined.is-hovered, .button.is-success.is-outlined:focus, .button.is-success.is-outlined.is-focused { + background-color: #16DB93; + border-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .button.is-success.is-outlined.is-loading::after { + border-color: transparent transparent #16DB93 #16DB93 !important; } + .button.is-success.is-outlined.is-loading:hover::after, .button.is-success.is-outlined.is-loading.is-hovered::after, .button.is-success.is-outlined.is-loading:focus::after, .button.is-success.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-success.is-outlined[disabled], fieldset[disabled] .button.is-success.is-outlined { + background-color: transparent; + border-color: #16DB93; + box-shadow: none; + color: #16DB93; } + .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); } + .button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined.is-hovered, .button.is-success.is-inverted.is-outlined:focus, .button.is-success.is-inverted.is-outlined.is-focused { + background-color: rgba(0, 0, 0, 0.7); + color: #16DB93; } + .button.is-success.is-inverted.is-outlined.is-loading:hover::after, .button.is-success.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-success.is-inverted.is-outlined.is-loading:focus::after, .button.is-success.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #16DB93 #16DB93 !important; } + .button.is-success.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + box-shadow: none; + color: rgba(0, 0, 0, 0.7); } + .button.is-success.is-light { + background-color: #ecfdf7; + color: #0e865a; } + .button.is-success.is-light:hover, .button.is-success.is-light.is-hovered { + background-color: #e1fcf2; + border-color: transparent; + color: #0e865a; } + .button.is-success.is-light:active, .button.is-success.is-light.is-active { + background-color: #d5fbed; + border-color: transparent; + color: #0e865a; } + .button.is-warning { + background-color: #FFE900; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:hover, .button.is-warning.is-hovered { + background-color: #f2dd00; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:focus, .button.is-warning.is-focused { + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:focus:not(:active), .button.is-warning.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 233, 0, 0.25); } + .button.is-warning:active, .button.is-warning.is-active { + background-color: #e6d200; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning[disabled], fieldset[disabled] .button.is-warning { + background-color: #FFE900; + border-color: #FFE900; + box-shadow: none; } + .button.is-warning.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: #FFE900; } + .button.is-warning.is-inverted:hover, .button.is-warning.is-inverted.is-hovered { + background-color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-inverted[disabled], fieldset[disabled] .button.is-warning.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + box-shadow: none; + color: #FFE900; } + .button.is-warning.is-loading::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-warning.is-outlined { + background-color: transparent; + border-color: #FFE900; + color: #FFE900; } + .button.is-warning.is-outlined:hover, .button.is-warning.is-outlined.is-hovered, .button.is-warning.is-outlined:focus, .button.is-warning.is-outlined.is-focused { + background-color: #FFE900; + border-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-outlined.is-loading::after { + border-color: transparent transparent #FFE900 #FFE900 !important; } + .button.is-warning.is-outlined.is-loading:hover::after, .button.is-warning.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-outlined.is-loading:focus::after, .button.is-warning.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-warning.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-outlined { + background-color: transparent; + border-color: #FFE900; + box-shadow: none; + color: #FFE900; } + .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined.is-hovered, .button.is-warning.is-inverted.is-outlined:focus, .button.is-warning.is-inverted.is-outlined.is-focused { + background-color: rgba(0, 0, 0, 0.7); + color: #FFE900; } + .button.is-warning.is-inverted.is-outlined.is-loading:hover::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-warning.is-inverted.is-outlined.is-loading:focus::after, .button.is-warning.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #FFE900 #FFE900 !important; } + .button.is-warning.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + box-shadow: none; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-light { + background-color: #fffdeb; + color: #948700; } + .button.is-warning.is-light:hover, .button.is-warning.is-light.is-hovered { + background-color: #fffcde; + border-color: transparent; + color: #948700; } + .button.is-warning.is-light:active, .button.is-warning.is-light.is-active { + background-color: #fffbd1; + border-color: transparent; + color: #948700; } + .button.is-danger { + background-color: #f14668; + border-color: transparent; + color: #fff; } + .button.is-danger:hover, .button.is-danger.is-hovered { + background-color: #f03a5f; + border-color: transparent; + color: #fff; } + .button.is-danger:focus, .button.is-danger.is-focused { + border-color: transparent; + color: #fff; } + .button.is-danger:focus:not(:active), .button.is-danger.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(241, 70, 104, 0.25); } + .button.is-danger:active, .button.is-danger.is-active { + background-color: #ef2e55; + border-color: transparent; + color: #fff; } + .button.is-danger[disabled], fieldset[disabled] .button.is-danger { + background-color: #f14668; + border-color: #f14668; + box-shadow: none; } + .button.is-danger.is-inverted { + background-color: #fff; + color: #f14668; } + .button.is-danger.is-inverted:hover, .button.is-danger.is-inverted.is-hovered { + background-color: #f2f2f2; } + .button.is-danger.is-inverted[disabled], fieldset[disabled] .button.is-danger.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #f14668; } + .button.is-danger.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-danger.is-outlined { + background-color: transparent; + border-color: #f14668; + color: #f14668; } + .button.is-danger.is-outlined:hover, .button.is-danger.is-outlined.is-hovered, .button.is-danger.is-outlined:focus, .button.is-danger.is-outlined.is-focused { + background-color: #f14668; + border-color: #f14668; + color: #fff; } + .button.is-danger.is-outlined.is-loading::after { + border-color: transparent transparent #f14668 #f14668 !important; } + .button.is-danger.is-outlined.is-loading:hover::after, .button.is-danger.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-outlined.is-loading:focus::after, .button.is-danger.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-danger.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-outlined { + background-color: transparent; + border-color: #f14668; + box-shadow: none; + color: #f14668; } + .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined.is-hovered, .button.is-danger.is-inverted.is-outlined:focus, .button.is-danger.is-inverted.is-outlined.is-focused { + background-color: #fff; + color: #f14668; } + .button.is-danger.is-inverted.is-outlined.is-loading:hover::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-hovered::after, .button.is-danger.is-inverted.is-outlined.is-loading:focus::after, .button.is-danger.is-inverted.is-outlined.is-loading.is-focused::after { + border-color: transparent transparent #f14668 #f14668 !important; } + .button.is-danger.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-danger.is-light { + background-color: #feecf0; + color: #cc0f35; } + .button.is-danger.is-light:hover, .button.is-danger.is-light.is-hovered { + background-color: #fde0e6; + border-color: transparent; + color: #cc0f35; } + .button.is-danger.is-light:active, .button.is-danger.is-light.is-active { + background-color: #fcd4dc; + border-color: transparent; + color: #cc0f35; } + .button.is-small { + font-size: 0.75rem; } + .button.is-small:not(.is-rounded) { + border-radius: 2px; } + .button.is-normal { + font-size: 1rem; } + .button.is-medium { + font-size: 1.25rem; } + .button.is-large { + font-size: 1.5rem; } + .button[disabled], fieldset[disabled] .button { + background-color: white; + border-color: #dbdbdb; + box-shadow: none; + opacity: 0.5; } + .button.is-fullwidth { + display: flex; + width: 100%; } + .button.is-loading { + color: transparent !important; + pointer-events: none; } + .button.is-loading::after { + position: absolute; + left: calc(50% - (1em * 0.5)); + top: calc(50% - (1em * 0.5)); + position: absolute !important; } + .button.is-static { + background-color: whitesmoke; + border-color: #dbdbdb; + color: #7a7a7a; + box-shadow: none; + pointer-events: none; } + .button.is-rounded { + border-radius: 9999px; + padding-left: calc(1em + 0.25em); + padding-right: calc(1em + 0.25em); } + +.buttons { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + .buttons .button { + margin-bottom: 0.5rem; } + .buttons .button:not(:last-child):not(.is-fullwidth) { + margin-right: 0.5rem; } + .buttons:last-child { + margin-bottom: -0.5rem; } + .buttons:not(:last-child) { + margin-bottom: 1rem; } + .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large) { + font-size: 0.75rem; } + .buttons.are-small .button:not(.is-normal):not(.is-medium):not(.is-large):not(.is-rounded) { + border-radius: 2px; } + .buttons.are-medium .button:not(.is-small):not(.is-normal):not(.is-large) { + font-size: 1.25rem; } + .buttons.are-large .button:not(.is-small):not(.is-normal):not(.is-medium) { + font-size: 1.5rem; } + .buttons.has-addons .button:not(:first-child) { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .buttons.has-addons .button:not(:last-child) { + border-bottom-right-radius: 0; + border-top-right-radius: 0; + margin-right: -1px; } + .buttons.has-addons .button:last-child { + margin-right: 0; } + .buttons.has-addons .button:hover, .buttons.has-addons .button.is-hovered { + z-index: 2; } + .buttons.has-addons .button:focus, .buttons.has-addons .button.is-focused, .buttons.has-addons .button:active, .buttons.has-addons .button.is-active, .buttons.has-addons .button.is-selected { + z-index: 3; } + .buttons.has-addons .button:focus:hover, .buttons.has-addons .button.is-focused:hover, .buttons.has-addons .button:active:hover, .buttons.has-addons .button.is-active:hover, .buttons.has-addons .button.is-selected:hover { + z-index: 4; } + .buttons.has-addons .button.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .buttons.is-centered { + justify-content: center; } + .buttons.is-centered:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; } + .buttons.is-right { + justify-content: flex-end; } + .buttons.is-right:not(.has-addons) .button:not(.is-fullwidth) { + margin-left: 0.25rem; + margin-right: 0.25rem; } + +@media screen and (max-width: 768px) { + .button.is-responsive.is-small { + font-size: 0.5625rem; } + .button.is-responsive, + .button.is-responsive.is-normal { + font-size: 0.65625rem; } + .button.is-responsive.is-medium { + font-size: 0.75rem; } + .button.is-responsive.is-large { + font-size: 1rem; } } + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .button.is-responsive.is-small { + font-size: 0.65625rem; } + .button.is-responsive, + .button.is-responsive.is-normal { + font-size: 0.75rem; } + .button.is-responsive.is-medium { + font-size: 1rem; } + .button.is-responsive.is-large { + font-size: 1.25rem; } } + +.container { + flex-grow: 1; + margin: 0 auto; + position: relative; + width: auto; } + .container.is-fluid { + max-width: none !important; + padding-left: 32px; + padding-right: 32px; + width: 100%; } + @media screen and (min-width: 1024px) { + .container { + max-width: 960px; } } + @media screen and (max-width: 1215px) { + .container.is-widescreen:not(.is-max-desktop) { + max-width: 1152px; } } + @media screen and (max-width: 1407px) { + .container.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen) { + max-width: 1344px; } } + @media screen and (min-width: 1216px) { + .container:not(.is-max-desktop) { + max-width: 1152px; } } + @media screen and (min-width: 1408px) { + .container:not(.is-max-desktop):not(.is-max-widescreen) { + max-width: 1344px; } } +.content li + li { + margin-top: 0.25em; } + +.content p:not(:last-child), +.content dl:not(:last-child), +.content ol:not(:last-child), +.content ul:not(:last-child), +.content blockquote:not(:last-child), +.content pre:not(:last-child), +.content table:not(:last-child) { + margin-bottom: 1em; } + +.content h1, +.content h2, +.content h3, +.content h4, +.content h5, +.content h6 { + color: #363636; + font-weight: 600; + line-height: 1.125; } + +.content h1 { + font-size: 2em; + margin-bottom: 0.5em; } + .content h1:not(:first-child) { + margin-top: 1em; } + +.content h2 { + font-size: 1.75em; + margin-bottom: 0.5714em; } + .content h2:not(:first-child) { + margin-top: 1.1428em; } + +.content h3 { + font-size: 1.5em; + margin-bottom: 0.6666em; } + .content h3:not(:first-child) { + margin-top: 1.3333em; } + +.content h4 { + font-size: 1.25em; + margin-bottom: 0.8em; } + +.content h5 { + font-size: 1.125em; + margin-bottom: 0.8888em; } + +.content h6 { + font-size: 1em; + margin-bottom: 1em; } + +.content blockquote { + background-color: whitesmoke; + border-left: 5px solid #dbdbdb; + padding: 1.25em 1.5em; } + +.content ol { + list-style-position: outside; + margin-left: 2em; + margin-top: 1em; } + .content ol:not([type]) { + list-style-type: decimal; } + .content ol:not([type]).is-lower-alpha { + list-style-type: lower-alpha; } + .content ol:not([type]).is-lower-roman { + list-style-type: lower-roman; } + .content ol:not([type]).is-upper-alpha { + list-style-type: upper-alpha; } + .content ol:not([type]).is-upper-roman { + list-style-type: upper-roman; } + +.content ul { + list-style: disc outside; + margin-left: 2em; + margin-top: 1em; } + .content ul ul { + list-style-type: circle; + margin-top: 0.5em; } + .content ul ul ul { + list-style-type: square; } + +.content dd { + margin-left: 2em; } + +.content figure { + margin-left: 2em; + margin-right: 2em; + text-align: center; } + .content figure:not(:first-child) { + margin-top: 2em; } + .content figure:not(:last-child) { + margin-bottom: 2em; } + .content figure img { + display: inline-block; } + .content figure figcaption { + font-style: italic; } + +.content pre { + -webkit-overflow-scrolling: touch; + overflow-x: auto; + padding: 1.25em 1.5em; + white-space: pre; + word-wrap: normal; } + +.content sup, +.content sub { + font-size: 75%; } + +.content table { + width: 100%; } + .content table td, + .content table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; } + .content table th { + color: #363636; } + .content table th:not([align]) { + text-align: inherit; } + .content table thead td, + .content table thead th { + border-width: 0 0 2px; + color: #363636; } + .content table tfoot td, + .content table tfoot th { + border-width: 2px 0 0; + color: #363636; } + .content table tbody tr:last-child td, + .content table tbody tr:last-child th { + border-bottom-width: 0; } + +.content .tabs li + li { + margin-top: 0; } + +.content.is-small { + font-size: 0.75rem; } + +.content.is-normal { + font-size: 1rem; } + +.content.is-medium { + font-size: 1.25rem; } + +.content.is-large { + font-size: 1.5rem; } + +.icon { + align-items: center; + display: inline-flex; + justify-content: center; + height: 1.5rem; + width: 1.5rem; } + .icon.is-small { + height: 1rem; + width: 1rem; } + .icon.is-medium { + height: 2rem; + width: 2rem; } + .icon.is-large { + height: 3rem; + width: 3rem; } + +.icon-text { + align-items: flex-start; + color: inherit; + display: inline-flex; + flex-wrap: wrap; + line-height: 1.5rem; + vertical-align: top; } + .icon-text .icon { + flex-grow: 0; + flex-shrink: 0; } + .icon-text .icon:not(:last-child) { + margin-right: 0.25em; } + .icon-text .icon:not(:first-child) { + margin-left: 0.25em; } + +div.icon-text { + display: flex; } + +.image { + display: block; + position: relative; } + .image img { + display: block; + height: auto; + width: 100%; } + .image img.is-rounded { + border-radius: 9999px; } + .image.is-fullwidth { + width: 100%; } + .image.is-square img, + .image.is-square .has-ratio, .image.is-1by1 img, + .image.is-1by1 .has-ratio, .image.is-5by4 img, + .image.is-5by4 .has-ratio, .image.is-4by3 img, + .image.is-4by3 .has-ratio, .image.is-3by2 img, + .image.is-3by2 .has-ratio, .image.is-5by3 img, + .image.is-5by3 .has-ratio, .image.is-16by9 img, + .image.is-16by9 .has-ratio, .image.is-2by1 img, + .image.is-2by1 .has-ratio, .image.is-3by1 img, + .image.is-3by1 .has-ratio, .image.is-4by5 img, + .image.is-4by5 .has-ratio, .image.is-3by4 img, + .image.is-3by4 .has-ratio, .image.is-2by3 img, + .image.is-2by3 .has-ratio, .image.is-3by5 img, + .image.is-3by5 .has-ratio, .image.is-9by16 img, + .image.is-9by16 .has-ratio, .image.is-1by2 img, + .image.is-1by2 .has-ratio, .image.is-1by3 img, + .image.is-1by3 .has-ratio { + height: 100%; + width: 100%; } + .image.is-square, .image.is-1by1 { + padding-top: 100%; } + .image.is-5by4 { + padding-top: 80%; } + .image.is-4by3 { + padding-top: 75%; } + .image.is-3by2 { + padding-top: 66.6666%; } + .image.is-5by3 { + padding-top: 60%; } + .image.is-16by9 { + padding-top: 56.25%; } + .image.is-2by1 { + padding-top: 50%; } + .image.is-3by1 { + padding-top: 33.3333%; } + .image.is-4by5 { + padding-top: 125%; } + .image.is-3by4 { + padding-top: 133.3333%; } + .image.is-2by3 { + padding-top: 150%; } + .image.is-3by5 { + padding-top: 166.6666%; } + .image.is-9by16 { + padding-top: 177.7777%; } + .image.is-1by2 { + padding-top: 200%; } + .image.is-1by3 { + padding-top: 300%; } + .image.is-16x16 { + height: 16px; + width: 16px; } + .image.is-24x24 { + height: 24px; + width: 24px; } + .image.is-32x32 { + height: 32px; + width: 32px; } + .image.is-48x48 { + height: 48px; + width: 48px; } + .image.is-64x64 { + height: 64px; + width: 64px; } + .image.is-96x96 { + height: 96px; + width: 96px; } + .image.is-128x128 { + height: 128px; + width: 128px; } + +.notification { + background-color: whitesmoke; + border-radius: 4px; + position: relative; + padding: 1.25rem 2.5rem 1.25rem 1.5rem; } + .notification a:not(.button):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; } + .notification strong { + color: currentColor; } + .notification code, + .notification pre { + background: white; } + .notification pre code { + background: transparent; } + .notification > .delete { + right: 0.5rem; + position: absolute; + top: 0.5rem; } + .notification .title, + .notification .subtitle, + .notification .content { + color: currentColor; } + .notification.is-white { + background-color: white; + color: #0a0a0a; } + .notification.is-black { + background-color: #0a0a0a; + color: white; } + .notification.is-light { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .notification.is-dark { + background-color: #363636; + color: #fff; } + .notification.is-primary { + background-color: #ff0d68; + color: #fff; } + .notification.is-primary.is-light { + background-color: #ffebf2; + color: #e60056; } + .notification.is-link { + background-color: #ff0d68; + color: #fff; } + .notification.is-link.is-light { + background-color: #ffebf2; + color: #e60056; } + .notification.is-info { + background-color: #0092FF; + color: #fff; } + .notification.is-info.is-light { + background-color: #ebf6ff; + color: #0075cc; } + .notification.is-success { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .notification.is-success.is-light { + background-color: #ecfdf7; + color: #0e865a; } + .notification.is-warning { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .notification.is-warning.is-light { + background-color: #fffdeb; + color: #948700; } + .notification.is-danger { + background-color: #f14668; + color: #fff; } + .notification.is-danger.is-light { + background-color: #feecf0; + color: #cc0f35; } + +.progress { + -moz-appearance: none; + -webkit-appearance: none; + border: none; + border-radius: 9999px; + display: block; + height: 1rem; + overflow: hidden; + padding: 0; + width: 100%; } + .progress::-webkit-progress-bar { + background-color: #ededed; } + .progress::-webkit-progress-value { + background-color: #4a4a4a; } + .progress::-moz-progress-bar { + background-color: #4a4a4a; } + .progress::-ms-fill { + background-color: #4a4a4a; + border: none; } + .progress.is-white::-webkit-progress-value { + background-color: white; } + .progress.is-white::-moz-progress-bar { + background-color: white; } + .progress.is-white::-ms-fill { + background-color: white; } + .progress.is-white:indeterminate { + background-image: linear-gradient(to right, white 30%, #ededed 30%); } + .progress.is-black::-webkit-progress-value { + background-color: #0a0a0a; } + .progress.is-black::-moz-progress-bar { + background-color: #0a0a0a; } + .progress.is-black::-ms-fill { + background-color: #0a0a0a; } + .progress.is-black:indeterminate { + background-image: linear-gradient(to right, #0a0a0a 30%, #ededed 30%); } + .progress.is-light::-webkit-progress-value { + background-color: whitesmoke; } + .progress.is-light::-moz-progress-bar { + background-color: whitesmoke; } + .progress.is-light::-ms-fill { + background-color: whitesmoke; } + .progress.is-light:indeterminate { + background-image: linear-gradient(to right, whitesmoke 30%, #ededed 30%); } + .progress.is-dark::-webkit-progress-value { + background-color: #363636; } + .progress.is-dark::-moz-progress-bar { + background-color: #363636; } + .progress.is-dark::-ms-fill { + background-color: #363636; } + .progress.is-dark:indeterminate { + background-image: linear-gradient(to right, #363636 30%, #ededed 30%); } + .progress.is-primary::-webkit-progress-value { + background-color: #ff0d68; } + .progress.is-primary::-moz-progress-bar { + background-color: #ff0d68; } + .progress.is-primary::-ms-fill { + background-color: #ff0d68; } + .progress.is-primary:indeterminate { + background-image: linear-gradient(to right, #ff0d68 30%, #ededed 30%); } + .progress.is-link::-webkit-progress-value { + background-color: #ff0d68; } + .progress.is-link::-moz-progress-bar { + background-color: #ff0d68; } + .progress.is-link::-ms-fill { + background-color: #ff0d68; } + .progress.is-link:indeterminate { + background-image: linear-gradient(to right, #ff0d68 30%, #ededed 30%); } + .progress.is-info::-webkit-progress-value { + background-color: #0092FF; } + .progress.is-info::-moz-progress-bar { + background-color: #0092FF; } + .progress.is-info::-ms-fill { + background-color: #0092FF; } + .progress.is-info:indeterminate { + background-image: linear-gradient(to right, #0092FF 30%, #ededed 30%); } + .progress.is-success::-webkit-progress-value { + background-color: #16DB93; } + .progress.is-success::-moz-progress-bar { + background-color: #16DB93; } + .progress.is-success::-ms-fill { + background-color: #16DB93; } + .progress.is-success:indeterminate { + background-image: linear-gradient(to right, #16DB93 30%, #ededed 30%); } + .progress.is-warning::-webkit-progress-value { + background-color: #FFE900; } + .progress.is-warning::-moz-progress-bar { + background-color: #FFE900; } + .progress.is-warning::-ms-fill { + background-color: #FFE900; } + .progress.is-warning:indeterminate { + background-image: linear-gradient(to right, #FFE900 30%, #ededed 30%); } + .progress.is-danger::-webkit-progress-value { + background-color: #f14668; } + .progress.is-danger::-moz-progress-bar { + background-color: #f14668; } + .progress.is-danger::-ms-fill { + background-color: #f14668; } + .progress.is-danger:indeterminate { + background-image: linear-gradient(to right, #f14668 30%, #ededed 30%); } + .progress:indeterminate { + animation-duration: 1.5s; + animation-iteration-count: infinite; + animation-name: moveIndeterminate; + animation-timing-function: linear; + background-color: #ededed; + background-image: linear-gradient(to right, #4a4a4a 30%, #ededed 30%); + background-position: top left; + background-repeat: no-repeat; + background-size: 150% 150%; } + .progress:indeterminate::-webkit-progress-bar { + background-color: transparent; } + .progress:indeterminate::-moz-progress-bar { + background-color: transparent; } + .progress:indeterminate::-ms-fill { + animation-name: none; } + .progress.is-small { + height: 0.75rem; } + .progress.is-medium { + height: 1.25rem; } + .progress.is-large { + height: 1.5rem; } + +@keyframes moveIndeterminate { + from { + background-position: 200% 0; } + to { + background-position: -200% 0; } } + +.table { + background-color: white; + color: #363636; } + .table td, + .table th { + border: 1px solid #dbdbdb; + border-width: 0 0 1px; + padding: 0.5em 0.75em; + vertical-align: top; } + .table td.is-white, + .table th.is-white { + background-color: white; + border-color: white; + color: #0a0a0a; } + .table td.is-black, + .table th.is-black { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .table td.is-light, + .table th.is-light { + background-color: whitesmoke; + border-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .table td.is-dark, + .table th.is-dark { + background-color: #363636; + border-color: #363636; + color: #fff; } + .table td.is-primary, + .table th.is-primary { + background-color: #ff0d68; + border-color: #ff0d68; + color: #fff; } + .table td.is-link, + .table th.is-link { + background-color: #ff0d68; + border-color: #ff0d68; + color: #fff; } + .table td.is-info, + .table th.is-info { + background-color: #0092FF; + border-color: #0092FF; + color: #fff; } + .table td.is-success, + .table th.is-success { + background-color: #16DB93; + border-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .table td.is-warning, + .table th.is-warning { + background-color: #FFE900; + border-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .table td.is-danger, + .table th.is-danger { + background-color: #f14668; + border-color: #f14668; + color: #fff; } + .table td.is-narrow, + .table th.is-narrow { + white-space: nowrap; + width: 1%; } + .table td.is-selected, + .table th.is-selected { + background-color: #ff0d68; + color: #fff; } + .table td.is-selected a, + .table td.is-selected strong, + .table th.is-selected a, + .table th.is-selected strong { + color: currentColor; } + .table td.is-vcentered, + .table th.is-vcentered { + vertical-align: middle; } + .table th { + color: #363636; } + .table th:not([align]) { + text-align: left; } + .table tr.is-selected { + background-color: #ff0d68; + color: #fff; } + .table tr.is-selected a, + .table tr.is-selected strong { + color: currentColor; } + .table tr.is-selected td, + .table tr.is-selected th { + border-color: #fff; + color: currentColor; } + .table thead { + background-color: transparent; } + .table thead td, + .table thead th { + border-width: 0 0 2px; + color: #363636; } + .table tfoot { + background-color: transparent; } + .table tfoot td, + .table tfoot th { + border-width: 2px 0 0; + color: #363636; } + .table tbody { + background-color: transparent; } + .table tbody tr:last-child td, + .table tbody tr:last-child th { + border-bottom-width: 0; } + .table.is-bordered td, + .table.is-bordered th { + border-width: 1px; } + .table.is-bordered tr:last-child td, + .table.is-bordered tr:last-child th { + border-bottom-width: 1px; } + .table.is-fullwidth { + width: 100%; } + .table.is-hoverable tbody tr:not(.is-selected):hover { + background-color: #fafafa; } + .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { + background-color: #fafafa; } + .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { + background-color: whitesmoke; } + .table.is-narrow td, + .table.is-narrow th { + padding: 0.25em 0.5em; } + .table.is-striped tbody tr:not(.is-selected):nth-child(even) { + background-color: #fafafa; } + +.table-container { + -webkit-overflow-scrolling: touch; + overflow: auto; + overflow-y: hidden; + max-width: 100%; } + +.tags { + align-items: center; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + .tags .tag { + margin-bottom: 0.5rem; } + .tags .tag:not(:last-child) { + margin-right: 0.5rem; } + .tags:last-child { + margin-bottom: -0.5rem; } + .tags:not(:last-child) { + margin-bottom: 1rem; } + .tags.are-medium .tag:not(.is-normal):not(.is-large) { + font-size: 1rem; } + .tags.are-large .tag:not(.is-normal):not(.is-medium) { + font-size: 1.25rem; } + .tags.is-centered { + justify-content: center; } + .tags.is-centered .tag { + margin-right: 0.25rem; + margin-left: 0.25rem; } + .tags.is-right { + justify-content: flex-end; } + .tags.is-right .tag:not(:first-child) { + margin-left: 0.5rem; } + .tags.is-right .tag:not(:last-child) { + margin-right: 0; } + .tags.has-addons .tag { + margin-right: 0; } + .tags.has-addons .tag:not(:first-child) { + margin-left: 0; + border-top-left-radius: 0; + border-bottom-left-radius: 0; } + .tags.has-addons .tag:not(:last-child) { + border-top-right-radius: 0; + border-bottom-right-radius: 0; } + +.tag:not(body) { + align-items: center; + background-color: whitesmoke; + border-radius: 4px; + color: #4a4a4a; + display: inline-flex; + font-size: 0.75rem; + height: 2em; + justify-content: center; + line-height: 1.5; + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; } + .tag:not(body) .delete { + margin-left: 0.25rem; + margin-right: -0.375rem; } + .tag:not(body).is-white { + background-color: white; + color: #0a0a0a; } + .tag:not(body).is-black { + background-color: #0a0a0a; + color: white; } + .tag:not(body).is-light { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .tag:not(body).is-dark { + background-color: #363636; + color: #fff; } + .tag:not(body).is-primary { + background-color: #ff0d68; + color: #fff; } + .tag:not(body).is-primary.is-light { + background-color: #ffebf2; + color: #e60056; } + .tag:not(body).is-link { + background-color: #ff0d68; + color: #fff; } + .tag:not(body).is-link.is-light { + background-color: #ffebf2; + color: #e60056; } + .tag:not(body).is-info { + background-color: #0092FF; + color: #fff; } + .tag:not(body).is-info.is-light { + background-color: #ebf6ff; + color: #0075cc; } + .tag:not(body).is-success { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .tag:not(body).is-success.is-light { + background-color: #ecfdf7; + color: #0e865a; } + .tag:not(body).is-warning { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .tag:not(body).is-warning.is-light { + background-color: #fffdeb; + color: #948700; } + .tag:not(body).is-danger { + background-color: #f14668; + color: #fff; } + .tag:not(body).is-danger.is-light { + background-color: #feecf0; + color: #cc0f35; } + .tag:not(body).is-normal { + font-size: 0.75rem; } + .tag:not(body).is-medium { + font-size: 1rem; } + .tag:not(body).is-large { + font-size: 1.25rem; } + .tag:not(body) .icon:first-child:not(:last-child) { + margin-left: -0.375em; + margin-right: 0.1875em; } + .tag:not(body) .icon:last-child:not(:first-child) { + margin-left: 0.1875em; + margin-right: -0.375em; } + .tag:not(body) .icon:first-child:last-child { + margin-left: -0.375em; + margin-right: -0.375em; } + .tag:not(body).is-delete { + margin-left: 1px; + padding: 0; + position: relative; + width: 2em; } + .tag:not(body).is-delete::before, .tag:not(body).is-delete::after { + background-color: currentColor; + content: ""; + display: block; + left: 50%; + position: absolute; + top: 50%; + transform: translateX(-50%) translateY(-50%) rotate(45deg); + transform-origin: center center; } + .tag:not(body).is-delete::before { + height: 1px; + width: 50%; } + .tag:not(body).is-delete::after { + height: 50%; + width: 1px; } + .tag:not(body).is-delete:hover, .tag:not(body).is-delete:focus { + background-color: #e8e8e8; } + .tag:not(body).is-delete:active { + background-color: #dbdbdb; } + .tag:not(body).is-rounded { + border-radius: 9999px; } + +a.tag:hover { + text-decoration: underline; } + +.title, +.subtitle { + word-break: break-word; } + .title em, + .title span, + .subtitle em, + .subtitle span { + font-weight: inherit; } + .title sub, + .subtitle sub { + font-size: 0.75em; } + .title sup, + .subtitle sup { + font-size: 0.75em; } + .title .tag, + .subtitle .tag { + vertical-align: middle; } + +.title { + color: #363636; + font-size: 2rem; + font-weight: 600; + line-height: 1.125; } + .title strong { + color: inherit; + font-weight: inherit; } + .title:not(.is-spaced) + .subtitle { + margin-top: -1.25rem; } + .title.is-1 { + font-size: 3rem; } + .title.is-2 { + font-size: 2.5rem; } + .title.is-3 { + font-size: 2rem; } + .title.is-4 { + font-size: 1.5rem; } + .title.is-5 { + font-size: 1.25rem; } + .title.is-6 { + font-size: 1rem; } + .title.is-7 { + font-size: 0.75rem; } + +.subtitle { + color: #4a4a4a; + font-size: 1.25rem; + font-weight: 400; + line-height: 1.25; } + .subtitle strong { + color: #363636; + font-weight: 600; } + .subtitle:not(.is-spaced) + .title { + margin-top: -1.25rem; } + .subtitle.is-1 { + font-size: 3rem; } + .subtitle.is-2 { + font-size: 2.5rem; } + .subtitle.is-3 { + font-size: 2rem; } + .subtitle.is-4 { + font-size: 1.5rem; } + .subtitle.is-5 { + font-size: 1.25rem; } + .subtitle.is-6 { + font-size: 1rem; } + .subtitle.is-7 { + font-size: 0.75rem; } + +.heading { + display: block; + font-size: 11px; + letter-spacing: 1px; + margin-bottom: 5px; + text-transform: uppercase; } + +.number { + align-items: center; + background-color: whitesmoke; + border-radius: 9999px; + display: inline-flex; + font-size: 1.25rem; + height: 2em; + justify-content: center; + margin-right: 1.5rem; + min-width: 2.5em; + padding: 0.25rem 0.5rem; + text-align: center; + vertical-align: top; } + +/* Bulma Form */ +.select select, .textarea, .input { + background-color: white; + border-color: #dbdbdb; + border-radius: 4px; + color: #363636; } + .select select::-moz-placeholder, .textarea::-moz-placeholder, .input::-moz-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select::-webkit-input-placeholder, .textarea::-webkit-input-placeholder, .input::-webkit-input-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select:-moz-placeholder, .textarea:-moz-placeholder, .input:-moz-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select:-ms-input-placeholder, .textarea:-ms-input-placeholder, .input:-ms-input-placeholder { + color: rgba(54, 54, 54, 0.3); } + .select select:hover, .textarea:hover, .input:hover, .select select.is-hovered, .is-hovered.textarea, .is-hovered.input { + border-color: #b5b5b5; } + .select select:focus, .textarea:focus, .input:focus, .select select.is-focused, .is-focused.textarea, .is-focused.input, .select select:active, .textarea:active, .input:active, .select select.is-active, .is-active.textarea, .is-active.input { + border-color: #ff0d68; + box-shadow: 0 0 0 0.125em rgba(255, 13, 104, 0.25); } + .select select[disabled], [disabled].textarea, [disabled].input, fieldset[disabled] .select select, .select fieldset[disabled] select, fieldset[disabled] .textarea, fieldset[disabled] .input { + background-color: whitesmoke; + border-color: whitesmoke; + box-shadow: none; + color: #7a7a7a; } + .select select[disabled]::-moz-placeholder, [disabled].textarea::-moz-placeholder, [disabled].input::-moz-placeholder, fieldset[disabled] .select select::-moz-placeholder, .select fieldset[disabled] select::-moz-placeholder, fieldset[disabled] .textarea::-moz-placeholder, fieldset[disabled] .input::-moz-placeholder { + color: rgba(122, 122, 122, 0.3); } + .select select[disabled]::-webkit-input-placeholder, [disabled].textarea::-webkit-input-placeholder, [disabled].input::-webkit-input-placeholder, fieldset[disabled] .select select::-webkit-input-placeholder, .select fieldset[disabled] select::-webkit-input-placeholder, fieldset[disabled] .textarea::-webkit-input-placeholder, fieldset[disabled] .input::-webkit-input-placeholder { + color: rgba(122, 122, 122, 0.3); } + .select select[disabled]:-moz-placeholder, [disabled].textarea:-moz-placeholder, [disabled].input:-moz-placeholder, fieldset[disabled] .select select:-moz-placeholder, .select fieldset[disabled] select:-moz-placeholder, fieldset[disabled] .textarea:-moz-placeholder, fieldset[disabled] .input:-moz-placeholder { + color: rgba(122, 122, 122, 0.3); } + .select select[disabled]:-ms-input-placeholder, [disabled].textarea:-ms-input-placeholder, [disabled].input:-ms-input-placeholder, fieldset[disabled] .select select:-ms-input-placeholder, .select fieldset[disabled] select:-ms-input-placeholder, fieldset[disabled] .textarea:-ms-input-placeholder, fieldset[disabled] .input:-ms-input-placeholder { + color: rgba(122, 122, 122, 0.3); } + +.textarea, .input { + box-shadow: inset 0 0.0625em 0.125em rgba(10, 10, 10, 0.05); + max-width: 100%; + width: 100%; } + [readonly].textarea, [readonly].input { + box-shadow: none; } + .is-white.textarea, .is-white.input { + border-color: white; } + .is-white.textarea:focus, .is-white.input:focus, .is-white.is-focused.textarea, .is-white.is-focused.input, .is-white.textarea:active, .is-white.input:active, .is-white.is-active.textarea, .is-white.is-active.input { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .is-black.textarea, .is-black.input { + border-color: #0a0a0a; } + .is-black.textarea:focus, .is-black.input:focus, .is-black.is-focused.textarea, .is-black.is-focused.input, .is-black.textarea:active, .is-black.input:active, .is-black.is-active.textarea, .is-black.is-active.input { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .is-light.textarea, .is-light.input { + border-color: whitesmoke; } + .is-light.textarea:focus, .is-light.input:focus, .is-light.is-focused.textarea, .is-light.is-focused.input, .is-light.textarea:active, .is-light.input:active, .is-light.is-active.textarea, .is-light.is-active.input { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .is-dark.textarea, .is-dark.input { + border-color: #363636; } + .is-dark.textarea:focus, .is-dark.input:focus, .is-dark.is-focused.textarea, .is-dark.is-focused.input, .is-dark.textarea:active, .is-dark.input:active, .is-dark.is-active.textarea, .is-dark.is-active.input { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .is-primary.textarea, .is-primary.input { + border-color: #ff0d68; } + .is-primary.textarea:focus, .is-primary.input:focus, .is-primary.is-focused.textarea, .is-primary.is-focused.input, .is-primary.textarea:active, .is-primary.input:active, .is-primary.is-active.textarea, .is-primary.is-active.input { + box-shadow: 0 0 0 0.125em rgba(255, 13, 104, 0.25); } + .is-link.textarea, .is-link.input { + border-color: #ff0d68; } + .is-link.textarea:focus, .is-link.input:focus, .is-link.is-focused.textarea, .is-link.is-focused.input, .is-link.textarea:active, .is-link.input:active, .is-link.is-active.textarea, .is-link.is-active.input { + box-shadow: 0 0 0 0.125em rgba(255, 13, 104, 0.25); } + .is-info.textarea, .is-info.input { + border-color: #0092FF; } + .is-info.textarea:focus, .is-info.input:focus, .is-info.is-focused.textarea, .is-info.is-focused.input, .is-info.textarea:active, .is-info.input:active, .is-info.is-active.textarea, .is-info.is-active.input { + box-shadow: 0 0 0 0.125em rgba(0, 146, 255, 0.25); } + .is-success.textarea, .is-success.input { + border-color: #16DB93; } + .is-success.textarea:focus, .is-success.input:focus, .is-success.is-focused.textarea, .is-success.is-focused.input, .is-success.textarea:active, .is-success.input:active, .is-success.is-active.textarea, .is-success.is-active.input { + box-shadow: 0 0 0 0.125em rgba(22, 219, 147, 0.25); } + .is-warning.textarea, .is-warning.input { + border-color: #FFE900; } + .is-warning.textarea:focus, .is-warning.input:focus, .is-warning.is-focused.textarea, .is-warning.is-focused.input, .is-warning.textarea:active, .is-warning.input:active, .is-warning.is-active.textarea, .is-warning.is-active.input { + box-shadow: 0 0 0 0.125em rgba(255, 233, 0, 0.25); } + .is-danger.textarea, .is-danger.input { + border-color: #f14668; } + .is-danger.textarea:focus, .is-danger.input:focus, .is-danger.is-focused.textarea, .is-danger.is-focused.input, .is-danger.textarea:active, .is-danger.input:active, .is-danger.is-active.textarea, .is-danger.is-active.input { + box-shadow: 0 0 0 0.125em rgba(241, 70, 104, 0.25); } + .is-small.textarea, .is-small.input { + border-radius: 2px; + font-size: 0.75rem; } + .is-medium.textarea, .is-medium.input { + font-size: 1.25rem; } + .is-large.textarea, .is-large.input { + font-size: 1.5rem; } + .is-fullwidth.textarea, .is-fullwidth.input { + display: block; + width: 100%; } + .is-inline.textarea, .is-inline.input { + display: inline; + width: auto; } + +.input.is-rounded { + border-radius: 9999px; + padding-left: calc(calc(0.75em - 1px) + 0.375em); + padding-right: calc(calc(0.75em - 1px) + 0.375em); } + +.input.is-static { + background-color: transparent; + border-color: transparent; + box-shadow: none; + padding-left: 0; + padding-right: 0; } + +.textarea { + display: block; + max-width: 100%; + min-width: 100%; + padding: calc(0.75em - 1px); + resize: vertical; } + .textarea:not([rows]) { + max-height: 40em; + min-height: 8em; } + .textarea[rows] { + height: initial; } + .textarea.has-fixed-size { + resize: none; } + +.radio, .checkbox { + cursor: pointer; + display: inline-block; + line-height: 1.25; + position: relative; } + .radio input, .checkbox input { + cursor: pointer; } + .radio:hover, .checkbox:hover { + color: #363636; } + [disabled].radio, [disabled].checkbox, fieldset[disabled] .radio, fieldset[disabled] .checkbox, + .radio input[disabled], + .checkbox input[disabled] { + color: #7a7a7a; + cursor: not-allowed; } + +.radio + .radio { + margin-left: 0.5em; } + +.select { + display: inline-block; + max-width: 100%; + position: relative; + vertical-align: top; } + .select:not(.is-multiple) { + height: 2.5em; } + .select:not(.is-multiple):not(.is-loading)::after { + border-color: #ff0d68; + right: 1.125em; + z-index: 4; } + .select.is-rounded select { + border-radius: 9999px; + padding-left: 1em; } + .select select { + cursor: pointer; + display: block; + font-size: 1em; + max-width: 100%; + outline: none; } + .select select::-ms-expand { + display: none; } + .select select[disabled]:hover, fieldset[disabled] .select select:hover { + border-color: whitesmoke; } + .select select:not([multiple]) { + padding-right: 2.5em; } + .select select[multiple] { + height: auto; + padding: 0; } + .select select[multiple] option { + padding: 0.5em 1em; } + .select:not(.is-multiple):not(.is-loading):hover::after { + border-color: #363636; } + .select.is-white:not(:hover)::after { + border-color: white; } + .select.is-white select { + border-color: white; } + .select.is-white select:hover, .select.is-white select.is-hovered { + border-color: #f2f2f2; } + .select.is-white select:focus, .select.is-white select.is-focused, .select.is-white select:active, .select.is-white select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .select.is-black:not(:hover)::after { + border-color: #0a0a0a; } + .select.is-black select { + border-color: #0a0a0a; } + .select.is-black select:hover, .select.is-black select.is-hovered { + border-color: black; } + .select.is-black select:focus, .select.is-black select.is-focused, .select.is-black select:active, .select.is-black select.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .select.is-light:not(:hover)::after { + border-color: whitesmoke; } + .select.is-light select { + border-color: whitesmoke; } + .select.is-light select:hover, .select.is-light select.is-hovered { + border-color: #e8e8e8; } + .select.is-light select:focus, .select.is-light select.is-focused, .select.is-light select:active, .select.is-light select.is-active { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .select.is-dark:not(:hover)::after { + border-color: #363636; } + .select.is-dark select { + border-color: #363636; } + .select.is-dark select:hover, .select.is-dark select.is-hovered { + border-color: #292929; } + .select.is-dark select:focus, .select.is-dark select.is-focused, .select.is-dark select:active, .select.is-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .select.is-primary:not(:hover)::after { + border-color: #ff0d68; } + .select.is-primary select { + border-color: #ff0d68; } + .select.is-primary select:hover, .select.is-primary select.is-hovered { + border-color: #f3005b; } + .select.is-primary select:focus, .select.is-primary select.is-focused, .select.is-primary select:active, .select.is-primary select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 13, 104, 0.25); } + .select.is-link:not(:hover)::after { + border-color: #ff0d68; } + .select.is-link select { + border-color: #ff0d68; } + .select.is-link select:hover, .select.is-link select.is-hovered { + border-color: #f3005b; } + .select.is-link select:focus, .select.is-link select.is-focused, .select.is-link select:active, .select.is-link select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 13, 104, 0.25); } + .select.is-info:not(:hover)::after { + border-color: #0092FF; } + .select.is-info select { + border-color: #0092FF; } + .select.is-info select:hover, .select.is-info select.is-hovered { + border-color: #0083e6; } + .select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active { + box-shadow: 0 0 0 0.125em rgba(0, 146, 255, 0.25); } + .select.is-success:not(:hover)::after { + border-color: #16DB93; } + .select.is-success select { + border-color: #16DB93; } + .select.is-success select:hover, .select.is-success select.is-hovered { + border-color: #14c483; } + .select.is-success select:focus, .select.is-success select.is-focused, .select.is-success select:active, .select.is-success select.is-active { + box-shadow: 0 0 0 0.125em rgba(22, 219, 147, 0.25); } + .select.is-warning:not(:hover)::after { + border-color: #FFE900; } + .select.is-warning select { + border-color: #FFE900; } + .select.is-warning select:hover, .select.is-warning select.is-hovered { + border-color: #e6d200; } + .select.is-warning select:focus, .select.is-warning select.is-focused, .select.is-warning select:active, .select.is-warning select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 233, 0, 0.25); } + .select.is-danger:not(:hover)::after { + border-color: #f14668; } + .select.is-danger select { + border-color: #f14668; } + .select.is-danger select:hover, .select.is-danger select.is-hovered { + border-color: #ef2e55; } + .select.is-danger select:focus, .select.is-danger select.is-focused, .select.is-danger select:active, .select.is-danger select.is-active { + box-shadow: 0 0 0 0.125em rgba(241, 70, 104, 0.25); } + .select.is-small { + border-radius: 2px; + font-size: 0.75rem; } + .select.is-medium { + font-size: 1.25rem; } + .select.is-large { + font-size: 1.5rem; } + .select.is-disabled::after { + border-color: #7a7a7a !important; + opacity: 0.5; } + .select.is-fullwidth { + width: 100%; } + .select.is-fullwidth select { + width: 100%; } + .select.is-loading::after { + margin-top: 0; + position: absolute; + right: 0.625em; + top: 0.625em; + transform: none; } + .select.is-loading.is-small:after { + font-size: 0.75rem; } + .select.is-loading.is-medium:after { + font-size: 1.25rem; } + .select.is-loading.is-large:after { + font-size: 1.5rem; } + +.file { + align-items: stretch; + display: flex; + justify-content: flex-start; + position: relative; } + .file.is-white .file-cta { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + .file.is-white:hover .file-cta, .file.is-white.is-hovered .file-cta { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + .file.is-white:focus .file-cta, .file.is-white.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); + color: #0a0a0a; } + .file.is-white:active .file-cta, .file.is-white.is-active .file-cta { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + .file.is-black .file-cta { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + .file.is-black:hover .file-cta, .file.is-black.is-hovered .file-cta { + background-color: #040404; + border-color: transparent; + color: white; } + .file.is-black:focus .file-cta, .file.is-black.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); + color: white; } + .file.is-black:active .file-cta, .file.is-black.is-active .file-cta { + background-color: black; + border-color: transparent; + color: white; } + .file.is-light .file-cta { + background-color: whitesmoke; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-light:hover .file-cta, .file.is-light.is-hovered .file-cta { + background-color: #eeeeee; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-light:focus .file-cta, .file.is-light.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25); + color: rgba(0, 0, 0, 0.7); } + .file.is-light:active .file-cta, .file.is-light.is-active .file-cta { + background-color: #e8e8e8; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-dark .file-cta { + background-color: #363636; + border-color: transparent; + color: #fff; } + .file.is-dark:hover .file-cta, .file.is-dark.is-hovered .file-cta { + background-color: #2f2f2f; + border-color: transparent; + color: #fff; } + .file.is-dark:focus .file-cta, .file.is-dark.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25); + color: #fff; } + .file.is-dark:active .file-cta, .file.is-dark.is-active .file-cta { + background-color: #292929; + border-color: transparent; + color: #fff; } + .file.is-primary .file-cta { + background-color: #ff0d68; + border-color: transparent; + color: #fff; } + .file.is-primary:hover .file-cta, .file.is-primary.is-hovered .file-cta { + background-color: #ff0060; + border-color: transparent; + color: #fff; } + .file.is-primary:focus .file-cta, .file.is-primary.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 13, 104, 0.25); + color: #fff; } + .file.is-primary:active .file-cta, .file.is-primary.is-active .file-cta { + background-color: #f3005b; + border-color: transparent; + color: #fff; } + .file.is-link .file-cta { + background-color: #ff0d68; + border-color: transparent; + color: #fff; } + .file.is-link:hover .file-cta, .file.is-link.is-hovered .file-cta { + background-color: #ff0060; + border-color: transparent; + color: #fff; } + .file.is-link:focus .file-cta, .file.is-link.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 13, 104, 0.25); + color: #fff; } + .file.is-link:active .file-cta, .file.is-link.is-active .file-cta { + background-color: #f3005b; + border-color: transparent; + color: #fff; } + .file.is-info .file-cta { + background-color: #0092FF; + border-color: transparent; + color: #fff; } + .file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta { + background-color: #008bf2; + border-color: transparent; + color: #fff; } + .file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(0, 146, 255, 0.25); + color: #fff; } + .file.is-info:active .file-cta, .file.is-info.is-active .file-cta { + background-color: #0083e6; + border-color: transparent; + color: #fff; } + .file.is-success .file-cta { + background-color: #16DB93; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-success:hover .file-cta, .file.is-success.is-hovered .file-cta { + background-color: #15cf8b; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-success:focus .file-cta, .file.is-success.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(22, 219, 147, 0.25); + color: rgba(0, 0, 0, 0.7); } + .file.is-success:active .file-cta, .file.is-success.is-active .file-cta { + background-color: #14c483; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning .file-cta { + background-color: #FFE900; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:hover .file-cta, .file.is-warning.is-hovered .file-cta { + background-color: #f2dd00; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:focus .file-cta, .file.is-warning.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(255, 233, 0, 0.25); + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:active .file-cta, .file.is-warning.is-active .file-cta { + background-color: #e6d200; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .file.is-danger .file-cta { + background-color: #f14668; + border-color: transparent; + color: #fff; } + .file.is-danger:hover .file-cta, .file.is-danger.is-hovered .file-cta { + background-color: #f03a5f; + border-color: transparent; + color: #fff; } + .file.is-danger:focus .file-cta, .file.is-danger.is-focused .file-cta { + border-color: transparent; + box-shadow: 0 0 0.5em rgba(241, 70, 104, 0.25); + color: #fff; } + .file.is-danger:active .file-cta, .file.is-danger.is-active .file-cta { + background-color: #ef2e55; + border-color: transparent; + color: #fff; } + .file.is-small { + font-size: 0.75rem; } + .file.is-normal { + font-size: 1rem; } + .file.is-medium { + font-size: 1.25rem; } + .file.is-medium .file-icon .fa { + font-size: 21px; } + .file.is-large { + font-size: 1.5rem; } + .file.is-large .file-icon .fa { + font-size: 28px; } + .file.has-name .file-cta { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + .file.has-name .file-name { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .file.has-name.is-empty .file-cta { + border-radius: 4px; } + .file.has-name.is-empty .file-name { + display: none; } + .file.is-boxed .file-label { + flex-direction: column; } + .file.is-boxed .file-cta { + flex-direction: column; + height: auto; + padding: 1em 3em; } + .file.is-boxed .file-name { + border-width: 0 1px 1px; } + .file.is-boxed .file-icon { + height: 1.5em; + width: 1.5em; } + .file.is-boxed .file-icon .fa { + font-size: 21px; } + .file.is-boxed.is-small .file-icon .fa { + font-size: 14px; } + .file.is-boxed.is-medium .file-icon .fa { + font-size: 28px; } + .file.is-boxed.is-large .file-icon .fa { + font-size: 35px; } + .file.is-boxed.has-name .file-cta { + border-radius: 4px 4px 0 0; } + .file.is-boxed.has-name .file-name { + border-radius: 0 0 4px 4px; + border-width: 0 1px 1px; } + .file.is-centered { + justify-content: center; } + .file.is-fullwidth .file-label { + width: 100%; } + .file.is-fullwidth .file-name { + flex-grow: 1; + max-width: none; } + .file.is-right { + justify-content: flex-end; } + .file.is-right .file-cta { + border-radius: 0 4px 4px 0; } + .file.is-right .file-name { + border-radius: 4px 0 0 4px; + border-width: 1px 0 1px 1px; + order: -1; } + +.file-label { + align-items: stretch; + display: flex; + cursor: pointer; + justify-content: flex-start; + overflow: hidden; + position: relative; } + .file-label:hover .file-cta { + background-color: #eeeeee; + color: #363636; } + .file-label:hover .file-name { + border-color: #d5d5d5; } + .file-label:active .file-cta { + background-color: #e8e8e8; + color: #363636; } + .file-label:active .file-name { + border-color: #cfcfcf; } + +.file-input { + height: 100%; + left: 0; + opacity: 0; + outline: none; + position: absolute; + top: 0; + width: 100%; } + +.file-cta, +.file-name { + border-color: #dbdbdb; + border-radius: 4px; + font-size: 1em; + padding-left: 1em; + padding-right: 1em; + white-space: nowrap; } + +.file-cta { + background-color: whitesmoke; + color: #4a4a4a; } + +.file-name { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px 1px 1px 0; + display: block; + max-width: 16em; + overflow: hidden; + text-align: inherit; + text-overflow: ellipsis; } + +.file-icon { + align-items: center; + display: flex; + height: 1em; + justify-content: center; + margin-right: 0.5em; + width: 1em; } + .file-icon .fa { + font-size: 14px; } + +.label { + color: #363636; + display: block; + font-size: 1rem; + font-weight: 700; } + .label:not(:last-child) { + margin-bottom: 0.5em; } + .label.is-small { + font-size: 0.75rem; } + .label.is-medium { + font-size: 1.25rem; } + .label.is-large { + font-size: 1.5rem; } + +.help { + display: block; + font-size: 0.75rem; + margin-top: 0.25rem; } + .help.is-white { + color: white; } + .help.is-black { + color: #0a0a0a; } + .help.is-light { + color: whitesmoke; } + .help.is-dark { + color: #363636; } + .help.is-primary { + color: #ff0d68; } + .help.is-link { + color: #ff0d68; } + .help.is-info { + color: #0092FF; } + .help.is-success { + color: #16DB93; } + .help.is-warning { + color: #FFE900; } + .help.is-danger { + color: #f14668; } + +.field:not(:last-child) { + margin-bottom: 0.75rem; } + +.field.has-addons { + display: flex; + justify-content: flex-start; } + .field.has-addons .control:not(:last-child) { + margin-right: -1px; } + .field.has-addons .control:not(:first-child):not(:last-child) .button, + .field.has-addons .control:not(:first-child):not(:last-child) .input, + .field.has-addons .control:not(:first-child):not(:last-child) .select select { + border-radius: 0; } + .field.has-addons .control:first-child:not(:only-child) .button, + .field.has-addons .control:first-child:not(:only-child) .input, + .field.has-addons .control:first-child:not(:only-child) .select select { + border-bottom-right-radius: 0; + border-top-right-radius: 0; } + .field.has-addons .control:last-child:not(:only-child) .button, + .field.has-addons .control:last-child:not(:only-child) .input, + .field.has-addons .control:last-child:not(:only-child) .select select { + border-bottom-left-radius: 0; + border-top-left-radius: 0; } + .field.has-addons .control .button:not([disabled]):hover, .field.has-addons .control .button:not([disabled]).is-hovered, + .field.has-addons .control .input:not([disabled]):hover, + .field.has-addons .control .input:not([disabled]).is-hovered, + .field.has-addons .control .select select:not([disabled]):hover, + .field.has-addons .control .select select:not([disabled]).is-hovered { + z-index: 2; } + .field.has-addons .control .button:not([disabled]):focus, .field.has-addons .control .button:not([disabled]).is-focused, .field.has-addons .control .button:not([disabled]):active, .field.has-addons .control .button:not([disabled]).is-active, + .field.has-addons .control .input:not([disabled]):focus, + .field.has-addons .control .input:not([disabled]).is-focused, + .field.has-addons .control .input:not([disabled]):active, + .field.has-addons .control .input:not([disabled]).is-active, + .field.has-addons .control .select select:not([disabled]):focus, + .field.has-addons .control .select select:not([disabled]).is-focused, + .field.has-addons .control .select select:not([disabled]):active, + .field.has-addons .control .select select:not([disabled]).is-active { + z-index: 3; } + .field.has-addons .control .button:not([disabled]):focus:hover, .field.has-addons .control .button:not([disabled]).is-focused:hover, .field.has-addons .control .button:not([disabled]):active:hover, .field.has-addons .control .button:not([disabled]).is-active:hover, + .field.has-addons .control .input:not([disabled]):focus:hover, + .field.has-addons .control .input:not([disabled]).is-focused:hover, + .field.has-addons .control .input:not([disabled]):active:hover, + .field.has-addons .control .input:not([disabled]).is-active:hover, + .field.has-addons .control .select select:not([disabled]):focus:hover, + .field.has-addons .control .select select:not([disabled]).is-focused:hover, + .field.has-addons .control .select select:not([disabled]):active:hover, + .field.has-addons .control .select select:not([disabled]).is-active:hover { + z-index: 4; } + .field.has-addons .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .field.has-addons.has-addons-centered { + justify-content: center; } + .field.has-addons.has-addons-right { + justify-content: flex-end; } + .field.has-addons.has-addons-fullwidth .control { + flex-grow: 1; + flex-shrink: 0; } + +.field.is-grouped { + display: flex; + justify-content: flex-start; } + .field.is-grouped > .control { + flex-shrink: 0; } + .field.is-grouped > .control:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; } + .field.is-grouped > .control.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .field.is-grouped.is-grouped-centered { + justify-content: center; } + .field.is-grouped.is-grouped-right { + justify-content: flex-end; } + .field.is-grouped.is-grouped-multiline { + flex-wrap: wrap; } + .field.is-grouped.is-grouped-multiline > .control:last-child, .field.is-grouped.is-grouped-multiline > .control:not(:last-child) { + margin-bottom: 0.75rem; } + .field.is-grouped.is-grouped-multiline:last-child { + margin-bottom: -0.75rem; } + .field.is-grouped.is-grouped-multiline:not(:last-child) { + margin-bottom: 0; } + +@media screen and (min-width: 769px), print { + .field.is-horizontal { + display: flex; } } + +.field-label .label { + font-size: inherit; } + +@media screen and (max-width: 768px) { + .field-label { + margin-bottom: 0.5rem; } } + +@media screen and (min-width: 769px), print { + .field-label { + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + margin-right: 1.5rem; + text-align: right; } + .field-label.is-small { + font-size: 0.75rem; + padding-top: 0.375em; } + .field-label.is-normal { + padding-top: 0.375em; } + .field-label.is-medium { + font-size: 1.25rem; + padding-top: 0.375em; } + .field-label.is-large { + font-size: 1.5rem; + padding-top: 0.375em; } } + +.field-body .field .field { + margin-bottom: 0; } + +@media screen and (min-width: 769px), print { + .field-body { + display: flex; + flex-basis: 0; + flex-grow: 5; + flex-shrink: 1; } + .field-body .field { + margin-bottom: 0; } + .field-body > .field { + flex-shrink: 1; } + .field-body > .field:not(.is-narrow) { + flex-grow: 1; } + .field-body > .field:not(:last-child) { + margin-right: 0.75rem; } } + +.control { + box-sizing: border-box; + clear: both; + font-size: 1rem; + position: relative; + text-align: inherit; } + .control.has-icons-left .input:focus ~ .icon, + .control.has-icons-left .select:focus ~ .icon, .control.has-icons-right .input:focus ~ .icon, + .control.has-icons-right .select:focus ~ .icon { + color: #4a4a4a; } + .control.has-icons-left .input.is-small ~ .icon, + .control.has-icons-left .select.is-small ~ .icon, .control.has-icons-right .input.is-small ~ .icon, + .control.has-icons-right .select.is-small ~ .icon { + font-size: 0.75rem; } + .control.has-icons-left .input.is-medium ~ .icon, + .control.has-icons-left .select.is-medium ~ .icon, .control.has-icons-right .input.is-medium ~ .icon, + .control.has-icons-right .select.is-medium ~ .icon { + font-size: 1.25rem; } + .control.has-icons-left .input.is-large ~ .icon, + .control.has-icons-left .select.is-large ~ .icon, .control.has-icons-right .input.is-large ~ .icon, + .control.has-icons-right .select.is-large ~ .icon { + font-size: 1.5rem; } + .control.has-icons-left .icon, .control.has-icons-right .icon { + color: #dbdbdb; + height: 2.5em; + pointer-events: none; + position: absolute; + top: 0; + width: 2.5em; + z-index: 4; } + .control.has-icons-left .input, + .control.has-icons-left .select select { + padding-left: 2.5em; } + .control.has-icons-left .icon.is-left { + left: 0; } + .control.has-icons-right .input, + .control.has-icons-right .select select { + padding-right: 2.5em; } + .control.has-icons-right .icon.is-right { + right: 0; } + .control.is-loading::after { + position: absolute !important; + right: 0.625em; + top: 0.625em; + z-index: 4; } + .control.is-loading.is-small:after { + font-size: 0.75rem; } + .control.is-loading.is-medium:after { + font-size: 1.25rem; } + .control.is-loading.is-large:after { + font-size: 1.5rem; } + +/* Bulma Components */ +.breadcrumb { + font-size: 1rem; + white-space: nowrap; } + .breadcrumb a { + align-items: center; + color: #ff0d68; + display: flex; + justify-content: center; + padding: 0 0.75em; } + .breadcrumb a:hover { + color: #363636; } + .breadcrumb li { + align-items: center; + display: flex; } + .breadcrumb li:first-child a { + padding-left: 0; } + .breadcrumb li.is-active a { + color: #363636; + cursor: default; + pointer-events: none; } + .breadcrumb li + li::before { + color: #b5b5b5; + content: "\0002f"; } + .breadcrumb ul, + .breadcrumb ol { + align-items: flex-start; + display: flex; + flex-wrap: wrap; + justify-content: flex-start; } + .breadcrumb .icon:first-child { + margin-right: 0.5em; } + .breadcrumb .icon:last-child { + margin-left: 0.5em; } + .breadcrumb.is-centered ol, + .breadcrumb.is-centered ul { + justify-content: center; } + .breadcrumb.is-right ol, + .breadcrumb.is-right ul { + justify-content: flex-end; } + .breadcrumb.is-small { + font-size: 0.75rem; } + .breadcrumb.is-medium { + font-size: 1.25rem; } + .breadcrumb.is-large { + font-size: 1.5rem; } + .breadcrumb.has-arrow-separator li + li::before { + content: "\02192"; } + .breadcrumb.has-bullet-separator li + li::before { + content: "\02022"; } + .breadcrumb.has-dot-separator li + li::before { + content: "\000b7"; } + .breadcrumb.has-succeeds-separator li + li::before { + content: "\0227B"; } + +.card { + background-color: white; + border-radius: 0.25rem; + box-shadow: 0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1), 0 0px 0 1px rgba(10, 10, 10, 0.02); + color: #4a4a4a; + max-width: 100%; + position: relative; } + +.card-footer:first-child, .card-content:first-child, .card-header:first-child { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; } + +.card-footer:last-child, .card-content:last-child, .card-header:last-child { + border-bottom-left-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; } + +.card-header { + background-color: transparent; + align-items: stretch; + box-shadow: 0 0.125em 0.25em rgba(10, 10, 10, 0.1); + display: flex; } + +.card-header-title { + align-items: center; + color: #363636; + display: flex; + flex-grow: 1; + font-weight: 700; + padding: 0.75rem 1rem; } + .card-header-title.is-centered { + justify-content: center; } + +.card-header-icon { + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + background: none; + border: none; + color: currentColor; + font-family: inherit; + font-size: 1em; + margin: 0; + padding: 0; + align-items: center; + cursor: pointer; + display: flex; + justify-content: center; + padding: 0.75rem 1rem; } + +.card-image { + display: block; + position: relative; } + .card-image:first-child img { + border-top-left-radius: 0.25rem; + border-top-right-radius: 0.25rem; } + .card-image:last-child img { + border-bottom-left-radius: 0.25rem; + border-bottom-right-radius: 0.25rem; } + +.card-content { + background-color: transparent; + padding: 1.5rem; } + +.card-footer { + background-color: transparent; + border-top: 1px solid #ededed; + align-items: stretch; + display: flex; } + +.card-footer-item { + align-items: center; + display: flex; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 0; + justify-content: center; + padding: 0.75rem; } + .card-footer-item:not(:last-child) { + border-right: 1px solid #ededed; } + +.card .media:not(:last-child) { + margin-bottom: 1.5rem; } + +.dropdown { + display: inline-flex; + position: relative; + vertical-align: top; } + .dropdown.is-active .dropdown-menu, .dropdown.is-hoverable:hover .dropdown-menu { + display: block; } + .dropdown.is-right .dropdown-menu { + left: auto; + right: 0; } + .dropdown.is-up .dropdown-menu { + bottom: 100%; + padding-bottom: 4px; + padding-top: initial; + top: auto; } + +.dropdown-menu { + display: none; + left: 0; + min-width: 12rem; + padding-top: 4px; + position: absolute; + top: 100%; + z-index: 20; } + +.dropdown-content { + background-color: white; + border-radius: 4px; + box-shadow: 0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1), 0 0px 0 1px rgba(10, 10, 10, 0.02); + padding-bottom: 0.5rem; + padding-top: 0.5rem; } + +.dropdown-item { + color: #4a4a4a; + display: block; + font-size: 0.875rem; + line-height: 1.5; + padding: 0.375rem 1rem; + position: relative; } + +a.dropdown-item, +button.dropdown-item { + padding-right: 3rem; + text-align: inherit; + white-space: nowrap; + width: 100%; } + a.dropdown-item:hover, + button.dropdown-item:hover { + background-color: whitesmoke; + color: #0a0a0a; } + a.dropdown-item.is-active, + button.dropdown-item.is-active { + background-color: #ff0d68; + color: #fff; } + +.dropdown-divider { + background-color: #ededed; + border: none; + display: block; + height: 1px; + margin: 0.5rem 0; } + +.level { + align-items: center; + justify-content: space-between; } + .level code { + border-radius: 4px; } + .level img { + display: inline-block; + vertical-align: top; } + .level.is-mobile { + display: flex; } + .level.is-mobile .level-left, + .level.is-mobile .level-right { + display: flex; } + .level.is-mobile .level-left + .level-right { + margin-top: 0; } + .level.is-mobile .level-item:not(:last-child) { + margin-bottom: 0; + margin-right: 0.75rem; } + .level.is-mobile .level-item:not(.is-narrow) { + flex-grow: 1; } + @media screen and (min-width: 769px), print { + .level { + display: flex; } + .level > .level-item:not(.is-narrow) { + flex-grow: 1; } } +.level-item { + align-items: center; + display: flex; + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; + justify-content: center; } + .level-item .title, + .level-item .subtitle { + margin-bottom: 0; } + @media screen and (max-width: 768px) { + .level-item:not(:last-child) { + margin-bottom: 0.75rem; } } +.level-left, +.level-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; } + .level-left .level-item.is-flexible, + .level-right .level-item.is-flexible { + flex-grow: 1; } + @media screen and (min-width: 769px), print { + .level-left .level-item:not(:last-child), + .level-right .level-item:not(:last-child) { + margin-right: 0.75rem; } } +.level-left { + align-items: center; + justify-content: flex-start; } + @media screen and (max-width: 768px) { + .level-left + .level-right { + margin-top: 1.5rem; } } + @media screen and (min-width: 769px), print { + .level-left { + display: flex; } } +.level-right { + align-items: center; + justify-content: flex-end; } + @media screen and (min-width: 769px), print { + .level-right { + display: flex; } } +.media { + align-items: flex-start; + display: flex; + text-align: inherit; } + .media .content:not(:last-child) { + margin-bottom: 0.75rem; } + .media .media { + border-top: 1px solid rgba(219, 219, 219, 0.5); + display: flex; + padding-top: 0.75rem; } + .media .media .content:not(:last-child), + .media .media .control:not(:last-child) { + margin-bottom: 0.5rem; } + .media .media .media { + padding-top: 0.5rem; } + .media .media .media + .media { + margin-top: 0.5rem; } + .media + .media { + border-top: 1px solid rgba(219, 219, 219, 0.5); + margin-top: 1rem; + padding-top: 1rem; } + .media.is-large + .media { + margin-top: 1.5rem; + padding-top: 1.5rem; } + +.media-left, +.media-right { + flex-basis: auto; + flex-grow: 0; + flex-shrink: 0; } + +.media-left { + margin-right: 1rem; } + +.media-right { + margin-left: 1rem; } + +.media-content { + flex-basis: auto; + flex-grow: 1; + flex-shrink: 1; + text-align: inherit; } + +@media screen and (max-width: 768px) { + .media-content { + overflow-x: auto; } } + +.menu { + font-size: 1rem; } + .menu.is-small { + font-size: 0.75rem; } + .menu.is-medium { + font-size: 1.25rem; } + .menu.is-large { + font-size: 1.5rem; } + +.menu-list { + line-height: 1.25; } + .menu-list a { + border-radius: 2px; + color: #4a4a4a; + display: block; + padding: 0.5em 0.75em; } + .menu-list a:hover { + background-color: whitesmoke; + color: #363636; } + .menu-list a.is-active { + background-color: #ff0d68; + color: #fff; } + .menu-list li ul { + border-left: 1px solid #dbdbdb; + margin: 0.75em; + padding-left: 0.75em; } + +.menu-label { + color: #7a7a7a; + font-size: 0.75em; + letter-spacing: 0.1em; + text-transform: uppercase; } + .menu-label:not(:first-child) { + margin-top: 1em; } + .menu-label:not(:last-child) { + margin-bottom: 1em; } + +.message { + background-color: whitesmoke; + border-radius: 4px; + font-size: 1rem; } + .message strong { + color: currentColor; } + .message a:not(.button):not(.tag):not(.dropdown-item) { + color: currentColor; + text-decoration: underline; } + .message.is-small { + font-size: 0.75rem; } + .message.is-medium { + font-size: 1.25rem; } + .message.is-large { + font-size: 1.5rem; } + .message.is-white { + background-color: white; } + .message.is-white .message-header { + background-color: white; + color: #0a0a0a; } + .message.is-white .message-body { + border-color: white; } + .message.is-black { + background-color: #fafafa; } + .message.is-black .message-header { + background-color: #0a0a0a; + color: white; } + .message.is-black .message-body { + border-color: #0a0a0a; } + .message.is-light { + background-color: #fafafa; } + .message.is-light .message-header { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .message.is-light .message-body { + border-color: whitesmoke; } + .message.is-dark { + background-color: #fafafa; } + .message.is-dark .message-header { + background-color: #363636; + color: #fff; } + .message.is-dark .message-body { + border-color: #363636; } + .message.is-primary { + background-color: #ffebf2; } + .message.is-primary .message-header { + background-color: #ff0d68; + color: #fff; } + .message.is-primary .message-body { + border-color: #ff0d68; + color: #e60056; } + .message.is-link { + background-color: #ffebf2; } + .message.is-link .message-header { + background-color: #ff0d68; + color: #fff; } + .message.is-link .message-body { + border-color: #ff0d68; + color: #e60056; } + .message.is-info { + background-color: #ebf6ff; } + .message.is-info .message-header { + background-color: #0092FF; + color: #fff; } + .message.is-info .message-body { + border-color: #0092FF; + color: #0075cc; } + .message.is-success { + background-color: #ecfdf7; } + .message.is-success .message-header { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .message.is-success .message-body { + border-color: #16DB93; + color: #0e865a; } + .message.is-warning { + background-color: #fffdeb; } + .message.is-warning .message-header { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .message.is-warning .message-body { + border-color: #FFE900; + color: #948700; } + .message.is-danger { + background-color: #feecf0; } + .message.is-danger .message-header { + background-color: #f14668; + color: #fff; } + .message.is-danger .message-body { + border-color: #f14668; + color: #cc0f35; } + +.message-header { + align-items: center; + background-color: #4a4a4a; + border-radius: 4px 4px 0 0; + color: #fff; + display: flex; + font-weight: 700; + justify-content: space-between; + line-height: 1.25; + padding: 0.75em 1em; + position: relative; } + .message-header .delete { + flex-grow: 0; + flex-shrink: 0; + margin-left: 0.75em; } + .message-header + .message-body { + border-width: 0; + border-top-left-radius: 0; + border-top-right-radius: 0; } + +.message-body { + border-color: #dbdbdb; + border-radius: 4px; + border-style: solid; + border-width: 0 0 0 4px; + color: #4a4a4a; + padding: 1.25em 1.5em; } + .message-body code, + .message-body pre { + background-color: white; } + .message-body pre code { + background-color: transparent; } + +.modal { + align-items: center; + display: none; + flex-direction: column; + justify-content: center; + overflow: hidden; + position: fixed; + z-index: 40; } + .modal.is-active { + display: flex; } + +.modal-background { + background-color: rgba(10, 10, 10, 0.86); } + +.modal-content, +.modal-card { + margin: 0 20px; + max-height: calc(100vh - 160px); + overflow: auto; + position: relative; + width: 100%; } + @media screen and (min-width: 769px) { + .modal-content, + .modal-card { + margin: 0 auto; + max-height: calc(100vh - 40px); + width: 640px; } } +.modal-close { + background: none; + height: 40px; + position: fixed; + right: 20px; + top: 20px; + width: 40px; } + +.modal-card { + display: flex; + flex-direction: column; + max-height: calc(100vh - 40px); + overflow: hidden; + -ms-overflow-y: visible; } + +.modal-card-head, +.modal-card-foot { + align-items: center; + background-color: whitesmoke; + display: flex; + flex-shrink: 0; + justify-content: flex-start; + padding: 20px; + position: relative; } + +.modal-card-head { + border-bottom: 1px solid #dbdbdb; + border-top-left-radius: 6px; + border-top-right-radius: 6px; } + +.modal-card-title { + color: #363636; + flex-grow: 1; + flex-shrink: 0; + font-size: 1.5rem; + line-height: 1; } + +.modal-card-foot { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 1px solid #dbdbdb; } + .modal-card-foot .button:not(:last-child) { + margin-right: 0.5em; } + +.modal-card-body { + -webkit-overflow-scrolling: touch; + background-color: white; + flex-grow: 1; + flex-shrink: 1; + overflow: auto; + padding: 20px; } + +.navbar { + background-color: white; + min-height: 3.25rem; + position: relative; + z-index: 30; } + .navbar.is-white { + background-color: white; + color: #0a0a0a; } + .navbar.is-white .navbar-brand > .navbar-item, + .navbar.is-white .navbar-brand .navbar-link { + color: #0a0a0a; } + .navbar.is-white .navbar-brand > a.navbar-item:focus, .navbar.is-white .navbar-brand > a.navbar-item:hover, .navbar.is-white .navbar-brand > a.navbar-item.is-active, + .navbar.is-white .navbar-brand .navbar-link:focus, + .navbar.is-white .navbar-brand .navbar-link:hover, + .navbar.is-white .navbar-brand .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white .navbar-brand .navbar-link::after { + border-color: #0a0a0a; } + .navbar.is-white .navbar-burger { + color: #0a0a0a; } + @media screen and (min-width: 1024px) { + .navbar.is-white .navbar-start > .navbar-item, + .navbar.is-white .navbar-start .navbar-link, + .navbar.is-white .navbar-end > .navbar-item, + .navbar.is-white .navbar-end .navbar-link { + color: #0a0a0a; } + .navbar.is-white .navbar-start > a.navbar-item:focus, .navbar.is-white .navbar-start > a.navbar-item:hover, .navbar.is-white .navbar-start > a.navbar-item.is-active, + .navbar.is-white .navbar-start .navbar-link:focus, + .navbar.is-white .navbar-start .navbar-link:hover, + .navbar.is-white .navbar-start .navbar-link.is-active, + .navbar.is-white .navbar-end > a.navbar-item:focus, + .navbar.is-white .navbar-end > a.navbar-item:hover, + .navbar.is-white .navbar-end > a.navbar-item.is-active, + .navbar.is-white .navbar-end .navbar-link:focus, + .navbar.is-white .navbar-end .navbar-link:hover, + .navbar.is-white .navbar-end .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white .navbar-start .navbar-link::after, + .navbar.is-white .navbar-end .navbar-link::after { + border-color: #0a0a0a; } + .navbar.is-white .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white .navbar-dropdown a.navbar-item.is-active { + background-color: white; + color: #0a0a0a; } } + .navbar.is-black { + background-color: #0a0a0a; + color: white; } + .navbar.is-black .navbar-brand > .navbar-item, + .navbar.is-black .navbar-brand .navbar-link { + color: white; } + .navbar.is-black .navbar-brand > a.navbar-item:focus, .navbar.is-black .navbar-brand > a.navbar-item:hover, .navbar.is-black .navbar-brand > a.navbar-item.is-active, + .navbar.is-black .navbar-brand .navbar-link:focus, + .navbar.is-black .navbar-brand .navbar-link:hover, + .navbar.is-black .navbar-brand .navbar-link.is-active { + background-color: black; + color: white; } + .navbar.is-black .navbar-brand .navbar-link::after { + border-color: white; } + .navbar.is-black .navbar-burger { + color: white; } + @media screen and (min-width: 1024px) { + .navbar.is-black .navbar-start > .navbar-item, + .navbar.is-black .navbar-start .navbar-link, + .navbar.is-black .navbar-end > .navbar-item, + .navbar.is-black .navbar-end .navbar-link { + color: white; } + .navbar.is-black .navbar-start > a.navbar-item:focus, .navbar.is-black .navbar-start > a.navbar-item:hover, .navbar.is-black .navbar-start > a.navbar-item.is-active, + .navbar.is-black .navbar-start .navbar-link:focus, + .navbar.is-black .navbar-start .navbar-link:hover, + .navbar.is-black .navbar-start .navbar-link.is-active, + .navbar.is-black .navbar-end > a.navbar-item:focus, + .navbar.is-black .navbar-end > a.navbar-item:hover, + .navbar.is-black .navbar-end > a.navbar-item.is-active, + .navbar.is-black .navbar-end .navbar-link:focus, + .navbar.is-black .navbar-end .navbar-link:hover, + .navbar.is-black .navbar-end .navbar-link.is-active { + background-color: black; + color: white; } + .navbar.is-black .navbar-start .navbar-link::after, + .navbar.is-black .navbar-end .navbar-link::after { + border-color: white; } + .navbar.is-black .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { + background-color: black; + color: white; } + .navbar.is-black .navbar-dropdown a.navbar-item.is-active { + background-color: #0a0a0a; + color: white; } } + .navbar.is-light { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-brand > .navbar-item, + .navbar.is-light .navbar-brand .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-brand > a.navbar-item:focus, .navbar.is-light .navbar-brand > a.navbar-item:hover, .navbar.is-light .navbar-brand > a.navbar-item.is-active, + .navbar.is-light .navbar-brand .navbar-link:focus, + .navbar.is-light .navbar-brand .navbar-link:hover, + .navbar.is-light .navbar-brand .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-brand .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-burger { + color: rgba(0, 0, 0, 0.7); } + @media screen and (min-width: 1024px) { + .navbar.is-light .navbar-start > .navbar-item, + .navbar.is-light .navbar-start .navbar-link, + .navbar.is-light .navbar-end > .navbar-item, + .navbar.is-light .navbar-end .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-start > a.navbar-item:focus, .navbar.is-light .navbar-start > a.navbar-item:hover, .navbar.is-light .navbar-start > a.navbar-item.is-active, + .navbar.is-light .navbar-start .navbar-link:focus, + .navbar.is-light .navbar-start .navbar-link:hover, + .navbar.is-light .navbar-start .navbar-link.is-active, + .navbar.is-light .navbar-end > a.navbar-item:focus, + .navbar.is-light .navbar-end > a.navbar-item:hover, + .navbar.is-light .navbar-end > a.navbar-item.is-active, + .navbar.is-light .navbar-end .navbar-link:focus, + .navbar.is-light .navbar-end .navbar-link:hover, + .navbar.is-light .navbar-end .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-start .navbar-link::after, + .navbar.is-light .navbar-end .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e8e8e8; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } } + .navbar.is-dark { + background-color: #363636; + color: #fff; } + .navbar.is-dark .navbar-brand > .navbar-item, + .navbar.is-dark .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-dark .navbar-brand > a.navbar-item:focus, .navbar.is-dark .navbar-brand > a.navbar-item:hover, .navbar.is-dark .navbar-brand > a.navbar-item.is-active, + .navbar.is-dark .navbar-brand .navbar-link:focus, + .navbar.is-dark .navbar-brand .navbar-link:hover, + .navbar.is-dark .navbar-brand .navbar-link.is-active { + background-color: #292929; + color: #fff; } + .navbar.is-dark .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-dark .navbar-burger { + color: #fff; } + @media screen and (min-width: 1024px) { + .navbar.is-dark .navbar-start > .navbar-item, + .navbar.is-dark .navbar-start .navbar-link, + .navbar.is-dark .navbar-end > .navbar-item, + .navbar.is-dark .navbar-end .navbar-link { + color: #fff; } + .navbar.is-dark .navbar-start > a.navbar-item:focus, .navbar.is-dark .navbar-start > a.navbar-item:hover, .navbar.is-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-dark .navbar-start .navbar-link:focus, + .navbar.is-dark .navbar-start .navbar-link:hover, + .navbar.is-dark .navbar-start .navbar-link.is-active, + .navbar.is-dark .navbar-end > a.navbar-item:focus, + .navbar.is-dark .navbar-end > a.navbar-item:hover, + .navbar.is-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-dark .navbar-end .navbar-link:focus, + .navbar.is-dark .navbar-end .navbar-link:hover, + .navbar.is-dark .navbar-end .navbar-link.is-active { + background-color: #292929; + color: #fff; } + .navbar.is-dark .navbar-start .navbar-link::after, + .navbar.is-dark .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-dark .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #292929; + color: #fff; } + .navbar.is-dark .navbar-dropdown a.navbar-item.is-active { + background-color: #363636; + color: #fff; } } + .navbar.is-primary { + background-color: #ff0d68; + color: #fff; } + .navbar.is-primary .navbar-brand > .navbar-item, + .navbar.is-primary .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-primary .navbar-brand > a.navbar-item:focus, .navbar.is-primary .navbar-brand > a.navbar-item:hover, .navbar.is-primary .navbar-brand > a.navbar-item.is-active, + .navbar.is-primary .navbar-brand .navbar-link:focus, + .navbar.is-primary .navbar-brand .navbar-link:hover, + .navbar.is-primary .navbar-brand .navbar-link.is-active { + background-color: #f3005b; + color: #fff; } + .navbar.is-primary .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-primary .navbar-burger { + color: #fff; } + @media screen and (min-width: 1024px) { + .navbar.is-primary .navbar-start > .navbar-item, + .navbar.is-primary .navbar-start .navbar-link, + .navbar.is-primary .navbar-end > .navbar-item, + .navbar.is-primary .navbar-end .navbar-link { + color: #fff; } + .navbar.is-primary .navbar-start > a.navbar-item:focus, .navbar.is-primary .navbar-start > a.navbar-item:hover, .navbar.is-primary .navbar-start > a.navbar-item.is-active, + .navbar.is-primary .navbar-start .navbar-link:focus, + .navbar.is-primary .navbar-start .navbar-link:hover, + .navbar.is-primary .navbar-start .navbar-link.is-active, + .navbar.is-primary .navbar-end > a.navbar-item:focus, + .navbar.is-primary .navbar-end > a.navbar-item:hover, + .navbar.is-primary .navbar-end > a.navbar-item.is-active, + .navbar.is-primary .navbar-end .navbar-link:focus, + .navbar.is-primary .navbar-end .navbar-link:hover, + .navbar.is-primary .navbar-end .navbar-link.is-active { + background-color: #f3005b; + color: #fff; } + .navbar.is-primary .navbar-start .navbar-link::after, + .navbar.is-primary .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-primary .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f3005b; + color: #fff; } + .navbar.is-primary .navbar-dropdown a.navbar-item.is-active { + background-color: #ff0d68; + color: #fff; } } + .navbar.is-link { + background-color: #ff0d68; + color: #fff; } + .navbar.is-link .navbar-brand > .navbar-item, + .navbar.is-link .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-link .navbar-brand > a.navbar-item:focus, .navbar.is-link .navbar-brand > a.navbar-item:hover, .navbar.is-link .navbar-brand > a.navbar-item.is-active, + .navbar.is-link .navbar-brand .navbar-link:focus, + .navbar.is-link .navbar-brand .navbar-link:hover, + .navbar.is-link .navbar-brand .navbar-link.is-active { + background-color: #f3005b; + color: #fff; } + .navbar.is-link .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-link .navbar-burger { + color: #fff; } + @media screen and (min-width: 1024px) { + .navbar.is-link .navbar-start > .navbar-item, + .navbar.is-link .navbar-start .navbar-link, + .navbar.is-link .navbar-end > .navbar-item, + .navbar.is-link .navbar-end .navbar-link { + color: #fff; } + .navbar.is-link .navbar-start > a.navbar-item:focus, .navbar.is-link .navbar-start > a.navbar-item:hover, .navbar.is-link .navbar-start > a.navbar-item.is-active, + .navbar.is-link .navbar-start .navbar-link:focus, + .navbar.is-link .navbar-start .navbar-link:hover, + .navbar.is-link .navbar-start .navbar-link.is-active, + .navbar.is-link .navbar-end > a.navbar-item:focus, + .navbar.is-link .navbar-end > a.navbar-item:hover, + .navbar.is-link .navbar-end > a.navbar-item.is-active, + .navbar.is-link .navbar-end .navbar-link:focus, + .navbar.is-link .navbar-end .navbar-link:hover, + .navbar.is-link .navbar-end .navbar-link.is-active { + background-color: #f3005b; + color: #fff; } + .navbar.is-link .navbar-start .navbar-link::after, + .navbar.is-link .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-link .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f3005b; + color: #fff; } + .navbar.is-link .navbar-dropdown a.navbar-item.is-active { + background-color: #ff0d68; + color: #fff; } } + .navbar.is-info { + background-color: #0092FF; + color: #fff; } + .navbar.is-info .navbar-brand > .navbar-item, + .navbar.is-info .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-info .navbar-brand > a.navbar-item:focus, .navbar.is-info .navbar-brand > a.navbar-item:hover, .navbar.is-info .navbar-brand > a.navbar-item.is-active, + .navbar.is-info .navbar-brand .navbar-link:focus, + .navbar.is-info .navbar-brand .navbar-link:hover, + .navbar.is-info .navbar-brand .navbar-link.is-active { + background-color: #0083e6; + color: #fff; } + .navbar.is-info .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-info .navbar-burger { + color: #fff; } + @media screen and (min-width: 1024px) { + .navbar.is-info .navbar-start > .navbar-item, + .navbar.is-info .navbar-start .navbar-link, + .navbar.is-info .navbar-end > .navbar-item, + .navbar.is-info .navbar-end .navbar-link { + color: #fff; } + .navbar.is-info .navbar-start > a.navbar-item:focus, .navbar.is-info .navbar-start > a.navbar-item:hover, .navbar.is-info .navbar-start > a.navbar-item.is-active, + .navbar.is-info .navbar-start .navbar-link:focus, + .navbar.is-info .navbar-start .navbar-link:hover, + .navbar.is-info .navbar-start .navbar-link.is-active, + .navbar.is-info .navbar-end > a.navbar-item:focus, + .navbar.is-info .navbar-end > a.navbar-item:hover, + .navbar.is-info .navbar-end > a.navbar-item.is-active, + .navbar.is-info .navbar-end .navbar-link:focus, + .navbar.is-info .navbar-end .navbar-link:hover, + .navbar.is-info .navbar-end .navbar-link.is-active { + background-color: #0083e6; + color: #fff; } + .navbar.is-info .navbar-start .navbar-link::after, + .navbar.is-info .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-info .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #0083e6; + color: #fff; } + .navbar.is-info .navbar-dropdown a.navbar-item.is-active { + background-color: #0092FF; + color: #fff; } } + .navbar.is-success { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-brand > .navbar-item, + .navbar.is-success .navbar-brand .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-brand > a.navbar-item:focus, .navbar.is-success .navbar-brand > a.navbar-item:hover, .navbar.is-success .navbar-brand > a.navbar-item.is-active, + .navbar.is-success .navbar-brand .navbar-link:focus, + .navbar.is-success .navbar-brand .navbar-link:hover, + .navbar.is-success .navbar-brand .navbar-link.is-active { + background-color: #14c483; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-brand .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-burger { + color: rgba(0, 0, 0, 0.7); } + @media screen and (min-width: 1024px) { + .navbar.is-success .navbar-start > .navbar-item, + .navbar.is-success .navbar-start .navbar-link, + .navbar.is-success .navbar-end > .navbar-item, + .navbar.is-success .navbar-end .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-start > a.navbar-item:focus, .navbar.is-success .navbar-start > a.navbar-item:hover, .navbar.is-success .navbar-start > a.navbar-item.is-active, + .navbar.is-success .navbar-start .navbar-link:focus, + .navbar.is-success .navbar-start .navbar-link:hover, + .navbar.is-success .navbar-start .navbar-link.is-active, + .navbar.is-success .navbar-end > a.navbar-item:focus, + .navbar.is-success .navbar-end > a.navbar-item:hover, + .navbar.is-success .navbar-end > a.navbar-item.is-active, + .navbar.is-success .navbar-end .navbar-link:focus, + .navbar.is-success .navbar-end .navbar-link:hover, + .navbar.is-success .navbar-end .navbar-link.is-active { + background-color: #14c483; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-start .navbar-link::after, + .navbar.is-success .navbar-end .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #14c483; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-dropdown a.navbar-item.is-active { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } } + .navbar.is-warning { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand > .navbar-item, + .navbar.is-warning .navbar-brand .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand > a.navbar-item:focus, .navbar.is-warning .navbar-brand > a.navbar-item:hover, .navbar.is-warning .navbar-brand > a.navbar-item.is-active, + .navbar.is-warning .navbar-brand .navbar-link:focus, + .navbar.is-warning .navbar-brand .navbar-link:hover, + .navbar.is-warning .navbar-brand .navbar-link.is-active { + background-color: #e6d200; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-burger { + color: rgba(0, 0, 0, 0.7); } + @media screen and (min-width: 1024px) { + .navbar.is-warning .navbar-start > .navbar-item, + .navbar.is-warning .navbar-start .navbar-link, + .navbar.is-warning .navbar-end > .navbar-item, + .navbar.is-warning .navbar-end .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-start > a.navbar-item:focus, .navbar.is-warning .navbar-start > a.navbar-item:hover, .navbar.is-warning .navbar-start > a.navbar-item.is-active, + .navbar.is-warning .navbar-start .navbar-link:focus, + .navbar.is-warning .navbar-start .navbar-link:hover, + .navbar.is-warning .navbar-start .navbar-link.is-active, + .navbar.is-warning .navbar-end > a.navbar-item:focus, + .navbar.is-warning .navbar-end > a.navbar-item:hover, + .navbar.is-warning .navbar-end > a.navbar-item.is-active, + .navbar.is-warning .navbar-end .navbar-link:focus, + .navbar.is-warning .navbar-end .navbar-link:hover, + .navbar.is-warning .navbar-end .navbar-link.is-active { + background-color: #e6d200; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-start .navbar-link::after, + .navbar.is-warning .navbar-end .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e6d200; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } } + .navbar.is-danger { + background-color: #f14668; + color: #fff; } + .navbar.is-danger .navbar-brand > .navbar-item, + .navbar.is-danger .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-danger .navbar-brand > a.navbar-item:focus, .navbar.is-danger .navbar-brand > a.navbar-item:hover, .navbar.is-danger .navbar-brand > a.navbar-item.is-active, + .navbar.is-danger .navbar-brand .navbar-link:focus, + .navbar.is-danger .navbar-brand .navbar-link:hover, + .navbar.is-danger .navbar-brand .navbar-link.is-active { + background-color: #ef2e55; + color: #fff; } + .navbar.is-danger .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-danger .navbar-burger { + color: #fff; } + @media screen and (min-width: 1024px) { + .navbar.is-danger .navbar-start > .navbar-item, + .navbar.is-danger .navbar-start .navbar-link, + .navbar.is-danger .navbar-end > .navbar-item, + .navbar.is-danger .navbar-end .navbar-link { + color: #fff; } + .navbar.is-danger .navbar-start > a.navbar-item:focus, .navbar.is-danger .navbar-start > a.navbar-item:hover, .navbar.is-danger .navbar-start > a.navbar-item.is-active, + .navbar.is-danger .navbar-start .navbar-link:focus, + .navbar.is-danger .navbar-start .navbar-link:hover, + .navbar.is-danger .navbar-start .navbar-link.is-active, + .navbar.is-danger .navbar-end > a.navbar-item:focus, + .navbar.is-danger .navbar-end > a.navbar-item:hover, + .navbar.is-danger .navbar-end > a.navbar-item.is-active, + .navbar.is-danger .navbar-end .navbar-link:focus, + .navbar.is-danger .navbar-end .navbar-link:hover, + .navbar.is-danger .navbar-end .navbar-link.is-active { + background-color: #ef2e55; + color: #fff; } + .navbar.is-danger .navbar-start .navbar-link::after, + .navbar.is-danger .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-danger .navbar-item.has-dropdown:focus .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #ef2e55; + color: #fff; } + .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { + background-color: #f14668; + color: #fff; } } + .navbar > .container { + align-items: stretch; + display: flex; + min-height: 3.25rem; + width: 100%; } + .navbar.has-shadow { + box-shadow: 0 2px 0 0 whitesmoke; } + .navbar.is-fixed-bottom, .navbar.is-fixed-top { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + .navbar.is-fixed-bottom { + bottom: 0; } + .navbar.is-fixed-bottom.has-shadow { + box-shadow: 0 -2px 0 0 whitesmoke; } + .navbar.is-fixed-top { + top: 0; } + +html.has-navbar-fixed-top, +body.has-navbar-fixed-top { + padding-top: 3.25rem; } + +html.has-navbar-fixed-bottom, +body.has-navbar-fixed-bottom { + padding-bottom: 3.25rem; } + +.navbar-brand, +.navbar-tabs { + align-items: stretch; + display: flex; + flex-shrink: 0; + min-height: 3.25rem; } + +.navbar-brand a.navbar-item:focus, .navbar-brand a.navbar-item:hover { + background-color: transparent; } + +.navbar-tabs { + -webkit-overflow-scrolling: touch; + max-width: 100vw; + overflow-x: auto; + overflow-y: hidden; } + +.navbar-burger { + color: #4a4a4a; + -moz-appearance: none; + -webkit-appearance: none; + appearance: none; + background: none; + border: none; + cursor: pointer; + display: block; + height: 3.25rem; + position: relative; + width: 3.25rem; + margin-left: auto; } + .navbar-burger span { + background-color: currentColor; + display: block; + height: 1px; + left: calc(50% - 8px); + position: absolute; + transform-origin: center; + transition-duration: 86ms; + transition-property: background-color, opacity, transform; + transition-timing-function: ease-out; + width: 16px; } + .navbar-burger span:nth-child(1) { + top: calc(50% - 6px); } + .navbar-burger span:nth-child(2) { + top: calc(50% - 1px); } + .navbar-burger span:nth-child(3) { + top: calc(50% + 4px); } + .navbar-burger:hover { + background-color: rgba(0, 0, 0, 0.05); } + .navbar-burger.is-active span:nth-child(1) { + transform: translateY(5px) rotate(45deg); } + .navbar-burger.is-active span:nth-child(2) { + opacity: 0; } + .navbar-burger.is-active span:nth-child(3) { + transform: translateY(-5px) rotate(-45deg); } + +.navbar-menu { + display: none; } + +.navbar-item, +.navbar-link { + color: #4a4a4a; + display: block; + line-height: 1.5; + padding: 0.5rem 0.75rem; + position: relative; } + .navbar-item .icon:only-child, + .navbar-link .icon:only-child { + margin-left: -0.25rem; + margin-right: -0.25rem; } + +a.navbar-item, +.navbar-link { + cursor: pointer; } + a.navbar-item:focus, a.navbar-item:focus-within, a.navbar-item:hover, a.navbar-item.is-active, + .navbar-link:focus, + .navbar-link:focus-within, + .navbar-link:hover, + .navbar-link.is-active { + background-color: #fafafa; + color: #ff0d68; } + +.navbar-item { + flex-grow: 0; + flex-shrink: 0; } + .navbar-item img { + max-height: 1.75rem; } + .navbar-item.has-dropdown { + padding: 0; } + .navbar-item.is-expanded { + flex-grow: 1; + flex-shrink: 1; } + .navbar-item.is-tab { + border-bottom: 1px solid transparent; + min-height: 3.25rem; + padding-bottom: calc(0.5rem - 1px); } + .navbar-item.is-tab:focus, .navbar-item.is-tab:hover { + background-color: transparent; + border-bottom-color: #ff0d68; } + .navbar-item.is-tab.is-active { + background-color: transparent; + border-bottom-color: #ff0d68; + border-bottom-style: solid; + border-bottom-width: 3px; + color: #ff0d68; + padding-bottom: calc(0.5rem - 3px); } + +.navbar-content { + flex-grow: 1; + flex-shrink: 1; } + +.navbar-link:not(.is-arrowless) { + padding-right: 2.5em; } + .navbar-link:not(.is-arrowless)::after { + border-color: #ff0d68; + margin-top: -0.375em; + right: 1.125em; } + +.navbar-dropdown { + font-size: 0.875rem; + padding-bottom: 0.5rem; + padding-top: 0.5rem; } + .navbar-dropdown .navbar-item { + padding-left: 1.5rem; + padding-right: 1.5rem; } + +.navbar-divider { + background-color: whitesmoke; + border: none; + display: none; + height: 2px; + margin: 0.5rem 0; } + +@media screen and (max-width: 1023px) { + .navbar > .container { + display: block; } + .navbar-brand .navbar-item, + .navbar-tabs .navbar-item { + align-items: center; + display: flex; } + .navbar-link::after { + display: none; } + .navbar-menu { + background-color: white; + box-shadow: 0 8px 16px rgba(10, 10, 10, 0.1); + padding: 0.5rem 0; } + .navbar-menu.is-active { + display: block; } + .navbar.is-fixed-bottom-touch, .navbar.is-fixed-top-touch { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + .navbar.is-fixed-bottom-touch { + bottom: 0; } + .navbar.is-fixed-bottom-touch.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } + .navbar.is-fixed-top-touch { + top: 0; } + .navbar.is-fixed-top .navbar-menu, .navbar.is-fixed-top-touch .navbar-menu { + -webkit-overflow-scrolling: touch; + max-height: calc(100vh - 3.25rem); + overflow: auto; } + html.has-navbar-fixed-top-touch, + body.has-navbar-fixed-top-touch { + padding-top: 3.25rem; } + html.has-navbar-fixed-bottom-touch, + body.has-navbar-fixed-bottom-touch { + padding-bottom: 3.25rem; } } + +@media screen and (min-width: 1024px) { + .navbar, + .navbar-menu, + .navbar-start, + .navbar-end { + align-items: stretch; + display: flex; } + .navbar { + min-height: 3.25rem; } + .navbar.is-spaced { + padding: 1rem 2rem; } + .navbar.is-spaced .navbar-start, + .navbar.is-spaced .navbar-end { + align-items: center; } + .navbar.is-spaced a.navbar-item, + .navbar.is-spaced .navbar-link { + border-radius: 4px; } + .navbar.is-transparent a.navbar-item:focus, .navbar.is-transparent a.navbar-item:hover, .navbar.is-transparent a.navbar-item.is-active, + .navbar.is-transparent .navbar-link:focus, + .navbar.is-transparent .navbar-link:hover, + .navbar.is-transparent .navbar-link.is-active { + background-color: transparent !important; } + .navbar.is-transparent .navbar-item.has-dropdown.is-active .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:focus-within .navbar-link, .navbar.is-transparent .navbar-item.has-dropdown.is-hoverable:hover .navbar-link { + background-color: transparent !important; } + .navbar.is-transparent .navbar-dropdown a.navbar-item:focus, .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { + background-color: whitesmoke; + color: #0a0a0a; } + .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: #ff0d68; } + .navbar-burger { + display: none; } + .navbar-item, + .navbar-link { + align-items: center; + display: flex; } + .navbar-item.has-dropdown { + align-items: stretch; } + .navbar-item.has-dropdown-up .navbar-link::after { + transform: rotate(135deg) translate(0.25em, -0.25em); } + .navbar-item.has-dropdown-up .navbar-dropdown { + border-bottom: 2px solid #dbdbdb; + border-radius: 6px 6px 0 0; + border-top: none; + bottom: 100%; + box-shadow: 0 -8px 8px rgba(10, 10, 10, 0.1); + top: auto; } + .navbar-item.is-active .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown { + display: block; } + .navbar.is-spaced .navbar-item.is-active .navbar-dropdown, .navbar-item.is-active .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus .navbar-dropdown, .navbar-item.is-hoverable:focus .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:focus-within .navbar-dropdown, .navbar-item.is-hoverable:focus-within .navbar-dropdown.is-boxed, .navbar.is-spaced .navbar-item.is-hoverable:hover .navbar-dropdown, .navbar-item.is-hoverable:hover .navbar-dropdown.is-boxed { + opacity: 1; + pointer-events: auto; + transform: translateY(0); } + .navbar-menu { + flex-grow: 1; + flex-shrink: 0; } + .navbar-start { + justify-content: flex-start; + margin-right: auto; } + .navbar-end { + justify-content: flex-end; + margin-left: auto; } + .navbar-dropdown { + background-color: white; + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; + border-top: 2px solid #dbdbdb; + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1); + display: none; + font-size: 0.875rem; + left: 0; + min-width: 100%; + position: absolute; + top: 100%; + z-index: 20; } + .navbar-dropdown .navbar-item { + padding: 0.375rem 1rem; + white-space: nowrap; } + .navbar-dropdown a.navbar-item { + padding-right: 3rem; } + .navbar-dropdown a.navbar-item:focus, .navbar-dropdown a.navbar-item:hover { + background-color: whitesmoke; + color: #0a0a0a; } + .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: #ff0d68; } + .navbar.is-spaced .navbar-dropdown, .navbar-dropdown.is-boxed { + border-radius: 6px; + border-top: none; + box-shadow: 0 8px 8px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); + display: block; + opacity: 0; + pointer-events: none; + top: calc(100% + (-4px)); + transform: translateY(-5px); + transition-duration: 86ms; + transition-property: opacity, transform; } + .navbar-dropdown.is-right { + left: auto; + right: 0; } + .navbar-divider { + display: block; } + .navbar > .container .navbar-brand, + .container > .navbar .navbar-brand { + margin-left: -0.75rem; } + .navbar > .container .navbar-menu, + .container > .navbar .navbar-menu { + margin-right: -0.75rem; } + .navbar.is-fixed-bottom-desktop, .navbar.is-fixed-top-desktop { + left: 0; + position: fixed; + right: 0; + z-index: 30; } + .navbar.is-fixed-bottom-desktop { + bottom: 0; } + .navbar.is-fixed-bottom-desktop.has-shadow { + box-shadow: 0 -2px 3px rgba(10, 10, 10, 0.1); } + .navbar.is-fixed-top-desktop { + top: 0; } + html.has-navbar-fixed-top-desktop, + body.has-navbar-fixed-top-desktop { + padding-top: 3.25rem; } + html.has-navbar-fixed-bottom-desktop, + body.has-navbar-fixed-bottom-desktop { + padding-bottom: 3.25rem; } + html.has-spaced-navbar-fixed-top, + body.has-spaced-navbar-fixed-top { + padding-top: 5.25rem; } + html.has-spaced-navbar-fixed-bottom, + body.has-spaced-navbar-fixed-bottom { + padding-bottom: 5.25rem; } + a.navbar-item.is-active, + .navbar-link.is-active { + color: #0a0a0a; } + a.navbar-item.is-active:not(:focus):not(:hover), + .navbar-link.is-active:not(:focus):not(:hover) { + background-color: transparent; } + .navbar-item.has-dropdown:focus .navbar-link, .navbar-item.has-dropdown:hover .navbar-link, .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #fafafa; } } + +.hero.is-fullheight-with-navbar { + min-height: calc(100vh - 3.25rem); } + +.pagination { + font-size: 1rem; + margin: -0.25rem; } + .pagination.is-small { + font-size: 0.75rem; } + .pagination.is-medium { + font-size: 1.25rem; } + .pagination.is-large { + font-size: 1.5rem; } + .pagination.is-rounded .pagination-previous, + .pagination.is-rounded .pagination-next { + padding-left: 1em; + padding-right: 1em; + border-radius: 9999px; } + .pagination.is-rounded .pagination-link { + border-radius: 9999px; } + +.pagination, +.pagination-list { + align-items: center; + display: flex; + justify-content: center; + text-align: center; } + +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis { + font-size: 1em; + justify-content: center; + margin: 0.25rem; + padding-left: 0.5em; + padding-right: 0.5em; + text-align: center; } + +.pagination-previous, +.pagination-next, +.pagination-link { + border-color: #dbdbdb; + color: #363636; + min-width: 2.5em; } + .pagination-previous:hover, + .pagination-next:hover, + .pagination-link:hover { + border-color: #b5b5b5; + color: #363636; } + .pagination-previous:focus, + .pagination-next:focus, + .pagination-link:focus { + border-color: #0092FF; } + .pagination-previous:active, + .pagination-next:active, + .pagination-link:active { + box-shadow: inset 0 1px 2px rgba(10, 10, 10, 0.2); } + .pagination-previous[disabled], .pagination-previous.is-disabled, + .pagination-next[disabled], + .pagination-next.is-disabled, + .pagination-link[disabled], + .pagination-link.is-disabled { + background-color: #dbdbdb; + border-color: #dbdbdb; + box-shadow: none; + color: #7a7a7a; + opacity: 0.5; } + +.pagination-previous, +.pagination-next { + padding-left: 0.75em; + padding-right: 0.75em; + white-space: nowrap; } + +.pagination-link.is-current { + background-color: #ff0d68; + border-color: #ff0d68; + color: #fff; } + +.pagination-ellipsis { + color: #b5b5b5; + pointer-events: none; } + +.pagination-list { + flex-wrap: wrap; } + .pagination-list li { + list-style: none; } + +@media screen and (max-width: 768px) { + .pagination { + flex-wrap: wrap; } + .pagination-previous, + .pagination-next { + flex-grow: 1; + flex-shrink: 1; } + .pagination-list li { + flex-grow: 1; + flex-shrink: 1; } } + +@media screen and (min-width: 769px), print { + .pagination-list { + flex-grow: 1; + flex-shrink: 1; + justify-content: flex-start; + order: 1; } + .pagination-previous, + .pagination-next, + .pagination-link, + .pagination-ellipsis { + margin-bottom: 0; + margin-top: 0; } + .pagination-previous { + order: 2; } + .pagination-next { + order: 3; } + .pagination { + justify-content: space-between; + margin-bottom: 0; + margin-top: 0; } + .pagination.is-centered .pagination-previous { + order: 1; } + .pagination.is-centered .pagination-list { + justify-content: center; + order: 2; } + .pagination.is-centered .pagination-next { + order: 3; } + .pagination.is-right .pagination-previous { + order: 1; } + .pagination.is-right .pagination-next { + order: 2; } + .pagination.is-right .pagination-list { + justify-content: flex-end; + order: 3; } } + +.panel { + border-radius: 6px; + box-shadow: 0 0.5em 1em -0.125em rgba(10, 10, 10, 0.1), 0 0px 0 1px rgba(10, 10, 10, 0.02); + font-size: 1rem; } + .panel:not(:last-child) { + margin-bottom: 1.5rem; } + .panel.is-white .panel-heading { + background-color: white; + color: #0a0a0a; } + .panel.is-white .panel-tabs a.is-active { + border-bottom-color: white; } + .panel.is-white .panel-block.is-active .panel-icon { + color: white; } + .panel.is-black .panel-heading { + background-color: #0a0a0a; + color: white; } + .panel.is-black .panel-tabs a.is-active { + border-bottom-color: #0a0a0a; } + .panel.is-black .panel-block.is-active .panel-icon { + color: #0a0a0a; } + .panel.is-light .panel-heading { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .panel.is-light .panel-tabs a.is-active { + border-bottom-color: whitesmoke; } + .panel.is-light .panel-block.is-active .panel-icon { + color: whitesmoke; } + .panel.is-dark .panel-heading { + background-color: #363636; + color: #fff; } + .panel.is-dark .panel-tabs a.is-active { + border-bottom-color: #363636; } + .panel.is-dark .panel-block.is-active .panel-icon { + color: #363636; } + .panel.is-primary .panel-heading { + background-color: #ff0d68; + color: #fff; } + .panel.is-primary .panel-tabs a.is-active { + border-bottom-color: #ff0d68; } + .panel.is-primary .panel-block.is-active .panel-icon { + color: #ff0d68; } + .panel.is-link .panel-heading { + background-color: #ff0d68; + color: #fff; } + .panel.is-link .panel-tabs a.is-active { + border-bottom-color: #ff0d68; } + .panel.is-link .panel-block.is-active .panel-icon { + color: #ff0d68; } + .panel.is-info .panel-heading { + background-color: #0092FF; + color: #fff; } + .panel.is-info .panel-tabs a.is-active { + border-bottom-color: #0092FF; } + .panel.is-info .panel-block.is-active .panel-icon { + color: #0092FF; } + .panel.is-success .panel-heading { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .panel.is-success .panel-tabs a.is-active { + border-bottom-color: #16DB93; } + .panel.is-success .panel-block.is-active .panel-icon { + color: #16DB93; } + .panel.is-warning .panel-heading { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .panel.is-warning .panel-tabs a.is-active { + border-bottom-color: #FFE900; } + .panel.is-warning .panel-block.is-active .panel-icon { + color: #FFE900; } + .panel.is-danger .panel-heading { + background-color: #f14668; + color: #fff; } + .panel.is-danger .panel-tabs a.is-active { + border-bottom-color: #f14668; } + .panel.is-danger .panel-block.is-active .panel-icon { + color: #f14668; } + +.panel-tabs:not(:last-child), +.panel-block:not(:last-child) { + border-bottom: 1px solid #ededed; } + +.panel-heading { + background-color: #ededed; + border-radius: 6px 6px 0 0; + color: #363636; + font-size: 1.25em; + font-weight: 700; + line-height: 1.25; + padding: 0.75em 1em; } + +.panel-tabs { + align-items: flex-end; + display: flex; + font-size: 0.875em; + justify-content: center; } + .panel-tabs a { + border-bottom: 1px solid #dbdbdb; + margin-bottom: -1px; + padding: 0.5em; } + .panel-tabs a.is-active { + border-bottom-color: #4a4a4a; + color: #363636; } + +.panel-list a { + color: #4a4a4a; } + .panel-list a:hover { + color: #ff0d68; } + +.panel-block { + align-items: center; + color: #363636; + display: flex; + justify-content: flex-start; + padding: 0.5em 0.75em; } + .panel-block input[type="checkbox"] { + margin-right: 0.75em; } + .panel-block > .control { + flex-grow: 1; + flex-shrink: 1; + width: 100%; } + .panel-block.is-wrapped { + flex-wrap: wrap; } + .panel-block.is-active { + border-left-color: #ff0d68; + color: #363636; } + .panel-block.is-active .panel-icon { + color: #ff0d68; } + .panel-block:last-child { + border-bottom-left-radius: 6px; + border-bottom-right-radius: 6px; } + +a.panel-block, +label.panel-block { + cursor: pointer; } + a.panel-block:hover, + label.panel-block:hover { + background-color: whitesmoke; } + +.panel-icon { + display: inline-block; + font-size: 14px; + height: 1em; + line-height: 1em; + text-align: center; + vertical-align: top; + width: 1em; + color: #7a7a7a; + margin-right: 0.75em; } + .panel-icon .fa { + font-size: inherit; + line-height: inherit; } + +.tabs { + -webkit-overflow-scrolling: touch; + align-items: stretch; + display: flex; + font-size: 1rem; + justify-content: space-between; + overflow: hidden; + overflow-x: auto; + white-space: nowrap; } + .tabs a { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + color: #4a4a4a; + display: flex; + justify-content: center; + margin-bottom: -1px; + padding: 0.5em 1em; + vertical-align: top; } + .tabs a:hover { + border-bottom-color: #363636; + color: #363636; } + .tabs li { + display: block; } + .tabs li.is-active a { + border-bottom-color: #ff0d68; + color: #ff0d68; } + .tabs ul { + align-items: center; + border-bottom-color: #dbdbdb; + border-bottom-style: solid; + border-bottom-width: 1px; + display: flex; + flex-grow: 1; + flex-shrink: 0; + justify-content: flex-start; } + .tabs ul.is-left { + padding-right: 0.75em; } + .tabs ul.is-center { + flex: none; + justify-content: center; + padding-left: 0.75em; + padding-right: 0.75em; } + .tabs ul.is-right { + justify-content: flex-end; + padding-left: 0.75em; } + .tabs .icon:first-child { + margin-right: 0.5em; } + .tabs .icon:last-child { + margin-left: 0.5em; } + .tabs.is-centered ul { + justify-content: center; } + .tabs.is-right ul { + justify-content: flex-end; } + .tabs.is-boxed a { + border: 1px solid transparent; + border-radius: 4px 4px 0 0; } + .tabs.is-boxed a:hover { + background-color: whitesmoke; + border-bottom-color: #dbdbdb; } + .tabs.is-boxed li.is-active a { + background-color: white; + border-color: #dbdbdb; + border-bottom-color: transparent !important; } + .tabs.is-fullwidth li { + flex-grow: 1; + flex-shrink: 0; } + .tabs.is-toggle a { + border-color: #dbdbdb; + border-style: solid; + border-width: 1px; + margin-bottom: 0; + position: relative; } + .tabs.is-toggle a:hover { + background-color: whitesmoke; + border-color: #b5b5b5; + z-index: 2; } + .tabs.is-toggle li + li { + margin-left: -1px; } + .tabs.is-toggle li:first-child a { + border-top-left-radius: 4px; + border-bottom-left-radius: 4px; } + .tabs.is-toggle li:last-child a { + border-top-right-radius: 4px; + border-bottom-right-radius: 4px; } + .tabs.is-toggle li.is-active a { + background-color: #ff0d68; + border-color: #ff0d68; + color: #fff; + z-index: 1; } + .tabs.is-toggle ul { + border-bottom: none; } + .tabs.is-toggle.is-toggle-rounded li:first-child a { + border-bottom-left-radius: 9999px; + border-top-left-radius: 9999px; + padding-left: 1.25em; } + .tabs.is-toggle.is-toggle-rounded li:last-child a { + border-bottom-right-radius: 9999px; + border-top-right-radius: 9999px; + padding-right: 1.25em; } + .tabs.is-small { + font-size: 0.75rem; } + .tabs.is-medium { + font-size: 1.25rem; } + .tabs.is-large { + font-size: 1.5rem; } + +/* Bulma Grid */ +.column { + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + padding: 0.75rem; } + .columns.is-mobile > .column.is-narrow { + flex: none; + width: unset; } + .columns.is-mobile > .column.is-full { + flex: none; + width: 100%; } + .columns.is-mobile > .column.is-three-quarters { + flex: none; + width: 75%; } + .columns.is-mobile > .column.is-two-thirds { + flex: none; + width: 66.6666%; } + .columns.is-mobile > .column.is-half { + flex: none; + width: 50%; } + .columns.is-mobile > .column.is-one-third { + flex: none; + width: 33.3333%; } + .columns.is-mobile > .column.is-one-quarter { + flex: none; + width: 25%; } + .columns.is-mobile > .column.is-one-fifth { + flex: none; + width: 20%; } + .columns.is-mobile > .column.is-two-fifths { + flex: none; + width: 40%; } + .columns.is-mobile > .column.is-three-fifths { + flex: none; + width: 60%; } + .columns.is-mobile > .column.is-four-fifths { + flex: none; + width: 80%; } + .columns.is-mobile > .column.is-offset-three-quarters { + margin-left: 75%; } + .columns.is-mobile > .column.is-offset-two-thirds { + margin-left: 66.6666%; } + .columns.is-mobile > .column.is-offset-half { + margin-left: 50%; } + .columns.is-mobile > .column.is-offset-one-third { + margin-left: 33.3333%; } + .columns.is-mobile > .column.is-offset-one-quarter { + margin-left: 25%; } + .columns.is-mobile > .column.is-offset-one-fifth { + margin-left: 20%; } + .columns.is-mobile > .column.is-offset-two-fifths { + margin-left: 40%; } + .columns.is-mobile > .column.is-offset-three-fifths { + margin-left: 60%; } + .columns.is-mobile > .column.is-offset-four-fifths { + margin-left: 80%; } + .columns.is-mobile > .column.is-0 { + flex: none; + width: 0%; } + .columns.is-mobile > .column.is-offset-0 { + margin-left: 0%; } + .columns.is-mobile > .column.is-1 { + flex: none; + width: 8.33333%; } + .columns.is-mobile > .column.is-offset-1 { + margin-left: 8.33333%; } + .columns.is-mobile > .column.is-2 { + flex: none; + width: 16.66667%; } + .columns.is-mobile > .column.is-offset-2 { + margin-left: 16.66667%; } + .columns.is-mobile > .column.is-3 { + flex: none; + width: 25%; } + .columns.is-mobile > .column.is-offset-3 { + margin-left: 25%; } + .columns.is-mobile > .column.is-4 { + flex: none; + width: 33.33333%; } + .columns.is-mobile > .column.is-offset-4 { + margin-left: 33.33333%; } + .columns.is-mobile > .column.is-5 { + flex: none; + width: 41.66667%; } + .columns.is-mobile > .column.is-offset-5 { + margin-left: 41.66667%; } + .columns.is-mobile > .column.is-6 { + flex: none; + width: 50%; } + .columns.is-mobile > .column.is-offset-6 { + margin-left: 50%; } + .columns.is-mobile > .column.is-7 { + flex: none; + width: 58.33333%; } + .columns.is-mobile > .column.is-offset-7 { + margin-left: 58.33333%; } + .columns.is-mobile > .column.is-8 { + flex: none; + width: 66.66667%; } + .columns.is-mobile > .column.is-offset-8 { + margin-left: 66.66667%; } + .columns.is-mobile > .column.is-9 { + flex: none; + width: 75%; } + .columns.is-mobile > .column.is-offset-9 { + margin-left: 75%; } + .columns.is-mobile > .column.is-10 { + flex: none; + width: 83.33333%; } + .columns.is-mobile > .column.is-offset-10 { + margin-left: 83.33333%; } + .columns.is-mobile > .column.is-11 { + flex: none; + width: 91.66667%; } + .columns.is-mobile > .column.is-offset-11 { + margin-left: 91.66667%; } + .columns.is-mobile > .column.is-12 { + flex: none; + width: 100%; } + .columns.is-mobile > .column.is-offset-12 { + margin-left: 100%; } + @media screen and (max-width: 768px) { + .column.is-narrow-mobile { + flex: none; + width: unset; } + .column.is-full-mobile { + flex: none; + width: 100%; } + .column.is-three-quarters-mobile { + flex: none; + width: 75%; } + .column.is-two-thirds-mobile { + flex: none; + width: 66.6666%; } + .column.is-half-mobile { + flex: none; + width: 50%; } + .column.is-one-third-mobile { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-mobile { + flex: none; + width: 25%; } + .column.is-one-fifth-mobile { + flex: none; + width: 20%; } + .column.is-two-fifths-mobile { + flex: none; + width: 40%; } + .column.is-three-fifths-mobile { + flex: none; + width: 60%; } + .column.is-four-fifths-mobile { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-mobile { + margin-left: 75%; } + .column.is-offset-two-thirds-mobile { + margin-left: 66.6666%; } + .column.is-offset-half-mobile { + margin-left: 50%; } + .column.is-offset-one-third-mobile { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-mobile { + margin-left: 25%; } + .column.is-offset-one-fifth-mobile { + margin-left: 20%; } + .column.is-offset-two-fifths-mobile { + margin-left: 40%; } + .column.is-offset-three-fifths-mobile { + margin-left: 60%; } + .column.is-offset-four-fifths-mobile { + margin-left: 80%; } + .column.is-0-mobile { + flex: none; + width: 0%; } + .column.is-offset-0-mobile { + margin-left: 0%; } + .column.is-1-mobile { + flex: none; + width: 8.33333%; } + .column.is-offset-1-mobile { + margin-left: 8.33333%; } + .column.is-2-mobile { + flex: none; + width: 16.66667%; } + .column.is-offset-2-mobile { + margin-left: 16.66667%; } + .column.is-3-mobile { + flex: none; + width: 25%; } + .column.is-offset-3-mobile { + margin-left: 25%; } + .column.is-4-mobile { + flex: none; + width: 33.33333%; } + .column.is-offset-4-mobile { + margin-left: 33.33333%; } + .column.is-5-mobile { + flex: none; + width: 41.66667%; } + .column.is-offset-5-mobile { + margin-left: 41.66667%; } + .column.is-6-mobile { + flex: none; + width: 50%; } + .column.is-offset-6-mobile { + margin-left: 50%; } + .column.is-7-mobile { + flex: none; + width: 58.33333%; } + .column.is-offset-7-mobile { + margin-left: 58.33333%; } + .column.is-8-mobile { + flex: none; + width: 66.66667%; } + .column.is-offset-8-mobile { + margin-left: 66.66667%; } + .column.is-9-mobile { + flex: none; + width: 75%; } + .column.is-offset-9-mobile { + margin-left: 75%; } + .column.is-10-mobile { + flex: none; + width: 83.33333%; } + .column.is-offset-10-mobile { + margin-left: 83.33333%; } + .column.is-11-mobile { + flex: none; + width: 91.66667%; } + .column.is-offset-11-mobile { + margin-left: 91.66667%; } + .column.is-12-mobile { + flex: none; + width: 100%; } + .column.is-offset-12-mobile { + margin-left: 100%; } } + @media screen and (min-width: 769px), print { + .column.is-narrow, .column.is-narrow-tablet { + flex: none; + width: unset; } + .column.is-full, .column.is-full-tablet { + flex: none; + width: 100%; } + .column.is-three-quarters, .column.is-three-quarters-tablet { + flex: none; + width: 75%; } + .column.is-two-thirds, .column.is-two-thirds-tablet { + flex: none; + width: 66.6666%; } + .column.is-half, .column.is-half-tablet { + flex: none; + width: 50%; } + .column.is-one-third, .column.is-one-third-tablet { + flex: none; + width: 33.3333%; } + .column.is-one-quarter, .column.is-one-quarter-tablet { + flex: none; + width: 25%; } + .column.is-one-fifth, .column.is-one-fifth-tablet { + flex: none; + width: 20%; } + .column.is-two-fifths, .column.is-two-fifths-tablet { + flex: none; + width: 40%; } + .column.is-three-fifths, .column.is-three-fifths-tablet { + flex: none; + width: 60%; } + .column.is-four-fifths, .column.is-four-fifths-tablet { + flex: none; + width: 80%; } + .column.is-offset-three-quarters, .column.is-offset-three-quarters-tablet { + margin-left: 75%; } + .column.is-offset-two-thirds, .column.is-offset-two-thirds-tablet { + margin-left: 66.6666%; } + .column.is-offset-half, .column.is-offset-half-tablet { + margin-left: 50%; } + .column.is-offset-one-third, .column.is-offset-one-third-tablet { + margin-left: 33.3333%; } + .column.is-offset-one-quarter, .column.is-offset-one-quarter-tablet { + margin-left: 25%; } + .column.is-offset-one-fifth, .column.is-offset-one-fifth-tablet { + margin-left: 20%; } + .column.is-offset-two-fifths, .column.is-offset-two-fifths-tablet { + margin-left: 40%; } + .column.is-offset-three-fifths, .column.is-offset-three-fifths-tablet { + margin-left: 60%; } + .column.is-offset-four-fifths, .column.is-offset-four-fifths-tablet { + margin-left: 80%; } + .column.is-0, .column.is-0-tablet { + flex: none; + width: 0%; } + .column.is-offset-0, .column.is-offset-0-tablet { + margin-left: 0%; } + .column.is-1, .column.is-1-tablet { + flex: none; + width: 8.33333%; } + .column.is-offset-1, .column.is-offset-1-tablet { + margin-left: 8.33333%; } + .column.is-2, .column.is-2-tablet { + flex: none; + width: 16.66667%; } + .column.is-offset-2, .column.is-offset-2-tablet { + margin-left: 16.66667%; } + .column.is-3, .column.is-3-tablet { + flex: none; + width: 25%; } + .column.is-offset-3, .column.is-offset-3-tablet { + margin-left: 25%; } + .column.is-4, .column.is-4-tablet { + flex: none; + width: 33.33333%; } + .column.is-offset-4, .column.is-offset-4-tablet { + margin-left: 33.33333%; } + .column.is-5, .column.is-5-tablet { + flex: none; + width: 41.66667%; } + .column.is-offset-5, .column.is-offset-5-tablet { + margin-left: 41.66667%; } + .column.is-6, .column.is-6-tablet { + flex: none; + width: 50%; } + .column.is-offset-6, .column.is-offset-6-tablet { + margin-left: 50%; } + .column.is-7, .column.is-7-tablet { + flex: none; + width: 58.33333%; } + .column.is-offset-7, .column.is-offset-7-tablet { + margin-left: 58.33333%; } + .column.is-8, .column.is-8-tablet { + flex: none; + width: 66.66667%; } + .column.is-offset-8, .column.is-offset-8-tablet { + margin-left: 66.66667%; } + .column.is-9, .column.is-9-tablet { + flex: none; + width: 75%; } + .column.is-offset-9, .column.is-offset-9-tablet { + margin-left: 75%; } + .column.is-10, .column.is-10-tablet { + flex: none; + width: 83.33333%; } + .column.is-offset-10, .column.is-offset-10-tablet { + margin-left: 83.33333%; } + .column.is-11, .column.is-11-tablet { + flex: none; + width: 91.66667%; } + .column.is-offset-11, .column.is-offset-11-tablet { + margin-left: 91.66667%; } + .column.is-12, .column.is-12-tablet { + flex: none; + width: 100%; } + .column.is-offset-12, .column.is-offset-12-tablet { + margin-left: 100%; } } + @media screen and (max-width: 1023px) { + .column.is-narrow-touch { + flex: none; + width: unset; } + .column.is-full-touch { + flex: none; + width: 100%; } + .column.is-three-quarters-touch { + flex: none; + width: 75%; } + .column.is-two-thirds-touch { + flex: none; + width: 66.6666%; } + .column.is-half-touch { + flex: none; + width: 50%; } + .column.is-one-third-touch { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-touch { + flex: none; + width: 25%; } + .column.is-one-fifth-touch { + flex: none; + width: 20%; } + .column.is-two-fifths-touch { + flex: none; + width: 40%; } + .column.is-three-fifths-touch { + flex: none; + width: 60%; } + .column.is-four-fifths-touch { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-touch { + margin-left: 75%; } + .column.is-offset-two-thirds-touch { + margin-left: 66.6666%; } + .column.is-offset-half-touch { + margin-left: 50%; } + .column.is-offset-one-third-touch { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-touch { + margin-left: 25%; } + .column.is-offset-one-fifth-touch { + margin-left: 20%; } + .column.is-offset-two-fifths-touch { + margin-left: 40%; } + .column.is-offset-three-fifths-touch { + margin-left: 60%; } + .column.is-offset-four-fifths-touch { + margin-left: 80%; } + .column.is-0-touch { + flex: none; + width: 0%; } + .column.is-offset-0-touch { + margin-left: 0%; } + .column.is-1-touch { + flex: none; + width: 8.33333%; } + .column.is-offset-1-touch { + margin-left: 8.33333%; } + .column.is-2-touch { + flex: none; + width: 16.66667%; } + .column.is-offset-2-touch { + margin-left: 16.66667%; } + .column.is-3-touch { + flex: none; + width: 25%; } + .column.is-offset-3-touch { + margin-left: 25%; } + .column.is-4-touch { + flex: none; + width: 33.33333%; } + .column.is-offset-4-touch { + margin-left: 33.33333%; } + .column.is-5-touch { + flex: none; + width: 41.66667%; } + .column.is-offset-5-touch { + margin-left: 41.66667%; } + .column.is-6-touch { + flex: none; + width: 50%; } + .column.is-offset-6-touch { + margin-left: 50%; } + .column.is-7-touch { + flex: none; + width: 58.33333%; } + .column.is-offset-7-touch { + margin-left: 58.33333%; } + .column.is-8-touch { + flex: none; + width: 66.66667%; } + .column.is-offset-8-touch { + margin-left: 66.66667%; } + .column.is-9-touch { + flex: none; + width: 75%; } + .column.is-offset-9-touch { + margin-left: 75%; } + .column.is-10-touch { + flex: none; + width: 83.33333%; } + .column.is-offset-10-touch { + margin-left: 83.33333%; } + .column.is-11-touch { + flex: none; + width: 91.66667%; } + .column.is-offset-11-touch { + margin-left: 91.66667%; } + .column.is-12-touch { + flex: none; + width: 100%; } + .column.is-offset-12-touch { + margin-left: 100%; } } + @media screen and (min-width: 1024px) { + .column.is-narrow-desktop { + flex: none; + width: unset; } + .column.is-full-desktop { + flex: none; + width: 100%; } + .column.is-three-quarters-desktop { + flex: none; + width: 75%; } + .column.is-two-thirds-desktop { + flex: none; + width: 66.6666%; } + .column.is-half-desktop { + flex: none; + width: 50%; } + .column.is-one-third-desktop { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-desktop { + flex: none; + width: 25%; } + .column.is-one-fifth-desktop { + flex: none; + width: 20%; } + .column.is-two-fifths-desktop { + flex: none; + width: 40%; } + .column.is-three-fifths-desktop { + flex: none; + width: 60%; } + .column.is-four-fifths-desktop { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-desktop { + margin-left: 75%; } + .column.is-offset-two-thirds-desktop { + margin-left: 66.6666%; } + .column.is-offset-half-desktop { + margin-left: 50%; } + .column.is-offset-one-third-desktop { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-desktop { + margin-left: 25%; } + .column.is-offset-one-fifth-desktop { + margin-left: 20%; } + .column.is-offset-two-fifths-desktop { + margin-left: 40%; } + .column.is-offset-three-fifths-desktop { + margin-left: 60%; } + .column.is-offset-four-fifths-desktop { + margin-left: 80%; } + .column.is-0-desktop { + flex: none; + width: 0%; } + .column.is-offset-0-desktop { + margin-left: 0%; } + .column.is-1-desktop { + flex: none; + width: 8.33333%; } + .column.is-offset-1-desktop { + margin-left: 8.33333%; } + .column.is-2-desktop { + flex: none; + width: 16.66667%; } + .column.is-offset-2-desktop { + margin-left: 16.66667%; } + .column.is-3-desktop { + flex: none; + width: 25%; } + .column.is-offset-3-desktop { + margin-left: 25%; } + .column.is-4-desktop { + flex: none; + width: 33.33333%; } + .column.is-offset-4-desktop { + margin-left: 33.33333%; } + .column.is-5-desktop { + flex: none; + width: 41.66667%; } + .column.is-offset-5-desktop { + margin-left: 41.66667%; } + .column.is-6-desktop { + flex: none; + width: 50%; } + .column.is-offset-6-desktop { + margin-left: 50%; } + .column.is-7-desktop { + flex: none; + width: 58.33333%; } + .column.is-offset-7-desktop { + margin-left: 58.33333%; } + .column.is-8-desktop { + flex: none; + width: 66.66667%; } + .column.is-offset-8-desktop { + margin-left: 66.66667%; } + .column.is-9-desktop { + flex: none; + width: 75%; } + .column.is-offset-9-desktop { + margin-left: 75%; } + .column.is-10-desktop { + flex: none; + width: 83.33333%; } + .column.is-offset-10-desktop { + margin-left: 83.33333%; } + .column.is-11-desktop { + flex: none; + width: 91.66667%; } + .column.is-offset-11-desktop { + margin-left: 91.66667%; } + .column.is-12-desktop { + flex: none; + width: 100%; } + .column.is-offset-12-desktop { + margin-left: 100%; } } + @media screen and (min-width: 1216px) { + .column.is-narrow-widescreen { + flex: none; + width: unset; } + .column.is-full-widescreen { + flex: none; + width: 100%; } + .column.is-three-quarters-widescreen { + flex: none; + width: 75%; } + .column.is-two-thirds-widescreen { + flex: none; + width: 66.6666%; } + .column.is-half-widescreen { + flex: none; + width: 50%; } + .column.is-one-third-widescreen { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-widescreen { + flex: none; + width: 25%; } + .column.is-one-fifth-widescreen { + flex: none; + width: 20%; } + .column.is-two-fifths-widescreen { + flex: none; + width: 40%; } + .column.is-three-fifths-widescreen { + flex: none; + width: 60%; } + .column.is-four-fifths-widescreen { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-widescreen { + margin-left: 75%; } + .column.is-offset-two-thirds-widescreen { + margin-left: 66.6666%; } + .column.is-offset-half-widescreen { + margin-left: 50%; } + .column.is-offset-one-third-widescreen { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-widescreen { + margin-left: 25%; } + .column.is-offset-one-fifth-widescreen { + margin-left: 20%; } + .column.is-offset-two-fifths-widescreen { + margin-left: 40%; } + .column.is-offset-three-fifths-widescreen { + margin-left: 60%; } + .column.is-offset-four-fifths-widescreen { + margin-left: 80%; } + .column.is-0-widescreen { + flex: none; + width: 0%; } + .column.is-offset-0-widescreen { + margin-left: 0%; } + .column.is-1-widescreen { + flex: none; + width: 8.33333%; } + .column.is-offset-1-widescreen { + margin-left: 8.33333%; } + .column.is-2-widescreen { + flex: none; + width: 16.66667%; } + .column.is-offset-2-widescreen { + margin-left: 16.66667%; } + .column.is-3-widescreen { + flex: none; + width: 25%; } + .column.is-offset-3-widescreen { + margin-left: 25%; } + .column.is-4-widescreen { + flex: none; + width: 33.33333%; } + .column.is-offset-4-widescreen { + margin-left: 33.33333%; } + .column.is-5-widescreen { + flex: none; + width: 41.66667%; } + .column.is-offset-5-widescreen { + margin-left: 41.66667%; } + .column.is-6-widescreen { + flex: none; + width: 50%; } + .column.is-offset-6-widescreen { + margin-left: 50%; } + .column.is-7-widescreen { + flex: none; + width: 58.33333%; } + .column.is-offset-7-widescreen { + margin-left: 58.33333%; } + .column.is-8-widescreen { + flex: none; + width: 66.66667%; } + .column.is-offset-8-widescreen { + margin-left: 66.66667%; } + .column.is-9-widescreen { + flex: none; + width: 75%; } + .column.is-offset-9-widescreen { + margin-left: 75%; } + .column.is-10-widescreen { + flex: none; + width: 83.33333%; } + .column.is-offset-10-widescreen { + margin-left: 83.33333%; } + .column.is-11-widescreen { + flex: none; + width: 91.66667%; } + .column.is-offset-11-widescreen { + margin-left: 91.66667%; } + .column.is-12-widescreen { + flex: none; + width: 100%; } + .column.is-offset-12-widescreen { + margin-left: 100%; } } + @media screen and (min-width: 1408px) { + .column.is-narrow-fullhd { + flex: none; + width: unset; } + .column.is-full-fullhd { + flex: none; + width: 100%; } + .column.is-three-quarters-fullhd { + flex: none; + width: 75%; } + .column.is-two-thirds-fullhd { + flex: none; + width: 66.6666%; } + .column.is-half-fullhd { + flex: none; + width: 50%; } + .column.is-one-third-fullhd { + flex: none; + width: 33.3333%; } + .column.is-one-quarter-fullhd { + flex: none; + width: 25%; } + .column.is-one-fifth-fullhd { + flex: none; + width: 20%; } + .column.is-two-fifths-fullhd { + flex: none; + width: 40%; } + .column.is-three-fifths-fullhd { + flex: none; + width: 60%; } + .column.is-four-fifths-fullhd { + flex: none; + width: 80%; } + .column.is-offset-three-quarters-fullhd { + margin-left: 75%; } + .column.is-offset-two-thirds-fullhd { + margin-left: 66.6666%; } + .column.is-offset-half-fullhd { + margin-left: 50%; } + .column.is-offset-one-third-fullhd { + margin-left: 33.3333%; } + .column.is-offset-one-quarter-fullhd { + margin-left: 25%; } + .column.is-offset-one-fifth-fullhd { + margin-left: 20%; } + .column.is-offset-two-fifths-fullhd { + margin-left: 40%; } + .column.is-offset-three-fifths-fullhd { + margin-left: 60%; } + .column.is-offset-four-fifths-fullhd { + margin-left: 80%; } + .column.is-0-fullhd { + flex: none; + width: 0%; } + .column.is-offset-0-fullhd { + margin-left: 0%; } + .column.is-1-fullhd { + flex: none; + width: 8.33333%; } + .column.is-offset-1-fullhd { + margin-left: 8.33333%; } + .column.is-2-fullhd { + flex: none; + width: 16.66667%; } + .column.is-offset-2-fullhd { + margin-left: 16.66667%; } + .column.is-3-fullhd { + flex: none; + width: 25%; } + .column.is-offset-3-fullhd { + margin-left: 25%; } + .column.is-4-fullhd { + flex: none; + width: 33.33333%; } + .column.is-offset-4-fullhd { + margin-left: 33.33333%; } + .column.is-5-fullhd { + flex: none; + width: 41.66667%; } + .column.is-offset-5-fullhd { + margin-left: 41.66667%; } + .column.is-6-fullhd { + flex: none; + width: 50%; } + .column.is-offset-6-fullhd { + margin-left: 50%; } + .column.is-7-fullhd { + flex: none; + width: 58.33333%; } + .column.is-offset-7-fullhd { + margin-left: 58.33333%; } + .column.is-8-fullhd { + flex: none; + width: 66.66667%; } + .column.is-offset-8-fullhd { + margin-left: 66.66667%; } + .column.is-9-fullhd { + flex: none; + width: 75%; } + .column.is-offset-9-fullhd { + margin-left: 75%; } + .column.is-10-fullhd { + flex: none; + width: 83.33333%; } + .column.is-offset-10-fullhd { + margin-left: 83.33333%; } + .column.is-11-fullhd { + flex: none; + width: 91.66667%; } + .column.is-offset-11-fullhd { + margin-left: 91.66667%; } + .column.is-12-fullhd { + flex: none; + width: 100%; } + .column.is-offset-12-fullhd { + margin-left: 100%; } } +.columns { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; } + .columns:last-child { + margin-bottom: -0.75rem; } + .columns:not(:last-child) { + margin-bottom: calc(1.5rem - 0.75rem); } + .columns.is-centered { + justify-content: center; } + .columns.is-gapless { + margin-left: 0; + margin-right: 0; + margin-top: 0; } + .columns.is-gapless > .column { + margin: 0; + padding: 0 !important; } + .columns.is-gapless:not(:last-child) { + margin-bottom: 1.5rem; } + .columns.is-gapless:last-child { + margin-bottom: 0; } + .columns.is-mobile { + display: flex; } + .columns.is-multiline { + flex-wrap: wrap; } + .columns.is-vcentered { + align-items: center; } + @media screen and (min-width: 769px), print { + .columns:not(.is-desktop) { + display: flex; } } + @media screen and (min-width: 1024px) { + .columns.is-desktop { + display: flex; } } +.columns.is-variable { + --columnGap: 0.75rem; + margin-left: calc(-1 * var(--columnGap)); + margin-right: calc(-1 * var(--columnGap)); } + .columns.is-variable > .column { + padding-left: var(--columnGap); + padding-right: var(--columnGap); } + .columns.is-variable.is-0 { + --columnGap: 0rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-0-mobile { + --columnGap: 0rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-0-tablet { + --columnGap: 0rem; } } + @media screen and (min-width: 769px) and (max-width: 1023px) { + .columns.is-variable.is-0-tablet-only { + --columnGap: 0rem; } } + @media screen and (max-width: 1023px) { + .columns.is-variable.is-0-touch { + --columnGap: 0rem; } } + @media screen and (min-width: 1024px) { + .columns.is-variable.is-0-desktop { + --columnGap: 0rem; } } + @media screen and (min-width: 1024px) and (max-width: 1215px) { + .columns.is-variable.is-0-desktop-only { + --columnGap: 0rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-0-widescreen { + --columnGap: 0rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-0-widescreen-only { + --columnGap: 0rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-0-fullhd { + --columnGap: 0rem; } } + .columns.is-variable.is-1 { + --columnGap: 0.25rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-1-mobile { + --columnGap: 0.25rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-1-tablet { + --columnGap: 0.25rem; } } + @media screen and (min-width: 769px) and (max-width: 1023px) { + .columns.is-variable.is-1-tablet-only { + --columnGap: 0.25rem; } } + @media screen and (max-width: 1023px) { + .columns.is-variable.is-1-touch { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1024px) { + .columns.is-variable.is-1-desktop { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1024px) and (max-width: 1215px) { + .columns.is-variable.is-1-desktop-only { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-1-widescreen { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-1-widescreen-only { + --columnGap: 0.25rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-1-fullhd { + --columnGap: 0.25rem; } } + .columns.is-variable.is-2 { + --columnGap: 0.5rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-2-mobile { + --columnGap: 0.5rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-2-tablet { + --columnGap: 0.5rem; } } + @media screen and (min-width: 769px) and (max-width: 1023px) { + .columns.is-variable.is-2-tablet-only { + --columnGap: 0.5rem; } } + @media screen and (max-width: 1023px) { + .columns.is-variable.is-2-touch { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1024px) { + .columns.is-variable.is-2-desktop { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1024px) and (max-width: 1215px) { + .columns.is-variable.is-2-desktop-only { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-2-widescreen { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-2-widescreen-only { + --columnGap: 0.5rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-2-fullhd { + --columnGap: 0.5rem; } } + .columns.is-variable.is-3 { + --columnGap: 0.75rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-3-mobile { + --columnGap: 0.75rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-3-tablet { + --columnGap: 0.75rem; } } + @media screen and (min-width: 769px) and (max-width: 1023px) { + .columns.is-variable.is-3-tablet-only { + --columnGap: 0.75rem; } } + @media screen and (max-width: 1023px) { + .columns.is-variable.is-3-touch { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1024px) { + .columns.is-variable.is-3-desktop { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1024px) and (max-width: 1215px) { + .columns.is-variable.is-3-desktop-only { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-3-widescreen { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-3-widescreen-only { + --columnGap: 0.75rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-3-fullhd { + --columnGap: 0.75rem; } } + .columns.is-variable.is-4 { + --columnGap: 1rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-4-mobile { + --columnGap: 1rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-4-tablet { + --columnGap: 1rem; } } + @media screen and (min-width: 769px) and (max-width: 1023px) { + .columns.is-variable.is-4-tablet-only { + --columnGap: 1rem; } } + @media screen and (max-width: 1023px) { + .columns.is-variable.is-4-touch { + --columnGap: 1rem; } } + @media screen and (min-width: 1024px) { + .columns.is-variable.is-4-desktop { + --columnGap: 1rem; } } + @media screen and (min-width: 1024px) and (max-width: 1215px) { + .columns.is-variable.is-4-desktop-only { + --columnGap: 1rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-4-widescreen { + --columnGap: 1rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-4-widescreen-only { + --columnGap: 1rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-4-fullhd { + --columnGap: 1rem; } } + .columns.is-variable.is-5 { + --columnGap: 1.25rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-5-mobile { + --columnGap: 1.25rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-5-tablet { + --columnGap: 1.25rem; } } + @media screen and (min-width: 769px) and (max-width: 1023px) { + .columns.is-variable.is-5-tablet-only { + --columnGap: 1.25rem; } } + @media screen and (max-width: 1023px) { + .columns.is-variable.is-5-touch { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1024px) { + .columns.is-variable.is-5-desktop { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1024px) and (max-width: 1215px) { + .columns.is-variable.is-5-desktop-only { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-5-widescreen { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-5-widescreen-only { + --columnGap: 1.25rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-5-fullhd { + --columnGap: 1.25rem; } } + .columns.is-variable.is-6 { + --columnGap: 1.5rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-6-mobile { + --columnGap: 1.5rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-6-tablet { + --columnGap: 1.5rem; } } + @media screen and (min-width: 769px) and (max-width: 1023px) { + .columns.is-variable.is-6-tablet-only { + --columnGap: 1.5rem; } } + @media screen and (max-width: 1023px) { + .columns.is-variable.is-6-touch { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1024px) { + .columns.is-variable.is-6-desktop { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1024px) and (max-width: 1215px) { + .columns.is-variable.is-6-desktop-only { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-6-widescreen { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-6-widescreen-only { + --columnGap: 1.5rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-6-fullhd { + --columnGap: 1.5rem; } } + .columns.is-variable.is-7 { + --columnGap: 1.75rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-7-mobile { + --columnGap: 1.75rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-7-tablet { + --columnGap: 1.75rem; } } + @media screen and (min-width: 769px) and (max-width: 1023px) { + .columns.is-variable.is-7-tablet-only { + --columnGap: 1.75rem; } } + @media screen and (max-width: 1023px) { + .columns.is-variable.is-7-touch { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1024px) { + .columns.is-variable.is-7-desktop { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1024px) and (max-width: 1215px) { + .columns.is-variable.is-7-desktop-only { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-7-widescreen { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-7-widescreen-only { + --columnGap: 1.75rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-7-fullhd { + --columnGap: 1.75rem; } } + .columns.is-variable.is-8 { + --columnGap: 2rem; } + @media screen and (max-width: 768px) { + .columns.is-variable.is-8-mobile { + --columnGap: 2rem; } } + @media screen and (min-width: 769px), print { + .columns.is-variable.is-8-tablet { + --columnGap: 2rem; } } + @media screen and (min-width: 769px) and (max-width: 1023px) { + .columns.is-variable.is-8-tablet-only { + --columnGap: 2rem; } } + @media screen and (max-width: 1023px) { + .columns.is-variable.is-8-touch { + --columnGap: 2rem; } } + @media screen and (min-width: 1024px) { + .columns.is-variable.is-8-desktop { + --columnGap: 2rem; } } + @media screen and (min-width: 1024px) and (max-width: 1215px) { + .columns.is-variable.is-8-desktop-only { + --columnGap: 2rem; } } + @media screen and (min-width: 1216px) { + .columns.is-variable.is-8-widescreen { + --columnGap: 2rem; } } + @media screen and (min-width: 1216px) and (max-width: 1407px) { + .columns.is-variable.is-8-widescreen-only { + --columnGap: 2rem; } } + @media screen and (min-width: 1408px) { + .columns.is-variable.is-8-fullhd { + --columnGap: 2rem; } } +.tile { + align-items: stretch; + display: block; + flex-basis: 0; + flex-grow: 1; + flex-shrink: 1; + min-height: min-content; } + .tile.is-ancestor { + margin-left: -0.75rem; + margin-right: -0.75rem; + margin-top: -0.75rem; } + .tile.is-ancestor:last-child { + margin-bottom: -0.75rem; } + .tile.is-ancestor:not(:last-child) { + margin-bottom: 0.75rem; } + .tile.is-child { + margin: 0 !important; } + .tile.is-parent { + padding: 0.75rem; } + .tile.is-vertical { + flex-direction: column; } + .tile.is-vertical > .tile.is-child:not(:last-child) { + margin-bottom: 1.5rem !important; } + @media screen and (min-width: 769px), print { + .tile:not(.is-child) { + display: flex; } + .tile.is-1 { + flex: none; + width: 8.33333%; } + .tile.is-2 { + flex: none; + width: 16.66667%; } + .tile.is-3 { + flex: none; + width: 25%; } + .tile.is-4 { + flex: none; + width: 33.33333%; } + .tile.is-5 { + flex: none; + width: 41.66667%; } + .tile.is-6 { + flex: none; + width: 50%; } + .tile.is-7 { + flex: none; + width: 58.33333%; } + .tile.is-8 { + flex: none; + width: 66.66667%; } + .tile.is-9 { + flex: none; + width: 75%; } + .tile.is-10 { + flex: none; + width: 83.33333%; } + .tile.is-11 { + flex: none; + width: 91.66667%; } + .tile.is-12 { + flex: none; + width: 100%; } } +/* Bulma Helpers */ +.has-text-white { + color: white !important; } + +a.has-text-white:hover, a.has-text-white:focus { + color: #e6e6e6 !important; } + +.has-background-white { + background-color: white !important; } + +.has-text-black { + color: #0a0a0a !important; } + +a.has-text-black:hover, a.has-text-black:focus { + color: black !important; } + +.has-background-black { + background-color: #0a0a0a !important; } + +.has-text-light { + color: whitesmoke !important; } + +a.has-text-light:hover, a.has-text-light:focus { + color: #dbdbdb !important; } + +.has-background-light { + background-color: whitesmoke !important; } + +.has-text-dark { + color: #363636 !important; } + +a.has-text-dark:hover, a.has-text-dark:focus { + color: #1c1c1c !important; } + +.has-background-dark { + background-color: #363636 !important; } + +.has-text-primary { + color: #ff0d68 !important; } + +a.has-text-primary:hover, a.has-text-primary:focus { + color: #d90052 !important; } + +.has-background-primary { + background-color: #ff0d68 !important; } + +.has-text-primary-light { + color: #ffebf2 !important; } + +a.has-text-primary-light:hover, a.has-text-primary-light:focus { + color: #ffb8d2 !important; } + +.has-background-primary-light { + background-color: #ffebf2 !important; } + +.has-text-primary-dark { + color: #e60056 !important; } + +a.has-text-primary-dark:hover, a.has-text-primary-dark:focus { + color: #ff1a70 !important; } + +.has-background-primary-dark { + background-color: #e60056 !important; } + +.has-text-link { + color: #ff0d68 !important; } + +a.has-text-link:hover, a.has-text-link:focus { + color: #d90052 !important; } + +.has-background-link { + background-color: #ff0d68 !important; } + +.has-text-link-light { + color: #ffebf2 !important; } + +a.has-text-link-light:hover, a.has-text-link-light:focus { + color: #ffb8d2 !important; } + +.has-background-link-light { + background-color: #ffebf2 !important; } + +.has-text-link-dark { + color: #e60056 !important; } + +a.has-text-link-dark:hover, a.has-text-link-dark:focus { + color: #ff1a70 !important; } + +.has-background-link-dark { + background-color: #e60056 !important; } + +.has-text-info { + color: #0092FF !important; } + +a.has-text-info:hover, a.has-text-info:focus { + color: #0075cc !important; } + +.has-background-info { + background-color: #0092FF !important; } + +.has-text-info-light { + color: #ebf6ff !important; } + +a.has-text-info-light:hover, a.has-text-info-light:focus { + color: #b8e0ff !important; } + +.has-background-info-light { + background-color: #ebf6ff !important; } + +.has-text-info-dark { + color: #0075cc !important; } + +a.has-text-info-dark:hover, a.has-text-info-dark:focus { + color: #0092ff !important; } + +.has-background-info-dark { + background-color: #0075cc !important; } + +.has-text-success { + color: #16DB93 !important; } + +a.has-text-success:hover, a.has-text-success:focus { + color: #11ad74 !important; } + +.has-background-success { + background-color: #16DB93 !important; } + +.has-text-success-light { + color: #ecfdf7 !important; } + +a.has-text-success-light:hover, a.has-text-success-light:focus { + color: #bef8e3 !important; } + +.has-background-success-light { + background-color: #ecfdf7 !important; } + +.has-text-success-dark { + color: #0e865a !important; } + +a.has-text-success-dark:hover, a.has-text-success-dark:focus { + color: #12b579 !important; } + +.has-background-success-dark { + background-color: #0e865a !important; } + +.has-text-warning { + color: #FFE900 !important; } + +a.has-text-warning:hover, a.has-text-warning:focus { + color: #ccba00 !important; } + +.has-background-warning { + background-color: #FFE900 !important; } + +.has-text-warning-light { + color: #fffdeb !important; } + +a.has-text-warning-light:hover, a.has-text-warning-light:focus { + color: #fff9b8 !important; } + +.has-background-warning-light { + background-color: #fffdeb !important; } + +.has-text-warning-dark { + color: #948700 !important; } + +a.has-text-warning-dark:hover, a.has-text-warning-dark:focus { + color: #c7b600 !important; } + +.has-background-warning-dark { + background-color: #948700 !important; } + +.has-text-danger { + color: #f14668 !important; } + +a.has-text-danger:hover, a.has-text-danger:focus { + color: #ee1742 !important; } + +.has-background-danger { + background-color: #f14668 !important; } + +.has-text-danger-light { + color: #feecf0 !important; } + +a.has-text-danger-light:hover, a.has-text-danger-light:focus { + color: #fabdc9 !important; } + +.has-background-danger-light { + background-color: #feecf0 !important; } + +.has-text-danger-dark { + color: #cc0f35 !important; } + +a.has-text-danger-dark:hover, a.has-text-danger-dark:focus { + color: #ee2049 !important; } + +.has-background-danger-dark { + background-color: #cc0f35 !important; } + +.has-text-black-bis { + color: #121212 !important; } + +.has-background-black-bis { + background-color: #121212 !important; } + +.has-text-black-ter { + color: #242424 !important; } + +.has-background-black-ter { + background-color: #242424 !important; } + +.has-text-grey-darker { + color: #363636 !important; } + +.has-background-grey-darker { + background-color: #363636 !important; } + +.has-text-grey-dark { + color: #4a4a4a !important; } + +.has-background-grey-dark { + background-color: #4a4a4a !important; } + +.has-text-grey { + color: #7a7a7a !important; } + +.has-background-grey { + background-color: #7a7a7a !important; } + +.has-text-grey-light { + color: #b5b5b5 !important; } + +.has-background-grey-light { + background-color: #b5b5b5 !important; } + +.has-text-grey-lighter { + color: #dbdbdb !important; } + +.has-background-grey-lighter { + background-color: #dbdbdb !important; } + +.has-text-white-ter { + color: whitesmoke !important; } + +.has-background-white-ter { + background-color: whitesmoke !important; } + +.has-text-white-bis { + color: #fafafa !important; } + +.has-background-white-bis { + background-color: #fafafa !important; } + +.is-flex-direction-row { + flex-direction: row !important; } + +.is-flex-direction-row-reverse { + flex-direction: row-reverse !important; } + +.is-flex-direction-column { + flex-direction: column !important; } + +.is-flex-direction-column-reverse { + flex-direction: column-reverse !important; } + +.is-flex-wrap-nowrap { + flex-wrap: nowrap !important; } + +.is-flex-wrap-wrap { + flex-wrap: wrap !important; } + +.is-flex-wrap-wrap-reverse { + flex-wrap: wrap-reverse !important; } + +.is-justify-content-flex-start { + justify-content: flex-start !important; } + +.is-justify-content-flex-end { + justify-content: flex-end !important; } + +.is-justify-content-center { + justify-content: center !important; } + +.is-justify-content-space-between { + justify-content: space-between !important; } + +.is-justify-content-space-around { + justify-content: space-around !important; } + +.is-justify-content-space-evenly { + justify-content: space-evenly !important; } + +.is-justify-content-start { + justify-content: start !important; } + +.is-justify-content-end { + justify-content: end !important; } + +.is-justify-content-left { + justify-content: left !important; } + +.is-justify-content-right { + justify-content: right !important; } + +.is-align-content-flex-start { + align-content: flex-start !important; } + +.is-align-content-flex-end { + align-content: flex-end !important; } + +.is-align-content-center { + align-content: center !important; } + +.is-align-content-space-between { + align-content: space-between !important; } + +.is-align-content-space-around { + align-content: space-around !important; } + +.is-align-content-space-evenly { + align-content: space-evenly !important; } + +.is-align-content-stretch { + align-content: stretch !important; } + +.is-align-content-start { + align-content: start !important; } + +.is-align-content-end { + align-content: end !important; } + +.is-align-content-baseline { + align-content: baseline !important; } + +.is-align-items-stretch { + align-items: stretch !important; } + +.is-align-items-flex-start { + align-items: flex-start !important; } + +.is-align-items-flex-end { + align-items: flex-end !important; } + +.is-align-items-center { + align-items: center !important; } + +.is-align-items-baseline { + align-items: baseline !important; } + +.is-align-items-start { + align-items: start !important; } + +.is-align-items-end { + align-items: end !important; } + +.is-align-items-self-start { + align-items: self-start !important; } + +.is-align-items-self-end { + align-items: self-end !important; } + +.is-align-self-auto { + align-self: auto !important; } + +.is-align-self-flex-start { + align-self: flex-start !important; } + +.is-align-self-flex-end { + align-self: flex-end !important; } + +.is-align-self-center { + align-self: center !important; } + +.is-align-self-baseline { + align-self: baseline !important; } + +.is-align-self-stretch { + align-self: stretch !important; } + +.is-flex-grow-0 { + flex-grow: 0 !important; } + +.is-flex-grow-1 { + flex-grow: 1 !important; } + +.is-flex-grow-2 { + flex-grow: 2 !important; } + +.is-flex-grow-3 { + flex-grow: 3 !important; } + +.is-flex-grow-4 { + flex-grow: 4 !important; } + +.is-flex-grow-5 { + flex-grow: 5 !important; } + +.is-flex-shrink-0 { + flex-shrink: 0 !important; } + +.is-flex-shrink-1 { + flex-shrink: 1 !important; } + +.is-flex-shrink-2 { + flex-shrink: 2 !important; } + +.is-flex-shrink-3 { + flex-shrink: 3 !important; } + +.is-flex-shrink-4 { + flex-shrink: 4 !important; } + +.is-flex-shrink-5 { + flex-shrink: 5 !important; } + +.is-clearfix::after { + clear: both; + content: " "; + display: table; } + +.is-pulled-left { + float: left !important; } + +.is-pulled-right { + float: right !important; } + +.is-radiusless { + border-radius: 0 !important; } + +.is-shadowless { + box-shadow: none !important; } + +.is-clickable { + cursor: pointer !important; + pointer-events: all !important; } + +.is-clipped { + overflow: hidden !important; } + +.is-relative { + position: relative !important; } + +.is-marginless { + margin: 0 !important; } + +.is-paddingless { + padding: 0 !important; } + +.m-0 { + margin: 0 !important; } + +.mt-0 { + margin-top: 0 !important; } + +.mr-0 { + margin-right: 0 !important; } + +.mb-0 { + margin-bottom: 0 !important; } + +.ml-0 { + margin-left: 0 !important; } + +.mx-0 { + margin-left: 0 !important; + margin-right: 0 !important; } + +.my-0 { + margin-top: 0 !important; + margin-bottom: 0 !important; } + +.m-1 { + margin: 0.25rem !important; } + +.mt-1 { + margin-top: 0.25rem !important; } + +.mr-1 { + margin-right: 0.25rem !important; } + +.mb-1 { + margin-bottom: 0.25rem !important; } + +.ml-1 { + margin-left: 0.25rem !important; } + +.mx-1 { + margin-left: 0.25rem !important; + margin-right: 0.25rem !important; } + +.my-1 { + margin-top: 0.25rem !important; + margin-bottom: 0.25rem !important; } + +.m-2 { + margin: 0.5rem !important; } + +.mt-2 { + margin-top: 0.5rem !important; } + +.mr-2 { + margin-right: 0.5rem !important; } + +.mb-2 { + margin-bottom: 0.5rem !important; } + +.ml-2 { + margin-left: 0.5rem !important; } + +.mx-2 { + margin-left: 0.5rem !important; + margin-right: 0.5rem !important; } + +.my-2 { + margin-top: 0.5rem !important; + margin-bottom: 0.5rem !important; } + +.m-3 { + margin: 0.75rem !important; } + +.mt-3 { + margin-top: 0.75rem !important; } + +.mr-3 { + margin-right: 0.75rem !important; } + +.mb-3 { + margin-bottom: 0.75rem !important; } + +.ml-3 { + margin-left: 0.75rem !important; } + +.mx-3 { + margin-left: 0.75rem !important; + margin-right: 0.75rem !important; } + +.my-3 { + margin-top: 0.75rem !important; + margin-bottom: 0.75rem !important; } + +.m-4 { + margin: 1rem !important; } + +.mt-4 { + margin-top: 1rem !important; } + +.mr-4 { + margin-right: 1rem !important; } + +.mb-4 { + margin-bottom: 1rem !important; } + +.ml-4 { + margin-left: 1rem !important; } + +.mx-4 { + margin-left: 1rem !important; + margin-right: 1rem !important; } + +.my-4 { + margin-top: 1rem !important; + margin-bottom: 1rem !important; } + +.m-5 { + margin: 1.5rem !important; } + +.mt-5 { + margin-top: 1.5rem !important; } + +.mr-5 { + margin-right: 1.5rem !important; } + +.mb-5 { + margin-bottom: 1.5rem !important; } + +.ml-5 { + margin-left: 1.5rem !important; } + +.mx-5 { + margin-left: 1.5rem !important; + margin-right: 1.5rem !important; } + +.my-5 { + margin-top: 1.5rem !important; + margin-bottom: 1.5rem !important; } + +.m-6 { + margin: 3rem !important; } + +.mt-6 { + margin-top: 3rem !important; } + +.mr-6 { + margin-right: 3rem !important; } + +.mb-6 { + margin-bottom: 3rem !important; } + +.ml-6 { + margin-left: 3rem !important; } + +.mx-6 { + margin-left: 3rem !important; + margin-right: 3rem !important; } + +.my-6 { + margin-top: 3rem !important; + margin-bottom: 3rem !important; } + +.m-auto { + margin: auto !important; } + +.mt-auto { + margin-top: auto !important; } + +.mr-auto { + margin-right: auto !important; } + +.mb-auto { + margin-bottom: auto !important; } + +.ml-auto { + margin-left: auto !important; } + +.mx-auto { + margin-left: auto !important; + margin-right: auto !important; } + +.my-auto { + margin-top: auto !important; + margin-bottom: auto !important; } + +.p-0 { + padding: 0 !important; } + +.pt-0 { + padding-top: 0 !important; } + +.pr-0 { + padding-right: 0 !important; } + +.pb-0 { + padding-bottom: 0 !important; } + +.pl-0 { + padding-left: 0 !important; } + +.px-0 { + padding-left: 0 !important; + padding-right: 0 !important; } + +.py-0 { + padding-top: 0 !important; + padding-bottom: 0 !important; } + +.p-1 { + padding: 0.25rem !important; } + +.pt-1 { + padding-top: 0.25rem !important; } + +.pr-1 { + padding-right: 0.25rem !important; } + +.pb-1 { + padding-bottom: 0.25rem !important; } + +.pl-1 { + padding-left: 0.25rem !important; } + +.px-1 { + padding-left: 0.25rem !important; + padding-right: 0.25rem !important; } + +.py-1 { + padding-top: 0.25rem !important; + padding-bottom: 0.25rem !important; } + +.p-2 { + padding: 0.5rem !important; } + +.pt-2 { + padding-top: 0.5rem !important; } + +.pr-2 { + padding-right: 0.5rem !important; } + +.pb-2 { + padding-bottom: 0.5rem !important; } + +.pl-2 { + padding-left: 0.5rem !important; } + +.px-2 { + padding-left: 0.5rem !important; + padding-right: 0.5rem !important; } + +.py-2 { + padding-top: 0.5rem !important; + padding-bottom: 0.5rem !important; } + +.p-3 { + padding: 0.75rem !important; } + +.pt-3 { + padding-top: 0.75rem !important; } + +.pr-3 { + padding-right: 0.75rem !important; } + +.pb-3 { + padding-bottom: 0.75rem !important; } + +.pl-3 { + padding-left: 0.75rem !important; } + +.px-3 { + padding-left: 0.75rem !important; + padding-right: 0.75rem !important; } + +.py-3 { + padding-top: 0.75rem !important; + padding-bottom: 0.75rem !important; } + +.p-4 { + padding: 1rem !important; } + +.pt-4 { + padding-top: 1rem !important; } + +.pr-4 { + padding-right: 1rem !important; } + +.pb-4 { + padding-bottom: 1rem !important; } + +.pl-4 { + padding-left: 1rem !important; } + +.px-4 { + padding-left: 1rem !important; + padding-right: 1rem !important; } + +.py-4 { + padding-top: 1rem !important; + padding-bottom: 1rem !important; } + +.p-5 { + padding: 1.5rem !important; } + +.pt-5 { + padding-top: 1.5rem !important; } + +.pr-5 { + padding-right: 1.5rem !important; } + +.pb-5 { + padding-bottom: 1.5rem !important; } + +.pl-5 { + padding-left: 1.5rem !important; } + +.px-5 { + padding-left: 1.5rem !important; + padding-right: 1.5rem !important; } + +.py-5 { + padding-top: 1.5rem !important; + padding-bottom: 1.5rem !important; } + +.p-6 { + padding: 3rem !important; } + +.pt-6 { + padding-top: 3rem !important; } + +.pr-6 { + padding-right: 3rem !important; } + +.pb-6 { + padding-bottom: 3rem !important; } + +.pl-6 { + padding-left: 3rem !important; } + +.px-6 { + padding-left: 3rem !important; + padding-right: 3rem !important; } + +.py-6 { + padding-top: 3rem !important; + padding-bottom: 3rem !important; } + +.p-auto { + padding: auto !important; } + +.pt-auto { + padding-top: auto !important; } + +.pr-auto { + padding-right: auto !important; } + +.pb-auto { + padding-bottom: auto !important; } + +.pl-auto { + padding-left: auto !important; } + +.px-auto { + padding-left: auto !important; + padding-right: auto !important; } + +.py-auto { + padding-top: auto !important; + padding-bottom: auto !important; } + +.is-size-1 { + font-size: 3rem !important; } + +.is-size-2 { + font-size: 2.5rem !important; } + +.is-size-3 { + font-size: 2rem !important; } + +.is-size-4 { + font-size: 1.5rem !important; } + +.is-size-5 { + font-size: 1.25rem !important; } + +.is-size-6 { + font-size: 1rem !important; } + +.is-size-7 { + font-size: 0.75rem !important; } + +@media screen and (max-width: 768px) { + .is-size-1-mobile { + font-size: 3rem !important; } + .is-size-2-mobile { + font-size: 2.5rem !important; } + .is-size-3-mobile { + font-size: 2rem !important; } + .is-size-4-mobile { + font-size: 1.5rem !important; } + .is-size-5-mobile { + font-size: 1.25rem !important; } + .is-size-6-mobile { + font-size: 1rem !important; } + .is-size-7-mobile { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 769px), print { + .is-size-1-tablet { + font-size: 3rem !important; } + .is-size-2-tablet { + font-size: 2.5rem !important; } + .is-size-3-tablet { + font-size: 2rem !important; } + .is-size-4-tablet { + font-size: 1.5rem !important; } + .is-size-5-tablet { + font-size: 1.25rem !important; } + .is-size-6-tablet { + font-size: 1rem !important; } + .is-size-7-tablet { + font-size: 0.75rem !important; } } + +@media screen and (max-width: 1023px) { + .is-size-1-touch { + font-size: 3rem !important; } + .is-size-2-touch { + font-size: 2.5rem !important; } + .is-size-3-touch { + font-size: 2rem !important; } + .is-size-4-touch { + font-size: 1.5rem !important; } + .is-size-5-touch { + font-size: 1.25rem !important; } + .is-size-6-touch { + font-size: 1rem !important; } + .is-size-7-touch { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 1024px) { + .is-size-1-desktop { + font-size: 3rem !important; } + .is-size-2-desktop { + font-size: 2.5rem !important; } + .is-size-3-desktop { + font-size: 2rem !important; } + .is-size-4-desktop { + font-size: 1.5rem !important; } + .is-size-5-desktop { + font-size: 1.25rem !important; } + .is-size-6-desktop { + font-size: 1rem !important; } + .is-size-7-desktop { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 1216px) { + .is-size-1-widescreen { + font-size: 3rem !important; } + .is-size-2-widescreen { + font-size: 2.5rem !important; } + .is-size-3-widescreen { + font-size: 2rem !important; } + .is-size-4-widescreen { + font-size: 1.5rem !important; } + .is-size-5-widescreen { + font-size: 1.25rem !important; } + .is-size-6-widescreen { + font-size: 1rem !important; } + .is-size-7-widescreen { + font-size: 0.75rem !important; } } + +@media screen and (min-width: 1408px) { + .is-size-1-fullhd { + font-size: 3rem !important; } + .is-size-2-fullhd { + font-size: 2.5rem !important; } + .is-size-3-fullhd { + font-size: 2rem !important; } + .is-size-4-fullhd { + font-size: 1.5rem !important; } + .is-size-5-fullhd { + font-size: 1.25rem !important; } + .is-size-6-fullhd { + font-size: 1rem !important; } + .is-size-7-fullhd { + font-size: 0.75rem !important; } } + +.has-text-centered { + text-align: center !important; } + +.has-text-justified { + text-align: justify !important; } + +.has-text-left { + text-align: left !important; } + +.has-text-right { + text-align: right !important; } + +@media screen and (max-width: 768px) { + .has-text-centered-mobile { + text-align: center !important; } } + +@media screen and (min-width: 769px), print { + .has-text-centered-tablet { + text-align: center !important; } } + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .has-text-centered-tablet-only { + text-align: center !important; } } + +@media screen and (max-width: 1023px) { + .has-text-centered-touch { + text-align: center !important; } } + +@media screen and (min-width: 1024px) { + .has-text-centered-desktop { + text-align: center !important; } } + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .has-text-centered-desktop-only { + text-align: center !important; } } + +@media screen and (min-width: 1216px) { + .has-text-centered-widescreen { + text-align: center !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-centered-widescreen-only { + text-align: center !important; } } + +@media screen and (min-width: 1408px) { + .has-text-centered-fullhd { + text-align: center !important; } } + +@media screen and (max-width: 768px) { + .has-text-justified-mobile { + text-align: justify !important; } } + +@media screen and (min-width: 769px), print { + .has-text-justified-tablet { + text-align: justify !important; } } + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .has-text-justified-tablet-only { + text-align: justify !important; } } + +@media screen and (max-width: 1023px) { + .has-text-justified-touch { + text-align: justify !important; } } + +@media screen and (min-width: 1024px) { + .has-text-justified-desktop { + text-align: justify !important; } } + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .has-text-justified-desktop-only { + text-align: justify !important; } } + +@media screen and (min-width: 1216px) { + .has-text-justified-widescreen { + text-align: justify !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-justified-widescreen-only { + text-align: justify !important; } } + +@media screen and (min-width: 1408px) { + .has-text-justified-fullhd { + text-align: justify !important; } } + +@media screen and (max-width: 768px) { + .has-text-left-mobile { + text-align: left !important; } } + +@media screen and (min-width: 769px), print { + .has-text-left-tablet { + text-align: left !important; } } + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .has-text-left-tablet-only { + text-align: left !important; } } + +@media screen and (max-width: 1023px) { + .has-text-left-touch { + text-align: left !important; } } + +@media screen and (min-width: 1024px) { + .has-text-left-desktop { + text-align: left !important; } } + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .has-text-left-desktop-only { + text-align: left !important; } } + +@media screen and (min-width: 1216px) { + .has-text-left-widescreen { + text-align: left !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-left-widescreen-only { + text-align: left !important; } } + +@media screen and (min-width: 1408px) { + .has-text-left-fullhd { + text-align: left !important; } } + +@media screen and (max-width: 768px) { + .has-text-right-mobile { + text-align: right !important; } } + +@media screen and (min-width: 769px), print { + .has-text-right-tablet { + text-align: right !important; } } + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .has-text-right-tablet-only { + text-align: right !important; } } + +@media screen and (max-width: 1023px) { + .has-text-right-touch { + text-align: right !important; } } + +@media screen and (min-width: 1024px) { + .has-text-right-desktop { + text-align: right !important; } } + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .has-text-right-desktop-only { + text-align: right !important; } } + +@media screen and (min-width: 1216px) { + .has-text-right-widescreen { + text-align: right !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .has-text-right-widescreen-only { + text-align: right !important; } } + +@media screen and (min-width: 1408px) { + .has-text-right-fullhd { + text-align: right !important; } } + +.is-capitalized { + text-transform: capitalize !important; } + +.is-lowercase { + text-transform: lowercase !important; } + +.is-uppercase { + text-transform: uppercase !important; } + +.is-italic { + font-style: italic !important; } + +.is-underlined { + text-decoration: underline !important; } + +.has-text-weight-light { + font-weight: 300 !important; } + +.has-text-weight-normal { + font-weight: 400 !important; } + +.has-text-weight-medium { + font-weight: 500 !important; } + +.has-text-weight-semibold { + font-weight: 600 !important; } + +.has-text-weight-bold { + font-weight: 700 !important; } + +.is-family-primary { + font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-secondary { + font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-sans-serif { + font-family: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif !important; } + +.is-family-monospace { + font-family: monospace !important; } + +.is-family-code { + font-family: monospace !important; } + +.is-block { + display: block !important; } + +@media screen and (max-width: 768px) { + .is-block-mobile { + display: block !important; } } + +@media screen and (min-width: 769px), print { + .is-block-tablet { + display: block !important; } } + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .is-block-tablet-only { + display: block !important; } } + +@media screen and (max-width: 1023px) { + .is-block-touch { + display: block !important; } } + +@media screen and (min-width: 1024px) { + .is-block-desktop { + display: block !important; } } + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .is-block-desktop-only { + display: block !important; } } + +@media screen and (min-width: 1216px) { + .is-block-widescreen { + display: block !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-block-widescreen-only { + display: block !important; } } + +@media screen and (min-width: 1408px) { + .is-block-fullhd { + display: block !important; } } + +.is-flex { + display: flex !important; } + +@media screen and (max-width: 768px) { + .is-flex-mobile { + display: flex !important; } } + +@media screen and (min-width: 769px), print { + .is-flex-tablet { + display: flex !important; } } + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .is-flex-tablet-only { + display: flex !important; } } + +@media screen and (max-width: 1023px) { + .is-flex-touch { + display: flex !important; } } + +@media screen and (min-width: 1024px) { + .is-flex-desktop { + display: flex !important; } } + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .is-flex-desktop-only { + display: flex !important; } } + +@media screen and (min-width: 1216px) { + .is-flex-widescreen { + display: flex !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-flex-widescreen-only { + display: flex !important; } } + +@media screen and (min-width: 1408px) { + .is-flex-fullhd { + display: flex !important; } } + +.is-inline { + display: inline !important; } + +@media screen and (max-width: 768px) { + .is-inline-mobile { + display: inline !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-tablet { + display: inline !important; } } + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .is-inline-tablet-only { + display: inline !important; } } + +@media screen and (max-width: 1023px) { + .is-inline-touch { + display: inline !important; } } + +@media screen and (min-width: 1024px) { + .is-inline-desktop { + display: inline !important; } } + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .is-inline-desktop-only { + display: inline !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-widescreen { + display: inline !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-widescreen-only { + display: inline !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-fullhd { + display: inline !important; } } + +.is-inline-block { + display: inline-block !important; } + +@media screen and (max-width: 768px) { + .is-inline-block-mobile { + display: inline-block !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-block-tablet { + display: inline-block !important; } } + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .is-inline-block-tablet-only { + display: inline-block !important; } } + +@media screen and (max-width: 1023px) { + .is-inline-block-touch { + display: inline-block !important; } } + +@media screen and (min-width: 1024px) { + .is-inline-block-desktop { + display: inline-block !important; } } + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .is-inline-block-desktop-only { + display: inline-block !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-block-widescreen { + display: inline-block !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-block-widescreen-only { + display: inline-block !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-block-fullhd { + display: inline-block !important; } } + +.is-inline-flex { + display: inline-flex !important; } + +@media screen and (max-width: 768px) { + .is-inline-flex-mobile { + display: inline-flex !important; } } + +@media screen and (min-width: 769px), print { + .is-inline-flex-tablet { + display: inline-flex !important; } } + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .is-inline-flex-tablet-only { + display: inline-flex !important; } } + +@media screen and (max-width: 1023px) { + .is-inline-flex-touch { + display: inline-flex !important; } } + +@media screen and (min-width: 1024px) { + .is-inline-flex-desktop { + display: inline-flex !important; } } + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .is-inline-flex-desktop-only { + display: inline-flex !important; } } + +@media screen and (min-width: 1216px) { + .is-inline-flex-widescreen { + display: inline-flex !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-inline-flex-widescreen-only { + display: inline-flex !important; } } + +@media screen and (min-width: 1408px) { + .is-inline-flex-fullhd { + display: inline-flex !important; } } + +.is-hidden { + display: none !important; } + +.is-sr-only { + border: none !important; + clip: rect(0, 0, 0, 0) !important; + height: 0.01em !important; + overflow: hidden !important; + padding: 0 !important; + position: absolute !important; + white-space: nowrap !important; + width: 0.01em !important; } + +@media screen and (max-width: 768px) { + .is-hidden-mobile { + display: none !important; } } + +@media screen and (min-width: 769px), print { + .is-hidden-tablet { + display: none !important; } } + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .is-hidden-tablet-only { + display: none !important; } } + +@media screen and (max-width: 1023px) { + .is-hidden-touch { + display: none !important; } } + +@media screen and (min-width: 1024px) { + .is-hidden-desktop { + display: none !important; } } + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .is-hidden-desktop-only { + display: none !important; } } + +@media screen and (min-width: 1216px) { + .is-hidden-widescreen { + display: none !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-hidden-widescreen-only { + display: none !important; } } + +@media screen and (min-width: 1408px) { + .is-hidden-fullhd { + display: none !important; } } + +.is-invisible { + visibility: hidden !important; } + +@media screen and (max-width: 768px) { + .is-invisible-mobile { + visibility: hidden !important; } } + +@media screen and (min-width: 769px), print { + .is-invisible-tablet { + visibility: hidden !important; } } + +@media screen and (min-width: 769px) and (max-width: 1023px) { + .is-invisible-tablet-only { + visibility: hidden !important; } } + +@media screen and (max-width: 1023px) { + .is-invisible-touch { + visibility: hidden !important; } } + +@media screen and (min-width: 1024px) { + .is-invisible-desktop { + visibility: hidden !important; } } + +@media screen and (min-width: 1024px) and (max-width: 1215px) { + .is-invisible-desktop-only { + visibility: hidden !important; } } + +@media screen and (min-width: 1216px) { + .is-invisible-widescreen { + visibility: hidden !important; } } + +@media screen and (min-width: 1216px) and (max-width: 1407px) { + .is-invisible-widescreen-only { + visibility: hidden !important; } } + +@media screen and (min-width: 1408px) { + .is-invisible-fullhd { + visibility: hidden !important; } } + +/* Bulma Layout */ +.hero { + align-items: stretch; + display: flex; + flex-direction: column; + justify-content: space-between; } + .hero .navbar { + background: none; } + .hero .tabs ul { + border-bottom: none; } + .hero.is-white { + background-color: white; + color: #0a0a0a; } + .hero.is-white a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-white strong { + color: inherit; } + .hero.is-white .title { + color: #0a0a0a; } + .hero.is-white .subtitle { + color: rgba(10, 10, 10, 0.9); } + .hero.is-white .subtitle a:not(.button), + .hero.is-white .subtitle strong { + color: #0a0a0a; } + @media screen and (max-width: 1023px) { + .hero.is-white .navbar-menu { + background-color: white; } } + .hero.is-white .navbar-item, + .hero.is-white .navbar-link { + color: rgba(10, 10, 10, 0.7); } + .hero.is-white a.navbar-item:hover, .hero.is-white a.navbar-item.is-active, + .hero.is-white .navbar-link:hover, + .hero.is-white .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .hero.is-white .tabs a { + color: #0a0a0a; + opacity: 0.9; } + .hero.is-white .tabs a:hover { + opacity: 1; } + .hero.is-white .tabs li.is-active a { + color: white !important; + opacity: 1; } + .hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a { + color: #0a0a0a; } + .hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .hero.is-white.is-bold { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } + @media screen and (max-width: 768px) { + .hero.is-white.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } + .hero.is-black { + background-color: #0a0a0a; + color: white; } + .hero.is-black a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-black strong { + color: inherit; } + .hero.is-black .title { + color: white; } + .hero.is-black .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-black .subtitle a:not(.button), + .hero.is-black .subtitle strong { + color: white; } + @media screen and (max-width: 1023px) { + .hero.is-black .navbar-menu { + background-color: #0a0a0a; } } + .hero.is-black .navbar-item, + .hero.is-black .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-black a.navbar-item:hover, .hero.is-black a.navbar-item.is-active, + .hero.is-black .navbar-link:hover, + .hero.is-black .navbar-link.is-active { + background-color: black; + color: white; } + .hero.is-black .tabs a { + color: white; + opacity: 0.9; } + .hero.is-black .tabs a:hover { + opacity: 1; } + .hero.is-black .tabs li.is-active a { + color: #0a0a0a !important; + opacity: 1; } + .hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a { + color: white; } + .hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover { + background-color: white; + border-color: white; + color: #0a0a0a; } + .hero.is-black.is-bold { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } + @media screen and (max-width: 768px) { + .hero.is-black.is-bold .navbar-menu { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } + .hero.is-light { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .hero.is-light a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-light strong { + color: inherit; } + .hero.is-light .title { + color: rgba(0, 0, 0, 0.7); } + .hero.is-light .subtitle { + color: rgba(0, 0, 0, 0.9); } + .hero.is-light .subtitle a:not(.button), + .hero.is-light .subtitle strong { + color: rgba(0, 0, 0, 0.7); } + @media screen and (max-width: 1023px) { + .hero.is-light .navbar-menu { + background-color: whitesmoke; } } + .hero.is-light .navbar-item, + .hero.is-light .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .hero.is-light a.navbar-item:hover, .hero.is-light a.navbar-item.is-active, + .hero.is-light .navbar-link:hover, + .hero.is-light .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0, 0, 0, 0.7); } + .hero.is-light .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; } + .hero.is-light .tabs a:hover { + opacity: 1; } + .hero.is-light .tabs li.is-active a { + color: whitesmoke !important; + opacity: 1; } + .hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); } + .hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: whitesmoke; } + .hero.is-light.is-bold { + background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } + @media screen and (max-width: 768px) { + .hero.is-light.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } } + .hero.is-dark { + background-color: #363636; + color: #fff; } + .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-dark strong { + color: inherit; } + .hero.is-dark .title { + color: #fff; } + .hero.is-dark .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-dark .subtitle a:not(.button), + .hero.is-dark .subtitle strong { + color: #fff; } + @media screen and (max-width: 1023px) { + .hero.is-dark .navbar-menu { + background-color: #363636; } } + .hero.is-dark .navbar-item, + .hero.is-dark .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-dark a.navbar-item:hover, .hero.is-dark a.navbar-item.is-active, + .hero.is-dark .navbar-link:hover, + .hero.is-dark .navbar-link.is-active { + background-color: #292929; + color: #fff; } + .hero.is-dark .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-dark .tabs a:hover { + opacity: 1; } + .hero.is-dark .tabs li.is-active a { + color: #363636 !important; + opacity: 1; } + .hero.is-dark .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a { + color: #fff; } + .hero.is-dark .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-dark .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #363636; } + .hero.is-dark.is-bold { + background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } + @media screen and (max-width: 768px) { + .hero.is-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } } + .hero.is-primary { + background-color: #ff0d68; + color: #fff; } + .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-primary strong { + color: inherit; } + .hero.is-primary .title { + color: #fff; } + .hero.is-primary .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-primary .subtitle a:not(.button), + .hero.is-primary .subtitle strong { + color: #fff; } + @media screen and (max-width: 1023px) { + .hero.is-primary .navbar-menu { + background-color: #ff0d68; } } + .hero.is-primary .navbar-item, + .hero.is-primary .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-primary a.navbar-item:hover, .hero.is-primary a.navbar-item.is-active, + .hero.is-primary .navbar-link:hover, + .hero.is-primary .navbar-link.is-active { + background-color: #f3005b; + color: #fff; } + .hero.is-primary .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-primary .tabs a:hover { + opacity: 1; } + .hero.is-primary .tabs li.is-active a { + color: #ff0d68 !important; + opacity: 1; } + .hero.is-primary .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a { + color: #fff; } + .hero.is-primary .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-primary .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #ff0d68; } + .hero.is-primary.is-bold { + background-image: linear-gradient(141deg, #d90076 0%, #ff0d68 71%, #ff2754 100%); } + @media screen and (max-width: 768px) { + .hero.is-primary.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #d90076 0%, #ff0d68 71%, #ff2754 100%); } } + .hero.is-link { + background-color: #ff0d68; + color: #fff; } + .hero.is-link a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-link strong { + color: inherit; } + .hero.is-link .title { + color: #fff; } + .hero.is-link .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-link .subtitle a:not(.button), + .hero.is-link .subtitle strong { + color: #fff; } + @media screen and (max-width: 1023px) { + .hero.is-link .navbar-menu { + background-color: #ff0d68; } } + .hero.is-link .navbar-item, + .hero.is-link .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-link a.navbar-item:hover, .hero.is-link a.navbar-item.is-active, + .hero.is-link .navbar-link:hover, + .hero.is-link .navbar-link.is-active { + background-color: #f3005b; + color: #fff; } + .hero.is-link .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-link .tabs a:hover { + opacity: 1; } + .hero.is-link .tabs li.is-active a { + color: #ff0d68 !important; + opacity: 1; } + .hero.is-link .tabs.is-boxed a, .hero.is-link .tabs.is-toggle a { + color: #fff; } + .hero.is-link .tabs.is-boxed a:hover, .hero.is-link .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-link .tabs.is-boxed li.is-active a, .hero.is-link .tabs.is-boxed li.is-active a:hover, .hero.is-link .tabs.is-toggle li.is-active a, .hero.is-link .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #ff0d68; } + .hero.is-link.is-bold { + background-image: linear-gradient(141deg, #d90076 0%, #ff0d68 71%, #ff2754 100%); } + @media screen and (max-width: 768px) { + .hero.is-link.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #d90076 0%, #ff0d68 71%, #ff2754 100%); } } + .hero.is-info { + background-color: #0092FF; + color: #fff; } + .hero.is-info a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-info strong { + color: inherit; } + .hero.is-info .title { + color: #fff; } + .hero.is-info .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-info .subtitle a:not(.button), + .hero.is-info .subtitle strong { + color: #fff; } + @media screen and (max-width: 1023px) { + .hero.is-info .navbar-menu { + background-color: #0092FF; } } + .hero.is-info .navbar-item, + .hero.is-info .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active, + .hero.is-info .navbar-link:hover, + .hero.is-info .navbar-link.is-active { + background-color: #0083e6; + color: #fff; } + .hero.is-info .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-info .tabs a:hover { + opacity: 1; } + .hero.is-info .tabs li.is-active a { + color: #0092FF !important; + opacity: 1; } + .hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a { + color: #fff; } + .hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #0092FF; } + .hero.is-info.is-bold { + background-image: linear-gradient(141deg, #0097cc 0%, #0092FF 71%, #1a77ff 100%); } + @media screen and (max-width: 768px) { + .hero.is-info.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #0097cc 0%, #0092FF 71%, #1a77ff 100%); } } + .hero.is-success { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .hero.is-success a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-success strong { + color: inherit; } + .hero.is-success .title { + color: rgba(0, 0, 0, 0.7); } + .hero.is-success .subtitle { + color: rgba(0, 0, 0, 0.9); } + .hero.is-success .subtitle a:not(.button), + .hero.is-success .subtitle strong { + color: rgba(0, 0, 0, 0.7); } + @media screen and (max-width: 1023px) { + .hero.is-success .navbar-menu { + background-color: #16DB93; } } + .hero.is-success .navbar-item, + .hero.is-success .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .hero.is-success a.navbar-item:hover, .hero.is-success a.navbar-item.is-active, + .hero.is-success .navbar-link:hover, + .hero.is-success .navbar-link.is-active { + background-color: #14c483; + color: rgba(0, 0, 0, 0.7); } + .hero.is-success .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; } + .hero.is-success .tabs a:hover { + opacity: 1; } + .hero.is-success .tabs li.is-active a { + color: #16DB93 !important; + opacity: 1; } + .hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); } + .hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: #16DB93; } + .hero.is-success.is-bold { + background-image: linear-gradient(141deg, #08b659 0%, #16DB93 71%, #1cefc5 100%); } + @media screen and (max-width: 768px) { + .hero.is-success.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #08b659 0%, #16DB93 71%, #1cefc5 100%); } } + .hero.is-warning { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-warning strong { + color: inherit; } + .hero.is-warning .title { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .subtitle { + color: rgba(0, 0, 0, 0.9); } + .hero.is-warning .subtitle a:not(.button), + .hero.is-warning .subtitle strong { + color: rgba(0, 0, 0, 0.7); } + @media screen and (max-width: 1023px) { + .hero.is-warning .navbar-menu { + background-color: #FFE900; } } + .hero.is-warning .navbar-item, + .hero.is-warning .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning a.navbar-item:hover, .hero.is-warning a.navbar-item.is-active, + .hero.is-warning .navbar-link:hover, + .hero.is-warning .navbar-link.is-active { + background-color: #e6d200; + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; } + .hero.is-warning .tabs a:hover { + opacity: 1; } + .hero.is-warning .tabs li.is-active a { + color: #FFE900 !important; + opacity: 1; } + .hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: #FFE900; } + .hero.is-warning.is-bold { + background-image: linear-gradient(141deg, #cc9800 0%, #FFE900 71%, #edff1a 100%); } + @media screen and (max-width: 768px) { + .hero.is-warning.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #cc9800 0%, #FFE900 71%, #edff1a 100%); } } + .hero.is-danger { + background-color: #f14668; + color: #fff; } + .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + .hero.is-danger strong { + color: inherit; } + .hero.is-danger .title { + color: #fff; } + .hero.is-danger .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-danger .subtitle a:not(.button), + .hero.is-danger .subtitle strong { + color: #fff; } + @media screen and (max-width: 1023px) { + .hero.is-danger .navbar-menu { + background-color: #f14668; } } + .hero.is-danger .navbar-item, + .hero.is-danger .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-danger a.navbar-item:hover, .hero.is-danger a.navbar-item.is-active, + .hero.is-danger .navbar-link:hover, + .hero.is-danger .navbar-link.is-active { + background-color: #ef2e55; + color: #fff; } + .hero.is-danger .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-danger .tabs a:hover { + opacity: 1; } + .hero.is-danger .tabs li.is-active a { + color: #f14668 !important; + opacity: 1; } + .hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a { + color: #fff; } + .hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #f14668; } + .hero.is-danger.is-bold { + background-image: linear-gradient(141deg, #fa0a62 0%, #f14668 71%, #f7595f 100%); } + @media screen and (max-width: 768px) { + .hero.is-danger.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #fa0a62 0%, #f14668 71%, #f7595f 100%); } } + .hero.is-small .hero-body { + padding: 1.5rem; } + @media screen and (min-width: 769px), print { + .hero.is-medium .hero-body { + padding: 9rem 4.5rem; } } + @media screen and (min-width: 769px), print { + .hero.is-large .hero-body { + padding: 18rem 6rem; } } + .hero.is-halfheight .hero-body, .hero.is-fullheight .hero-body, .hero.is-fullheight-with-navbar .hero-body { + align-items: center; + display: flex; } + .hero.is-halfheight .hero-body > .container, .hero.is-fullheight .hero-body > .container, .hero.is-fullheight-with-navbar .hero-body > .container { + flex-grow: 1; + flex-shrink: 1; } + .hero.is-halfheight { + min-height: 50vh; } + .hero.is-fullheight { + min-height: 100vh; } + +.hero-video { + overflow: hidden; } + .hero-video video { + left: 50%; + min-height: 100%; + min-width: 100%; + position: absolute; + top: 50%; + transform: translate3d(-50%, -50%, 0); } + .hero-video.is-transparent { + opacity: 0.3; } + @media screen and (max-width: 768px) { + .hero-video { + display: none; } } +.hero-buttons { + margin-top: 1.5rem; } + @media screen and (max-width: 768px) { + .hero-buttons .button { + display: flex; } + .hero-buttons .button:not(:last-child) { + margin-bottom: 0.75rem; } } + @media screen and (min-width: 769px), print { + .hero-buttons { + display: flex; + justify-content: center; } + .hero-buttons .button:not(:last-child) { + margin-right: 1.5rem; } } +.hero-head, +.hero-foot { + flex-grow: 0; + flex-shrink: 0; } + +.hero-body { + flex-grow: 1; + flex-shrink: 0; + padding: 3rem 1.5rem; } + @media screen and (min-width: 769px), print { + .hero-body { + padding: 3rem 3rem; } } +.section { + padding: 3rem 1.5rem; } + @media screen and (min-width: 1024px) { + .section { + padding: 3rem 3rem; } + .section.is-medium { + padding: 9rem 4.5rem; } + .section.is-large { + padding: 18rem 6rem; } } +.footer { + background-color: #fafafa; + padding: 3rem 1.5rem 6rem; } + +/*! Bulma Prefers Dark | MIT License | github.com/jloh/bulma-prefers-dark */ +@media (prefers-color-scheme: dark) { + html { + background-color: #17181c; } + body { + color: #b5b5b5; } + a { + color: #e60056; } + a:hover { + color: #dbdbdb; } + code { + background-color: #242424; + color: #da1039; } + hr { + background-color: #242424; } + strong { + color: #dbdbdb; } + pre { + background-color: #242424; + color: #b5b5b5; } + table th { + color: #dbdbdb; } + .has-text-white-dark { + color: white !important; } + a.has-text-white-dark:hover, a.has-text-white-dark:focus { + color: white !important; } + .has-background-white-dark { + background-color: white !important; } + .has-text-black-dark { + color: #0a0a0a !important; } + a.has-text-black-dark:hover, a.has-text-black-dark:focus { + color: #242424 !important; } + .has-background-black-dark { + background-color: #0a0a0a !important; } + .has-text-light-dark { + color: whitesmoke !important; } + a.has-text-light-dark:hover, a.has-text-light-dark:focus { + color: white !important; } + .has-background-light-dark { + background-color: whitesmoke !important; } + .has-text-dark-dark { + color: #363636 !important; } + a.has-text-dark-dark:hover, a.has-text-dark-dark:focus { + color: #4f4f4f !important; } + .has-background-dark-dark { + background-color: #363636 !important; } + .has-text-primary-dark { + color: #ff0d68 !important; } + a.has-text-primary-dark:hover, a.has-text-primary-dark:focus { + color: #ff4088 !important; } + .has-background-primary-dark { + background-color: #ff0d68 !important; } + .has-text-link-dark { + color: #ff0d68 !important; } + a.has-text-link-dark:hover, a.has-text-link-dark:focus { + color: #ff4088 !important; } + .has-background-link-dark { + background-color: #ff0d68 !important; } + .has-text-info-dark { + color: #0092FF !important; } + a.has-text-info-dark:hover, a.has-text-info-dark:focus { + color: #33a8ff !important; } + .has-background-info-dark { + background-color: #0092FF !important; } + .has-text-success-dark { + color: #16DB93 !important; } + a.has-text-success-dark:hover, a.has-text-success-dark:focus { + color: #39ebaa !important; } + .has-background-success-dark { + background-color: #16DB93 !important; } + .has-text-warning-dark { + color: #FFE900 !important; } + a.has-text-warning-dark:hover, a.has-text-warning-dark:focus { + color: #ffed33 !important; } + .has-background-warning-dark { + background-color: #FFE900 !important; } + .has-text-danger-dark { + color: #f14668 !important; } + a.has-text-danger-dark:hover, a.has-text-danger-dark:focus { + color: #f5758f !important; } + .has-background-danger-dark { + background-color: #f14668 !important; } + .has-text-black-bis-dark { + color: #121212 !important; } + .has-background-black-bis-dark { + background-color: #121212 !important; } + .has-text-black-ter-dark { + color: #242424 !important; } + .has-background-black-ter-dark { + background-color: #242424 !important; } + .has-text-grey-darker-dark { + color: #363636 !important; } + .has-background-grey-darker-dark { + background-color: #363636 !important; } + .has-text-grey-dark-dark { + color: #4a4a4a !important; } + .has-background-grey-dark-dark { + background-color: #4a4a4a !important; } + .has-text-grey-dark { + color: #7a7a7a !important; } + .has-background-grey-dark { + background-color: #7a7a7a !important; } + .has-text-grey-light-dark { + color: #b5b5b5 !important; } + .has-background-grey-light-dark { + background-color: #b5b5b5 !important; } + .has-text-grey-lighter-dark { + color: #dbdbdb !important; } + .has-background-grey-lighter-dark { + background-color: #dbdbdb !important; } + .has-text-white-ter-dark { + color: whitesmoke !important; } + .has-background-white-ter-dark { + background-color: whitesmoke !important; } + .has-text-white-bis-dark { + color: #fafafa !important; } + .has-background-white-bis-dark { + background-color: #fafafa !important; } + .box { + background-color: #0a0a0a; + box-shadow: 0 2px 3px rgba(255, 255, 255, 0.1), 0 0 0 1px rgba(255, 255, 255, 0.1); + color: #b5b5b5; } + a.box:hover, a.box:focus { + box-shadow: 0 2px 3px rgba(255, 255, 255, 0.1), 0 0 0 1px #e60056; } + a.box:active { + box-shadow: inset 0 1px 2px rgba(255, 255, 255, 0.2), 0 0 0 1px #e60056; } + .button { + background-color: #0a0a0a; + border-color: #363636; + color: #dbdbdb; } + .button:hover, .button.is-hovered { + border-color: #4a4a4a; + color: #dbdbdb; } + .button:focus, .button.is-focused { + border-color: #5ea3e4; + color: #dbdbdb; } + .button:focus:not(:active), .button.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(230, 0, 86, 0.25); } + .button:active, .button.is-active { + border-color: #b5b5b5; + color: #dbdbdb; } + .button.is-text { + color: #b5b5b5; } + .button.is-text:hover, .button.is-text.is-hovered, .button.is-text:focus, .button.is-text.is-focused { + background-color: #242424; + color: #dbdbdb; } + .button.is-text:active, .button.is-text.is-active { + background-color: #171717; + color: #dbdbdb; } + .button.is-white { + background-color: #e6e6e6; + border-color: transparent; + color: #0a0a0a; } + .button.is-white:hover, .button.is-white.is-hovered { + background-color: #dfdfdf; + border-color: transparent; + color: #0a0a0a; } + .button.is-white:focus, .button.is-white.is-focused { + border-color: transparent; + color: #0a0a0a; } + .button.is-white:focus:not(:active), .button.is-white.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(230, 230, 230, 0.25); } + .button.is-white:active, .button.is-white.is-active { + background-color: #d9d9d9; + border-color: transparent; + color: #0a0a0a; } + .button.is-white[disabled], fieldset[disabled] .button.is-white { + background-color: #e6e6e6; + border-color: transparent; + box-shadow: none; } + .button.is-white.is-inverted { + background-color: #0a0a0a; + color: #e6e6e6; } + .button.is-white.is-inverted:hover { + background-color: black; } + .button.is-white.is-inverted[disabled], fieldset[disabled] .button.is-white.is-inverted { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: #e6e6e6; } + .button.is-white.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-white.is-outlined { + background-color: transparent; + border-color: #e6e6e6; + color: #e6e6e6; } + .button.is-white.is-outlined:hover, .button.is-white.is-outlined:focus { + background-color: #e6e6e6; + border-color: #e6e6e6; + color: #0a0a0a; } + .button.is-white.is-outlined.is-loading::after { + border-color: transparent transparent #e6e6e6 #e6e6e6 !important; } + .button.is-white.is-outlined[disabled], fieldset[disabled] .button.is-white.is-outlined { + background-color: transparent; + border-color: #e6e6e6; + box-shadow: none; + color: #e6e6e6; } + .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + .button.is-white.is-inverted.is-outlined:hover, .button.is-white.is-inverted.is-outlined:focus { + background-color: #0a0a0a; + color: #e6e6e6; } + .button.is-white.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-white.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + .button.is-black { + background-color: black; + border-color: transparent; + color: white; } + .button.is-black:hover, .button.is-black.is-hovered { + background-color: black; + border-color: transparent; + color: white; } + .button.is-black:focus, .button.is-black.is-focused { + border-color: transparent; + color: white; } + .button.is-black:focus:not(:active), .button.is-black.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(0, 0, 0, 0.25); } + .button.is-black:active, .button.is-black.is-active { + background-color: black; + border-color: transparent; + color: white; } + .button.is-black[disabled], fieldset[disabled] .button.is-black { + background-color: black; + border-color: transparent; + box-shadow: none; } + .button.is-black.is-inverted { + background-color: white; + color: black; } + .button.is-black.is-inverted:hover { + background-color: #f2f2f2; } + .button.is-black.is-inverted[disabled], fieldset[disabled] .button.is-black.is-inverted { + background-color: white; + border-color: transparent; + box-shadow: none; + color: black; } + .button.is-black.is-loading::after { + border-color: transparent transparent white white !important; } + .button.is-black.is-outlined { + background-color: transparent; + border-color: black; + color: black; } + .button.is-black.is-outlined:hover, .button.is-black.is-outlined:focus { + background-color: black; + border-color: black; + color: white; } + .button.is-black.is-outlined.is-loading::after { + border-color: transparent transparent black black !important; } + .button.is-black.is-outlined[disabled], fieldset[disabled] .button.is-black.is-outlined { + background-color: transparent; + border-color: black; + box-shadow: none; + color: black; } + .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + .button.is-black.is-inverted.is-outlined:hover, .button.is-black.is-inverted.is-outlined:focus { + background-color: white; + color: black; } + .button.is-black.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-black.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + .button.is-light { + background-color: #dbdbdb; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-light:hover, .button.is-light.is-hovered { + background-color: #d5d5d5; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-light:focus, .button.is-light.is-focused { + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-light:focus:not(:active), .button.is-light.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(219, 219, 219, 0.25); } + .button.is-light:active, .button.is-light.is-active { + background-color: #cfcfcf; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-light[disabled], fieldset[disabled] .button.is-light { + background-color: #dbdbdb; + border-color: transparent; + box-shadow: none; } + .button.is-light.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: #dbdbdb; } + .button.is-light.is-inverted:hover { + background-color: rgba(0, 0, 0, 0.7); } + .button.is-light.is-inverted[disabled], fieldset[disabled] .button.is-light.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + box-shadow: none; + color: #dbdbdb; } + .button.is-light.is-loading::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-light.is-outlined { + background-color: transparent; + border-color: #dbdbdb; + color: #dbdbdb; } + .button.is-light.is-outlined:hover, .button.is-light.is-outlined:focus { + background-color: #dbdbdb; + border-color: #dbdbdb; + color: rgba(0, 0, 0, 0.7); } + .button.is-light.is-outlined.is-loading::after { + border-color: transparent transparent #dbdbdb #dbdbdb !important; } + .button.is-light.is-outlined[disabled], fieldset[disabled] .button.is-light.is-outlined { + background-color: transparent; + border-color: #dbdbdb; + box-shadow: none; + color: #dbdbdb; } + .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); } + .button.is-light.is-inverted.is-outlined:hover, .button.is-light.is-inverted.is-outlined:focus { + background-color: rgba(0, 0, 0, 0.7); + color: #dbdbdb; } + .button.is-light.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-light.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + box-shadow: none; + color: rgba(0, 0, 0, 0.7); } + .button.is-dark { + background-color: #1c1c1c; + border-color: transparent; + color: #fff; } + .button.is-dark:hover, .button.is-dark.is-hovered { + background-color: #161616; + border-color: transparent; + color: #fff; } + .button.is-dark:focus, .button.is-dark.is-focused { + border-color: transparent; + color: #fff; } + .button.is-dark:focus:not(:active), .button.is-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(28, 28, 28, 0.25); } + .button.is-dark:active, .button.is-dark.is-active { + background-color: #0f0f0f; + border-color: transparent; + color: #fff; } + .button.is-dark[disabled], fieldset[disabled] .button.is-dark { + background-color: #1c1c1c; + border-color: transparent; + box-shadow: none; } + .button.is-dark.is-inverted { + background-color: #fff; + color: #1c1c1c; } + .button.is-dark.is-inverted:hover { + background-color: #f2f2f2; } + .button.is-dark.is-inverted[disabled], fieldset[disabled] .button.is-dark.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #1c1c1c; } + .button.is-dark.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-dark.is-outlined { + background-color: transparent; + border-color: #1c1c1c; + color: #1c1c1c; } + .button.is-dark.is-outlined:hover, .button.is-dark.is-outlined:focus { + background-color: #1c1c1c; + border-color: #1c1c1c; + color: #fff; } + .button.is-dark.is-outlined.is-loading::after { + border-color: transparent transparent #1c1c1c #1c1c1c !important; } + .button.is-dark.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-outlined { + background-color: transparent; + border-color: #1c1c1c; + box-shadow: none; + color: #1c1c1c; } + .button.is-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-dark.is-inverted.is-outlined:hover, .button.is-dark.is-inverted.is-outlined:focus { + background-color: #fff; + color: #1c1c1c; } + .button.is-dark.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-primary { + background-color: #d90052; + border-color: transparent; + color: #fff; } + .button.is-primary:hover, .button.is-primary.is-hovered { + background-color: #cc004d; + border-color: transparent; + color: #fff; } + .button.is-primary:focus, .button.is-primary.is-focused { + border-color: transparent; + color: #fff; } + .button.is-primary:focus:not(:active), .button.is-primary.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(217, 0, 82, 0.25); } + .button.is-primary:active, .button.is-primary.is-active { + background-color: #c00048; + border-color: transparent; + color: #fff; } + .button.is-primary[disabled], fieldset[disabled] .button.is-primary { + background-color: #d90052; + border-color: transparent; + box-shadow: none; } + .button.is-primary.is-inverted { + background-color: #fff; + color: #d90052; } + .button.is-primary.is-inverted:hover { + background-color: #f2f2f2; } + .button.is-primary.is-inverted[disabled], fieldset[disabled] .button.is-primary.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #d90052; } + .button.is-primary.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-primary.is-outlined { + background-color: transparent; + border-color: #d90052; + color: #d90052; } + .button.is-primary.is-outlined:hover, .button.is-primary.is-outlined:focus { + background-color: #d90052; + border-color: #d90052; + color: #fff; } + .button.is-primary.is-outlined.is-loading::after { + border-color: transparent transparent #d90052 #d90052 !important; } + .button.is-primary.is-outlined[disabled], fieldset[disabled] .button.is-primary.is-outlined { + background-color: transparent; + border-color: #d90052; + box-shadow: none; + color: #d90052; } + .button.is-primary.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-primary.is-inverted.is-outlined:hover, .button.is-primary.is-inverted.is-outlined:focus { + background-color: #fff; + color: #d90052; } + .button.is-primary.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-primary.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-link { + background-color: #d90052; + border-color: transparent; + color: #fff; } + .button.is-link:hover, .button.is-link.is-hovered { + background-color: #cc004d; + border-color: transparent; + color: #fff; } + .button.is-link:focus, .button.is-link.is-focused { + border-color: transparent; + color: #fff; } + .button.is-link:focus:not(:active), .button.is-link.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(217, 0, 82, 0.25); } + .button.is-link:active, .button.is-link.is-active { + background-color: #c00048; + border-color: transparent; + color: #fff; } + .button.is-link[disabled], fieldset[disabled] .button.is-link { + background-color: #d90052; + border-color: transparent; + box-shadow: none; } + .button.is-link.is-inverted { + background-color: #fff; + color: #d90052; } + .button.is-link.is-inverted:hover { + background-color: #f2f2f2; } + .button.is-link.is-inverted[disabled], fieldset[disabled] .button.is-link.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #d90052; } + .button.is-link.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-link.is-outlined { + background-color: transparent; + border-color: #d90052; + color: #d90052; } + .button.is-link.is-outlined:hover, .button.is-link.is-outlined:focus { + background-color: #d90052; + border-color: #d90052; + color: #fff; } + .button.is-link.is-outlined.is-loading::after { + border-color: transparent transparent #d90052 #d90052 !important; } + .button.is-link.is-outlined[disabled], fieldset[disabled] .button.is-link.is-outlined { + background-color: transparent; + border-color: #d90052; + box-shadow: none; + color: #d90052; } + .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-link.is-inverted.is-outlined:hover, .button.is-link.is-inverted.is-outlined:focus { + background-color: #fff; + color: #d90052; } + .button.is-link.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-link.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-info { + background-color: #0075cc; + border-color: transparent; + color: #fff; } + .button.is-info:hover, .button.is-info.is-hovered { + background-color: #006ebf; + border-color: transparent; + color: #fff; } + .button.is-info:focus, .button.is-info.is-focused { + border-color: transparent; + color: #fff; } + .button.is-info:focus:not(:active), .button.is-info.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(0, 117, 204, 0.25); } + .button.is-info:active, .button.is-info.is-active { + background-color: #0066b3; + border-color: transparent; + color: #fff; } + .button.is-info[disabled], fieldset[disabled] .button.is-info { + background-color: #0075cc; + border-color: transparent; + box-shadow: none; } + .button.is-info.is-inverted { + background-color: #fff; + color: #0075cc; } + .button.is-info.is-inverted:hover { + background-color: #f2f2f2; } + .button.is-info.is-inverted[disabled], fieldset[disabled] .button.is-info.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #0075cc; } + .button.is-info.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-info.is-outlined { + background-color: transparent; + border-color: #0075cc; + color: #0075cc; } + .button.is-info.is-outlined:hover, .button.is-info.is-outlined:focus { + background-color: #0075cc; + border-color: #0075cc; + color: #fff; } + .button.is-info.is-outlined.is-loading::after { + border-color: transparent transparent #0075cc #0075cc !important; } + .button.is-info.is-outlined[disabled], fieldset[disabled] .button.is-info.is-outlined { + background-color: transparent; + border-color: #0075cc; + box-shadow: none; + color: #0075cc; } + .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-info.is-inverted.is-outlined:hover, .button.is-info.is-inverted.is-outlined:focus { + background-color: #fff; + color: #0075cc; } + .button.is-info.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-info.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-success { + background-color: #11ad74; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-success:hover, .button.is-success.is-hovered { + background-color: #10a16c; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-success:focus, .button.is-success.is-focused { + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-success:focus:not(:active), .button.is-success.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(17, 173, 116, 0.25); } + .button.is-success:active, .button.is-success.is-active { + background-color: #0f9564; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-success[disabled], fieldset[disabled] .button.is-success { + background-color: #11ad74; + border-color: transparent; + box-shadow: none; } + .button.is-success.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: #11ad74; } + .button.is-success.is-inverted:hover { + background-color: rgba(0, 0, 0, 0.7); } + .button.is-success.is-inverted[disabled], fieldset[disabled] .button.is-success.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + box-shadow: none; + color: #11ad74; } + .button.is-success.is-loading::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-success.is-outlined { + background-color: transparent; + border-color: #11ad74; + color: #11ad74; } + .button.is-success.is-outlined:hover, .button.is-success.is-outlined:focus { + background-color: #11ad74; + border-color: #11ad74; + color: rgba(0, 0, 0, 0.7); } + .button.is-success.is-outlined.is-loading::after { + border-color: transparent transparent #11ad74 #11ad74 !important; } + .button.is-success.is-outlined[disabled], fieldset[disabled] .button.is-success.is-outlined { + background-color: transparent; + border-color: #11ad74; + box-shadow: none; + color: #11ad74; } + .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); } + .button.is-success.is-inverted.is-outlined:hover, .button.is-success.is-inverted.is-outlined:focus { + background-color: rgba(0, 0, 0, 0.7); + color: #11ad74; } + .button.is-success.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-success.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + box-shadow: none; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning { + background-color: #ccba00; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:hover, .button.is-warning.is-hovered { + background-color: #bfaf00; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:focus, .button.is-warning.is-focused { + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning:focus:not(:active), .button.is-warning.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(204, 186, 0, 0.25); } + .button.is-warning:active, .button.is-warning.is-active { + background-color: #b3a300; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning[disabled], fieldset[disabled] .button.is-warning { + background-color: #ccba00; + border-color: transparent; + box-shadow: none; } + .button.is-warning.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: #ccba00; } + .button.is-warning.is-inverted:hover { + background-color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-inverted[disabled], fieldset[disabled] .button.is-warning.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + box-shadow: none; + color: #ccba00; } + .button.is-warning.is-loading::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ccba00; + color: #ccba00; } + .button.is-warning.is-outlined:hover, .button.is-warning.is-outlined:focus { + background-color: #ccba00; + border-color: #ccba00; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-outlined.is-loading::after { + border-color: transparent transparent #ccba00 #ccba00 !important; } + .button.is-warning.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-outlined { + background-color: transparent; + border-color: #ccba00; + box-shadow: none; + color: #ccba00; } + .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); } + .button.is-warning.is-inverted.is-outlined:hover, .button.is-warning.is-inverted.is-outlined:focus { + background-color: rgba(0, 0, 0, 0.7); + color: #ccba00; } + .button.is-warning.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-warning.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + box-shadow: none; + color: rgba(0, 0, 0, 0.7); } + .button.is-danger { + background-color: #ee1742; + border-color: transparent; + color: #fff; } + .button.is-danger:hover, .button.is-danger.is-hovered { + background-color: #e6113c; + border-color: transparent; + color: #fff; } + .button.is-danger:focus, .button.is-danger.is-focused { + border-color: transparent; + color: #fff; } + .button.is-danger:focus:not(:active), .button.is-danger.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(238, 23, 66, 0.25); } + .button.is-danger:active, .button.is-danger.is-active { + background-color: #da1039; + border-color: transparent; + color: #fff; } + .button.is-danger[disabled], fieldset[disabled] .button.is-danger { + background-color: #ee1742; + border-color: transparent; + box-shadow: none; } + .button.is-danger.is-inverted { + background-color: #fff; + color: #ee1742; } + .button.is-danger.is-inverted:hover { + background-color: #f2f2f2; } + .button.is-danger.is-inverted[disabled], fieldset[disabled] .button.is-danger.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #ee1742; } + .button.is-danger.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-danger.is-outlined { + background-color: transparent; + border-color: #ee1742; + color: #ee1742; } + .button.is-danger.is-outlined:hover, .button.is-danger.is-outlined:focus { + background-color: #ee1742; + border-color: #ee1742; + color: #fff; } + .button.is-danger.is-outlined.is-loading::after { + border-color: transparent transparent #ee1742 #ee1742 !important; } + .button.is-danger.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-outlined { + background-color: transparent; + border-color: #ee1742; + box-shadow: none; + color: #ee1742; } + .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-danger.is-inverted.is-outlined:hover, .button.is-danger.is-inverted.is-outlined:focus { + background-color: #fff; + color: #ee1742; } + .button.is-danger.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-danger.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-white-dark { + background-color: white; + border-color: transparent; + color: #0a0a0a; } + .button.is-white-dark:hover, .button.is-white-dark.is-hovered { + background-color: #f9f9f9; + border-color: transparent; + color: #0a0a0a; } + .button.is-white-dark:focus, .button.is-white-dark.is-focused { + border-color: transparent; + color: #0a0a0a; } + .button.is-white-dark:focus:not(:active), .button.is-white-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .button.is-white-dark:active, .button.is-white-dark.is-active { + background-color: #f2f2f2; + border-color: transparent; + color: #0a0a0a; } + .button.is-white-dark[disabled], fieldset[disabled] .button.is-white-dark { + background-color: white; + border-color: transparent; + box-shadow: none; } + .button.is-white-dark.is-inverted { + background-color: #0a0a0a; + color: white; } + .button.is-white-dark.is-inverted:hover { + background-color: black; } + .button.is-white-dark.is-inverted[disabled], fieldset[disabled] .button.is-white-dark.is-inverted { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; + color: white; } + .button.is-white-dark.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-white-dark.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + .button.is-white-dark.is-outlined:hover, .button.is-white-dark.is-outlined:focus { + background-color: white; + border-color: white; + color: #0a0a0a; } + .button.is-white-dark.is-outlined.is-loading::after { + border-color: transparent transparent white white !important; } + .button.is-white-dark.is-outlined[disabled], fieldset[disabled] .button.is-white-dark.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + .button.is-white-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + .button.is-white-dark.is-inverted.is-outlined:hover, .button.is-white-dark.is-inverted.is-outlined:focus { + background-color: #0a0a0a; + color: white; } + .button.is-white-dark.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-white-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + .button.is-black-dark { + background-color: #0a0a0a; + border-color: transparent; + color: white; } + .button.is-black-dark:hover, .button.is-black-dark.is-hovered { + background-color: #040404; + border-color: transparent; + color: white; } + .button.is-black-dark:focus, .button.is-black-dark.is-focused { + border-color: transparent; + color: white; } + .button.is-black-dark:focus:not(:active), .button.is-black-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .button.is-black-dark:active, .button.is-black-dark.is-active { + background-color: black; + border-color: transparent; + color: white; } + .button.is-black-dark[disabled], fieldset[disabled] .button.is-black-dark { + background-color: #0a0a0a; + border-color: transparent; + box-shadow: none; } + .button.is-black-dark.is-inverted { + background-color: white; + color: #0a0a0a; } + .button.is-black-dark.is-inverted:hover { + background-color: #f2f2f2; } + .button.is-black-dark.is-inverted[disabled], fieldset[disabled] .button.is-black-dark.is-inverted { + background-color: white; + border-color: transparent; + box-shadow: none; + color: #0a0a0a; } + .button.is-black-dark.is-loading::after { + border-color: transparent transparent white white !important; } + .button.is-black-dark.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + color: #0a0a0a; } + .button.is-black-dark.is-outlined:hover, .button.is-black-dark.is-outlined:focus { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .button.is-black-dark.is-outlined.is-loading::after { + border-color: transparent transparent #0a0a0a #0a0a0a !important; } + .button.is-black-dark.is-outlined[disabled], fieldset[disabled] .button.is-black-dark.is-outlined { + background-color: transparent; + border-color: #0a0a0a; + box-shadow: none; + color: #0a0a0a; } + .button.is-black-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + color: white; } + .button.is-black-dark.is-inverted.is-outlined:hover, .button.is-black-dark.is-inverted.is-outlined:focus { + background-color: white; + color: #0a0a0a; } + .button.is-black-dark.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-black-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: white; + box-shadow: none; + color: white; } + .button.is-light-dark { + background-color: whitesmoke; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-light-dark:hover, .button.is-light-dark.is-hovered { + background-color: #eeeeee; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-light-dark:focus, .button.is-light-dark.is-focused { + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-light-dark:focus:not(:active), .button.is-light-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .button.is-light-dark:active, .button.is-light-dark.is-active { + background-color: #e8e8e8; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-light-dark[disabled], fieldset[disabled] .button.is-light-dark { + background-color: whitesmoke; + border-color: transparent; + box-shadow: none; } + .button.is-light-dark.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: whitesmoke; } + .button.is-light-dark.is-inverted:hover { + background-color: rgba(0, 0, 0, 0.7); } + .button.is-light-dark.is-inverted[disabled], fieldset[disabled] .button.is-light-dark.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + box-shadow: none; + color: whitesmoke; } + .button.is-light-dark.is-loading::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-light-dark.is-outlined { + background-color: transparent; + border-color: whitesmoke; + color: whitesmoke; } + .button.is-light-dark.is-outlined:hover, .button.is-light-dark.is-outlined:focus { + background-color: whitesmoke; + border-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .button.is-light-dark.is-outlined.is-loading::after { + border-color: transparent transparent whitesmoke whitesmoke !important; } + .button.is-light-dark.is-outlined[disabled], fieldset[disabled] .button.is-light-dark.is-outlined { + background-color: transparent; + border-color: whitesmoke; + box-shadow: none; + color: whitesmoke; } + .button.is-light-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); } + .button.is-light-dark.is-inverted.is-outlined:hover, .button.is-light-dark.is-inverted.is-outlined:focus { + background-color: rgba(0, 0, 0, 0.7); + color: whitesmoke; } + .button.is-light-dark.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-light-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + box-shadow: none; + color: rgba(0, 0, 0, 0.7); } + .button.is-dark-dark { + background-color: #363636; + border-color: transparent; + color: #fff; } + .button.is-dark-dark:hover, .button.is-dark-dark.is-hovered { + background-color: #2f2f2f; + border-color: transparent; + color: #fff; } + .button.is-dark-dark:focus, .button.is-dark-dark.is-focused { + border-color: transparent; + color: #fff; } + .button.is-dark-dark:focus:not(:active), .button.is-dark-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .button.is-dark-dark:active, .button.is-dark-dark.is-active { + background-color: #292929; + border-color: transparent; + color: #fff; } + .button.is-dark-dark[disabled], fieldset[disabled] .button.is-dark-dark { + background-color: #363636; + border-color: transparent; + box-shadow: none; } + .button.is-dark-dark.is-inverted { + background-color: #fff; + color: #363636; } + .button.is-dark-dark.is-inverted:hover { + background-color: #f2f2f2; } + .button.is-dark-dark.is-inverted[disabled], fieldset[disabled] .button.is-dark-dark.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #363636; } + .button.is-dark-dark.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-dark-dark.is-outlined { + background-color: transparent; + border-color: #363636; + color: #363636; } + .button.is-dark-dark.is-outlined:hover, .button.is-dark-dark.is-outlined:focus { + background-color: #363636; + border-color: #363636; + color: #fff; } + .button.is-dark-dark.is-outlined.is-loading::after { + border-color: transparent transparent #363636 #363636 !important; } + .button.is-dark-dark.is-outlined[disabled], fieldset[disabled] .button.is-dark-dark.is-outlined { + background-color: transparent; + border-color: #363636; + box-shadow: none; + color: #363636; } + .button.is-dark-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-dark-dark.is-inverted.is-outlined:hover, .button.is-dark-dark.is-inverted.is-outlined:focus { + background-color: #fff; + color: #363636; } + .button.is-dark-dark.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-dark-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-primary-dark { + background-color: #ff0d68; + border-color: transparent; + color: #fff; } + .button.is-primary-dark:hover, .button.is-primary-dark.is-hovered { + background-color: #ff0060; + border-color: transparent; + color: #fff; } + .button.is-primary-dark:focus, .button.is-primary-dark.is-focused { + border-color: transparent; + color: #fff; } + .button.is-primary-dark:focus:not(:active), .button.is-primary-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 13, 104, 0.25); } + .button.is-primary-dark:active, .button.is-primary-dark.is-active { + background-color: #f3005b; + border-color: transparent; + color: #fff; } + .button.is-primary-dark[disabled], fieldset[disabled] .button.is-primary-dark { + background-color: #ff0d68; + border-color: transparent; + box-shadow: none; } + .button.is-primary-dark.is-inverted { + background-color: #fff; + color: #ff0d68; } + .button.is-primary-dark.is-inverted:hover { + background-color: #f2f2f2; } + .button.is-primary-dark.is-inverted[disabled], fieldset[disabled] .button.is-primary-dark.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #ff0d68; } + .button.is-primary-dark.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-primary-dark.is-outlined { + background-color: transparent; + border-color: #ff0d68; + color: #ff0d68; } + .button.is-primary-dark.is-outlined:hover, .button.is-primary-dark.is-outlined:focus { + background-color: #ff0d68; + border-color: #ff0d68; + color: #fff; } + .button.is-primary-dark.is-outlined.is-loading::after { + border-color: transparent transparent #ff0d68 #ff0d68 !important; } + .button.is-primary-dark.is-outlined[disabled], fieldset[disabled] .button.is-primary-dark.is-outlined { + background-color: transparent; + border-color: #ff0d68; + box-shadow: none; + color: #ff0d68; } + .button.is-primary-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-primary-dark.is-inverted.is-outlined:hover, .button.is-primary-dark.is-inverted.is-outlined:focus { + background-color: #fff; + color: #ff0d68; } + .button.is-primary-dark.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-primary-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-link-dark { + background-color: #ff0d68; + border-color: transparent; + color: #fff; } + .button.is-link-dark:hover, .button.is-link-dark.is-hovered { + background-color: #ff0060; + border-color: transparent; + color: #fff; } + .button.is-link-dark:focus, .button.is-link-dark.is-focused { + border-color: transparent; + color: #fff; } + .button.is-link-dark:focus:not(:active), .button.is-link-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 13, 104, 0.25); } + .button.is-link-dark:active, .button.is-link-dark.is-active { + background-color: #f3005b; + border-color: transparent; + color: #fff; } + .button.is-link-dark[disabled], fieldset[disabled] .button.is-link-dark { + background-color: #ff0d68; + border-color: transparent; + box-shadow: none; } + .button.is-link-dark.is-inverted { + background-color: #fff; + color: #ff0d68; } + .button.is-link-dark.is-inverted:hover { + background-color: #f2f2f2; } + .button.is-link-dark.is-inverted[disabled], fieldset[disabled] .button.is-link-dark.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #ff0d68; } + .button.is-link-dark.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-link-dark.is-outlined { + background-color: transparent; + border-color: #ff0d68; + color: #ff0d68; } + .button.is-link-dark.is-outlined:hover, .button.is-link-dark.is-outlined:focus { + background-color: #ff0d68; + border-color: #ff0d68; + color: #fff; } + .button.is-link-dark.is-outlined.is-loading::after { + border-color: transparent transparent #ff0d68 #ff0d68 !important; } + .button.is-link-dark.is-outlined[disabled], fieldset[disabled] .button.is-link-dark.is-outlined { + background-color: transparent; + border-color: #ff0d68; + box-shadow: none; + color: #ff0d68; } + .button.is-link-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-link-dark.is-inverted.is-outlined:hover, .button.is-link-dark.is-inverted.is-outlined:focus { + background-color: #fff; + color: #ff0d68; } + .button.is-link-dark.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-link-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-info-dark { + background-color: #0092FF; + border-color: transparent; + color: #fff; } + .button.is-info-dark:hover, .button.is-info-dark.is-hovered { + background-color: #008bf2; + border-color: transparent; + color: #fff; } + .button.is-info-dark:focus, .button.is-info-dark.is-focused { + border-color: transparent; + color: #fff; } + .button.is-info-dark:focus:not(:active), .button.is-info-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(0, 146, 255, 0.25); } + .button.is-info-dark:active, .button.is-info-dark.is-active { + background-color: #0083e6; + border-color: transparent; + color: #fff; } + .button.is-info-dark[disabled], fieldset[disabled] .button.is-info-dark { + background-color: #0092FF; + border-color: transparent; + box-shadow: none; } + .button.is-info-dark.is-inverted { + background-color: #fff; + color: #0092FF; } + .button.is-info-dark.is-inverted:hover { + background-color: #f2f2f2; } + .button.is-info-dark.is-inverted[disabled], fieldset[disabled] .button.is-info-dark.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #0092FF; } + .button.is-info-dark.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-info-dark.is-outlined { + background-color: transparent; + border-color: #0092FF; + color: #0092FF; } + .button.is-info-dark.is-outlined:hover, .button.is-info-dark.is-outlined:focus { + background-color: #0092FF; + border-color: #0092FF; + color: #fff; } + .button.is-info-dark.is-outlined.is-loading::after { + border-color: transparent transparent #0092FF #0092FF !important; } + .button.is-info-dark.is-outlined[disabled], fieldset[disabled] .button.is-info-dark.is-outlined { + background-color: transparent; + border-color: #0092FF; + box-shadow: none; + color: #0092FF; } + .button.is-info-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-info-dark.is-inverted.is-outlined:hover, .button.is-info-dark.is-inverted.is-outlined:focus { + background-color: #fff; + color: #0092FF; } + .button.is-info-dark.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-info-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button.is-success-dark { + background-color: #16DB93; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-success-dark:hover, .button.is-success-dark.is-hovered { + background-color: #15cf8b; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-success-dark:focus, .button.is-success-dark.is-focused { + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-success-dark:focus:not(:active), .button.is-success-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(22, 219, 147, 0.25); } + .button.is-success-dark:active, .button.is-success-dark.is-active { + background-color: #14c483; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-success-dark[disabled], fieldset[disabled] .button.is-success-dark { + background-color: #16DB93; + border-color: transparent; + box-shadow: none; } + .button.is-success-dark.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: #16DB93; } + .button.is-success-dark.is-inverted:hover { + background-color: rgba(0, 0, 0, 0.7); } + .button.is-success-dark.is-inverted[disabled], fieldset[disabled] .button.is-success-dark.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + box-shadow: none; + color: #16DB93; } + .button.is-success-dark.is-loading::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-success-dark.is-outlined { + background-color: transparent; + border-color: #16DB93; + color: #16DB93; } + .button.is-success-dark.is-outlined:hover, .button.is-success-dark.is-outlined:focus { + background-color: #16DB93; + border-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .button.is-success-dark.is-outlined.is-loading::after { + border-color: transparent transparent #16DB93 #16DB93 !important; } + .button.is-success-dark.is-outlined[disabled], fieldset[disabled] .button.is-success-dark.is-outlined { + background-color: transparent; + border-color: #16DB93; + box-shadow: none; + color: #16DB93; } + .button.is-success-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); } + .button.is-success-dark.is-inverted.is-outlined:hover, .button.is-success-dark.is-inverted.is-outlined:focus { + background-color: rgba(0, 0, 0, 0.7); + color: #16DB93; } + .button.is-success-dark.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-success-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + box-shadow: none; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning-dark { + background-color: #FFE900; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning-dark:hover, .button.is-warning-dark.is-hovered { + background-color: #f2dd00; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning-dark:focus, .button.is-warning-dark.is-focused { + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning-dark:focus:not(:active), .button.is-warning-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(255, 233, 0, 0.25); } + .button.is-warning-dark:active, .button.is-warning-dark.is-active { + background-color: #e6d200; + border-color: transparent; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning-dark[disabled], fieldset[disabled] .button.is-warning-dark { + background-color: #FFE900; + border-color: transparent; + box-shadow: none; } + .button.is-warning-dark.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + color: #FFE900; } + .button.is-warning-dark.is-inverted:hover { + background-color: rgba(0, 0, 0, 0.7); } + .button.is-warning-dark.is-inverted[disabled], fieldset[disabled] .button.is-warning-dark.is-inverted { + background-color: rgba(0, 0, 0, 0.7); + border-color: transparent; + box-shadow: none; + color: #FFE900; } + .button.is-warning-dark.is-loading::after { + border-color: transparent transparent rgba(0, 0, 0, 0.7) rgba(0, 0, 0, 0.7) !important; } + .button.is-warning-dark.is-outlined { + background-color: transparent; + border-color: #FFE900; + color: #FFE900; } + .button.is-warning-dark.is-outlined:hover, .button.is-warning-dark.is-outlined:focus { + background-color: #FFE900; + border-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .button.is-warning-dark.is-outlined.is-loading::after { + border-color: transparent transparent #FFE900 #FFE900 !important; } + .button.is-warning-dark.is-outlined[disabled], fieldset[disabled] .button.is-warning-dark.is-outlined { + background-color: transparent; + border-color: #FFE900; + box-shadow: none; + color: #FFE900; } + .button.is-warning-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + color: rgba(0, 0, 0, 0.7); } + .button.is-warning-dark.is-inverted.is-outlined:hover, .button.is-warning-dark.is-inverted.is-outlined:focus { + background-color: rgba(0, 0, 0, 0.7); + color: #FFE900; } + .button.is-warning-dark.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-warning-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: rgba(0, 0, 0, 0.7); + box-shadow: none; + color: rgba(0, 0, 0, 0.7); } + .button.is-danger-dark { + background-color: #f14668; + border-color: transparent; + color: #fff; } + .button.is-danger-dark:hover, .button.is-danger-dark.is-hovered { + background-color: #f03a5f; + border-color: transparent; + color: #fff; } + .button.is-danger-dark:focus, .button.is-danger-dark.is-focused { + border-color: transparent; + color: #fff; } + .button.is-danger-dark:focus:not(:active), .button.is-danger-dark.is-focused:not(:active) { + box-shadow: 0 0 0 0.125em rgba(241, 70, 104, 0.25); } + .button.is-danger-dark:active, .button.is-danger-dark.is-active { + background-color: #ef2e55; + border-color: transparent; + color: #fff; } + .button.is-danger-dark[disabled], fieldset[disabled] .button.is-danger-dark { + background-color: #f14668; + border-color: transparent; + box-shadow: none; } + .button.is-danger-dark.is-inverted { + background-color: #fff; + color: #f14668; } + .button.is-danger-dark.is-inverted:hover { + background-color: #f2f2f2; } + .button.is-danger-dark.is-inverted[disabled], fieldset[disabled] .button.is-danger-dark.is-inverted { + background-color: #fff; + border-color: transparent; + box-shadow: none; + color: #f14668; } + .button.is-danger-dark.is-loading::after { + border-color: transparent transparent #fff #fff !important; } + .button.is-danger-dark.is-outlined { + background-color: transparent; + border-color: #f14668; + color: #f14668; } + .button.is-danger-dark.is-outlined:hover, .button.is-danger-dark.is-outlined:focus { + background-color: #f14668; + border-color: #f14668; + color: #fff; } + .button.is-danger-dark.is-outlined.is-loading::after { + border-color: transparent transparent #f14668 #f14668 !important; } + .button.is-danger-dark.is-outlined[disabled], fieldset[disabled] .button.is-danger-dark.is-outlined { + background-color: transparent; + border-color: #f14668; + box-shadow: none; + color: #f14668; } + .button.is-danger-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + color: #fff; } + .button.is-danger-dark.is-inverted.is-outlined:hover, .button.is-danger-dark.is-inverted.is-outlined:focus { + background-color: #fff; + color: #f14668; } + .button.is-danger-dark.is-inverted.is-outlined[disabled], fieldset[disabled] .button.is-danger-dark.is-inverted.is-outlined { + background-color: transparent; + border-color: #fff; + box-shadow: none; + color: #fff; } + .button[disabled], fieldset[disabled] .button { + background-color: #0a0a0a; + border-color: #363636; } + .button.is-static { + background-color: whitesmoke; + border-color: #363636; + color: #7a7a7a; } + .content h1, + .content h2, + .content h3, + .content h4, + .content h5, + .content h6 { + color: #dbdbdb; } + .content blockquote { + background-color: #242424; + border-left: 5px solid #363636; } + .content table td, + .content table th { + border: 1px solid #363636; } + .content table th { + color: #dbdbdb; } + .content table thead td, + .content table thead th { + color: #dbdbdb; } + .content table tfoot td, + .content table tfoot th { + color: #dbdbdb; } + .input, + .textarea { + background-color: #0a0a0a; + border-color: #363636; + color: #dbdbdb; + box-shadow: inset 0 1px 2px rgba(255, 255, 255, 0.1); } + .input::-moz-placeholder, + .textarea::-moz-placeholder { + color: rgba(219, 219, 219, 0.3); } + .input::-webkit-input-placeholder, + .textarea::-webkit-input-placeholder { + color: rgba(219, 219, 219, 0.3); } + .input:-moz-placeholder, + .textarea:-moz-placeholder { + color: rgba(219, 219, 219, 0.3); } + .input:-ms-input-placeholder, + .textarea:-ms-input-placeholder { + color: rgba(219, 219, 219, 0.3); } + .input:hover, .input.is-hovered, + .textarea:hover, + .textarea.is-hovered { + border-color: #4a4a4a; } + .input:focus, .input.is-focused, .input:active, .input.is-active, + .textarea:focus, + .textarea.is-focused, + .textarea:active, + .textarea.is-active { + border-color: #e60056; + box-shadow: 0 0 0 0.125em rgba(230, 0, 86, 0.25); } + .input[disabled], fieldset[disabled] .input, + .textarea[disabled], fieldset[disabled] .textarea { + background-color: #242424; + border-color: #242424; + color: #b5b5b5; } + .input[disabled]::-moz-placeholder, fieldset[disabled] .input::-moz-placeholder, + .textarea[disabled]::-moz-placeholder, fieldset[disabled] .textarea::-moz-placeholder { + color: rgba(181, 181, 181, 0.3); } + .input[disabled]::-webkit-input-placeholder, fieldset[disabled] .input::-webkit-input-placeholder, + .textarea[disabled]::-webkit-input-placeholder, fieldset[disabled] .textarea::-webkit-input-placeholder { + color: rgba(181, 181, 181, 0.3); } + .input[disabled]:-moz-placeholder, fieldset[disabled] .input:-moz-placeholder, + .textarea[disabled]:-moz-placeholder, fieldset[disabled] .textarea:-moz-placeholder { + color: rgba(181, 181, 181, 0.3); } + .input[disabled]:-ms-input-placeholder, fieldset[disabled] .input:-ms-input-placeholder, + .textarea[disabled]:-ms-input-placeholder, fieldset[disabled] .textarea:-ms-input-placeholder { + color: rgba(181, 181, 181, 0.3); } + .input.is-white, + .textarea.is-white { + border-color: #e6e6e6; } + .input.is-white:focus, .input.is-white.is-focused, .input.is-white:active, .input.is-white.is-active, + .textarea.is-white:focus, + .textarea.is-white.is-focused, + .textarea.is-white:active, + .textarea.is-white.is-active { + box-shadow: 0 0 0 0.125em rgba(230, 230, 230, 0.25); } + .input.is-black, + .textarea.is-black { + border-color: black; } + .input.is-black:focus, .input.is-black.is-focused, .input.is-black:active, .input.is-black.is-active, + .textarea.is-black:focus, + .textarea.is-black.is-focused, + .textarea.is-black:active, + .textarea.is-black.is-active { + box-shadow: 0 0 0 0.125em rgba(0, 0, 0, 0.25); } + .input.is-light, + .textarea.is-light { + border-color: #dbdbdb; } + .input.is-light:focus, .input.is-light.is-focused, .input.is-light:active, .input.is-light.is-active, + .textarea.is-light:focus, + .textarea.is-light.is-focused, + .textarea.is-light:active, + .textarea.is-light.is-active { + box-shadow: 0 0 0 0.125em rgba(219, 219, 219, 0.25); } + .input.is-dark, + .textarea.is-dark { + border-color: #1c1c1c; } + .input.is-dark:focus, .input.is-dark.is-focused, .input.is-dark:active, .input.is-dark.is-active, + .textarea.is-dark:focus, + .textarea.is-dark.is-focused, + .textarea.is-dark:active, + .textarea.is-dark.is-active { + box-shadow: 0 0 0 0.125em rgba(28, 28, 28, 0.25); } + .input.is-primary, + .textarea.is-primary { + border-color: #d90052; } + .input.is-primary:focus, .input.is-primary.is-focused, .input.is-primary:active, .input.is-primary.is-active, + .textarea.is-primary:focus, + .textarea.is-primary.is-focused, + .textarea.is-primary:active, + .textarea.is-primary.is-active { + box-shadow: 0 0 0 0.125em rgba(217, 0, 82, 0.25); } + .input.is-link, + .textarea.is-link { + border-color: #d90052; } + .input.is-link:focus, .input.is-link.is-focused, .input.is-link:active, .input.is-link.is-active, + .textarea.is-link:focus, + .textarea.is-link.is-focused, + .textarea.is-link:active, + .textarea.is-link.is-active { + box-shadow: 0 0 0 0.125em rgba(217, 0, 82, 0.25); } + .input.is-info, + .textarea.is-info { + border-color: #0075cc; } + .input.is-info:focus, .input.is-info.is-focused, .input.is-info:active, .input.is-info.is-active, + .textarea.is-info:focus, + .textarea.is-info.is-focused, + .textarea.is-info:active, + .textarea.is-info.is-active { + box-shadow: 0 0 0 0.125em rgba(0, 117, 204, 0.25); } + .input.is-success, + .textarea.is-success { + border-color: #11ad74; } + .input.is-success:focus, .input.is-success.is-focused, .input.is-success:active, .input.is-success.is-active, + .textarea.is-success:focus, + .textarea.is-success.is-focused, + .textarea.is-success:active, + .textarea.is-success.is-active { + box-shadow: 0 0 0 0.125em rgba(17, 173, 116, 0.25); } + .input.is-warning, + .textarea.is-warning { + border-color: #ccba00; } + .input.is-warning:focus, .input.is-warning.is-focused, .input.is-warning:active, .input.is-warning.is-active, + .textarea.is-warning:focus, + .textarea.is-warning.is-focused, + .textarea.is-warning:active, + .textarea.is-warning.is-active { + box-shadow: 0 0 0 0.125em rgba(204, 186, 0, 0.25); } + .input.is-danger, + .textarea.is-danger { + border-color: #ee1742; } + .input.is-danger:focus, .input.is-danger.is-focused, .input.is-danger:active, .input.is-danger.is-active, + .textarea.is-danger:focus, + .textarea.is-danger.is-focused, + .textarea.is-danger:active, + .textarea.is-danger.is-active { + box-shadow: 0 0 0 0.125em rgba(238, 23, 66, 0.25); } + .input.is-white-dark, + .textarea.is-white-dark { + border-color: white; } + .input.is-white-dark:focus, .input.is-white-dark.is-focused, .input.is-white-dark:active, .input.is-white-dark.is-active, + .textarea.is-white-dark:focus, + .textarea.is-white-dark.is-focused, + .textarea.is-white-dark:active, + .textarea.is-white-dark.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .input.is-black-dark, + .textarea.is-black-dark { + border-color: #0a0a0a; } + .input.is-black-dark:focus, .input.is-black-dark.is-focused, .input.is-black-dark:active, .input.is-black-dark.is-active, + .textarea.is-black-dark:focus, + .textarea.is-black-dark.is-focused, + .textarea.is-black-dark:active, + .textarea.is-black-dark.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .input.is-light-dark, + .textarea.is-light-dark { + border-color: whitesmoke; } + .input.is-light-dark:focus, .input.is-light-dark.is-focused, .input.is-light-dark:active, .input.is-light-dark.is-active, + .textarea.is-light-dark:focus, + .textarea.is-light-dark.is-focused, + .textarea.is-light-dark:active, + .textarea.is-light-dark.is-active { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .input.is-dark-dark, + .textarea.is-dark-dark { + border-color: #363636; } + .input.is-dark-dark:focus, .input.is-dark-dark.is-focused, .input.is-dark-dark:active, .input.is-dark-dark.is-active, + .textarea.is-dark-dark:focus, + .textarea.is-dark-dark.is-focused, + .textarea.is-dark-dark:active, + .textarea.is-dark-dark.is-active { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .input.is-primary-dark, + .textarea.is-primary-dark { + border-color: #ff0d68; } + .input.is-primary-dark:focus, .input.is-primary-dark.is-focused, .input.is-primary-dark:active, .input.is-primary-dark.is-active, + .textarea.is-primary-dark:focus, + .textarea.is-primary-dark.is-focused, + .textarea.is-primary-dark:active, + .textarea.is-primary-dark.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 13, 104, 0.25); } + .input.is-link-dark, + .textarea.is-link-dark { + border-color: #ff0d68; } + .input.is-link-dark:focus, .input.is-link-dark.is-focused, .input.is-link-dark:active, .input.is-link-dark.is-active, + .textarea.is-link-dark:focus, + .textarea.is-link-dark.is-focused, + .textarea.is-link-dark:active, + .textarea.is-link-dark.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 13, 104, 0.25); } + .input.is-info-dark, + .textarea.is-info-dark { + border-color: #0092FF; } + .input.is-info-dark:focus, .input.is-info-dark.is-focused, .input.is-info-dark:active, .input.is-info-dark.is-active, + .textarea.is-info-dark:focus, + .textarea.is-info-dark.is-focused, + .textarea.is-info-dark:active, + .textarea.is-info-dark.is-active { + box-shadow: 0 0 0 0.125em rgba(0, 146, 255, 0.25); } + .input.is-success-dark, + .textarea.is-success-dark { + border-color: #16DB93; } + .input.is-success-dark:focus, .input.is-success-dark.is-focused, .input.is-success-dark:active, .input.is-success-dark.is-active, + .textarea.is-success-dark:focus, + .textarea.is-success-dark.is-focused, + .textarea.is-success-dark:active, + .textarea.is-success-dark.is-active { + box-shadow: 0 0 0 0.125em rgba(22, 219, 147, 0.25); } + .input.is-warning-dark, + .textarea.is-warning-dark { + border-color: #FFE900; } + .input.is-warning-dark:focus, .input.is-warning-dark.is-focused, .input.is-warning-dark:active, .input.is-warning-dark.is-active, + .textarea.is-warning-dark:focus, + .textarea.is-warning-dark.is-focused, + .textarea.is-warning-dark:active, + .textarea.is-warning-dark.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 233, 0, 0.25); } + .input.is-danger-dark, + .textarea.is-danger-dark { + border-color: #f14668; } + .input.is-danger-dark:focus, .input.is-danger-dark.is-focused, .input.is-danger-dark:active, .input.is-danger-dark.is-active, + .textarea.is-danger-dark:focus, + .textarea.is-danger-dark.is-focused, + .textarea.is-danger-dark:active, + .textarea.is-danger-dark.is-active { + box-shadow: 0 0 0 0.125em rgba(241, 70, 104, 0.25); } + .checkbox:hover, + .radio:hover { + color: #dbdbdb; } + .checkbox[disabled], fieldset[disabled] .checkbox, + .radio[disabled], fieldset[disabled] .radio { + color: #b5b5b5; } + .select:not(.is-multiple):not(.is-loading)::after { + border-color: #e60056; } + .select select { + background-color: #0a0a0a; + border-color: #363636; + color: #dbdbdb; } + .select select::-moz-placeholder { + color: rgba(219, 219, 219, 0.3); } + .select select::-webkit-input-placeholder { + color: rgba(219, 219, 219, 0.3); } + .select select:-moz-placeholder { + color: rgba(219, 219, 219, 0.3); } + .select select:-ms-input-placeholder { + color: rgba(219, 219, 219, 0.3); } + .select select:hover, .select select.is-hovered { + border-color: #4a4a4a; } + .select select:focus, .select select.is-focused, .select select:active, .select select.is-active { + border-color: #e60056; + box-shadow: 0 0 0 0.125em rgba(230, 0, 86, 0.25); } + .select select[disabled], fieldset[disabled] .select select { + background-color: #242424; + border-color: #242424; + color: #b5b5b5; } + .select select[disabled]::-moz-placeholder, fieldset[disabled] .select select::-moz-placeholder { + color: rgba(181, 181, 181, 0.3); } + .select select[disabled]::-webkit-input-placeholder, fieldset[disabled] .select select::-webkit-input-placeholder { + color: rgba(181, 181, 181, 0.3); } + .select select[disabled]:-moz-placeholder, fieldset[disabled] .select select:-moz-placeholder { + color: rgba(181, 181, 181, 0.3); } + .select select[disabled]:-ms-input-placeholder, fieldset[disabled] .select select:-ms-input-placeholder { + color: rgba(181, 181, 181, 0.3); } + .select select[disabled]:hover, fieldset[disabled] .select select:hover { + border-color: #242424; } + .select select option { + color: #dbdbdb; } + .select:not(.is-multiple):not(.is-loading):hover::after { + border-color: #dbdbdb; } + .select.is-white:not(:hover)::after { + border-color: #e6e6e6; } + .select.is-white select { + border-color: #e6e6e6; } + .select.is-white select:hover, .select.is-white select.is-hovered { + border-color: #d9d9d9; } + .select.is-white select:focus, .select.is-white select.is-focused, .select.is-white select:active, .select.is-white select.is-active { + box-shadow: 0 0 0 0.125em rgba(230, 230, 230, 0.25); } + .select.is-black:not(:hover)::after { + border-color: black; } + .select.is-black select { + border-color: black; } + .select.is-black select:hover, .select.is-black select.is-hovered { + border-color: black; } + .select.is-black select:focus, .select.is-black select.is-focused, .select.is-black select:active, .select.is-black select.is-active { + box-shadow: 0 0 0 0.125em rgba(0, 0, 0, 0.25); } + .select.is-light:not(:hover)::after { + border-color: #dbdbdb; } + .select.is-light select { + border-color: #dbdbdb; } + .select.is-light select:hover, .select.is-light select.is-hovered { + border-color: #cfcfcf; } + .select.is-light select:focus, .select.is-light select.is-focused, .select.is-light select:active, .select.is-light select.is-active { + box-shadow: 0 0 0 0.125em rgba(219, 219, 219, 0.25); } + .select.is-dark:not(:hover)::after { + border-color: #1c1c1c; } + .select.is-dark select { + border-color: #1c1c1c; } + .select.is-dark select:hover, .select.is-dark select.is-hovered { + border-color: #0f0f0f; } + .select.is-dark select:focus, .select.is-dark select.is-focused, .select.is-dark select:active, .select.is-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(28, 28, 28, 0.25); } + .select.is-primary:not(:hover)::after { + border-color: #d90052; } + .select.is-primary select { + border-color: #d90052; } + .select.is-primary select:hover, .select.is-primary select.is-hovered { + border-color: #c00048; } + .select.is-primary select:focus, .select.is-primary select.is-focused, .select.is-primary select:active, .select.is-primary select.is-active { + box-shadow: 0 0 0 0.125em rgba(217, 0, 82, 0.25); } + .select.is-link:not(:hover)::after { + border-color: #d90052; } + .select.is-link select { + border-color: #d90052; } + .select.is-link select:hover, .select.is-link select.is-hovered { + border-color: #c00048; } + .select.is-link select:focus, .select.is-link select.is-focused, .select.is-link select:active, .select.is-link select.is-active { + box-shadow: 0 0 0 0.125em rgba(217, 0, 82, 0.25); } + .select.is-info:not(:hover)::after { + border-color: #0075cc; } + .select.is-info select { + border-color: #0075cc; } + .select.is-info select:hover, .select.is-info select.is-hovered { + border-color: #0066b3; } + .select.is-info select:focus, .select.is-info select.is-focused, .select.is-info select:active, .select.is-info select.is-active { + box-shadow: 0 0 0 0.125em rgba(0, 117, 204, 0.25); } + .select.is-success:not(:hover)::after { + border-color: #11ad74; } + .select.is-success select { + border-color: #11ad74; } + .select.is-success select:hover, .select.is-success select.is-hovered { + border-color: #0f9564; } + .select.is-success select:focus, .select.is-success select.is-focused, .select.is-success select:active, .select.is-success select.is-active { + box-shadow: 0 0 0 0.125em rgba(17, 173, 116, 0.25); } + .select.is-warning:not(:hover)::after { + border-color: #ccba00; } + .select.is-warning select { + border-color: #ccba00; } + .select.is-warning select:hover, .select.is-warning select.is-hovered { + border-color: #b3a300; } + .select.is-warning select:focus, .select.is-warning select.is-focused, .select.is-warning select:active, .select.is-warning select.is-active { + box-shadow: 0 0 0 0.125em rgba(204, 186, 0, 0.25); } + .select.is-danger:not(:hover)::after { + border-color: #ee1742; } + .select.is-danger select { + border-color: #ee1742; } + .select.is-danger select:hover, .select.is-danger select.is-hovered { + border-color: #da1039; } + .select.is-danger select:focus, .select.is-danger select.is-focused, .select.is-danger select:active, .select.is-danger select.is-active { + box-shadow: 0 0 0 0.125em rgba(238, 23, 66, 0.25); } + .select.is-white-dark:not(:hover)::after { + border-color: white; } + .select.is-white-dark select { + border-color: white; } + .select.is-white-dark select:hover, .select.is-white-dark select.is-hovered { + border-color: #f2f2f2; } + .select.is-white-dark select:focus, .select.is-white-dark select.is-focused, .select.is-white-dark select:active, .select.is-white-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 255, 255, 0.25); } + .select.is-black-dark:not(:hover)::after { + border-color: #0a0a0a; } + .select.is-black-dark select { + border-color: #0a0a0a; } + .select.is-black-dark select:hover, .select.is-black-dark select.is-hovered { + border-color: black; } + .select.is-black-dark select:focus, .select.is-black-dark select.is-focused, .select.is-black-dark select:active, .select.is-black-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(10, 10, 10, 0.25); } + .select.is-light-dark:not(:hover)::after { + border-color: whitesmoke; } + .select.is-light-dark select { + border-color: whitesmoke; } + .select.is-light-dark select:hover, .select.is-light-dark select.is-hovered { + border-color: #e8e8e8; } + .select.is-light-dark select:focus, .select.is-light-dark select.is-focused, .select.is-light-dark select:active, .select.is-light-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(245, 245, 245, 0.25); } + .select.is-dark-dark:not(:hover)::after { + border-color: #363636; } + .select.is-dark-dark select { + border-color: #363636; } + .select.is-dark-dark select:hover, .select.is-dark-dark select.is-hovered { + border-color: #292929; } + .select.is-dark-dark select:focus, .select.is-dark-dark select.is-focused, .select.is-dark-dark select:active, .select.is-dark-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(54, 54, 54, 0.25); } + .select.is-primary-dark:not(:hover)::after { + border-color: #ff0d68; } + .select.is-primary-dark select { + border-color: #ff0d68; } + .select.is-primary-dark select:hover, .select.is-primary-dark select.is-hovered { + border-color: #f3005b; } + .select.is-primary-dark select:focus, .select.is-primary-dark select.is-focused, .select.is-primary-dark select:active, .select.is-primary-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 13, 104, 0.25); } + .select.is-link-dark:not(:hover)::after { + border-color: #ff0d68; } + .select.is-link-dark select { + border-color: #ff0d68; } + .select.is-link-dark select:hover, .select.is-link-dark select.is-hovered { + border-color: #f3005b; } + .select.is-link-dark select:focus, .select.is-link-dark select.is-focused, .select.is-link-dark select:active, .select.is-link-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 13, 104, 0.25); } + .select.is-info-dark:not(:hover)::after { + border-color: #0092FF; } + .select.is-info-dark select { + border-color: #0092FF; } + .select.is-info-dark select:hover, .select.is-info-dark select.is-hovered { + border-color: #0083e6; } + .select.is-info-dark select:focus, .select.is-info-dark select.is-focused, .select.is-info-dark select:active, .select.is-info-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(0, 146, 255, 0.25); } + .select.is-success-dark:not(:hover)::after { + border-color: #16DB93; } + .select.is-success-dark select { + border-color: #16DB93; } + .select.is-success-dark select:hover, .select.is-success-dark select.is-hovered { + border-color: #14c483; } + .select.is-success-dark select:focus, .select.is-success-dark select.is-focused, .select.is-success-dark select:active, .select.is-success-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(22, 219, 147, 0.25); } + .select.is-warning-dark:not(:hover)::after { + border-color: #FFE900; } + .select.is-warning-dark select { + border-color: #FFE900; } + .select.is-warning-dark select:hover, .select.is-warning-dark select.is-hovered { + border-color: #e6d200; } + .select.is-warning-dark select:focus, .select.is-warning-dark select.is-focused, .select.is-warning-dark select:active, .select.is-warning-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(255, 233, 0, 0.25); } + .select.is-danger-dark:not(:hover)::after { + border-color: #f14668; } + .select.is-danger-dark select { + border-color: #f14668; } + .select.is-danger-dark select:hover, .select.is-danger-dark select.is-hovered { + border-color: #ef2e55; } + .select.is-danger-dark select:focus, .select.is-danger-dark select.is-focused, .select.is-danger-dark select:active, .select.is-danger-dark select.is-active { + box-shadow: 0 0 0 0.125em rgba(241, 70, 104, 0.25); } + .select.is-disabled::after { + border-color: #b5b5b5; } + .file.is-white .file-cta { + background-color: #e6e6e6; + color: #0a0a0a; } + .file.is-white:hover .file-cta, .file.is-white.is-hovered .file-cta { + background-color: #dfdfdf; + color: #0a0a0a; } + .file.is-white:focus .file-cta, .file.is-white.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(230, 230, 230, 0.25); + color: #0a0a0a; } + .file.is-white:active .file-cta, .file.is-white.is-active .file-cta { + background-color: #d9d9d9; + color: #0a0a0a; } + .file.is-black .file-cta { + background-color: black; + color: white; } + .file.is-black:hover .file-cta, .file.is-black.is-hovered .file-cta { + background-color: black; + color: white; } + .file.is-black:focus .file-cta, .file.is-black.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(0, 0, 0, 0.25); + color: white; } + .file.is-black:active .file-cta, .file.is-black.is-active .file-cta { + background-color: black; + color: white; } + .file.is-light .file-cta { + background-color: #dbdbdb; + color: rgba(0, 0, 0, 0.7); } + .file.is-light:hover .file-cta, .file.is-light.is-hovered .file-cta { + background-color: #d5d5d5; + color: rgba(0, 0, 0, 0.7); } + .file.is-light:focus .file-cta, .file.is-light.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(219, 219, 219, 0.25); + color: rgba(0, 0, 0, 0.7); } + .file.is-light:active .file-cta, .file.is-light.is-active .file-cta { + background-color: #cfcfcf; + color: rgba(0, 0, 0, 0.7); } + .file.is-dark .file-cta { + background-color: #1c1c1c; + color: #fff; } + .file.is-dark:hover .file-cta, .file.is-dark.is-hovered .file-cta { + background-color: #161616; + color: #fff; } + .file.is-dark:focus .file-cta, .file.is-dark.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(28, 28, 28, 0.25); + color: #fff; } + .file.is-dark:active .file-cta, .file.is-dark.is-active .file-cta { + background-color: #0f0f0f; + color: #fff; } + .file.is-primary .file-cta { + background-color: #d90052; + color: #fff; } + .file.is-primary:hover .file-cta, .file.is-primary.is-hovered .file-cta { + background-color: #cc004d; + color: #fff; } + .file.is-primary:focus .file-cta, .file.is-primary.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(217, 0, 82, 0.25); + color: #fff; } + .file.is-primary:active .file-cta, .file.is-primary.is-active .file-cta { + background-color: #c00048; + color: #fff; } + .file.is-link .file-cta { + background-color: #d90052; + color: #fff; } + .file.is-link:hover .file-cta, .file.is-link.is-hovered .file-cta { + background-color: #cc004d; + color: #fff; } + .file.is-link:focus .file-cta, .file.is-link.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(217, 0, 82, 0.25); + color: #fff; } + .file.is-link:active .file-cta, .file.is-link.is-active .file-cta { + background-color: #c00048; + color: #fff; } + .file.is-info .file-cta { + background-color: #0075cc; + color: #fff; } + .file.is-info:hover .file-cta, .file.is-info.is-hovered .file-cta { + background-color: #006ebf; + color: #fff; } + .file.is-info:focus .file-cta, .file.is-info.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(0, 117, 204, 0.25); + color: #fff; } + .file.is-info:active .file-cta, .file.is-info.is-active .file-cta { + background-color: #0066b3; + color: #fff; } + .file.is-success .file-cta { + background-color: #11ad74; + color: rgba(0, 0, 0, 0.7); } + .file.is-success:hover .file-cta, .file.is-success.is-hovered .file-cta { + background-color: #10a16c; + color: rgba(0, 0, 0, 0.7); } + .file.is-success:focus .file-cta, .file.is-success.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(17, 173, 116, 0.25); + color: rgba(0, 0, 0, 0.7); } + .file.is-success:active .file-cta, .file.is-success.is-active .file-cta { + background-color: #0f9564; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning .file-cta { + background-color: #ccba00; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:hover .file-cta, .file.is-warning.is-hovered .file-cta { + background-color: #bfaf00; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:focus .file-cta, .file.is-warning.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(204, 186, 0, 0.25); + color: rgba(0, 0, 0, 0.7); } + .file.is-warning:active .file-cta, .file.is-warning.is-active .file-cta { + background-color: #b3a300; + color: rgba(0, 0, 0, 0.7); } + .file.is-danger .file-cta { + background-color: #ee1742; + color: #fff; } + .file.is-danger:hover .file-cta, .file.is-danger.is-hovered .file-cta { + background-color: #e6113c; + color: #fff; } + .file.is-danger:focus .file-cta, .file.is-danger.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(238, 23, 66, 0.25); + color: #fff; } + .file.is-danger:active .file-cta, .file.is-danger.is-active .file-cta { + background-color: #da1039; + color: #fff; } + .file.is-white-dark .file-cta { + background-color: white; + color: #0a0a0a; } + .file.is-white-dark:hover .file-cta, .file.is-white-dark.is-hovered .file-cta { + background-color: #f9f9f9; + color: #0a0a0a; } + .file.is-white-dark:focus .file-cta, .file.is-white-dark.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(255, 255, 255, 0.25); + color: #0a0a0a; } + .file.is-white-dark:active .file-cta, .file.is-white-dark.is-active .file-cta { + background-color: #f2f2f2; + color: #0a0a0a; } + .file.is-black-dark .file-cta { + background-color: #0a0a0a; + color: white; } + .file.is-black-dark:hover .file-cta, .file.is-black-dark.is-hovered .file-cta { + background-color: #040404; + color: white; } + .file.is-black-dark:focus .file-cta, .file.is-black-dark.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(10, 10, 10, 0.25); + color: white; } + .file.is-black-dark:active .file-cta, .file.is-black-dark.is-active .file-cta { + background-color: black; + color: white; } + .file.is-light-dark .file-cta { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .file.is-light-dark:hover .file-cta, .file.is-light-dark.is-hovered .file-cta { + background-color: #eeeeee; + color: rgba(0, 0, 0, 0.7); } + .file.is-light-dark:focus .file-cta, .file.is-light-dark.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(245, 245, 245, 0.25); + color: rgba(0, 0, 0, 0.7); } + .file.is-light-dark:active .file-cta, .file.is-light-dark.is-active .file-cta { + background-color: #e8e8e8; + color: rgba(0, 0, 0, 0.7); } + .file.is-dark-dark .file-cta { + background-color: #363636; + color: #fff; } + .file.is-dark-dark:hover .file-cta, .file.is-dark-dark.is-hovered .file-cta { + background-color: #2f2f2f; + color: #fff; } + .file.is-dark-dark:focus .file-cta, .file.is-dark-dark.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(54, 54, 54, 0.25); + color: #fff; } + .file.is-dark-dark:active .file-cta, .file.is-dark-dark.is-active .file-cta { + background-color: #292929; + color: #fff; } + .file.is-primary-dark .file-cta { + background-color: #ff0d68; + color: #fff; } + .file.is-primary-dark:hover .file-cta, .file.is-primary-dark.is-hovered .file-cta { + background-color: #ff0060; + color: #fff; } + .file.is-primary-dark:focus .file-cta, .file.is-primary-dark.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(255, 13, 104, 0.25); + color: #fff; } + .file.is-primary-dark:active .file-cta, .file.is-primary-dark.is-active .file-cta { + background-color: #f3005b; + color: #fff; } + .file.is-link-dark .file-cta { + background-color: #ff0d68; + color: #fff; } + .file.is-link-dark:hover .file-cta, .file.is-link-dark.is-hovered .file-cta { + background-color: #ff0060; + color: #fff; } + .file.is-link-dark:focus .file-cta, .file.is-link-dark.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(255, 13, 104, 0.25); + color: #fff; } + .file.is-link-dark:active .file-cta, .file.is-link-dark.is-active .file-cta { + background-color: #f3005b; + color: #fff; } + .file.is-info-dark .file-cta { + background-color: #0092FF; + color: #fff; } + .file.is-info-dark:hover .file-cta, .file.is-info-dark.is-hovered .file-cta { + background-color: #008bf2; + color: #fff; } + .file.is-info-dark:focus .file-cta, .file.is-info-dark.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(0, 146, 255, 0.25); + color: #fff; } + .file.is-info-dark:active .file-cta, .file.is-info-dark.is-active .file-cta { + background-color: #0083e6; + color: #fff; } + .file.is-success-dark .file-cta { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .file.is-success-dark:hover .file-cta, .file.is-success-dark.is-hovered .file-cta { + background-color: #15cf8b; + color: rgba(0, 0, 0, 0.7); } + .file.is-success-dark:focus .file-cta, .file.is-success-dark.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(22, 219, 147, 0.25); + color: rgba(0, 0, 0, 0.7); } + .file.is-success-dark:active .file-cta, .file.is-success-dark.is-active .file-cta { + background-color: #14c483; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning-dark .file-cta { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning-dark:hover .file-cta, .file.is-warning-dark.is-hovered .file-cta { + background-color: #f2dd00; + color: rgba(0, 0, 0, 0.7); } + .file.is-warning-dark:focus .file-cta, .file.is-warning-dark.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(255, 233, 0, 0.25); + color: rgba(0, 0, 0, 0.7); } + .file.is-warning-dark:active .file-cta, .file.is-warning-dark.is-active .file-cta { + background-color: #e6d200; + color: rgba(0, 0, 0, 0.7); } + .file.is-danger-dark .file-cta { + background-color: #f14668; + color: #fff; } + .file.is-danger-dark:hover .file-cta, .file.is-danger-dark.is-hovered .file-cta { + background-color: #f03a5f; + color: #fff; } + .file.is-danger-dark:focus .file-cta, .file.is-danger-dark.is-focused .file-cta { + box-shadow: 0 0 0.5em rgba(241, 70, 104, 0.25); + color: #fff; } + .file.is-danger-dark:active .file-cta, .file.is-danger-dark.is-active .file-cta { + background-color: #ef2e55; + color: #fff; } + .file-label:hover .file-cta { + background-color: #1d1d1d; + color: #dbdbdb; } + .file-label:hover .file-name { + border-color: #2f2f2f; } + .file-label:active .file-cta { + background-color: #171717; + color: #dbdbdb; } + .file-label:active .file-name { + border-color: #292929; } + .file-cta, + .file-name { + border-color: #363636; } + .file-cta { + background-color: #242424; + color: #b5b5b5; } + .file-name { + border-color: #363636; } + .label { + color: #dbdbdb; } + .help.is-white { + color: #e6e6e6; } + .help.is-black { + color: black; } + .help.is-light { + color: #dbdbdb; } + .help.is-dark { + color: #1c1c1c; } + .help.is-primary { + color: #d90052; } + .help.is-link { + color: #d90052; } + .help.is-info { + color: #0075cc; } + .help.is-success { + color: #11ad74; } + .help.is-warning { + color: #ccba00; } + .help.is-danger { + color: #ee1742; } + .help.is-white-dark { + color: white; } + .help.is-black-dark { + color: #0a0a0a; } + .help.is-light-dark { + color: whitesmoke; } + .help.is-dark-dark { + color: #363636; } + .help.is-primary-dark { + color: #ff0d68; } + .help.is-link-dark { + color: #ff0d68; } + .help.is-info-dark { + color: #0092FF; } + .help.is-success-dark { + color: #16DB93; } + .help.is-warning-dark { + color: #FFE900; } + .help.is-danger-dark { + color: #f14668; } + .control.has-icons-left .icon, .control.has-icons-right .icon { + color: #363636; } + .notification { + background-color: #242424; } + .notification code, + .notification pre { + background: #0a0a0a; } + .notification.is-white { + background-color: #e6e6e6; + color: #0a0a0a; } + .notification.is-black { + background-color: black; + color: white; } + .notification.is-light { + background-color: #dbdbdb; + color: rgba(0, 0, 0, 0.7); } + .notification.is-dark { + background-color: #1c1c1c; + color: #fff; } + .notification.is-primary { + background-color: #d90052; + color: #fff; } + .notification.is-link { + background-color: #d90052; + color: #fff; } + .notification.is-info { + background-color: #0075cc; + color: #fff; } + .notification.is-success { + background-color: #11ad74; + color: rgba(0, 0, 0, 0.7); } + .notification.is-warning { + background-color: #ccba00; + color: rgba(0, 0, 0, 0.7); } + .notification.is-danger { + background-color: #ee1742; + color: #fff; } + .notification.is-white-dark { + background-color: white; + color: #0a0a0a; } + .notification.is-black-dark { + background-color: #0a0a0a; + color: white; } + .notification.is-light-dark { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .notification.is-dark-dark { + background-color: #363636; + color: #fff; } + .notification.is-primary-dark { + background-color: #ff0d68; + color: #fff; } + .notification.is-link-dark { + background-color: #ff0d68; + color: #fff; } + .notification.is-info-dark { + background-color: #0092FF; + color: #fff; } + .notification.is-success-dark { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .notification.is-warning-dark { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .notification.is-danger-dark { + background-color: #f14668; + color: #fff; } + .progress::-webkit-progress-bar { + background-color: #363636; } + .progress::-webkit-progress-value { + background-color: #b5b5b5; } + .progress::-moz-progress-bar { + background-color: #b5b5b5; } + .progress::-ms-fill { + background-color: #b5b5b5; } + .progress:indeterminate { + background-color: #363636; + background-image: linear-gradient(to right, #4a4a4a 30%, #363636 30%); } + .progress.is-white::-webkit-progress-value { + background-color: #e6e6e6; } + .progress.is-white::-moz-progress-bar { + background-color: #e6e6e6; } + .progress.is-white::-ms-fill { + background-color: #e6e6e6; } + .progress.is-white:indeterminate { + background-image: linear-gradient(to right, #e6e6e6 30%, #363636 30%); } + .progress.is-black::-webkit-progress-value { + background-color: black; } + .progress.is-black::-moz-progress-bar { + background-color: black; } + .progress.is-black::-ms-fill { + background-color: black; } + .progress.is-black:indeterminate { + background-image: linear-gradient(to right, black 30%, #363636 30%); } + .progress.is-light::-webkit-progress-value { + background-color: #dbdbdb; } + .progress.is-light::-moz-progress-bar { + background-color: #dbdbdb; } + .progress.is-light::-ms-fill { + background-color: #dbdbdb; } + .progress.is-light:indeterminate { + background-image: linear-gradient(to right, #dbdbdb 30%, #363636 30%); } + .progress.is-dark::-webkit-progress-value { + background-color: #1c1c1c; } + .progress.is-dark::-moz-progress-bar { + background-color: #1c1c1c; } + .progress.is-dark::-ms-fill { + background-color: #1c1c1c; } + .progress.is-dark:indeterminate { + background-image: linear-gradient(to right, #1c1c1c 30%, #363636 30%); } + .progress.is-primary::-webkit-progress-value { + background-color: #d90052; } + .progress.is-primary::-moz-progress-bar { + background-color: #d90052; } + .progress.is-primary::-ms-fill { + background-color: #d90052; } + .progress.is-primary:indeterminate { + background-image: linear-gradient(to right, #d90052 30%, #363636 30%); } + .progress.is-link::-webkit-progress-value { + background-color: #d90052; } + .progress.is-link::-moz-progress-bar { + background-color: #d90052; } + .progress.is-link::-ms-fill { + background-color: #d90052; } + .progress.is-link:indeterminate { + background-image: linear-gradient(to right, #d90052 30%, #363636 30%); } + .progress.is-info::-webkit-progress-value { + background-color: #0075cc; } + .progress.is-info::-moz-progress-bar { + background-color: #0075cc; } + .progress.is-info::-ms-fill { + background-color: #0075cc; } + .progress.is-info:indeterminate { + background-image: linear-gradient(to right, #0075cc 30%, #363636 30%); } + .progress.is-success::-webkit-progress-value { + background-color: #11ad74; } + .progress.is-success::-moz-progress-bar { + background-color: #11ad74; } + .progress.is-success::-ms-fill { + background-color: #11ad74; } + .progress.is-success:indeterminate { + background-image: linear-gradient(to right, #11ad74 30%, #363636 30%); } + .progress.is-warning::-webkit-progress-value { + background-color: #ccba00; } + .progress.is-warning::-moz-progress-bar { + background-color: #ccba00; } + .progress.is-warning::-ms-fill { + background-color: #ccba00; } + .progress.is-warning:indeterminate { + background-image: linear-gradient(to right, #ccba00 30%, #363636 30%); } + .progress.is-danger::-webkit-progress-value { + background-color: #ee1742; } + .progress.is-danger::-moz-progress-bar { + background-color: #ee1742; } + .progress.is-danger::-ms-fill { + background-color: #ee1742; } + .progress.is-danger:indeterminate { + background-image: linear-gradient(to right, #ee1742 30%, #363636 30%); } + .progress.is-white-dark::-webkit-progress-value { + background-color: white; } + .progress.is-white-dark::-moz-progress-bar { + background-color: white; } + .progress.is-white-dark::-ms-fill { + background-color: white; } + .progress.is-white-dark:indeterminate { + background-image: linear-gradient(to right, white 30%, #363636 30%); } + .progress.is-black-dark::-webkit-progress-value { + background-color: #0a0a0a; } + .progress.is-black-dark::-moz-progress-bar { + background-color: #0a0a0a; } + .progress.is-black-dark::-ms-fill { + background-color: #0a0a0a; } + .progress.is-black-dark:indeterminate { + background-image: linear-gradient(to right, #0a0a0a 30%, #363636 30%); } + .progress.is-light-dark::-webkit-progress-value { + background-color: whitesmoke; } + .progress.is-light-dark::-moz-progress-bar { + background-color: whitesmoke; } + .progress.is-light-dark::-ms-fill { + background-color: whitesmoke; } + .progress.is-light-dark:indeterminate { + background-image: linear-gradient(to right, whitesmoke 30%, #363636 30%); } + .progress.is-dark-dark::-webkit-progress-value { + background-color: #363636; } + .progress.is-dark-dark::-moz-progress-bar { + background-color: #363636; } + .progress.is-dark-dark::-ms-fill { + background-color: #363636; } + .progress.is-dark-dark:indeterminate { + background-image: linear-gradient(to right, #363636 30%, #363636 30%); } + .progress.is-primary-dark::-webkit-progress-value { + background-color: #ff0d68; } + .progress.is-primary-dark::-moz-progress-bar { + background-color: #ff0d68; } + .progress.is-primary-dark::-ms-fill { + background-color: #ff0d68; } + .progress.is-primary-dark:indeterminate { + background-image: linear-gradient(to right, #ff0d68 30%, #363636 30%); } + .progress.is-link-dark::-webkit-progress-value { + background-color: #ff0d68; } + .progress.is-link-dark::-moz-progress-bar { + background-color: #ff0d68; } + .progress.is-link-dark::-ms-fill { + background-color: #ff0d68; } + .progress.is-link-dark:indeterminate { + background-image: linear-gradient(to right, #ff0d68 30%, #363636 30%); } + .progress.is-info-dark::-webkit-progress-value { + background-color: #0092FF; } + .progress.is-info-dark::-moz-progress-bar { + background-color: #0092FF; } + .progress.is-info-dark::-ms-fill { + background-color: #0092FF; } + .progress.is-info-dark:indeterminate { + background-image: linear-gradient(to right, #0092FF 30%, #363636 30%); } + .progress.is-success-dark::-webkit-progress-value { + background-color: #16DB93; } + .progress.is-success-dark::-moz-progress-bar { + background-color: #16DB93; } + .progress.is-success-dark::-ms-fill { + background-color: #16DB93; } + .progress.is-success-dark:indeterminate { + background-image: linear-gradient(to right, #16DB93 30%, #363636 30%); } + .progress.is-warning-dark::-webkit-progress-value { + background-color: #FFE900; } + .progress.is-warning-dark::-moz-progress-bar { + background-color: #FFE900; } + .progress.is-warning-dark::-ms-fill { + background-color: #FFE900; } + .progress.is-warning-dark:indeterminate { + background-image: linear-gradient(to right, #FFE900 30%, #363636 30%); } + .progress.is-danger-dark::-webkit-progress-value { + background-color: #f14668; } + .progress.is-danger-dark::-moz-progress-bar { + background-color: #f14668; } + .progress.is-danger-dark::-ms-fill { + background-color: #f14668; } + .progress.is-danger-dark:indeterminate { + background-image: linear-gradient(to right, #f14668 30%, #363636 30%); } + .table { + background-color: #0a0a0a; + color: #dbdbdb; } + .table td, + .table th { + border: 1px solid #363636; } + .table td.is-white, + .table th.is-white { + background-color: #e6e6e6; + border-color: #e6e6e6; + color: #0a0a0a; } + .table td.is-black, + .table th.is-black { + background-color: black; + border-color: black; + color: white; } + .table td.is-light, + .table th.is-light { + background-color: #dbdbdb; + border-color: #dbdbdb; + color: rgba(0, 0, 0, 0.7); } + .table td.is-dark, + .table th.is-dark { + background-color: #1c1c1c; + border-color: #1c1c1c; + color: #fff; } + .table td.is-primary, + .table th.is-primary { + background-color: #d90052; + border-color: #d90052; + color: #fff; } + .table td.is-link, + .table th.is-link { + background-color: #d90052; + border-color: #d90052; + color: #fff; } + .table td.is-info, + .table th.is-info { + background-color: #0075cc; + border-color: #0075cc; + color: #fff; } + .table td.is-success, + .table th.is-success { + background-color: #11ad74; + border-color: #11ad74; + color: rgba(0, 0, 0, 0.7); } + .table td.is-warning, + .table th.is-warning { + background-color: #ccba00; + border-color: #ccba00; + color: rgba(0, 0, 0, 0.7); } + .table td.is-danger, + .table th.is-danger { + background-color: #ee1742; + border-color: #ee1742; + color: #fff; } + .table td.is-white-dark, + .table th.is-white-dark { + background-color: white; + border-color: white; + color: #0a0a0a; } + .table td.is-black-dark, + .table th.is-black-dark { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .table td.is-light-dark, + .table th.is-light-dark { + background-color: whitesmoke; + border-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .table td.is-dark-dark, + .table th.is-dark-dark { + background-color: #363636; + border-color: #363636; + color: #fff; } + .table td.is-primary-dark, + .table th.is-primary-dark { + background-color: #ff0d68; + border-color: #ff0d68; + color: #fff; } + .table td.is-link-dark, + .table th.is-link-dark { + background-color: #ff0d68; + border-color: #ff0d68; + color: #fff; } + .table td.is-info-dark, + .table th.is-info-dark { + background-color: #0092FF; + border-color: #0092FF; + color: #fff; } + .table td.is-success-dark, + .table th.is-success-dark { + background-color: #16DB93; + border-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .table td.is-warning-dark, + .table th.is-warning-dark { + background-color: #FFE900; + border-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .table td.is-danger-dark, + .table th.is-danger-dark { + background-color: #f14668; + border-color: #f14668; + color: #fff; } + .table td.is-selected, + .table th.is-selected { + background-color: #e60056; + color: #e6e6e6; } + .table th { + color: #dbdbdb; } + .table tr.is-selected { + background-color: #e60056; + color: #e6e6e6; } + .table tr.is-selected td, + .table tr.is-selected th { + border-color: #e6e6e6; } + .table thead td, + .table thead th { + color: #dbdbdb; } + .table tfoot td, + .table tfoot th { + color: #dbdbdb; } + .table.is-hoverable tbody tr:not(.is-selected):hover { + background-color: #121212; } + .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover { + background-color: #121212; } + .table.is-hoverable.is-striped tbody tr:not(.is-selected):hover:nth-child(even) { + background-color: #242424; } + .table.is-striped tbody tr:not(.is-selected):nth-child(even) { + background-color: #121212; } + .tag:not(body) { + background-color: #242424; + color: #b5b5b5; } + .tag:not(body).is-white { + background-color: #e6e6e6; + color: #0a0a0a; } + .tag:not(body).is-black { + background-color: black; + color: white; } + .tag:not(body).is-light { + background-color: #dbdbdb; + color: rgba(0, 0, 0, 0.7); } + .tag:not(body).is-dark { + background-color: #1c1c1c; + color: #fff; } + .tag:not(body).is-primary { + background-color: #d90052; + color: #fff; } + .tag:not(body).is-link { + background-color: #d90052; + color: #fff; } + .tag:not(body).is-info { + background-color: #0075cc; + color: #fff; } + .tag:not(body).is-success { + background-color: #11ad74; + color: rgba(0, 0, 0, 0.7); } + .tag:not(body).is-warning { + background-color: #ccba00; + color: rgba(0, 0, 0, 0.7); } + .tag:not(body).is-danger { + background-color: #ee1742; + color: #fff; } + .tag:not(body).is-white-dark { + background-color: white; + color: #0a0a0a; } + .tag:not(body).is-black-dark { + background-color: #0a0a0a; + color: white; } + .tag:not(body).is-light-dark { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .tag:not(body).is-dark-dark { + background-color: #363636; + color: #fff; } + .tag:not(body).is-primary-dark { + background-color: #ff0d68; + color: #fff; } + .tag:not(body).is-link-dark { + background-color: #ff0d68; + color: #fff; } + .tag:not(body).is-info-dark { + background-color: #0092FF; + color: #fff; } + .tag:not(body).is-success-dark { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .tag:not(body).is-warning-dark { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .tag:not(body).is-danger-dark { + background-color: #f14668; + color: #fff; } + .tag:not(body).is-delete:hover, .tag:not(body).is-delete:focus { + background-color: #171717; } + .tag:not(body).is-delete:active { + background-color: #0a0a0a; } + .title { + color: #dbdbdb; } + .subtitle { + color: #b5b5b5; } + .subtitle strong { + color: #dbdbdb; } + .number { + background-color: #242424; } + .breadcrumb a { + color: #e60056; } + .breadcrumb a:hover { + color: #dbdbdb; } + .breadcrumb li.is-active a { + color: #dbdbdb; } + .breadcrumb li + li::before { + color: #4a4a4a; } + .card { + background-color: #0a0a0a; + box-shadow: 0 2px 3px rgba(255, 255, 255, 0.1), 0 0 0 1px rgba(255, 255, 255, 0.1); + color: #b5b5b5; } + .card-header { + box-shadow: 0 1px 2px rgba(255, 255, 255, 0.1); } + .card-header-title { + color: #dbdbdb; } + .card-footer { + border-top: 1px solid #363636; } + .card-footer-item:not(:last-child) { + border-right: 1px solid #363636; } + .dropdown-content { + background-color: #0a0a0a; + box-shadow: 0 2px 3px rgba(255, 255, 255, 0.1), 0 0 0 1px rgba(255, 255, 255, 0.1); } + .dropdown-item { + color: #b5b5b5; } + a.dropdown-item:hover, + button.dropdown-item:hover { + background-color: #242424; + color: white; } + a.dropdown-item.is-active, + button.dropdown-item.is-active { + background-color: #e60056; + color: #fff; } + .dropdown-divider { + background-color: #363636; } + .list { + background-color: #0a0a0a; + box-shadow: 0 2px 3px rgba(255, 255, 255, 0.1), 0 0 0 1px rgba(255, 255, 255, 0.1); } + .list-item:not(a) { + color: #b5b5b5; } + .list-item:not(:last-child) { + border-bottom: 1px solid #363636; } + .list-item.is-active { + background-color: #e60056; + color: #fff; } + a.list-item { + background-color: #242424; } + .media .media { + border-top: 1px solid rgba(54, 54, 54, 0.5); } + .media + .media { + border-top: 1px solid rgba(54, 54, 54, 0.5); } + .menu-list a { + color: #b5b5b5; } + .menu-list a:hover { + background-color: #242424; + color: #dbdbdb; } + .menu-list a.is-active { + background-color: #e60056; + color: #fff; } + .menu-list li ul { + border-left: 1px solid #363636; } + .message { + background-color: #242424; } + .message.is-white { + background-color: #242424; } + .message.is-white .message-header { + background-color: white; + color: #0a0a0a; } + .message.is-white .message-body { + border-color: white; + color: #b5b5b5; } + .message.is-black { + background-color: #242424; } + .message.is-black .message-header { + background-color: #0a0a0a; + color: white; } + .message.is-black .message-body { + border-color: #0a0a0a; + color: #b5b5b5; } + .message.is-light { + background-color: #242424; } + .message.is-light .message-header { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .message.is-light .message-body { + border-color: whitesmoke; + color: #b5b5b5; } + .message.is-dark { + background-color: #242424; } + .message.is-dark .message-header { + background-color: #363636; + color: #fff; } + .message.is-dark .message-body { + border-color: #363636; + color: #b5b5b5; } + .message.is-primary { + background-color: #242424; } + .message.is-primary .message-header { + background-color: #ff0d68; + color: #fff; } + .message.is-primary .message-body { + border-color: #ff0d68; + color: #b5b5b5; } + .message.is-link { + background-color: #242424; } + .message.is-link .message-header { + background-color: #ff0d68; + color: #fff; } + .message.is-link .message-body { + border-color: #ff0d68; + color: #b5b5b5; } + .message.is-info { + background-color: #242424; } + .message.is-info .message-header { + background-color: #0092FF; + color: #fff; } + .message.is-info .message-body { + border-color: #0092FF; + color: #b5b5b5; } + .message.is-success { + background-color: #242424; } + .message.is-success .message-header { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .message.is-success .message-body { + border-color: #16DB93; + color: #b5b5b5; } + .message.is-warning { + background-color: #242424; } + .message.is-warning .message-header { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .message.is-warning .message-body { + border-color: #FFE900; + color: #b5b5b5; } + .message.is-danger { + background-color: #242424; } + .message.is-danger .message-header { + background-color: #f14668; + color: #fff; } + .message.is-danger .message-body { + border-color: #f14668; + color: #b5b5b5; } + .message.is-white-dark { + background-color: #242424; } + .message.is-white-dark .message-header { + background-color: white; + color: #0a0a0a; } + .message.is-white-dark .message-body { + border-color: white; + color: #b5b5b5; } + .message.is-black-dark { + background-color: #242424; } + .message.is-black-dark .message-header { + background-color: #0a0a0a; + color: white; } + .message.is-black-dark .message-body { + border-color: #0a0a0a; + color: #b5b5b5; } + .message.is-light-dark { + background-color: #242424; } + .message.is-light-dark .message-header { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .message.is-light-dark .message-body { + border-color: whitesmoke; + color: #b5b5b5; } + .message.is-dark-dark { + background-color: #242424; } + .message.is-dark-dark .message-header { + background-color: #363636; + color: #fff; } + .message.is-dark-dark .message-body { + border-color: #363636; + color: #b5b5b5; } + .message.is-primary-dark { + background-color: #242424; } + .message.is-primary-dark .message-header { + background-color: #ff0d68; + color: #fff; } + .message.is-primary-dark .message-body { + border-color: #ff0d68; + color: #b5b5b5; } + .message.is-link-dark { + background-color: #242424; } + .message.is-link-dark .message-header { + background-color: #ff0d68; + color: #fff; } + .message.is-link-dark .message-body { + border-color: #ff0d68; + color: #b5b5b5; } + .message.is-info-dark { + background-color: #242424; } + .message.is-info-dark .message-header { + background-color: #0092FF; + color: #fff; } + .message.is-info-dark .message-body { + border-color: #0092FF; + color: #b5b5b5; } + .message.is-success-dark { + background-color: #242424; } + .message.is-success-dark .message-header { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .message.is-success-dark .message-body { + border-color: #16DB93; + color: #b5b5b5; } + .message.is-warning-dark { + background-color: #242424; } + .message.is-warning-dark .message-header { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .message.is-warning-dark .message-body { + border-color: #FFE900; + color: #b5b5b5; } + .message.is-danger-dark { + background-color: #242424; } + .message.is-danger-dark .message-header { + background-color: #f14668; + color: #fff; } + .message.is-danger-dark .message-body { + border-color: #f14668; + color: #b5b5b5; } + .message-header { + background-color: #b5b5b5; + color: #fff; } + .message-body { + border-color: #363636; + color: #b5b5b5; } + .message-body code, + .message-body pre { + background-color: #0a0a0a; } + .modal-background { + background-color: rgba(255, 255, 255, 0.86); } + .modal-card-head, + .modal-card-foot { + background-color: #242424; } + .modal-card-head { + border-bottom: 1px solid #363636; } + .modal-card-title { + color: #dbdbdb; } + .modal-card-foot { + border-top: 1px solid #363636; } + .modal-card-body { + -webkit-overflow-scrolling: touch; + background-color: white; } + .navbar { + background-color: #17181c; } + .navbar.is-white { + background-color: #e6e6e6; + color: #0a0a0a; } + .navbar.is-white .navbar-brand > .navbar-item, + .navbar.is-white .navbar-brand .navbar-link { + color: #0a0a0a; } + .navbar.is-white .navbar-brand > a.navbar-item:hover, .navbar.is-white .navbar-brand > a.navbar-item.is-active, + .navbar.is-white .navbar-brand .navbar-link:hover, + .navbar.is-white .navbar-brand .navbar-link.is-active { + background-color: #d9d9d9; + color: #0a0a0a; } + .navbar.is-white .navbar-brand .navbar-link::after { + border-color: #0a0a0a; } + .navbar.is-white .navbar-burger { + color: #0a0a0a; } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-white .navbar-start > .navbar-item, + .navbar.is-white .navbar-start .navbar-link, + .navbar.is-white .navbar-end > .navbar-item, + .navbar.is-white .navbar-end .navbar-link { + color: #0a0a0a; } + .navbar.is-white .navbar-start > a.navbar-item:hover, .navbar.is-white .navbar-start > a.navbar-item.is-active, + .navbar.is-white .navbar-start .navbar-link:hover, + .navbar.is-white .navbar-start .navbar-link.is-active, + .navbar.is-white .navbar-end > a.navbar-item:hover, + .navbar.is-white .navbar-end > a.navbar-item.is-active, + .navbar.is-white .navbar-end .navbar-link:hover, + .navbar.is-white .navbar-end .navbar-link.is-active { + background-color: #d9d9d9; + color: #0a0a0a; } + .navbar.is-white .navbar-start .navbar-link::after, + .navbar.is-white .navbar-end .navbar-link::after { + border-color: #0a0a0a; } + .navbar.is-white .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-white .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #d9d9d9; + color: #0a0a0a; } + .navbar.is-white .navbar-dropdown a.navbar-item.is-active { + background-color: #e6e6e6; + color: #0a0a0a; } } +@media (prefers-color-scheme: dark) { + .navbar.is-black { + background-color: black; + color: white; } + .navbar.is-black .navbar-brand > .navbar-item, + .navbar.is-black .navbar-brand .navbar-link { + color: white; } + .navbar.is-black .navbar-brand > a.navbar-item:hover, .navbar.is-black .navbar-brand > a.navbar-item.is-active, + .navbar.is-black .navbar-brand .navbar-link:hover, + .navbar.is-black .navbar-brand .navbar-link.is-active { + background-color: black; + color: white; } + .navbar.is-black .navbar-brand .navbar-link::after { + border-color: white; } + .navbar.is-black .navbar-burger { + color: white; } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-black .navbar-start > .navbar-item, + .navbar.is-black .navbar-start .navbar-link, + .navbar.is-black .navbar-end > .navbar-item, + .navbar.is-black .navbar-end .navbar-link { + color: white; } + .navbar.is-black .navbar-start > a.navbar-item:hover, .navbar.is-black .navbar-start > a.navbar-item.is-active, + .navbar.is-black .navbar-start .navbar-link:hover, + .navbar.is-black .navbar-start .navbar-link.is-active, + .navbar.is-black .navbar-end > a.navbar-item:hover, + .navbar.is-black .navbar-end > a.navbar-item.is-active, + .navbar.is-black .navbar-end .navbar-link:hover, + .navbar.is-black .navbar-end .navbar-link.is-active { + background-color: black; + color: white; } + .navbar.is-black .navbar-start .navbar-link::after, + .navbar.is-black .navbar-end .navbar-link::after { + border-color: white; } + .navbar.is-black .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-black .navbar-item.has-dropdown.is-active .navbar-link { + background-color: black; + color: white; } + .navbar.is-black .navbar-dropdown a.navbar-item.is-active { + background-color: black; + color: white; } } +@media (prefers-color-scheme: dark) { + .navbar.is-light { + background-color: #dbdbdb; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-brand > .navbar-item, + .navbar.is-light .navbar-brand .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-brand > a.navbar-item:hover, .navbar.is-light .navbar-brand > a.navbar-item.is-active, + .navbar.is-light .navbar-brand .navbar-link:hover, + .navbar.is-light .navbar-brand .navbar-link.is-active { + background-color: #cfcfcf; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-brand .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-burger { + color: rgba(0, 0, 0, 0.7); } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-light .navbar-start > .navbar-item, + .navbar.is-light .navbar-start .navbar-link, + .navbar.is-light .navbar-end > .navbar-item, + .navbar.is-light .navbar-end .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-start > a.navbar-item:hover, .navbar.is-light .navbar-start > a.navbar-item.is-active, + .navbar.is-light .navbar-start .navbar-link:hover, + .navbar.is-light .navbar-start .navbar-link.is-active, + .navbar.is-light .navbar-end > a.navbar-item:hover, + .navbar.is-light .navbar-end > a.navbar-item.is-active, + .navbar.is-light .navbar-end .navbar-link:hover, + .navbar.is-light .navbar-end .navbar-link.is-active { + background-color: #cfcfcf; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-start .navbar-link::after, + .navbar.is-light .navbar-end .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-light .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #cfcfcf; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light .navbar-dropdown a.navbar-item.is-active { + background-color: #dbdbdb; + color: rgba(0, 0, 0, 0.7); } } +@media (prefers-color-scheme: dark) { + .navbar.is-dark { + background-color: #1c1c1c; + color: #fff; } + .navbar.is-dark .navbar-brand > .navbar-item, + .navbar.is-dark .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-dark .navbar-brand > a.navbar-item:hover, .navbar.is-dark .navbar-brand > a.navbar-item.is-active, + .navbar.is-dark .navbar-brand .navbar-link:hover, + .navbar.is-dark .navbar-brand .navbar-link.is-active { + background-color: #0f0f0f; + color: #fff; } + .navbar.is-dark .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-dark .navbar-burger { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-dark .navbar-start > .navbar-item, + .navbar.is-dark .navbar-start .navbar-link, + .navbar.is-dark .navbar-end > .navbar-item, + .navbar.is-dark .navbar-end .navbar-link { + color: #fff; } + .navbar.is-dark .navbar-start > a.navbar-item:hover, .navbar.is-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-dark .navbar-start .navbar-link:hover, + .navbar.is-dark .navbar-start .navbar-link.is-active, + .navbar.is-dark .navbar-end > a.navbar-item:hover, + .navbar.is-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-dark .navbar-end .navbar-link:hover, + .navbar.is-dark .navbar-end .navbar-link.is-active { + background-color: #0f0f0f; + color: #fff; } + .navbar.is-dark .navbar-start .navbar-link::after, + .navbar.is-dark .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #0f0f0f; + color: #fff; } + .navbar.is-dark .navbar-dropdown a.navbar-item.is-active { + background-color: #1c1c1c; + color: #fff; } } +@media (prefers-color-scheme: dark) { + .navbar.is-primary { + background-color: #d90052; + color: #fff; } + .navbar.is-primary .navbar-brand > .navbar-item, + .navbar.is-primary .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-primary .navbar-brand > a.navbar-item:hover, .navbar.is-primary .navbar-brand > a.navbar-item.is-active, + .navbar.is-primary .navbar-brand .navbar-link:hover, + .navbar.is-primary .navbar-brand .navbar-link.is-active { + background-color: #c00048; + color: #fff; } + .navbar.is-primary .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-primary .navbar-burger { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-primary .navbar-start > .navbar-item, + .navbar.is-primary .navbar-start .navbar-link, + .navbar.is-primary .navbar-end > .navbar-item, + .navbar.is-primary .navbar-end .navbar-link { + color: #fff; } + .navbar.is-primary .navbar-start > a.navbar-item:hover, .navbar.is-primary .navbar-start > a.navbar-item.is-active, + .navbar.is-primary .navbar-start .navbar-link:hover, + .navbar.is-primary .navbar-start .navbar-link.is-active, + .navbar.is-primary .navbar-end > a.navbar-item:hover, + .navbar.is-primary .navbar-end > a.navbar-item.is-active, + .navbar.is-primary .navbar-end .navbar-link:hover, + .navbar.is-primary .navbar-end .navbar-link.is-active { + background-color: #c00048; + color: #fff; } + .navbar.is-primary .navbar-start .navbar-link::after, + .navbar.is-primary .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-primary .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-primary .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #c00048; + color: #fff; } + .navbar.is-primary .navbar-dropdown a.navbar-item.is-active { + background-color: #d90052; + color: #fff; } } +@media (prefers-color-scheme: dark) { + .navbar.is-link { + background-color: #d90052; + color: #fff; } + .navbar.is-link .navbar-brand > .navbar-item, + .navbar.is-link .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-link .navbar-brand > a.navbar-item:hover, .navbar.is-link .navbar-brand > a.navbar-item.is-active, + .navbar.is-link .navbar-brand .navbar-link:hover, + .navbar.is-link .navbar-brand .navbar-link.is-active { + background-color: #c00048; + color: #fff; } + .navbar.is-link .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-link .navbar-burger { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-link .navbar-start > .navbar-item, + .navbar.is-link .navbar-start .navbar-link, + .navbar.is-link .navbar-end > .navbar-item, + .navbar.is-link .navbar-end .navbar-link { + color: #fff; } + .navbar.is-link .navbar-start > a.navbar-item:hover, .navbar.is-link .navbar-start > a.navbar-item.is-active, + .navbar.is-link .navbar-start .navbar-link:hover, + .navbar.is-link .navbar-start .navbar-link.is-active, + .navbar.is-link .navbar-end > a.navbar-item:hover, + .navbar.is-link .navbar-end > a.navbar-item.is-active, + .navbar.is-link .navbar-end .navbar-link:hover, + .navbar.is-link .navbar-end .navbar-link.is-active { + background-color: #c00048; + color: #fff; } + .navbar.is-link .navbar-start .navbar-link::after, + .navbar.is-link .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-link .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-link .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #c00048; + color: #fff; } + .navbar.is-link .navbar-dropdown a.navbar-item.is-active { + background-color: #d90052; + color: #fff; } } +@media (prefers-color-scheme: dark) { + .navbar.is-info { + background-color: #0075cc; + color: #fff; } + .navbar.is-info .navbar-brand > .navbar-item, + .navbar.is-info .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-info .navbar-brand > a.navbar-item:hover, .navbar.is-info .navbar-brand > a.navbar-item.is-active, + .navbar.is-info .navbar-brand .navbar-link:hover, + .navbar.is-info .navbar-brand .navbar-link.is-active { + background-color: #0066b3; + color: #fff; } + .navbar.is-info .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-info .navbar-burger { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-info .navbar-start > .navbar-item, + .navbar.is-info .navbar-start .navbar-link, + .navbar.is-info .navbar-end > .navbar-item, + .navbar.is-info .navbar-end .navbar-link { + color: #fff; } + .navbar.is-info .navbar-start > a.navbar-item:hover, .navbar.is-info .navbar-start > a.navbar-item.is-active, + .navbar.is-info .navbar-start .navbar-link:hover, + .navbar.is-info .navbar-start .navbar-link.is-active, + .navbar.is-info .navbar-end > a.navbar-item:hover, + .navbar.is-info .navbar-end > a.navbar-item.is-active, + .navbar.is-info .navbar-end .navbar-link:hover, + .navbar.is-info .navbar-end .navbar-link.is-active { + background-color: #0066b3; + color: #fff; } + .navbar.is-info .navbar-start .navbar-link::after, + .navbar.is-info .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-info .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-info .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #0066b3; + color: #fff; } + .navbar.is-info .navbar-dropdown a.navbar-item.is-active { + background-color: #0075cc; + color: #fff; } } +@media (prefers-color-scheme: dark) { + .navbar.is-success { + background-color: #11ad74; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-brand > .navbar-item, + .navbar.is-success .navbar-brand .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-brand > a.navbar-item:hover, .navbar.is-success .navbar-brand > a.navbar-item.is-active, + .navbar.is-success .navbar-brand .navbar-link:hover, + .navbar.is-success .navbar-brand .navbar-link.is-active { + background-color: #0f9564; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-brand .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-burger { + color: rgba(0, 0, 0, 0.7); } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-success .navbar-start > .navbar-item, + .navbar.is-success .navbar-start .navbar-link, + .navbar.is-success .navbar-end > .navbar-item, + .navbar.is-success .navbar-end .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-start > a.navbar-item:hover, .navbar.is-success .navbar-start > a.navbar-item.is-active, + .navbar.is-success .navbar-start .navbar-link:hover, + .navbar.is-success .navbar-start .navbar-link.is-active, + .navbar.is-success .navbar-end > a.navbar-item:hover, + .navbar.is-success .navbar-end > a.navbar-item.is-active, + .navbar.is-success .navbar-end .navbar-link:hover, + .navbar.is-success .navbar-end .navbar-link.is-active { + background-color: #0f9564; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-start .navbar-link::after, + .navbar.is-success .navbar-end .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-success .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #0f9564; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success .navbar-dropdown a.navbar-item.is-active { + background-color: #11ad74; + color: rgba(0, 0, 0, 0.7); } } +@media (prefers-color-scheme: dark) { + .navbar.is-warning { + background-color: #ccba00; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand > .navbar-item, + .navbar.is-warning .navbar-brand .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand > a.navbar-item:hover, .navbar.is-warning .navbar-brand > a.navbar-item.is-active, + .navbar.is-warning .navbar-brand .navbar-link:hover, + .navbar.is-warning .navbar-brand .navbar-link.is-active { + background-color: #b3a300; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-brand .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-burger { + color: rgba(0, 0, 0, 0.7); } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-warning .navbar-start > .navbar-item, + .navbar.is-warning .navbar-start .navbar-link, + .navbar.is-warning .navbar-end > .navbar-item, + .navbar.is-warning .navbar-end .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-start > a.navbar-item:hover, .navbar.is-warning .navbar-start > a.navbar-item.is-active, + .navbar.is-warning .navbar-start .navbar-link:hover, + .navbar.is-warning .navbar-start .navbar-link.is-active, + .navbar.is-warning .navbar-end > a.navbar-item:hover, + .navbar.is-warning .navbar-end > a.navbar-item.is-active, + .navbar.is-warning .navbar-end .navbar-link:hover, + .navbar.is-warning .navbar-end .navbar-link.is-active { + background-color: #b3a300; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-start .navbar-link::after, + .navbar.is-warning .navbar-end .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-warning .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #b3a300; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning .navbar-dropdown a.navbar-item.is-active { + background-color: #ccba00; + color: rgba(0, 0, 0, 0.7); } } +@media (prefers-color-scheme: dark) { + .navbar.is-danger { + background-color: #ee1742; + color: #fff; } + .navbar.is-danger .navbar-brand > .navbar-item, + .navbar.is-danger .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-danger .navbar-brand > a.navbar-item:hover, .navbar.is-danger .navbar-brand > a.navbar-item.is-active, + .navbar.is-danger .navbar-brand .navbar-link:hover, + .navbar.is-danger .navbar-brand .navbar-link.is-active { + background-color: #da1039; + color: #fff; } + .navbar.is-danger .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-danger .navbar-burger { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-danger .navbar-start > .navbar-item, + .navbar.is-danger .navbar-start .navbar-link, + .navbar.is-danger .navbar-end > .navbar-item, + .navbar.is-danger .navbar-end .navbar-link { + color: #fff; } + .navbar.is-danger .navbar-start > a.navbar-item:hover, .navbar.is-danger .navbar-start > a.navbar-item.is-active, + .navbar.is-danger .navbar-start .navbar-link:hover, + .navbar.is-danger .navbar-start .navbar-link.is-active, + .navbar.is-danger .navbar-end > a.navbar-item:hover, + .navbar.is-danger .navbar-end > a.navbar-item.is-active, + .navbar.is-danger .navbar-end .navbar-link:hover, + .navbar.is-danger .navbar-end .navbar-link.is-active { + background-color: #da1039; + color: #fff; } + .navbar.is-danger .navbar-start .navbar-link::after, + .navbar.is-danger .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-danger .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-danger .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #da1039; + color: #fff; } + .navbar.is-danger .navbar-dropdown a.navbar-item.is-active { + background-color: #ee1742; + color: #fff; } } +@media (prefers-color-scheme: dark) { + .navbar.is-white-dark { + background-color: white; + color: #0a0a0a; } + .navbar.is-white-dark .navbar-brand > .navbar-item, + .navbar.is-white-dark .navbar-brand .navbar-link { + color: #0a0a0a; } + .navbar.is-white-dark .navbar-brand > a.navbar-item:hover, .navbar.is-white-dark .navbar-brand > a.navbar-item.is-active, + .navbar.is-white-dark .navbar-brand .navbar-link:hover, + .navbar.is-white-dark .navbar-brand .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white-dark .navbar-brand .navbar-link::after { + border-color: #0a0a0a; } + .navbar.is-white-dark .navbar-burger { + color: #0a0a0a; } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-white-dark .navbar-start > .navbar-item, + .navbar.is-white-dark .navbar-start .navbar-link, + .navbar.is-white-dark .navbar-end > .navbar-item, + .navbar.is-white-dark .navbar-end .navbar-link { + color: #0a0a0a; } + .navbar.is-white-dark .navbar-start > a.navbar-item:hover, .navbar.is-white-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-white-dark .navbar-start .navbar-link:hover, + .navbar.is-white-dark .navbar-start .navbar-link.is-active, + .navbar.is-white-dark .navbar-end > a.navbar-item:hover, + .navbar.is-white-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-white-dark .navbar-end .navbar-link:hover, + .navbar.is-white-dark .navbar-end .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white-dark .navbar-start .navbar-link::after, + .navbar.is-white-dark .navbar-end .navbar-link::after { + border-color: #0a0a0a; } + .navbar.is-white-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-white-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f2f2f2; + color: #0a0a0a; } + .navbar.is-white-dark .navbar-dropdown a.navbar-item.is-active { + background-color: white; + color: #0a0a0a; } } +@media (prefers-color-scheme: dark) { + .navbar.is-black-dark { + background-color: #0a0a0a; + color: white; } + .navbar.is-black-dark .navbar-brand > .navbar-item, + .navbar.is-black-dark .navbar-brand .navbar-link { + color: white; } + .navbar.is-black-dark .navbar-brand > a.navbar-item:hover, .navbar.is-black-dark .navbar-brand > a.navbar-item.is-active, + .navbar.is-black-dark .navbar-brand .navbar-link:hover, + .navbar.is-black-dark .navbar-brand .navbar-link.is-active { + background-color: black; + color: white; } + .navbar.is-black-dark .navbar-brand .navbar-link::after { + border-color: white; } + .navbar.is-black-dark .navbar-burger { + color: white; } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-black-dark .navbar-start > .navbar-item, + .navbar.is-black-dark .navbar-start .navbar-link, + .navbar.is-black-dark .navbar-end > .navbar-item, + .navbar.is-black-dark .navbar-end .navbar-link { + color: white; } + .navbar.is-black-dark .navbar-start > a.navbar-item:hover, .navbar.is-black-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-black-dark .navbar-start .navbar-link:hover, + .navbar.is-black-dark .navbar-start .navbar-link.is-active, + .navbar.is-black-dark .navbar-end > a.navbar-item:hover, + .navbar.is-black-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-black-dark .navbar-end .navbar-link:hover, + .navbar.is-black-dark .navbar-end .navbar-link.is-active { + background-color: black; + color: white; } + .navbar.is-black-dark .navbar-start .navbar-link::after, + .navbar.is-black-dark .navbar-end .navbar-link::after { + border-color: white; } + .navbar.is-black-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-black-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: black; + color: white; } + .navbar.is-black-dark .navbar-dropdown a.navbar-item.is-active { + background-color: #0a0a0a; + color: white; } } +@media (prefers-color-scheme: dark) { + .navbar.is-light-dark { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light-dark .navbar-brand > .navbar-item, + .navbar.is-light-dark .navbar-brand .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light-dark .navbar-brand > a.navbar-item:hover, .navbar.is-light-dark .navbar-brand > a.navbar-item.is-active, + .navbar.is-light-dark .navbar-brand .navbar-link:hover, + .navbar.is-light-dark .navbar-brand .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light-dark .navbar-brand .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-light-dark .navbar-burger { + color: rgba(0, 0, 0, 0.7); } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-light-dark .navbar-start > .navbar-item, + .navbar.is-light-dark .navbar-start .navbar-link, + .navbar.is-light-dark .navbar-end > .navbar-item, + .navbar.is-light-dark .navbar-end .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light-dark .navbar-start > a.navbar-item:hover, .navbar.is-light-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-light-dark .navbar-start .navbar-link:hover, + .navbar.is-light-dark .navbar-start .navbar-link.is-active, + .navbar.is-light-dark .navbar-end > a.navbar-item:hover, + .navbar.is-light-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-light-dark .navbar-end .navbar-link:hover, + .navbar.is-light-dark .navbar-end .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light-dark .navbar-start .navbar-link::after, + .navbar.is-light-dark .navbar-end .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-light-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-light-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e8e8e8; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-light-dark .navbar-dropdown a.navbar-item.is-active { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } } +@media (prefers-color-scheme: dark) { + .navbar.is-dark-dark { + background-color: #363636; + color: #fff; } + .navbar.is-dark-dark .navbar-brand > .navbar-item, + .navbar.is-dark-dark .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-dark-dark .navbar-brand > a.navbar-item:hover, .navbar.is-dark-dark .navbar-brand > a.navbar-item.is-active, + .navbar.is-dark-dark .navbar-brand .navbar-link:hover, + .navbar.is-dark-dark .navbar-brand .navbar-link.is-active { + background-color: #292929; + color: #fff; } + .navbar.is-dark-dark .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-dark-dark .navbar-burger { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-dark-dark .navbar-start > .navbar-item, + .navbar.is-dark-dark .navbar-start .navbar-link, + .navbar.is-dark-dark .navbar-end > .navbar-item, + .navbar.is-dark-dark .navbar-end .navbar-link { + color: #fff; } + .navbar.is-dark-dark .navbar-start > a.navbar-item:hover, .navbar.is-dark-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-dark-dark .navbar-start .navbar-link:hover, + .navbar.is-dark-dark .navbar-start .navbar-link.is-active, + .navbar.is-dark-dark .navbar-end > a.navbar-item:hover, + .navbar.is-dark-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-dark-dark .navbar-end .navbar-link:hover, + .navbar.is-dark-dark .navbar-end .navbar-link.is-active { + background-color: #292929; + color: #fff; } + .navbar.is-dark-dark .navbar-start .navbar-link::after, + .navbar.is-dark-dark .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-dark-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-dark-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #292929; + color: #fff; } + .navbar.is-dark-dark .navbar-dropdown a.navbar-item.is-active { + background-color: #363636; + color: #fff; } } +@media (prefers-color-scheme: dark) { + .navbar.is-primary-dark { + background-color: #ff0d68; + color: #fff; } + .navbar.is-primary-dark .navbar-brand > .navbar-item, + .navbar.is-primary-dark .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-primary-dark .navbar-brand > a.navbar-item:hover, .navbar.is-primary-dark .navbar-brand > a.navbar-item.is-active, + .navbar.is-primary-dark .navbar-brand .navbar-link:hover, + .navbar.is-primary-dark .navbar-brand .navbar-link.is-active { + background-color: #f3005b; + color: #fff; } + .navbar.is-primary-dark .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-primary-dark .navbar-burger { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-primary-dark .navbar-start > .navbar-item, + .navbar.is-primary-dark .navbar-start .navbar-link, + .navbar.is-primary-dark .navbar-end > .navbar-item, + .navbar.is-primary-dark .navbar-end .navbar-link { + color: #fff; } + .navbar.is-primary-dark .navbar-start > a.navbar-item:hover, .navbar.is-primary-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-primary-dark .navbar-start .navbar-link:hover, + .navbar.is-primary-dark .navbar-start .navbar-link.is-active, + .navbar.is-primary-dark .navbar-end > a.navbar-item:hover, + .navbar.is-primary-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-primary-dark .navbar-end .navbar-link:hover, + .navbar.is-primary-dark .navbar-end .navbar-link.is-active { + background-color: #f3005b; + color: #fff; } + .navbar.is-primary-dark .navbar-start .navbar-link::after, + .navbar.is-primary-dark .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-primary-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-primary-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f3005b; + color: #fff; } + .navbar.is-primary-dark .navbar-dropdown a.navbar-item.is-active { + background-color: #ff0d68; + color: #fff; } } +@media (prefers-color-scheme: dark) { + .navbar.is-link-dark { + background-color: #ff0d68; + color: #fff; } + .navbar.is-link-dark .navbar-brand > .navbar-item, + .navbar.is-link-dark .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-link-dark .navbar-brand > a.navbar-item:hover, .navbar.is-link-dark .navbar-brand > a.navbar-item.is-active, + .navbar.is-link-dark .navbar-brand .navbar-link:hover, + .navbar.is-link-dark .navbar-brand .navbar-link.is-active { + background-color: #f3005b; + color: #fff; } + .navbar.is-link-dark .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-link-dark .navbar-burger { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-link-dark .navbar-start > .navbar-item, + .navbar.is-link-dark .navbar-start .navbar-link, + .navbar.is-link-dark .navbar-end > .navbar-item, + .navbar.is-link-dark .navbar-end .navbar-link { + color: #fff; } + .navbar.is-link-dark .navbar-start > a.navbar-item:hover, .navbar.is-link-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-link-dark .navbar-start .navbar-link:hover, + .navbar.is-link-dark .navbar-start .navbar-link.is-active, + .navbar.is-link-dark .navbar-end > a.navbar-item:hover, + .navbar.is-link-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-link-dark .navbar-end .navbar-link:hover, + .navbar.is-link-dark .navbar-end .navbar-link.is-active { + background-color: #f3005b; + color: #fff; } + .navbar.is-link-dark .navbar-start .navbar-link::after, + .navbar.is-link-dark .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-link-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-link-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #f3005b; + color: #fff; } + .navbar.is-link-dark .navbar-dropdown a.navbar-item.is-active { + background-color: #ff0d68; + color: #fff; } } +@media (prefers-color-scheme: dark) { + .navbar.is-info-dark { + background-color: #0092FF; + color: #fff; } + .navbar.is-info-dark .navbar-brand > .navbar-item, + .navbar.is-info-dark .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-info-dark .navbar-brand > a.navbar-item:hover, .navbar.is-info-dark .navbar-brand > a.navbar-item.is-active, + .navbar.is-info-dark .navbar-brand .navbar-link:hover, + .navbar.is-info-dark .navbar-brand .navbar-link.is-active { + background-color: #0083e6; + color: #fff; } + .navbar.is-info-dark .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-info-dark .navbar-burger { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-info-dark .navbar-start > .navbar-item, + .navbar.is-info-dark .navbar-start .navbar-link, + .navbar.is-info-dark .navbar-end > .navbar-item, + .navbar.is-info-dark .navbar-end .navbar-link { + color: #fff; } + .navbar.is-info-dark .navbar-start > a.navbar-item:hover, .navbar.is-info-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-info-dark .navbar-start .navbar-link:hover, + .navbar.is-info-dark .navbar-start .navbar-link.is-active, + .navbar.is-info-dark .navbar-end > a.navbar-item:hover, + .navbar.is-info-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-info-dark .navbar-end .navbar-link:hover, + .navbar.is-info-dark .navbar-end .navbar-link.is-active { + background-color: #0083e6; + color: #fff; } + .navbar.is-info-dark .navbar-start .navbar-link::after, + .navbar.is-info-dark .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-info-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-info-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #0083e6; + color: #fff; } + .navbar.is-info-dark .navbar-dropdown a.navbar-item.is-active { + background-color: #0092FF; + color: #fff; } } +@media (prefers-color-scheme: dark) { + .navbar.is-success-dark { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success-dark .navbar-brand > .navbar-item, + .navbar.is-success-dark .navbar-brand .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success-dark .navbar-brand > a.navbar-item:hover, .navbar.is-success-dark .navbar-brand > a.navbar-item.is-active, + .navbar.is-success-dark .navbar-brand .navbar-link:hover, + .navbar.is-success-dark .navbar-brand .navbar-link.is-active { + background-color: #14c483; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success-dark .navbar-brand .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-success-dark .navbar-burger { + color: rgba(0, 0, 0, 0.7); } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-success-dark .navbar-start > .navbar-item, + .navbar.is-success-dark .navbar-start .navbar-link, + .navbar.is-success-dark .navbar-end > .navbar-item, + .navbar.is-success-dark .navbar-end .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success-dark .navbar-start > a.navbar-item:hover, .navbar.is-success-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-success-dark .navbar-start .navbar-link:hover, + .navbar.is-success-dark .navbar-start .navbar-link.is-active, + .navbar.is-success-dark .navbar-end > a.navbar-item:hover, + .navbar.is-success-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-success-dark .navbar-end .navbar-link:hover, + .navbar.is-success-dark .navbar-end .navbar-link.is-active { + background-color: #14c483; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success-dark .navbar-start .navbar-link::after, + .navbar.is-success-dark .navbar-end .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-success-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-success-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #14c483; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-success-dark .navbar-dropdown a.navbar-item.is-active { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } } +@media (prefers-color-scheme: dark) { + .navbar.is-warning-dark { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning-dark .navbar-brand > .navbar-item, + .navbar.is-warning-dark .navbar-brand .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning-dark .navbar-brand > a.navbar-item:hover, .navbar.is-warning-dark .navbar-brand > a.navbar-item.is-active, + .navbar.is-warning-dark .navbar-brand .navbar-link:hover, + .navbar.is-warning-dark .navbar-brand .navbar-link.is-active { + background-color: #e6d200; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning-dark .navbar-brand .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning-dark .navbar-burger { + color: rgba(0, 0, 0, 0.7); } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-warning-dark .navbar-start > .navbar-item, + .navbar.is-warning-dark .navbar-start .navbar-link, + .navbar.is-warning-dark .navbar-end > .navbar-item, + .navbar.is-warning-dark .navbar-end .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning-dark .navbar-start > a.navbar-item:hover, .navbar.is-warning-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-warning-dark .navbar-start .navbar-link:hover, + .navbar.is-warning-dark .navbar-start .navbar-link.is-active, + .navbar.is-warning-dark .navbar-end > a.navbar-item:hover, + .navbar.is-warning-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-warning-dark .navbar-end .navbar-link:hover, + .navbar.is-warning-dark .navbar-end .navbar-link.is-active { + background-color: #e6d200; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning-dark .navbar-start .navbar-link::after, + .navbar.is-warning-dark .navbar-end .navbar-link::after { + border-color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-warning-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #e6d200; + color: rgba(0, 0, 0, 0.7); } + .navbar.is-warning-dark .navbar-dropdown a.navbar-item.is-active { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } } +@media (prefers-color-scheme: dark) { + .navbar.is-danger-dark { + background-color: #f14668; + color: #fff; } + .navbar.is-danger-dark .navbar-brand > .navbar-item, + .navbar.is-danger-dark .navbar-brand .navbar-link { + color: #fff; } + .navbar.is-danger-dark .navbar-brand > a.navbar-item:hover, .navbar.is-danger-dark .navbar-brand > a.navbar-item.is-active, + .navbar.is-danger-dark .navbar-brand .navbar-link:hover, + .navbar.is-danger-dark .navbar-brand .navbar-link.is-active { + background-color: #ef2e55; + color: #fff; } + .navbar.is-danger-dark .navbar-brand .navbar-link::after { + border-color: #fff; } + .navbar.is-danger-dark .navbar-burger { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-danger-dark .navbar-start > .navbar-item, + .navbar.is-danger-dark .navbar-start .navbar-link, + .navbar.is-danger-dark .navbar-end > .navbar-item, + .navbar.is-danger-dark .navbar-end .navbar-link { + color: #fff; } + .navbar.is-danger-dark .navbar-start > a.navbar-item:hover, .navbar.is-danger-dark .navbar-start > a.navbar-item.is-active, + .navbar.is-danger-dark .navbar-start .navbar-link:hover, + .navbar.is-danger-dark .navbar-start .navbar-link.is-active, + .navbar.is-danger-dark .navbar-end > a.navbar-item:hover, + .navbar.is-danger-dark .navbar-end > a.navbar-item.is-active, + .navbar.is-danger-dark .navbar-end .navbar-link:hover, + .navbar.is-danger-dark .navbar-end .navbar-link.is-active { + background-color: #ef2e55; + color: #fff; } + .navbar.is-danger-dark .navbar-start .navbar-link::after, + .navbar.is-danger-dark .navbar-end .navbar-link::after { + border-color: #fff; } + .navbar.is-danger-dark .navbar-item.has-dropdown:hover .navbar-link, + .navbar.is-danger-dark .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #ef2e55; + color: #fff; } + .navbar.is-danger-dark .navbar-dropdown a.navbar-item.is-active { + background-color: #f14668; + color: #fff; } } +@media (prefers-color-scheme: dark) { + .navbar.has-shadow { + box-shadow: 0 2px 0 0 #242424; } + .navbar.is-fixed-bottom.has-shadow { + box-shadow: 0 -2px 0 0 #242424; } + .navbar-burger { + color: #b5b5b5; } + .navbar-item, + .navbar-link { + color: #b5b5b5; } + a.navbar-item:hover, a.navbar-item.is-active, + .navbar-link:hover, + .navbar-link.is-active { + background-color: #121212; + color: #e60056; } + .navbar-item:hover { + border-bottom-color: #e60056; } + .navbar-item.is-active { + border-bottom-color: #e60056; + color: #e60056; } + .navbar-link:not(.is-arrowless)::after { + border-color: #e60056; } + .navbar-divider { + background-color: #242424; } } + +@media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .navbar-menu { + background-color: #17181c; + box-shadow: 0 8px 16px rgba(255, 255, 255, 0.1); } + .navbar.is-fixed-bottom-touch.has-shadow { + box-shadow: 0 -2px 3px rgba(255, 255, 255, 0.1); } } + +@media screen and (prefers-color-scheme: dark) and (min-width: 1024px) { + .navbar.is-transparent .navbar-dropdown a.navbar-item:hover { + background-color: #242424; + color: white; } + .navbar.is-transparent .navbar-dropdown a.navbar-item.is-active { + background-color: #242424; + color: #e60056; } + .navbar-item.has-dropdown-up .navbar-dropdown { + border-bottom: 2px solid #363636; + box-shadow: 0 -8px 8px rgba(255, 255, 255, 0.1); } + .navbar-dropdown { + background-color: #0a0a0a; + border-top: 2px solid #363636; + box-shadow: 0 8px 8px rgba(255, 255, 255, 0.1); } + .navbar-dropdown a.navbar-item:hover { + background-color: #242424; + color: white; } + .navbar-dropdown a.navbar-item.is-active { + background-color: #242424; + color: #e60056; } + .navbar.is-spaced .navbar-dropdown, .navbar-dropdown.is-boxed { + box-shadow: 0 8px 8px rgba(255, 255, 255, 0.1), 0 0 0 1px rgba(255, 255, 255, 0.1); } + .navbar.is-fixed-bottom-desktop.has-shadow { + box-shadow: 0 -2px 3px rgba(255, 255, 255, 0.1); } + a.navbar-item.is-active, + .navbar-link.is-active { + color: white; } + .navbar-item.has-dropdown:hover .navbar-link, .navbar-item.has-dropdown.is-active .navbar-link { + background-color: #121212; } } + +@media (prefers-color-scheme: dark) { + .pagination-previous, + .pagination-next, + .pagination-link { + border-color: #363636; + color: #dbdbdb; } + .pagination-previous:hover, + .pagination-next:hover, + .pagination-link:hover { + border-color: #4a4a4a; + color: #dbdbdb; } + .pagination-previous:focus, + .pagination-next:focus, + .pagination-link:focus { + border-color: #5ea3e4; } + .pagination-previous:active, + .pagination-next:active, + .pagination-link:active { + box-shadow: inset 0 1px 2px rgba(255, 255, 255, 0.2); } + .pagination-previous[disabled], + .pagination-next[disabled], + .pagination-link[disabled] { + background-color: #363636; + border-color: #363636; + color: #7a7a7a; } + .pagination-link.is-current { + background-color: #e60056; + border-color: #e60056; + color: #fff; } + .pagination-ellipsis { + color: #4a4a4a; } + .panel-heading, + .panel-tabs, + .panel-block { + border-bottom: 1px solid #363636; + border-left: 1px solid #363636; + border-right: 1px solid #363636; } + .panel-heading:first-child, + .panel-tabs:first-child, + .panel-block:first-child { + border-top: 1px solid #363636; } + .panel-heading { + background-color: #242424; + color: #dbdbdb; } + .panel-tabs a { + border-bottom: 1px solid #363636; } + .panel-tabs a.is-active { + border-bottom-color: #b5b5b5; + color: #dbdbdb; } + .panel-list a { + color: #b5b5b5; } + .panel-list a:hover { + color: #e60056; } + .panel-block { + color: #dbdbdb; } + .panel-block.is-active { + border-left-color: #e60056; + color: #dbdbdb; } + .panel-block.is-active .panel-icon { + color: #e60056; } + a.panel-block:hover, + label.panel-block:hover { + background-color: #242424; } + .tabs a { + border-bottom-color: #363636; + color: #b5b5b5; } + .tabs a:hover { + border-bottom-color: #dbdbdb; + color: #dbdbdb; } + .tabs li.is-active a { + border-bottom-color: #e60056; + color: #e60056; } + .tabs ul { + border-bottom-color: #363636; } + .tabs.is-boxed a:hover { + background-color: #242424; + border-bottom-color: #363636; } + .tabs.is-boxed li.is-active a { + background-color: #0a0a0a; + border-color: #363636; } + .tabs.is-toggle a { + border-color: #363636; } + .tabs.is-toggle a:hover { + background-color: #242424; + border-color: #4a4a4a; } + .tabs.is-toggle li.is-active a { + background-color: #e60056; + border-color: #e60056; + color: #fff; } + .hero.is-white, .hero.is-white-dark { + background-color: #e6e6e6; + color: #0a0a0a; } + .hero.is-white a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-white strong, .hero.is-white-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-white-dark strong { + color: inherit; } + .hero.is-white .title, .hero.is-white-dark .title { + color: #0a0a0a; } + .hero.is-white .subtitle, .hero.is-white-dark .subtitle { + color: rgba(10, 10, 10, 0.9); } + .hero.is-white .subtitle a:not(.button), + .hero.is-white .subtitle strong, .hero.is-white-dark .subtitle a:not(.button), + .hero.is-white-dark .subtitle strong { + color: #0a0a0a; } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-white .navbar-menu, .hero.is-white-dark .navbar-menu { + background-color: #e6e6e6; } } +@media (prefers-color-scheme: dark) { + .hero.is-white .navbar-item, + .hero.is-white .navbar-link, .hero.is-white-dark .navbar-item, + .hero.is-white-dark .navbar-link { + color: rgba(10, 10, 10, 0.7); } + .hero.is-white a.navbar-item:hover, .hero.is-white a.navbar-item.is-active, + .hero.is-white .navbar-link:hover, + .hero.is-white .navbar-link.is-active, .hero.is-white-dark a.navbar-item:hover, .hero.is-white-dark a.navbar-item.is-active, + .hero.is-white-dark .navbar-link:hover, + .hero.is-white-dark .navbar-link.is-active { + background-color: #d9d9d9; + color: #0a0a0a; } + .hero.is-white .tabs a, .hero.is-white-dark .tabs a { + color: #0a0a0a; + opacity: 0.9; } + .hero.is-white .tabs a:hover, .hero.is-white-dark .tabs a:hover { + opacity: 1; } + .hero.is-white .tabs li.is-active a, .hero.is-white-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-white .tabs.is-boxed a, .hero.is-white .tabs.is-toggle a, .hero.is-white-dark .tabs.is-boxed a, .hero.is-white-dark .tabs.is-toggle a { + color: #0a0a0a; } + .hero.is-white .tabs.is-boxed a:hover, .hero.is-white .tabs.is-toggle a:hover, .hero.is-white-dark .tabs.is-boxed a:hover, .hero.is-white-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-white .tabs.is-boxed li.is-active a, .hero.is-white .tabs.is-boxed li.is-active a:hover, .hero.is-white .tabs.is-toggle li.is-active a, .hero.is-white .tabs.is-toggle li.is-active a:hover, .hero.is-white-dark .tabs.is-boxed li.is-active a, .hero.is-white-dark .tabs.is-boxed li.is-active a:hover, .hero.is-white-dark .tabs.is-toggle li.is-active a, .hero.is-white-dark .tabs.is-toggle li.is-active a:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: #e6e6e6; } + .hero.is-white.is-bold, .hero.is-white-dark.is-bold { + background-image: linear-gradient(141deg, #d1c7c9 0%, #e6e6e6 71%, #f3f2f2 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-white.is-bold .navbar-menu, .hero.is-white-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #d1c7c9 0%, #e6e6e6 71%, #f3f2f2 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-black, .hero.is-black-dark { + background-color: black; + color: white; } + .hero.is-black a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-black strong, .hero.is-black-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-black-dark strong { + color: inherit; } + .hero.is-black .title, .hero.is-black-dark .title { + color: white; } + .hero.is-black .subtitle, .hero.is-black-dark .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-black .subtitle a:not(.button), + .hero.is-black .subtitle strong, .hero.is-black-dark .subtitle a:not(.button), + .hero.is-black-dark .subtitle strong { + color: white; } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-black .navbar-menu, .hero.is-black-dark .navbar-menu { + background-color: black; } } +@media (prefers-color-scheme: dark) { + .hero.is-black .navbar-item, + .hero.is-black .navbar-link, .hero.is-black-dark .navbar-item, + .hero.is-black-dark .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-black a.navbar-item:hover, .hero.is-black a.navbar-item.is-active, + .hero.is-black .navbar-link:hover, + .hero.is-black .navbar-link.is-active, .hero.is-black-dark a.navbar-item:hover, .hero.is-black-dark a.navbar-item.is-active, + .hero.is-black-dark .navbar-link:hover, + .hero.is-black-dark .navbar-link.is-active { + background-color: black; + color: white; } + .hero.is-black .tabs a, .hero.is-black-dark .tabs a { + color: white; + opacity: 0.9; } + .hero.is-black .tabs a:hover, .hero.is-black-dark .tabs a:hover { + opacity: 1; } + .hero.is-black .tabs li.is-active a, .hero.is-black-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-black .tabs.is-boxed a, .hero.is-black .tabs.is-toggle a, .hero.is-black-dark .tabs.is-boxed a, .hero.is-black-dark .tabs.is-toggle a { + color: white; } + .hero.is-black .tabs.is-boxed a:hover, .hero.is-black .tabs.is-toggle a:hover, .hero.is-black-dark .tabs.is-boxed a:hover, .hero.is-black-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-black .tabs.is-boxed li.is-active a, .hero.is-black .tabs.is-boxed li.is-active a:hover, .hero.is-black .tabs.is-toggle li.is-active a, .hero.is-black .tabs.is-toggle li.is-active a:hover, .hero.is-black-dark .tabs.is-boxed li.is-active a, .hero.is-black-dark .tabs.is-boxed li.is-active a:hover, .hero.is-black-dark .tabs.is-toggle li.is-active a, .hero.is-black-dark .tabs.is-toggle li.is-active a:hover { + background-color: white; + border-color: white; + color: black; } + .hero.is-black.is-bold, .hero.is-black-dark.is-bold { + background-image: linear-gradient(141deg, black 0%, black 71%, #0d0c0c 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-black.is-bold .navbar-menu, .hero.is-black-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, black 0%, black 71%, #0d0c0c 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-light, .hero.is-light-dark { + background-color: #dbdbdb; + color: rgba(0, 0, 0, 0.7); } + .hero.is-light a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-light strong, .hero.is-light-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-light-dark strong { + color: inherit; } + .hero.is-light .title, .hero.is-light-dark .title { + color: rgba(0, 0, 0, 0.7); } + .hero.is-light .subtitle, .hero.is-light-dark .subtitle { + color: rgba(0, 0, 0, 0.9); } + .hero.is-light .subtitle a:not(.button), + .hero.is-light .subtitle strong, .hero.is-light-dark .subtitle a:not(.button), + .hero.is-light-dark .subtitle strong { + color: rgba(0, 0, 0, 0.7); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-light .navbar-menu, .hero.is-light-dark .navbar-menu { + background-color: #dbdbdb; } } +@media (prefers-color-scheme: dark) { + .hero.is-light .navbar-item, + .hero.is-light .navbar-link, .hero.is-light-dark .navbar-item, + .hero.is-light-dark .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .hero.is-light a.navbar-item:hover, .hero.is-light a.navbar-item.is-active, + .hero.is-light .navbar-link:hover, + .hero.is-light .navbar-link.is-active, .hero.is-light-dark a.navbar-item:hover, .hero.is-light-dark a.navbar-item.is-active, + .hero.is-light-dark .navbar-link:hover, + .hero.is-light-dark .navbar-link.is-active { + background-color: #cfcfcf; + color: rgba(0, 0, 0, 0.7); } + .hero.is-light .tabs a, .hero.is-light-dark .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; } + .hero.is-light .tabs a:hover, .hero.is-light-dark .tabs a:hover { + opacity: 1; } + .hero.is-light .tabs li.is-active a, .hero.is-light-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-light .tabs.is-boxed a, .hero.is-light .tabs.is-toggle a, .hero.is-light-dark .tabs.is-boxed a, .hero.is-light-dark .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); } + .hero.is-light .tabs.is-boxed a:hover, .hero.is-light .tabs.is-toggle a:hover, .hero.is-light-dark .tabs.is-boxed a:hover, .hero.is-light-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-light .tabs.is-boxed li.is-active a, .hero.is-light .tabs.is-boxed li.is-active a:hover, .hero.is-light .tabs.is-toggle li.is-active a, .hero.is-light .tabs.is-toggle li.is-active a:hover, .hero.is-light-dark .tabs.is-boxed li.is-active a, .hero.is-light-dark .tabs.is-boxed li.is-active a:hover, .hero.is-light-dark .tabs.is-toggle li.is-active a, .hero.is-light-dark .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: #dbdbdb; } + .hero.is-light.is-bold, .hero.is-light-dark.is-bold { + background-image: linear-gradient(141deg, #c8bcbe 0%, #dbdbdb 71%, #e9e7e7 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-light.is-bold .navbar-menu, .hero.is-light-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #c8bcbe 0%, #dbdbdb 71%, #e9e7e7 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-dark, .hero.is-dark-dark { + background-color: #1c1c1c; + color: #fff; } + .hero.is-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-dark strong, .hero.is-dark-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-dark-dark strong { + color: inherit; } + .hero.is-dark .title, .hero.is-dark-dark .title { + color: #fff; } + .hero.is-dark .subtitle, .hero.is-dark-dark .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-dark .subtitle a:not(.button), + .hero.is-dark .subtitle strong, .hero.is-dark-dark .subtitle a:not(.button), + .hero.is-dark-dark .subtitle strong { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-dark .navbar-menu, .hero.is-dark-dark .navbar-menu { + background-color: #1c1c1c; } } +@media (prefers-color-scheme: dark) { + .hero.is-dark .navbar-item, + .hero.is-dark .navbar-link, .hero.is-dark-dark .navbar-item, + .hero.is-dark-dark .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-dark a.navbar-item:hover, .hero.is-dark a.navbar-item.is-active, + .hero.is-dark .navbar-link:hover, + .hero.is-dark .navbar-link.is-active, .hero.is-dark-dark a.navbar-item:hover, .hero.is-dark-dark a.navbar-item.is-active, + .hero.is-dark-dark .navbar-link:hover, + .hero.is-dark-dark .navbar-link.is-active { + background-color: #0f0f0f; + color: #fff; } + .hero.is-dark .tabs a, .hero.is-dark-dark .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-dark .tabs a:hover, .hero.is-dark-dark .tabs a:hover { + opacity: 1; } + .hero.is-dark .tabs li.is-active a, .hero.is-dark-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-dark .tabs.is-boxed a, .hero.is-dark .tabs.is-toggle a, .hero.is-dark-dark .tabs.is-boxed a, .hero.is-dark-dark .tabs.is-toggle a { + color: #fff; } + .hero.is-dark .tabs.is-boxed a:hover, .hero.is-dark .tabs.is-toggle a:hover, .hero.is-dark-dark .tabs.is-boxed a:hover, .hero.is-dark-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-dark .tabs.is-boxed li.is-active a, .hero.is-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark .tabs.is-toggle li.is-active a, .hero.is-dark .tabs.is-toggle li.is-active a:hover, .hero.is-dark-dark .tabs.is-boxed li.is-active a, .hero.is-dark-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark-dark .tabs.is-toggle li.is-active a, .hero.is-dark-dark .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #1c1c1c; } + .hero.is-dark.is-bold, .hero.is-dark-dark.is-bold { + background-image: linear-gradient(141deg, #030202 0%, #1c1c1c 71%, #2b2727 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-dark.is-bold .navbar-menu, .hero.is-dark-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #030202 0%, #1c1c1c 71%, #2b2727 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-primary, .hero.is-primary-dark { + background-color: #d90052; + color: #fff; } + .hero.is-primary a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-primary strong, .hero.is-primary-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-primary-dark strong { + color: inherit; } + .hero.is-primary .title, .hero.is-primary-dark .title { + color: #fff; } + .hero.is-primary .subtitle, .hero.is-primary-dark .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-primary .subtitle a:not(.button), + .hero.is-primary .subtitle strong, .hero.is-primary-dark .subtitle a:not(.button), + .hero.is-primary-dark .subtitle strong { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-primary .navbar-menu, .hero.is-primary-dark .navbar-menu { + background-color: #d90052; } } +@media (prefers-color-scheme: dark) { + .hero.is-primary .navbar-item, + .hero.is-primary .navbar-link, .hero.is-primary-dark .navbar-item, + .hero.is-primary-dark .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-primary a.navbar-item:hover, .hero.is-primary a.navbar-item.is-active, + .hero.is-primary .navbar-link:hover, + .hero.is-primary .navbar-link.is-active, .hero.is-primary-dark a.navbar-item:hover, .hero.is-primary-dark a.navbar-item.is-active, + .hero.is-primary-dark .navbar-link:hover, + .hero.is-primary-dark .navbar-link.is-active { + background-color: #c00048; + color: #fff; } + .hero.is-primary .tabs a, .hero.is-primary-dark .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-primary .tabs a:hover, .hero.is-primary-dark .tabs a:hover { + opacity: 1; } + .hero.is-primary .tabs li.is-active a, .hero.is-primary-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-primary .tabs.is-boxed a, .hero.is-primary .tabs.is-toggle a, .hero.is-primary-dark .tabs.is-boxed a, .hero.is-primary-dark .tabs.is-toggle a { + color: #fff; } + .hero.is-primary .tabs.is-boxed a:hover, .hero.is-primary .tabs.is-toggle a:hover, .hero.is-primary-dark .tabs.is-boxed a:hover, .hero.is-primary-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-primary .tabs.is-boxed li.is-active a, .hero.is-primary .tabs.is-boxed li.is-active a:hover, .hero.is-primary .tabs.is-toggle li.is-active a, .hero.is-primary .tabs.is-toggle li.is-active a:hover, .hero.is-primary-dark .tabs.is-boxed li.is-active a, .hero.is-primary-dark .tabs.is-boxed li.is-active a:hover, .hero.is-primary-dark .tabs.is-toggle li.is-active a, .hero.is-primary-dark .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #d90052; } + .hero.is-primary.is-bold, .hero.is-primary-dark.is-bold { + background-image: linear-gradient(141deg, #a6005a 0%, #d90052 71%, #f30033 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-primary.is-bold .navbar-menu, .hero.is-primary-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #a6005a 0%, #d90052 71%, #f30033 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-link, .hero.is-link-dark { + background-color: #d90052; + color: #fff; } + .hero.is-link a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-link strong, .hero.is-link-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-link-dark strong { + color: inherit; } + .hero.is-link .title, .hero.is-link-dark .title { + color: #fff; } + .hero.is-link .subtitle, .hero.is-link-dark .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-link .subtitle a:not(.button), + .hero.is-link .subtitle strong, .hero.is-link-dark .subtitle a:not(.button), + .hero.is-link-dark .subtitle strong { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-link .navbar-menu, .hero.is-link-dark .navbar-menu { + background-color: #d90052; } } +@media (prefers-color-scheme: dark) { + .hero.is-link .navbar-item, + .hero.is-link .navbar-link, .hero.is-link-dark .navbar-item, + .hero.is-link-dark .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-link a.navbar-item:hover, .hero.is-link a.navbar-item.is-active, + .hero.is-link .navbar-link:hover, + .hero.is-link .navbar-link.is-active, .hero.is-link-dark a.navbar-item:hover, .hero.is-link-dark a.navbar-item.is-active, + .hero.is-link-dark .navbar-link:hover, + .hero.is-link-dark .navbar-link.is-active { + background-color: #c00048; + color: #fff; } + .hero.is-link .tabs a, .hero.is-link-dark .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-link .tabs a:hover, .hero.is-link-dark .tabs a:hover { + opacity: 1; } + .hero.is-link .tabs li.is-active a, .hero.is-link-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-link .tabs.is-boxed a, .hero.is-link .tabs.is-toggle a, .hero.is-link-dark .tabs.is-boxed a, .hero.is-link-dark .tabs.is-toggle a { + color: #fff; } + .hero.is-link .tabs.is-boxed a:hover, .hero.is-link .tabs.is-toggle a:hover, .hero.is-link-dark .tabs.is-boxed a:hover, .hero.is-link-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-link .tabs.is-boxed li.is-active a, .hero.is-link .tabs.is-boxed li.is-active a:hover, .hero.is-link .tabs.is-toggle li.is-active a, .hero.is-link .tabs.is-toggle li.is-active a:hover, .hero.is-link-dark .tabs.is-boxed li.is-active a, .hero.is-link-dark .tabs.is-boxed li.is-active a:hover, .hero.is-link-dark .tabs.is-toggle li.is-active a, .hero.is-link-dark .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #d90052; } + .hero.is-link.is-bold, .hero.is-link-dark.is-bold { + background-image: linear-gradient(141deg, #a6005a 0%, #d90052 71%, #f30033 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-link.is-bold .navbar-menu, .hero.is-link-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #a6005a 0%, #d90052 71%, #f30033 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-info, .hero.is-info-dark { + background-color: #0075cc; + color: #fff; } + .hero.is-info a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-info strong, .hero.is-info-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-info-dark strong { + color: inherit; } + .hero.is-info .title, .hero.is-info-dark .title { + color: #fff; } + .hero.is-info .subtitle, .hero.is-info-dark .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-info .subtitle a:not(.button), + .hero.is-info .subtitle strong, .hero.is-info-dark .subtitle a:not(.button), + .hero.is-info-dark .subtitle strong { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-info .navbar-menu, .hero.is-info-dark .navbar-menu { + background-color: #0075cc; } } +@media (prefers-color-scheme: dark) { + .hero.is-info .navbar-item, + .hero.is-info .navbar-link, .hero.is-info-dark .navbar-item, + .hero.is-info-dark .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-info a.navbar-item:hover, .hero.is-info a.navbar-item.is-active, + .hero.is-info .navbar-link:hover, + .hero.is-info .navbar-link.is-active, .hero.is-info-dark a.navbar-item:hover, .hero.is-info-dark a.navbar-item.is-active, + .hero.is-info-dark .navbar-link:hover, + .hero.is-info-dark .navbar-link.is-active { + background-color: #0066b3; + color: #fff; } + .hero.is-info .tabs a, .hero.is-info-dark .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-info .tabs a:hover, .hero.is-info-dark .tabs a:hover { + opacity: 1; } + .hero.is-info .tabs li.is-active a, .hero.is-info-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-info .tabs.is-boxed a, .hero.is-info .tabs.is-toggle a, .hero.is-info-dark .tabs.is-boxed a, .hero.is-info-dark .tabs.is-toggle a { + color: #fff; } + .hero.is-info .tabs.is-boxed a:hover, .hero.is-info .tabs.is-toggle a:hover, .hero.is-info-dark .tabs.is-boxed a:hover, .hero.is-info-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-info .tabs.is-boxed li.is-active a, .hero.is-info .tabs.is-boxed li.is-active a:hover, .hero.is-info .tabs.is-toggle li.is-active a, .hero.is-info .tabs.is-toggle li.is-active a:hover, .hero.is-info-dark .tabs.is-boxed li.is-active a, .hero.is-info-dark .tabs.is-boxed li.is-active a:hover, .hero.is-info-dark .tabs.is-toggle li.is-active a, .hero.is-info-dark .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #0075cc; } + .hero.is-info.is-bold, .hero.is-info-dark.is-bold { + background-image: linear-gradient(141deg, #007199 0%, #0075cc 71%, #005de6 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-info.is-bold .navbar-menu, .hero.is-info-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #007199 0%, #0075cc 71%, #005de6 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-success, .hero.is-success-dark { + background-color: #11ad74; + color: rgba(0, 0, 0, 0.7); } + .hero.is-success a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-success strong, .hero.is-success-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-success-dark strong { + color: inherit; } + .hero.is-success .title, .hero.is-success-dark .title { + color: rgba(0, 0, 0, 0.7); } + .hero.is-success .subtitle, .hero.is-success-dark .subtitle { + color: rgba(0, 0, 0, 0.9); } + .hero.is-success .subtitle a:not(.button), + .hero.is-success .subtitle strong, .hero.is-success-dark .subtitle a:not(.button), + .hero.is-success-dark .subtitle strong { + color: rgba(0, 0, 0, 0.7); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-success .navbar-menu, .hero.is-success-dark .navbar-menu { + background-color: #11ad74; } } +@media (prefers-color-scheme: dark) { + .hero.is-success .navbar-item, + .hero.is-success .navbar-link, .hero.is-success-dark .navbar-item, + .hero.is-success-dark .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .hero.is-success a.navbar-item:hover, .hero.is-success a.navbar-item.is-active, + .hero.is-success .navbar-link:hover, + .hero.is-success .navbar-link.is-active, .hero.is-success-dark a.navbar-item:hover, .hero.is-success-dark a.navbar-item.is-active, + .hero.is-success-dark .navbar-link:hover, + .hero.is-success-dark .navbar-link.is-active { + background-color: #0f9564; + color: rgba(0, 0, 0, 0.7); } + .hero.is-success .tabs a, .hero.is-success-dark .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; } + .hero.is-success .tabs a:hover, .hero.is-success-dark .tabs a:hover { + opacity: 1; } + .hero.is-success .tabs li.is-active a, .hero.is-success-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-success .tabs.is-boxed a, .hero.is-success .tabs.is-toggle a, .hero.is-success-dark .tabs.is-boxed a, .hero.is-success-dark .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); } + .hero.is-success .tabs.is-boxed a:hover, .hero.is-success .tabs.is-toggle a:hover, .hero.is-success-dark .tabs.is-boxed a:hover, .hero.is-success-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-success .tabs.is-boxed li.is-active a, .hero.is-success .tabs.is-boxed li.is-active a:hover, .hero.is-success .tabs.is-toggle li.is-active a, .hero.is-success .tabs.is-toggle li.is-active a:hover, .hero.is-success-dark .tabs.is-boxed li.is-active a, .hero.is-success-dark .tabs.is-boxed li.is-active a:hover, .hero.is-success-dark .tabs.is-toggle li.is-active a, .hero.is-success-dark .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: #11ad74; } + .hero.is-success.is-bold, .hero.is-success-dark.is-bold { + background-image: linear-gradient(141deg, #068541 0%, #11ad74 71%, #0ec9a4 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-success.is-bold .navbar-menu, .hero.is-success-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #068541 0%, #11ad74 71%, #0ec9a4 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-warning, .hero.is-warning-dark { + background-color: #ccba00; + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-warning strong, .hero.is-warning-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-warning-dark strong { + color: inherit; } + .hero.is-warning .title, .hero.is-warning-dark .title { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .subtitle, .hero.is-warning-dark .subtitle { + color: rgba(0, 0, 0, 0.9); } + .hero.is-warning .subtitle a:not(.button), + .hero.is-warning .subtitle strong, .hero.is-warning-dark .subtitle a:not(.button), + .hero.is-warning-dark .subtitle strong { + color: rgba(0, 0, 0, 0.7); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-warning .navbar-menu, .hero.is-warning-dark .navbar-menu { + background-color: #ccba00; } } +@media (prefers-color-scheme: dark) { + .hero.is-warning .navbar-item, + .hero.is-warning .navbar-link, .hero.is-warning-dark .navbar-item, + .hero.is-warning-dark .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning a.navbar-item:hover, .hero.is-warning a.navbar-item.is-active, + .hero.is-warning .navbar-link:hover, + .hero.is-warning .navbar-link.is-active, .hero.is-warning-dark a.navbar-item:hover, .hero.is-warning-dark a.navbar-item.is-active, + .hero.is-warning-dark .navbar-link:hover, + .hero.is-warning-dark .navbar-link.is-active { + background-color: #b3a300; + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .tabs a, .hero.is-warning-dark .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; } + .hero.is-warning .tabs a:hover, .hero.is-warning-dark .tabs a:hover { + opacity: 1; } + .hero.is-warning .tabs li.is-active a, .hero.is-warning-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-warning .tabs.is-boxed a, .hero.is-warning .tabs.is-toggle a, .hero.is-warning-dark .tabs.is-boxed a, .hero.is-warning-dark .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning .tabs.is-boxed a:hover, .hero.is-warning .tabs.is-toggle a:hover, .hero.is-warning-dark .tabs.is-boxed a:hover, .hero.is-warning-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-warning .tabs.is-boxed li.is-active a, .hero.is-warning .tabs.is-boxed li.is-active a:hover, .hero.is-warning .tabs.is-toggle li.is-active a, .hero.is-warning .tabs.is-toggle li.is-active a:hover, .hero.is-warning-dark .tabs.is-boxed li.is-active a, .hero.is-warning-dark .tabs.is-boxed li.is-active a:hover, .hero.is-warning-dark .tabs.is-toggle li.is-active a, .hero.is-warning-dark .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: #ccba00; } + .hero.is-warning.is-bold, .hero.is-warning-dark.is-bold { + background-image: linear-gradient(141deg, #997200 0%, #ccba00 71%, #d3e600 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-warning.is-bold .navbar-menu, .hero.is-warning-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #997200 0%, #ccba00 71%, #d3e600 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-danger, .hero.is-danger-dark { + background-color: #ee1742; + color: #fff; } + .hero.is-danger a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-danger strong, .hero.is-danger-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-danger-dark strong { + color: inherit; } + .hero.is-danger .title, .hero.is-danger-dark .title { + color: #fff; } + .hero.is-danger .subtitle, .hero.is-danger-dark .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-danger .subtitle a:not(.button), + .hero.is-danger .subtitle strong, .hero.is-danger-dark .subtitle a:not(.button), + .hero.is-danger-dark .subtitle strong { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-danger .navbar-menu, .hero.is-danger-dark .navbar-menu { + background-color: #ee1742; } } +@media (prefers-color-scheme: dark) { + .hero.is-danger .navbar-item, + .hero.is-danger .navbar-link, .hero.is-danger-dark .navbar-item, + .hero.is-danger-dark .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-danger a.navbar-item:hover, .hero.is-danger a.navbar-item.is-active, + .hero.is-danger .navbar-link:hover, + .hero.is-danger .navbar-link.is-active, .hero.is-danger-dark a.navbar-item:hover, .hero.is-danger-dark a.navbar-item.is-active, + .hero.is-danger-dark .navbar-link:hover, + .hero.is-danger-dark .navbar-link.is-active { + background-color: #da1039; + color: #fff; } + .hero.is-danger .tabs a, .hero.is-danger-dark .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-danger .tabs a:hover, .hero.is-danger-dark .tabs a:hover { + opacity: 1; } + .hero.is-danger .tabs li.is-active a, .hero.is-danger-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-danger .tabs.is-boxed a, .hero.is-danger .tabs.is-toggle a, .hero.is-danger-dark .tabs.is-boxed a, .hero.is-danger-dark .tabs.is-toggle a { + color: #fff; } + .hero.is-danger .tabs.is-boxed a:hover, .hero.is-danger .tabs.is-toggle a:hover, .hero.is-danger-dark .tabs.is-boxed a:hover, .hero.is-danger-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-danger .tabs.is-boxed li.is-active a, .hero.is-danger .tabs.is-boxed li.is-active a:hover, .hero.is-danger .tabs.is-toggle li.is-active a, .hero.is-danger .tabs.is-toggle li.is-active a:hover, .hero.is-danger-dark .tabs.is-boxed li.is-active a, .hero.is-danger-dark .tabs.is-boxed li.is-active a:hover, .hero.is-danger-dark .tabs.is-toggle li.is-active a, .hero.is-danger-dark .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #ee1742; } + .hero.is-danger.is-bold, .hero.is-danger-dark.is-bold { + background-image: linear-gradient(141deg, #cd044e 0%, #ee1742 71%, #f52930 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-danger.is-bold .navbar-menu, .hero.is-danger-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #cd044e 0%, #ee1742 71%, #f52930 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-white-dark { + background-color: white; + color: #0a0a0a; } + .hero.is-white-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-white-dark strong { + color: inherit; } + .hero.is-white-dark .title { + color: #0a0a0a; } + .hero.is-white-dark .subtitle { + color: rgba(10, 10, 10, 0.9); } + .hero.is-white-dark .subtitle a:not(.button), + .hero.is-white-dark .subtitle strong { + color: #0a0a0a; } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-white-dark .navbar-menu { + background-color: white; } } +@media (prefers-color-scheme: dark) { + .hero.is-white-dark .navbar-item, + .hero.is-white-dark .navbar-link { + color: rgba(10, 10, 10, 0.7); } + .hero.is-white-dark a.navbar-item:hover, .hero.is-white-dark a.navbar-item.is-active, + .hero.is-white-dark .navbar-link:hover, + .hero.is-white-dark .navbar-link.is-active { + background-color: #f2f2f2; + color: #0a0a0a; } + .hero.is-white-dark .tabs a { + color: #0a0a0a; + opacity: 0.9; } + .hero.is-white-dark .tabs a:hover { + opacity: 1; } + .hero.is-white-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-white-dark .tabs.is-boxed a, .hero.is-white-dark .tabs.is-toggle a { + color: #0a0a0a; } + .hero.is-white-dark .tabs.is-boxed a:hover, .hero.is-white-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-white-dark .tabs.is-boxed li.is-active a, .hero.is-white-dark .tabs.is-boxed li.is-active a:hover, .hero.is-white-dark .tabs.is-toggle li.is-active a, .hero.is-white-dark .tabs.is-toggle li.is-active a:hover { + background-color: #0a0a0a; + border-color: #0a0a0a; + color: white; } + .hero.is-white-dark.is-bold { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-white-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #e8e3e4 0%, white 71%, white 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-black-dark { + background-color: #0a0a0a; + color: white; } + .hero.is-black-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-black-dark strong { + color: inherit; } + .hero.is-black-dark .title { + color: white; } + .hero.is-black-dark .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-black-dark .subtitle a:not(.button), + .hero.is-black-dark .subtitle strong { + color: white; } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-black-dark .navbar-menu { + background-color: #0a0a0a; } } +@media (prefers-color-scheme: dark) { + .hero.is-black-dark .navbar-item, + .hero.is-black-dark .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-black-dark a.navbar-item:hover, .hero.is-black-dark a.navbar-item.is-active, + .hero.is-black-dark .navbar-link:hover, + .hero.is-black-dark .navbar-link.is-active { + background-color: black; + color: white; } + .hero.is-black-dark .tabs a { + color: white; + opacity: 0.9; } + .hero.is-black-dark .tabs a:hover { + opacity: 1; } + .hero.is-black-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-black-dark .tabs.is-boxed a, .hero.is-black-dark .tabs.is-toggle a { + color: white; } + .hero.is-black-dark .tabs.is-boxed a:hover, .hero.is-black-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-black-dark .tabs.is-boxed li.is-active a, .hero.is-black-dark .tabs.is-boxed li.is-active a:hover, .hero.is-black-dark .tabs.is-toggle li.is-active a, .hero.is-black-dark .tabs.is-toggle li.is-active a:hover { + background-color: white; + border-color: white; + color: #0a0a0a; } + .hero.is-black-dark.is-bold { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-black-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, black 0%, #0a0a0a 71%, #181616 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-light-dark { + background-color: whitesmoke; + color: rgba(0, 0, 0, 0.7); } + .hero.is-light-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-light-dark strong { + color: inherit; } + .hero.is-light-dark .title { + color: rgba(0, 0, 0, 0.7); } + .hero.is-light-dark .subtitle { + color: rgba(0, 0, 0, 0.9); } + .hero.is-light-dark .subtitle a:not(.button), + .hero.is-light-dark .subtitle strong { + color: rgba(0, 0, 0, 0.7); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-light-dark .navbar-menu { + background-color: whitesmoke; } } +@media (prefers-color-scheme: dark) { + .hero.is-light-dark .navbar-item, + .hero.is-light-dark .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .hero.is-light-dark a.navbar-item:hover, .hero.is-light-dark a.navbar-item.is-active, + .hero.is-light-dark .navbar-link:hover, + .hero.is-light-dark .navbar-link.is-active { + background-color: #e8e8e8; + color: rgba(0, 0, 0, 0.7); } + .hero.is-light-dark .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; } + .hero.is-light-dark .tabs a:hover { + opacity: 1; } + .hero.is-light-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-light-dark .tabs.is-boxed a, .hero.is-light-dark .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); } + .hero.is-light-dark .tabs.is-boxed a:hover, .hero.is-light-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-light-dark .tabs.is-boxed li.is-active a, .hero.is-light-dark .tabs.is-boxed li.is-active a:hover, .hero.is-light-dark .tabs.is-toggle li.is-active a, .hero.is-light-dark .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: whitesmoke; } + .hero.is-light-dark.is-bold { + background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-light-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #dfd8d9 0%, whitesmoke 71%, white 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-dark-dark { + background-color: #363636; + color: #fff; } + .hero.is-dark-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-dark-dark strong { + color: inherit; } + .hero.is-dark-dark .title { + color: #fff; } + .hero.is-dark-dark .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-dark-dark .subtitle a:not(.button), + .hero.is-dark-dark .subtitle strong { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-dark-dark .navbar-menu { + background-color: #363636; } } +@media (prefers-color-scheme: dark) { + .hero.is-dark-dark .navbar-item, + .hero.is-dark-dark .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-dark-dark a.navbar-item:hover, .hero.is-dark-dark a.navbar-item.is-active, + .hero.is-dark-dark .navbar-link:hover, + .hero.is-dark-dark .navbar-link.is-active { + background-color: #292929; + color: #fff; } + .hero.is-dark-dark .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-dark-dark .tabs a:hover { + opacity: 1; } + .hero.is-dark-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-dark-dark .tabs.is-boxed a, .hero.is-dark-dark .tabs.is-toggle a { + color: #fff; } + .hero.is-dark-dark .tabs.is-boxed a:hover, .hero.is-dark-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-dark-dark .tabs.is-boxed li.is-active a, .hero.is-dark-dark .tabs.is-boxed li.is-active a:hover, .hero.is-dark-dark .tabs.is-toggle li.is-active a, .hero.is-dark-dark .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #363636; } + .hero.is-dark-dark.is-bold { + background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-dark-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #1f191a 0%, #363636 71%, #46403f 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-primary-dark { + background-color: #ff0d68; + color: #fff; } + .hero.is-primary-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-primary-dark strong { + color: inherit; } + .hero.is-primary-dark .title { + color: #fff; } + .hero.is-primary-dark .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-primary-dark .subtitle a:not(.button), + .hero.is-primary-dark .subtitle strong { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-primary-dark .navbar-menu { + background-color: #ff0d68; } } +@media (prefers-color-scheme: dark) { + .hero.is-primary-dark .navbar-item, + .hero.is-primary-dark .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-primary-dark a.navbar-item:hover, .hero.is-primary-dark a.navbar-item.is-active, + .hero.is-primary-dark .navbar-link:hover, + .hero.is-primary-dark .navbar-link.is-active { + background-color: #f3005b; + color: #fff; } + .hero.is-primary-dark .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-primary-dark .tabs a:hover { + opacity: 1; } + .hero.is-primary-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-primary-dark .tabs.is-boxed a, .hero.is-primary-dark .tabs.is-toggle a { + color: #fff; } + .hero.is-primary-dark .tabs.is-boxed a:hover, .hero.is-primary-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-primary-dark .tabs.is-boxed li.is-active a, .hero.is-primary-dark .tabs.is-boxed li.is-active a:hover, .hero.is-primary-dark .tabs.is-toggle li.is-active a, .hero.is-primary-dark .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #ff0d68; } + .hero.is-primary-dark.is-bold { + background-image: linear-gradient(141deg, #d90076 0%, #ff0d68 71%, #ff2754 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-primary-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #d90076 0%, #ff0d68 71%, #ff2754 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-link-dark { + background-color: #ff0d68; + color: #fff; } + .hero.is-link-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-link-dark strong { + color: inherit; } + .hero.is-link-dark .title { + color: #fff; } + .hero.is-link-dark .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-link-dark .subtitle a:not(.button), + .hero.is-link-dark .subtitle strong { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-link-dark .navbar-menu { + background-color: #ff0d68; } } +@media (prefers-color-scheme: dark) { + .hero.is-link-dark .navbar-item, + .hero.is-link-dark .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-link-dark a.navbar-item:hover, .hero.is-link-dark a.navbar-item.is-active, + .hero.is-link-dark .navbar-link:hover, + .hero.is-link-dark .navbar-link.is-active { + background-color: #f3005b; + color: #fff; } + .hero.is-link-dark .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-link-dark .tabs a:hover { + opacity: 1; } + .hero.is-link-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-link-dark .tabs.is-boxed a, .hero.is-link-dark .tabs.is-toggle a { + color: #fff; } + .hero.is-link-dark .tabs.is-boxed a:hover, .hero.is-link-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-link-dark .tabs.is-boxed li.is-active a, .hero.is-link-dark .tabs.is-boxed li.is-active a:hover, .hero.is-link-dark .tabs.is-toggle li.is-active a, .hero.is-link-dark .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #ff0d68; } + .hero.is-link-dark.is-bold { + background-image: linear-gradient(141deg, #d90076 0%, #ff0d68 71%, #ff2754 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-link-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #d90076 0%, #ff0d68 71%, #ff2754 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-info-dark { + background-color: #0092FF; + color: #fff; } + .hero.is-info-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-info-dark strong { + color: inherit; } + .hero.is-info-dark .title { + color: #fff; } + .hero.is-info-dark .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-info-dark .subtitle a:not(.button), + .hero.is-info-dark .subtitle strong { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-info-dark .navbar-menu { + background-color: #0092FF; } } +@media (prefers-color-scheme: dark) { + .hero.is-info-dark .navbar-item, + .hero.is-info-dark .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-info-dark a.navbar-item:hover, .hero.is-info-dark a.navbar-item.is-active, + .hero.is-info-dark .navbar-link:hover, + .hero.is-info-dark .navbar-link.is-active { + background-color: #0083e6; + color: #fff; } + .hero.is-info-dark .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-info-dark .tabs a:hover { + opacity: 1; } + .hero.is-info-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-info-dark .tabs.is-boxed a, .hero.is-info-dark .tabs.is-toggle a { + color: #fff; } + .hero.is-info-dark .tabs.is-boxed a:hover, .hero.is-info-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-info-dark .tabs.is-boxed li.is-active a, .hero.is-info-dark .tabs.is-boxed li.is-active a:hover, .hero.is-info-dark .tabs.is-toggle li.is-active a, .hero.is-info-dark .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #0092FF; } + .hero.is-info-dark.is-bold { + background-image: linear-gradient(141deg, #0097cc 0%, #0092FF 71%, #1a77ff 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-info-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #0097cc 0%, #0092FF 71%, #1a77ff 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-success-dark { + background-color: #16DB93; + color: rgba(0, 0, 0, 0.7); } + .hero.is-success-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-success-dark strong { + color: inherit; } + .hero.is-success-dark .title { + color: rgba(0, 0, 0, 0.7); } + .hero.is-success-dark .subtitle { + color: rgba(0, 0, 0, 0.9); } + .hero.is-success-dark .subtitle a:not(.button), + .hero.is-success-dark .subtitle strong { + color: rgba(0, 0, 0, 0.7); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-success-dark .navbar-menu { + background-color: #16DB93; } } +@media (prefers-color-scheme: dark) { + .hero.is-success-dark .navbar-item, + .hero.is-success-dark .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .hero.is-success-dark a.navbar-item:hover, .hero.is-success-dark a.navbar-item.is-active, + .hero.is-success-dark .navbar-link:hover, + .hero.is-success-dark .navbar-link.is-active { + background-color: #14c483; + color: rgba(0, 0, 0, 0.7); } + .hero.is-success-dark .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; } + .hero.is-success-dark .tabs a:hover { + opacity: 1; } + .hero.is-success-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-success-dark .tabs.is-boxed a, .hero.is-success-dark .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); } + .hero.is-success-dark .tabs.is-boxed a:hover, .hero.is-success-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-success-dark .tabs.is-boxed li.is-active a, .hero.is-success-dark .tabs.is-boxed li.is-active a:hover, .hero.is-success-dark .tabs.is-toggle li.is-active a, .hero.is-success-dark .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: #16DB93; } + .hero.is-success-dark.is-bold { + background-image: linear-gradient(141deg, #08b659 0%, #16DB93 71%, #1cefc5 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-success-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #08b659 0%, #16DB93 71%, #1cefc5 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-warning-dark { + background-color: #FFE900; + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-warning-dark strong { + color: inherit; } + .hero.is-warning-dark .title { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning-dark .subtitle { + color: rgba(0, 0, 0, 0.9); } + .hero.is-warning-dark .subtitle a:not(.button), + .hero.is-warning-dark .subtitle strong { + color: rgba(0, 0, 0, 0.7); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-warning-dark .navbar-menu { + background-color: #FFE900; } } +@media (prefers-color-scheme: dark) { + .hero.is-warning-dark .navbar-item, + .hero.is-warning-dark .navbar-link { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning-dark a.navbar-item:hover, .hero.is-warning-dark a.navbar-item.is-active, + .hero.is-warning-dark .navbar-link:hover, + .hero.is-warning-dark .navbar-link.is-active { + background-color: #e6d200; + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning-dark .tabs a { + color: rgba(0, 0, 0, 0.7); + opacity: 0.9; } + .hero.is-warning-dark .tabs a:hover { + opacity: 1; } + .hero.is-warning-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-warning-dark .tabs.is-boxed a, .hero.is-warning-dark .tabs.is-toggle a { + color: rgba(0, 0, 0, 0.7); } + .hero.is-warning-dark .tabs.is-boxed a:hover, .hero.is-warning-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-warning-dark .tabs.is-boxed li.is-active a, .hero.is-warning-dark .tabs.is-boxed li.is-active a:hover, .hero.is-warning-dark .tabs.is-toggle li.is-active a, .hero.is-warning-dark .tabs.is-toggle li.is-active a:hover { + background-color: rgba(0, 0, 0, 0.7); + border-color: rgba(0, 0, 0, 0.7); + color: #FFE900; } + .hero.is-warning-dark.is-bold { + background-image: linear-gradient(141deg, #cc9800 0%, #FFE900 71%, #edff1a 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-warning-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #cc9800 0%, #FFE900 71%, #edff1a 100%); } } +@media (prefers-color-scheme: dark) { + .hero.is-danger-dark { + background-color: #f14668; + color: #fff; } + .hero.is-danger-dark a:not(.button):not(.dropdown-item):not(.tag), + .hero.is-danger-dark strong { + color: inherit; } + .hero.is-danger-dark .title { + color: #fff; } + .hero.is-danger-dark .subtitle { + color: rgba(255, 255, 255, 0.9); } + .hero.is-danger-dark .subtitle a:not(.button), + .hero.is-danger-dark .subtitle strong { + color: #fff; } } + @media screen and (prefers-color-scheme: dark) and (max-width: 1023px) { + .hero.is-danger-dark .navbar-menu { + background-color: #f14668; } } +@media (prefers-color-scheme: dark) { + .hero.is-danger-dark .navbar-item, + .hero.is-danger-dark .navbar-link { + color: rgba(255, 255, 255, 0.7); } + .hero.is-danger-dark a.navbar-item:hover, .hero.is-danger-dark a.navbar-item.is-active, + .hero.is-danger-dark .navbar-link:hover, + .hero.is-danger-dark .navbar-link.is-active { + background-color: #ef2e55; + color: #fff; } + .hero.is-danger-dark .tabs a { + color: #fff; + opacity: 0.9; } + .hero.is-danger-dark .tabs a:hover { + opacity: 1; } + .hero.is-danger-dark .tabs li.is-active a { + opacity: 1; } + .hero.is-danger-dark .tabs.is-boxed a, .hero.is-danger-dark .tabs.is-toggle a { + color: #fff; } + .hero.is-danger-dark .tabs.is-boxed a:hover, .hero.is-danger-dark .tabs.is-toggle a:hover { + background-color: rgba(10, 10, 10, 0.1); } + .hero.is-danger-dark .tabs.is-boxed li.is-active a, .hero.is-danger-dark .tabs.is-boxed li.is-active a:hover, .hero.is-danger-dark .tabs.is-toggle li.is-active a, .hero.is-danger-dark .tabs.is-toggle li.is-active a:hover { + background-color: #fff; + border-color: #fff; + color: #f14668; } + .hero.is-danger-dark.is-bold { + background-image: linear-gradient(141deg, #fa0a62 0%, #f14668 71%, #f7595f 100%); } } + @media screen and (prefers-color-scheme: dark) and (max-width: 768px) { + .hero.is-danger-dark.is-bold .navbar-menu { + background-image: linear-gradient(141deg, #fa0a62 0%, #f14668 71%, #f7595f 100%); } } +@media (prefers-color-scheme: dark) { + .footer { + background-color: #121212; } } + +.hero .title { + position: relative; } + .hero .title span { + display: none; } + .hero .title::after { + content: ""; + position: absolute; + top: -108px; + left: 0; + right: 0; + margin: auto; + width: 500px; + height: 122px; + background: url(/assets/images/logo.svg) no-repeat center center; } + +.sanic-simple-logo { + background: url(/assets/images/logo.svg) no-repeat; + background-size: 270px; + height: 72px; } + .sanic-simple-logo img { + visibility: hidden; } + +:root { + --menu-background: #ededed; + --menu-divider: #dbdbdb; + --menu-contrast: #121212; } + +.c1 { + color: #7a7a7a; } + +@media (prefers-color-scheme: dark) { + :root { + --menu-background: #0a0a0a; + --menu-divider: #242424; + --menu-contrast: #7a7a7a; } + html, + .navbar { + background-color: #121212; } + .footer { + background-color: #0a0a0a; } + .sanic-simple-logo { + background: url(/assets/images/logo-white.svg) no-repeat; + background-size: 270px; } + .hero .title::after { + background: url(/assets/images/logo-white.svg) no-repeat center center; } + .list { + background-color: transparent; + box-shadow: none; } + .n, .na, .nb, .no, .nd, .ni, .ne, .nl, + .nn, .nx, .py, .nt, .nv, .bp, .vc, .vg, + .vi, .vm { + color: #b5b5b5; } + .s, .sa, .sb, .sc, .dl, .sd, .s2, .se, + .sh, .si, .sx, .sr, .s1, .ss { + background-color: transparent; + color: #16DB93; } + .nc { + color: #FFE900; } + .c1 { + color: #4a4a4a; } + .introduction-table .table tbody tr:last-child td { + border-bottom-width: 1px; } } + +.burger { + display: none; + position: fixed; + top: 1rem; + right: 1rem; + width: 2rem; + height: 2rem; + cursor: pointer; + z-index: 101; } + .burger span { + display: block; + position: absolute; + height: 2px; + width: 100%; + background: var(--menu-contrast); + border-radius: 2px; + opacity: 1; + left: 0; + transform: rotate(0deg); + transition: .25s ease-in-out; } + .burger span:nth-child(1) { + top: 0px; } + .burger span:nth-child(2), .burger span:nth-child(3) { + top: 8px; } + .burger span:nth-child(4) { + top: 16px; } + .burger.is-active span:nth-child(1) { + top: 18px; + width: 0%; + left: 50%; } + .burger.is-active span:nth-child(2) { + transform: rotate(45deg); } + .burger.is-active span:nth-child(3) { + transform: rotate(-45deg); } + .burger.is-active span:nth-child(4) { + top: 18px; + width: 0%; + left: 50%; } + +.menu { + background-color: var(--menu-background); + width: 360px; + padding: 2rem; + height: 100vh; + overflow: auto; + position: fixed; + top: 0; + left: 0; + z-index: 100; } + .menu hr { + background-color: var(--menu-divider); } + .menu .is-anchor { + font-size: 0.85em; } + .menu .is-anchor a::before { + content: '# '; + color: var(--menu-contrast); } + .menu .menu-label { + margin-bottom: 1rem; } + .menu li.is-group > a::after { + content: ''; + position: relative; + top: -2px; + left: 8px; + display: inline-block; + width: 0; + height: 0; + border-left: 8px solid var(--menu-contrast); + border-top: 5.33333px solid transparent; + border-bottom: 5.33333px solid transparent; + transform: rotate(90deg); } + .menu li.is-group > a ~ .menu-list { + transition: all .15s ease-in-out; + transform: scaleY(1); + transform-origin: top; + overflow: hidden; + opacity: 1; + margin: 0; } + .menu li.is-group > a:not(.is-open)::after { + transform: rotate(0deg); } + .menu li.is-group > a:not(.is-open) ~ .menu-list { + transform: scaleY(0); + opacity: 0; + font-size: 0; } + .menu ~ main { + margin-left: 360px; } + .menu .anchor-list { + display: none; } + .menu .menu-item .is-active + .anchor-list { + display: block; } + +@media screen and (max-width: 1024px) { + .menu { + left: -100vw; + width: 100vw; + transition: all .25s ease-in-out; } + .menu.is-active { + left: 0; } + .menu ~ main { + margin-left: 0; } + .burger { + display: block; } } + +code { + color: #4a4a4a; } + +.notification code { + background-color: rgba(237, 237, 237, 0.6); } + +@media (prefers-color-scheme: dark) { + code { + color: #dbdbdb; } + .notification code { + background-color: rgba(36, 36, 36, 0.6); } } + +a[target=_blank]::after { + content: "โ‡—"; + margin-left: 0.25em; } + +h1 a.anchor, +h2 a.anchor, +h3 a.anchor, +h4 a.anchor, +h5 a.anchor, +h6 a.anchor { + display: none; + padding-left: 0.375em; } + +h1:hover a.anchor, +h2:hover a.anchor, +h3:hover a.anchor, +h4:hover a.anchor, +h5:hover a.anchor, +h6:hover a.anchor { + display: inline; } + +h1 { + margin-left: -2rem; } + +h2 { + margin-left: -1rem; + margin-top: 3rem; } + +h3:not(:first-child) { + margin-top: 2rem; } + +article { + margin-left: 2rem; } + +p + pre, +pre + p, +div.highlight + p, +p + div.highlight, +div.highlight + div.highlight, +p + h4, +p + .code-block, +.code-block + p, +.code-block + .code-block, +p + p { + margin-top: 1rem; } + +@media screen and (max-width: 769px) { + h1 { + margin-left: 0; } + h2 { + margin-left: 0; } + article { + margin-left: 0; } } + +.footer { + margin-bottom: 4rem; } + .footer a[target=_blank]::after { + display: none; } + +@media screen and (max-width: 1024px) { + .footer .level { + align-items: baseline; } + .footer a { + font-size: 0.75em; } } + +.hero .subtitle { + font-size: 3rem; + font-weight: 700; + margin-bottom: 1rem; } + +.hero .tagline { + font-family: Fira Code,Source Code Pro,Menlo,Monaco,Consolas,Lucisa Console,monospace; + font-size: 2rem; + font-weight: 300; + margin-bottom: 2rem; } + +.language-sh code { + display: inline-block; } + .language-sh code::before { + content: 'โ–ถ '; } + +.notification { + margin-top: 2rem; } + .notification .notification-title { + font-size: 1.25rem; + font-weight: 700; } + .notification.is-note { + background-color: #ff0d68; + color: white; } + .notification.is-new { + background-color: #833FE3; + color: white; } + .notification.is-new::after { + content: '๐ŸŒŸ'; + position: absolute; + top: 1rem; + right: 1rem; + font-size: 2rem; } + .notification.is-tip::after { + content: '๐Ÿ’ก'; + position: absolute; + top: 1rem; + right: 1rem; + font-size: 2rem; } + +.ol, .ul, +.list { + margin: 1rem 0; } + .ol .li, + .ol .list-item, .ul .li, + .ul .list-item, + .list .li, + .list .list-item { + padding: 0.5rem 0; } + +.ul .li { + margin-left: 1.5rem; + list-style-type: disc; } + +.introduction-table { + margin: 2rem 0; } + .introduction-table a[target=_blank]::after { + display: none; } + .introduction-table th { + display: none; } + +.docobject h2 :last-child { + color: #363636; } + +.docobject .function-signature { + color: #1e2024; } + .docobject .function-signature .param-name { + color: #ff0d68; + font-weight: bold; } + .docobject .function-signature .param-default { + color: #833FE3; + font-style: italic; } + .docobject .function-signature .function-decorator { + font-style: italic; + color: #7a7a7a; } + .docobject .function-signature .param-annotation { + color: #0092FF; } + .docobject .function-signature .return-annotation { + color: #37ae6f; } + +.docobject dl { + display: flex; + flex-wrap: wrap; + margin: 0; + padding: 0; } + +.docobject dt { + flex: 0 0 25%; + padding: 5px 10px; + font-weight: bold; + color: #0092FF; } + +.docobject dd { + flex: 1; + padding: 5px 10px; + margin: 0; } + +.docobject div.highlight + p, +.docobject p + div.highlight, +.docobject div.highlight + div.highlight { + margin-top: 1rem; } + +.docobject .method { + padding-left: 1rem; } + .docobject .method h3 { + margin-left: -1rem; } + +.docobject .ol, .docobject .ul, .docobject .list { + margin: 1rem; } + +.mermaid { + margin-top: 2rem; } + .mermaid .actor { + stroke: #ff0d68 !important; + fill: #ffd9e7 !important; } + .mermaid .labelBox { + fill: #cce9ff !important; + stroke: #0092FF !important; } + .mermaid .note { + fill: #fffbcc !important; + stroke: #FFE900 !important; } + +@media (prefers-color-scheme: dark) { + .docobject h2 :last-child { + color: #fafafa; } + .docobject .function-signature { + color: #b5b5b5; } + .docobject .function-signature .param-default { + color: #FFE900; } + .mermaid text.messageText { + fill: #fafafa !important; } + .mermaid .actor { + fill: #ff0d68 !important; } + .mermaid .labelBox { + fill: #0092FF !important; } + .mermaid .labelText { + fill: #fafafa !important; } + .mermaid .note { + fill: #FFE900 !important; } } + +h1 + .code-block, +h2 + .code-block, +h3 + .code-block { + margin-top: 1rem; } + +.code-block { + position: relative; } + .code-block + .code-block { + margin-top: 1rem; } + .code-block:hover .code-block__copy { + opacity: 1; } + .code-block .code-block__copy { + position: absolute; + right: 10px; + bottom: 10px; + width: 36px; + height: 52px; + cursor: pointer; + opacity: 0; + transition: all 0.3s; } + .code-block .code-block__copy::before { + content: "copied"; + position: absolute; + top: -17.33333px; + margin: auto; + opacity: 0; + right: 9px; } + .code-block .code-block__copy.clicked::before { + opacity: 1; + animation: all 0.3s ease-in-out; } + .code-block .code-block__rectangle { + position: absolute; + width: 18px; + height: 23.29412px; + transition: all 0.3s ease; } + .code-block .code-block__filled { + background-color: #ff0d68; + left: 5px; + top: 13px; } + .code-block .code-block__outlined { + border: 2px solid #ff0d68; + background-color: transparent; + left: -3px; + top: 5px; } + .code-block .code-block__copy.clicked .code-block__outlined { + left: -19px; + top: 13px; + background-color: #ff0d68; } + +.additional-attributes.details { + display: flex; + flex-direction: column; + width: 100%; } + .additional-attributes.details .code-block { + display: none; + width: 100%; } + .additional-attributes.details::before { + content: "โ–ผ " attr(title); + display: block; + background-color: #b5b5b5; + padding: 10px; + cursor: pointer; + width: 100%; + box-sizing: border-box; } + .additional-attributes.details.is-active .code-block { + display: block; } + .additional-attributes.details.is-active::before { + content: "โ–ฒ " attr(title); + background-color: #dbdbdb; } + +@media (prefers-color-scheme: dark) { + .additional-attributes.details::before { + background-color: #363636; } + .additional-attributes.details.is-active::before { + background-color: #4a4a4a; } } + +.tabs .tab-content { + display: none; } + +footer .level, +footer .level .level-right, +footer .level .level-left { + display: flex !important; } + +.box { + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); } + +@media (prefers-color-scheme: dark) { + .box { + box-shadow: 0 2px 3px rgba(128, 128, 128, 0.1), 0 0 0 1px rgba(128, 128, 128, 0.1); } } + +@media screen and (min-width: 769px) { + .hero.is-large .hero-body { + padding: 18rem 6rem 3rem; } } + +@media screen and (max-width: 769px) { + .hero { + height: 100vh; } + .hero .hero-body { + padding: 3rem 1.5rem; + display: flex; + flex-direction: column; + justify-content: center; } + .hero .title::after { + width: calc(100vw - 1.5rem); + background: url(/assets/images/logo-white.svg) no-repeat center center; + background-size: 100% auto; } } diff --git a/guide/public/index.html b/guide/public/index.html new file mode 100644 index 00000000..504878ab --- /dev/null +++ b/guide/public/index.html @@ -0,0 +1,12 @@ + + + + + + Sanic Framework + + + +

Redirecting to /en/

+ + diff --git a/guide/server.py b/guide/server.py new file mode 100644 index 00000000..9de1c500 --- /dev/null +++ b/guide/server.py @@ -0,0 +1,5 @@ +from pathlib import Path + +from webapp.worker.factory import create_app + +app = create_app(Path(__file__).parent) diff --git a/guide/style/bulma-prefers-dark/LICENSE b/guide/style/bulma-prefers-dark/LICENSE new file mode 100644 index 00000000..821f954b --- /dev/null +++ b/guide/style/bulma-prefers-dark/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 James Loh + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/guide/style/bulma-prefers-dark/bulma-prefers-dark.sass b/guide/style/bulma-prefers-dark/bulma-prefers-dark.sass new file mode 100644 index 00000000..b529d10e --- /dev/null +++ b/guide/style/bulma-prefers-dark/bulma-prefers-dark.sass @@ -0,0 +1,9 @@ +@charset "utf-8" +/*! Bulma Prefers Dark | MIT License | github.com/jloh/bulma-prefers-dark */ + +@import "sass/utilities/_all" ++prefers-scheme(dark) + @import "sass/base/_all" + @import "sass/elements/_all" + @import "sass/components/_all" + @import "sass/layout/_all" diff --git a/guide/style/bulma-prefers-dark/sass/base/_all.sass b/guide/style/bulma-prefers-dark/sass/base/_all.sass new file mode 100644 index 00000000..c6eb3618 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/base/_all.sass @@ -0,0 +1,4 @@ +@charset "utf-8" + +@import "generic.sass" +@import "helpers.sass" diff --git a/guide/style/bulma-prefers-dark/sass/base/generic.sass b/guide/style/bulma-prefers-dark/sass/base/generic.sass new file mode 100644 index 00000000..d66c7c4b --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/base/generic.sass @@ -0,0 +1,39 @@ +$body-background-color-dark: $body-background-dark !default +$body-color-dark: $text-dark !default + +$hr-background-color-dark: $background-dark !default + +$strong-color-dark: $text-strong-dark !default + +html + background-color: $body-background-color-dark + +body + color: $body-color-dark + +// Inline + +a + color: $link-dark + &:hover + color: $link-hover-dark + +code + background-color: $code-background-dark + color: $code-dark + +hr + background-color: $hr-background-color-dark + +strong + color: $strong-color-dark + +// Block + +pre + background-color: $pre-background-dark + color: $pre-dark + +table + th + color: $text-strong-dark diff --git a/guide/style/bulma-prefers-dark/sass/base/helpers.sass b/guide/style/bulma-prefers-dark/sass/base/helpers.sass new file mode 100644 index 00000000..c3d262bb --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/base/helpers.sass @@ -0,0 +1,16 @@ +@each $name, $pair in $colors + $color: nth($pair, 1) + .has-text-#{$name}-dark + color: $color !important + a.has-text-#{$name}-dark + &:hover, + &:focus + color: lighten($color, 10%) !important + .has-background-#{$name}-dark + background-color: $color !important + +@each $name, $shade in $shades + .has-text-#{$name}-dark + color: $shade !important + .has-background-#{$name}-dark + background-color: $shade !important diff --git a/guide/style/bulma-prefers-dark/sass/components/_all.sass b/guide/style/bulma-prefers-dark/sass/components/_all.sass new file mode 100644 index 00000000..e5fa77e2 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/components/_all.sass @@ -0,0 +1,14 @@ +@charset "utf-8" + +@import "breadcrumb.sass" +@import "card.sass" +@import "dropdown.sass" +@import "list.sass" +@import "media.sass" +@import "menu.sass" +@import "message.sass" +@import "modal.sass" +@import "navbar.sass" +@import "pagination.sass" +@import "panel.sass" +@import "tabs.sass" diff --git a/guide/style/bulma-prefers-dark/sass/components/breadcrumb.sass b/guide/style/bulma-prefers-dark/sass/components/breadcrumb.sass new file mode 100644 index 00000000..b92930a2 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/components/breadcrumb.sass @@ -0,0 +1,17 @@ +$breadcrumb-item-color-dark: $link-dark !default +$breadcrumb-item-hover-color-dark: $link-hover-dark !default +$breadcrumb-item-active-color-dark: $text-strong-dark !default + +$breadcrumb-item-separator-color-dark: $grey-dark !default + +.breadcrumb + a + color: $breadcrumb-item-color-dark + &:hover + color: $breadcrumb-item-hover-color-dark + li + &.is-active + a + color: $breadcrumb-item-active-color-dark + & + li::before + color: $breadcrumb-item-separator-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/components/card.sass b/guide/style/bulma-prefers-dark/sass/components/card.sass new file mode 100644 index 00000000..bf2abd92 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/components/card.sass @@ -0,0 +1,26 @@ +$card-color-dark: $text-dark !default +$card-background-color-dark: $black !default +$card-shadow-dark: 0 2px 3px rgba($white, 0.1), 0 0 0 1px rgba($white, 0.1) !default + +$card-header-color-dark: $text-strong-dark !default +$card-header-shadow-dark: 0 1px 2px rgba($white, 0.1) !default + +$card-footer-border-top-dark: 1px solid $border-dark !default + +.card + background-color: $card-background-color-dark + box-shadow: $card-shadow-dark + color: $card-color-dark + +.card-header + box-shadow: $card-header-shadow-dark + +.card-header-title + color: $card-header-color-dark + +.card-footer + border-top: $card-footer-border-top-dark + +.card-footer-item + &:not(:last-child) + border-right: $card-footer-border-top-dark diff --git a/guide/style/bulma-prefers-dark/sass/components/dropdown.sass b/guide/style/bulma-prefers-dark/sass/components/dropdown.sass new file mode 100644 index 00000000..e312ae8c --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/components/dropdown.sass @@ -0,0 +1,30 @@ +$dropdown-content-background-color-dark: $black !default +$dropdown-content-arrow: $link-dark !default +$dropdown-content-shadow-dark: 0 2px 3px rgba($white, 0.1), 0 0 0 1px rgba($white, 0.1) !default + +$dropdown-item-color-dark: $grey-light !default +$dropdown-item-hover-color-dark: $white !default +$dropdown-item-hover-background-color-dark: $background-dark !default +$dropdown-item-active-color-dark: $link-invert-dark !default +$dropdown-item-active-background-color-dark: $link-dark !default + +$dropdown-divider-background-color-dark: $border-dark !default + +.dropdown-content + background-color: $dropdown-content-background-color-dark + box-shadow: $dropdown-content-shadow-dark + +.dropdown-item + color: $dropdown-item-color-dark + +a.dropdown-item, +button.dropdown-item + &:hover + background-color: $dropdown-item-hover-background-color-dark + color: $dropdown-item-hover-color-dark + &.is-active + background-color: $dropdown-item-active-background-color-dark + color: $dropdown-item-active-color-dark + +.dropdown-divider + background-color: $dropdown-divider-background-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/components/list.sass b/guide/style/bulma-prefers-dark/sass/components/list.sass new file mode 100644 index 00000000..6b7470de --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/components/list.sass @@ -0,0 +1,27 @@ +$list-background-color-dark: $black !default +$list-shadow-dark: 0 2px 3px rgba($white, 0.1), 0 0 0 1px rgba($white, 0.1) !default + +$list-item-border-dark: 1px solid $border-dark !default +$list-item-color-dark: $text-dark !default +$list-item-active-background-color-dark: $link-dark !default +$list-item-active-color-dark: $link-invert-dark !default +$list-item-hover-background-color-dark: $background-dark !default + +.list + background-color: $list-background-color-dark + box-shadow: $list-shadow-dark + // &.is-hoverable > .list-item:hover:not(.is-active) + // background-color: $list-item-hover-background-color-dark + // cursor: pointer + +.list-item + &:not(a) + color: $list-item-color-dark + &:not(:last-child) + border-bottom: $list-item-border-dark + &.is-active + background-color: $list-item-active-background-color-dark + color: $list-item-active-color-dark + +a.list-item + background-color: $list-item-hover-background-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/components/media.sass b/guide/style/bulma-prefers-dark/sass/components/media.sass new file mode 100644 index 00000000..edb2aba1 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/components/media.sass @@ -0,0 +1,5 @@ +.media + .media + border-top: 1px solid rgba($border-dark, 0.5) + & + .media + border-top: 1px solid rgba($border-dark, 0.5) diff --git a/guide/style/bulma-prefers-dark/sass/components/menu.sass b/guide/style/bulma-prefers-dark/sass/components/menu.sass new file mode 100644 index 00000000..03791fb9 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/components/menu.sass @@ -0,0 +1,21 @@ +$menu-item-color-dark: $text-dark !default +$menu-item-hover-color-dark: $text-strong-dark !default +$menu-item-hover-background-color-dark: $background-dark !default +$menu-item-active-color-dark: $link-invert-dark !default +$menu-item-active-background-color-dark: $link-dark !default + +$menu-list-border-left-dark: 1px solid $border-dark !default + +.menu-list + a + color: $menu-item-color-dark + &:hover + background-color: $menu-item-hover-background-color-dark + color: $menu-item-hover-color-dark + // Modifiers + &.is-active + background-color: $menu-item-active-background-color-dark + color: $menu-item-active-color-dark + li + ul + border-left: $menu-list-border-left-dark diff --git a/guide/style/bulma-prefers-dark/sass/components/message.sass b/guide/style/bulma-prefers-dark/sass/components/message.sass new file mode 100644 index 00000000..a4ec65cc --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/components/message.sass @@ -0,0 +1,48 @@ +$message-background-color-dark: $background-dark !default + +$message-header-background-color-dark: $text-dark !default +$message-header-color-dark: $text-invert-dark !default + +$message-body-border-color-dark: $border-dark !default +$message-body-color-dark: $text-dark !default + +$message-body-pre-background-color-dark: $black !default + +.message + background-color: $message-background-color-dark + // Colors + @each $name, $pair in $colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name} + background-color: $background-dark + .message-header + background-color: $color + color: $color-invert + .message-body + border-color: $color + color: $text-dark + + // Dark Colors + @each $name, $pair in $colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name}-dark + background-color: $background-dark + .message-header + background-color: $color + color: $color-invert + .message-body + border-color: $color + color: $text-dark + +.message-header + background-color: $message-header-background-color-dark + color: $message-header-color-dark + +.message-body + border-color: $message-body-border-color-dark + color: $message-body-color-dark + code, + pre + background-color: $message-body-pre-background-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/components/modal.sass b/guide/style/bulma-prefers-dark/sass/components/modal.sass new file mode 100644 index 00000000..fac9cf79 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/components/modal.sass @@ -0,0 +1,30 @@ +$modal-background-background-color-dark: rgba($white, 0.86) !default + +$modal-card-head-background-color-dark: $background-dark !default +$modal-card-head-border-bottom-dark: 1px solid $border-dark !default + +$modal-card-title-color-dark: $text-strong-dark !default + +$modal-card-foot-border-top-dark: 1px solid $border-dark !default + +$modal-card-body-background-color-dark: $white !default + +.modal-background + background-color: $modal-background-background-color-dark + +.modal-card-head, +.modal-card-foot + background-color: $modal-card-head-background-color-dark + +.modal-card-head + border-bottom: $modal-card-head-border-bottom-dark + +.modal-card-title + color: $modal-card-title-color-dark + +.modal-card-foot + border-top: $modal-card-foot-border-top-dark + +.modal-card-body + +overflow-touch + background-color: $modal-card-body-background-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/components/navbar.sass b/guide/style/bulma-prefers-dark/sass/components/navbar.sass new file mode 100644 index 00000000..21b9b8e9 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/components/navbar.sass @@ -0,0 +1,214 @@ +$navbar-background-color-dark: $body-background-dark !default +$navbar-box-shadow-size: 0 2px 0 0 !default +$navbar-box-shadow-color-dark: $background-dark !default + +$navbar-item-color-dark: $grey-light !default +$navbar-item-hover-color-dark: $link-dark !default +$navbar-item-hover-background-color-dark: $black-bis !default +$navbar-item-active-color-dark: $white !default + +$navbar-burger-color-dark: $navbar-item-color-dark !default + +$navbar-tab-hover-border-bottom-color-dark: $link-dark !default +$navbar-tab-active-color-dark: $link-dark !default +$navbar-tab-active-border-bottom-color-dark: $link-dark !default + +$navbar-dropdown-background-color-dark: $black !default +$navbar-dropdown-border-top-dark: 2px solid $border-dark !default +$navbar-dropdown-arrow-dark: $link-dark !default + +$navbar-dropdown-boxed-shadow-dark: 0 8px 8px rgba($white, 0.1), 0 0 0 1px rgba($white, 0.1) !default + +$navbar-dropdown-item-hover-color-dark: $white !default +$navbar-dropdown-item-hover-background-color-dark: $background-dark !default +$navbar-dropdown-item-active-color-dark: $link-dark !default +$navbar-dropdown-item-active-background-color-dark: $background-dark !default + +$navbar-divider-background-color-dark: $background-dark !default + +$navbar-bottom-box-shadow-size: 0 -2px 0 0 !default + +$navbar-breakpoint: $desktop !default + +.navbar + background-color: $navbar-background-color-dark + @each $name, $pair in $colors + $color: darken(nth($pair, 1), 10%) + $color-invert: nth($pair, 2) + &.is-#{$name} + background-color: $color + color: $color-invert + .navbar-brand + & > .navbar-item, + .navbar-link + color: $color-invert + & > a.navbar-item, + .navbar-link + &:hover, + &.is-active + background-color: darken($color, 5%) + color: $color-invert + .navbar-link + &::after + border-color: $color-invert + .navbar-burger + color: $color-invert + +from($navbar-breakpoint) + .navbar-start, + .navbar-end + & > .navbar-item, + .navbar-link + color: $color-invert + & > a.navbar-item, + .navbar-link + &:hover, + &.is-active + background-color: darken($color, 5%) + color: $color-invert + .navbar-link + &::after + border-color: $color-invert + .navbar-item.has-dropdown:hover .navbar-link, + .navbar-item.has-dropdown.is-active .navbar-link + background-color: darken($color, 5%) + color: $color-invert + .navbar-dropdown + a.navbar-item + &.is-active + background-color: $color + color: $color-invert + // Colors Dark + @each $name, $pair in $colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name}-dark + background-color: $color + color: $color-invert + .navbar-brand + & > .navbar-item, + .navbar-link + color: $color-invert + & > a.navbar-item, + .navbar-link + &:hover, + &.is-active + background-color: darken($color, 5%) + color: $color-invert + .navbar-link + &::after + border-color: $color-invert + .navbar-burger + color: $color-invert + +from($navbar-breakpoint) + .navbar-start, + .navbar-end + & > .navbar-item, + .navbar-link + color: $color-invert + & > a.navbar-item, + .navbar-link + &:hover, + &.is-active + background-color: darken($color, 5%) + color: $color-invert + .navbar-link + &::after + border-color: $color-invert + .navbar-item.has-dropdown:hover .navbar-link, + .navbar-item.has-dropdown.is-active .navbar-link + background-color: darken($color, 5%) + color: $color-invert + .navbar-dropdown + a.navbar-item + &.is-active + background-color: $color + color: $color-invert + &.has-shadow + box-shadow: $navbar-box-shadow-size $navbar-box-shadow-color-dark + &.is-fixed-bottom + &.has-shadow + box-shadow: $navbar-bottom-box-shadow-size $navbar-box-shadow-color-dark + +.navbar-burger + color: $navbar-burger-color-dark + +.navbar-item, +.navbar-link + color: $navbar-item-color-dark + +a.navbar-item, +.navbar-link + &:hover, + &.is-active + background-color: $navbar-item-hover-background-color-dark + color: $navbar-item-hover-color-dark + +.navbar-item + &:hover + border-bottom-color: $navbar-tab-hover-border-bottom-color-dark + &.is-active + border-bottom-color: $navbar-tab-active-border-bottom-color-dark + color: $navbar-tab-active-color-dark + +.navbar-link:not(.is-arrowless) + &::after + border-color: $navbar-dropdown-arrow-dark + +.navbar-divider + background-color: $navbar-divider-background-color-dark + ++until($navbar-breakpoint) + .navbar-menu + background-color: $navbar-background-color-dark + box-shadow: 0 8px 16px rgba($white, 0.1) + // Fixed navbar + .navbar + &.is-fixed-bottom-touch + &.has-shadow + box-shadow: 0 -2px 3px rgba($white, 0.1) + ++from($navbar-breakpoint) + .navbar + &.is-transparent + .navbar-dropdown + a.navbar-item + &:hover + background-color: $navbar-dropdown-item-hover-background-color-dark + color: $navbar-dropdown-item-hover-color-dark + &.is-active + background-color: $navbar-dropdown-item-active-background-color-dark + color: $navbar-dropdown-item-active-color-dark + .navbar-item + &.has-dropdown-up + .navbar-dropdown + border-bottom: $navbar-dropdown-border-top-dark + box-shadow: 0 -8px 8px rgba($white, 0.1) + .navbar-dropdown + background-color: $navbar-dropdown-background-color-dark + border-top: $navbar-dropdown-border-top-dark + box-shadow: 0 8px 8px rgba($white, 0.1) + a.navbar-item + &:hover + background-color: $navbar-dropdown-item-hover-background-color-dark + color: $navbar-dropdown-item-hover-color-dark + &.is-active + background-color: $navbar-dropdown-item-active-background-color-dark + color: $navbar-dropdown-item-active-color-dark + .navbar.is-spaced &, + &.is-boxed + box-shadow: $navbar-dropdown-boxed-shadow-dark + // Fixed navbar + .navbar + &.is-fixed-bottom-desktop + &.has-shadow + box-shadow: 0 -2px 3px rgba($white, 0.1) + // Hover/Active states + a.navbar-item, + .navbar-link + &.is-active + color: $navbar-item-active-color-dark + .navbar-item.has-dropdown + &:hover, + &.is-active + .navbar-link + background-color: $navbar-item-hover-background-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/components/pagination.sass b/guide/style/bulma-prefers-dark/sass/components/pagination.sass new file mode 100644 index 00000000..a11bcbf6 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/components/pagination.sass @@ -0,0 +1,49 @@ +$pagination-color-dark: $grey-lighter !default +$pagination-border-color-dark: $grey-darker !default + +$pagination-hover-color-dark: $link-hover-dark !default +$pagination-hover-border-color-dark: $link-hover-border-dark !default + +$pagination-focus-color-dark: $link-focus-dark !default +$pagination-focus-border-color-dark: $link-focus-border-dark !default + +$pagination-active-color-dark: $link-active-dark !default +$pagination-active-border-color-dark: $link-active-border-dark !default + +$pagination-disabled-color-dark: $grey !default +$pagination-disabled-background-color-dark: $grey-darker !default +$pagination-disabled-border-color-dark: $grey-darker !default + +$pagination-current-color-dark: $link-invert-dark !default +$pagination-current-background-color-dark: $link-dark !default +$pagination-current-border-color-dark: $link-dark !default + +$pagination-ellipsis-color-dark: $grey-dark !default + +$pagination-shadow-inset-dark: inset 0 1px 2px rgba($white, 0.2) + +.pagination-previous, +.pagination-next, +.pagination-link + border-color: $pagination-border-color-dark + color: $pagination-color-dark + &:hover + border-color: $pagination-hover-border-color-dark + color: $pagination-hover-color-dark + &:focus + border-color: $pagination-focus-border-color-dark + &:active + box-shadow: $pagination-shadow-inset-dark + &[disabled] + background-color: $pagination-disabled-background-color-dark + border-color: $pagination-disabled-border-color-dark + color: $pagination-disabled-color-dark + +.pagination-link + &.is-current + background-color: $pagination-current-background-color-dark + border-color: $pagination-current-border-color-dark + color: $pagination-current-color-dark + +.pagination-ellipsis + color: $pagination-ellipsis-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/components/panel.sass b/guide/style/bulma-prefers-dark/sass/components/panel.sass new file mode 100644 index 00000000..8b28e4fb --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/components/panel.sass @@ -0,0 +1,57 @@ +$panel-item-border-dark: 1px solid $border-dark !default + +$panel-heading-background-color-dark: $background-dark !default +$panel-heading-color-dark: $text-strong-dark !default + +$panel-tab-border-bottom-dark: 1px solid $border-dark !default +$panel-tab-active-border-bottom-color-dark: $link-active-border-dark !default +$panel-tab-active-color-dark: $link-active-dark !default + +$panel-list-item-color-dark: $text-dark !default +$panel-list-item-hover-color-dark: $link-dark !default + +$panel-block-color-dark: $text-strong-dark !default +$panel-block-hover-background-color-dark: $background-dark !default +$panel-block-active-border-left-color-dark: $link-dark !default +$panel-block-active-color-dark: $link-active-dark !default +$panel-block-active-icon-color-dark: $link-dark !default + +.panel-heading, +.panel-tabs, +.panel-block + border-bottom: $panel-item-border-dark + border-left: $panel-item-border-dark + border-right: $panel-item-border-dark + &:first-child + border-top: $panel-item-border-dark + +.panel-heading + background-color: $panel-heading-background-color-dark + color: $panel-heading-color-dark + +.panel-tabs + a + border-bottom: $panel-tab-border-bottom-dark + // Modifiers + &.is-active + border-bottom-color: $panel-tab-active-border-bottom-color-dark + color: $panel-tab-active-color-dark + +.panel-list + a + color: $panel-list-item-color-dark + &:hover + color: $panel-list-item-hover-color-dark + +.panel-block + color: $panel-block-color-dark + &.is-active + border-left-color: $panel-block-active-border-left-color-dark + color: $panel-block-active-color-dark + .panel-icon + color: $panel-block-active-icon-color-dark + +a.panel-block, +label.panel-block + &:hover + background-color: $panel-block-hover-background-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/components/tabs.sass b/guide/style/bulma-prefers-dark/sass/components/tabs.sass new file mode 100644 index 00000000..61e67d03 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/components/tabs.sass @@ -0,0 +1,57 @@ +$tabs-border-bottom-color-dark: $border-dark !default +$tabs-link-color-dark: $text-dark !default +$tabs-link-hover-border-bottom-color-dark: $text-strong-dark !default +$tabs-link-hover-color-dark: $text-strong-dark !default +$tabs-link-active-border-bottom-color-dark: $link-dark !default +$tabs-link-active-color-dark: $link-dark !default + +$tabs-boxed-link-hover-background-color-dark: $background-dark !default +$tabs-boxed-link-hover-border-bottom-color-dark: $border-dark !default + +$tabs-boxed-link-active-background-color-dark: $black !default +$tabs-boxed-link-active-border-color-dark: $border-dark !default + +$tabs-toggle-link-border-color-dark: $border-dark !default +$tabs-toggle-link-hover-background-color-dark: $background-dark !default +$tabs-toggle-link-hover-border-color-dark: $border-hover-dark !default +$tabs-toggle-link-active-background-color-dark: $link-dark !default +$tabs-toggle-link-active-border-color-dark: $link-dark !default +$tabs-toggle-link-active-color-dark: $link-invert-dark !default + +.tabs + a + border-bottom-color: $tabs-border-bottom-color-dark + color: $tabs-link-color-dark + &:hover + border-bottom-color: $tabs-link-hover-border-bottom-color-dark + color: $tabs-link-hover-color-dark + li + &.is-active + a + border-bottom-color: $tabs-link-active-border-bottom-color-dark + color: $tabs-link-active-color-dark + ul + border-bottom-color: $tabs-border-bottom-color-dark + // Styles + &.is-boxed + a + &:hover + background-color: $tabs-boxed-link-hover-background-color-dark + border-bottom-color: $tabs-boxed-link-hover-border-bottom-color-dark + li + &.is-active + a + background-color: $tabs-boxed-link-active-background-color-dark + border-color: $tabs-boxed-link-active-border-color-dark + &.is-toggle + a + border-color: $tabs-toggle-link-border-color-dark + &:hover + background-color: $tabs-toggle-link-hover-background-color-dark + border-color: $tabs-toggle-link-hover-border-color-dark + li + &.is-active + a + background-color: $tabs-toggle-link-active-background-color-dark + border-color: $tabs-toggle-link-active-border-color-dark + color: $tabs-toggle-link-active-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/elements/_all.sass b/guide/style/bulma-prefers-dark/sass/elements/_all.sass new file mode 100644 index 00000000..2c1da4cc --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/elements/_all.sass @@ -0,0 +1,13 @@ +@charset "utf-8" + +@import "box.sass" +@import "button.sass" +@import "content.sass" +@import "form.sass" +@import "notification.sass" +@import "progress.sass" +@import "table.sass" +@import "tag.sass" +@import "title.sass" + +@import "other.sass" diff --git a/guide/style/bulma-prefers-dark/sass/elements/box.sass b/guide/style/bulma-prefers-dark/sass/elements/box.sass new file mode 100644 index 00000000..5d9de7f7 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/elements/box.sass @@ -0,0 +1,18 @@ +$box-color-dark: $text-dark !default +$box-background-color-dark: $black !default +$box-shadow-dark: 0 2px 3px rgba($white, 0.1), 0 0 0 1px rgba($white, 0.1) !default + +$box-link-hover-shadow-dark: 0 2px 3px rgba($white, 0.1), 0 0 0 1px $link-dark !default +$box-link-active-shadow-dark: inset 0 1px 2px rgba($white, 0.2), 0 0 0 1px $link-dark !default + +.box + background-color: $box-background-color-dark + box-shadow: $box-shadow-dark + color: $box-color-dark + +a.box + &:hover, + &:focus + box-shadow: $box-link-hover-shadow-dark + &:active + box-shadow: $box-link-active-shadow-dark diff --git a/guide/style/bulma-prefers-dark/sass/elements/button.sass b/guide/style/bulma-prefers-dark/sass/elements/button.sass new file mode 100644 index 00000000..16b4b7d7 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/elements/button.sass @@ -0,0 +1,218 @@ +$button-color-dark: $grey-lighter !default +$button-background-color-dark: $black !default + +$button-border-color-dark: $grey-darker !default + +$button-hover-color-dark: $link-hover-dark !default +$button-hover-border-color-dark: $link-hover-border-dark !default + +$button-focus-color-dark: $link-focus-dark !default +$button-focus-border-color-dark: $link-focus-border-dark !default +$button-focus-box-shadow-size: 0 0 0 0.125em !default +$button-focus-box-shadow-color-dark: rgba($link-dark, 0.25) !default + +$button-active-color-dark: $link-active-dark !default +$button-active-border-color-dark: $link-active-border-dark !default + +$button-text-color-dark: $text-dark !default +$button-text-hover-background-color-dark: $background-dark !default +$button-text-hover-color-dark: $text-strong-dark !default + +$button-disabled-background-color-dark: $black !default +$button-disabled-border-color-dark: $grey-darker !default + +$button-static-color-dark: $grey !default +$button-static-background-color-dark: $white-ter !default +$button-static-border-color-dark: $grey-darker !default + +.button + background-color: $button-background-color-dark + border-color: $button-border-color-dark + color: $button-color-dark + // States + &:hover, + &.is-hovered + border-color: $button-hover-border-color-dark + color: $button-hover-color-dark + &:focus, + &.is-focused + border-color: $button-focus-border-color-dark + color: $button-focus-color-dark + &:not(:active) + box-shadow: $button-focus-box-shadow-size $button-focus-box-shadow-color-dark + &:active, + &.is-active + border-color: $button-active-border-color-dark + color: $button-active-color-dark + // Colors + &.is-text + color: $button-text-color-dark + &:hover, + &.is-hovered, + &:focus, + &.is-focused + background-color: $button-text-hover-background-color-dark + color: $button-text-hover-color-dark + &:active, + &.is-active + background-color: darken($button-text-hover-background-color-dark, 5%) + color: $button-text-hover-color-dark + // Colors + @each $name, $pair in $colors + $color: darken(nth($pair, 1), 10%) + $color-invert: nth($pair, 2) + &.is-#{$name} + background-color: $color + border-color: transparent + color: $color-invert + &:hover, + &.is-hovered + background-color: darken($color, 2.5%) + border-color: transparent + color: $color-invert + &:focus, + &.is-focused + border-color: transparent + color: $color-invert + &:not(:active) + box-shadow: $button-focus-box-shadow-size rgba($color, 0.25) + &:active, + &.is-active + background-color: darken($color, 5%) + border-color: transparent + color: $color-invert + &[disabled], + fieldset[disabled] & + background-color: $color + border-color: transparent + box-shadow: none + &.is-inverted + background-color: $color-invert + color: $color + &:hover + background-color: darken($color-invert, 5%) + &[disabled], + fieldset[disabled] & + background-color: $color-invert + border-color: transparent + box-shadow: none + color: $color + &.is-loading + &::after + border-color: transparent transparent $color-invert $color-invert !important + &.is-outlined + background-color: transparent + border-color: $color + color: $color + &:hover, + &:focus + background-color: $color + border-color: $color + color: $color-invert + &.is-loading + &::after + border-color: transparent transparent $color $color !important + &[disabled], + fieldset[disabled] & + background-color: transparent + border-color: $color + box-shadow: none + color: $color + &.is-inverted.is-outlined + background-color: transparent + border-color: $color-invert + color: $color-invert + &:hover, + &:focus + background-color: $color-invert + color: $color + &[disabled], + fieldset[disabled] & + background-color: transparent + border-color: $color-invert + box-shadow: none + color: $color-invert + // Colors Dark + @each $name, $pair in $colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name}-dark + background-color: $color + border-color: transparent + color: $color-invert + &:hover, + &.is-hovered + background-color: darken($color, 2.5%) + border-color: transparent + color: $color-invert + &:focus, + &.is-focused + border-color: transparent + color: $color-invert + &:not(:active) + box-shadow: $button-focus-box-shadow-size rgba($color, 0.25) + &:active, + &.is-active + background-color: darken($color, 5%) + border-color: transparent + color: $color-invert + &[disabled], + fieldset[disabled] & + background-color: $color + border-color: transparent + box-shadow: none + &.is-inverted + background-color: $color-invert + color: $color + &:hover + background-color: darken($color-invert, 5%) + &[disabled], + fieldset[disabled] & + background-color: $color-invert + border-color: transparent + box-shadow: none + color: $color + &.is-loading + &::after + border-color: transparent transparent $color-invert $color-invert !important + &.is-outlined + background-color: transparent + border-color: $color + color: $color + &:hover, + &:focus + background-color: $color + border-color: $color + color: $color-invert + &.is-loading + &::after + border-color: transparent transparent $color $color !important + &[disabled], + fieldset[disabled] & + background-color: transparent + border-color: $color + box-shadow: none + color: $color + &.is-inverted.is-outlined + background-color: transparent + border-color: $color-invert + color: $color-invert + &:hover, + &:focus + background-color: $color-invert + color: $color + &[disabled], + fieldset[disabled] & + background-color: transparent + border-color: $color-invert + box-shadow: none + color: $color-invert + // Modifiers + &[disabled], + fieldset[disabled] & + background-color: $button-disabled-background-color-dark + border-color: $button-disabled-border-color-dark + &.is-static + background-color: $button-static-background-color-dark + border-color: $button-static-border-color-dark + color: $button-static-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/elements/content.sass b/guide/style/bulma-prefers-dark/sass/elements/content.sass new file mode 100644 index 00000000..d44fa1f7 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/elements/content.sass @@ -0,0 +1,35 @@ +$content-heading-color-dark: $text-strong-dark !default + +$content-blockquote-background-color-dark: $background-dark !default +$content-blockquote-border-left-dark: 5px solid $border-dark !default + +$content-table-cell-border-dark: 1px solid $border-dark !default +$content-table-cell-heading-color-dark: $text-strong-dark !default +$content-table-head-cell-color-dark: $text-strong-dark !default +$content-table-foot-cell-color-dark: $text-strong-dark !default + +.content + h1, + h2, + h3, + h4, + h5, + h6 + color: $content-heading-color-dark + blockquote + background-color: $content-blockquote-background-color-dark + border-left: $content-blockquote-border-left-dark + table + td, + th + border: $content-table-cell-border-dark + th + color: $content-table-cell-heading-color-dark + thead + td, + th + color: $content-table-head-cell-color-dark + tfoot + td, + th + color: $content-table-foot-cell-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/elements/form.sass b/guide/style/bulma-prefers-dark/sass/elements/form.sass new file mode 100644 index 00000000..37a4f08a --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/elements/form.sass @@ -0,0 +1,236 @@ +$input-color-dark: $grey-lighter !default +$input-background-color-dark: $black !default +$input-border-color-dark: $grey-darker !default +$input-shadow-dark: inset 0 1px 2px rgba($white, 0.1) !default +$input-placeholder-color-dark: rgba($input-color-dark, 0.3) !default + +$input-hover-color-dark: $grey-lighter !default +$input-hover-border-color-dark: $grey-dark !default + +$input-focus-color-dark: $grey-lighter !default +$input-focus-border-color-dark: $link-dark !default +$input-focus-box-shadow-size: 0 0 0 0.125em !default +$input-focus-box-shadow-color-dark: rgba($link-dark, 0.25) !default + +$input-disabled-color-dark: $text-dark !default +$input-disabled-background-color-dark: $background-dark !default +$input-disabled-border-color-dark: $background-dark !default +$input-disabled-placeholder-color-dark: rgba($input-disabled-color-dark, 0.3) !default + +$input-arrow-dark: $link-dark !default + +$input-icon-color-dark: $grey-darker !default + +$file-border-color-dark: $border-dark !default + +$file-cta-background-color-dark: $black-ter !default +$file-cta-color-dark: $grey-light !default +$file-cta-hover-color-dark: $grey-lighter !default +$file-cta-active-color-dark: $grey-lighter !default + +$file-name-border-color-dark: $border-dark !default + +$label-color-dark: $grey-lighter !default + +=input + background-color: $input-background-color-dark + border-color: $input-border-color-dark + color: $input-color-dark + +placeholder + color: $input-placeholder-color-dark + &:hover, + &.is-hovered + border-color: $input-hover-border-color-dark + &:focus, + &.is-focused, + &:active, + &.is-active + border-color: $input-focus-border-color-dark + box-shadow: $input-focus-box-shadow-size $input-focus-box-shadow-color-dark + &[disabled], + fieldset[disabled] & + background-color: $input-disabled-background-color-dark + border-color: $input-disabled-border-color-dark + color: $input-disabled-color-dark + +placeholder + color: $input-disabled-placeholder-color-dark + +.input, +.textarea + +input + box-shadow: $input-shadow-dark + // Colors + @each $name, $pair in $colors + $color: darken(nth($pair, 1), 10%) + &.is-#{$name} + border-color: $color + &:focus, + &.is-focused, + &:active, + &.is-active + box-shadow: $input-focus-box-shadow-size rgba($color, 0.25) + // Colors Dark + @each $name, $pair in $colors + $color: nth($pair, 1) + &.is-#{$name}-dark + border-color: $color + &:focus, + &.is-focused, + &:active, + &.is-active + box-shadow: $input-focus-box-shadow-size rgba($color, 0.25) + +.checkbox, +.radio + &:hover + color: $input-hover-color-dark + &[disabled], + fieldset[disabled] & + color: $input-disabled-color-dark + +.select + &:not(.is-multiple):not(.is-loading) + &::after + border-color: $input-arrow-dark + select + +input + &[disabled]:hover, + fieldset[disabled] &:hover + border-color: $input-disabled-border-color-dark + option + color: $input-color-dark + // States + &:not(.is-multiple):not(.is-loading):hover + &::after + border-color: $input-hover-color-dark + // Colors + @each $name, $pair in $colors + $color: darken(nth($pair, 1), 10%) + &.is-#{$name} + &:not(:hover)::after + border-color: $color + select + border-color: $color + &:hover, + &.is-hovered + border-color: darken($color, 5%) + &:focus, + &.is-focused, + &:active, + &.is-active + box-shadow: $input-focus-box-shadow-size rgba($color, 0.25) + // Colors Dark + @each $name, $pair in $colors + $color: nth($pair, 1) + &.is-#{$name}-dark + &:not(:hover)::after + border-color: $color + select + border-color: $color + &:hover, + &.is-hovered + border-color: darken($color, 5%) + &:focus, + &.is-focused, + &:active, + &.is-active + box-shadow: $input-focus-box-shadow-size rgba($color, 0.25) + // Modifiers + &.is-disabled + &::after + border-color: $input-disabled-color-dark + +.file + // Colors + @each $name, $pair in $colors + $color: darken(nth($pair, 1), 10%) + $color-invert: nth($pair, 2) + &.is-#{$name} + .file-cta + background-color: $color + color: $color-invert + &:hover, + &.is-hovered + .file-cta + background-color: darken($color, 2.5%) + color: $color-invert + &:focus, + &.is-focused + .file-cta + box-shadow: 0 0 0.5em rgba($color, 0.25) + color: $color-invert + &:active, + &.is-active + .file-cta + background-color: darken($color, 5%) + color: $color-invert + // Colors Dark + @each $name, $pair in $colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name}-dark + .file-cta + background-color: $color + color: $color-invert + &:hover, + &.is-hovered + .file-cta + background-color: darken($color, 2.5%) + color: $color-invert + &:focus, + &.is-focused + .file-cta + box-shadow: 0 0 0.5em rgba($color, 0.25) + color: $color-invert + &:active, + &.is-active + .file-cta + background-color: darken($color, 5%) + color: $color-invert + +.file-label + &:hover + .file-cta + background-color: darken($file-cta-background-color-dark, 2.5%) + color: $file-cta-hover-color-dark + .file-name + border-color: darken($file-name-border-color-dark, 2.5%) + &:active + .file-cta + background-color: darken($file-cta-background-color-dark, 5%) + color: $file-cta-active-color-dark + .file-name + border-color: darken($file-name-border-color-dark, 5%) + +.file-cta, +.file-name + border-color: $file-border-color-dark + +.file-cta + background-color: $file-cta-background-color-dark + color: $file-cta-color-dark + +.file-name + border-color: $file-name-border-color-dark + +.label + color: $label-color-dark + +.help + @each $name, $pair in $colors + $color: darken(nth($pair, 1), 10%) + &.is-#{$name} + color: $color + @each $name, $pair in $colors + $color: nth($pair, 1) + &.is-#{$name}-dark + color: $color + +// Containers + +.control + // Modifiers + &.has-icons-left, + &.has-icons-right + .icon + color: $input-icon-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/elements/notification.sass b/guide/style/bulma-prefers-dark/sass/elements/notification.sass new file mode 100644 index 00000000..ee961908 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/elements/notification.sass @@ -0,0 +1,21 @@ +$notification-background-color-dark: $background-dark !default + +.notification + background-color: $notification-background-color-dark + code, + pre + background: $black + // Colors + @each $name, $pair in $colors + $color: darken(nth($pair, 1), 10%) + $color-invert: nth($pair, 2) + &.is-#{$name} + background-color: $color + color: $color-invert + // Colors Dark + @each $name, $pair in $colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name}-dark + background-color: $color + color: $color-invert diff --git a/guide/style/bulma-prefers-dark/sass/elements/other.sass b/guide/style/bulma-prefers-dark/sass/elements/other.sass new file mode 100644 index 00000000..cb412077 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/elements/other.sass @@ -0,0 +1,2 @@ +.number + background-color: $background-dark diff --git a/guide/style/bulma-prefers-dark/sass/elements/progress.sass b/guide/style/bulma-prefers-dark/sass/elements/progress.sass new file mode 100644 index 00000000..6b2754b0 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/elements/progress.sass @@ -0,0 +1,39 @@ +$progress-bar-background-color-dark: $border-dark !default +$progress-value-background-color-dark: $text-dark !default + +.progress + &::-webkit-progress-bar + background-color: $progress-bar-background-color-dark + &::-webkit-progress-value + background-color: $progress-value-background-color-dark + &::-moz-progress-bar + background-color: $progress-value-background-color-dark + &::-ms-fill + background-color: $progress-value-background-color-dark + &:indeterminate + background-color: $progress-bar-background-color-dark + background-image: linear-gradient(to right, $text 30%, $progress-bar-background-color-dark 30%) + // Colors + @each $name, $pair in $colors + $color: darken(nth($pair, 1), 10%) + &.is-#{$name} + &::-webkit-progress-value + background-color: $color + &::-moz-progress-bar + background-color: $color + &::-ms-fill + background-color: $color + &:indeterminate + background-image: linear-gradient(to right, $color 30%, $progress-bar-background-color-dark 30%) + // Colors Dark + @each $name, $pair in $colors + $color: nth($pair, 1) + &.is-#{$name}-dark + &::-webkit-progress-value + background-color: $color + &::-moz-progress-bar + background-color: $color + &::-ms-fill + background-color: $color + &:indeterminate + background-image: linear-gradient(to right, $color 30%, $progress-bar-background-color-dark 30%) diff --git a/guide/style/bulma-prefers-dark/sass/elements/table.sass b/guide/style/bulma-prefers-dark/sass/elements/table.sass new file mode 100644 index 00000000..e4fd42dd --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/elements/table.sass @@ -0,0 +1,78 @@ +$table-color-dark: $grey-lighter !default +$table-background-color-dark: $black !default + +$table-cell-border-dark: 1px solid $grey-darker !default +$table-cell-heading-color-dark: $text-strong-dark !default + +$table-head-cell-color-dark: $text-strong-dark !default +$table-foot-cell-color-dark: $text-strong-dark !default + +$table-row-hover-background-color-dark: $black-bis !default + +$table-row-active-background-color-dark: $primary-dark !default +$table-row-active-color-dark: $primary-invert-dark !default + +$table-striped-row-even-background-color-dark: $black-bis !default +$table-striped-row-even-hover-background-color-dark: $black-ter !default + +.table + background-color: $table-background-color-dark + color: $table-color-dark + td, + th + border: $table-cell-border-dark + // Colors + @each $name, $pair in $colors + $color: darken(nth($pair, 1), 10%) + $color-invert: nth($pair, 2) + &.is-#{$name} + background-color: $color + border-color: $color + color: $color-invert + // Colors Dark + @each $name, $pair in $colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name}-dark + background-color: $color + border-color: $color + color: $color-invert + // Modifiers + &.is-selected + background-color: $table-row-active-background-color-dark + color: $table-row-active-color-dark + th + color: $table-cell-heading-color-dark + tr + &.is-selected + background-color: $table-row-active-background-color-dark + color: $table-row-active-color-dark + td, + th + border-color: $table-row-active-color-dark + thead + td, + th + color: $table-head-cell-color-dark + tfoot + td, + th + color: $table-foot-cell-color-dark + // Modifiers + &.is-hoverable + tbody + tr:not(.is-selected) + &:hover + background-color: $table-row-hover-background-color-dark + &.is-striped + tbody + tr:not(.is-selected) + &:hover + background-color: $table-row-hover-background-color-dark + &:nth-child(even) + background-color: $table-striped-row-even-hover-background-color-dark + &.is-striped + tbody + tr:not(.is-selected) + &:nth-child(even) + background-color: $table-striped-row-even-background-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/elements/tag.sass b/guide/style/bulma-prefers-dark/sass/elements/tag.sass new file mode 100644 index 00000000..4a08fd03 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/elements/tag.sass @@ -0,0 +1,27 @@ +$tag-background-color-dark: $background-dark !default +$tag-color-dark: $text-dark !default + +.tag:not(body) + background-color: $tag-background-color-dark + color: $tag-color-dark + // Colors + @each $name, $pair in $colors + $color: darken(nth($pair, 1), 10%) + $color-invert: nth($pair, 2) + &.is-#{$name} + background-color: $color + color: $color-invert + // Colors Dark + @each $name, $pair in $colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name}-dark + background-color: $color + color: $color-invert + // Modifiers + &.is-delete + &:hover, + &:focus + background-color: darken($tag-background-color-dark, 5%) + &:active + background-color: darken($tag-background-color-dark, 10%) diff --git a/guide/style/bulma-prefers-dark/sass/elements/title.sass b/guide/style/bulma-prefers-dark/sass/elements/title.sass new file mode 100644 index 00000000..e200b667 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/elements/title.sass @@ -0,0 +1,12 @@ +$title-color-dark: $grey-lighter !default + +$subtitle-color-dark: $grey-light !default +$subtitle-strong-color-dark: $grey-lighter !default + +.title + color: $title-color-dark + +.subtitle + color: $subtitle-color-dark + strong + color: $subtitle-strong-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/layout/_all.sass b/guide/style/bulma-prefers-dark/sass/layout/_all.sass new file mode 100644 index 00000000..ad4ed633 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/layout/_all.sass @@ -0,0 +1,4 @@ +@charset "utf-8" + +@import "hero.sass" +@import "footer.sass" diff --git a/guide/style/bulma-prefers-dark/sass/layout/footer.sass b/guide/style/bulma-prefers-dark/sass/layout/footer.sass new file mode 100644 index 00000000..ae75722c --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/layout/footer.sass @@ -0,0 +1,4 @@ +$footer-background-color-dark: $black-bis !default + +.footer + background-color: $footer-background-color-dark diff --git a/guide/style/bulma-prefers-dark/sass/layout/hero.sass b/guide/style/bulma-prefers-dark/sass/layout/hero.sass new file mode 100644 index 00000000..1d40d992 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/layout/hero.sass @@ -0,0 +1,146 @@ +// Main container + +.hero + // Colors + @each $name, $pair in $colors + $color: darken(nth($pair, 1), 10%) + $color-invert: nth($pair, 2) + &.is-#{$name}, &.is-#{$name}-dark + background-color: $color + color: $color-invert + a:not(.button):not(.dropdown-item):not(.tag), + strong + color: inherit + .title + color: $color-invert + .subtitle + color: rgba($color-invert, 0.9) + a:not(.button), + strong + color: $color-invert + .navbar-menu + +touch + background-color: $color + .navbar-item, + .navbar-link + color: rgba($color-invert, 0.7) + a.navbar-item, + .navbar-link + &:hover, + &.is-active + background-color: darken($color, 5%) + color: $color-invert + .tabs + a + color: $color-invert + opacity: 0.9 + &:hover + opacity: 1 + li + &.is-active a + opacity: 1 + &.is-boxed, + &.is-toggle + a + color: $color-invert + &:hover + background-color: rgba($black, 0.1) + li.is-active a + &, + &:hover + background-color: $color-invert + border-color: $color-invert + color: $color + // Modifiers + &.is-bold + $gradient-top-left: darken(saturate(adjust-hue($color, -10deg), 10%), 10%) + $gradient-bottom-right: lighten(saturate(adjust-hue($color, 10deg), 5%), 5%) + background-image: linear-gradient(141deg, $gradient-top-left 0%, $color 71%, $gradient-bottom-right 100%) + +mobile + .navbar-menu + background-image: linear-gradient(141deg, $gradient-top-left 0%, $color 71%, $gradient-bottom-right 100%) + // Responsiveness + // +mobile + // .nav-toggle + // span + // background-color: $color-invert + // &:hover + // background-color: rgba($black, 0.1) + // &.is-active + // span + // background-color: $color-invert + // .nav-menu + // .nav-item + // border-top-color: rgba($color-invert, 0.2) + + // Colors dark + @each $name, $pair in $colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name}-dark + background-color: $color + color: $color-invert + a:not(.button):not(.dropdown-item):not(.tag), + strong + color: inherit + .title + color: $color-invert + .subtitle + color: rgba($color-invert, 0.9) + a:not(.button), + strong + color: $color-invert + .navbar-menu + +touch + background-color: $color + .navbar-item, + .navbar-link + color: rgba($color-invert, 0.7) + a.navbar-item, + .navbar-link + &:hover, + &.is-active + background-color: darken($color, 5%) + color: $color-invert + .tabs + a + color: $color-invert + opacity: 0.9 + &:hover + opacity: 1 + li + &.is-active a + opacity: 1 + &.is-boxed, + &.is-toggle + a + color: $color-invert + &:hover + background-color: rgba($black, 0.1) + li.is-active a + &, + &:hover + background-color: $color-invert + border-color: $color-invert + color: $color + // Modifiers + &.is-bold + $gradient-top-left: darken(saturate(adjust-hue($color, -10deg), 10%), 10%) + $gradient-bottom-right: lighten(saturate(adjust-hue($color, 10deg), 5%), 5%) + background-image: linear-gradient(141deg, $gradient-top-left 0%, $color 71%, $gradient-bottom-right 100%) + +mobile + .navbar-menu + background-image: linear-gradient(141deg, $gradient-top-left 0%, $color 71%, $gradient-bottom-right 100%) + // Responsiveness + // +mobile + // .nav-toggle + // span + // background-color: $color-invert + // &:hover + // background-color: rgba($black, 0.1) + // &.is-active + // span + // background-color: $color-invert + // .nav-menu + // .nav-item + // border-top-color: rgba($color-invert, 0.2) diff --git a/guide/style/bulma-prefers-dark/sass/utilities/_all.sass b/guide/style/bulma-prefers-dark/sass/utilities/_all.sass new file mode 100644 index 00000000..fb038f39 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/utilities/_all.sass @@ -0,0 +1,5 @@ +@charset "utf-8" + +@import "initial-variables.sass" +@import "derived-variables.sass" +@import "mixins.sass" diff --git a/guide/style/bulma-prefers-dark/sass/utilities/derived-variables.sass b/guide/style/bulma-prefers-dark/sass/utilities/derived-variables.sass new file mode 100644 index 00000000..4f487059 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/utilities/derived-variables.sass @@ -0,0 +1,67 @@ +$primary-dark: darken($turquoise, 10%) !default + +$info: darken($cyan, 10%) !default +$success: darken($green, 10%) !default +$warning: darken($yellow, 10%) !default +$danger: darken($red, 10%) !default + +$light: $white-ter !default +$dark: $grey-darker !default + +// Invert colors + +$orange-invert: findColorInvert($orange) !default +$yellow-invert: findColorInvert($yellow) !default +$green-invert: findColorInvert($green) !default +$turquoise-invert: findColorInvert($turquoise) !default +$cyan-invert: findColorInvert($cyan) !default +$blue-invert: findColorInvert($blue) !default +$purple-invert: findColorInvert($purple) !default +$red-invert: findColorInvert($red) !default + +$primary-invert: $turquoise-invert !default +$primary-invert-dark: darken($turquoise-invert, 10%) !default +$info-invert: $cyan-invert !default +$success-invert: $green-invert !default +$warning-invert: $yellow-invert !default +$danger-invert: $red-invert !default +$light-invert: $dark !default +$dark-invert: $light !default + +// General colors + +$background: $white-ter !default +$background-dark: $black-ter !default + +$border-dark: $grey-darker !default +$border-hover-dark: $grey-dark !default + +// Text colors + +$text-dark: $grey-light !default +$text-invert: findColorInvert($text) !default +$text-invert-dark: findColorInvert($text-dark) !default +$text-light: $grey !default +$text-strong-dark: $grey-lighter !default + +// Code colors + +$code-dark: darken($red, 15%) !default +$code-background-dark: $background-dark !default + +$pre-dark: $text-dark !default +$pre-background-dark: $background-dark !default + +// Link colors + +$link-dark: $blue-light !default +$link-invert-dark: $blue-invert !default + +$link-hover-dark: $grey-lighter !default +$link-hover-border-dark: $grey-dark !default + +$link-focus-dark: $grey-lighter !default +$link-focus-border-dark: $blue-light !default + +$link-active-dark: $grey-lighter !default +$link-active-border-dark: $grey-light !default diff --git a/guide/style/bulma-prefers-dark/sass/utilities/initial-variables.sass b/guide/style/bulma-prefers-dark/sass/utilities/initial-variables.sass new file mode 100644 index 00000000..b168a506 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/utilities/initial-variables.sass @@ -0,0 +1,7 @@ +// Colors + +$blue-light: hsl(209, 71%, 63%) !default + +// Background + +$body-background-dark: #17181c !default diff --git a/guide/style/bulma-prefers-dark/sass/utilities/mixins.sass b/guide/style/bulma-prefers-dark/sass/utilities/mixins.sass new file mode 100644 index 00000000..e90d28d6 --- /dev/null +++ b/guide/style/bulma-prefers-dark/sass/utilities/mixins.sass @@ -0,0 +1,5 @@ +// Color schemes + +=prefers-scheme($scheme) + @media (prefers-color-scheme: $scheme) + @content diff --git a/guide/style/bulma/LICENSE b/guide/style/bulma/LICENSE new file mode 100644 index 00000000..3fdc17cd --- /dev/null +++ b/guide/style/bulma/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2022 Jeremy Thomas + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/guide/style/bulma/bulma.sass b/guide/style/bulma/bulma.sass new file mode 100644 index 00000000..87dec21b --- /dev/null +++ b/guide/style/bulma/bulma.sass @@ -0,0 +1,10 @@ +@charset "utf-8" +/*! bulma.io v0.9.4 | MIT License | github.com/jgthms/bulma */ +@import "sass/utilities/_all" +@import "sass/base/_all" +@import "sass/elements/_all" +@import "sass/form/_all" +@import "sass/components/_all" +@import "sass/grid/_all" +@import "sass/helpers/_all" +@import "sass/layout/_all" diff --git a/guide/style/bulma/sass/base/_all.sass b/guide/style/bulma/sass/base/_all.sass new file mode 100644 index 00000000..a5ae0a7b --- /dev/null +++ b/guide/style/bulma/sass/base/_all.sass @@ -0,0 +1,6 @@ +/* Bulma Base */ +@charset "utf-8" + +@import "minireset" +@import "generic" +@import "animations" diff --git a/guide/style/bulma/sass/base/animations.sass b/guide/style/bulma/sass/base/animations.sass new file mode 100644 index 00000000..a14525d7 --- /dev/null +++ b/guide/style/bulma/sass/base/animations.sass @@ -0,0 +1,5 @@ +@keyframes spinAround + from + transform: rotate(0deg) + to + transform: rotate(359deg) diff --git a/guide/style/bulma/sass/base/generic.sass b/guide/style/bulma/sass/base/generic.sass new file mode 100644 index 00000000..42c736ae --- /dev/null +++ b/guide/style/bulma/sass/base/generic.sass @@ -0,0 +1,145 @@ +@import "../utilities/mixins" + +$body-background-color: $scheme-main !default +$body-size: 16px !default +$body-min-width: 300px !default +$body-rendering: optimizeLegibility !default +$body-family: $family-primary !default +$body-overflow-x: hidden !default +$body-overflow-y: scroll !default + +$body-color: $text !default +$body-font-size: 1em !default +$body-weight: $weight-normal !default +$body-line-height: 1.5 !default + +$code-family: $family-code !default +$code-padding: 0.25em 0.5em 0.25em !default +$code-weight: normal !default +$code-size: 0.875em !default + +$small-font-size: 0.875em !default + +$hr-background-color: $background !default +$hr-height: 2px !default +$hr-margin: 1.5rem 0 !default + +$strong-color: $text-strong !default +$strong-weight: $weight-bold !default + +$pre-font-size: 0.875em !default +$pre-padding: 1.25rem 1.5rem !default +$pre-code-font-size: 1em !default + +html + background-color: $body-background-color + font-size: $body-size + -moz-osx-font-smoothing: grayscale + -webkit-font-smoothing: antialiased + min-width: $body-min-width + overflow-x: $body-overflow-x + overflow-y: $body-overflow-y + text-rendering: $body-rendering + text-size-adjust: 100% + +article, +aside, +figure, +footer, +header, +hgroup, +section + display: block + +body, +button, +input, +optgroup, +select, +textarea + font-family: $body-family + +code, +pre + -moz-osx-font-smoothing: auto + -webkit-font-smoothing: auto + font-family: $code-family + +body + color: $body-color + font-size: $body-font-size + font-weight: $body-weight + line-height: $body-line-height + +// Inline + +a + color: $link + cursor: pointer + text-decoration: none + strong + color: currentColor + &:hover + color: $link-hover + +code + background-color: $code-background + color: $code + font-size: $code-size + font-weight: $code-weight + padding: $code-padding + +hr + background-color: $hr-background-color + border: none + display: block + height: $hr-height + margin: $hr-margin + +img + height: auto + max-width: 100% + +input[type="checkbox"], +input[type="radio"] + vertical-align: baseline + +small + font-size: $small-font-size + +span + font-style: inherit + font-weight: inherit + +strong + color: $strong-color + font-weight: $strong-weight + +// Block + +fieldset + border: none + +pre + +overflow-touch + background-color: $pre-background + color: $pre + font-size: $pre-font-size + overflow-x: auto + padding: $pre-padding + white-space: pre + word-wrap: normal + code + background-color: transparent + color: currentColor + font-size: $pre-code-font-size + padding: 0 + +table + td, + th + vertical-align: top + &:not([align]) + text-align: inherit + th + color: $text-strong diff --git a/guide/style/bulma/sass/base/helpers.sass b/guide/style/bulma/sass/base/helpers.sass new file mode 100644 index 00000000..e356830f --- /dev/null +++ b/guide/style/bulma/sass/base/helpers.sass @@ -0,0 +1 @@ +@warn "The helpers.sass file is DEPRECATED. It has moved into its own /helpers folder. Please import sass/helpers/_all instead." diff --git a/guide/style/bulma/sass/base/minireset.sass b/guide/style/bulma/sass/base/minireset.sass new file mode 100644 index 00000000..aa2b6f3a --- /dev/null +++ b/guide/style/bulma/sass/base/minireset.sass @@ -0,0 +1,79 @@ +/*! minireset.css v0.0.6 | MIT License | github.com/jgthms/minireset.css */ +// Blocks +html, +body, +p, +ol, +ul, +li, +dl, +dt, +dd, +blockquote, +figure, +fieldset, +legend, +textarea, +pre, +iframe, +hr, +h1, +h2, +h3, +h4, +h5, +h6 + margin: 0 + padding: 0 + +// Headings +h1, +h2, +h3, +h4, +h5, +h6 + font-size: 100% + font-weight: normal + +// List +ul + list-style: none + +// Form +button, +input, +select, +textarea + margin: 0 + +// Box sizing +html + box-sizing: border-box + +* + &, + &::before, + &::after + box-sizing: inherit + +// Media +img, +video + height: auto + max-width: 100% + +// Iframe +iframe + border: 0 + +// Table +table + border-collapse: collapse + border-spacing: 0 + +td, +th + padding: 0 + &:not([align]) + text-align: inherit diff --git a/guide/style/bulma/sass/components/_all.sass b/guide/style/bulma/sass/components/_all.sass new file mode 100644 index 00000000..a7062ec1 --- /dev/null +++ b/guide/style/bulma/sass/components/_all.sass @@ -0,0 +1,15 @@ +/* Bulma Components */ +@charset "utf-8" + +@import "breadcrumb" +@import "card" +@import "dropdown" +@import "level" +@import "media" +@import "menu" +@import "message" +@import "modal" +@import "navbar" +@import "pagination" +@import "panel" +@import "tabs" diff --git a/guide/style/bulma/sass/components/breadcrumb.sass b/guide/style/bulma/sass/components/breadcrumb.sass new file mode 100644 index 00000000..60bb17b0 --- /dev/null +++ b/guide/style/bulma/sass/components/breadcrumb.sass @@ -0,0 +1,77 @@ +@import "../utilities/mixins" + +$breadcrumb-item-color: $link !default +$breadcrumb-item-hover-color: $link-hover !default +$breadcrumb-item-active-color: $text-strong !default + +$breadcrumb-item-padding-vertical: 0 !default +$breadcrumb-item-padding-horizontal: 0.75em !default + +$breadcrumb-item-separator-color: $border-hover !default + +.breadcrumb + @extend %block + @extend %unselectable + font-size: $size-normal + white-space: nowrap + a + align-items: center + color: $breadcrumb-item-color + display: flex + justify-content: center + padding: $breadcrumb-item-padding-vertical $breadcrumb-item-padding-horizontal + &:hover + color: $breadcrumb-item-hover-color + li + align-items: center + display: flex + &:first-child a + +ltr-property("padding", 0, false) + &.is-active + a + color: $breadcrumb-item-active-color + cursor: default + pointer-events: none + & + li::before + color: $breadcrumb-item-separator-color + content: "\0002f" + ul, + ol + align-items: flex-start + display: flex + flex-wrap: wrap + justify-content: flex-start + .icon + &:first-child + +ltr-property("margin", 0.5em) + &:last-child + +ltr-property("margin", 0.5em, false) + // Alignment + &.is-centered + ol, + ul + justify-content: center + &.is-right + ol, + ul + justify-content: flex-end + // Sizes + &.is-small + font-size: $size-small + &.is-medium + font-size: $size-medium + &.is-large + font-size: $size-large + // Styles + &.has-arrow-separator + li + li::before + content: "\02192" + &.has-bullet-separator + li + li::before + content: "\02022" + &.has-dot-separator + li + li::before + content: "\000b7" + &.has-succeeds-separator + li + li::before + content: "\0227B" diff --git a/guide/style/bulma/sass/components/card.sass b/guide/style/bulma/sass/components/card.sass new file mode 100644 index 00000000..73387f38 --- /dev/null +++ b/guide/style/bulma/sass/components/card.sass @@ -0,0 +1,103 @@ +@import "../utilities/mixins" + +$card-color: $text !default +$card-background-color: $scheme-main !default +$card-shadow: $shadow !default +$card-radius: 0.25rem !default + +$card-header-background-color: transparent !default +$card-header-color: $text-strong !default +$card-header-padding: 0.75rem 1rem !default +$card-header-shadow: 0 0.125em 0.25em rgba($scheme-invert, 0.1) !default +$card-header-weight: $weight-bold !default + +$card-content-background-color: transparent !default +$card-content-padding: 1.5rem !default + +$card-footer-background-color: transparent !default +$card-footer-border-top: 1px solid $border-light !default +$card-footer-padding: 0.75rem !default + +$card-media-margin: $block-spacing !default + +.card + background-color: $card-background-color + border-radius: $card-radius + box-shadow: $card-shadow + color: $card-color + max-width: 100% + position: relative + +%card-item + &:first-child + border-top-left-radius: $card-radius + border-top-right-radius: $card-radius + &:last-child + border-bottom-left-radius: $card-radius + border-bottom-right-radius: $card-radius + +.card-header + @extend %card-item + background-color: $card-header-background-color + align-items: stretch + box-shadow: $card-header-shadow + display: flex + +.card-header-title + align-items: center + color: $card-header-color + display: flex + flex-grow: 1 + font-weight: $card-header-weight + padding: $card-header-padding + &.is-centered + justify-content: center + +.card-header-icon + +reset + align-items: center + cursor: pointer + display: flex + justify-content: center + padding: $card-header-padding + +.card-image + display: block + position: relative + &:first-child + img + border-top-left-radius: $card-radius + border-top-right-radius: $card-radius + &:last-child + img + border-bottom-left-radius: $card-radius + border-bottom-right-radius: $card-radius + +.card-content + @extend %card-item + background-color: $card-content-background-color + padding: $card-content-padding + +.card-footer + @extend %card-item + background-color: $card-footer-background-color + border-top: $card-footer-border-top + align-items: stretch + display: flex + +.card-footer-item + align-items: center + display: flex + flex-basis: 0 + flex-grow: 1 + flex-shrink: 0 + justify-content: center + padding: $card-footer-padding + &:not(:last-child) + +ltr-property("border", $card-footer-border-top) + +// Combinations + +.card + .media:not(:last-child) + margin-bottom: $card-media-margin diff --git a/guide/style/bulma/sass/components/dropdown.sass b/guide/style/bulma/sass/components/dropdown.sass new file mode 100644 index 00000000..3743cb77 --- /dev/null +++ b/guide/style/bulma/sass/components/dropdown.sass @@ -0,0 +1,83 @@ +@import "../utilities/mixins" + +$dropdown-menu-min-width: 12rem !default + +$dropdown-content-background-color: $scheme-main !default +$dropdown-content-arrow: $link !default +$dropdown-content-offset: 4px !default +$dropdown-content-padding-bottom: 0.5rem !default +$dropdown-content-padding-top: 0.5rem !default +$dropdown-content-radius: $radius !default +$dropdown-content-shadow: $shadow !default +$dropdown-content-z: 20 !default + +$dropdown-item-color: $text !default +$dropdown-item-hover-color: $scheme-invert !default +$dropdown-item-hover-background-color: $background !default +$dropdown-item-active-color: $link-invert !default +$dropdown-item-active-background-color: $link !default + +$dropdown-divider-background-color: $border-light !default + +.dropdown + display: inline-flex + position: relative + vertical-align: top + &.is-active, + &.is-hoverable:hover + .dropdown-menu + display: block + &.is-right + .dropdown-menu + left: auto + right: 0 + &.is-up + .dropdown-menu + bottom: 100% + padding-bottom: $dropdown-content-offset + padding-top: initial + top: auto + +.dropdown-menu + display: none + +ltr-position(0, false) + min-width: $dropdown-menu-min-width + padding-top: $dropdown-content-offset + position: absolute + top: 100% + z-index: $dropdown-content-z + +.dropdown-content + background-color: $dropdown-content-background-color + border-radius: $dropdown-content-radius + box-shadow: $dropdown-content-shadow + padding-bottom: $dropdown-content-padding-bottom + padding-top: $dropdown-content-padding-top + +.dropdown-item + color: $dropdown-item-color + display: block + font-size: 0.875rem + line-height: 1.5 + padding: 0.375rem 1rem + position: relative + +a.dropdown-item, +button.dropdown-item + +ltr-property("padding", 3rem) + text-align: inherit + white-space: nowrap + width: 100% + &:hover + background-color: $dropdown-item-hover-background-color + color: $dropdown-item-hover-color + &.is-active + background-color: $dropdown-item-active-background-color + color: $dropdown-item-active-color + +.dropdown-divider + background-color: $dropdown-divider-background-color + border: none + display: block + height: 1px + margin: 0.5rem 0 diff --git a/guide/style/bulma/sass/components/level.sass b/guide/style/bulma/sass/components/level.sass new file mode 100644 index 00000000..6793ae06 --- /dev/null +++ b/guide/style/bulma/sass/components/level.sass @@ -0,0 +1,79 @@ +@import "../utilities/mixins" + +$level-item-spacing: ($block-spacing * 0.5) !default + +.level + @extend %block + align-items: center + justify-content: space-between + code + border-radius: $radius + img + display: inline-block + vertical-align: top + // Modifiers + &.is-mobile + display: flex + .level-left, + .level-right + display: flex + .level-left + .level-right + margin-top: 0 + .level-item + &:not(:last-child) + margin-bottom: 0 + +ltr-property("margin", $level-item-spacing) + &:not(.is-narrow) + flex-grow: 1 + // Responsiveness + +tablet + display: flex + & > .level-item + &:not(.is-narrow) + flex-grow: 1 + +.level-item + align-items: center + display: flex + flex-basis: auto + flex-grow: 0 + flex-shrink: 0 + justify-content: center + .title, + .subtitle + margin-bottom: 0 + // Responsiveness + +mobile + &:not(:last-child) + margin-bottom: $level-item-spacing + +.level-left, +.level-right + flex-basis: auto + flex-grow: 0 + flex-shrink: 0 + .level-item + // Modifiers + &.is-flexible + flex-grow: 1 + // Responsiveness + +tablet + &:not(:last-child) + +ltr-property("margin", $level-item-spacing) + +.level-left + align-items: center + justify-content: flex-start + // Responsiveness + +mobile + & + .level-right + margin-top: 1.5rem + +tablet + display: flex + +.level-right + align-items: center + justify-content: flex-end + // Responsiveness + +tablet + display: flex diff --git a/guide/style/bulma/sass/components/media.sass b/guide/style/bulma/sass/components/media.sass new file mode 100644 index 00000000..fc3f7d16 --- /dev/null +++ b/guide/style/bulma/sass/components/media.sass @@ -0,0 +1,59 @@ +@import "../utilities/mixins" + +$media-border-color: bulmaRgba($border, 0.5) !default +$media-border-size: 1px !default +$media-spacing: 1rem !default +$media-spacing-large: 1.5rem !default +$media-content-spacing: 0.75rem !default +$media-level-1-spacing: 0.75rem !default +$media-level-1-content-spacing: 0.5rem !default +$media-level-2-spacing: 0.5rem !default + +.media + align-items: flex-start + display: flex + text-align: inherit + .content:not(:last-child) + margin-bottom: $media-content-spacing + .media + border-top: $media-border-size solid $media-border-color + display: flex + padding-top: $media-level-1-spacing + .content:not(:last-child), + .control:not(:last-child) + margin-bottom: $media-level-1-content-spacing + .media + padding-top: $media-level-2-spacing + & + .media + margin-top: $media-level-2-spacing + & + .media + border-top: $media-border-size solid $media-border-color + margin-top: $media-spacing + padding-top: $media-spacing + // Sizes + &.is-large + & + .media + margin-top: $media-spacing-large + padding-top: $media-spacing-large + +.media-left, +.media-right + flex-basis: auto + flex-grow: 0 + flex-shrink: 0 + +.media-left + +ltr-property("margin", $media-spacing) + +.media-right + +ltr-property("margin", $media-spacing, false) + +.media-content + flex-basis: auto + flex-grow: 1 + flex-shrink: 1 + text-align: inherit + ++mobile + .media-content + overflow-x: auto diff --git a/guide/style/bulma/sass/components/menu.sass b/guide/style/bulma/sass/components/menu.sass new file mode 100644 index 00000000..31dc56fd --- /dev/null +++ b/guide/style/bulma/sass/components/menu.sass @@ -0,0 +1,59 @@ +@import "../utilities/mixins" + +$menu-item-color: $text !default +$menu-item-radius: $radius-small !default +$menu-item-hover-color: $text-strong !default +$menu-item-hover-background-color: $background !default +$menu-item-active-color: $link-invert !default +$menu-item-active-background-color: $link !default + +$menu-list-border-left: 1px solid $border !default +$menu-list-line-height: 1.25 !default +$menu-list-link-padding: 0.5em 0.75em !default +$menu-nested-list-margin: 0.75em !default +$menu-nested-list-padding-left: 0.75em !default + +$menu-label-color: $text-light !default +$menu-label-font-size: 0.75em !default +$menu-label-letter-spacing: 0.1em !default +$menu-label-spacing: 1em !default + +.menu + font-size: $size-normal + // Sizes + &.is-small + font-size: $size-small + &.is-medium + font-size: $size-medium + &.is-large + font-size: $size-large + +.menu-list + line-height: $menu-list-line-height + a + border-radius: $menu-item-radius + color: $menu-item-color + display: block + padding: $menu-list-link-padding + &:hover + background-color: $menu-item-hover-background-color + color: $menu-item-hover-color + // Modifiers + &.is-active + background-color: $menu-item-active-background-color + color: $menu-item-active-color + li + ul + +ltr-property("border", $menu-list-border-left, false) + margin: $menu-nested-list-margin + +ltr-property("padding", $menu-nested-list-padding-left, false) + +.menu-label + color: $menu-label-color + font-size: $menu-label-font-size + letter-spacing: $menu-label-letter-spacing + text-transform: uppercase + &:not(:first-child) + margin-top: $menu-label-spacing + &:not(:last-child) + margin-bottom: $menu-label-spacing diff --git a/guide/style/bulma/sass/components/message.sass b/guide/style/bulma/sass/components/message.sass new file mode 100644 index 00000000..ab837803 --- /dev/null +++ b/guide/style/bulma/sass/components/message.sass @@ -0,0 +1,101 @@ +@import "../utilities/mixins" + +$message-background-color: $background !default +$message-radius: $radius !default + +$message-header-background-color: $text !default +$message-header-color: $text-invert !default +$message-header-weight: $weight-bold !default +$message-header-padding: 0.75em 1em !default +$message-header-radius: $radius !default + +$message-body-border-color: $border !default +$message-body-border-width: 0 0 0 4px !default +$message-body-color: $text !default +$message-body-padding: 1.25em 1.5em !default +$message-body-radius: $radius !default + +$message-body-pre-background-color: $scheme-main !default +$message-body-pre-code-background-color: transparent !default + +$message-header-body-border-width: 0 !default +$message-colors: $colors !default + +.message + @extend %block + background-color: $message-background-color + border-radius: $message-radius + font-size: $size-normal + strong + color: currentColor + a:not(.button):not(.tag):not(.dropdown-item) + color: currentColor + text-decoration: underline + // Sizes + &.is-small + font-size: $size-small + &.is-medium + font-size: $size-medium + &.is-large + font-size: $size-large + // Colors + @each $name, $components in $message-colors + $color: nth($components, 1) + $color-invert: nth($components, 2) + $color-light: null + $color-dark: null + + @if length($components) >= 3 + $color-light: nth($components, 3) + @if length($components) >= 4 + $color-dark: nth($components, 4) + @else + $color-luminance: colorLuminance($color) + $darken-percentage: $color-luminance * 70% + $desaturate-percentage: $color-luminance * 30% + $color-dark: desaturate(darken($color, $darken-percentage), $desaturate-percentage) + @else + $color-lightning: max((100% - lightness($color)) - 2%, 0%) + $color-light: lighten($color, $color-lightning) + + &.is-#{$name} + background-color: $color-light + .message-header + background-color: $color + color: $color-invert + .message-body + border-color: $color + color: $color-dark + +.message-header + align-items: center + background-color: $message-header-background-color + border-radius: $message-header-radius $message-header-radius 0 0 + color: $message-header-color + display: flex + font-weight: $message-header-weight + justify-content: space-between + line-height: 1.25 + padding: $message-header-padding + position: relative + .delete + flex-grow: 0 + flex-shrink: 0 + +ltr-property("margin", 0.75em, false) + & + .message-body + border-width: $message-header-body-border-width + border-top-left-radius: 0 + border-top-right-radius: 0 + +.message-body + border-color: $message-body-border-color + border-radius: $message-body-radius + border-style: solid + border-width: $message-body-border-width + color: $message-body-color + padding: $message-body-padding + code, + pre + background-color: $message-body-pre-background-color + pre code + background-color: $message-body-pre-code-background-color diff --git a/guide/style/bulma/sass/components/modal.sass b/guide/style/bulma/sass/components/modal.sass new file mode 100644 index 00000000..fdbddd6a --- /dev/null +++ b/guide/style/bulma/sass/components/modal.sass @@ -0,0 +1,117 @@ +@import "../utilities/mixins" + +$modal-z: 40 !default + +$modal-background-background-color: bulmaRgba($scheme-invert, 0.86) !default + +$modal-content-width: 640px !default +$modal-content-margin-mobile: 20px !default +$modal-content-spacing-mobile: 160px !default +$modal-content-spacing-tablet: 40px !default + +$modal-close-dimensions: 40px !default +$modal-close-right: 20px !default +$modal-close-top: 20px !default + +$modal-card-spacing: 40px !default + +$modal-card-head-background-color: $background !default +$modal-card-head-border-bottom: 1px solid $border !default +$modal-card-head-padding: 20px !default +$modal-card-head-radius: $radius-large !default + +$modal-card-title-color: $text-strong !default +$modal-card-title-line-height: 1 !default +$modal-card-title-size: $size-4 !default + +$modal-card-foot-radius: $radius-large !default +$modal-card-foot-border-top: 1px solid $border !default + +$modal-card-body-background-color: $scheme-main !default +$modal-card-body-padding: 20px !default + +$modal-breakpoint: $tablet !default + +.modal + @extend %overlay + align-items: center + display: none + flex-direction: column + justify-content: center + overflow: hidden + position: fixed + z-index: $modal-z + // Modifiers + &.is-active + display: flex + +.modal-background + @extend %overlay + background-color: $modal-background-background-color + +.modal-content, +.modal-card + margin: 0 $modal-content-margin-mobile + max-height: calc(100vh - #{$modal-content-spacing-mobile}) + overflow: auto + position: relative + width: 100% + // Responsiveness + +from($modal-breakpoint) + margin: 0 auto + max-height: calc(100vh - #{$modal-content-spacing-tablet}) + width: $modal-content-width + +.modal-close + @extend %delete + background: none + height: $modal-close-dimensions + position: fixed + +ltr-position($modal-close-right) + top: $modal-close-top + width: $modal-close-dimensions + +.modal-card + display: flex + flex-direction: column + max-height: calc(100vh - #{$modal-card-spacing}) + overflow: hidden + -ms-overflow-y: visible + +.modal-card-head, +.modal-card-foot + align-items: center + background-color: $modal-card-head-background-color + display: flex + flex-shrink: 0 + justify-content: flex-start + padding: $modal-card-head-padding + position: relative + +.modal-card-head + border-bottom: $modal-card-head-border-bottom + border-top-left-radius: $modal-card-head-radius + border-top-right-radius: $modal-card-head-radius + +.modal-card-title + color: $modal-card-title-color + flex-grow: 1 + flex-shrink: 0 + font-size: $modal-card-title-size + line-height: $modal-card-title-line-height + +.modal-card-foot + border-bottom-left-radius: $modal-card-foot-radius + border-bottom-right-radius: $modal-card-foot-radius + border-top: $modal-card-foot-border-top + .button + &:not(:last-child) + +ltr-property("margin", 0.5em) + +.modal-card-body + +overflow-touch + background-color: $modal-card-body-background-color + flex-grow: 1 + flex-shrink: 1 + overflow: auto + padding: $modal-card-body-padding diff --git a/guide/style/bulma/sass/components/navbar.sass b/guide/style/bulma/sass/components/navbar.sass new file mode 100644 index 00000000..f64c4880 --- /dev/null +++ b/guide/style/bulma/sass/components/navbar.sass @@ -0,0 +1,446 @@ +@import "../utilities/mixins" + +$navbar-background-color: $scheme-main !default +$navbar-box-shadow-size: 0 2px 0 0 !default +$navbar-box-shadow-color: $background !default +$navbar-height: 3.25rem !default +$navbar-padding-vertical: 1rem !default +$navbar-padding-horizontal: 2rem !default +$navbar-z: 30 !default +$navbar-fixed-z: 30 !default + +$navbar-item-color: $text !default +$navbar-item-hover-color: $link !default +$navbar-item-hover-background-color: $scheme-main-bis !default +$navbar-item-active-color: $scheme-invert !default +$navbar-item-active-background-color: transparent !default +$navbar-item-img-max-height: 1.75rem !default + +$navbar-burger-color: $navbar-item-color !default + +$navbar-tab-hover-background-color: transparent !default +$navbar-tab-hover-border-bottom-color: $link !default +$navbar-tab-active-color: $link !default +$navbar-tab-active-background-color: transparent !default +$navbar-tab-active-border-bottom-color: $link !default +$navbar-tab-active-border-bottom-style: solid !default +$navbar-tab-active-border-bottom-width: 3px !default + +$navbar-dropdown-background-color: $scheme-main !default +$navbar-dropdown-border-top: 2px solid $border !default +$navbar-dropdown-offset: -4px !default +$navbar-dropdown-arrow: $link !default +$navbar-dropdown-radius: $radius-large !default +$navbar-dropdown-z: 20 !default + +$navbar-dropdown-boxed-radius: $radius-large !default +$navbar-dropdown-boxed-shadow: 0 8px 8px bulmaRgba($scheme-invert, 0.1), 0 0 0 1px bulmaRgba($scheme-invert, 0.1) !default + +$navbar-dropdown-item-hover-color: $scheme-invert !default +$navbar-dropdown-item-hover-background-color: $background !default +$navbar-dropdown-item-active-color: $link !default +$navbar-dropdown-item-active-background-color: $background !default + +$navbar-divider-background-color: $background !default +$navbar-divider-height: 2px !default + +$navbar-bottom-box-shadow-size: 0 -2px 0 0 !default + +$navbar-breakpoint: $desktop !default + +$navbar-colors: $colors !default + +=navbar-fixed + left: 0 + position: fixed + right: 0 + z-index: $navbar-fixed-z + +.navbar + background-color: $navbar-background-color + min-height: $navbar-height + position: relative + z-index: $navbar-z + @each $name, $pair in $navbar-colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name} + background-color: $color + color: $color-invert + .navbar-brand + & > .navbar-item, + .navbar-link + color: $color-invert + & > a.navbar-item, + .navbar-link + &:focus, + &:hover, + &.is-active + background-color: bulmaDarken($color, 5%) + color: $color-invert + .navbar-link + &::after + border-color: $color-invert + .navbar-burger + color: $color-invert + +from($navbar-breakpoint) + .navbar-start, + .navbar-end + & > .navbar-item, + .navbar-link + color: $color-invert + & > a.navbar-item, + .navbar-link + &:focus, + &:hover, + &.is-active + background-color: bulmaDarken($color, 5%) + color: $color-invert + .navbar-link + &::after + border-color: $color-invert + .navbar-item.has-dropdown:focus .navbar-link, + .navbar-item.has-dropdown:hover .navbar-link, + .navbar-item.has-dropdown.is-active .navbar-link + background-color: bulmaDarken($color, 5%) + color: $color-invert + .navbar-dropdown + a.navbar-item + &.is-active + background-color: $color + color: $color-invert + & > .container + align-items: stretch + display: flex + min-height: $navbar-height + width: 100% + &.has-shadow + box-shadow: $navbar-box-shadow-size $navbar-box-shadow-color + &.is-fixed-bottom, + &.is-fixed-top + +navbar-fixed + &.is-fixed-bottom + bottom: 0 + &.has-shadow + box-shadow: $navbar-bottom-box-shadow-size $navbar-box-shadow-color + &.is-fixed-top + top: 0 + +html, +body + &.has-navbar-fixed-top + padding-top: $navbar-height + &.has-navbar-fixed-bottom + padding-bottom: $navbar-height + +.navbar-brand, +.navbar-tabs + align-items: stretch + display: flex + flex-shrink: 0 + min-height: $navbar-height + +.navbar-brand + a.navbar-item + &:focus, + &:hover + background-color: transparent + +.navbar-tabs + +overflow-touch + max-width: 100vw + overflow-x: auto + overflow-y: hidden + +.navbar-burger + @extend %reset + color: $navbar-burger-color + +hamburger($navbar-height) + +ltr-property("margin", auto, false) + +.navbar-menu + display: none + +.navbar-item, +.navbar-link + color: $navbar-item-color + display: block + line-height: 1.5 + padding: 0.5rem 0.75rem + position: relative + .icon + &:only-child + margin-left: -0.25rem + margin-right: -0.25rem + +a.navbar-item, +.navbar-link + cursor: pointer + &:focus, + &:focus-within, + &:hover, + &.is-active + background-color: $navbar-item-hover-background-color + color: $navbar-item-hover-color + +.navbar-item + flex-grow: 0 + flex-shrink: 0 + img + max-height: $navbar-item-img-max-height + &.has-dropdown + padding: 0 + &.is-expanded + flex-grow: 1 + flex-shrink: 1 + &.is-tab + border-bottom: 1px solid transparent + min-height: $navbar-height + padding-bottom: calc(0.5rem - 1px) + &:focus, + &:hover + background-color: $navbar-tab-hover-background-color + border-bottom-color: $navbar-tab-hover-border-bottom-color + &.is-active + background-color: $navbar-tab-active-background-color + border-bottom-color: $navbar-tab-active-border-bottom-color + border-bottom-style: $navbar-tab-active-border-bottom-style + border-bottom-width: $navbar-tab-active-border-bottom-width + color: $navbar-tab-active-color + padding-bottom: calc(0.5rem - #{$navbar-tab-active-border-bottom-width}) + +.navbar-content + flex-grow: 1 + flex-shrink: 1 + +.navbar-link:not(.is-arrowless) + +ltr-property("padding", 2.5em) + &::after + @extend %arrow + border-color: $navbar-dropdown-arrow + margin-top: -0.375em + +ltr-position(1.125em) + +.navbar-dropdown + font-size: 0.875rem + padding-bottom: 0.5rem + padding-top: 0.5rem + .navbar-item + padding-left: 1.5rem + padding-right: 1.5rem + +.navbar-divider + background-color: $navbar-divider-background-color + border: none + display: none + height: $navbar-divider-height + margin: 0.5rem 0 + ++until($navbar-breakpoint) + .navbar > .container + display: block + .navbar-brand, + .navbar-tabs + .navbar-item + align-items: center + display: flex + .navbar-link + &::after + display: none + .navbar-menu + background-color: $navbar-background-color + box-shadow: 0 8px 16px bulmaRgba($scheme-invert, 0.1) + padding: 0.5rem 0 + &.is-active + display: block + // Fixed navbar + .navbar + &.is-fixed-bottom-touch, + &.is-fixed-top-touch + +navbar-fixed + &.is-fixed-bottom-touch + bottom: 0 + &.has-shadow + box-shadow: 0 -2px 3px bulmaRgba($scheme-invert, 0.1) + &.is-fixed-top-touch + top: 0 + &.is-fixed-top, + &.is-fixed-top-touch + .navbar-menu + +overflow-touch + max-height: calc(100vh - #{$navbar-height}) + overflow: auto + html, + body + &.has-navbar-fixed-top-touch + padding-top: $navbar-height + &.has-navbar-fixed-bottom-touch + padding-bottom: $navbar-height + ++from($navbar-breakpoint) + .navbar, + .navbar-menu, + .navbar-start, + .navbar-end + align-items: stretch + display: flex + .navbar + min-height: $navbar-height + &.is-spaced + padding: $navbar-padding-vertical $navbar-padding-horizontal + .navbar-start, + .navbar-end + align-items: center + a.navbar-item, + .navbar-link + border-radius: $radius + &.is-transparent + a.navbar-item, + .navbar-link + &:focus, + &:hover, + &.is-active + background-color: transparent !important + .navbar-item.has-dropdown + &.is-active, + &.is-hoverable:focus, + &.is-hoverable:focus-within, + &.is-hoverable:hover + .navbar-link + background-color: transparent !important + .navbar-dropdown + a.navbar-item + &:focus, + &:hover + background-color: $navbar-dropdown-item-hover-background-color + color: $navbar-dropdown-item-hover-color + &.is-active + background-color: $navbar-dropdown-item-active-background-color + color: $navbar-dropdown-item-active-color + .navbar-burger + display: none + .navbar-item, + .navbar-link + align-items: center + display: flex + .navbar-item + &.has-dropdown + align-items: stretch + &.has-dropdown-up + .navbar-link::after + transform: rotate(135deg) translate(0.25em, -0.25em) + .navbar-dropdown + border-bottom: $navbar-dropdown-border-top + border-radius: $navbar-dropdown-radius $navbar-dropdown-radius 0 0 + border-top: none + bottom: 100% + box-shadow: 0 -8px 8px bulmaRgba($scheme-invert, 0.1) + top: auto + &.is-active, + &.is-hoverable:focus, + &.is-hoverable:focus-within, + &.is-hoverable:hover + .navbar-dropdown + display: block + .navbar.is-spaced &, + &.is-boxed + opacity: 1 + pointer-events: auto + transform: translateY(0) + .navbar-menu + flex-grow: 1 + flex-shrink: 0 + .navbar-start + justify-content: flex-start + +ltr-property("margin", auto) + .navbar-end + justify-content: flex-end + +ltr-property("margin", auto, false) + .navbar-dropdown + background-color: $navbar-dropdown-background-color + border-bottom-left-radius: $navbar-dropdown-radius + border-bottom-right-radius: $navbar-dropdown-radius + border-top: $navbar-dropdown-border-top + box-shadow: 0 8px 8px bulmaRgba($scheme-invert, 0.1) + display: none + font-size: 0.875rem + +ltr-position(0, false) + min-width: 100% + position: absolute + top: 100% + z-index: $navbar-dropdown-z + .navbar-item + padding: 0.375rem 1rem + white-space: nowrap + a.navbar-item + +ltr-property("padding", 3rem) + &:focus, + &:hover + background-color: $navbar-dropdown-item-hover-background-color + color: $navbar-dropdown-item-hover-color + &.is-active + background-color: $navbar-dropdown-item-active-background-color + color: $navbar-dropdown-item-active-color + .navbar.is-spaced &, + &.is-boxed + border-radius: $navbar-dropdown-boxed-radius + border-top: none + box-shadow: $navbar-dropdown-boxed-shadow + display: block + opacity: 0 + pointer-events: none + top: calc(100% + (#{$navbar-dropdown-offset})) + transform: translateY(-5px) + transition-duration: $speed + transition-property: opacity, transform + &.is-right + left: auto + right: 0 + .navbar-divider + display: block + .navbar > .container, + .container > .navbar + .navbar-brand + +ltr-property("margin", -.75rem, false) + .navbar-menu + +ltr-property("margin", -.75rem) + // Fixed navbar + .navbar + &.is-fixed-bottom-desktop, + &.is-fixed-top-desktop + +navbar-fixed + &.is-fixed-bottom-desktop + bottom: 0 + &.has-shadow + box-shadow: 0 -2px 3px bulmaRgba($scheme-invert, 0.1) + &.is-fixed-top-desktop + top: 0 + html, + body + &.has-navbar-fixed-top-desktop + padding-top: $navbar-height + &.has-navbar-fixed-bottom-desktop + padding-bottom: $navbar-height + &.has-spaced-navbar-fixed-top + padding-top: $navbar-height + ($navbar-padding-vertical * 2) + &.has-spaced-navbar-fixed-bottom + padding-bottom: $navbar-height + ($navbar-padding-vertical * 2) + // Hover/Active states + a.navbar-item, + .navbar-link + &.is-active + color: $navbar-item-active-color + &.is-active:not(:focus):not(:hover) + background-color: $navbar-item-active-background-color + .navbar-item.has-dropdown + &:focus, + &:hover, + &.is-active + .navbar-link + background-color: $navbar-item-hover-background-color + +// Combination + +.hero + &.is-fullheight-with-navbar + min-height: calc(100vh - #{$navbar-height}) diff --git a/guide/style/bulma/sass/components/pagination.sass b/guide/style/bulma/sass/components/pagination.sass new file mode 100644 index 00000000..950949d9 --- /dev/null +++ b/guide/style/bulma/sass/components/pagination.sass @@ -0,0 +1,167 @@ +@import "../utilities/controls" +@import "../utilities/mixins" + +$pagination-color: $text-strong !default +$pagination-border-color: $border !default +$pagination-margin: -0.25rem !default +$pagination-min-width: $control-height !default + +$pagination-item-font-size: 1em !default +$pagination-item-margin: 0.25rem !default +$pagination-item-padding-left: 0.5em !default +$pagination-item-padding-right: 0.5em !default + +$pagination-nav-padding-left: 0.75em !default +$pagination-nav-padding-right: 0.75em !default + +$pagination-hover-color: $link-hover !default +$pagination-hover-border-color: $link-hover-border !default + +$pagination-focus-color: $link-focus !default +$pagination-focus-border-color: $link-focus-border !default + +$pagination-active-color: $link-active !default +$pagination-active-border-color: $link-active-border !default + +$pagination-disabled-color: $text-light !default +$pagination-disabled-background-color: $border !default +$pagination-disabled-border-color: $border !default + +$pagination-current-color: $link-invert !default +$pagination-current-background-color: $link !default +$pagination-current-border-color: $link !default + +$pagination-ellipsis-color: $grey-light !default + +$pagination-shadow-inset: inset 0 1px 2px rgba($scheme-invert, 0.2) !default + +.pagination + @extend %block + font-size: $size-normal + margin: $pagination-margin + // Sizes + &.is-small + font-size: $size-small + &.is-medium + font-size: $size-medium + &.is-large + font-size: $size-large + &.is-rounded + .pagination-previous, + .pagination-next + padding-left: 1em + padding-right: 1em + border-radius: $radius-rounded + .pagination-link + border-radius: $radius-rounded + +.pagination, +.pagination-list + align-items: center + display: flex + justify-content: center + text-align: center + +.pagination-previous, +.pagination-next, +.pagination-link, +.pagination-ellipsis + @extend %control + @extend %unselectable + font-size: $pagination-item-font-size + justify-content: center + margin: $pagination-item-margin + padding-left: $pagination-item-padding-left + padding-right: $pagination-item-padding-right + text-align: center + +.pagination-previous, +.pagination-next, +.pagination-link + border-color: $pagination-border-color + color: $pagination-color + min-width: $pagination-min-width + &:hover + border-color: $pagination-hover-border-color + color: $pagination-hover-color + &:focus + border-color: $pagination-focus-border-color + &:active + box-shadow: $pagination-shadow-inset + &[disabled], + &.is-disabled + background-color: $pagination-disabled-background-color + border-color: $pagination-disabled-border-color + box-shadow: none + color: $pagination-disabled-color + opacity: 0.5 + +.pagination-previous, +.pagination-next + padding-left: $pagination-nav-padding-left + padding-right: $pagination-nav-padding-right + white-space: nowrap + +.pagination-link + &.is-current + background-color: $pagination-current-background-color + border-color: $pagination-current-border-color + color: $pagination-current-color + +.pagination-ellipsis + color: $pagination-ellipsis-color + pointer-events: none + +.pagination-list + flex-wrap: wrap + li + list-style: none + ++mobile + .pagination + flex-wrap: wrap + .pagination-previous, + .pagination-next + flex-grow: 1 + flex-shrink: 1 + .pagination-list + li + flex-grow: 1 + flex-shrink: 1 + ++tablet + .pagination-list + flex-grow: 1 + flex-shrink: 1 + justify-content: flex-start + order: 1 + .pagination-previous, + .pagination-next, + .pagination-link, + .pagination-ellipsis + margin-bottom: 0 + margin-top: 0 + .pagination-previous + order: 2 + .pagination-next + order: 3 + .pagination + justify-content: space-between + margin-bottom: 0 + margin-top: 0 + &.is-centered + .pagination-previous + order: 1 + .pagination-list + justify-content: center + order: 2 + .pagination-next + order: 3 + &.is-right + .pagination-previous + order: 1 + .pagination-next + order: 2 + .pagination-list + justify-content: flex-end + order: 3 diff --git a/guide/style/bulma/sass/components/panel.sass b/guide/style/bulma/sass/components/panel.sass new file mode 100644 index 00000000..afaffcd9 --- /dev/null +++ b/guide/style/bulma/sass/components/panel.sass @@ -0,0 +1,121 @@ +@import "../utilities/mixins" + +$panel-margin: $block-spacing !default +$panel-item-border: 1px solid $border-light !default +$panel-radius: $radius-large !default +$panel-shadow: $shadow !default + +$panel-heading-background-color: $border-light !default +$panel-heading-color: $text-strong !default +$panel-heading-line-height: 1.25 !default +$panel-heading-padding: 0.75em 1em !default +$panel-heading-radius: $radius !default +$panel-heading-size: 1.25em !default +$panel-heading-weight: $weight-bold !default + +$panel-tabs-font-size: 0.875em !default +$panel-tab-border-bottom: 1px solid $border !default +$panel-tab-active-border-bottom-color: $link-active-border !default +$panel-tab-active-color: $link-active !default + +$panel-list-item-color: $text !default +$panel-list-item-hover-color: $link !default + +$panel-block-color: $text-strong !default +$panel-block-hover-background-color: $background !default +$panel-block-active-border-left-color: $link !default +$panel-block-active-color: $link-active !default +$panel-block-active-icon-color: $link !default + +$panel-icon-color: $text-light !default +$panel-colors: $colors !default + +.panel + border-radius: $panel-radius + box-shadow: $panel-shadow + font-size: $size-normal + &:not(:last-child) + margin-bottom: $panel-margin + // Colors + @each $name, $components in $panel-colors + $color: nth($components, 1) + $color-invert: nth($components, 2) + &.is-#{$name} + .panel-heading + background-color: $color + color: $color-invert + .panel-tabs a.is-active + border-bottom-color: $color + .panel-block.is-active .panel-icon + color: $color + +.panel-tabs, +.panel-block + &:not(:last-child) + border-bottom: $panel-item-border + +.panel-heading + background-color: $panel-heading-background-color + border-radius: $panel-radius $panel-radius 0 0 + color: $panel-heading-color + font-size: $panel-heading-size + font-weight: $panel-heading-weight + line-height: $panel-heading-line-height + padding: $panel-heading-padding + +.panel-tabs + align-items: flex-end + display: flex + font-size: $panel-tabs-font-size + justify-content: center + a + border-bottom: $panel-tab-border-bottom + margin-bottom: -1px + padding: 0.5em + // Modifiers + &.is-active + border-bottom-color: $panel-tab-active-border-bottom-color + color: $panel-tab-active-color + +.panel-list + a + color: $panel-list-item-color + &:hover + color: $panel-list-item-hover-color + +.panel-block + align-items: center + color: $panel-block-color + display: flex + justify-content: flex-start + padding: 0.5em 0.75em + input[type="checkbox"] + +ltr-property("margin", 0.75em) + & > .control + flex-grow: 1 + flex-shrink: 1 + width: 100% + &.is-wrapped + flex-wrap: wrap + &.is-active + border-left-color: $panel-block-active-border-left-color + color: $panel-block-active-color + .panel-icon + color: $panel-block-active-icon-color + &:last-child + border-bottom-left-radius: $panel-radius + border-bottom-right-radius: $panel-radius + +a.panel-block, +label.panel-block + cursor: pointer + &:hover + background-color: $panel-block-hover-background-color + +.panel-icon + +fa(14px, 1em) + color: $panel-icon-color + +ltr-property("margin", 0.75em) + .fa + font-size: inherit + line-height: inherit diff --git a/guide/style/bulma/sass/components/tabs.sass b/guide/style/bulma/sass/components/tabs.sass new file mode 100644 index 00000000..2cb6a543 --- /dev/null +++ b/guide/style/bulma/sass/components/tabs.sass @@ -0,0 +1,176 @@ +@import "../utilities/mixins" + +$tabs-border-bottom-color: $border !default +$tabs-border-bottom-style: solid !default +$tabs-border-bottom-width: 1px !default +$tabs-link-color: $text !default +$tabs-link-hover-border-bottom-color: $text-strong !default +$tabs-link-hover-color: $text-strong !default +$tabs-link-active-border-bottom-color: $link !default +$tabs-link-active-color: $link !default +$tabs-link-padding: 0.5em 1em !default + +$tabs-boxed-link-radius: $radius !default +$tabs-boxed-link-hover-background-color: $background !default +$tabs-boxed-link-hover-border-bottom-color: $border !default + +$tabs-boxed-link-active-background-color: $scheme-main !default +$tabs-boxed-link-active-border-color: $border !default +$tabs-boxed-link-active-border-bottom-color: transparent !default + +$tabs-toggle-link-border-color: $border !default +$tabs-toggle-link-border-style: solid !default +$tabs-toggle-link-border-width: 1px !default +$tabs-toggle-link-hover-background-color: $background !default +$tabs-toggle-link-hover-border-color: $border-hover !default +$tabs-toggle-link-radius: $radius !default +$tabs-toggle-link-active-background-color: $link !default +$tabs-toggle-link-active-border-color: $link !default +$tabs-toggle-link-active-color: $link-invert !default + +.tabs + @extend %block + +overflow-touch + @extend %unselectable + align-items: stretch + display: flex + font-size: $size-normal + justify-content: space-between + overflow: hidden + overflow-x: auto + white-space: nowrap + a + align-items: center + border-bottom-color: $tabs-border-bottom-color + border-bottom-style: $tabs-border-bottom-style + border-bottom-width: $tabs-border-bottom-width + color: $tabs-link-color + display: flex + justify-content: center + margin-bottom: -#{$tabs-border-bottom-width} + padding: $tabs-link-padding + vertical-align: top + &:hover + border-bottom-color: $tabs-link-hover-border-bottom-color + color: $tabs-link-hover-color + li + display: block + &.is-active + a + border-bottom-color: $tabs-link-active-border-bottom-color + color: $tabs-link-active-color + ul + align-items: center + border-bottom-color: $tabs-border-bottom-color + border-bottom-style: $tabs-border-bottom-style + border-bottom-width: $tabs-border-bottom-width + display: flex + flex-grow: 1 + flex-shrink: 0 + justify-content: flex-start + &.is-left + padding-right: 0.75em + &.is-center + flex: none + justify-content: center + padding-left: 0.75em + padding-right: 0.75em + &.is-right + justify-content: flex-end + padding-left: 0.75em + .icon + &:first-child + +ltr-property("margin", 0.5em) + &:last-child + +ltr-property("margin", 0.5em, false) + // Alignment + &.is-centered + ul + justify-content: center + &.is-right + ul + justify-content: flex-end + // Styles + &.is-boxed + a + border: 1px solid transparent + +ltr + border-radius: $tabs-boxed-link-radius $tabs-boxed-link-radius 0 0 + +rtl + border-radius: 0 0 $tabs-boxed-link-radius $tabs-boxed-link-radius + &:hover + background-color: $tabs-boxed-link-hover-background-color + border-bottom-color: $tabs-boxed-link-hover-border-bottom-color + li + &.is-active + a + background-color: $tabs-boxed-link-active-background-color + border-color: $tabs-boxed-link-active-border-color + border-bottom-color: $tabs-boxed-link-active-border-bottom-color !important + &.is-fullwidth + li + flex-grow: 1 + flex-shrink: 0 + &.is-toggle + a + border-color: $tabs-toggle-link-border-color + border-style: $tabs-toggle-link-border-style + border-width: $tabs-toggle-link-border-width + margin-bottom: 0 + position: relative + &:hover + background-color: $tabs-toggle-link-hover-background-color + border-color: $tabs-toggle-link-hover-border-color + z-index: 2 + li + & + li + +ltr-property("margin", -#{$tabs-toggle-link-border-width}, false) + &:first-child a + +ltr + border-top-left-radius: $tabs-toggle-link-radius + border-bottom-left-radius: $tabs-toggle-link-radius + +rtl + border-top-right-radius: $tabs-toggle-link-radius + border-bottom-right-radius: $tabs-toggle-link-radius + &:last-child a + +ltr + border-top-right-radius: $tabs-toggle-link-radius + border-bottom-right-radius: $tabs-toggle-link-radius + +rtl + border-top-left-radius: $tabs-toggle-link-radius + border-bottom-left-radius: $tabs-toggle-link-radius + &.is-active + a + background-color: $tabs-toggle-link-active-background-color + border-color: $tabs-toggle-link-active-border-color + color: $tabs-toggle-link-active-color + z-index: 1 + ul + border-bottom: none + &.is-toggle-rounded + li + &:first-child a + +ltr + border-bottom-left-radius: $radius-rounded + border-top-left-radius: $radius-rounded + padding-left: 1.25em + +rtl + border-bottom-right-radius: $radius-rounded + border-top-right-radius: $radius-rounded + padding-right: 1.25em + &:last-child a + +ltr + border-bottom-right-radius: $radius-rounded + border-top-right-radius: $radius-rounded + padding-right: 1.25em + +rtl + border-bottom-left-radius: $radius-rounded + border-top-left-radius: $radius-rounded + padding-left: 1.25em + // Sizes + &.is-small + font-size: $size-small + &.is-medium + font-size: $size-medium + &.is-large + font-size: $size-large diff --git a/guide/style/bulma/sass/elements/_all.sass b/guide/style/bulma/sass/elements/_all.sass new file mode 100644 index 00000000..511047aa --- /dev/null +++ b/guide/style/bulma/sass/elements/_all.sass @@ -0,0 +1,16 @@ +/* Bulma Elements */ +@charset "utf-8" + +@import "box" +@import "button" +@import "container" +@import "content" +@import "icon" +@import "image" +@import "notification" +@import "progress" +@import "table" +@import "tag" +@import "title" + +@import "other" diff --git a/guide/style/bulma/sass/elements/box.sass b/guide/style/bulma/sass/elements/box.sass new file mode 100644 index 00000000..85524301 --- /dev/null +++ b/guide/style/bulma/sass/elements/box.sass @@ -0,0 +1,26 @@ +@import "../utilities/mixins" + +$box-color: $text !default +$box-background-color: $scheme-main !default +$box-radius: $radius-large !default +$box-shadow: $shadow !default +$box-padding: 1.25rem !default + +$box-link-hover-shadow: 0 0.5em 1em -0.125em rgba($scheme-invert, 0.1), 0 0 0 1px $link !default +$box-link-active-shadow: inset 0 1px 2px rgba($scheme-invert, 0.2), 0 0 0 1px $link !default + +.box + @extend %block + background-color: $box-background-color + border-radius: $box-radius + box-shadow: $box-shadow + color: $box-color + display: block + padding: $box-padding + +a.box + &:hover, + &:focus + box-shadow: $box-link-hover-shadow + &:active + box-shadow: $box-link-active-shadow diff --git a/guide/style/bulma/sass/elements/button.sass b/guide/style/bulma/sass/elements/button.sass new file mode 100644 index 00000000..63080640 --- /dev/null +++ b/guide/style/bulma/sass/elements/button.sass @@ -0,0 +1,357 @@ +@import "../utilities/controls" +@import "../utilities/mixins" + +$button-color: $text-strong !default +$button-background-color: $scheme-main !default +$button-family: false !default + +$button-border-color: $border !default +$button-border-width: $control-border-width !default + +$button-padding-vertical: calc(0.5em - #{$button-border-width}) !default +$button-padding-horizontal: 1em !default + +$button-hover-color: $link-hover !default +$button-hover-border-color: $link-hover-border !default + +$button-focus-color: $link-focus !default +$button-focus-border-color: $link-focus-border !default +$button-focus-box-shadow-size: 0 0 0 0.125em !default +$button-focus-box-shadow-color: bulmaRgba($link, 0.25) !default + +$button-active-color: $link-active !default +$button-active-border-color: $link-active-border !default + +$button-text-color: $text !default +$button-text-decoration: underline !default +$button-text-hover-background-color: $background !default +$button-text-hover-color: $text-strong !default + +$button-ghost-background: none !default +$button-ghost-border-color: transparent !default +$button-ghost-color: $link !default +$button-ghost-decoration: none !default +$button-ghost-hover-color: $link !default +$button-ghost-hover-decoration: underline !default + +$button-disabled-background-color: $scheme-main !default +$button-disabled-border-color: $border !default +$button-disabled-shadow: none !default +$button-disabled-opacity: 0.5 !default + +$button-static-color: $text-light !default +$button-static-background-color: $scheme-main-ter !default +$button-static-border-color: $border !default + +$button-colors: $colors !default +$button-responsive-sizes: ("mobile": ("small": ($size-small * 0.75), "normal": ($size-small * 0.875), "medium": $size-small, "large": $size-normal), "tablet-only": ("small": ($size-small * 0.875), "normal": ($size-small), "medium": $size-normal, "large": $size-medium)) !default + +// The button sizes use mixins so they can be used at different breakpoints +=button-small + &:not(.is-rounded) + border-radius: $radius-small + font-size: $size-small +=button-normal + font-size: $size-normal +=button-medium + font-size: $size-medium +=button-large + font-size: $size-large + +.button + @extend %control + @extend %unselectable + background-color: $button-background-color + border-color: $button-border-color + border-width: $button-border-width + color: $button-color + cursor: pointer + @if $button-family + font-family: $button-family + justify-content: center + padding-bottom: $button-padding-vertical + padding-left: $button-padding-horizontal + padding-right: $button-padding-horizontal + padding-top: $button-padding-vertical + text-align: center + white-space: nowrap + strong + color: inherit + .icon + &, + &.is-small, + &.is-medium, + &.is-large + height: 1.5em + width: 1.5em + &:first-child:not(:last-child) + +ltr-property("margin", calc(#{-0.5 * $button-padding-horizontal} - #{$button-border-width}), false) + +ltr-property("margin", $button-padding-horizontal * 0.25) + &:last-child:not(:first-child) + +ltr-property("margin", $button-padding-horizontal * 0.25, false) + +ltr-property("margin", calc(#{-0.5 * $button-padding-horizontal} - #{$button-border-width})) + &:first-child:last-child + margin-left: calc(#{-0.5 * $button-padding-horizontal} - #{$button-border-width}) + margin-right: calc(#{-0.5 * $button-padding-horizontal} - #{$button-border-width}) + // States + &:hover, + &.is-hovered + border-color: $button-hover-border-color + color: $button-hover-color + &:focus, + &.is-focused + border-color: $button-focus-border-color + color: $button-focus-color + &:not(:active) + box-shadow: $button-focus-box-shadow-size $button-focus-box-shadow-color + &:active, + &.is-active + border-color: $button-active-border-color + color: $button-active-color + // Colors + &.is-text + background-color: transparent + border-color: transparent + color: $button-text-color + text-decoration: $button-text-decoration + &:hover, + &.is-hovered, + &:focus, + &.is-focused + background-color: $button-text-hover-background-color + color: $button-text-hover-color + &:active, + &.is-active + background-color: bulmaDarken($button-text-hover-background-color, 5%) + color: $button-text-hover-color + &[disabled], + fieldset[disabled] & + background-color: transparent + border-color: transparent + box-shadow: none + &.is-ghost + background: $button-ghost-background + border-color: $button-ghost-border-color + color: $button-ghost-color + text-decoration: $button-ghost-decoration + &:hover, + &.is-hovered + color: $button-ghost-hover-color + text-decoration: $button-ghost-hover-decoration + @each $name, $pair in $button-colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name} + background-color: $color + border-color: transparent + color: $color-invert + &:hover, + &.is-hovered + background-color: bulmaDarken($color, 2.5%) + border-color: transparent + color: $color-invert + &:focus, + &.is-focused + border-color: transparent + color: $color-invert + &:not(:active) + box-shadow: $button-focus-box-shadow-size bulmaRgba($color, 0.25) + &:active, + &.is-active + background-color: bulmaDarken($color, 5%) + border-color: transparent + color: $color-invert + &[disabled], + fieldset[disabled] & + background-color: $color + border-color: $color + box-shadow: none + &.is-inverted + background-color: $color-invert + color: $color + &:hover, + &.is-hovered + background-color: bulmaDarken($color-invert, 5%) + &[disabled], + fieldset[disabled] & + background-color: $color-invert + border-color: transparent + box-shadow: none + color: $color + &.is-loading + &::after + border-color: transparent transparent $color-invert $color-invert !important + &.is-outlined + background-color: transparent + border-color: $color + color: $color + &:hover, + &.is-hovered, + &:focus, + &.is-focused + background-color: $color + border-color: $color + color: $color-invert + &.is-loading + &::after + border-color: transparent transparent $color $color !important + &:hover, + &.is-hovered, + &:focus, + &.is-focused + &::after + border-color: transparent transparent $color-invert $color-invert !important + &[disabled], + fieldset[disabled] & + background-color: transparent + border-color: $color + box-shadow: none + color: $color + &.is-inverted.is-outlined + background-color: transparent + border-color: $color-invert + color: $color-invert + &:hover, + &.is-hovered, + &:focus, + &.is-focused + background-color: $color-invert + color: $color + &.is-loading + &:hover, + &.is-hovered, + &:focus, + &.is-focused + &::after + border-color: transparent transparent $color $color !important + &[disabled], + fieldset[disabled] & + background-color: transparent + border-color: $color-invert + box-shadow: none + color: $color-invert + // If light and dark colors are provided + @if length($pair) >= 4 + $color-light: nth($pair, 3) + $color-dark: nth($pair, 4) + &.is-light + background-color: $color-light + color: $color-dark + &:hover, + &.is-hovered + background-color: bulmaDarken($color-light, 2.5%) + border-color: transparent + color: $color-dark + &:active, + &.is-active + background-color: bulmaDarken($color-light, 5%) + border-color: transparent + color: $color-dark + // Sizes + &.is-small + +button-small + &.is-normal + +button-normal + &.is-medium + +button-medium + &.is-large + +button-large + // Modifiers + &[disabled], + fieldset[disabled] & + background-color: $button-disabled-background-color + border-color: $button-disabled-border-color + box-shadow: $button-disabled-shadow + opacity: $button-disabled-opacity + &.is-fullwidth + display: flex + width: 100% + &.is-loading + color: transparent !important + pointer-events: none + &::after + @extend %loader + +center(1em) + position: absolute !important + &.is-static + background-color: $button-static-background-color + border-color: $button-static-border-color + color: $button-static-color + box-shadow: none + pointer-events: none + &.is-rounded + border-radius: $radius-rounded + padding-left: calc(#{$button-padding-horizontal} + 0.25em) + padding-right: calc(#{$button-padding-horizontal} + 0.25em) + +.buttons + align-items: center + display: flex + flex-wrap: wrap + justify-content: flex-start + .button + margin-bottom: 0.5rem + &:not(:last-child):not(.is-fullwidth) + +ltr-property("margin", 0.5rem) + &:last-child + margin-bottom: -0.5rem + &:not(:last-child) + margin-bottom: 1rem + // Sizes + &.are-small + .button:not(.is-normal):not(.is-medium):not(.is-large) + +button-small + &.are-medium + .button:not(.is-small):not(.is-normal):not(.is-large) + +button-medium + &.are-large + .button:not(.is-small):not(.is-normal):not(.is-medium) + +button-large + &.has-addons + .button + &:not(:first-child) + border-bottom-left-radius: 0 + border-top-left-radius: 0 + &:not(:last-child) + border-bottom-right-radius: 0 + border-top-right-radius: 0 + +ltr-property("margin", -1px) + &:last-child + +ltr-property("margin", 0) + &:hover, + &.is-hovered + z-index: 2 + &:focus, + &.is-focused, + &:active, + &.is-active, + &.is-selected + z-index: 3 + &:hover + z-index: 4 + &.is-expanded + flex-grow: 1 + flex-shrink: 1 + &.is-centered + justify-content: center + &:not(.has-addons) + .button:not(.is-fullwidth) + margin-left: 0.25rem + margin-right: 0.25rem + &.is-right + justify-content: flex-end + &:not(.has-addons) + .button:not(.is-fullwidth) + margin-left: 0.25rem + margin-right: 0.25rem + +@each $bp-name, $bp-sizes in $button-responsive-sizes + +breakpoint($bp-name) + @each $size, $value in $bp-sizes + @if $size != "normal" + .button.is-responsive.is-#{$size} + font-size: $value + @else + .button.is-responsive, + .button.is-responsive.is-normal + font-size: $value diff --git a/guide/style/bulma/sass/elements/container.sass b/guide/style/bulma/sass/elements/container.sass new file mode 100644 index 00000000..c13011e3 --- /dev/null +++ b/guide/style/bulma/sass/elements/container.sass @@ -0,0 +1,29 @@ +@import "../utilities/mixins" + +$container-offset: (2 * $gap) !default +$container-max-width: $fullhd !default + +.container + flex-grow: 1 + margin: 0 auto + position: relative + width: auto + &.is-fluid + max-width: none !important + padding-left: $gap + padding-right: $gap + width: 100% + +desktop + max-width: $desktop - $container-offset + +until-widescreen + &.is-widescreen:not(.is-max-desktop) + max-width: min($widescreen, $container-max-width) - $container-offset + +until-fullhd + &.is-fullhd:not(.is-max-desktop):not(.is-max-widescreen) + max-width: min($fullhd, $container-max-width) - $container-offset + +widescreen + &:not(.is-max-desktop) + max-width: min($widescreen, $container-max-width) - $container-offset + +fullhd + &:not(.is-max-desktop):not(.is-max-widescreen) + max-width: min($fullhd, $container-max-width) - $container-offset diff --git a/guide/style/bulma/sass/elements/content.sass b/guide/style/bulma/sass/elements/content.sass new file mode 100644 index 00000000..3f709ad7 --- /dev/null +++ b/guide/style/bulma/sass/elements/content.sass @@ -0,0 +1,162 @@ +@import "../utilities/mixins" + +$content-heading-color: $text-strong !default +$content-heading-weight: $weight-semibold !default +$content-heading-line-height: 1.125 !default + +$content-block-margin-bottom: 1em !default + +$content-blockquote-background-color: $background !default +$content-blockquote-border-left: 5px solid $border !default +$content-blockquote-padding: 1.25em 1.5em !default + +$content-pre-padding: 1.25em 1.5em !default + +$content-table-cell-border: 1px solid $border !default +$content-table-cell-border-width: 0 0 1px !default +$content-table-cell-padding: 0.5em 0.75em !default +$content-table-cell-heading-color: $text-strong !default +$content-table-head-cell-border-width: 0 0 2px !default +$content-table-head-cell-color: $text-strong !default +$content-table-body-last-row-cell-border-bottom-width: 0 !default +$content-table-foot-cell-border-width: 2px 0 0 !default +$content-table-foot-cell-color: $text-strong !default + +.content + @extend %block + // Inline + li + li + margin-top: 0.25em + // Block + p, + dl, + ol, + ul, + blockquote, + pre, + table + &:not(:last-child) + margin-bottom: $content-block-margin-bottom + h1, + h2, + h3, + h4, + h5, + h6 + color: $content-heading-color + font-weight: $content-heading-weight + line-height: $content-heading-line-height + h1 + font-size: 2em + margin-bottom: 0.5em + &:not(:first-child) + margin-top: 1em + h2 + font-size: 1.75em + margin-bottom: 0.5714em + &:not(:first-child) + margin-top: 1.1428em + h3 + font-size: 1.5em + margin-bottom: 0.6666em + &:not(:first-child) + margin-top: 1.3333em + h4 + font-size: 1.25em + margin-bottom: 0.8em + h5 + font-size: 1.125em + margin-bottom: 0.8888em + h6 + font-size: 1em + margin-bottom: 1em + blockquote + background-color: $content-blockquote-background-color + +ltr-property("border", $content-blockquote-border-left, false) + padding: $content-blockquote-padding + ol + list-style-position: outside + +ltr-property("margin", 2em, false) + margin-top: 1em + &:not([type]) + list-style-type: decimal + &.is-lower-alpha + list-style-type: lower-alpha + &.is-lower-roman + list-style-type: lower-roman + &.is-upper-alpha + list-style-type: upper-alpha + &.is-upper-roman + list-style-type: upper-roman + ul + list-style: disc outside + +ltr-property("margin", 2em, false) + margin-top: 1em + ul + list-style-type: circle + margin-top: 0.5em + ul + list-style-type: square + dd + +ltr-property("margin", 2em, false) + figure + margin-left: 2em + margin-right: 2em + text-align: center + &:not(:first-child) + margin-top: 2em + &:not(:last-child) + margin-bottom: 2em + img + display: inline-block + figcaption + font-style: italic + pre + +overflow-touch + overflow-x: auto + padding: $content-pre-padding + white-space: pre + word-wrap: normal + sup, + sub + font-size: 75% + table + width: 100% + td, + th + border: $content-table-cell-border + border-width: $content-table-cell-border-width + padding: $content-table-cell-padding + vertical-align: top + th + color: $content-table-cell-heading-color + &:not([align]) + text-align: inherit + thead + td, + th + border-width: $content-table-head-cell-border-width + color: $content-table-head-cell-color + tfoot + td, + th + border-width: $content-table-foot-cell-border-width + color: $content-table-foot-cell-color + tbody + tr + &:last-child + td, + th + border-bottom-width: $content-table-body-last-row-cell-border-bottom-width + .tabs + li + li + margin-top: 0 + // Sizes + &.is-small + font-size: $size-small + &.is-normal + font-size: $size-normal + &.is-medium + font-size: $size-medium + &.is-large + font-size: $size-large diff --git a/guide/style/bulma/sass/elements/form.sass b/guide/style/bulma/sass/elements/form.sass new file mode 100644 index 00000000..3122dc4c --- /dev/null +++ b/guide/style/bulma/sass/elements/form.sass @@ -0,0 +1 @@ +@warn "The form.sass file is DEPRECATED. It has moved into its own /form folder. Please import sass/form/_all instead." diff --git a/guide/style/bulma/sass/elements/icon.sass b/guide/style/bulma/sass/elements/icon.sass new file mode 100644 index 00000000..0befe2b1 --- /dev/null +++ b/guide/style/bulma/sass/elements/icon.sass @@ -0,0 +1,46 @@ +$icon-dimensions: 1.5rem !default +$icon-dimensions-small: 1rem !default +$icon-dimensions-medium: 2rem !default +$icon-dimensions-large: 3rem !default +$icon-text-spacing: 0.25em !default + +.icon + align-items: center + display: inline-flex + justify-content: center + height: $icon-dimensions + width: $icon-dimensions + // Sizes + &.is-small + height: $icon-dimensions-small + width: $icon-dimensions-small + &.is-medium + height: $icon-dimensions-medium + width: $icon-dimensions-medium + &.is-large + height: $icon-dimensions-large + width: $icon-dimensions-large + +.icon-text + align-items: flex-start + color: inherit + display: inline-flex + flex-wrap: wrap + line-height: $icon-dimensions + vertical-align: top + .icon + flex-grow: 0 + flex-shrink: 0 + &:not(:last-child) + +ltr + margin-right: $icon-text-spacing + +rtl + margin-left: $icon-text-spacing + &:not(:first-child) + +ltr + margin-left: $icon-text-spacing + +rtl + margin-right: $icon-text-spacing + +div.icon-text + display: flex diff --git a/guide/style/bulma/sass/elements/image.sass b/guide/style/bulma/sass/elements/image.sass new file mode 100644 index 00000000..fc46541f --- /dev/null +++ b/guide/style/bulma/sass/elements/image.sass @@ -0,0 +1,73 @@ +@import "../utilities/mixins" + +$dimensions: 16 24 32 48 64 96 128 !default + +.image + display: block + position: relative + img + display: block + height: auto + width: 100% + &.is-rounded + border-radius: $radius-rounded + &.is-fullwidth + width: 100% + // Ratio + &.is-square, + &.is-1by1, + &.is-5by4, + &.is-4by3, + &.is-3by2, + &.is-5by3, + &.is-16by9, + &.is-2by1, + &.is-3by1, + &.is-4by5, + &.is-3by4, + &.is-2by3, + &.is-3by5, + &.is-9by16, + &.is-1by2, + &.is-1by3 + img, + .has-ratio + @extend %overlay + height: 100% + width: 100% + &.is-square, + &.is-1by1 + padding-top: 100% + &.is-5by4 + padding-top: 80% + &.is-4by3 + padding-top: 75% + &.is-3by2 + padding-top: 66.6666% + &.is-5by3 + padding-top: 60% + &.is-16by9 + padding-top: 56.25% + &.is-2by1 + padding-top: 50% + &.is-3by1 + padding-top: 33.3333% + &.is-4by5 + padding-top: 125% + &.is-3by4 + padding-top: 133.3333% + &.is-2by3 + padding-top: 150% + &.is-3by5 + padding-top: 166.6666% + &.is-9by16 + padding-top: 177.7777% + &.is-1by2 + padding-top: 200% + &.is-1by3 + padding-top: 300% + // Sizes + @each $dimension in $dimensions + &.is-#{$dimension}x#{$dimension} + height: $dimension * 1px + width: $dimension * 1px diff --git a/guide/style/bulma/sass/elements/notification.sass b/guide/style/bulma/sass/elements/notification.sass new file mode 100644 index 00000000..f5c60216 --- /dev/null +++ b/guide/style/bulma/sass/elements/notification.sass @@ -0,0 +1,52 @@ +@import "../utilities/mixins" + +$notification-background-color: $background !default +$notification-code-background-color: $scheme-main !default +$notification-radius: $radius !default +$notification-padding: 1.25rem 2.5rem 1.25rem 1.5rem !default +$notification-padding-ltr: 1.25rem 2.5rem 1.25rem 1.5rem !default +$notification-padding-rtl: 1.25rem 1.5rem 1.25rem 2.5rem !default + +$notification-colors: $colors !default + +.notification + @extend %block + background-color: $notification-background-color + border-radius: $notification-radius + position: relative + +ltr + padding: $notification-padding-ltr + +rtl + padding: $notification-padding-rtl + a:not(.button):not(.dropdown-item) + color: currentColor + text-decoration: underline + strong + color: currentColor + code, + pre + background: $notification-code-background-color + pre code + background: transparent + & > .delete + +ltr-position(0.5rem) + position: absolute + top: 0.5rem + .title, + .subtitle, + .content + color: currentColor + // Colors + @each $name, $pair in $notification-colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name} + background-color: $color + color: $color-invert + // If light and dark colors are provided + @if length($pair) >= 4 + $color-light: nth($pair, 3) + $color-dark: nth($pair, 4) + &.is-light + background-color: $color-light + color: $color-dark diff --git a/guide/style/bulma/sass/elements/other.sass b/guide/style/bulma/sass/elements/other.sass new file mode 100644 index 00000000..e83f3613 --- /dev/null +++ b/guide/style/bulma/sass/elements/other.sass @@ -0,0 +1,31 @@ +@import "../utilities/mixins" + +.block + @extend %block + +.delete + @extend %delete + +.heading + display: block + font-size: 11px + letter-spacing: 1px + margin-bottom: 5px + text-transform: uppercase + +.loader + @extend %loader + +.number + align-items: center + background-color: $background + border-radius: $radius-rounded + display: inline-flex + font-size: $size-medium + height: 2em + justify-content: center + margin-right: 1.5rem + min-width: 2.5em + padding: 0.25rem 0.5rem + text-align: center + vertical-align: top diff --git a/guide/style/bulma/sass/elements/progress.sass b/guide/style/bulma/sass/elements/progress.sass new file mode 100644 index 00000000..4daeb807 --- /dev/null +++ b/guide/style/bulma/sass/elements/progress.sass @@ -0,0 +1,73 @@ +@import "../utilities/mixins" + +$progress-bar-background-color: $border-light !default +$progress-value-background-color: $text !default +$progress-border-radius: $radius-rounded !default + +$progress-indeterminate-duration: 1.5s !default + +$progress-colors: $colors !default + +.progress + @extend %block + -moz-appearance: none + -webkit-appearance: none + border: none + border-radius: $progress-border-radius + display: block + height: $size-normal + overflow: hidden + padding: 0 + width: 100% + &::-webkit-progress-bar + background-color: $progress-bar-background-color + &::-webkit-progress-value + background-color: $progress-value-background-color + &::-moz-progress-bar + background-color: $progress-value-background-color + &::-ms-fill + background-color: $progress-value-background-color + border: none + // Colors + @each $name, $pair in $progress-colors + $color: nth($pair, 1) + &.is-#{$name} + &::-webkit-progress-value + background-color: $color + &::-moz-progress-bar + background-color: $color + &::-ms-fill + background-color: $color + &:indeterminate + background-image: linear-gradient(to right, $color 30%, $progress-bar-background-color 30%) + + &:indeterminate + animation-duration: $progress-indeterminate-duration + animation-iteration-count: infinite + animation-name: moveIndeterminate + animation-timing-function: linear + background-color: $progress-bar-background-color + background-image: linear-gradient(to right, $text 30%, $progress-bar-background-color 30%) + background-position: top left + background-repeat: no-repeat + background-size: 150% 150% + &::-webkit-progress-bar + background-color: transparent + &::-moz-progress-bar + background-color: transparent + &::-ms-fill + animation-name: none + + // Sizes + &.is-small + height: $size-small + &.is-medium + height: $size-medium + &.is-large + height: $size-large + +@keyframes moveIndeterminate + from + background-position: 200% 0 + to + background-position: -200% 0 diff --git a/guide/style/bulma/sass/elements/table.sass b/guide/style/bulma/sass/elements/table.sass new file mode 100644 index 00000000..f47d2123 --- /dev/null +++ b/guide/style/bulma/sass/elements/table.sass @@ -0,0 +1,134 @@ +@import "../utilities/mixins" + +$table-color: $text-strong !default +$table-background-color: $scheme-main !default + +$table-cell-border: 1px solid $border !default +$table-cell-border-width: 0 0 1px !default +$table-cell-padding: 0.5em 0.75em !default +$table-cell-heading-color: $text-strong !default +$table-cell-text-align: left !default + +$table-head-cell-border-width: 0 0 2px !default +$table-head-cell-color: $text-strong !default +$table-foot-cell-border-width: 2px 0 0 !default +$table-foot-cell-color: $text-strong !default + +$table-head-background-color: transparent !default +$table-body-background-color: transparent !default +$table-foot-background-color: transparent !default + +$table-row-hover-background-color: $scheme-main-bis !default + +$table-row-active-background-color: $primary !default +$table-row-active-color: $primary-invert !default + +$table-striped-row-even-background-color: $scheme-main-bis !default +$table-striped-row-even-hover-background-color: $scheme-main-ter !default + +$table-colors: $colors !default + +.table + @extend %block + background-color: $table-background-color + color: $table-color + td, + th + border: $table-cell-border + border-width: $table-cell-border-width + padding: $table-cell-padding + vertical-align: top + // Colors + @each $name, $pair in $table-colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name} + background-color: $color + border-color: $color + color: $color-invert + // Modifiers + &.is-narrow + white-space: nowrap + width: 1% + &.is-selected + background-color: $table-row-active-background-color + color: $table-row-active-color + a, + strong + color: currentColor + &.is-vcentered + vertical-align: middle + th + color: $table-cell-heading-color + &:not([align]) + text-align: $table-cell-text-align + tr + &.is-selected + background-color: $table-row-active-background-color + color: $table-row-active-color + a, + strong + color: currentColor + td, + th + border-color: $table-row-active-color + color: currentColor + thead + background-color: $table-head-background-color + td, + th + border-width: $table-head-cell-border-width + color: $table-head-cell-color + tfoot + background-color: $table-foot-background-color + td, + th + border-width: $table-foot-cell-border-width + color: $table-foot-cell-color + tbody + background-color: $table-body-background-color + tr + &:last-child + td, + th + border-bottom-width: 0 + // Modifiers + &.is-bordered + td, + th + border-width: 1px + tr + &:last-child + td, + th + border-bottom-width: 1px + &.is-fullwidth + width: 100% + &.is-hoverable + tbody + tr:not(.is-selected) + &:hover + background-color: $table-row-hover-background-color + &.is-striped + tbody + tr:not(.is-selected) + &:hover + background-color: $table-row-hover-background-color + &:nth-child(even) + background-color: $table-striped-row-even-hover-background-color + &.is-narrow + td, + th + padding: 0.25em 0.5em + &.is-striped + tbody + tr:not(.is-selected) + &:nth-child(even) + background-color: $table-striped-row-even-background-color + +.table-container + @extend %block + +overflow-touch + overflow: auto + overflow-y: hidden + max-width: 100% diff --git a/guide/style/bulma/sass/elements/tag.sass b/guide/style/bulma/sass/elements/tag.sass new file mode 100644 index 00000000..392daee6 --- /dev/null +++ b/guide/style/bulma/sass/elements/tag.sass @@ -0,0 +1,140 @@ +@import "../utilities/mixins" + +$tag-background-color: $background !default +$tag-color: $text !default +$tag-radius: $radius !default +$tag-delete-margin: 1px !default + +$tag-colors: $colors !default + +.tags + align-items: center + display: flex + flex-wrap: wrap + justify-content: flex-start + .tag + margin-bottom: 0.5rem + &:not(:last-child) + +ltr-property("margin", 0.5rem) + &:last-child + margin-bottom: -0.5rem + &:not(:last-child) + margin-bottom: 1rem + // Sizes + &.are-medium + .tag:not(.is-normal):not(.is-large) + font-size: $size-normal + &.are-large + .tag:not(.is-normal):not(.is-medium) + font-size: $size-medium + &.is-centered + justify-content: center + .tag + margin-right: 0.25rem + margin-left: 0.25rem + &.is-right + justify-content: flex-end + .tag + &:not(:first-child) + margin-left: 0.5rem + &:not(:last-child) + margin-right: 0 + &.has-addons + .tag + +ltr-property("margin", 0) + &:not(:first-child) + +ltr-property("margin", 0, false) + +ltr + border-top-left-radius: 0 + border-bottom-left-radius: 0 + +rtl + border-top-right-radius: 0 + border-bottom-right-radius: 0 + &:not(:last-child) + +ltr + border-top-right-radius: 0 + border-bottom-right-radius: 0 + +rtl + border-top-left-radius: 0 + border-bottom-left-radius: 0 + +.tag:not(body) + align-items: center + background-color: $tag-background-color + border-radius: $tag-radius + color: $tag-color + display: inline-flex + font-size: $size-small + height: 2em + justify-content: center + line-height: 1.5 + padding-left: 0.75em + padding-right: 0.75em + white-space: nowrap + .delete + +ltr-property("margin", 0.25rem, false) + +ltr-property("margin", -0.375rem) + // Colors + @each $name, $pair in $tag-colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name} + background-color: $color + color: $color-invert + // If a light and dark colors are provided + @if length($pair) > 3 + $color-light: nth($pair, 3) + $color-dark: nth($pair, 4) + &.is-light + background-color: $color-light + color: $color-dark + // Sizes + &.is-normal + font-size: $size-small + &.is-medium + font-size: $size-normal + &.is-large + font-size: $size-medium + .icon + &:first-child:not(:last-child) + +ltr-property("margin", -0.375em, false) + +ltr-property("margin", 0.1875em) + &:last-child:not(:first-child) + +ltr-property("margin", 0.1875em, false) + +ltr-property("margin", -0.375em) + &:first-child:last-child + +ltr-property("margin", -0.375em, false) + +ltr-property("margin", -0.375em) + // Modifiers + &.is-delete + +ltr-property("margin", $tag-delete-margin, false) + padding: 0 + position: relative + width: 2em + &::before, + &::after + background-color: currentColor + content: "" + display: block + left: 50% + position: absolute + top: 50% + transform: translateX(-50%) translateY(-50%) rotate(45deg) + transform-origin: center center + &::before + height: 1px + width: 50% + &::after + height: 50% + width: 1px + &:hover, + &:focus + background-color: darken($tag-background-color, 5%) + &:active + background-color: darken($tag-background-color, 10%) + &.is-rounded + border-radius: $radius-rounded + +a.tag + &:hover + text-decoration: underline diff --git a/guide/style/bulma/sass/elements/title.sass b/guide/style/bulma/sass/elements/title.sass new file mode 100644 index 00000000..022420c2 --- /dev/null +++ b/guide/style/bulma/sass/elements/title.sass @@ -0,0 +1,70 @@ +@import "../utilities/mixins" + +$title-color: $text-strong !default +$title-family: false !default +$title-size: $size-3 !default +$title-weight: $weight-semibold !default +$title-line-height: 1.125 !default +$title-strong-color: inherit !default +$title-strong-weight: inherit !default +$title-sub-size: 0.75em !default +$title-sup-size: 0.75em !default + +$subtitle-color: $text !default +$subtitle-family: false !default +$subtitle-size: $size-5 !default +$subtitle-weight: $weight-normal !default +$subtitle-line-height: 1.25 !default +$subtitle-strong-color: $text-strong !default +$subtitle-strong-weight: $weight-semibold !default +$subtitle-negative-margin: -1.25rem !default + +.title, +.subtitle + @extend %block + word-break: break-word + em, + span + font-weight: inherit + sub + font-size: $title-sub-size + sup + font-size: $title-sup-size + .tag + vertical-align: middle + +.title + color: $title-color + @if $title-family + font-family: $title-family + font-size: $title-size + font-weight: $title-weight + line-height: $title-line-height + strong + color: $title-strong-color + font-weight: $title-strong-weight + &:not(.is-spaced) + .subtitle + margin-top: $subtitle-negative-margin + // Sizes + @each $size in $sizes + $i: index($sizes, $size) + &.is-#{$i} + font-size: $size + +.subtitle + color: $subtitle-color + @if $subtitle-family + font-family: $subtitle-family + font-size: $subtitle-size + font-weight: $subtitle-weight + line-height: $subtitle-line-height + strong + color: $subtitle-strong-color + font-weight: $subtitle-strong-weight + &:not(.is-spaced) + .title + margin-top: $subtitle-negative-margin + // Sizes + @each $size in $sizes + $i: index($sizes, $size) + &.is-#{$i} + font-size: $size diff --git a/guide/style/bulma/sass/form/_all.sass b/guide/style/bulma/sass/form/_all.sass new file mode 100644 index 00000000..0a15f80a --- /dev/null +++ b/guide/style/bulma/sass/form/_all.sass @@ -0,0 +1,9 @@ +/* Bulma Form */ +@charset "utf-8" + +@import "shared" +@import "input-textarea" +@import "checkbox-radio" +@import "select" +@import "file" +@import "tools" diff --git a/guide/style/bulma/sass/form/checkbox-radio.sass b/guide/style/bulma/sass/form/checkbox-radio.sass new file mode 100644 index 00000000..f033d113 --- /dev/null +++ b/guide/style/bulma/sass/form/checkbox-radio.sass @@ -0,0 +1,22 @@ +%checkbox-radio + cursor: pointer + display: inline-block + line-height: 1.25 + position: relative + input + cursor: pointer + &:hover + color: $input-hover-color + &[disabled], + fieldset[disabled] &, + input[disabled] + color: $input-disabled-color + cursor: not-allowed + +.checkbox + @extend %checkbox-radio + +.radio + @extend %checkbox-radio + & + .radio + +ltr-property("margin", 0.5em, false) diff --git a/guide/style/bulma/sass/form/file.sass b/guide/style/bulma/sass/form/file.sass new file mode 100644 index 00000000..9b84c848 --- /dev/null +++ b/guide/style/bulma/sass/form/file.sass @@ -0,0 +1,184 @@ +$file-border-color: $border !default +$file-radius: $radius !default + +$file-cta-background-color: $scheme-main-ter !default +$file-cta-color: $text !default +$file-cta-hover-color: $text-strong !default +$file-cta-active-color: $text-strong !default + +$file-name-border-color: $border !default +$file-name-border-style: solid !default +$file-name-border-width: 1px 1px 1px 0 !default +$file-name-max-width: 16em !default + +$file-colors: $form-colors !default + +.file + @extend %unselectable + align-items: stretch + display: flex + justify-content: flex-start + position: relative + // Colors + @each $name, $pair in $file-colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name} + .file-cta + background-color: $color + border-color: transparent + color: $color-invert + &:hover, + &.is-hovered + .file-cta + background-color: bulmaDarken($color, 2.5%) + border-color: transparent + color: $color-invert + &:focus, + &.is-focused + .file-cta + border-color: transparent + box-shadow: 0 0 0.5em bulmaRgba($color, 0.25) + color: $color-invert + &:active, + &.is-active + .file-cta + background-color: bulmaDarken($color, 5%) + border-color: transparent + color: $color-invert + // Sizes + &.is-small + font-size: $size-small + &.is-normal + font-size: $size-normal + &.is-medium + font-size: $size-medium + .file-icon + .fa + font-size: 21px + &.is-large + font-size: $size-large + .file-icon + .fa + font-size: 28px + // Modifiers + &.has-name + .file-cta + border-bottom-right-radius: 0 + border-top-right-radius: 0 + .file-name + border-bottom-left-radius: 0 + border-top-left-radius: 0 + &.is-empty + .file-cta + border-radius: $file-radius + .file-name + display: none + &.is-boxed + .file-label + flex-direction: column + .file-cta + flex-direction: column + height: auto + padding: 1em 3em + .file-name + border-width: 0 1px 1px + .file-icon + height: 1.5em + width: 1.5em + .fa + font-size: 21px + &.is-small + .file-icon .fa + font-size: 14px + &.is-medium + .file-icon .fa + font-size: 28px + &.is-large + .file-icon .fa + font-size: 35px + &.has-name + .file-cta + border-radius: $file-radius $file-radius 0 0 + .file-name + border-radius: 0 0 $file-radius $file-radius + border-width: 0 1px 1px + &.is-centered + justify-content: center + &.is-fullwidth + .file-label + width: 100% + .file-name + flex-grow: 1 + max-width: none + &.is-right + justify-content: flex-end + .file-cta + border-radius: 0 $file-radius $file-radius 0 + .file-name + border-radius: $file-radius 0 0 $file-radius + border-width: 1px 0 1px 1px + order: -1 + +.file-label + align-items: stretch + display: flex + cursor: pointer + justify-content: flex-start + overflow: hidden + position: relative + &:hover + .file-cta + background-color: bulmaDarken($file-cta-background-color, 2.5%) + color: $file-cta-hover-color + .file-name + border-color: bulmaDarken($file-name-border-color, 2.5%) + &:active + .file-cta + background-color: bulmaDarken($file-cta-background-color, 5%) + color: $file-cta-active-color + .file-name + border-color: bulmaDarken($file-name-border-color, 5%) + +.file-input + height: 100% + left: 0 + opacity: 0 + outline: none + position: absolute + top: 0 + width: 100% + +.file-cta, +.file-name + @extend %control + border-color: $file-border-color + border-radius: $file-radius + font-size: 1em + padding-left: 1em + padding-right: 1em + white-space: nowrap + +.file-cta + background-color: $file-cta-background-color + color: $file-cta-color + +.file-name + border-color: $file-name-border-color + border-style: $file-name-border-style + border-width: $file-name-border-width + display: block + max-width: $file-name-max-width + overflow: hidden + text-align: inherit + text-overflow: ellipsis + +.file-icon + align-items: center + display: flex + height: 1em + justify-content: center + +ltr-property("margin", 0.5em) + width: 1em + .fa + font-size: 14px diff --git a/guide/style/bulma/sass/form/input-textarea.sass b/guide/style/bulma/sass/form/input-textarea.sass new file mode 100644 index 00000000..8d842a04 --- /dev/null +++ b/guide/style/bulma/sass/form/input-textarea.sass @@ -0,0 +1,66 @@ +$textarea-padding: $control-padding-horizontal !default +$textarea-max-height: 40em !default +$textarea-min-height: 8em !default + +$textarea-colors: $form-colors !default + +%input-textarea + @extend %input + box-shadow: $input-shadow + max-width: 100% + width: 100% + &[readonly] + box-shadow: none + // Colors + @each $name, $pair in $textarea-colors + $color: nth($pair, 1) + &.is-#{$name} + border-color: $color + &:focus, + &.is-focused, + &:active, + &.is-active + box-shadow: $input-focus-box-shadow-size bulmaRgba($color, 0.25) + // Sizes + &.is-small + +control-small + &.is-medium + +control-medium + &.is-large + +control-large + // Modifiers + &.is-fullwidth + display: block + width: 100% + &.is-inline + display: inline + width: auto + +.input + @extend %input-textarea + &.is-rounded + border-radius: $radius-rounded + padding-left: calc(#{$control-padding-horizontal} + 0.375em) + padding-right: calc(#{$control-padding-horizontal} + 0.375em) + &.is-static + background-color: transparent + border-color: transparent + box-shadow: none + padding-left: 0 + padding-right: 0 + +.textarea + @extend %input-textarea + display: block + max-width: 100% + min-width: 100% + padding: $textarea-padding + resize: vertical + &:not([rows]) + max-height: $textarea-max-height + min-height: $textarea-min-height + &[rows] + height: initial + // Modifiers + &.has-fixed-size + resize: none diff --git a/guide/style/bulma/sass/form/select.sass b/guide/style/bulma/sass/form/select.sass new file mode 100644 index 00000000..951b735f --- /dev/null +++ b/guide/style/bulma/sass/form/select.sass @@ -0,0 +1,88 @@ +$select-colors: $form-colors !default + +.select + display: inline-block + max-width: 100% + position: relative + vertical-align: top + &:not(.is-multiple) + height: $input-height + &:not(.is-multiple):not(.is-loading) + &::after + @extend %arrow + border-color: $input-arrow + +ltr-position(1.125em) + z-index: 4 + &.is-rounded + select + border-radius: $radius-rounded + +ltr-property("padding", 1em, false) + select + @extend %input + cursor: pointer + display: block + font-size: 1em + max-width: 100% + outline: none + &::-ms-expand + display: none + &[disabled]:hover, + fieldset[disabled] &:hover + border-color: $input-disabled-border-color + &:not([multiple]) + +ltr-property("padding", 2.5em) + &[multiple] + height: auto + padding: 0 + option + padding: 0.5em 1em + // States + &:not(.is-multiple):not(.is-loading):hover + &::after + border-color: $input-hover-color + // Colors + @each $name, $pair in $select-colors + $color: nth($pair, 1) + &.is-#{$name} + &:not(:hover)::after + border-color: $color + select + border-color: $color + &:hover, + &.is-hovered + border-color: bulmaDarken($color, 5%) + &:focus, + &.is-focused, + &:active, + &.is-active + box-shadow: $input-focus-box-shadow-size bulmaRgba($color, 0.25) + // Sizes + &.is-small + +control-small + &.is-medium + +control-medium + &.is-large + +control-large + // Modifiers + &.is-disabled + &::after + border-color: $input-disabled-color !important + opacity: 0.5 + &.is-fullwidth + width: 100% + select + width: 100% + &.is-loading + &::after + @extend %loader + margin-top: 0 + position: absolute + +ltr-position(0.625em) + top: 0.625em + transform: none + &.is-small:after + font-size: $size-small + &.is-medium:after + font-size: $size-medium + &.is-large:after + font-size: $size-large diff --git a/guide/style/bulma/sass/form/shared.sass b/guide/style/bulma/sass/form/shared.sass new file mode 100644 index 00000000..422d7aa3 --- /dev/null +++ b/guide/style/bulma/sass/form/shared.sass @@ -0,0 +1,60 @@ +@import "../utilities/controls" +@import "../utilities/mixins" + +$form-colors: $colors !default + +$input-color: $text-strong !default +$input-background-color: $scheme-main !default +$input-border-color: $border !default +$input-height: $control-height !default +$input-shadow: inset 0 0.0625em 0.125em rgba($scheme-invert, 0.05) !default +$input-placeholder-color: bulmaRgba($input-color, 0.3) !default + +$input-hover-color: $text-strong !default +$input-hover-border-color: $border-hover !default + +$input-focus-color: $text-strong !default +$input-focus-border-color: $link !default +$input-focus-box-shadow-size: 0 0 0 0.125em !default +$input-focus-box-shadow-color: bulmaRgba($link, 0.25) !default + +$input-disabled-color: $text-light !default +$input-disabled-background-color: $background !default +$input-disabled-border-color: $background !default +$input-disabled-placeholder-color: bulmaRgba($input-disabled-color, 0.3) !default + +$input-arrow: $link !default + +$input-icon-color: $border !default +$input-icon-active-color: $text !default + +$input-radius: $radius !default + +=input + @extend %control + background-color: $input-background-color + border-color: $input-border-color + border-radius: $input-radius + color: $input-color + +placeholder + color: $input-placeholder-color + &:hover, + &.is-hovered + border-color: $input-hover-border-color + &:focus, + &.is-focused, + &:active, + &.is-active + border-color: $input-focus-border-color + box-shadow: $input-focus-box-shadow-size $input-focus-box-shadow-color + &[disabled], + fieldset[disabled] & + background-color: $input-disabled-background-color + border-color: $input-disabled-border-color + box-shadow: none + color: $input-disabled-color + +placeholder + color: $input-disabled-placeholder-color + +%input + +input diff --git a/guide/style/bulma/sass/form/tools.sass b/guide/style/bulma/sass/form/tools.sass new file mode 100644 index 00000000..73b09b64 --- /dev/null +++ b/guide/style/bulma/sass/form/tools.sass @@ -0,0 +1,215 @@ +$label-color: $text-strong !default +$label-weight: $weight-bold !default + +$help-size: $size-small !default + +$label-colors: $form-colors !default + +.label + color: $label-color + display: block + font-size: $size-normal + font-weight: $label-weight + &:not(:last-child) + margin-bottom: 0.5em + // Sizes + &.is-small + font-size: $size-small + &.is-medium + font-size: $size-medium + &.is-large + font-size: $size-large + +.help + display: block + font-size: $help-size + margin-top: 0.25rem + @each $name, $pair in $label-colors + $color: nth($pair, 1) + &.is-#{$name} + color: $color + +// Containers + +.field + &:not(:last-child) + margin-bottom: 0.75rem + // Modifiers + &.has-addons + display: flex + justify-content: flex-start + .control + &:not(:last-child) + +ltr-property("margin", -1px) + &:not(:first-child):not(:last-child) + .button, + .input, + .select select + border-radius: 0 + &:first-child:not(:only-child) + .button, + .input, + .select select + +ltr + border-bottom-right-radius: 0 + border-top-right-radius: 0 + +rtl + border-bottom-left-radius: 0 + border-top-left-radius: 0 + &:last-child:not(:only-child) + .button, + .input, + .select select + +ltr + border-bottom-left-radius: 0 + border-top-left-radius: 0 + +rtl + border-bottom-right-radius: 0 + border-top-right-radius: 0 + .button, + .input, + .select select + &:not([disabled]) + &:hover, + &.is-hovered + z-index: 2 + &:focus, + &.is-focused, + &:active, + &.is-active + z-index: 3 + &:hover + z-index: 4 + &.is-expanded + flex-grow: 1 + flex-shrink: 1 + &.has-addons-centered + justify-content: center + &.has-addons-right + justify-content: flex-end + &.has-addons-fullwidth + .control + flex-grow: 1 + flex-shrink: 0 + &.is-grouped + display: flex + justify-content: flex-start + & > .control + flex-shrink: 0 + &:not(:last-child) + margin-bottom: 0 + +ltr-property("margin", 0.75rem) + &.is-expanded + flex-grow: 1 + flex-shrink: 1 + &.is-grouped-centered + justify-content: center + &.is-grouped-right + justify-content: flex-end + &.is-grouped-multiline + flex-wrap: wrap + & > .control + &:last-child, + &:not(:last-child) + margin-bottom: 0.75rem + &:last-child + margin-bottom: -0.75rem + &:not(:last-child) + margin-bottom: 0 + &.is-horizontal + +tablet + display: flex + +.field-label + .label + font-size: inherit + +mobile + margin-bottom: 0.5rem + +tablet + flex-basis: 0 + flex-grow: 1 + flex-shrink: 0 + +ltr-property("margin", 1.5rem) + text-align: right + &.is-small + font-size: $size-small + padding-top: 0.375em + &.is-normal + padding-top: 0.375em + &.is-medium + font-size: $size-medium + padding-top: 0.375em + &.is-large + font-size: $size-large + padding-top: 0.375em + +.field-body + .field .field + margin-bottom: 0 + +tablet + display: flex + flex-basis: 0 + flex-grow: 5 + flex-shrink: 1 + .field + margin-bottom: 0 + & > .field + flex-shrink: 1 + &:not(.is-narrow) + flex-grow: 1 + &:not(:last-child) + +ltr-property("margin", 0.75rem) + +.control + box-sizing: border-box + clear: both + font-size: $size-normal + position: relative + text-align: inherit + // Modifiers + &.has-icons-left, + &.has-icons-right + .input, + .select + &:focus + & ~ .icon + color: $input-icon-active-color + &.is-small ~ .icon + font-size: $size-small + &.is-medium ~ .icon + font-size: $size-medium + &.is-large ~ .icon + font-size: $size-large + .icon + color: $input-icon-color + height: $input-height + pointer-events: none + position: absolute + top: 0 + width: $input-height + z-index: 4 + &.has-icons-left + .input, + .select select + padding-left: $input-height + .icon.is-left + left: 0 + &.has-icons-right + .input, + .select select + padding-right: $input-height + .icon.is-right + right: 0 + &.is-loading + &::after + @extend %loader + position: absolute !important + +ltr-position(0.625em) + top: 0.625em + z-index: 4 + &.is-small:after + font-size: $size-small + &.is-medium:after + font-size: $size-medium + &.is-large:after + font-size: $size-large diff --git a/guide/style/bulma/sass/grid/_all.sass b/guide/style/bulma/sass/grid/_all.sass new file mode 100644 index 00000000..0b5ed310 --- /dev/null +++ b/guide/style/bulma/sass/grid/_all.sass @@ -0,0 +1,5 @@ +/* Bulma Grid */ +@charset "utf-8" + +@import "columns" +@import "tiles" diff --git a/guide/style/bulma/sass/grid/columns.sass b/guide/style/bulma/sass/grid/columns.sass new file mode 100644 index 00000000..e66112b5 --- /dev/null +++ b/guide/style/bulma/sass/grid/columns.sass @@ -0,0 +1,513 @@ +@import "../utilities/mixins" + +$column-gap: 0.75rem !default + +.column + display: block + flex-basis: 0 + flex-grow: 1 + flex-shrink: 1 + padding: $column-gap + .columns.is-mobile > &.is-narrow + flex: none + width: unset + .columns.is-mobile > &.is-full + flex: none + width: 100% + .columns.is-mobile > &.is-three-quarters + flex: none + width: 75% + .columns.is-mobile > &.is-two-thirds + flex: none + width: 66.6666% + .columns.is-mobile > &.is-half + flex: none + width: 50% + .columns.is-mobile > &.is-one-third + flex: none + width: 33.3333% + .columns.is-mobile > &.is-one-quarter + flex: none + width: 25% + .columns.is-mobile > &.is-one-fifth + flex: none + width: 20% + .columns.is-mobile > &.is-two-fifths + flex: none + width: 40% + .columns.is-mobile > &.is-three-fifths + flex: none + width: 60% + .columns.is-mobile > &.is-four-fifths + flex: none + width: 80% + .columns.is-mobile > &.is-offset-three-quarters + +ltr-property("margin", 75%, false) + .columns.is-mobile > &.is-offset-two-thirds + +ltr-property("margin", 66.6666%, false) + .columns.is-mobile > &.is-offset-half + +ltr-property("margin", 50%, false) + .columns.is-mobile > &.is-offset-one-third + +ltr-property("margin", 33.3333%, false) + .columns.is-mobile > &.is-offset-one-quarter + +ltr-property("margin", 25%, false) + .columns.is-mobile > &.is-offset-one-fifth + +ltr-property("margin", 20%, false) + .columns.is-mobile > &.is-offset-two-fifths + +ltr-property("margin", 40%, false) + .columns.is-mobile > &.is-offset-three-fifths + +ltr-property("margin", 60%, false) + .columns.is-mobile > &.is-offset-four-fifths + +ltr-property("margin", 80%, false) + @for $i from 0 through 12 + .columns.is-mobile > &.is-#{$i} + flex: none + width: percentage(divide($i, 12)) + .columns.is-mobile > &.is-offset-#{$i} + +ltr-property("margin", percentage(divide($i, 12)), false) + +mobile + &.is-narrow-mobile + flex: none + width: unset + &.is-full-mobile + flex: none + width: 100% + &.is-three-quarters-mobile + flex: none + width: 75% + &.is-two-thirds-mobile + flex: none + width: 66.6666% + &.is-half-mobile + flex: none + width: 50% + &.is-one-third-mobile + flex: none + width: 33.3333% + &.is-one-quarter-mobile + flex: none + width: 25% + &.is-one-fifth-mobile + flex: none + width: 20% + &.is-two-fifths-mobile + flex: none + width: 40% + &.is-three-fifths-mobile + flex: none + width: 60% + &.is-four-fifths-mobile + flex: none + width: 80% + &.is-offset-three-quarters-mobile + +ltr-property("margin", 75%, false) + &.is-offset-two-thirds-mobile + +ltr-property("margin", 66.6666%, false) + &.is-offset-half-mobile + +ltr-property("margin", 50%, false) + &.is-offset-one-third-mobile + +ltr-property("margin", 33.3333%, false) + &.is-offset-one-quarter-mobile + +ltr-property("margin", 25%, false) + &.is-offset-one-fifth-mobile + +ltr-property("margin", 20%, false) + &.is-offset-two-fifths-mobile + +ltr-property("margin", 40%, false) + &.is-offset-three-fifths-mobile + +ltr-property("margin", 60%, false) + &.is-offset-four-fifths-mobile + +ltr-property("margin", 80%, false) + @for $i from 0 through 12 + &.is-#{$i}-mobile + flex: none + width: percentage(divide($i, 12)) + &.is-offset-#{$i}-mobile + +ltr-property("margin", percentage(divide($i, 12)), false) + +tablet + &.is-narrow, + &.is-narrow-tablet + flex: none + width: unset + &.is-full, + &.is-full-tablet + flex: none + width: 100% + &.is-three-quarters, + &.is-three-quarters-tablet + flex: none + width: 75% + &.is-two-thirds, + &.is-two-thirds-tablet + flex: none + width: 66.6666% + &.is-half, + &.is-half-tablet + flex: none + width: 50% + &.is-one-third, + &.is-one-third-tablet + flex: none + width: 33.3333% + &.is-one-quarter, + &.is-one-quarter-tablet + flex: none + width: 25% + &.is-one-fifth, + &.is-one-fifth-tablet + flex: none + width: 20% + &.is-two-fifths, + &.is-two-fifths-tablet + flex: none + width: 40% + &.is-three-fifths, + &.is-three-fifths-tablet + flex: none + width: 60% + &.is-four-fifths, + &.is-four-fifths-tablet + flex: none + width: 80% + &.is-offset-three-quarters, + &.is-offset-three-quarters-tablet + +ltr-property("margin", 75%, false) + &.is-offset-two-thirds, + &.is-offset-two-thirds-tablet + +ltr-property("margin", 66.6666%, false) + &.is-offset-half, + &.is-offset-half-tablet + +ltr-property("margin", 50%, false) + &.is-offset-one-third, + &.is-offset-one-third-tablet + +ltr-property("margin", 33.3333%, false) + &.is-offset-one-quarter, + &.is-offset-one-quarter-tablet + +ltr-property("margin", 25%, false) + &.is-offset-one-fifth, + &.is-offset-one-fifth-tablet + +ltr-property("margin", 20%, false) + &.is-offset-two-fifths, + &.is-offset-two-fifths-tablet + +ltr-property("margin", 40%, false) + &.is-offset-three-fifths, + &.is-offset-three-fifths-tablet + +ltr-property("margin", 60%, false) + &.is-offset-four-fifths, + &.is-offset-four-fifths-tablet + +ltr-property("margin", 80%, false) + @for $i from 0 through 12 + &.is-#{$i}, + &.is-#{$i}-tablet + flex: none + width: percentage(divide($i, 12)) + &.is-offset-#{$i}, + &.is-offset-#{$i}-tablet + +ltr-property("margin", percentage(divide($i, 12)), false) + +touch + &.is-narrow-touch + flex: none + width: unset + &.is-full-touch + flex: none + width: 100% + &.is-three-quarters-touch + flex: none + width: 75% + &.is-two-thirds-touch + flex: none + width: 66.6666% + &.is-half-touch + flex: none + width: 50% + &.is-one-third-touch + flex: none + width: 33.3333% + &.is-one-quarter-touch + flex: none + width: 25% + &.is-one-fifth-touch + flex: none + width: 20% + &.is-two-fifths-touch + flex: none + width: 40% + &.is-three-fifths-touch + flex: none + width: 60% + &.is-four-fifths-touch + flex: none + width: 80% + &.is-offset-three-quarters-touch + +ltr-property("margin", 75%, false) + &.is-offset-two-thirds-touch + +ltr-property("margin", 66.6666%, false) + &.is-offset-half-touch + +ltr-property("margin", 50%, false) + &.is-offset-one-third-touch + +ltr-property("margin", 33.3333%, false) + &.is-offset-one-quarter-touch + +ltr-property("margin", 25%, false) + &.is-offset-one-fifth-touch + +ltr-property("margin", 20%, false) + &.is-offset-two-fifths-touch + +ltr-property("margin", 40%, false) + &.is-offset-three-fifths-touch + +ltr-property("margin", 60%, false) + &.is-offset-four-fifths-touch + +ltr-property("margin", 80%, false) + @for $i from 0 through 12 + &.is-#{$i}-touch + flex: none + width: percentage(divide($i, 12)) + &.is-offset-#{$i}-touch + +ltr-property("margin", percentage(divide($i, 12)), false) + +desktop + &.is-narrow-desktop + flex: none + width: unset + &.is-full-desktop + flex: none + width: 100% + &.is-three-quarters-desktop + flex: none + width: 75% + &.is-two-thirds-desktop + flex: none + width: 66.6666% + &.is-half-desktop + flex: none + width: 50% + &.is-one-third-desktop + flex: none + width: 33.3333% + &.is-one-quarter-desktop + flex: none + width: 25% + &.is-one-fifth-desktop + flex: none + width: 20% + &.is-two-fifths-desktop + flex: none + width: 40% + &.is-three-fifths-desktop + flex: none + width: 60% + &.is-four-fifths-desktop + flex: none + width: 80% + &.is-offset-three-quarters-desktop + +ltr-property("margin", 75%, false) + &.is-offset-two-thirds-desktop + +ltr-property("margin", 66.6666%, false) + &.is-offset-half-desktop + +ltr-property("margin", 50%, false) + &.is-offset-one-third-desktop + +ltr-property("margin", 33.3333%, false) + &.is-offset-one-quarter-desktop + +ltr-property("margin", 25%, false) + &.is-offset-one-fifth-desktop + +ltr-property("margin", 20%, false) + &.is-offset-two-fifths-desktop + +ltr-property("margin", 40%, false) + &.is-offset-three-fifths-desktop + +ltr-property("margin", 60%, false) + &.is-offset-four-fifths-desktop + +ltr-property("margin", 80%, false) + @for $i from 0 through 12 + &.is-#{$i}-desktop + flex: none + width: percentage(divide($i, 12)) + &.is-offset-#{$i}-desktop + +ltr-property("margin", percentage(divide($i, 12)), false) + +widescreen + &.is-narrow-widescreen + flex: none + width: unset + &.is-full-widescreen + flex: none + width: 100% + &.is-three-quarters-widescreen + flex: none + width: 75% + &.is-two-thirds-widescreen + flex: none + width: 66.6666% + &.is-half-widescreen + flex: none + width: 50% + &.is-one-third-widescreen + flex: none + width: 33.3333% + &.is-one-quarter-widescreen + flex: none + width: 25% + &.is-one-fifth-widescreen + flex: none + width: 20% + &.is-two-fifths-widescreen + flex: none + width: 40% + &.is-three-fifths-widescreen + flex: none + width: 60% + &.is-four-fifths-widescreen + flex: none + width: 80% + &.is-offset-three-quarters-widescreen + +ltr-property("margin", 75%, false) + &.is-offset-two-thirds-widescreen + +ltr-property("margin", 66.6666%, false) + &.is-offset-half-widescreen + +ltr-property("margin", 50%, false) + &.is-offset-one-third-widescreen + +ltr-property("margin", 33.3333%, false) + &.is-offset-one-quarter-widescreen + +ltr-property("margin", 25%, false) + &.is-offset-one-fifth-widescreen + +ltr-property("margin", 20%, false) + &.is-offset-two-fifths-widescreen + +ltr-property("margin", 40%, false) + &.is-offset-three-fifths-widescreen + +ltr-property("margin", 60%, false) + &.is-offset-four-fifths-widescreen + +ltr-property("margin", 80%, false) + @for $i from 0 through 12 + &.is-#{$i}-widescreen + flex: none + width: percentage(divide($i, 12)) + &.is-offset-#{$i}-widescreen + +ltr-property("margin", percentage(divide($i, 12)), false) + +fullhd + &.is-narrow-fullhd + flex: none + width: unset + &.is-full-fullhd + flex: none + width: 100% + &.is-three-quarters-fullhd + flex: none + width: 75% + &.is-two-thirds-fullhd + flex: none + width: 66.6666% + &.is-half-fullhd + flex: none + width: 50% + &.is-one-third-fullhd + flex: none + width: 33.3333% + &.is-one-quarter-fullhd + flex: none + width: 25% + &.is-one-fifth-fullhd + flex: none + width: 20% + &.is-two-fifths-fullhd + flex: none + width: 40% + &.is-three-fifths-fullhd + flex: none + width: 60% + &.is-four-fifths-fullhd + flex: none + width: 80% + &.is-offset-three-quarters-fullhd + +ltr-property("margin", 75%, false) + &.is-offset-two-thirds-fullhd + +ltr-property("margin", 66.6666%, false) + &.is-offset-half-fullhd + +ltr-property("margin", 50%, false) + &.is-offset-one-third-fullhd + +ltr-property("margin", 33.3333%, false) + &.is-offset-one-quarter-fullhd + +ltr-property("margin", 25%, false) + &.is-offset-one-fifth-fullhd + +ltr-property("margin", 20%, false) + &.is-offset-two-fifths-fullhd + +ltr-property("margin", 40%, false) + &.is-offset-three-fifths-fullhd + +ltr-property("margin", 60%, false) + &.is-offset-four-fifths-fullhd + +ltr-property("margin", 80%, false) + @for $i from 0 through 12 + &.is-#{$i}-fullhd + flex: none + width: percentage(divide($i, 12)) + &.is-offset-#{$i}-fullhd + +ltr-property("margin", percentage(divide($i, 12)), false) + +.columns + +ltr-property("margin", (-$column-gap), false) + +ltr-property("margin", (-$column-gap)) + margin-top: (-$column-gap) + &:last-child + margin-bottom: (-$column-gap) + &:not(:last-child) + margin-bottom: calc(1.5rem - #{$column-gap}) + // Modifiers + &.is-centered + justify-content: center + &.is-gapless + +ltr-property("margin", 0, false) + +ltr-property("margin", 0) + margin-top: 0 + & > .column + margin: 0 + padding: 0 !important + &:not(:last-child) + margin-bottom: 1.5rem + &:last-child + margin-bottom: 0 + &.is-mobile + display: flex + &.is-multiline + flex-wrap: wrap + &.is-vcentered + align-items: center + // Responsiveness + +tablet + &:not(.is-desktop) + display: flex + +desktop + // Modifiers + &.is-desktop + display: flex + +@if $variable-columns + .columns.is-variable + --columnGap: 0.75rem + +ltr-property("margin", calc(-1 * var(--columnGap)), false) + +ltr-property("margin", calc(-1 * var(--columnGap))) + > .column + padding-left: var(--columnGap) + padding-right: var(--columnGap) + @for $i from 0 through 8 + &.is-#{$i} + --columnGap: #{$i * 0.25rem} + +mobile + &.is-#{$i}-mobile + --columnGap: #{$i * 0.25rem} + +tablet + &.is-#{$i}-tablet + --columnGap: #{$i * 0.25rem} + +tablet-only + &.is-#{$i}-tablet-only + --columnGap: #{$i * 0.25rem} + +touch + &.is-#{$i}-touch + --columnGap: #{$i * 0.25rem} + +desktop + &.is-#{$i}-desktop + --columnGap: #{$i * 0.25rem} + +desktop-only + &.is-#{$i}-desktop-only + --columnGap: #{$i * 0.25rem} + +widescreen + &.is-#{$i}-widescreen + --columnGap: #{$i * 0.25rem} + +widescreen-only + &.is-#{$i}-widescreen-only + --columnGap: #{$i * 0.25rem} + +fullhd + &.is-#{$i}-fullhd + --columnGap: #{$i * 0.25rem} diff --git a/guide/style/bulma/sass/grid/tiles.sass b/guide/style/bulma/sass/grid/tiles.sass new file mode 100644 index 00000000..d22d738d --- /dev/null +++ b/guide/style/bulma/sass/grid/tiles.sass @@ -0,0 +1,36 @@ +@import "../utilities/mixins" + +$tile-spacing: 0.75rem !default + +.tile + align-items: stretch + display: block + flex-basis: 0 + flex-grow: 1 + flex-shrink: 1 + min-height: min-content + // Modifiers + &.is-ancestor + margin-left: $tile-spacing * -1 + margin-right: $tile-spacing * -1 + margin-top: $tile-spacing * -1 + &:last-child + margin-bottom: $tile-spacing * -1 + &:not(:last-child) + margin-bottom: $tile-spacing + &.is-child + margin: 0 !important + &.is-parent + padding: $tile-spacing + &.is-vertical + flex-direction: column + & > .tile.is-child:not(:last-child) + margin-bottom: 1.5rem !important + // Responsiveness + +tablet + &:not(.is-child) + display: flex + @for $i from 1 through 12 + &.is-#{$i} + flex: none + width: (divide($i, 12)) * 100% diff --git a/guide/style/bulma/sass/helpers/_all.sass b/guide/style/bulma/sass/helpers/_all.sass new file mode 100644 index 00000000..d673da68 --- /dev/null +++ b/guide/style/bulma/sass/helpers/_all.sass @@ -0,0 +1,12 @@ +/* Bulma Helpers */ +@charset "utf-8" + +@import "color" +@import "flexbox" +@import "float" +@import "other" +@import "overflow" +@import "position" +@import "spacing" +@import "typography" +@import "visibility" diff --git a/guide/style/bulma/sass/helpers/color.sass b/guide/style/bulma/sass/helpers/color.sass new file mode 100644 index 00000000..b7a8a503 --- /dev/null +++ b/guide/style/bulma/sass/helpers/color.sass @@ -0,0 +1,39 @@ +@import "../utilities/derived-variables" + +@each $name, $pair in $colors + $color: nth($pair, 1) + .has-text-#{$name} + color: $color !important + a.has-text-#{$name} + &:hover, + &:focus + color: bulmaDarken($color, 10%) !important + .has-background-#{$name} + background-color: $color !important + @if length($pair) >= 4 + $color-light: nth($pair, 3) + $color-dark: nth($pair, 4) + // Light + .has-text-#{$name}-light + color: $color-light !important + a.has-text-#{$name}-light + &:hover, + &:focus + color: bulmaDarken($color-light, 10%) !important + .has-background-#{$name}-light + background-color: $color-light !important + // Dark + .has-text-#{$name}-dark + color: $color-dark !important + a.has-text-#{$name}-dark + &:hover, + &:focus + color: bulmaLighten($color-dark, 10%) !important + .has-background-#{$name}-dark + background-color: $color-dark !important + +@each $name, $shade in $shades + .has-text-#{$name} + color: $shade !important + .has-background-#{$name} + background-color: $shade !important diff --git a/guide/style/bulma/sass/helpers/flexbox.sass b/guide/style/bulma/sass/helpers/flexbox.sass new file mode 100644 index 00000000..2538a2db --- /dev/null +++ b/guide/style/bulma/sass/helpers/flexbox.sass @@ -0,0 +1,35 @@ +$flex-direction-values: row, row-reverse, column, column-reverse +@each $value in $flex-direction-values + .is-flex-direction-#{$value} + flex-direction: $value !important + +$flex-wrap-values: nowrap, wrap, wrap-reverse +@each $value in $flex-wrap-values + .is-flex-wrap-#{$value} + flex-wrap: $value !important + +$justify-content-values: flex-start, flex-end, center, space-between, space-around, space-evenly, start, end, left, right +@each $value in $justify-content-values + .is-justify-content-#{$value} + justify-content: $value !important + +$align-content-values: flex-start, flex-end, center, space-between, space-around, space-evenly, stretch, start, end, baseline +@each $value in $align-content-values + .is-align-content-#{$value} + align-content: $value !important + +$align-items-values: stretch, flex-start, flex-end, center, baseline, start, end, self-start, self-end +@each $value in $align-items-values + .is-align-items-#{$value} + align-items: $value !important + +$align-self-values: auto, flex-start, flex-end, center, baseline, stretch +@each $value in $align-self-values + .is-align-self-#{$value} + align-self: $value !important + +$flex-operators: grow, shrink +@each $operator in $flex-operators + @for $i from 0 through 5 + .is-flex-#{$operator}-#{$i} + flex-#{$operator}: $i !important diff --git a/guide/style/bulma/sass/helpers/float.sass b/guide/style/bulma/sass/helpers/float.sass new file mode 100644 index 00000000..f62f24e0 --- /dev/null +++ b/guide/style/bulma/sass/helpers/float.sass @@ -0,0 +1,10 @@ +@import "../utilities/mixins" + +.is-clearfix + +clearfix + +.is-pulled-left + float: left !important + +.is-pulled-right + float: right !important diff --git a/guide/style/bulma/sass/helpers/other.sass b/guide/style/bulma/sass/helpers/other.sass new file mode 100644 index 00000000..6e2e63ce --- /dev/null +++ b/guide/style/bulma/sass/helpers/other.sass @@ -0,0 +1,14 @@ +@import "../utilities/mixins" + +.is-radiusless + border-radius: 0 !important + +.is-shadowless + box-shadow: none !important + +.is-clickable + cursor: pointer !important + pointer-events: all !important + +.is-unselectable + @extend %unselectable diff --git a/guide/style/bulma/sass/helpers/overflow.sass b/guide/style/bulma/sass/helpers/overflow.sass new file mode 100644 index 00000000..ef1e3ef0 --- /dev/null +++ b/guide/style/bulma/sass/helpers/overflow.sass @@ -0,0 +1,2 @@ +.is-clipped + overflow: hidden !important diff --git a/guide/style/bulma/sass/helpers/position.sass b/guide/style/bulma/sass/helpers/position.sass new file mode 100644 index 00000000..4b8fda47 --- /dev/null +++ b/guide/style/bulma/sass/helpers/position.sass @@ -0,0 +1,7 @@ +@import "../utilities/mixins" + +.is-overlay + @extend %overlay + +.is-relative + position: relative !important diff --git a/guide/style/bulma/sass/helpers/spacing.sass b/guide/style/bulma/sass/helpers/spacing.sass new file mode 100644 index 00000000..0237c738 --- /dev/null +++ b/guide/style/bulma/sass/helpers/spacing.sass @@ -0,0 +1,31 @@ +.is-marginless + margin: 0 !important + +.is-paddingless + padding: 0 !important + +$spacing-shortcuts: ("margin": "m", "padding": "p") !default +$spacing-directions: ("top": "t", "right": "r", "bottom": "b", "left": "l") !default +$spacing-horizontal: "x" !default +$spacing-vertical: "y" !default +$spacing-values: ("0": 0, "1": 0.25rem, "2": 0.5rem, "3": 0.75rem, "4": 1rem, "5": 1.5rem, "6": 3rem, "auto": auto) !default + +@each $property, $shortcut in $spacing-shortcuts + @each $name, $value in $spacing-values + // All directions + .#{$shortcut}-#{$name} + #{$property}: $value !important + // Cardinal directions + @each $direction, $suffix in $spacing-directions + .#{$shortcut}#{$suffix}-#{$name} + #{$property}-#{$direction}: $value !important + // Horizontal axis + @if $spacing-horizontal != null + .#{$shortcut}#{$spacing-horizontal}-#{$name} + #{$property}-left: $value !important + #{$property}-right: $value !important + // Vertical axis + @if $spacing-vertical != null + .#{$shortcut}#{$spacing-vertical}-#{$name} + #{$property}-top: $value !important + #{$property}-bottom: $value !important diff --git a/guide/style/bulma/sass/helpers/typography.sass b/guide/style/bulma/sass/helpers/typography.sass new file mode 100644 index 00000000..dceca77a --- /dev/null +++ b/guide/style/bulma/sass/helpers/typography.sass @@ -0,0 +1,103 @@ +@import "../utilities/mixins" + +=typography-size($target:'') + @each $size in $sizes + $i: index($sizes, $size) + .is-size-#{$i}#{if($target == '', '', '-' + $target)} + font-size: $size !important + ++typography-size() + ++mobile + +typography-size('mobile') + ++tablet + +typography-size('tablet') + ++touch + +typography-size('touch') + ++desktop + +typography-size('desktop') + ++widescreen + +typography-size('widescreen') + ++fullhd + +typography-size('fullhd') + +$alignments: ('centered': 'center', 'justified': 'justify', 'left': 'left', 'right': 'right') + +@each $alignment, $text-align in $alignments + .has-text-#{$alignment} + text-align: #{$text-align} !important + +@each $alignment, $text-align in $alignments + +mobile + .has-text-#{$alignment}-mobile + text-align: #{$text-align} !important + +tablet + .has-text-#{$alignment}-tablet + text-align: #{$text-align} !important + +tablet-only + .has-text-#{$alignment}-tablet-only + text-align: #{$text-align} !important + +touch + .has-text-#{$alignment}-touch + text-align: #{$text-align} !important + +desktop + .has-text-#{$alignment}-desktop + text-align: #{$text-align} !important + +desktop-only + .has-text-#{$alignment}-desktop-only + text-align: #{$text-align} !important + +widescreen + .has-text-#{$alignment}-widescreen + text-align: #{$text-align} !important + +widescreen-only + .has-text-#{$alignment}-widescreen-only + text-align: #{$text-align} !important + +fullhd + .has-text-#{$alignment}-fullhd + text-align: #{$text-align} !important + +.is-capitalized + text-transform: capitalize !important + +.is-lowercase + text-transform: lowercase !important + +.is-uppercase + text-transform: uppercase !important + +.is-italic + font-style: italic !important + +.is-underlined + text-decoration: underline !important + +.has-text-weight-light + font-weight: $weight-light !important +.has-text-weight-normal + font-weight: $weight-normal !important +.has-text-weight-medium + font-weight: $weight-medium !important +.has-text-weight-semibold + font-weight: $weight-semibold !important +.has-text-weight-bold + font-weight: $weight-bold !important + +.is-family-primary + font-family: $family-primary !important + +.is-family-secondary + font-family: $family-secondary !important + +.is-family-sans-serif + font-family: $family-sans-serif !important + +.is-family-monospace + font-family: $family-monospace !important + +.is-family-code + font-family: $family-code !important diff --git a/guide/style/bulma/sass/helpers/visibility.sass b/guide/style/bulma/sass/helpers/visibility.sass new file mode 100644 index 00000000..a1bb0d56 --- /dev/null +++ b/guide/style/bulma/sass/helpers/visibility.sass @@ -0,0 +1,122 @@ +@import "../utilities/mixins" + +$displays: 'block' 'flex' 'inline' 'inline-block' 'inline-flex' + +@each $display in $displays + .is-#{$display} + display: #{$display} !important + +mobile + .is-#{$display}-mobile + display: #{$display} !important + +tablet + .is-#{$display}-tablet + display: #{$display} !important + +tablet-only + .is-#{$display}-tablet-only + display: #{$display} !important + +touch + .is-#{$display}-touch + display: #{$display} !important + +desktop + .is-#{$display}-desktop + display: #{$display} !important + +desktop-only + .is-#{$display}-desktop-only + display: #{$display} !important + +widescreen + .is-#{$display}-widescreen + display: #{$display} !important + +widescreen-only + .is-#{$display}-widescreen-only + display: #{$display} !important + +fullhd + .is-#{$display}-fullhd + display: #{$display} !important + +.is-hidden + display: none !important + +.is-sr-only + border: none !important + clip: rect(0, 0, 0, 0) !important + height: 0.01em !important + overflow: hidden !important + padding: 0 !important + position: absolute !important + white-space: nowrap !important + width: 0.01em !important + ++mobile + .is-hidden-mobile + display: none !important + ++tablet + .is-hidden-tablet + display: none !important + ++tablet-only + .is-hidden-tablet-only + display: none !important + ++touch + .is-hidden-touch + display: none !important + ++desktop + .is-hidden-desktop + display: none !important + ++desktop-only + .is-hidden-desktop-only + display: none !important + ++widescreen + .is-hidden-widescreen + display: none !important + ++widescreen-only + .is-hidden-widescreen-only + display: none !important + ++fullhd + .is-hidden-fullhd + display: none !important + +.is-invisible + visibility: hidden !important + ++mobile + .is-invisible-mobile + visibility: hidden !important + ++tablet + .is-invisible-tablet + visibility: hidden !important + ++tablet-only + .is-invisible-tablet-only + visibility: hidden !important + ++touch + .is-invisible-touch + visibility: hidden !important + ++desktop + .is-invisible-desktop + visibility: hidden !important + ++desktop-only + .is-invisible-desktop-only + visibility: hidden !important + ++widescreen + .is-invisible-widescreen + visibility: hidden !important + ++widescreen-only + .is-invisible-widescreen-only + visibility: hidden !important + ++fullhd + .is-invisible-fullhd + visibility: hidden !important diff --git a/guide/style/bulma/sass/layout/_all.sass b/guide/style/bulma/sass/layout/_all.sass new file mode 100644 index 00000000..4d1df5b7 --- /dev/null +++ b/guide/style/bulma/sass/layout/_all.sass @@ -0,0 +1,6 @@ +/* Bulma Layout */ +@charset "utf-8" + +@import "hero" +@import "section" +@import "footer" diff --git a/guide/style/bulma/sass/layout/footer.sass b/guide/style/bulma/sass/layout/footer.sass new file mode 100644 index 00000000..4e9187e1 --- /dev/null +++ b/guide/style/bulma/sass/layout/footer.sass @@ -0,0 +1,11 @@ +@import "../utilities/derived-variables" + +$footer-background-color: $scheme-main-bis !default +$footer-color: false !default +$footer-padding: 3rem 1.5rem 6rem !default + +.footer + background-color: $footer-background-color + padding: $footer-padding + @if $footer-color + color: $footer-color diff --git a/guide/style/bulma/sass/layout/hero.sass b/guide/style/bulma/sass/layout/hero.sass new file mode 100644 index 00000000..bd2312c9 --- /dev/null +++ b/guide/style/bulma/sass/layout/hero.sass @@ -0,0 +1,153 @@ +@import "../utilities/mixins" + +$hero-body-padding: 3rem 1.5rem !default +$hero-body-padding-tablet: 3rem 3rem !default +$hero-body-padding-small: 1.5rem !default +$hero-body-padding-medium: 9rem 4.5rem !default +$hero-body-padding-large: 18rem 6rem !default + +$hero-colors: $colors !default + +// Main container +.hero + align-items: stretch + display: flex + flex-direction: column + justify-content: space-between + .navbar + background: none + .tabs + ul + border-bottom: none + // Colors + @each $name, $pair in $hero-colors + $color: nth($pair, 1) + $color-invert: nth($pair, 2) + &.is-#{$name} + background-color: $color + color: $color-invert + a:not(.button):not(.dropdown-item):not(.tag):not(.pagination-link.is-current), + strong + color: inherit + .title + color: $color-invert + .subtitle + color: bulmaRgba($color-invert, 0.9) + a:not(.button), + strong + color: $color-invert + .navbar-menu + +touch + background-color: $color + .navbar-item, + .navbar-link + color: bulmaRgba($color-invert, 0.7) + a.navbar-item, + .navbar-link + &:hover, + &.is-active + background-color: bulmaDarken($color, 5%) + color: $color-invert + .tabs + a + color: $color-invert + opacity: 0.9 + &:hover + opacity: 1 + li + &.is-active a + color: $color !important + opacity: 1 + &.is-boxed, + &.is-toggle + a + color: $color-invert + &:hover + background-color: bulmaRgba($scheme-invert, 0.1) + li.is-active a + &, + &:hover + background-color: $color-invert + border-color: $color-invert + color: $color + // Modifiers + @if type-of($color) == 'color' + &.is-bold + $gradient-top-left: darken(saturate(adjust-hue($color, -10deg), 10%), 10%) + $gradient-bottom-right: lighten(saturate(adjust-hue($color, 10deg), 5%), 5%) + background-image: linear-gradient(141deg, $gradient-top-left 0%, $color 71%, $gradient-bottom-right 100%) + +mobile + .navbar-menu + background-image: linear-gradient(141deg, $gradient-top-left 0%, $color 71%, $gradient-bottom-right 100%) + // Sizes + &.is-small + .hero-body + padding: $hero-body-padding-small + &.is-medium + +tablet + .hero-body + padding: $hero-body-padding-medium + &.is-large + +tablet + .hero-body + padding: $hero-body-padding-large + &.is-halfheight, + &.is-fullheight, + &.is-fullheight-with-navbar + .hero-body + align-items: center + display: flex + & > .container + flex-grow: 1 + flex-shrink: 1 + &.is-halfheight + min-height: 50vh + &.is-fullheight + min-height: 100vh + +// Components + +.hero-video + @extend %overlay + overflow: hidden + video + left: 50% + min-height: 100% + min-width: 100% + position: absolute + top: 50% + transform: translate3d(-50%, -50%, 0) + // Modifiers + &.is-transparent + opacity: 0.3 + // Responsiveness + +mobile + display: none + +.hero-buttons + margin-top: 1.5rem + // Responsiveness + +mobile + .button + display: flex + &:not(:last-child) + margin-bottom: 0.75rem + +tablet + display: flex + justify-content: center + .button:not(:last-child) + +ltr-property("margin", 1.5rem) + +// Containers + +.hero-head, +.hero-foot + flex-grow: 0 + flex-shrink: 0 + +.hero-body + flex-grow: 1 + flex-shrink: 0 + padding: $hero-body-padding + +tablet + padding: $hero-body-padding-tablet diff --git a/guide/style/bulma/sass/layout/section.sass b/guide/style/bulma/sass/layout/section.sass new file mode 100644 index 00000000..9c5a9f48 --- /dev/null +++ b/guide/style/bulma/sass/layout/section.sass @@ -0,0 +1,17 @@ +@import "../utilities/mixins" + +$section-padding: 3rem 1.5rem !default +$section-padding-desktop: 3rem 3rem !default +$section-padding-medium: 9rem 4.5rem !default +$section-padding-large: 18rem 6rem !default + +.section + padding: $section-padding + // Responsiveness + +desktop + padding: $section-padding-desktop + // Sizes + &.is-medium + padding: $section-padding-medium + &.is-large + padding: $section-padding-large diff --git a/guide/style/bulma/sass/utilities/_all.sass b/guide/style/bulma/sass/utilities/_all.sass new file mode 100644 index 00000000..51cf348a --- /dev/null +++ b/guide/style/bulma/sass/utilities/_all.sass @@ -0,0 +1,9 @@ +/* Bulma Utilities */ +@charset "utf-8" + +@import "initial-variables" +@import "functions" +@import "derived-variables" +@import "mixins" +@import "controls" +@import "extends" diff --git a/guide/style/bulma/sass/utilities/animations.sass b/guide/style/bulma/sass/utilities/animations.sass new file mode 100644 index 00000000..1872e08c --- /dev/null +++ b/guide/style/bulma/sass/utilities/animations.sass @@ -0,0 +1 @@ +@warn "The animations.sass file has MOVED. It is now in the /base folder. Please import sass/base/animations instead." diff --git a/guide/style/bulma/sass/utilities/controls.sass b/guide/style/bulma/sass/utilities/controls.sass new file mode 100644 index 00000000..4c738c7f --- /dev/null +++ b/guide/style/bulma/sass/utilities/controls.sass @@ -0,0 +1,49 @@ +@import "derived-variables" + +$control-radius: $radius !default +$control-radius-small: $radius-small !default + +$control-border-width: 1px !default + +$control-height: 2.5em !default +$control-line-height: 1.5 !default + +$control-padding-vertical: calc(0.5em - #{$control-border-width}) !default +$control-padding-horizontal: calc(0.75em - #{$control-border-width}) !default + +=control + -moz-appearance: none + -webkit-appearance: none + align-items: center + border: $control-border-width solid transparent + border-radius: $control-radius + box-shadow: none + display: inline-flex + font-size: $size-normal + height: $control-height + justify-content: flex-start + line-height: $control-line-height + padding-bottom: $control-padding-vertical + padding-left: $control-padding-horizontal + padding-right: $control-padding-horizontal + padding-top: $control-padding-vertical + position: relative + vertical-align: top + // States + &:focus, + &.is-focused, + &:active, + &.is-active + outline: none + &[disabled], + fieldset[disabled] & + cursor: not-allowed + +// The controls sizes use mixins so they can be used at different breakpoints +=control-small + border-radius: $control-radius-small + font-size: $size-small +=control-medium + font-size: $size-medium +=control-large + font-size: $size-large diff --git a/guide/style/bulma/sass/utilities/derived-variables.sass b/guide/style/bulma/sass/utilities/derived-variables.sass new file mode 100644 index 00000000..cefc8f1d --- /dev/null +++ b/guide/style/bulma/sass/utilities/derived-variables.sass @@ -0,0 +1,114 @@ +@import "initial-variables" +@import "functions" + +$primary: $turquoise !default + +$info: $cyan !default +$success: $green !default +$warning: $yellow !default +$danger: $red !default + +$light: $white-ter !default +$dark: $grey-darker !default + +// Invert colors + +$orange-invert: findColorInvert($orange) !default +$yellow-invert: findColorInvert($yellow) !default +$green-invert: findColorInvert($green) !default +$turquoise-invert: findColorInvert($turquoise) !default +$cyan-invert: findColorInvert($cyan) !default +$blue-invert: findColorInvert($blue) !default +$purple-invert: findColorInvert($purple) !default +$red-invert: findColorInvert($red) !default + +$primary-invert: findColorInvert($primary) !default +$primary-light: findLightColor($primary) !default +$primary-dark: findDarkColor($primary) !default +$info-invert: findColorInvert($info) !default +$info-light: findLightColor($info) !default +$info-dark: findDarkColor($info) !default +$success-invert: findColorInvert($success) !default +$success-light: findLightColor($success) !default +$success-dark: findDarkColor($success) !default +$warning-invert: findColorInvert($warning) !default +$warning-light: findLightColor($warning) !default +$warning-dark: findDarkColor($warning) !default +$danger-invert: findColorInvert($danger) !default +$danger-light: findLightColor($danger) !default +$danger-dark: findDarkColor($danger) !default +$light-invert: findColorInvert($light) !default +$dark-invert: findColorInvert($dark) !default + +// General colors + +$scheme-main: $white !default +$scheme-main-bis: $white-bis !default +$scheme-main-ter: $white-ter !default +$scheme-invert: $black !default +$scheme-invert-bis: $black-bis !default +$scheme-invert-ter: $black-ter !default + +$background: $white-ter !default + +$border: $grey-lighter !default +$border-hover: $grey-light !default +$border-light: $grey-lightest !default +$border-light-hover: $grey-light !default + +// Text colors + +$text: $grey-dark !default +$text-invert: findColorInvert($text) !default +$text-light: $grey !default +$text-strong: $grey-darker !default + +// Code colors + +$code: darken($red, 15%) !default +$code-background: $background !default + +$pre: $text !default +$pre-background: $background !default + +// Link colors + +$link: $blue !default +$link-invert: findColorInvert($link) !default +$link-light: findLightColor($link) !default +$link-dark: findDarkColor($link) !default +$link-visited: $purple !default + +$link-hover: $grey-darker !default +$link-hover-border: $grey-light !default + +$link-focus: $grey-darker !default +$link-focus-border: $blue !default + +$link-active: $grey-darker !default +$link-active-border: $grey-dark !default + +// Typography + +$family-primary: $family-sans-serif !default +$family-secondary: $family-sans-serif !default +$family-code: $family-monospace !default + +$size-small: $size-7 !default +$size-normal: $size-6 !default +$size-medium: $size-5 !default +$size-large: $size-4 !default + +// Effects + +$shadow: 0 0.5em 1em -0.125em rgba($scheme-invert, 0.1), 0 0px 0 1px rgba($scheme-invert, 0.02) !default + +// Lists and maps +$custom-colors: null !default +$custom-shades: null !default + +$colors: mergeColorMaps(("white": ($white, $black), "black": ($black, $white), "light": ($light, $light-invert), "dark": ($dark, $dark-invert), "primary": ($primary, $primary-invert, $primary-light, $primary-dark), "link": ($link, $link-invert, $link-light, $link-dark), "info": ($info, $info-invert, $info-light, $info-dark), "success": ($success, $success-invert, $success-light, $success-dark), "warning": ($warning, $warning-invert, $warning-light, $warning-dark), "danger": ($danger, $danger-invert, $danger-light, $danger-dark)), $custom-colors) !default + +$shades: mergeColorMaps(("black-bis": $black-bis, "black-ter": $black-ter, "grey-darker": $grey-darker, "grey-dark": $grey-dark, "grey": $grey, "grey-light": $grey-light, "grey-lighter": $grey-lighter, "white-ter": $white-ter, "white-bis": $white-bis), $custom-shades) !default + +$sizes: $size-1 $size-2 $size-3 $size-4 $size-5 $size-6 $size-7 !default diff --git a/guide/style/bulma/sass/utilities/extends.sass b/guide/style/bulma/sass/utilities/extends.sass new file mode 100644 index 00000000..c994fc1a --- /dev/null +++ b/guide/style/bulma/sass/utilities/extends.sass @@ -0,0 +1,25 @@ +@import "mixins" + +%control + +control + +%unselectable + +unselectable + +%arrow + +arrow + +%block + +block + +%delete + +delete + +%loader + +loader + +%overlay + +overlay + +%reset + +reset diff --git a/guide/style/bulma/sass/utilities/functions.sass b/guide/style/bulma/sass/utilities/functions.sass new file mode 100644 index 00000000..eeea6f21 --- /dev/null +++ b/guide/style/bulma/sass/utilities/functions.sass @@ -0,0 +1,135 @@ +@function mergeColorMaps($bulma-colors, $custom-colors) + // We return at least Bulma's hard-coded colors + $merged-colors: $bulma-colors + + // We want a map as input + @if type-of($custom-colors) == 'map' + @each $name, $components in $custom-colors + // The color name should be a string + // and the components either a single color + // or a colors list with at least one element + @if type-of($name) == 'string' and (type-of($components) == 'list' or type-of($components) == 'color') and length($components) >= 1 + $color-base: null + $color-invert: null + $color-light: null + $color-dark: null + $value: null + + // The param can either be a single color + // or a list of 2 colors + @if type-of($components) == 'color' + $color-base: $components + $color-invert: findColorInvert($color-base) + $color-light: findLightColor($color-base) + $color-dark: findDarkColor($color-base) + @else if type-of($components) == 'list' + $color-base: nth($components, 1) + // If Invert, Light and Dark are provided + @if length($components) > 3 + $color-invert: nth($components, 2) + $color-light: nth($components, 3) + $color-dark: nth($components, 4) + // If only Invert and Light are provided + @else if length($components) > 2 + $color-invert: nth($components, 2) + $color-light: nth($components, 3) + $color-dark: findDarkColor($color-base) + // If only Invert is provided + @else + $color-invert: nth($components, 2) + $color-light: findLightColor($color-base) + $color-dark: findDarkColor($color-base) + + $value: ($color-base, $color-invert, $color-light, $color-dark) + + // We only want to merge the map if the color base is an actual color + @if type-of($color-base) == 'color' + // We merge this colors elements as map with Bulma's colors map + // (we can override them this way, no multiple definition for the same name) + // $merged-colors: map_merge($merged-colors, ($name: ($color-base, $color-invert, $color-light, $color-dark))) + $merged-colors: map_merge($merged-colors, ($name: $value)) + + @return $merged-colors + +@function powerNumber($number, $exp) + $value: 1 + @if $exp > 0 + @for $i from 1 through $exp + $value: $value * $number + @else if $exp < 0 + @for $i from 1 through -$exp + $value: divide($value, $number) + @return $value + +@function colorLuminance($color) + @if type-of($color) != 'color' + @return 0.55 + $color-rgb: ('red': red($color),'green': green($color),'blue': blue($color)) + @each $name, $value in $color-rgb + $adjusted: 0 + $value: divide($value, 255) + @if $value < 0.03928 + $value: divide($value, 12.92) + @else + $value: divide(($value + .055), 1.055) + $value: powerNumber($value, 2) + $color-rgb: map-merge($color-rgb, ($name: $value)) + @return (map-get($color-rgb, 'red') * .2126) + (map-get($color-rgb, 'green') * .7152) + (map-get($color-rgb, 'blue') * .0722) + +@function findColorInvert($color) + @if (colorLuminance($color) > 0.55) + @return rgba(#000, 0.7) + @else + @return #fff + +@function findLightColor($color, $l: 96%) + @if type-of($color) == 'color' + $l: 96% + @if lightness($color) > 96% + $l: lightness($color) + @return change-color($color, $lightness: $l) + @return $background + +@function findDarkColor($color, $base-l: 29%) + @if type-of($color) == 'color' + $luminance: colorLuminance($color) + $luminance-delta: (0.53 - $luminance) + $target-l: round($base-l + ($luminance-delta * 53)) + @return change-color($color, $lightness: max($base-l, $target-l)) + @return $text-strong + +@function bulmaRgba($color, $alpha) + @if type-of($color) != 'color' + @return $color + @return rgba($color, $alpha) + +@function bulmaDarken($color, $amount) + @if type-of($color) != 'color' + @return $color + @return darken($color, $amount) + +@function bulmaLighten($color, $amount) + @if type-of($color) != 'color' + @return $color + @return lighten($color, $amount) + +// Custom divide function by @mdo from https://github.com/twbs/bootstrap/pull/34245 +// Replaces old slash division deprecated in Dart Sass +@function divide($dividend, $divisor, $precision: 10) + $sign: if($dividend > 0 and $divisor > 0, 1, -1) + $dividend: abs($dividend) + $divisor: abs($divisor) + $quotient: 0 + $remainder: $dividend + @if $dividend == 0 + @return 0 + @if $divisor == 0 + @error "Cannot divide by 0" + @if $divisor == 1 + @return $dividend + @while $remainder >= $divisor + $quotient: $quotient + 1 + $remainder: $remainder - $divisor + @if $remainder > 0 and $precision > 0 + $remainder: divide($remainder * 10, $divisor, $precision - 1) * .1 + @return ($quotient + $remainder) * $sign diff --git a/guide/style/bulma/sass/utilities/initial-variables.sass b/guide/style/bulma/sass/utilities/initial-variables.sass new file mode 100644 index 00000000..3c2d2827 --- /dev/null +++ b/guide/style/bulma/sass/utilities/initial-variables.sass @@ -0,0 +1,79 @@ +// Colors + +$black: hsl(0, 0%, 4%) !default +$black-bis: hsl(0, 0%, 7%) !default +$black-ter: hsl(0, 0%, 14%) !default + +$grey-darker: hsl(0, 0%, 21%) !default +$grey-dark: hsl(0, 0%, 29%) !default +$grey: hsl(0, 0%, 48%) !default +$grey-light: hsl(0, 0%, 71%) !default +$grey-lighter: hsl(0, 0%, 86%) !default +$grey-lightest: hsl(0, 0%, 93%) !default + +$white-ter: hsl(0, 0%, 96%) !default +$white-bis: hsl(0, 0%, 98%) !default +$white: hsl(0, 0%, 100%) !default + +$orange: hsl(14, 100%, 53%) !default +$yellow: hsl(44, 100%, 77%) !default +$green: hsl(153, 53%, 53%) !default +$turquoise: hsl(171, 100%, 41%) !default +$cyan: hsl(207, 61%, 53%) !default +$blue: hsl(229, 53%, 53%) !default +$purple: hsl(271, 100%, 71%) !default +$red: hsl(348, 86%, 61%) !default + +// Typography + +$family-sans-serif: BlinkMacSystemFont, -apple-system, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", "Helvetica", "Arial", sans-serif !default +$family-monospace: monospace !default +$render-mode: optimizeLegibility !default + +$size-1: 3rem !default +$size-2: 2.5rem !default +$size-3: 2rem !default +$size-4: 1.5rem !default +$size-5: 1.25rem !default +$size-6: 1rem !default +$size-7: 0.75rem !default + +$weight-light: 300 !default +$weight-normal: 400 !default +$weight-medium: 500 !default +$weight-semibold: 600 !default +$weight-bold: 700 !default + +// Spacing + +$block-spacing: 1.5rem !default + +// Responsiveness + +// The container horizontal gap, which acts as the offset for breakpoints +$gap: 32px !default +// 960, 1152, and 1344 have been chosen because they are divisible by both 12 and 16 +$tablet: 769px !default +// 960px container + 4rem +$desktop: 960px + (2 * $gap) !default +// 1152px container + 4rem +$widescreen: 1152px + (2 * $gap) !default +$widescreen-enabled: true !default +// 1344px container + 4rem +$fullhd: 1344px + (2 * $gap) !default +$fullhd-enabled: true !default +$breakpoints: ("mobile": ("until": $tablet), "tablet": ("from": $tablet), "tablet-only": ("from": $tablet, "until": $desktop), "touch": ("from": $desktop), "desktop": ("from": $desktop), "desktop-only": ("from": $desktop, "until": $widescreen), "until-widescreen": ("until": $widescreen), "widescreen": ("from": $widescreen), "widescreen-only": ("from": $widescreen, "until": $fullhd), "until-fullhd": ("until": $fullhd), "fullhd": ("from": $fullhd)) !default + +// Miscellaneous + +$easing: ease-out !default +$radius-small: 2px !default +$radius: 4px !default +$radius-large: 6px !default +$radius-rounded: 9999px !default +$speed: 86ms !default + +// Flags + +$variable-columns: true !default +$rtl: false !default diff --git a/guide/style/bulma/sass/utilities/mixins.sass b/guide/style/bulma/sass/utilities/mixins.sass new file mode 100644 index 00000000..10cbae30 --- /dev/null +++ b/guide/style/bulma/sass/utilities/mixins.sass @@ -0,0 +1,303 @@ +@import "derived-variables" + +=clearfix + &::after + clear: both + content: " " + display: table + +=center($width, $height: 0) + position: absolute + @if $height != 0 + left: calc(50% - (#{$width} * 0.5)) + top: calc(50% - (#{$height} * 0.5)) + @else + left: calc(50% - (#{$width} * 0.5)) + top: calc(50% - (#{$width} * 0.5)) + +=fa($size, $dimensions) + display: inline-block + font-size: $size + height: $dimensions + line-height: $dimensions + text-align: center + vertical-align: top + width: $dimensions + +=hamburger($dimensions) + -moz-appearance: none + -webkit-appearance: none + appearance: none + background: none + border: none + cursor: pointer + display: block + height: $dimensions + position: relative + width: $dimensions + span + background-color: currentColor + display: block + height: 1px + left: calc(50% - 8px) + position: absolute + transform-origin: center + transition-duration: $speed + transition-property: background-color, opacity, transform + transition-timing-function: $easing + width: 16px + &:nth-child(1) + top: calc(50% - 6px) + &:nth-child(2) + top: calc(50% - 1px) + &:nth-child(3) + top: calc(50% + 4px) + &:hover + background-color: bulmaRgba(black, 0.05) + // Modifers + &.is-active + span + &:nth-child(1) + transform: translateY(5px) rotate(45deg) + &:nth-child(2) + opacity: 0 + &:nth-child(3) + transform: translateY(-5px) rotate(-45deg) + +=overflow-touch + -webkit-overflow-scrolling: touch + +=placeholder + $placeholders: ':-moz' ':-webkit-input' '-moz' '-ms-input' + @each $placeholder in $placeholders + &:#{$placeholder}-placeholder + @content + +=reset + -moz-appearance: none + -webkit-appearance: none + appearance: none + background: none + border: none + color: currentColor + font-family: inherit + font-size: 1em + margin: 0 + padding: 0 + +// Responsiveness + +=from($device) + @media screen and (min-width: $device) + @content + +=until($device) + @media screen and (max-width: $device - 1px) + @content + +=between($from, $until) + @media screen and (min-width: $from) and (max-width: $until - 1px) + @content + +=mobile + @media screen and (max-width: $tablet - 1px) + @content + +=tablet + @media screen and (min-width: $tablet), print + @content + +=tablet-only + @media screen and (min-width: $tablet) and (max-width: $desktop - 1px) + @content + +=touch + @media screen and (max-width: $desktop - 1px) + @content + +=desktop + @media screen and (min-width: $desktop) + @content + +=desktop-only + @if $widescreen-enabled + @media screen and (min-width: $desktop) and (max-width: $widescreen - 1px) + @content + +=until-widescreen + @if $widescreen-enabled + @media screen and (max-width: $widescreen - 1px) + @content + +=widescreen + @if $widescreen-enabled + @media screen and (min-width: $widescreen) + @content + +=widescreen-only + @if $widescreen-enabled and $fullhd-enabled + @media screen and (min-width: $widescreen) and (max-width: $fullhd - 1px) + @content + +=until-fullhd + @if $fullhd-enabled + @media screen and (max-width: $fullhd - 1px) + @content + +=fullhd + @if $fullhd-enabled + @media screen and (min-width: $fullhd) + @content + +=breakpoint($name) + $breakpoint: map-get($breakpoints, $name) + @if $breakpoint + $from: map-get($breakpoint, "from") + $until: map-get($breakpoint, "until") + @if $from and $until + +between($from, $until) + @content + @else if $from + +from($from) + @content + @else if $until + +until($until) + @content + +=ltr + @if not $rtl + @content + +=rtl + @if $rtl + @content + +=ltr-property($property, $spacing, $right: true) + $normal: if($right, "right", "left") + $opposite: if($right, "left", "right") + @if $rtl + #{$property}-#{$opposite}: $spacing + @else + #{$property}-#{$normal}: $spacing + +=ltr-position($spacing, $right: true) + $normal: if($right, "right", "left") + $opposite: if($right, "left", "right") + @if $rtl + #{$opposite}: $spacing + @else + #{$normal}: $spacing + +// Placeholders + +=unselectable + -webkit-touch-callout: none + -webkit-user-select: none + -moz-user-select: none + -ms-user-select: none + user-select: none + +=arrow($color: transparent) + border: 3px solid $color + border-radius: 2px + border-right: 0 + border-top: 0 + content: " " + display: block + height: 0.625em + margin-top: -0.4375em + pointer-events: none + position: absolute + top: 50% + transform: rotate(-45deg) + transform-origin: center + width: 0.625em + +=block($spacing: $block-spacing) + &:not(:last-child) + margin-bottom: $spacing + +=delete + +unselectable + -moz-appearance: none + -webkit-appearance: none + background-color: bulmaRgba($scheme-invert, 0.2) + border: none + border-radius: $radius-rounded + cursor: pointer + pointer-events: auto + display: inline-block + flex-grow: 0 + flex-shrink: 0 + font-size: 0 + height: 20px + max-height: 20px + max-width: 20px + min-height: 20px + min-width: 20px + outline: none + position: relative + vertical-align: top + width: 20px + &::before, + &::after + background-color: $scheme-main + content: "" + display: block + left: 50% + position: absolute + top: 50% + transform: translateX(-50%) translateY(-50%) rotate(45deg) + transform-origin: center center + &::before + height: 2px + width: 50% + &::after + height: 50% + width: 2px + &:hover, + &:focus + background-color: bulmaRgba($scheme-invert, 0.3) + &:active + background-color: bulmaRgba($scheme-invert, 0.4) + // Sizes + &.is-small + height: 16px + max-height: 16px + max-width: 16px + min-height: 16px + min-width: 16px + width: 16px + &.is-medium + height: 24px + max-height: 24px + max-width: 24px + min-height: 24px + min-width: 24px + width: 24px + &.is-large + height: 32px + max-height: 32px + max-width: 32px + min-height: 32px + min-width: 32px + width: 32px + +=loader + animation: spinAround 500ms infinite linear + border: 2px solid $grey-lighter + border-radius: $radius-rounded + border-right-color: transparent + border-top-color: transparent + content: "" + display: block + height: 1em + position: relative + width: 1em + +=overlay($offset: 0) + bottom: $offset + left: $offset + position: absolute + right: $offset + top: $offset diff --git a/guide/style/colors.scss b/guide/style/colors.scss new file mode 100644 index 00000000..d6eba17e --- /dev/null +++ b/guide/style/colors.scss @@ -0,0 +1,19 @@ +$sanic: #ff0d68; +$primary: $sanic; +$link: $sanic; +$blue: #0092FF; +$cyan: $blue; +$green: #16DB93; +$yellow: #FFE900; + +$menu-item-active-background-color: $sanic; + + +$green_1: #37ae6f; +$green_2: #16DB93; +$purple: #833FE3; +$dark_1: #1e2024; +$orange: #d98404; + + +.has-text-purple { color: $purple; } diff --git a/guide/style/elements.scss b/guide/style/elements.scss new file mode 100644 index 00000000..a4418c25 --- /dev/null +++ b/guide/style/elements.scss @@ -0,0 +1,292 @@ +.footer { + a[target=_blank]::after { display: none; } + margin-bottom: 4rem; +} +@media screen and (max-width: $desktop) { + .footer .level { align-items: baseline; } + .footer a { font-size: 0.75em; } +} +.hero { + .subtitle { + font-size: 3rem; + font-weight: 700; + margin-bottom: 1rem; + } + .tagline { + font-family: Fira Code,Source Code Pro,Menlo,Monaco,Consolas,Lucisa Console,monospace; + font-size: 2rem; + font-weight: 300; + margin-bottom: 2rem + } +} + +.language-sh { + code { + display: inline-block; + &::before { + content: 'โ–ถ ' + } + + } +} + +.notification { + margin-top: 2rem; + .notification-title { + font-size: 1.25rem; + font-weight: 700; + } + &.is-note { + background-color: $primary; + color: $white; + } + &.is-new { + background-color: $purple; + color: $white; + &::after { + content: '๐ŸŒŸ'; + position: absolute; + top: 1rem; + right: 1rem; + font-size: 2rem; + } + } + &.is-tip { + &::after { + content: '๐Ÿ’ก'; + position: absolute; + top: 1rem; + right: 1rem; + font-size: 2rem; + } + } +} + +.ol, .ul, +.list { + margin: 1rem 0; + .li, + .list-item { + padding: 0.5rem 0; + } +} +.ul .li { + margin-left: 1.5rem; + list-style-type: disc; +} +.introduction-table { + margin: 2rem 0; + a[target=_blank]::after { display: none; } + th { display: none; } +} + +.docobject { + h2 :last-child { color: $dark; } + .function-signature { + color: $dark_1; + + .param-name { + color: $primary; + font-weight: bold; + } + .param-default { + color: $purple; + font-style: italic; + } + .function-decorator { + font-style: italic; + color: $grey + } + .param-annotation { color: $blue; } + .return-annotation { color: $green_1; } + + } + + dl { + display: flex; + flex-wrap: wrap; + margin: 0; + padding: 0; + } + dt { + flex: 0 0 25%; + padding: 5px 10px; + font-weight: bold; + color: $blue; + } + dd { + flex: 1; + padding: 5px 10px; + margin: 0; + } + + div.highlight + p, + p + div.highlight, + div.highlight + div.highlight { margin-top: 1rem; } + + .method { + padding-left: 1rem; + + h3 { margin-left: -1rem; } + } + + .ol, .ul, .list { margin: 1rem; } +} + +.mermaid { + margin-top: 2rem; + .actor { + stroke: $primary !important; + fill: lighten($primary, 40%) !important; + } + .labelBox { + fill: lighten($blue, 40%) !important; + stroke: $blue !important; + } + // .labelText { + // fill: $white-bis !important; + // } + .note { + fill: lighten($yellow, 40%) !important; + stroke: $yellow !important; + } +} + +@media (prefers-color-scheme: dark) { + .docobject { + h2 :last-child { color: $white-bis; } + .function-signature { + color: $grey-light; + .param-default { color: $yellow; } + } + } + .mermaid { + text.messageText { fill: $white-bis !important; } + .actor { fill: $primary !important; } + .labelBox { fill: $blue !important; } + .labelText { fill: $white-bis !important; } + .note { fill: $yellow !important; } + } +} + +$button-width: 36px; +$button-height: 52px; // 36 x 52 for portrait paper ratio +$rectangle-width: $button-width / 2; +$rectangle-height: $rectangle-width / 8.5 * 11; +$left-offset-filled: 5px; +$top-offset-filled: 13px; +$left-offset-outlined: -3px; +$top-offset-outlined: 5px; +$animation-slide: -$button-width / 1.5; // space for sliding and the gap + +h1 + .code-block, +h2 + .code-block, +h3 + .code-block { margin-top: 1rem; } +.code-block { + position: relative; + & + .code-block { margin-top: 1rem; } + + &:hover { + .code-block__copy { + opacity: 1; + } + } + + .code-block__copy { + position: absolute; + right: 10px; + bottom: 10px; + width: $button-width; + height: $button-height; + cursor: pointer; + opacity: 0; + transition: all 0.3s; + + &::before { + content: "copied"; + position: absolute; + top: -$button-height / 3; + margin: auto; + opacity: 0; + right: $button-width / 4; + } + &.clicked::before { + opacity: 1; + animation: all 0.3s ease-in-out; + } + } + + .code-block__rectangle { + position: absolute; + width: $rectangle-width; + height: $rectangle-height; + transition: all 0.3s ease; + } + + .code-block__filled { + background-color: $primary; + left: $left-offset-filled; + top: $top-offset-filled; + } + + .code-block__outlined { + border: 2px solid $primary; + background-color: transparent; + left: $left-offset-outlined; + top: $top-offset-outlined; + } + + .code-block__copy.clicked { + .code-block__outlined { + left: $left-offset-filled + $animation-slide; + top: $top-offset-filled; + background-color: $primary; + } + } +} + +.additional-attributes.details { + display: flex; + flex-direction: column; + width: 100%; + + .code-block { + display: none; + width: 100%; + } + + &::before { + content: "โ–ผ " attr(title); + display: block; + background-color: $grey-light; + padding: 10px; + cursor: pointer; + width: 100%; + box-sizing: border-box; + } + + &.is-active { + .code-block { + display: block; + } + + &::before { + content: "โ–ฒ " attr(title); + background-color: $grey-lighter; + } + } +} + +// dark mode +@media (prefers-color-scheme: dark) { + .additional-attributes.details{ + &::before { background-color: $grey-darker; } + &.is-active { + &::before { background-color: $grey-dark; } + } + } +} + +.tabs { + .tab-content { display: none; } +} diff --git a/guide/style/general.scss b/guide/style/general.scss new file mode 100644 index 00000000..294cb3a4 --- /dev/null +++ b/guide/style/general.scss @@ -0,0 +1,52 @@ +code { color: #{$grey-dark}; } +.notification code { background-color: #{rgba($grey-lightest, 0.6)}; } +@media (prefers-color-scheme: dark) { + code { color: #{$grey-lighter}; } + .notification code { + background-color: #{rgba($black-ter, 0.6)}; + } +} + +a[target=_blank]::after { + content: "โ‡—"; + margin-left: 0.25em; +} +h1 a.anchor, +h2 a.anchor, +h3 a.anchor, +h4 a.anchor, +h5 a.anchor, +h6 a.anchor { + display: none; + padding-left: 0.375em; +} +h1:hover a.anchor, +h2:hover a.anchor, +h3:hover a.anchor, +h4:hover a.anchor, +h5:hover a.anchor, +h6:hover a.anchor { + display: inline; +} + +h1 { margin-left: -2rem; } +h2 { margin-left: -1rem; margin-top: 3rem; } +h3:not(:first-child) { margin-top: 2rem; } +article { margin-left: 2rem; } +p + pre, +pre + p, +div.highlight + p, +p + div.highlight, +div.highlight + div.highlight, +p + h4, +p + .code-block, +.code-block + p, +.code-block + .code-block, +p + p { margin-top: 1rem; } + +@media screen and (max-width: $tablet) { + h1 { margin-left: 0; } + h2 { margin-left: 0; } + article { margin-left: 0; } +} + diff --git a/guide/style/index.scss b/guide/style/index.scss new file mode 100644 index 00000000..9b698fa2 --- /dev/null +++ b/guide/style/index.scss @@ -0,0 +1,12 @@ +$body-size: 18px; + + + +@import "./colors.scss"; +@import "./bulma/bulma.sass"; +@import "./bulma-prefers-dark/bulma-prefers-dark.sass"; +@import "./theme.scss"; +@import "./menu.scss"; +@import "./general.scss"; +@import "./elements.scss"; +@import "./overrides.scss"; diff --git a/guide/style/menu.scss b/guide/style/menu.scss new file mode 100644 index 00000000..b3f11acc --- /dev/null +++ b/guide/style/menu.scss @@ -0,0 +1,121 @@ +$arrow-size: 8px; +$burger-size: 2rem; +$menu-width: 360px; +.burger { + display: none; + position: fixed; + top: 1rem; + right: $burger-size / 2; + width: $burger-size; + height: $burger-size; + cursor: pointer; + z-index: 101; + span { + display: block; + position: absolute; + height: 2px; + width: 100%; + background: var(--menu-contrast); + border-radius: 2px; + opacity: 1; + left: 0; + transform: rotate(0deg); + transition: .25s ease-in-out; + &:nth-child(1) { top: 0px; } + &:nth-child(2), &:nth-child(3) { top: 8px; } + &:nth-child(4) { top: 16px; } + } + &.is-active { + span { + &:nth-child(1) { + top: 18px; + width: 0%; + left: 50%; + } + &:nth-child(2) { + transform: rotate(45deg); + } + &:nth-child(3) { + transform: rotate(-45deg); + } + &:nth-child(4) { + top: 18px; + width: 0%; + left: 50%; + } + } + } +} +.menu { + background-color: var(--menu-background); + width: $menu-width; + padding: 2rem; + height: 100vh; + overflow: auto; + position: fixed; + top: 0; + left: 0; + z-index: 100; + + hr { background-color: var(--menu-divider); } + + .is-anchor { + font-size: 0.85em; + & a::before { + content: '# '; + color: var(--menu-contrast); + } + } + .menu-label { margin-bottom: 1rem; } + li.is-group > a { + &::after { + content: ''; + position: relative; + top: -$arrow-size / 4; + left: $arrow-size; + display: inline-block; + width: 0; + height: 0; + border-left: $arrow-size solid var(--menu-contrast); + border-top: $arrow-size * 2/3 solid transparent; + border-bottom: $arrow-size * 2/3 solid transparent; + transform: rotate(90deg); + } + & ~ .menu-list { + transition: all .15s ease-in-out; + transform: scaleY(1); + transform-origin: top; + overflow: hidden; + opacity: 1; + margin: 0; + } + &:not(.is-open) { + &::after { transform: rotate(0deg); } + & ~ .menu-list { + transform: scaleY(0); + opacity: 0; + font-size: 0; + } + } + } + + & ~ main { margin-left: $menu-width; } + .anchor-list { + display: none; + } + .menu-item .is-active + .anchor-list { + display: block; + } +} + +// On mobile breakpoints, we want to hide the menu and show the burger +@media screen and (max-width: $desktop) { + .menu { + left: -100vw; + width: 100vw; + transition: all .25s ease-in-out; + &.is-active { left: 0; } + & ~ main { margin-left: 0; } + } + .burger { display: block; } +} diff --git a/guide/style/overrides.scss b/guide/style/overrides.scss new file mode 100644 index 00000000..2aa660a8 --- /dev/null +++ b/guide/style/overrides.scss @@ -0,0 +1,35 @@ +footer .level, +footer .level .level-right, +footer .level .level-left { + display: flex !important; +} + +.box { + box-shadow: 0 2px 3px rgba(10, 10, 10, 0.1), 0 0 0 1px rgba(10, 10, 10, 0.1); +} + +@media (prefers-color-scheme: dark) { + .box { + box-shadow: 0 2px 3px rgba(128, 128, 128, 0.1), 0 0 0 1px rgba(128, 128, 128, 0.1); + } +} +@media screen and (min-width: 769px) { + .hero.is-large .hero-body { padding: 18rem 6rem 3rem; } +} +@media screen and (max-width: 769px) { + .hero { + height: 100vh; + + .hero-body { + padding: 3rem 1.5rem; + display: flex; + flex-direction: column; + justify-content: center; + } + & .title::after { + width: calc(100vw - 1.5rem); + background: url(/assets/images/logo-white.svg) no-repeat center center; + background-size: 100% auto; + } + } +} diff --git a/guide/style/theme.scss b/guide/style/theme.scss new file mode 100644 index 00000000..6ee2503d --- /dev/null +++ b/guide/style/theme.scss @@ -0,0 +1,65 @@ +$background-image-size: 270px; +.hero .title { + position: relative; + span { display: none; } + &::after { + content: ""; + position: absolute; + top: -108px; + left: 0; + right: 0; + margin: auto; + width: 500px; + height: 122px; + background: url(/assets/images/logo.svg) no-repeat center center; + } + +} + +.sanic-simple-logo { + background: url(/assets/images/logo.svg) no-repeat; + background-size: $background-image-size; + height: 72px; + + & img { visibility: hidden; } +} +:root { + --menu-background: #{$grey-lightest}; + --menu-divider: #{$grey-lighter}; + --menu-contrast: #{$black-bis}; +} + +.c1 { color: #{$grey}; } + +@media (prefers-color-scheme: dark) { + :root { + --menu-background: #{$black}; + --menu-divider: #{$black-ter}; + --menu-contrast: #{$grey}; + } + html, + .navbar { background-color: #{$black-bis}; } + .footer { background-color: #{$black}; } + .sanic-simple-logo { + background: url(/assets/images/logo-white.svg) no-repeat; + background-size: $background-image-size; + } + .hero .title::after { + background: url(/assets/images/logo-white.svg) no-repeat center center; + } + .list { + background-color: transparent; + box-shadow: none; + } + .n,.na,.nb,.no,.nd,.ni,.ne,.nl, + .nn,.nx,.py,.nt,.nv,.bp,.vc,.vg, + .vi,.vm { color: #{$grey-light}; } + .s,.sa,.sb,.sc,.dl,.sd,.s2,.se, + .sh,.si,.sx,.sr,.s1,.ss{ + background-color: transparent; + color: #{$green}; + } + .nc { color: #{$yellow}; } + .c1 { color: #{$grey-dark}; } + .introduction-table .table tbody tr:last-child td { border-bottom-width: 1px; } +} diff --git a/guide/webapp/__init__.py b/guide/webapp/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/guide/webapp/display/__init__.py b/guide/webapp/display/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/guide/webapp/display/base.py b/guide/webapp/display/base.py new file mode 100644 index 00000000..7486d89a --- /dev/null +++ b/guide/webapp/display/base.py @@ -0,0 +1,27 @@ +from __future__ import annotations + +from html5tagger import Builder, Document # type: ignore + + +class BaseRenderer: + def __init__(self, base_title: str): + self.base_title = base_title + + def get_builder(self, full: bool, language: str) -> Builder: + if full: + urls = [ + "/assets/code.css", + "/assets/style.css", + "/assets/docs.js", + "https://unpkg.com/htmx.org@1.9.2/dist/htmx.min.js", + "https://cdn.jsdelivr.net/npm/mermaid@10/dist/mermaid.min.js", + ] + builder = Document( + self.base_title, lang=language, _urls=urls, _viewport=True + ) + builder.full = True + return builder + else: + builder = Builder(name="Partial") + builder.full = False + return builder diff --git a/guide/webapp/display/code_style.py b/guide/webapp/display/code_style.py new file mode 100644 index 00000000..2a7403f9 --- /dev/null +++ b/guide/webapp/display/code_style.py @@ -0,0 +1,20 @@ +from pygments.style import Style +from pygments.token import ( # Error,; Generic,; Number,; Operator, + Comment, + Keyword, + Name, + String, + Token, +) + + +class SanicCodeStyle(Style): + styles = { + Token: "#777", + Comment: "italic #a2a2a2", + Keyword: "#ff0d68", + Name: "#333", + Name.Class: "bold #37ae6f", + Name.Function: "#0092FF", + String: "bg:#eee #833FE3", + } diff --git a/guide/webapp/display/layouts/__init__.py b/guide/webapp/display/layouts/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/guide/webapp/display/layouts/base.py b/guide/webapp/display/layouts/base.py new file mode 100644 index 00000000..8ffec4f0 --- /dev/null +++ b/guide/webapp/display/layouts/base.py @@ -0,0 +1,25 @@ +from __future__ import annotations + +from contextlib import contextmanager +from typing import Generator + +from html5tagger import Builder +from sanic import Request + + +class BaseLayout: + def __init__(self, builder: Builder): + self.builder = builder + + @contextmanager + def __call__( + self, request: Request, full: bool = True + ) -> Generator[BaseLayout, None, None]: + with self.layout(request, full=full): + yield self + + @contextmanager + def layout( + self, request: Request, full: bool = True + ) -> Generator[None, None, None]: + yield diff --git a/guide/webapp/display/layouts/elements/__init__.py b/guide/webapp/display/layouts/elements/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/guide/webapp/display/layouts/elements/footer.py b/guide/webapp/display/layouts/elements/footer.py new file mode 100644 index 00000000..4ef2051a --- /dev/null +++ b/guide/webapp/display/layouts/elements/footer.py @@ -0,0 +1,75 @@ +from datetime import datetime + +from html5tagger import Builder, E # type: ignore +from sanic import Request + + +def do_footer(builder: Builder, request: Request) -> None: + builder.footer( + _pagination(request), + _content(), + class_="footer", + ) + + +def _pagination(request: Request) -> Builder: + return E.div( + _pagination_left(request), _pagination_right(request), class_="level" + ) + + +def _pagination_left(request: Request) -> Builder: + item = E.div(class_="level-item") + if not hasattr(request.ctx, "previous_page"): + return E.div(item, class_="level-left") + with item: + if p := request.ctx.previous_page: + path = p.relative_path.with_suffix(".html") + item.a( + f"โ† {p.meta.title}", + href=f"/{path}", + hx_get=f"/{path}", + hx_target="#content", + hx_swap="innerHTML", + hx_push_url="true", + class_="button pagination", + ) + return E.div(item, class_="level-left") + + +def _pagination_right(request: Request) -> Builder: + item = E.div(class_="level-item") + if not hasattr(request.ctx, "next_page"): + return E.div(item, class_="level-right") + with item: + if p := request.ctx.next_page: + path = p.relative_path.with_suffix(".html") + item.a( + f"{p.meta.title} โ†’", + href=f"/{path}", + hx_get=f"/{path}", + hx_target="#content", + hx_swap="innerHTML", + hx_push_url="true", + class_="button pagination", + ) + return E.div(item, class_="level-right") + + +def _content() -> Builder: + year = datetime.now().year + inner = E.p( + E.a( + "MIT Licensed", + href="https://github.com/sanic-org/sanic/blob/master/LICENSE", + target="_blank", + rel="nofollow noopener noreferrer", + ).br()( + E.small(f"Copyright ยฉ 2018-{year} Sanic Community Organization") + ), + ) + return E.div( + inner, + E.p("~ Made with โค๏ธ and โ˜•๏ธ ~"), + class_="content has-text-centered", + ) diff --git a/guide/webapp/display/layouts/elements/navbar.py b/guide/webapp/display/layouts/elements/navbar.py new file mode 100644 index 00000000..fb26fcdd --- /dev/null +++ b/guide/webapp/display/layouts/elements/navbar.py @@ -0,0 +1,68 @@ +from webapp.display.layouts.models import MenuItem + +from html5tagger import Builder, E # type: ignore +from sanic import Request + + +def do_navbar(builder: Builder, request: Request) -> None: + navbar_items = [ + _render_navbar_item(item, request) + for item in request.app.config.NAVBAR + ] + container = E.div( + _search_form(request), *navbar_items, class_="navbar-end" + ) + + builder.nav( + E.div(container, class_="navbar-menu"), + class_="navbar is-hidden-touch", + ) + + +def _search_form(request: Request) -> Builder: + return E.div( + E.div( + E.input( + id_="search", + type_="text", + placeholder="Search", + class_="input", + value=request.args.get("q", ""), + hx_target="#content", + hx_swap="innerHTML", + hx_push_url="true", + hx_trigger="keyup changed delay:500ms", + hx_get=f"/{request.ctx.language}/search", + hx_params="*", + ), + class_="control", + ), + class_="navbar-item", + ) + + +def _render_navbar_item(item: MenuItem, request: Request) -> Builder: + if item.items: + return E.div( + E.a(item.label, class_="navbar-link"), + E.div( + *( + _render_navbar_item(subitem, request) + for subitem in item.items + ), + class_="navbar-dropdown", + ), + class_="navbar-item has-dropdown is-hoverable", + ) + + kwargs = { + "class_": "navbar-item", + } + if item.href: + kwargs["href"] = item.href + kwargs["target"] = "_blank" + kwargs["rel"] = "nofollow noopener noreferrer" + elif item.path: + kwargs["href"] = f"/{request.ctx.language}/{item.path}" + internal = [item.label] + return E.a(*internal, **kwargs) diff --git a/guide/webapp/display/layouts/elements/sidebar.py b/guide/webapp/display/layouts/elements/sidebar.py new file mode 100644 index 00000000..530f6237 --- /dev/null +++ b/guide/webapp/display/layouts/elements/sidebar.py @@ -0,0 +1,118 @@ +from webapp.display.layouts.models import MenuItem +from webapp.display.text import slugify + +from html5tagger import Builder, E # type: ignore +from sanic import Request + + +def do_sidebar(builder: Builder, request: Request) -> None: + builder.a(class_="burger")(E.span().span().span().span()) + builder.aside(*_menu_items(request), class_="menu") + + +def _menu_items(request: Request) -> list[Builder]: + return [ + _sanic_logo(request), + *_sidebar_items(request), + E.hr(), + E.p("Current with version ").strong( + request.app.config.GENERAL.current_version + ), + E.hr(), + E.p("Want more? ").a( + "sanicbook.com", href="https://sanicbook.com", target="_blank" + ), + ] + + +def _sanic_logo(request: Request) -> Builder: + return E.a( + class_="navbar-item sanic-simple-logo", + href=f"https://sanic.dev/{request.ctx.language}/", + )( + E.img( + src="/assets/images/sanic-framework-logo-simple-400x97.png", # noqa: E501 + alt="Sanic Framework", + ) + ) + + +def _sidebar_items(request: Request) -> list[Builder]: + return [ + builder + for item in request.app.config.SIDEBAR + for builder in _render_sidebar_item(item, request, True) + ] + + +def _render_sidebar_item( + item: MenuItem, request: Request, root: bool = False +) -> list[Builder]: + builders: list[Builder] = [] + if root: + builders.append(E.p(class_="menu-label")(item.label)) + else: + builders.append(_single_sidebar_item(item, request)) + + if item.items: + ul = E.ul(class_="menu-list") + with ul: + for subitem in item.items: + sub_builders = _render_sidebar_item(subitem, request) + ul(*sub_builders) + builders.append(ul) + + return builders + + +def _single_sidebar_item(item: MenuItem, request: Request) -> Builder: + if item.path and item.path.startswith("/"): + path = item.path + else: + path = f"/{request.ctx.language}/{item.path}" if item.path else "" + kwargs = {} + classes: list[str] = [] + li_classes = "menu-item" + _, page, _ = request.app.ctx.get_page( + request.ctx.language, item.path or "" + ) + if request.path == path: + classes.append("is-active") + if item.href: + kwargs["href"] = item.href + kwargs["target"] = "_blank" + kwargs["rel"] = "nofollow noopener noreferrer" + elif not path: + li_classes += " is-group" + if _is_open_item(item, request.ctx.language, request.path): + classes.append("is-open") + else: + kwargs.update( + { + "href": path, + "hx-get": path, + "hx-target": "#content", + "hx-swap": "innerHTML", + "hx-push-url": "true", + } + ) + kwargs["class_"] = " ".join(classes) + inner = E().a(item.label, **kwargs) + if page and page.anchors: + with inner.ul(class_="anchor-list"): + for anchor in page.anchors: + inner.li( + E.a(anchor.strip("`"), href=f"{path}#{slugify(anchor)}"), + class_="is-anchor", + ) + return E.li(inner, class_=li_classes) + + +def _is_open_item(item: MenuItem, language: str, current_path: str) -> bool: + path = f"/{language}/{item.path}" if item.path else "" + if current_path == path: + return True + for subitem in item.items: + if _is_open_item(subitem, language, current_path): + return True + return False diff --git a/guide/webapp/display/layouts/home.py b/guide/webapp/display/layouts/home.py new file mode 100644 index 00000000..242f4b70 --- /dev/null +++ b/guide/webapp/display/layouts/home.py @@ -0,0 +1,50 @@ +from __future__ import annotations + +from contextlib import contextmanager +from typing import Generator + +from html5tagger import Builder, E +from sanic import Request + +from .base import BaseLayout + + +class HomeLayout(BaseLayout): + @contextmanager + def layout( + self, request: Request, full: bool = True + ) -> Generator[None, None, None]: + self._hero(request.ctx.language) + with self.builder.div(class_="container"): + yield + + def _hero(self, language: str) -> None: + with self.builder.section(class_="hero is-large has-text-centered"): + self.builder.div( + E.h1(E.span("Sanic"), class_="title"), + E.h2(class_="subtitle")("Build fast. Run fast."), + E.h3(class_="tagline")("Accelerate your web app development"), + self._do_buttons(language), + class_="hero-body", + ) + + def _do_buttons(self, language: str) -> Builder: + builder = E.div(class_="buttons is-centered") + with builder: + builder.a( + "Get Started", + class_="button is-primary", + href=f"/{language}/guide/getting-started.html", + ) + builder.a( + "Help", + class_="button is-outlined", + href=f"/{language}/help.html", + ) + builder.a( + "GitHub", + class_="button is-outlined", + href="https://github.com/sanic-org/sanic", + target="_blank", + ) + return builder diff --git a/guide/webapp/display/layouts/main.py b/guide/webapp/display/layouts/main.py new file mode 100644 index 00000000..dbbaeac1 --- /dev/null +++ b/guide/webapp/display/layouts/main.py @@ -0,0 +1,45 @@ +from contextlib import contextmanager +from typing import Generator + +from webapp.display.layouts.elements.footer import do_footer +from webapp.display.layouts.elements.navbar import do_navbar +from webapp.display.layouts.elements.sidebar import do_sidebar + +from sanic import Request + +from .base import BaseLayout + + +class MainLayout(BaseLayout): + @contextmanager + def layout( + self, request: Request, full: bool = True + ) -> Generator[None, None, None]: + if full: + with self.builder.div(class_="is-flex"): + self._sidebar(request) + with self.builder.main(class_="is-flex-grow-1"): + self._navbar(request) + with self.builder.div(class_="container", id="content"): + with self._content_wrapper(): + yield + self._footer(request) + else: + with self._content_wrapper(): + yield + self._footer(request) + + @contextmanager + def _content_wrapper(self) -> Generator[None, None, None]: + with self.builder.section(class_="section"): + with self.builder.article(): + yield + + def _navbar(self, request: Request) -> None: + do_navbar(self.builder, request) + + def _sidebar(self, request: Request) -> None: + do_sidebar(self.builder, request) + + def _footer(self, request: Request) -> None: + do_footer(self.builder, request) diff --git a/guide/webapp/display/layouts/models.py b/guide/webapp/display/layouts/models.py new file mode 100644 index 00000000..d3d8105a --- /dev/null +++ b/guide/webapp/display/layouts/models.py @@ -0,0 +1,14 @@ +from __future__ import annotations + +from msgspec import Struct, field + + +class MenuItem(Struct, kw_only=False, omit_defaults=True): + label: str + path: str | None = None + href: str | None = None + items: list[MenuItem] = field(default_factory=list) + + +class GeneralConfig(Struct, kw_only=False): + current_version: str diff --git a/guide/webapp/display/markdown.py b/guide/webapp/display/markdown.py new file mode 100644 index 00000000..58d33bf5 --- /dev/null +++ b/guide/webapp/display/markdown.py @@ -0,0 +1,140 @@ +import re +from textwrap import dedent + +from mistune import HTMLRenderer, create_markdown, escape +from mistune.directives import RSTDirective, TableOfContents +from mistune.util import safe_entity +from pygments import highlight +from pygments.formatters import html +from pygments.lexers import get_lexer_by_name + +from html5tagger import HTML, Builder, E # type: ignore + +from .code_style import SanicCodeStyle +from .plugins.attrs import Attributes +from .plugins.columns import Column +from .plugins.hook import Hook +from .plugins.mermaid import Mermaid +from .plugins.notification import Notification +from .plugins.span import span +from .plugins.tabs import Tabs +from .text import slugify + + +class DocsRenderer(HTMLRenderer): + def block_code(self, code: str, info: str | None = None): + builder = Builder("Block") + with builder.div(class_="code-block"): + if info: + lexer = get_lexer_by_name(info, stripall=False) + formatter = html.HtmlFormatter( + style=SanicCodeStyle, + wrapcode=True, + cssclass=f"highlight language-{info}", + ) + builder(HTML(highlight(code, lexer, formatter))) + with builder.div( + class_="code-block__copy", + onclick="copyCode(this)", + ): + builder.div( + class_="code-block__rectangle code-block__filled" + ).div(class_="code-block__rectangle code-block__outlined") + else: + builder.pre(E.code(escape(code))) + return str(builder) + + def heading(self, text: str, level: int, **attrs) -> str: + ident = slugify(text) + if level > 1: + text += self._make_tag( + "a", {"href": f"#{ident}", "class": "anchor"}, "#" + ) + return self._make_tag( + f"h{level}", {"id": ident, "class": f"is-size-{level}"}, text + ) + + def link(self, text: str, url: str, title: str | None = None) -> str: + url = self.safe_url(url).removesuffix(".md") + if not url.endswith("/"): + url += ".html" + + attributes: dict[str, str] = {"href": url} + if title: + attributes["title"] = safe_entity(title) + if url.startswith("http"): + attributes["target"] = "_blank" + attributes["rel"] = "nofollow noreferrer" + else: + attributes["hx-get"] = url + attributes["hx-target"] = "#content" + attributes["hx-swap"] = "innerHTML" + attributes["hx-push-url"] = "true" + return self._make_tag("a", attributes, text) + + def span(self, text, classes, **attrs) -> str: + if classes: + attrs["class"] = classes + return self._make_tag("span", attrs, text) + + def list(self, text: str, ordered: bool, **attrs) -> str: + tag = "ol" if ordered else "ul" + attrs["class"] = tag + return self._make_tag(tag, attrs, text) + + def list_item(self, text: str, **attrs) -> str: + attrs["class"] = "li" + return self._make_tag("li", attrs, text) + + def table(self, text: str, **attrs) -> str: + attrs["class"] = "table is-fullwidth is-bordered" + return self._make_tag("table", attrs, text) + + def _make_tag( + self, tag: str, attributes: dict[str, str], text: str | None = None + ) -> str: + attrs = " ".join( + f'{key}="{value}"' for key, value in attributes.items() + ) + if text is None: + return f"<{tag} {attrs} />" + return f"<{tag} {attrs}>{text}" + + +RST_CODE_BLOCK_PATTERN = re.compile( + r"\.\.\scode-block::\s(\w+)\n\n((?:\n|(?:\s\s\s\s[^\n]*))+)" +) + +_render_markdown = create_markdown( + renderer=DocsRenderer(), + plugins=[ + RSTDirective( + [ + # Admonition(), + Attributes(), + Notification(), + TableOfContents(), + Column(), + Mermaid(), + Tabs(), + Hook(), + ] + ), + "abbr", + "def_list", + "footnotes", + "mark", + "table", + span, + ], +) + + +def render_markdown(text: str) -> str: + def replacer(match): + language = match.group(1) + code_block = dedent(match.group(2)).strip() + return f"```{language}\n{code_block}\n```\n\n" + + text = RST_CODE_BLOCK_PATTERN.sub(replacer, text) + return _render_markdown(text) diff --git a/guide/webapp/display/page/__init__.py b/guide/webapp/display/page/__init__.py new file mode 100644 index 00000000..7ad390fc --- /dev/null +++ b/guide/webapp/display/page/__init__.py @@ -0,0 +1,4 @@ +from .page import Page +from .renderer import PageRenderer + +__all__ = ["Page", "PageRenderer"] diff --git a/guide/webapp/display/page/docobject.py b/guide/webapp/display/page/docobject.py new file mode 100644 index 00000000..b812b440 --- /dev/null +++ b/guide/webapp/display/page/docobject.py @@ -0,0 +1,389 @@ +from __future__ import annotations + +import importlib +import inspect +import pkgutil +from collections import defaultdict +from dataclasses import dataclass, field +from html import escape + +from docstring_parser import Docstring, DocstringParam, DocstringRaises +from docstring_parser import parse as parse_docstring +from docstring_parser.common import DocstringExample + +from html5tagger import HTML, Builder, E # type: ignore + +from ..markdown import render_markdown, slugify + + +@dataclass +class DocObject: + name: str + module_name: str + full_name: str + signature: inspect.Signature | None + docstring: Docstring + object_type: str = "" + methods: list[DocObject] = field(default_factory=list) + decorators: list[str] = field(default_factory=list) + + +def _extract_classes_methods(obj, full_name, docstrings): + methods = [] + for method_name, method in inspect.getmembers(obj, _is_public_member): + try: + signature = _get_method_signature(method) + docstring = inspect.getdoc(method) + decorators = _detect_decorators(obj, method) + methods.append( + DocObject( + name=method_name, + module_name="", + full_name=f"{full_name}.{method_name}", + signature=signature, + docstring=parse_docstring(docstring or ""), + decorators=decorators, + object_type=_get_object_type(method), + ) + ) + except ValueError: + pass + + docstrings[full_name].methods = methods + + +def _get_method_signature(method): + try: + return inspect.signature(method) + except TypeError: + signature = None + if func := getattr(method, "fget", None): + signature = inspect.signature(func) + return signature + + +def _is_public_member(obj: object) -> bool: + obj_name = getattr(obj, "__name__", "") + if func := getattr(obj, "fget", None): + obj_name = getattr(func, "__name__", "") + return ( + not obj_name.startswith("_") + and not obj_name.isupper() + and ( + inspect.ismethod(obj) + or inspect.isfunction(obj) + or isinstance(obj, property) + or isinstance(obj, property) + ) + ) + + +def _detect_decorators(cls, method): + decorators = [] + method_name = getattr(method, "__name__", None) + if isinstance(cls.__dict__.get(method_name), classmethod): + decorators.append("classmethod") + if isinstance(cls.__dict__.get(method_name), staticmethod): + decorators.append("staticmethod") + if isinstance(method, property): + decorators.append("property") + return decorators + + +def _get_object_type(obj) -> str: + if inspect.isclass(obj): + return "class" + + # If the object is a method, get the underlying function + if inspect.ismethod(obj): + obj = obj.__func__ + + # If the object is a coroutine or a coroutine function + if inspect.iscoroutine(obj) or inspect.iscoroutinefunction(obj): + return "async def" + + return "def" + + +def organize_docobjects(package_name: str) -> dict[str, str]: + page_content: defaultdict[str, str] = defaultdict(str) + docobjects = _extract_docobjects(package_name) + for module, docobject in docobjects.items(): + builder = Builder(name="Partial") + _docobject_to_html(docobject, builder) + ref = module.rsplit(".", module.count(".") - 1)[0] + page_content[f"/api/{ref}.md"] += str(builder) + return page_content + + +def _extract_docobjects(package_name: str) -> dict[str, DocObject]: + docstrings = {} + package = importlib.import_module(package_name) + + for _, name, _ in pkgutil.walk_packages( + package.__path__, package_name + "." + ): + module = importlib.import_module(name) + for obj_name, obj in inspect.getmembers(module): + if ( + obj_name.startswith("_") + or inspect.getmodule(obj) != module + or not callable(obj) + ): + continue + try: + signature = inspect.signature(obj) + except ValueError: + signature = None + docstring = inspect.getdoc(obj) + full_name = f"{name}.{obj_name}" + docstrings[full_name] = DocObject( + name=obj_name, + full_name=full_name, + module_name=name, + signature=signature, + docstring=parse_docstring(docstring or ""), + object_type=_get_object_type(obj), + ) + if inspect.isclass(obj): + _extract_classes_methods(obj, full_name, docstrings) + + return docstrings + + +def _docobject_to_html( + docobject: DocObject, builder: Builder, as_method: bool = False +) -> None: + anchor_id = slugify(docobject.full_name.replace(".", "-")) + anchor = E.a("#", class_="anchor", href=f"#{anchor_id}") + class_name, heading = _define_heading_and_class( + docobject, anchor, as_method + ) + + with builder.div(class_=class_name): + builder(heading) + + if docobject.docstring.short_description: + builder.div( + HTML(render_markdown(docobject.docstring.short_description)), + class_="short-description mt-3 is-size-5", + ) + + if docobject.object_type == "class": + mro = [ + item + for idx, item in enumerate( + inspect.getmro( + getattr( + importlib.import_module(docobject.module_name), + docobject.name, + ) + ) + ) + if idx > 0 and item not in (object, type) + ] + if mro: + builder.div( + E.span("Inherits from: ", class_="is-italic"), + E.span( + ", ".join([cls.__name__ for cls in mro]), + class_="has-text-weight-bold", + ), + class_="short-description mt-3 is-size-5", + ) + + builder.p( + HTML( + _signature_to_html( + docobject.name, + docobject.object_type, + docobject.signature, + docobject.decorators, + ) + ), + class_="signature notification is-family-monospace", + ) + + if docobject.docstring.long_description: + builder.div( + HTML(render_markdown(docobject.docstring.long_description)), + class_="long-description mt-3", + ) + + if docobject.docstring.params: + with builder.div(class_="box mt-5"): + builder.h5( + "Parameters", class_="is-size-5 has-text-weight-bold" + ) + _render_params(builder, docobject.docstring.params) + + if docobject.docstring.returns: + _render_returns(builder, docobject) + + if docobject.docstring.raises: + _render_raises(builder, docobject.docstring.raises) + + if docobject.docstring.examples: + _render_examples(builder, docobject.docstring.examples) + + for method in docobject.methods: + _docobject_to_html(method, builder, as_method=True) + + +def _signature_to_html( + name: str, + object_type: str, + signature: inspect.Signature | None, + decorators: list[str], +) -> str: + parts = [] + parts.append("") + for decorator in decorators: + parts.append( + f"@{decorator}
" + ) + parts.append( + f"{object_type} " + f"{name}(" + ) + if not signature: + parts.append("self)") + parts.append("
") + return "".join(parts) + for i, param in enumerate(signature.parameters.values()): + parts.append(f"{escape(param.name)}") + annotation = "" + if param.annotation != inspect.Parameter.empty: + annotation = escape(str(param.annotation)) + parts.append( + f": {annotation}" + ) + if param.default != inspect.Parameter.empty: + default = escape(str(param.default)) + if annotation == "str": + default = f'"{default}"' + parts.append(f" = {default}") + if i < len(signature.parameters) - 1: + parts.append(", ") + parts.append(")") + if signature.return_annotation != inspect.Signature.empty: + return_annotation = escape(str(signature.return_annotation)) + parts.append( + f": -> {return_annotation}" + ) + parts.append("") + return "".join(parts) + + +def _define_heading_and_class( + docobject: DocObject, anchor: Builder, as_method: bool +) -> tuple[str, Builder]: + anchor_id = slugify(docobject.full_name.replace(".", "-")) + anchor = E.a("#", class_="anchor", href=f"#{anchor_id}") + if as_method: + class_name = "method" + heading = E.h3( + docobject.name, + anchor, + class_="is-size-4 has-text-weight-bold mt-6", + id_=anchor_id, + ) + else: + class_name = "docobject" + heading = E.h2( + E.span(docobject.module_name, class_="has-text-weight-light"), + ".", + E.span(docobject.name, class_="has-text-weight-bold is-size-1"), + anchor, + class_="is-size-2", + id_=anchor_id, + ) + return class_name, heading + + +def _render_params(builder: Builder, params: list[DocstringParam]) -> None: + for param in params: + with builder.dl(class_="mt-2"): + dt_args = [param.arg_name] + if param.type_name: + parts = [ + E.br(), + E.span( + param.type_name, + class_="has-text-weight-normal has-text-purple ml-2", + ), + ] + dt_args.extend(parts) + builder.dt(*dt_args, class_="is-family-monospace") + builder.dd( + HTML( + render_markdown( + param.description + or param.arg_name + or param.type_name + or "" + ) + ) + ) + + +def _render_raises(builder: Builder, raises: list[DocstringRaises]) -> None: + with builder.div(class_="box mt-5"): + builder.h5("Raises", class_="is-size-5 has-text-weight-bold") + for raise_ in raises: + with builder.dl(class_="mt-2"): + builder.dt(raise_.type_name, class_="is-family-monospace") + builder.dd( + HTML( + render_markdown( + raise_.description or raise_.type_name or "" + ) + ) + ) + + +def _render_returns(builder: Builder, docobject: DocObject) -> None: + assert docobject.docstring.returns + return_type = docobject.docstring.returns.type_name + if not return_type or return_type == "None": + return + with builder.div(class_="box mt-5"): + if not return_type and docobject.signature: + return_type = docobject.signature.return_annotation + + if not return_type or return_type == inspect.Signature.empty: + return_type = "N/A" + + term = ( + "Return" + if not docobject.docstring.returns.is_generator + else "Yields" + ) + builder.h5(term, class_="is-size-5 has-text-weight-bold") + with builder.dl(class_="mt-2"): + builder.dt(return_type, class_="is-family-monospace") + builder.dd( + HTML( + render_markdown( + docobject.docstring.returns.description + or docobject.docstring.returns.type_name + or "" + ) + ) + ) + + +def _render_examples( + builder: Builder, examples: list[DocstringExample] +) -> None: + with builder.div(class_="box mt-5"): + builder.h5("Examples", class_="is-size-5 has-text-weight-bold") + for example in examples: + with builder.div(class_="mt-2"): + builder( + HTML( + render_markdown( + example.description or example.snippet or "" + ) + ) + ) diff --git a/guide/webapp/display/page/page.py b/guide/webapp/display/page/page.py new file mode 100644 index 00000000..a4b833d9 --- /dev/null +++ b/guide/webapp/display/page/page.py @@ -0,0 +1,164 @@ +from __future__ import annotations + +from dataclasses import dataclass, field +from pathlib import Path +from typing import Type + +from frontmatter import parse + +from ..layouts.base import BaseLayout +from ..layouts.home import HomeLayout +from ..layouts.main import MainLayout +from ..markdown import render_markdown +from .docobject import organize_docobjects + +_PAGE_CACHE: dict[ + str, dict[str, tuple[Page | None, Page | None, Page | None]] +] = {} +_LAYOUTS_CACHE: dict[str, Type[BaseLayout]] = { + "home": HomeLayout, + "main": MainLayout, +} +_DEFAULT = "en" + + +@dataclass +class PageMeta: + language: str = _DEFAULT + title: str = "" + description: str = "" + layout: str = "main" + features: list[dict[str, str]] = field(default_factory=list) + + +@dataclass +class Page: + path: Path + content: str + meta: PageMeta = field(default_factory=PageMeta) + _relative_path: Path | None = None + next_page: Page | None = None + previous_page: Page | None = None + anchors: list[str] = field(default_factory=list) + + DEFAULT_LANGUAGE = _DEFAULT + + def get_layout(self) -> Type[BaseLayout]: + return _LAYOUTS_CACHE[self.meta.layout] + + @property + def relative_path(self) -> Path: + if self._relative_path is None: + raise RuntimeError("Page not initialized") + return self._relative_path + + @classmethod + def get( + cls, language: str, path: str + ) -> tuple[Page | None, Page | None, Page | None]: + if path.endswith("/") or not path: + path += "index.html" + if not path.endswith(".md"): + path = path.removesuffix(".html") + ".md" + if language == "api": + path = f"/api/{path}" + return _PAGE_CACHE.get(language, {}).get(path, (None, None, None)) + + @classmethod + def load_pages(cls, base_path: Path, page_order: list[str]) -> list[Page]: + output: list[Page] = [] + for path in base_path.glob("**/*.md"): + relative = path.relative_to(base_path) + language = relative.parts[0] + name = "/".join(relative.parts[1:]) + page = cls._load_page(path) + output.append(page) + page._relative_path = relative + _PAGE_CACHE.setdefault(language, {})[name] = ( + None, + page, + None, + ) + _PAGE_CACHE["api"] = {} + for language, pages in _PAGE_CACHE.items(): + for name, (_, current, _) in pages.items(): + previous_page = None + next_page = None + try: + index = page_order.index(name) + except ValueError: + continue + try: + if index > 0: + previous_page = pages[page_order[index - 1]][1] + except KeyError: + pass + try: + if index < len(page_order) - 1: + next_page = pages[page_order[index + 1]][1] + except KeyError: + pass + pages[name] = (previous_page, current, next_page) + previous_page = None + next_page = None + + api_pages = cls._load_api_pages() + filtered_order = [ref for ref in page_order if ref in api_pages] + for idx, ref in enumerate(filtered_order): + current_page = api_pages[ref] + previous_page = None + next_page = None + try: + if idx > 0: + previous_page = api_pages[filtered_order[idx - 1]] + except KeyError: + pass + try: + if idx < len(filtered_order) - 1: + next_page = api_pages[filtered_order[idx + 1]] + except KeyError: + pass + _PAGE_CACHE["api"][ref] = (previous_page, current_page, next_page) + + return output + + @staticmethod + def _load_page(path: Path) -> Page: + raw = path.read_text() + metadata, raw_content = parse(raw) + content = render_markdown(raw_content) + page = Page( + path=path, + content=content, + meta=PageMeta(**metadata), + ) + if not page.meta.title: + page.meta.title = page.path.stem.replace("-", " ").title() + + for line in raw.splitlines(): + if line.startswith("##") and not line.startswith("###"): + line = line.lstrip("#").strip() + page.anchors.append(line) + + return page + + @staticmethod + def _load_api_pages() -> dict[str, Page]: + docstring_content = organize_docobjects("sanic") + output: dict[str, Page] = {} + + for module, content in docstring_content.items(): + path = Path(module) + page = Page( + path=path, + content=content, + meta=PageMeta( + title=path.stem, + description="", + layout="main", + ), + ) + page._relative_path = Path(f"./{module}") + output[module] = page + + return output diff --git a/guide/webapp/display/page/renderer.py b/guide/webapp/display/page/renderer.py new file mode 100644 index 00000000..3040ba9f --- /dev/null +++ b/guide/webapp/display/page/renderer.py @@ -0,0 +1,47 @@ +from __future__ import annotations + +from contextlib import contextmanager +from typing import Type + +from webapp.display.base import BaseRenderer + +from html5tagger import HTML, Builder # type: ignore +from sanic import Request + +from ..layouts.base import BaseLayout +from .page import Page + + +class PageRenderer(BaseRenderer): + def render(self, request: Request, language: str, path: str) -> Builder: + builder = self.get_builder( + full=request.headers.get("HX-Request") is None, + language=language, + ) + self._body(request, builder, language, path) + return builder + + def _body( + self, request: Request, builder: Builder, language: str, path: str + ): + prev_page, current_page, next_page = Page.get(language, path) + request.ctx.language = ( + Page.DEFAULT_LANGUAGE if language == "api" else language + ) + request.ctx.current_page = current_page + request.ctx.previous_page = prev_page + request.ctx.next_page = next_page + with self._base(request, builder, current_page): + if current_page is None: + builder.h1("Not found") + return + builder(HTML(current_page.content)) + + @contextmanager + def _base(self, request: Request, builder: Builder, page: Page | None): + layout_type: Type[BaseLayout] = ( + page.get_layout() if page else BaseLayout + ) + layout = layout_type(builder) + with layout(request, builder.full): + yield diff --git a/guide/webapp/display/plugins/__init__.py b/guide/webapp/display/plugins/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/guide/webapp/display/plugins/attrs.py b/guide/webapp/display/plugins/attrs.py new file mode 100644 index 00000000..7117bd0f --- /dev/null +++ b/guide/webapp/display/plugins/attrs.py @@ -0,0 +1,40 @@ +from re import Match +from textwrap import dedent +from typing import Any + +from mistune.block_parser import BlockParser +from mistune.core import BlockState +from mistune.directives import DirectivePlugin + +from html5tagger import HTML, E + + +class Attributes(DirectivePlugin): + def __call__(self, directive, md): + directive.register("attrs", self.parse) + + if md.renderer.NAME == "html": + md.renderer.register("attrs", self._render) + + def parse( + self, block: BlockParser, m: Match, state: BlockState + ) -> dict[str, Any]: + info = m.groupdict() + options = dict(self.parse_options(m)) + new_state = block.state_cls() + new_state.process(dedent(info["text"])) + block.parse(new_state) + options.setdefault("class_", "additional-attributes") + classes = options.pop("class", "") + if classes: + options["class_"] += f" {classes}" + + return { + "type": "attrs", + "text": info["text"], + "children": new_state.tokens, + "attrs": options, + } + + def _render(self, _, text: str, **attrs) -> str: + return str(E.div(HTML(text), **attrs)) diff --git a/guide/webapp/display/plugins/columns.py b/guide/webapp/display/plugins/columns.py new file mode 100644 index 00000000..4ab7feab --- /dev/null +++ b/guide/webapp/display/plugins/columns.py @@ -0,0 +1,45 @@ +from re import Match +from textwrap import dedent +from typing import Any + +from mistune import HTMLRenderer +from mistune.block_parser import BlockParser +from mistune.core import BlockState +from mistune.directives import DirectivePlugin, RSTDirective +from mistune.markdown import Markdown + + +class Column(DirectivePlugin): + def parse( + self, block: BlockParser, m: Match, state: BlockState + ) -> dict[str, Any]: + info = m.groupdict() + + new_state = block.state_cls() + new_state.process(dedent(info["text"])) + block.parse(new_state) + + return { + "type": "column", + "text": info["text"], + "children": new_state.tokens, + "attrs": {}, + } + + def __call__( # type: ignore + self, directive: RSTDirective, md: Markdown + ) -> None: + directive.register("column", self.parse) + + if md.renderer.NAME == "html": + md.renderer.register("column", self._render_column) + + def _render_column(self, renderer: HTMLRenderer, text: str, **attrs): + start = ( + '
\n' + if attrs.get("first") + else "" + ) + end = "
\n" if attrs.get("last") else "" + col = f'
{text}
\n' + return start + (col) + end diff --git a/guide/webapp/display/plugins/hook.py b/guide/webapp/display/plugins/hook.py new file mode 100644 index 00000000..db1b647a --- /dev/null +++ b/guide/webapp/display/plugins/hook.py @@ -0,0 +1,31 @@ +from mistune.core import BlockState +from mistune.directives import DirectivePlugin, RSTDirective +from mistune.markdown import Markdown + + +class Hook(DirectivePlugin): + def __call__( # type: ignore + self, directive: RSTDirective, md: Markdown + ) -> None: + if md.renderer.NAME == "html": + md.before_render_hooks.append(self._hook) + + def _hook(self, md: Markdown, state: BlockState) -> None: + prev = None + for idx, token in enumerate(state.tokens): + for type_ in ("column", "tab"): + if token["type"] == type_: + maybe_next = ( + state.tokens[idx + 1] + if idx + 1 < len(state.tokens) + else None + ) + token.setdefault("attrs", {}) + if prev and prev["type"] != type_: + token["attrs"]["first"] = True + if ( + maybe_next and maybe_next["type"] != type_ + ) or not maybe_next: + token["attrs"]["last"] = True + + prev = token diff --git a/guide/webapp/display/plugins/mermaid.py b/guide/webapp/display/plugins/mermaid.py new file mode 100644 index 00000000..83fa9189 --- /dev/null +++ b/guide/webapp/display/plugins/mermaid.py @@ -0,0 +1,41 @@ +from html import unescape +from re import Match +from textwrap import dedent +from typing import Any + +from mistune import HTMLRenderer +from mistune.block_parser import BlockParser +from mistune.core import BlockState +from mistune.directives import DirectivePlugin, RSTDirective +from mistune.markdown import Markdown + +from html5tagger import HTML, E + + +class Mermaid(DirectivePlugin): + def parse( + self, block: BlockParser, m: Match, state: BlockState + ) -> dict[str, Any]: + info = m.groupdict() + + new_state = block.state_cls() + new_state.process(dedent(info["text"])) + block.parse(new_state) + + text = HTML(info["text"].strip()) + + return { + "type": "mermaid", + "text": text, + "children": [{"type": "text", "text": text}], + "attrs": {}, + } + + def __call__(self, directive: RSTDirective, md: Markdown) -> None: # type: ignore + directive.register("mermaid", self.parse) + + if md.renderer.NAME == "html": + md.renderer.register("mermaid", self._render_mermaid) + + def _render_mermaid(self, renderer: HTMLRenderer, text: str, **attrs): + return str(E.div(class_="mermaid")(HTML(unescape(text)))) diff --git a/guide/webapp/display/plugins/notification.py b/guide/webapp/display/plugins/notification.py new file mode 100644 index 00000000..911b4c31 --- /dev/null +++ b/guide/webapp/display/plugins/notification.py @@ -0,0 +1,47 @@ +from mistune.directives import Admonition + +from html5tagger import HTML, E + + +class Notification(Admonition): + SUPPORTED_NAMES = { + "success", + "info", + "warning", + "danger", + "tip", + "new", + "note", + } + + def __call__(self, directive, md): + for name in self.SUPPORTED_NAMES: + directive.register(name, self.parse) + + if md.renderer.NAME == "html": + md.renderer.register("admonition", self._render_admonition) + md.renderer.register( + "admonition_title", self._render_admonition_title + ) + md.renderer.register( + "admonition_content", self._render_admonition_content + ) + + def _render_admonition(self, _, text, name, **attrs) -> str: + return str( + E.div( + HTML(text), + class_=f"notification is-{name}", + ) + ) + + def _render_admonition_title(self, _, text) -> str: + return str( + E.p( + text, + class_="notification-title", + ) + ) + + def _render_admonition_content(self, _, text) -> str: + return text diff --git a/guide/webapp/display/plugins/span.py b/guide/webapp/display/plugins/span.py new file mode 100644 index 00000000..0ea5a9cd --- /dev/null +++ b/guide/webapp/display/plugins/span.py @@ -0,0 +1,26 @@ +import re + +from mistune.markdown import Markdown + + +def parse_inline_span(inline, m: re.Match, state): + state.append_token( + { + "type": "span", + "attrs": {"classes": m.group("classes")}, + "raw": m.group("content"), + } + ) + return m.end() + + +SPAN_PATTERN = r"{span:(?:(?P[^\:]+?):)?(?P.*?)}" + + +def span(md: Markdown) -> None: + md.inline.register( + "span", + SPAN_PATTERN, + parse_inline_span, + before="link", + ) diff --git a/guide/webapp/display/plugins/tabs.py b/guide/webapp/display/plugins/tabs.py new file mode 100644 index 00000000..b99e70db --- /dev/null +++ b/guide/webapp/display/plugins/tabs.py @@ -0,0 +1,50 @@ +from re import Match +from textwrap import dedent +from typing import Any + +from mistune import HTMLRenderer +from mistune.block_parser import BlockParser +from mistune.core import BlockState +from mistune.directives import DirectivePlugin, RSTDirective +from mistune.markdown import Markdown + + +class Tabs(DirectivePlugin): + def parse( + self, block: BlockParser, m: Match, state: BlockState + ) -> dict[str, Any]: + info = m.groupdict() + + new_state = block.state_cls() + new_state.process(dedent(info["text"])) + block.parse(new_state) + + return { + "type": "tab", + "text": info["text"], + "children": new_state.tokens, + "attrs": { + "title": info["title"], + }, + } + + def __call__( # type: ignore + self, + directive: RSTDirective, + md: Markdown, + ) -> None: + directive.register("tab", self.parse) + + if md.renderer.NAME == "html": + md.renderer.register("tab", self._render_tab) + + def _render_tab(self, renderer: HTMLRenderer, text: str, **attrs): + start = '
    \n' if attrs.get("first") else "" + end = ( + '
\n' + if attrs.get("last") + else "" + ) + content = f'
{text}
\n' + tab = f'
  • {attrs["title"]}{content}
  • \n' + return start + tab + end diff --git a/guide/webapp/display/search/__init__.py b/guide/webapp/display/search/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/guide/webapp/display/search/renderer.py b/guide/webapp/display/search/renderer.py new file mode 100644 index 00000000..fb06aff1 --- /dev/null +++ b/guide/webapp/display/search/renderer.py @@ -0,0 +1,68 @@ +from contextlib import contextmanager +from urllib.parse import unquote + +from webapp.display.search.search import Searcher + +from html5tagger import Builder, E # type: ignore +from sanic import Request + +from ..base import BaseRenderer +from ..layouts.main import MainLayout + + +class SearchRenderer(BaseRenderer): + def render( + self, request: Request, language: str, searcher: Searcher, full: bool + ) -> Builder: + builder = self.get_builder( + full=request.headers.get("HX-Request") is None, + language=language, + ) + self._body(request, builder, language, searcher, full) + return builder + + def _body( + self, + request: Request, + builder: Builder, + language: str, + searcher: Searcher, + full: bool, + ): + with self._base(request, builder, full): + builder.h1("Search") + self._results(request, builder, searcher, language) + + @contextmanager + def _base(self, request: Request, builder: Builder, full: bool): + layout = MainLayout(builder) + with layout(request, full): + yield + + def _results( + self, + request: Request, + builder: Builder, + searcher: Searcher, + language: str, + ): + query = unquote(request.args.get("q", "")) + results = searcher.search(query, language) + if not query or not results: + builder.p("No results found") + return + + with builder.div(class_="container"): + with builder.ul(): + for _, doc in results: + builder.li( + E.a( + doc.title, + href=f"/{doc.page.relative_path}", + hx_get=f"/{doc.page.relative_path}", + hx_target="#content", + hx_swap="innerHTML", + hx_push_url="true", + ), + f" - {doc.page.relative_path}", + ) diff --git a/guide/webapp/display/search/search.py b/guide/webapp/display/search/search.py new file mode 100644 index 00000000..cede028e --- /dev/null +++ b/guide/webapp/display/search/search.py @@ -0,0 +1,175 @@ +from __future__ import annotations + +from collections import Counter +from pathlib import Path +from typing import ClassVar + +from msgspec import Struct +from webapp.display.page import Page + + +class Stemmer: + STOP_WORDS: ClassVar[set[str]] = set( + "a about above after again against all am an and any are aren't as at be because been before being below between both but by can't cannot could couldn't did didn't do does doesn't doing don't down during each few for from further had hadn't has hasn't have haven't having he he'd he'll he's her here here's hers herself him himself his how how's i i'd i'll i'm i've if in into is isn't it it's its itself let's me more most mustn't my myself no nor not of off on once only or other ought our ours ourselves out over own same shan't she she'd she'll she's should shouldn't so some such than that that's the their theirs them themselves then there there's these they they'd they'll they're they've this those through to too under until up very was wasn't we we'd we'll we're we've were weren't what what's when when's where where's which while who who's whom why why's with won't would wouldn't you you'd you'll you're you've your yours yourself yourselves".split() # noqa: E501 + ) + PREFIXES = set("auto be fore over re un under".split()) + SUFFIXES = set( + "able al ance ant ate ed en er ful hood ing ion ish ity ive ize less ly ment ness ous ship sion tion y".split() # noqa: E501 + ) + VOWELS = set("aeiou") + PLURALIZATION = set("s es ies".split()) + + def stem(self, word: str) -> str: + if word in self.STOP_WORDS: + return word + if word in self.PREFIXES: + return word + for suffix in self.SUFFIXES | self.PLURALIZATION: + if word.endswith(suffix): + return self._stem(word[: -len(suffix)]) + return word + + def _stem(self, word: str) -> str: + if word.endswith("e"): + return word[:-1] + if word.endswith("y") and word[-2] not in self.VOWELS: + return word[:-1] + return word + + def __call__(self, word: str) -> str: + return self.stem(word) + + +class Document(Struct, kw_only=True): + TITLE_WEIGHT: ClassVar[int] = 3 + BODY_WEIGHT: ClassVar[int] = 1 + + page: Page + language: str + term_frequency: dict[str, float] = {} + + @property + def title(self) -> str: + return self.page.meta.title + + @property + def text(self) -> str: + return self.page.content + + @property + def weighted_text(self) -> str: + """Return the text with the title repeated.""" + return " ".join( + [self.title] * self.TITLE_WEIGHT + [self.text] * self.BODY_WEIGHT + ) + + def _term_frequency(self, stemmer: Stemmer) -> None: + """Count the number of times each word appears in the document.""" + words = [ + stemmer(word) + for word in self.weighted_text.lower().split() + if word not in Stemmer.STOP_WORDS + ] + num_words = len(words) + word_count = Counter(words) + self.term_frequency = { + word: count / num_words for word, count in word_count.items() + } + + def process(self, stemmer: Stemmer) -> Document: + """Process the document.""" + self._term_frequency(stemmer) + return self + + +def _inverse_document_frequency(docs: list[Document]) -> dict[str, float]: + """Count the number of documents each word appears in.""" + num_docs = len(docs) + word_count: Counter[str] = Counter() + for doc in docs: + word_count.update(doc.term_frequency.keys()) + return {word: num_docs / count for word, count in word_count.items()} + + +def _tf_idf_vector( + document: Document, idf: dict[str, float] +) -> dict[str, float]: + """Calculate the TF-IDF vector for a document.""" + return { + word: tf * idf[word] + for word, tf in document.term_frequency.items() + if word in idf + } + + +def _cosine_similarity( + vec1: dict[str, float], vec2: dict[str, float] +) -> float: + """Calculate the cosine similarity between two vectors.""" + if not vec1 or not vec2: + return 0.0 + dot_product = sum(vec1.get(word, 0) * vec2.get(word, 0) for word in vec1) + magnitude1 = sum(value**2 for value in vec1.values()) ** 0.5 + magnitude2 = sum(value**2 for value in vec2.values()) ** 0.5 + return dot_product / (magnitude1 * magnitude2) + + +def _search( + query: str, + language: str, + vectors: list[dict[str, float]], + idf: dict[str, float], + documents: list[Document], + stemmer: Stemmer, +) -> list[tuple[float, Document]]: + dummy_page = Page(Path(), query) + tf_idf_query = _tf_idf_vector( + Document(page=dummy_page, language=language).process(stemmer), idf + ) + similarities = [ + _cosine_similarity(tf_idf_query, vector) for vector in vectors + ] + return [ + (similarity, document) + for similarity, document in sorted( + zip(similarities, documents), + reverse=True, + key=lambda pair: pair[0], + )[:10] + if similarity > 0 + ] + + +class Searcher: + def __init__( + self, + stemmer: Stemmer, + documents: list[Document], + ): + self._documents: dict[str, list[Document]] = {} + for document in documents: + self._documents.setdefault(document.language, []).append(document) + self._idf = { + language: _inverse_document_frequency(documents) + for language, documents in self._documents.items() + } + self._vectors = { + language: [ + _tf_idf_vector(document, self._idf[language]) + for document in documents + ] + for language, documents in self._documents.items() + } + self._stemmer = stemmer + + def search( + self, query: str, language: str + ) -> list[tuple[float, Document]]: + return _search( + query, + language, + self._vectors[language], + self._idf[language], + self._documents[language], + self._stemmer, + ) diff --git a/guide/webapp/display/text.py b/guide/webapp/display/text.py new file mode 100644 index 00000000..00518cdc --- /dev/null +++ b/guide/webapp/display/text.py @@ -0,0 +1,7 @@ +import re + +SLUGIFY_PATTERN = re.compile(r"[^a-zA-Z0-9-]") + + +def slugify(text: str) -> str: + return SLUGIFY_PATTERN.sub("", text.lower().replace(" ", "-")) diff --git a/guide/webapp/endpoint/__init__.py b/guide/webapp/endpoint/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/guide/webapp/endpoint/search.py b/guide/webapp/endpoint/search.py new file mode 100644 index 00000000..1b962d45 --- /dev/null +++ b/guide/webapp/endpoint/search.py @@ -0,0 +1,29 @@ +# from urllib.parse import unquote + +from webapp.display.page import Page +from webapp.display.search.renderer import SearchRenderer +from webapp.display.search.search import Document, Searcher, Stemmer + +from sanic import Blueprint, Request, Sanic, html + +bp = Blueprint("search", url_prefix="//search") + + +@bp.get("") +async def _search(request: Request, language: str, searcher: Searcher): + full = not bool(request.headers.get("HX-Request")) + renderer = SearchRenderer("Sanic Documentation Search") + builder = renderer.render(request, language, searcher, full) + + return html(str(builder)) + + +@bp.after_server_start +async def setup_search(app: Sanic): + stemmer = Stemmer() + pages: list[Page] = app.ctx.pages + documents = [ + Document(page=page, language=page.meta.language).process(stemmer) + for page in pages + ] + app.ext.dependency(Searcher(stemmer, documents)) diff --git a/guide/webapp/endpoint/view.py b/guide/webapp/endpoint/view.py new file mode 100644 index 00000000..09f1d04a --- /dev/null +++ b/guide/webapp/endpoint/view.py @@ -0,0 +1,5 @@ +from sanic import Blueprint + +from .search import bp as search_bp + +bp = Blueprint.group(search_bp) diff --git a/guide/webapp/worker/__init__.py b/guide/webapp/worker/__init__.py new file mode 100644 index 00000000..e69de29b diff --git a/guide/webapp/worker/config.py b/guide/webapp/worker/config.py new file mode 100644 index 00000000..b6166094 --- /dev/null +++ b/guide/webapp/worker/config.py @@ -0,0 +1,14 @@ +from pathlib import Path + +from msgspec import yaml +from webapp.display.layouts.models import GeneralConfig, MenuItem + + +def load_menu(path: Path) -> list[MenuItem]: + loaded = yaml.decode(path.read_bytes(), type=dict[str, list[MenuItem]]) + return loaded["root"] + + +def load_config(path: Path) -> GeneralConfig: + loaded = yaml.decode(path.read_bytes(), type=GeneralConfig) + return loaded diff --git a/guide/webapp/worker/factory.py b/guide/webapp/worker/factory.py new file mode 100644 index 00000000..dc983f09 --- /dev/null +++ b/guide/webapp/worker/factory.py @@ -0,0 +1,73 @@ +from pathlib import Path + +from webapp.display.layouts.models import MenuItem +from webapp.display.page import Page, PageRenderer +from webapp.endpoint.view import bp +from webapp.worker.config import load_config, load_menu +from webapp.worker.reload import setup_livereload +from webapp.worker.style import setup_style + +from sanic import Request, Sanic, html, redirect + + +def _compile_sidebar_order(items: list[MenuItem]) -> list[str]: + order = [] + for item in items: + if item.path: + order.append(item.path.removesuffix(".html") + ".md") + if item.items: + order.extend(_compile_sidebar_order(item.items)) + return order + + +def create_app(root: Path) -> Sanic: + app = Sanic("Documentation") + app.config.PUBLIC_DIR = root / "public" + app.config.CONTENT_DIR = root / "content" + app.config.CONFIG_DIR = root / "config" + app.config.STYLE_DIR = root / "style" + app.config.NODE_MODULES_DIR = root / "node_modules" + app.config.LANGUAGES = ["en"] + app.config.SIDEBAR = load_menu( + app.config.CONFIG_DIR / "en" / "sidebar.yaml" + ) + app.config.NAVBAR = load_menu(app.config.CONFIG_DIR / "en" / "navbar.yaml") + app.config.GENERAL = load_config( + app.config.CONFIG_DIR / "en" / "general.yaml" + ) + + setup_livereload(app) + setup_style(app) + app.blueprint(bp) + + app.static("/assets/", app.config.PUBLIC_DIR / "assets") + + @app.before_server_start + async def setup(app: Sanic): + app.ext.dependency(PageRenderer(base_title="TestApp")) + page_order = _compile_sidebar_order(app.config.SIDEBAR) + app.ctx.pages = Page.load_pages(app.config.CONTENT_DIR, page_order) + app.ctx.get_page = Page.get + + @app.get("/", name="root") + @app.get("/index.html", name="index") + async def index(request: Request): + return redirect(request.app.url_for("page", language="en", path="")) + + @app.get("/", name="page-without-path") + @app.get("//") + async def page( + request: Request, + page_renderer: PageRenderer, + language: str, + path: str = "", + ): + return html(page_renderer.render(request, language, path)) + + @app.on_request + async def set_language(request: Request): + request.ctx.language = request.match_info.get( + "language", Page.DEFAULT_LANGUAGE + ) + + return app diff --git a/guide/webapp/worker/livereload.js b/guide/webapp/worker/livereload.js new file mode 100644 index 00000000..322f6ddb --- /dev/null +++ b/guide/webapp/worker/livereload.js @@ -0,0 +1,3795 @@ +(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i Array#indexOf +// true -> Array#includes +var toIObject = require('./_to-iobject'); +var toLength = require('./_to-length'); +var toAbsoluteIndex = require('./_to-absolute-index'); +module.exports = function (IS_INCLUDES) { + return function ($this, el, fromIndex) { + var O = toIObject($this); + var length = toLength(O.length); + var index = toAbsoluteIndex(fromIndex, length); + var value; + // Array#includes uses SameValueZero equality algorithm + // eslint-disable-next-line no-self-compare + if (IS_INCLUDES && el != el) while (length > index) { + value = O[index++]; + // eslint-disable-next-line no-self-compare + if (value != value) return true; + // Array#indexOf ignores holes, Array#includes - not + } else for (;length > index; index++) if (IS_INCLUDES || index in O) { + if (O[index] === el) return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; + +},{"./_to-absolute-index":72,"./_to-iobject":74,"./_to-length":75}],6:[function(require,module,exports){ +// 0 -> Array#forEach +// 1 -> Array#map +// 2 -> Array#filter +// 3 -> Array#some +// 4 -> Array#every +// 5 -> Array#find +// 6 -> Array#findIndex +var ctx = require('./_ctx'); +var IObject = require('./_iobject'); +var toObject = require('./_to-object'); +var toLength = require('./_to-length'); +var asc = require('./_array-species-create'); +module.exports = function (TYPE, $create) { + var IS_MAP = TYPE == 1; + var IS_FILTER = TYPE == 2; + var IS_SOME = TYPE == 3; + var IS_EVERY = TYPE == 4; + var IS_FIND_INDEX = TYPE == 6; + var NO_HOLES = TYPE == 5 || IS_FIND_INDEX; + var create = $create || asc; + return function ($this, callbackfn, that) { + var O = toObject($this); + var self = IObject(O); + var f = ctx(callbackfn, that, 3); + var length = toLength(self.length); + var index = 0; + var result = IS_MAP ? create($this, length) : IS_FILTER ? create($this, 0) : undefined; + var val, res; + for (;length > index; index++) if (NO_HOLES || index in self) { + val = self[index]; + res = f(val, index, O); + if (TYPE) { + if (IS_MAP) result[index] = res; // map + else if (res) switch (TYPE) { + case 3: return true; // some + case 5: return val; // find + case 6: return index; // findIndex + case 2: result.push(val); // filter + } else if (IS_EVERY) return false; // every + } + } + return IS_FIND_INDEX ? -1 : IS_SOME || IS_EVERY ? IS_EVERY : result; + }; +}; + +},{"./_array-species-create":8,"./_ctx":13,"./_iobject":31,"./_to-length":75,"./_to-object":76}],7:[function(require,module,exports){ +var isObject = require('./_is-object'); +var isArray = require('./_is-array'); +var SPECIES = require('./_wks')('species'); + +module.exports = function (original) { + var C; + if (isArray(original)) { + C = original.constructor; + // cross-realm fallback + if (typeof C == 'function' && (C === Array || isArray(C.prototype))) C = undefined; + if (isObject(C)) { + C = C[SPECIES]; + if (C === null) C = undefined; + } + } return C === undefined ? Array : C; +}; + +},{"./_is-array":33,"./_is-object":34,"./_wks":81}],8:[function(require,module,exports){ +// 9.4.2.3 ArraySpeciesCreate(originalArray, length) +var speciesConstructor = require('./_array-species-constructor'); + +module.exports = function (original, length) { + return new (speciesConstructor(original))(length); +}; + +},{"./_array-species-constructor":7}],9:[function(require,module,exports){ +// getting tag from 19.1.3.6 Object.prototype.toString() +var cof = require('./_cof'); +var TAG = require('./_wks')('toStringTag'); +// ES3 wrong here +var ARG = cof(function () { return arguments; }()) == 'Arguments'; + +// fallback for IE11 Script Access Denied error +var tryGet = function (it, key) { + try { + return it[key]; + } catch (e) { /* empty */ } +}; + +module.exports = function (it) { + var O, T, B; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T + // builtinTag case + : ARG ? cof(O) + // ES3 arguments fallback + : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; +}; + +},{"./_cof":10,"./_wks":81}],10:[function(require,module,exports){ +var toString = {}.toString; + +module.exports = function (it) { + return toString.call(it).slice(8, -1); +}; + +},{}],11:[function(require,module,exports){ +var core = module.exports = { version: '2.6.12' }; +if (typeof __e == 'number') __e = core; // eslint-disable-line no-undef + +},{}],12:[function(require,module,exports){ +'use strict'; +var $defineProperty = require('./_object-dp'); +var createDesc = require('./_property-desc'); + +module.exports = function (object, index, value) { + if (index in object) $defineProperty.f(object, index, createDesc(0, value)); + else object[index] = value; +}; + +},{"./_object-dp":45,"./_property-desc":57}],13:[function(require,module,exports){ +// optional / simple context binding +var aFunction = require('./_a-function'); +module.exports = function (fn, that, length) { + aFunction(fn); + if (that === undefined) return fn; + switch (length) { + case 1: return function (a) { + return fn.call(that, a); + }; + case 2: return function (a, b) { + return fn.call(that, a, b); + }; + case 3: return function (a, b, c) { + return fn.call(that, a, b, c); + }; + } + return function (/* ...args */) { + return fn.apply(that, arguments); + }; +}; + +},{"./_a-function":1}],14:[function(require,module,exports){ +// 7.2.1 RequireObjectCoercible(argument) +module.exports = function (it) { + if (it == undefined) throw TypeError("Can't call method on " + it); + return it; +}; + +},{}],15:[function(require,module,exports){ +// Thank's IE8 for his funny defineProperty +module.exports = !require('./_fails')(function () { + return Object.defineProperty({}, 'a', { get: function () { return 7; } }).a != 7; +}); + +},{"./_fails":21}],16:[function(require,module,exports){ +var isObject = require('./_is-object'); +var document = require('./_global').document; +// typeof document.createElement is 'object' in old IE +var is = isObject(document) && isObject(document.createElement); +module.exports = function (it) { + return is ? document.createElement(it) : {}; +}; + +},{"./_global":25,"./_is-object":34}],17:[function(require,module,exports){ +// IE 8- don't enum bug keys +module.exports = ( + 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' +).split(','); + +},{}],18:[function(require,module,exports){ +// all enumerable object keys, includes symbols +var getKeys = require('./_object-keys'); +var gOPS = require('./_object-gops'); +var pIE = require('./_object-pie'); +module.exports = function (it) { + var result = getKeys(it); + var getSymbols = gOPS.f; + if (getSymbols) { + var symbols = getSymbols(it); + var isEnum = pIE.f; + var i = 0; + var key; + while (symbols.length > i) if (isEnum.call(it, key = symbols[i++])) result.push(key); + } return result; +}; + +},{"./_object-gops":50,"./_object-keys":53,"./_object-pie":54}],19:[function(require,module,exports){ +var global = require('./_global'); +var core = require('./_core'); +var hide = require('./_hide'); +var redefine = require('./_redefine'); +var ctx = require('./_ctx'); +var PROTOTYPE = 'prototype'; + +var $export = function (type, name, source) { + var IS_FORCED = type & $export.F; + var IS_GLOBAL = type & $export.G; + var IS_STATIC = type & $export.S; + var IS_PROTO = type & $export.P; + var IS_BIND = type & $export.B; + var target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE]; + var exports = IS_GLOBAL ? core : core[name] || (core[name] = {}); + var expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}); + var key, own, out, exp; + if (IS_GLOBAL) source = name; + for (key in source) { + // contains in native + own = !IS_FORCED && target && target[key] !== undefined; + // export native or passed + out = (own ? target : source)[key]; + // bind timers to global for call from export context + exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; + // extend global + if (target) redefine(target, key, out, type & $export.U); + // export + if (exports[key] != out) hide(exports, key, exp); + if (IS_PROTO && expProto[key] != out) expProto[key] = out; + } +}; +global.core = core; +// type bitmap +$export.F = 1; // forced +$export.G = 2; // global +$export.S = 4; // static +$export.P = 8; // proto +$export.B = 16; // bind +$export.W = 32; // wrap +$export.U = 64; // safe +$export.R = 128; // real proto method for `library` +module.exports = $export; + +},{"./_core":11,"./_ctx":13,"./_global":25,"./_hide":27,"./_redefine":58}],20:[function(require,module,exports){ +var MATCH = require('./_wks')('match'); +module.exports = function (KEY) { + var re = /./; + try { + '/./'[KEY](re); + } catch (e) { + try { + re[MATCH] = false; + return !'/./'[KEY](re); + } catch (f) { /* empty */ } + } return true; +}; + +},{"./_wks":81}],21:[function(require,module,exports){ +module.exports = function (exec) { + try { + return !!exec(); + } catch (e) { + return true; + } +}; + +},{}],22:[function(require,module,exports){ +'use strict'; +require('./es6.regexp.exec'); +var redefine = require('./_redefine'); +var hide = require('./_hide'); +var fails = require('./_fails'); +var defined = require('./_defined'); +var wks = require('./_wks'); +var regexpExec = require('./_regexp-exec'); + +var SPECIES = wks('species'); + +var REPLACE_SUPPORTS_NAMED_GROUPS = !fails(function () { + // #replace needs built-in support for named groups. + // #match works fine because it just return the exec results, even if it has + // a "grops" property. + var re = /./; + re.exec = function () { + var result = []; + result.groups = { a: '7' }; + return result; + }; + return ''.replace(re, '$') !== '7'; +}); + +var SPLIT_WORKS_WITH_OVERWRITTEN_EXEC = (function () { + // Chrome 51 has a buggy "split" implementation when RegExp#exec !== nativeExec + var re = /(?:)/; + var originalExec = re.exec; + re.exec = function () { return originalExec.apply(this, arguments); }; + var result = 'ab'.split(re); + return result.length === 2 && result[0] === 'a' && result[1] === 'b'; +})(); + +module.exports = function (KEY, length, exec) { + var SYMBOL = wks(KEY); + + var DELEGATES_TO_SYMBOL = !fails(function () { + // String methods call symbol-named RegEp methods + var O = {}; + O[SYMBOL] = function () { return 7; }; + return ''[KEY](O) != 7; + }); + + var DELEGATES_TO_EXEC = DELEGATES_TO_SYMBOL ? !fails(function () { + // Symbol-named RegExp methods call .exec + var execCalled = false; + var re = /a/; + re.exec = function () { execCalled = true; return null; }; + if (KEY === 'split') { + // RegExp[@@split] doesn't call the regex's exec method, but first creates + // a new one. We need to return the patched regex when creating the new one. + re.constructor = {}; + re.constructor[SPECIES] = function () { return re; }; + } + re[SYMBOL](''); + return !execCalled; + }) : undefined; + + if ( + !DELEGATES_TO_SYMBOL || + !DELEGATES_TO_EXEC || + (KEY === 'replace' && !REPLACE_SUPPORTS_NAMED_GROUPS) || + (KEY === 'split' && !SPLIT_WORKS_WITH_OVERWRITTEN_EXEC) + ) { + var nativeRegExpMethod = /./[SYMBOL]; + var fns = exec( + defined, + SYMBOL, + ''[KEY], + function maybeCallNative(nativeMethod, regexp, str, arg2, forceStringMethod) { + if (regexp.exec === regexpExec) { + if (DELEGATES_TO_SYMBOL && !forceStringMethod) { + // The native String method already delegates to @@method (this + // polyfilled function), leasing to infinite recursion. + // We avoid it by directly calling the native @@method method. + return { done: true, value: nativeRegExpMethod.call(regexp, str, arg2) }; + } + return { done: true, value: nativeMethod.call(str, regexp, arg2) }; + } + return { done: false }; + } + ); + var strfn = fns[0]; + var rxfn = fns[1]; + + redefine(String.prototype, KEY, strfn); + hide(RegExp.prototype, SYMBOL, length == 2 + // 21.2.5.8 RegExp.prototype[@@replace](string, replaceValue) + // 21.2.5.11 RegExp.prototype[@@split](string, limit) + ? function (string, arg) { return rxfn.call(string, this, arg); } + // 21.2.5.6 RegExp.prototype[@@match](string) + // 21.2.5.9 RegExp.prototype[@@search](string) + : function (string) { return rxfn.call(string, this); } + ); + } +}; + +},{"./_defined":14,"./_fails":21,"./_hide":27,"./_redefine":58,"./_regexp-exec":60,"./_wks":81,"./es6.regexp.exec":93}],23:[function(require,module,exports){ +'use strict'; +// 21.2.5.3 get RegExp.prototype.flags +var anObject = require('./_an-object'); +module.exports = function () { + var that = anObject(this); + var result = ''; + if (that.global) result += 'g'; + if (that.ignoreCase) result += 'i'; + if (that.multiline) result += 'm'; + if (that.unicode) result += 'u'; + if (that.sticky) result += 'y'; + return result; +}; + +},{"./_an-object":4}],24:[function(require,module,exports){ +module.exports = require('./_shared')('native-function-to-string', Function.toString); + +},{"./_shared":65}],25:[function(require,module,exports){ +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self + // eslint-disable-next-line no-new-func + : Function('return this')(); +if (typeof __g == 'number') __g = global; // eslint-disable-line no-undef + +},{}],26:[function(require,module,exports){ +var hasOwnProperty = {}.hasOwnProperty; +module.exports = function (it, key) { + return hasOwnProperty.call(it, key); +}; + +},{}],27:[function(require,module,exports){ +var dP = require('./_object-dp'); +var createDesc = require('./_property-desc'); +module.exports = require('./_descriptors') ? function (object, key, value) { + return dP.f(object, key, createDesc(1, value)); +} : function (object, key, value) { + object[key] = value; + return object; +}; + +},{"./_descriptors":15,"./_object-dp":45,"./_property-desc":57}],28:[function(require,module,exports){ +var document = require('./_global').document; +module.exports = document && document.documentElement; + +},{"./_global":25}],29:[function(require,module,exports){ +module.exports = !require('./_descriptors') && !require('./_fails')(function () { + return Object.defineProperty(require('./_dom-create')('div'), 'a', { get: function () { return 7; } }).a != 7; +}); + +},{"./_descriptors":15,"./_dom-create":16,"./_fails":21}],30:[function(require,module,exports){ +var isObject = require('./_is-object'); +var setPrototypeOf = require('./_set-proto').set; +module.exports = function (that, target, C) { + var S = target.constructor; + var P; + if (S !== C && typeof S == 'function' && (P = S.prototype) !== C.prototype && isObject(P) && setPrototypeOf) { + setPrototypeOf(that, P); + } return that; +}; + +},{"./_is-object":34,"./_set-proto":61}],31:[function(require,module,exports){ +// fallback for non-array-like ES3 and non-enumerable old V8 strings +var cof = require('./_cof'); +// eslint-disable-next-line no-prototype-builtins +module.exports = Object('z').propertyIsEnumerable(0) ? Object : function (it) { + return cof(it) == 'String' ? it.split('') : Object(it); +}; + +},{"./_cof":10}],32:[function(require,module,exports){ +// check on default Array iterator +var Iterators = require('./_iterators'); +var ITERATOR = require('./_wks')('iterator'); +var ArrayProto = Array.prototype; + +module.exports = function (it) { + return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); +}; + +},{"./_iterators":41,"./_wks":81}],33:[function(require,module,exports){ +// 7.2.2 IsArray(argument) +var cof = require('./_cof'); +module.exports = Array.isArray || function isArray(arg) { + return cof(arg) == 'Array'; +}; + +},{"./_cof":10}],34:[function(require,module,exports){ +module.exports = function (it) { + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; + +},{}],35:[function(require,module,exports){ +// 7.2.8 IsRegExp(argument) +var isObject = require('./_is-object'); +var cof = require('./_cof'); +var MATCH = require('./_wks')('match'); +module.exports = function (it) { + var isRegExp; + return isObject(it) && ((isRegExp = it[MATCH]) !== undefined ? !!isRegExp : cof(it) == 'RegExp'); +}; + +},{"./_cof":10,"./_is-object":34,"./_wks":81}],36:[function(require,module,exports){ +// call something on iterator step with safe closing on error +var anObject = require('./_an-object'); +module.exports = function (iterator, fn, value, entries) { + try { + return entries ? fn(anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch (e) { + var ret = iterator['return']; + if (ret !== undefined) anObject(ret.call(iterator)); + throw e; + } +}; + +},{"./_an-object":4}],37:[function(require,module,exports){ +'use strict'; +var create = require('./_object-create'); +var descriptor = require('./_property-desc'); +var setToStringTag = require('./_set-to-string-tag'); +var IteratorPrototype = {}; + +// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() +require('./_hide')(IteratorPrototype, require('./_wks')('iterator'), function () { return this; }); + +module.exports = function (Constructor, NAME, next) { + Constructor.prototype = create(IteratorPrototype, { next: descriptor(1, next) }); + setToStringTag(Constructor, NAME + ' Iterator'); +}; + +},{"./_hide":27,"./_object-create":44,"./_property-desc":57,"./_set-to-string-tag":63,"./_wks":81}],38:[function(require,module,exports){ +'use strict'; +var LIBRARY = require('./_library'); +var $export = require('./_export'); +var redefine = require('./_redefine'); +var hide = require('./_hide'); +var Iterators = require('./_iterators'); +var $iterCreate = require('./_iter-create'); +var setToStringTag = require('./_set-to-string-tag'); +var getPrototypeOf = require('./_object-gpo'); +var ITERATOR = require('./_wks')('iterator'); +var BUGGY = !([].keys && 'next' in [].keys()); // Safari has buggy iterators w/o `next` +var FF_ITERATOR = '@@iterator'; +var KEYS = 'keys'; +var VALUES = 'values'; + +var returnThis = function () { return this; }; + +module.exports = function (Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED) { + $iterCreate(Constructor, NAME, next); + var getMethod = function (kind) { + if (!BUGGY && kind in proto) return proto[kind]; + switch (kind) { + case KEYS: return function keys() { return new Constructor(this, kind); }; + case VALUES: return function values() { return new Constructor(this, kind); }; + } return function entries() { return new Constructor(this, kind); }; + }; + var TAG = NAME + ' Iterator'; + var DEF_VALUES = DEFAULT == VALUES; + var VALUES_BUG = false; + var proto = Base.prototype; + var $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT]; + var $default = $native || getMethod(DEFAULT); + var $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined; + var $anyNative = NAME == 'Array' ? proto.entries || $native : $native; + var methods, key, IteratorPrototype; + // Fix native + if ($anyNative) { + IteratorPrototype = getPrototypeOf($anyNative.call(new Base())); + if (IteratorPrototype !== Object.prototype && IteratorPrototype.next) { + // Set @@toStringTag to native iterators + setToStringTag(IteratorPrototype, TAG, true); + // fix for some old engines + if (!LIBRARY && typeof IteratorPrototype[ITERATOR] != 'function') hide(IteratorPrototype, ITERATOR, returnThis); + } + } + // fix Array#{values, @@iterator}.name in V8 / FF + if (DEF_VALUES && $native && $native.name !== VALUES) { + VALUES_BUG = true; + $default = function values() { return $native.call(this); }; + } + // Define iterator + if ((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])) { + hide(proto, ITERATOR, $default); + } + // Plug for library + Iterators[NAME] = $default; + Iterators[TAG] = returnThis; + if (DEFAULT) { + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: $entries + }; + if (FORCED) for (key in methods) { + if (!(key in proto)) redefine(proto, key, methods[key]); + } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; +}; + +},{"./_export":19,"./_hide":27,"./_iter-create":37,"./_iterators":41,"./_library":42,"./_object-gpo":51,"./_redefine":58,"./_set-to-string-tag":63,"./_wks":81}],39:[function(require,module,exports){ +var ITERATOR = require('./_wks')('iterator'); +var SAFE_CLOSING = false; + +try { + var riter = [7][ITERATOR](); + riter['return'] = function () { SAFE_CLOSING = true; }; + // eslint-disable-next-line no-throw-literal + Array.from(riter, function () { throw 2; }); +} catch (e) { /* empty */ } + +module.exports = function (exec, skipClosing) { + if (!skipClosing && !SAFE_CLOSING) return false; + var safe = false; + try { + var arr = [7]; + var iter = arr[ITERATOR](); + iter.next = function () { return { done: safe = true }; }; + arr[ITERATOR] = function () { return iter; }; + exec(arr); + } catch (e) { /* empty */ } + return safe; +}; + +},{"./_wks":81}],40:[function(require,module,exports){ +module.exports = function (done, value) { + return { value: value, done: !!done }; +}; + +},{}],41:[function(require,module,exports){ +module.exports = {}; + +},{}],42:[function(require,module,exports){ +module.exports = false; + +},{}],43:[function(require,module,exports){ +var META = require('./_uid')('meta'); +var isObject = require('./_is-object'); +var has = require('./_has'); +var setDesc = require('./_object-dp').f; +var id = 0; +var isExtensible = Object.isExtensible || function () { + return true; +}; +var FREEZE = !require('./_fails')(function () { + return isExtensible(Object.preventExtensions({})); +}); +var setMeta = function (it) { + setDesc(it, META, { value: { + i: 'O' + ++id, // object ID + w: {} // weak collections IDs + } }); +}; +var fastKey = function (it, create) { + // return primitive with prefix + if (!isObject(it)) return typeof it == 'symbol' ? it : (typeof it == 'string' ? 'S' : 'P') + it; + if (!has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return 'F'; + // not necessary to add metadata + if (!create) return 'E'; + // add missing metadata + setMeta(it); + // return object ID + } return it[META].i; +}; +var getWeak = function (it, create) { + if (!has(it, META)) { + // can't set metadata to uncaught frozen object + if (!isExtensible(it)) return true; + // not necessary to add metadata + if (!create) return false; + // add missing metadata + setMeta(it); + // return hash weak collections IDs + } return it[META].w; +}; +// add metadata on freeze-family methods calling +var onFreeze = function (it) { + if (FREEZE && meta.NEED && isExtensible(it) && !has(it, META)) setMeta(it); + return it; +}; +var meta = module.exports = { + KEY: META, + NEED: false, + fastKey: fastKey, + getWeak: getWeak, + onFreeze: onFreeze +}; + +},{"./_fails":21,"./_has":26,"./_is-object":34,"./_object-dp":45,"./_uid":78}],44:[function(require,module,exports){ +// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) +var anObject = require('./_an-object'); +var dPs = require('./_object-dps'); +var enumBugKeys = require('./_enum-bug-keys'); +var IE_PROTO = require('./_shared-key')('IE_PROTO'); +var Empty = function () { /* empty */ }; +var PROTOTYPE = 'prototype'; + +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var createDict = function () { + // Thrash, waste and sodomy: IE GC bug + var iframe = require('./_dom-create')('iframe'); + var i = enumBugKeys.length; + var lt = '<'; + var gt = '>'; + var iframeDocument; + iframe.style.display = 'none'; + require('./_html').appendChild(iframe); + iframe.src = 'javascript:'; // eslint-disable-line no-script-url + // createDict = iframe.contentWindow.Object; + // html.removeChild(iframe); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while (i--) delete createDict[PROTOTYPE][enumBugKeys[i]]; + return createDict(); +}; + +module.exports = Object.create || function create(O, Properties) { + var result; + if (O !== null) { + Empty[PROTOTYPE] = anObject(O); + result = new Empty(); + Empty[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = createDict(); + return Properties === undefined ? result : dPs(result, Properties); +}; + +},{"./_an-object":4,"./_dom-create":16,"./_enum-bug-keys":17,"./_html":28,"./_object-dps":46,"./_shared-key":64}],45:[function(require,module,exports){ +var anObject = require('./_an-object'); +var IE8_DOM_DEFINE = require('./_ie8-dom-define'); +var toPrimitive = require('./_to-primitive'); +var dP = Object.defineProperty; + +exports.f = require('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes) { + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if (IE8_DOM_DEFINE) try { + return dP(O, P, Attributes); + } catch (e) { /* empty */ } + if ('get' in Attributes || 'set' in Attributes) throw TypeError('Accessors not supported!'); + if ('value' in Attributes) O[P] = Attributes.value; + return O; +}; + +},{"./_an-object":4,"./_descriptors":15,"./_ie8-dom-define":29,"./_to-primitive":77}],46:[function(require,module,exports){ +var dP = require('./_object-dp'); +var anObject = require('./_an-object'); +var getKeys = require('./_object-keys'); + +module.exports = require('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties) { + anObject(O); + var keys = getKeys(Properties); + var length = keys.length; + var i = 0; + var P; + while (length > i) dP.f(O, P = keys[i++], Properties[P]); + return O; +}; + +},{"./_an-object":4,"./_descriptors":15,"./_object-dp":45,"./_object-keys":53}],47:[function(require,module,exports){ +var pIE = require('./_object-pie'); +var createDesc = require('./_property-desc'); +var toIObject = require('./_to-iobject'); +var toPrimitive = require('./_to-primitive'); +var has = require('./_has'); +var IE8_DOM_DEFINE = require('./_ie8-dom-define'); +var gOPD = Object.getOwnPropertyDescriptor; + +exports.f = require('./_descriptors') ? gOPD : function getOwnPropertyDescriptor(O, P) { + O = toIObject(O); + P = toPrimitive(P, true); + if (IE8_DOM_DEFINE) try { + return gOPD(O, P); + } catch (e) { /* empty */ } + if (has(O, P)) return createDesc(!pIE.f.call(O, P), O[P]); +}; + +},{"./_descriptors":15,"./_has":26,"./_ie8-dom-define":29,"./_object-pie":54,"./_property-desc":57,"./_to-iobject":74,"./_to-primitive":77}],48:[function(require,module,exports){ +// fallback for IE11 buggy Object.getOwnPropertyNames with iframe and window +var toIObject = require('./_to-iobject'); +var gOPN = require('./_object-gopn').f; +var toString = {}.toString; + +var windowNames = typeof window == 'object' && window && Object.getOwnPropertyNames + ? Object.getOwnPropertyNames(window) : []; + +var getWindowNames = function (it) { + try { + return gOPN(it); + } catch (e) { + return windowNames.slice(); + } +}; + +module.exports.f = function getOwnPropertyNames(it) { + return windowNames && toString.call(it) == '[object Window]' ? getWindowNames(it) : gOPN(toIObject(it)); +}; + +},{"./_object-gopn":49,"./_to-iobject":74}],49:[function(require,module,exports){ +// 19.1.2.7 / 15.2.3.4 Object.getOwnPropertyNames(O) +var $keys = require('./_object-keys-internal'); +var hiddenKeys = require('./_enum-bug-keys').concat('length', 'prototype'); + +exports.f = Object.getOwnPropertyNames || function getOwnPropertyNames(O) { + return $keys(O, hiddenKeys); +}; + +},{"./_enum-bug-keys":17,"./_object-keys-internal":52}],50:[function(require,module,exports){ +exports.f = Object.getOwnPropertySymbols; + +},{}],51:[function(require,module,exports){ +// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) +var has = require('./_has'); +var toObject = require('./_to-object'); +var IE_PROTO = require('./_shared-key')('IE_PROTO'); +var ObjectProto = Object.prototype; + +module.exports = Object.getPrototypeOf || function (O) { + O = toObject(O); + if (has(O, IE_PROTO)) return O[IE_PROTO]; + if (typeof O.constructor == 'function' && O instanceof O.constructor) { + return O.constructor.prototype; + } return O instanceof Object ? ObjectProto : null; +}; + +},{"./_has":26,"./_shared-key":64,"./_to-object":76}],52:[function(require,module,exports){ +var has = require('./_has'); +var toIObject = require('./_to-iobject'); +var arrayIndexOf = require('./_array-includes')(false); +var IE_PROTO = require('./_shared-key')('IE_PROTO'); + +module.exports = function (object, names) { + var O = toIObject(object); + var i = 0; + var result = []; + var key; + for (key in O) if (key != IE_PROTO) has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while (names.length > i) if (has(O, key = names[i++])) { + ~arrayIndexOf(result, key) || result.push(key); + } + return result; +}; + +},{"./_array-includes":5,"./_has":26,"./_shared-key":64,"./_to-iobject":74}],53:[function(require,module,exports){ +// 19.1.2.14 / 15.2.3.14 Object.keys(O) +var $keys = require('./_object-keys-internal'); +var enumBugKeys = require('./_enum-bug-keys'); + +module.exports = Object.keys || function keys(O) { + return $keys(O, enumBugKeys); +}; + +},{"./_enum-bug-keys":17,"./_object-keys-internal":52}],54:[function(require,module,exports){ +exports.f = {}.propertyIsEnumerable; + +},{}],55:[function(require,module,exports){ +// most Object methods by ES6 should accept primitives +var $export = require('./_export'); +var core = require('./_core'); +var fails = require('./_fails'); +module.exports = function (KEY, exec) { + var fn = (core.Object || {})[KEY] || Object[KEY]; + var exp = {}; + exp[KEY] = exec(fn); + $export($export.S + $export.F * fails(function () { fn(1); }), 'Object', exp); +}; + +},{"./_core":11,"./_export":19,"./_fails":21}],56:[function(require,module,exports){ +// all object keys, includes non-enumerable and symbols +var gOPN = require('./_object-gopn'); +var gOPS = require('./_object-gops'); +var anObject = require('./_an-object'); +var Reflect = require('./_global').Reflect; +module.exports = Reflect && Reflect.ownKeys || function ownKeys(it) { + var keys = gOPN.f(anObject(it)); + var getSymbols = gOPS.f; + return getSymbols ? keys.concat(getSymbols(it)) : keys; +}; + +},{"./_an-object":4,"./_global":25,"./_object-gopn":49,"./_object-gops":50}],57:[function(require,module,exports){ +module.exports = function (bitmap, value) { + return { + enumerable: !(bitmap & 1), + configurable: !(bitmap & 2), + writable: !(bitmap & 4), + value: value + }; +}; + +},{}],58:[function(require,module,exports){ +var global = require('./_global'); +var hide = require('./_hide'); +var has = require('./_has'); +var SRC = require('./_uid')('src'); +var $toString = require('./_function-to-string'); +var TO_STRING = 'toString'; +var TPL = ('' + $toString).split(TO_STRING); + +require('./_core').inspectSource = function (it) { + return $toString.call(it); +}; + +(module.exports = function (O, key, val, safe) { + var isFunction = typeof val == 'function'; + if (isFunction) has(val, 'name') || hide(val, 'name', key); + if (O[key] === val) return; + if (isFunction) has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); + if (O === global) { + O[key] = val; + } else if (!safe) { + delete O[key]; + hide(O, key, val); + } else if (O[key]) { + O[key] = val; + } else { + hide(O, key, val); + } +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +})(Function.prototype, TO_STRING, function toString() { + return typeof this == 'function' && this[SRC] || $toString.call(this); +}); + +},{"./_core":11,"./_function-to-string":24,"./_global":25,"./_has":26,"./_hide":27,"./_uid":78}],59:[function(require,module,exports){ +'use strict'; + +var classof = require('./_classof'); +var builtinExec = RegExp.prototype.exec; + + // `RegExpExec` abstract operation +// https://tc39.github.io/ecma262/#sec-regexpexec +module.exports = function (R, S) { + var exec = R.exec; + if (typeof exec === 'function') { + var result = exec.call(R, S); + if (typeof result !== 'object') { + throw new TypeError('RegExp exec method returned something other than an Object or null'); + } + return result; + } + if (classof(R) !== 'RegExp') { + throw new TypeError('RegExp#exec called on incompatible receiver'); + } + return builtinExec.call(R, S); +}; + +},{"./_classof":9}],60:[function(require,module,exports){ +'use strict'; + +var regexpFlags = require('./_flags'); + +var nativeExec = RegExp.prototype.exec; +// This always refers to the native implementation, because the +// String#replace polyfill uses ./fix-regexp-well-known-symbol-logic.js, +// which loads this file before patching the method. +var nativeReplace = String.prototype.replace; + +var patchedExec = nativeExec; + +var LAST_INDEX = 'lastIndex'; + +var UPDATES_LAST_INDEX_WRONG = (function () { + var re1 = /a/, + re2 = /b*/g; + nativeExec.call(re1, 'a'); + nativeExec.call(re2, 'a'); + return re1[LAST_INDEX] !== 0 || re2[LAST_INDEX] !== 0; +})(); + +// nonparticipating capturing group, copied from es5-shim's String#split patch. +var NPCG_INCLUDED = /()??/.exec('')[1] !== undefined; + +var PATCH = UPDATES_LAST_INDEX_WRONG || NPCG_INCLUDED; + +if (PATCH) { + patchedExec = function exec(str) { + var re = this; + var lastIndex, reCopy, match, i; + + if (NPCG_INCLUDED) { + reCopy = new RegExp('^' + re.source + '$(?!\\s)', regexpFlags.call(re)); + } + if (UPDATES_LAST_INDEX_WRONG) lastIndex = re[LAST_INDEX]; + + match = nativeExec.call(re, str); + + if (UPDATES_LAST_INDEX_WRONG && match) { + re[LAST_INDEX] = re.global ? match.index + match[0].length : lastIndex; + } + if (NPCG_INCLUDED && match && match.length > 1) { + // Fix browsers whose `exec` methods don't consistently return `undefined` + // for NPCG, like IE8. NOTE: This doesn' work for /(.?)?/ + // eslint-disable-next-line no-loop-func + nativeReplace.call(match[0], reCopy, function () { + for (i = 1; i < arguments.length - 2; i++) { + if (arguments[i] === undefined) match[i] = undefined; + } + }); + } + + return match; + }; +} + +module.exports = patchedExec; + +},{"./_flags":23}],61:[function(require,module,exports){ +// Works with __proto__ only. Old v8 can't work with null proto objects. +/* eslint-disable no-proto */ +var isObject = require('./_is-object'); +var anObject = require('./_an-object'); +var check = function (O, proto) { + anObject(O); + if (!isObject(proto) && proto !== null) throw TypeError(proto + ": can't set as prototype!"); +}; +module.exports = { + set: Object.setPrototypeOf || ('__proto__' in {} ? // eslint-disable-line + function (test, buggy, set) { + try { + set = require('./_ctx')(Function.call, require('./_object-gopd').f(Object.prototype, '__proto__').set, 2); + set(test, []); + buggy = !(test instanceof Array); + } catch (e) { buggy = true; } + return function setPrototypeOf(O, proto) { + check(O, proto); + if (buggy) O.__proto__ = proto; + else set(O, proto); + return O; + }; + }({}, false) : undefined), + check: check +}; + +},{"./_an-object":4,"./_ctx":13,"./_is-object":34,"./_object-gopd":47}],62:[function(require,module,exports){ +'use strict'; +var global = require('./_global'); +var dP = require('./_object-dp'); +var DESCRIPTORS = require('./_descriptors'); +var SPECIES = require('./_wks')('species'); + +module.exports = function (KEY) { + var C = global[KEY]; + if (DESCRIPTORS && C && !C[SPECIES]) dP.f(C, SPECIES, { + configurable: true, + get: function () { return this; } + }); +}; + +},{"./_descriptors":15,"./_global":25,"./_object-dp":45,"./_wks":81}],63:[function(require,module,exports){ +var def = require('./_object-dp').f; +var has = require('./_has'); +var TAG = require('./_wks')('toStringTag'); + +module.exports = function (it, tag, stat) { + if (it && !has(it = stat ? it : it.prototype, TAG)) def(it, TAG, { configurable: true, value: tag }); +}; + +},{"./_has":26,"./_object-dp":45,"./_wks":81}],64:[function(require,module,exports){ +var shared = require('./_shared')('keys'); +var uid = require('./_uid'); +module.exports = function (key) { + return shared[key] || (shared[key] = uid(key)); +}; + +},{"./_shared":65,"./_uid":78}],65:[function(require,module,exports){ +var core = require('./_core'); +var global = require('./_global'); +var SHARED = '__core-js_shared__'; +var store = global[SHARED] || (global[SHARED] = {}); + +(module.exports = function (key, value) { + return store[key] || (store[key] = value !== undefined ? value : {}); +})('versions', []).push({ + version: core.version, + mode: require('./_library') ? 'pure' : 'global', + copyright: 'ยฉ 2020 Denis Pushkarev (zloirock.ru)' +}); + +},{"./_core":11,"./_global":25,"./_library":42}],66:[function(require,module,exports){ +// 7.3.20 SpeciesConstructor(O, defaultConstructor) +var anObject = require('./_an-object'); +var aFunction = require('./_a-function'); +var SPECIES = require('./_wks')('species'); +module.exports = function (O, D) { + var C = anObject(O).constructor; + var S; + return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); +}; + +},{"./_a-function":1,"./_an-object":4,"./_wks":81}],67:[function(require,module,exports){ +'use strict'; +var fails = require('./_fails'); + +module.exports = function (method, arg) { + return !!method && fails(function () { + // eslint-disable-next-line no-useless-call + arg ? method.call(null, function () { /* empty */ }, 1) : method.call(null); + }); +}; + +},{"./_fails":21}],68:[function(require,module,exports){ +var toInteger = require('./_to-integer'); +var defined = require('./_defined'); +// true -> String#at +// false -> String#codePointAt +module.exports = function (TO_STRING) { + return function (that, pos) { + var s = String(defined(that)); + var i = toInteger(pos); + var l = s.length; + var a, b; + if (i < 0 || i >= l) return TO_STRING ? '' : undefined; + a = s.charCodeAt(i); + return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff + ? TO_STRING ? s.charAt(i) : a + : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; + }; +}; + +},{"./_defined":14,"./_to-integer":73}],69:[function(require,module,exports){ +// helper for String#{startsWith, endsWith, includes} +var isRegExp = require('./_is-regexp'); +var defined = require('./_defined'); + +module.exports = function (that, searchString, NAME) { + if (isRegExp(searchString)) throw TypeError('String#' + NAME + " doesn't accept regex!"); + return String(defined(that)); +}; + +},{"./_defined":14,"./_is-regexp":35}],70:[function(require,module,exports){ +var $export = require('./_export'); +var defined = require('./_defined'); +var fails = require('./_fails'); +var spaces = require('./_string-ws'); +var space = '[' + spaces + ']'; +var non = '\u200b\u0085'; +var ltrim = RegExp('^' + space + space + '*'); +var rtrim = RegExp(space + space + '*$'); + +var exporter = function (KEY, exec, ALIAS) { + var exp = {}; + var FORCE = fails(function () { + return !!spaces[KEY]() || non[KEY]() != non; + }); + var fn = exp[KEY] = FORCE ? exec(trim) : spaces[KEY]; + if (ALIAS) exp[ALIAS] = fn; + $export($export.P + $export.F * FORCE, 'String', exp); +}; + +// 1 -> String#trimLeft +// 2 -> String#trimRight +// 3 -> String#trim +var trim = exporter.trim = function (string, TYPE) { + string = String(defined(string)); + if (TYPE & 1) string = string.replace(ltrim, ''); + if (TYPE & 2) string = string.replace(rtrim, ''); + return string; +}; + +module.exports = exporter; + +},{"./_defined":14,"./_export":19,"./_fails":21,"./_string-ws":71}],71:[function(require,module,exports){ +module.exports = '\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003' + + '\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF'; + +},{}],72:[function(require,module,exports){ +var toInteger = require('./_to-integer'); +var max = Math.max; +var min = Math.min; +module.exports = function (index, length) { + index = toInteger(index); + return index < 0 ? max(index + length, 0) : min(index, length); +}; + +},{"./_to-integer":73}],73:[function(require,module,exports){ +// 7.1.4 ToInteger +var ceil = Math.ceil; +var floor = Math.floor; +module.exports = function (it) { + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); +}; + +},{}],74:[function(require,module,exports){ +// to indexed object, toObject with fallback for non-array-like ES3 strings +var IObject = require('./_iobject'); +var defined = require('./_defined'); +module.exports = function (it) { + return IObject(defined(it)); +}; + +},{"./_defined":14,"./_iobject":31}],75:[function(require,module,exports){ +// 7.1.15 ToLength +var toInteger = require('./_to-integer'); +var min = Math.min; +module.exports = function (it) { + return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 +}; + +},{"./_to-integer":73}],76:[function(require,module,exports){ +// 7.1.13 ToObject(argument) +var defined = require('./_defined'); +module.exports = function (it) { + return Object(defined(it)); +}; + +},{"./_defined":14}],77:[function(require,module,exports){ +// 7.1.1 ToPrimitive(input [, PreferredType]) +var isObject = require('./_is-object'); +// instead of the ES6 spec version, we didn't implement @@toPrimitive case +// and the second argument - flag - preferred type is a string +module.exports = function (it, S) { + if (!isObject(it)) return it; + var fn, val; + if (S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; + if (typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it))) return val; + if (!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it))) return val; + throw TypeError("Can't convert object to primitive value"); +}; + +},{"./_is-object":34}],78:[function(require,module,exports){ +var id = 0; +var px = Math.random(); +module.exports = function (key) { + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); +}; + +},{}],79:[function(require,module,exports){ +var global = require('./_global'); +var core = require('./_core'); +var LIBRARY = require('./_library'); +var wksExt = require('./_wks-ext'); +var defineProperty = require('./_object-dp').f; +module.exports = function (name) { + var $Symbol = core.Symbol || (core.Symbol = LIBRARY ? {} : global.Symbol || {}); + if (name.charAt(0) != '_' && !(name in $Symbol)) defineProperty($Symbol, name, { value: wksExt.f(name) }); +}; + +},{"./_core":11,"./_global":25,"./_library":42,"./_object-dp":45,"./_wks-ext":80}],80:[function(require,module,exports){ +exports.f = require('./_wks'); + +},{"./_wks":81}],81:[function(require,module,exports){ +var store = require('./_shared')('wks'); +var uid = require('./_uid'); +var Symbol = require('./_global').Symbol; +var USE_SYMBOL = typeof Symbol == 'function'; + +var $exports = module.exports = function (name) { + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); +}; + +$exports.store = store; + +},{"./_global":25,"./_shared":65,"./_uid":78}],82:[function(require,module,exports){ +var classof = require('./_classof'); +var ITERATOR = require('./_wks')('iterator'); +var Iterators = require('./_iterators'); +module.exports = require('./_core').getIteratorMethod = function (it) { + if (it != undefined) return it[ITERATOR] + || it['@@iterator'] + || Iterators[classof(it)]; +}; + +},{"./_classof":9,"./_core":11,"./_iterators":41,"./_wks":81}],83:[function(require,module,exports){ +'use strict'; +var $export = require('./_export'); +var $filter = require('./_array-methods')(2); + +$export($export.P + $export.F * !require('./_strict-method')([].filter, true), 'Array', { + // 22.1.3.7 / 15.4.4.20 Array.prototype.filter(callbackfn [, thisArg]) + filter: function filter(callbackfn /* , thisArg */) { + return $filter(this, callbackfn, arguments[1]); + } +}); + +},{"./_array-methods":6,"./_export":19,"./_strict-method":67}],84:[function(require,module,exports){ +'use strict'; +var ctx = require('./_ctx'); +var $export = require('./_export'); +var toObject = require('./_to-object'); +var call = require('./_iter-call'); +var isArrayIter = require('./_is-array-iter'); +var toLength = require('./_to-length'); +var createProperty = require('./_create-property'); +var getIterFn = require('./core.get-iterator-method'); + +$export($export.S + $export.F * !require('./_iter-detect')(function (iter) { Array.from(iter); }), 'Array', { + // 22.1.2.1 Array.from(arrayLike, mapfn = undefined, thisArg = undefined) + from: function from(arrayLike /* , mapfn = undefined, thisArg = undefined */) { + var O = toObject(arrayLike); + var C = typeof this == 'function' ? this : Array; + var aLen = arguments.length; + var mapfn = aLen > 1 ? arguments[1] : undefined; + var mapping = mapfn !== undefined; + var index = 0; + var iterFn = getIterFn(O); + var length, result, step, iterator; + if (mapping) mapfn = ctx(mapfn, aLen > 2 ? arguments[2] : undefined, 2); + // if object isn't iterable or it's array with default iterator - use simple case + if (iterFn != undefined && !(C == Array && isArrayIter(iterFn))) { + for (iterator = iterFn.call(O), result = new C(); !(step = iterator.next()).done; index++) { + createProperty(result, index, mapping ? call(iterator, mapfn, [step.value, index], true) : step.value); + } + } else { + length = toLength(O.length); + for (result = new C(length); length > index; index++) { + createProperty(result, index, mapping ? mapfn(O[index], index) : O[index]); + } + } + result.length = index; + return result; + } +}); + +},{"./_create-property":12,"./_ctx":13,"./_export":19,"./_is-array-iter":32,"./_iter-call":36,"./_iter-detect":39,"./_to-length":75,"./_to-object":76,"./core.get-iterator-method":82}],85:[function(require,module,exports){ +'use strict'; +var addToUnscopables = require('./_add-to-unscopables'); +var step = require('./_iter-step'); +var Iterators = require('./_iterators'); +var toIObject = require('./_to-iobject'); + +// 22.1.3.4 Array.prototype.entries() +// 22.1.3.13 Array.prototype.keys() +// 22.1.3.29 Array.prototype.values() +// 22.1.3.30 Array.prototype[@@iterator]() +module.exports = require('./_iter-define')(Array, 'Array', function (iterated, kind) { + this._t = toIObject(iterated); // target + this._i = 0; // next index + this._k = kind; // kind +// 22.1.5.2.1 %ArrayIteratorPrototype%.next() +}, function () { + var O = this._t; + var kind = this._k; + var index = this._i++; + if (!O || index >= O.length) { + this._t = undefined; + return step(1); + } + if (kind == 'keys') return step(0, index); + if (kind == 'values') return step(0, O[index]); + return step(0, [index, O[index]]); +}, 'values'); + +// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) +Iterators.Arguments = Iterators.Array; + +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); + +},{"./_add-to-unscopables":2,"./_iter-define":38,"./_iter-step":40,"./_iterators":41,"./_to-iobject":74}],86:[function(require,module,exports){ +'use strict'; +var $export = require('./_export'); +var $map = require('./_array-methods')(1); + +$export($export.P + $export.F * !require('./_strict-method')([].map, true), 'Array', { + // 22.1.3.15 / 15.4.4.19 Array.prototype.map(callbackfn [, thisArg]) + map: function map(callbackfn /* , thisArg */) { + return $map(this, callbackfn, arguments[1]); + } +}); + +},{"./_array-methods":6,"./_export":19,"./_strict-method":67}],87:[function(require,module,exports){ +'use strict'; +var $export = require('./_export'); +var html = require('./_html'); +var cof = require('./_cof'); +var toAbsoluteIndex = require('./_to-absolute-index'); +var toLength = require('./_to-length'); +var arraySlice = [].slice; + +// fallback for not array-like ES3 strings and DOM objects +$export($export.P + $export.F * require('./_fails')(function () { + if (html) arraySlice.call(html); +}), 'Array', { + slice: function slice(begin, end) { + var len = toLength(this.length); + var klass = cof(this); + end = end === undefined ? len : end; + if (klass == 'Array') return arraySlice.call(this, begin, end); + var start = toAbsoluteIndex(begin, len); + var upTo = toAbsoluteIndex(end, len); + var size = toLength(upTo - start); + var cloned = new Array(size); + var i = 0; + for (; i < size; i++) cloned[i] = klass == 'String' + ? this.charAt(start + i) + : this[start + i]; + return cloned; + } +}); + +},{"./_cof":10,"./_export":19,"./_fails":21,"./_html":28,"./_to-absolute-index":72,"./_to-length":75}],88:[function(require,module,exports){ +'use strict'; +var global = require('./_global'); +var has = require('./_has'); +var cof = require('./_cof'); +var inheritIfRequired = require('./_inherit-if-required'); +var toPrimitive = require('./_to-primitive'); +var fails = require('./_fails'); +var gOPN = require('./_object-gopn').f; +var gOPD = require('./_object-gopd').f; +var dP = require('./_object-dp').f; +var $trim = require('./_string-trim').trim; +var NUMBER = 'Number'; +var $Number = global[NUMBER]; +var Base = $Number; +var proto = $Number.prototype; +// Opera ~12 has broken Object#toString +var BROKEN_COF = cof(require('./_object-create')(proto)) == NUMBER; +var TRIM = 'trim' in String.prototype; + +// 7.1.3 ToNumber(argument) +var toNumber = function (argument) { + var it = toPrimitive(argument, false); + if (typeof it == 'string' && it.length > 2) { + it = TRIM ? it.trim() : $trim(it, 3); + var first = it.charCodeAt(0); + var third, radix, maxCode; + if (first === 43 || first === 45) { + third = it.charCodeAt(2); + if (third === 88 || third === 120) return NaN; // Number('+0x1') should be NaN, old V8 fix + } else if (first === 48) { + switch (it.charCodeAt(1)) { + case 66: case 98: radix = 2; maxCode = 49; break; // fast equal /^0b[01]+$/i + case 79: case 111: radix = 8; maxCode = 55; break; // fast equal /^0o[0-7]+$/i + default: return +it; + } + for (var digits = it.slice(2), i = 0, l = digits.length, code; i < l; i++) { + code = digits.charCodeAt(i); + // parseInt parses a string to a first unavailable symbol + // but ToNumber should return NaN if a string contains unavailable symbols + if (code < 48 || code > maxCode) return NaN; + } return parseInt(digits, radix); + } + } return +it; +}; + +if (!$Number(' 0o1') || !$Number('0b1') || $Number('+0x1')) { + $Number = function Number(value) { + var it = arguments.length < 1 ? 0 : value; + var that = this; + return that instanceof $Number + // check on 1..constructor(foo) case + && (BROKEN_COF ? fails(function () { proto.valueOf.call(that); }) : cof(that) != NUMBER) + ? inheritIfRequired(new Base(toNumber(it)), that, $Number) : toNumber(it); + }; + for (var keys = require('./_descriptors') ? gOPN(Base) : ( + // ES3: + 'MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,' + + // ES6 (in case, if modules with ES6 Number statics required before): + 'EPSILON,isFinite,isInteger,isNaN,isSafeInteger,MAX_SAFE_INTEGER,' + + 'MIN_SAFE_INTEGER,parseFloat,parseInt,isInteger' + ).split(','), j = 0, key; keys.length > j; j++) { + if (has(Base, key = keys[j]) && !has($Number, key)) { + dP($Number, key, gOPD(Base, key)); + } + } + $Number.prototype = proto; + proto.constructor = $Number; + require('./_redefine')(global, NUMBER, $Number); +} + +},{"./_cof":10,"./_descriptors":15,"./_fails":21,"./_global":25,"./_has":26,"./_inherit-if-required":30,"./_object-create":44,"./_object-dp":45,"./_object-gopd":47,"./_object-gopn":49,"./_redefine":58,"./_string-trim":70,"./_to-primitive":77}],89:[function(require,module,exports){ +// 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) +var toIObject = require('./_to-iobject'); +var $getOwnPropertyDescriptor = require('./_object-gopd').f; + +require('./_object-sap')('getOwnPropertyDescriptor', function () { + return function getOwnPropertyDescriptor(it, key) { + return $getOwnPropertyDescriptor(toIObject(it), key); + }; +}); + +},{"./_object-gopd":47,"./_object-sap":55,"./_to-iobject":74}],90:[function(require,module,exports){ +// 19.1.2.14 Object.keys(O) +var toObject = require('./_to-object'); +var $keys = require('./_object-keys'); + +require('./_object-sap')('keys', function () { + return function keys(it) { + return $keys(toObject(it)); + }; +}); + +},{"./_object-keys":53,"./_object-sap":55,"./_to-object":76}],91:[function(require,module,exports){ +'use strict'; +// 19.1.3.6 Object.prototype.toString() +var classof = require('./_classof'); +var test = {}; +test[require('./_wks')('toStringTag')] = 'z'; +if (test + '' != '[object z]') { + require('./_redefine')(Object.prototype, 'toString', function toString() { + return '[object ' + classof(this) + ']'; + }, true); +} + +},{"./_classof":9,"./_redefine":58,"./_wks":81}],92:[function(require,module,exports){ +var global = require('./_global'); +var inheritIfRequired = require('./_inherit-if-required'); +var dP = require('./_object-dp').f; +var gOPN = require('./_object-gopn').f; +var isRegExp = require('./_is-regexp'); +var $flags = require('./_flags'); +var $RegExp = global.RegExp; +var Base = $RegExp; +var proto = $RegExp.prototype; +var re1 = /a/g; +var re2 = /a/g; +// "new" creates a new object, old webkit buggy here +var CORRECT_NEW = new $RegExp(re1) !== re1; + +if (require('./_descriptors') && (!CORRECT_NEW || require('./_fails')(function () { + re2[require('./_wks')('match')] = false; + // RegExp constructor can alter flags and IsRegExp works correct with @@match + return $RegExp(re1) != re1 || $RegExp(re2) == re2 || $RegExp(re1, 'i') != '/a/i'; +}))) { + $RegExp = function RegExp(p, f) { + var tiRE = this instanceof $RegExp; + var piRE = isRegExp(p); + var fiU = f === undefined; + return !tiRE && piRE && p.constructor === $RegExp && fiU ? p + : inheritIfRequired(CORRECT_NEW + ? new Base(piRE && !fiU ? p.source : p, f) + : Base((piRE = p instanceof $RegExp) ? p.source : p, piRE && fiU ? $flags.call(p) : f) + , tiRE ? this : proto, $RegExp); + }; + var proxy = function (key) { + key in $RegExp || dP($RegExp, key, { + configurable: true, + get: function () { return Base[key]; }, + set: function (it) { Base[key] = it; } + }); + }; + for (var keys = gOPN(Base), i = 0; keys.length > i;) proxy(keys[i++]); + proto.constructor = $RegExp; + $RegExp.prototype = proto; + require('./_redefine')(global, 'RegExp', $RegExp); +} + +require('./_set-species')('RegExp'); + +},{"./_descriptors":15,"./_fails":21,"./_flags":23,"./_global":25,"./_inherit-if-required":30,"./_is-regexp":35,"./_object-dp":45,"./_object-gopn":49,"./_redefine":58,"./_set-species":62,"./_wks":81}],93:[function(require,module,exports){ +'use strict'; +var regexpExec = require('./_regexp-exec'); +require('./_export')({ + target: 'RegExp', + proto: true, + forced: regexpExec !== /./.exec +}, { + exec: regexpExec +}); + +},{"./_export":19,"./_regexp-exec":60}],94:[function(require,module,exports){ +'use strict'; + +var anObject = require('./_an-object'); +var toLength = require('./_to-length'); +var advanceStringIndex = require('./_advance-string-index'); +var regExpExec = require('./_regexp-exec-abstract'); + +// @@match logic +require('./_fix-re-wks')('match', 1, function (defined, MATCH, $match, maybeCallNative) { + return [ + // `String.prototype.match` method + // https://tc39.github.io/ecma262/#sec-string.prototype.match + function match(regexp) { + var O = defined(this); + var fn = regexp == undefined ? undefined : regexp[MATCH]; + return fn !== undefined ? fn.call(regexp, O) : new RegExp(regexp)[MATCH](String(O)); + }, + // `RegExp.prototype[@@match]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@match + function (regexp) { + var res = maybeCallNative($match, regexp, this); + if (res.done) return res.value; + var rx = anObject(regexp); + var S = String(this); + if (!rx.global) return regExpExec(rx, S); + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + var A = []; + var n = 0; + var result; + while ((result = regExpExec(rx, S)) !== null) { + var matchStr = String(result[0]); + A[n] = matchStr; + if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); + n++; + } + return n === 0 ? null : A; + } + ]; +}); + +},{"./_advance-string-index":3,"./_an-object":4,"./_fix-re-wks":22,"./_regexp-exec-abstract":59,"./_to-length":75}],95:[function(require,module,exports){ +'use strict'; + +var anObject = require('./_an-object'); +var toObject = require('./_to-object'); +var toLength = require('./_to-length'); +var toInteger = require('./_to-integer'); +var advanceStringIndex = require('./_advance-string-index'); +var regExpExec = require('./_regexp-exec-abstract'); +var max = Math.max; +var min = Math.min; +var floor = Math.floor; +var SUBSTITUTION_SYMBOLS = /\$([$&`']|\d\d?|<[^>]*>)/g; +var SUBSTITUTION_SYMBOLS_NO_NAMED = /\$([$&`']|\d\d?)/g; + +var maybeToString = function (it) { + return it === undefined ? it : String(it); +}; + +// @@replace logic +require('./_fix-re-wks')('replace', 2, function (defined, REPLACE, $replace, maybeCallNative) { + return [ + // `String.prototype.replace` method + // https://tc39.github.io/ecma262/#sec-string.prototype.replace + function replace(searchValue, replaceValue) { + var O = defined(this); + var fn = searchValue == undefined ? undefined : searchValue[REPLACE]; + return fn !== undefined + ? fn.call(searchValue, O, replaceValue) + : $replace.call(String(O), searchValue, replaceValue); + }, + // `RegExp.prototype[@@replace]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@replace + function (regexp, replaceValue) { + var res = maybeCallNative($replace, regexp, this, replaceValue); + if (res.done) return res.value; + + var rx = anObject(regexp); + var S = String(this); + var functionalReplace = typeof replaceValue === 'function'; + if (!functionalReplace) replaceValue = String(replaceValue); + var global = rx.global; + if (global) { + var fullUnicode = rx.unicode; + rx.lastIndex = 0; + } + var results = []; + while (true) { + var result = regExpExec(rx, S); + if (result === null) break; + results.push(result); + if (!global) break; + var matchStr = String(result[0]); + if (matchStr === '') rx.lastIndex = advanceStringIndex(S, toLength(rx.lastIndex), fullUnicode); + } + var accumulatedResult = ''; + var nextSourcePosition = 0; + for (var i = 0; i < results.length; i++) { + result = results[i]; + var matched = String(result[0]); + var position = max(min(toInteger(result.index), S.length), 0); + var captures = []; + // NOTE: This is equivalent to + // captures = result.slice(1).map(maybeToString) + // but for some reason `nativeSlice.call(result, 1, result.length)` (called in + // the slice polyfill when slicing native arrays) "doesn't work" in safari 9 and + // causes a crash (https://pastebin.com/N21QzeQA) when trying to debug it. + for (var j = 1; j < result.length; j++) captures.push(maybeToString(result[j])); + var namedCaptures = result.groups; + if (functionalReplace) { + var replacerArgs = [matched].concat(captures, position, S); + if (namedCaptures !== undefined) replacerArgs.push(namedCaptures); + var replacement = String(replaceValue.apply(undefined, replacerArgs)); + } else { + replacement = getSubstitution(matched, S, position, captures, namedCaptures, replaceValue); + } + if (position >= nextSourcePosition) { + accumulatedResult += S.slice(nextSourcePosition, position) + replacement; + nextSourcePosition = position + matched.length; + } + } + return accumulatedResult + S.slice(nextSourcePosition); + } + ]; + + // https://tc39.github.io/ecma262/#sec-getsubstitution + function getSubstitution(matched, str, position, captures, namedCaptures, replacement) { + var tailPos = position + matched.length; + var m = captures.length; + var symbols = SUBSTITUTION_SYMBOLS_NO_NAMED; + if (namedCaptures !== undefined) { + namedCaptures = toObject(namedCaptures); + symbols = SUBSTITUTION_SYMBOLS; + } + return $replace.call(replacement, symbols, function (match, ch) { + var capture; + switch (ch.charAt(0)) { + case '$': return '$'; + case '&': return matched; + case '`': return str.slice(0, position); + case "'": return str.slice(tailPos); + case '<': + capture = namedCaptures[ch.slice(1, -1)]; + break; + default: // \d\d? + var n = +ch; + if (n === 0) return match; + if (n > m) { + var f = floor(n / 10); + if (f === 0) return match; + if (f <= m) return captures[f - 1] === undefined ? ch.charAt(1) : captures[f - 1] + ch.charAt(1); + return match; + } + capture = captures[n - 1]; + } + return capture === undefined ? '' : capture; + }); + } +}); + +},{"./_advance-string-index":3,"./_an-object":4,"./_fix-re-wks":22,"./_regexp-exec-abstract":59,"./_to-integer":73,"./_to-length":75,"./_to-object":76}],96:[function(require,module,exports){ +'use strict'; + +var isRegExp = require('./_is-regexp'); +var anObject = require('./_an-object'); +var speciesConstructor = require('./_species-constructor'); +var advanceStringIndex = require('./_advance-string-index'); +var toLength = require('./_to-length'); +var callRegExpExec = require('./_regexp-exec-abstract'); +var regexpExec = require('./_regexp-exec'); +var fails = require('./_fails'); +var $min = Math.min; +var $push = [].push; +var $SPLIT = 'split'; +var LENGTH = 'length'; +var LAST_INDEX = 'lastIndex'; +var MAX_UINT32 = 0xffffffff; + +// babel-minify transpiles RegExp('x', 'y') -> /x/y and it causes SyntaxError +var SUPPORTS_Y = !fails(function () { RegExp(MAX_UINT32, 'y'); }); + +// @@split logic +require('./_fix-re-wks')('split', 2, function (defined, SPLIT, $split, maybeCallNative) { + var internalSplit; + if ( + 'abbc'[$SPLIT](/(b)*/)[1] == 'c' || + 'test'[$SPLIT](/(?:)/, -1)[LENGTH] != 4 || + 'ab'[$SPLIT](/(?:ab)*/)[LENGTH] != 2 || + '.'[$SPLIT](/(.?)(.?)/)[LENGTH] != 4 || + '.'[$SPLIT](/()()/)[LENGTH] > 1 || + ''[$SPLIT](/.?/)[LENGTH] + ) { + // based on es5-shim implementation, need to rework it + internalSplit = function (separator, limit) { + var string = String(this); + if (separator === undefined && limit === 0) return []; + // If `separator` is not a regex, use native split + if (!isRegExp(separator)) return $split.call(string, separator, limit); + var output = []; + var flags = (separator.ignoreCase ? 'i' : '') + + (separator.multiline ? 'm' : '') + + (separator.unicode ? 'u' : '') + + (separator.sticky ? 'y' : ''); + var lastLastIndex = 0; + var splitLimit = limit === undefined ? MAX_UINT32 : limit >>> 0; + // Make `global` and avoid `lastIndex` issues by working with a copy + var separatorCopy = new RegExp(separator.source, flags + 'g'); + var match, lastIndex, lastLength; + while (match = regexpExec.call(separatorCopy, string)) { + lastIndex = separatorCopy[LAST_INDEX]; + if (lastIndex > lastLastIndex) { + output.push(string.slice(lastLastIndex, match.index)); + if (match[LENGTH] > 1 && match.index < string[LENGTH]) $push.apply(output, match.slice(1)); + lastLength = match[0][LENGTH]; + lastLastIndex = lastIndex; + if (output[LENGTH] >= splitLimit) break; + } + if (separatorCopy[LAST_INDEX] === match.index) separatorCopy[LAST_INDEX]++; // Avoid an infinite loop + } + if (lastLastIndex === string[LENGTH]) { + if (lastLength || !separatorCopy.test('')) output.push(''); + } else output.push(string.slice(lastLastIndex)); + return output[LENGTH] > splitLimit ? output.slice(0, splitLimit) : output; + }; + // Chakra, V8 + } else if ('0'[$SPLIT](undefined, 0)[LENGTH]) { + internalSplit = function (separator, limit) { + return separator === undefined && limit === 0 ? [] : $split.call(this, separator, limit); + }; + } else { + internalSplit = $split; + } + + return [ + // `String.prototype.split` method + // https://tc39.github.io/ecma262/#sec-string.prototype.split + function split(separator, limit) { + var O = defined(this); + var splitter = separator == undefined ? undefined : separator[SPLIT]; + return splitter !== undefined + ? splitter.call(separator, O, limit) + : internalSplit.call(String(O), separator, limit); + }, + // `RegExp.prototype[@@split]` method + // https://tc39.github.io/ecma262/#sec-regexp.prototype-@@split + // + // NOTE: This cannot be properly polyfilled in engines that don't support + // the 'y' flag. + function (regexp, limit) { + var res = maybeCallNative(internalSplit, regexp, this, limit, internalSplit !== $split); + if (res.done) return res.value; + + var rx = anObject(regexp); + var S = String(this); + var C = speciesConstructor(rx, RegExp); + + var unicodeMatching = rx.unicode; + var flags = (rx.ignoreCase ? 'i' : '') + + (rx.multiline ? 'm' : '') + + (rx.unicode ? 'u' : '') + + (SUPPORTS_Y ? 'y' : 'g'); + + // ^(? + rx + ) is needed, in combination with some S slicing, to + // simulate the 'y' flag. + var splitter = new C(SUPPORTS_Y ? rx : '^(?:' + rx.source + ')', flags); + var lim = limit === undefined ? MAX_UINT32 : limit >>> 0; + if (lim === 0) return []; + if (S.length === 0) return callRegExpExec(splitter, S) === null ? [S] : []; + var p = 0; + var q = 0; + var A = []; + while (q < S.length) { + splitter.lastIndex = SUPPORTS_Y ? q : 0; + var z = callRegExpExec(splitter, SUPPORTS_Y ? S : S.slice(q)); + var e; + if ( + z === null || + (e = $min(toLength(splitter.lastIndex + (SUPPORTS_Y ? 0 : q)), S.length)) === p + ) { + q = advanceStringIndex(S, q, unicodeMatching); + } else { + A.push(S.slice(p, q)); + if (A.length === lim) return A; + for (var i = 1; i <= z.length - 1; i++) { + A.push(z[i]); + if (A.length === lim) return A; + } + q = p = e; + } + } + A.push(S.slice(p)); + return A; + } + ]; +}); + +},{"./_advance-string-index":3,"./_an-object":4,"./_fails":21,"./_fix-re-wks":22,"./_is-regexp":35,"./_regexp-exec":60,"./_regexp-exec-abstract":59,"./_species-constructor":66,"./_to-length":75}],97:[function(require,module,exports){ +// 21.1.3.7 String.prototype.includes(searchString, position = 0) +'use strict'; +var $export = require('./_export'); +var context = require('./_string-context'); +var INCLUDES = 'includes'; + +$export($export.P + $export.F * require('./_fails-is-regexp')(INCLUDES), 'String', { + includes: function includes(searchString /* , position = 0 */) { + return !!~context(this, searchString, INCLUDES) + .indexOf(searchString, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +},{"./_export":19,"./_fails-is-regexp":20,"./_string-context":69}],98:[function(require,module,exports){ +'use strict'; +var $at = require('./_string-at')(true); + +// 21.1.3.27 String.prototype[@@iterator]() +require('./_iter-define')(String, 'String', function (iterated) { + this._t = String(iterated); // target + this._i = 0; // next index +// 21.1.5.2.1 %StringIteratorPrototype%.next() +}, function () { + var O = this._t; + var index = this._i; + var point; + if (index >= O.length) return { value: undefined, done: true }; + point = $at(O, index); + this._i += point.length; + return { value: point, done: false }; +}); + +},{"./_iter-define":38,"./_string-at":68}],99:[function(require,module,exports){ +'use strict'; +// ECMAScript 6 symbols shim +var global = require('./_global'); +var has = require('./_has'); +var DESCRIPTORS = require('./_descriptors'); +var $export = require('./_export'); +var redefine = require('./_redefine'); +var META = require('./_meta').KEY; +var $fails = require('./_fails'); +var shared = require('./_shared'); +var setToStringTag = require('./_set-to-string-tag'); +var uid = require('./_uid'); +var wks = require('./_wks'); +var wksExt = require('./_wks-ext'); +var wksDefine = require('./_wks-define'); +var enumKeys = require('./_enum-keys'); +var isArray = require('./_is-array'); +var anObject = require('./_an-object'); +var isObject = require('./_is-object'); +var toObject = require('./_to-object'); +var toIObject = require('./_to-iobject'); +var toPrimitive = require('./_to-primitive'); +var createDesc = require('./_property-desc'); +var _create = require('./_object-create'); +var gOPNExt = require('./_object-gopn-ext'); +var $GOPD = require('./_object-gopd'); +var $GOPS = require('./_object-gops'); +var $DP = require('./_object-dp'); +var $keys = require('./_object-keys'); +var gOPD = $GOPD.f; +var dP = $DP.f; +var gOPN = gOPNExt.f; +var $Symbol = global.Symbol; +var $JSON = global.JSON; +var _stringify = $JSON && $JSON.stringify; +var PROTOTYPE = 'prototype'; +var HIDDEN = wks('_hidden'); +var TO_PRIMITIVE = wks('toPrimitive'); +var isEnum = {}.propertyIsEnumerable; +var SymbolRegistry = shared('symbol-registry'); +var AllSymbols = shared('symbols'); +var OPSymbols = shared('op-symbols'); +var ObjectProto = Object[PROTOTYPE]; +var USE_NATIVE = typeof $Symbol == 'function' && !!$GOPS.f; +var QObject = global.QObject; +// Don't use setters in Qt Script, https://github.com/zloirock/core-js/issues/173 +var setter = !QObject || !QObject[PROTOTYPE] || !QObject[PROTOTYPE].findChild; + +// fallback for old Android, https://code.google.com/p/v8/issues/detail?id=687 +var setSymbolDesc = DESCRIPTORS && $fails(function () { + return _create(dP({}, 'a', { + get: function () { return dP(this, 'a', { value: 7 }).a; } + })).a != 7; +}) ? function (it, key, D) { + var protoDesc = gOPD(ObjectProto, key); + if (protoDesc) delete ObjectProto[key]; + dP(it, key, D); + if (protoDesc && it !== ObjectProto) dP(ObjectProto, key, protoDesc); +} : dP; + +var wrap = function (tag) { + var sym = AllSymbols[tag] = _create($Symbol[PROTOTYPE]); + sym._k = tag; + return sym; +}; + +var isSymbol = USE_NATIVE && typeof $Symbol.iterator == 'symbol' ? function (it) { + return typeof it == 'symbol'; +} : function (it) { + return it instanceof $Symbol; +}; + +var $defineProperty = function defineProperty(it, key, D) { + if (it === ObjectProto) $defineProperty(OPSymbols, key, D); + anObject(it); + key = toPrimitive(key, true); + anObject(D); + if (has(AllSymbols, key)) { + if (!D.enumerable) { + if (!has(it, HIDDEN)) dP(it, HIDDEN, createDesc(1, {})); + it[HIDDEN][key] = true; + } else { + if (has(it, HIDDEN) && it[HIDDEN][key]) it[HIDDEN][key] = false; + D = _create(D, { enumerable: createDesc(0, false) }); + } return setSymbolDesc(it, key, D); + } return dP(it, key, D); +}; +var $defineProperties = function defineProperties(it, P) { + anObject(it); + var keys = enumKeys(P = toIObject(P)); + var i = 0; + var l = keys.length; + var key; + while (l > i) $defineProperty(it, key = keys[i++], P[key]); + return it; +}; +var $create = function create(it, P) { + return P === undefined ? _create(it) : $defineProperties(_create(it), P); +}; +var $propertyIsEnumerable = function propertyIsEnumerable(key) { + var E = isEnum.call(this, key = toPrimitive(key, true)); + if (this === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return false; + return E || !has(this, key) || !has(AllSymbols, key) || has(this, HIDDEN) && this[HIDDEN][key] ? E : true; +}; +var $getOwnPropertyDescriptor = function getOwnPropertyDescriptor(it, key) { + it = toIObject(it); + key = toPrimitive(key, true); + if (it === ObjectProto && has(AllSymbols, key) && !has(OPSymbols, key)) return; + var D = gOPD(it, key); + if (D && has(AllSymbols, key) && !(has(it, HIDDEN) && it[HIDDEN][key])) D.enumerable = true; + return D; +}; +var $getOwnPropertyNames = function getOwnPropertyNames(it) { + var names = gOPN(toIObject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (!has(AllSymbols, key = names[i++]) && key != HIDDEN && key != META) result.push(key); + } return result; +}; +var $getOwnPropertySymbols = function getOwnPropertySymbols(it) { + var IS_OP = it === ObjectProto; + var names = gOPN(IS_OP ? OPSymbols : toIObject(it)); + var result = []; + var i = 0; + var key; + while (names.length > i) { + if (has(AllSymbols, key = names[i++]) && (IS_OP ? has(ObjectProto, key) : true)) result.push(AllSymbols[key]); + } return result; +}; + +// 19.4.1.1 Symbol([description]) +if (!USE_NATIVE) { + $Symbol = function Symbol() { + if (this instanceof $Symbol) throw TypeError('Symbol is not a constructor!'); + var tag = uid(arguments.length > 0 ? arguments[0] : undefined); + var $set = function (value) { + if (this === ObjectProto) $set.call(OPSymbols, value); + if (has(this, HIDDEN) && has(this[HIDDEN], tag)) this[HIDDEN][tag] = false; + setSymbolDesc(this, tag, createDesc(1, value)); + }; + if (DESCRIPTORS && setter) setSymbolDesc(ObjectProto, tag, { configurable: true, set: $set }); + return wrap(tag); + }; + redefine($Symbol[PROTOTYPE], 'toString', function toString() { + return this._k; + }); + + $GOPD.f = $getOwnPropertyDescriptor; + $DP.f = $defineProperty; + require('./_object-gopn').f = gOPNExt.f = $getOwnPropertyNames; + require('./_object-pie').f = $propertyIsEnumerable; + $GOPS.f = $getOwnPropertySymbols; + + if (DESCRIPTORS && !require('./_library')) { + redefine(ObjectProto, 'propertyIsEnumerable', $propertyIsEnumerable, true); + } + + wksExt.f = function (name) { + return wrap(wks(name)); + }; +} + +$export($export.G + $export.W + $export.F * !USE_NATIVE, { Symbol: $Symbol }); + +for (var es6Symbols = ( + // 19.4.2.2, 19.4.2.3, 19.4.2.4, 19.4.2.6, 19.4.2.8, 19.4.2.9, 19.4.2.10, 19.4.2.11, 19.4.2.12, 19.4.2.13, 19.4.2.14 + 'hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables' +).split(','), j = 0; es6Symbols.length > j;)wks(es6Symbols[j++]); + +for (var wellKnownSymbols = $keys(wks.store), k = 0; wellKnownSymbols.length > k;) wksDefine(wellKnownSymbols[k++]); + +$export($export.S + $export.F * !USE_NATIVE, 'Symbol', { + // 19.4.2.1 Symbol.for(key) + 'for': function (key) { + return has(SymbolRegistry, key += '') + ? SymbolRegistry[key] + : SymbolRegistry[key] = $Symbol(key); + }, + // 19.4.2.5 Symbol.keyFor(sym) + keyFor: function keyFor(sym) { + if (!isSymbol(sym)) throw TypeError(sym + ' is not a symbol!'); + for (var key in SymbolRegistry) if (SymbolRegistry[key] === sym) return key; + }, + useSetter: function () { setter = true; }, + useSimple: function () { setter = false; } +}); + +$export($export.S + $export.F * !USE_NATIVE, 'Object', { + // 19.1.2.2 Object.create(O [, Properties]) + create: $create, + // 19.1.2.4 Object.defineProperty(O, P, Attributes) + defineProperty: $defineProperty, + // 19.1.2.3 Object.defineProperties(O, Properties) + defineProperties: $defineProperties, + // 19.1.2.6 Object.getOwnPropertyDescriptor(O, P) + getOwnPropertyDescriptor: $getOwnPropertyDescriptor, + // 19.1.2.7 Object.getOwnPropertyNames(O) + getOwnPropertyNames: $getOwnPropertyNames, + // 19.1.2.8 Object.getOwnPropertySymbols(O) + getOwnPropertySymbols: $getOwnPropertySymbols +}); + +// Chrome 38 and 39 `Object.getOwnPropertySymbols` fails on primitives +// https://bugs.chromium.org/p/v8/issues/detail?id=3443 +var FAILS_ON_PRIMITIVES = $fails(function () { $GOPS.f(1); }); + +$export($export.S + $export.F * FAILS_ON_PRIMITIVES, 'Object', { + getOwnPropertySymbols: function getOwnPropertySymbols(it) { + return $GOPS.f(toObject(it)); + } +}); + +// 24.3.2 JSON.stringify(value [, replacer [, space]]) +$JSON && $export($export.S + $export.F * (!USE_NATIVE || $fails(function () { + var S = $Symbol(); + // MS Edge converts symbol values to JSON as {} + // WebKit converts symbol values to JSON as null + // V8 throws on boxed symbols + return _stringify([S]) != '[null]' || _stringify({ a: S }) != '{}' || _stringify(Object(S)) != '{}'; +})), 'JSON', { + stringify: function stringify(it) { + var args = [it]; + var i = 1; + var replacer, $replacer; + while (arguments.length > i) args.push(arguments[i++]); + $replacer = replacer = args[1]; + if (!isObject(replacer) && it === undefined || isSymbol(it)) return; // IE8 returns string on undefined + if (!isArray(replacer)) replacer = function (key, value) { + if (typeof $replacer == 'function') value = $replacer.call(this, key, value); + if (!isSymbol(value)) return value; + }; + args[1] = replacer; + return _stringify.apply($JSON, args); + } +}); + +// 19.4.3.4 Symbol.prototype[@@toPrimitive](hint) +$Symbol[PROTOTYPE][TO_PRIMITIVE] || require('./_hide')($Symbol[PROTOTYPE], TO_PRIMITIVE, $Symbol[PROTOTYPE].valueOf); +// 19.4.3.5 Symbol.prototype[@@toStringTag] +setToStringTag($Symbol, 'Symbol'); +// 20.2.1.9 Math[@@toStringTag] +setToStringTag(Math, 'Math', true); +// 24.3.3 JSON[@@toStringTag] +setToStringTag(global.JSON, 'JSON', true); + +},{"./_an-object":4,"./_descriptors":15,"./_enum-keys":18,"./_export":19,"./_fails":21,"./_global":25,"./_has":26,"./_hide":27,"./_is-array":33,"./_is-object":34,"./_library":42,"./_meta":43,"./_object-create":44,"./_object-dp":45,"./_object-gopd":47,"./_object-gopn":49,"./_object-gopn-ext":48,"./_object-gops":50,"./_object-keys":53,"./_object-pie":54,"./_property-desc":57,"./_redefine":58,"./_set-to-string-tag":63,"./_shared":65,"./_to-iobject":74,"./_to-object":76,"./_to-primitive":77,"./_uid":78,"./_wks":81,"./_wks-define":79,"./_wks-ext":80}],100:[function(require,module,exports){ +'use strict'; +// https://github.com/tc39/Array.prototype.includes +var $export = require('./_export'); +var $includes = require('./_array-includes')(true); + +$export($export.P, 'Array', { + includes: function includes(el /* , fromIndex = 0 */) { + return $includes(this, el, arguments.length > 1 ? arguments[1] : undefined); + } +}); + +require('./_add-to-unscopables')('includes'); + +},{"./_add-to-unscopables":2,"./_array-includes":5,"./_export":19}],101:[function(require,module,exports){ +// https://github.com/tc39/proposal-object-getownpropertydescriptors +var $export = require('./_export'); +var ownKeys = require('./_own-keys'); +var toIObject = require('./_to-iobject'); +var gOPD = require('./_object-gopd'); +var createProperty = require('./_create-property'); + +$export($export.S, 'Object', { + getOwnPropertyDescriptors: function getOwnPropertyDescriptors(object) { + var O = toIObject(object); + var getDesc = gOPD.f; + var keys = ownKeys(O); + var result = {}; + var i = 0; + var key, desc; + while (keys.length > i) { + desc = getDesc(O, key = keys[i++]); + if (desc !== undefined) createProperty(result, key, desc); + } + return result; + } +}); + +},{"./_create-property":12,"./_export":19,"./_object-gopd":47,"./_own-keys":56,"./_to-iobject":74}],102:[function(require,module,exports){ +var $iterators = require('./es6.array.iterator'); +var getKeys = require('./_object-keys'); +var redefine = require('./_redefine'); +var global = require('./_global'); +var hide = require('./_hide'); +var Iterators = require('./_iterators'); +var wks = require('./_wks'); +var ITERATOR = wks('iterator'); +var TO_STRING_TAG = wks('toStringTag'); +var ArrayValues = Iterators.Array; + +var DOMIterables = { + CSSRuleList: true, // TODO: Not spec compliant, should be false. + CSSStyleDeclaration: false, + CSSValueList: false, + ClientRectList: false, + DOMRectList: false, + DOMStringList: false, + DOMTokenList: true, + DataTransferItemList: false, + FileList: false, + HTMLAllCollection: false, + HTMLCollection: false, + HTMLFormElement: false, + HTMLSelectElement: false, + MediaList: true, // TODO: Not spec compliant, should be false. + MimeTypeArray: false, + NamedNodeMap: false, + NodeList: true, + PaintRequestList: false, + Plugin: false, + PluginArray: false, + SVGLengthList: false, + SVGNumberList: false, + SVGPathSegList: false, + SVGPointList: false, + SVGStringList: false, + SVGTransformList: false, + SourceBufferList: false, + StyleSheetList: true, // TODO: Not spec compliant, should be false. + TextTrackCueList: false, + TextTrackList: false, + TouchList: false +}; + +for (var collections = getKeys(DOMIterables), i = 0; i < collections.length; i++) { + var NAME = collections[i]; + var explicit = DOMIterables[NAME]; + var Collection = global[NAME]; + var proto = Collection && Collection.prototype; + var key; + if (proto) { + if (!proto[ITERATOR]) hide(proto, ITERATOR, ArrayValues); + if (!proto[TO_STRING_TAG]) hide(proto, TO_STRING_TAG, NAME); + Iterators[NAME] = ArrayValues; + if (explicit) for (key in $iterators) if (!proto[key]) redefine(proto, key, $iterators[key], true); + } +} + +},{"./_global":25,"./_hide":27,"./_iterators":41,"./_object-keys":53,"./_redefine":58,"./_wks":81,"./es6.array.iterator":85}],103:[function(require,module,exports){ +"use strict"; + +require("core-js/modules/es6.symbol.js"); +require("core-js/modules/es6.number.constructor.js"); +require("core-js/modules/es6.string.iterator.js"); +require("core-js/modules/es6.object.to-string.js"); +require("core-js/modules/es6.array.iterator.js"); +require("core-js/modules/web.dom.iterable.js"); +function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +var _require = require('./protocol'), + Parser = _require.Parser, + PROTOCOL_6 = _require.PROTOCOL_6, + PROTOCOL_7 = _require.PROTOCOL_7; +var VERSION = "4.0.1"; +var Connector = /*#__PURE__*/function () { + function Connector(options, WebSocket, Timer, handlers) { + var _this = this; + _classCallCheck(this, Connector); + this.options = options; + this.WebSocket = WebSocket; + this.Timer = Timer; + this.handlers = handlers; + var path = this.options.path ? "".concat(this.options.path) : 'livereload'; + var port = this.options.port ? ":".concat(this.options.port) : ''; + this._uri = "ws".concat(this.options.https ? 's' : '', "://").concat(this.options.host).concat(port, "/").concat(path); + this._nextDelay = this.options.mindelay; + this._connectionDesired = false; + this.protocol = 0; + this.protocolParser = new Parser({ + connected: function connected(protocol) { + _this.protocol = protocol; + _this._handshakeTimeout.stop(); + _this._nextDelay = _this.options.mindelay; + _this._disconnectionReason = 'broken'; + return _this.handlers.connected(_this.protocol); + }, + error: function error(e) { + _this.handlers.error(e); + return _this._closeOnError(); + }, + message: function message(_message) { + return _this.handlers.message(_message); + } + }); + this._handshakeTimeout = new this.Timer(function () { + if (!_this._isSocketConnected()) { + return; + } + _this._disconnectionReason = 'handshake-timeout'; + return _this.socket.close(); + }); + this._reconnectTimer = new this.Timer(function () { + if (!_this._connectionDesired) { + // shouldn't hit this, but just in case + return; + } + return _this.connect(); + }); + this.connect(); + } + _createClass(Connector, [{ + key: "_isSocketConnected", + value: function _isSocketConnected() { + return this.socket && this.socket.readyState === this.WebSocket.OPEN; + } + }, { + key: "connect", + value: function connect() { + var _this2 = this; + this._connectionDesired = true; + if (this._isSocketConnected()) { + return; + } + + // prepare for a new connection + this._reconnectTimer.stop(); + this._disconnectionReason = 'cannot-connect'; + this.protocolParser.reset(); + this.handlers.connecting(); + this.socket = new this.WebSocket(this._uri); + this.socket.onopen = function (e) { + return _this2._onopen(e); + }; + this.socket.onclose = function (e) { + return _this2._onclose(e); + }; + this.socket.onmessage = function (e) { + return _this2._onmessage(e); + }; + this.socket.onerror = function (e) { + return _this2._onerror(e); + }; + } + }, { + key: "disconnect", + value: function disconnect() { + this._connectionDesired = false; + this._reconnectTimer.stop(); // in case it was running + + if (!this._isSocketConnected()) { + return; + } + this._disconnectionReason = 'manual'; + return this.socket.close(); + } + }, { + key: "_scheduleReconnection", + value: function _scheduleReconnection() { + if (!this._connectionDesired) { + // don't reconnect after manual disconnection + return; + } + if (!this._reconnectTimer.running) { + this._reconnectTimer.start(this._nextDelay); + this._nextDelay = Math.min(this.options.maxdelay, this._nextDelay * 2); + } + } + }, { + key: "sendCommand", + value: function sendCommand(command) { + if (!this.protocol) { + return; + } + return this._sendCommand(command); + } + }, { + key: "_sendCommand", + value: function _sendCommand(command) { + return this.socket.send(JSON.stringify(command)); + } + }, { + key: "_closeOnError", + value: function _closeOnError() { + this._handshakeTimeout.stop(); + this._disconnectionReason = 'error'; + return this.socket.close(); + } + }, { + key: "_onopen", + value: function _onopen(e) { + this.handlers.socketConnected(); + this._disconnectionReason = 'handshake-failed'; + + // start handshake + var hello = { + command: 'hello', + protocols: [PROTOCOL_6, PROTOCOL_7] + }; + hello.ver = VERSION; + if (this.options.ext) { + hello.ext = this.options.ext; + } + if (this.options.extver) { + hello.extver = this.options.extver; + } + if (this.options.snipver) { + hello.snipver = this.options.snipver; + } + this._sendCommand(hello); + return this._handshakeTimeout.start(this.options.handshake_timeout); + } + }, { + key: "_onclose", + value: function _onclose(e) { + this.protocol = 0; + this.handlers.disconnected(this._disconnectionReason, this._nextDelay); + return this._scheduleReconnection(); + } + }, { + key: "_onerror", + value: function _onerror(e) {} + }, { + key: "_onmessage", + value: function _onmessage(e) { + return this.protocolParser.process(e.data); + } + }]); + return Connector; +}(); +; +exports.Connector = Connector; + +},{"./protocol":108,"core-js/modules/es6.array.iterator.js":85,"core-js/modules/es6.number.constructor.js":88,"core-js/modules/es6.object.to-string.js":91,"core-js/modules/es6.string.iterator.js":98,"core-js/modules/es6.symbol.js":99,"core-js/modules/web.dom.iterable.js":102}],104:[function(require,module,exports){ +"use strict"; + +var CustomEvents = { + bind: function bind(element, eventName, handler) { + if (element.addEventListener) { + return element.addEventListener(eventName, handler, false); + } + if (element.attachEvent) { + element[eventName] = 1; + return element.attachEvent('onpropertychange', function (event) { + if (event.propertyName === eventName) { + return handler(); + } + }); + } + throw new Error("Attempt to attach custom event ".concat(eventName, " to something which isn't a DOMElement")); + }, + fire: function fire(element, eventName) { + if (element.addEventListener) { + var event = document.createEvent('HTMLEvents'); + event.initEvent(eventName, true, true); + return document.dispatchEvent(event); + } else if (element.attachEvent) { + if (element[eventName]) { + return element[eventName]++; + } + } else { + throw new Error("Attempt to fire custom event ".concat(eventName, " on something which isn't a DOMElement")); + } + } +}; +exports.bind = CustomEvents.bind; +exports.fire = CustomEvents.fire; + +},{}],105:[function(require,module,exports){ +"use strict"; + +require("core-js/modules/es6.regexp.match.js"); +require("core-js/modules/es6.symbol.js"); +require("core-js/modules/es6.array.from.js"); +require("core-js/modules/es6.string.iterator.js"); +require("core-js/modules/es6.object.to-string.js"); +require("core-js/modules/es6.array.iterator.js"); +require("core-js/modules/web.dom.iterable.js"); +require("core-js/modules/es6.number.constructor.js"); +function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +var LessPlugin = /*#__PURE__*/function () { + function LessPlugin(window, host) { + _classCallCheck(this, LessPlugin); + this.window = window; + this.host = host; + } + _createClass(LessPlugin, [{ + key: "reload", + value: function reload(path, options) { + if (this.window.less && this.window.less.refresh) { + if (path.match(/\.less$/i)) { + return this.reloadLess(path); + } + if (options.originalPath.match(/\.less$/i)) { + return this.reloadLess(options.originalPath); + } + } + return false; + } + }, { + key: "reloadLess", + value: function reloadLess(path) { + var link; + var links = function () { + var result = []; + for (var _i = 0, _Array$from = Array.from(document.getElementsByTagName('link')); _i < _Array$from.length; _i++) { + link = _Array$from[_i]; + if (link.href && link.rel.match(/^stylesheet\/less$/i) || link.rel.match(/stylesheet/i) && link.type.match(/^text\/(x-)?less$/i)) { + result.push(link); + } + } + return result; + }(); + if (links.length === 0) { + return false; + } + for (var _i2 = 0, _Array$from2 = Array.from(links); _i2 < _Array$from2.length; _i2++) { + link = _Array$from2[_i2]; + link.href = this.host.generateCacheBustUrl(link.href); + } + this.host.console.log('LiveReload is asking LESS to recompile all stylesheets'); + this.window.less.refresh(true); + return true; + } + }, { + key: "analyze", + value: function analyze() { + return { + disable: !!(this.window.less && this.window.less.refresh) + }; + } + }]); + return LessPlugin; +}(); +; +LessPlugin.identifier = 'less'; +LessPlugin.version = '1.0'; +module.exports = LessPlugin; + +},{"core-js/modules/es6.array.from.js":84,"core-js/modules/es6.array.iterator.js":85,"core-js/modules/es6.number.constructor.js":88,"core-js/modules/es6.object.to-string.js":91,"core-js/modules/es6.regexp.match.js":94,"core-js/modules/es6.string.iterator.js":98,"core-js/modules/es6.symbol.js":99,"core-js/modules/web.dom.iterable.js":102}],106:[function(require,module,exports){ +"use strict"; + +require("core-js/modules/es6.symbol.js"); +require("core-js/modules/es6.number.constructor.js"); +require("core-js/modules/es6.array.slice.js"); +require("core-js/modules/es6.object.to-string.js"); +require("core-js/modules/es6.array.from.js"); +require("core-js/modules/es6.string.iterator.js"); +require("core-js/modules/es6.array.iterator.js"); +require("core-js/modules/web.dom.iterable.js"); +function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); } +require("core-js/modules/es6.regexp.match.js"); +require("core-js/modules/es6.object.keys.js"); +function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; } +function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } +function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } +function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } +function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, _toPropertyKey(descriptor.key), descriptor); } } +function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); Object.defineProperty(Constructor, "prototype", { writable: false }); return Constructor; } +function _toPropertyKey(arg) { var key = _toPrimitive(arg, "string"); return _typeof(key) === "symbol" ? key : String(key); } +function _toPrimitive(input, hint) { if (_typeof(input) !== "object" || input === null) return input; var prim = input[Symbol.toPrimitive]; if (prim !== undefined) { var res = prim.call(input, hint || "default"); if (_typeof(res) !== "object") return res; throw new TypeError("@@toPrimitive must return a primitive value."); } return (hint === "string" ? String : Number)(input); } +/* global alert */ +var _require = require('./connector'), + Connector = _require.Connector; +var _require2 = require('./timer'), + Timer = _require2.Timer; +var _require3 = require('./options'), + Options = _require3.Options; +var _require4 = require('./reloader'), + Reloader = _require4.Reloader; +var _require5 = require('./protocol'), + ProtocolError = _require5.ProtocolError; +var LiveReload = /*#__PURE__*/function () { + function LiveReload(window) { + var _this = this; + _classCallCheck(this, LiveReload); + this.window = window; + this.listeners = {}; + this.plugins = []; + this.pluginIdentifiers = {}; + + // i can haz console? + this.console = this.window.console && this.window.console.log && this.window.console.error ? this.window.location.href.match(/LR-verbose/) ? this.window.console : { + log: function log() {}, + error: this.window.console.error.bind(this.window.console) + } : { + log: function log() {}, + error: function error() {} + }; + + // i can haz sockets? + if (!(this.WebSocket = this.window.WebSocket || this.window.MozWebSocket)) { + this.console.error('LiveReload disabled because the browser does not seem to support web sockets'); + return; + } + + // i can haz options? + if ('LiveReloadOptions' in window) { + this.options = new Options(); + for (var _i = 0, _Object$keys = Object.keys(window.LiveReloadOptions || {}); _i < _Object$keys.length; _i++) { + var k = _Object$keys[_i]; + var v = window.LiveReloadOptions[k]; + this.options.set(k, v); + } + } else { + this.options = Options.extract(this.window.document); + if (!this.options) { + this.console.error('LiveReload disabled because it could not find its own