From c4333b7071dea2378f437da6d3ba89e157cfd8a4 Mon Sep 17 00:00:00 2001 From: Sergey Sova <mail@sergeysova.com> Date: Thu, 6 Jun 2024 22:13:20 +0400 Subject: [PATCH] Add all docs from effector v23 --- .github/workflows/deploy.yml | 42 + .gitignore | 22 + .prettierignore | 4 + .prettierrc | 21 + AUTHORS | 140 + README.md | 44 + astro.config.ts | 56 + package.json | 68 + pagefind.yml | 4 + plugins/admonitions.ts | 53 + plugins/remark-fallback-lang.ts | 80 + pnpm-lock.yaml | 6814 +++++++++++++++++ postcss.config.cjs | 3 + public/.nojekyll | 0 public/CNAME | 1 + public/banner.png | Bin 0 -> 94627 bytes public/external.svg | 16 + public/favicon.ico | Bin 0 -> 15086 bytes public/favicon.svg | 228 + public/fonts/LexendDeca-Light.ttf | Bin 0 -> 78200 bytes public/fonts/LexendDeca-Regular.ttf | Bin 0 -> 67740 bytes public/fonts/LexendDeca-Regular.woff2 | Bin 0 -> 57576 bytes public/images/sample-visualization.gif | Bin 0 -> 52426 bytes public/logo/automationhero.svg | 50 + public/logo/aviasales.dark.svg | 1 + public/logo/aviasales.png | Bin 0 -> 12445 bytes public/logo/avito.svg | 38 + public/logo/codengage.png | Bin 0 -> 3826 bytes public/logo/docsvision.png | Bin 0 -> 9721 bytes public/logo/express24.svg | 95 + public/logo/foxford.svg | 1 + public/logo/globalCtoForum.png | Bin 0 -> 18847 bytes public/logo/healthSamurai.svg | 28 + public/logo/intouchHealth.png | Bin 0 -> 22384 bytes public/logo/joom.svg | 1 + public/logo/junto.png | Bin 0 -> 7450 bytes public/logo/lunatask.png | Bin 0 -> 9674 bytes public/logo/mts.svg | 11 + public/logo/okoo.png | Bin 0 -> 17071 bytes public/logo/radity.png | Bin 0 -> 13424 bytes public/logo/raiffeisen.svg | 19 + public/logo/redmadrobot.png | Bin 0 -> 2654 bytes public/logo/sber.png | Bin 0 -> 62737 bytes public/logo/semrush.png | Bin 0 -> 85496 bytes public/logo/smartomato.svg | 9 + public/logo/space307.svg | 8 + public/logo/stellarX.svg | 3 + public/logo/stmLabs.png | Bin 0 -> 30314 bytes public/logo/tenpixls.png | Bin 0 -> 22817 bytes public/logo/travelpayouts.svg | 19 + public/logo/unicef.svg | 88 + public/logo/uptarget.png | Bin 0 -> 30474 bytes public/logo/vk.svg | 4 + public/make-scrollable-code-focusable.js | 3 + src/components/DropDownMenu.astro | 208 + src/components/FeatureCard.astro | 37 + src/components/Footer/Footer.astro | 92 + src/components/HeadCommon.astro | 47 + src/components/HeadSEO.astro | 48 + src/components/Header/EffectorLogo.astro | 8 + src/components/Header/Header.astro | 282 + src/components/Header/MobileMenuButton.astro | 73 + src/components/Header/Search.astro | 368 + src/components/Header/SkipToContent.astro | 29 + src/components/Header/ThemeToggleButton.css | 30 + src/components/Header/ThemeToggleButton.tsx | 121 + src/components/Landing/Companies.astro | 221 + src/components/Landing/Feature.astro | 59 + src/components/Landing/FeaturesGrid.astro | 14 + src/components/Landing/Hero.astro | 110 + src/components/Landing/Stats.astro | 257 + src/components/LeftSidebar/LeftSidebar.astro | 160 + src/components/LiveDemo.jsx | 23 + src/components/MobileNavigation.astro | 117 + src/components/NestedLinks.astro | 201 + src/components/NotTranslatedYet.astro | 29 + src/components/PageContent/Announcement.astro | 50 + src/components/PageContent/Contributors.astro | 208 + src/components/PageContent/PageContent.astro | 182 + src/components/RightSidebar/MoreMenu.astro | 61 + .../RightSidebar/RightSidebar.astro | 42 + .../RightSidebar/TableOfContents.module.css | 108 + .../RightSidebar/TableOfContents.tsx | 119 + src/components/TranslationDisclaimer.astro | 21 + src/consts.ts | 97 + src/content/config.ts | 23 + src/content/docs/en/FAQ.md | 12 + .../docs/en/api/effector-react/Gate.md | 92 + .../docs/en/api/effector-react/Provider.md | 86 + .../docs/en/api/effector-react/connect.md | 52 + .../en/api/effector-react/createComponent.md | 57 + .../docs/en/api/effector-react/createGate.md | 84 + .../api/effector-react/createStoreConsumer.md | 46 + .../docs/en/api/effector-react/index.md | 39 + .../en/api/effector-react/module/scope.md | 103 + .../effector-react/module/\321\201ompat.md" | 94 + .../docs/en/api/effector-react/useEvent.md | 128 + .../docs/en/api/effector-react/useGate.md | 57 + .../docs/en/api/effector-react/useList.md | 225 + .../en/api/effector-react/useProvidedScope.md | 47 + .../docs/en/api/effector-react/useStore.md | 64 + .../docs/en/api/effector-react/useStoreMap.md | 140 + .../docs/en/api/effector-react/useUnit.md | 192 + .../docs/en/api/effector-solid/Gate.md | 55 + .../docs/en/api/effector-solid/createGate.md | 77 + .../docs/en/api/effector-solid/index.md | 25 + .../en/api/effector-solid/module/scope.md | 64 + .../docs/en/api/effector-solid/useGate.md | 58 + .../docs/en/api/effector-solid/useStoreMap.md | 117 + .../docs/en/api/effector-solid/useUnit.md | 175 + .../en/api/effector-vue/ComponentOptions.md | 63 + .../api/effector-vue/EffectorScopePlugin.md | 34 + src/content/docs/en/api/effector-vue/Gate.md | 52 + .../docs/en/api/effector-vue/VueEffector.md | 36 + .../docs/en/api/effector-vue/VueSSRPlugin.md | 41 + .../en/api/effector-vue/createComponent.md | 49 + .../docs/en/api/effector-vue/createGate.md | 80 + src/content/docs/en/api/effector-vue/index.md | 38 + .../en/api/effector-vue/module/composition.md | 17 + .../docs/en/api/effector-vue/module/ssr.md | 19 + .../docs/en/api/effector-vue/useEvent.md | 54 + .../docs/en/api/effector-vue/useGate.md | 30 + .../docs/en/api/effector-vue/useStore.md | 49 + .../docs/en/api/effector-vue/useStoreMap.md | 130 + .../docs/en/api/effector-vue/useUnit.md | 150 + .../docs/en/api/effector-vue/useVModel.md | 108 + src/content/docs/en/api/effector/Domain.md | 299 + src/content/docs/en/api/effector/Effect.md | 583 ++ src/content/docs/en/api/effector/Event.md | 893 +++ src/content/docs/en/api/effector/Scope.md | 102 + src/content/docs/en/api/effector/Store.md | 325 + .../docs/en/api/effector/allSettled.md | 92 + src/content/docs/en/api/effector/attach.md | 620 ++ .../docs/en/api/effector/babel-plugin.md | 370 + src/content/docs/en/api/effector/clearNode.md | 84 + src/content/docs/en/api/effector/combine.mdx | 167 + src/content/docs/en/api/effector/createApi.md | 57 + .../docs/en/api/effector/createDomain.md | 47 + .../docs/en/api/effector/createEffect.md | 187 + .../docs/en/api/effector/createEvent.md | 95 + .../docs/en/api/effector/createStore.md | 265 + .../docs/en/api/effector/createWatch.md | 68 + .../effector/demo/_combine-array-fn.live.js | 11 + .../demo/_combine-non-stores-fn.live.js | 22 + .../effector/demo/_combine-object-fn.live.js | 11 + .../effector/demo/_combine-stores-fn.live.js | 13 + src/content/docs/en/api/effector/fork.md | 233 + src/content/docs/en/api/effector/forward.md | 112 + .../docs/en/api/effector/fromObservable.md | 47 + src/content/docs/en/api/effector/guard.md | 176 + src/content/docs/en/api/effector/hydrate.md | 56 + src/content/docs/en/api/effector/index.md | 69 + src/content/docs/en/api/effector/inspect.md | 190 + src/content/docs/en/api/effector/is.md | 382 + src/content/docs/en/api/effector/launch.md | 53 + src/content/docs/en/api/effector/merge.md | 103 + .../en/api/effector/module/babel-plugin.md | 10 + .../docs/en/api/effector/module/inspect.md | 14 + .../en/api/effector/module/\321\201ompat.md" | 100 + src/content/docs/en/api/effector/restore.md | 136 + src/content/docs/en/api/effector/sample.md | 498 ++ src/content/docs/en/api/effector/scopeBind.md | 115 + src/content/docs/en/api/effector/serialize.md | 107 + src/content/docs/en/api/effector/split.md | 398 + .../docs/en/api/effector/withRegion.md | 62 + src/content/docs/en/api/index.mdx | 49 + src/content/docs/en/conventions/naming.md | 41 + .../docs/en/core-principles/own-your-data.md | 11 + .../docs/en/core-principles/releases.md | 26 + .../docs/en/core-principles/testing.md | 13 + .../docs/en/core-principles/typings.md | 17 + .../unit-shape-protocol.md | 69 + .../en/explanation/computation-priority.md | 70 + src/content/docs/en/explanation/events.md | 183 + src/content/docs/en/explanation/glossary.md | 162 + src/content/docs/en/explanation/prior-art.md | 33 + src/content/docs/en/explanation/sids.md | 322 + .../docs/en/guides/migration-guide-v23.md | 115 + .../docs/en/guides/server-side-rendering.md | 311 + src/content/docs/en/guides/testing.md | 147 + src/content/docs/en/introduction/community.md | 177 + .../docs/en/introduction/core-concepts.md | 80 + src/content/docs/en/introduction/ecosystem.md | 61 + src/content/docs/en/introduction/examples.md | 62 + .../docs/en/introduction/installation.md | 123 + .../docs/en/introduction/motivation.md | 31 + .../docs/en/recipes/common/countdown.md | 81 + src/content/docs/en/recipes/index.md | 9 + .../docs/en/recipes/nextjs/integrate.md | 7 + src/content/docs/en/recipes/nextjs/router.md | 74 + .../docs/en/recipes/nextjs/scope-bind.md | 50 + .../react-native/asyncstorage-counter.md | 111 + src/content/docs/en/recipes/react/counter.md | 43 + .../en/recipes/react/dynamic-form-schema.md | 413 + src/content/docs/en/recipes/react/effects.md | 49 + src/content/docs/en/recipes/react/forms.md | 208 + src/content/docs/en/recipes/react/gate.md | 78 + src/content/docs/en/recipes/react/slots.md | 130 + .../docs/en/recipes/react/todo-creator.md | 95 + .../en/recipes/react/todo-with-validation.md | 94 + .../docs/en/typescript/typing-effector.md | 217 + .../typescript/usage-with-effector-react.md | 642 ++ .../docs/en/typescript/utility-types.md | 126 + .../docs/ru/api/effector-react/index.md | 26 + .../docs/ru/api/effector-react/useEvent.md | 184 + .../docs/ru/api/effector-react/useList.md | 224 + .../ru/api/effector-react/useProvidedScope.md | 32 + .../docs/ru/api/effector-react/useStore.md | 46 + .../docs/ru/api/effector-react/useStoreMap.md | 113 + .../docs/ru/api/effector-react/useUnit.md | 146 + src/content/docs/ru/api/effector/Effect.md | 625 ++ src/content/docs/ru/api/effector/Event.md | 407 + src/content/docs/ru/api/effector/Scope.md | 104 + src/content/docs/ru/api/effector/Store.md | 685 ++ .../docs/ru/api/effector/babel-plugin.md | 248 + src/content/docs/ru/api/effector/clearNode.md | 76 + src/content/docs/ru/api/effector/combine.md | 279 + src/content/docs/ru/api/effector/createApi.md | 74 + .../docs/ru/api/effector/createEffect.md | 177 + .../docs/ru/api/effector/createEvent.md | 74 + .../docs/ru/api/effector/createStore.md | 117 + .../docs/ru/api/effector/createWatch.md | 55 + src/content/docs/ru/api/effector/forward.md | 127 + .../docs/ru/api/effector/fromObservable.md | 37 + src/content/docs/ru/api/effector/guard.md | 195 + src/content/docs/ru/api/effector/index.md | 61 + src/content/docs/ru/api/effector/is.md | 326 + src/content/docs/ru/api/effector/launch.md | 22 + src/content/docs/ru/api/effector/merge.md | 97 + src/content/docs/ru/api/effector/sample.md | 371 + src/content/docs/ru/api/effector/scopeBind.md | 38 + src/content/docs/ru/api/index.mdx | 48 + src/content/docs/ru/explanation/glossary.md | 144 + src/content/docs/ru/explanation/prior-art.md | 28 + src/content/docs/ru/introduction/ecosystem.md | 34 + src/content/docs/ru/introduction/examples.md | 10 + .../docs/ru/introduction/installation.md | 122 + src/content/docs/ru/recipes/index.md | 8 + .../docs/ru/typescript/typing-effector.md | 173 + .../docs/ru/typescript/utility-types.md | 124 + src/docs.ts | 51 + src/env.d.ts | 16 + src/icons/Chevron.astro | 21 + src/icons/Copy.astro | 26 + src/icons/Discord.astro | 12 + src/icons/DiscordLined.astro | 28 + src/icons/Dots.astro | 16 + src/icons/EditPencil.astro | 21 + src/icons/Effector.astro | 382 + src/icons/External.astro | 15 + src/icons/Github.astro | 10 + src/icons/Language.astro | 18 + src/icons/Menu.astro | 27 + src/icons/React.astro | 21 + src/icons/Solid.astro | 52 + src/icons/Twitter.astro | 12 + src/icons/Vue.astro | 10 + src/icons/Youtube.astro | 15 + src/languages.ts | 243 + src/layouts/CommonLayout.astro | 42 + src/layouts/Landing.astro | 28 + src/layouts/MainLayout.astro | 173 + src/navigation.ts | 1004 +++ src/pages/[...slug].astro | 62 + src/pages/[lang]/[...slug].astro | 68 + src/pages/en.astro | 1 + src/pages/index.astro | 81 + src/pages/ru.astro | 79 + src/pages/uz.astro | 80 + src/styles/index.css | 577 ++ src/styles/language.css | 102 + src/styles/theme.css | 226 + tailwind.config.cjs | 8 + tsconfig.json | 13 + 274 files changed, 35357 insertions(+) create mode 100644 .github/workflows/deploy.yml create mode 100644 .gitignore create mode 100644 .prettierignore create mode 100644 .prettierrc create mode 100644 AUTHORS create mode 100644 README.md create mode 100644 astro.config.ts create mode 100644 package.json create mode 100644 pagefind.yml create mode 100644 plugins/admonitions.ts create mode 100644 plugins/remark-fallback-lang.ts create mode 100644 pnpm-lock.yaml create mode 100644 postcss.config.cjs create mode 100644 public/.nojekyll create mode 100644 public/CNAME create mode 100644 public/banner.png create mode 100644 public/external.svg create mode 100644 public/favicon.ico create mode 100644 public/favicon.svg create mode 100644 public/fonts/LexendDeca-Light.ttf create mode 100644 public/fonts/LexendDeca-Regular.ttf create mode 100644 public/fonts/LexendDeca-Regular.woff2 create mode 100644 public/images/sample-visualization.gif create mode 100644 public/logo/automationhero.svg create mode 100644 public/logo/aviasales.dark.svg create mode 100644 public/logo/aviasales.png create mode 100644 public/logo/avito.svg create mode 100644 public/logo/codengage.png create mode 100644 public/logo/docsvision.png create mode 100644 public/logo/express24.svg create mode 100644 public/logo/foxford.svg create mode 100644 public/logo/globalCtoForum.png create mode 100644 public/logo/healthSamurai.svg create mode 100644 public/logo/intouchHealth.png create mode 100644 public/logo/joom.svg create mode 100644 public/logo/junto.png create mode 100644 public/logo/lunatask.png create mode 100644 public/logo/mts.svg create mode 100644 public/logo/okoo.png create mode 100644 public/logo/radity.png create mode 100644 public/logo/raiffeisen.svg create mode 100644 public/logo/redmadrobot.png create mode 100644 public/logo/sber.png create mode 100644 public/logo/semrush.png create mode 100644 public/logo/smartomato.svg create mode 100644 public/logo/space307.svg create mode 100644 public/logo/stellarX.svg create mode 100644 public/logo/stmLabs.png create mode 100644 public/logo/tenpixls.png create mode 100644 public/logo/travelpayouts.svg create mode 100644 public/logo/unicef.svg create mode 100644 public/logo/uptarget.png create mode 100644 public/logo/vk.svg create mode 100644 public/make-scrollable-code-focusable.js create mode 100644 src/components/DropDownMenu.astro create mode 100644 src/components/FeatureCard.astro create mode 100644 src/components/Footer/Footer.astro create mode 100644 src/components/HeadCommon.astro create mode 100644 src/components/HeadSEO.astro create mode 100644 src/components/Header/EffectorLogo.astro create mode 100644 src/components/Header/Header.astro create mode 100644 src/components/Header/MobileMenuButton.astro create mode 100644 src/components/Header/Search.astro create mode 100644 src/components/Header/SkipToContent.astro create mode 100644 src/components/Header/ThemeToggleButton.css create mode 100644 src/components/Header/ThemeToggleButton.tsx create mode 100644 src/components/Landing/Companies.astro create mode 100644 src/components/Landing/Feature.astro create mode 100644 src/components/Landing/FeaturesGrid.astro create mode 100644 src/components/Landing/Hero.astro create mode 100644 src/components/Landing/Stats.astro create mode 100644 src/components/LeftSidebar/LeftSidebar.astro create mode 100644 src/components/LiveDemo.jsx create mode 100644 src/components/MobileNavigation.astro create mode 100644 src/components/NestedLinks.astro create mode 100644 src/components/NotTranslatedYet.astro create mode 100644 src/components/PageContent/Announcement.astro create mode 100644 src/components/PageContent/Contributors.astro create mode 100644 src/components/PageContent/PageContent.astro create mode 100644 src/components/RightSidebar/MoreMenu.astro create mode 100644 src/components/RightSidebar/RightSidebar.astro create mode 100644 src/components/RightSidebar/TableOfContents.module.css create mode 100644 src/components/RightSidebar/TableOfContents.tsx create mode 100644 src/components/TranslationDisclaimer.astro create mode 100644 src/consts.ts create mode 100644 src/content/config.ts create mode 100644 src/content/docs/en/FAQ.md create mode 100644 src/content/docs/en/api/effector-react/Gate.md create mode 100644 src/content/docs/en/api/effector-react/Provider.md create mode 100644 src/content/docs/en/api/effector-react/connect.md create mode 100644 src/content/docs/en/api/effector-react/createComponent.md create mode 100644 src/content/docs/en/api/effector-react/createGate.md create mode 100644 src/content/docs/en/api/effector-react/createStoreConsumer.md create mode 100644 src/content/docs/en/api/effector-react/index.md create mode 100644 src/content/docs/en/api/effector-react/module/scope.md create mode 100644 "src/content/docs/en/api/effector-react/module/\321\201ompat.md" create mode 100644 src/content/docs/en/api/effector-react/useEvent.md create mode 100644 src/content/docs/en/api/effector-react/useGate.md create mode 100644 src/content/docs/en/api/effector-react/useList.md create mode 100644 src/content/docs/en/api/effector-react/useProvidedScope.md create mode 100644 src/content/docs/en/api/effector-react/useStore.md create mode 100644 src/content/docs/en/api/effector-react/useStoreMap.md create mode 100644 src/content/docs/en/api/effector-react/useUnit.md create mode 100644 src/content/docs/en/api/effector-solid/Gate.md create mode 100644 src/content/docs/en/api/effector-solid/createGate.md create mode 100644 src/content/docs/en/api/effector-solid/index.md create mode 100644 src/content/docs/en/api/effector-solid/module/scope.md create mode 100644 src/content/docs/en/api/effector-solid/useGate.md create mode 100644 src/content/docs/en/api/effector-solid/useStoreMap.md create mode 100644 src/content/docs/en/api/effector-solid/useUnit.md create mode 100644 src/content/docs/en/api/effector-vue/ComponentOptions.md create mode 100644 src/content/docs/en/api/effector-vue/EffectorScopePlugin.md create mode 100644 src/content/docs/en/api/effector-vue/Gate.md create mode 100644 src/content/docs/en/api/effector-vue/VueEffector.md create mode 100644 src/content/docs/en/api/effector-vue/VueSSRPlugin.md create mode 100644 src/content/docs/en/api/effector-vue/createComponent.md create mode 100644 src/content/docs/en/api/effector-vue/createGate.md create mode 100644 src/content/docs/en/api/effector-vue/index.md create mode 100644 src/content/docs/en/api/effector-vue/module/composition.md create mode 100644 src/content/docs/en/api/effector-vue/module/ssr.md create mode 100644 src/content/docs/en/api/effector-vue/useEvent.md create mode 100644 src/content/docs/en/api/effector-vue/useGate.md create mode 100644 src/content/docs/en/api/effector-vue/useStore.md create mode 100644 src/content/docs/en/api/effector-vue/useStoreMap.md create mode 100644 src/content/docs/en/api/effector-vue/useUnit.md create mode 100644 src/content/docs/en/api/effector-vue/useVModel.md create mode 100644 src/content/docs/en/api/effector/Domain.md create mode 100644 src/content/docs/en/api/effector/Effect.md create mode 100644 src/content/docs/en/api/effector/Event.md create mode 100644 src/content/docs/en/api/effector/Scope.md create mode 100644 src/content/docs/en/api/effector/Store.md create mode 100644 src/content/docs/en/api/effector/allSettled.md create mode 100644 src/content/docs/en/api/effector/attach.md create mode 100644 src/content/docs/en/api/effector/babel-plugin.md create mode 100644 src/content/docs/en/api/effector/clearNode.md create mode 100644 src/content/docs/en/api/effector/combine.mdx create mode 100644 src/content/docs/en/api/effector/createApi.md create mode 100644 src/content/docs/en/api/effector/createDomain.md create mode 100644 src/content/docs/en/api/effector/createEffect.md create mode 100644 src/content/docs/en/api/effector/createEvent.md create mode 100644 src/content/docs/en/api/effector/createStore.md create mode 100644 src/content/docs/en/api/effector/createWatch.md create mode 100644 src/content/docs/en/api/effector/demo/_combine-array-fn.live.js create mode 100644 src/content/docs/en/api/effector/demo/_combine-non-stores-fn.live.js create mode 100644 src/content/docs/en/api/effector/demo/_combine-object-fn.live.js create mode 100644 src/content/docs/en/api/effector/demo/_combine-stores-fn.live.js create mode 100644 src/content/docs/en/api/effector/fork.md create mode 100644 src/content/docs/en/api/effector/forward.md create mode 100644 src/content/docs/en/api/effector/fromObservable.md create mode 100644 src/content/docs/en/api/effector/guard.md create mode 100644 src/content/docs/en/api/effector/hydrate.md create mode 100644 src/content/docs/en/api/effector/index.md create mode 100644 src/content/docs/en/api/effector/inspect.md create mode 100644 src/content/docs/en/api/effector/is.md create mode 100644 src/content/docs/en/api/effector/launch.md create mode 100644 src/content/docs/en/api/effector/merge.md create mode 100644 src/content/docs/en/api/effector/module/babel-plugin.md create mode 100644 src/content/docs/en/api/effector/module/inspect.md create mode 100644 "src/content/docs/en/api/effector/module/\321\201ompat.md" create mode 100644 src/content/docs/en/api/effector/restore.md create mode 100644 src/content/docs/en/api/effector/sample.md create mode 100644 src/content/docs/en/api/effector/scopeBind.md create mode 100644 src/content/docs/en/api/effector/serialize.md create mode 100644 src/content/docs/en/api/effector/split.md create mode 100644 src/content/docs/en/api/effector/withRegion.md create mode 100644 src/content/docs/en/api/index.mdx create mode 100644 src/content/docs/en/conventions/naming.md create mode 100644 src/content/docs/en/core-principles/own-your-data.md create mode 100644 src/content/docs/en/core-principles/releases.md create mode 100644 src/content/docs/en/core-principles/testing.md create mode 100644 src/content/docs/en/core-principles/typings.md create mode 100644 src/content/docs/en/ecosystem-development/unit-shape-protocol.md create mode 100644 src/content/docs/en/explanation/computation-priority.md create mode 100644 src/content/docs/en/explanation/events.md create mode 100644 src/content/docs/en/explanation/glossary.md create mode 100644 src/content/docs/en/explanation/prior-art.md create mode 100644 src/content/docs/en/explanation/sids.md create mode 100644 src/content/docs/en/guides/migration-guide-v23.md create mode 100644 src/content/docs/en/guides/server-side-rendering.md create mode 100644 src/content/docs/en/guides/testing.md create mode 100644 src/content/docs/en/introduction/community.md create mode 100644 src/content/docs/en/introduction/core-concepts.md create mode 100644 src/content/docs/en/introduction/ecosystem.md create mode 100644 src/content/docs/en/introduction/examples.md create mode 100644 src/content/docs/en/introduction/installation.md create mode 100644 src/content/docs/en/introduction/motivation.md create mode 100644 src/content/docs/en/recipes/common/countdown.md create mode 100644 src/content/docs/en/recipes/index.md create mode 100644 src/content/docs/en/recipes/nextjs/integrate.md create mode 100644 src/content/docs/en/recipes/nextjs/router.md create mode 100644 src/content/docs/en/recipes/nextjs/scope-bind.md create mode 100644 src/content/docs/en/recipes/react-native/asyncstorage-counter.md create mode 100644 src/content/docs/en/recipes/react/counter.md create mode 100644 src/content/docs/en/recipes/react/dynamic-form-schema.md create mode 100644 src/content/docs/en/recipes/react/effects.md create mode 100644 src/content/docs/en/recipes/react/forms.md create mode 100644 src/content/docs/en/recipes/react/gate.md create mode 100644 src/content/docs/en/recipes/react/slots.md create mode 100644 src/content/docs/en/recipes/react/todo-creator.md create mode 100644 src/content/docs/en/recipes/react/todo-with-validation.md create mode 100644 src/content/docs/en/typescript/typing-effector.md create mode 100644 src/content/docs/en/typescript/usage-with-effector-react.md create mode 100644 src/content/docs/en/typescript/utility-types.md create mode 100644 src/content/docs/ru/api/effector-react/index.md create mode 100644 src/content/docs/ru/api/effector-react/useEvent.md create mode 100644 src/content/docs/ru/api/effector-react/useList.md create mode 100644 src/content/docs/ru/api/effector-react/useProvidedScope.md create mode 100644 src/content/docs/ru/api/effector-react/useStore.md create mode 100644 src/content/docs/ru/api/effector-react/useStoreMap.md create mode 100644 src/content/docs/ru/api/effector-react/useUnit.md create mode 100644 src/content/docs/ru/api/effector/Effect.md create mode 100644 src/content/docs/ru/api/effector/Event.md create mode 100644 src/content/docs/ru/api/effector/Scope.md create mode 100644 src/content/docs/ru/api/effector/Store.md create mode 100644 src/content/docs/ru/api/effector/babel-plugin.md create mode 100644 src/content/docs/ru/api/effector/clearNode.md create mode 100644 src/content/docs/ru/api/effector/combine.md create mode 100644 src/content/docs/ru/api/effector/createApi.md create mode 100644 src/content/docs/ru/api/effector/createEffect.md create mode 100644 src/content/docs/ru/api/effector/createEvent.md create mode 100644 src/content/docs/ru/api/effector/createStore.md create mode 100644 src/content/docs/ru/api/effector/createWatch.md create mode 100644 src/content/docs/ru/api/effector/forward.md create mode 100644 src/content/docs/ru/api/effector/fromObservable.md create mode 100644 src/content/docs/ru/api/effector/guard.md create mode 100644 src/content/docs/ru/api/effector/index.md create mode 100644 src/content/docs/ru/api/effector/is.md create mode 100644 src/content/docs/ru/api/effector/launch.md create mode 100644 src/content/docs/ru/api/effector/merge.md create mode 100644 src/content/docs/ru/api/effector/sample.md create mode 100644 src/content/docs/ru/api/effector/scopeBind.md create mode 100644 src/content/docs/ru/api/index.mdx create mode 100644 src/content/docs/ru/explanation/glossary.md create mode 100644 src/content/docs/ru/explanation/prior-art.md create mode 100644 src/content/docs/ru/introduction/ecosystem.md create mode 100644 src/content/docs/ru/introduction/examples.md create mode 100644 src/content/docs/ru/introduction/installation.md create mode 100644 src/content/docs/ru/recipes/index.md create mode 100644 src/content/docs/ru/typescript/typing-effector.md create mode 100644 src/content/docs/ru/typescript/utility-types.md create mode 100644 src/docs.ts create mode 100644 src/env.d.ts create mode 100644 src/icons/Chevron.astro create mode 100644 src/icons/Copy.astro create mode 100644 src/icons/Discord.astro create mode 100644 src/icons/DiscordLined.astro create mode 100644 src/icons/Dots.astro create mode 100644 src/icons/EditPencil.astro create mode 100644 src/icons/Effector.astro create mode 100644 src/icons/External.astro create mode 100644 src/icons/Github.astro create mode 100644 src/icons/Language.astro create mode 100644 src/icons/Menu.astro create mode 100644 src/icons/React.astro create mode 100644 src/icons/Solid.astro create mode 100644 src/icons/Twitter.astro create mode 100644 src/icons/Vue.astro create mode 100644 src/icons/Youtube.astro create mode 100644 src/languages.ts create mode 100644 src/layouts/CommonLayout.astro create mode 100644 src/layouts/Landing.astro create mode 100644 src/layouts/MainLayout.astro create mode 100644 src/navigation.ts create mode 100644 src/pages/[...slug].astro create mode 100644 src/pages/[lang]/[...slug].astro create mode 100644 src/pages/en.astro create mode 100644 src/pages/index.astro create mode 100644 src/pages/ru.astro create mode 100644 src/pages/uz.astro create mode 100644 src/styles/index.css create mode 100644 src/styles/language.css create mode 100644 src/styles/theme.css create mode 100644 tailwind.config.cjs create mode 100644 tsconfig.json diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml new file mode 100644 index 0000000..dcdbcf8 --- /dev/null +++ b/.github/workflows/deploy.yml @@ -0,0 +1,42 @@ +name: Github Pages + +on: + push: + branches: [main] + workflow_dispatch: + +permissions: + contents: write + id-token: write + pages: write + +jobs: + docs: + runs-on: ubuntu-latest + steps: + - name: 🛎️ Checkout + uses: actions/checkout@v4 + + - name: 🐧 Use Node.js v20.x + uses: actions/setup-node@v4 + with: + node-version: v20.x + cache: "pnpm" + + - run: corepack enable + - run: pnpm install + - run: pnpm build + - run: pnpm search:build + + - name: Setup Pages + uses: actions/configure-pages@v5 + + - name: Upload artifact + uses: actions/upload-pages-artifact@v3 + with: + # Upload entire repository + path: "./build" + + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5f5e086 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +# build output +dist/ +# generated types +.astro/ + +# dependencies +node_modules/ + +# logs +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* + + +# environment variables +.env +.env.production + +# macOS-specific files +.DS_Store +.idea diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 0000000..1f6a343 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,4 @@ +dist +node_modules +.astro +.vscode diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..fbd1886 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,21 @@ +{ + "trailingComma": "all", + "tabWidth": 2, + "semi": true, + "singleQuote": false, + "printWidth": 100, + "plugins": ["prettier-plugin-tailwindcss", "prettier-plugin-organize-attributes"], + "overrides": [ + { + "files": "*.astro", + "options": { + "parser": "astro", + "plugins": [ + "prettier-plugin-tailwindcss", + "prettier-plugin-astro", + "prettier-plugin-organize-attributes" + ] + } + } + ] +} diff --git a/AUTHORS b/AUTHORS new file mode 100644 index 0000000..97c5773 --- /dev/null +++ b/AUTHORS @@ -0,0 +1,140 @@ +Zero Bias <zerobias@icloud.com> +andretshurotshka <andwebar@gmail.com> +Dmitry Boldyrev <ribkatt@gmail.com> +Sergey Sova <mail@sergeysova.com> +Alexander Khoroshikh <32790736+AlexandrHoroshih@users.noreply.github.com> +popuguytheparrot <d3xrow@gmail.com> +github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> +Igor Kamyshev <igor@kamyshev.me> +Sova <5620073+sergeysova@users.noreply.github.com> +AlexandrHoroshih <xad71rus@gmail.com> +Valery Kobzar <kobzarvs@gmail.com> +doasync <doasync@gmail.com> +Egor Guscha <forcejmage@gmail.com> +Illia Osmanov (iosmanov) <iosmanov@cisco.com> +mg901 <mgreen097@gmail.com> +Yan <YanLobat@users.noreply.github.com> +Igor Ryzhov <vinokur141@gmail.com> +Illia Osmanov <illiaosmanov@gmail.com> +Arthur Irgashev <arthur.irgashev@gmail.com> +bloadvenro <bloadvenro@mail.ru> +YanLobat <yanlavryushev@gmail.com> +Ilya <10588170+Komar0ff@users.noreply.github.com> +Kirill Mironov <k.mironov@tinkoff.ru> +Ainur Sharaev <ainursharaev@gmail.com> +Arutyunyan Artyom <artalar@ya.ru> +drevoed <drevoed@posteo.net> +Nikita Nafranets <eddimensi@gmail.com> +dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> +popuguy <19804652+popuguytheparrot@users.noreply.github.com> +Aleksandr Osipov <osipov.as89@gmail.com> +Andrew Gopienko <a.gopienko@iml.ru> +bakugod <47696795+bakugod@users.noreply.github.com> +Victor Didenko <victord@setplex.com> +sterios_sav <sterios_sav@mail.ru> +Dmitrij Shuleshov <3arabotaet@gmail.com> +Viktor Pasynok <binjospookie@gmail.com> +zukhrik <kz_spiky@mail.ru> +Mika Andrianarijaona <mandrianarijaona@ext.sephora.fr> +SLy <sly5992@gmail.com> +Spoki4 <ivan.sherstnyuk@gmail.com> +uulaal <uulaal@mail.ru> +Antropov Andrey <antropov.a@skbkontur.ru> +Bohdan Petrov <mind.your.life.guide@gmail.com> +Egor Aristov <egor@realatom.com> +sergey20x25 <vdoond@mail.ru> +Ainur <33234903+ainursharaev@users.noreply.github.com> +Alexander Belov <16794134+belovweb@users.noreply.github.com> +Anton Kosykh <kelin2025@yandex.ru> +Anton Yurovskykh <11337124+yurovant@users.noreply.github.com> +Arsen-95 <83858217+Arsen-95@users.noreply.github.com> +Denis Sikuler <progwork@yandex.com> +Kirill <79372250+bybbsy@users.noreply.github.com> +Komar0ff <binary.reptile@gmail.com> +Maxim Sidorov <msidorov@boardmaps.com> +Renat Sagdeev <justrenat@gmail.com> +Samir <ash_dj@mail.ru> +Sozonov <sozonov@li.ru> +Stanislav <ixentrum@gmail.com> +Tauyekel Kunzhol <k.tauka@gmail.com> +Victor <yumaa.verdin@gmail.com> +Vladimir Ivakin <vla.ivakin@gmail.com> +aldibatyr@gmail.com <47831819+aldibatyr@users.noreply.github.com> +allcontributors[bot] <46447321+allcontributors[bot]@users.noreply.github.com> +cqh <cqh963852@hotmail.com> +ivanov-v <sferamail33@yandex.ru> +xaota <1172619+xaota@users.noreply.github.com> +☃︎ <faustienf@protonmail.com> +0xflotus <0xflotus@gmail.com> +45m0d3u5 <abdukarim.radjapov@gmail.com> +7iomka <7iomka@gmail.com> +Abel Siqueira <abel.s.siqueira@gmail.com> +Aleksandr Grigorii <42298502+domosedov@users.noreply.github.com> +Aleksei Arro <polsck@gmail.com> +Aleksei Pudnikov <alexey.pudnikov@yandex.ru> +Alex Anokhin <sasankhin124@gmail.com> +Alexander Mikhaylov <mihasia20008@gmail.com> +Alexandrsv <zbc@mail.ru> +Andrew Laiff <q.laiff@gmail.com> +Artsiom Rymarchyk <artsiom.rymarchyk@itechart-group.com> +DecliningLotus <declininglotus@gmail.com> +Denis Maushov <dmaushov@gmail.com> +Denis Skiba <skdenx@gmail.com> +Dmitry Dudin <dima.dudin@gmail.com> +Ed Prince <edprince@users.noreply.github.com> +Egor Gorbachev <ya.7gorbachev2016@yandex.ru> +Gabriel Husek <husek@me.com> +Ilya Martynov <84752977+Ilmar7786@users.noreply.github.com> +Infant Frontender <34810942+newbornfrontender@users.noreply.github.com> +Ivan Oshchepkov <oshchepkov.ivan@gmail.com> +Jan Keromnes <jan.keromnes@typefox.io> +Jesse Jackson <jsejcksn@users.noreply.github.com> +Joel Bandi <joelvivekbandi@gmail.com> +Kireev Mikhail <29187880+kireevmp@users.noreply.github.com> +Kirill Tyurin <kirill.tiurin@stm-labs.ru> +Kurzdor <pavloeksmidt@gmail.com> +Lebedev Konstantin <ibnRubaXa@gmail.com> +Leniorko <www.Len244@gmail.com> +Ludovic Dem <ludovic@demblans.com> +MiiZZo <miizzo.js@mail.ru> +Mike Cann <mike.cann@gmail.com> +Oleg <64708593+olejech@users.noreply.github.com> +Oleh <olegbrony@gmail.com> +Pasha Grekovich <pgrekovich@gmail.com> +Pavel Tereschenko <me@stupidcat.wtf> +Rachael Dawn <me@rachaeldawn.ca> +Rafael Fakhreev <rrfakhr5@mts.ru> +Raman Aktsisiuk <romadryud@gmail.com> +Robert Kuzhin <82271383+raidenmiro@users.noreply.github.com> +Roman <pomah156@gmail.com> +Satya Rohith <me@satyarohith.com> +Sergey Belozyorcev <belozyorcev@ya.ru> +Shiyan7 <57950265+Shiyan7@users.noreply.github.com> +The Gitter Badger <badger@gitter.im> +Usman Yunusov <usman.iunusov@gmail.com> +Vadim Filimonov <philimonovvadim@gmail.com> +Vasili Sviridov <vsviridov@exceede.com> +Vasili Svirydau <vsvirydau@copperleaf.com> +Victor Kolb <violetmonox@gmail.com> +Victor-Nikliaiev <victor.nikliaiev@gmail.com> +Vladislav <vladislav.melnikov.98@gmail.com> +Vladislav Botvin <darkvlados@gmail.com> +Will Heslam <willheslam@gmail.com> +WoodenPC <stiflerovich@mail.ru> +Yesset <bonkboykz@users.noreply.github.com> +alek-de-mik <Alek-de-Mik@yandex.ru> +anatolykopyl <akopyl@radner.ru> +ansunrisein <45604301+ansunrisein@users.noreply.github.com> +c01nd01r <stas.er.it@gmail.com> +dmitryplyaskin <35658668+dmitryplyaskin@users.noreply.github.com> +gzaripov <grigory.zaripov@gmail.com> +houston[bot] <astrobot-houston@users.noreply.github.com> +ilfey <ilfey.local@gmail.com> +kanno <812137533@qq.com> +leushkin <kirill.leushkin1@gmail.com> +miyaokamarina <miyaokamarina@gmail.com> +nulladdict <nulladdicted@gmail.com> +risenforces <i.am@risen.dev> +seonmyung.lim <seonmyung.lim@adriel.ai> +vladthelittleone <vladthelittleone@gmail.com> +xxxue <1659809758@qq.com> diff --git a/README.md b/README.md new file mode 100644 index 0000000..f9cc6fd --- /dev/null +++ b/README.md @@ -0,0 +1,44 @@ +# Documentation + +## Content files + +All files of the content can be written using MD or MDX inside `src/content/docs/[lang]`. + +Astro can find localized version via the same slug (path to the document) in the another directory: + +- `src/content/docs/[lang]/[slug].md` (_or `.mdx`_) +- `src/content/docs/en/api/effector/clearNode.md` +- `src/content/docs/ru/api/effector/clearNode.md` + +## Configuration + +The most basic setup is in `src/consts.ts`. + +Translation of the UI elements is in `src/languages.ts`. + +All navigation structure is in `src/navigation.ts`. + +## Run + +Simply install the `pnpm` and run: + +```shell +pnpm install +pnpm start +``` + +To fetch commits history, you need Github Personal Access Token. Just add it: + +```shell +GITHUB_TOKEN=github_pat_REDACTED_TOKEN pnpm start +``` + +### Search + +By default search disabled on the local machine due to index requirements. But you can enable it by following steps: + +1. Build the docs — `COMPRESS=false pnpm build` +2. Start search serve server — `pnpm search:dev` +3. Start astro with env parameter `PUBLIC_SEARCH=true pnpm dev` + +`COMPRESS=false` disables compressing, to speed up build. diff --git a/astro.config.ts b/astro.config.ts new file mode 100644 index 0000000..63b84a3 --- /dev/null +++ b/astro.config.ts @@ -0,0 +1,56 @@ +import "dotenv/config"; +import { defineConfig } from "astro/config"; +import mdx from "@astrojs/mdx"; +import compress from "astro-compress"; +import preact from "@astrojs/preact"; +import tailwind from "@astrojs/tailwind"; +import directive from "remark-directive"; +import github from "remark-github"; +import breaks from "remark-breaks"; +import rehypeAutolinkHeadings from "rehype-autolink-headings"; + +import { remarkHeadingId } from "@effector/remark-heading-id"; + +import { admonitions } from "./plugins/admonitions"; +import { remarkFallbackLang } from "./plugins/remark-fallback-lang"; + +// https://astro.build/config +export default defineConfig({ + site: process.env.NODE_ENV === "development" ? "http://localhost:4321" : `https://effector.dev`, + integrations: [ + tailwind({ applyBaseStyles: false }), + preact({ compat: true }), + mdx({ extendMarkdownConfig: true }), + process.env.COMPRESS !== "false" && compress(), + ], + prefetch: true, + base: "/", + build: { + assets: "assets", + }, + scopedStyleStrategy: "where", + markdown: { + syntaxHighlight: "prism", + remarkPlugins: [directive, admonitions, github, remarkHeadingId], + rehypePlugins: [ + [ + rehypeAutolinkHeadings, + { + behavior: "prepend", + properties: { class: "href" }, + }, + ], + ], + }, + vite: { + server: { + proxy: { + "/_pagefind": { + target: "http://127.0.0.1:1414", + rewrite: (path) => path.replace(/^\/dist/, ""), + }, + }, + }, + }, + devToolbar: { enabled: false }, +}); diff --git a/package.json b/package.json new file mode 100644 index 0000000..b3e00d7 --- /dev/null +++ b/package.json @@ -0,0 +1,68 @@ +{ + "name": "@effector/docs", + "type": "module", + "private": true, + "version": "23.0.0", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "build": "astro build", + "preview": "astro preview", + "astro": "astro", + "search:dev": "pagefind --serve", + "search:build": "pagefind" + }, + "repository": { + "type": "git", + "url": "https://github.com/effector/effector" + }, + "packageManager": "pnpm@8.11.0", + "overrides": { + "react": "npm:@preact/compat@latest", + "react-dom": "npm:@preact/compat@latest" + }, + "dependencies": { + "@algolia/client-search": "^4.22.1", + "@astrojs/mdx": "^2.2.1", + "@astrojs/preact": "^3.1.1", + "@astrojs/tailwind": "^5.1.0", + "@codesandbox/sandpack-react": "^2.10.0", + "@effector/remark-heading-id": "^2.0.2", + "@octokit/rest": "^19.0.13", + "@pagefind/default-ui": "^1.0.4", + "@tailwindcss/typography": "^0.5.10", + "@types/html-escaper": "^3.0.2", + "@types/mdast": "^4.0.3", + "@types/node": "^20.11.30", + "@types/react": "^18.2.69", + "@types/react-dom": "^18.2.22", + "@types/unist": "^3.0.2", + "astro": "^4.5.9", + "astro-compress": "^2.2.17", + "clsx": "^1.2.1", + "cssnano": "^6.1.1", + "dotenv": "^16.4.5", + "effector": "^23.2.0", + "html-escaper": "^3.0.3", + "nanoid": "^4.0.2", + "pagefind": "^1.0.4", + "preact": "^10.18.1", + "rehype-autolink-headings": "^7.1.0", + "remark-breaks": "^4.0.0", + "remark-directive": "^3.0.0", + "remark-github": "^12.0.0", + "rollup": "^4.13.0", + "tailwindcss": "^3.4.1", + "unist-util-map": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.1" + }, + "devDependencies": { + "mdast-util-directive": "^3.0.0", + "prettier": "^3.2.5", + "prettier-plugin-astro": "^0.13.0", + "prettier-plugin-organize-attributes": "^1.0.0", + "prettier-plugin-tailwindcss": "^0.5.13", + "typescript": "^5.2.2" + } +} diff --git a/pagefind.yml b/pagefind.yml new file mode 100644 index 0000000..7202ace --- /dev/null +++ b/pagefind.yml @@ -0,0 +1,4 @@ +exclude_selectors: + - "pre > code" +site: ./dist +output_subdir: ./_pagefind diff --git a/plugins/admonitions.ts b/plugins/admonitions.ts new file mode 100644 index 0000000..35960ce --- /dev/null +++ b/plugins/admonitions.ts @@ -0,0 +1,53 @@ +import { map } from "unist-util-map"; +import "mdast-util-directive"; +import type { Root, Node } from "mdast"; +import type { VFile } from "vfile"; +import type { TextDirective } from "mdast-util-directive"; + +// TODO: Add svg icons + +export function admonitions({ types = ["tip", "info", "warning"] } = {}) { + return (tree: Root, file: VFile) => { + return map(tree, (node) => { + if ( + node.type === "containerDirective" || + node.type === "textDirective" || + node.type === "leafDirective" + ) { + if (types.includes(node.name)) { + const children = node.children; + delete node.children; + + return h("div", { className: `admonition admonition-${node.name}` }, [ + h("div", { className: "admonition-heading" }, [ + h("span", { className: "admonition-title" }, [ + text(node.attributes!.title ?? node.name), + ]), + ]), + h("div", { className: "admonition-content" }, children), + ]) satisfies TextDirective; + } + } + return node; + }); + }; +} + +function node(type: string, name: string, props = {}, rest = {}) { + return { + type, + data: { + hName: name, + hProperties: props, + }, + ...rest, + }; +} + +function text(value: string) { + return { type: "text", value }; +} + +function h<T extends Node>(name: string, props = {}, children: unknown[] = []): T { + return node("element", name, props, { children }) as T; +} diff --git a/plugins/remark-fallback-lang.ts b/plugins/remark-fallback-lang.ts new file mode 100644 index 0000000..d4730ab --- /dev/null +++ b/plugins/remark-fallback-lang.ts @@ -0,0 +1,80 @@ +// Copied from https://github.com/withastro/docs/blob/main/plugins/remark-fallback-lang.ts +import fs from "node:fs"; +import path from "node:path"; +import type { Root } from "mdast"; +import type { Plugin, Transformer } from "unified"; +import { visit } from "unist-util-visit"; + +export function remarkFallbackLang() { + const pageSourceDir = path.resolve("./src/content/docs"); + const baseUrl = "https://effector.dev/"; + + const transformer: Transformer<Root> = (tree, file) => { + const pageUrl = mdFilePathToUrl(file.path, pageSourceDir, baseUrl); + const pageLang = getLanguageCodeFromPathname(pageUrl.pathname); + + // Ignore pages without language prefix and English pages + if (!pageLang || pageLang === "en") return; + + visit(tree, "link", (link) => { + const linkUrl = new URL(link.url, pageUrl); + + // Ignore external links + if (pageUrl.host !== linkUrl.host) return; + + // Ignore link targets without language prefix + const linkLang = getLanguageCodeFromPathname(linkUrl.pathname); + if (!linkLang) return; + + // Ignore link targets that have a valid source file + const linkSourceFileName = tryFindSourceFileForPathname(linkUrl.pathname, pageSourceDir); + if (linkSourceFileName) return; + + link.children.push({ + type: "html", + value: ` (EN)`, + }); + }); + }; + + return transformer; +} + +export function mdFilePathToUrl(mdFilePath: string, pageSourceDir: string, baseUrl: string) { + const pathBelowRoot = path.relative(pageSourceDir, mdFilePath); + const pathname = pathBelowRoot.replace(/\\/g, "/").replace(/\.mdx?$/i, "/"); + + return new URL(pathname, baseUrl); +} + +export function getLanguageCodeFromPathname(pathname: string) { + // Assuming that `pathname` always starts with a `/`, retrieve the first path part, + // which is usually the language code + const firstPathPart = pathname.split("/")[1]; + // Only return parts that look like a two-letter language code + // with optional two-letter country code + if (firstPathPart.match(/^[a-z]{2}(-[a-zA-Z]{2})?$/)) return firstPathPart; +} + +/** + * Attempts to find a Markdown source file for the given `pathname`. + * + * Example: Given a pathname of `/en/some-page` or `/en/some-page/`, + * searches for the source file in the following locations + * and returns the first matching path: + * - `${this.pageSourceDir}/en/some-page.md` + * - `${this.pageSourceDir}/en/some-page/index.md` + * - `${this.pageSourceDir}/e n/some-page.mdx` + * - `${this.pageSourceDir}/en/some-page/index.mdx` + * + * If no existing file is found, returns `undefined`. + */ +export function tryFindSourceFileForPathname(pathname: string, pageSourceDir: string) { + const possibleSourceFilePaths = [ + path.join(pageSourceDir, pathname, ".") + ".md", + path.join(pageSourceDir, pathname, "index.md"), + path.join(pageSourceDir, pathname, ".") + ".mdx", + path.join(pageSourceDir, pathname, "index.mdx"), + ]; + return possibleSourceFilePaths.find((possiblePath) => fs.existsSync(possiblePath)); +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000..4889913 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,6814 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +dependencies: + '@algolia/client-search': + specifier: ^4.22.1 + version: 4.22.1 + '@astrojs/mdx': + specifier: ^2.2.1 + version: 2.2.1(astro@4.5.9) + '@astrojs/preact': + specifier: ^3.1.1 + version: 3.1.1(@babel/core@7.24.3)(preact@10.18.1)(vite@5.2.4) + '@astrojs/tailwind': + specifier: ^5.1.0 + version: 5.1.0(astro@4.5.9)(tailwindcss@3.4.1) + '@codesandbox/sandpack-react': + specifier: ^2.10.0 + version: 2.10.0(@lezer/common@1.2.1)(react-dom@18.2.0)(react@18.2.0) + '@effector/remark-heading-id': + specifier: ^2.0.2 + version: 2.0.2(@types/mdast@4.0.3)(unified@10.1.2) + '@octokit/rest': + specifier: ^19.0.13 + version: 19.0.13 + '@pagefind/default-ui': + specifier: ^1.0.4 + version: 1.0.4 + '@tailwindcss/typography': + specifier: ^0.5.10 + version: 0.5.10(tailwindcss@3.4.1) + '@types/html-escaper': + specifier: ^3.0.2 + version: 3.0.2 + '@types/mdast': + specifier: ^4.0.3 + version: 4.0.3 + '@types/node': + specifier: ^20.11.30 + version: 20.11.30 + '@types/react': + specifier: ^18.2.69 + version: 18.2.69 + '@types/react-dom': + specifier: ^18.2.22 + version: 18.2.22 + '@types/unist': + specifier: ^3.0.2 + version: 3.0.2 + astro: + specifier: ^4.5.9 + version: 4.5.9(@types/node@20.11.30)(typescript@5.2.2) + astro-compress: + specifier: ^2.2.17 + version: 2.2.17 + clsx: + specifier: ^1.2.1 + version: 1.2.1 + cssnano: + specifier: ^6.1.1 + version: 6.1.1(postcss@8.4.38) + dotenv: + specifier: ^16.4.5 + version: 16.4.5 + effector: + specifier: ^23.2.0 + version: 23.2.0 + html-escaper: + specifier: ^3.0.3 + version: 3.0.3 + nanoid: + specifier: ^4.0.2 + version: 4.0.2 + pagefind: + specifier: ^1.0.4 + version: 1.0.4 + preact: + specifier: ^10.18.1 + version: 10.18.1 + rehype-autolink-headings: + specifier: ^7.1.0 + version: 7.1.0 + remark-breaks: + specifier: ^4.0.0 + version: 4.0.0 + remark-directive: + specifier: ^3.0.0 + version: 3.0.0 + remark-github: + specifier: ^12.0.0 + version: 12.0.0 + rollup: + specifier: ^4.13.0 + version: 4.13.0 + tailwindcss: + specifier: ^3.4.1 + version: 3.4.1 + unist-util-map: + specifier: ^4.0.0 + version: 4.0.0 + unist-util-visit: + specifier: ^5.0.0 + version: 5.0.0 + vfile: + specifier: ^6.0.1 + version: 6.0.1 + +devDependencies: + mdast-util-directive: + specifier: ^3.0.0 + version: 3.0.0 + prettier: + specifier: ^3.2.5 + version: 3.2.5 + prettier-plugin-astro: + specifier: ^0.13.0 + version: 0.13.0 + prettier-plugin-organize-attributes: + specifier: ^1.0.0 + version: 1.0.0(prettier@3.2.5) + prettier-plugin-tailwindcss: + specifier: ^0.5.13 + version: 0.5.13(prettier-plugin-astro@0.13.0)(prettier-plugin-organize-attributes@1.0.0)(prettier@3.2.5) + typescript: + specifier: ^5.2.2 + version: 5.2.2 + +packages: + + /@algolia/cache-common@4.22.1: + resolution: {integrity: sha512-TJMBKqZNKYB9TptRRjSUtevJeQVXRmg6rk9qgFKWvOy8jhCPdyNZV1nB3SKGufzvTVbomAukFR8guu/8NRKBTA==} + dev: false + + /@algolia/client-common@4.22.1: + resolution: {integrity: sha512-IvaL5v9mZtm4k4QHbBGDmU3wa/mKokmqNBqPj0K7lcR8ZDKzUorhcGp/u8PkPC/e0zoHSTvRh7TRkGX3Lm7iOQ==} + dependencies: + '@algolia/requester-common': 4.22.1 + '@algolia/transporter': 4.22.1 + dev: false + + /@algolia/client-search@4.22.1: + resolution: {integrity: sha512-yb05NA4tNaOgx3+rOxAmFztgMTtGBi97X7PC3jyNeGiwkAjOZc2QrdZBYyIdcDLoI09N0gjtpClcackoTN0gPA==} + dependencies: + '@algolia/client-common': 4.22.1 + '@algolia/requester-common': 4.22.1 + '@algolia/transporter': 4.22.1 + dev: false + + /@algolia/logger-common@4.22.1: + resolution: {integrity: sha512-OnTFymd2odHSO39r4DSWRFETkBufnY2iGUZNrMXpIhF5cmFE8pGoINNPzwg02QLBlGSaLqdKy0bM8S0GyqPLBg==} + dev: false + + /@algolia/requester-common@4.22.1: + resolution: {integrity: sha512-dgvhSAtg2MJnR+BxrIFqlLtkLlVVhas9HgYKMk2Uxiy5m6/8HZBL40JVAMb2LovoPFs9I/EWIoFVjOrFwzn5Qg==} + dev: false + + /@algolia/transporter@4.22.1: + resolution: {integrity: sha512-kzWgc2c9IdxMa3YqA6TN0NW5VrKYYW/BELIn7vnLyn+U/RFdZ4lxxt9/8yq3DKV5snvoDzzO4ClyejZRdV3lMQ==} + dependencies: + '@algolia/cache-common': 4.22.1 + '@algolia/logger-common': 4.22.1 + '@algolia/requester-common': 4.22.1 + dev: false + + /@alloc/quick-lru@5.2.0: + resolution: {integrity: sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==} + engines: {node: '>=10'} + dev: false + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + dev: false + + /@astrojs/compiler@1.8.2: + resolution: {integrity: sha512-o/ObKgtMzl8SlpIdzaxFnt7SATKPxu4oIP/1NL+HDJRzxfJcAkOTAb/ZKMRyULbz4q+1t2/DAebs2Z1QairkZw==} + dev: true + + /@astrojs/compiler@2.7.0: + resolution: {integrity: sha512-XpC8MAaWjD1ff6/IfkRq/5k1EFj6zhCNqXRd5J43SVJEBj/Bsmizkm8N0xOYscGcDFQkRgEw6/eKnI5x/1l6aA==} + dev: false + + /@astrojs/internal-helpers@0.3.0: + resolution: {integrity: sha512-tGmHvrhpzuz0JBHaJX8GywN9g4rldVNHtkoVDC3m/DdzBO70jGoVuc0uuNVglRYnsdwkbG0K02Iw3nOOR3/Y4g==} + dev: false + + /@astrojs/markdown-remark@4.3.1: + resolution: {integrity: sha512-eJFi600tkRjTFiwzY9oD8AgCgB7gFqyWCKWuZ33dATVBgLiROD+zlMZ8STZzU7+ZALvmiUAun/K7umTmP5YfVQ==} + dependencies: + '@astrojs/prism': 3.0.0 + github-slugger: 2.0.0 + hast-util-from-html: 2.0.1 + hast-util-to-text: 4.0.0 + import-meta-resolve: 4.0.0 + mdast-util-definitions: 6.0.0 + rehype-raw: 7.0.0 + rehype-stringify: 10.0.0 + remark-gfm: 4.0.0 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + remark-smartypants: 2.0.0 + shiki: 1.2.0 + unified: 11.0.4 + unist-util-remove-position: 5.0.0 + unist-util-visit: 5.0.0 + unist-util-visit-parents: 6.0.1 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/mdx@2.2.1(astro@4.5.9): + resolution: {integrity: sha512-bSr/AkvGieD9Pc5ZzMnAk7IHnw0vyt/aOujuYUmYT+NHiWahAUy/+ywNNMhTMmea0irdMYnBVC1AEKMQ/oXxow==} + engines: {node: '>=18.14.1'} + peerDependencies: + astro: ^4.0.0 + dependencies: + '@astrojs/markdown-remark': 4.3.1 + '@mdx-js/mdx': 3.0.1 + acorn: 8.11.2 + astro: 4.5.9(@types/node@20.11.30)(typescript@5.2.2) + es-module-lexer: 1.4.2 + estree-util-visit: 2.0.0 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + hast-util-to-html: 9.0.0 + kleur: 4.1.5 + rehype-raw: 7.0.0 + remark-gfm: 4.0.0 + remark-smartypants: 2.0.0 + source-map: 0.7.4 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@astrojs/preact@3.1.1(@babel/core@7.24.3)(preact@10.18.1)(vite@5.2.4): + resolution: {integrity: sha512-ASgmVzh4wLyIyynp5CIfDwE45Vg/tIP+Y+5SnQtURmCP1qZpjdUbsw+bGQ0wCSXtjIbzCBa7Kw7Qn0g6WE2W2w==} + engines: {node: '>=18.14.1'} + peerDependencies: + preact: ^10.6.5 + dependencies: + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.24.3) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.3) + '@preact/preset-vite': 2.8.2(@babel/core@7.24.3)(preact@10.18.1)(vite@5.2.4) + '@preact/signals': 1.2.1(preact@10.18.1) + babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.24.3) + preact: 10.18.1 + preact-render-to-string: 6.3.1(preact@10.18.1) + preact-ssr-prepass: 1.2.1(preact@10.18.1) + transitivePeerDependencies: + - '@babel/core' + - supports-color + - vite + dev: false + + /@astrojs/prism@3.0.0: + resolution: {integrity: sha512-g61lZupWq1bYbcBnYZqdjndShr/J3l/oFobBKPA3+qMat146zce3nz2kdO4giGbhYDt4gYdhmoBz0vZJ4sIurQ==} + engines: {node: '>=18.14.1'} + dependencies: + prismjs: 1.29.0 + dev: false + + /@astrojs/tailwind@5.1.0(astro@4.5.9)(tailwindcss@3.4.1): + resolution: {integrity: sha512-BJoCDKuWhU9FT2qYg+fr6Nfb3qP4ShtyjXGHKA/4mHN94z7BGcmauQK23iy+YH5qWvTnhqkd6mQPQ1yTZTe9Ig==} + peerDependencies: + astro: ^3.0.0 || ^4.0.0 + tailwindcss: ^3.0.24 + dependencies: + astro: 4.5.9(@types/node@20.11.30)(typescript@5.2.2) + autoprefixer: 10.4.16(postcss@8.4.31) + postcss: 8.4.31 + postcss-load-config: 4.0.2(postcss@8.4.31) + tailwindcss: 3.4.1 + transitivePeerDependencies: + - ts-node + dev: false + + /@astrojs/telemetry@3.0.4: + resolution: {integrity: sha512-A+0c7k/Xy293xx6odsYZuXiaHO0PL+bnDoXOc47sGDF5ffIKdKQGRPFl2NMlCF4L0NqN4Ynbgnaip+pPF0s7pQ==} + engines: {node: '>=18.14.1'} + dependencies: + ci-info: 3.9.0 + debug: 4.3.4 + dlv: 1.1.3 + dset: 3.1.3 + is-docker: 3.0.0 + is-wsl: 3.1.0 + which-pm-runs: 1.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/code-frame@7.23.5: + resolution: {integrity: sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.23.4 + chalk: 2.4.2 + dev: false + + /@babel/code-frame@7.24.2: + resolution: {integrity: sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.24.2 + picocolors: 1.0.0 + dev: false + + /@babel/compat-data@7.23.2: + resolution: {integrity: sha512-0S9TQMmDHlqAZ2ITT95irXKfxN9bncq8ZCoJhun3nHL/lLUxd2NKBJYoNGWH7S0hz6fRQwWlAWn/ILM0C70KZQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/compat-data@7.24.1: + resolution: {integrity: sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/core@7.23.5: + resolution: {integrity: sha512-Cwc2XjUrG4ilcfOw4wBAK+enbdgwAcAJCfGUItPBKR7Mjw4aEfAFYrLxeRp4jWgtNIKn3n2AlBOfwwafl+42/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.5 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.23.5) + '@babel/helpers': 7.23.5 + '@babel/parser': 7.23.5 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/core@7.24.3: + resolution: {integrity: sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-compilation-targets': 7.23.6 + '@babel/helper-module-transforms': 7.23.3(@babel/core@7.24.3) + '@babel/helpers': 7.24.1 + '@babel/parser': 7.24.1 + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/generator@7.23.5: + resolution: {integrity: sha512-BPssCHrBD+0YrxviOa3QzpqwhNIXKEtOa2jQrm4FlmkC2apYgRnQcmPWiGZDlGxiNtltnUFolMe8497Esry+jA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.5 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.20 + jsesc: 2.5.2 + dev: false + + /@babel/generator@7.24.1: + resolution: {integrity: sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + jsesc: 2.5.2 + dev: false + + /@babel/helper-annotate-as-pure@7.22.5: + resolution: {integrity: sha512-LvBTxu8bQSQkcyKOU+a1btnNFQ1dMAd0R6PyW3arXes06F6QLWLIrd681bxRPIXlrMGR3XYnW9JyML7dP3qgxg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.5 + dev: false + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.23.2 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: false + + /@babel/helper-compilation-targets@7.23.6: + resolution: {integrity: sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.24.1 + '@babel/helper-validator-option': 7.23.5 + browserslist: 4.23.0 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: false + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.5 + dev: false + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.5 + dev: false + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.5 + dev: false + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.23.5): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: false + + /@babel/helper-module-transforms@7.23.3(@babel/core@7.24.3): + resolution: {integrity: sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: false + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.24.0 + dev: false + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.5 + dev: false + + /@babel/helper-string-parser@7.23.4: + resolution: {integrity: sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helper-validator-option@7.23.5: + resolution: {integrity: sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==} + engines: {node: '>=6.9.0'} + dev: false + + /@babel/helpers@7.23.5: + resolution: {integrity: sha512-oO7us8FzTEsG3U6ag9MfdF1iA/7Z6dz+MtFhifZk8C8o453rGJFFWUP1t+ULM9TUIAzC9uxXEiXjOiVMyd7QPg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/helpers@7.24.1: + resolution: {integrity: sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.24.0 + '@babel/traverse': 7.24.1 + '@babel/types': 7.24.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/highlight@7.23.4: + resolution: {integrity: sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + dev: false + + /@babel/highlight@7.24.2: + resolution: {integrity: sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + picocolors: 1.0.0 + dev: false + + /@babel/parser@7.23.5: + resolution: {integrity: sha512-hOOqoiNXrmGdFbhgCzu6GiURxUgM27Xwd/aPuu8RfHEZPBzL1Z54okAHAQjXfcQNwvrlkAmAp4SlRTZ45vlthQ==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.5 + dev: false + + /@babel/parser@7.24.1: + resolution: {integrity: sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.24.0 + dev: false + + /@babel/plugin-syntax-jsx@7.22.5(@babel/core@7.24.3): + resolution: {integrity: sha512-gvyP4hZrgrs/wWMaocvxZ44Hw0b3W8Pe+cMxc8V1ULQ07oh8VNbIRaoD1LRZVTvD+0nieDKjfgKg89sD7rrKrg==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-plugin-utils': 7.22.5 + dev: false + + /@babel/plugin-transform-react-jsx-development@7.22.5(@babel/core@7.24.3): + resolution: {integrity: sha512-bDhuzwWMuInwCYeDeMzyi7TaBgRQei6DqxhbyniL7/VG4RSS7HtSL2QbY4eESy1KJqlWt8g3xeEBGPuo+XqC8A==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.24.3) + dev: false + + /@babel/plugin-transform-react-jsx@7.22.15(@babel/core@7.24.3): + resolution: {integrity: sha512-oKckg2eZFa8771O/5vi7XeTvmM6+O9cxZu+kanTU7tD4sin5nO/G8jGJhq8Hvt2Z0kUoEDRayuZLaUlYl8QuGA==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.24.3 + '@babel/helper-annotate-as-pure': 7.22.5 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-plugin-utils': 7.22.5 + '@babel/plugin-syntax-jsx': 7.22.5(@babel/core@7.24.3) + '@babel/types': 7.23.5 + dev: false + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/parser': 7.23.5 + '@babel/types': 7.23.5 + dev: false + + /@babel/template@7.24.0: + resolution: {integrity: sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + dev: false + + /@babel/traverse@7.23.5: + resolution: {integrity: sha512-czx7Xy5a6sapWWRx61m1Ke1Ra4vczu1mCTtJam5zRTBOonfdJ+S/B6HYmGYu3fJtr8GGET3si6IhgWVBhJ/m8w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.23.5 + '@babel/generator': 7.23.5 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.5 + '@babel/types': 7.23.5 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/traverse@7.24.1: + resolution: {integrity: sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.24.2 + '@babel/generator': 7.24.1 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.24.1 + '@babel/types': 7.24.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@babel/types@7.23.5: + resolution: {integrity: sha512-ON5kSOJwVO6xXVRTvOI0eOnWe7VdUcIpsovGo9U/Br4Ie4UVFQTboO2cYnDhAGU6Fp+UxSiT+pMft0SMHfuq6w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: false + + /@babel/types@7.24.0: + resolution: {integrity: sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.23.4 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: false + + /@codemirror/autocomplete@6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1): + resolution: {integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + dependencies: + '@codemirror/language': 6.9.3 + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + '@lezer/common': 1.1.1 + dev: false + + /@codemirror/autocomplete@6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.2.1): + resolution: {integrity: sha512-L5UInv8Ffd6BPw0P3EF7JLYAMeEbclY7+6Q11REt8vhih8RuLreKtPy/xk8wPxs4EQgYqzI7cdgpiYwWlbS/ow==} + peerDependencies: + '@codemirror/language': ^6.0.0 + '@codemirror/state': ^6.0.0 + '@codemirror/view': ^6.0.0 + '@lezer/common': ^1.0.0 + dependencies: + '@codemirror/language': 6.9.3 + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + '@lezer/common': 1.2.1 + dev: false + + /@codemirror/commands@6.3.2: + resolution: {integrity: sha512-tjoi4MCWDNxgIpoLZ7+tezdS9OEB6pkiDKhfKx9ReJ/XBcs2G2RXIu+/FxXBlWsPTsz6C9q/r4gjzrsxpcnqCQ==} + dependencies: + '@codemirror/language': 6.9.3 + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + '@lezer/common': 1.1.1 + dev: false + + /@codemirror/lang-css@6.2.1(@codemirror/view@6.22.1): + resolution: {integrity: sha512-/UNWDNV5Viwi/1lpr/dIXJNWiwDxpw13I4pTUAsNxZdg6E0mI2kTQb0P2iHczg1Tu+H4EBgJR+hYhKiHKko7qg==} + dependencies: + '@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1) + '@codemirror/language': 6.9.3 + '@codemirror/state': 6.3.2 + '@lezer/common': 1.1.1 + '@lezer/css': 1.1.4 + transitivePeerDependencies: + - '@codemirror/view' + dev: false + + /@codemirror/lang-html@6.4.7: + resolution: {integrity: sha512-y9hWSSO41XlcL4uYwWyk0lEgTHcelWWfRuqmvcAmxfCs0HNWZdriWo/EU43S63SxEZpc1Hd50Itw7ktfQvfkUg==} + dependencies: + '@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1) + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.22.1) + '@codemirror/lang-javascript': 6.2.1 + '@codemirror/language': 6.9.3 + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + '@lezer/common': 1.1.1 + '@lezer/css': 1.1.4 + '@lezer/html': 1.3.7 + dev: false + + /@codemirror/lang-javascript@6.2.1: + resolution: {integrity: sha512-jlFOXTejVyiQCW3EQwvKH0m99bUYIw40oPmFjSX2VS78yzfe0HELZ+NEo9Yfo1MkGRpGlj3Gnu4rdxV1EnAs5A==} + dependencies: + '@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.1.1) + '@codemirror/language': 6.9.3 + '@codemirror/lint': 6.4.2 + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + '@lezer/common': 1.1.1 + '@lezer/javascript': 1.4.9 + dev: false + + /@codemirror/language@6.9.3: + resolution: {integrity: sha512-qq48pYzoi6ldYWV/52+Z9Ou6QouVI+8YwvxFbUypI33NbjG2UeRHKENRyhwljTTiOqjQ33FjyZj6EREQ9apAOQ==} + dependencies: + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + '@lezer/common': 1.1.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.3.14 + style-mod: 4.1.0 + dev: false + + /@codemirror/lint@6.4.2: + resolution: {integrity: sha512-wzRkluWb1ptPKdzlsrbwwjYCPLgzU6N88YBAmlZi8WFyuiEduSd05MnJYNogzyc8rPK7pj6m95ptUApc8sHKVA==} + dependencies: + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + crelt: 1.0.6 + dev: false + + /@codemirror/state@6.3.2: + resolution: {integrity: sha512-5jEikOfU0r9y+OTlZn5AEQB15mibu3deLBUp+GnLzVUNezEEuPt/JdSeniQNi+0YviblAvOPO2JQAlgJ3SYYaA==} + dev: false + + /@codemirror/view@6.22.1: + resolution: {integrity: sha512-38BRn1nPqZqiHbmWfI8zri23IbRVbmSpSmh1E/Ysvc+lIGGdBC17K8zlK7ZU6fhfy9x4De9Zyj5JQqScPq5DkA==} + dependencies: + '@codemirror/state': 6.3.2 + style-mod: 4.1.0 + w3c-keyname: 2.2.8 + dev: false + + /@codesandbox/nodebox@0.1.8: + resolution: {integrity: sha512-2VRS6JDSk+M+pg56GA6CryyUSGPjBEe8Pnae0QL3jJF1mJZJVMDKr93gJRtBbLkfZN6LD/DwMtf+2L0bpWrjqg==} + dependencies: + outvariant: 1.4.0 + strict-event-emitter: 0.4.6 + dev: false + + /@codesandbox/sandpack-client@2.10.0: + resolution: {integrity: sha512-1vLN0j8ElzTmTG43yoBj1dsOyuw6SqRH9rRa13D32jtM4v2qPFLWIFElcyNpH/YbWsCRZTUCN6ku6U4Yw/Xdvg==} + dependencies: + '@codesandbox/nodebox': 0.1.8 + buffer: 6.0.3 + dequal: 2.0.3 + outvariant: 1.4.0 + static-browser-server: 1.0.3 + dev: false + + /@codesandbox/sandpack-react@2.10.0(@lezer/common@1.2.1)(react-dom@18.2.0)(react@18.2.0): + resolution: {integrity: sha512-XDUOJMPp97FK9YUjHlgFQQqWJY77ih215wFz2CWEzJTalRIM6yneexcTs62Jv1VtgHmRkUxdsgZPqT6KCqKAEA==} + peerDependencies: + react: ^16.8.0 || ^17 || ^18 + react-dom: ^16.8.0 || ^17 || ^18 + dependencies: + '@codemirror/autocomplete': 6.11.1(@codemirror/language@6.9.3)(@codemirror/state@6.3.2)(@codemirror/view@6.22.1)(@lezer/common@1.2.1) + '@codemirror/commands': 6.3.2 + '@codemirror/lang-css': 6.2.1(@codemirror/view@6.22.1) + '@codemirror/lang-html': 6.4.7 + '@codemirror/lang-javascript': 6.2.1 + '@codemirror/language': 6.9.3 + '@codemirror/state': 6.3.2 + '@codemirror/view': 6.22.1 + '@codesandbox/sandpack-client': 2.10.0 + '@lezer/highlight': 1.2.0 + '@react-hook/intersection-observer': 3.1.1(react@18.2.0) + '@stitches/core': 1.2.8 + anser: 2.1.1 + clean-set: 1.1.2 + codesandbox-import-util-types: 2.2.3 + dequal: 2.0.3 + escape-carriage: 1.3.1 + lz-string: 1.5.0 + react: 18.2.0 + react-devtools-inline: 4.4.0 + react-dom: 18.2.0(react@18.2.0) + react-is: 17.0.2 + transitivePeerDependencies: + - '@lezer/common' + dev: false + + /@effector/remark-heading-id@2.0.2(@types/mdast@4.0.3)(unified@10.1.2): + resolution: {integrity: sha512-W28SkiSOtfJf8P5pTqtoybwC7naPwf0n9rFniC4ym1s3UYnT7Zj3itFo9CfkIZ0i0haPCMztxXjpkxANUKxh5Q==} + engines: {node: '>=8'} + peerDependencies: + '@types/mdast': ^3.0.11 + unified: ^10.1.0 + dependencies: + '@types/mdast': 4.0.3 + lodash: 4.17.21 + unified: 10.1.2 + unist-util-visit: 1.4.1 + dev: false + + /@emnapi/runtime@0.45.0: + resolution: {integrity: sha512-Txumi3td7J4A/xTTwlssKieHKTGl3j4A1tglBx72auZ49YK7ePY6XZricgIg9mnZT4xPfA+UPCUdnhRuEFDL+w==} + requiresBuild: true + dependencies: + tslib: 2.6.2 + dev: false + optional: true + + /@esbuild/aix-ppc64@0.19.12: + resolution: {integrity: sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: false + optional: true + + /@esbuild/aix-ppc64@0.20.2: + resolution: {integrity: sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [aix] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm64@0.19.12: + resolution: {integrity: sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm64@0.20.2: + resolution: {integrity: sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==} + engines: {node: '>=12'} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.19.12: + resolution: {integrity: sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-arm@0.20.2: + resolution: {integrity: sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==} + engines: {node: '>=12'} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.19.12: + resolution: {integrity: sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/android-x64@0.20.2: + resolution: {integrity: sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==} + engines: {node: '>=12'} + cpu: [x64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.19.12: + resolution: {integrity: sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-arm64@0.20.2: + resolution: {integrity: sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.19.12: + resolution: {integrity: sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/darwin-x64@0.20.2: + resolution: {integrity: sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==} + engines: {node: '>=12'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.19.12: + resolution: {integrity: sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-arm64@0.20.2: + resolution: {integrity: sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==} + engines: {node: '>=12'} + cpu: [arm64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.19.12: + resolution: {integrity: sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/freebsd-x64@0.20.2: + resolution: {integrity: sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==} + engines: {node: '>=12'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.19.12: + resolution: {integrity: sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm64@0.20.2: + resolution: {integrity: sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.19.12: + resolution: {integrity: sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-arm@0.20.2: + resolution: {integrity: sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==} + engines: {node: '>=12'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.19.12: + resolution: {integrity: sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ia32@0.20.2: + resolution: {integrity: sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==} + engines: {node: '>=12'} + cpu: [ia32] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.19.12: + resolution: {integrity: sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-loong64@0.20.2: + resolution: {integrity: sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==} + engines: {node: '>=12'} + cpu: [loong64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.19.12: + resolution: {integrity: sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-mips64el@0.20.2: + resolution: {integrity: sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==} + engines: {node: '>=12'} + cpu: [mips64el] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.19.12: + resolution: {integrity: sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-ppc64@0.20.2: + resolution: {integrity: sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==} + engines: {node: '>=12'} + cpu: [ppc64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.19.12: + resolution: {integrity: sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-riscv64@0.20.2: + resolution: {integrity: sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==} + engines: {node: '>=12'} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.19.12: + resolution: {integrity: sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-s390x@0.20.2: + resolution: {integrity: sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==} + engines: {node: '>=12'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.19.12: + resolution: {integrity: sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/linux-x64@0.20.2: + resolution: {integrity: sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==} + engines: {node: '>=12'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.19.12: + resolution: {integrity: sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/netbsd-x64@0.20.2: + resolution: {integrity: sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [netbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.19.12: + resolution: {integrity: sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/openbsd-x64@0.20.2: + resolution: {integrity: sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [openbsd] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.19.12: + resolution: {integrity: sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/sunos-x64@0.20.2: + resolution: {integrity: sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==} + engines: {node: '>=12'} + cpu: [x64] + os: [sunos] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.19.12: + resolution: {integrity: sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-arm64@0.20.2: + resolution: {integrity: sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==} + engines: {node: '>=12'} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.19.12: + resolution: {integrity: sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-ia32@0.20.2: + resolution: {integrity: sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==} + engines: {node: '>=12'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.19.12: + resolution: {integrity: sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@esbuild/win32-x64@0.20.2: + resolution: {integrity: sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==} + engines: {node: '>=12'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-darwin-arm64@0.33.2: + resolution: {integrity: sha512-itHBs1rPmsmGF9p4qRe++CzCgd+kFYktnsoR1sbIAfsRMrJZau0Tt1AH9KVnufc2/tU02Gf6Ibujx+15qRE03w==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.0.1 + dev: false + optional: true + + /@img/sharp-darwin-x64@0.33.2: + resolution: {integrity: sha512-/rK/69Rrp9x5kaWBjVN07KixZanRr+W1OiyKdXcbjQD6KbW+obaTeBBtLUAtbBsnlTTmWthw99xqoOS7SsySDg==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.0.1 + dev: false + optional: true + + /@img/sharp-libvips-darwin-arm64@1.0.1: + resolution: {integrity: sha512-kQyrSNd6lmBV7O0BUiyu/OEw9yeNGFbQhbxswS1i6rMDwBBSX+e+rPzu3S+MwAiGU3HdLze3PanQ4Xkfemgzcw==} + engines: {macos: '>=11', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-darwin-x64@1.0.1: + resolution: {integrity: sha512-eVU/JYLPVjhhrd8Tk6gosl5pVlvsqiFlt50wotCvdkFGf+mDNBJxMh+bvav+Wt3EBnNZWq8Sp2I7XfSjm8siog==} + engines: {macos: '>=10.13', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm64@1.0.1: + resolution: {integrity: sha512-bnGG+MJjdX70mAQcSLxgeJco11G+MxTz+ebxlz8Y3dxyeb3Nkl7LgLI0mXupoO+u1wRNx/iRj5yHtzA4sde1yA==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-arm@1.0.1: + resolution: {integrity: sha512-FtdMvR4R99FTsD53IA3LxYGghQ82t3yt0ZQ93WMZ2xV3dqrb0E8zq4VHaTOuLEAuA83oDawHV3fd+BsAPadHIQ==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-s390x@1.0.1: + resolution: {integrity: sha512-3+rzfAR1YpMOeA2zZNp+aYEzGNWK4zF3+sdMxuCS3ey9HhDbJ66w6hDSHDMoap32DueFwhhs3vwooAB2MaK4XQ==} + engines: {glibc: '>=2.28', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linux-x64@1.0.1: + resolution: {integrity: sha512-3NR1mxFsaSgMMzz1bAnnKbSAI+lHXVTqAHgc1bgzjHuXjo4hlscpUxc0vFSAPKI3yuzdzcZOkq7nDPrP2F8Jgw==} + engines: {glibc: '>=2.26', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-arm64@1.0.1: + resolution: {integrity: sha512-5aBRcjHDG/T6jwC3Edl3lP8nl9U2Yo8+oTl5drd1dh9Z1EBfzUKAJFUDTDisDjUwc7N4AjnPGfCA3jl3hY8uDg==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-libvips-linuxmusl-x64@1.0.1: + resolution: {integrity: sha512-dcT7inI9DBFK6ovfeWRe3hG30h51cBAP5JXlZfx6pzc/Mnf9HFCQDLtYf4MCBjxaaTfjCCjkBxcy3XzOAo5txw==} + engines: {musl: '>=1.2.2', npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-linux-arm64@0.33.2: + resolution: {integrity: sha512-pz0NNo882vVfqJ0yNInuG9YH71smP4gRSdeL09ukC2YLE6ZyZePAlWKEHgAzJGTiOh8Qkaov6mMIMlEhmLdKew==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.0.1 + dev: false + optional: true + + /@img/sharp-linux-arm@0.33.2: + resolution: {integrity: sha512-Fndk/4Zq3vAc4G/qyfXASbS3HBZbKrlnKZLEJzPLrXoJuipFNNwTes71+Ki1hwYW5lch26niRYoZFAtZVf3EGA==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.0.1 + dev: false + optional: true + + /@img/sharp-linux-s390x@0.33.2: + resolution: {integrity: sha512-MBoInDXDppMfhSzbMmOQtGfloVAflS2rP1qPcUIiITMi36Mm5YR7r0ASND99razjQUpHTzjrU1flO76hKvP5RA==} + engines: {glibc: '>=2.28', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [s390x] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.0.1 + dev: false + optional: true + + /@img/sharp-linux-x64@0.33.2: + resolution: {integrity: sha512-xUT82H5IbXewKkeF5aiooajoO1tQV4PnKfS/OZtb5DDdxS/FCI/uXTVZ35GQ97RZXsycojz/AJ0asoz6p2/H/A==} + engines: {glibc: '>=2.26', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.0.1 + dev: false + optional: true + + /@img/sharp-linuxmusl-arm64@0.33.2: + resolution: {integrity: sha512-F+0z8JCu/UnMzg8IYW1TMeiViIWBVg7IWP6nE0p5S5EPQxlLd76c8jYemG21X99UzFwgkRo5yz2DS+zbrnxZeA==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.0.1 + dev: false + optional: true + + /@img/sharp-linuxmusl-x64@0.33.2: + resolution: {integrity: sha512-+ZLE3SQmSL+Fn1gmSaM8uFusW5Y3J9VOf+wMGNnTtJUMUxFhv+P4UPaYEYT8tqnyYVaOVGgMN/zsOxn9pSsO2A==} + engines: {musl: '>=1.2.2', node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.0.1 + dev: false + optional: true + + /@img/sharp-wasm32@0.33.2: + resolution: {integrity: sha512-fLbTaESVKuQcpm8ffgBD7jLb/CQLcATju/jxtTXR1XCLwbOQt+OL5zPHSDMmp2JZIeq82e18yE0Vv7zh6+6BfQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [wasm32] + requiresBuild: true + dependencies: + '@emnapi/runtime': 0.45.0 + dev: false + optional: true + + /@img/sharp-win32-ia32@0.33.2: + resolution: {integrity: sha512-okBpql96hIGuZ4lN3+nsAjGeggxKm7hIRu9zyec0lnfB8E7Z6p95BuRZzDDXZOl2e8UmR4RhYt631i7mfmKU8g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@img/sharp-win32-x64@0.33.2: + resolution: {integrity: sha512-E4magOks77DK47FwHUIGH0RYWSgRBfGdK56kIHSVeB9uIS4pPFr4N2kIVsXdQQo4LzOsENKV5KAhRlRL7eMAdg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0, npm: '>=9.6.5', pnpm: '>=7.1.0', yarn: '>=3.2.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@isaacs/cliui@8.0.2: + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + string-width-cjs: /string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: /strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: /wrap-ansi@7.0.0 + dev: false + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.20 + dev: false + + /@jridgewell/gen-mapping@0.3.5: + resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.2.1 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.25 + dev: false + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/set-array@1.2.1: + resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} + engines: {node: '>=6.0.0'} + dev: false + + /@jridgewell/source-map@0.3.6: + resolution: {integrity: sha512-1ZJTZebgqllO79ue2bm3rIGud/bOe0pP5BjSRCRxxYkEZS8STV7zN84UBbiYu7jy+eCKSnVIUgoWWE/tt+shMQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + '@jridgewell/trace-mapping': 0.3.25 + dev: false + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + dev: false + + /@jridgewell/trace-mapping@0.3.20: + resolution: {integrity: sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@jridgewell/trace-mapping@0.3.25: + resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /@lezer/common@1.1.1: + resolution: {integrity: sha512-aAPB9YbvZHqAW+bIwiuuTDGB4DG0sYNRObGLxud8cW7osw1ZQxfDuTZ8KQiqfZ0QJGcR34CvpTMDXEyo/+Htgg==} + dev: false + + /@lezer/common@1.2.1: + resolution: {integrity: sha512-yemX0ZD2xS/73llMZIK6KplkjIjf2EvAHcinDi/TfJ9hS25G0388+ClHt6/3but0oOxinTcQHJLDXh6w1crzFQ==} + dev: false + + /@lezer/css@1.1.4: + resolution: {integrity: sha512-CuUwjidrU7FOBokqASRJc72SmJ9g1PsHXDOWMoKg4md6+2u/Zxzwx5YsYrAFxRDsLrjLlsIyEF1rZHK3gFEJbw==} + dependencies: + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.3.14 + dev: false + + /@lezer/highlight@1.2.0: + resolution: {integrity: sha512-WrS5Mw51sGrpqjlh3d4/fOwpEV2Hd3YOkp9DBt4k8XZQcoTHZFB7sx030A6OcahF4J1nDQAa3jXlTVVYH50IFA==} + dependencies: + '@lezer/common': 1.1.1 + dev: false + + /@lezer/html@1.3.7: + resolution: {integrity: sha512-Wo+rZ5UjLP0VqUTyXjzgmTYRW5bvTJUFn4Uw0K3HCQjX2/+f+zRo9GLN5BCAojwHQISPvaQk8BWSv2SSKx/UcQ==} + dependencies: + '@lezer/common': 1.1.1 + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.3.14 + dev: false + + /@lezer/javascript@1.4.9: + resolution: {integrity: sha512-7Uv8mBBE6l44spgWEZvEMdDqGV+FIuY7kJ1o5TFm+jxIuxydO3PcKJYiINij09igd1D/9P7l2KDqpkN8c3bM6A==} + dependencies: + '@lezer/highlight': 1.2.0 + '@lezer/lr': 1.3.14 + dev: false + + /@lezer/lr@1.3.14: + resolution: {integrity: sha512-z5mY4LStlA3yL7aHT/rqgG614cfcvklS+8oFRFBYrs4YaWLJyKKM4+nN6KopToX0o9Hj6zmH6M5kinOYuy06ug==} + dependencies: + '@lezer/common': 1.1.1 + dev: false + + /@mdx-js/mdx@3.0.1: + resolution: {integrity: sha512-eIQ4QTrOWyL3LWEe/bu6Taqzq2HQvHcyTMaOrI95P2/LmJE7AsfPfgJGuFLPVqBUE1BC1rik3VIhU+s9u72arA==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + '@types/mdx': 2.0.9 + collapse-white-space: 2.1.0 + devlop: 1.1.0 + estree-util-build-jsx: 3.0.1 + estree-util-is-identifier-name: 3.0.0 + estree-util-to-js: 2.0.0 + estree-walker: 3.0.3 + hast-util-to-estree: 3.1.0 + hast-util-to-jsx-runtime: 2.3.0 + markdown-extensions: 2.0.0 + periscopic: 3.1.0 + remark-mdx: 3.0.1 + remark-parse: 11.0.0 + remark-rehype: 11.1.0 + source-map: 0.7.4 + unified: 11.0.4 + unist-util-position-from-estree: 2.0.0 + unist-util-stringify-position: 4.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + transitivePeerDependencies: + - supports-color + dev: false + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: false + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: false + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: false + + /@octokit/auth-token@3.0.4: + resolution: {integrity: sha512-TWFX7cZF2LXoCvdmJWY7XVPi74aSY0+FfBZNSXEXFkMpjcqsQwDSYVv5FhRFaI0V1ECnwbz4j59T/G+rXNWaIQ==} + engines: {node: '>= 14'} + dev: false + + /@octokit/core@4.2.4: + resolution: {integrity: sha512-rYKilwgzQ7/imScn3M9/pFfUf4I1AZEH3KhyJmtPdE2zfaXAn2mFfUy4FbKewzc2We5y/LlKLj36fWJLKC2SIQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/auth-token': 3.0.4 + '@octokit/graphql': 5.0.6 + '@octokit/request': 6.2.8 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + before-after-hook: 2.2.3 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/endpoint@7.0.6: + resolution: {integrity: sha512-5L4fseVRUsDFGR00tMWD/Trdeeihn999rTMGRMC1G/Ldi1uWlWJzI98H4Iak5DB/RVvQuyMYKqSK/R6mbSOQyg==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + universal-user-agent: 6.0.0 + dev: false + + /@octokit/graphql@5.0.6: + resolution: {integrity: sha512-Fxyxdy/JH0MnIB5h+UQ3yCoh1FG4kWXfFKkpWqjZHw/p+Kc8Y44Hu/kCgNBT6nU1shNumEchmW/sUO1JuQnPcw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/request': 6.2.8 + '@octokit/types': 9.3.2 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/openapi-types@18.1.1: + resolution: {integrity: sha512-VRaeH8nCDtF5aXWnjPuEMIYf1itK/s3JYyJcWFJT8X9pSNnBtriDf7wlEWsGuhPLl4QIH4xM8fqTXDwJ3Mu6sw==} + dev: false + + /@octokit/plugin-paginate-rest@6.1.2(@octokit/core@4.2.4): + resolution: {integrity: sha512-qhrmtQeHU/IivxucOV1bbI/xZyC/iOBhclokv7Sut5vnejAIAEXVcGQeRpQlU39E0WwK9lNvJHphHri/DB6lbQ==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=4' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/tsconfig': 1.0.2 + '@octokit/types': 9.3.2 + dev: false + + /@octokit/plugin-request-log@1.0.4(@octokit/core@4.2.4): + resolution: {integrity: sha512-mLUsMkgP7K/cnFEw07kWqXGF5LKrOkD+lhCrKvPHXWDywAwuDUeDwWBpc69XK3pNX0uKiVt8g5z96PJ6z9xCFA==} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + dev: false + + /@octokit/plugin-rest-endpoint-methods@7.2.3(@octokit/core@4.2.4): + resolution: {integrity: sha512-I5Gml6kTAkzVlN7KCtjOM+Ruwe/rQppp0QU372K1GP7kNOYEKe8Xn5BW4sE62JAHdwpq95OQK/qGNyKQMUzVgA==} + engines: {node: '>= 14'} + peerDependencies: + '@octokit/core': '>=3' + dependencies: + '@octokit/core': 4.2.4 + '@octokit/types': 10.0.0 + dev: false + + /@octokit/request-error@3.0.3: + resolution: {integrity: sha512-crqw3V5Iy2uOU5Np+8M/YexTlT8zxCfI+qu+LxUB7SZpje4Qmx3mub5DfEKSO8Ylyk0aogi6TYdf6kxzh2BguQ==} + engines: {node: '>= 14'} + dependencies: + '@octokit/types': 9.3.2 + deprecation: 2.3.1 + once: 1.4.0 + dev: false + + /@octokit/request@6.2.8: + resolution: {integrity: sha512-ow4+pkVQ+6XVVsekSYBzJC0VTVvh/FCTUUgTsboGq+DTeWdyIFV8WSCdo0RIxk6wSkBTHqIK1mYuY7nOBXOchw==} + engines: {node: '>= 14'} + dependencies: + '@octokit/endpoint': 7.0.6 + '@octokit/request-error': 3.0.3 + '@octokit/types': 9.3.2 + is-plain-object: 5.0.0 + node-fetch: 2.7.0 + universal-user-agent: 6.0.0 + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/rest@19.0.13: + resolution: {integrity: sha512-/EzVox5V9gYGdbAI+ovYj3nXQT1TtTHRT+0eZPcuC05UFSWO3mdO9UY1C0i2eLF9Un1ONJkAk+IEtYGAC+TahA==} + engines: {node: '>= 14'} + dependencies: + '@octokit/core': 4.2.4 + '@octokit/plugin-paginate-rest': 6.1.2(@octokit/core@4.2.4) + '@octokit/plugin-request-log': 1.0.4(@octokit/core@4.2.4) + '@octokit/plugin-rest-endpoint-methods': 7.2.3(@octokit/core@4.2.4) + transitivePeerDependencies: + - encoding + dev: false + + /@octokit/tsconfig@1.0.2: + resolution: {integrity: sha512-I0vDR0rdtP8p2lGMzvsJzbhdOWy405HcGovrspJ8RRibHnyRgggUSNO5AIox5LmqiwmatHKYsvj6VGFHkqS7lA==} + dev: false + + /@octokit/types@10.0.0: + resolution: {integrity: sha512-Vm8IddVmhCgU1fxC1eyinpwqzXPEYu0NrYzD3YZjlGjyftdLBTeqNblRC0jmJmgxbJIsQlyogVeGnrNaaMVzIg==} + dependencies: + '@octokit/openapi-types': 18.1.1 + dev: false + + /@octokit/types@9.3.2: + resolution: {integrity: sha512-D4iHGTdAnEEVsB8fl95m1hiz7D5YiRdQ9b/OEb3BYRVwbLsGHcRVPz+u+BgRLNk0Q0/4iZCBqDN96j2XNxfXrA==} + dependencies: + '@octokit/openapi-types': 18.1.1 + dev: false + + /@open-draft/deferred-promise@2.2.0: + resolution: {integrity: sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==} + dev: false + + /@pagefind/darwin-arm64@1.0.4: + resolution: {integrity: sha512-2OcthvceX2xhm5XbgOmW+lT45oLuHqCmvFeFtxh1gsuP5cO8vcD8ZH8Laj4pXQFCcK6eAdSShx+Ztx/LsQWZFQ==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@pagefind/darwin-x64@1.0.4: + resolution: {integrity: sha512-xkdvp0D9Ld/ZKsjo/y1bgfhTEU72ITimd2PMMQtts7jf6JPIOJbsiErCvm37m/qMFuPGEq/8d+fZ4pydOj08HQ==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@pagefind/default-ui@1.0.4: + resolution: {integrity: sha512-edkcaPSKq67C49Vehjo+LQCpT615v4d7JRhfGzFPccePvdklaL+VXrfghN/uIfsdoG+HoLI1PcYy2iFcB9CTkw==} + dev: false + + /@pagefind/linux-arm64@1.0.4: + resolution: {integrity: sha512-jGBrcCzIrMnNxLKVtogaQyajVfTAXM59KlBEwg6vTn8NW4fQ6nuFbbhlG4dTIsaamjEM5e8ZBEAKZfTB/qd9xw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@pagefind/linux-x64@1.0.4: + resolution: {integrity: sha512-LIn/QcvcEtLEBqKe5vpSbSC2O3fvqbRCWOTIklslqSORisCsvzsWbP6j+LYxE9q0oWIfkdMoWV1vrE/oCKRxHg==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@pagefind/windows-x64@1.0.4: + resolution: {integrity: sha512-QlBCVeZfj9fc9sbUgdOz76ZDbeK4xZihOBAFqGuRJeChfM8pnVeH9iqSnXgO3+m9oITugTf7PicyRUFAG76xeQ==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@pkgjs/parseargs@0.11.0: + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + + /@preact/preset-vite@2.8.2(@babel/core@7.24.3)(preact@10.18.1)(vite@5.2.4): + resolution: {integrity: sha512-m3tl+M8IO8jgiHnk+7LSTFl8axdPXloewi7iGVLdmCwf34XOzEUur0bZVewW4DUbUipFjTS2CXu27+5f/oexBA==} + peerDependencies: + '@babel/core': 7.x + vite: 2.x || 3.x || 4.x || 5.x + dependencies: + '@babel/core': 7.24.3 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.24.3) + '@babel/plugin-transform-react-jsx-development': 7.22.5(@babel/core@7.24.3) + '@prefresh/vite': 2.4.3(preact@10.18.1)(vite@5.2.4) + '@rollup/pluginutils': 4.2.1 + babel-plugin-transform-hook-names: 1.0.2(@babel/core@7.24.3) + debug: 4.3.4 + kolorist: 1.8.0 + magic-string: 0.30.5 + node-html-parser: 6.1.12 + resolve: 1.22.8 + source-map: 0.7.4 + stack-trace: 1.0.0-pre2 + vite: 5.2.4(@types/node@20.11.30) + transitivePeerDependencies: + - preact + - supports-color + dev: false + + /@preact/signals-core@1.5.0: + resolution: {integrity: sha512-U2diO1Z4i1n2IoFgMYmRdHWGObNrcuTRxyNEn7deSq2cru0vj0583HYQZHsAqcs7FE+hQyX3mjIV7LAfHCvy8w==} + dev: false + + /@preact/signals@1.2.1(preact@10.18.1): + resolution: {integrity: sha512-hRPvp1C2ooDzOHqfnhdpHgoIFDbYFAXLhoid3+jSItuPPD/J0r/UsiWKv/8ZO/oEhjRaP0M5niuRYsWqmY2GEA==} + peerDependencies: + preact: 10.x + dependencies: + '@preact/signals-core': 1.5.0 + preact: 10.18.1 + dev: false + + /@prefresh/babel-plugin@0.5.0: + resolution: {integrity: sha512-joAwpkUDwo7ZqJnufXRGzUb+udk20RBgfA8oLPBh5aJH2LeStmV1luBfeJTztPdyCscC2j2SmZ/tVxFRMIxAEw==} + dev: false + + /@prefresh/core@1.5.2(preact@10.18.1): + resolution: {integrity: sha512-A/08vkaM1FogrCII5PZKCrygxSsc11obExBScm3JF1CryK2uDS3ZXeni7FeKCx1nYdUkj4UcJxzPzc1WliMzZA==} + peerDependencies: + preact: ^10.0.0 + dependencies: + preact: 10.18.1 + dev: false + + /@prefresh/utils@1.2.0: + resolution: {integrity: sha512-KtC/fZw+oqtwOLUFM9UtiitB0JsVX0zLKNyRTA332sqREqSALIIQQxdUCS1P3xR/jT1e2e8/5rwH6gdcMLEmsQ==} + dev: false + + /@prefresh/vite@2.4.3(preact@10.18.1)(vite@5.2.4): + resolution: {integrity: sha512-diQ8AW+Y2i1QEhO64t2hhV8WFP9X0/NAxuSd9eRlVyS3LOs3RgGOwjOmLoJqwCmIbdq5Szq983gO+xdW/l0G6A==} + peerDependencies: + preact: ^10.4.0 + vite: '>=2.0.0' + dependencies: + '@babel/core': 7.23.5 + '@prefresh/babel-plugin': 0.5.0 + '@prefresh/core': 1.5.2(preact@10.18.1) + '@prefresh/utils': 1.2.0 + '@rollup/pluginutils': 4.2.1 + preact: 10.18.1 + vite: 5.2.4(@types/node@20.11.30) + transitivePeerDependencies: + - supports-color + dev: false + + /@react-hook/intersection-observer@3.1.1(react@18.2.0): + resolution: {integrity: sha512-OTDx8/wFaRvzFtKl1dEUEXSOqK2zVJHporiTTdC2xO++0e9FEx9wIrPis5q3lqtXeZH9zYGLbk+aB75qNFbbuw==} + peerDependencies: + react: '>=16.8' + dependencies: + '@react-hook/passive-layout-effect': 1.2.1(react@18.2.0) + intersection-observer: 0.10.0 + react: 18.2.0 + dev: false + + /@react-hook/passive-layout-effect@1.2.1(react@18.2.0): + resolution: {integrity: sha512-IwEphTD75liO8g+6taS+4oqz+nnroocNfWVHWz7j+N+ZO2vYrc6PV1q7GQhuahL0IOR7JccFTsFKQ/mb6iZWAg==} + peerDependencies: + react: '>=16.8' + dependencies: + react: 18.2.0 + dev: false + + /@rollup/pluginutils@4.2.1: + resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} + engines: {node: '>= 8.0.0'} + dependencies: + estree-walker: 2.0.2 + picomatch: 2.3.1 + dev: false + + /@rollup/rollup-android-arm-eabi@4.13.0: + resolution: {integrity: sha512-5ZYPOuaAqEH/W3gYsRkxQATBW3Ii1MfaT4EQstTnLKViLi2gLSQmlmtTpGucNP3sXEpOiI5tdGhjdE111ekyEg==} + cpu: [arm] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-android-arm64@4.13.0: + resolution: {integrity: sha512-BSbaCmn8ZadK3UAQdlauSvtaJjhlDEjS5hEVVIN3A4bbl3X+otyf/kOJV08bYiRxfejP3DXFzO2jz3G20107+Q==} + cpu: [arm64] + os: [android] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-darwin-arm64@4.13.0: + resolution: {integrity: sha512-Ovf2evVaP6sW5Ut0GHyUSOqA6tVKfrTHddtmxGQc1CTQa1Cw3/KMCDEEICZBbyppcwnhMwcDce9ZRxdWRpVd6g==} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-darwin-x64@4.13.0: + resolution: {integrity: sha512-U+Jcxm89UTK592vZ2J9st9ajRv/hrwHdnvyuJpa5A2ngGSVHypigidkQJP+YiGL6JODiUeMzkqQzbCG3At81Gg==} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm-gnueabihf@4.13.0: + resolution: {integrity: sha512-8wZidaUJUTIR5T4vRS22VkSMOVooG0F4N+JSwQXWSRiC6yfEsFMLTYRFHvby5mFFuExHa/yAp9juSphQQJAijQ==} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm64-gnu@4.13.0: + resolution: {integrity: sha512-Iu0Kno1vrD7zHQDxOmvweqLkAzjxEVqNhUIXBsZ8hu8Oak7/5VTPrxOEZXYC1nmrBVJp0ZcL2E7lSuuOVaE3+w==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-arm64-musl@4.13.0: + resolution: {integrity: sha512-C31QrW47llgVyrRjIwiOwsHFcaIwmkKi3PCroQY5aVq4H0A5v/vVVAtFsI1nfBngtoRpeREvZOkIhmRwUKkAdw==} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-riscv64-gnu@4.13.0: + resolution: {integrity: sha512-Oq90dtMHvthFOPMl7pt7KmxzX7E71AfyIhh+cPhLY9oko97Zf2C9tt/XJD4RgxhaGeAraAXDtqxvKE1y/j35lA==} + cpu: [riscv64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-x64-gnu@4.13.0: + resolution: {integrity: sha512-yUD/8wMffnTKuiIsl6xU+4IA8UNhQ/f1sAnQebmE/lyQ8abjsVyDkyRkWop0kdMhKMprpNIhPmYlCxgHrPoXoA==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-linux-x64-musl@4.13.0: + resolution: {integrity: sha512-9RyNqoFNdF0vu/qqX63fKotBh43fJQeYC98hCaf89DYQpv+xu0D8QFSOS0biA7cGuqJFOc1bJ+m2rhhsKcw1hw==} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-arm64-msvc@4.13.0: + resolution: {integrity: sha512-46ue8ymtm/5PUU6pCvjlic0z82qWkxv54GTJZgHrQUuZnVH+tvvSP0LsozIDsCBFO4VjJ13N68wqrKSeScUKdA==} + cpu: [arm64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-ia32-msvc@4.13.0: + resolution: {integrity: sha512-P5/MqLdLSlqxbeuJ3YDeX37srC8mCflSyTrUsgbU1c/U9j6l2g2GiIdYaGD9QjdMQPMSgYm7hgg0551wHyIluw==} + cpu: [ia32] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@rollup/rollup-win32-x64-msvc@4.13.0: + resolution: {integrity: sha512-UKXUQNbO3DOhzLRwHSpa0HnhhCgNODvfoPWv2FCXme8N/ANFfhIPMGuOT+QuKd16+B5yxZ0HdpNlqPvTMS1qfw==} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /@shikijs/core@1.2.0: + resolution: {integrity: sha512-OlFvx+nyr5C8zpcMBnSGir0YPD6K11uYhouqhNmm1qLiis4GA7SsGtu07r9gKS9omks8RtQqHrJL4S+lqWK01A==} + dev: false + + /@stitches/core@1.2.8: + resolution: {integrity: sha512-Gfkvwk9o9kE9r9XNBmJRfV8zONvXThnm1tcuojL04Uy5uRyqg93DC83lDebl0rocZCfKSjUv+fWYtMQmEDJldg==} + dev: false + + /@tailwindcss/typography@0.5.10(tailwindcss@3.4.1): + resolution: {integrity: sha512-Pe8BuPJQJd3FfRnm6H0ulKIGoMEQS+Vq01R6M5aCrFB/ccR/shT+0kXLjouGC1gFLm9hopTFN+DMP0pfwRWzPw==} + peerDependencies: + tailwindcss: '>=3.0.0 || insiders' + dependencies: + lodash.castarray: 4.4.0 + lodash.isplainobject: 4.0.6 + lodash.merge: 4.6.2 + postcss-selector-parser: 6.0.10 + tailwindcss: 3.4.1 + dev: false + + /@trysound/sax@0.2.0: + resolution: {integrity: sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==} + engines: {node: '>=10.13.0'} + dev: false + + /@types/acorn@4.0.6: + resolution: {integrity: sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /@types/babel__core@7.20.5: + resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==} + dependencies: + '@babel/parser': 7.23.5 + '@babel/types': 7.23.5 + '@types/babel__generator': 7.6.6 + '@types/babel__template': 7.4.3 + '@types/babel__traverse': 7.20.3 + dev: false + + /@types/babel__generator@7.6.6: + resolution: {integrity: sha512-66BXMKb/sUWbMdBNdMvajU7i/44RkrA3z/Yt1c7R5xejt8qh84iU54yUWCtm0QwGJlDcf/gg4zd/x4mpLAlb/w==} + dependencies: + '@babel/types': 7.23.5 + dev: false + + /@types/babel__template@7.4.3: + resolution: {integrity: sha512-ciwyCLeuRfxboZ4isgdNZi/tkt06m8Tw6uGbBSBgWrnnZGNXiEyM27xc/PjXGQLqlZ6ylbgHMnm7ccF9tCkOeQ==} + dependencies: + '@babel/parser': 7.23.5 + '@babel/types': 7.23.5 + dev: false + + /@types/babel__traverse@7.20.3: + resolution: {integrity: sha512-Lsh766rGEFbaxMIDH7Qa+Yha8cMVI3qAK6CHt3OR0YfxOIn5Z54iHiyDRycHrBqeIiqGa20Kpsv1cavfBKkRSw==} + dependencies: + '@babel/types': 7.23.5 + dev: false + + /@types/css-tree@2.3.7: + resolution: {integrity: sha512-LUlutQBpR2TgqZJdvXCPOx9EME7a4PHSEo2Y2c8POFpj1E9a6V94PUZNwjVdfHWyb8RQZoNHTYOKs980+sOi+g==} + dev: false + + /@types/csso@5.0.4: + resolution: {integrity: sha512-W/FsRkm/9c04x9ON+bj+HQ0cSgNkG1LvcfuBCpkP7cpikM7+RkrNFLGtiofb++xBG6KGMUycLoDbi9/K621ZCw==} + dependencies: + '@types/css-tree': 2.3.7 + dev: false + + /@types/debug@4.1.10: + resolution: {integrity: sha512-tOSCru6s732pofZ+sMv9o4o3Zc+Sa8l3bxd/tweTQudFn06vAzb13ZX46Zi6m6EJ+RUbRTHvgQJ1gBtSgkaUYA==} + dependencies: + '@types/ms': 0.7.33 + + /@types/estree-jsx@1.0.2: + resolution: {integrity: sha512-GNBWlGBMjiiiL5TSkvPtOteuXsiVitw5MYGY1UYlrAq0SKyczsls6sCD7TZ8fsjRsvCVxml7EbyjJezPb3DrSA==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /@types/estree@1.0.5: + resolution: {integrity: sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==} + dev: false + + /@types/hast@3.0.2: + resolution: {integrity: sha512-B5hZHgHsXvfCoO3xgNJvBnX7N8p86TqQeGKXcokW4XXi+qY4vxxPSFYofytvVmpFxzPv7oxDQzjg5Un5m2/xiw==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /@types/hast@3.0.4: + resolution: {integrity: sha512-WPs+bbQw5aCj+x6laNGWLH3wviHtoCv/P3+otBhbOhJgG8qtpdAMlTCxLtsTWA7LH1Oh/bFCHsBn0TPS5m30EQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /@types/html-escaper@3.0.2: + resolution: {integrity: sha512-A8vk09eyYzk8J/lFO4OUMKCmRN0rRzfZf4n3Olwapgox/PtTiU8zPYlL1UEkJ/WeHvV6v9Xnj3o/705PKz9r4Q==} + dev: false + + /@types/html-minifier-terser@7.0.2: + resolution: {integrity: sha512-mm2HqV22l8lFQh4r2oSsOEVea+m0qqxEmwpc9kC1p/XzmjLWrReR9D/GRs8Pex2NX/imyEH9c5IU/7tMBQCHOA==} + dev: false + + /@types/mdast@4.0.3: + resolution: {integrity: sha512-LsjtqsyF+d2/yFOYaN22dHZI1Cpwkrj+g06G8+qtUKlhovPW89YhqSnfKtMbkgmEtYpH2gydRNULd6y8mciAFg==} + dependencies: + '@types/unist': 3.0.2 + + /@types/mdx@2.0.9: + resolution: {integrity: sha512-OKMdj17y8Cs+k1r0XFyp59ChSOwf8ODGtMQ4mnpfz5eFDk1aO41yN3pSKGuvVzmWAkFp37seubY1tzOVpwfWwg==} + dev: false + + /@types/ms@0.7.33: + resolution: {integrity: sha512-AuHIyzR5Hea7ij0P9q7vx7xu4z0C28ucwjAZC0ja7JhINyCnOw8/DnvAPQQ9TfOlCtZAmCERKQX9+o1mgQhuOQ==} + + /@types/nlcst@1.0.3: + resolution: {integrity: sha512-cpO6PPMz4E++zxP2Vhp/3KVl2Nbtj+Iksb25rlRinG7mphu2zmCIKWWlqdsx1NwJEISogR2eeZTD7JqLOCzaiw==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /@types/node@20.11.30: + resolution: {integrity: sha512-dHM6ZxwlmuZaRmUPfv1p+KrdD1Dci04FbdEm/9wEMouFqxYoFl5aMkt0VMAUtYRQDyYvD41WJLukhq/ha3YuTw==} + dependencies: + undici-types: 5.26.5 + dev: false + + /@types/prop-types@15.7.12: + resolution: {integrity: sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==} + dev: false + + /@types/react-dom@18.2.22: + resolution: {integrity: sha512-fHkBXPeNtfvri6gdsMYyW+dW7RXFo6Ad09nLFK0VQWR7yGLai/Cyvyj696gbwYvBnhGtevUG9cET0pmUbMtoPQ==} + dependencies: + '@types/react': 18.2.69 + dev: false + + /@types/react@18.2.69: + resolution: {integrity: sha512-W1HOMUWY/1Yyw0ba5TkCV+oqynRjG7BnteBB+B7JmAK7iw3l2SW+VGOxL+akPweix6jk2NNJtyJKpn4TkpfK3Q==} + dependencies: + '@types/prop-types': 15.7.12 + '@types/scheduler': 0.16.8 + csstype: 3.1.3 + dev: false + + /@types/scheduler@0.16.8: + resolution: {integrity: sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==} + dev: false + + /@types/unist@2.0.10: + resolution: {integrity: sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA==} + + /@types/unist@3.0.2: + resolution: {integrity: sha512-dqId9J8K/vGi5Zr7oo212BGii5m3q5Hxlkwy3WpYuKPklmBEvsbMYYyLxAQpSffdLl/gdW0XUpKWFvYmyoWCoQ==} + + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: false + + /acorn-jsx@5.3.2(acorn@8.11.2): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.11.2 + dev: false + + /acorn@8.11.2: + resolution: {integrity: sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /acorn@8.11.3: + resolution: {integrity: sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: false + + /anser@2.1.1: + resolution: {integrity: sha512-nqLm4HxOTpeLOxcmB3QWmV5TcDFhW9y/fyQ+hivtDFcK4OQ+pQ5fzPnXHM1Mfcm0VkLtvVi1TCPr++Qy0Q/3EQ==} + dev: false + + /ansi-align@3.0.1: + resolution: {integrity: sha512-IOfwwBF5iczOjp/WeY4YxyjqAFMQoZufdQWDd19SEExbVLNXqvpzSJ/M7Za4/sCPmQ0+GRquoA7bGcINcxew6w==} + dependencies: + string-width: 4.2.3 + dev: false + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + dev: false + + /ansi-regex@6.0.1: + resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} + engines: {node: '>=12'} + dev: false + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + dev: false + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + dev: false + + /ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + dev: false + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + dev: false + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + dev: false + + /arg@5.0.2: + resolution: {integrity: sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==} + dev: false + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: false + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: false + + /aria-query@5.3.0: + resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==} + dependencies: + dequal: 2.0.3 + dev: false + + /array-iterate@2.0.1: + resolution: {integrity: sha512-I1jXZMjAgCMmxT4qxXfPXa6SthSoE8h6gkSI9BGGNv8mP8G/v0blc+qFnZu6K42vTOiuME596QaLO0TP3Lk0xg==} + dev: false + + /astring@1.8.6: + resolution: {integrity: sha512-ISvCdHdlTDlH5IpxQJIex7BWBywFWgjJSVdwst+/iQCoEYnyOaQ95+X1JGshuBjGp6nxKUy1jMgE3zPqN7fQdg==} + hasBin: true + dev: false + + /astro-compress@2.2.17: + resolution: {integrity: sha512-nqwLZApVtoMyRjvvsWIyBkzj31YSHtzWPOCLdZZLSu94ieWxIzoapa0jD7Vt+K6Mzc+KfXPdB9dK+hDcJCy9wQ==} + dependencies: + '@types/csso': 5.0.4 + '@types/html-minifier-terser': 7.0.2 + csso: 5.0.5 + files-pipe: 2.1.15 + html-minifier-terser: 7.2.0 + kleur: 4.1.5 + lightningcss: 1.24.1 + sharp: 0.33.2 + svgo: 3.2.0 + terser: 5.29.2 + dev: false + + /astro@4.5.9(@types/node@20.11.30)(typescript@5.2.2): + resolution: {integrity: sha512-GheU72Goz7dYQNKaqTxB2H49cNvHfahGSbNkTvMXk+gyHf/g633qadqlO2ZQbTUacoUWmDzvS5fhMZt2/w4naQ==} + engines: {node: '>=18.14.1', npm: '>=6.14.0'} + hasBin: true + dependencies: + '@astrojs/compiler': 2.7.0 + '@astrojs/internal-helpers': 0.3.0 + '@astrojs/markdown-remark': 4.3.1 + '@astrojs/telemetry': 3.0.4 + '@babel/core': 7.24.3 + '@babel/generator': 7.23.5 + '@babel/parser': 7.23.5 + '@babel/plugin-transform-react-jsx': 7.22.15(@babel/core@7.24.3) + '@babel/traverse': 7.23.5 + '@babel/types': 7.23.5 + '@types/babel__core': 7.20.5 + acorn: 8.11.2 + aria-query: 5.3.0 + axobject-query: 4.0.0 + boxen: 7.1.1 + chokidar: 3.5.3 + ci-info: 4.0.0 + clsx: 2.0.0 + common-ancestor-path: 1.0.1 + cookie: 0.6.0 + cssesc: 3.0.0 + debug: 4.3.4 + deterministic-object-hash: 2.0.2 + devalue: 4.3.2 + diff: 5.1.0 + dlv: 1.1.3 + dset: 3.1.3 + es-module-lexer: 1.4.2 + esbuild: 0.19.12 + estree-walker: 3.0.3 + execa: 8.0.1 + fast-glob: 3.3.2 + flattie: 1.1.1 + github-slugger: 2.0.0 + gray-matter: 4.0.3 + html-escaper: 3.0.3 + http-cache-semantics: 4.1.1 + js-yaml: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.5 + mime: 3.0.0 + ora: 7.0.1 + p-limit: 5.0.0 + p-queue: 8.0.1 + path-to-regexp: 6.2.1 + preferred-pm: 3.1.2 + prompts: 2.4.2 + rehype: 13.0.1 + resolve: 1.22.8 + semver: 7.5.4 + shiki: 1.2.0 + string-width: 7.1.0 + strip-ansi: 7.1.0 + tsconfck: 3.0.0(typescript@5.2.2) + unist-util-visit: 5.0.0 + vfile: 6.0.1 + vite: 5.2.4(@types/node@20.11.30) + vitefu: 0.2.5(vite@5.2.4) + which-pm: 2.1.1 + yargs-parser: 21.1.1 + zod: 3.22.4 + zod-to-json-schema: 3.22.5(zod@3.22.4) + optionalDependencies: + sharp: 0.32.6 + transitivePeerDependencies: + - '@types/node' + - less + - lightningcss + - sass + - stylus + - sugarss + - supports-color + - terser + - typescript + dev: false + + /autoprefixer@10.4.16(postcss@8.4.31): + resolution: {integrity: sha512-7vd3UC6xKp0HLfua5IjZlcXvGAGy7cBAXTg2lyQ/8WpNhd6SiZ8Be+xm3FyBSYJx5GKcpRCzBh7RH4/0dnY+uQ==} + engines: {node: ^10 || ^12 || >=14} + hasBin: true + peerDependencies: + postcss: ^8.1.0 + dependencies: + browserslist: 4.22.1 + caniuse-lite: 1.0.30001559 + fraction.js: 4.3.7 + normalize-range: 0.1.2 + picocolors: 1.0.0 + postcss: 8.4.31 + postcss-value-parser: 4.2.0 + dev: false + + /axobject-query@4.0.0: + resolution: {integrity: sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==} + dependencies: + dequal: 2.0.3 + dev: false + + /b4a@1.6.4: + resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} + requiresBuild: true + dev: false + optional: true + + /babel-plugin-transform-hook-names@1.0.2(@babel/core@7.24.3): + resolution: {integrity: sha512-5gafyjyyBTTdX/tQQ0hRgu4AhNHG/hqWi0ZZmg2xvs2FgRkJXzDNKBZCyoYqgFkovfDrgM8OoKg8karoUvWeCw==} + peerDependencies: + '@babel/core': ^7.12.10 + dependencies: + '@babel/core': 7.24.3 + dev: false + + /bail@2.0.2: + resolution: {integrity: sha512-0xO6mYd7JB2YesxDKplafRpsiOzPt9V02ddPCLbY1xYGPOX24NTyN50qnUxgCPcSoYMhKpAuBTjQoRZCAkUDRw==} + dev: false + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + dev: false + + /base-64@1.0.0: + resolution: {integrity: sha512-kwDPIFCGx0NZHog36dj+tHiwP4QMzsZ3AgMViUBKI0+V5n4U0ufTCUMhnQ04diaRI8EX/QcPfql7zlhZ7j4zgg==} + dev: false + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + dev: false + + /before-after-hook@2.2.3: + resolution: {integrity: sha512-NzUnlZexiaH/46WDhANlyR2bXRopNg4F/zuSA3OpZnllCUgRaOF2znDioDWrmbNVsuZk6l9pMquQB38cfBZwkQ==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + requiresBuild: true + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + optional: true + + /bl@5.1.0: + resolution: {integrity: sha512-tv1ZJHLfTDnXE6tMHv73YgSJaWR2AFuPwMntBe7XL/GBFHnT0CLnsHMogfk5+GzCDC5ZWarSCYaIGATZt9dNsQ==} + dependencies: + buffer: 6.0.3 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: false + + /boxen@7.1.1: + resolution: {integrity: sha512-2hCgjEmP8YLWQ130n2FerGv7rYpfBmnmp9Uy2Le1vge6X3gZIfSmEzP5QTDElFxcvVcXlEn8Aq6MU/PZygIOog==} + engines: {node: '>=14.16'} + dependencies: + ansi-align: 3.0.1 + camelcase: 7.0.1 + chalk: 5.3.0 + cli-boxes: 3.0.0 + string-width: 5.1.2 + type-fest: 2.19.0 + widest-line: 4.0.1 + wrap-ansi: 8.1.0 + dev: false + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: false + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + dev: false + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001559 + electron-to-chromium: 1.4.571 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + dev: false + + /browserslist@4.23.0: + resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001600 + electron-to-chromium: 1.4.715 + node-releases: 2.0.14 + update-browserslist-db: 1.0.13(browserslist@4.23.0) + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + requiresBuild: true + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + optional: true + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /camel-case@4.1.2: + resolution: {integrity: sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==} + dependencies: + pascal-case: 3.1.2 + tslib: 2.6.2 + dev: false + + /camelcase-css@2.0.1: + resolution: {integrity: sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==} + engines: {node: '>= 6'} + dev: false + + /camelcase@7.0.1: + resolution: {integrity: sha512-xlx1yCK2Oc1APsPXDL2LdlNP6+uu8OCDdhOBSVT279M/S+y75O30C2VuD8T2ogdePBBl7PfPF4504tnLgX3zfw==} + engines: {node: '>=14.16'} + dev: false + + /caniuse-api@3.0.0: + resolution: {integrity: sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==} + dependencies: + browserslist: 4.23.0 + caniuse-lite: 1.0.30001600 + lodash.memoize: 4.1.2 + lodash.uniq: 4.5.0 + dev: false + + /caniuse-lite@1.0.30001559: + resolution: {integrity: sha512-cPiMKZgqgkg5LY3/ntGeLFUpi6tzddBNS58A4tnTgQw1zON7u2sZMU7SzOeVH4tj20++9ggL+V6FDOFMTaFFYA==} + dev: false + + /caniuse-lite@1.0.30001600: + resolution: {integrity: sha512-+2S9/2JFhYmYaDpZvo0lKkfvuKIglrx68MwOBqMGHhQsNkLjB5xtc/TGoEPs+MxjSyN/72qer2g97nzR641mOQ==} + dev: false + + /ccount@2.0.1: + resolution: {integrity: sha512-eyrF0jiFpY+3drT6383f1qhkbGsLSifNAjA61IUjZjmLCWjItY6LB9ft9YhoDgwfmclB2zhu51Lc7+95b8NRAg==} + dev: false + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + dev: false + + /chalk@5.3.0: + resolution: {integrity: sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==} + engines: {node: ^12.17.0 || ^14.13 || >=16.0.0} + dev: false + + /character-entities-html4@2.1.0: + resolution: {integrity: sha512-1v7fgQRj6hnSwFpq1Eu0ynr/CDEw0rXo2B61qXrLNdHZmPKgb7fqS1a2JwF0rISo9q77jDI8VMEHoApn8qDoZA==} + + /character-entities-legacy@3.0.0: + resolution: {integrity: sha512-RpPp0asT/6ufRm//AJVwpViZbGM/MkjQFxJccQRHmISF/22NBtsHqAWmL+/pmkPWoIUJdWyeVleTl1wydHATVQ==} + + /character-entities@2.0.2: + resolution: {integrity: sha512-shx7oQ0Awen/BRIdkjkvz54PnEEI/EjwXDSIZp86/KKdbafHh1Df/RYGBhn4hbe2+uKC9FnT5UCEdyPz3ai9hQ==} + + /character-reference-invalid@2.0.1: + resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /chokidar@3.6.0: + resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /chownr@1.1.4: + resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} + requiresBuild: true + dev: false + optional: true + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: false + + /ci-info@4.0.0: + resolution: {integrity: sha512-TdHqgGf9odd8SXNuxtUBVx8Nv+qZOejE6qyqiy5NtbYYQOeFa6zmHkxlPzmaLxWWHsU6nJmB7AETdVPi+2NBUg==} + engines: {node: '>=8'} + dev: false + + /clean-css@5.3.3: + resolution: {integrity: sha512-D5J+kHaVb/wKSFcyyV75uCn8fiY4sV38XJoe4CUyGQ+mOU/fMVYUdH1hJC+CJQ5uY3EnW27SbJYS4X8BiLrAFg==} + engines: {node: '>= 10.0'} + dependencies: + source-map: 0.6.1 + dev: false + + /clean-set@1.1.2: + resolution: {integrity: sha512-cA8uCj0qSoG9e0kevyOWXwPaELRPVg5Pxp6WskLMwerx257Zfnh8Nl0JBH59d7wQzij2CK7qEfJQK3RjuKKIug==} + dev: false + + /cli-boxes@3.0.0: + resolution: {integrity: sha512-/lzGpEWL/8PfI0BmBOPRwp0c/wFNX1RdUML3jK/RcSBA9T8mZDdQpqYBKtCFTOfQbwPqWEOpjqW+Fnayc0969g==} + engines: {node: '>=10'} + dev: false + + /cli-cursor@4.0.0: + resolution: {integrity: sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + restore-cursor: 4.0.0 + dev: false + + /cli-spinners@2.9.1: + resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} + engines: {node: '>=6'} + dev: false + + /clsx@1.2.1: + resolution: {integrity: sha512-EcR6r5a8bj6pu3ycsa/E/cKVGuTgZJZdsyUYHOksG/UHIiKfjxzRxYJpyVBwYaQeOvghal9fcc4PidlgzugAQg==} + engines: {node: '>=6'} + dev: false + + /clsx@2.0.0: + resolution: {integrity: sha512-rQ1+kcj+ttHG0MKVGBUXwayCCF1oh39BF5COIpRzuCEv8Mwjv0XucrI2ExNTOn9IlLifGClWQcU9BrZORvtw6Q==} + engines: {node: '>=6'} + dev: false + + /codesandbox-import-util-types@2.2.3: + resolution: {integrity: sha512-Qj00p60oNExthP2oR3vvXmUGjukij+rxJGuiaKM6tyUmSyimdZsqHI/TUvFFClAffk9s7hxGnQgWQ8KCce27qQ==} + dev: false + + /collapse-white-space@2.1.0: + resolution: {integrity: sha512-loKTxY1zCOuG4j9f6EPnuyyYkf58RnhhWTvRoZEokgB+WbdXehfjFviyOVYkqzEWz1Q5kRiZdBYS5SwxbQYwzw==} + dev: false + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + dev: false + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + dev: false + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + dev: false + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + requiresBuild: true + dev: false + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + requiresBuild: true + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color@4.2.3: + resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} + engines: {node: '>=12.5.0'} + requiresBuild: true + dependencies: + color-convert: 2.0.1 + color-string: 1.9.1 + dev: false + + /colord@2.9.3: + resolution: {integrity: sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==} + dev: false + + /comma-separated-tokens@2.0.3: + resolution: {integrity: sha512-Fu4hJdvzeylCfQPp9SGWidpzrMs7tTrlu6Vb8XGaRGck8QSNZJJp538Wrb60Lax4fPwR64ViY468OIUTbRlGZg==} + dev: false + + /commander@10.0.1: + resolution: {integrity: sha512-y4Mg2tXshplEbSGzx7amzPwKKOCGuoSRP/CjEdwwk0FOGlUbq6lKuoyDZTNZkmxHdJtp54hdfY/JUrdL7Xfdug==} + engines: {node: '>=14'} + dev: false + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + dev: false + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + dev: false + + /commander@7.2.0: + resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} + engines: {node: '>= 10'} + dev: false + + /common-ancestor-path@1.0.1: + resolution: {integrity: sha512-L3sHRo1pXXEqX8VU28kfgUY+YGsk09hPqZiZmLacNib6XNTCM8ubYeT7ryXQw8asB1sKgcU5lkB7ONug08aB8w==} + dev: false + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: false + + /cookie@0.6.0: + resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} + engines: {node: '>= 0.6'} + dev: false + + /crelt@1.0.6: + resolution: {integrity: sha512-VQ2MBenTq1fWZUH9DJNGti7kKv6EeAuYr3cLwxUWhIu1baTaXh4Ib5W2CqHVqib4/MqbYGJqiL3Zb8GJZr3l4g==} + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + dev: false + + /css-declaration-sorter@7.1.1(postcss@8.4.38): + resolution: {integrity: sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==} + engines: {node: ^14 || ^16 || >=18} + peerDependencies: + postcss: ^8.0.9 + dependencies: + postcss: 8.4.38 + dev: false + + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.1.0 + nth-check: 2.1.1 + dev: false + + /css-tree@2.2.1: + resolution: {integrity: sha512-OA0mILzGc1kCOCSJerOeqDxDQ4HOh+G8NbOJFOTgOCzpw7fCBubk0fEyxp8AgOL/jvLgYA/uV0cMbe43ElF1JA==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + mdn-data: 2.0.28 + source-map-js: 1.2.0 + dev: false + + /css-tree@2.3.1: + resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} + dependencies: + mdn-data: 2.0.30 + source-map-js: 1.2.0 + dev: false + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: false + + /cssesc@3.0.0: + resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /cssnano-preset-default@6.1.1(postcss@8.4.38): + resolution: {integrity: sha512-XW/dYN2p8Jdkp1lovFd0UVRh6RB0iMyXJbAE9Qm+taR3p2LGu492AW34lVaukUrXoK9IxK5aK3CUmFpUorU4oA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + css-declaration-sorter: 7.1.1(postcss@8.4.38) + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 + postcss-calc: 9.0.1(postcss@8.4.38) + postcss-colormin: 6.1.0(postcss@8.4.38) + postcss-convert-values: 6.1.0(postcss@8.4.38) + postcss-discard-comments: 6.0.2(postcss@8.4.38) + postcss-discard-duplicates: 6.0.3(postcss@8.4.38) + postcss-discard-empty: 6.0.3(postcss@8.4.38) + postcss-discard-overridden: 6.0.2(postcss@8.4.38) + postcss-merge-longhand: 6.0.5(postcss@8.4.38) + postcss-merge-rules: 6.1.1(postcss@8.4.38) + postcss-minify-font-values: 6.1.0(postcss@8.4.38) + postcss-minify-gradients: 6.0.3(postcss@8.4.38) + postcss-minify-params: 6.1.0(postcss@8.4.38) + postcss-minify-selectors: 6.0.4(postcss@8.4.38) + postcss-normalize-charset: 6.0.2(postcss@8.4.38) + postcss-normalize-display-values: 6.0.2(postcss@8.4.38) + postcss-normalize-positions: 6.0.2(postcss@8.4.38) + postcss-normalize-repeat-style: 6.0.2(postcss@8.4.38) + postcss-normalize-string: 6.0.2(postcss@8.4.38) + postcss-normalize-timing-functions: 6.0.2(postcss@8.4.38) + postcss-normalize-unicode: 6.1.0(postcss@8.4.38) + postcss-normalize-url: 6.0.2(postcss@8.4.38) + postcss-normalize-whitespace: 6.0.2(postcss@8.4.38) + postcss-ordered-values: 6.0.2(postcss@8.4.38) + postcss-reduce-initial: 6.1.0(postcss@8.4.38) + postcss-reduce-transforms: 6.0.2(postcss@8.4.38) + postcss-svgo: 6.0.3(postcss@8.4.38) + postcss-unique-selectors: 6.0.4(postcss@8.4.38) + dev: false + + /cssnano-utils@4.0.2(postcss@8.4.38): + resolution: {integrity: sha512-ZR1jHg+wZ8o4c3zqf1SIUSTIvm/9mU343FMR6Obe/unskbvpGhZOo1J6d/r8D1pzkRQYuwbcH3hToOuoA2G7oQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + dev: false + + /cssnano@6.1.1(postcss@8.4.38): + resolution: {integrity: sha512-paTFZuiVohpaXJuau8l7buFt9+FTmfjwEO70EKitzYOQw3frib/It4sb6cQ+gJyDEyY+myDSni6IbBvKZ0N8Lw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + cssnano-preset-default: 6.1.1(postcss@8.4.38) + lilconfig: 3.1.1 + postcss: 8.4.38 + dev: false + + /csso@5.0.5: + resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==} + engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'} + dependencies: + css-tree: 2.2.1 + dev: false + + /csstype@3.1.3: + resolution: {integrity: sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==} + dev: false + + /d@1.0.1: + resolution: {integrity: sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==} + dependencies: + es5-ext: 0.10.62 + type: 1.2.0 + dev: false + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decode-named-character-reference@1.0.2: + resolution: {integrity: sha512-O8x12RzrUF8xyVcY0KJowWsmaJxQbmy0/EtnNtHRpsOcT7dFk5W598coHqBVpmWo1oQQfsCqfCmkZN5DJrZVdg==} + dependencies: + character-entities: 2.0.2 + + /decompress-response@6.0.0: + resolution: {integrity: sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + mimic-response: 3.1.0 + dev: false + optional: true + + /deep-extend@0.6.0: + resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} + engines: {node: '>=4.0.0'} + requiresBuild: true + dev: false + optional: true + + /deepmerge-ts@5.1.0: + resolution: {integrity: sha512-eS8dRJOckyo9maw9Tu5O5RUi/4inFLrnoLkBe3cPfDMx3WZioXtmOew4TXQaxq7Rhl4xjDtR7c6x8nNTxOvbFw==} + engines: {node: '>=16.0.0'} + dev: false + + /deprecation@2.3.1: + resolution: {integrity: sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==} + dev: false + + /dequal@2.0.3: + resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} + engines: {node: '>=6'} + + /detect-libc@1.0.3: + resolution: {integrity: sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==} + engines: {node: '>=0.10'} + hasBin: true + dev: false + + /detect-libc@2.0.2: + resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} + engines: {node: '>=8'} + requiresBuild: true + dev: false + optional: true + + /detect-libc@2.0.3: + resolution: {integrity: sha512-bwy0MGW55bG41VqxxypOsdSdGqLwXPI/focwgTYCFMbdUiBAxLg9CFzG08sz2aqzknwiX7Hkl0bQENjg8iLByw==} + engines: {node: '>=8'} + dev: false + + /deterministic-object-hash@2.0.2: + resolution: {integrity: sha512-KxektNH63SrbfUyDiwXqRb1rLwKt33AmMv+5Nhsw1kqZ13SJBRTgZHtGbE+hH3a1mVW1cz+4pqSWVPAtLVXTzQ==} + engines: {node: '>=18'} + dependencies: + base-64: 1.0.0 + dev: false + + /devalue@4.3.2: + resolution: {integrity: sha512-KqFl6pOgOW+Y6wJgu80rHpo2/3H07vr8ntR9rkkFIRETewbf5GaYYcakYfiKz89K+sLsuPkQIZaXDMjUObZwWg==} + dev: false + + /devlop@1.1.0: + resolution: {integrity: sha512-RWmIqhcFf1lRYBvNmr7qTNuyCt/7/ns2jbpp1+PalgE/rDQcBT0fioSMUpJ93irlUhC5hrg4cYqe6U+0ImW0rA==} + dependencies: + dequal: 2.0.3 + + /didyoumean@1.2.2: + resolution: {integrity: sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==} + dev: false + + /diff@5.1.0: + resolution: {integrity: sha512-D+mk+qE8VC/PAUrlAU34N+VfXev0ghe5ywmpqrawphmVZc1bEfn56uo9qpyGp1p4xpzOHkSW4ztBd6L7Xx4ACw==} + engines: {node: '>=0.3.1'} + dev: false + + /dlv@1.1.3: + resolution: {integrity: sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==} + dev: false + + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.5.0 + dev: false + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: false + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: false + + /domutils@3.1.0: + resolution: {integrity: sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: false + + /dot-case@3.0.4: + resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: false + + /dotenv@16.4.5: + resolution: {integrity: sha512-ZmdL2rui+eB2YwhsWzjInR8LldtZHGDoQ1ugH85ppHKwpUHL7j7rN0Ti9NCnGiQbhaZ11FpR+7ao1dNsmduNUg==} + engines: {node: '>=12'} + dev: false + + /dset@3.1.3: + resolution: {integrity: sha512-20TuZZHCEZ2O71q9/+8BwKwZ0QtD9D8ObhrihJPr+vLLYlSuAU3/zL4cSlgbfeoGHTjCSJBa7NGcrF9/Bx/WJQ==} + engines: {node: '>=4'} + dev: false + + /eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + dev: false + + /effector@23.2.0: + resolution: {integrity: sha512-TqR/e5BSfAk4ZkHOykmqPmT9Nn4fLE/BhuBiVmy2cb7Vp6in8N+xMDFhWWZAgOdQjehgt/dIVQyXuWpXh3EoZA==} + engines: {node: '>=11.0.0'} + dev: false + + /electron-to-chromium@1.4.571: + resolution: {integrity: sha512-Sc+VtKwKCDj3f/kLBjdyjMpNzoZsU6WuL/wFb6EH8USmHEcebxRXcRrVpOpayxd52tuey4RUDpUsw5OS5LhJqg==} + dev: false + + /electron-to-chromium@1.4.715: + resolution: {integrity: sha512-XzWNH4ZSa9BwVUQSDorPWAUQ5WGuYz7zJUNpNif40zFCiCl20t8zgylmreNmn26h5kiyw2lg7RfTmeMBsDklqg==} + dev: false + + /emoji-regex@10.3.0: + resolution: {integrity: sha512-QpLs9D9v9kArv4lfDEgg1X/gN5XLnf/A6l9cs8SPZLRZR3ZkY9+kwIQTxm+fsSej5UMYGE8fdoaZVIBlqG0XTw==} + dev: false + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + dev: false + + /emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + dev: false + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + requiresBuild: true + dependencies: + once: 1.4.0 + dev: false + optional: true + + /entities@4.5.0: + resolution: {integrity: sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==} + engines: {node: '>=0.12'} + dev: false + + /es-module-lexer@1.4.2: + resolution: {integrity: sha512-7nOqkomXZEaxUDJw21XZNtRk739QvrPSoZoRtbsEfcii00vdzZUh6zh1CQwHhrib8MdEtJfv5rJiGeb4KuV/vw==} + dev: false + + /es5-ext@0.10.62: + resolution: {integrity: sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==} + engines: {node: '>=0.10'} + requiresBuild: true + dependencies: + es6-iterator: 2.0.3 + es6-symbol: 3.1.3 + next-tick: 1.1.0 + dev: false + + /es6-iterator@2.0.3: + resolution: {integrity: sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==} + dependencies: + d: 1.0.1 + es5-ext: 0.10.62 + es6-symbol: 3.1.3 + dev: false + + /es6-symbol@3.1.3: + resolution: {integrity: sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==} + dependencies: + d: 1.0.1 + ext: 1.7.0 + dev: false + + /esbuild@0.19.12: + resolution: {integrity: sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.19.12 + '@esbuild/android-arm': 0.19.12 + '@esbuild/android-arm64': 0.19.12 + '@esbuild/android-x64': 0.19.12 + '@esbuild/darwin-arm64': 0.19.12 + '@esbuild/darwin-x64': 0.19.12 + '@esbuild/freebsd-arm64': 0.19.12 + '@esbuild/freebsd-x64': 0.19.12 + '@esbuild/linux-arm': 0.19.12 + '@esbuild/linux-arm64': 0.19.12 + '@esbuild/linux-ia32': 0.19.12 + '@esbuild/linux-loong64': 0.19.12 + '@esbuild/linux-mips64el': 0.19.12 + '@esbuild/linux-ppc64': 0.19.12 + '@esbuild/linux-riscv64': 0.19.12 + '@esbuild/linux-s390x': 0.19.12 + '@esbuild/linux-x64': 0.19.12 + '@esbuild/netbsd-x64': 0.19.12 + '@esbuild/openbsd-x64': 0.19.12 + '@esbuild/sunos-x64': 0.19.12 + '@esbuild/win32-arm64': 0.19.12 + '@esbuild/win32-ia32': 0.19.12 + '@esbuild/win32-x64': 0.19.12 + dev: false + + /esbuild@0.20.2: + resolution: {integrity: sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==} + engines: {node: '>=12'} + hasBin: true + requiresBuild: true + optionalDependencies: + '@esbuild/aix-ppc64': 0.20.2 + '@esbuild/android-arm': 0.20.2 + '@esbuild/android-arm64': 0.20.2 + '@esbuild/android-x64': 0.20.2 + '@esbuild/darwin-arm64': 0.20.2 + '@esbuild/darwin-x64': 0.20.2 + '@esbuild/freebsd-arm64': 0.20.2 + '@esbuild/freebsd-x64': 0.20.2 + '@esbuild/linux-arm': 0.20.2 + '@esbuild/linux-arm64': 0.20.2 + '@esbuild/linux-ia32': 0.20.2 + '@esbuild/linux-loong64': 0.20.2 + '@esbuild/linux-mips64el': 0.20.2 + '@esbuild/linux-ppc64': 0.20.2 + '@esbuild/linux-riscv64': 0.20.2 + '@esbuild/linux-s390x': 0.20.2 + '@esbuild/linux-x64': 0.20.2 + '@esbuild/netbsd-x64': 0.20.2 + '@esbuild/openbsd-x64': 0.20.2 + '@esbuild/sunos-x64': 0.20.2 + '@esbuild/win32-arm64': 0.20.2 + '@esbuild/win32-ia32': 0.20.2 + '@esbuild/win32-x64': 0.20.2 + dev: false + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + dev: false + + /escape-carriage@1.3.1: + resolution: {integrity: sha512-GwBr6yViW3ttx1kb7/Oh+gKQ1/TrhYwxKqVmg5gS+BK+Qe2KrOa/Vh7w3HPBvgGf0LfcDGoY9I6NHKoA5Hozhw==} + dev: false + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + dev: false + + /escape-string-regexp@5.0.0: + resolution: {integrity: sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==} + engines: {node: '>=12'} + dev: false + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /estree-util-attach-comments@3.0.0: + resolution: {integrity: sha512-cKUwm/HUcTDsYh/9FgnuFqpfquUbwIqwKM26BVCGDPVgvaCl/nDCCjUfiLlx6lsEZ3Z4RFxNbOQ60pkaEwFxGw==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /estree-util-build-jsx@3.0.1: + resolution: {integrity: sha512-8U5eiL6BTrPxp/CHbs2yMgP8ftMhR5ww1eIKoWRMlqvltHF8fZn5LRDvTKuxD3DUn+shRbLGqXemcP51oFCsGQ==} + dependencies: + '@types/estree-jsx': 1.0.2 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + estree-walker: 3.0.3 + dev: false + + /estree-util-is-identifier-name@3.0.0: + resolution: {integrity: sha512-hFtqIDZTIUZ9BXLb8y4pYGyk6+wekIivNVTcmvk8NoOh+VeRn5y6cEHzbURrWbfp1fIqdVipilzj+lfaadNZmg==} + dev: false + + /estree-util-to-js@2.0.0: + resolution: {integrity: sha512-WDF+xj5rRWmD5tj6bIqRi6CkLIXbbNQUcxQHzGysQzvHmdYG2G7p/Tf0J0gpxGgkeMZNTIjT/AoSvC9Xehcgdg==} + dependencies: + '@types/estree-jsx': 1.0.2 + astring: 1.8.6 + source-map: 0.7.4 + dev: false + + /estree-util-visit@2.0.0: + resolution: {integrity: sha512-m5KgiH85xAhhW8Wta0vShLcUvOsh3LLPI2YVwcbio1l7E09NTLL1EyMZFM1OyWowoH0skScNbhOPl4kcBgzTww==} + dependencies: + '@types/estree-jsx': 1.0.2 + '@types/unist': 3.0.2 + dev: false + + /estree-walker@2.0.2: + resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} + dev: false + + /estree-walker@3.0.3: + resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /eventemitter3@5.0.1: + resolution: {integrity: sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==} + dev: false + + /execa@8.0.1: + resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} + engines: {node: '>=16.17'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 8.0.1 + human-signals: 5.0.0 + is-stream: 3.0.0 + merge-stream: 2.0.0 + npm-run-path: 5.1.0 + onetime: 6.0.0 + signal-exit: 4.1.0 + strip-final-newline: 3.0.0 + dev: false + + /expand-template@2.0.3: + resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} + engines: {node: '>=6'} + requiresBuild: true + dev: false + optional: true + + /ext@1.7.0: + resolution: {integrity: sha512-6hxeJYaL110a9b5TEJSj0gojyHQAmA2ch5Os+ySCiA1QGdS697XWY1pzsrSjqA9LDEEgdB/KypIlR59RcLuHYw==} + dependencies: + type: 2.7.2 + dev: false + + /extend-shallow@2.0.1: + resolution: {integrity: sha512-zCnTtlxNoAiDc3gqY2aYAWFx7XWWiasuF2K8Me5WbN8otHKTUKBwjPtNpRs/rbUZm7KxWAaNj7P1a/p52GbVug==} + engines: {node: '>=0.10.0'} + dependencies: + is-extendable: 0.1.1 + dev: false + + /extend@3.0.2: + resolution: {integrity: sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==} + dev: false + + /fast-fifo@1.3.2: + resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} + requiresBuild: true + dev: false + optional: true + + /fast-glob@3.3.2: + resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: false + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: false + + /files-pipe@2.1.15: + resolution: {integrity: sha512-HYPXV6nh/H3U0WUDErZMVUoUJh15XDe5/rFwHWZXU5wIyCbCkA7UAuhLySs7sua3MRuwILuwZLDnQtXhaibNeg==} + dependencies: + '@types/node': 20.11.30 + deepmerge-ts: 5.1.0 + fast-glob: 3.3.2 + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + dev: false + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: false + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: false + + /find-yarn-workspace-root2@1.2.16: + resolution: {integrity: sha512-hr6hb1w8ePMpPVUK39S4RlwJzi+xPLuVuG8XlwXU3KD5Yn3qgBWVfy3AzNlDhWvE1EORCE65/Qm26rFQt3VLVA==} + dependencies: + micromatch: 4.0.5 + pkg-dir: 4.2.0 + dev: false + + /flattie@1.1.1: + resolution: {integrity: sha512-9UbaD6XdAL97+k/n+N7JwX46K/M6Zc6KcFYskrYL8wbBV/Uyk0CTAMY0VT+qiK5PM7AIc9aTWYtq65U7T+aCNQ==} + engines: {node: '>=8'} + dev: false + + /foreground-child@3.1.1: + resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} + engines: {node: '>=14'} + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + dev: false + + /fraction.js@4.3.7: + resolution: {integrity: sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==} + dev: false + + /fs-constants@1.0.0: + resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} + requiresBuild: true + dev: false + optional: true + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /function-bind@1.1.2: + resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} + dev: false + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: false + + /get-east-asian-width@1.2.0: + resolution: {integrity: sha512-2nk+7SIVb14QrgXFHcm84tD4bKQz0RxPuMT8Ag5KPOq7J5fEmAg0UbXdTOSHqNuHSU28k55qnceesxXRZGzKWA==} + engines: {node: '>=18'} + dev: false + + /get-stream@8.0.1: + resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} + engines: {node: '>=16'} + dev: false + + /github-from-package@0.0.0: + resolution: {integrity: sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==} + requiresBuild: true + dev: false + optional: true + + /github-slugger@2.0.0: + resolution: {integrity: sha512-IaOQ9puYtjrkq7Y0Ygl9KDZnrf/aiUJYUpVf89y8kyaxbRG7Y1SrX/jaumrv81vc61+kiMempujsM3Yw7w5qcw==} + dev: false + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: false + + /glob@10.3.10: + resolution: {integrity: sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + foreground-child: 3.1.1 + jackspeak: 2.3.6 + minimatch: 9.0.3 + minipass: 7.0.4 + path-scurry: 1.10.1 + dev: false + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: false + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + dev: false + + /gray-matter@4.0.3: + resolution: {integrity: sha512-5v6yZd4JK3eMI3FqqCouswVqwugaA9r4dNZB1wwcmrD02QkV5H0y7XBQW8QwQqEaZY1pM9aqORSORhJRdNK44Q==} + engines: {node: '>=6.0'} + dependencies: + js-yaml: 3.14.1 + kind-of: 6.0.3 + section-matter: 1.0.0 + strip-bom-string: 1.0.0 + dev: false + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + dev: false + + /hasown@2.0.0: + resolution: {integrity: sha512-vUptKVTpIJhcczKBbgnS+RtcuYMB8+oNzPK2/Hp3hanz8JmpATdmmgLgSaadVREkDm+e2giHwY3ZRkyjSIDDFA==} + engines: {node: '>= 0.4'} + dependencies: + function-bind: 1.1.2 + dev: false + + /hast-util-from-html@2.0.1: + resolution: {integrity: sha512-RXQBLMl9kjKVNkJTIO6bZyb2n+cUH8LFaSSzo82jiLT6Tfc+Pt7VQCS+/h3YwG4jaNE2TA2sdJisGWR+aJrp0g==} + dependencies: + '@types/hast': 3.0.4 + devlop: 1.1.0 + hast-util-from-parse5: 8.0.1 + parse5: 7.1.2 + vfile: 6.0.1 + vfile-message: 4.0.2 + dev: false + + /hast-util-from-parse5@8.0.1: + resolution: {integrity: sha512-Er/Iixbc7IEa7r/XLtuG52zoqn/b3Xng/w6aZQ0xGVxzhw5xUFxcRqdPzP6yFi/4HBYRaifaI5fQ1RH8n0ZeOQ==} + dependencies: + '@types/hast': 3.0.2 + '@types/unist': 3.0.2 + devlop: 1.1.0 + hastscript: 8.0.0 + property-information: 6.3.0 + vfile: 6.0.1 + vfile-location: 5.0.2 + web-namespaces: 2.0.1 + dev: false + + /hast-util-heading-rank@3.0.0: + resolution: {integrity: sha512-EJKb8oMUXVHcWZTDepnr+WNbfnXKFNf9duMesmr4S8SXTJBJ9M4Yok08pu9vxdJwdlGRhVumk9mEhkEvKGifwA==} + dependencies: + '@types/hast': 3.0.4 + dev: false + + /hast-util-is-element@3.0.0: + resolution: {integrity: sha512-Val9mnv2IWpLbNPqc/pUem+a7Ipj2aHacCwgNfTiK0vJKl0LF+4Ba4+v1oPHFpf3bLYmreq0/l3Gud9S5OH42g==} + dependencies: + '@types/hast': 3.0.4 + dev: false + + /hast-util-parse-selector@4.0.0: + resolution: {integrity: sha512-wkQCkSYoOGCRKERFWcxMVMOcYE2K1AaNLU8DXS9arxnLOUEWbOXKXiJUNzEpqZ3JOKpnha3jkFrumEjVliDe7A==} + dependencies: + '@types/hast': 3.0.2 + dev: false + + /hast-util-raw@9.0.1: + resolution: {integrity: sha512-5m1gmba658Q+lO5uqL5YNGQWeh1MYWZbZmWrM5lncdcuiXuo5E2HT/CIOp0rLF8ksfSwiCVJ3twlgVRyTGThGA==} + dependencies: + '@types/hast': 3.0.2 + '@types/unist': 3.0.2 + '@ungap/structured-clone': 1.2.0 + hast-util-from-parse5: 8.0.1 + hast-util-to-parse5: 8.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.0.2 + parse5: 7.1.2 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-to-estree@3.1.0: + resolution: {integrity: sha512-lfX5g6hqVh9kjS/B9E2gSkvHH4SZNiQFiqWS0x9fENzEl+8W12RqdRxX6d/Cwxi30tPQs3bIO+aolQJNp1bIyw==} + dependencies: + '@types/estree': 1.0.5 + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-attach-comments: 3.0.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + style-to-object: 0.4.4 + unist-util-position: 5.0.0 + zwitch: 2.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-html@9.0.0: + resolution: {integrity: sha512-IVGhNgg7vANuUA2XKrT6sOIIPgaYZnmLx3l/CCOAK0PtgfoHrZwX7jCSYyFxHTrGmC6S9q8aQQekjp4JPZF+cw==} + dependencies: + '@types/hast': 3.0.2 + '@types/unist': 3.0.2 + ccount: 2.0.1 + comma-separated-tokens: 2.0.3 + hast-util-raw: 9.0.1 + hast-util-whitespace: 3.0.0 + html-void-elements: 3.0.0 + mdast-util-to-hast: 13.0.2 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + stringify-entities: 4.0.3 + zwitch: 2.0.4 + dev: false + + /hast-util-to-jsx-runtime@2.3.0: + resolution: {integrity: sha512-H/y0+IWPdsLLS738P8tDnrQ8Z+dj12zQQ6WC11TIM21C8WFVoIxcqWXf2H3hiTVZjF1AWqoimGwrTWecWrnmRQ==} + dependencies: + '@types/estree': 1.0.5 + '@types/hast': 3.0.2 + '@types/unist': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + hast-util-whitespace: 3.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdxjs-esm: 2.0.1 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + style-to-object: 1.0.5 + unist-util-position: 5.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /hast-util-to-parse5@8.0.0: + resolution: {integrity: sha512-3KKrV5ZVI8if87DVSi1vDeByYrkGzg4mEfeu4alwgmmIeARiBLKCZS2uw5Gb6nU9x9Yufyj3iudm6i7nl52PFw==} + dependencies: + '@types/hast': 3.0.2 + comma-separated-tokens: 2.0.3 + devlop: 1.1.0 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + web-namespaces: 2.0.1 + zwitch: 2.0.4 + dev: false + + /hast-util-to-text@4.0.0: + resolution: {integrity: sha512-EWiE1FSArNBPUo1cKWtzqgnuRQwEeQbQtnFJRYV1hb1BWDgrAlBU0ExptvZMM/KSA82cDpm2sFGf3Dmc5Mza3w==} + dependencies: + '@types/hast': 3.0.4 + '@types/unist': 3.0.2 + hast-util-is-element: 3.0.0 + unist-util-find-after: 5.0.0 + dev: false + + /hast-util-whitespace@3.0.0: + resolution: {integrity: sha512-88JUN06ipLwsnv+dVn+OIYOvAuvBMy/Qoi6O7mQHxdPXpjy+Cd6xRkWwux7DKO+4sYILtLBRIKgsdpS2gQc7qw==} + dependencies: + '@types/hast': 3.0.2 + dev: false + + /hastscript@8.0.0: + resolution: {integrity: sha512-dMOtzCEd3ABUeSIISmrETiKuyydk1w0pa+gE/uormcTpSYuaNJPbX1NU3JLyscSLjwAQM8bWMhhIlnCqnRvDTw==} + dependencies: + '@types/hast': 3.0.2 + comma-separated-tokens: 2.0.3 + hast-util-parse-selector: 4.0.0 + property-information: 6.3.0 + space-separated-tokens: 2.0.2 + dev: false + + /he@1.2.0: + resolution: {integrity: sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==} + hasBin: true + dev: false + + /html-escaper@3.0.3: + resolution: {integrity: sha512-RuMffC89BOWQoY0WKGpIhn5gX3iI54O6nRA0yC124NYVtzjmFWBIiFd8M0x+ZdX0P9R4lADg1mgP8C7PxGOWuQ==} + dev: false + + /html-minifier-terser@7.2.0: + resolution: {integrity: sha512-tXgn3QfqPIpGl9o+K5tpcj3/MN4SfLtsx2GWwBC3SSd0tXQGyF3gsSqad8loJgKZGM3ZxbYDd5yhiBIdWpmvLA==} + engines: {node: ^14.13.1 || >=16.0.0} + hasBin: true + dependencies: + camel-case: 4.1.2 + clean-css: 5.3.3 + commander: 10.0.1 + entities: 4.5.0 + param-case: 3.0.4 + relateurl: 0.2.7 + terser: 5.29.2 + dev: false + + /html-void-elements@3.0.0: + resolution: {integrity: sha512-bEqo66MRXsUGxWHV5IP0PUiAWwoEjba4VCzg0LjFJBpchPaTfyfCKTG6bc5F8ucKec3q5y6qOdGyYTSBEvhCrg==} + dev: false + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /human-signals@5.0.0: + resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} + engines: {node: '>=16.17.0'} + dev: false + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + dev: false + + /import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} + dev: false + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + dev: false + + /ini@1.3.8: + resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} + requiresBuild: true + dev: false + optional: true + + /inline-style-parser@0.1.1: + resolution: {integrity: sha512-7NXolsK4CAS5+xvdj5OMMbI962hU/wvwoxk+LWR9Ek9bVtyuuYScDN6eS0rUm6TxApFpw7CX1o4uJzcd4AyD3Q==} + dev: false + + /inline-style-parser@0.2.2: + resolution: {integrity: sha512-EcKzdTHVe8wFVOGEYXiW9WmJXPjqi1T+234YpJr98RiFYKHV3cdy1+3mkTE+KHTHxFFLH51SfaGOoUdW+v7ViQ==} + dev: false + + /intersection-observer@0.10.0: + resolution: {integrity: sha512-fn4bQ0Xq8FTej09YC/jqKZwtijpvARlRp6wxL5WTA6yPe2YWSJ5RJh7Nm79rK2qB0wr6iDQzH60XGq5V/7u8YQ==} + dev: false + + /is-alphabetical@2.0.1: + resolution: {integrity: sha512-FWyyY60MeTNyeSRpkM2Iry0G9hpr7/9kD40mD/cGQEuilcZYS4okz8SN2Q6rLCJ8gbCt6fN+rC+6tMGS99LaxQ==} + + /is-alphanumerical@2.0.1: + resolution: {integrity: sha512-hmbYhX/9MUMF5uh7tOXyK/n0ZvWpad5caBA17GsC6vyuCqaWliRG5K1qS9inmUhEMaOBIW7/whAnSwveW/LtZw==} + dependencies: + is-alphabetical: 2.0.1 + is-decimal: 2.0.1 + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + requiresBuild: true + dev: false + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + dev: false + + /is-buffer@2.0.5: + resolution: {integrity: sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==} + engines: {node: '>=4'} + dev: false + + /is-core-module@2.13.1: + resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} + dependencies: + hasown: 2.0.0 + dev: false + + /is-decimal@2.0.1: + resolution: {integrity: sha512-AAB9hiomQs5DXWcRB1rqsxGUstbRroFOPPVAomNk/3XHR5JyEZChOyTWe2oayKnsSsr/kcGqF+z6yuH6HHpN0A==} + + /is-docker@3.0.0: + resolution: {integrity: sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + hasBin: true + dev: false + + /is-extendable@0.1.1: + resolution: {integrity: sha512-5BMULNob1vgFX6EjQw5izWDxrecWK9AM72rugNr0TFldMOi0fj6Jk+zeKIt0xGj4cEfQIJth4w3OKWOJ4f+AFw==} + engines: {node: '>=0.10.0'} + dev: false + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + dev: false + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + dev: false + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + dev: false + + /is-hexadecimal@2.0.1: + resolution: {integrity: sha512-DgZQp241c8oO6cA1SbTEWiXeoxV42vlcJxgH+B3hi1AiqqKruZR3ZGF8In3fj4+/y/7rHvlOZLZtgJ/4ttYGZg==} + + /is-inside-container@1.0.0: + resolution: {integrity: sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==} + engines: {node: '>=14.16'} + hasBin: true + dependencies: + is-docker: 3.0.0 + dev: false + + /is-interactive@2.0.0: + resolution: {integrity: sha512-qP1vozQRI+BMOPcjFzrjXuQvdak2pHNUMZoeG2eRbiSqyvbEf/wQtEOTOX1guk6E3t36RkaqiSt8A/6YElNxLQ==} + engines: {node: '>=12'} + dev: false + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + dev: false + + /is-plain-obj@4.1.0: + resolution: {integrity: sha512-+Pgi+vMuUNkJyExiMBt5IlFoMyKnr5zhJ4Uspz58WOhBF5QoIZkFyNHIbBAtHwzVAgk5RtndVNsDRN61/mmDqg==} + engines: {node: '>=12'} + dev: false + + /is-plain-object@5.0.0: + resolution: {integrity: sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q==} + engines: {node: '>=0.10.0'} + dev: false + + /is-reference@3.0.2: + resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} + dependencies: + '@types/estree': 1.0.5 + dev: false + + /is-stream@3.0.0: + resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dev: false + + /is-unicode-supported@1.3.0: + resolution: {integrity: sha512-43r2mRvz+8JRIKnWJ+3j8JtjRKZ6GmjzfaE/qiBJnikNnYv/6bagRJ1kUhNk8R5EX/GkobD+r+sfxCPJsiKBLQ==} + engines: {node: '>=12'} + dev: false + + /is-wsl@3.1.0: + resolution: {integrity: sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==} + engines: {node: '>=16'} + dependencies: + is-inside-container: 1.0.0 + dev: false + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + dev: false + + /jackspeak@2.3.6: + resolution: {integrity: sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==} + engines: {node: '>=14'} + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + dev: false + + /jiti@1.21.0: + resolution: {integrity: sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==} + hasBin: true + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + dev: false + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: false + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: false + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: false + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: false + + /kind-of@6.0.3: + resolution: {integrity: sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==} + engines: {node: '>=0.10.0'} + dev: false + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: false + + /kleur@4.1.5: + resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} + engines: {node: '>=6'} + dev: false + + /kolorist@1.8.0: + resolution: {integrity: sha512-Y+60/zizpJ3HRH8DCss+q95yr6145JXZo46OTpFvDZWLfRCE4qChOyk1b26nMaNpfHHgxagk9dXT5OP0Tfe+dQ==} + dev: false + + /lightningcss-darwin-arm64@1.24.1: + resolution: {integrity: sha512-1jQ12jBy+AE/73uGQWGSafK5GoWgmSiIQOGhSEXiFJSZxzV+OXIx+a9h2EYHxdJfX864M+2TAxWPWb0Vv+8y4w==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-darwin-x64@1.24.1: + resolution: {integrity: sha512-R4R1d7VVdq2mG4igMU+Di8GPf0b64ZLnYVkubYnGG0Qxq1KaXQtAzcLI43EkpnoWvB/kUg8JKCWH4S13NfiLcQ==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [darwin] + requiresBuild: true + dev: false + optional: true + + /lightningcss-freebsd-x64@1.24.1: + resolution: {integrity: sha512-z6NberUUw5ALES6Ixn2shmjRRrM1cmEn1ZQPiM5IrZ6xHHL5a1lPin9pRv+w6eWfcrEo+qGG6R9XfJrpuY3e4g==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [freebsd] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm-gnueabihf@1.24.1: + resolution: {integrity: sha512-NLQLnBQW/0sSg74qLNI8F8QKQXkNg4/ukSTa+XhtkO7v3BnK19TS1MfCbDHt+TTdSgNEBv0tubRuapcKho2EWw==} + engines: {node: '>= 12.0.0'} + cpu: [arm] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-gnu@1.24.1: + resolution: {integrity: sha512-AQxWU8c9E9JAjAi4Qw9CvX2tDIPjgzCTrZCSXKELfs4mCwzxRkHh2RCxX8sFK19RyJoJAjA/Kw8+LMNRHS5qEg==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-arm64-musl@1.24.1: + resolution: {integrity: sha512-JCgH/SrNrhqsguUA0uJUM1PvN5+dVuzPIlXcoWDHSv2OU/BWlj2dUYr3XNzEw748SmNZPfl2NjQrAdzaPOn1lA==} + engines: {node: '>= 12.0.0'} + cpu: [arm64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-gnu@1.24.1: + resolution: {integrity: sha512-TYdEsC63bHV0h47aNRGN3RiK7aIeco3/keN4NkoSQ5T8xk09KHuBdySltWAvKLgT8JvR+ayzq8ZHnL1wKWY0rw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-linux-x64-musl@1.24.1: + resolution: {integrity: sha512-HLfzVik3RToot6pQ2Rgc3JhfZkGi01hFetHt40HrUMoeKitLoqUUT5owM6yTZPTytTUW9ukLBJ1pc3XNMSvlLw==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [linux] + requiresBuild: true + dev: false + optional: true + + /lightningcss-win32-x64-msvc@1.24.1: + resolution: {integrity: sha512-joEupPjYJ7PjZtDsS5lzALtlAudAbgIBMGJPNeFe5HfdmJXFd13ECmEM+5rXNxYVMRHua2w8132R6ab5Z6K9Ow==} + engines: {node: '>= 12.0.0'} + cpu: [x64] + os: [win32] + requiresBuild: true + dev: false + optional: true + + /lightningcss@1.24.1: + resolution: {integrity: sha512-kUpHOLiH5GB0ERSv4pxqlL0RYKnOXtgGtVe7shDGfhS0AZ4D1ouKFYAcLcZhql8aMspDNzaUCumGHZ78tb2fTg==} + engines: {node: '>= 12.0.0'} + dependencies: + detect-libc: 1.0.3 + optionalDependencies: + lightningcss-darwin-arm64: 1.24.1 + lightningcss-darwin-x64: 1.24.1 + lightningcss-freebsd-x64: 1.24.1 + lightningcss-linux-arm-gnueabihf: 1.24.1 + lightningcss-linux-arm64-gnu: 1.24.1 + lightningcss-linux-arm64-musl: 1.24.1 + lightningcss-linux-x64-gnu: 1.24.1 + lightningcss-linux-x64-musl: 1.24.1 + lightningcss-win32-x64-msvc: 1.24.1 + dev: false + + /lilconfig@2.1.0: + resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} + engines: {node: '>=10'} + dev: false + + /lilconfig@3.1.1: + resolution: {integrity: sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==} + engines: {node: '>=14'} + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + dev: false + + /load-yaml-file@0.2.0: + resolution: {integrity: sha512-OfCBkGEw4nN6JLtgRidPX6QxjBQGQf72q3si2uvqyFEMbycSFFHwAZeXx6cJgFM9wmLrf9zBwCP3Ivqa+LLZPw==} + engines: {node: '>=6'} + dependencies: + graceful-fs: 4.2.11 + js-yaml: 3.14.1 + pify: 4.0.1 + strip-bom: 3.0.0 + dev: false + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: false + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: false + + /lodash.castarray@4.4.0: + resolution: {integrity: sha512-aVx8ztPv7/2ULbArGJ2Y42bG1mEQ5mGjpdvrbJcJFU3TbYybe+QlLS4pst9zV52ymy2in1KpFPiZnAOATxD4+Q==} + dev: false + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: false + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: false + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + dev: false + + /lodash.uniq@4.5.0: + resolution: {integrity: sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + dev: false + + /log-symbols@5.1.0: + resolution: {integrity: sha512-l0x2DvrW294C9uDCoQe1VSU4gf529FkSZ6leBl4TiqZH/e+0R7hSfHQBNut2mNygDgHwvYHfFLn6Oxb3VWj2rA==} + engines: {node: '>=12'} + dependencies: + chalk: 5.3.0 + is-unicode-supported: 1.3.0 + dev: false + + /longest-streak@3.1.0: + resolution: {integrity: sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==} + + /loose-envify@1.4.0: + resolution: {integrity: sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==} + hasBin: true + dependencies: + js-tokens: 4.0.0 + dev: false + + /lower-case@2.0.2: + resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + dependencies: + tslib: 2.6.2 + dev: false + + /lru-cache@10.2.0: + resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} + engines: {node: 14 || >=16.14} + dev: false + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: false + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + dev: false + + /lz-string@1.5.0: + resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} + hasBin: true + dev: false + + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 + dev: false + + /markdown-extensions@2.0.0: + resolution: {integrity: sha512-o5vL7aDWatOTX8LzaS1WMoaoxIiLRQJuIKKe2wAw6IeULDHaqbiqiggmx+pKvZDb1Sj+pE46Sn1T7lCqfFtg1Q==} + engines: {node: '>=16'} + dev: false + + /markdown-table@3.0.3: + resolution: {integrity: sha512-Z1NL3Tb1M9wH4XESsCDEksWoKTdlUafKc4pt0GRwjUyXaCFZ+dc3g2erqB6zm3szA2IUSi7VnPI+o/9jnxh9hw==} + dev: false + + /mdast-util-definitions@6.0.0: + resolution: {integrity: sha512-scTllyX6pnYNZH/AIp/0ePz6s4cZtARxImwoPJ7kS42n+MnVsI4XbnG6d4ibehRIldYMWM2LD7ImQblVhUejVQ==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + dev: false + + /mdast-util-directive@3.0.0: + resolution: {integrity: sha512-JUpYOqKI4mM3sZcNxmF/ox04XYFFkNwr0CFlrQIkCwbvH0xzMCqkMqAde9wRd80VAhaUrwFwKm2nxretdT1h7Q==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-visit-parents: 6.0.1 + transitivePeerDependencies: + - supports-color + + /mdast-util-find-and-replace@3.0.1: + resolution: {integrity: sha512-SG21kZHGC3XRTSUhtofZkBzZTJNM5ecCi0SK2IMKmSXR8vO3peL+kb1O0z7Zl83jKtutG4k5Wv/W7V3/YHvzPA==} + dependencies: + '@types/mdast': 4.0.3 + escape-string-regexp: 5.0.0 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + dev: false + + /mdast-util-from-markdown@2.0.0: + resolution: {integrity: sha512-n7MTOr/z+8NAX/wmhhDji8O3bRvPTV/U0oTCaZJkjhPSKTPhS3xufVhKGF8s1pJ7Ox4QgoIU7KHseh09S+9rTA==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + mdast-util-to-string: 4.0.0 + micromark: 4.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-decode-string: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-stringify-position: 4.0.0 + transitivePeerDependencies: + - supports-color + + /mdast-util-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-FyzMsduZZHSc3i0Px3PQcBT4WJY/X/RCtEJKuybiC6sjPqLv7h1yqAkmILZtuxMSsUyaLUWNp71+vQH2zqp5cg==} + dependencies: + '@types/mdast': 4.0.3 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-find-and-replace: 3.0.1 + micromark-util-character: 2.0.1 + dev: false + + /mdast-util-gfm-footnote@2.0.0: + resolution: {integrity: sha512-5jOT2boTSVkMnQ7LTrd6n/18kqwjmuYqo7JUPe+tRCY6O7dAuTFMtTPauYYrMPpox9hlN0uOx/FL8XvEfG9/mQ==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + micromark-util-normalize-identifier: 2.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-mKKb915TF+OC5ptj5bJ7WFRPdYtuHv0yTRxK2tJvi+BDqbkiG7h7u/9SI89nRAYcmap2xHQL9D+QG/6wSrTtXg==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-table@2.0.0: + resolution: {integrity: sha512-78UEvebzz/rJIxLvE7ZtDd/vIQ0RHv+3Mh5DR96p7cS7HsBhYIICDBCu8csTNWNO6tBWfqXPWekRuj2FNOGOZg==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + markdown-table: 3.0.3 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm-task-list-item@2.0.0: + resolution: {integrity: sha512-IrtvNvjxC1o06taBAVJznEnkiHxLFTzgonUdy8hzFVeDun0uTjxxrRGVaNFqkU1wJR3RBPEfsxmU6jDWPofrTQ==} + dependencies: + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-gfm@3.0.0: + resolution: {integrity: sha512-dgQEX5Amaq+DuUqf26jJqSK9qgixgd6rYDHAv4aTBuA92cTknZlKpPfa86Z/s8Dj8xsAQpFfBmPUHWJBWqS4Bw==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-gfm-autolink-literal: 2.0.0 + mdast-util-gfm-footnote: 2.0.0 + mdast-util-gfm-strikethrough: 2.0.0 + mdast-util-gfm-table: 2.0.0 + mdast-util-gfm-task-list-item: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-expression@2.0.0: + resolution: {integrity: sha512-fGCu8eWdKUKNu5mohVGkhBXCXGnOTLuFqOvGMvdikr+J1w7lDJgxThOKpwRWzzbyXAU2hhSwsmssOY4yTokluw==} + dependencies: + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx-jsx@3.1.2: + resolution: {integrity: sha512-eKMQDeywY2wlHc97k5eD8VC+9ASMjN8ItEZQNGwJ6E0XWKiW/Z0V5/H8pvoXUf+y+Mj0VIgeRRbujBmFn4FTyA==} + dependencies: + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + ccount: 2.0.1 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + parse-entities: 4.0.1 + stringify-entities: 4.0.3 + unist-util-remove-position: 5.0.0 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdx@3.0.0: + resolution: {integrity: sha512-JfbYLAW7XnYTTbUsmpu0kdBUVe+yKVJZBItEjwyYJiDJuZ9w4eeaqks4HQO+R7objWgS2ymV60GYpI14Ug554w==} + dependencies: + mdast-util-from-markdown: 2.0.0 + mdast-util-mdx-expression: 2.0.0 + mdast-util-mdx-jsx: 3.1.2 + mdast-util-mdxjs-esm: 2.0.1 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-mdxjs-esm@2.0.1: + resolution: {integrity: sha512-EcmOpxsZ96CvlP03NghtH1EsLtr0n9Tm4lPUJUBccV9RwUOneqSycg19n5HGzCf+10LozMRSObtVr3ee1WoHtg==} + dependencies: + '@types/estree-jsx': 1.0.2 + '@types/hast': 3.0.2 + '@types/mdast': 4.0.3 + devlop: 1.1.0 + mdast-util-from-markdown: 2.0.0 + mdast-util-to-markdown: 2.1.0 + transitivePeerDependencies: + - supports-color + dev: false + + /mdast-util-newline-to-break@2.0.0: + resolution: {integrity: sha512-MbgeFca0hLYIEx/2zGsszCSEJJ1JSCdiY5xQxRcLDDGa8EPvlLPupJ4DSajbMPAnC0je8jfb9TiUATnxxrHUog==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-find-and-replace: 3.0.1 + dev: false + + /mdast-util-phrasing@4.1.0: + resolution: {integrity: sha512-TqICwyvJJpBwvGAMZjj4J2n0X8QWp21b9l0o7eXyVJ25YNWYbJDVIyD1bZXE6WtV6RmKJVYmQAKWa0zWOABz2w==} + dependencies: + '@types/mdast': 4.0.3 + unist-util-is: 6.0.0 + + /mdast-util-to-hast@13.0.2: + resolution: {integrity: sha512-U5I+500EOOw9e3ZrclN3Is3fRpw8c19SMyNZlZ2IS+7vLsNzb2Om11VpIVOR+/0137GhZsFEF6YiKD5+0Hr2Og==} + dependencies: + '@types/hast': 3.0.2 + '@types/mdast': 4.0.3 + '@ungap/structured-clone': 1.2.0 + devlop: 1.1.0 + micromark-util-sanitize-uri: 2.0.0 + trim-lines: 3.0.1 + unist-util-position: 5.0.0 + unist-util-visit: 5.0.0 + dev: false + + /mdast-util-to-markdown@2.1.0: + resolution: {integrity: sha512-SR2VnIEdVNCJbP6y7kVTJgPLifdr8WEU440fQec7qHoHOUz/oJ2jmNRqdDQ3rbiStOXb2mCDGTuwsK5OPUgYlQ==} + dependencies: + '@types/mdast': 4.0.3 + '@types/unist': 3.0.2 + longest-streak: 3.1.0 + mdast-util-phrasing: 4.1.0 + mdast-util-to-string: 4.0.0 + micromark-util-decode-string: 2.0.0 + unist-util-visit: 5.0.0 + zwitch: 2.0.4 + + /mdast-util-to-string@4.0.0: + resolution: {integrity: sha512-0H44vDimn51F0YwvxSJSm0eCDOJTRlmN0R1yBh4HLj9wiV1Dn0QoXGbvFAWj2hSItVTlCmBF1hqKlIyUBVFLPg==} + dependencies: + '@types/mdast': 4.0.3 + + /mdn-data@2.0.28: + resolution: {integrity: sha512-aylIc7Z9y4yzHYAJNuESG3hfhC+0Ibp/MAMiaOZgNv4pmEdFyfZhhhny4MNiAfWdBQ1RQ2mfDWmM1x8SvGyp8g==} + dev: false + + /mdn-data@2.0.30: + resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} + dev: false + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + dev: false + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: false + + /micromark-core-commonmark@2.0.0: + resolution: {integrity: sha512-jThOz/pVmAYUtkroV3D5c1osFXAMv9e0ypGDOIZuCeAe91/sD6BoE2Sjzt30yuXtwOYUmySOhMas/PVyh02itA==} + dependencies: + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-factory-destination: 2.0.0 + micromark-factory-label: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-factory-title: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-html-tag-name: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-extension-directive@3.0.0: + resolution: {integrity: sha512-61OI07qpQrERc+0wEysLHMvoiO3s2R56x5u7glHq2Yqq6EHbH4dW25G9GfDdGCDYqA21KE6DWgNSzxSwHc2hSg==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-factory-whitespace: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + parse-entities: 4.0.1 + dev: false + + /micromark-extension-gfm-autolink-literal@2.0.0: + resolution: {integrity: sha512-rTHfnpt/Q7dEAK1Y5ii0W8bhfJlVJFnJMHIPisfPK3gpVNuOP0VnRl96+YJ3RYWV/P4gFeQoGKNlT3RhuvpqAg==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-footnote@2.0.0: + resolution: {integrity: sha512-6Rzu0CYRKDv3BfLAUnZsSlzx3ak6HAoI85KTiijuKIz5UxZxbUI+pD6oHgw+6UtQuiRwnGRhzMmPRv4smcz0fg==} + dependencies: + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-strikethrough@2.0.0: + resolution: {integrity: sha512-c3BR1ClMp5fxxmwP6AoOY2fXO9U8uFMKs4ADD66ahLTNcwzSCyRVU4k7LPV5Nxo/VJiR4TdzxRQY2v3qIUceCw==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-classify-character: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-table@2.0.0: + resolution: {integrity: sha512-PoHlhypg1ItIucOaHmKE8fbin3vTLpDOUg8KAr8gRCF1MOZI9Nquq2i/44wFvviM4WuxJzc3demT8Y3dkfvYrw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-tagfilter@2.0.0: + resolution: {integrity: sha512-xHlTOmuCSotIA8TW1mDIM6X2O1SiX5P9IuDtqGonFhEK0qgRI4yeC6vMxEV2dgyr2TiD+2PQ10o+cOhdVAcwfg==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm-task-list-item@2.0.1: + resolution: {integrity: sha512-cY5PzGcnULaN5O7T+cOzfMoHjBW7j+T9D2sucA5d/KbsBTPcYdebm9zUd9zzdgJGCwahV+/W78Z3nbulBYVbTw==} + dependencies: + devlop: 1.1.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-gfm@3.0.0: + resolution: {integrity: sha512-vsKArQsicm7t0z2GugkCKtZehqUm31oeGBV/KVSorWSy8ZlNAv7ytjFhvaryUiCUJYqs+NoE6AFhpQvBTM6Q4w==} + dependencies: + micromark-extension-gfm-autolink-literal: 2.0.0 + micromark-extension-gfm-footnote: 2.0.0 + micromark-extension-gfm-strikethrough: 2.0.0 + micromark-extension-gfm-table: 2.0.0 + micromark-extension-gfm-tagfilter: 2.0.0 + micromark-extension-gfm-task-list-item: 2.0.1 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdx-expression@3.0.0: + resolution: {integrity: sha512-sI0nwhUDz97xyzqJAbHQhp5TfaxEvZZZ2JDqUo+7NvyIYG6BZ5CPPqj2ogUoPJlmXHBnyZUzISg9+oUmU6tUjQ==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdx-jsx@3.0.0: + resolution: {integrity: sha512-uvhhss8OGuzR4/N17L1JwvmJIpPhAd8oByMawEKx6NVdBCbesjH4t+vjEp3ZXft9DwvlKSD07fCeI44/N0Vf2w==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + devlop: 1.1.0 + estree-util-is-identifier-name: 3.0.0 + micromark-factory-mdx-expression: 2.0.1 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-extension-mdx-md@2.0.0: + resolution: {integrity: sha512-EpAiszsB3blw4Rpba7xTOUptcFeBFi+6PY8VnJ2hhimH+vCQDirWgsMpz7w1XcZE7LVrSAUGb9VJpG9ghlYvYQ==} + dependencies: + micromark-util-types: 2.0.0 + dev: false + + /micromark-extension-mdxjs-esm@3.0.0: + resolution: {integrity: sha512-DJFl4ZqkErRpq/dAPyeWp15tGrcrrJho1hKK5uBS70BCtfrIFg81sqcTVu3Ta+KD1Tk5vAtBNElWxtAa+m8K9A==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-extension-mdxjs@3.0.0: + resolution: {integrity: sha512-A873fJfhnJ2siZyUrJ31l34Uqwy4xIFmvPY1oj+Ean5PHcPBYzEsvqvWGaWcfEIr11O5Dlw3p2y0tZWpKHDejQ==} + dependencies: + acorn: 8.11.2 + acorn-jsx: 5.3.2(acorn@8.11.2) + micromark-extension-mdx-expression: 3.0.0 + micromark-extension-mdx-jsx: 3.0.0 + micromark-extension-mdx-md: 2.0.0 + micromark-extension-mdxjs-esm: 3.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-types: 2.0.0 + dev: false + + /micromark-factory-destination@2.0.0: + resolution: {integrity: sha512-j9DGrQLm/Uhl2tCzcbLhy5kXsgkHUrjJHg4fFAeoMRwJmJerT9aw4FEhIbZStWN8A3qMwOp1uzHr4UL8AInxtA==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-factory-label@2.0.0: + resolution: {integrity: sha512-RR3i96ohZGde//4WSe/dJsxOX6vxIg9TimLAS3i4EhBAFx8Sm5SmqVfR8E87DPSR31nEAjZfbt91OMZWcNgdZw==} + dependencies: + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-factory-mdx-expression@2.0.1: + resolution: {integrity: sha512-F0ccWIUHRLRrYp5TC9ZYXmZo+p2AM13ggbsW4T0b5CRKP8KHVRB8t4pwtBgTxtjRmwrK0Irwm7vs2JOZabHZfg==} + dependencies: + '@types/estree': 1.0.5 + devlop: 1.1.0 + micromark-util-character: 2.0.1 + micromark-util-events-to-acorn: 2.0.2 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + unist-util-position-from-estree: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-factory-space@2.0.0: + resolution: {integrity: sha512-TKr+LIDX2pkBJXFLzpyPyljzYK3MtmllMUMODTQJIUfDGncESaqB90db9IAUcz4AZAJFdd8U9zOp9ty1458rxg==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-types: 2.0.0 + + /micromark-factory-title@2.0.0: + resolution: {integrity: sha512-jY8CSxmpWLOxS+t8W+FG3Xigc0RDQA9bKMY/EwILvsesiRniiVMejYTE4wumNc2f4UbAa4WsHqe3J1QS1sli+A==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-factory-whitespace@2.0.0: + resolution: {integrity: sha512-28kbwaBjc5yAI1XadbdPYHX/eDnqaUFVikLwrO7FDnKG7lpgxnvk/XGRhX/PN0mOZ+dBSZ+LgunHS+6tYQAzhA==} + dependencies: + micromark-factory-space: 2.0.0 + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-character@2.0.1: + resolution: {integrity: sha512-3wgnrmEAJ4T+mGXAUfMvMAbxU9RDG43XmGce4j6CwPtVxB3vfwXSZ6KhFwDzZ3mZHhmPimMAXg71veiBGzeAZw==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-character@2.1.0: + resolution: {integrity: sha512-KvOVV+X1yLBfs9dCBSopq/+G1PcgT3lAK07mC4BzXi5E7ahzMAF8oIupDDJ6mievI6F+lAATkbQQlQixJfT3aQ==} + dependencies: + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-chunked@2.0.0: + resolution: {integrity: sha512-anK8SWmNphkXdaKgz5hJvGa7l00qmcaUQoMYsBwDlSKFKjc6gjGXPDw3FNL3Nbwq5L8gE+RCbGqTw49FK5Qyvg==} + dependencies: + micromark-util-symbol: 2.0.0 + + /micromark-util-classify-character@2.0.0: + resolution: {integrity: sha512-S0ze2R9GH+fu41FA7pbSqNWObo/kzwf8rN/+IGlW/4tC6oACOs8B++bh+i9bVyNnwCcuksbFwsBme5OCKXCwIw==} + dependencies: + micromark-util-character: 2.0.1 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-combine-extensions@2.0.0: + resolution: {integrity: sha512-vZZio48k7ON0fVS3CUgFatWHoKbbLTK/rT7pzpJ4Bjp5JjkZeasRfrS9wsBdDJK2cJLHMckXZdzPSSr1B8a4oQ==} + dependencies: + micromark-util-chunked: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-decode-numeric-character-reference@2.0.1: + resolution: {integrity: sha512-bmkNc7z8Wn6kgjZmVHOX3SowGmVdhYS7yBpMnuMnPzDq/6xwVA604DuOXMZTO1lvq01g+Adfa0pE2UKGlxL1XQ==} + dependencies: + micromark-util-symbol: 2.0.0 + + /micromark-util-decode-string@2.0.0: + resolution: {integrity: sha512-r4Sc6leeUTn3P6gk20aFMj2ntPwn6qpDZqWvYmAG6NgvFTIlj4WtrAudLi65qYoaGdXYViXYw2pkmn7QnIFasA==} + dependencies: + decode-named-character-reference: 1.0.2 + micromark-util-character: 2.1.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-symbol: 2.0.0 + + /micromark-util-encode@2.0.0: + resolution: {integrity: sha512-pS+ROfCXAGLWCOc8egcBvT0kf27GoWMqtdarNfDcjb6YLuV5cM3ioG45Ys2qOVqeqSbjaKg72vU+Wby3eddPsA==} + + /micromark-util-events-to-acorn@2.0.2: + resolution: {integrity: sha512-Fk+xmBrOv9QZnEDguL9OI9/NQQp6Hz4FuQ4YmCb/5V7+9eAh1s6AYSvL20kHkD67YIg7EpE54TiSlcsf3vyZgA==} + dependencies: + '@types/acorn': 4.0.6 + '@types/estree': 1.0.5 + '@types/unist': 3.0.2 + devlop: 1.1.0 + estree-util-visit: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + vfile-message: 4.0.2 + dev: false + + /micromark-util-html-tag-name@2.0.0: + resolution: {integrity: sha512-xNn4Pqkj2puRhKdKTm8t1YHC/BAjx6CEwRFXntTaRf/x16aqka6ouVoutm+QdkISTlT7e2zU7U4ZdlDLJd2Mcw==} + + /micromark-util-normalize-identifier@2.0.0: + resolution: {integrity: sha512-2xhYT0sfo85FMrUPtHcPo2rrp1lwbDEEzpx7jiH2xXJLqBuy4H0GgXk5ToU8IEwoROtXuL8ND0ttVa4rNqYK3w==} + dependencies: + micromark-util-symbol: 2.0.0 + + /micromark-util-resolve-all@2.0.0: + resolution: {integrity: sha512-6KU6qO7DZ7GJkaCgwBNtplXCvGkJToU86ybBAUdavvgsCiG8lSSvYxr9MhwmQ+udpzywHsl4RpGJsYWG1pDOcA==} + dependencies: + micromark-util-types: 2.0.0 + + /micromark-util-sanitize-uri@2.0.0: + resolution: {integrity: sha512-WhYv5UEcZrbAtlsnPuChHUAsu/iBPOVaEVsntLBIdpibO0ddy8OzavZz3iL2xVvBZOpolujSliP65Kq0/7KIYw==} + dependencies: + micromark-util-character: 2.1.0 + micromark-util-encode: 2.0.0 + micromark-util-symbol: 2.0.0 + + /micromark-util-subtokenize@2.0.0: + resolution: {integrity: sha512-vc93L1t+gpR3p8jxeVdaYlbV2jTYteDje19rNSS/H5dlhxUYll5Fy6vJ2cDwP8RnsXi818yGty1ayP55y3W6fg==} + dependencies: + devlop: 1.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + + /micromark-util-symbol@2.0.0: + resolution: {integrity: sha512-8JZt9ElZ5kyTnO94muPxIGS8oyElRJaiJO8EzV6ZSyGQ1Is8xwl4Q45qU5UOg+bGH4AikWziz0iN4sFLWs8PGw==} + + /micromark-util-types@2.0.0: + resolution: {integrity: sha512-oNh6S2WMHWRZrmutsRmDDfkzKtxF+bc2VxLC9dvtrDIRFln627VsFP6fLMgTryGDljgLPjkrzQSDcPrjPyDJ5w==} + + /micromark@4.0.0: + resolution: {integrity: sha512-o/sd0nMof8kYff+TqcDx3VSrgBTcZpSvYcAHIfHhv5VAuNmisCxjhx6YmxS8PFEpb9z5WKWKPdzf0jM23ro3RQ==} + dependencies: + '@types/debug': 4.1.10 + debug: 4.3.4 + decode-named-character-reference: 1.0.2 + devlop: 1.1.0 + micromark-core-commonmark: 2.0.0 + micromark-factory-space: 2.0.0 + micromark-util-character: 2.1.0 + micromark-util-chunked: 2.0.0 + micromark-util-combine-extensions: 2.0.0 + micromark-util-decode-numeric-character-reference: 2.0.1 + micromark-util-encode: 2.0.0 + micromark-util-normalize-identifier: 2.0.0 + micromark-util-resolve-all: 2.0.0 + micromark-util-sanitize-uri: 2.0.0 + micromark-util-subtokenize: 2.0.0 + micromark-util-symbol: 2.0.0 + micromark-util-types: 2.0.0 + transitivePeerDependencies: + - supports-color + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: false + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + dev: false + + /mime@3.0.0: + resolution: {integrity: sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==} + engines: {node: '>=10.0.0'} + hasBin: true + dev: false + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + dev: false + + /mimic-fn@4.0.0: + resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} + engines: {node: '>=12'} + dev: false + + /mimic-response@3.1.0: + resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} + engines: {node: '>=10'} + requiresBuild: true + dev: false + optional: true + + /minimatch@9.0.3: + resolution: {integrity: sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + brace-expansion: 2.0.1 + dev: false + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + requiresBuild: true + dev: false + optional: true + + /minipass@7.0.4: + resolution: {integrity: sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==} + engines: {node: '>=16 || 14 >=14.17'} + dev: false + + /mkdirp-classic@0.5.3: + resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} + requiresBuild: true + dev: false + optional: true + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /mz@2.7.0: + resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} + dependencies: + any-promise: 1.3.0 + object-assign: 4.1.1 + thenify-all: 1.6.0 + dev: false + + /nanoid@3.3.6: + resolution: {integrity: sha512-BGcqMMJuToF7i1rt+2PWSNVnWIkGCU78jBG3RxO/bZlnZPK2Cmi2QaffxGO/2RvWi9sL+FAiRiXMgsyxQ1DIDA==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /nanoid@3.3.7: + resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} + hasBin: true + dev: false + + /nanoid@4.0.2: + resolution: {integrity: sha512-7ZtY5KTCNheRGfEFxnedV5zFiORN1+Y1N6zvPTnHQd8ENUvfaDBeuJDZb2bN/oXwXxu3qkTXDzy57W5vAmDTBw==} + engines: {node: ^14 || ^16 || >=18} + hasBin: true + dev: false + + /napi-build-utils@1.0.2: + resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} + requiresBuild: true + dev: false + optional: true + + /next-tick@1.1.0: + resolution: {integrity: sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==} + dev: false + + /nlcst-to-string@3.1.1: + resolution: {integrity: sha512-63mVyqaqt0cmn2VcI2aH6kxe1rLAmSROqHMA0i4qqg1tidkfExgpb0FGMikMCn86mw5dFtBtEANfmSSK7TjNHw==} + dependencies: + '@types/nlcst': 1.0.3 + dev: false + + /no-case@3.0.4: + resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} + dependencies: + lower-case: 2.0.2 + tslib: 2.6.2 + dev: false + + /node-abi@3.51.0: + resolution: {integrity: sha512-SQkEP4hmNWjlniS5zdnfIXTk1x7Ome85RDzHlTbBtzE97Gfwz/Ipw4v/Ryk20DWIy3yCNVLVlGKApCnmvYoJbA==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + semver: 7.5.4 + dev: false + optional: true + + /node-addon-api@6.1.0: + resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} + requiresBuild: true + dev: false + optional: true + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + dev: false + + /node-html-parser@6.1.12: + resolution: {integrity: sha512-/bT/Ncmv+fbMGX96XG9g05vFt43m/+SYKIs9oAemQVYyVcZmDAI2Xq/SbNcpOA35eF0Zk2av3Ksf+Xk8Vt8abA==} + dependencies: + css-select: 5.1.0 + he: 1.2.0 + dev: false + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + dev: false + + /node-releases@2.0.14: + resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + dev: false + + /normalize-range@0.1.2: + resolution: {integrity: sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==} + engines: {node: '>=0.10.0'} + dev: false + + /npm-run-path@5.1.0: + resolution: {integrity: sha512-sJOdmRGrY2sjNTRMbSvluQqg+8X7ZK61yvzBEIDhz4f8z1TZFYABsqjjCBd/0PUNE9M6QDgHJXQkGUEm7Q+l9Q==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + path-key: 4.0.0 + dev: false + + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: false + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + dev: false + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + dev: false + + /onetime@6.0.0: + resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} + engines: {node: '>=12'} + dependencies: + mimic-fn: 4.0.0 + dev: false + + /ora@7.0.1: + resolution: {integrity: sha512-0TUxTiFJWv+JnjWm4o9yvuskpEJLXTcng8MJuKd+SzAzp2o+OP3HWqNhB4OdJRt1Vsd9/mR0oyaEYlOnL7XIRw==} + engines: {node: '>=16'} + dependencies: + chalk: 5.3.0 + cli-cursor: 4.0.0 + cli-spinners: 2.9.1 + is-interactive: 2.0.0 + is-unicode-supported: 1.3.0 + log-symbols: 5.1.0 + stdin-discarder: 0.1.0 + string-width: 6.1.0 + strip-ansi: 7.1.0 + dev: false + + /outvariant@1.4.0: + resolution: {integrity: sha512-AlWY719RF02ujitly7Kk/0QlV+pXGFDHrHf9O2OKqyqgBieaPOIeuSkL8sRK6j2WK+/ZAURq2kZsY0d8JapUiw==} + dev: false + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: false + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: false + + /p-limit@5.0.0: + resolution: {integrity: sha512-/Eaoq+QyLSiXQ4lyYV23f14mZRQcXnxfHrN0vCai+ak9G0pp9iEQukIIZq5NccEvwRB8PUnZT0KsOoDCINS1qQ==} + engines: {node: '>=18'} + dependencies: + yocto-queue: 1.0.0 + dev: false + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: false + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: false + + /p-queue@8.0.1: + resolution: {integrity: sha512-NXzu9aQJTAzbBqOt2hwsR63ea7yvxJc0PwN/zobNAudYfb1B7R08SzB4TsLeSbUCuG467NhnoT0oO6w1qRO+BA==} + engines: {node: '>=18'} + dependencies: + eventemitter3: 5.0.1 + p-timeout: 6.1.2 + dev: false + + /p-timeout@6.1.2: + resolution: {integrity: sha512-UbD77BuZ9Bc9aABo74gfXhNvzC9Tx7SxtHSh1fxvx3jTLLYvmVhiQZZrJzqqU0jKbN32kb5VOKiLEQI/3bIjgQ==} + engines: {node: '>=14.16'} + dev: false + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: false + + /pagefind@1.0.4: + resolution: {integrity: sha512-oRIizYe+zSI2Jw4zcMU0ebDZm27751hRFiSOBLwc1OIYMrsZKk+3m8p9EVaOmc6zZdtqwwdilNUNxXvBeHcP9w==} + hasBin: true + optionalDependencies: + '@pagefind/darwin-arm64': 1.0.4 + '@pagefind/darwin-x64': 1.0.4 + '@pagefind/linux-arm64': 1.0.4 + '@pagefind/linux-x64': 1.0.4 + '@pagefind/windows-x64': 1.0.4 + dev: false + + /param-case@3.0.4: + resolution: {integrity: sha512-RXlj7zCYokReqWpOPH9oYivUzLYZ5vAPIfEmCTNViosC78F8F0H9y7T7gG2M39ymgutxF5gcFEsyZQSph9Bp3A==} + dependencies: + dot-case: 3.0.4 + tslib: 2.6.2 + dev: false + + /parse-entities@4.0.1: + resolution: {integrity: sha512-SWzvYcSJh4d/SGLIOQfZ/CoNv6BTlI6YEQ7Nj82oDVnRpwe/Z/F1EMx42x3JAOwGBlCjeCH0BRJQbQ/opHL17w==} + dependencies: + '@types/unist': 2.0.10 + character-entities: 2.0.2 + character-entities-legacy: 3.0.0 + character-reference-invalid: 2.0.1 + decode-named-character-reference: 1.0.2 + is-alphanumerical: 2.0.1 + is-decimal: 2.0.1 + is-hexadecimal: 2.0.1 + + /parse-latin@5.0.1: + resolution: {integrity: sha512-b/K8ExXaWC9t34kKeDV8kGXBkXZ1HCSAZRYE7HR14eA1GlXX5L8iWhs8USJNhQU9q5ci413jCKF0gOyovvyRBg==} + dependencies: + nlcst-to-string: 3.1.1 + unist-util-modify-children: 3.1.1 + unist-util-visit-children: 2.0.2 + dev: false + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.5.0 + dev: false + + /pascal-case@3.1.2: + resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} + dependencies: + no-case: 3.0.4 + tslib: 2.6.2 + dev: false + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: false + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + dev: false + + /path-key@4.0.0: + resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} + engines: {node: '>=12'} + dev: false + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + dev: false + + /path-scurry@1.10.1: + resolution: {integrity: sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==} + engines: {node: '>=16 || 14 >=14.17'} + dependencies: + lru-cache: 10.2.0 + minipass: 7.0.4 + dev: false + + /path-to-regexp@6.2.1: + resolution: {integrity: sha512-JLyh7xT1kizaEvcaXOQwOc2/Yhw6KZOvPf1S8401UyLk86CU79LN3vl7ztXGm/pZ+YjoyAJ4rxmHwbkBXJX+yw==} + dev: false + + /periscopic@3.1.0: + resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} + dependencies: + '@types/estree': 1.0.5 + estree-walker: 3.0.3 + is-reference: 3.0.2 + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + dev: false + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + dev: false + + /pify@2.3.0: + resolution: {integrity: sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==} + engines: {node: '>=0.10.0'} + dev: false + + /pify@4.0.1: + resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} + engines: {node: '>=6'} + dev: false + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: false + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: false + + /postcss-calc@9.0.1(postcss@8.4.38): + resolution: {integrity: sha512-TipgjGyzP5QzEhsOZUaIkeO5mKeMFpebWzRogWG/ysonUlnHcq5aJe0jOjpfzUU8PeSaBQnrE8ehR0QA5vs8PQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.2.2 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-colormin@6.1.0(postcss@8.4.38): + resolution: {integrity: sha512-x9yX7DOxeMAR+BgGVnNSAxmAj98NX/YxEMNFP+SDCEeNLb2r3i6Hh1ksMsnW8Ub5SLCpbescQqn9YEbE9554Sw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + caniuse-api: 3.0.0 + colord: 2.9.3 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-convert-values@6.1.0(postcss@8.4.38): + resolution: {integrity: sha512-zx8IwP/ts9WvUM6NkVSkiU902QZL1bwPhaVaLynPtCsOTqp+ZKbNi+s6XJg3rfqpKGA/oc7Oxk5t8pOQJcwl/w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-discard-comments@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-65w/uIqhSBBfQmYnG92FO1mWZjJ4GL5b8atm5Yw2UgrwD7HiNiSSNwJor1eCFGzUgYnN/iIknhNRVqjrrpuglw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + dev: false + + /postcss-discard-duplicates@6.0.3(postcss@8.4.38): + resolution: {integrity: sha512-+JA0DCvc5XvFAxwx6f/e68gQu/7Z9ud584VLmcgto28eB8FqSFZwtrLwB5Kcp70eIoWP/HXqz4wpo8rD8gpsTw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + dev: false + + /postcss-discard-empty@6.0.3(postcss@8.4.38): + resolution: {integrity: sha512-znyno9cHKQsK6PtxL5D19Fj9uwSzC2mB74cpT66fhgOadEUPyXFkbgwm5tvc3bt3NAy8ltE5MrghxovZRVnOjQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + dev: false + + /postcss-discard-overridden@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-j87xzI4LUggC5zND7KdjsI25APtyMuynXZSujByMaav2roV6OZX+8AaCUcZSWqckZpjAjRyFDdpqybgjFO0HJQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + dev: false + + /postcss-import@15.1.0(postcss@8.4.38): + resolution: {integrity: sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==} + engines: {node: '>=14.0.0'} + peerDependencies: + postcss: ^8.0.0 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + read-cache: 1.0.0 + resolve: 1.22.8 + dev: false + + /postcss-js@4.0.1(postcss@8.4.38): + resolution: {integrity: sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==} + engines: {node: ^12 || ^14 || >= 16} + peerDependencies: + postcss: ^8.4.21 + dependencies: + camelcase-css: 2.0.1 + postcss: 8.4.38 + dev: false + + /postcss-load-config@4.0.2(postcss@8.4.31): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.1 + postcss: 8.4.31 + yaml: 2.4.1 + dev: false + + /postcss-load-config@4.0.2(postcss@8.4.38): + resolution: {integrity: sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==} + engines: {node: '>= 14'} + peerDependencies: + postcss: '>=8.0.9' + ts-node: '>=9.0.0' + peerDependenciesMeta: + postcss: + optional: true + ts-node: + optional: true + dependencies: + lilconfig: 3.1.1 + postcss: 8.4.38 + yaml: 2.4.1 + dev: false + + /postcss-merge-longhand@6.0.5(postcss@8.4.38): + resolution: {integrity: sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + stylehacks: 6.1.1(postcss@8.4.38) + dev: false + + /postcss-merge-rules@6.1.1(postcss@8.4.38): + resolution: {integrity: sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + caniuse-api: 3.0.0 + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + dev: false + + /postcss-minify-font-values@6.1.0(postcss@8.4.38): + resolution: {integrity: sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-minify-gradients@6.0.3(postcss@8.4.38): + resolution: {integrity: sha512-4KXAHrYlzF0Rr7uc4VrfwDJ2ajrtNEpNEuLxFgwkhFZ56/7gaE4Nr49nLsQDZyUe+ds+kEhf+YAUolJiYXF8+Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + colord: 2.9.3 + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-minify-params@6.1.0(postcss@8.4.38): + resolution: {integrity: sha512-bmSKnDtyyE8ujHQK0RQJDIKhQ20Jq1LYiez54WiaOoBtcSuflfK3Nm596LvbtlFcpipMjgClQGyGr7GAs+H1uA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-minify-selectors@6.0.4(postcss@8.4.38): + resolution: {integrity: sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + dev: false + + /postcss-nested@6.0.1(postcss@8.4.38): + resolution: {integrity: sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==} + engines: {node: '>=12.0'} + peerDependencies: + postcss: ^8.2.14 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + dev: false + + /postcss-normalize-charset@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-a8N9czmdnrjPHa3DeFlwqst5eaL5W8jYu3EBbTTkI5FHkfMhFZh1EGbku6jhHhIzTA6tquI2P42NtZ59M/H/kQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + dev: false + + /postcss-normalize-display-values@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-8H04Mxsb82ON/aAkPeq8kcBbAtI5Q2a64X/mnRRfPXBq7XeogoQvReqxEfc0B4WPq1KimjezNC8flUtC3Qz6jg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-positions@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-/JFzI441OAB9O7VnLA+RtSNZvQ0NCFZDOtp6QPFo1iIyawyXg0YI3CYM9HBy1WvwCRHnPep/BvI1+dGPKoXx/Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-repeat-style@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-YdCgsfHkJ2jEXwR4RR3Tm/iOxSfdRt7jplS6XRh9Js9PyCR/aka/FCb6TuHT2U8gQubbm/mPmF6L7FY9d79VwQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-string@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-vQZIivlxlfqqMp4L9PZsFE4YUkWniziKjQWUtsxUiVsSSPelQydwS8Wwcuw0+83ZjPWNTl02oxlIvXsmmG+CiQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-timing-functions@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-a+YrtMox4TBtId/AEwbA03VcJgtyW4dGBizPl7e88cTFULYsprgHWTbfyjSLyHeBcK/Q9JhXkt2ZXiwaVHoMzA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-unicode@6.1.0(postcss@8.4.38): + resolution: {integrity: sha512-QVC5TQHsVj33otj8/JD869Ndr5Xcc/+fwRh4HAsFsAeygQQXm+0PySrKbr/8tkDKzW+EVT3QkqZMfFrGiossDg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-url@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-kVNcWhCeKAzZ8B4pv/DnrU1wNh458zBNp8dh4y5hhxih5RZQ12QWMuQrDgPRw3LRl8mN9vOVfHl7uhvHYMoXsQ==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-normalize-whitespace@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-sXZ2Nj1icbJOKmdjXVT9pnyHQKiSAyuNQHSgRCUgThn2388Y9cGVDR+E9J9iAYbSbLHI+UUwLVl1Wzco/zgv0Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-ordered-values@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-VRZSOB+JU32RsEAQrO94QPkClGPKJEL/Z9PCBImXMhIeK5KAYo6slP/hBYlLgrCjFxyqvn5VC81tycFEDBLG1Q==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + cssnano-utils: 4.0.2(postcss@8.4.38) + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-reduce-initial@6.1.0(postcss@8.4.38): + resolution: {integrity: sha512-RarLgBK/CrL1qZags04oKbVbrrVK2wcxhvta3GCxrZO4zveibqbRPmm2VI8sSgCXwoUHEliRSbOfpR0b/VIoiw==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + caniuse-api: 3.0.0 + postcss: 8.4.38 + dev: false + + /postcss-reduce-transforms@6.0.2(postcss@8.4.38): + resolution: {integrity: sha512-sB+Ya++3Xj1WaT9+5LOOdirAxP7dJZms3GRcYheSPi1PiTMigsxHAdkrbItHxwYHr4kt1zL7mmcHstgMYT+aiA==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + dev: false + + /postcss-selector-parser@6.0.10: + resolution: {integrity: sha512-IQ7TZdoaqbT+LCpShg46jnZVlhWD2w6iQYAcYXfHARZ7X1t/UGhhceQDs5X0cGqKvYlHNOuv7Oa1xmb0oQuA3w==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss-selector-parser@6.0.16: + resolution: {integrity: sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==} + engines: {node: '>=4'} + dependencies: + cssesc: 3.0.0 + util-deprecate: 1.0.2 + dev: false + + /postcss-svgo@6.0.3(postcss@8.4.38): + resolution: {integrity: sha512-dlrahRmxP22bX6iKEjOM+c8/1p+81asjKT+V5lrgOH944ryx/OHpclnIbGsKVd3uWOXFLYJwCVf0eEkJGvO96g==} + engines: {node: ^14 || ^16 || >= 18} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-value-parser: 4.2.0 + svgo: 3.2.0 + dev: false + + /postcss-unique-selectors@6.0.4(postcss@8.4.38): + resolution: {integrity: sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + dev: false + + /postcss-value-parser@4.2.0: + resolution: {integrity: sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==} + dev: false + + /postcss@8.4.31: + resolution: {integrity: sha512-PS08Iboia9mts/2ygV3eLpY5ghnUcfLV/EXTOW1E2qYxJKGGBUtNjN76FYHnMs36RmARn41bC0AZmn+rR0OVpQ==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.6 + picocolors: 1.0.0 + source-map-js: 1.0.2 + dev: false + + /postcss@8.4.38: + resolution: {integrity: sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==} + engines: {node: ^10 || ^12 || >=14} + dependencies: + nanoid: 3.3.7 + picocolors: 1.0.0 + source-map-js: 1.2.0 + dev: false + + /preact-render-to-string@6.3.1(preact@10.18.1): + resolution: {integrity: sha512-NQ28WrjLtWY6lKDlTxnFpKHZdpjfF+oE6V4tZ0rTrunHrtZp6Dm0oFrcJalt/5PNeqJz4j1DuZDS0Y6rCBoqDA==} + peerDependencies: + preact: '>=10' + dependencies: + preact: 10.18.1 + pretty-format: 3.8.0 + dev: false + + /preact-ssr-prepass@1.2.1(preact@10.18.1): + resolution: {integrity: sha512-bLgbUfy8nL+PZghAPpyk9MF+cmXjdwEnxYPaJBmwbzFQqzIz8dQVBqjwB60RqZ9So/vIf6BRfHCiwFGuMCyfbQ==} + peerDependencies: + preact: '>=10 || ^10.0.0-beta.0 || ^10.0.0-alpha.0' + dependencies: + preact: 10.18.1 + dev: false + + /preact@10.18.1: + resolution: {integrity: sha512-mKUD7RRkQQM6s7Rkmi7IFkoEHjuFqRQUaXamO61E6Nn7vqF/bo7EZCmSyrUnp2UWHw0O7XjZ2eeXis+m7tf4lg==} + dev: false + + /prebuild-install@7.1.1: + resolution: {integrity: sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==} + engines: {node: '>=10'} + hasBin: true + requiresBuild: true + dependencies: + detect-libc: 2.0.2 + expand-template: 2.0.3 + github-from-package: 0.0.0 + minimist: 1.2.8 + mkdirp-classic: 0.5.3 + napi-build-utils: 1.0.2 + node-abi: 3.51.0 + pump: 3.0.0 + rc: 1.2.8 + simple-get: 4.0.1 + tar-fs: 2.1.1 + tunnel-agent: 0.6.0 + dev: false + optional: true + + /preferred-pm@3.1.2: + resolution: {integrity: sha512-nk7dKrcW8hfCZ4H6klWcdRknBOXWzNQByJ0oJyX97BOupsYD+FzLS4hflgEu/uPUEHZCuRfMxzCBsuWd7OzT8Q==} + engines: {node: '>=10'} + dependencies: + find-up: 5.0.0 + find-yarn-workspace-root2: 1.2.16 + path-exists: 4.0.0 + which-pm: 2.0.0 + dev: false + + /prettier-plugin-astro@0.13.0: + resolution: {integrity: sha512-5HrJNnPmZqTUNoA97zn4gNQv9BgVhv+et03314WpQ9H9N8m2L9OSV798olwmG2YLXPl1iSstlJCR1zB3x5xG4g==} + engines: {node: ^14.15.0 || >=16.0.0} + dependencies: + '@astrojs/compiler': 1.8.2 + prettier: 3.2.5 + sass-formatter: 0.7.9 + dev: true + + /prettier-plugin-organize-attributes@1.0.0(prettier@3.2.5): + resolution: {integrity: sha512-+NmameaLxbCcylEXsKPmawtzla5EE6ECqvGkpfQz4KM847fXDifB1gFnPQEpoADAq6IXg+cMI8Z0ISJEXa6fhg==} + engines: {node: '>=14.0.0'} + peerDependencies: + prettier: ^3.0.0 + dependencies: + prettier: 3.2.5 + dev: true + + /prettier-plugin-tailwindcss@0.5.13(prettier-plugin-astro@0.13.0)(prettier-plugin-organize-attributes@1.0.0)(prettier@3.2.5): + resolution: {integrity: sha512-2tPWHCFNC+WRjAC4SIWQNSOdcL1NNkydXim8w7TDqlZi+/ulZYz2OouAI6qMtkggnPt7lGamboj6LcTMwcCvoQ==} + engines: {node: '>=14.21.3'} + peerDependencies: + '@ianvs/prettier-plugin-sort-imports': '*' + '@prettier/plugin-pug': '*' + '@shopify/prettier-plugin-liquid': '*' + '@trivago/prettier-plugin-sort-imports': '*' + '@zackad/prettier-plugin-twig-melody': '*' + prettier: ^3.0 + prettier-plugin-astro: '*' + prettier-plugin-css-order: '*' + prettier-plugin-import-sort: '*' + prettier-plugin-jsdoc: '*' + prettier-plugin-marko: '*' + prettier-plugin-organize-attributes: '*' + prettier-plugin-organize-imports: '*' + prettier-plugin-sort-imports: '*' + prettier-plugin-style-order: '*' + prettier-plugin-svelte: '*' + peerDependenciesMeta: + '@ianvs/prettier-plugin-sort-imports': + optional: true + '@prettier/plugin-pug': + optional: true + '@shopify/prettier-plugin-liquid': + optional: true + '@trivago/prettier-plugin-sort-imports': + optional: true + '@zackad/prettier-plugin-twig-melody': + optional: true + prettier-plugin-astro: + optional: true + prettier-plugin-css-order: + optional: true + prettier-plugin-import-sort: + optional: true + prettier-plugin-jsdoc: + optional: true + prettier-plugin-marko: + optional: true + prettier-plugin-organize-attributes: + optional: true + prettier-plugin-organize-imports: + optional: true + prettier-plugin-sort-imports: + optional: true + prettier-plugin-style-order: + optional: true + prettier-plugin-svelte: + optional: true + dependencies: + prettier: 3.2.5 + prettier-plugin-astro: 0.13.0 + prettier-plugin-organize-attributes: 1.0.0(prettier@3.2.5) + dev: true + + /prettier@3.2.5: + resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + engines: {node: '>=14'} + hasBin: true + dev: true + + /pretty-format@3.8.0: + resolution: {integrity: sha512-WuxUnVtlWL1OfZFQFuqvnvs6MiAGk9UNsBostyBOB0Is9wb5uRESevA6rnl/rkksXaGX3GzZhPup5d6Vp1nFew==} + dev: false + + /prismjs@1.29.0: + resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} + engines: {node: '>=6'} + dev: false + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: false + + /property-information@6.3.0: + resolution: {integrity: sha512-gVNZ74nqhRMiIUYWGQdosYetaKc83x8oT41a0LlV3AAFCAZwCpg4vmGkq8t34+cUhp3cnM4XDiU/7xlgK7HGrg==} + dev: false + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + requiresBuild: true + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + dev: false + optional: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: false + + /queue-tick@1.0.1: + resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} + requiresBuild: true + dev: false + optional: true + + /rc@1.2.8: + resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} + hasBin: true + requiresBuild: true + dependencies: + deep-extend: 0.6.0 + ini: 1.3.8 + minimist: 1.2.8 + strip-json-comments: 2.0.1 + dev: false + optional: true + + /react-devtools-inline@4.4.0: + resolution: {integrity: sha512-ES0GolSrKO8wsKbsEkVeiR/ZAaHQTY4zDh1UW8DImVmm8oaGLl3ijJDvSGe+qDRKPZdPRnDtWWnSvvrgxXdThQ==} + dependencies: + es6-symbol: 3.1.3 + dev: false + + /react-dom@18.2.0(react@18.2.0): + resolution: {integrity: sha512-6IMTriUmvsjHUjNtEDudZfuDQUoWXVxKHhlEGSk81n4YFS+r/Kl99wXiwlVXtPBtJenozv2P+hxDsw9eA7Xo6g==} + peerDependencies: + react: ^18.2.0 + dependencies: + loose-envify: 1.4.0 + react: 18.2.0 + scheduler: 0.23.0 + dev: false + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + dev: false + + /react@18.2.0: + resolution: {integrity: sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==} + engines: {node: '>=0.10.0'} + dependencies: + loose-envify: 1.4.0 + dev: false + + /read-cache@1.0.0: + resolution: {integrity: sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==} + dependencies: + pify: 2.3.0 + dev: false + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + dev: false + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + dev: false + + /rehype-autolink-headings@7.1.0: + resolution: {integrity: sha512-rItO/pSdvnvsP4QRB1pmPiNHUskikqtPojZKJPPPAVx9Hj8i8TwMBhofrrAYRhYOOBZH9tgmG5lPqDLuIWPWmw==} + dependencies: + '@types/hast': 3.0.4 + '@ungap/structured-clone': 1.2.0 + hast-util-heading-rank: 3.0.0 + hast-util-is-element: 3.0.0 + unified: 11.0.4 + unist-util-visit: 5.0.0 + dev: false + + /rehype-parse@9.0.0: + resolution: {integrity: sha512-WG7nfvmWWkCR++KEkZevZb/uw41E8TsH4DsY9UxsTbIXCVGbAs4S+r8FrQ+OtH5EEQAs+5UxKC42VinkmpA1Yw==} + dependencies: + '@types/hast': 3.0.4 + hast-util-from-html: 2.0.1 + unified: 11.0.4 + dev: false + + /rehype-raw@7.0.0: + resolution: {integrity: sha512-/aE8hCfKlQeA8LmyeyQvQF3eBiLRGNlfBJEvWH7ivp9sBqs7TNqBL5X3v157rM4IFETqDnIOO+z5M/biZbo9Ww==} + dependencies: + '@types/hast': 3.0.2 + hast-util-raw: 9.0.1 + vfile: 6.0.1 + dev: false + + /rehype-stringify@10.0.0: + resolution: {integrity: sha512-1TX1i048LooI9QoecrXy7nGFFbFSufxVRAfc6Y9YMRAi56l+oB0zP51mLSV312uRuvVLPV1opSlJmslozR1XHQ==} + dependencies: + '@types/hast': 3.0.4 + hast-util-to-html: 9.0.0 + unified: 11.0.4 + dev: false + + /rehype@13.0.1: + resolution: {integrity: sha512-AcSLS2mItY+0fYu9xKxOu1LhUZeBZZBx8//5HKzF+0XP+eP8+6a5MXn2+DW2kfXR6Dtp1FEXMVrjyKAcvcU8vg==} + dependencies: + '@types/hast': 3.0.4 + rehype-parse: 9.0.0 + rehype-stringify: 10.0.0 + unified: 11.0.4 + dev: false + + /relateurl@0.2.7: + resolution: {integrity: sha512-G08Dxvm4iDN3MLM0EsP62EDV9IuhXPR6blNz6Utcp7zyV3tr4HVNINt6MpaRWbxoOHT3Q7YN2P+jaHX8vUbgog==} + engines: {node: '>= 0.10'} + dev: false + + /remark-breaks@4.0.0: + resolution: {integrity: sha512-IjEjJOkH4FuJvHZVIW0QCDWxcG96kCq7An/KVH2NfJe6rKZU2AsHeB3OEjPNRxi4QC34Xdx7I2KGYn6IpT7gxQ==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-newline-to-break: 2.0.0 + unified: 11.0.4 + dev: false + + /remark-directive@3.0.0: + resolution: {integrity: sha512-l1UyWJ6Eg1VPU7Hm/9tt0zKtReJQNOA4+iDMAxTyZNWnJnFlbS/7zhiel/rogTLQ2vMYwDzSJa4BiVNqGlqIMA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-directive: 3.0.0 + micromark-extension-directive: 3.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-gfm@4.0.0: + resolution: {integrity: sha512-U92vJgBPkbw4Zfu/IiW2oTZLSL3Zpv+uI7My2eq8JxKgqraFdU8YUGicEJCEgSbeaG+QDFqIcwwfMTOEelPxuA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-gfm: 3.0.0 + micromark-extension-gfm: 3.0.0 + remark-parse: 11.0.0 + remark-stringify: 11.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-github@12.0.0: + resolution: {integrity: sha512-ByefQKFN184LeiGRCabfl7zUJsdlMYWEhiLX1gpmQ11yFg6xSuOTW7LVCv0oc1x+YvUMJW23NU36sJX2RWGgvg==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-find-and-replace: 3.0.1 + mdast-util-to-string: 4.0.0 + to-vfile: 8.0.0 + unist-util-visit: 5.0.0 + vfile: 6.0.1 + dev: false + + /remark-mdx@3.0.1: + resolution: {integrity: sha512-3Pz3yPQ5Rht2pM5R+0J2MrGoBSrzf+tJG94N+t/ilfdh8YLyyKYtidAYwTveB20BoHAcwIopOUqhcmh2F7hGYA==} + dependencies: + mdast-util-mdx: 3.0.0 + micromark-extension-mdxjs: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-parse@11.0.0: + resolution: {integrity: sha512-FCxlKLNGknS5ba/1lmpYijMUzX2esxW5xQqjWxw2eHFfS2MSdaHVINFmhjo+qN1WhZhNimq0dZATN9pH0IDrpA==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-from-markdown: 2.0.0 + micromark-util-types: 2.0.0 + unified: 11.0.4 + transitivePeerDependencies: + - supports-color + dev: false + + /remark-rehype@11.1.0: + resolution: {integrity: sha512-z3tJrAs2kIs1AqIIy6pzHmAHlF1hWQ+OdY4/hv+Wxe35EhyLKcajL33iUEn3ScxtFox9nUvRufR/Zre8Q08H/g==} + dependencies: + '@types/hast': 3.0.2 + '@types/mdast': 4.0.3 + mdast-util-to-hast: 13.0.2 + unified: 11.0.4 + vfile: 6.0.1 + dev: false + + /remark-smartypants@2.0.0: + resolution: {integrity: sha512-Rc0VDmr/yhnMQIz8n2ACYXlfw/P/XZev884QU1I5u+5DgJls32o97Vc1RbK3pfumLsJomS2yy8eT4Fxj/2MDVA==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + retext: 8.1.0 + retext-smartypants: 5.2.0 + unist-util-visit: 4.1.2 + dev: false + + /remark-stringify@11.0.0: + resolution: {integrity: sha512-1OSmLd3awB/t8qdoEOMazZkNsfVTeY4fTsgzcQFdXNq8ToTN4ZGwrMnlda4K6smTFKD+GRV6O48i6Z4iKgPPpw==} + dependencies: + '@types/mdast': 4.0.3 + mdast-util-to-markdown: 2.1.0 + unified: 11.0.4 + dev: false + + /resolve@1.22.8: + resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} + hasBin: true + dependencies: + is-core-module: 2.13.1 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + dev: false + + /restore-cursor@4.0.0: + resolution: {integrity: sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + dev: false + + /retext-latin@3.1.0: + resolution: {integrity: sha512-5MrD1tuebzO8ppsja5eEu+ZbBeUNCjoEarn70tkXOS7Bdsdf6tNahsv2bY0Z8VooFF6cw7/6S+d3yI/TMlMVVQ==} + dependencies: + '@types/nlcst': 1.0.3 + parse-latin: 5.0.1 + unherit: 3.0.1 + unified: 10.1.2 + dev: false + + /retext-smartypants@5.2.0: + resolution: {integrity: sha512-Do8oM+SsjrbzT2UNIKgheP0hgUQTDDQYyZaIY3kfq0pdFzoPk+ZClYJ+OERNXveog4xf1pZL4PfRxNoVL7a/jw==} + dependencies: + '@types/nlcst': 1.0.3 + nlcst-to-string: 3.1.1 + unified: 10.1.2 + unist-util-visit: 4.1.2 + dev: false + + /retext-stringify@3.1.0: + resolution: {integrity: sha512-767TLOaoXFXyOnjx/EggXlb37ZD2u4P1n0GJqVdpipqACsQP+20W+BNpMYrlJkq7hxffnFk+jc6mAK9qrbuB8w==} + dependencies: + '@types/nlcst': 1.0.3 + nlcst-to-string: 3.1.1 + unified: 10.1.2 + dev: false + + /retext@8.1.0: + resolution: {integrity: sha512-N9/Kq7YTn6ZpzfiGW45WfEGJqFf1IM1q8OsRa1CGzIebCJBNCANDRmOrholiDRGKo/We7ofKR4SEvcGAWEMD3Q==} + dependencies: + '@types/nlcst': 1.0.3 + retext-latin: 3.1.0 + retext-stringify: 3.1.0 + unified: 10.1.2 + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: false + + /rollup@4.13.0: + resolution: {integrity: sha512-3YegKemjoQnYKmsBlOHfMLVPPA5xLkQ8MHLLSw/fBrFaVkEayL51DilPpNNLq1exr98F2B1TzrV0FUlN3gWRPg==} + engines: {node: '>=18.0.0', npm: '>=8.0.0'} + hasBin: true + dependencies: + '@types/estree': 1.0.5 + optionalDependencies: + '@rollup/rollup-android-arm-eabi': 4.13.0 + '@rollup/rollup-android-arm64': 4.13.0 + '@rollup/rollup-darwin-arm64': 4.13.0 + '@rollup/rollup-darwin-x64': 4.13.0 + '@rollup/rollup-linux-arm-gnueabihf': 4.13.0 + '@rollup/rollup-linux-arm64-gnu': 4.13.0 + '@rollup/rollup-linux-arm64-musl': 4.13.0 + '@rollup/rollup-linux-riscv64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-gnu': 4.13.0 + '@rollup/rollup-linux-x64-musl': 4.13.0 + '@rollup/rollup-win32-arm64-msvc': 4.13.0 + '@rollup/rollup-win32-ia32-msvc': 4.13.0 + '@rollup/rollup-win32-x64-msvc': 4.13.0 + fsevents: 2.3.3 + dev: false + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: false + + /s.color@0.0.15: + resolution: {integrity: sha512-AUNrbEUHeKY8XsYr/DYpl+qk5+aM+DChopnWOPEzn8YKzOhv4l2zH6LzZms3tOZP3wwdOyc0RmTciyi46HLIuA==} + dev: true + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + requiresBuild: true + dev: false + + /sass-formatter@0.7.9: + resolution: {integrity: sha512-CWZ8XiSim+fJVG0cFLStwDvft1VI7uvXdCNJYXhDvowiv+DsbD1nXLiQ4zrE5UBvj5DWZJ93cwN0NX5PMsr1Pw==} + dependencies: + suf-log: 2.5.3 + dev: true + + /scheduler@0.23.0: + resolution: {integrity: sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==} + dependencies: + loose-envify: 1.4.0 + dev: false + + /section-matter@1.0.0: + resolution: {integrity: sha512-vfD3pmTzGpufjScBh50YHKzEu2lxBWhVEHsNGoEXmCmn2hKGfeNLYMzCJpe8cD7gqX7TJluOVpBkAequ6dgMmA==} + engines: {node: '>=4'} + dependencies: + extend-shallow: 2.0.1 + kind-of: 6.0.3 + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + dev: false + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /semver@7.6.0: + resolution: {integrity: sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + dev: false + + /sharp@0.32.6: + resolution: {integrity: sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==} + engines: {node: '>=14.15.0'} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.2 + node-addon-api: 6.1.0 + prebuild-install: 7.1.1 + semver: 7.5.4 + simple-get: 4.0.1 + tar-fs: 3.0.4 + tunnel-agent: 0.6.0 + dev: false + optional: true + + /sharp@0.33.2: + resolution: {integrity: sha512-WlYOPyyPDiiM07j/UO+E720ju6gtNtHjEGg5vovUk1Lgxyjm2LFO+37Nt/UI3MMh2l6hxTWQWi7qk3cXJTutcQ==} + engines: {libvips: '>=8.15.1', node: ^18.17.0 || ^20.3.0 || >=21.0.0} + requiresBuild: true + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.6.0 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.33.2 + '@img/sharp-darwin-x64': 0.33.2 + '@img/sharp-libvips-darwin-arm64': 1.0.1 + '@img/sharp-libvips-darwin-x64': 1.0.1 + '@img/sharp-libvips-linux-arm': 1.0.1 + '@img/sharp-libvips-linux-arm64': 1.0.1 + '@img/sharp-libvips-linux-s390x': 1.0.1 + '@img/sharp-libvips-linux-x64': 1.0.1 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.1 + '@img/sharp-libvips-linuxmusl-x64': 1.0.1 + '@img/sharp-linux-arm': 0.33.2 + '@img/sharp-linux-arm64': 0.33.2 + '@img/sharp-linux-s390x': 0.33.2 + '@img/sharp-linux-x64': 0.33.2 + '@img/sharp-linuxmusl-arm64': 0.33.2 + '@img/sharp-linuxmusl-x64': 0.33.2 + '@img/sharp-wasm32': 0.33.2 + '@img/sharp-win32-ia32': 0.33.2 + '@img/sharp-win32-x64': 0.33.2 + dev: false + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + dev: false + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + dev: false + + /shiki@1.2.0: + resolution: {integrity: sha512-xLhiTMOIUXCv5DqJ4I70GgQCtdlzsTqFLZWcMHHG3TAieBUbvEGthdrlPDlX4mL/Wszx9C6rEcxU6kMlg4YlxA==} + dependencies: + '@shikijs/core': 1.2.0 + dev: false + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + dev: false + + /signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + dev: false + + /simple-concat@1.0.1: + resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} + requiresBuild: true + dev: false + optional: true + + /simple-get@4.0.1: + resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} + requiresBuild: true + dependencies: + decompress-response: 6.0.0 + once: 1.4.0 + simple-concat: 1.0.1 + dev: false + optional: true + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + requiresBuild: true + dependencies: + is-arrayish: 0.3.2 + dev: false + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: false + + /source-map-js@1.0.2: + resolution: {integrity: sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map-js@1.2.0: + resolution: {integrity: sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + dev: false + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + dev: false + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: false + + /space-separated-tokens@2.0.2: + resolution: {integrity: sha512-PEGlAwrG8yXGXRjW32fGbg66JAlOAwbObuqVoJpv/mRgoWDQfgH1wDPvtzWyUSNAXBGSk8h755YDbbcEy3SH2Q==} + dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: false + + /stack-trace@1.0.0-pre2: + resolution: {integrity: sha512-2ztBJRek8IVofG9DBJqdy2N5kulaacX30Nz7xmkYF6ale9WBVmIy6mFBchvGX7Vx/MyjBhx+Rcxqrj+dbOnQ6A==} + engines: {node: '>=16'} + dev: false + + /static-browser-server@1.0.3: + resolution: {integrity: sha512-ZUyfgGDdFRbZGGJQ1YhiM930Yczz5VlbJObrQLlk24+qNHVQx4OlLcYswEUo3bIyNAbQUIUR9Yr5/Hqjzqb4zA==} + dependencies: + '@open-draft/deferred-promise': 2.2.0 + dotenv: 16.4.5 + mime-db: 1.52.0 + outvariant: 1.4.0 + dev: false + + /stdin-discarder@0.1.0: + resolution: {integrity: sha512-xhV7w8S+bUwlPTb4bAOUQhv8/cSS5offJuX8GQGq32ONF0ZtDWKfkdomM3HMRA+LhX6um/FZ0COqlwsjD53LeQ==} + engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + dependencies: + bl: 5.1.0 + dev: false + + /streamx@2.15.2: + resolution: {integrity: sha512-b62pAV/aeMjUoRN2C/9F0n+G8AfcJjNC0zw/ZmOHeFsIe4m4GzjVW9m6VHXVjk536NbdU9JRwKMJRfkc+zUFTg==} + requiresBuild: true + dependencies: + fast-fifo: 1.3.2 + queue-tick: 1.0.1 + dev: false + optional: true + + /strict-event-emitter@0.4.6: + resolution: {integrity: sha512-12KWeb+wixJohmnwNFerbyiBrAlq5qJLwIt38etRtKtmmHyDSoGlIqFE9wx+4IwG0aDjI7GV8tc8ZccjWZZtTg==} + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + dev: false + + /string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 + dev: false + + /string-width@6.1.0: + resolution: {integrity: sha512-k01swCJAgQmuADB0YIc+7TuatfNvTBVOoaUWJjTB9R4VJzR5vNWzf5t42ESVZFPS8xTySF7CAdV4t/aaIm3UnQ==} + engines: {node: '>=16'} + dependencies: + eastasianwidth: 0.2.0 + emoji-regex: 10.3.0 + strip-ansi: 7.1.0 + dev: false + + /string-width@7.1.0: + resolution: {integrity: sha512-SEIJCWiX7Kg4c129n48aDRwLbFb2LJmXXFrWBG4NGaRtMQ3myKPKbwrD1BKqQn74oCoNMBVrfDEr5M9YxCsrkw==} + engines: {node: '>=18'} + dependencies: + emoji-regex: 10.3.0 + get-east-asian-width: 1.2.0 + strip-ansi: 7.1.0 + dev: false + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + requiresBuild: true + dependencies: + safe-buffer: 5.2.1 + dev: false + + /stringify-entities@4.0.3: + resolution: {integrity: sha512-BP9nNHMhhfcMbiuQKCqMjhDP5yBCAxsPu4pHFFzJ6Alo9dZgY4VLDPutXqIjpRiMoKdp7Av85Gr73Q5uH9k7+g==} + dependencies: + character-entities-html4: 2.1.0 + character-entities-legacy: 3.0.0 + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + dev: false + + /strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + dependencies: + ansi-regex: 6.0.1 + dev: false + + /strip-bom-string@1.0.0: + resolution: {integrity: sha512-uCC2VHvQRYu+lMh4My/sFNmF2klFymLX1wHJeXnbEJERpV/ZsVuonzerjfrGpIGF7LBVa1O7i9kjiWvJiFck8g==} + engines: {node: '>=0.10.0'} + dev: false + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + dev: false + + /strip-final-newline@3.0.0: + resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} + engines: {node: '>=12'} + dev: false + + /strip-json-comments@2.0.1: + resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: false + optional: true + + /style-mod@4.1.0: + resolution: {integrity: sha512-Ca5ib8HrFn+f+0n4N4ScTIA9iTOQ7MaGS1ylHcoVqW9J7w2w8PzN6g9gKmTYgGEBH8e120+RCmhpje6jC5uGWA==} + dev: false + + /style-to-object@0.4.4: + resolution: {integrity: sha512-HYNoHZa2GorYNyqiCaBgsxvcJIn7OHq6inEga+E6Ke3m5JkoqpQbnFssk4jwe+K7AhGa2fcha4wSOf1Kn01dMg==} + dependencies: + inline-style-parser: 0.1.1 + dev: false + + /style-to-object@1.0.5: + resolution: {integrity: sha512-rDRwHtoDD3UMMrmZ6BzOW0naTjMsVZLIjsGleSKS/0Oz+cgCfAPRspaqJuE8rDzpKha/nEvnM0IF4seEAZUTKQ==} + dependencies: + inline-style-parser: 0.2.2 + dev: false + + /stylehacks@6.1.1(postcss@8.4.38): + resolution: {integrity: sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==} + engines: {node: ^14 || ^16 || >=18.0} + peerDependencies: + postcss: ^8.4.31 + dependencies: + browserslist: 4.23.0 + postcss: 8.4.38 + postcss-selector-parser: 6.0.16 + dev: false + + /sucrase@3.35.0: + resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} + engines: {node: '>=16 || 14 >=14.17'} + hasBin: true + dependencies: + '@jridgewell/gen-mapping': 0.3.5 + commander: 4.1.1 + glob: 10.3.10 + lines-and-columns: 1.2.4 + mz: 2.7.0 + pirates: 4.0.6 + ts-interface-checker: 0.1.13 + dev: false + + /suf-log@2.5.3: + resolution: {integrity: sha512-KvC8OPjzdNOe+xQ4XWJV2whQA0aM1kGVczMQ8+dStAO6KfEB140JEVQ9dE76ONZ0/Ylf67ni4tILPJB41U0eow==} + dependencies: + s.color: 0.0.15 + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + dev: false + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + dev: false + + /svgo@3.2.0: + resolution: {integrity: sha512-4PP6CMW/V7l/GmKRKzsLR8xxjdHTV4IMvhTnpuHwwBazSIlw5W/5SmPjN8Dwyt7lKbSJrRDgp4t9ph0HgChFBQ==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@trysound/sax': 0.2.0 + commander: 7.2.0 + css-select: 5.1.0 + css-tree: 2.3.1 + css-what: 6.1.0 + csso: 5.0.5 + picocolors: 1.0.0 + dev: false + + /tailwindcss@3.4.1: + resolution: {integrity: sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==} + engines: {node: '>=14.0.0'} + hasBin: true + dependencies: + '@alloc/quick-lru': 5.2.0 + arg: 5.0.2 + chokidar: 3.6.0 + didyoumean: 1.2.2 + dlv: 1.1.3 + fast-glob: 3.3.2 + glob-parent: 6.0.2 + is-glob: 4.0.3 + jiti: 1.21.0 + lilconfig: 2.1.0 + micromatch: 4.0.5 + normalize-path: 3.0.0 + object-hash: 3.0.0 + picocolors: 1.0.0 + postcss: 8.4.38 + postcss-import: 15.1.0(postcss@8.4.38) + postcss-js: 4.0.1(postcss@8.4.38) + postcss-load-config: 4.0.2(postcss@8.4.38) + postcss-nested: 6.0.1(postcss@8.4.38) + postcss-selector-parser: 6.0.16 + resolve: 1.22.8 + sucrase: 3.35.0 + transitivePeerDependencies: + - ts-node + dev: false + + /tar-fs@2.1.1: + resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} + requiresBuild: true + dependencies: + chownr: 1.1.4 + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 2.2.0 + dev: false + optional: true + + /tar-fs@3.0.4: + resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} + requiresBuild: true + dependencies: + mkdirp-classic: 0.5.3 + pump: 3.0.0 + tar-stream: 3.1.6 + dev: false + optional: true + + /tar-stream@2.2.0: + resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} + engines: {node: '>=6'} + requiresBuild: true + dependencies: + bl: 4.1.0 + end-of-stream: 1.4.4 + fs-constants: 1.0.0 + inherits: 2.0.4 + readable-stream: 3.6.2 + dev: false + optional: true + + /tar-stream@3.1.6: + resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} + requiresBuild: true + dependencies: + b4a: 1.6.4 + fast-fifo: 1.3.2 + streamx: 2.15.2 + dev: false + optional: true + + /terser@5.29.2: + resolution: {integrity: sha512-ZiGkhUBIM+7LwkNjXYJq8svgkd+QK3UUr0wJqY4MieaezBSAIPgbSPZyIx0idM6XWK5CMzSWa8MJIzmRcB8Caw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.6 + acorn: 8.11.3 + commander: 2.20.3 + source-map-support: 0.5.21 + dev: false + + /thenify-all@1.6.0: + resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} + engines: {node: '>=0.8'} + dependencies: + thenify: 3.3.1 + dev: false + + /thenify@3.3.1: + resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} + dependencies: + any-promise: 1.3.0 + dev: false + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: false + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + dev: false + + /to-vfile@8.0.0: + resolution: {integrity: sha512-IcmH1xB5576MJc9qcfEC/m/nQCFt3fzMHz45sSlgJyTWjRbKW1HAkJpuf3DgE57YzIlZcwcBZA5ENQbBo4aLkg==} + dependencies: + vfile: 6.0.1 + dev: false + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + dev: false + + /trim-lines@3.0.1: + resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==} + dev: false + + /trough@2.2.0: + resolution: {integrity: sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw==} + dev: false + + /ts-interface-checker@0.1.13: + resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} + dev: false + + /tsconfck@3.0.0(typescript@5.2.2): + resolution: {integrity: sha512-w3wnsIrJNi7avf4Zb0VjOoodoO0woEqGgZGQm+LHH9przdUI+XDKsWAXwxHA1DaRTjeuZNcregSzr7RaA8zG9A==} + engines: {node: ^18 || >=20} + hasBin: true + peerDependencies: + typescript: ^5.0.0 + peerDependenciesMeta: + typescript: + optional: true + dependencies: + typescript: 5.2.2 + dev: false + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + dev: false + + /tunnel-agent@0.6.0: + resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} + requiresBuild: true + dependencies: + safe-buffer: 5.2.1 + dev: false + optional: true + + /type-fest@2.19.0: + resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==} + engines: {node: '>=12.20'} + dev: false + + /type@1.2.0: + resolution: {integrity: sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==} + dev: false + + /type@2.7.2: + resolution: {integrity: sha512-dzlvlNlt6AXU7EBSfpAscydQ7gXB+pPGsPnfJnZpiNJBDj7IaJzQlBZYGdEi4R9HmPdBv2XmWJ6YUtoTa7lmCw==} + dev: false + + /typescript@5.2.2: + resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} + engines: {node: '>=14.17'} + hasBin: true + + /undici-types@5.26.5: + resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} + dev: false + + /unherit@3.0.1: + resolution: {integrity: sha512-akOOQ/Yln8a2sgcLj4U0Jmx0R5jpIg2IUyRrWOzmEbjBtGzBdHtSeFKgoEcoH4KYIG/Pb8GQ/BwtYm0GCq1Sqg==} + dev: false + + /unified@10.1.2: + resolution: {integrity: sha512-pUSWAi/RAnVy1Pif2kAoeWNBa3JVrx0MId2LASj8G+7AiHWoKZNTomq6LG326T68U7/e263X6fTdcXIy7XnF7Q==} + dependencies: + '@types/unist': 2.0.10 + bail: 2.0.2 + extend: 3.0.2 + is-buffer: 2.0.5 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 5.3.7 + dev: false + + /unified@11.0.4: + resolution: {integrity: sha512-apMPnyLjAX+ty4OrNap7yumyVAMlKx5IWU2wlzzUdYJO9A8f1p9m/gywF/GM2ZDFcjQPrx59Mc90KwmxsoklxQ==} + dependencies: + '@types/unist': 3.0.2 + bail: 2.0.2 + devlop: 1.1.0 + extend: 3.0.2 + is-plain-obj: 4.1.0 + trough: 2.2.0 + vfile: 6.0.1 + dev: false + + /unist-util-find-after@5.0.0: + resolution: {integrity: sha512-amQa0Ep2m6hE2g72AugUItjbuM8X8cGQnFoHk0pGfrFeT9GZhzN5SW8nRsiGKK7Aif4CrACPENkA6P/Lw6fHGQ==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + dev: false + + /unist-util-is@3.0.0: + resolution: {integrity: sha512-sVZZX3+kspVNmLWBPAB6r+7D9ZgAFPNWm66f7YNb420RlQSbn+n8rG8dGZSkrER7ZIXGQYNm5pqC3v3HopH24A==} + dev: false + + /unist-util-is@5.2.1: + resolution: {integrity: sha512-u9njyyfEh43npf1M+yGKDGVPbY/JWEemg5nH05ncKPfi+kBbKBJoTdsogMu33uhytuLlv9y0O7GH7fEdwLdLQw==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-is@6.0.0: + resolution: {integrity: sha512-2qCTHimwdxLfz+YzdGfkqNlH0tLi9xjTnHddPmJwtIG9MGsdbutfTc4P+haPD7l7Cjxf/WZj+we5qfVPvvxfYw==} + dependencies: + '@types/unist': 3.0.2 + + /unist-util-map@4.0.0: + resolution: {integrity: sha512-HJs1tpkSmRJUzj6fskQrS5oYhBYlmtcvy4SepdDEEsL04FjBrgF0Mgggvxc1/qGBGgW7hRh9+UBK1aqTEnBpIA==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-modify-children@3.1.1: + resolution: {integrity: sha512-yXi4Lm+TG5VG+qvokP6tpnk+r1EPwyYL04JWDxLvgvPV40jANh7nm3udk65OOWquvbMDe+PL9+LmkxDpTv/7BA==} + dependencies: + '@types/unist': 2.0.10 + array-iterate: 2.0.1 + dev: false + + /unist-util-position-from-estree@2.0.0: + resolution: {integrity: sha512-KaFVRjoqLyF6YXCbVLNad/eS4+OfPQQn2yOd7zF/h5T/CSL2v8NpN6a5TPvtbXthAGw5nG+PuTtq+DdIZr+cRQ==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-position@5.0.0: + resolution: {integrity: sha512-fucsC7HjXvkB5R3kTCO7kUjRdrS0BJt3M/FPxmHMBOm8JQi2BsHAHFsy27E0EolP8rp0NzXsJ+jNPyDWvOJZPA==} + dependencies: + '@types/unist': 3.0.2 + dev: false + + /unist-util-remove-position@5.0.0: + resolution: {integrity: sha512-Hp5Kh3wLxv0PHj9m2yZhhLt58KzPtEYKQQ4yxfYFEO7EvHwzyDYnduhHnY1mDxoqr7VUwVuHXk9RXKIiYS1N8Q==} + dependencies: + '@types/unist': 3.0.2 + unist-util-visit: 5.0.0 + dev: false + + /unist-util-stringify-position@3.0.3: + resolution: {integrity: sha512-k5GzIBZ/QatR8N5X2y+drfpWG8IDBzdnVj6OInRNWm1oXrzydiaAT2OQiA8DPRRZyAKb9b6I2a6PxYklZD0gKg==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-stringify-position@4.0.0: + resolution: {integrity: sha512-0ASV06AAoKCDkS2+xw5RXJywruurpbC4JZSm7nr7MOt1ojAzvyyaO+UxZf18j8FCF6kmzCZKcAgN/yu2gm2XgQ==} + dependencies: + '@types/unist': 3.0.2 + + /unist-util-visit-children@2.0.2: + resolution: {integrity: sha512-+LWpMFqyUwLGpsQxpumsQ9o9DG2VGLFrpz+rpVXYIEdPy57GSy5HioC0g3bg/8WP9oCLlapQtklOzQ8uLS496Q==} + dependencies: + '@types/unist': 2.0.10 + dev: false + + /unist-util-visit-parents@2.1.2: + resolution: {integrity: sha512-DyN5vD4NE3aSeB+PXYNKxzGsfocxp6asDc2XXE3b0ekO2BaRUpBicbbUygfSvYfUz1IkmjFR1YF7dPklraMZ2g==} + dependencies: + unist-util-is: 3.0.0 + dev: false + + /unist-util-visit-parents@5.1.3: + resolution: {integrity: sha512-x6+y8g7wWMyQhL1iZfhIPhDAs7Xwbn9nRosDXl7qoPTSCy0yNxnKc+hWokFifWQIDGi154rdUqKvbCa4+1kLhg==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + dev: false + + /unist-util-visit-parents@6.0.1: + resolution: {integrity: sha512-L/PqWzfTP9lzzEa6CKs0k2nARxTdZduw3zyh8d2NVBnsyvHjSX4TWse388YrrQKbvI8w20fGjGlhgT96WwKykw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + + /unist-util-visit@1.4.1: + resolution: {integrity: sha512-AvGNk7Bb//EmJZyhtRUnNMEpId/AZ5Ph/KUpTI09WHQuDZHKovQ1oEv3mfmKpWKtoMzyMC4GLBm1Zy5k12fjIw==} + dependencies: + unist-util-visit-parents: 2.1.2 + dev: false + + /unist-util-visit@4.1.2: + resolution: {integrity: sha512-MSd8OUGISqHdVvfY9TPhyK2VdUrPgxkUtWSuMHF6XAAFuL4LokseigBnZtPnJMu+FbynTkFNnFlyjxpVKujMRg==} + dependencies: + '@types/unist': 2.0.10 + unist-util-is: 5.2.1 + unist-util-visit-parents: 5.1.3 + dev: false + + /unist-util-visit@5.0.0: + resolution: {integrity: sha512-MR04uvD+07cwl/yhVuVWAtw+3GOR/knlL55Nd/wAdblk27GCVt3lqpTivy/tkJcZoNPzTwS1Y+KMojlLDhoTzg==} + dependencies: + '@types/unist': 3.0.2 + unist-util-is: 6.0.0 + unist-util-visit-parents: 6.0.1 + + /universal-user-agent@6.0.0: + resolution: {integrity: sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w==} + dev: false + + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: false + + /update-browserslist-db@1.0.13(browserslist@4.23.0): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.23.0 + escalade: 3.1.1 + picocolors: 1.0.0 + dev: false + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /vfile-location@5.0.2: + resolution: {integrity: sha512-NXPYyxyBSH7zB5U6+3uDdd6Nybz6o6/od9rk8bp9H8GR3L+cm/fC0uUTbqBmUTnMCUDslAGBOIKNfvvb+gGlDg==} + dependencies: + '@types/unist': 3.0.2 + vfile: 6.0.1 + dev: false + + /vfile-message@3.1.4: + resolution: {integrity: sha512-fa0Z6P8HUrQN4BZaX05SIVXic+7kE3b05PWAtPuYP9QLHsLKYR7/AlLW3NtOrpXRLeawpDLMsVkmk5DG0NXgWw==} + dependencies: + '@types/unist': 2.0.10 + unist-util-stringify-position: 3.0.3 + dev: false + + /vfile-message@4.0.2: + resolution: {integrity: sha512-jRDZ1IMLttGj41KcZvlrYAaI3CfqpLpfpf+Mfig13viT6NKvRzWZ+lXz0Y5D60w6uJIBAOGq9mSHf0gktF0duw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + dev: false + + /vfile@5.3.7: + resolution: {integrity: sha512-r7qlzkgErKjobAmyNIkkSpizsFPYiUPuJb5pNW1RB4JcYVZhs4lIbVqk8XPk033CV/1z8ss5pkax8SuhGpcG8g==} + dependencies: + '@types/unist': 2.0.10 + is-buffer: 2.0.5 + unist-util-stringify-position: 3.0.3 + vfile-message: 3.1.4 + dev: false + + /vfile@6.0.1: + resolution: {integrity: sha512-1bYqc7pt6NIADBJ98UiG0Bn/CHIVOoZ/IyEkqIruLg0mE1BKzkOXY2D6CSqQIcKqgadppE5lrxgWXJmXd7zZJw==} + dependencies: + '@types/unist': 3.0.2 + unist-util-stringify-position: 4.0.0 + vfile-message: 4.0.2 + dev: false + + /vite@5.2.4(@types/node@20.11.30): + resolution: {integrity: sha512-vjFghvHWidBTinu5TCymJk/lRHlR5ljqB83yugr0HA1xspUPdOZHqbqDLnZ8f9/jINrtFHTCYYyIUi+o+Q5iyg==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + dependencies: + '@types/node': 20.11.30 + esbuild: 0.20.2 + postcss: 8.4.38 + rollup: 4.13.0 + optionalDependencies: + fsevents: 2.3.3 + dev: false + + /vitefu@0.2.5(vite@5.2.4): + resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 + peerDependenciesMeta: + vite: + optional: true + dependencies: + vite: 5.2.4(@types/node@20.11.30) + dev: false + + /w3c-keyname@2.2.8: + resolution: {integrity: sha512-dpojBhNsCNN7T82Tm7k26A6G9ML3NkhDsnw9n/eoxSRlVBB4CEtIQ/KTCLI2Fwf3ataSXRhYFkQi3SlnFwPvPQ==} + dev: false + + /web-namespaces@2.0.1: + resolution: {integrity: sha512-bKr1DkiNa2krS7qxNtdrtHAmzuYGFQLiQ13TsorsdT6ULTkPLKuu5+GsFpDlg6JFjUTwX2DyhMPG2be8uPrqsQ==} + dev: false + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + dev: false + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + dev: false + + /which-pm-runs@1.1.0: + resolution: {integrity: sha512-n1brCuqClxfFfq/Rb0ICg9giSZqCS+pLtccdag6C2HyufBrh3fBOiy9nb6ggRMvWOVH5GrdJskj5iGTZNxd7SA==} + engines: {node: '>=4'} + dev: false + + /which-pm@2.0.0: + resolution: {integrity: sha512-Lhs9Pmyph0p5n5Z3mVnN0yWcbQYUAD7rbQUiMsQxOJ3T57k7RFe35SUwWMf7dsbDZks1uOmw4AecB/JMDj3v/w==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: false + + /which-pm@2.1.1: + resolution: {integrity: sha512-xzzxNw2wMaoCWXiGE8IJ9wuPMU+EYhFksjHxrRT8kMT5SnocBPRg69YAMtyV4D12fP582RA+k3P8H9J5EMdIxQ==} + engines: {node: '>=8.15'} + dependencies: + load-yaml-file: 0.2.0 + path-exists: 4.0.0 + dev: false + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + dev: false + + /widest-line@4.0.1: + resolution: {integrity: sha512-o0cyEG0e8GPzT4iGHphIOh0cJOV8fivsXxddQasHPHfoZf1ZexrfeA21w2NaEN1RHE+fXlfISmOE8R9N3u3Qig==} + engines: {node: '>=12'} + dependencies: + string-width: 5.1.2 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + dev: false + + /wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + dev: false + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: false + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + dev: false + + /yaml@2.4.1: + resolution: {integrity: sha512-pIXzoImaqmfOrL7teGUBt/T7ZDnyeGBWyXQBvOVhLkWLN37GXv8NMLK406UY6dS51JfcQHsmcW5cJ441bHg6Lg==} + engines: {node: '>= 14'} + hasBin: true + dev: false + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: false + + /yocto-queue@1.0.0: + resolution: {integrity: sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==} + engines: {node: '>=12.20'} + dev: false + + /zod-to-json-schema@3.22.5(zod@3.22.4): + resolution: {integrity: sha512-+akaPo6a0zpVCCseDed504KBJUQpEW5QZw7RMneNmKw+fGaML1Z9tUNLnHHAC8x6dzVRO1eB2oEMyZRnuBZg7Q==} + peerDependencies: + zod: ^3.22.4 + dependencies: + zod: 3.22.4 + dev: false + + /zod@3.22.4: + resolution: {integrity: sha512-iC+8Io04lddc+mVqQ9AZ7OQ2MrUKGN+oIQyq1vemgt46jwCwLfhq7/pwnBnNXXXZb8VTVLKwp9EDkx+ryxIWmg==} + dev: false + + /zwitch@2.0.4: + resolution: {integrity: sha512-bXE4cR/kVZhKZX/RjPEflHaKVhUVl85noU3v6b8apfQEc1x4A+zBxjZ4lN8LqGd6WZ3dl98pY4o717VFmoPp+A==} diff --git a/postcss.config.cjs b/postcss.config.cjs new file mode 100644 index 0000000..06aa677 --- /dev/null +++ b/postcss.config.cjs @@ -0,0 +1,3 @@ +module.exports = { + plugins: [require("tailwindcss/nesting"), require("autoprefixer"), require("cssnano")], +}; diff --git a/public/.nojekyll b/public/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/public/CNAME b/public/CNAME new file mode 100644 index 0000000..e755274 --- /dev/null +++ b/public/CNAME @@ -0,0 +1 @@ +beta.effector.dev diff --git a/public/banner.png b/public/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..e4fa7f5a543a7c8a9d088654131d4b4c2e208775 GIT binary patch literal 94627 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	d@Q1a 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 C&2U@* literal 0 HcmV?d00001 diff --git a/public/external.svg b/public/external.svg new file mode 100644 index 0000000..1285331 --- /dev/null +++ b/public/external.svg @@ -0,0 +1,16 @@ +<?xml version="1.0"?> +<svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" +> + <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> + <line x1="17" y1="7" x2="7" y2="17"></line> + <polyline points="8 7 17 7 17 16"></polyline> +</svg> diff --git a/public/favicon.ico b/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..df86553d390a2b926a0f25942db42e494d057ea9 GIT binary patch literal 15086 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 literal 0 HcmV?d00001 diff --git a/public/favicon.svg b/public/favicon.svg new file mode 100644 index 0000000..bf714e1 --- /dev/null +++ b/public/favicon.svg @@ -0,0 +1,228 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="160px" height="160px" viewBox="0 0 1600 1600" preserveAspectRatio="xMidYMid meet"> +<g id="layer101" fill="#7f2400" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z"/> + </g> +<g id="layer102" fill="#943102" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-687 -622 c0 -6 -14 -19 -31 -29 -26 -16 -35 -17 -51 -8 -17 11 -16 13 19 29 44 20 63 22 63 8z m47 -47 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m-144 -9 c9 -9 -31 -51 -65 -70 -38 -20 -37 1 1 44 29 31 50 39 64 26z"/> + </g> +<g id="layer103" fill="#af3a01" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-658 -611 c7 -5 11 -14 7 -19 -4 -6 2 -16 13 -22 13 -6 18 -16 14 -26 -5 -13 -17 -15 -59 -12 -64 5 -111 32 -93 54 21 25 93 41 118 25z m-352 -58 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m248 -18 c31 -19 35 -25 20 -26 -11 -1 -24 -1 -28 0 -5 1 -28 -14 -50 -34 -23 -19 -50 -41 -59 -49 -41 -35 -108 -57 -108 -35 0 21 2 24 22 32 19 7 19 6 7 -10 -7 -10 0 -6 17 10 30 27 51 36 39 17 -3 -5 -1 -10 4 -10 14 0 14 17 0 26 -7 4 8 25 37 55 27 27 51 49 54 49 3 0 23 -12 45 -25z m100 -25 c3 -5 -1 -10 -10 -10 -9 0 -13 5 -10 10 3 6 8 10 10 10 2 0 7 -4 10 -10z m56 -10 c10 0 19 -4 19 -10 0 -13 -6 -13 -31 0 -10 6 -19 16 -18 23 0 9 2 9 6 0 2 -7 13 -13 24 -13z m-421 -100 c0 -5 -7 -10 -17 -10 -9 0 -31 -11 -50 -26 -32 -24 -33 -24 -33 -5 0 14 11 26 33 35 39 17 67 20 67 6z m507 -37 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z"/> + </g> +<g id="layer104" fill="#b94703" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-658 -611 c7 -5 11 -13 8 -18 -3 -5 11 -20 32 -34 25 -15 35 -27 27 -32 -8 -5 -5 -12 8 -22 11 -8 16 -18 13 -22 -4 -4 -57 -7 -118 -8 -109 -1 -111 -1 -131 -28 -11 -15 -39 -38 -61 -51 -48 -28 -147 -43 -158 -25 -11 18 -63 -27 -69 -59 -3 -15 -15 -31 -26 -37 -12 -6 -28 -16 -36 -23 -35 -28 -38 34 -5 75 13 15 26 35 30 45 3 9 19 19 35 23 22 4 32 14 37 33 4 15 10 21 12 15 3 -7 17 -13 31 -13 52 0 106 28 159 81 l52 53 46 -23 c25 -12 51 -21 58 -18 6 2 -4 11 -23 20 -61 27 -65 32 -44 55 20 22 96 30 123 13z m-312 -66 c-15 -14 -27 -30 -27 -35 0 -6 -9 -10 -20 -10 -14 0 -20 6 -18 18 2 10 -2 16 -10 14 -8 -1 -12 3 -10 10 4 11 41 21 98 27 9 0 4 -9 -13 -24z m303 -135 c0 -5 -9 -10 -20 -10 -11 0 -20 5 -20 10 0 6 9 10 20 10 11 0 20 -4 20 -10z m27 -7 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m159 -20 c-7 -7 -26 7 -26 19 0 6 6 6 15 -2 9 -7 13 -15 11 -17z m-26 -32 c0 -11 -5 -10 -20 4 -15 14 -17 20 -8 26 13 8 28 -7 28 -30z"/> + </g> +<g id="layer105" fill="#cd3b01" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-664 -609 c10 -2 16 -11 13 -18 -3 -8 15 -23 45 -39 27 -15 50 -34 51 -42 0 -8 1 -20 2 -26 1 -7 -12 -15 -28 -18 -21 -4 -30 -12 -33 -29 -2 -17 1 -22 11 -18 20 8 27 -3 15 -24 -7 -13 -21 -19 -47 -19 -46 0 -112 18 -112 30 0 15 39 32 60 25 11 -4 20 -3 20 2 0 5 -23 14 -51 20 -59 14 -71 10 -134 -48 -51 -47 -81 -59 -153 -60 -57 -1 -97 -14 -88 -27 7 -11 -15 -34 -63 -67 -23 -16 -47 -39 -51 -51 -12 -31 -30 -40 -30 -15 0 11 8 25 18 30 13 7 19 22 20 47 1 21 6 42 12 48 5 5 10 18 10 28 0 10 6 18 14 18 8 0 16 6 19 14 3 8 19 17 35 21 22 4 32 14 37 33 4 15 10 21 12 15 14 -39 130 4 195 73 l47 48 45 -23 c26 -12 52 -21 59 -18 6 2 -4 11 -23 20 -62 28 -64 31 -45 61 16 25 22 27 59 21 23 -4 49 -9 59 -12z m-311 -84 c-41 -39 -62 -43 -62 -13 0 8 -7 14 -16 14 -33 0 6 29 44 33 80 8 78 9 34 -34z m-172 -63 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m690 -60 c0 -8 -3 -22 -6 -31 -6 -14 -10 -13 -31 7 -22 21 -23 23 -6 29 29 12 43 10 43 -5z m-44 -60 c10 -24 22 -43 25 -40 4 2 12 -3 19 -10 9 -12 6 -18 -14 -31 -14 -10 -26 -21 -26 -26 0 -16 32 -10 46 9 12 15 13 13 14 -22 0 -22 -3 -36 -7 -33 -3 4 -12 2 -19 -4 -10 -8 -24 -1 -56 29 -24 22 -52 41 -62 43 -10 2 -24 11 -29 20 -15 23 15 52 45 45 13 -3 17 -3 10 0 -10 5 -10 9 -1 20 9 11 8 15 -6 20 -13 5 -14 9 -3 15 28 18 46 9 64 -35z m94 -108 c0 -18 -2 -20 -9 -8 -6 8 -7 18 -5 22 9 14 14 9 14 -14z m-210 -22 c0 -3 -4 -8 -10 -11 -5 -3 -10 -1 -10 4 0 6 5 11 10 11 6 0 10 -2 10 -4z"/> + </g> +<g id="layer106" fill="#d14c02" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-664 -609 c10 -2 16 -11 13 -18 -3 -8 15 -23 45 -39 27 -15 50 -34 51 -42 0 -8 1 -20 2 -26 1 -7 -12 -15 -28 -18 -21 -4 -30 -12 -33 -28 -2 -17 1 -22 14 -20 12 2 18 -3 18 -17 0 -19 -6 -20 -82 -18 -49 2 -83 -2 -83 -7 0 -15 -34 -12 -56 5 -23 17 -60 19 -70 4 -12 -20 -71 -39 -126 -40 -77 -1 -88 -6 -88 -37 0 -29 -16 -43 -83 -74 -22 -10 -36 -22 -32 -28 7 -12 -12 -40 -26 -40 -18 0 -9 48 9 52 14 4 19 16 20 43 1 21 6 43 12 49 5 5 10 21 10 35 0 29 26 61 50 61 23 0 50 31 33 37 -24 8 -13 49 20 80 25 24 44 32 92 38 l60 7 -22 -24 c-13 -13 -23 -35 -23 -48 0 -23 0 -23 21 -4 20 18 21 18 31 1 8 -16 14 -14 51 23 23 22 45 40 49 40 4 0 25 -9 47 -21 23 -11 46 -19 53 -16 8 3 1 9 -14 16 -16 6 -39 18 -52 26 l-24 16 22 25 c18 21 27 23 61 18 22 -3 48 -8 58 -11z m-479 -157 c-6 -16 -24 -23 -24 -8 0 10 22 33 27 28 2 -2 1 -11 -3 -20z m-31 -51 c-21 -29 -38 -33 -23 -6 8 16 20 25 38 30 2 1 -5 -10 -15 -24z m717 1 c0 -8 -3 -22 -6 -31 -6 -14 -10 -13 -31 7 -22 21 -23 23 -6 29 29 12 43 10 43 -5z m-44 -60 c10 -24 22 -43 25 -40 4 2 12 -3 19 -10 9 -12 6 -18 -14 -31 -14 -10 -26 -21 -26 -26 0 -16 32 -10 46 9 12 15 13 13 14 -22 0 -22 -3 -36 -7 -33 -3 4 -12 2 -19 -4 -10 -8 -24 -1 -56 29 -24 22 -52 41 -62 43 -10 2 -24 11 -29 20 -15 23 15 52 45 45 13 -3 17 -3 10 0 -10 5 -10 9 -1 20 9 11 8 15 -6 20 -13 5 -14 9 -3 15 28 18 46 9 64 -35z m-166 -46 c0 -5 -9 -10 -20 -10 -11 0 -20 5 -20 10 0 6 9 10 20 10 11 0 20 -4 20 -10z m-340 -20 c0 -5 -5 -10 -11 -10 -5 0 -7 5 -4 10 3 6 8 10 11 10 2 0 4 -4 4 -10z m600 -42 c0 -18 -2 -20 -9 -8 -6 8 -7 18 -5 22 9 14 14 9 14 -14z m-210 -22 c0 -3 -4 -8 -10 -11 -5 -3 -10 -1 -10 4 0 6 5 11 10 11 6 0 10 -2 10 -4z"/> + <path d="M670 750 c19 -13 30 -13 30 0 0 6 -10 10 -22 10 -19 0 -20 -2 -8 -10z"/> + </g> +<g id="layer107" fill="#ea3d00" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-661 -609 c8 -3 13 -11 10 -18 -2 -7 15 -24 42 -39 26 -14 58 -34 72 -45 l25 -20 -23 -23 c-26 -29 -27 -32 -7 -52 9 -8 26 -38 39 -65 13 -28 25 -48 28 -46 3 3 11 -2 18 -10 19 -23 29 -103 18 -141 -7 -27 -14 -33 -40 -36 -34 -3 -35 -6 -53 -91 -9 -46 -30 -26 -30 29 0 43 -3 50 -27 62 -17 8 -28 21 -28 33 0 13 -7 19 -21 19 -24 0 -48 26 -49 51 0 9 -12 30 -27 46 -16 17 -28 38 -28 47 0 15 -40 46 -92 72 -7 3 -27 -6 -44 -20 -17 -14 -35 -26 -40 -26 -5 0 -9 -9 -9 -20 0 -22 12 -25 40 -10 20 11 50 4 50 -11 0 -5 -8 -12 -17 -15 -58 -18 -64 -23 -53 -44 14 -27 6 -25 -35 6 -21 15 -36 21 -40 15 -10 -17 -53 -13 -64 7 -7 11 -13 13 -18 6 -9 -13 -49 -27 -78 -28 -14 -1 -28 -17 -47 -54 -25 -49 -28 -52 -38 -32 -15 28 -9 65 10 65 11 0 15 11 16 38 0 21 6 43 12 49 7 7 12 23 12 36 0 36 18 62 44 62 35 0 52 25 32 45 -19 19 -12 37 31 77 24 23 40 28 109 34 56 5 83 3 88 -5 8 -12 -34 -33 -69 -35 -13 -1 -21 -9 -24 -26 l-3 -25 22 20 c21 19 22 19 32 1 9 -17 14 -15 48 23 21 22 43 41 49 41 6 0 28 -9 50 -21 23 -11 46 -19 53 -17 6 2 -15 18 -48 34 -59 29 -69 46 -40 67 11 8 114 1 142 -10z m-188 -15 c-3 -7 -15 -13 -28 -13 -13 0 -25 6 -27 13 -3 8 6 12 27 12 21 0 30 -4 28 -12z m-288 -137 c-10 -20 -30 -29 -30 -14 0 10 33 44 37 39 3 -2 0 -14 -7 -25z m17 -18 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z m-54 -38 c-18 -25 -40 -35 -27 -12 14 24 27 37 36 37 5 0 1 -11 -9 -25z m721 9 c3 -9 6 -32 6 -51 l0 -36 -35 39 c-40 45 -41 51 -17 57 32 9 40 7 46 -9z m56 -178 c0 -47 -22 -16 -26 36 -3 42 -3 42 11 18 8 -14 14 -38 15 -54z m-745 -118 c4 -3 9 -27 11 -53 6 -47 5 -47 -17 -32 -12 9 -30 34 -39 55 l-18 40 29 -2 c16 -1 31 -5 34 -8z m682 -105 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z"/> + </g> +<g id="layer108" fill="#b1562f" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-661 -609 c8 -3 13 -11 10 -18 -2 -7 15 -24 42 -39 26 -14 58 -34 72 -45 l25 -20 -23 -23 c-26 -29 -27 -32 -7 -52 9 -8 26 -38 39 -65 13 -28 25 -48 28 -46 3 3 11 -2 18 -10 19 -23 29 -103 18 -141 -7 -27 -14 -33 -40 -36 -34 -3 -35 -6 -53 -91 -9 -46 -30 -26 -30 29 0 43 -3 50 -27 62 -17 8 -28 21 -28 33 0 13 -7 19 -23 19 -15 0 -28 9 -34 23 -6 12 -16 34 -23 49 -7 14 -23 29 -35 32 -13 3 -42 28 -65 56 -23 27 -46 50 -50 50 -5 0 -24 -10 -44 -22 -50 -33 -48 -76 3 -49 10 6 28 7 40 4 17 -4 19 -8 10 -19 -6 -8 -20 -14 -31 -14 -27 0 -33 -27 -12 -52 19 -20 19 -21 -6 -13 -14 4 -38 18 -54 30 l-29 23 -29 -21 c-28 -21 -30 -21 -42 -4 -15 19 -46 23 -63 6 -6 -6 -9 -28 -6 -49 4 -26 0 -47 -12 -67 -16 -28 -16 -31 4 -76 23 -50 27 -77 11 -77 -5 0 -10 5 -10 10 0 6 -12 23 -27 38 -16 15 -36 44 -45 65 -16 36 -16 37 2 37 44 0 81 73 44 87 -17 6 -63 -41 -64 -67 0 -11 -4 -10 -16 5 -18 25 -15 70 6 70 11 0 15 11 16 38 0 21 6 43 12 49 7 7 12 24 12 39 0 15 11 40 24 56 13 15 27 39 31 52 4 13 23 40 41 61 33 36 39 39 109 45 41 4 82 4 91 1 15 -6 15 -8 -1 -26 -23 -26 -10 -26 22 0 32 25 43 25 92 -1 23 -11 46 -19 53 -17 6 2 -15 18 -48 34 -59 29 -69 46 -40 67 11 8 114 1 142 -10z m-188 -15 c-3 -7 -15 -13 -28 -13 -13 0 -25 6 -27 13 -3 8 6 12 27 12 21 0 30 -4 28 -12z m-288 -137 c-10 -20 -30 -29 -30 -14 0 10 33 44 37 39 3 -2 0 -14 -7 -25z m-37 -56 c-18 -25 -40 -35 -27 -12 14 24 27 37 36 37 5 0 1 -11 -9 -25z m721 9 c3 -9 6 -32 6 -51 l0 -36 -35 39 c-40 45 -41 51 -17 57 32 9 40 7 46 -9z m56 -178 c0 -47 -22 -16 -26 36 -3 42 -3 42 11 18 8 -14 14 -38 15 -54z m-63 -223 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z"/> + </g> +<g id="layer109" fill="#f35701" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-639 -617 c51 -24 71 -42 32 -30 -29 9 -25 -2 8 -20 15 -8 40 -26 57 -39 l29 -25 -22 -24 c-27 -28 -27 -28 -2 -57 15 -17 20 -19 20 -8 0 21 50 34 61 16 5 -7 9 -33 9 -57 0 -42 -1 -43 -15 -25 -22 29 -18 0 6 -40 25 -43 42 -47 34 -8 l-6 27 15 -25 c19 -32 21 -80 2 -80 -8 0 -18 -19 -25 -44 -10 -40 -14 -45 -43 -48 -34 -3 -35 -6 -53 -91 -9 -46 -30 -26 -30 29 0 43 -3 50 -27 62 -17 8 -28 21 -28 33 0 13 -7 19 -23 19 -15 0 -28 9 -34 23 -6 12 -16 34 -23 49 -7 14 -23 29 -35 32 -13 3 -42 28 -65 56 -23 27 -46 50 -50 50 -5 0 -24 -10 -44 -22 -50 -33 -48 -76 3 -49 10 6 28 7 40 4 17 -4 19 -8 10 -19 -6 -8 -20 -14 -31 -14 -27 0 -33 -27 -12 -52 19 -20 19 -21 -6 -13 -14 4 -38 18 -54 30 l-29 23 -29 -21 c-28 -21 -30 -21 -42 -4 -15 19 -46 23 -63 6 -6 -6 -9 -28 -6 -49 4 -26 0 -47 -12 -67 -16 -28 -16 -31 4 -76 23 -50 27 -77 11 -77 -5 0 -10 5 -10 10 0 6 -12 23 -27 38 -16 15 -36 44 -45 65 -16 36 -16 37 2 37 44 0 81 73 44 87 -17 6 -63 -41 -64 -66 0 -11 -6 -9 -20 7 -26 27 -25 47 1 66 16 11 22 28 25 66 3 34 13 64 32 92 15 22 36 58 47 78 11 21 33 52 48 70 26 31 33 33 103 37 42 3 83 2 91 -1 14 -6 14 -9 -2 -26 -23 -26 -10 -26 22 0 14 11 37 20 52 20 25 1 25 1 5 13 -21 12 -21 35 0 49 24 17 112 7 164 -17z m-301 -1 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m91 -6 c-3 -7 -15 -13 -28 -13 -13 0 -25 6 -27 13 -3 8 6 12 27 12 21 0 30 -4 28 -12z m-288 -137 c-6 -12 -17 -21 -26 -21 -11 0 -12 4 -4 19 9 18 31 32 38 25 2 -1 -1 -12 -8 -23z m-36 -56 c-16 -25 -34 -33 -34 -16 0 12 29 41 41 41 5 0 2 -11 -7 -25z m713 -392 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z"/> + </g> +<g id="layer110" fill="#db592c" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-639 -617 c54 -25 69 -41 30 -30 -21 5 -22 4 -5 -7 78 -55 116 -88 107 -93 -14 -8 6 -35 26 -35 20 0 34 -33 34 -81 0 -40 -1 -41 -15 -23 -22 29 -18 0 6 -40 25 -43 42 -47 34 -8 l-6 27 15 -25 c20 -32 21 -80 2 -80 -9 0 -19 -19 -26 -50 -7 -27 -21 -62 -33 -76 -19 -25 -21 -25 -33 -9 -15 20 -18 16 -28 -44 -4 -19 -14 -43 -24 -54 -9 -11 -17 -28 -17 -40 0 -13 -22 -38 -60 -69 -75 -60 -113 -78 -167 -78 l-43 0 47 25 c26 14 56 25 66 25 10 0 27 10 38 22 l19 22 -27 -17 c-37 -23 -46 -21 -41 7 4 20 14 27 57 37 86 20 96 42 45 98 -29 32 -30 38 -24 86 6 50 5 53 -22 63 -15 7 -41 11 -58 9 -24 -2 -30 2 -30 18 0 11 9 24 21 29 21 9 20 10 -12 43 -40 40 -51 41 -66 8 -10 -21 -8 -29 10 -48 12 -13 22 -28 22 -34 0 -15 -30 -25 -44 -14 -6 5 -38 19 -70 31 -56 21 -60 22 -93 6 -18 -9 -42 -16 -52 -16 -20 0 -37 -42 -25 -61 3 -5 0 -16 -6 -24 -13 -16 -8 -50 17 -102 11 -24 12 -36 3 -52 -9 -19 -7 -23 16 -32 15 -5 33 -8 41 -5 18 7 17 32 -2 40 -19 7 -20 26 -1 26 8 0 22 -14 30 -32 20 -39 20 -48 0 -48 -10 0 -14 -7 -12 -22 2 -18 10 -23 33 -24 33 0 55 -10 55 -23 0 -10 -47 -3 -80 12 -50 23 -100 60 -105 78 -4 10 -22 33 -41 51 -19 18 -34 42 -34 54 0 26 -58 144 -71 144 -17 0 -9 39 12 54 16 11 22 28 25 66 3 34 13 64 32 92 15 22 36 58 47 78 11 21 33 53 49 71 28 33 30 34 120 36 107 3 108 3 77 12 -44 12 -33 27 26 38 101 18 153 15 211 -12z m-301 -1 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-197 -143 c-6 -12 -17 -21 -26 -21 -11 0 -12 4 -4 19 9 18 31 32 38 25 2 -1 -1 -12 -8 -23z m-36 -56 c-16 -25 -34 -33 -34 -16 0 12 29 41 41 41 5 0 2 -11 -7 -25z m-114 -199 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m253 -126 c-7 -8 -22 24 -16 34 4 5 10 1 13 -10 4 -10 6 -21 3 -24z m637 26 c0 -2 -3 -11 -6 -20 -9 -24 -33 -20 -27 4 4 16 33 30 33 16z m-621 -89 c-9 -21 -15 -24 -25 -16 -11 9 -10 15 4 34 22 30 37 16 21 -18z m558 -4 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z"/> + <path d="M520 880 c0 -5 15 -10 33 -10 24 0 28 3 17 10 -20 13 -50 13 -50 0z"/> + <path d="M840 710 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"/> + <path d="M588 113 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/> + </g> +<g id="layer111" fill="#fe6801" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-639 -617 c53 -25 70 -42 30 -30 -29 9 -19 0 55 -49 41 -28 55 -42 47 -51 -12 -14 6 -35 31 -35 17 0 39 -46 39 -81 0 -10 9 -33 20 -51 22 -36 28 -132 9 -158 -8 -12 -10 -9 -6 12 2 15 0 33 -4 40 -6 9 -9 5 -9 -12 0 -26 -32 -103 -52 -127 -8 -10 -14 -10 -24 -2 -10 8 -15 2 -23 -29 -6 -21 -20 -47 -31 -57 -12 -11 -18 -25 -15 -36 4 -12 -5 -26 -31 -46 -21 -15 -50 -40 -66 -54 -34 -33 -78 -49 -132 -49 -46 0 -49 -4 37 43 16 8 28 17 28 21 -4 39 1 44 52 56 87 21 98 43 46 99 -29 32 -30 38 -24 86 6 50 5 53 -22 63 -15 7 -41 11 -58 9 -24 -2 -30 2 -30 18 0 11 9 24 21 29 21 9 20 10 -12 43 -40 40 -51 41 -66 8 -10 -21 -8 -29 10 -48 12 -13 22 -28 22 -34 0 -15 -30 -25 -44 -14 -6 5 -38 19 -70 31 -56 21 -60 22 -93 6 -18 -9 -42 -16 -52 -16 -20 0 -37 -42 -25 -61 3 -5 0 -16 -6 -24 -13 -16 -8 -50 17 -102 11 -24 12 -36 3 -52 -9 -19 -7 -23 16 -32 15 -5 33 -8 41 -5 18 7 17 32 -2 40 -19 7 -20 26 -1 26 8 0 22 -14 30 -32 20 -39 20 -48 0 -48 -10 0 -14 -7 -12 -23 2 -17 10 -22 33 -23 33 0 55 -10 55 -23 0 -24 -124 25 -160 63 -66 69 -99 116 -109 152 -6 22 -25 61 -42 87 -34 51 -34 74 1 152 27 58 33 85 21 85 -15 0 -14 26 2 42 6 8 19 27 27 43 8 15 31 37 50 47 19 11 43 29 53 40 17 20 70 31 140 28 25 0 27 1 15 14 -8 8 -26 16 -39 18 -13 2 8 8 46 12 39 4 75 9 80 11 38 13 135 3 183 -20z m-648 -399 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m253 -126 c-7 -8 -22 24 -16 34 4 5 10 1 13 -10 4 -10 6 -21 3 -24z m637 17 c0 -7 -12 -24 -27 -38 -16 -14 -34 -34 -41 -44 -12 -19 -12 -19 -6 3 14 56 74 119 74 79z m-621 -80 c-9 -21 -15 -24 -25 -16 -11 9 -10 15 4 34 22 30 37 16 21 -18z m-98 -124 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8 3 21 -13z"/> + <path d="M558 873 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/> + <path d="M890 651 c0 -7 11 -26 25 -43 14 -17 25 -23 25 -15 0 7 -11 27 -25 43 -14 16 -25 23 -25 15z"/> + <path d="M643 153 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M588 113 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/> + </g> +<g id="layer112" fill="#b76f4a" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-639 -617 c54 -25 69 -41 30 -30 -21 5 -22 5 -4 -7 99 -67 135 -100 155 -140 11 -24 21 -54 21 -66 0 -12 9 -36 20 -54 22 -36 28 -132 9 -158 -8 -12 -10 -9 -6 12 2 15 0 33 -4 40 -6 9 -9 5 -9 -12 0 -26 -32 -103 -52 -127 -8 -10 -14 -10 -24 -2 -10 8 -15 2 -23 -29 -6 -21 -20 -47 -31 -57 -12 -11 -18 -25 -15 -36 4 -12 -5 -26 -31 -46 -21 -15 -50 -40 -66 -55 -35 -33 -117 -61 -146 -51 -20 8 -17 11 30 35 38 20 48 29 36 33 -9 4 -29 0 -45 -8 -46 -23 -98 -28 -165 -16 -67 12 -62 8 -167 129 -21 25 -44 63 -50 86 -6 22 -25 61 -42 87 -34 51 -34 74 1 152 27 58 33 85 21 85 -15 0 -14 26 2 42 6 8 19 27 27 43 8 15 31 37 50 47 19 11 43 29 53 40 17 20 70 31 140 28 25 0 27 1 15 14 -8 8 -26 16 -39 18 -13 2 8 8 46 12 39 4 75 9 80 11 38 13 135 3 183 -20z m-648 -399 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m906 -80 c-12 -25 -33 -55 -46 -68 -14 -14 -31 -33 -38 -44 -12 -18 -12 -17 -6 5 7 27 37 72 79 119 16 17 30 32 31 32 1 0 -8 -20 -20 -44z m-861 -176 c3 -5 4 -10 1 -10 -3 0 -8 5 -11 10 -3 6 -4 10 -1 10 3 0 8 -4 11 -10z m135 -65 c13 -14 21 -25 18 -25 -2 0 -15 11 -28 25 -13 14 -21 25 -18 25 2 0 15 -11 28 -25z m347 -172 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z"/> + <path d="M558 873 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/> + <path d="M890 651 c0 -7 11 -26 25 -43 14 -17 25 -23 25 -15 0 7 -11 27 -25 43 -14 16 -25 23 -25 15z"/> + <path d="M643 153 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + </g> +<g id="layer113" fill="#d46a34" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-613 -626 c30 -18 44 -31 37 -36 -8 -4 7 -21 42 -48 55 -41 97 -106 97 -150 0 -12 9 -36 20 -54 22 -36 28 -132 9 -158 -8 -12 -10 -9 -6 12 2 15 0 33 -4 40 -6 9 -9 5 -9 -12 0 -26 -32 -103 -52 -127 -8 -10 -14 -10 -24 -2 -10 8 -15 2 -23 -29 -6 -21 -20 -47 -31 -57 -12 -11 -18 -25 -15 -36 4 -12 -5 -26 -31 -46 -21 -15 -50 -40 -66 -55 -35 -33 -117 -61 -146 -51 -20 8 -17 11 30 35 38 20 48 29 36 33 -9 4 -29 0 -45 -8 -46 -23 -98 -28 -165 -16 -67 12 -62 8 -167 129 -22 25 -43 59 -47 75 -9 40 -32 84 -60 117 l-22 27 20 58 c11 32 24 63 28 68 15 20 20 63 8 67 -7 3 -9 14 -4 31 4 17 11 25 18 21 6 -4 8 -3 4 4 -7 11 40 72 56 72 17 0 69 41 63 50 -9 15 11 20 89 21 66 1 73 3 61 16 -11 10 -25 12 -48 8 -25 -6 -30 -5 -20 5 6 7 45 15 85 17 40 3 75 7 78 10 3 2 39 3 80 1 61 -2 84 -8 124 -32z m-627 -253 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m-47 -137 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m906 -80 c-12 -25 -33 -55 -46 -68 -14 -14 -31 -33 -38 -44 -12 -18 -12 -17 -6 5 7 27 37 72 79 119 16 17 30 32 31 32 1 0 -8 -20 -20 -44z m-861 -176 c3 -5 4 -10 1 -10 -3 0 -8 5 -11 10 -3 6 -4 10 -1 10 3 0 8 -4 11 -10z m135 -65 c13 -14 21 -25 18 -25 -2 0 -15 11 -28 25 -13 14 -21 25 -18 25 2 0 15 -11 28 -25z m347 -172 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z"/> + <path d="M890 651 c0 -7 11 -26 25 -43 14 -17 25 -23 25 -15 0 7 -11 27 -25 43 -14 16 -25 23 -25 15z"/> + <path d="M643 153 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + </g> +<g id="layer114" fill="#f46f32" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-834 -589 c-5 -13 -3 -15 13 -8 25 12 124 8 160 -5 45 -17 144 -84 141 -95 -2 -5 16 -33 40 -63 24 -29 43 -63 43 -76 0 -13 11 -48 25 -78 28 -59 31 -99 10 -143 -11 -24 -14 -26 -14 -10 -1 12 -15 -5 -38 -48 -27 -51 -39 -65 -48 -57 -10 8 -15 4 -20 -18 -3 -16 -17 -40 -31 -53 -15 -14 -22 -29 -19 -40 4 -12 -6 -26 -31 -46 -21 -15 -50 -40 -66 -55 -35 -33 -117 -61 -146 -51 -20 8 -17 11 30 35 38 20 48 29 36 33 -9 4 -29 0 -45 -8 -46 -23 -98 -28 -165 -16 -67 12 -64 10 -166 129 -22 25 -47 68 -56 96 -9 28 -25 60 -35 71 -41 43 -41 53 -5 147 39 102 38 97 19 90 -9 -4 -15 0 -15 9 0 22 62 110 85 122 36 18 61 40 68 58 5 13 18 17 54 18 48 0 104 16 73 19 -8 1 -24 2 -35 1 -20 -2 -20 -1 -1 14 11 8 34 15 52 15 17 0 37 7 44 15 18 21 51 20 43 -2z m-406 -290 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m-47 -137 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m902 -88 c-14 -29 -34 -62 -46 -74 -12 -11 -26 -29 -32 -40 -20 -34 -27 -6 -8 30 15 28 102 136 110 136 0 0 -10 -24 -24 -52z m-857 -168 c3 -5 4 -10 1 -10 -3 0 -8 5 -11 10 -3 6 -4 10 -1 10 3 0 8 -4 11 -10z m135 -65 c13 -14 21 -25 18 -25 -2 0 -15 11 -28 25 -13 14 -21 25 -18 25 2 0 15 -11 28 -25z m347 -172 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z"/> + <path d="M800 850 c14 -11 30 -20 35 -20 6 0 -1 9 -15 20 -14 11 -29 20 -35 20 -5 0 1 -9 15 -20z"/> + <path d="M643 153 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + </g> +<g id="layer115" fill="#da774e" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-737 -587 c80 -14 95 -21 198 -86 12 -7 22 -18 22 -22 0 -5 -14 1 -31 13 -16 12 -32 20 -35 18 -5 -6 106 -82 120 -83 5 0 10 -11 12 -25 5 -47 21 -105 44 -154 18 -39 21 -59 16 -100 -5 -44 -4 -49 8 -33 19 25 27 21 20 -10 -8 -31 -36 -76 -68 -109 -12 -11 -26 -29 -32 -40 -19 -32 -27 -7 -9 28 10 18 23 44 31 58 7 14 15 39 18 55 6 29 6 29 -10 -5 -33 -72 -55 -101 -69 -90 -10 9 -15 4 -20 -19 -3 -17 -15 -42 -26 -56 -17 -21 -18 -25 -5 -25 9 0 16 -6 16 -14 0 -18 -17 -30 -22 -17 -1 6 -32 -17 -68 -51 -81 -76 -164 -107 -208 -79 -10 6 -7 11 15 19 34 12 70 38 62 46 -3 3 -24 -4 -46 -15 -41 -20 -77 -23 -177 -17 -41 3 -52 8 -65 29 -24 40 -72 101 -97 124 -12 11 -29 45 -38 75 -8 31 -24 64 -34 75 -38 41 -40 54 -21 117 9 33 22 65 27 71 5 7 13 22 16 34 6 18 4 22 -8 17 -10 -4 -16 -1 -16 9 0 22 62 110 85 122 36 18 61 40 68 58 5 13 18 17 54 18 48 0 104 16 73 19 -8 1 -24 2 -35 1 -20 -2 -20 -1 -1 14 11 8 34 15 52 15 17 0 37 7 44 15 15 19 33 19 140 0z m-503 -292 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m-51 -117 c9 -18 7 -27 -7 -45 l-18 -22 -6 35 c-11 54 11 76 31 32z m64 -289 c0 -6 -9 -2 -20 8 -11 10 -17 22 -13 28 6 10 33 -19 33 -36z m141 -75 c-13 -4 -71 45 -71 61 0 5 19 -6 41 -24 24 -19 37 -35 30 -37z m554 28 c-3 -5 -11 -10 -16 -10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-75 -34 c0 -2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z m-265 -86 c8 -13 -5 -13 -25 0 -13 8 -13 10 2 10 9 0 20 -4 23 -10z m71 -39 c5 1 16 0 24 -4 8 -3 22 -8 30 -10 8 -3 -1 -6 -20 -6 -33 0 -70 17 -70 34 0 4 6 2 14 -4 8 -6 18 -11 22 -10z"/> + </g> +<g id="layer116" fill="#b78d65" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-697 -593 c62 -13 179 -86 200 -124 9 -16 23 -30 31 -30 8 0 14 -7 14 -15 1 -21 24 -96 47 -154 14 -36 19 -65 16 -102 -3 -29 -1 -51 4 -48 4 3 8 12 8 20 0 8 5 12 10 9 12 -8 3 -51 -19 -85 -21 -34 -103 -131 -107 -127 -2 2 1 19 6 38 9 31 8 32 -5 15 -15 -20 -15 -20 -15 0 -1 15 -4 12 -17 -11 -8 -16 -22 -38 -31 -47 -14 -16 -13 -18 1 -18 10 0 17 -6 17 -14 0 -18 -17 -30 -22 -17 -1 6 -32 -17 -68 -51 -81 -76 -164 -107 -208 -79 -10 6 -7 11 15 19 34 12 70 38 62 46 -3 3 -24 -4 -46 -15 -41 -20 -77 -23 -177 -17 -41 3 -52 8 -65 29 -24 39 -72 101 -97 124 -12 11 -30 45 -39 75 -10 30 -21 59 -26 64 -12 14 -12 -11 1 -34 9 -18 8 -18 -16 -5 -31 16 -44 33 -44 58 0 11 4 15 11 11 8 -5 10 2 7 21 -6 30 -1 51 31 135 14 37 16 49 6 36 -8 -11 -15 -23 -15 -28 0 -4 -7 -8 -16 -8 -12 0 -15 6 -10 23 3 12 6 33 7 47 0 23 1 23 8 5 7 -18 11 -15 30 22 26 52 78 113 97 113 7 0 23 14 36 30 17 24 29 30 59 30 21 0 46 3 56 7 16 6 15 8 -7 14 l-25 6 30 13 c17 6 44 18 60 26 32 15 117 12 205 -7z m-594 -403 c9 -18 7 -27 -7 -45 l-18 -22 -6 35 c-11 54 11 76 31 32z m64 -289 c0 -6 -9 -2 -20 8 -11 10 -17 22 -13 28 6 10 33 -19 33 -36z m754 -2 c-4 -8 -10 -15 -15 -15 -4 0 -6 7 -3 15 4 8 10 15 15 15 4 0 6 -7 3 -15z m-613 -73 c-13 -4 -71 45 -71 61 0 5 19 -6 41 -24 24 -19 37 -35 30 -37z m554 28 c-3 -5 -11 -10 -16 -10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-75 -34 c0 -2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z m-265 -86 c8 -13 -5 -13 -25 0 -13 8 -13 10 2 10 9 0 20 -4 23 -10z m71 -39 c5 1 16 0 24 -4 8 -3 22 -8 30 -10 8 -3 -1 -6 -20 -6 -33 0 -70 17 -70 34 0 4 6 2 14 -4 8 -6 18 -11 22 -10z"/> + <path d="M915 412 c-29 -56 -30 -58 -7 -39 19 17 38 64 29 73 -2 2 -12 -13 -22 -34z"/> + </g> +<g id="layer117" fill="#f6784c" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-697 -593 c62 -13 179 -86 200 -124 9 -16 23 -30 31 -30 8 0 14 -7 14 -15 1 -21 24 -96 47 -154 14 -36 19 -65 16 -102 -3 -29 -1 -51 4 -48 4 3 8 12 8 20 0 8 5 12 10 9 12 -8 3 -51 -19 -85 -21 -34 -103 -131 -107 -127 -2 2 1 19 6 38 9 31 8 32 -5 15 -15 -20 -15 -20 -15 0 -1 15 -4 12 -17 -11 -8 -16 -22 -38 -31 -47 -14 -16 -13 -18 1 -18 10 0 17 -6 17 -14 0 -18 -17 -30 -22 -17 -1 6 -32 -17 -68 -51 -81 -76 -164 -107 -208 -79 -10 6 -7 11 15 19 34 12 70 38 62 46 -3 3 -24 -4 -46 -15 -41 -20 -77 -23 -177 -17 -41 3 -52 8 -65 29 -24 39 -72 101 -97 124 -12 11 -30 45 -39 75 -10 30 -21 59 -26 64 -12 14 -12 -11 1 -34 9 -18 8 -18 -16 -5 -31 16 -44 33 -44 58 0 11 4 15 11 11 8 -5 10 2 7 21 -6 30 -1 51 31 135 14 37 16 49 6 36 -8 -11 -15 -23 -15 -28 0 -4 -7 -8 -15 -8 -12 0 -13 9 -9 48 7 52 24 81 24 42 0 -21 4 -18 26 20 30 53 73 100 91 100 7 0 22 14 35 30 18 25 29 30 62 30 23 0 48 5 56 11 12 8 9 10 -12 6 -38 -6 -35 8 5 23 17 6 46 18 62 26 32 15 116 12 205 -7z m-594 -403 c9 -18 7 -27 -7 -45 l-18 -22 -6 35 c-11 54 11 76 31 32z m64 -289 c0 -6 -9 -2 -20 8 -11 10 -17 22 -13 28 6 10 33 -19 33 -36z m754 -2 c-4 -8 -10 -15 -15 -15 -4 0 -6 7 -3 15 4 8 10 15 15 15 4 0 6 -7 3 -15z m-613 -73 c-13 -4 -71 45 -71 61 0 5 19 -6 41 -24 24 -19 37 -35 30 -37z m554 28 c-3 -5 -11 -10 -16 -10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-75 -34 c0 -2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z m-265 -86 c8 -13 -5 -13 -25 0 -13 8 -13 10 2 10 9 0 20 -4 23 -10z m71 -39 c5 1 16 0 24 -4 8 -3 22 -8 30 -10 8 -3 -1 -6 -20 -6 -33 0 -70 17 -70 34 0 4 6 2 14 -4 8 -6 18 -11 22 -10z"/> + <path d="M915 412 c-29 -56 -30 -58 -7 -39 19 17 38 64 29 73 -2 2 -12 -13 -22 -34z"/> + </g> +<g id="layer118" fill="#ff9927" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-725 -587 c102 -22 220 -92 239 -142 5 -14 12 -23 16 -19 8 8 34 -14 28 -24 -6 -10 17 -101 39 -152 9 -21 16 -59 17 -85 0 -26 3 -42 6 -35 2 6 9 10 14 6 11 -7 1 -51 -20 -84 -21 -34 -103 -131 -107 -127 -2 2 1 19 6 38 9 31 8 32 -5 15 -15 -20 -15 -20 -15 0 0 12 -9 4 -25 -25 -29 -51 -30 -52 -10 -45 9 4 15 0 15 -9 0 -9 -7 -22 -15 -31 -8 -8 -15 -18 -15 -22 0 -5 5 -3 12 4 17 17 29 15 22 -3 -4 -8 -16 -15 -28 -15 -13 0 -33 -11 -46 -25 -13 -14 -31 -25 -39 -25 -13 1 -12 4 4 15 40 28 65 50 65 58 0 13 -34 -10 -79 -53 -58 -57 -142 -84 -196 -64 -11 5 -2 13 35 30 27 13 50 28 50 34 0 13 -13 13 -26 0 -19 -19 -128 -47 -149 -39 -11 4 -36 8 -55 9 -49 2 -127 47 -169 100 -36 44 -36 44 -6 23 17 -12 43 -35 59 -52 29 -30 46 -39 46 -23 0 4 -25 33 -54 65 -40 43 -59 72 -71 112 -8 30 -20 57 -25 60 -13 8 -13 -1 0 -25 15 -28 -21 -20 -42 10 -18 26 -25 65 -10 56 5 -3 10 26 10 65 1 39 4 74 7 80 4 5 2 9 -4 9 -7 0 -8 17 -5 48 7 52 24 81 24 42 0 -21 4 -18 26 20 30 53 73 100 91 100 7 0 22 14 35 30 18 25 29 30 62 30 23 0 48 5 56 11 12 8 9 10 -12 6 -38 -6 -35 8 5 23 17 6 46 18 62 25 40 18 89 18 177 0z m-566 -404 c4 -11 7 -11 21 0 17 13 17 12 2 -11 -9 -14 -22 -35 -29 -47 -14 -21 -14 -21 -26 13 -9 25 -9 45 -1 76 l11 42 9 -29 c5 -17 11 -36 13 -44z m60 -273 c3 -11 3 -22 0 -25 -9 -10 -36 18 -36 38 0 24 27 14 36 -13z m758 -23 c-4 -8 -10 -15 -15 -15 -4 0 -6 7 -3 15 4 8 10 15 15 15 4 0 6 -7 3 -15z m-703 -12 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8 3 21 -13z m604 -103 c-3 -5 -11 -10 -16 -10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-50 -20 c-3 -5 -14 -10 -23 -9 -14 0 -13 2 3 9 27 11 27 11 20 0z m-231 -35 c26 -14 51 -23 56 -20 4 3 13 -2 20 -10 7 -9 21 -13 31 -10 9 3 20 1 24 -5 8 -13 -87 -14 -101 0 -5 5 -34 23 -64 39 -37 21 -48 31 -34 31 12 0 42 -11 68 -25z m-249 5 c3 -5 4 -10 1 -10 -3 0 -8 5 -11 10 -3 6 -4 10 -1 10 3 0 8 -4 11 -10z m32 -17 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z"/> + <path d="M155 649 c-4 -6 -5 -12 -2 -15 2 -3 7 2 10 11 7 17 1 20 -8 4z"/> + <path d="M930 440 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"/> + <path d="M906 388 l-17 -33 20 24 c18 20 27 41 18 41 -1 0 -11 -15 -21 -32z"/> + </g> +<g id="layer119" fill="#fe9034" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-652 -481 c-3 -5 -19 -13 -36 -16 -17 -4 -48 -16 -68 -27 l-36 -21 30 27 c37 32 126 62 110 37z m-73 -106 c102 -22 220 -92 239 -142 5 -14 12 -23 16 -19 8 8 34 -14 28 -24 -6 -10 17 -101 39 -152 9 -21 16 -59 16 -85 0 -35 3 -44 10 -33 5 8 10 11 10 5 0 -5 7 -1 15 9 15 19 15 19 15 -1 0 -12 -6 -28 -12 -35 -7 -7 -22 -29 -32 -48 -21 -38 -107 -143 -112 -137 -2 2 1 19 6 38 9 31 8 32 -5 15 -15 -20 -15 -20 -15 0 0 12 -9 4 -25 -25 -29 -51 -30 -52 -10 -45 9 4 15 0 15 -9 0 -9 -7 -22 -15 -31 -8 -8 -15 -18 -15 -22 0 -5 5 -3 12 4 17 17 29 15 22 -3 -4 -8 -16 -15 -28 -15 -13 0 -33 -11 -46 -25 -13 -14 -31 -25 -39 -25 -13 1 -12 4 4 15 40 28 65 50 65 58 0 13 -34 -10 -79 -53 -58 -57 -142 -84 -196 -64 -11 5 -2 13 35 30 27 13 50 28 50 34 0 13 -13 13 -26 0 -19 -19 -128 -47 -149 -39 -11 4 -36 8 -55 9 -49 2 -127 47 -169 100 -36 44 -36 44 -6 23 17 -12 43 -35 59 -52 29 -30 46 -39 46 -23 0 4 -25 33 -54 65 -40 43 -59 72 -71 112 -8 30 -20 57 -25 60 -13 8 -13 -1 0 -25 15 -28 -21 -20 -42 10 -18 26 -25 65 -10 56 5 -3 10 26 10 65 1 39 4 74 7 80 4 5 2 9 -4 9 -7 0 -8 17 -5 48 7 52 24 81 24 42 0 -21 4 -18 26 20 30 53 73 100 91 100 7 0 22 14 35 30 18 25 29 30 62 30 23 0 48 5 56 11 12 8 9 10 -12 6 -38 -6 -35 8 5 23 17 6 46 18 62 25 40 18 89 18 177 0z m-566 -404 c4 -11 7 -11 21 0 17 13 17 12 2 -11 -9 -14 -22 -35 -29 -47 -14 -21 -14 -21 -26 13 -9 25 -9 45 -1 76 l11 42 9 -29 c5 -17 11 -36 13 -44z m1014 29 c-6 -12 -14 -19 -17 -16 -4 3 -13 0 -22 -7 -14 -11 -15 -10 -1 8 31 43 45 56 48 46 2 -5 -2 -20 -8 -31z m-954 -302 c3 -11 3 -22 0 -25 -9 -10 -36 18 -36 38 0 24 27 14 36 -13z m758 -23 c-4 -8 -10 -15 -15 -15 -4 0 -6 7 -3 15 4 8 10 15 15 15 4 0 6 -7 3 -15z m-703 -12 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8 3 21 -13z m604 -103 c-3 -5 -11 -10 -16 -10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-50 -20 c-3 -5 -14 -10 -23 -9 -14 0 -13 2 3 9 27 11 27 11 20 0z m-231 -35 c26 -14 51 -23 56 -20 4 3 13 -2 20 -10 7 -9 21 -13 31 -10 9 3 20 1 24 -5 8 -13 -87 -14 -101 0 -5 5 -34 23 -64 39 -37 21 -48 31 -34 31 12 0 42 -11 68 -25z m-249 5 c3 -5 4 -10 1 -10 -3 0 -8 5 -11 10 -3 6 -4 10 -1 10 3 0 8 -4 11 -10z m32 -17 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z"/> + <path d="M155 649 c-4 -6 -5 -12 -2 -15 2 -3 7 2 10 11 7 17 1 20 -8 4z"/> + <path d="M930 440 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"/> + <path d="M906 388 l-17 -33 20 24 c18 20 27 41 18 41 -1 0 -11 -15 -21 -32z"/> + </g> +<g id="layer120" fill="#d69064" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-710 -438 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m77 -29 c-4 -9 -109 -66 -146 -79 -10 -3 -18 -10 -18 -15 0 -11 5 -12 95 -31 52 -12 136 -55 185 -97 21 -17 36 -23 48 -17 16 7 62 13 62 7 0 -1 -9 -20 -20 -41 -19 -37 -20 -43 -6 -93 8 -30 21 -71 30 -91 9 -21 16 -58 16 -84 l0 -47 23 26 c50 57 93 112 110 141 10 17 15 22 11 11 -3 -11 -9 -31 -12 -45 -3 -14 -17 -41 -32 -60 -14 -19 -46 -64 -70 -100 -46 -69 -131 -173 -136 -167 -2 2 1 19 6 38 9 31 8 32 -5 15 -15 -20 -15 -20 -15 0 0 12 -9 4 -25 -25 -29 -51 -30 -52 -10 -45 9 4 15 0 15 -9 0 -9 -7 -22 -15 -31 -8 -8 -15 -18 -15 -22 0 -5 5 -3 12 4 17 17 29 15 22 -3 -4 -8 -16 -15 -28 -15 -13 0 -33 -11 -46 -25 -13 -14 -31 -25 -39 -25 -13 1 -12 4 4 15 40 28 65 50 65 58 0 13 -34 -10 -79 -53 -58 -57 -142 -84 -196 -64 -11 5 -2 13 35 30 27 13 50 28 50 34 0 7 -7 7 -22 -1 -44 -24 -133 -46 -153 -38 -11 4 -36 8 -55 9 -49 2 -127 47 -169 100 -36 44 -36 44 -6 23 17 -12 43 -35 59 -52 29 -30 46 -39 46 -23 0 4 -25 33 -54 65 -40 43 -59 72 -71 112 -8 30 -20 57 -25 60 -13 8 -13 -1 0 -25 15 -28 -21 -20 -42 10 -18 26 -25 65 -10 56 5 -3 10 26 10 65 1 39 4 74 7 80 4 5 2 9 -4 9 -7 0 -8 17 -5 48 7 52 24 81 24 42 0 -21 4 -18 26 20 30 53 73 100 91 100 7 0 22 14 35 30 18 25 29 30 62 30 23 0 48 5 56 11 12 8 9 10 -12 6 -38 -6 -35 8 5 23 17 6 47 18 65 26 18 8 42 14 54 14 11 0 37 16 56 36 19 20 50 43 69 50 18 8 33 19 33 24 0 6 13 9 29 8 16 -1 27 -7 25 -13z m-658 -524 c4 -11 7 -11 21 0 17 13 17 12 2 -11 -9 -14 -22 -35 -29 -47 -14 -21 -14 -21 -26 13 -9 25 -9 45 -1 76 l11 42 9 -29 c5 -17 11 -36 13 -44z m60 -273 c3 -11 3 -22 0 -25 -9 -10 -36 18 -36 38 0 24 27 14 36 -13z m758 -23 c-4 -8 -10 -15 -15 -15 -4 0 -6 7 -3 15 4 8 10 15 15 15 4 0 6 -7 3 -15z m-703 -12 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8 3 21 -13z m604 -103 c-3 -5 -11 -10 -16 -10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-45 -14 c0 -8 -81 -59 -86 -54 -7 8 48 46 84 57 1 1 2 -1 2 -3z m-236 -41 c26 -14 51 -23 56 -20 4 3 13 -2 20 -10 7 -9 21 -13 31 -10 9 3 20 1 24 -5 8 -13 -87 -14 -101 0 -5 5 -34 23 -64 39 -37 21 -48 31 -34 31 12 0 42 -11 68 -25z m-249 5 c3 -5 4 -10 1 -10 -3 0 -8 5 -11 10 -3 6 -4 10 -1 10 3 0 8 -4 11 -10z m32 -17 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z"/> + <path d="M703 1063 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M155 649 c-4 -6 -5 -12 -2 -15 2 -3 7 2 10 11 7 17 1 20 -8 4z"/> + <path d="M930 440 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"/> + <path d="M906 388 l-17 -33 20 24 c18 20 27 41 18 41 -1 0 -11 -15 -21 -32z"/> + </g> +<g id="layer121" fill="#f78f55" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-710 -438 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m77 -29 c-4 -9 -109 -66 -146 -79 -10 -3 -18 -10 -18 -15 0 -11 17 -17 80 -26 57 -9 155 -58 197 -97 23 -23 36 -29 50 -23 17 8 63 14 63 8 0 -1 -9 -19 -20 -40 -16 -33 -18 -44 -9 -83 6 -25 20 -65 32 -90 11 -25 20 -66 21 -92 l0 -47 20 24 c51 57 92 111 109 139 10 17 15 22 11 11 -3 -11 -9 -31 -12 -45 -3 -14 -17 -41 -32 -60 -14 -19 -48 -66 -73 -105 -52 -78 -142 -180 -133 -152 3 10 0 25 -8 33 -12 12 -17 9 -35 -22 -25 -42 -26 -45 -6 -38 9 4 15 0 15 -9 0 -9 -7 -22 -15 -31 -8 -8 -15 -18 -15 -22 0 -5 5 -3 12 4 17 17 29 15 22 -3 -4 -8 -16 -15 -28 -15 -13 0 -33 -11 -46 -25 -13 -14 -31 -25 -39 -25 -13 1 -12 4 4 15 40 28 65 50 65 58 0 13 -34 -10 -79 -53 -58 -57 -142 -84 -196 -64 -11 5 -2 13 35 30 27 13 50 28 50 34 0 7 -7 7 -22 -1 -44 -24 -133 -46 -153 -38 -11 4 -36 8 -55 9 -49 2 -127 47 -169 100 -36 44 -36 44 -6 23 17 -12 43 -35 59 -52 29 -30 46 -39 46 -23 0 4 -25 34 -56 66 -30 33 -58 72 -61 88 -3 15 -12 28 -19 28 -8 0 -14 5 -14 11 0 5 5 7 10 4 15 -9 12 9 -6 31 -15 19 -15 19 -9 -2 3 -14 0 -24 -8 -27 -21 -8 -63 71 -50 92 18 28 27 103 13 111 -9 5 -9 21 -1 66 11 56 22 79 41 79 5 0 23 19 40 43 17 24 46 50 63 57 18 8 28 14 24 15 -20 1 16 39 43 45 17 4 28 10 25 14 -2 5 24 16 58 26 34 10 66 22 72 27 5 4 22 8 38 8 21 0 40 11 65 36 19 20 50 43 69 50 18 8 33 19 33 24 0 6 13 9 29 8 16 -1 27 -7 25 -13z m270 -467 c7 -29 8 -53 1 -46 -11 10 -23 68 -15 68 4 0 10 -10 14 -22z m-928 -57 c4 -11 7 -11 21 0 17 13 17 12 2 -11 -9 -14 -22 -35 -29 -47 -14 -21 -14 -21 -26 13 -9 25 -9 45 -1 76 l11 42 9 -29 c5 -17 11 -36 13 -44z m60 -273 c3 -11 3 -22 0 -25 -9 -10 -36 18 -36 38 0 24 27 14 36 -13z m762 -20 c-2 -6 -10 -14 -16 -16 -7 -2 -10 2 -6 12 7 18 28 22 22 4z m-707 -15 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8 3 21 -13z m604 -103 c-3 -5 -11 -10 -16 -10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-45 -14 c0 -8 -81 -59 -86 -54 -7 8 48 46 84 57 1 1 2 -1 2 -3z m-236 -41 c26 -14 51 -23 56 -20 4 3 13 -2 20 -10 7 -9 21 -13 31 -10 9 3 20 1 24 -5 8 -13 -87 -14 -101 0 -5 5 -34 23 -64 39 -37 21 -48 31 -34 31 12 0 42 -11 68 -25z m-249 5 c3 -5 4 -10 1 -10 -3 0 -8 5 -11 10 -3 6 -4 10 -1 10 3 0 8 -4 11 -10z m32 -17 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z"/> + <path d="M703 1063 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M150 640 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"/> + <path d="M930 440 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"/> + <path d="M906 388 l-17 -33 20 24 c18 20 27 41 18 41 -1 0 -11 -15 -21 -32z"/> + <path d="M874 338 c-4 -7 -3 -8 4 -4 12 7 16 16 8 16 -3 0 -8 -5 -12 -12z"/> + </g> +<g id="layer122" fill="#f9956d" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-710 -438 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m77 -29 c-3 -6 -24 -21 -47 -33 -88 -46 -107 -57 -107 -64 0 -4 26 -12 58 -19 62 -13 158 -57 209 -95 33 -25 49 -30 55 -15 2 5 17 6 35 4 l31 -5 -18 -31 c-11 -17 -16 -35 -13 -40 3 -5 1 -12 -4 -16 -6 -4 -5 -17 4 -36 l14 -30 -4 27 c-2 15 0 25 5 22 5 -3 7 -22 3 -43 -4 -24 1 -55 15 -93 11 -32 20 -64 20 -73 0 -8 7 -15 15 -15 8 0 15 5 15 10 0 6 17 29 39 53 21 23 46 56 55 72 10 17 14 21 10 10 -3 -11 -9 -31 -12 -45 -3 -13 -24 -50 -46 -81 -23 -32 -52 -76 -65 -98 -13 -22 -50 -68 -82 -103 -55 -59 -71 -69 -50 -30 6 11 4 21 -4 29 -11 10 -17 7 -29 -19 -20 -39 -20 -44 -2 -29 12 10 14 7 11 -18 -5 -37 1 -38 32 -9 19 18 23 19 23 5 0 -9 -11 -24 -25 -33 -14 -9 -25 -21 -25 -27 0 -10 -30 -36 -42 -37 -4 0 -4 8 -1 17 5 12 -3 9 -28 -10 -50 -38 -161 -77 -217 -77 -62 0 -86 15 -39 24 35 6 94 45 70 46 -6 0 -14 -4 -17 -9 -4 -5 -29 -15 -56 -22 -28 -7 -50 -16 -50 -21 0 -9 82 -53 94 -50 5 2 17 -5 27 -14 19 -17 21 -16 52 13 33 31 61 48 131 77 39 16 39 16 21 -4 -10 -11 -22 -17 -27 -14 -8 5 -90 -54 -114 -82 -19 -23 -87 -20 -122 4 -17 13 -47 29 -66 37 -20 9 -36 22 -36 30 0 10 -10 15 -31 15 -35 0 -115 37 -178 83 -32 24 -45 40 -45 59 -2 25 -1 26 16 11 25 -22 34 -10 14 19 -9 12 -16 30 -16 40 0 9 -9 22 -20 28 -16 9 -20 8 -20 -7 -1 -10 -15 9 -31 41 -25 47 -29 63 -21 80 6 12 13 34 17 51 l7 30 -23 -29 c-12 -15 -28 -44 -35 -65 l-13 -36 -1 33 c0 18 -4 41 -9 51 -6 10 -5 35 2 66 6 28 12 42 15 32 7 -33 30 -69 37 -58 3 6 8 37 11 68 5 62 23 108 41 108 6 0 26 19 43 43 17 24 46 50 63 57 18 8 28 14 24 15 -20 1 16 39 43 45 17 4 28 10 25 14 -2 5 24 16 58 27 34 10 73 24 87 31 14 7 31 13 39 13 7 0 21 8 30 18 9 10 25 22 36 26 16 6 17 9 5 16 -12 8 -11 10 5 10 11 0 34 9 50 20 31 21 86 24 79 5z m271 -487 c5 -31 5 -32 -6 -8 -6 14 -15 33 -20 42 -15 29 -10 44 6 21 8 -12 18 -37 20 -55z m-933 -170 c-7 -7 -12 -8 -12 -2 0 14 12 26 19 19 2 -3 -1 -11 -7 -17z m938 -62 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m-943 -43 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z m923 13 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m-854 -43 c4 -13 4 -27 0 -30 -9 -10 -45 27 -40 41 8 21 34 14 40 -11z m174 -219 c0 -2 -13 2 -30 11 -16 9 -30 18 -30 21 0 2 14 -2 30 -11 17 -9 30 -18 30 -21z m60 1 c-7 -8 -20 -15 -29 -15 -11 1 -8 5 9 15 32 18 35 18 20 0z"/> + <path d="M703 1063 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M235 250 c-8 -12 19 -46 49 -62 14 -8 12 -1 -10 28 -15 22 -29 40 -30 42 -1 2 -5 -2 -9 -8z"/> + <path d="M752 184 c-24 -19 -39 -34 -34 -34 5 0 26 16 48 35 50 44 42 44 -14 -1z"/> + </g> +<g id="layer123" fill="#ffad53" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -100 -101 -23 -38 -56 -76 -74 -87 -18 -11 -31 -23 -28 -26 3 -3 -15 -30 -39 -60 -42 -52 -45 -58 -39 -97 4 -22 11 -45 16 -51 5 -5 9 -20 9 -34 0 -45 17 -8 28 62 11 67 26 102 42 92 5 -3 17 10 29 27 30 49 113 126 144 133 15 4 25 11 22 15 -3 4 7 11 23 15 64 16 202 74 199 84 -1 3 4 16 11 28 8 15 18 20 33 16 16 -5 20 -3 15 6 -5 8 -3 11 5 10 8 -2 24 2 36 9 26 14 72 12 67 -3 -3 -6 -21 -19 -42 -30 -20 -10 -45 -26 -55 -34 -18 -15 -18 -16 0 -22 14 -6 11 -8 -12 -8 -23 -1 -27 -4 -15 -11 8 -5 25 -10 36 -10 24 0 198 -84 227 -108 12 -11 21 -13 25 -6 5 8 51 11 69 5 2 -1 -6 -16 -16 -35 -19 -33 -19 -34 0 -65 10 -17 19 -41 19 -52 0 -11 9 -37 20 -59 11 -22 20 -52 19 -67 0 -25 -2 -23 -16 15 -8 24 -16 42 -18 40 -8 -8 20 -98 32 -102 7 -3 13 -1 13 5 0 5 17 28 39 52 21 23 46 56 55 72 10 17 14 21 10 10 -3 -11 -9 -31 -12 -45 -3 -13 -25 -51 -49 -83 -23 -33 -43 -64 -43 -71 0 -18 -44 -71 -134 -165 -52 -52 -59 -77 -13 -40 41 31 33 3 -15 -54 -41 -48 -38 -54 7 -18 20 16 20 16 1 -6 -19 -23 -88 -63 -109 -63 -7 0 -33 -20 -59 -44 -38 -35 -57 -45 -96 -50 -44 -6 -53 -3 -92 25 -24 17 -59 36 -79 42 -20 5 -30 12 -23 14 19 7 3 23 -23 23 -27 0 -86 28 -155 73 -58 38 -71 55 -64 82 3 14 -4 35 -20 59 -38 57 -62 124 -48 138 7 7 12 23 12 36 0 20 -3 22 -14 13 -21 -17 -29 -63 -16 -95 7 -19 7 -33 0 -47 -9 -15 -7 -19 5 -19 19 0 70 -104 60 -121 -5 -7 -24 5 -51 32 -43 43 -45 45 -43 104 0 33 -4 80 -9 105 -6 26 -7 86 -4 142 l7 97 45 46 c24 25 40 45 34 45 -11 0 -63 -52 -86 -87 -12 -18 -14 -57 -12 -203 3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-707 -436 c0 -2 -7 -6 -15 -10 -8 -3 -15 -1 -15 4 0 6 7 10 15 10 8 0 15 -2 15 -4z m-43 -13 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m-297 -118 c-43 -44 -58 -51 -47 -21 5 13 72 64 87 65 2 1 -16 -19 -40 -44z m745 -545 c-10 -11 -21 -17 -24 -14 -3 3 3 12 13 20 28 20 32 17 11 -6z m-45 -63 c-11 -18 -32 -44 -47 -58 l-27 -24 27 35 c15 19 33 45 39 58 6 12 15 22 19 22 5 0 0 -15 -11 -33z m-793 -189 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m39 -81 c17 -9 34 -14 37 -11 3 3 15 0 27 -6 13 -7 20 -8 16 -2 -3 6 -2 13 4 17 5 3 10 2 10 -4 0 -6 8 -8 18 -4 14 5 13 1 -5 -17 -20 -21 -25 -22 -61 -12 -21 6 -54 26 -73 44 -20 18 -28 28 -20 22 9 -7 30 -19 47 -27z m121 17 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m353 -48 c0 -2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z"/> + <path d="M703 1063 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M590 1019 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10 -5 -10 -11z"/> + <path d="M930 730 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"/> + <path d="M180 314 c0 -21 25 -62 33 -54 3 3 -4 21 -14 40 -14 26 -19 30 -19 14z"/> + <path d="M836 303 c-6 -14 -5 -15 5 -6 7 7 10 15 7 18 -3 3 -9 -2 -12 -12z"/> + <path d="M270 205 c13 -14 26 -25 28 -25 3 0 -5 11 -18 25 -13 14 -26 25 -28 25 -3 0 5 -11 18 -25z"/> + <path d="M765 155 c-16 -14 -36 -25 -43 -25 -7 0 -27 -7 -45 -16 -17 -9 -65 -20 -107 -24 -74 -7 -75 -7 -32 -15 24 -4 46 -14 49 -21 8 -22 37 -16 64 12 13 14 52 39 85 54 34 16 64 36 67 44 9 22 -3 19 -38 -9z"/> + <path d="M555 139 c-29 -13 -34 -19 -19 -19 12 0 32 9 45 20 29 24 25 24 -26 -1z"/> + </g> +<g id="layer124" fill="#fcb073" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -100 -101 -23 -38 -56 -76 -74 -87 -18 -11 -31 -23 -28 -26 3 -3 -15 -30 -39 -60 -42 -52 -45 -58 -39 -97 4 -22 11 -45 16 -51 5 -5 9 -20 9 -34 0 -45 17 -8 28 62 11 67 26 102 42 92 5 -3 17 10 29 27 30 49 113 126 144 134 16 3 25 9 22 12 -5 6 124 57 172 69 13 3 20 9 17 14 -3 5 1 9 8 9 8 0 22 14 31 30 10 17 24 30 30 30 7 0 30 10 52 22 22 12 50 21 63 20 29 -2 78 28 61 38 -7 5 3 12 25 20 54 17 54 7 2 -32 -25 -18 -45 -38 -46 -44 0 -5 -21 -20 -47 -33 -27 -12 -59 -30 -73 -38 -23 -16 -23 -17 -5 -24 17 -6 15 -8 -10 -8 -23 -1 -27 -4 -15 -11 8 -5 25 -10 36 -10 24 0 198 -83 226 -108 16 -13 18 -13 24 2 5 12 10 14 20 5 7 -6 22 -8 34 -4 25 8 25 -4 3 -44 -17 -30 -17 -32 0 -62 9 -17 17 -39 17 -50 0 -11 9 -37 20 -59 11 -22 20 -52 19 -67 0 -25 -2 -23 -16 15 -8 24 -16 42 -18 40 -8 -7 19 -98 29 -98 13 1 101 116 112 145 4 11 17 29 28 40 12 11 31 34 43 50 22 30 22 30 23 6 0 -15 -35 -76 -87 -153 -49 -71 -93 -137 -99 -148 -27 -49 -53 -81 -138 -169 -52 -52 -59 -77 -13 -40 41 31 33 3 -15 -54 -41 -48 -38 -54 7 -18 20 16 20 16 1 -6 -19 -23 -88 -63 -109 -63 -7 0 -33 -20 -59 -44 -38 -35 -57 -45 -96 -50 -44 -6 -53 -3 -92 25 -24 17 -59 36 -79 42 -20 5 -30 12 -23 14 19 7 3 23 -23 23 -27 0 -86 28 -155 73 -58 38 -71 55 -64 82 3 14 -4 35 -20 59 -38 57 -62 124 -48 138 7 7 12 23 12 36 0 20 -3 22 -14 13 -21 -17 -29 -63 -16 -95 7 -19 7 -33 0 -47 -9 -15 -7 -19 5 -19 19 0 70 -104 60 -121 -5 -7 -24 5 -51 32 -43 43 -45 45 -43 104 0 33 -4 80 -9 105 -6 26 -7 86 -4 142 l7 97 45 46 c24 25 40 45 34 45 -11 0 -63 -52 -86 -87 -12 -18 -14 -57 -12 -203 3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-303 -387 c9 -23 -2 -39 -39 -57 -36 -18 -47 -11 -20 12 11 9 13 16 5 24 -7 7 -3 14 12 23 30 16 35 16 42 -2z m-84 -25 c-8 -6 -24 -15 -35 -21 -16 -8 -15 -6 4 10 13 12 28 21 35 21 6 0 4 -5 -4 -10z m-320 -30 c-14 -4 -34 -8 -45 -9 -16 -1 -17 1 -5 9 8 5 29 9 45 9 29 -1 29 -1 5 -9z m290 -44 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m-630 -81 c-43 -44 -58 -51 -47 -21 5 13 72 64 87 65 2 1 -16 -19 -40 -44z m660 -204 c0 -6 -4 -13 -10 -16 -5 -3 -10 1 -10 9 0 9 5 16 10 16 6 0 10 -4 10 -9z m281 -63 c-22 -34 -41 -58 -41 -52 0 6 8 22 19 35 10 13 26 39 35 57 10 19 20 32 23 29 2 -3 -14 -34 -36 -69z m-214 -304 c-17 -25 -47 -62 -66 -82 -25 -27 -28 -29 -12 -7 12 17 33 48 47 70 23 34 51 65 61 65 1 0 -12 -21 -30 -46z m-820 -226 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m39 -81 c17 -9 34 -14 37 -11 3 3 15 0 27 -6 13 -7 20 -8 16 -2 -3 6 -2 13 4 17 5 3 10 2 10 -4 0 -6 8 -8 18 -4 14 5 13 1 -5 -17 -20 -21 -25 -22 -61 -12 -21 6 -54 26 -73 44 -20 18 -28 28 -20 22 9 -7 30 -19 47 -27z m121 17 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m353 -48 c0 -2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z"/> + <path d="M930 730 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"/> + <path d="M180 314 c0 -21 25 -62 33 -54 3 3 -4 21 -14 40 -14 26 -19 30 -19 14z"/> + <path d="M836 303 c-6 -14 -5 -15 5 -6 7 7 10 15 7 18 -3 3 -9 -2 -12 -12z"/> + <path d="M270 205 c13 -14 26 -25 28 -25 3 0 -5 11 -18 25 -13 14 -26 25 -28 25 -3 0 5 -11 18 -25z"/> + <path d="M765 155 c-16 -14 -36 -25 -43 -25 -7 0 -27 -7 -45 -16 -17 -9 -65 -20 -107 -24 -74 -7 -75 -7 -32 -15 24 -4 46 -14 49 -21 8 -22 37 -16 64 12 13 14 52 39 85 54 34 16 64 36 67 44 9 22 -3 19 -38 -9z"/> + <path d="M555 139 c-29 -13 -34 -19 -19 -19 12 0 32 9 45 20 29 24 25 24 -26 -1z"/> + </g> +<g id="layer125" fill="#ffc35e" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -32 -9 -46 -20 l-25 -20 24 0 c13 0 38 8 55 19 36 22 105 45 112 38 3 -3 -16 -21 -42 -41 -34 -26 -42 -36 -28 -37 10 0 -19 -19 -66 -41 l-85 -40 31 -16 c17 -9 30 -21 28 -27 -4 -12 154 -91 163 -81 3 3 11 -2 18 -11 11 -15 15 -14 46 7 19 13 28 17 22 10 -21 -23 -15 -32 17 -25 25 6 30 4 30 -13 0 -11 -7 -22 -15 -26 -20 -7 -19 -32 1 -40 8 -3 12 -2 9 4 -3 6 -1 10 4 10 14 0 14 -13 0 -43 -9 -19 -8 -30 5 -49 9 -13 18 -46 21 -73 9 -90 12 -92 62 -24 25 34 50 75 55 90 5 16 15 29 21 29 7 0 21 14 32 30 23 35 31 37 37 12 4 -12 -29 -70 -92 -164 -53 -80 -100 -157 -104 -171 -3 -15 -17 -34 -31 -43 -13 -8 -50 -46 -82 -82 -32 -37 -45 -57 -29 -44 38 29 44 21 17 -23 -24 -42 -26 -49 -8 -39 6 4 -1 -7 -17 -24 -17 -18 -34 -32 -40 -32 -6 0 -28 -17 -51 -38 -22 -20 -34 -30 -27 -22 13 16 16 30 5 30 -5 0 -29 -20 -55 -44 -38 -34 -57 -45 -96 -50 -44 -6 -52 -3 -98 29 -57 41 -97 45 -131 13 -20 -19 -27 -20 -61 -10 -21 7 -54 26 -73 44 -20 18 -28 28 -20 22 29 -21 78 -43 84 -38 3 3 15 1 26 -6 12 -6 21 -7 20 -3 -3 19 2 27 10 15 6 -10 10 -10 21 3 10 13 9 15 -8 15 -12 0 -25 6 -29 14 -13 23 -100 65 -111 54 -7 -7 -12 -3 -17 10 -3 12 -19 35 -34 51 -25 26 -30 28 -35 14 -6 -14 -15 -9 -52 28 -43 43 -45 45 -43 104 0 33 -4 80 -9 105 -6 26 -7 86 -4 142 l7 97 45 46 c24 25 49 45 55 45 5 -1 -2 -11 -17 -23 -15 -12 -39 -38 -53 -57 -21 -29 -25 -42 -19 -73 3 -21 12 -50 19 -64 15 -28 16 -27 35 60 8 37 23 60 70 109 33 33 60 69 60 79 0 22 73 60 159 85 34 9 66 23 72 30 10 12 8 13 -7 9 -10 -3 -5 1 11 9 17 8 37 15 46 16 8 0 29 16 46 35 17 19 41 35 52 35 12 0 21 4 21 9 0 12 -60 3 -115 -16 -22 -8 -35 -9 -30 -4 6 5 44 21 85 35 41 14 67 26 57 26 -10 0 -52 -11 -93 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 111 51 33 159 188 174 250 l7 30 -28 -25 c-31 -27 -16 -5 29 43 15 16 28 39 28 51 1 18 2 19 6 2 3 -10 -5 -31 -16 -47 -12 -16 -17 -29 -12 -29 15 0 41 42 41 66 0 19 15 45 86 154 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-299 -392 c8 -13 8 -20 1 -20 -5 0 -8 -4 -4 -9 3 -6 -10 -17 -29 -26 -18 -9 -44 -27 -57 -41 -36 -38 -56 -32 -53 17 2 49 7 54 70 79 61 24 57 24 72 0z m-643 -97 c-11 -3 -50 -32 -87 -65 -42 -36 -68 -54 -68 -44 0 8 11 23 25 33 14 10 45 33 68 50 23 18 51 32 62 32 l20 -1 -20 -5z m715 -7 c0 -15 -37 -32 -48 -22 -6 6 27 35 41 36 4 0 7 -6 7 -14z m-383 -23 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m153 -7 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m180 -83 c0 -13 -74 -83 -87 -83 -23 0 -14 15 18 29 17 7 35 24 41 37 10 22 28 33 28 17z m-285 -13 c3 -5 2 -10 -4 -10 -5 0 -13 5 -16 10 -3 6 -2 10 4 10 5 0 13 -4 16 -10z m473 -186 c-26 -47 -58 -90 -58 -79 0 11 73 126 77 121 2 -2 -6 -21 -19 -42z m-260 8 c6 -18 -15 -14 -22 4 -4 10 -1 14 6 12 6 -2 14 -10 16 -16z m225 -7 c-3 -9 -8 -14 -10 -11 -3 3 -2 9 2 15 9 16 15 13 8 -4z m-157 -282 c-70 -99 -86 -120 -116 -148 -23 -22 -29 -25 -24 -11 5 14 4 17 -5 11 -10 -6 -11 -3 -2 13 6 12 17 24 24 28 8 5 7 2 -2 -9 -8 -10 -11 -20 -8 -23 6 -7 67 74 67 89 0 11 82 94 89 90 2 -2 -8 -20 -23 -40z m-346 -387 c0 -2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z"/> + <path d="M983 1113 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M749 1113 c-6 -7 -7 -13 -2 -13 5 0 17 6 27 13 16 12 17 14 2 14 -9 0 -21 -6 -27 -14z"/> + <path d="M648 953 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/> + <path d="M254 848 c-4 -7 -3 -8 4 -4 12 7 16 16 8 16 -3 0 -8 -5 -12 -12z"/> + <path d="M94 519 c-21 -26 -26 -61 -13 -85 9 -18 10 -30 1 -48 -9 -20 -8 -25 5 -28 8 -2 25 -22 38 -46 38 -71 38 -21 -1 56 -37 75 -40 92 -23 109 6 6 9 21 7 33 -2 19 -5 21 -14 9z"/> + <path d="M190 291 c0 -6 4 -13 10 -16 6 -3 7 1 4 9 -7 18 -14 21 -14 7z"/> + <path d="M754 144 c-36 -25 -137 -56 -186 -57 -26 0 -45 -4 -42 -9 3 -4 16 -8 30 -8 14 0 27 -7 30 -15 9 -22 31 -18 62 11 15 14 53 39 85 55 31 16 57 31 57 34 0 9 -14 4 -36 -11z"/> + <path d="M550 135 c-14 -8 -20 -14 -15 -14 6 0 21 6 35 14 14 8 21 14 15 14 -5 0 -21 -6 -35 -14z"/> + </g> +<g id="layer126" fill="#fea492" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -32 -9 -46 -20 l-25 -20 26 0 c14 0 34 7 45 15 26 20 40 19 23 -2 -12 -14 -12 -16 1 -11 8 3 14 12 14 20 -1 15 92 56 102 45 3 -3 -17 -22 -46 -43 -30 -22 -47 -40 -41 -44 6 -3 -26 -23 -71 -44 l-83 -37 31 -17 c17 -9 30 -21 28 -27 -4 -12 154 -91 163 -81 3 3 11 -2 18 -11 11 -15 15 -14 46 7 19 13 28 17 22 10 -21 -23 -15 -32 17 -25 25 6 30 4 30 -13 0 -11 -7 -22 -15 -26 -24 -9 -19 -39 5 -31 23 7 25 -3 9 -38 -9 -19 -8 -30 5 -49 9 -13 18 -46 21 -73 9 -90 12 -92 62 -24 25 34 50 75 55 90 5 16 15 29 22 29 13 0 70 84 86 126 6 15 13 25 15 22 3 -3 -2 -21 -10 -41 -8 -20 -15 -47 -15 -60 0 -13 -10 -39 -23 -58 -13 -19 -57 -83 -98 -144 -42 -60 -79 -122 -82 -137 -4 -15 -18 -35 -32 -44 -13 -8 -50 -46 -82 -82 -32 -37 -45 -57 -29 -44 38 29 44 21 17 -23 -24 -42 -26 -49 -8 -39 6 4 -1 -7 -17 -24 -17 -18 -34 -32 -40 -32 -6 0 -28 -17 -51 -38 -22 -20 -34 -30 -27 -22 13 16 16 30 5 30 -5 0 -29 -20 -55 -44 -38 -34 -57 -45 -96 -50 -44 -6 -52 -3 -98 29 -57 41 -97 45 -131 13 -20 -19 -27 -20 -61 -10 -21 7 -54 26 -73 44 -20 18 -28 28 -20 22 29 -21 78 -43 84 -38 3 3 15 1 26 -6 12 -6 21 -7 20 -3 -3 19 2 27 10 15 6 -10 10 -10 21 3 10 13 9 15 -8 15 -12 0 -25 6 -29 14 -13 23 -100 65 -111 54 -7 -7 -12 -3 -17 10 -3 12 -19 35 -34 51 -25 26 -30 28 -35 14 -6 -14 -15 -9 -52 28 -43 43 -45 45 -43 104 0 33 -4 80 -9 105 -6 26 -7 86 -4 142 l7 97 45 46 c24 25 49 45 55 45 5 -1 -2 -11 -17 -23 -15 -12 -39 -38 -53 -57 -21 -29 -25 -42 -19 -73 3 -21 12 -50 19 -64 15 -28 16 -27 35 60 8 37 23 60 70 109 33 33 60 69 60 79 0 22 73 60 159 85 34 9 66 23 72 30 10 12 8 13 -7 9 -10 -3 -5 1 11 9 17 8 37 15 46 16 8 0 29 16 46 35 17 19 41 35 52 35 12 0 21 4 21 9 0 12 -60 3 -115 -16 -22 -8 -35 -9 -30 -4 6 5 44 21 85 35 41 14 67 26 57 26 -10 0 -52 -11 -93 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 111 51 33 159 188 174 250 l7 30 -28 -25 c-31 -27 -16 -5 29 43 15 16 28 39 28 51 1 18 2 19 6 2 3 -10 -5 -31 -16 -47 -12 -16 -17 -29 -12 -29 15 0 41 42 41 66 0 19 15 45 86 154 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-298 -386 c15 -17 -1 -56 -23 -56 -7 0 -31 -16 -53 -35 -23 -19 -47 -35 -54 -35 -7 0 -22 -8 -33 -17 -17 -16 -17 -14 3 12 14 19 21 40 19 60 -3 27 2 32 52 57 64 32 73 33 89 14z m-644 -103 c-11 -3 -50 -32 -87 -65 -42 -36 -68 -54 -68 -44 0 8 11 23 25 33 14 10 45 33 68 50 23 18 51 32 62 32 l20 -1 -20 -5z m715 -7 c0 -15 -37 -32 -48 -22 -6 6 27 35 41 36 4 0 7 -6 7 -14z m-383 -23 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m333 -90 c0 -13 -74 -83 -87 -83 -23 0 -14 15 18 29 17 7 35 24 41 37 10 22 28 33 28 17z m-285 -13 c3 -5 2 -10 -4 -10 -5 0 -13 5 -16 10 -3 6 -2 10 4 10 5 0 13 -4 16 -10z m505 -132 c-33 -64 -98 -157 -87 -126 3 10 27 48 52 86 25 38 45 76 45 84 0 17 11 30 18 23 3 -3 -10 -33 -28 -67z m-292 -46 c6 -18 -15 -14 -22 4 -4 10 -1 14 6 12 6 -2 14 -10 16 -16z m225 -7 c-3 -9 -8 -14 -10 -11 -3 3 -2 9 2 15 9 16 15 13 8 -4z m-157 -282 c-70 -99 -86 -120 -116 -148 -23 -22 -29 -25 -24 -11 5 14 4 17 -5 11 -10 -6 -11 -3 -2 13 6 12 17 24 24 28 8 5 7 2 -2 -9 -8 -10 -11 -20 -8 -23 6 -7 67 74 67 89 0 11 82 94 89 90 2 -2 -8 -20 -23 -40z m-346 -387 c0 -2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z"/> + <path d="M983 1113 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M648 953 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/> + <path d="M254 848 c-4 -7 -3 -8 4 -4 12 7 16 16 8 16 -3 0 -8 -5 -12 -12z"/> + <path d="M94 519 c-21 -26 -26 -61 -13 -85 9 -18 10 -30 1 -48 -9 -20 -8 -25 5 -28 8 -2 25 -22 38 -46 38 -71 38 -21 -1 56 -37 75 -40 92 -23 109 6 6 9 21 7 33 -2 19 -5 21 -14 9z"/> + <path d="M190 291 c0 -6 4 -13 10 -16 6 -3 7 1 4 9 -7 18 -14 21 -14 7z"/> + <path d="M754 144 c-36 -25 -137 -56 -186 -57 -26 0 -45 -4 -42 -9 3 -4 16 -8 30 -8 14 0 27 -7 30 -15 9 -22 31 -18 62 11 15 14 53 39 85 55 31 16 57 31 57 34 0 9 -14 4 -36 -11z"/> + <path d="M550 135 c-14 -8 -20 -14 -15 -14 6 0 21 6 35 14 14 8 21 14 15 14 -5 0 -21 -6 -35 -14z"/> + </g> +<g id="layer127" fill="#fcb688" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -32 -9 -46 -20 l-25 -20 26 0 c14 0 34 7 45 15 26 20 40 19 23 -2 -12 -14 -12 -16 1 -11 8 3 14 12 14 20 -1 15 92 56 102 45 3 -3 -17 -22 -46 -43 -30 -22 -47 -40 -41 -44 6 -3 -26 -23 -71 -44 l-83 -37 31 -17 c17 -9 30 -21 28 -27 -4 -12 154 -91 163 -81 3 3 11 -2 18 -11 11 -15 15 -14 46 7 19 13 28 17 22 10 -21 -23 -15 -32 17 -25 25 6 30 4 30 -13 0 -11 -7 -22 -15 -26 -8 -3 -15 -13 -15 -21 0 -12 6 -15 21 -10 19 6 21 4 15 -19 -5 -19 -3 -24 8 -20 21 8 29 -12 14 -38 -7 -13 -11 -27 -10 -31 1 -4 4 -29 7 -54 9 -88 12 -89 62 -22 25 34 50 75 55 90 5 16 15 29 22 29 13 0 70 84 86 126 6 15 13 25 15 22 3 -3 -2 -21 -10 -41 -8 -20 -15 -47 -15 -60 0 -13 -10 -39 -23 -58 -13 -19 -57 -83 -98 -144 -42 -60 -79 -122 -82 -137 -4 -15 -18 -35 -32 -44 -13 -8 -50 -46 -82 -82 -32 -37 -45 -57 -29 -44 38 29 44 21 17 -23 -26 -44 -26 -52 -3 -34 13 10 12 8 -3 -11 -28 -34 -58 -59 -71 -60 -13 0 -53 -42 -68 -71 -6 -13 -27 -29 -46 -36 -32 -12 -33 -12 -15 2 48 37 77 69 65 73 -6 2 -29 -14 -51 -37 -22 -22 -45 -41 -52 -41 -7 0 -4 -5 5 -10 11 -7 26 -7 43 0 41 15 133 90 202 163 34 37 80 77 101 91 54 34 162 187 177 251 l7 30 -28 -25 c-31 -27 -16 -5 29 43 15 16 28 39 28 51 1 18 2 19 6 2 3 -10 -5 -31 -16 -47 -12 -16 -17 -29 -12 -29 15 0 41 42 41 66 0 19 15 45 86 154 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-298 -386 c15 -17 -1 -56 -23 -56 -7 0 -31 -16 -53 -35 -23 -19 -47 -35 -54 -35 -7 0 -22 -8 -33 -17 -17 -16 -17 -14 3 12 14 19 21 40 19 60 -3 27 2 32 52 57 64 32 73 33 89 14z m71 -110 c0 -15 -37 -32 -48 -22 -6 6 27 35 41 36 4 0 7 -6 7 -14z m-383 -23 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m333 -90 c0 -13 -74 -83 -87 -83 -23 0 -14 15 18 29 17 7 35 24 41 37 10 22 28 33 28 17z m-285 -13 c3 -5 2 -10 -4 -10 -5 0 -13 5 -16 10 -3 6 -2 10 4 10 5 0 13 -4 16 -10z m505 -132 c-33 -64 -98 -157 -87 -126 3 10 27 48 52 86 25 38 45 76 45 84 0 17 11 30 18 23 3 -3 -10 -33 -28 -67z m-67 -53 c-3 -9 -8 -14 -10 -11 -3 3 -2 9 2 15 9 16 15 13 8 -4z m-157 -282 c-70 -99 -86 -120 -116 -148 -23 -22 -29 -25 -24 -11 5 14 4 17 -5 11 -10 -6 -11 -3 -2 13 6 12 17 24 24 28 8 5 7 2 -2 -9 -8 -10 -11 -20 -8 -23 6 -7 67 74 67 89 0 11 82 94 89 90 2 -2 -8 -20 -23 -40z"/> + <path d="M983 1113 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M545 1085 c-38 -13 -88 -24 -110 -25 -26 0 -61 -12 -100 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 10 -21 27 -44 37 -52 13 -10 12 -7 -4 14 -21 27 -22 57 -2 57 18 0 8 29 -20 59 -25 27 -29 29 -34 12 -2 -10 0 -27 6 -37 10 -18 0 -12 -59 42 -29 26 -54 94 -52 146 0 29 -1 111 -4 181 l-5 129 40 46 c44 52 95 87 79 55 -34 -67 -52 -118 -51 -146 l1 -32 9 37 c6 26 28 58 69 99 33 34 60 70 60 80 0 22 73 60 159 85 34 9 66 23 72 30 10 12 8 13 -7 9 -10 -3 -5 1 11 9 17 8 37 15 46 16 8 0 29 16 46 35 17 19 41 35 52 35 12 0 21 4 21 9 0 12 -60 3 -115 -16 -22 -8 -35 -9 -30 -4 6 5 44 21 85 35 41 14 66 25 55 25 -11 0 -51 -10 -90 -24z m-120 -42 c-11 -3 -55 -42 -97 -87 -76 -79 -77 -80 -71 -46 9 55 21 69 79 97 30 14 57 29 60 34 3 5 15 8 27 8 20 -1 21 -2 2 -6z m0 -53 c-3 -5 -12 -10 -18 -10 -7 0 -6 4 3 10 19 12 23 12 15 0z m-229 -168 c-16 -15 -25 -20 -21 -12 13 25 38 50 44 45 3 -3 -8 -18 -23 -33z"/> + <path d="M648 953 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/> + <path d="M254 848 c-4 -7 -3 -8 4 -4 12 7 16 16 8 16 -3 0 -8 -5 -12 -12z"/> + <path d="M970 721 c0 -6 4 -13 10 -16 6 -3 7 1 4 9 -7 18 -14 21 -14 7z"/> + <path d="M91 613 c-1 -6 -4 -20 -7 -30 -5 -17 -5 -17 6 0 6 10 9 23 6 30 -3 9 -5 9 -5 0z"/> + <path d="M91 516 c-10 -11 -12 -31 -8 -66 7 -60 61 -189 70 -167 3 9 -10 47 -29 85 -37 75 -40 92 -23 109 6 6 9 21 7 33 -3 21 -4 22 -17 6z"/> + <path d="M190 291 c0 -6 4 -13 10 -16 6 -3 7 1 4 9 -7 18 -14 21 -14 7z"/> + <path d="M240 170 c0 -11 49 -46 78 -54 40 -13 23 10 -28 36 -27 14 -50 22 -50 18z"/> + <path d="M720 129 c-30 -15 -74 -31 -97 -35 -44 -6 -44 -7 -15 -53 1 -3 15 7 30 21 15 14 55 40 90 57 34 17 62 33 62 36 0 8 -12 4 -70 -26z"/> + <path d="M550 135 c-14 -8 -20 -14 -15 -14 6 0 21 6 35 14 14 8 21 14 15 14 -5 0 -21 -6 -35 -14z"/> + <path d="M373 93 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M230 86 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21 13z"/> + <path d="M528 83 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"/> + <path d="M375 50 c-3 -5 -18 -10 -32 -10 -57 0 -11 -12 61 -15 42 -3 88 -7 103 -10 23 -4 -37 18 -109 41 -9 2 -19 0 -23 -6z"/> + <path d="M293 43 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M553 3 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/> + </g> +<g id="layer128" fill="#ffc879" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -21 -1 -56 -22 -56 -34 0 -3 16 1 36 9 47 19 60 19 43 -2 -12 -14 -12 -16 1 -11 8 3 14 12 14 20 -1 15 92 56 102 45 3 -3 -18 -23 -46 -43 -40 -28 -49 -39 -36 -43 16 -6 -25 -32 -109 -66 -38 -16 -39 -17 -18 -28 19 -8 27 -6 47 16 15 16 36 27 51 27 37 0 31 -14 -14 -35 -34 -15 -59 -41 -49 -50 7 -6 148 -75 153 -75 4 0 3 6 0 13 -3 6 2 2 11 -11 19 -25 34 -29 34 -7 0 8 6 15 13 15 6 0 23 13 37 30 19 23 29 27 40 20 12 -9 9 -15 -20 -40 -19 -16 -30 -30 -24 -30 6 0 17 7 24 14 8 10 18 12 33 7 12 -5 32 -5 45 0 27 10 29 19 2 14 -11 -2 -20 -1 -20 3 1 12 72 53 84 48 7 -3 7 -5 -1 -5 -7 -1 -13 -7 -13 -15 0 -14 -107 -116 -122 -116 -4 0 -8 -7 -8 -15 0 -8 6 -12 13 -10 6 3 23 -11 37 -30 27 -37 45 -44 54 -20 6 15 26 21 26 7 0 -4 -18 -31 -40 -61 -39 -52 -46 -73 -34 -105 5 -13 14 -7 40 26 19 24 41 58 50 77 9 19 37 55 62 80 25 25 51 61 59 80 8 18 16 31 19 29 2 -3 -3 -21 -11 -41 -8 -20 -15 -47 -15 -61 0 -13 -24 -59 -53 -103 -51 -75 -81 -147 -51 -123 10 9 11 6 7 -12 -5 -20 0 -18 35 16 40 38 79 124 68 151 -2 7 2 21 10 32 9 10 13 12 9 6 -3 -7 0 -13 7 -13 15 1 68 80 68 103 0 9 5 19 11 23 26 16 -42 -121 -92 -184 -10 -14 -19 -35 -19 -49 0 -13 -16 -42 -38 -66 -21 -23 -64 -78 -97 -122 -59 -80 -163 -187 -174 -181 -3 2 -15 -8 -25 -22 -17 -22 -17 -25 -3 -19 15 5 16 3 7 -13 -11 -21 -62 -60 -79 -60 -6 0 -27 -22 -46 -49 -22 -31 -48 -53 -68 -60 l-32 -11 26 20 c15 11 35 32 44 47 18 26 17 26 -23 -6 -23 -18 -42 -37 -42 -42 0 -5 -8 -9 -17 -9 -17 -1 -17 -1 -1 -10 11 -7 26 -7 43 0 41 15 133 90 202 163 34 37 80 77 102 91 21 14 54 47 72 73 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-298 -385 c13 -16 -7 -79 -24 -73 -14 5 -56 -18 -79 -43 -10 -11 -23 -18 -28 -15 -5 3 -19 -2 -31 -13 -22 -18 -22 -18 -6 2 22 29 23 75 1 75 -32 0 104 75 144 79 6 1 17 -5 23 -12z m76 -120 c8 -17 7 -26 -5 -38 -15 -14 -19 -12 -49 18 l-33 33 26 0 c14 0 26 4 26 10 0 16 24 1 35 -23z m-335 -117 c14 -11 22 -20 18 -20 -14 0 -58 23 -58 32 0 13 13 9 40 -12z m27 13 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z"/> + <path d="M618 1103 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/> + <path d="M525 1080 c-27 -11 -68 -20 -90 -20 -26 0 -60 -11 -100 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 10 -21 27 -44 37 -52 13 -10 12 -7 -4 14 -21 27 -22 57 -2 57 16 0 10 18 -17 50 -20 23 -29 28 -35 19 -4 -7 -3 -22 3 -33 11 -21 6 -18 -58 40 -29 26 -54 94 -52 146 0 29 -1 111 -4 181 l-5 129 40 46 c43 51 147 120 147 98 0 -17 -33 -46 -53 -46 -19 0 -67 -101 -66 -139 1 -24 2 -23 9 7 9 40 51 102 64 95 5 -3 6 -2 3 4 -3 5 7 19 23 31 20 15 34 39 45 79 9 32 22 69 29 83 16 35 120 89 171 90 33 0 140 32 154 46 10 10 -28 1 -74 -16z"/> + <path d="M540 1053 c-48 -18 -98 -44 -110 -58 -22 -27 -32 -16 -11 12 12 14 19 28 17 30 -12 12 -47 -14 -106 -79 -36 -40 -56 -68 -45 -64 11 4 52 17 90 28 68 19 113 42 64 32 -25 -4 42 31 74 40 9 2 17 11 17 20 0 8 12 22 28 30 26 15 14 21 -18 9z"/> + <path d="M92 508 c-7 -7 -12 -21 -12 -32 1 -18 3 -17 16 7 17 31 15 44 -4 25z"/> + <path d="M1069 487 c-14 -18 -29 -39 -34 -47 -15 -25 23 9 47 42 28 40 18 44 -13 5z"/> + <path d="M90 415 c0 -5 5 -17 10 -25 5 -8 10 -10 10 -5 0 6 -5 17 -10 25 -5 8 -10 11 -10 5z"/> + <path d="M910 308 c-30 -35 -42 -52 -27 -39 25 23 27 23 28 5 0 -16 2 -15 10 5 5 13 19 36 30 53 39 54 13 39 -41 -24z"/> + <path d="M120 343 c0 -6 8 -17 18 -24 16 -13 16 -13 2 6 -8 11 -16 22 -17 24 -2 2 -3 0 -3 -6z"/> + <path d="M250 159 c0 -12 59 -41 73 -36 7 2 -7 13 -30 25 -24 11 -43 16 -43 11z"/> + <path d="M763 143 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M665 105 c-16 -8 -40 -14 -53 -15 -20 0 -22 -4 -16 -22 10 -34 12 -34 47 -1 17 17 41 35 52 41 28 16 6 13 -30 -3z"/> + <path d="M230 86 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21 13z"/> + <path d="M375 50 c-3 -5 -18 -10 -32 -10 -57 0 -11 -12 61 -15 42 -3 88 -7 103 -10 23 -4 -37 18 -109 41 -9 2 -19 0 -23 -6z"/> + <path d="M293 43 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M553 3 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/> + </g> +<g id="layer129" fill="#fdcd8f" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -21 -1 -56 -22 -56 -33 0 -4 24 3 53 15 28 11 83 32 122 45 38 14 84 37 102 50 19 14 35 24 38 22 2 -3 -46 -38 -106 -79 -75 -50 -106 -76 -95 -80 16 -5 -26 -31 -109 -65 -38 -16 -39 -17 -18 -28 19 -8 27 -6 47 16 15 16 36 27 51 27 37 0 31 -14 -14 -35 -34 -15 -59 -41 -49 -50 7 -6 148 -75 153 -75 4 0 3 6 -1 13 -4 6 5 1 19 -12 22 -20 27 -22 27 -8 0 9 6 17 13 17 6 0 23 13 37 30 19 23 29 27 40 20 12 -9 9 -15 -20 -40 -19 -16 -30 -30 -24 -30 6 0 17 7 24 14 8 10 18 12 33 7 25 -9 47 -4 47 10 0 6 -4 7 -10 4 -5 -3 -10 -3 -10 2 1 19 100 67 100 49 0 -10 -107 -116 -117 -116 -17 0 -8 -56 14 -84 24 -29 38 -33 47 -11 6 15 26 21 26 7 0 -4 -18 -31 -40 -61 -39 -52 -46 -73 -34 -105 5 -13 14 -7 40 26 18 24 43 62 56 86 12 24 29 49 38 55 24 18 67 79 75 107 10 34 52 83 58 67 2 -6 7 9 11 34 6 39 13 51 45 73 21 15 43 38 50 53 6 14 14 23 18 20 7 -8 -30 -68 -58 -93 -30 -27 -55 -77 -40 -82 8 -3 8 -9 0 -24 -6 -11 -12 -30 -13 -42 -2 -11 -17 -36 -34 -55 -18 -18 -32 -37 -32 -42 0 -14 -63 -113 -77 -122 -14 -9 -47 -67 -38 -67 3 0 0 -10 -6 -23 -11 -20 -11 -21 4 -9 13 11 15 10 10 -10 -5 -20 0 -18 35 16 40 39 79 124 68 152 -3 7 5 25 16 41 35 46 41 50 24 16 -23 -45 -14 -41 19 8 15 23 22 38 16 35 -19 -12 -12 8 14 39 19 24 24 26 25 12 0 -22 -20 -63 -76 -150 -24 -37 -44 -77 -44 -88 0 -10 -17 -38 -38 -62 -21 -23 -64 -78 -97 -122 -59 -80 -163 -187 -174 -181 -3 2 -15 -8 -25 -22 -17 -22 -17 -25 -3 -19 15 5 16 3 7 -13 -11 -21 -62 -60 -79 -60 -6 0 -27 -22 -46 -49 -22 -31 -48 -53 -68 -60 l-32 -11 26 20 c15 11 35 32 44 47 18 26 17 26 -23 -6 -23 -18 -42 -37 -42 -42 0 -5 -8 -9 -17 -9 -17 -1 -17 -1 -1 -10 11 -7 26 -7 43 0 41 15 133 90 202 163 34 37 80 77 102 91 21 14 54 47 72 73 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-327 -296 c0 -2 -7 -7 -16 -10 -8 -3 -12 -2 -9 4 6 10 25 14 25 6z m40 -100 c0 -22 -25 -66 -35 -62 -5 2 -19 -1 -30 -7 -26 -13 -118 -88 -128 -104 -4 -7 -12 -13 -18 -13 -5 0 3 19 18 43 35 52 41 87 16 87 -24 0 34 38 102 66 50 20 75 17 75 -10z m180 -25 c-25 -20 -58 -49 -75 -66 -26 -25 -28 -30 -12 -33 10 -2 26 2 35 10 12 9 11 6 -3 -10 -13 -16 -26 -21 -42 -18 -13 4 -25 1 -30 -8 -6 -11 -15 -6 -41 20 l-34 34 26 0 c14 0 26 5 26 10 0 6 11 10 25 10 14 0 25 -5 25 -11 0 -8 5 -8 15 1 8 7 15 19 15 26 0 8 4 14 9 14 4 0 28 15 52 34 59 45 66 34 9 -13z m23 -126 c4 -8 2 -17 -3 -20 -6 -4 -10 3 -10 14 0 25 6 27 13 6z m-473 -75 c14 -11 22 -20 18 -20 -14 0 -58 23 -58 32 0 13 13 9 40 -12z m27 13 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m303 -343 c0 -5 -5 -10 -11 -10 -5 0 -7 5 -4 10 3 6 8 10 11 10 2 0 4 -4 4 -10z"/> + <path d="M618 1103 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"/> + <path d="M525 1080 c-27 -11 -68 -20 -90 -20 -26 0 -60 -11 -100 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 10 -21 27 -44 37 -52 13 -10 12 -7 -4 14 -21 27 -22 57 -2 57 16 0 10 18 -17 50 -20 23 -29 28 -35 19 -4 -7 -3 -22 3 -33 11 -21 6 -18 -58 40 -29 26 -54 94 -52 146 0 29 -1 111 -4 181 l-5 129 40 46 c43 51 147 120 147 98 0 -17 -33 -46 -53 -46 -19 0 -67 -101 -66 -139 1 -24 2 -23 9 7 9 40 51 102 64 95 5 -3 6 -2 3 4 -3 5 7 19 23 31 20 15 34 39 45 79 9 32 22 69 29 83 16 35 120 89 171 90 33 0 140 32 154 46 10 10 -28 1 -74 -16z"/> + <path d="M540 1053 c-48 -18 -98 -44 -110 -58 -22 -27 -32 -16 -11 12 12 14 19 28 17 30 -12 12 -47 -14 -106 -79 -36 -40 -56 -68 -45 -64 11 4 52 17 90 28 68 19 113 42 64 32 -25 -4 42 31 74 40 9 2 17 11 17 20 0 8 12 22 28 30 26 15 14 21 -18 9z"/> + <path d="M1250 829 c0 -18 2 -19 15 -9 8 7 15 16 15 21 0 5 -7 9 -15 9 -9 0 -15 -9 -15 -21z"/> + <path d="M960 800 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"/> + <path d="M92 508 c-7 -7 -12 -21 -12 -32 1 -18 3 -17 16 7 17 31 15 44 -4 25z"/> + <path d="M1069 487 c-14 -18 -29 -39 -34 -47 -15 -25 23 9 47 42 28 40 18 44 -13 5z"/> + <path d="M90 415 c0 -5 5 -17 10 -25 5 -8 10 -10 10 -5 0 6 -5 17 -10 25 -5 8 -10 11 -10 5z"/> + <path d="M910 308 c-30 -35 -42 -52 -27 -39 25 23 27 23 28 5 0 -16 2 -15 10 5 5 13 19 36 30 53 39 54 13 39 -41 -24z"/> + <path d="M120 343 c0 -6 8 -17 18 -24 16 -13 16 -13 2 6 -8 11 -16 22 -17 24 -2 2 -3 0 -3 -6z"/> + <path d="M250 159 c0 -12 59 -41 73 -36 7 2 -7 13 -30 25 -24 11 -43 16 -43 11z"/> + <path d="M763 143 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M665 105 c-16 -8 -40 -14 -53 -15 -20 0 -22 -4 -16 -22 10 -34 12 -34 47 -1 17 17 41 35 52 41 28 16 6 13 -30 -3z"/> + <path d="M230 86 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21 13z"/> + <path d="M375 50 c-3 -5 -18 -10 -32 -10 -57 0 -11 -12 61 -15 42 -3 88 -7 103 -10 23 -4 -37 18 -109 41 -9 2 -19 0 -23 -6z"/> + <path d="M293 43 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M553 3 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/> + </g> +<g id="layer130" fill="#fcddaa" stroke="none"> + <path d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -8 -41 -16 -19 -16 -19 -16 5 -9 43 12 204 75 220 85 37 24 92 51 96 47 3 -2 -45 -37 -106 -77 -60 -40 -110 -75 -110 -78 0 -2 11 -2 25 0 32 7 24 -6 -15 -22 -32 -13 -38 -25 -17 -33 15 -5 -28 -55 -58 -67 -18 -7 -15 -10 20 -25 22 -10 49 -22 60 -28 18 -9 18 -8 7 6 -11 13 -7 20 32 46 50 34 67 55 39 44 -15 -5 -14 -2 5 19 12 13 22 27 22 30 0 3 -10 9 -22 12 -22 6 -21 8 12 26 19 10 46 24 60 30 14 6 46 22 73 36 70 36 72 34 51 -46 -2 -10 9 -23 31 -34 30 -17 39 -17 59 -6 51 27 98 73 93 91 -3 11 2 19 13 22 16 4 29 -15 30 -44 0 -3 -29 -29 -65 -59 -36 -30 -65 -58 -65 -63 0 -6 8 -3 18 6 14 12 21 14 30 5 8 -8 -5 -24 -51 -62 -87 -72 -139 -126 -161 -167 -19 -36 -19 -36 1 -56 19 -19 20 -19 43 -1 13 10 29 17 36 14 7 -3 15 2 18 10 8 20 26 18 26 -3 0 -13 12 -6 41 25 31 33 40 49 35 66 -4 16 1 29 14 41 11 10 20 26 20 36 0 10 5 21 11 25 6 3 9 16 7 29 -4 16 -1 21 11 19 10 -2 28 14 47 44 17 26 38 46 45 45 17 -3 52 54 37 59 -6 2 1 15 16 28 14 14 26 30 26 37 0 6 4 14 10 18 14 9 -17 -88 -33 -100 -7 -5 -11 -17 -10 -25 2 -9 -15 -45 -37 -82 -22 -37 -40 -73 -40 -80 0 -7 -6 -25 -14 -39 -7 -14 -16 -38 -20 -53 -4 -16 -21 -46 -38 -67 -17 -22 -29 -41 -26 -44 3 -3 27 24 53 60 27 36 49 65 50 65 2 0 -1 -17 -6 -38 -8 -35 -47 -109 -92 -172 -9 -13 -17 -29 -17 -34 0 -5 14 13 32 40 17 27 41 65 54 84 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-192 -223 c-4 -5 -15 -9 -26 -9 -26 0 -17 15 10 17 12 1 19 -2 16 -8z m-56 -3 c-2 -2 -15 -9 -29 -16 -23 -12 -24 -12 -11 3 7 10 20 17 29 17 8 0 13 -2 11 -4z m-75 -41 c-10 -8 -23 -15 -28 -15 -6 0 -1 7 10 15 10 8 23 15 28 15 6 0 1 -7 -10 -15z m21 -26 c-4 -5 -12 -9 -19 -9 -7 0 -25 -9 -39 -20 -31 -24 -44 -26 -26 -3 31 36 104 65 84 32z m-5 -33 c0 -6 -75 -56 -85 -56 -4 0 10 13 31 29 36 27 54 36 54 27z m-136 -51 c-31 -29 -43 -33 -23 -7 17 20 31 32 42 32 4 0 -4 -11 -19 -25z m543 8 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z"/> + <path d="M613 1103 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M510 1075 c-36 -13 -58 -24 -50 -24 8 -1 44 10 80 24 36 13 58 24 50 24 -8 0 -44 -11 -80 -24z"/> + <path d="M335 1027 c-49 -28 -67 -45 -100 -100 -24 -39 -56 -76 -80 -92 -54 -36 -92 -73 -116 -112 -18 -28 -19 -39 -10 -90 l10 -58 -4 60 c-5 64 3 84 55 137 33 33 117 88 136 88 16 0 37 43 24 48 -10 4 15 55 37 74 27 24 95 60 128 69 27 6 28 7 5 8 -14 0 -52 -14 -85 -32z m-104 -140 c-10 -9 -11 -8 -5 6 3 10 9 15 12 12 3 -3 0 -11 -7 -18z"/> + <path d="M919 981 l-87 -79 25 -18 25 -19 46 45 c25 25 45 48 44 53 -1 4 2 7 7 7 5 0 11 -15 15 -32 4 -18 10 -28 14 -23 11 15 70 55 82 55 19 0 10 20 -15 32 -14 6 -25 17 -25 24 0 11 -29 34 -42 34 -2 0 -42 -36 -89 -79z"/> + <path d="M533 1043 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M345 968 c-39 -39 -61 -67 -50 -61 11 6 37 13 59 16 21 3 43 13 50 22 6 8 33 24 61 34 27 10 51 23 53 29 5 15 -58 -1 -91 -23 -38 -24 -43 -14 -12 24 52 61 0 31 -70 -41z"/> + <path d="M664 1005 c-10 -8 -14 -15 -8 -15 6 0 17 7 24 15 16 19 9 19 -16 0z"/> + <path d="M700 945 c0 -2 18 -14 41 -26 23 -11 38 -16 35 -10 -4 5 -20 17 -38 25 -34 17 -38 19 -38 11z"/> + <path d="M136 756 c-30 -52 -34 -69 -7 -35 25 32 44 70 38 75 -3 3 -16 -15 -31 -40z"/> + <path d="M1105 739 c-9 -14 -2 -20 14 -10 8 6 9 11 3 15 -6 3 -14 1 -17 -5z"/> + <path d="M1186 662 c-16 -31 -35 -69 -42 -84 -8 -14 -14 -34 -14 -44 0 -15 6 -13 31 13 36 36 71 125 61 153 -6 16 -12 9 -36 -38z m4 -26 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z"/> + <path d="M100 670 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"/> + <path d="M1031 626 c-13 -14 -20 -30 -16 -36 4 -7 16 1 31 21 13 18 24 34 24 36 0 10 -20 0 -39 -21z"/> + <path d="M1220 605 c0 -8 -19 -37 -42 -64 -24 -27 -61 -75 -83 -107 -22 -33 -73 -91 -112 -130 -40 -39 -73 -75 -73 -79 0 -20 -56 -78 -86 -91 -18 -8 -46 -33 -63 -58 -19 -27 -43 -48 -63 -55 l-33 -11 26 22 c46 41 58 65 17 34 -21 -16 -38 -32 -38 -37 0 -5 -8 -9 -17 -9 -17 -1 -17 -1 -1 -10 11 -7 26 -7 43 0 41 15 133 90 202 163 34 37 80 77 102 91 21 14 54 47 72 73 18 26 48 70 66 97 18 26 33 56 33 66 0 9 14 31 30 48 26 27 41 72 25 72 -3 0 -5 -7 -5 -15z m-180 -284 c-16 -31 -32 -36 -18 -7 6 14 15 26 20 26 5 0 4 -9 -2 -19z"/> + <path d="M27 455 c3 -140 19 -184 83 -235 22 -18 49 -49 60 -69 10 -21 27 -44 37 -52 13 -10 12 -7 -4 14 -21 27 -22 57 -2 57 16 0 10 18 -17 50 -20 23 -29 28 -35 19 -4 -7 -3 -22 3 -33 11 -21 6 -18 -58 40 -30 27 -56 97 -50 138 3 23 -1 75 -8 116 l-13 75 4 -120z"/> + <path d="M92 508 c-14 -14 -16 -42 -3 -34 7 5 23 46 17 46 -1 0 -7 -5 -14 -12z"/> + <path d="M910 307 l-25 -32 27 20 c15 11 29 26 32 33 10 22 -9 11 -34 -21z"/> + <path d="M623 89 c-24 -7 -30 -13 -26 -29 7 -27 15 -25 46 10 29 32 28 33 -20 19z"/> + <path d="M230 86 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21 13z"/> + <path d="M375 50 c-3 -5 -18 -10 -32 -10 -57 0 -11 -12 61 -15 42 -3 88 -7 103 -10 23 -4 -37 18 -109 41 -9 2 -19 0 -23 -6z"/> + <path d="M293 43 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"/> + <path d="M553 3 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"/> + </g> + +</svg> \ No newline at end of file diff --git a/public/fonts/LexendDeca-Light.ttf b/public/fonts/LexendDeca-Light.ttf new file mode 100644 index 0000000000000000000000000000000000000000..485a97f1a94aeccbaff07ef4ea7d79d88e305594 GIT binary patch literal 78200 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 literal 0 HcmV?d00001 diff --git a/public/fonts/LexendDeca-Regular.ttf b/public/fonts/LexendDeca-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..6b42154c37b4d1c34966502d609335b6be543566 GIT binary patch literal 67740 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�iv#t$%Ws<ma5n|E2Yn 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 literal 0 HcmV?d00001 diff --git a/public/fonts/LexendDeca-Regular.woff2 b/public/fonts/LexendDeca-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..ec78c7dd0f0f172f315190c92212ca951810b4d8 GIT binary patch literal 57576 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	W{v<fyU@MhaFK^VsKx?1XUuIy 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
lNc7T06yc9e^3N^dk1rG6 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 literal 0 HcmV?d00001 diff --git a/public/images/sample-visualization.gif b/public/images/sample-visualization.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e000992352af1c9476738fc0c7d871bcc751f2b GIT binary patch literal 52426 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 Ch#s&2 literal 0 HcmV?d00001 diff --git a/public/logo/automationhero.svg b/public/logo/automationhero.svg new file mode 100644 index 0000000..7366f13 --- /dev/null +++ b/public/logo/automationhero.svg @@ -0,0 +1,50 @@ +<svg version="1.1" id="Ebene_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + width="240" height="150" viewBox="0 0 120 75" style="enable-background:new 0 0 120 75;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:#FFFFFF;} +</style> +<g> + <g> + <rect x="5" y="20" class="st0" width="110" height="50"/> + <g> + <path d="M44.39,54.29c-1.21,0-2.34,0.88-2.34,2.62c0,1.72,1.12,2.62,2.34,2.62c1.21,0,2.34-0.88,2.34-2.62 + C46.72,55.17,45.6,54.29,44.39,54.29z"/> + <path d="M44.39,33.24c-1.21,0-2.34,0.88-2.34,2.62c0,1.72,1.12,2.62,2.34,2.62c1.21,0,2.34-0.88,2.34-2.62 + C46.73,34.12,45.61,33.24,44.39,33.24z"/> + <path d="M15.53,37.8c0,0.54,0.39,1.06,1.2,1.06c1.05,0,2.02-0.5,2.02-2.13v-0.41l-2.07,0.32C16.03,36.73,15.53,37.09,15.53,37.8z + "/> + <path d="M68.61,37.8c0,0.54,0.39,1.06,1.2,1.06c1.05,0,2.02-0.5,2.02-2.13v-0.41l-2.07,0.32C69.12,36.73,68.61,37.09,68.61,37.8z + "/> + <path d="M27.47,54.05c-1.28,0-1.98,0.97-2.04,1.81h4.07C29.47,54.94,28.88,54.05,27.47,54.05z"/> + <path d="M91.62,33.24c-1.21,0-2.34,0.88-2.34,2.62c0,1.72,1.12,2.62,2.34,2.62c1.21,0,2.34-0.88,2.34-2.62 + C93.96,34.12,92.84,33.24,91.62,33.24z"/> + <path d="M0,0v75h120V0H0z M17.19,32.98c-1.08,0-1.68,0.69-1.76,1.49l-2.2-0.47c0.15-1.44,1.48-3.03,3.94-3.03 + c2.91,0,4,1.64,4,3.49V39c0,0.49,0.06,1.14,0.11,1.46H19c-0.06-0.24-0.09-0.75-0.09-1.1c-0.47,0.73-1.35,1.36-2.71,1.36 + c-1.96,0-3.16-1.33-3.16-2.77c0-1.64,1.21-2.56,2.75-2.78l2.26-0.34c0.52-0.07,0.69-0.34,0.69-0.65 + C18.74,33.52,18.24,32.98,17.19,32.98z M21.51,61.5h-2.44v-5.36c0-1.03-0.49-1.83-1.67-1.83c-1.03,0-1.63,0.79-1.68,1.79v5.4 + h-2.44V47.97h2.44v5.1c0.59-0.71,1.57-1.01,2.44-1.01c2.29,0,3.35,1.63,3.35,3.64V61.5z M22.88,31.26h2.48v5.31 + c0,1.03,0.52,1.85,1.68,1.85c1.1,0,1.74-0.75,1.74-1.81v-5.34h2.49v7.53c0,0.71,0.06,1.35,0.09,1.66h-2.37 + c-0.04-0.19-0.07-0.62-0.07-0.99c-0.5,0.86-1.57,1.23-2.54,1.23c-2.22,0-3.49-1.63-3.49-3.62V31.26z M31.89,57.56h-6.51 + c0.06,1.21,1.07,2.09,2.29,2.09c1.15,0,1.78-0.58,2.07-1.4l2.05,0.62c-0.46,1.59-1.91,2.92-4.14,2.92c-2.5,0-4.7-1.81-4.7-4.91 + c0-2.93,2.15-4.84,4.48-4.84c2.81,0,4.5,1.81,4.5,4.76C31.93,57.15,31.89,57.52,31.89,57.56z M32.6,31.26h0.47 + c0.97,0,1.42-0.64,1.42-1.46v-1.29h2.24v2.75h1.85v2.2h-1.85v3.85c0,0.8,0.37,1.06,1.08,1.06c0.3,0,0.64-0.04,0.77-0.07v2.06 + c-0.22,0.09-0.67,0.22-1.4,0.22c-1.79,0-2.92-1.07-2.92-2.84v-4.28H32.6V31.26z M38.91,54.78c-0.28-0.06-0.52-0.07-0.74-0.07 + c-1.26,0-2.35,0.62-2.35,2.6v4.2h-2.46v-9.19h2.39v1.36c0.56-1.21,1.81-1.44,2.59-1.44c0.2,0,0.39,0.02,0.57,0.04V54.78z + M44.39,61.78c-2.75,0-4.82-2.06-4.82-4.88c0-2.84,2.07-4.88,4.82-4.88s4.82,2.04,4.82,4.88C49.21,59.73,47.14,61.78,44.39,61.78 + z M44.39,40.73c-2.75,0-4.82-2.06-4.82-4.88c0-2.84,2.07-4.88,4.82-4.88s4.82,2.04,4.82,4.88 + C49.21,38.68,47.14,40.73,44.39,40.73z M58.96,63.54h-8.3V61.5h8.3V63.54z M64.7,40.45h-2.41V35c0-0.99-0.49-1.74-1.63-1.74 + c-1.06,0-1.7,0.82-1.7,1.81v5.38h-2.47V35c0-0.99-0.5-1.74-1.63-1.74c-1.08,0-1.72,0.8-1.72,1.81v5.38h-2.48v-9.19h2.37v1.12 + c0.5-0.9,1.68-1.38,2.69-1.38c1.25,0,2.26,0.54,2.73,1.53c0.73-1.12,1.7-1.53,2.91-1.53c1.7,0,3.33,1.03,3.33,3.49V40.45z + M72.09,40.45c-0.06-0.24-0.09-0.75-0.09-1.1c-0.47,0.73-1.35,1.36-2.71,1.36c-1.96,0-3.16-1.33-3.16-2.77 + c0-1.64,1.21-2.56,2.75-2.78l2.26-0.34c0.52-0.07,0.69-0.34,0.69-0.65c0-0.65-0.5-1.2-1.55-1.2c-1.08,0-1.68,0.69-1.76,1.49 + l-2.2-0.47c0.15-1.44,1.48-3.03,3.94-3.03c2.91,0,4,1.64,4,3.49V39c0,0.49,0.06,1.14,0.11,1.46H72.09z M81.29,33.46h-1.85v3.85 + c0,0.8,0.37,1.06,1.08,1.06c0.3,0,0.64-0.04,0.77-0.07v2.06c-0.22,0.09-0.67,0.22-1.4,0.22c-1.79,0-2.92-1.07-2.92-2.84v-4.28 + h-1.66v-2.2h0.47c0.97,0,1.42-0.64,1.42-1.46v-1.29h2.24v2.75h1.85V33.46z M85.35,40.45h-2.48v-9.19h2.48V40.45z M84.1,29.77 + c-0.84,0-1.53-0.69-1.53-1.51c0-0.86,0.69-1.55,1.53-1.55c0.86,0,1.53,0.69,1.53,1.55C85.63,29.07,84.96,29.77,84.1,29.77z + M91.62,40.73c-2.75,0-4.82-2.06-4.82-4.88c0-2.84,2.07-4.88,4.82-4.88s4.82,2.04,4.82,4.88C96.44,38.68,94.37,40.73,91.62,40.73 + z M106.3,40.45h-2.48v-5.36c0-1.03-0.5-1.83-1.7-1.83c-1.08,0-1.72,0.84-1.72,1.91v5.29h-2.48v-9.19h2.41v1.14 + c0.56-0.95,1.66-1.38,2.65-1.38c2.28,0,3.33,1.63,3.33,3.64V40.45z"/> + </g> + </g> +</g> +</svg> diff --git a/public/logo/aviasales.dark.svg b/public/logo/aviasales.dark.svg new file mode 100644 index 0000000..8ede2e8 --- /dev/null +++ b/public/logo/aviasales.dark.svg @@ -0,0 +1 @@ +<svg width="630" height="320" viewBox="0 0 630 320" fill="none" xmlns="http://www.w3.org/2000/svg"><path d="M308.353 131c-.747 0-1.353.606-1.353 1.353v.696l.002.033c.14 2.816 2.265 5.636 5.88 5.914l.051.004h.714a1.353 1.353 0 000-2.706h-.606c-2.078-.182-3.242-1.744-3.335-3.316v-.625c0-.747-.606-1.353-1.353-1.353z" fill="#fff"/><path fill-rule="evenodd" clip-rule="evenodd" d="M312.063 109.139c-6.993.307-12.399 6.048-12.75 13.039-.176 3.506-.313 6.641-.313 9.555 0 2.719.119 5.44.278 8.568.354 6.956 5.751 12.645 12.709 12.957 1.054.047 2.075.075 3.013.075a68.9 68.9 0 003.112-.08c6.913-.317 12.29-5.938 12.631-12.85.148-3.009.257-5.698.257-8.67 0-3.319-.121-6.381-.282-9.688-.337-6.933-5.718-12.586-12.652-12.901a69.667 69.667 0 00-3.066-.077c-.915 0-1.91.026-2.937.072zm-8.861 13.84c.265-5.328 4.311-9.68 9.523-9.92A49.67 49.67 0 01315 113c.743 0 1.557.024 2.394.064 5.157.246 9.177 4.517 9.426 9.791.024.502.046.931.067 1.319.068 1.316.113 2.179.113 3.967 0 1.764-.049 2.768-.123 4.278-.012.243-.024.499-.037.773-.25 5.253-4.265 9.493-9.402 9.742-.853.041-1.682.066-2.438.066-.729 0-1.525-.023-2.345-.062-5.18-.244-9.217-4.547-9.48-9.843-.018-.346-.034-.663-.049-.959v-.002c-.076-1.458-.126-2.431-.126-3.993 0-1.5.046-2.324.117-3.575.025-.455.054-.966.085-1.587z" fill="#fff"/><path fill-rule="evenodd" clip-rule="evenodd" d="M297.835 93h34.33c7.535 0 9.483.782 11.365 1.788a11.192 11.192 0 014.682 4.683c1.006 1.881 1.788 3.829 1.788 11.364v1.186c0 .546-.437.99-.983 1.013-.167.007-.337.016-.508.025-4.56.24-8.1 4.592-8.332 9.92-.027.617-.052 1.126-.074 1.578l-.001.006v.003c-.061 1.251-.102 2.075-.102 3.575 0 1.562.044 2.535.11 3.993.013.297.028.614.043.961.23 5.296 3.763 9.599 8.295 9.843.191.011.382.02.569.028.546.023.983.467.983 1.013v1.186c0 7.535-.782 9.483-1.788 11.365a11.197 11.197 0 01-4.682 4.682c-1.882 1.006-3.83 1.788-11.365 1.788h-34.33c-7.535 0-9.483-.782-11.365-1.788a11.197 11.197 0 01-4.682-4.682c-1.006-1.882-1.788-3.83-1.788-11.365v-1.186c0-.546.437-.99.983-1.013.214-.009.431-.02.65-.032 4.495-.249 8.008-4.489 8.227-9.742.011-.27.022-.522.032-.761l.001-.012c.064-1.51.107-2.514.107-4.278 0-1.788-.039-2.651-.099-3.968a286.75 286.75 0 01-.058-1.318c-.219-5.274-3.735-9.545-8.248-9.791-.206-.011-.41-.021-.612-.03a1.02 1.02 0 01-.983-1.013v-1.186c0-7.535.782-9.483 1.788-11.364a11.192 11.192 0 014.682-4.683C288.352 93.782 290.3 93 297.835 93zm14.076 12.675c-8.903.392-15.625 7.678-16.06 16.329-.176 3.506-.318 6.719-.318 9.729 0 2.814.124 5.612.283 8.744.439 8.629 7.164 15.847 16.016 16.244 1.089.049 2.165.079 3.168.079 1.035 0 2.146-.032 3.271-.084 8.787-.403 15.51-7.536 15.934-16.142.149-3.026.262-5.782.262-8.841 0-3.404-.125-6.532-.287-9.856-.419-8.62-7.138-15.796-15.957-16.196A72.503 72.503 0 00315 105.6c-.979 0-2.027.028-3.089.075z" fill="#fff"/><path d="M365.412 186h5.86v41.095h-5.86V186zM261.72 186.238h-6.326v6.233h6.326v-6.233zM318.893 210.103c2.771.475 4.894 1.307 6.307 2.605 1.44 1.38 2.16 3.236 2.169 5.603 0 1.454-.301 2.788-.784 3.995v.018c-.556 1.243-1.421 2.221-2.57 3.071-1.148.85-2.597 1.508-4.384 1.929-1.795.484-3.992.658-6.507.658-1.942 0-3.783-.183-5.441-.54-1.668-.365-3.172-.959-4.439-1.809a9.247 9.247 0 01-3.154-3.346c-.793-1.343-1.266-3.034-1.449-5.064l-.036-.393h5.806l.027.33c.118 1.188.401 2.111.875 2.806l.009.009c.483.758 1.139 1.307 1.914 1.755.775.448 1.613.722 2.625.895 1.021.174 2.105.229 3.263.229 1.741 0 3.108-.119 4.247-.347 1.085-.229 1.923-.512 2.57-.896.638-.366 1.057-.841 1.313-1.353a5.202 5.202 0 00.373-1.901c0-1.051-.41-1.746-1.112-2.203-.765-.494-1.759-.832-3.016-1.06h-.01l-9.15-1.463c-2.552-.411-4.612-1.252-6.079-2.605-1.486-1.371-2.215-3.299-2.215-5.712 0-1.216.237-2.432.729-3.538.501-1.124 1.303-2.047 2.388-2.888 1.103-.859 2.488-1.463 4.147-1.938 1.677-.475 3.636-.713 5.933-.713 1.832 0 3.555.174 5.214.53 1.613.357 3.053.96 4.256 1.746l.009.009a10.411 10.411 0 013.026 3.273c.793 1.343 1.267 3.043 1.504 4.999l.045.412h-5.878l-.037-.329c-.109-1.116-.437-1.993-.875-2.706a5.924 5.924 0 00-1.804-1.7c-.775-.439-1.604-.713-2.498-.887-.993-.119-1.959-.228-2.98-.228-1.559 0-2.807.109-3.764.338-1.03.228-1.805.512-2.343.832-.519.311-.874.722-1.075 1.179a3.95 3.95 0 00-.319 1.609c0 1.142.365 1.882 1.103 2.321h.009l.009.009c.811.54 1.914.887 3.354 1.116l8.695 1.343zM226.566 197.115l9.698 21.58 9.305-21.58h6.362l-14.036 29.98h-3.363l-14.391-29.98h6.425z" fill="#fff"/><path fill-rule="evenodd" clip-rule="evenodd" d="M345.98 196.237c4.184 0 7.538.823 9.953 2.523 2.461 1.727 3.719 4.607 3.737 8.427v19.936h-5.86v-4.836c-.976 1.947-2.461 3.4-4.439 4.333-2.042.96-4.32 1.38-6.808 1.38-1.641 0-3.136-.119-4.521-.484-1.376-.357-2.588-.905-3.573-1.701-1.048-.74-1.841-1.782-2.388-2.998-.619-1.243-.856-2.769-.856-4.488 0-1.023.118-2.12.483-3.217a7.315 7.315 0 011.959-3.071c.921-.932 2.197-1.655 3.801-2.249h.009c1.622-.548 3.709-.841 6.243-.841.583 0 1.13.01 1.641.028h.082c.483.018.929.027 1.367.027.474 0 .92.009 1.34.028h.036c.143.003.284.007.422.011.257.008.508.016.763.016h.036c.757.064 1.504.119 2.243.119h.036l.226.016c.589.042 1.21.086 1.888.094v-2.084c0-2.157-.619-3.602-1.777-4.443-1.194-.868-3.135-1.389-6.024-1.389-1.258 0-2.406.11-3.327.229-.948.164-1.713.447-2.361.877-.647.43-1.13.969-1.513 1.682l-.018.018c-.437.704-.711 1.591-.884 2.733l-.045.311h-5.688l.046-.411c.237-1.966.711-3.647 1.44-4.991.72-1.335 1.631-2.422 2.789-3.281l.009-.01c1.148-.795 2.534-1.398 4.147-1.755 1.549-.365 3.381-.539 5.386-.539zm-7.282 25.612c1.139.658 2.981 1.005 5.533 1.005 1.157 0 2.251-.055 3.399-.256a10.346 10.346 0 003.044-.96c.866-.429 1.577-1.087 2.133-1.919.529-.805.875-1.901.984-3.263v-2.669c-1.503-.055-2.944-.11-4.247-.165a71.68 71.68 0 01-2.014-.027h-.082c-.218-.003-.43-.008-.639-.012-.378-.008-.744-.016-1.102-.016-1.96 0-3.564.174-4.703.403-1.148.292-2.014.63-2.534 1.042l-.018.018c-.592.42-.948.941-1.094 1.444l-.018.037c-.209.521-.264 1.115-.264 1.736 0 1.856.556 2.989 1.622 3.602z" fill="#fff"/><path d="M261.492 197.115h-5.861v29.98h5.861v-29.98zM436.84 212.708c-1.413-1.298-3.536-2.13-6.307-2.605l-8.695-1.343c-1.44-.229-2.543-.576-3.354-1.116l-.009-.009h-.009c-.739-.439-1.103-1.179-1.103-2.321 0-.595.109-1.134.319-1.609.2-.457.556-.868 1.075-1.179.538-.32 1.313-.604 2.343-.832.957-.229 2.205-.338 3.764-.338 1.021 0 1.987.109 2.98.228.893.174 1.723.448 2.498.887.71.439 1.312.987 1.804 1.7.438.713.766 1.59.875 2.706l.037.329h5.878l-.045-.412c-.237-1.956-.711-3.656-1.504-4.999a10.411 10.411 0 00-3.026-3.273l-.009-.009c-1.203-.786-2.643-1.389-4.257-1.746a24.678 24.678 0 00-5.213-.53c-2.297 0-4.256.238-5.933.713-1.659.475-3.044 1.079-4.147 1.938-1.085.841-1.887 1.764-2.388 2.888a8.723 8.723 0 00-.729 3.538c0 2.413.729 4.341 2.214 5.712 1.468 1.353 3.528 2.194 6.08 2.605l9.15 1.463h.009c1.258.228 2.252.566 3.017 1.06.702.457 1.112 1.152 1.112 2.203 0 .704-.155 1.353-.374 1.901-.255.512-.674.987-1.312 1.353-.647.384-1.486.667-2.57.896-1.139.228-2.507.347-4.247.347-1.158 0-2.242-.055-3.263-.229-1.012-.173-1.85-.447-2.625-.895-.775-.448-1.431-.997-1.914-1.755l-.018-.009c-.474-.695-.757-1.618-.875-2.806l-.028-.33h-5.805l.036.393c.182 2.03.656 3.721 1.449 5.064a9.14 9.14 0 003.154 3.336c1.267.851 2.77 1.445 4.438 1.81 1.659.357 3.5.54 5.442.54 2.515 0 4.712-.174 6.507-.659 1.786-.42 3.236-1.078 4.384-1.928 1.148-.85 2.014-1.828 2.57-3.071v-.019c.483-1.206.784-2.541.784-3.994 0-2.358-.729-4.214-2.16-5.594z" fill="#fff"/><path fill-rule="evenodd" clip-rule="evenodd" d="M399.973 220.359c.483-.649.811-1.463 1.039-2.541l.064-.311h5.796l-.063.42c-.292 1.847-.83 3.419-1.686 4.708-.839 1.334-1.869 2.367-3.145 3.153-1.267.786-2.707 1.325-4.311 1.682-1.668.356-3.445.475-5.386.475-2.416 0-4.548-.228-6.453-.768-1.914-.475-3.6-1.38-4.931-2.596-1.331-1.224-2.352-2.86-3.072-4.89-.72-1.983-1.075-4.478-1.075-7.431 0-3.016.346-5.575 1.066-7.614.711-2.029 1.732-3.72 3.063-4.999l.009-.01c1.321-1.206 2.953-2.111 4.867-2.65h.009a26.179 26.179 0 016.389-.768c4.493 0 8.084 1.133 10.737 3.428 2.606 2.321 3.91 5.822 3.91 10.456v4.287h-24.199c.037 1.682.31 3.08.729 4.122.447 1.115 1.112 2.002 1.933 2.66.82.667 1.813 1.115 2.989 1.335 1.203.228 2.525.347 4.019.347 1.158 0 2.188-.055 3.209-.229h.018a7.604 7.604 0 002.561-.786l.009-.009h.009c.748-.32 1.34-.804 1.896-1.471zm-4.229-18.601c-1.085-.229-2.288-.402-3.591-.402-1.385 0-2.579.119-3.719.356a7.339 7.339 0 00-2.943 1.28c-.821.603-1.486 1.435-1.987 2.55-.465 1.033-.748 2.322-.83 3.985h18.201c-.027-1.554-.255-2.797-.665-3.83-.447-1.124-1.003-1.946-1.759-2.605-.766-.612-1.65-1.051-2.707-1.334zM290.994 198.76c-2.415-1.7-5.769-2.523-9.952-2.523-2.005 0-3.837.174-5.387.539-1.613.357-2.998.96-4.147 1.755l-.009.01c-1.157.859-2.069 1.946-2.789 3.281-.729 1.344-1.203 3.025-1.44 4.991l-.045.411h5.687l.045-.311c.174-1.142.456-2.029.885-2.733l.018-.018a4.497 4.497 0 011.513-1.682c.647-.43 1.403-.713 2.36-.877a26.017 26.017 0 013.327-.229c2.889 0 4.831.521 6.024 1.389 1.158.841 1.778 2.286 1.778 4.443v2.084a31.002 31.002 0 01-1.888-.094l-.227-.016h-.036a26.7 26.7 0 01-2.242-.119h-.037c-.255 0-.506-.008-.763-.016a51.38 51.38 0 00-.422-.011h-.036a29.7 29.7 0 00-1.34-.028c-.437 0-.884-.009-1.367-.027h-.082a46.57 46.57 0 00-1.641-.028c-2.533 0-4.62.293-6.243.841h-.009c-1.604.594-2.88 1.317-3.801 2.249a7.315 7.315 0 00-1.959 3.071c-.365 1.097-.483 2.194-.483 3.217 0 1.719.237 3.245.847 4.488.547 1.216 1.34 2.258 2.388 2.998.985.796 2.197 1.344 3.573 1.701 1.386.365 2.88.484 4.521.484 2.488 0 4.767-.42 6.808-1.38 1.978-.933 3.464-2.386 4.439-4.333v4.836h5.86v-19.936c-.009-3.82-1.267-6.7-3.728-8.427zm-17.49 16.27l.009-.009c.52-.412 1.377-.75 2.534-1.042 1.139-.229 2.744-.403 4.703-.403.358 0 .724.008 1.102.016.209.004.422.009.639.012h.082a71.68 71.68 0 002.014.027c1.304.055 2.744.11 4.247.165v2.669c-.109 1.362-.455 2.459-.984 3.263-.556.832-1.267 1.49-2.133 1.919-.902.448-1.914.787-3.044.96-1.148.174-2.233.229-3.39.229-2.552 0-4.393-.348-5.533-1.006-1.066-.612-1.622-1.746-1.622-3.601 0-.622.055-1.216.264-1.737l.019-.036c.155-.476.51-.997 1.093-1.426zM204.774 196.237c4.184 0 7.538.823 9.953 2.523 2.452 1.727 3.709 4.607 3.709 8.427v19.908h-5.86v-4.835c-.975 1.947-2.452 3.4-4.439 4.332-2.041.96-4.32 1.381-6.808 1.381-1.641 0-3.135-.119-4.521-.485-1.376-.356-2.588-.905-3.572-1.7-1.049-.74-1.842-1.782-2.388-2.998-.611-1.243-.848-2.77-.848-4.488 0-1.024.118-2.111.483-3.208a7.318 7.318 0 011.96-3.071c.92-.933 2.196-1.655 3.8-2.249h.009c1.623-.548 3.71-.841 6.244-.841.583 0 1.13.009 1.64.028h.082c.483.018.93.027 1.367.027.474 0 .921.009 1.34.027h.037c.143.004.283.008.421.012.258.008.509.016.763.016h.037c.765.064 1.513.119 2.251.119h.037c.074.005.15.01.226.016.589.041 1.21.085 1.888.093v-2.084c0-2.157-.62-3.601-1.777-4.442-1.194-.868-3.136-1.389-6.025-1.389-1.258 0-2.406.109-3.326.228-.957.165-1.714.448-2.361.878a4.49 4.49 0 00-1.513 1.682l-.018.018c-.429.704-.711 1.59-.884 2.733l-.046.311h-5.687l.045-.403c.237-1.965.711-3.647 1.44-4.99.721-1.335 1.632-2.422 2.789-3.282l.01-.009c1.148-.786 2.533-1.389 4.156-1.746 1.549-.365 3.381-.539 5.386-.539zm-7.537 18.784l-.009.009c-.584.429-.939.95-1.094 1.426l-.018.036c-.21.521-.265 1.115-.265 1.737 0 1.855.556 2.989 1.623 3.601 1.139.658 2.98 1.006 5.532 1.006 1.157 0 2.242-.055 3.39-.229a10.323 10.323 0 003.045-.96c.865-.429 1.585-1.087 2.132-1.919.529-.804.866-1.901.985-3.263v-2.669c-1.504-.055-2.953-.11-4.248-.165-.701 0-1.376-.009-2.014-.027h-.082c-.217-.003-.43-.008-.639-.012-.378-.008-.744-.016-1.102-.016-1.959 0-3.563.174-4.703.403-1.157.292-2.014.63-2.533 1.042z" fill="#fff"/></svg> \ No newline at end of file diff --git a/public/logo/aviasales.png b/public/logo/aviasales.png new file mode 100644 index 0000000000000000000000000000000000000000..611f7de8e24e541eddb76f72efb678fd7d402109 GIT binary patch literal 12445 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 VUh-gkublteLTed<Z#C{k|1UG$s<8k7 literal 0 HcmV?d00001 diff --git a/public/logo/avito.svg b/public/logo/avito.svg new file mode 100644 index 0000000..1913267 --- /dev/null +++ b/public/logo/avito.svg @@ -0,0 +1,38 @@ +<svg version="1.1" id="layer" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" + y="0px" width="652" height="652" viewBox="0 0 652 652" style="enable-background:new 0 0 652 652;" xml:space="preserve"> + <style type="text/css"> + [data-logo="avito_st0"] { + fill: #97CF26; + } + + [data-logo="avito_st1"] { + fill: #A169F7; + } + + [data-logo="avito_st2"] { + fill: #FF6163; + } + + [data-logo="avito_st3"] { + fill: #00AAFF; + } + </style> + <g transform="translate(14 14)"> + <circle data-logo="avito_st0" cx="136.8" cy="351.5" r="45.9" /> + <circle data-logo="avito_st1" cx="50.6" cy="351.5" r="21.3" /> + <circle data-logo="avito_st2" cx="136.8" cy="265.3" r="29.5" /> + <circle data-logo="avito_st3" cx="50.6" cy="265.3" r="37.7" /> + <path + d="M301.8,372.6h23.8l-44.1-120h-17.3l-44.1,120H244l8.4-22.9h41L301.8,372.6l-42.8-41l13.9-37.7l13.9,37.7H259L301.8,372.6z" /> + <path d="M384.6,290.6l-21.9,59.6l-21.9-59.6h-22.4l30.1,82h28.3l30.1-82L384.6,290.6" /> + <g> + <path d="M416.4,290.6h22.4v82h-22.4V290.6z" /> + <circle cx="427.6" cy="266.9" r="14.4" /> + </g> + <path d="M517.7,308.7v-18.1h-26.8V268h-22.4v22.6h-17.7v18.1h17.7v35.3c0,18.2,9.1,30.3,32.3,30.3c9,0,16.8-3.3,16.8-3.3l-2.7-17.7 + c0,0-4.4,1.3-9.8,1.3c-6.6,0-14.3-2.9-14.3-12v-33.9L517.7,308.7" /> + <path d="M569,353.8c-12.5,0-22.6-9.9-22.6-22.1c0-12.2,10.1-22.1,22.6-22.1c12.5,0,22.6,9.9,22.6,22.1 + C591.6,343.9,581.5,353.8,569,353.8 M569,288.5c-24.2,0-43.9,19.2-43.9,42.9c0,23.7,19.7,42.9,43.9,42.9 + c24.2,0,43.9-19.2,43.9-42.9C612.9,307.7,593.2,288.5,569,288.5" /> + </g> +</svg> diff --git a/public/logo/codengage.png b/public/logo/codengage.png new file mode 100644 index 0000000000000000000000000000000000000000..251df0c8be1990176468c99a78afda8470a1fb8c GIT binary patch literal 3826 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 Jq$6(L{V&YXq96bO literal 0 HcmV?d00001 diff --git a/public/logo/docsvision.png b/public/logo/docsvision.png new file mode 100644 index 0000000000000000000000000000000000000000..bc578a78fbc2d6c2d188ddf98d3f1ba54d12f863 GIT binary patch literal 9721 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 literal 0 HcmV?d00001 diff --git a/public/logo/express24.svg b/public/logo/express24.svg new file mode 100644 index 0000000..8ad3c35 --- /dev/null +++ b/public/logo/express24.svg @@ -0,0 +1,95 @@ +<?xml version="1.0" encoding="utf-8"?> +<!-- Generator: Adobe Illustrator 24.0.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) --> +<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" + viewBox="0 0 1024 1024" style="enable-background:new 0 0 1024 1024;" xml:space="preserve"> +<style type="text/css"> + .st0{fill:#0E0E0E;} + .st1{fill-rule:evenodd;clip-rule:evenodd;fill:#FFF200;} + .st2{fill-rule:evenodd;clip-rule:evenodd;fill:#00AE4C;} + .st3{fill-rule:evenodd;clip-rule:evenodd;fill:#0098D5;} +</style> + <g> + <path class="st0" d="M187,863c-2.7,0.4-6.4,0.9-11,1.3c-4.6,0.5-11.2,0.7-19.7,0.7c-5.1,0-9.9-0.4-14.6-1.3 + c-4.7-0.8-8.8-2.5-12.3-4.9c-3.6-2.4-6.4-5.9-8.5-10.4c-2.1-4.5-3.2-10.3-3.2-17.5v-52.5c0-7.2,1.1-13,3.2-17.4 + c2.1-4.4,5-7.9,8.5-10.3c3.6-2.4,7.7-4.1,12.4-4.9c4.7-0.8,9.6-1.3,14.7-1.3c4.2,0,7.9,0.1,11.2,0.2c3.2,0.2,6,0.3,8.5,0.5 + c2.4,0.2,4.5,0.4,6.2,0.6c1.7,0.2,3.3,0.4,4.7,0.6c2.1,0.3,3.2,1.4,3.2,3.2v14.7c0,0.8-0.3,1.6-1,2.2c-0.6,0.6-1.4,1-2.2,1h-32.1 + c-3.7,0-6.3,0.8-7.8,2.3c-1.5,1.5-2.3,4.4-2.3,8.5v14.4h41c0.8,0,1.6,0.3,2.2,0.9c0.6,0.6,1,1.4,1,2.2v15c0,0.9-0.3,1.6-1,2.2 + c-0.6,0.6-1.4,0.9-2.2,0.9h-41v16.8c0,4.1,0.8,6.9,2.3,8.5c1.5,1.5,4.1,2.3,7.8,2.3H187c0.8,0,1.6,0.3,2.2,0.9c0.6,0.6,1,1.4,1,2.2 + v14.7C190.1,861.6,189.1,862.7,187,863L187,863z"/> + <path class="st0" d="M291.4,861.4c0,0.5-0.2,1-0.6,1.5c-0.4,0.5-0.9,0.7-1.6,0.7h-23.9c-0.8,0-1.6-0.3-2.1-0.8 + c-0.6-0.5-1.2-1.4-2-2.5l-15.7-24.5l-14.7,24.7c-0.7,1.2-1.4,2-2,2.4c-0.6,0.5-1.3,0.7-2.1,0.7h-21.2c-1.2,0-1.7-0.6-1.7-1.9 + c0-0.5,0.1-1,0.3-1.3l27.7-44l-26.9-40.2c-0.2-0.4-0.3-0.7-0.3-1c0-0.6,0.2-1.2,0.7-1.7c0.5-0.5,1-0.7,1.7-0.7h23.6 + c0.8,0,1.6,0.3,2.1,0.9c0.6,0.6,1.2,1.4,2,2.5l14.1,21.8l13-21.8c0.7-1.2,1.4-2,2-2.5c0.6-0.5,1.3-0.8,2.1-0.8H287 + c1.3,0,1.9,0.7,1.9,2.1c0,0.5-0.1,1-0.3,1.3l-26.1,41.5l28.6,42.6C291.3,860.8,291.4,861.1,291.4,861.4L291.4,861.4z"/> + <path class="st0" d="M358.7,812.3c0-2.8-0.2-5.4-0.6-7.7c-0.4-2.3-1.2-4.3-2.2-6.1c-1.1-1.7-2.5-3.1-4.3-4c-1.8-0.9-4.1-1.4-7-1.4 + c-2.6,0-5.1,0.1-7.4,0.2c-2.3,0.2-4.1,0.3-5.6,0.6v49.2c1.9,0.2,4.1,0.4,6.5,0.6c2.4,0.2,4.6,0.3,6.5,0.3c2.8,0,5.2-0.5,7-1.5 + c1.8-1,3.2-2.4,4.3-4.1c1.1-1.7,1.8-3.8,2.2-6.2c0.4-2.4,0.6-4.9,0.6-7.7V812.3L358.7,812.3z M384.3,824.6 + c0,12.5-3.3,22.3-9.8,29.6c-6.5,7.3-16.5,10.9-29.9,10.9c-1.6,0-3.6-0.1-5.9-0.3c-2.4-0.2-4.7-0.5-7-0.8v27.4 + c0,0.8-0.3,1.6-0.9,2.2c-0.6,0.6-1.4,0.9-2.2,0.9h-19.1c-0.8,0-1.6-0.3-2.3-0.9c-0.7-0.6-1-1.4-1-2.2V780.4c0-1.3,0.3-2.2,0.9-2.9 + c0.6-0.6,1.9-1.2,4-1.7c4.5-1.2,9.8-2.1,15.7-2.9c5.9-0.8,11.9-1.2,18-1.2c12.9,0,22.7,3.5,29.5,10.6c6.8,7.1,10.2,17,10.2,29.9 + V824.6L384.3,824.6z"/> + <path class="st0" d="M449.5,792.1c-0.4,0.6-1,1-1.7,1h-1.3c-3.9,0-7.5,0.5-10.9,1.6c-3.4,1-6.5,2.4-9.5,3.9v61.7 + c0,0.8-0.3,1.6-0.9,2.3c-0.6,0.7-1.4,1-2.2,1h-19.1c-0.8,0-1.6-0.3-2.3-1c-0.7-0.7-1-1.5-1-2.3v-84.2c0-0.8,0.3-1.6,1-2.2 + c0.6-0.6,1.4-1,2.2-1h18.8c0.8,0,1.6,0.3,2.2,1c0.6,0.6,1,1.4,1,2.2v3.2c3-2.5,6.3-4.3,10-5.7c3.7-1.3,7.5-2,11.3-2 + c0.8,0,1.6,0.3,2.2,1c0.6,0.6,0.9,1.4,0.9,2.2V790C450.2,790.8,450,791.5,449.5,792.1L449.5,792.1z"/> + <path class="st0" d="M514.9,809.8c0-5.9-1.3-10.3-3.8-13.2c-2.5-2.9-6-4.4-10.5-4.4c-4.4,0-8,1.5-10.6,4.4c-2.6,3-4,7.3-4,13.1v0.6 + h28.8V809.8L514.9,809.8z M539.9,822.5c0,2.5-1.1,3.8-3.3,3.8h-50.5v0.3c0,2.2,0.3,4.3,0.8,6.4c0.5,2.1,1.4,3.9,2.7,5.5 + c1.3,1.6,2.9,2.8,5,3.8c2.1,0.9,4.7,1.4,7.8,1.4c2.5,0,5.2-0.1,8.1-0.2c2.8-0.1,5.7-0.2,8.5-0.3c2.8-0.1,5.4-0.2,7.8-0.4 + c2.4-0.2,4.4-0.3,6-0.6h0.5c2,0,3,0.9,3,2.5V857c0,1.3-0.2,2.2-0.6,2.9c-0.4,0.6-1.3,1.1-2.7,1.4c-5.1,1.3-10,2.2-14.9,2.9 + c-4.9,0.6-10.7,1-17.6,1c-4.7,0-9.5-0.7-14.2-2.1c-4.7-1.4-9-3.6-12.8-6.8c-3.8-3.2-6.9-7.4-9.2-12.6c-2.3-5.2-3.5-11.6-3.5-19.2 + v-11.1c0-6.3,0.9-12.1,2.7-17.3c1.8-5.2,4.4-9.5,7.8-13.1c3.4-3.6,7.6-6.4,12.6-8.3c5-1.9,10.6-2.9,16.9-2.9c6.4,0,12.1,1.1,17,3.2 + c4.9,2.1,9,5,12.3,8.7c3.3,3.7,5.7,8.1,7.4,13.1c1.6,5.1,2.5,10.6,2.5,16.6V822.5L539.9,822.5z"/> + <path class="st0" d="M619.8,838.5c0,3.7-0.7,7.2-2.1,10.4c-1.4,3.3-3.4,6.1-6.2,8.5c-2.8,2.4-6.3,4.3-10.5,5.6 + c-4.2,1.4-9.2,2.1-15,2.1c-2.2,0-4.6-0.1-7-0.2c-2.5-0.2-5-0.4-7.6-0.7c-2.6-0.3-5.1-0.7-7.5-1.1c-2.4-0.4-4.6-0.9-6.6-1.4 + c-2-0.5-3-1.7-3-3.6v-12.8c0-0.8,0.3-1.6,0.8-2.1c0.5-0.6,1.3-0.9,2.2-0.9h0.6c2.1,0.3,4.5,0.6,7,0.9c2.6,0.3,5.1,0.5,7.7,0.7 + c2.5,0.2,4.9,0.4,7,0.5c2.2,0.1,3.9,0.2,5.1,0.2c3.8,0,6.3-0.5,7.5-1.5c1.2-1,1.8-2.6,1.8-4.7c0-1.2-0.4-2.2-1.3-3.2 + c-0.8-1-2.4-2.1-4.6-3.4l-20.6-11.9c-4.4-2.5-7.9-5.8-10.4-9.7c-2.5-4-3.7-8.5-3.7-13.7c0-8,2.6-14.1,7.9-18.3 + c5.3-4.2,13.4-6.3,24.3-6.3c6.2,0,11.5,0.3,15.7,1c4.3,0.7,8.4,1.6,12.4,2.6c2,0.5,3,1.7,3,3.6v12.8c0,2-0.9,3-2.7,3H614 + c-1.2-0.1-2.8-0.3-4.9-0.6c-2.1-0.3-4.4-0.5-6.9-0.7c-2.5-0.2-5-0.4-7.6-0.6c-2.6-0.2-4.9-0.2-6.9-0.2c-3.1,0-5.2,0.3-6.5,1 + c-1.3,0.6-1.9,1.8-1.9,3.6c0,1.2,0.4,2.1,1.3,2.9c0.8,0.8,2.1,1.7,3.6,2.6l19.6,11.2c3.3,1.9,5.9,3.8,8,5.8c2.1,2,3.7,4,4.9,6 + c1.2,2.1,2,4.1,2.5,6.2C619.6,834.3,619.8,836.4,619.8,838.5L619.8,838.5z"/> + <path class="st0" d="M699.5,838.5c0,3.7-0.7,7.2-2.1,10.4c-1.4,3.3-3.4,6.1-6.2,8.5c-2.8,2.4-6.3,4.3-10.5,5.6 + c-4.2,1.4-9.2,2.1-15,2.1c-2.2,0-4.6-0.1-7-0.2c-2.5-0.2-5-0.4-7.6-0.7c-2.6-0.3-5.1-0.7-7.5-1.1c-2.4-0.4-4.6-0.9-6.6-1.4 + c-2-0.5-3-1.7-3-3.6v-12.8c0-0.8,0.3-1.6,0.8-2.1c0.5-0.6,1.3-0.9,2.2-0.9h0.6c2.1,0.3,4.5,0.6,7,0.9c2.6,0.3,5.1,0.5,7.7,0.7 + c2.5,0.2,4.9,0.4,7,0.5c2.2,0.1,3.9,0.2,5.1,0.2c3.8,0,6.3-0.5,7.5-1.5c1.2-1,1.8-2.6,1.8-4.7c0-1.2-0.4-2.2-1.3-3.2 + c-0.8-1-2.4-2.1-4.6-3.4l-20.6-11.9c-4.4-2.5-7.9-5.8-10.4-9.7c-2.5-4-3.7-8.5-3.7-13.7c0-8,2.6-14.1,7.9-18.3 + c5.3-4.2,13.4-6.3,24.3-6.3c6.2,0,11.5,0.3,15.7,1c4.3,0.7,8.4,1.6,12.4,2.6c2,0.5,3,1.7,3,3.6v12.8c0,2-0.9,3-2.7,3h-0.5 + c-1.2-0.1-2.8-0.3-4.9-0.6c-2.1-0.3-4.4-0.5-6.9-0.7c-2.5-0.2-5-0.4-7.6-0.6c-2.6-0.2-4.9-0.2-6.9-0.2c-3.1,0-5.2,0.3-6.5,1 + c-1.3,0.6-1.9,1.8-1.9,3.6c0,1.2,0.4,2.1,1.3,2.9c0.8,0.8,2.1,1.7,3.6,2.6l19.6,11.2c3.3,1.9,5.9,3.8,8,5.8c2.1,2,3.7,4,4.9,6 + c1.2,2.1,2,4.1,2.5,6.2C699.2,834.3,699.5,836.4,699.5,838.5L699.5,838.5z"/> + <path class="st0" d="M805.4,774.9c0,6.4-1.6,12-4.7,16.7c-3.1,4.7-7.6,9-13.5,13.1l-13.5,9c-3.4,2.2-6.5,4.4-9.3,6.4 + c-2.8,2.1-5.2,4.1-7.3,6.3c-2.1,2.1-3.6,4.3-4.8,6.6c-1.1,2.3-1.7,4.9-1.7,7.6v0.6h50c0.8,0,1.6,0.3,2.2,0.9c0.6,0.6,1,1.3,1,2.1 + v16.3c0,0.8-0.3,1.6-1,2.2c-0.6,0.6-1.4,1-2.2,1h-70.4c-0.8,0-1.6-0.3-2.2-1c-0.6-0.6-1-1.4-1-2.2v-16.1c0-8.8,2.1-16.6,6.3-23.4 + c4.2-6.9,9.3-12.4,15.3-16.8l14.6-10.3c3.5-2.4,6.3-4.4,8.4-5.9c2.1-1.5,3.7-2.9,4.9-4.1c1.2-1.2,1.9-2.4,2.3-3.6 + c0.4-1.2,0.6-2.8,0.6-4.7c0-3.4-1.2-5.8-3.6-7.3c-2.4-1.5-6.8-2.2-13.2-2.2c-4.9,0-10,0.2-15.6,0.6c-5.5,0.4-10.7,0.9-15.6,1.4 + h-0.3c-0.8,0-1.5-0.3-2.1-1c-0.5-0.6-0.8-1.4-0.8-2.2v-12.3c0-0.8,0.3-1.5,0.9-2c0.6-0.5,1.3-0.8,2.1-1c4.4-1.4,9.7-2.5,15.7-3.5 + c6.1-1,12.1-1.4,18-1.4c14.6,0,24.9,2.5,31.1,7.5C802.3,757.2,805.4,764.7,805.4,774.9L805.4,774.9z"/> + <path class="st0" d="M864.4,781.5c0-0.6-0.2-1-0.6-1c-0.1,0-0.3,0.1-0.5,0.3l-24.8,33.9c-0.2,0.2-0.3,0.5-0.3,1 + c0,0.4,0.3,0.6,1,0.6h25.3V781.5L864.4,781.5z M904.3,834.1c0,0.8-0.3,1.6-0.9,2.2c-0.6,0.6-1.4,0.9-2.2,0.9h-10.4v23.3 + c0,0.8-0.3,1.6-0.9,2.2c-0.6,0.6-1.3,1-2.1,1h-21c-0.8,0-1.6-0.3-2.1-1c-0.6-0.6-0.9-1.4-0.9-2.2v-23.3h-45.7 + c-0.8,0-1.6-0.3-2.2-0.9c-0.6-0.6-0.9-1.4-0.9-2.2v-15.4c0-1.6,0.6-3.2,1.7-4.9l50-65.5c0.5-0.7,1.1-1.3,1.7-1.7 + c0.6-0.4,1.4-0.5,2.4-0.5h16.9c0.8,0,1.6,0.3,2.2,0.9c0.6,0.6,1,1.4,1,2.2v67.1h10.4c0.8,0,1.6,0.3,2.2,1c0.6,0.6,0.9,1.4,0.9,2.2 + V834.1L904.3,834.1z"/> + <path class="st1" d="M511.2,130.3c148.9,0,269.7,120.8,269.7,269.7c0,148.9-120.8,269.7-269.7,269.7S241.4,548.8,241.4,400 + C241.7,250.9,362.3,130.3,511.2,130.3L511.2,130.3z"/> + <path class="st2" d="M510.9,559.4c-50.9,0-102.2-3.6-152.6-11.1c34.7,32.2,90.3,53,152.6,53c62.5,0,117.8-20.8,152.8-53l0,0 + C613.3,555.7,561.9,559.4,510.9,559.4L510.9,559.4z"/> + <path class="st2" d="M679.5,373.8c-5.6,28.2-78.2,44.7-168.3,44.7l0,0c-90.1,0-162.5-15.5-168.1-44.7v-0.5c0-2.5,1.6-22,0.6-21.6 + c-121.5,23.3-209.5,46.2-223.6,80.4l0,0c-0.3,0.6-0.5,1.3-0.7,2l0,0c-0.1,0.4-0.3,0.9-0.4,1.3l0,0c-19.1,64.6,171.6,97,300.8,108.3 + c83.8,7.4,146.3,5.4,231.8-4.7c117.8-13.9,252.4-44,252.7-96.9l0,0c0-39.6-92.9-65.1-225.6-90.4 + C677.7,351.4,679.5,371.3,679.5,373.8L679.5,373.8L679.5,373.8z"/> + <path class="st1" d="M759.8,399.6L759.8,399.6c15,0,27.1,12.3,27.1,27.1c0,7.1-54.2,7.1-54.2,0C732.7,411.8,745,399.6,759.8,399.6 + L759.8,399.6z"/> + <path class="st1" d="M656.3,442.4L656.3,442.4c15,0,27.1,12.3,27.1,27.1c0,7.1-54.2,7.1-54.2,0 + C629.2,454.7,641.5,442.4,656.3,442.4L656.3,442.4z"/> + <path class="st1" d="M257.7,399.6L257.7,399.6c15,0,27.1,12.3,27.1,27.1c0,7.1-54.2,7.1-54.2,0 + C230.6,411.8,242.8,399.6,257.7,399.6L257.7,399.6z"/> + <path class="st1" d="M358.1,442.4L358.1,442.4c15,0,27.1,12.3,27.1,27.1c0,7.1-54.2,7.1-54.2,0C331,454.7,343.3,442.4,358.1,442.4 + L358.1,442.4z"/> + <path class="st1" d="M511,456L511,456c15,0,27.1,12.3,27.1,27.1c0,7.1-54.2,7.1-54.2,0C484,468.2,496.2,456,511,456L511,456z"/> + <path class="st1" d="M343.1,363.1l0,13.7c5.6,29.2,78.2,44.7,168.3,44.7s162.8-16.4,168.3-44.7v-13.7 + c-4.9,24.8-78.2,44.7-168.3,44.7S347.7,387.9,343.1,363.1L343.1,363.1z"/> + <path class="st3" d="M343.1,366c4.9,24.8,78.2,44.7,168.3,44.7l0,0c90.1,0,163.4-19.4,168.3-44.7v-2.9 + c-2.6-91.2-77.1-161.5-168.5-161.5C421.5,201.6,343.1,275.2,343.1,366L343.1,366z"/> +</g> +</svg> diff --git a/public/logo/foxford.svg b/public/logo/foxford.svg new file mode 100644 index 0000000..46453bc --- /dev/null +++ b/public/logo/foxford.svg @@ -0,0 +1 @@ +<svg height="40" viewBox="0 0 162 40" width="162" xmlns="http://www.w3.org/2000/svg"><g fill="none" transform="translate(2)"><path d="m10 14c2.838-1.769 5.267-2.218 8-2-1.075.651-1.519.981-2 1 .866.4 1.665.43 3 1-.091-.27.264-.15 1 0 1.426-3.627 4.239-5.726 8-6l-13-8-13 8c3.672.274 6.426 2.283 8 6z" fill="#333"/><path d="m10.555 13.5c2.587-1.5 2.928-1.825 5.162-1.178-.588.206 1.041.413.747.913.676-.088 1.47-.059 2.352.147.353.088.706.206 1.058.353.47-.912 1-1.706 1.588-2.412v-1.029c-.176-1.471-2.852-2.647-6.174-2.647s-5.998 1.176-6.174 2.647v1.029c.529.647 1 1.353 1.441 2.176z" fill="#535353"/><path d="m19.355 13c-.201.264-.547.116-.968 0-.791-.15-1.57-.18-1.935 0-.009-.593.423-.918.968-1-2.189-.775-4.554-.332-6.774 1-2.424-3.932-5.886-6-10.645-6v21l14.516 5 15.484-5v-21c-4.875 0-8.365 2.127-10.645 6z" fill="#ff732b"/><path d="m0 28 14.516 5 15.484-5v3l-15.484 9-14.516-9zm2.058-4.765v-13.824c2.558 0 4.851 1.765 6.909 5.294.5 1.088.5 1.765 0 2.059-.735.441-1.617-.147-2.352-1.765-.794.676-1.205 2.353-1.235 5-.235-.676-.323-1.471-.235-2.353-2.293.882-2.234 3.706-3.087 5.588zm26.461 0v-13.824c-2.558 0-4.851 1.765-6.909 5.294 2.94 1.971 5.233 4.794 6.909 8.529z" fill="#ffddcd"/><ellipse cx="8.526" cy="25.588" fill="#fff" rx="2.94" ry="2.941"/><ellipse cx="22.639" cy="25.588" fill="#fff" rx="2.94" ry="2.941"/><ellipse cx="8.526" cy="25.588" fill="#333" rx="1.47" ry="1.471"/><ellipse cx="22.639" cy="25.588" fill="#333" rx="1.47" ry="1.471"/><ellipse cx="19.699" cy="20.294" fill="#ed4d14" rx="1.47" ry="1"/><ellipse cx="10.878" cy="20.294" fill="#ed4d14" rx="1.47" ry="1"/><path d="m16.759 36.029h-1.029v-1.118c.911-.294 1.617-1.5 1.617-2.118 0-.735-.911-1.029-2.058-1.029s-2.058.294-2.058 1.029c0 .647.706 1.824 1.617 2.118v1.118c-1.529-.029-3.234-.265-3.381-1.382-.029-.235-.265-.412-.5-.382-.235.029-.412.265-.382.5.265 1.941 2.852 2.147 4.792 2.147h1.382c.235 0 .441-.206.441-.441s-.206-.441-.441-.441z" fill="#333"/><path d="m11.466 6.941v-4.706l-1.764 1.029v3.676c-.412.294-.676.765-.676 1.294 0 .882.706 1.559 1.558 1.559.853 0 1.558-.706 1.558-1.559 0-.529-.265-1.029-.676-1.294z" fill="#48a1e6"/><path d="m53.789 25.1c-4.656 0-7.789-2.367-7.789-6.669 0-4.244 3.161-6.583 7.789-6.669v-1.761h2.96v1.761c4.598.087 7.789 2.512 7.789 6.669 0 4.244-3.19 6.64-7.789 6.669v2.252h-2.96zm0-2.743v-7.853c-3.104.029-4.656 1.617-4.656 3.927 0 2.541 1.667 3.898 4.656 3.927zm2.96-7.853v7.853c3.075-.029 4.656-1.328 4.656-3.927 0-2.281-1.494-3.898-4.656-3.927zm15.089 1.472c3.593 0 5.92 2.454 5.92 5.717s-2.328 5.717-5.92 5.717c-3.593 0-5.92-2.454-5.92-5.717s2.328-5.717 5.92-5.717zm0 8.835c1.724 0 2.96-1.241 2.96-3.118 0-1.848-1.293-3.118-2.96-3.118-1.638 0-2.931 1.213-2.931 3.118 0 1.819 1.236 3.118 2.931 3.118zm8.335-8.575h2.788v10.913h-2.788zm6.093 5.197 4.685 5.717h-3.621l-4.311-5.514 3.937-5.399h3.506zm15.232 4.1c-.92 1.241-2.558 1.906-4.311 1.906-3.535 0-5.892-2.281-5.892-5.717 0-3.176 2.328-5.717 5.633-5.717 1.782 0 3.363.462 4.368 1.472l-1.293 2.194c-.833-.808-1.724-1.068-2.702-1.068-1.552 0-3.018 1.184-3.018 3.118s1.494 3.118 3.133 3.118c1.178 0 2.098-.549 2.788-1.328zm6.984 1.877h-.144c-3.794 0-5.892-2.483-5.892-5.717 0-2.945 2.069-5.717 5.863-5.717h.172v-5.803h2.788v5.803h.201c3.736 0 5.834 2.512 5.834 5.717 0 3.262-1.897 5.717-5.834 5.717h-.201v4.591h-2.788zm-.057-2.598h.086v-6.236h-.201c-2.041 0-2.874 1.444-2.874 3.118-.029 1.819.977 3.118 2.989 3.118zm2.845-6.236v6.236h.086c2.012 0 2.96-1.299 2.96-3.118 0-1.617-.92-3.118-2.874-3.118zm13.68-2.598c3.593 0 5.92 2.454 5.92 5.717s-2.328 5.717-5.92 5.717-5.92-2.454-5.92-5.717 2.328-5.717 5.92-5.717zm0 8.835c1.724 0 2.96-1.241 2.96-3.118 0-1.848-1.293-3.118-2.96-3.118-1.638 0-2.931 1.213-2.931 3.118 0 1.819 1.236 3.118 2.931 3.118zm8.335-8.575h2.788v1.039c.69-.722 1.954-1.299 3.363-1.299 2.989 0 4.915 2.339 4.915 5.543 0 3.32-2.27 5.89-5.748 5.89-.977 0-1.897-.173-2.529-.52v5.11h-2.788zm2.759 3.551v4.417c.747.491 1.38.635 2.299.635 1.926 0 3.046-1.415 3.046-3.234 0-1.732-1.006-3.003-2.845-3.003-.948-.029-1.811.433-2.5 1.184zm9.053 4.764h1.38c.776-1.01 1.38-3.234 1.523-5.688l.172-2.627h8.018v8.315h1.811v5.139h-2.644v-2.541h-7.702v2.541h-2.587v-5.139zm4.254 0h4.024v-5.688h-2.644l-.086 1.126c-.201 2.281-.805 3.898-1.293 4.562z" fill="#333"/></g></svg> \ No newline at end of file diff --git a/public/logo/globalCtoForum.png b/public/logo/globalCtoForum.png new file mode 100644 index 0000000000000000000000000000000000000000..c8b4d1b35345f5a81959aa08d125c571f66f6f1a GIT binary patch literal 18847 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 literal 0 HcmV?d00001 diff --git a/public/logo/healthSamurai.svg b/public/logo/healthSamurai.svg new file mode 100644 index 0000000..0362a17 --- /dev/null +++ b/public/logo/healthSamurai.svg @@ -0,0 +1,28 @@ +<svg width="358px" height="104px" viewBox="0 0 358 104" xmlns="http://www.w3.org/2000/svg"> + <g transform="scale(2 2)"> + <g id="Health-Samurai" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" transform="translate(-267.000000, -31.000000)"> + <g id="Group-18" transform="translate(267.000000, 31.000000)"> + <g id="circle-logo" fill-rule="nonzero"> + <circle id="Oval" fill="#EA4A35" cx="26" cy="26" r="26"></circle> + <path d="M14.2749838,26.401932 C14.1519685,26.0328859 14.0289531,25.9098706 13.659907,25.9098706 C12.5690938,25.8984542 11.4801706,25.8162713 10.4,25.6638398 C10.5203547,26.3300726 10.6847355,26.9875956 10.8920614,27.6320856 C11.6916613,30.5844542 13.659907,32.4296847 16.6122758,33.5983307 C18.0884601,34.1518998 23.501136,34.7669766 23.8701821,34.7669766 C22.3324901,34.0288844 20.7332903,33.2907923 19.1955983,32.3681771 C16.830512,31.108922 15.061061,28.9634627 14.2749838,26.401932 Z M21.4344779,22.5269481 C20.6963858,22.2194097 20.0198013,21.973379 19.2817091,21.6658406 C17.1904479,20.804733 17.2519556,21.0507638 15.4682329,19.8206102 C15.0181307,21.0649197 14.7689822,22.372949 14.7301407,23.695594 C14.7029548,26.2216574 15.8647462,28.6135808 17.8670325,30.1539005 C20.0198013,31.9376233 21.8650317,32.6757155 24.4483542,33.536823 C24.8174003,33.6598383 25.063431,33.7828537 25.6170002,33.9673767 C25.6170002,32.9832539 25.7400156,28.3086701 25.3709695,26.8324858 C24.9404157,24.8027323 23.525739,23.3880556 21.4344779,22.5269481 Z M30.0455532,21.653539 C28.7723442,16.4069339 26.1090617,13.8666667 26.1090617,13.8666667 C26.1090617,13.8666667 23.4088745,16.4991954 22.1602685,21.653539 C24.1683433,22.3573779 25.6647005,24.0565125 26.1090617,26.137449 C26.6872338,22.6499634 30.0455532,21.653539 30.0455532,21.653539 Z M37.9123856,26.401932 C37.1263084,28.9634627 35.3568575,31.108922 32.9917711,32.3681771 C31.4540791,33.2907923 29.8548794,34.0288844 28.3171873,34.7669766 C28.6862335,34.7669766 34.0989093,34.1518998 35.5750937,33.5983307 C38.5274624,32.4296847 40.4957082,30.5844542 41.295308,27.6320856 C41.502634,26.9875956 41.6670147,26.3300726 41.7873694,25.6638398 C40.7071988,25.8162713 39.6182757,25.8984542 38.5274624,25.9098706 C38.1584163,25.9098706 38.035401,26.0328859 37.9123856,26.401932 Z M30.7774946,22.5269481 C28.6862335,23.3880556 27.2715568,24.8027323 26.841003,26.8324858 C26.4719569,28.3086701 26.5949723,32.9832539 26.5949723,33.9673767 C27.1485414,33.7828537 27.3945721,33.6598383 27.7636182,33.536823 C30.3469409,32.6757155 32.1921713,31.9376233 34.3449401,30.1539005 C36.3472263,28.6135808 37.5090177,26.2216574 37.4818318,23.695594 C37.4429903,22.372949 37.1938419,21.0649197 36.7437397,19.8206102 C34.9600169,21.0507638 35.0215245,20.804733 32.9302634,21.6658406 C32.1921713,21.973379 31.5155868,22.2194097 30.7774946,22.5269481 Z" id="samurai-copy" fill="#FFFFFF"></path> + </g> + <path d="M83,19.8982524 L83,10.9780423 L83,10.9780423 C83,8.7810302 84.7810302,7 86.9780423,7 L87.5847302,7 L96.450875,7 L96.450875,10.9780423 L87.5847302,10.9780423 L87.5847302,13.5319925 L95.6109245,13.5319925 L95.6109245,17.2275703 L87.5847302,17.2275703 L87.5847302,19.899214 L96.5675348,19.899214 L96.5675348,23.8772563 L87.4654892,23.8772563 L86.9790039,23.8772563 C84.7814607,23.8772563 83,22.0957956 83,19.8982524 Z" id="Path" fill="#404040"></path> + <path d="M99,24 L104.391792,11.1431724 L105.265161,9.06060927 C105.788674,7.81228251 107.010143,7 108.363799,7 C109.717312,7 110.938505,7.81261357 111.461234,9.06111346 L112.314682,11.0995121 L117.71593,24 L112.74524,24 L111.52007,20.9861496 L105.067508,20.9861496 L103.877343,24 L99,24 Z M106.432123,17.3096774 L110.175309,17.3096774 L108.315341,12.5387097 L106.432123,17.3096774 Z" id="Combined-Shape" fill="#404040"></path> + <polygon id="Path" fill="#404040" points="120 23.8772563 120 7 124.624237 7 124.624237 19.7815205 132.719564 19.7815205 132.719564 23.8772563"></polygon> + <polygon id="Path" fill="#404040" points="133 11.1075052 133 7 147.718353 7 147.718353 11.1075052 142.675737 11.1075052 142.675737 23.8772563 138.030915 23.8772563 138.030915 11.1075052"></polygon> + <path d="M150,19.2523106 L150,7 L154.624946,7 L154.624946,13.3201441 L160.566312,13.3201441 L160.566312,7 L160.566312,7 C163.127033,7 165.202907,9.07587451 165.202907,11.6365955 L165.202907,23.8772563 L160.566312,23.8772563 L160.566312,17.4629574 L154.624946,17.4629574 L154.624946,23.8772563 L154.624946,23.8772563 C152.070659,23.8772563 150,21.8065976 150,19.2523106 Z" id="Path" fill="#404040"></path> + <path d="M64,23.8772563 L64,18.2454204 L64,11.6249458 C64,9.07065875 66.0706587,7 68.6249458,7 L68.6249458,13.3201441 L74.5663118,13.3201441 L74.5663118,7 L79.2029073,7 L79.2029073,19.2406608 C79.2029073,21.8013818 77.1270328,23.8772563 74.5663118,23.8772563 L74.5663118,17.4629574 L68.6249458,17.4629574 L68.6249458,23.8772563 L64,23.8772563 Z" id="Combined-Shape" fill="#404040"></path> + <path d="M138,43.6435892 L138,28 L145.565788,28 C147.894306,28 149.63137,28.5599927 150.777031,29.6799949 C151.721829,30.6036331 152.194221,31.8399807 152.194221,33.3890747 C152.194221,34.5454406 151.90409,35.527246 151.323821,36.3345203 C150.743551,37.1417947 149.936393,37.7599684 148.902322,38.1890602 L152.718693,43.6435892 L147.596722,43.6435892 L144.371777,38.909058 L142.430115,38.909058 L142.430115,43.6435892 L138,43.6435892 Z M142.430115,35.516341 L145.353767,35.516341 C146.105142,35.516341 146.689123,35.3472523 147.105727,35.0090698 C147.522331,34.6708873 147.730629,34.2036206 147.730629,33.6072558 C147.730629,33.0036183 147.520471,32.5436243 147.100147,32.22726 C146.679823,31.9108957 146.090263,31.752716 145.331449,31.752716 L142.430115,31.752716 L142.430115,35.516341 Z" id="Combined-Shape" fill="#404040"></path> + <path d="M121.599976,36.7817917 L121.599976,28 L126.097044,28 L126.097044,36.6945192 C126.097044,37.7927032 126.357418,38.6217834 126.878172,39.1817845 C127.398927,39.7417856 128.120534,40.0217819 129.043014,40.0217819 C129.965495,40.0217819 130.687101,39.7526945 131.207856,39.2145117 C131.728611,38.6763288 131.988985,37.8727029 131.988985,36.8036098 L131.988985,28 L136.497212,28 L136.497212,36.6727011 C136.497212,37.91634 136.32239,39.0035985 135.97274,39.9345095 C135.62309,40.8654204 135.117222,41.6217742 134.455119,42.2035936 C133.793016,42.7854129 133.006316,43.2199527 132.094995,43.507226 C131.183674,43.7944993 130.151479,43.9381338 128.998378,43.9381338 C126.654981,43.9381338 124.836086,43.3435961 123.541638,42.1545028 C122.24719,40.9654095 121.599976,39.1745237 121.599976,36.7817917 Z" id="Path" fill="#404040"></path> + <path d="M103,43.6435892 L103,28 L107.686771,28 L111.503142,34.0545272 L115.319512,28 L120.006283,28 L120.006283,43.6435892 L115.587328,43.6435892 L115.587328,34.6654345 L111.503142,40.785416 L111.503142,40.785416 C111.44735,40.785416 111.395229,40.757606 111.364164,40.7112622 L107.340843,34.7090707 L107.340843,43.6435892 L103,43.6435892 Z" id="Path" fill="#404040"></path> + <path d="M70,41.5817772 L72.4772933,38.7017859 C74.0767549,39.9526975 75.8063793,40.5781439 77.6662183,40.5781439 C78.2539275,40.5781439 78.7040018,40.4817815 79.0164548,40.2890539 C79.3289077,40.0963262 79.4851319,39.818148 79.4851319,39.4545109 C79.4851319,39.1199648 79.3010106,38.8472411 78.9327624,38.6363316 C78.5645143,38.4254221 77.8522066,38.1999705 76.795818,37.95997 C76.252745,37.8363334 75.7822128,37.7217894 75.3842072,37.6163347 C74.9862016,37.5108799 74.5640245,37.3781544 74.1176631,37.218154 C73.6713017,37.0581537 73.2919003,36.8908832 72.9794473,36.7163374 C72.6669943,36.5417916 72.3619853,36.3308852 72.0644111,36.083612 C71.7668368,35.8363388 71.528781,35.5690695 71.3502364,35.2817962 C71.1716919,34.9945229 71.0284864,34.6581637 70.9206157,34.2727084 C70.8127451,33.8872531 70.7588105,33.4654404 70.7588105,33.0072576 C70.7588105,31.5308911 71.3186137,30.3272704 72.4382368,29.3963594 C73.55786,28.4654485 75.0624472,28 76.9520437,28 C79.5781365,28 81.7727137,28.6909001 83.5358411,30.072721 L81.3152044,33.1381663 C79.8198937,32.1127097 78.3283252,31.5999891 76.8404539,31.5999891 C76.319699,31.5999891 75.9216994,31.6963515 75.6464432,31.8890792 C75.371187,32.0818068 75.233561,32.3345308 75.233561,32.6472587 C75.233561,33.0108958 75.4176823,33.2927103 75.7859304,33.4927107 C76.1541786,33.6927111 76.8925236,33.9163446 78.0009877,34.1636178 C78.9829827,34.3745273 79.8161781,34.6054334 80.5005989,34.856343 C81.1850197,35.1072526 81.8006172,35.4217939 82.3474099,35.7999765 C82.8942026,36.1781591 83.3015012,36.6381531 83.569318,37.1799723 C83.8371349,37.7217916 83.9710413,38.3563288 83.9710413,39.083603 C83.9710413,40.6617879 83.3833409,41.9054081 82.2079227,42.8145008 C81.0325044,43.7235935 79.4628237,44.1781331 77.4988337,44.1781331 C76.0555985,44.1781331 74.6867775,43.9581359 73.3923295,43.518135 C72.0978815,43.0781342 70.9671163,42.432688 70,41.5817772 Z" id="Path" fill="#404040"></path> + <path d="M84,43.7526798 L89.9693122,29.9611297 C90.4845894,28.7706288 91.6578514,28 92.9550804,28 C94.2521708,28 95.4251663,28.7709549 95.939678,29.9616359 L101.899002,43.7526798 L97.1452769,43.7526798 L95.9735841,40.9599609 L89.8026689,40.9599609 L88.6644531,43.7526798 L84,43.7526798 Z M91.1082694,37.589062 L94.7014605,37.589062 L92.9160239,33.1381663 L91.1082694,37.589062 Z" id="Combined-Shape" fill="#404040"></path> + <path d="M154,43.7526798 L159.969312,29.9611297 C160.484589,28.7706288 161.657851,28 162.95508,28 C164.252171,28 165.425166,28.7709549 165.939678,29.9616359 L171.899002,43.7526798 L167.145277,43.7526798 L165.973584,40.9599609 L159.802669,40.9599609 L158.664453,43.7526798 L154,43.7526798 Z M161.299988,37.7417888 L164.893179,37.7417888 L163.107742,33.2908931 L161.299988,37.7417888 Z" id="Combined-Shape" fill="#404040"></path> + <g id="Group-16" transform="translate(174.000000, 28.500000)"> + <path d="M0,15.4107777 L0,6 L4.46359146,6 L4.46359146,8.78508562 L4.46359146,10.9471862 C4.46359146,13.4123597 2.46517349,15.4107777 2.11889088e-14,15.4107777 Z" id="Combined-Shape" fill="#404040"></path> + <path d="M2.25,0 L2.25,0 C3.49264069,-2.28269391e-16 4.5,1.00735931 4.5,2.25 L4.5,4.5 L0,4.5 L0,2.25 C-1.52179594e-16,1.00735931 1.00735931,2.28269391e-16 2.25,0 Z" id="Rectangle-5" fill="#EA4A35"></path> + </g> + </g> + </g> + </g> +</svg> \ No newline at end of file diff --git a/public/logo/intouchHealth.png b/public/logo/intouchHealth.png new file mode 100644 index 0000000000000000000000000000000000000000..de6498100be4cc9f840618f39ece2c7dad6f60da GIT binary patch literal 22384 zcmeFYWmj8o(C}M<Vg-Ub1b5e<4T0kBUfkWiMT5J$mtw^o+5*MhAwY2t?soX!_w$?= z=QEt0wUV8+vUAOvJu`dccSR^GN};0?qrQ3b23<y4LiNp?chJ}K1>_H}?^fE_X0IO~ zOyr~_-n{(x%I_>odh<q$Rz?D>?zMEBgXD+1Jr^E4uh+5qpo4W;81fabgrNN^4;CPV zp%7Q*?YGfHSv2B=SQD*J5(wXpET(;%XbV0}y#eDg+hDh$lhCe#>TzIp7W_i>^@DVe z6oD5}H0{$#-q#%`p#E{p*Tw(;<NvDxKg5cwDdwi5&Y_yNw$PemT}{n7F@6V_SBhcH z3nm-x>+k=)o!1%8?Hbe7^~x!+vt*XLJ0z>ac&evtTAtG7i)m_2Y0^154sA+Wo@&^A zt8b5ag6F!AE11?jt-3O#>Txcpw)pigEbr=Y-iSO8_eI;!#IHkCrdi|l++Dox*-qRg zXg0obTt-$#KPx+z)Kq$921To8eIFmd)!^IyZ)2x!;*7-}W4^@q(}Z?w|7v4TJ*%_S z!@ov5g32U!*5xq6xcU#U<OYMPedE9|id$YeIk`I;N5|&I@=J`RIq!#KzF+68)h*#c zR*V%t#mZ<Rh+=9fNGW02E#4Rr>zHl5w<lK-SvT=O&BLUtI~HgdZf9S-#ZS6Ydfi0s z#42l@@|}jthQ|HUOW*9OdYdn0!*Mr<u*3fF_Sn1i^|7S5n|9lc@~)h)mx-6^H~QY8 znCvh4D3{7V96rm5ySA{2ybJoXP3}8SLcj7=Xo()tIj{0?f$cl%7_k#KmAXewk#u8S zD*JU?dZrwO^%v0Awx86~bKt)pzBEuvvN3BF$VpFWu|hCEF&{b1Y~d0OWrGj9*Tx{x z0SRS8i6*?mPDy%pm%j9XRfYy?O~g2NIifD7>0uGz;b7sG%6N!@Ju>WNFzXzUmQ4(^ zzKsYM>h!evw5z0qv8U?vBXC!(j2y21X?Qj1NzfmX*m7l-Cxn@EG;Mtshw0Hu<oOl> zD+n0~&A*cZSTAUZ7k7w8yEM8hWn~r&h3U!4IrU{V0TXdWA;UzG<U7-<RZ7t>+G*b( zQnyYk2}LUBl1PbFKc*Hp(72*XVybbgvFw8w=c2RSk_MCAVkVPu@@$6;ZjO7`gO$(^ z&etQp8Mr8Y+&d@pXB7hFU+^XNCeb6gF$qj|U)<1Bz}^0-cPr}2U@PSwdCoT_`3w1b z{x~r>d6_ADXlx+?LIDzQzz6^d$APf&OY&8G)(V)mD(&?JJ^xz!kCa9`Hq5fkNPYt_ z?E4y_L_*Iy?B4pUBtDAL8efo)v`e}pj>L+wE(T38jW&)NdTR2enXT;SL|SU0S#cMu z(V<bVS*wu_=J{;XMUZRc^RFJy5>m1$+QY5<Y8`s=0`o7sM@jF6(kAA6XrOlu+4<i$ zs*|3CPD-{pBylbR_m=k=WH!dsp5RQy+h7<LKmwWSEASn%$!6rBKlZ~NZS}uCN+?Zm z4j-MJuz1kzbZM``@~c=q!$Q)4Ksv_9gz)s&uV{nDK^cYNL8PT>mmJhWF<Trf*;!cu zdby0g=8Icpe17N3Wuv|y++$zdq~j`+AU?&}e#LtCDENKg6=~ddGgVyY!w9f}Vj>HE zB29oyo!3_yXJ%G<rR$T1;KE2;nIrYjkm+D&txo_-=$rrU`>UKL@6o762_8uX*8{M7 z{IL6M5_|m5BC@)vLBd5!xP{@_*>(JsGDd?g>FJ6+!{sum#UnImv}IeC+ZLJi7hLnx zw=NZh(0`ZjpM>m}go+PK>nK;QXsLZ@0{JT~=V}X9reZ~wcrOSgv6V33xz<U2)r<W| zZhT}E6Wapl;1faKpK2(BCbMVH1_Etf**i?|LaU8f3dUMQ&kz4=o3Da`Lx6nwz(i6} zg<&0R2)U-{uSp2mD3}H;EERN%j<WGKmYg_|!8K!toKEf91zQqx+6oGy7FtQnfyf!& z_t2{K_Z=OtNp?Fr&5xEq+Ub)&9$PaIdwZ%b?)fIh*3n=bW(3$tH?!#0DG5(00D4V> z1ufAE1-{#koqaP9732JQNRKPYvbAoRSu=puSHoDSJwi0mBJ}^7Br+93?K;AlDY5SA z?@5TW*PUfz4}}%fn_dc22BVoM5l1m9g0bl?oCQk60!{AB&dSi_s~u1Ar8vF{*pIJ1 zE9vne^oTo3Xn8pEMPHU$OKUkUM?yD>JIZmkGaH{V?eR5>XR)9l`<y6HEY+ky*lv+W zD1U*2<T;pcyvq{F052TaNWgh7=!iuX@m`Q1$FD{1BOK#ZDy&a{|M76J-5W40e{JF$ zLTx6Fs#Q4+=us_=MgkKAD$!5FHIfXv4HuO(`qVQLR(u&!mXws#US?Jd%Suh+;$~(S zNlR3t!;9+>t2~-?Xj|#=rGt}CE-UlguZ9%<Lc&JP^P5oSsCJayPY=hA6IDzU_~E%z zi`DS)P*N^Vp4ewhkW)gRd|weVAz~Fvg)WJCl<DuHOu#&<AxtZQjpVi(HDd99MV&;{ z(jBh0GiM}IJdCh5XEPArHs5hZiq%XN>3oWedV$LYd8O3eM$YY=8_w$vk(Z3I;pk=# zzthXOxoq#s-}2~gIgrboZtN1Y-F-2zWTRM^(tl=|?T+3!oEp;S3$7k*Nk!Z?SSiP1 zlmdABSD{|7&Mv91-ssBhL*_GN1sfaSX|wN6sC%TQMW+JYK1GweSZBG?gd3?|p5nY3 z8G~sC!kMtUf{vss-r-T8hldS)#q51eV%hz^M=hynK(p~Y&J9r$qUe_eaaC=BYvZ2O zv-j9&e=!w*pdRITySbfI78Uu>lY4jU{&>BsRiJzAnqpIk_id}xoQkX!h!O)#K{BI2 z=!4IdhvZ&MO0jS^a0WIgU1vxAUuXDNh|_z>vVE~{X@s)EGh&W1?;vu!rYpuz&|EfO zSyR@vt~7HGkI_W*UE)mzF4=IP_SdP2dmW{j`en1kxR@oBK=mFbUE-GrcWRw}07ORd z^gfj8+b+6Rw4c}~)xX&IDDkkGUy(Aim)&{kP>Epm&dt?{HsqS!FS27V3&@EvZ`VQi zwWAJWTI^*P8Zx(>NFvs)ne1H?yWp?EBBHG-IoTz1>l7iSaj}WhbW>w&&Uj1)-so%B zU0FEUiQ^^heTd`#QLq1+6F2tI@n<wiyj6gQQz5U__w_v-Pm&+Gdspi2d7^1^9XA7~ zt5vblM~xeMraYIz9Z2XR(?7Wf3xN^BmygJpAkSeCXSxj|#!&}$pvwPoMS>Kdi$vAf z;Yi8&VnmO+Za|7k%Y8$3YJd&$2Jg=K%Ov0Y#KW_)veg5yF@@wX6{tJJMYgK9T>uO) zeCSA{oxdRujLe+0O+%R~%m3~rCzo;c!SqbQ1tEdDpOv-b%mx1T!B<)pfWu!!3w})M z!bc9RO>#3=pDK;)dN!7x!b2{xS9NEjUX>g+T|V}zGrDi0C+DyunWisrvNM8+N}^xT zW5_nhlO|eyB+k_)6c#RU8R?9Z?aXVhQZ_p~E{eO7r&cMZ+#@Gd84(ps?sgGJGZzt? zV!a_8RjY(AVCDF9JaE9Mwd{Ouk;KBdkzOOCIN)0vLPC+OyY9Kp5PrnePkC!k9Gh1D z3QB~8a1f)7cDcAzYMkyiytO0O|7qdOUpTpH@14q)YN6#7dD?t(Skyl6gNDG|2_x~| zNi5LNa%n#DIWX_faixa`OBQ<8d=fC19`qO#mLgWPw|*B=?8S^i<v$w;4)S84<fYU+ z=;Uc&`Dm&4KD=R-c!A&fVcH)XHP?IL3mu3@fiT+)mB?fuLzsorc4>fS(>1Qf#a%HD z@fsfB=Ej~`w7`742Q>sqNnMVC9&bC#8NuJqE(-tfDP@o~dYiytw-JY%MmaW1M4-O9 z&4@kwhow#SkN+oU(LpnjvmN|Wo;%8;PRMfhOidGacggK9XKPK2K1m)QpPji)ivAnp zq7;aFabzVlhA0W>w{LP_EwNCk*6--DQ#$-Jm8v*ie(Yu286NI~X8`>1mZA2^zgn{8 z$dce;Ol(;kvL^G#sjjgh{@MRe-=W$8jzq341IGMvU|x7y^SQ{UU7iGZ_{!x8w_-EI zm5P=c`r)44SuH_%iO%{0-=^Y5h_;lJo957CHn~YgUeQnLpcB-Z5hibIarozs8@|ld zWMuLdlTnG(Y#{GaI*8Hj`)>jB5X#-wgoq3^DOyV<|EX=H6dSQ_e5ub@iWV|3UI*pJ z=mi}L44pO>?|*gM*6&lRq<yUxnfEbSj1tZy{7hV|R`LDg-Sr;5hCNo2{uc6o-gcl^ z*IMb=sTcphPklwigw&XZM=N$V9v)DLIDeX8S6(>t{_cqYRv$$5L<ItnQT!{kNH;um zU_0vDHrdlINmf3x;=1BKcRqNT=}1GJH&<uyUzsqShM<!D;WQWrW%=*CG8a~8Y#xrg zRri`}vH*5_(iKW!e8}Z|xA%h@*=`wE(^g3xh-Rx>=4kCin7<(wNN4AhvGp?<)s*7Z zupIA;Z^iYD?F>**HqLs@3Tz`8IXTaK9&XG@rXRM_>taYH8!C-D83O<O8{I((#$lm^ zptn-?d?ZQ=r#G)74HGezo)*pMa=$mdLfgQ(p<~G;YO=UZG-rgQu_*b5Y)z;Dr0f+H zQ8?}A#cWp#NK9b`Bq>_OB*u(WA~uWxzS0(F2Dee~UmfZlGF1y9!dZs_f>p4P&QI|V zRmH!OW3}`Epp2eD(vBK|gx;JB>alHKDIc$nBi=kL32ZyTa9ULvN}lK%XHQp?z$5nK zRU_p%V1UgH<$Ao(pj7rKo4bL4_uyG0O}MFjXsx@rHHkqTT+Kfc4zOf%)e{*rQIu6^ zps}P0jL*vQHQo~w5_-tBGu_$f2<o8x+k3UlniNJjl0>e+p-5yg;O`JZ$$jLE57GTg zLpSEdboDEFy+Y?*&hbTg?fbUgzn`nfYrSNaOrz3D1aW#fBlgQFX~H&j0HcyL(Dthy zX+U^-)aCmTA^t1wwCG+Vvj2Vjf?WxEiCc%u+23i)aY@tB&L#b50-guRbnHf@&KXph z=h3?^zLUADOLad(1mhOv%wk_i^bf7jj0<fIP@+Q|9d(pFTt$MsC|wxn+jZq_T=e^$ z`|X^W3|x6pHk@-PpBYe0YPAX5<83MEN+(Xa@cI;Kz*}RC<%@$6M6K3fn(&<4PVb%U zf5Ns7U9_xSzj(~O#No*aD2uPYP-^{|zSKI8qu8dOhR7mXK_=FZ?(T4+U@)9s?7Z0Q zl7r*a5zSI^1Wmt=WwZp?RY&D&63gpdXq^>M>0K7kP%bStq+RKo{M;S*%w}NZ8Ud%= zWLsH5q*dBrAMc}vuC#|gcWQkaU|m^4M5pG=n&~uvmbM2DjF3NrliC~60!qsQ2Oyox zh|NL3XURNK=QIzLbU)XdulZ8#hzMfKMFta>nXaE-#HxLlW&E?+ey&c_J=Rqp)49Xv z_{?ZlkP22FgDp@0WW4y*xY-Ns=f;wiJ@?0~q2%H9!rvBXO<Wz!b{Z(>J4L@OSbs58 z<60co#@ev_LAY)yI5jwaKii#oYHkPa_fm`V`2GIqL~Z%RYXaeUx#xzH7Kdk)@iP<h z2K#)LocW4VRi!UH8T(@@Wg~)0v?{3US&3X$!>usHEWstI_fZm3gjUF!uq_uc-&u6o zWmWJ0V6Ir*qXTk9&iUPQk-frtW?WRiY0C(bq{jbi0Txztxn*Y6!&ZGQp2Hc58j8zi z+!O}Ox`wepAP`yf=S`f?a=EkVx!GAFyd12yOAL@UIu1$&Awf>w$MWK0sAb|uETu9t z$vAG(TtSw*(;2BGCOXW0<L=|0Osr!ZYWm(-ojRHlQLx|M?EHneGzNX9M{gXb>ScUb zrql#iZ-br~wD*)UvF~A|{YqqnHmiO2<OprWwkt>)^S*t*;1=6HkeM~Gt+hs~H5x<Y zOR1M0p}z{Cy&3&@jv6QsOWuUo(7Cn(tHD`$ACz?a`{?k`z|``nm=%Z2iS35J-)hXJ zkle7L?p*v=;njlRoxCm<C`*GIdS2mLYhyzdJMB$@ztwi&Dy!f>%O92aX|4gKKe+Di zQBh0-#r&_<{O%nAXa&bN^f?lzQvBl&)@?P-(}$*akl%eYP)FuPw$2mVe)mScl+}V% zVB$|dAScaZF8%HSvF({X_8{|a^(b>^0Vkr0ynMNu_}?7CVASfYWFYx=f!E?;V#{ZJ z<&`t{3eBo}p_C>WT99ym&(Le=Al6lsFBmWuY@U^CDzzxpo+>|ap}R5|<F#NP=G={5 zuIqD)n#{Bv93CDRK@H^MraqDpL1(6?`z)N3{8|bVa#G4rh;S~FUNyjfdPtn}XRfy; z6@1eo&3#@-3eO`shp!Jp=KO@s_x_$m;nT$fEoSJU@3pE2vpz*IjuSQ?{N0*<gj}$# zaA5cReyu9gv?>GRw@w{gYrAY$;UQzGb&a0pN1doc^L_}mp5bLL<M<-TqTj_k`?xPT z2KOfUwi0$&pgFoR?J#^^v}f&5*S}mT)P^VcT`uF-b}vUUZmen3T^c`}qUqZaLn<56 zJ{kceQXd?S#pkB)1D!1?7!tLet)~i1Jrb>&)%|xZtF@2PT#tO#?uKzZQKZ1_NFmx* zFXQD-WMT!FeB)<NYn6y+y0+Gs=7lN_->ISMUv%)m4KlNgpmzt?0eZuA2T7S>_!9Rw zsExe_2|(T9HH`+gAKw_TBBGOgswh{SNKiHyne5eMg0$%_4HU~-!!u;=824r7E-QI# zH5J2nx%qn%O-GhYcr0qZmu`{N^RgG@|4L897hw~!|GUt;1uaX&q5ez1U-Xy$Z@;|! zDi1S*z1EC&4*~aQ+Q1TTI}2y4y|wN+;il))OXI;c1(Hm_wF#`POd8`5r&pBcg~Q2J zmJO3Vt`;6ip<p7Ay+ek<iFb%JN!r^rw{muq#Bu#Ix!1Ec_26WPeR9QtB_iyc*B`tk zc7FNKE1}7Kh`F!zeUO~M`AjxKZQM(5;AH$JsqP6UJ08!P9K?^B_{z|p#7E?~-?!m$ zJ#<q@39H;Iw{0RlXrahndEVhISVuN?z3DAGo;2D<=r+IZ>h*9{TQz5mDdtN&CzJnP z5^jJlm5|5B%hCH*a?}k>+2u(Y`hetERS2M_G1)E6>$vO(a$>K(m~6))EInv|Xcqg5 zwiDYs9$SLRlSh59%_?`()O}v#zO;UxB#}=6AiEq-dY+i>kmZ}MIN1|@<YsH37)Cpu zY(C0qp%=45YOGj6D|T}ASanyvUr$e@#^7R=&dHWh81~_*QbvZv@<W+jE-z?%dVoHu z8=7yvl+^4;2D(41q54b{SVff3L8n>o0;@B(h9hrKpH%XNr#J7@E6=&)TkHLio>qJU zU`tZ^NDl{>Cf@o=<NHnt_m2JLS|Llt?qS_AF+j2jL_W4{dsU9XfYZ|7dGx8i&@feB zPh^Mb8N^!OcA59q{^7)1*>^~m*ES@uYU2~tNWMFy@X6~ytFNZT(yphD=&aD26~X=P zhU)pg?^T8VWzu`&X=Y@i25~g!E{Rl;YQ;Zdyl}u>Pr;+;GX?w8xo;_-vQmJF>DtK- zX|@b=$E)id^^v6Dtt;tD-x%Uuxw@i{?mE_6$c3gWJ@s0?GQ!0O2|_arI%yM$H4X^Q z!S(a567hAZYuE^!qhAzC2aIJuN7Aw~^X7%8*1JrPww6}DV{$a*%yg-wOWMbm>td{o zN8mJnzSMs&iSEvwr?4c<Eg-{h>oO(fT1L0OE3bI#x5GV{CmEwNrZbW!CER#FeEKW- zSY_N#z<JOlSSU!~HiqAo&K$q%JleX<qtaRG$m${%o%%fTvWFqKwYyPze30>G+NHT% zeJvv_{bYc7cFloJ5&nfu#v!lW@?AsCJ_?o8uU;fGNb~)}H!7*3tU};9sc^38_bEV5 z_BMU&JKo->#s8Yc`}bxKF747vhzUhuJh1x=;s=*I-*${PO6Z2FaWN<oJ#mDVM!XU2 zx%FGksQ0=fDs3Zg8uErzWHWOD-iTzg29`v5v}uM6?iF&@rf~1tF?BgQBUE@?d1H6Y z=P)1v&}$^Doi@X}vUl&c$IeYdGDllNJ2l}_NXyHevO`{qGTC#~QTeE!*dr|0v}iXt z%+A0-*zRii{FPPcd|H)2a(CZCkqY!t<{rA`WO_8y>s~vpc9EM`_`>6%e_qC^B=(5N zn%6I!^4M2d>oXceFt4QF!BHg&CcR%el-X2u@m)UIJe>)CA#-4hAYq{?OWq^rI96;4 z4@+)$y_}E@vSQ+enXo8YD+Mjgsn&g5nr}czz>)S^XvU&A-_>czOa!jFPrGU*sM}fV zgHUzgyM3(@!tC))7o9aXI5!f2zV*4anWZ#a!=a_^E+FbKe?aO`>}vG$l>QJu$;JJ| zOqAc)vjaxZcdy(me#C?uITONL9X#4{#a*n2KNGLIs*?A8PZMCc`Zeg*AA(9%4>G@q zd5u}rydtx9Ns!mRaj~8&gU>*aRnyiENtHKfj&%+(G&Gd88O|cF;P0-uY7t93=FR5Z z1GAQ)7|Tk%1jC}EkDb*n!#C)h(R<}YvxL^KAh-&ChoJ)+;3)i(IeIAds+W*$p{QD2 zt_7+8mpw-|-O04Dw3FQ}Tw7~Dez^>|V&Y%D&^==v7hg3Q7a`j_set@JWRvkMIz*m@ zQ>!P)*a;JB-ei2xLhESqOL=lg;h!FUGZ87S*|eT~BoZs>)=7kfUh~YQ$+eftL>zF( z&+L5Z4G|k7NG{UAg`oeIU<$9>KC>h82C5ORMCNjn=GfzBL=&~<;*VEU4j;j8Tw4Yc zUxKXI9x4kE6J!RZTli^(`jQo~Bq%v)`IB}iEV3?Gcp64Z>`|l3Q(1Se9+&KeP{m|@ zT*0eht>Z+Z*+L@w!2~>mG~tZ4n-<07ew;H-Rw@H6k$vOtFDwp)#t&!(C*dsm>FRkv z(X+XBkXk*Op;KcV<~G5NKa?u`M#V)|DY18KZsk6<bSgwo=A%&hP~ubh%6be<<O?^R z!TYNVf3O+YMYpXe0pBOTb9*>w;V^Ksrr?JBlv75x%z|c8bGPPqI5mknfbpK>$U=u4 zbO8x$rMbwOMny<Sqj);+IxMu<iodo@QZlIc8vjJ<9S;0K1}?7Djkrt1=_CSo3~Bp? zY9Z9N+@7#eLuXng#KYu>If8D>kq%W^pz^9Vs$V`xVP0@CaMBKE+78vGpS!Zs*;aD~ zR&X{tW%2g4%z8~<Z&XE1t@?r-pE|6=+{bN`=0@k~I&VxQA_D?K)_=)O^HJy%U#uzZ zD(QGRJ)0TK{At0I0dQxdYz&kPPxY&UvN)K`xmP-9CuW~TK1~iI$xEViTCExr=n8<g zJzRCB?B^1T-w+#K(}V0Fi39dz1p!^G(2e3pk*?ccyLMk*@2+$14n`g>?aRMD8(5q; zr{jsa$wLS*GD6#Ob~SF9JfQYd0qGn|O2C|KpazW?@Kz(Q!%$tbOocl;s{}apEQi|= ztGpW=rkuQ_k~p?RaHpvTxbv?@m>eAM?jl4;C|KXN2DL8Yr}pUM3>JXW!qP8PM-g`# z9;@aWjwSWpd8Wd%lWUzDombGf-E0k!mGni#sNA<72cluL2`Ij)wnbt(xX#1RCDYh* ztg!)}=Rt@WiipmO=SPer8}(E&7&?Hm9Xsbm@;VB<`0lu&rFh^0yl`*bfF`0jo)EQX zxIy`nqr9<%r?JF6&{pi<bkLsbWa!c`sFf%lof0aH0Pop7>L|MjW%y;TAcL`uS}0H= z{#0;r{W~R4>ArFZ0^TxD%Ohb8Fu=?S7hdm~KlCcXpL0kJl6FU#J!0B$A{Ugt^6(I7 z5)As@V8uJ{;6@#Fhtyw8L>pT18r4h7%3iV()kZ+cjoG$4$c2M;tPRDucARDQE493h zU!=gW>y>3+qNL53lWsu9>FVS6<P@~RX-zh$47)e$&`*C!{qW9VDpR>ME3xdZTiQ-; zFlqZyO2__v?+BsmH;1qij(|+_!=ZfA`r&F}%ydur4xw)C`6O&L!D(ezsYudQ@t$G+ zB*Laqb~zhJ9fR9O0R!jExF=$Qo>loR(u<aE7v3%>xrVc%7M|tAeI)Q28JTDn!EC>n z-aL5k$&rT_luQj3)=DxoD)#AZ_uor+>8juSit1ve7o9SUC-wEI>~?rBY-&PIrRZkV zAvS1XN;jap*H%nZ3NTDJN7lur;OeE2(-tC(TWRH+dQJ}m^j5h?1*Q3xq-52gn51%6 zFiT=4#iSlJGlKf;>UK)D33OG_nhA=J^0$)7+C3`k6It|JRWCHV2~!$u0^|>d5V@yC zwS}3@$8GCVQ@V&;dsek94|dsen{5s@?yOaVZjZ7YcSc7>WMcUU4yZ>%52>S<`;iW= zUcC4`=VQjxn?!+k{j+WLqwoJFUWv$jY|oHmbZylR6dGKwnycG-bMI4B&QpReiKVxF zqJw^XVE{JU$6jjn)@-AS+d=){Y`|O2fQybL222e+`<_eH%zyFPFAyC1o;Er>uSefd zwrR43n^G*=SI$%|2A+&BwqGqEc6p(<^qhXG{XJ(Ny2Skf!T-}s-te|Ju^OP9IbO4h z3-T!R%T;XO(CGA}v4mZ<IT>BO$$|uBl?adKEPCn=>b5$qF8J3m^kGWumh9l;<vW8O z+RIMNKI97!t!q@t5|cPU10WHbt75jpA3mR3*5*q-u9aULjS%q!^;npPwf)hYQ!9|@ z)W`$M&L$W4F>kB+DFDikM%TWdoL}|z^}Up~hTD!HdRrr^-#8sMJ<c4rHx(blI;q{) zy8Nq}>^U8M9KrHCLhPf8{+8>ohGMO}`Ls@wdCT#v+NBXZ*VUXRr+~~NplG|B^ZjK? zh0E@4=0|qI<~@^hR0~D!jB1pj#Q^v3wH$th-u)KvcHy}W_xn?Iz4pFOPt9pp&A1}> z%7$l1+1XP$;c2W5>2f&V8)D*HSw=*Pw?8CGwt3V}h_2yDz`q@S`$>CF%1d;i#kNiy zPJ?2^m@-*yPv4rdvabLxehTdC2|qSo6^n(pEXbp!@;Jj6YI5zAz~4-kJWd_PV>zwp z@gf7-qF#ELbL>M9zr{KtM}&h%5wJWFR2a6mbj)II_`lt(mF#W#`SRlZCYMTVUan^_ znblnEUVaOX^YLO+nm%`#|0)Ahs1B`gWo$^YBX|rYIeg5xwyhk0{B0i_#L$sT_fpZ? z{l|$Ng|2E-J_p$Zyg1qzSLIhPA=EZl$8R<K<+*y*aO8E$qiW!Agkzam0bEM5Q|Owi z>#J*v-*Q@JizJ7`Qip=HRqJdQ;44BKt9sXdtIJWlr5%lKhHd7vj~c#f8Sb<26lYu0 z?>p<4k{8^^h@5Ww8%LlleoNM&!TCNNwAAr2rVeT*&+%<tQ{w@%izal+8CP%Y#@Vbd zEK@Osnm*L5l38IpcvTc%R$K2VO>1N2mM;s5p#}^-US;vws@Z-~_HbiWJzJDPWACY} z<Uv^5&klly@z*p-$O)Rmv?VH_I0^Aj-!Sc<yj&xVP`;fQvX%!oM1-0c3$65sG3?~> zt)~rwjD+P`uHS0%ZS7NZC>YMjNG~Zf;Tc7Rj+vXQc-~+hS84u<6AF?(Z<|TF7(8b? zEZt>eEd9Yr<GaR`)*A`tDhh8;p)ehIaM|5*sYCJSfV!wioqw9o%I)kad;Z6#1@4$r zz5d>N80ee~@_x|Qdeqe&s&o$z9k!6eJy1+#S1#Esxi=C*Eo80JY11-U!)FrFWXtQ> zSWHGpSZtl1u{j*8qOfCM%4{mKlG3%dmO023F?YQ_VkGN4Xp}7F$M256AFCsn_UP=s z+|M~-%e{PNX74O85D@Dz1n@Fz5)xRN6|?bXYO=C3>=9Tt8WP)ci4f&#{ZuqvEzB}m z{gGt`E6Dn?R2@j=SoZ8}Q_i2Qdx*~Ex|_UmAKn5l=+h+3!clv*_jS#-XBen2ulV${ zZuRcEx!nGP@_$wzDuZt%jZVwF95A3x+oNV8QKW*PLaM8#I(^pea2(w3>(XU)%QeGi zR`KP*p8m@Hh5X}ExiSmt_6SZ2{>OsmdM(6B%^Cg0Q@)68**L*(+Hp;Ei_6u@*k~)= zVdCvlw7Vysxk*Rs{!4?-f+$z@tFYS5nU`A_1#E{2`WO*XT&ey8VFZ1@?<KXpyTehn zZf>ZfEH7*KvXT^pCsgdWSq&7-sPKXdy54<i?Ps$19LP*cf#=zDg1vbdG=PhT*Rb4X zdnnZ|=TVxPdaTIGxc2nCo0sP1^>U2&S1WB)$?#>YE=E!&s+!R&aQ{$+eRSRc&>M<Y zw^ON~aiQw~|BJU+io)af6xRou`|T>Pr}a6JFl>^e{%@TIfyrtj2c=`yGZ8aNp?g_? z+3Ix&B~P|6G_?ztwIeUmbWOo!fwo3_Eut>nk^dN<EA7428NE!$w^Yq0gcNYVFM7mU zwF>7n=I{2N#d;6<7(d7zKS_rKg)jKVP(oQgm~6xxeb3bO&t<IRmX?`GL!)W0f6jfT zG{E(69#pQ-kKj<6j0$4F@6}WmWZ3i8aJa98ycAPz>W3!oX(Ggy1u_Wy72AWzi}7M4 z6s?*l%!)BA39eYa{NvLDZ{4KJo+KQQ$;%~VFS#}t=|)`p;1)2aJQhuTb8x!9s}=0G zWL#EQ?(FC~cBU|ol^0Ba$bfM}7E~>gy^gK16Z%(PEqO`)WKp#p*=t`!K?abK=ug{x z!o)b0lA1C>+IznB^l)R;>2al(!Om_FpVF~&wJ3DOEXA%{cbc=8wo_IQ{LH48*z7c2 z8qGht^PLw2(&}!rUlw5}x>)o2on4b9lQFzr>L((FS*Ci)vCzgH@J<qtH?&+$k<%>4 z|3|-=B+)X8{JO*}*>}&@Q&w?b+&{g%D)(6vyH`)XX)C#jCT#xVw64Ss%k4GkP&w*j zs+oy?Z8fh7SRnS4iOulKAEJZR1upNorPODHjUIn#Bpbj#`*LGX;Gx>E1&l-pF_D{~ zVJmhvBdDnC)CF?9tZ3H67|%t#P%kdC8v&RPp4xqsvhpiH*x$dbTK)XdJ#QcExLf{S z^a-gMgjNXj+&R~#Pjuf9w6!jt_V(dhZyOK&?jKOnII@pm8fo|!lq4j&JJuxA6N@=* zi?L)W-A)VbZ4B+3cRdt}n9ti?KeMguYX&VFiQ@Z=y7|~^<nRThPK9S?0=dl1+kH|~ z@aW@#rN?3|fu~EeCw{koBPCmf&?#Wqx6g+cg#;bx_>KSiqFZaKIl8iPpO^G9GMYP# zxmM2VCfmGf7k>msggB*^D^n;8f1GZ*wN`)NpmA(>pn7@{xZr!Ty6{+$CN>F}=?E?i zmu!2U`FsM#?tK`MyodAj`Vpiw?^~5l@zI2euWdh`(=bIVVD;ABR1Yk;q)?pdfQttV z>PEu*msbTX&c10fIu7vdO@4?2s;2%38Ze0GAInHY#=0T$*nED_^+>G?+_Sf#$Rk`A zt!x7RPnQyP?ydypUF2XaI2BQRQYkM}dE+f{1M>=f=XW*<LsY@-Y&MYCd@dd^6!kag zdyt^DG29*iKDGbp^X=O7fjUTRba~dsDlyhI=W@r(yfdOIfc>&RB&A9Ym)v)i1K3ZF ziFnG&tQv`ww|+Lg^C9*L$f(IXeZf^pk?q1t3%+*0f35Agd~e`BRxi)~G8BOw{1z*1 zDeRqBbIdg-(z7f4j_Z#%mTda*^-foMVOKgjPjfpvtGB6>gbyycD$OvHNmdS>s|yxA zw|eUcDwS+Sae=-%2!Yv3X<%xXsN^7Hk<7>NX|CQnp)N5@_GwrT(nZu&b}K9+RY(S# z(I?#{s#Tcrmko2Y|NBuPyGHaJH9tK-`7!?NKvI(a`XG#}IaV)VFd>Zu4A>r;?)udI ztJ{0iF9I?5C7!Y3mEN*!tnqWox7v|tL{y0oRw+GKGi*PLNwGDT!m3(pbbeZo8%7=^ z(cQ5PbVe<78~s({PO-Bc+`$el0kcuL+{oI!pxu~DNZ;PhhW>1Abdoq*>QHUo8HPe& zfef%Yg8%vw2Zwzueg8B0zvA-tsT7u9T~b}01RspeU`dw*G59NJycAzAS|Z(32)CT9 z@Y-rAXt$nU{jTY%-D>rgBe3Xbb<k*8wXuKt#;DZJMQ=Hs^;z!mT)5sLVzMx*$avfP z?>jPrzZkpKjF;}H5gRm-z}U?#+<I1!Ibp;GaG1>?a7aG@N(Jp4F&A{G@FW;4VD-^v zk-+S0@)=ISmq$XUhr(JvIS8?^rEH9b#(@>zeXz9RD+Vs1VhpF2eR5o7)+bQi5hYXC z85nbOB=PBNj*Z*aWofC-1Trxkx_uQ>_ErKgJ5cQl(bsQ{YR^+N1&O6)e7b^5J|Lyh zN|-npq=$TQ*R1y^GhY$a;&0Qqht|&<DcKJnq{cF`CfASthr=+6Td6R}Nl9B39_bwn zLKFR&E%k6^W{qmiPc%FZ1>h4}OB;$?$%gzfMe(w+X@x&BwDfKo5(LP@O&NKaJCS<p zz!>ulcCGyI3ndJHE(U)78$SQiuB$)WQAP81+S6diA&jSq^hW2ZLBf~n$x7c@s~95( zGce0U-y~OfF-O>z(+4!F2xCA>BT-&6>pEj%k4kc*a5hy$k2EThN=8<f`qYl$g~LI6 zhu&Ju_Jn%2lTZYur=qnZn^B-C9L^b#FM~`aC6Q?o{xN);K#aik&kVjqwI_Xh7-`DI z*-q!w>$vCVh`-?B4+{#J8?IIg(vIhce4uRyIT%KHL1=V&&)x~Ev@o50XIZgP;MAJ( zcJD+gFX}$7dZGOmx7lh_0?E?#Q2K-B)Oa9nlrqUN?Ps=Zs4+7GYvmz9DwP-${f3X& z@NU$DcWx?#hA@&%pLsZU^-p|tNk<*I%6(FM@+nN1He;Ok)VpvqOK&`$n@r6*Rvigf z@9-B|Xm?<t@qU4WWA+%Mq(%S4gK9ChB`JPtce4TB72P*q-O5p~rj(LLoY;3hxW7wP zg*SMgl7uE0js-UPW&>DN(Of9xId(dT9k~K-3pgF0n4)N((Th}?|JY4-+BN=VFV*xJ zpXM5F;1!+v<BD0{5R-5~o(NFP2Zbw5I-N5NsgoyY6_QvjU8w|aj$uBeN3FKc>py;0 zQaei=1NCt`7PX}{XAMiOCTsYF`{N5(VFwY;e|+W0c9VFsfkTEyk<BM~sUod?xdyWZ zI6^H0<wycO%l!kPlN$IEItIbQtO{HBJ3|><;TbsDMv#Ku=<EykAU%u?_7h1|%z`N= zPoUJYbb#T%UcCDkl=+OI4-E})t!6eX$*bzdqt=v23$dO_En_&PyYc$*e3phn;rvuv zMWa+5r9+<FMZB5lAmqNoUQs+DX?6v6_wW5-_g{yR78?nd^AuhqZ<HC5n)KUm8n^e- zujsRLX=XWaO21(T2(6C9t6+n271^?^qq}wwROl@50{4swTxy5ssgz74<nh2;O>r*V zHzGg0_t^B`=o!*o@HG|=xfv1st6_Wd<`ckv`4n??h7@5k<>)&r)Fmp?RpszQtI@ll zB(u45lJ$+%2Z^z^8K!jj-;-V$UWD2Q)`Iz=4*DO&TWPD>?r9^)8-@fFW}khFMCsnV z`5FZVn5VUz%_5r&oPNNO$e?xbK?sSq$w%I>$xxYhW{XwPO!cUFiRmu=7JJ6cTS~4> zHjrgDCI(vrc3(EZnOqRg&<KJAR<-IT-o8PXS683eb}i(^+5K!&HkQfTv!=J4Q8e2W z88atLKvI%HN+8n6JLY$RCE?&ZD~!PD^$CJfIANloiNHxyObI7gyaGH0)3vnRU<~PK zrF|Xb=btzUsq_wp$tu~1<SZ$*D(;A=Ounw%s^K|=E#bN?O29?NP~-k(!s2ljQ517< z;8&}PF;;^xK0%qH&bP(-G6Niv5_IE?$f(H%Ym8lM#pG);L8;j$N!Ni_$w-Ja)$4N> zzW)@56^t?jF>oJj)k8*-e@!@H^~P_<Or=&mKbVK>1`U)1n@JvY%;@x!JFoup*6H6f zTg?x;i?$@8`PQS)sceDZ+&+!T#kC8ZQiuBeCkb1)G2}Th_oq!{yn?EvOW~iU#j55? zP&Tt5M$uC%RYup0+%o8C-lIXvDUFXA>{qUXTv!n_@B__6IeBEY*QaKUxoLHRULzV< zI-DG3y(;>*`fZZWKu2u9!P>)lU6*eIX4~{(_ho4$vUiYn%8{K0s*g3rl_sa>o0)_J zt78`5eM(Ai4gW!uhfeS83XY_wR#bHNTyv?Oo+q7XYmflFpk3&Q>rK{*N9;PAz3A&q z``R+|8}J$a<7@2!WaKy~Z1DK^$Rzv8klIAgx!#Xf?B0AWGg+tVn?Q;!|MY?>p=JFl zC5Pl>L$UdXAZ;C>Bed0|wq7HG6?I!u|GoH0zmeg;`jH6KtV1BQrh*1~op`a^M+c3q z$-yHh&p(BM0a<DYwf0v0tv$+3tqP(IJWlL8a5C}bVFL=e60H-wmw%o!xDs#@)@I49 zG#m}x3C;i(*Sxuzi-)U%k*gG+D}vS3e5x9X`dSx15!I)Zkwp2L4R-dgKtsDAEB?6n zG;gfT>i>A?@rp#y%(WW9ON16*$;DoZ;mF(HYlHfh8O=)#S8xC<Z0@C^El6Nr6EOjn z*6EJUNPJry)LU{^U9?L{DN1`^I@D}_V=`7{qczT1o#q|gef|{E-Sxk8u;Eq^gM-wn zU;Wqk5`s=(6WX)%b0f-`ESfALwsH-SDf!=8i&EoK|9q|KKe6OXV~<$_DFMghV8H<~ z%ik2fv^ss4E37nrfkU{xH3yyi?}G9)Ciwk$pYLB;p#NwyusT<^SE=PEX{8#{dV)3$ zF9={8pR(H8{I6<ZHK`9rcmp}O*wjz%w@;J+M0<NJ_y+e#sy6Fzwd~7^<9DB6hnH)v z#LktvqVSy`KD&vY$ES93OKW20<ZIr!Z3R1&*B#cXpMq)b-u&O?lmNb-UiUA!A5{X1 zu9cIO7t&C%J#9(++H24Xt8QvXDvg(2e(BhYF1qYd`0+~}chEz@oyk@FUP-z=`>;)& zMbQwe72G4M(8IjKq0#c1XOh8Oa1$x&1!nij!7As_VFfE&+3Y=lVJ>@XOt{Pd&k`wr z5XI!nmw#*0rGn!T+0V%4+DKy&GZ^V)peMe26|}y7>CiGuDO>W$n3?Dub47XWwMDFH zhlF-TBkbPO)6?Pa5|g7Hy`kYoF+#2T$b~<vzUE^le{3$Njc9nP^+<@#v#xtodxa}D zM7v9s$3(Y50pvqGQXGM23=i$(VBC}6T%m_byO`udaU5{$wr>34u|JKh-A>FR%~X2N zIC{*<M;DjIJCaJd?*ry)s%a*NRcOLVo!zwR-iwDZb%cqv+w||voiwr*9On1HCNx&Z z4v+v6HK-dM13%&FxIWyS*XqYltv^Z2%tt#i*2z}xT?u%%1+hm6T1TRjt~8>Sr|LO; zn4mD@(6MdB`+(Y($Bmy=?>)ro^%~l(J5N*<`T|?1p>Fa;d%lPb*|kPuIqi-u@y!g= zzvdAq#V+}LUO<SL38=(^ZA$x`ONnM7=d`;ti62)t?ku~Qpe8N@6sQzkWdbtdaK9$s zB?JT3$bIj);rFeS(1tiAub(mRSC)`&)V$bt7*-tkU*hr3o63OiA8XD<i6TqU7f?+C ze<)+Lc8p3B>DhuGbgEAY?{3b`?;@<7(-umr1!TUWA+xO;TRx^BDaZmgc`{#c`hG5r zZh!0y=&FcicP(t(+;@LPpe%WF!b9$<oU0KMp8eIwu1V7ttd5nnf(UVNE{qZ<)IG;A zk1cWGc5C<&XW&+qI|z*xuav2oea&%kmxILj$QH+HcGSXM7vsaTVaVYXx)7Rc%Xf^t zKgRZbK?9*lcw^J`j_av?1|kOuPx!*cqm#6`n+LzI14^e9=7(FwS_ayrAXm6|JDA)w zJu3#EajT4;hR0PwA(6(rjQEgc)dMX9R%VyQD*FLx%#$>n%im@mHBG<S>PuU%3m4um z<qTZNIHm=@14zswIPb_GD_qtq(V89W-DgS^)<<>`TisR1B2SJN(<(mDJUw=V2t17) zpM?~xSsfdOKUILPS744h5kMC?VN8Uxn+3w-s<BseHp+dDf=shd1#<r)mR-sH&a>GO zjY<wHt@i96<$3tTaz<E5_Q$ivf4QAB8phcYz%uI3aZQwQw}n7dtWJ;L{ptX|R4V3( z>*Y&#a!<N~nv1@Imrg@Q4tN+4)kW6+QawU@sZfTI^ex`b^Q17iz@Bncr}!kW=I<-t znBp&h>SI`P;ggPF{T?&Uldy>;-Ha_P<dpY^R=VuVOMSS>z_7R2MS?Hhv&f*zKH<&8 zT1KN^;1XP|pnhW54MvApr~tVF%MlmHP<{n6;Yq}jMiyGI^CGog<w>~xM7)W>@0&EF z$%|ircP$;xXzw3NKTzt2ZL{%-3uOmf>r}aa4(lwD0Bmm1J==O*UOu!0M=nT~Tu*qI zEhJ~=EwZ~({UOigHvN0WHnzfv{afJdMagwHt7Txo_PANDU!W51tX7<|L%)G>V*qZj z=awj%f^2nE$wzWDG|tk2&ULe7KDv);O`(ot1u;~v;d5I1kXgZSCDsY;#s6*gOWb7s zVezURzj)hty**~gDa1DTxI=&!GEv*O%2d+5Y@(BA<af5@{5GJK8t^8FL1M>Z)CbO_ zM4;C@)(V{RSak(t!dlAJUN%()si_>c1~OKBMH8UFIq6-BT9qY0w+|ifcy5)oOpyD6 zLr&nS#}=wd&is$G;y<oLfg6+;ph@mF0kR)uu2TIf8^HeWHQSp(12<)VD*MB9&$nd1 zHY2Je_o9#L0E9fU?<qKOX0_sWEtPNrt(bZYB2i<7SPUHUnz|*&Ji9B{!&4|8O0*uA zlT0tqFuCy<Lf@Nx26WcVU`r?#J4x3q?Aln(lSf7>RPcI^J6LJPR}d<&Cvu}%GPnC; zSmk6cUA*lny^9A%ZdCi%b={0c&0M>A8I|PG>jVON!vGS_3p{(=6#meWi$>(aoKMHr z)j<r|uMFz+L%`{8Q&9gP&yUBkNzj>_z?0YsKG~)C)@gEHt$51067FK)Jbe*#Mu=o_ z^w;jI=RbKIuWMB;qYq2AHjr4%2_Ni(pfMTF?U2tu$NCX!7YrtG>Py%=v{-iE`)LD+ za-+xc_WTbh#V^j1{eD>?gU#$*1-7rc>}7)(FnDhYZl2+C{lDk6X4iyd|0<J;bU^CI z(Gq&rtjIUt+mPkOd*K2Sk4$eiDa*Zw-R$Wn$Gh^k<tSDDUcVSAm)-;6KnWvySy)lr zB<X~_Fc=6uKsGU3(DHD-h}=4^X-cX;GAbF#Ci0QA2hTWM(So;-%c5_pEBsleAJ*A! zUZ>bT9?1LO^H(y{3ehM}m@@(w;)59Ux%F0>*<S|-k?*b;2t=;GnF=Vm&hL2bdpdR{ z`nO#rgx)a?ud@g23`xz1ipI`NI=N;#`kkUJuKh;@w07-^*Ze~eM8cBa!mRxtSSL{O zyp^?x<6Z?yKOjj7U1DKVK0XsyWuS#-3#`Xmod;z<l~`?N>tb>7A3QsYe<WCojmex0 zCrEAlFaLF2-xV*EVl8;;O+#?@DBi(nE-Fx2qQ!tre`^`edJPmRoO&qnpL2XaW7e4m zkjpDrNrQ2#Nm6vq@_#jqqZK+SmS2|;PFhz!iS@W&cicTlnR}K_dyEY&)--LdX{Z6> z?uaVj*K=piJ5HPQ6o|)1SKVjxGcN_b5x@^2+IynfxATYMRJXo>-Y6+RXJ+3B7Hjy? zY6<CYSGfQ?o&K`pEz24;#^~H7ABSQ(%@MfBE=}DXuO(~$XWI{gG@hjAl&>2exPG#y zIE(Cpve!^vrH%!1J)#(}NKQ@Yl#BhCR4FMytfdo&9C~-Qq80*-9bQR3VaH0W>nA<z zum_S2Pi2;~O%IgZtZ+6BIY88-OT`jzFK1)~a~a8c@EVhY&c5NyQU(xp^2p!dvFtXA zwhY4^9odKQzw}EIAhVR42xzPq*TOnrz$Ph2-#zE$v!4D~1l0x*{Pn<POBH3q*_0R) z?;9}+g=~n@LZ!?Nm5@zv2zt>TOtXFkHhd!|r)v~s<p~4M0X?Yhy55dyWgdB(lcN?o zDJg#j$!wsJ<7cL-ai6^Rq*An@y2SRlc&}Q<w%$h`xn46vYhIn#*akj)=kkGn1+q*c zjnSQ|2VBkoPKjdXGnfJWV|Gopd1!Z9$?b#N{v+*~Pzr&LxntJC5CciNR$6Hj73)Yo z2dYVZiQ#vV#9d(QbV$EX?>u5clraRrt_U{kRobtqP{HV3G;@dF=i7u7V<9H2=k^NA z!%K+W)^1*>&a^{&S+D3A0bFAlHjEH@OuRDWWdHqpf!bnO(>I=7XDxrC*_WlCHzbHA zUa_gSVUfgw1);2ry|xjWu;sfu-=z?v(obJ<PzwnWS^rs+2`dr(r`p#k=i|sG#(ApL zFo8qlIw+TV@B*czMBcX>LXfhy@2h42)kpimx?r#9wqV=1wyTEKTSEyYr~%IXlC*Et z3(?IO(`RVb`*gY~i=*PF17O!z8k#C*Sc`($Lt-MH+{VP)*8um9?N;VRC>x>vRwRBx zRlYIdl9R`J3nk8SpN;N2w?67F)!12H;G7(ht4PpVkF_&~iK&L2`v$b)iB8wA;^Sdt z3|zd|z=n){icMY{U-Sp#!rPk)Rzgl7uc|(f1RzFKBuQ{G3k!ecO74#|fXq!4meHy~ zA0=%KEhZzPG6EnX%Omd6Ux}zq1INJtb`NkiPkgx27RxGtMC<3o+54ntU^n>BZEZBM zOZUX#C@xWE!JKj(w+~_njOs?1DZ-^i2}a8z!qa`OaR&M2-5jQ6FOpz%LIn7urgK1Z z3{@FQg0qP{LjHOkBHukuHu|gD;oZh$=XU>ralN)X4TOZ3r^*7wKtvHspO@;s*`l3| zLejKlu*X3Oe|j1!i<ZKa?(JWz1S8SUY@%$JZ_3s*h^CRpkPYk~A^4LbPW)>pKcp*q z2E@m&DQ~VF2w+2JjVy&-*9Gr*RKU?unJzh<(Pxk18su-q>9N{3mf5hi4?6gTA8jad zgOR}qidfGA58>CPA19o%RTxH;Hl>UH58HkhC*1s~x>+!(|Buotu`74wop>&O9Y-rW z$5j~~`N&&JwN^~t@nGAjerZe>#oK&_vwAm*USxAKX&@Vn;F2;J2R-w^pVCixL(@Zi z3Zb#0ST~X%v1(m(1g%_tR9?&#@5UT{_=@M=m-?WGVskwgG&|S07a(yP2z4oiwk7!G zsfrUxoxl`?-~QS~RDtcVJtT5rccz(dYJbW~ZG?BF$)0@FGyoJe?C2gwBe!d<w*~{> zz3yDkze6iDWrfHRqolS6kSFfkhw;AT@^g0-LHLu=;d$@v3zveVcX<ouo(HU+kiZD9 zm;92XhnnmrntF)6n0w4b`@#%7VbMfdE_ud=J64TVM_ry{4$te&xEYV(BoBA#5EC@^ zyb2(cT|oMj<aPJ)>+uPYgG>eC{YWn)y=cw$O>NET0ybc6zu#CA7%_h-b%fv$4jJw+ zXPd{XBI|QuN?`S0QZi9(BL!!ZReAq1&JjEBlI!H-_~}8%h=BFq9}<)Rmkf*i4aCPp zOZ+oMgnaJ(ojEi4VAyfH1b;t|5rQGz6}IlG1yobl2HJaT)U<PHqplw<|I2|=$3ff{ z`i{(v5LU!vsxTg!93$op0<7zw^g#nbG7owi97j*+mNu@17;?sT(bt;fhGlvFfBQfF zk1D<@{S%=0Nr{*c8iS@4m7~6eKU@mUzW&{|j7Ot7<|DfMJP`}|!{T~D)zjt+ga%wt zHHz%JcegcDEUnle7cLkAf{_1{f7?k4JG?EVeg<p&=l|2rd4DyrMSUL?6$Bx4xdI6w zy<J3*62K^-_aYrGMF~|P^y-b25D*NVP$D2rN~8+Xu2Q537?BzT=}lUIAVlOH?tT7% zcdh5w=ln2hWz9@x=FI+{v-juhJ%k^tm)?a*F@IFn+}*%dFzTAFLmH)%KP8wnsBhRZ zi=^((z+n$#$tq0w76M(RlZ0G~iQCb>i%<Ss_M47_X-pVpIlw?wdtNo5<2S3tP>|AU zzAf80t39S*LHa6iv8R$By1Hc8ibKL!i%KXt?+gBU(0%JJ*k7TxzMwzZxB8wfZ4&8w zY^3g>pN*kky3q~R<gd_?t|6ZU?(0GfU90SeY_XeMq?0>BGfJ^4<zF+V-M!uWj-;IM z?%J)%5j~%p^9NTykKFYqAc9BW=MYUY_h6Qt&ybVy?A^!DVb_%Wbv8X5J?8`)pM`+e zRCh*S1c)fDs!IDTbgn_A*j+P+OBR1=p7+cDw!OT7PE4eJoYCHT_BCE9CQQb&oUmW6 zWaBN7#|`|qT0%9!XHub}qlt!wBkE((2R^oN14|W2H-vRpdy`)#4MG}!rBY^3&SJw; zs&`<oZo;MN4_i0Yp0Vhxi0Z}7CF#()K$C!~lZ{RyRlTac<258@7~ir{GQC-8wL}Rw z$k0<&<4R6krrLUX3lfU7@+X!aeiNfA8e|Z@c4&z^M{cMkKOb)(gjx|V{Rsc{_|i+t zPIi#!X;gmkvgJu+cuv$vK{jCX2p`wU<`$xp@X2o&M%n=*cln;&dtrkyrollnyu#Tp z|In)QB#UjToZ?k+qiW5{z~X_>xaGRJ>o>N=YNkzzRDS!C0z5;!&<>T#L)oc)N2mz1 z`h8eEv+8@D90A-!Lc+0(>PvAA9sRB+3N+$ZShas?({>ikRqq3V%dNAg-93ou@A?;L zU|u+sRgQFv8nQ?G+%3?UzrevA>h1OQAPTB=t#j(7*q<`@M*|HHl6*Qk@JPWs!HM9G zYrbPNPayyqY>1kOn++fDS4Kk6LqJhA!sCT+e(ACier}}i4Sm!4&FSF(4t)uU+Bj4~ zmkw~*qsNrgN3l;eLER@SkSOU|0(k`}*1Yf(@*09Ri=lIVwGwJ4PXj?;7e=qV=5SEe z^gJxNbGF+WR+O5^UQJ?yRXGmKR@CFkN6diMXo+&7V#`Xh7rgjt{-6PMKNdurrn<iV z)jvOH5p{BUX8gv7PJjl$Vdpoj1iNGLSjlVuDr=r`!Xn>wnAZoC_T_Ll;)AMe%#p64 z>9W3?`1VZ=0&$c~FZB_j)IXI|YvOc#Q2)p|bx=sR$%uJ`D}<UC^4HN8CsLsC5@LH? z_jgXV`w;2W)v!T0Cw{xAs7TuKO|{B;h-1-_EyCV$-|w?*gxp<Sml8rEB0T@qh{>eZ zK|zt?^OZApFC-uM5;*0DCtF3kW3xiQ?{Ar@<!_$<Drj#098HRjp8d3&9FcTTFXe2| zkrpr$zoO|bhnN#sbS|CyzOAqTgr*WexEgWpfiyg^Z81*_iBu~)%yC!QcZ-b=E`P$? z<ibGmIy*flQiYxe0)+Ue-z8RM$d(ZBS4lgCmA0;<A6eLfUxvQ+_up~#UYk%A_X2MX zvN$Dtjrc@W5wTHm*!aDOM0A3i!UrGT*Y!|eUyTjHT?DMg6osg2))7!zmU5cY&k*5# z^^xwpH~ZMudJ+y?Hv6t{jFiT^X4pH;EjC?!JgHzq86|5Cjl{(B8w|L$q;X%j8QdwG z_GP9MU@KhLXZ~s*M1l(YY(6#ckd8PLP0)C0OG2ZYu@3lKy6_>Y5oQx=(i&2$@GR!7 z{TA{S@Q9k#RTp30KVl^P-aj?~a&c{C@^bsu-}Z+XiFL;JIDl%VaG8?wK_8<W*f}## z9k-HCgOw>0i=~FADfNN%>{BsWvHjZx5I<JJl!)`*sz+|OyJKJ`@5n`o4j-eT&Yti+ zuj)tv7<&hpm(mm46C}Cn89Cxp7|C6{J5hK!ztU|>SA7a&jjZ^C6m-_mdA9ao><*Qh zuQ#svV^wyqvFz26MJtz)8DPi;dZ0?quTuqk;kHjdS{;{mjSN$ldE2>Blb>j@wtpuu zZ#u61tz!FHDqFMoxXk$AuJRAnuy0QqB81=CCAULNZ+X5@j0i#X+!MGqh8oBXD8v&g zv9x>qTLMK2?fBiNO{(QbX68N~b|F8<8eJdtCP}yy-$^_ETdHGQWHyUo715itY0bW* z8G(p28rS9?yfcU+`RfpM)sA@f(n8f_=oWrx5AixTym(7k_3W9b8b6+QUdQ5MQNAR~ z;mcyk1iJNxSQY2E4%W>fI{#Go{Zf#>Jgb-{oozF#M)KsIABHfJa!x<VdccCrA^&4F znIdh=L~z9TP~sN~6C>lV-27d~+cLMSRNxMl6MgdV2D5y4y=Ppu&YxV174$T;wfzi5 zK;GDKdlv<BHk~4ve=9jsjJB4WzUb#aYL62O5Iezcs<)6A?2Zgz>0Z^MS9n^E6XN}? z`!?ow-pDQ(FXD$i77_y2y03;#dKMNIN>{elGk&IIVeTJ>8<>wa;inmMUwBNnMtk9S z{J>eH?gw&RTbr!hoRZi2ZV92Z7b5CK<JD_@$Bxu8Eo<wqG7MQJgXx-6{=~B-m%iKQ ze_Gt+{HhM8?gc!s^7!4KU33f?xgX1$AWfh$<6U`WsEjG8zT@sE27FYOH`+llPCpzA z6wK1V0z!TgSOz-!tdlZ!!i-l|BHuP)Ev8JzYq=%(2sc%$B8HtDgC;V^28!!aEpSB; zoOl5?GSa&QjVpkp(n4PcSeaKqrd{tN(Z!)YomqTsMH)hS@Vahk&bl;O?R4kvt7pOT zR6$L1>mY{!iHm(*&ztDHgb5GW$0BbJGcYfnnaY_<T7q;C^)cF3Nu^n>I~=q*lnHCM z{FeFov$WtRv8wz7(S-~!sJOOTLRpfFxdliDZD(#(q5?Mjox0&Zfks+amQcXwBdy68 z{P6x1$4-BGv0Z%NFI}oRHD~C9m79u%k-`(0xr@61uujup>^J-^HI7xo3G6EDziV78 z>fpu$*VSj5N58OuUA(T9Ubh9_UWmA#nM3$yJ?BVzE2NL^7aW6XSQA2gi>_$N3O0g8 z74ap}hZEx(gOTc5teyhVQ0Pv7BZtk9pLw?Hu&jHpA*jXh`$zv8EDj~wlndq8jK4ad zHpk+0gxQxiQZWRG-}xA&fXcQV8-7UBI<7oE#!;ST`T595rET~k%u5(`<7PFlxLVuw z>!N5Xd;44_)=p2_8~Z1Tr+JDvx?{#}fg#R{Gcn_<xJ{RDG36=_tu4m=6*Ww+Cf_x^ zV5dDj^5*T#^Ca?{nyaXvLJYVMNM(36UEK}(>NJFl4Ek_L@URp@&NKH@H)Yp?6n{`a z6PK+4Um2JtO+h6q8aQ!2-#T^hI4`EAnHM$5NNXZF@!kYme@+!CD-;<<S*>_6oVmoX zBiqWK)2atMT;LOYIsaXGvU_f@Fq(9=Ce}$4oIqD)@Q0X9kC20%#y9EtP+!TAsM~TM zwk~7!hD24jbL1WnKy31c;nT&rOQJw#TsilVB8Numo+ev&`5QZ`HsLnx>%m)k=SkqB zDCcvh2pVvN$|fwoy02Q=fBTT2uU4*Tauu~kLWyd^7o^jV(O=s7r@C}KdEW`5^War~ zhMCplS-3j5xJx;}la)~AyXlh)H@J(Uv-W20SuX#zW~G*n!6nF_hC~{!y7;Q<`c29| zoIh@$7Z?*e*nRhdEv{P!qiSb_iR2cfhe0<*I`5?7P$71c%(}1ljLVO$qUwzv{(b%~ z*;l`N@79|KWHn}stMBIA;y^xnso{^=7t@zaE**Hrw4=0=6}W~6I(LY}jNNW-BsYjx z<ByYK{3*hcx|MEhl_R{g|GB!1SYpGXp^GqXI&(t8xsz&bSN)A{Z4%aADSYv>%63)K zk61H$kwh~+Fq*gGFBO=akqY%nkihY9eW+Y4+{%$_yc;TjmOLo1=i=`#neLb|GKfhN zeBFeUY>P`&i{7XbE)+%9(C#&(TmUxH<NOWvN}M<OElFhls9TMC^IS!>*6A&>mN=d! zzuu9shQ`68Y;l(j-A7}SkHyejE`?t6`~&hAy_w%Nyn~l?MLl9!pv!gfhE1__YY#1Y z&^r&kksHi&Lm?#O9}MDfI|(_Jo%=Id{fjJY5o?=@A`2P(pS;u2RtY+HJBhWT9VQ;M z*g>YyTTtS(LDS}KmzZzuU;1kvE^*5aWJ_hDv34G;4tewfXKh4UVy68t_ndmjyBb`L z7*epTG4_8%gi!n9AfN<aHw7f6iLzRSAtb7P-DzL-u5miDTxHl|X7}S+U;wngdD#P+ zy{?GodbGw7AF1FwUYQ=V2fYJ0%+{?zJG^2T;>^3%hv-TFrF}7@%fxRd8Pelsf8qN- z!3TThC+qDt;^9+6hp&ECL8j}flvpZkbT&0x5A94xE&4k2*?_>1&N+=s!)*Ds#p<-R zxXOJ{ZUtmK)QSO!)(ZOV>`oYi@dz*2(!8Td!-8u1tHy;(QMy~+<6jf1>>W)$MX2qF zn^~u)UaPppPV%irwxo-oab;s@^cZ6xQnP->d9Fhm-4r;5vDXWX^|J+e%gY=;_`(v; zZ1%5i4J<(||1?&R(XRo|CyWCXf~70^_8`1P)B`Nv1aL}2+oc_?5-fkK*TP1qT$hTn zZh>NejUHLlGc;%SgwDWng8V2vKa%^V&0PM1U)$z<V7VBw-f&%6v8A-Mk`9a)MRq0% zMN4P2r~{QY=~$oEvkwiJ==gHdb8~CRzxouGLIdf|8*ZBq^T~RIpLc2Z1Xwj>!+M=f z$0t#uQPE|o4+FU<m8HmQ*NgQMV?U?vd@!!DcYV|Ba3M`JX6R8=%whjpglP)ow|JQZ zx=VSMbD}oyOo~aSey#5}d|6r?ScbIYv4xHsZF=^s{dyLYt+f65%XvggTkFmsz|maO z?t@DVaeZ3lW$&__%WB=Z2tjjUA(%$CV_54P7hq~_Xeu)42*{XtPGu#zj=1aK7*e@- zDFvq#*8{d$(@|Zc^g-R0)fzt7QcK}f)NQ@KPYLv!62pVkYGJJAr;e3CzVtx83QD2k z;XQ8{bX{?7<dV&2wI8P9{&_Dg%#fqCV7dPcfkR`H$kb4?&(zh`LY^>NcNFQ56#}6q z?_4%PfQ8@g_%u8&A~4F5cykq>NP7)dS&!H+XRcj)<k9fh&(J!~Q|Wt5`WvuyP&4?B z*49i$CT_on#c-INGlgGQ3fA_b-#d-%?JZe_$Guzf)*mVDu|1+w!II(0U0cK7_lLfi zr**%ogKV?Jksl2Q2VOCv2gQFL>DK`j@&9z<>1V(FPAC-xK?7XmCLCmt(Mj|-?M;Q$ z4rd8@fW^hNM2KB2IGdwy>!pwaY_Oz-6G%gbzUbWhv+CStXJFvEP;+!a?=-eYt;cPd z2^(ex@{SCW7b*hE3Gv1+L<2ZW;soQvH`Ce~R4WA==Zi$Ekinf@00XEW%U~BsfEw*2 zec^W!gDr(-%cDM#Jsj~y%9v7K35vmr%iNM^hGf!0sO0m+q_*)Agr>n0k?oIahU}*H zAQ{FTJrRB}9WqPGS=Eg_yY1H?<%zRbr%|w^hJsb<Ju(!C@qjog88TpB=UJV?V3RA6 zqTII9Y#Uo6RD$WQGfb~1U%z|VWSjL8>>w3_Ar{d&p^3t@lGm?DzyBb$q=@RK=YR$$ zl1K>`|B>Gt7F&;7Fo0Dh&|!$}8@M2Z9T-bBsGszA=PLvgssS9a7nrlH!Q+W>P9&Bo zvo7_vbiOzp3KSk|E{JZN&Yew$$0ct@?q&aex!IUQ;LfUXvR*+Nu0ByXt+I<43Vl~2 zqr#MN8>*fXRbZZ0EfEl#kTd(t^DcSB>R#-{>2z1YSrt5{Yu9s(v%7h%qS`aeyPg&) z`((I@bLIW?tJ6Ux>?jx;y&Z%8zK5d~8P+U21hTGR(u^ZSxGmnxmdxsw*Sd|l1fV0- zB<*FQ`Ch~8uJOF<_Lhp#FZ6+#>!b$a5Mo7ct4D0<9nhSO7b-R_`X?u9s!*m6IbdzO zZ%PkIaJGD@<%SN~sM{-BSO8q>`0u8XZYLL22a)(HdJh}8x;r)CD&{{z7JmI<>gSUQ zvD|#@w^UwtLn^4L#thnK&-V8|uuw9QuiW#Qs-8A`b!Z-U@?3YxjHlpisz<hfbE%_% z67k;{29yoG49uV4SzjWC%35>?u)y=^U<XdHr8PP&dquOco@X`fART@s2)~WSBb&_6 zFI?{EWzEonw6uBn7Pd$X&v{~wT@Ir7_<}sc*~b=+qwVx_<>I{^<<oem!maIRJVM1= z6C#$w@c0#hFVr!F?V3JF=7$8YpnWT-BW|H~WVJkd#<On}Bx*C`_yW$i%@G$N?_>u~ zB~9qqJ8}{LG?}1u5ZOUU=c_dKK?}q>!}cwkrG?IHbrk9Zp_iWuru};VEIv=EZh&5l z$1f<DF4t4y8jAt5+~@@w1G++HKRBYg$13pc#lP1q+*Bp;spREd<(9-2GJ%B);0RH@ z7*PBKba5}V|MYjSGAV;qLT}7BCAr7HyM^I~#5Q3+?08|eY5SN;i3ZrvYaV+lUqu9a zC-k4z4?6&)_!nROM<@Yp178dLw*dp>c?0zRZ~LF0OAkss$*~SS*wN_)umAS^-}e8z e2cGt>oLwlZK2dJIZBITwO9yVKQFH$<)c*qn9`D2e literal 0 HcmV?d00001 diff --git a/public/logo/joom.svg b/public/logo/joom.svg new file mode 100644 index 0000000..c771ebb --- /dev/null +++ b/public/logo/joom.svg @@ -0,0 +1 @@ +<svg viewBox="0 0 123 28" xmlns="http://www.w3.org/2000/svg"><path d="M45 18.804V5.764c0-.485.185-.9.554-1.245.369-.346.812-.519 1.329-.519s.955.173 1.313.519c.37.345.554.76.554 1.244v13.04c0 1.78-.67 3.3-2.01 4.565-1.35 1.255-2.974 1.882-4.873 1.882-.517 0-.955-.173-1.313-.519a1.6 1.6 0 01-.554-1.23c0-.484.185-.899.554-1.244a1.821 1.821 0 011.313-.519c.865 0 1.603-.287 2.215-.86.612-.573.918-1.264.918-2.074zm25.642 3.324c-2.081 2.081-4.587 3.122-7.517 3.122s-5.43-1.04-7.503-3.122c-2.081-2.072-3.122-4.573-3.122-7.503 0-2.93 1.04-5.436 3.122-7.517C57.694 5.036 60.195 4 63.125 4s5.436 1.036 7.517 3.108c2.072 2.081 3.108 4.587 3.108 7.517 0 2.93-1.036 5.43-3.108 7.503zM67.99 9.76c-1.35-1.34-2.972-2.011-4.864-2.011s-3.509.67-4.85 2.011c-1.35 1.35-2.025 2.972-2.025 4.864s.675 3.509 2.025 4.85c1.341 1.35 2.958 2.025 4.85 2.025 1.892 0 3.514-.675 4.864-2.025 1.34-1.341 2.011-2.958 2.011-4.85 0-1.892-.67-3.514-2.011-4.864zm26.403 12.367c-2.081 2.081-4.587 3.122-7.517 3.122s-5.43-1.04-7.503-3.122c-2.081-2.072-3.122-4.573-3.122-7.503 0-2.93 1.04-5.436 3.122-7.517C81.444 5.036 83.945 4 86.875 4s5.436 1.036 7.517 3.108c2.072 2.081 3.108 4.587 3.108 7.517 0 2.93-1.036 5.43-3.108 7.503zM91.74 9.76c-1.35-1.34-2.972-2.011-4.864-2.011s-3.509.67-4.85 2.011C80.675 11.111 80 12.733 80 14.625s.675 3.509 2.025 4.85c1.341 1.35 2.958 2.025 4.85 2.025 1.892 0 3.514-.675 4.864-2.025 1.34-1.341 2.011-2.958 2.011-4.85 0-1.892-.67-3.514-2.011-4.864zm18.605 11.364c-.14-.25-1.993-3.288-5.555-9.114v11.495c0 .483-.174.892-.522 1.227a1.72 1.72 0 01-1.255.517 1.67 1.67 0 01-1.24-.517 1.636 1.636 0 01-.522-1.227V5.746c0-.394.12-.744.358-1.05.24-.314.553-.526.941-.634a1.775 1.775 0 011.986.783l7.347 12.012 7.348-12.012c.199-.335.482-.577.85-.724a1.86 1.86 0 011.136-.06c.378.109.687.32.926.636.239.305.358.655.358 1.049v17.76c0 .483-.17.892-.508 1.227a1.72 1.72 0 01-1.254.517 1.72 1.72 0 01-1.255-.517 1.66 1.66 0 01-.507-1.227V12.011c-3.528 5.826-5.385 8.86-5.57 9.102-.278.363-.781 1.012-1.531 1.012s-1.319-.625-1.53-1zM18.75 19.333c0 4.51-3.638 8.167-8.125 8.167V8.167C10.625 3.657 14.263 0 18.75 0v19.333z" fill="#3D3F56"></path><circle fill="#F64343" cx="4.063" cy="23.438" r="4.063"></circle></svg> \ No newline at end of file diff --git a/public/logo/junto.png b/public/logo/junto.png new file mode 100644 index 0000000000000000000000000000000000000000..fb0bb056df20664bed5c3534aea2be109477500a GIT binary patch literal 7450 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 PubYO7wsO(yH-Y~HP0bnc literal 0 HcmV?d00001 diff --git a/public/logo/lunatask.png b/public/logo/lunatask.png new file mode 100644 index 0000000000000000000000000000000000000000..231ef200019771c57ad2b92ac939565e4e1d8d03 GIT binary patch literal 9674 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 G?0*2m0`;l@ literal 0 HcmV?d00001 diff --git a/public/logo/mts.svg b/public/logo/mts.svg new file mode 100644 index 0000000..a219222 --- /dev/null +++ b/public/logo/mts.svg @@ -0,0 +1,11 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="393.75" height="98" viewBox="0 0 393.75 98"> + <defs> + <style> + .cls-1 { + fill: #e30613; + fill-rule: evenodd; + } + </style> + </defs> + <path id="mts-logo" class="cls-1" d="M995.009,182.253c-7.305,0-15.966,7.023-23.11,18.83-7.446,12.228-11.888,27.366-11.888,40.512,0,19.245,10.8,38.653,35,38.653,24.171,0,35-19.408,35-38.653,0-13.146-4.44-28.284-11.85-40.512C1010.95,189.276,1002.29,182.253,995.009,182.253ZM1184,211.127h24.5V275h26.25V211.127h24.49V187.5H1184v23.624Zm131.24,0h38.5V187.5h-38.5c-35.37,0-54.26,17.586-54.26,43.747S1279.87,275,1315.24,275h38.5V251.374h-38.5c-16.37,0-27.13-5.851-27.13-20.124S1298.87,211.127,1315.24,211.127ZM1130.61,187.5l-13.99,52.225L1102.63,187.5h-46.37V275h26.24V203.83L1101.57,275h30.1l19.08-71.213V275H1177V187.5h-46.39Z" transform="translate(-960 -182.25)"/> +</svg> diff --git a/public/logo/okoo.png b/public/logo/okoo.png new file mode 100644 index 0000000000000000000000000000000000000000..b68e6cf06b679f7c9360d198784a3c05256ad743 GIT binary patch literal 17071 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 JRZ`~P{~vv_8z2Ax literal 0 HcmV?d00001 diff --git a/public/logo/radity.png b/public/logo/radity.png new file mode 100644 index 0000000000000000000000000000000000000000..36618da7d4bcafc1a622fef679c9af8770c329ea GIT binary patch literal 13424 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 Cm4%1^ literal 0 HcmV?d00001 diff --git a/public/logo/raiffeisen.svg b/public/logo/raiffeisen.svg new file mode 100644 index 0000000..7e5ca73 --- /dev/null +++ b/public/logo/raiffeisen.svg @@ -0,0 +1,19 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.0" width="175.748" + height="46.993999" viewBox="0 0 175.748 46.994" id="svg2218"> + <g id="switch2222"> + <g id="g2226"> + <g id="Layer_1"> + <polygon points="0,0.803 46.191,0.803 46.191,46.994 0,46.994 0,0.803 " style="fill-rule:evenodd" + id="polygon2229" /> + <polygon points="1.336,2.138 44.855,2.138 44.855,45.658 1.336,45.658 1.336,2.138 " + style="fill:#fff200;fill-rule:evenodd" id="polygon2231" /> + <path + d="M 3.645,36.865 L 9.322,42.652 L 22.623,29.157 L 36.369,42.93 L 42.129,37.226 L 28.521,23.62 L 31.137,21.088 L 31.137,15.69 L 32.779,14.299 L 32.779,18.528 L 34.894,20.253 L 41.21,13.937 L 43.241,15.495 C 44.438,11.071 37.509,1.026 31.777,6.591 L 25.098,13.213 L 26.462,14.855 L 23.067,18.166 L 19.784,14.938 L 21.509,13.379 L 14.191,6.312 C 8.682,1.776 3.033,8.678 2.838,15.411 L 4.841,13.742 L 10.99,20.365 L 13.188,18.529 L 13.188,14.466 L 14.551,15.495 L 14.551,20.81 L 17.222,23.481 L 3.645,36.865 L 3.645,36.865 z " + style="fill-rule:evenodd" id="path2233" /> + <path + d="M 57.989,6.34 L 57.989,10.347 L 59.714,10.347 C 62.079,9.902 61.439,6.507 59.714,6.34 L 57.989,6.34 L 57.989,6.34 z M 53.092,2.361 L 53.092,20.504 L 57.989,20.504 L 57.989,14.605 L 62.163,20.504 L 67.951,20.504 L 62.804,13.242 C 68.759,10.348 66.533,2.445 60.272,2.362 L 53.092,2.362 L 53.092,2.361 z M 75.742,11.432 C 77.356,11.432 78.663,12.656 78.663,14.159 C 78.663,15.661 77.355,16.886 75.742,16.886 C 74.156,16.886 72.848,15.661 72.848,14.159 C 72.848,12.656 74.156,11.432 75.742,11.432 L 75.742,11.432 z M 74.712,7.425 C 76.048,7.425 77.3,7.87 78.329,8.593 L 78.329,7.898 L 83.115,7.898 L 83.143,20.503 L 78.301,20.503 L 78.329,19.724 C 77.3,20.447 76.048,20.865 74.712,20.865 C 71.15,20.865 68.229,17.86 68.229,14.159 C 68.229,10.458 71.151,7.425 74.712,7.425 L 74.712,7.425 z M 85.676,7.898 L 90.768,7.898 L 90.768,20.503 L 85.676,20.503 L 85.676,7.898 L 85.676,7.898 z M 88.235,0.691 C 89.711,0.691 90.907,1.915 90.907,3.39 C 90.907,4.865 89.711,6.089 88.235,6.089 C 86.733,6.089 85.536,4.864 85.536,3.39 C 85.537,1.916 86.733,0.691 88.235,0.691 L 88.235,0.691 z M 126.886,7.898 L 131.978,7.898 L 131.978,20.503 L 126.886,20.503 L 126.886,7.898 L 126.886,7.898 z M 129.418,0.691 C 130.921,0.691 132.117,1.915 132.117,3.39 C 132.117,4.865 130.921,6.089 129.418,6.089 C 127.943,6.089 126.747,4.864 126.747,3.39 C 126.747,1.916 127.943,0.691 129.418,0.691 L 129.418,0.691 z M 91.714,7.898 L 91.714,11.905 L 93.467,11.905 L 93.467,20.503 L 98.393,20.503 L 98.393,11.905 L 103.012,11.905 L 103.012,20.503 L 108.104,20.503 L 108.104,11.85 L 111.276,11.85 L 111.276,7.954 L 107.964,7.954 L 107.964,5.144 C 107.881,4.115 110.302,3.697 111.137,4.532 L 111.137,0.413 C 106.462,-1.062 102.678,1.582 102.705,5.672 L 102.705,7.898 L 98.364,7.898 L 98.364,5.144 C 98.308,4.115 100.424,3.697 101.647,4.532 L 101.647,0.413 C 97.584,-0.783 93.244,1.192 93.272,5.644 L 93.272,7.87 L 91.714,7.898 L 91.714,7.898 z M 118.538,20.865 C 122.907,20.837 124.52,19.029 125.467,16.385 L 121.043,16.385 C 119.039,18.945 116.117,17.081 116.257,14.994 L 125.607,14.994 C 125.607,9.874 122.879,7.453 118.539,7.453 C 114.199,7.453 111.472,10.514 111.472,14.243 C 111.472,17.972 114.643,20.893 118.538,20.865 L 118.538,20.865 z M 116.896,12.017 C 116.952,10.486 120.291,10.486 120.513,12.017 L 116.896,12.017 L 116.896,12.017 z M 153.209,20.865 C 157.605,20.837 159.22,19.029 160.165,16.385 L 155.713,16.385 C 153.71,18.945 150.788,17.081 150.928,14.994 L 160.278,14.994 C 160.278,9.874 157.579,7.453 153.21,7.453 C 148.869,7.453 146.143,10.514 146.143,14.243 C 146.143,17.972 149.313,20.893 153.209,20.865 L 153.209,20.865 z M 151.567,12.017 C 151.623,10.486 154.962,10.486 155.184,12.017 L 151.567,12.017 L 151.567,12.017 z M 144.806,8.149 L 143.303,11.21 C 141.411,10.625 139.574,10.737 139.63,11.265 C 139.686,11.599 139.38,12.183 142.329,12.601 C 146.725,13.296 146.364,21.477 138.99,20.865 C 136.959,20.726 135.317,20.197 133.954,19.39 L 135.596,16.106 C 137.906,17.247 140.131,17.915 140.298,16.774 C 140.493,15.355 137.877,15.856 136.291,14.659 C 133.453,12.906 135.066,7.48 139.714,7.424 C 141.355,7.314 143.053,7.592 144.806,8.149 L 144.806,8.149 z M 162.225,7.898 L 162.225,20.503 L 166.984,20.503 L 166.984,12.795 C 167.123,10.875 170.907,10.541 170.935,12.795 L 170.935,20.503 L 175.748,20.503 L 175.748,12.601 C 175.637,8.177 170.99,6.034 166.788,8.844 L 166.788,7.898 L 162.225,7.898 L 162.225,7.898 z M 55.902,28.211 L 52.73,46.91 L 61.718,46.91 C 67.812,46.91 70.316,39.342 65.975,36.754 C 69.676,33.331 67.784,28.184 63.805,28.128 L 55.902,28.211 L 55.902,28.211 z M 59.547,39.369 L 58.907,42.458 L 60.994,42.458 C 63.359,42.569 63.081,39.369 61.718,39.369 L 59.547,39.369 L 59.547,39.369 z M 60.604,32.663 L 60.076,35.168 L 60.716,35.195 C 62.636,35.306 63.749,32.663 61.439,32.663 L 60.604,32.663 L 60.604,32.663 z M 68.006,46.938 L 73.46,46.938 L 75.102,43.654 L 81.279,43.654 L 82.197,46.994 L 87.233,46.994 L 82.865,28.322 L 77.717,28.322 L 68.006,46.938 L 68.006,46.938 z M 76.883,39.731 L 80.278,39.731 L 79.193,34.805 L 76.883,39.731 L 76.883,39.731 z M 88.959,46.994 L 93.996,46.994 L 95.275,35.279 L 102.482,46.938 L 107.88,46.938 L 110.134,28.21 L 105.098,28.21 L 103.679,39.925 L 96.471,28.154 L 91.268,28.154 L 88.959,46.994 L 88.959,46.994 z M 113.752,28.155 L 110.218,46.938 L 115.533,46.938 L 116.952,39.925 L 121.71,46.938 L 128.694,46.938 L 121.877,37.087 L 130.587,28.127 L 123.825,28.127 L 117.87,34.749 L 118.816,28.127 L 113.752,28.155 L 113.752,28.155 z " + style="fill-rule:evenodd" id="path2235" /> + </g> + </g> + </g> +</svg> diff --git a/public/logo/redmadrobot.png b/public/logo/redmadrobot.png new file mode 100644 index 0000000000000000000000000000000000000000..df006f3110b6ac2695bf9aee2963256a8bcbaa8c GIT binary patch literal 2654 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 literal 0 HcmV?d00001 diff --git a/public/logo/sber.png b/public/logo/sber.png new file mode 100644 index 0000000000000000000000000000000000000000..999c602863a48d6e199ad629c48d36bab0eee899 GIT binary patch literal 62737 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 IzutTNKko6h^#A|> literal 0 HcmV?d00001 diff --git a/public/logo/semrush.png b/public/logo/semrush.png new file mode 100644 index 0000000000000000000000000000000000000000..bce4dc6975acb6cad7e455d38fdd81cb8897901b GIT binary patch literal 85496 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 Ee=iqfxc~qF literal 0 HcmV?d00001 diff --git a/public/logo/smartomato.svg b/public/logo/smartomato.svg new file mode 100644 index 0000000..c60a7bd --- /dev/null +++ b/public/logo/smartomato.svg @@ -0,0 +1,9 @@ +<svg xmlns="http://www.w3.org/2000/svg" width="230" height="44" viewBox="0 0 230 44"> + <g fill="none" fill-rule="evenodd"> + <path fill="#181818" fill-rule="nonzero" d="M78.502 37.182c1.352 0 2.544-.282 3.575-.845 1.031-.563 1.816-1.365 2.353-2.405l-2.496-1.456c-.399.641-.897 1.122-1.495 1.443-.598.32-1.252.481-1.963.481-1.23 0-2.24-.394-3.029-1.183-.789-.789-1.183-1.842-1.183-3.159 0-1.317.399-2.37 1.196-3.159.797-.789 1.803-1.183 3.016-1.183.71 0 1.365.16 1.963.481.598.32 1.096.802 1.495 1.443l2.496-1.456c-.52-1.04-1.296-1.837-2.327-2.392-1.031-.555-2.232-.832-3.601-.832-1.456 0-2.752.303-3.887.91-1.135.607-2.024 1.447-2.665 2.522-.641 1.075-.962 2.297-.962 3.666 0 1.37.32 2.596.962 3.679.641 1.083 1.534 1.928 2.678 2.535 1.144.607 2.435.91 3.874.91zM90.254 37v-9.23l4.602 7.774h1.404l4.68-7.748V37h2.938l-.026-13.884h-3.042L95.636 31.8l-4.94-8.684H87.29V37h2.964zm22.048.182c1.04 0 1.928-.16 2.665-.481.737-.32 1.304-.784 1.703-1.391V37h3.068v-8.138c0-1.976-.542-3.454-1.625-4.433-1.083-.98-2.648-1.469-4.693-1.469-1.144 0-2.227.147-3.25.442-1.023.295-1.898.72-2.626 1.274l1.274 2.366c.52-.433 1.157-.771 1.911-1.014s1.521-.364 2.301-.364c1.144 0 2.006.26 2.587.78.58.52.871 1.265.871 2.236v.208H112.9c-1.993 0-3.454.377-4.381 1.131s-1.391 1.755-1.391 3.003c0 .797.212 1.512.637 2.145.425.633 1.027 1.127 1.807 1.482s1.69.533 2.73.533zm.676-2.366c-.832 0-1.482-.173-1.95-.52-.468-.347-.702-.815-.702-1.404 0-1.23.936-1.846 2.808-1.846h3.354v1.612c-.26.693-.706 1.226-1.339 1.599s-1.356.559-2.171.559zm14.04 7.228V35.31c1.092 1.248 2.574 1.872 4.446 1.872 1.352 0 2.561-.295 3.627-.884 1.066-.59 1.902-1.426 2.509-2.509s.91-2.327.91-3.731-.303-2.643-.91-3.718c-.607-1.075-1.443-1.907-2.509-2.496-1.066-.59-2.275-.884-3.627-.884-.953 0-1.824.165-2.613.494-.789.33-1.452.823-1.989 1.482v-1.82h-3.094v18.928h3.25zM131.1 34.4c-.78 0-1.482-.178-2.106-.533-.624-.355-1.118-.862-1.482-1.521-.364-.659-.546-1.421-.546-2.288 0-.867.182-1.63.546-2.288.364-.659.858-1.166 1.482-1.521s1.326-.533 2.106-.533c1.196 0 2.18.399 2.951 1.196.771.797 1.157 1.846 1.157 3.146 0 1.3-.386 2.349-1.157 3.146-.771.797-1.755 1.196-2.951 1.196zm16.25 2.6V25.872h4.862v-2.756h-13v2.756h4.888V37h3.25zm12.818.182c1.421 0 2.695-.303 3.822-.91 1.127-.607 2.006-1.452 2.639-2.535.633-1.083.949-2.31.949-3.679 0-1.37-.316-2.591-.949-3.666-.633-1.075-1.512-1.915-2.639-2.522-1.127-.607-2.4-.91-3.822-.91-1.404 0-2.67.303-3.796.91-1.127.607-2.006 1.447-2.639 2.522-.633 1.075-.949 2.297-.949 3.666 0 1.37.316 2.596.949 3.679.633 1.083 1.512 1.928 2.639 2.535 1.127.607 2.392.91 3.796.91zm0-2.782c-1.196 0-2.18-.399-2.951-1.196-.771-.797-1.157-1.846-1.157-3.146 0-1.3.386-2.349 1.157-3.146.771-.797 1.755-1.196 2.951-1.196 1.196 0 2.184.399 2.964 1.196.78.797 1.17 1.846 1.17 3.146 0 1.3-.39 2.349-1.17 3.146-.78.797-1.768 1.196-2.964 1.196zM173.74 37v-9.23l4.602 7.774h1.404l4.68-7.748V37h2.938l-.026-13.884h-3.042l-5.174 8.684-4.94-8.684h-3.406V37h2.964zm22.048.182c1.04 0 1.928-.16 2.665-.481.737-.32 1.304-.784 1.703-1.391V37h3.068v-8.138c0-1.976-.542-3.454-1.625-4.433-1.083-.98-2.648-1.469-4.693-1.469-1.144 0-2.227.147-3.25.442-1.023.295-1.898.72-2.626 1.274l1.274 2.366c.52-.433 1.157-.771 1.911-1.014s1.521-.364 2.301-.364c1.144 0 2.006.26 2.587.78.58.52.871 1.265.871 2.236v.208h-3.588c-1.993 0-3.454.377-4.381 1.131s-1.391 1.755-1.391 3.003c0 .797.212 1.512.637 2.145.425.633 1.027 1.127 1.807 1.482s1.69.533 2.73.533zm.676-2.366c-.832 0-1.482-.173-1.95-.52-.468-.347-.702-.815-.702-1.404 0-1.23.936-1.846 2.808-1.846h3.354v1.612c-.26.693-.706 1.226-1.339 1.599s-1.356.559-2.171.559zM213.39 37V25.872h4.862v-2.756h-13v2.756h4.888V37h3.25zm12.818.182c1.421 0 2.695-.303 3.822-.91 1.127-.607 2.006-1.452 2.639-2.535.633-1.083.949-2.31.949-3.679 0-1.37-.316-2.591-.949-3.666-.633-1.075-1.512-1.915-2.639-2.522-1.127-.607-2.4-.91-3.822-.91-1.404 0-2.67.303-3.796.91-1.127.607-2.006 1.447-2.639 2.522-.633 1.075-.949 2.297-.949 3.666 0 1.37.316 2.596.949 3.679.633 1.083 1.512 1.928 2.639 2.535 1.127.607 2.392.91 3.796.91zm0-2.782c-1.196 0-2.18-.399-2.951-1.196-.771-.797-1.157-1.846-1.157-3.146 0-1.3.386-2.349 1.157-3.146.771-.797 1.755-1.196 2.951-1.196 1.196 0 2.184.399 2.964 1.196.78.797 1.17 1.846 1.17 3.146 0 1.3-.39 2.349-1.17 3.146-.78.797-1.768 1.196-2.964 1.196z" transform="translate(-4 -6)"/> + <path fill="#E85D41" d="M30 36.919c-5.904 2.556-12.517 3.488-17.756 2.28C15.574 45.616 22.273 50 30 50s14.425-4.384 17.756-10.798c-5.239 1.207-11.853.275-17.756-2.282M30 34.315c6.526-4.6 12.464.132 19.422.46.375-1.532.578-3.13.578-4.774l-.003-.09c-3.373-.51-5.962-3.412-5.962-6.928 0 3.875-3.142 7.017-7.017 7.017C33.143 30 30 26.858 30 22.983c0-3.877 3.143-7.019 7.018-7.019s7.017 3.143 7.017 7.019v-.002c0-.419.34-.759.76-.759s.761.34.761.76c0 2.65 1.876 4.861 4.372 5.38C49.094 18.084 40.493 10.002 30 10.002c-.515 0-1.023.024-1.528.064-.038.02-.071.048-.11.069 1.902.466 4.171 2.492 3.974 3.506-.621.675-4.68-.604-5.554-1.466.551 1.11.801 3.716-.337 4.596-1.424-.194-2.512-2.575-2.59-3.811-.324 1.183-3.201 4.32-4.076 4.046-.677-.78.273-3.67 1.688-5.024-.049.002-.095-.006-.144-.005C14.623 15.206 10 22.063 10 30c0 1.645.203 3.243.578 4.775 6.959-.328 12.896-5.061 19.422-.46" transform="translate(-4 -6)"/> + <path fill="#181818" d="M37.018 28.48c-3.036 0-5.497-2.462-5.497-5.497 0-3.037 2.46-5.498 5.497-5.498 3.036 0 5.497 2.462 5.497 5.498 0 3.035-2.461 5.497-5.497 5.497m0-12.516c-3.875 0-7.018 3.143-7.018 7.019C30 26.858 33.143 30 37.018 30s7.018-3.142 7.018-7.017c0-3.877-3.143-7.019-7.018-7.019" transform="translate(-4 -6)"/> + <path fill="#181818" d="M51.053 28.48c-3.036 0-5.497-2.462-5.497-5.498 0-.42-.341-.76-.761-.76s-.76.34-.76.76c0 3.877 3.142 7.018 7.018 7.018.42 0 .76-.34.76-.76s-.34-.76-.76-.76M55.883 33.566c-2.271 1.022-4.41 1.305-6.461 1.208-6.958-.328-12.895-5.06-19.422-.46-6.526-4.6-12.463.132-19.422.46-2.051.097-4.191-.186-6.461-1.208 1.617 3.004 4.556 4.812 8.127 5.634 5.239 1.207 11.852.274 17.756-2.28 5.904 2.555 12.517 3.488 17.756 2.281 3.57-.823 6.51-2.63 8.127-5.635" transform="translate(-4 -6)"/> + <path fill="#ABD26A" d="M19.78 17.005c.874.274 3.751-2.863 4.075-4.047.077 1.236 1.165 3.619 2.59 3.812 1.137-.88.888-3.486.337-4.596.873.863 4.933 2.14 5.554 1.467.197-1.015-2.072-3.042-3.974-3.508.04-.02.071-.047.11-.07 1.493-.843 2.234-2.478 1.767-3.201-1.31.092-2.939 1.9-5.132 2.697-.3-1.67-1.283-3.65-2.434-3.29-.6.188-.755.696-.668.902.262.612 1.5.777 2.014 2.68-2.304.417-4.629-.342-5.813.236-.044.856 1.408 1.898 3.117 1.888.05 0 .095.008.144.006-1.415 1.355-2.366 4.243-1.688 5.024" transform="translate(-4 -6)"/> + </g> +</svg> diff --git a/public/logo/space307.svg b/public/logo/space307.svg new file mode 100644 index 0000000..3a2f819 --- /dev/null +++ b/public/logo/space307.svg @@ -0,0 +1,8 @@ +<svg width="833" height="201" viewBox="0 0 833 201" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M30.9279 91.7945H31.5635C48.9788 91.7945 61.0552 83.6359 61.0552 66.8007C61.0552 50.3541 48.8517 44.0085 32.8347 39.0874C24.1905 36.3679 16.5634 33.6484 16.5634 24.7128C16.5634 17.2017 21.0125 13.8347 29.2753 13.8347H30.038C40.3347 13.8347 44.911 17.2017 44.911 29.5043H58.8942C58.8942 9.69061 47.072 0.884521 30.038 0.884521H29.2753C14.2752 0.884521 2.70733 9.0431 2.45309 24.7128C2.19885 38.8284 10.5887 45.692 25.5888 50.8721C34.9957 54.1096 47.072 56.4406 47.072 66.8007C47.072 75.6068 42.2415 78.8444 31.5635 78.8444H30.9279C19.7413 78.8444 14.7837 75.4773 14.7837 63.3042H0.800537C0.800537 82.9884 13.004 91.7945 30.9279 91.7945ZM111.091 2.17953H80.0735V90.4995H94.1837V58.1241H111.091C129.777 58.1241 139.438 48.9295 139.438 30.4108V29.8928C139.438 11.3741 129.777 2.17953 111.091 2.17953ZM125.582 30.4108C125.582 40.9005 122.531 44.915 111.091 44.915H94.1837V15.5182H111.091C122.531 15.5182 125.582 19.2737 125.582 29.8928V30.4108Z" fill="#070707"/> +<path d="M31.8003 200.884C50.7305 200.884 62.1648 191.43 62.1648 174.854C62.1648 163.328 56.3206 157.112 46.6649 155.04V153.486C54.5419 150.507 59.1156 144.55 59.1156 134.579C59.1156 119.945 48.8247 109.974 31.5462 109.974C13.5054 109.974 2.83331 120.722 2.83331 139.759H16.8086C16.8086 127.586 20.2389 122.924 31.5462 122.924C40.9478 122.924 45.0133 126.938 45.0133 135.485C45.0133 144.809 41.0748 148.176 31.5462 148.176H23.4151V161.386H35.3576C44.8862 161.386 48.0624 164.623 48.0624 173.559C48.0624 183.789 43.2346 187.933 31.6732 187.933C18.9684 187.933 14.9029 183.271 14.9029 170.062H0.800537C0.800537 190.135 12.2349 200.884 31.8003 200.884Z" fill="#070707"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M262.693 200.883H261.922C244.453 200.883 232.635 190.135 232.635 168.508V142.349C232.635 120.722 244.453 109.974 261.922 109.974H262.693C280.291 109.974 291.98 120.722 291.98 142.349V168.508C291.98 190.135 280.291 200.883 262.693 200.883ZM253.879 186.458C256.013 187.489 258.676 187.933 261.922 187.933H262.693C273.483 187.933 277.85 183.142 277.85 168.508V142.349C277.85 140.461 277.777 138.737 277.627 137.165L253.879 186.458ZM247.184 174.355C246.988 172.609 246.893 170.666 246.893 168.508V142.349C246.893 127.715 251.261 122.924 261.922 122.924H262.693C266.157 122.924 268.96 123.418 271.168 124.573L247.184 174.355ZM339.456 199.588H324.813C330.08 171.357 340.998 150.896 354.742 128.881V124.607H323.143V135.226H308.885V111.269H369V132.507C354.1 153.874 344.594 171.098 339.456 199.588Z" fill="#070707"/> +<path d="M726.065 91.7937H726.836C744.305 91.7937 756.636 81.045 756.636 59.4183H742.378C742.378 74.052 737.497 78.8435 726.836 78.8435H726.065C715.403 78.8435 710.522 74.052 710.522 59.4183V33.259C710.522 18.6254 715.403 13.8338 726.065 13.8338H726.836C737.497 13.8338 742.378 18.6254 742.378 33.259H756.636C756.636 11.6323 744.305 0.883667 726.836 0.883667H726.065C708.595 0.883667 696.264 11.6323 696.264 33.259V59.4183C696.264 81.045 708.595 91.7937 726.065 91.7937ZM832.629 15.5173V2.17868H777.524V90.4986H832.629V77.16H791.782V52.6842H823.252V39.4751H791.782V15.5173H832.629Z" fill="#070707"/> +<path d="M435.944 89.5295H450.794L427.679 3.16504H406.243L382.612 89.5295H397.849L404.048 65.0892H429.874L435.944 89.5295ZM407.276 52.0458L416.315 16.2084H417.736L426.646 52.0458H407.276Z" fill="#070707"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M748.272 191.075L678.495 120.59C674.593 116.676 669.604 114.518 664.501 114.495H615.847L572.021 114.495C566.931 114.528 561.841 116.485 557.95 120.389L544.47 134.005C540.543 137.966 540.545 144.387 544.473 148.348L558.686 162.705C562.614 166.666 569.069 166.728 572.997 162.767L589.622 145.974L611.059 124.319C614.987 120.359 621.261 120.36 625.189 124.322L695.391 195.236C699.293 199.151 704.645 200.861 709.747 200.884H758.401L802.333 200.883C807.423 200.851 812.611 198.992 816.503 195.088L829.524 181.936C833.712 177.712 833.354 171.453 829.426 167.491L815.213 153.134C811.288 149.176 804.928 149.222 801.001 153.169L784.803 169.531L763.509 191.041C759.582 195.002 752.2 195.036 748.272 191.075V191.075Z" fill="#070707"/> +</svg> diff --git a/public/logo/stellarX.svg b/public/logo/stellarX.svg new file mode 100644 index 0000000..c721bc4 --- /dev/null +++ b/public/logo/stellarX.svg @@ -0,0 +1,3 @@ +<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin" width="250" height="50" viewBox="0 0 125 25"> + <path fill="#050505" d="M22.07 0v5.73h2.34v3.9h-2.34v13.8H16.8V9.63h-2.24v-3.9h2.24V0h5.27zm11.79 5.2c5.63 0 9.49 4.06 9.49 10.65v.56H30c.46 1.88 1.81 2.86 4.09 2.86 1.05 0 1.9-.3 2.7-.98h5.73c-1.71 3.69-4.64 5.56-8.6 5.56-2.7 0-4.87-.92-6.69-2.83a9.33 9.33 0 01-2.6-6.56c0-2.47.96-4.74 2.7-6.49a9.24 9.24 0 016.53-2.76zm-4.02 7.52h8.27c-.63-1.81-2.11-2.8-4.19-2.8-2.17 0-3.72 1.12-4.08 2.8zm15.68 10.7V0h5.17v23.43h-5.17zm8.5 0V0h5.18v23.43h-5.17zm21.1-15.71V5.73h5.21v17.7H75.3v-1.98a6.86 6.86 0 01-5.24 2.08c-2.14 0-3.98-.7-5.53-2.08a9 9 0 01-3.1-6.95c0-2.54.99-4.81 2.83-6.6a8.22 8.22 0 015.9-2.43c2.14 0 3.79.72 4.97 2.24zm-3.92 11.1a4.18 4.18 0 004.12-4.28 4.3 4.3 0 00-4.31-4.45 4.38 4.38 0 00-4.39 4.38c0 2.47 1.92 4.35 4.58 4.35zm12.28 4.62V5.73h5.27v17.7h-5.27zM93.9 5.47a3.5 3.5 0 110 7 3.5 3.5 0 010-7zm15.86 9.17l-6.17-8.9h6.36l3.03 4.31 1.26-1.79 1.77-2.53h6.36l-1.75 2.53-1.24 1.8h-6.4l.52.73 1.77 2.53 7.1 10.1h-6.52l-2.87-4.13-1.12 1.6-1.75 2.54h-6.52l1.77-2.53 4.4-6.26zM8.4 12.45c3.63 1 5.44 2.38 5.44 5.31 0 3.56-2.8 6.13-7.09 6.13-3.95 0-6.39-2.14-6.75-5.73h4.91v.16c0 .99.79 1.68 1.91 1.68 1.12 0 1.78-.56 1.78-1.55 0-1.45-1.42-1.38-3.63-2.07-3.06-.96-4.54-2.6-4.54-5.28 0-3.46 2.53-5.9 6.75-5.9 3.66 0 6 2.08 6.2 5.44H8.67C8.47 9.5 8.04 9 7.12 9 6.1 9 5.5 9.59 5.5 10.45c0 1.22 1.09 1.51 2.9 2z" /> +</svg> diff --git a/public/logo/stmLabs.png b/public/logo/stmLabs.png new file mode 100644 index 0000000000000000000000000000000000000000..2febd32c4f0e03db63371abb2d06070879b2c91a GIT binary patch literal 30314 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 Z@nlcg(N;vf1g?ca$_nc8IkFak{|DgK*&P4? literal 0 HcmV?d00001 diff --git a/public/logo/tenpixls.png b/public/logo/tenpixls.png new file mode 100644 index 0000000000000000000000000000000000000000..ed83a4bfa7cb07404719e876dd6503d8509143e2 GIT binary patch literal 22817 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 literal 0 HcmV?d00001 diff --git a/public/logo/travelpayouts.svg b/public/logo/travelpayouts.svg new file mode 100644 index 0000000..0a4d13d --- /dev/null +++ b/public/logo/travelpayouts.svg @@ -0,0 +1,19 @@ +<svg width="633" height="150" viewBox="0 0 633 150" xmlns="http://www.w3.org/2000/svg"> +<path fill-rule="evenodd" clip-rule="evenodd" d="M246.133 128.479H256.942V128.364C256.942 124.883 254.701 122.766 251.531 122.766C248.48 122.766 246.133 124.969 246.133 128.479ZM251.531 119.615C258.268 119.615 260.67 124.765 260.417 130.386C260.391 130.954 259.946 131.425 259.378 131.425H246.146V131.656C246.146 134.894 248.234 137.188 251.531 137.188C253.523 137.188 255.038 136.658 256.416 135.156C256.813 134.724 257.051 134.618 257.647 134.618H258.958C259.684 134.618 260.068 135.176 259.727 135.916C258.483 138.613 255.088 140.385 251.531 140.388C245.58 140.393 242.626 135.479 242.626 129.848C242.626 124.223 245.684 119.615 251.531 119.615ZM144.555 137.358C147.82 137.358 150.913 135.004 150.75 131.386L150.698 130.23L145.906 131.073C143.458 131.503 141.052 132.225 141.052 134.579C141.052 136.421 142.601 137.358 144.555 137.358ZM137.441 134.964C137.441 130.482 140.862 129.046 144.633 128.398L150.75 127.347C150.75 124.387 149.258 122.804 146.249 122.804C144.384 122.804 143.304 123.508 142.21 125.001C141.879 125.453 141.522 125.539 140.979 125.539H139.632C139.076 125.539 138.673 125.074 138.787 124.501C139.435 121.244 143.533 119.615 146.249 119.615C150.974 119.615 154.25 122.37 154.25 127.232V138.964C154.25 139.533 153.78 140.003 153.211 140.003H151.788C151.219 140.003 150.75 139.533 150.75 138.964V137.387C149.616 139.288 146.825 140.388 144.134 140.388C140.874 140.388 137.441 138.618 137.441 134.964ZM215.379 137.358C218.644 137.358 221.737 135.004 221.574 131.386L221.522 130.23L216.73 131.073C214.282 131.503 211.876 132.225 211.876 134.579C211.876 136.421 213.425 137.358 215.379 137.358ZM208.265 134.964C208.265 130.482 211.687 129.046 215.457 128.398L221.574 127.347C221.574 124.387 220.082 122.804 217.073 122.804C215.208 122.804 214.128 123.508 213.034 125.001C212.704 125.453 212.346 125.539 211.804 125.539H210.456C209.9 125.539 209.497 125.074 209.611 124.501C210.26 121.244 214.357 119.615 217.073 119.615C221.799 119.615 225.074 122.37 225.074 127.232V138.964C225.074 139.533 224.605 140.003 224.036 140.003H222.612C222.044 140.003 221.574 139.533 221.574 138.964V137.387C220.44 139.288 217.649 140.388 214.958 140.388C211.698 140.388 208.265 138.618 208.265 134.964ZM235.279 133.272C235.279 135.498 236.008 136.695 238.388 136.695H240.349C240.912 136.695 241.348 137.181 241.348 137.734V138.965C241.348 139.518 240.913 140.003 240.349 140.003H238.017C233.589 140.003 231.911 137.468 231.911 133.272V123.309H229.173C228.609 123.309 228.173 122.822 228.173 122.27V121.039C228.173 120.486 228.609 120 229.173 120H231.911V113.73C231.911 113.178 232.347 112.691 232.91 112.691H234.28C234.843 112.691 235.279 113.178 235.279 113.73V120H239.979C240.542 120 240.978 120.486 240.978 121.039V122.27C240.978 122.822 240.542 123.309 239.979 123.309H235.279V133.272ZM204.729 115.923C204.729 116.475 204.294 116.961 203.73 116.961H201.621C201.057 116.961 200.622 116.475 200.622 115.923V113.73C200.622 113.178 201.057 112.691 201.621 112.691H203.73C204.293 112.691 204.729 113.178 204.729 113.73V115.923ZM204.359 138.965C204.359 139.517 203.924 140.003 203.36 140.003H201.991C201.427 140.003 200.991 139.517 200.991 138.965V121.039C200.991 120.486 201.428 120 201.991 120H203.36C203.924 120 204.359 120.486 204.359 121.039V138.965ZM195.08 138.965C195.08 139.518 194.644 140.003 194.08 140.003H192.711C192.148 140.003 191.712 139.517 191.712 138.965V113.73C191.712 113.178 192.148 112.691 192.711 112.691H194.08C194.644 112.691 195.08 113.178 195.08 113.73V138.965ZM185.8 138.965C185.8 139.517 185.364 140.003 184.8 140.003H183.431C182.868 140.003 182.432 139.517 182.432 138.965V123.309H175.734V138.965C175.734 139.518 175.298 140.003 174.735 140.003H173.365C172.802 140.003 172.366 139.517 172.366 138.965V123.309H164.558V138.965C164.558 139.517 164.122 140.003 163.559 140.003H162.189C161.626 140.003 161.19 139.517 161.19 138.965V123.309H158.082C157.518 123.309 157.082 122.822 157.082 122.27V121.039C157.082 120.486 157.518 120 158.082 120H161.19V118.077C161.19 113.844 162.901 111.538 167.296 111.538H169.628C170.191 111.538 170.627 112.024 170.627 112.576V113.807C170.627 114.359 170.191 114.845 169.628 114.845H167.666C165.286 114.845 164.558 116.044 164.558 118.269V120H172.366V118.077C172.366 113.845 174.077 111.538 178.472 111.538H184.8C185.364 111.538 185.8 112.023 185.8 112.576V113.807C185.8 114.36 185.364 114.845 184.8 114.845H178.842C176.424 114.845 175.734 116.095 175.734 118.269V120H184.8C185.364 120 185.8 120.486 185.8 121.039V138.965Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M298.773 128.479H309.582V128.364C309.582 124.882 307.341 122.766 304.171 122.766C301.12 122.766 298.773 124.969 298.773 128.479ZM304.171 119.615C310.908 119.615 313.31 124.764 313.056 130.385C313.031 130.953 312.586 131.424 312.018 131.424H298.786V131.655C298.786 134.893 300.874 137.187 304.171 137.187C306.163 137.187 307.678 136.657 309.056 135.155C309.453 134.723 309.691 134.616 310.287 134.616H311.597C312.324 134.616 312.709 135.175 312.367 135.915C311.123 138.611 307.728 140.384 304.171 140.386C298.22 140.391 295.266 135.478 295.266 129.847C295.266 124.223 298.324 119.615 304.171 119.615ZM398.767 127.39L406.768 120.653C407.228 120.265 407.645 119.999 408.268 119.999H410.004C410.89 119.999 411.489 120.703 410.519 121.512L401.401 129.117L411.304 138.285C411.992 138.921 411.969 139.976 411.098 140.001H408.999C408.414 140.018 407.845 139.755 407.422 139.347L398.767 130.998V138.962C398.767 139.531 398.297 140.001 397.729 140.001H396.305C395.739 140.001 395.267 139.531 395.267 138.962V113.75C395.267 113.181 395.737 112.711 396.305 112.711H397.729C398.298 112.711 398.767 113.184 398.767 113.75V127.39ZM391.788 120C392.351 120 392.787 120.486 392.787 121.038V122.269C392.787 122.822 392.351 123.308 391.788 123.308H389.642C386.805 123.308 385.386 124.783 385.386 127.731V138.963C385.386 139.516 384.95 140.002 384.387 140.002H383.018C382.454 140.002 382.018 139.516 382.018 138.963V121.038C382.018 120.486 382.454 120 383.018 120H384.387C384.95 120 385.386 120.486 385.386 121.038V122.231C385.88 121.462 386.471 120.898 387.162 120.538C387.853 120.179 388.753 120 389.864 120H391.788ZM374.025 130.02C374.025 126.362 372.831 122.924 368.548 122.924C364.266 122.924 363.071 126.362 363.071 130.02C363.071 133.664 364.298 137.079 368.548 137.079C372.798 137.079 374.025 133.664 374.025 130.02ZM368.548 119.615C374.97 119.615 377.355 124.297 377.355 130.02C377.355 135.726 374.928 140.386 368.548 140.386C362.206 140.386 359.703 135.719 359.703 130.02C359.703 124.311 362.183 119.615 368.548 119.615ZM349.563 133.771L353.708 120.923C353.913 120.356 354.356 120 354.966 120H356.188C356.857 120 357.181 120.634 357.039 121.231L351.377 138.924C351.196 139.491 350.935 140.002 350.267 140.002H349.119C348.463 140.002 348.204 139.454 347.972 138.924L343.568 126.154L339.164 138.924C338.933 139.454 338.674 140.002 338.017 140.002H336.87C336.2 140.002 335.942 139.493 335.76 138.924L330.098 121.231C329.955 120.635 330.28 120 330.949 120H332.17C332.78 120 333.224 120.356 333.428 120.923L337.573 133.771L342.014 120.923C342.219 120.356 342.522 120 343.161 120H343.975C344.614 120 344.918 120.356 345.123 120.923L349.563 133.771ZM322.437 133.271C322.437 135.576 323.233 136.694 325.546 136.694H327.507C328.071 136.694 328.506 137.18 328.506 137.732V138.963C328.506 139.516 328.071 140.002 327.507 140.002H325.176C320.747 140.002 319.07 137.467 319.07 133.271V123.308H316.331C315.768 123.308 315.332 122.822 315.332 122.269V121.039C315.332 120.486 315.768 120 316.331 120H319.07V113.73C319.07 113.178 319.505 112.692 320.069 112.692H321.438C322.001 112.692 322.437 113.178 322.437 113.73V120H327.137C327.701 120 328.136 120.486 328.136 121.039V122.269C328.136 122.822 327.701 123.308 327.137 123.308H322.437V133.271ZM291.573 138.963C291.573 139.516 291.138 140.002 290.575 140.002H289.205C288.641 140.002 288.206 139.516 288.206 138.963V128.808C288.206 125.364 286.72 122.923 283.025 122.923C279.406 122.923 277.844 125.433 277.844 128.808V138.963C277.844 139.516 277.408 140.002 276.845 140.002H275.475C274.912 140.002 274.476 139.516 274.476 138.963V121.038C274.476 120.486 274.912 120 275.475 120H276.845C277.408 120 277.844 120.486 277.844 121.038V122.231C279.199 120.377 281.351 119.615 283.58 119.615C288.683 119.615 291.573 123.334 291.573 128.231V138.963Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M218.525 71.7329C216.939 72.7594 214.384 74.0004 211.644 74.0004C208.665 74.0004 207.393 72.7811 207.393 70.3006C207.393 67.8266 209.11 66.5361 212.467 66.5361H218.526L218.525 71.7329ZM210.606 58.282C201.88 58.282 194.891 62.7138 194.891 72.6325C194.891 80.5258 200.223 84.7455 207.965 84.7455C213.388 84.7455 217.224 82.5848 219.523 80.5835L220.044 82.702C220.251 83.5423 221.004 84.1335 221.871 84.1335H229.16C230.197 84.1335 231.078 83.2948 231.081 82.2585V56.08C231.081 48.0435 227.328 41.3945 214.355 41.3945C208.552 41.3945 203.832 42.1753 199.814 43.2798C199.006 43.5018 198.456 44.2498 198.456 45.0875V50.2548C198.456 51.2935 199.298 52.1358 200.337 52.1358L212.838 52.137C215.794 52.137 218.528 53.3373 218.528 56.908L218.528 58.282H210.606Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M134.92 68.9478C134.92 79.5908 139.145 84.7458 148.985 84.7458C153.221 84.7458 156.993 83.7363 159.296 82.781C159.988 82.4935 160.424 81.8048 160.424 81.0555V75.8815C160.424 74.8428 159.582 74.0008 158.544 74.0005L151.799 73.999C149.431 73.9985 147.512 72.0783 147.512 69.7108L147.515 52.7458H156.668C157.747 52.7458 158.622 51.8708 158.622 50.7915V43.954C158.622 42.875 157.747 42 156.668 42H147.517L147.519 30.2363C147.519 28.9355 146.23 28.027 145.005 28.4648L136.249 31.5918C135.501 31.8588 135.002 32.5655 135.001 33.3593L134.981 42H129.954C128.875 42 128 42.875 128 43.954V50.7915C128 51.8708 128.875 52.7458 129.954 52.7458H134.957L134.92 68.9478Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M191.455 41.3945C184.483 41.3945 180.302 44.2828 178.636 45.7408L178.129 43.4715C177.938 42.6115 177.175 41.9998 176.294 41.9998H169.041C168.002 41.9998 167.16 42.8418 167.16 43.8808V82.2533C167.16 83.2923 168.002 84.1343 169.041 84.1343H177.794C178.832 84.1343 179.675 83.2923 179.675 82.2533V54.7015C181.178 53.2818 183.578 52.137 188.955 52.137H191.602C192.641 52.137 193.483 51.2953 193.483 50.2565V43.2775C193.483 42.1845 192.549 41.3945 191.455 41.3945Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M247.888 43.314C247.649 42.529 246.914 42 246.094 42H236.165C235.103 42 234.283 42.8347 234.283 43.8403C234.283 44.0665 234.315 44.299 234.4 44.5298L248.499 82.9022C248.771 83.6425 249.476 84.1345 250.264 84.1345H259.512C260.301 84.1345 261.005 83.6425 261.278 82.9022L275.377 44.5298C275.461 44.3008 275.494 44.069 275.494 43.844C275.494 42.854 274.675 42 273.612 42H264.178C263.358 42 262.623 42.529 262.385 43.314L255.136 67.1857L247.888 43.314Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M491.108 74.0007C487.68 74.0007 484.422 71.8362 484.422 63.0687C484.422 54.3017 487.68 52.1372 491.108 52.1372C494.536 52.1372 497.794 54.3017 497.794 63.0687C497.794 71.8362 494.536 74.0007 491.108 74.0007ZM491.108 41.3945C478.354 41.3945 471.832 48.9958 471.832 63.067C471.832 77.1375 478.354 84.7455 491.108 84.7455C503.863 84.7455 510.385 77.1375 510.385 63.067C510.385 48.9958 503.863 41.3945 491.108 41.3945Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M467.73 42H458.756C457.795 42 456.941 42.615 456.635 43.527L449.284 65.5105L441.551 43.304C441.278 42.5235 440.543 42 439.715 42H429.779C428.676 42 427.834 42.796 427.834 43.9032C427.834 44.159 427.876 44.4225 427.981 44.681L443.136 81.5947L436.263 99.8725C435.798 101.103 436.707 102.418 438.023 102.418H446.897C447.684 102.418 448.388 101.927 448.661 101.189L469.553 44.616C469.639 44.3842 469.675 44.15 469.675 43.9217C469.675 42.8927 468.836 42 467.73 42Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M622.375 59.4175C620.151 58.7155 615.703 57.3113 613.479 56.6095C612.13 56.1843 610.83 55.7838 610.83 54.4765C610.83 52.7515 612.531 52.1375 615.651 52.1375L627.506 52.137C628.545 52.137 629.38 51.2953 629.38 50.256V44.932C629.38 44.0998 628.833 43.3563 628.033 43.1275C623.725 41.8955 620.08 41.3945 615.143 41.3945C607.978 41.3945 597.979 44.3308 597.979 54.8533C597.979 57.3805 598.712 63.2945 605.731 65.5215C608.607 66.4335 614.357 68.2578 617.232 69.1703C618.342 69.5225 619.37 70.2835 619.37 71.6885C619.37 73.3135 618.172 74.0008 616.174 74.0008H601.031C599.993 74.0008 599.15 74.8425 599.15 75.8813V81.1565C599.15 81.986 599.684 82.711 600.477 82.9553C602.624 83.617 607.033 84.7458 613.874 84.7458C631.749 84.7458 632.561 74.7055 632.561 70.921C632.561 66.1235 629.864 61.782 622.375 59.4175Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M412.27 71.7329C410.684 72.7594 408.13 74.0004 405.389 74.0004C402.411 74.0004 401.138 72.7811 401.138 70.3006C401.138 67.8266 402.854 66.5361 406.212 66.5361H412.271L412.27 71.7329ZM408.1 41.3945C402.297 41.3945 397.577 42.1753 393.559 43.2798C392.751 43.5018 392.201 44.2498 392.201 45.088V50.2548C392.201 51.2935 393.043 52.1358 394.082 52.1358H406.583C409.54 52.1358 412.273 53.3373 412.273 56.908L412.273 58.282H404.352C395.625 58.282 388.636 62.7138 388.636 72.6325C388.636 80.5258 393.968 84.7455 401.711 84.7455C407.133 84.7455 410.969 82.5848 413.268 80.5835L413.789 82.702C413.996 83.5423 414.75 84.1335 415.616 84.1335H422.942C423.981 84.1335 424.823 83.2915 424.823 82.253V56.08C424.823 48.0435 421.073 41.3945 408.1 41.3945Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M552.083 42H543.33C542.292 42 541.449 42.842 541.449 43.881V71.782C539.668 72.9907 537.322 74.0008 534.83 74.0008C531.037 74.0008 530.073 71.8085 530.073 67.2237V43.884C530.073 42.8453 529.231 42.003 528.193 42.003H519.44C518.401 42.003 517.559 42.8453 517.559 43.884V66.8288C517.559 72.0683 516.87 84.7458 530.353 84.7458C535.585 84.7458 539.772 82.9917 542.577 80.4825L543.015 82.6292C543.193 83.5055 543.964 84.1345 544.857 84.1345H552.083C553.122 84.1345 553.964 83.2925 553.964 82.2535V43.881C553.964 42.842 553.122 42 552.083 42Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M591.474 74.0005L584.728 73.999C582.36 73.9985 580.442 72.0785 580.442 69.7108L580.445 52.7458H589.598C590.677 52.7458 591.552 51.8708 591.552 50.7915V43.954C591.552 42.875 590.677 42 589.598 42H580.446L580.449 30.2363C580.449 28.9355 579.16 28.027 577.935 28.4648L569.179 31.5918C568.431 31.8588 567.932 32.5655 567.93 33.3593L567.911 42H562.884C561.805 42 560.93 42.875 560.93 43.954V50.7915C560.93 51.8708 561.805 52.7458 562.884 52.7458H567.887L567.85 68.9478C567.85 79.5908 572.075 84.7458 581.915 84.7458C586.151 84.7458 589.922 83.7363 592.226 82.781C592.918 82.4935 593.354 81.8048 593.354 81.0555V75.8815C593.354 74.8428 592.512 74.0008 591.474 74.0005Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M335.173 82.2537L335.179 23.2125C335.18 21.912 333.891 21.0037 332.666 21.4412L323.91 24.568C323.163 24.835 322.663 25.5427 322.662 26.3365V82.251C322.661 83.2907 323.424 84.1342 324.464 84.1342H333.292C334.331 84.1342 335.173 83.2925 335.173 82.2537Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M296.864 52.1372C301.887 52.1372 302.699 56.6177 302.699 58.6475H290.946C290.946 54.1562 293.436 52.1372 296.864 52.1372ZM312.207 75.4998C312.207 74.6715 311.536 74.0005 310.708 74.0005L299.442 73.999C294.412 73.999 290.67 72.7128 290.67 66.8593H311.578C313.926 66.8593 315.001 65.9428 315.001 62.4573C315.001 46.769 306.863 41.3945 296.864 41.3945C284.109 41.3945 277.588 49.4343 277.588 63.0558C277.588 74.7878 281.682 84.7455 297.361 84.7455C302.624 84.7455 307.408 84.035 310.859 82.986C311.659 82.7423 312.207 82.014 312.207 81.177V75.4998Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M363.065 74.0007C360.858 74.0007 358.98 73.621 357.477 73.1435V54.7432C359.055 53.3752 361.398 52.1372 363.802 52.1372C367.312 52.1372 370.927 54.623 370.927 63.0672C370.927 71.3652 367.492 74.0007 363.065 74.0007ZM367.817 41.3945C362.51 41.3945 358.763 43.6905 356.482 45.939L355.932 43.4715C355.74 42.6113 354.977 41.9998 354.096 41.9998H346.843C345.804 41.9998 344.963 42.8415 344.963 43.8808V100.537C344.963 101.576 345.804 102.418 346.843 102.418H355.596C356.635 102.418 357.477 101.576 357.477 100.537V83.733C359.452 84.322 361.843 84.7455 364.679 84.7455C377.155 84.7455 383.473 76.642 383.473 62.571C383.473 49.0995 377.981 41.3945 367.817 41.3945Z" fill="#262626"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M97.7501 108.026H72.0001C69.7911 108.026 68.0001 106.235 68.0001 104.026V84H91.4766C92.5761 84 93.5143 83.2055 93.6958 82.1212L95.2856 72.6212C95.5151 71.2495 94.4573 70 93.0663 70H54.0001V104.026C54.0001 113.968 62.0588 122.026 72.0001 122.026H86.0001V132.438C79.0733 135.069 73.1456 136 65.5076 136C46.0159 136 34.541 125.179 34.0001 106V70H3.84034C2.74109 70 1.80259 70.7945 1.62134 71.8788L0.0313423 81.3787C-0.197908 82.7505 0.859592 84 2.25059 84H20.0001V106C20.3073 118 23.4221 129.018 32.1076 137.773C40.0433 145.772 51.5928 150 65.5076 150C77.2311 150 86.1143 148.062 97.7051 142.642C99.1078 141.986 100 140.572 100 139.023V110.276C100 109.034 98.9928 108.026 97.7501 108.026Z" fill="#0085FF"/> +<path fill-rule="evenodd" clip-rule="evenodd" d="M6.93638 55.9999H34.0001V25.9599L54.0001 18.8777V55.9999H96.1599C97.2591 55.9999 98.1974 55.2054 98.3789 54.1212L99.9686 44.6212C100.198 43.2494 99.1404 41.9999 97.7494 41.9999H68.0001V2.25168C68.0001 0.69843 66.4634 -0.38757 64.9989 0.13093L21.4989 15.5349C20.6006 15.8532 20.0001 16.7029 20.0001 17.6559V41.9999H8.52613C7.42688 41.9999 6.48838 42.7944 6.30688 43.8787L4.71738 53.3787C4.48763 54.7504 5.54538 55.9999 6.93638 55.9999Z" fill="#0085FF"/> +</svg> diff --git a/public/logo/unicef.svg b/public/logo/unicef.svg new file mode 100644 index 0000000..818513d --- /dev/null +++ b/public/logo/unicef.svg @@ -0,0 +1,88 @@ +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="262" + height="63" viewBox="0 0 262 63"> + <g transform="scale(2 2)"> + <path fill="#00AEEF" d="M112.7,0c-6.8,0-12.4,5.5-12.4,12.4c0,6.8,5.5,12.4,12.4,12.4c6.8,0,12.4-5.5,12.4-12.4 + C125.1,5.5,119.5,0,112.7,0 M122.3,5.5c-0.6,0.4-1.3,0.8-2,1.2c-0.4-0.8-0.9-1.6-1.5-2.3c0.5-0.3,1-0.7,1.4-1 + C121.1,3.9,121.8,4.7,122.3,5.5 M117.1,1.4c1,0.4,1.9,0.9,2.8,1.6c-0.4,0.4-0.9,0.7-1.4,1c-0.6-0.7-1.3-1.3-2-1.9 + C116.7,1.8,116.9,1.6,117.1,1.4 M118.1,4.2c-0.7,0.4-1.4,0.6-2.1,0.9c-0.3-0.7-0.6-1.4-1-2c0.4-0.2,0.8-0.4,1.1-0.7 + C116.8,2.9,117.5,3.5,118.1,4.2 M116.6,1.2c-0.2,0.2-0.4,0.4-0.5,0.6c-0.7-0.4-1.3-0.8-2.1-1.1C114.9,0.7,115.8,0.9,116.6,1.2 + M115.7,2.1c-0.3,0.2-0.6,0.4-0.9,0.5c-0.4-0.6-0.8-1.1-1.2-1.7C114.3,1.2,115,1.6,115.7,2.1 M112.9,1c0.5,0.5,0.9,1.1,1.3,1.8 + c-0.4,0.1-0.8,0.2-1.3,0.2V1z M112.9,3.5c0.5,0,1.1-0.1,1.6-0.3c0.4,0.6,0.7,1.3,1,2c-0.8,0.2-1.7,0.3-2.6,0.4V3.5z M112.4,1v2 + c-0.4,0-0.8-0.1-1.3-0.2C111.6,2.2,112,1.6,112.4,1 M110.7,2.6c-0.3-0.1-0.7-0.3-0.9-0.5c0.7-0.4,1.4-0.8,2.1-1.1 + C111.4,1.5,111,2,110.7,2.6 M111.4,0.6c-0.7,0.3-1.4,0.7-2.1,1.1c-0.2-0.2-0.4-0.4-0.5-0.6C109.6,0.9,110.5,0.7,111.4,0.6 + M119.9,21.8c-1.6-0.9-1.7-2.2-1.6-2.6c0.1-0.5,0.4-0.3,0.6-0.3c1.1,0,2.2-0.3,3.6-1.8c1.6-1.6,2.1-5.2-0.4-7.5 + c-2.6-2.5-5.4-2.1-7.2,0.2c-0.4,0.5-1.3,0.8-2,0.8c-1.2,0-0.4,0.9-0.4,1.1c0,0.2-0.2,0.3-0.3,0.3c-0.4-0.1-0.2,0.5-0.2,0.6 + s-0.2,0.3-0.2,0.3c-0.5,0-0.4,0.4-0.3,0.6c0,0.1,0,0.3-0.2,0.4c-0.2,0.1-0.3,0.5-0.3,0.8c0,0.5,0.5,0.9,1.3,1.5 + c0.8,0.6,0.9,1.2,0.9,1.6c0,0.4,0.1,1.1,0.2,1.5c0.2,0.5,0.2,1.5-0.9,1.5c-1.4,0.1-3.8,1.1-4,1.2c-0.8,0.3-1.8,0.4-2.6,0.2 + c-0.4-0.3-0.8-0.6-1.2-1c-0.2-0.5,0.1-1.1,0.4-1.5c0.5,0.5,1.1,0.4,1.5,0.4c0.4,0,2.2-0.3,2.5-0.4c0.3-0.1,0.4-0.1,0.5,0 + c0.7,0.3,1.7,0.3,2.1-1c0.4-1.4-0.5-1-0.7-0.9c-0.1,0.1-0.3,0-0.2-0.1c0.2-0.3-0.1-0.3-0.2-0.3c-0.4,0-0.9,0.4-1,0.5 + c-0.2,0.1-0.3,0.1-0.4,0.1c-0.5-0.3-2,0.1-2.5-0.7c0-0.2-0.4-3.5-0.6-4.1c0-0.1-0.1-0.3,0.1-0.5c0.4-0.6,1.4,0,2,0 + c0.7,0,0.8-0.3,1-0.5c0.2-0.2,0.3-0.1,0.4-0.2c0.1-0.1,0-0.2,0-0.3c0-0.1,0.1,0,0.2-0.1c0.1-0.1,0-0.3,0-0.4 + c0.2-0.3,0.6-0.1,0.4-0.7c-0.1-0.4,0.1-0.8,0.3-1c0.3-0.4,1.6-2.2-0.6-4.1c-2.1-1.8-4.3-1.6-5.7-0.1c-1.4,1.5-0.7,3.7-0.6,4.3 + c0.1,0.6-0.3,1.1-0.8,1.3c-0.4,0.2-1.3,0.8-1.9,1.3c0.1-4.8,3-9,7.4-10.7c0.2,0.2,0.4,0.5,0.6,0.7c-0.5,0.4-1.6,1.3-1.6,1.3 + s0.1,0,0.3,0.1c0.1,0,0.3,0.1,0.3,0.1s0.9-0.8,1.4-1.1c0.3,0.3,0.7,0.5,1.1,0.7c-0.2,0.4-0.8,1.4-0.8,1.4s0.1,0.1,0.2,0.1 + c0.1,0.1,0.2,0.1,0.2,0.1s0.6-1.1,0.8-1.5c0.5,0.2,1,0.3,1.5,0.3v2c-0.3,0-1,0-1.3-0.1l-0.2,0l0.1,0.2c0.1,0.1,0.1,0.2,0.2,0.3l0,0 + l0,0c0.2,0,0.9,0,1.2,0v3.7h0.5V8.9c0.8,0,1.4-0.1,2.1-0.2l0,0l0.7-0.6l-0.4,0c-0.8,0.1-1.5,0.2-2.1,0.2c0,0-0.2,0-0.3,0V6 + c0.9,0,1.9-0.1,2.8-0.4c0.2,0.6,0.7,2.1,0.7,2.1l0.5-0.2c0,0-0.5-1.5-0.7-2.1c0.8-0.2,1.5-0.6,2.2-0.9c0.6,0.7,1.1,1.5,1.5,2.3 + c-0.4,0.2-1,0.4-1,0.4c0.5,0.1,0.9,0.2,0.9,0.2s0.2-0.1,0.3-0.1c0,0.1,0.1,0.3,0.1,0.3l0.7,0.3l-0.1-0.2c0,0-0.2-0.5-0.3-0.6 + c0.7-0.3,1.4-0.7,2.1-1.2c1.3,1.9,1.9,4.2,1.9,6.5C124.6,16.2,122.7,19.6,119.9,21.8" /> + <path fill="#00AEEF" d="M99.2,3.3L99,3.5c-0.7,0.6-2.4,2.3-2.1,4.2c0,0,0,0.1,0,0.1c0,0,0.1,0.4,0.1,0.4l0.2-0.2 + c1-0.9,1.8-2.5,2.1-4.3l0.1-0.5L99.2,3.3z" /> + <path fill="#00AEEF" d="M95.8,6.5l-0.1,0.2c-0.1,0.3-0.3,1-0.4,1.8c-0.2,1.2-0.1,3,0.9,4.3c0,0,0.1,0.2,0.1,0.2l0.1,0.2l0.2-0.8 + c0.2-1.4-0.1-4.3-0.6-5.6l-0.2-0.4L95.8,6.5z" /> + <path fill="#00AEEF" d="M94.6,11.5l0,0.2c-0.1,1.2,0,4.3,2.5,6c0,0,0.3,0.2,0.3,0.2l0-0.4c0-1.2-1.4-4.7-2.4-5.9l-0.3-0.4L94.6,11.5 + z" /> + <path fill="#00AEEF" + d="M95,17l0,0.2c0.4,1.8,2,4.6,4.6,5.5l0.4,0.1l-0.1-0.4c-0.5-1.3-3-4.4-4.6-5.4L95,16.8L95,17z" /> + <path fill="#00AEEF" + d="M100.3,6L100,6.1c-1.9,1.2-2.8,2.6-2.8,4.4l0,0.4l0.3-0.2c1-0.9,2.4-3.1,2.7-4.3l0.1-0.5L100.3,6z" /> + <path fill="#00AEEF" d="M99.1,9.8L99,10c-0.5,0.5-2.1,2.2-2,4.3c0,0.3,0.1,0.7,0.2,1l0.1,0.3l0.2-0.3c0.8-1.1,1.8-3.9,1.7-5.2l0-0.4 + L99.1,9.8z" /> + <path fill="#00AEEF" d="M99.2,13.5l-0.1,0.2c-0.8,1.2-1.2,2.4-1.2,3.6c0,0.8,0.3,1.6,0.8,2.4l0.2,0.3l0.1-0.3 + c0.3-0.7,0.6-2.8,0.6-4.5c0-0.6-0.1-1.1-0.2-1.4l-0.1-0.4L99.2,13.5z" /> + <path fill="#00AEEF" d="M100.1,17.4l-0.1,0.2c-0.2,0.8-0.4,1.5-0.3,2.3c0,1.6,0.8,2.9,2.2,3.8l0.2,0.1l0.1-0.3c0,0,0-0.3,0-0.3 + c0-1.3-1-4.7-1.8-5.7l-0.2-0.3L100.1,17.4z" /> + <path fill="#00AEEF" + d="M97.4,22.6l0.1,0.2c1,1.7,2.8,4,6.1,3.4l0.3,0l-0.2-0.2c-0.6-0.9-4.6-3.2-6-3.4l-0.4-0.1L97.4,22.6z" /> + <path fill="#00AEEF" d="M102.3,27L102.3,27l-0.5,0.1l0.5,0.2c2.1,0.9,4.7,1.1,6.3,0.6c0.6-0.2,0.9-0.5,1.3-0.9 + c2.7,0.3,5.2,2.5,6.7,4.3c0,0,0.1,0.1,0.1,0.1l0.1,0c0.2-0.1,0.4-0.3,0.5-0.4l0.1-0.1l-0.1-0.1c-1.5-2-3.9-3.2-4-3.3 + C111.1,26.5,107.3,25.7,102.3,27" /> + <path fill="#00AEEF" + d="M102.4,21.4l0,0.2c0.3,2,1.1,4.6,4.5,4.3l0.2,0l-0.1-0.2c-0.2-0.9-3.3-3.5-4.4-4.2l-0.3-0.2L102.4,21.4z" /> + <path fill="#00AEEF" d="M126,3.1l0.1,0.5c0.3,1.8,1.1,3.4,2.1,4.3l0.2,0.2c0,0,0.1-0.4,0.1-0.4c0,0,0-0.1,0-0.1 + c0.3-1.9-1.4-3.6-2.1-4.2l-0.2-0.2L126,3.1z" /> + <path fill="#00AEEF" d="M129.5,6.3l-0.2,0.4c-0.5,1.3-0.7,4.2-0.6,5.6l0.2,0.8L129,13c0,0,0.1-0.2,0.1-0.2c1.1-1.3,1.1-3,0.9-4.3 + c-0.1-0.9-0.3-1.5-0.4-1.8l-0.1-0.2L129.5,6.3z" /> + <path fill="#00AEEF" d="M130.8,11.3l-0.3,0.4c-1,1.3-2.4,4.7-2.4,5.9l0,0.4c0,0,0.3-0.2,0.3-0.2c2.5-1.6,2.6-4.7,2.5-6l0-0.2 + L130.8,11.3z" /> + <path fill="#00AEEF" + d="M130.4,16.8l-0.4,0.2c-1.6,1-4.1,4.1-4.6,5.4l-0.1,0.4l0.4-0.1c2.6-0.8,4.3-3.7,4.6-5.5l0-0.2L130.4,16.8z" /> + <path fill="#00AEEF" + d="M125.1,5.8l0.1,0.5c0.4,1.3,1.6,3.5,2.7,4.4l0.3,0.2l0-0.4c0.1-1.8-0.8-3.2-2.7-4.4l-0.2-0.1L125.1,5.8z" /> + <path fill="#00AEEF" d="M126.2,9.7l0,0.4c-0.1,1.3,1,4.2,1.7,5.2l0.2,0.3l0.1-0.3c0.1-0.4,0.2-0.7,0.2-1c0.1-2.1-1.5-3.8-2-4.3 + l-0.1-0.1L126.2,9.7z" /> + <path fill="#00AEEF" d="M126.1,13.3l-0.1,0.4c-0.1,0.3-0.2,0.8-0.2,1.4c0,1.7,0.2,3.8,0.6,4.5l0.1,0.3l0.2-0.3 + c0.5-0.7,0.8-1.5,0.8-2.4c0-1.1-0.4-2.4-1.2-3.6l-0.1-0.2L126.1,13.3z" /> + <path fill="#00AEEF" d="M125.2,17.2l-0.2,0.3c-0.8,1-1.8,4.4-1.8,5.7c0,0,0,0.2,0,0.3l0.1,0.3c0,0,0.2-0.1,0.2-0.1 + c1.4-0.9,2.1-2.2,2.2-3.8c0-0.7-0.1-1.5-0.3-2.3l-0.1-0.2L125.2,17.2z" /> + <path fill="#00AEEF" d="M128.1,22.4c0,0-0.4,0.1-0.4,0.1c-1.4,0.2-5.4,2.5-6,3.4l-0.2,0.2l0.3,0c3.3,0.6,5.1-1.7,6.1-3.4l0.1-0.2 + L128.1,22.4z" /> + <path fill="#00AEEF" + d="M112.2,27.5c-0.1,0-2.5,1.3-4,3.3l-0.1,0.1l0.1,0.1c0.1,0.1,0.4,0.3,0.5,0.4l0.1,0c0,0,0.1-0.1,0.1-0.1 + c1.5-1.8,4-4.1,6.7-4.3c0.4,0.4,0.8,0.7,1.3,0.9c1.5,0.5,4.2,0.3,6.3-0.6l0.5-0.2l-0.5-0.1C118.1,25.7,114.3,26.5,112.2,27.5" /> + <path fill="#00AEEF" + d="M123,21.2l-0.3,0.2c-1.1,0.7-4.1,3.3-4.4,4.2l-0.1,0.2l0.2,0c3.3,0.3,4.1-2.3,4.5-4.3l0-0.2L123,21.2z" /> + <path fill="#00AEEF" d="M38.6,1.2h4.2V5h-4.2V1.2z M39,9.4h3.5v18.6H39V9.4z" /> + <path fill="#00AEEF" d="M12.5,9.4H16v18.6h-3.4v-2.7h-0.1c-1.4,2.3-3.8,3.3-6.4,3.3c-3.9,0-6.1-3-6.1-6.7V9.4h3.5v11 + c0,3.2,0.7,5.6,4.1,5.6c1.4,0,3.4-0.7,4.1-2.7c0.7-1.7,0.7-3.9,0.7-4.4V9.4z" /> + <path fill="#00AEEF" d="M23,12.1L23,12.1c1.3-2.3,3.8-3.3,5.7-3.3c1.3,0,7,0.3,7,6.3v12.8h-3.5V16.2c0-3.1-1.3-4.7-4.3-4.7 + c0,0-1.9-0.1-3.4,1.4c-0.5,0.5-1.5,1.3-1.5,5v10.1h-3.5V9.4H23V12.1z" /> + <path fill="#00AEEF" d="M57.2,15.3c-0.2-2.3-1.3-3.9-3.8-3.9c-3.3,0-4.6,2.9-4.6,7.2c0,4.3,1.3,7.2,4.6,7.2c2.3,0,3.7-1.5,3.9-4.2 + h3.5c-0.3,4.2-3.4,6.7-7.5,6.7c-5.9,0-8.3-4.2-8.3-9.6c0-5.4,2.7-9.9,8.6-9.9c3.9,0,6.8,2.5,7,6.5H57.2z" /> + <path fill="#00AEEF" d="M66,19.3c-0.3,3.2,1.1,6.6,4.6,6.6c2.7,0,4.1-1.1,4.5-3.8h3.7c-0.6,4.2-3.8,6.3-8.2,6.3 + c-5.9,0-8.3-4.2-8.3-9.6c0-5.4,2.7-9.9,8.6-9.9C76.4,9,79,12.5,79,17.6v1.7H66z M75.4,16.9c0.1-3.1-1.3-5.5-4.7-5.5 + c-2.9,0-4.6,2.5-4.6,5.5H75.4z" /> + <path fill="#00AEEF" d="M83,27.8v-16h-3.2V9.4H83v-4c0.1-4,3.2-5.1,5.8-5.1c0.8,0,1.7,0.2,2.5,0.4v2.9c-0.6,0-1.2-0.1-1.8-0.1 + c-2,0-3.1,0.5-3,2.5v3.4h4.3v2.4h-4.3v16H83z" /> + </g> +</svg> diff --git a/public/logo/uptarget.png b/public/logo/uptarget.png new file mode 100644 index 0000000000000000000000000000000000000000..d607148c7faabe2c155ef618046e04e90253869b GIT binary patch literal 30474 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 adU)K(?W=k<N5#>8xOqe8uOgNEf&T|wt-a0w literal 0 HcmV?d00001 diff --git a/public/logo/vk.svg b/public/logo/vk.svg new file mode 100644 index 0000000..53c444b --- /dev/null +++ b/public/logo/vk.svg @@ -0,0 +1,4 @@ +<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg"> +<path d="M0 23.04C0 12.1788 0 6.74826 3.37413 3.37413C6.74826 0 12.1788 0 23.04 0H24.96C35.8212 0 41.2517 0 44.6259 3.37413C48 6.74826 48 12.1788 48 23.04V24.96C48 35.8212 48 41.2517 44.6259 44.6259C41.2517 48 35.8212 48 24.96 48H23.04C12.1788 48 6.74826 48 3.37413 44.6259C0 41.2517 0 35.8212 0 24.96V23.04Z" fill="#0077FF"/> +<path d="M25.54 34.5801C14.6 34.5801 8.3601 27.0801 8.1001 14.6001H13.5801C13.7601 23.7601 17.8 27.6401 21 28.4401V14.6001H26.1602V22.5001C29.3202 22.1601 32.6398 18.5601 33.7598 14.6001H38.9199C38.0599 19.4801 34.4599 23.0801 31.8999 24.5601C34.4599 25.7601 38.5601 28.9001 40.1201 34.5801H34.4399C33.2199 30.7801 30.1802 27.8401 26.1602 27.4401V34.5801H25.54Z" fill="white"/> +</svg> diff --git a/public/make-scrollable-code-focusable.js b/public/make-scrollable-code-focusable.js new file mode 100644 index 0000000..6fbf1ee --- /dev/null +++ b/public/make-scrollable-code-focusable.js @@ -0,0 +1,3 @@ +Array.from(document.getElementsByTagName("pre")).forEach((element) => { + element.setAttribute("tabindex", "0"); +}); diff --git a/src/components/DropDownMenu.astro b/src/components/DropDownMenu.astro new file mode 100644 index 0000000..c9622f9 --- /dev/null +++ b/src/components/DropDownMenu.astro @@ -0,0 +1,208 @@ +--- +import { getPathParamsFromId, getTextLocalized, type LText } from "../languages"; + +interface Link { + link: string; + text: LText; +} + +interface Group { + text: LText; + links: Link[]; +} + +export interface Props { + links: (Group | Link)[]; + class?: string; +} + +const { links } = Astro.props; +const { lang } = getPathParamsFromId(Astro.url.pathname); +--- + +<div class={`menu ${Astro.props.class}`}> + <button type="button" class="menu-button"> + <div class="button-title"> + <slot /> + </div> + <svg + xmlns="http://www.w3.org/2000/svg" + width="18" + height="18" + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" + > + <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> + <polyline points="6 9 12 15 18 9"></polyline> + </svg> + </button> + <div class="flyout"> + <div class="items"> + <div class="group"> + { + links.map((linkOrGroup) => { + if ("links" in linkOrGroup) { + return ( + <div class="group"> + <p>{getTextLocalized(linkOrGroup, lang)}</p> + {linkOrGroup.links.map((link) => { + return ( + <a + class:list={{ + link: true, + active: Astro.url.pathname.startsWith(link.link), + }} + href={link.link} + target={link.link.startsWith("/") ? undefined : "_blank"} + > + {getTextLocalized(link, lang)} + {link.link.startsWith("https://") || link.link.startsWith("http://") ? ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="18" + height="18" + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" + > + <path stroke="none" d="M0 0h24v24H0z" fill="none" /> + <line x1="17" y1="7" x2="7" y2="17" /> + <polyline points="8 7 17 7 17 16" /> + </svg> + ) : null} + </a> + ); + })} + </div> + ); + } + return ( + <a + href={linkOrGroup.link} + class:list={{ link: true, active: Astro.url.pathname.startsWith(linkOrGroup.link) }} + target={linkOrGroup.link.startsWith("/") ? undefined : "_blank"} + > + {getTextLocalized(linkOrGroup, lang)} + {linkOrGroup.link.startsWith("https://") || + linkOrGroup.link.startsWith("http://") ? ( + <svg + xmlns="http://www.w3.org/2000/svg" + width="18" + height="18" + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" + > + <path stroke="none" d="M0 0h24v24H0z" fill="none" /> + <line x1="17" y1="7" x2="7" y2="17" /> + <polyline points="8 7 17 7 17 16" /> + </svg> + ) : null} + </a> + ); + }) + } + </div> + </div> + </div> +</div> + +<style> + .menu { + display: flex; + position: relative; + justify-content: center; + align-items: center; + background-color: transparent; + overflow: visible; + pointer-events: auto; + color: var(--theme-text); + } + + .menu :global(svg) { + pointer-events: none; + } + + .menu button { + display: flex; + align-items: center; + appearance: none; + transition: color 0.3s; + padding: 0; + color: var(--theme-text); + } + + .menu:hover button { + color: var(--theme-text-light); + } + + .menu .flyout { + position: absolute; + top: 130%; + right: 0rem; + visibility: hidden; + opacity: 0; + transition: + opacity 0.25s, + visibility 0.25s, + transform 0.25s; + } + + .menu:hover .flyout { + transform: translateY(0); + visibility: visible; + opacity: 1; + } + + .items { + @apply rounded-xl p-3 shadow-xl; + border: 1px solid var(--theme-divider); + background-color: var(--theme-bg); + min-width: 8rem; + overflow-y: auto; + } + + .group { + display: flex; + flex-direction: column; + } + + .group p { + margin-top: 1rem; + } + + .link { + @apply rounded-md; + display: flex; + transition: + background-color 0.25s, + color 0.25s; + padding: 0 0.8rem; + color: currentColor; + font-weight: 500; + font-size: 0.9rem; + line-height: 2rem; + text-align: start; + white-space: nowrap; + } + + .link:hover { + background-color: var(--theme-divider); + color: var(--theme-accent); + } + + .link.active, + .group .link.active { + color: var(--theme-accent); + } +</style> diff --git a/src/components/FeatureCard.astro b/src/components/FeatureCard.astro new file mode 100644 index 0000000..f319699 --- /dev/null +++ b/src/components/FeatureCard.astro @@ -0,0 +1,37 @@ +--- +interface Props { + title: string; + description: string; + link: string; +} +--- + +<a href={Astro.props.link} class="feature"> + <div class="icon"><slot name="icon" /></div> + <div class="title">{Astro.props.title}</div> + <div class="description">{Astro.props.description}</div> +</a> + +<style> + .feature { + @apply relative flex h-32 flex-col items-start gap-0 overflow-hidden rounded-xl p-2 text-left shadow-md transition-all hover:-translate-y-1 hover:shadow-xl focus:no-underline active:no-underline; + background-color: var(--theme-card); + } + + .icon { + @apply absolute -left-3 -top-3 h-24 w-24; + } + + .title, + .description { + @apply ml-24 text-left; + color: var(--theme-text); + } + + .title { + @apply py-2 text-2xl; + } + + .description { + } +</style> diff --git a/src/components/Footer/Footer.astro b/src/components/Footer/Footer.astro new file mode 100644 index 0000000..fba6b4e --- /dev/null +++ b/src/components/Footer/Footer.astro @@ -0,0 +1,92 @@ +--- +import { createLink, getPathParamsFromId, getTextLocalized } from "../../languages"; +import { FOOTER_LINKS } from "../../navigation"; +import IconExternal from "../../icons/External.astro"; +import { LINKS } from "../../consts"; + +const { lang } = getPathParamsFromId(Astro.url.pathname); +--- + +<footer data-pagefind-ignore> + <div class="collection"> + { + FOOTER_LINKS.map((group) => { + const text = getTextLocalized(group, lang); + + return ( + <div class="group"> + <h3 class="title">{text}</h3> + {group.items.map((link) => { + const text = getTextLocalized(link, lang); + const external = link.link.startsWith("https://") || link.link.startsWith("http://"); + const href = external ? link.link : createLink(link, lang); + + if (external) { + return ( + <div> + <a href={href} target="_blank" class="link"> + <span>{text}</span> + <IconExternal /> + </a> + </div> + ); + } + + return ( + <div> + <a href={href} class="link"> + {text} + </a> + </div> + ); + })} + </div> + ); + }) + } + <div class="rights group"> + <span class="text-xs sm:text-sm md:text-base lg:text-lg"> + <a href={LINKS.zerobias} target="_blank">zerobias</a> & Effector Core team + </span> + <span> © 2018-{new Date().getFullYear()}</span> + </div> + </div> +</footer> + +<style> + footer { + margin-top: 3rem; + border-top: 3px solid var(--theme-divider); + padding: 2rem; + color: var(--theme-text); + } + + .collection { + @apply mx-auto grid max-w-5xl grid-cols-2 gap-x-4 gap-y-8 sm:gap-x-6 md:grid-cols-3 md:gap-x-12; + } + + .group { + @apply flex flex-col; + } + + .group .title { + @apply my-2 text-base font-bold; + } + + .link { + @apply flex w-fit gap-0 py-1 text-sm lg:text-base; + color: var(--theme-text-light); + } + + .link:hover { + color: var(--theme-text-accent); + } + + .rights { + @apply text-sm; + } + + .rights :global(a:hover) { + @apply underline; + } +</style> diff --git a/src/components/HeadCommon.astro b/src/components/HeadCommon.astro new file mode 100644 index 0000000..9ee7000 --- /dev/null +++ b/src/components/HeadCommon.astro @@ -0,0 +1,47 @@ +--- +import "../styles/theme.css"; +import "../styles/index.css"; +import "../styles/language.css"; +--- + +<!-- Global Metadata --> +<meta charset="utf-8" /> +<meta name="viewport" content="width=device-width" /> + +<link rel="icon" type="image/svg+xml" href="/favicon.svg" /> + +<link rel="sitemap" href="/sitemap.xml" /> + +<!-- Preload Fonts --> +<link rel="preconnect" href="https://fonts.googleapis.com" /> +<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin /> +<link + href="https://fonts.googleapis.com/css2?family=IBM+Plex+Mono:ital@0;1&display=swap" + rel="stylesheet" +/> + +<!-- Scrollable a11y code helper --> +<script src="/make-scrollable-code-focusable.js" is:inline></script> + +<!-- This is intentionally inlined to avoid FOUC --> +<script is:inline> + const root = document.documentElement; + const theme = localStorage.getItem("theme"); + if ( + theme === "dark" || + ((!theme || theme === "auto") && window.matchMedia("(prefers-color-scheme: dark)").matches) + ) { + root.classList.add("theme-dark"); + } else { + root.classList.remove("theme-dark"); + } +</script> + +<!-- Global site tag (gtag.js) - Google Analytics --> +<!-- <script async src="https://www.googletagmanager.com/gtag/js?id=G-TEL60V1WM9" is:inline></script> +<script> + window.dataLayer = window.dataLayer || []; + function gtag(){dataLayer.push(arguments);} + gtag('js', new Date()); + gtag('config', 'G-TEL60V1WM9'); +</script> --> diff --git a/src/components/HeadSEO.astro b/src/components/HeadSEO.astro new file mode 100644 index 0000000..f2209fa --- /dev/null +++ b/src/components/HeadSEO.astro @@ -0,0 +1,48 @@ +--- +import type { CollectionEntry } from "astro:content"; +import { SITE, OPEN_GRAPH } from "../consts"; + +type DocsEntry = CollectionEntry<"docs">["data"]; +interface Props extends DocsEntry { + canonicalUrl: URL; +} + +const { ogLocale, image, title, description, canonicalUrl } = Astro.props; +const formattedContentTitle = `${title} 🚀 ${SITE.title}`; +const imageSrc = image?.src ?? OPEN_GRAPH.image.src; +const canonicalImageSrc = new URL(imageSrc, Astro.site); +const imageAlt = image?.alt ?? OPEN_GRAPH.image.alt; +--- + +<!-- Page Metadata --> +<link rel="canonical" href={canonicalUrl} /> + +<!-- OpenGraph Tags --> +<meta property="og:title" content={formattedContentTitle} /> +<meta property="og:type" content="article" /> +<meta property="og:url" content={canonicalUrl} /> +<meta property="og:locale" content={ogLocale ?? SITE.defaultLanguage} /> +<meta property="og:image" content={canonicalImageSrc} /> +<meta property="og:image:alt" content={imageAlt} /> +<meta + name="description" + property="og:description" + content={description ?? SITE.description} + data-pagefind-index-attrs="content" +/> +<meta property="og:site_name" content={SITE.title} /> + +<!-- Twitter Tags --> +<meta name="twitter:card" content="summary_large_image" /> +<meta name="twitter:site" content={OPEN_GRAPH.twitter} /> +<meta name="twitter:title" content={formattedContentTitle} /> +<meta name="twitter:description" content={description ?? SITE.description} /> +<meta name="twitter:image" content={canonicalImageSrc} /> +<meta name="twitter:image:alt" content={imageAlt} /> + +<!-- + TODO: Add json+ld data, maybe https://schema.org/APIReference makes sense? + Docs: https://developers.google.com/search/docs/advanced/structured-data/intro-structured-data + https://www.npmjs.com/package/schema-dts seems like a great resource for implementing this. + Even better, there's a React component that integrates with `schema-dts`: https://github.com/google/react-schemaorg +--> diff --git a/src/components/Header/EffectorLogo.astro b/src/components/Header/EffectorLogo.astro new file mode 100644 index 0000000..0690f54 --- /dev/null +++ b/src/components/Header/EffectorLogo.astro @@ -0,0 +1,8 @@ +--- +type Props = { + size: number; +}; +const { size } = Astro.props; +--- + +<img src="/favicon.svg" alt="effector comet" width={size} /> diff --git a/src/components/Header/Header.astro b/src/components/Header/Header.astro new file mode 100644 index 0000000..6b30ebb --- /dev/null +++ b/src/components/Header/Header.astro @@ -0,0 +1,282 @@ +--- +import { + createChangeLangLinks, + createLink, + getPathParamsFromId, + getTextLocalized, + translations, +} from "../../languages"; +import { SITE } from "../../consts"; +import { DESKTOP_NAVIGATION, SOCIAL_LINKS, DOCS_VERSIONS, QUICK_MENU } from "../../navigation"; + +import MobileNavigation from "../MobileNavigation.astro"; +import DropDownMenu from "../DropDownMenu.astro"; + +import EffectorLogo from "./EffectorLogo.astro"; +import MobileMenuButton from "./MobileMenuButton.astro"; +import Search from "./Search.astro"; +import SkipToContent from "./SkipToContent.astro"; +import ThemeToggle from "./ThemeToggleButton"; + +import IconExternal from "../../icons/External.astro"; +import IconLanguage from "../../icons/Language.astro"; +import IconDots from "../../icons/Dots.astro"; + +import IconGithub from "../../icons/Github.astro"; +import IconTwitter from "../../icons/Twitter.astro"; +import IconDiscord from "../../icons/Discord.astro"; +import IconYoutube from "../../icons/Youtube.astro"; + +const socialIcons = { + github: IconGithub, + twitter: IconTwitter, + discord: IconDiscord, + youtube: IconYoutube, +}; + +type Props = { + currentPage: string; +}; + +const { lang, slug } = getPathParamsFromId(Astro.url.pathname); +const languageLinks = createChangeLangLinks({ slug }); +const homeLink = lang === "en" ? "/" : `/${lang}`; +--- + +<header data-pagefind-ignore> + <SkipToContent /> + + <nav> + <a class="logo" href={homeLink}> + <EffectorLogo size={40} /> + <span>{SITE.title ?? getTextLocalized(translations.Documentation, lang)}</span> + </a> + <div class="mr-auto"> + <Search /> + </div> + { + DESKTOP_NAVIGATION.map((navLink) => { + const external = navLink.link.startsWith("https://") || navLink.link.startsWith("http://"); + const href = external ? navLink.link : createLink(navLink, lang); + const text = getTextLocalized(navLink, lang); + const quickMenu = Boolean(navLink.features?.includes("API")); + + if (external) { + return ( + <a href={href} target="_blank" class="link only-medium"> + <span>{text}</span> + <IconExternal /> + </a> + ); + } + + if (quickMenu) { + return ( + <div class="group relative hidden md:flex"> + <a href={href} class="link"> + {text} + </a> + + <div class="absolute left-1/2 z-10 mt-6 hidden w-screen max-w-max -translate-x-1/2 -translate-y-2 group-hover:flex"> + <div class="quick-menu mt-4"> + {Object.entries(QUICK_MENU).map(([name, { link, groups }]) => { + const external = link.startsWith("https://") || link.startsWith("http://"); + const href = external ? link : createLink({ link, text: { en: name } }, lang); + + return ( + <div class="quick-group"> + <h6 class="quick-group-header"> + <span>{name}</span> + <a href={href} class="quick-link"> + {getTextLocalized(translations.More, lang)} + </a> + </h6> + {groups.map((elements) => ( + <div class="flex flex-wrap gap-x-1"> + {elements.map((element) => { + const external = + element.link.startsWith("https://") || + element.link.startsWith("http://"); + const href = external ? element.link : createLink(element, lang); + const text = getTextLocalized(element, lang); + return ( + <a + href={href} + target={external ? "_blank" : undefined} + class="quick-link" + > + <span>{text}</span> + {external ? <IconExternal /> : null} + </a> + ); + })} + </div> + ))} + </div> + ); + })} + </div> + </div> + </div> + ); + } + + return ( + <div class="relative hidden md:flex"> + <a href={href} class="link"> + {text} + </a> + </div> + ); + }) + } + <div class="only-medium"> + <DropDownMenu links={DOCS_VERSIONS}>v23.x</DropDownMenu> + </div> + <div class="only-medium"> + <DropDownMenu links={languageLinks}> + <IconLanguage /> + </DropDownMenu> + </div> + <ThemeToggle client:idle /> + { + SOCIAL_LINKS.map((link) => { + const Icon = socialIcons[link.icon]; + return ( + <a href={link.link} class="link only-medium" target="_blank"> + <Icon /> + </a> + ); + }) + } + <div class="hidden md:inline-block xl:hidden"> + <DropDownMenu + links={[ + ...DESKTOP_NAVIGATION.filter( + (navLink) => navLink.link.startsWith("https://") || navLink.link.startsWith("http://"), + ), + { + text: { en: "Language", ru: "Язык документации" }, + links: languageLinks, + }, + { + text: { en: "Other versions", ru: "Другие версии" }, + links: DOCS_VERSIONS, + }, + { + text: { en: "Social", ru: "Социальные сети" }, + links: SOCIAL_LINKS, + }, + ]} + > + <IconDots /> + </DropDownMenu> + </div> + <div class="md:hidden"> + <MobileMenuButton /> + </div> + </nav> +</header> +<MobileNavigation /> + +<style> + header { + @apply fixed left-0 right-0 top-0 flex w-full items-center justify-center overflow-visible shadow; + + z-index: 110; + height: var(--theme-navbar-height); + + -webkit-backdrop-filter: saturate(50%) blur(12px); + backdrop-filter: saturate(50%) blur(12px); + background-color: var(--theme-navbar-bg); + font-family: "Lexend Deca", sans-serif; + } + + nav { + @apply mx-auto flex items-center justify-end gap-2; + + padding-left: max(env(safe-area-inset-left), 1.5rem); + padding-right: max(env(safe-area-inset-right), 1.5rem); + /* max-width: 84rem; */ + width: 100%; + max-width: var(--header-max-width, 84rem); + height: var(--theme-navbar-height); + } + + .logo { + @apply flex items-center rounded-3xl hover:opacity-75 focus:no-underline; + transition: opacity 100ms ease-out; + } + + .logo span { + @apply mx-2 select-none text-2xl font-extrabold; + color: var(--theme-text); + } + + .quick-menu { + @apply overflow-hidden rounded-lg border border-gray-50/10 text-sm leading-6 shadow-lg; + @apply w-screen max-w-md gap-4 px-4 py-3; + @apply flex flex-col items-stretch; + /* @apply grid grid-cols-2 grid-rows-2; */ + background-color: var(--theme-card); + } + + .quick-menu .quick-group { + @apply flex flex-col items-stretch gap-0; + } + + .quick-menu .quick-group .quick-group-header { + @apply flex justify-between pb-1; + } + + .quick-menu .quick-group:not(:first-child) .quick-group-header { + @apply border-t pt-4; + border-color: var(--theme-card-divider); + } + + .quick-menu .quick-link { + display: flex; + padding-block: 0; + gap: 0; + } + + .quick-menu .quick-link:hover { + text-decoration: underline; + } + + .quick-menu .quick-link:not(:last-child)::after { + content: ","; + color: var(--theme-text-light); + } + + @media (max-width: 512px) { + .logo span { + display: none; + } + } + + nav { + @apply flex gap-4 text-base font-normal; + font-stretch: normal; + font-optical-sizing: auto; + } + + nav .link { + @apply flex items-center justify-center gap-1 text-base font-normal; + color: var(--theme-text); + } + nav .link:hover, + nav .link:focus, + nav .link.active { + color: var(--theme-accent); + } + nav .link.active:hover, + nav .link.active:focus { + color: var(--theme-text-accent); + } + + .link.only-medium, + .only-medium { + @apply hidden xl:flex; + } +</style> diff --git a/src/components/Header/MobileMenuButton.astro b/src/components/Header/MobileMenuButton.astro new file mode 100644 index 0000000..03fc7fc --- /dev/null +++ b/src/components/Header/MobileMenuButton.astro @@ -0,0 +1,73 @@ +--- +import IconMenu from "../../icons/Menu.astro"; + +// Animation copied from https://github.com/shuding/nextra/blob/a84ed9642e59a9f60c3cf1eaeca643b1f425bd9f/packages/nextra-theme-docs/css/hamburger.css +--- + +<button id="mobile-menu" type="button"> + <IconMenu class="icon" /> +</button> + +<style> + button:focus { + color: var(--theme-text-accent); + outline: none; + @apply ring-2 ring-current ring-offset-2; + } +</style> + +<style is:global> + #mobile-menu { + @apply p-2; + } + + #mobile-menu svg g { + @apply origin-center; + transition: transform 0.2s cubic-bezier(0.25, 1, 0.5, 1); + } + + #mobile-menu svg line { + opacity: 1; + transition: + transform 0.2s cubic-bezier(0.25, 1, 0.5, 1) 0.2s, + opacity 0.2s ease 0.2s; + } + + #mobile-menu.open svg line { + transition: + transform 0.2s cubic-bezier(0.25, 1, 0.5, 1), + opacity 0s ease 0.2s; + } + + #mobile-menu.open svg g { + transition: transform 0.2s cubic-bezier(0.25, 1, 0.5, 1) 0.2s; + } + + #mobile-menu.open svg > line { + opacity: 0; + } + + #mobile-menu.open svg > g:first-of-type { + transform: rotate(45deg); + } + #mobile-menu.open svg > g:first-of-type line { + transform: translate3d(0, 6px, 0); + } + + #mobile-menu.open svg > g:last-of-type { + transform: rotate(-45deg); + } + #mobile-menu.open svg > g:last-of-type line { + transform: translate3d(0, -6px, 0); + } +</style> + +<script> + const button = document.getElementById("mobile-menu") as HTMLButtonElement; + function toggle() { + button.classList.toggle("open"); + document.body.classList.toggle("mobile-menu-opened"); + } + button.addEventListener("touch", toggle); + button.addEventListener("click", toggle); +</script> diff --git a/src/components/Header/Search.astro b/src/components/Header/Search.astro new file mode 100644 index 0000000..8f08614 --- /dev/null +++ b/src/components/Header/Search.astro @@ -0,0 +1,368 @@ +--- +import { getPathParamsFromId, getTextLocalized as t, translations } from "../../languages"; +import "@pagefind/default-ui/css/ui.css"; + +const { lang } = getPathParamsFromId(Astro.url.pathname); +const pagefindTranslations = Object.fromEntries( + Object.entries(translations.Pagefind).map(([key, value]) => [key, t(value, lang)]), +); +--- + +<site-search data-translations={JSON.stringify(pagefindTranslations)}> + <button data-open-modal disabled type="button" class="search-input"> + <svg + xmlns="http://www.w3.org/2000/svg" + width="18" + height="18" + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" + > + <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> + <circle cx="10" cy="10" r="7"></circle> + <line x1="21" y1="21" x2="15" y2="15"></line> + </svg> + + <span class="search-text">Search</span> + + <span class="search-hint"> + <span class="sr-only">Press</span> + + <kbd>⌘</kbd> + <kbd>K</kbd> + + <span class="sr-only"> to search</span> + </span> + </button> + + <dialog aria-label={t(translations.Search.label, lang)}> + <div class="dialog-frame"> + { + import.meta.env.DEV && !import.meta.env.PUBLIC_SEARCH ? ( + <div class="m-auto whitespace-pre-line text-center" dir="ltr"> + <p>{t(translations.Search.devWarning, lang)}</p> + </div> + ) : ( + <div id="pagefind__search" /> + ) + } + </div> + </dialog> +</site-search> + +<script> + class SiteSearch extends HTMLElement { + openBtn: HTMLButtonElement; + dialog: HTMLDialogElement; + dialogFrame: Element; + + constructor() { + super(); + this.openBtn = this.querySelector("button[data-open-modal]")!; + this.dialog = this.querySelector("dialog")!; + this.dialogFrame = this.querySelector(".dialog-frame")!; + + /** Close the modal if a user clicks outside of the modal. */ + const onWindowClick = (event: MouseEvent) => { + if ( + document.body.contains(event.target as Node) && + !this.dialogFrame.contains(event.target as Node) + ) + closeModal(); + }; + + const focusInput = () => { + this.querySelector("input")?.focus(); + }; + + const openModal = (event?: MouseEvent) => { + this.dialog.showModal(); + document.body.classList.add("search-dialog-open"); + focusInput(); + event?.stopPropagation(); + window.addEventListener("click", onWindowClick); + }; + + const closeModal = () => { + this.dialog.close(); + }; + + this.openBtn.addEventListener("click", openModal); + this.openBtn.disabled = false; + + const onDialogClose = () => { + document.body.classList.remove("search-dialog-open"); + window.removeEventListener("click", onWindowClick); + }; + this.dialog.addEventListener("close", onDialogClose); + this.dialog.addEventListener("cancel", onDialogClose); + + // Listen for `/` and `cmd + k` keyboard shortcuts. + window.addEventListener("keydown", (e) => { + if (e.metaKey === true && e.key === "k") { + this.dialog.open ? closeModal() : openModal(); + e.preventDefault(); + } else if (e.key === "/" && !this.dialog.open) { + openModal(); + e.preventDefault(); + } + }); + + let translations = {}; + try { + translations = JSON.parse(this.dataset.translations || "{}"); + } catch {} + + window.addEventListener("DOMContentLoaded", () => { + if (import.meta.env.DEV && !import.meta.env.PUBLIC_SEARCH) return; + + const onIdle = window.requestIdleCallback || ((cb) => setTimeout(cb, 1)); + onIdle(async () => { + const { PagefindUI } = await import("@pagefind/default-ui"); + new PagefindUI({ + element: "#pagefind__search", + baseUrl: import.meta.env.BASE_URL, + bundlePath: import.meta.env.BASE_URL.replace(/\/$/, "") + "/_pagefind/", + showImages: false, + translations, + resetStyles: false, + }); + if (this.dialog.open) { + focusInput(); + } + }); + }); + } + } + customElements.define("site-search", SiteSearch); +</script> + +<style> + .search-input { + @apply m-0 box-border flex cursor-pointer rounded-2xl px-2 py-1 outline-0; + + transition-property: border-color, color, background-color; + transition-duration: 0.2s; + transition-timing-function: ease-out; + + background-color: var(--theme-divider); + color: var(--theme-text-light); + overflow: visible; + + font-family: inherit; + font-size: 0.9rem; + font-weight: 500; + line-height: inherit; + -webkit-font-smoothing: antialiased; + } + + .search-input:focus { + box-shadow: 0 0 0 2px var(--theme-text-accent); + color: var(--theme-text); + } + + .search-input:hover::placeholder, + .search-input:focus::placeholder { + color: var(--theme-text-light); + } + + .search-input::placeholder { + color: var(--theme-text-light); + } + + .search-input svg { + margin-right: 0.25rem; + } + + .search-text { + margin-right: 1em; + } + + .search-hint { + display: none; + justify-content: center; + align-items: center; + border-width: 1px; + border-style: solid; + border-color: var(--theme-text-lighter); + border-radius: 0.5rem; + padding: 3px 5px; + pointer-events: none; + color: var(--theme-text-light); + font-size: 13px; + line-height: 14px; + font-family: var(--font-mono); + letter-spacing: 0.125em; + } + + @media (min-width: 50em) { + .search-hint { + display: flex; + } + } + + site-search :global(dialog) { + @apply h-full max-h-full min-h-0 w-full max-w-full rounded-2xl p-0 shadow-2xl open:grid; + } + + site-search :global(dialog::backdrop) { + @apply backdrop-blur-md; + background-color: var(--theme-backdrop-color); + } + + .dialog-frame { + @apply grid min-h-0 overflow-hidden; + } + + #pagefind__search { + @apply grid min-h-0; + } + + @media (min-width: 50rem) { + #pagefind__search { + } + + site-search :global(dialog) { + @apply h-max max-w-2xl bg-transparent p-0; + margin: 3rem auto 2rem auto; + height: calc(100% - 5rem); + max-height: calc(100% - 5rem); + } + + .dialog-frame { + background-color: var(--docsearch-modal-background); + } + } +</style> + +<style is:global> + body.search-dialog-open { + height: 100vh; + overflow: hidden; + } + + #pagefind__search .pagefind-ui { + @apply grid min-h-0; + } + + #pagefind__search .pagefind-ui__form { + @apply grid h-full min-h-0; + grid-template-rows: min-content 1fr; + } + + /* Search icon */ + #pagefind__search .pagefind-ui__form::before { + --pagefind-ui-text: var(--theme-text-lighter); + opacity: 1; + } + + #pagefind__search .pagefind-ui__search-input { + @apply rounded-none border-0 border-b-2 bg-transparent; + color: var(--theme-text); + font-weight: 400; + width: 100%; + border-color: var(--theme-divider); + } + + #pagefind__search .pagefind-ui__search-input:focus { + @apply outline-none; + } + + #pagefind__search .pagefind-ui__search-clear { + display: none; + } + #pagefind__search .pagefind-ui__search-clear:focus { + outline: 1px solid var(--theme-accent-color); + } + #pagefind__search .pagefind-ui__search-clear::before { + content: ""; + -webkit-mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='m13.41 12 6.3-6.29a1 1 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1 1 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 .33 1.64 1 1 0 0 0 1.09-.22l6.29-6.3 6.29 6.3a1 1 0 0 0 1.64-.33 1 1 0 0 0-.22-1.09L13.41 12Z'/%3E%3C/svg%3E") + center / 50% no-repeat; + mask: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24'%3E%3Cpath d='m13.41 12 6.3-6.29a1 1 0 1 0-1.42-1.42L12 10.59l-6.29-6.3a1 1 0 0 0-1.42 1.42l6.3 6.29-6.3 6.29a1 1 0 0 0 .33 1.64 1 1 0 0 0 1.09-.22l6.29-6.3 6.29 6.3a1 1 0 0 0 1.64-.33 1 1 0 0 0-.22-1.09L13.41 12Z'/%3E%3C/svg%3E") + center / 50% no-repeat; + background-color: hsla(var(--theme-accent-color)); + display: block; + width: 100%; + height: 100%; + } + + #pagefind__search .pagefind-ui__drawer { + @apply grid h-full min-h-0 overflow-y-auto px-4 py-2; + } + + #pagefind__search .pagefind-ui__message { + @apply p-0 font-normal italic; + color: var(--theme-text-lighter); + } + + #pagefind__search .pagefind-ui__results-area { + @apply m-0 flex flex-col gap-2; + } + + #pagefind__search .pagefind-ui__results { + @apply flex flex-col divide-y; + } + + #pagefind__search .pagefind-ui__result { + @apply relative border-0 p-0 px-3 py-2 first:rounded-t-xl last:rounded-b-xl; + background-color: var(--theme-card); + border-color: var(--theme-card-divider); + } + + #pagefind__search p, + #pagefind__search mark { + color: inherit; + } + + #pagefind__search .pagefind-ui__result { + color: var(--theme-text-light); + } + + #pagefind__search .pagefind-ui__result:hover, + #pagefind__search .pagefind-ui__result:focus-within { + color: var(--theme-text); + background-color: var(--theme-card-hover); + } + #pagefind__search .pagefind-ui__result:focus-within { + } + + #pagefind__search .pagefind-ui__result-thumb, + #pagefind__search .pagefind-ui__result-inner { + @apply m-0; + } + + #pagefind__search .pagefind-ui__result-title, + #pagefind__search .pagefind-ui__result-link { + color: var(--theme-text); + } + + #pagefind__search .pagefind-ui__result-link:hover { + } + + #pagefind__search .pagefind-ui__result-link::after { + @apply absolute inset-0; + content: ""; + } + + #pagefind__search .pagefind-ui__result-excerpt { + @apply m-0 text-xs; + word-break: break-word; + } + + #pagefind__search mark { + background: none; + font-weight: 500; + } + + #pagefind__search .pagefind-ui__result:focus-within mark { + } + + #pagefind__search .pagefind-ui__button { + @apply m-0 mb-2 mt-4 block h-auto rounded-xl border-0 py-2 text-center capitalize; + background-color: var(--theme-card); + color: var(--theme-text); + } +</style> diff --git a/src/components/Header/SkipToContent.astro b/src/components/Header/SkipToContent.astro new file mode 100644 index 0000000..0f94c8a --- /dev/null +++ b/src/components/Header/SkipToContent.astro @@ -0,0 +1,29 @@ +--- +type Props = {}; +--- + +<a href="#article" class="skiplink sr-only focus:not-sr-only"><span>Skip to Content</span></a> + +<style> + .skiplink, + .skiplink:focus, + .skiplink:focus-visible { + display: block; + position: absolute; + top: 5px; + right: 5px; + left: 5px; + z-index: 9; + outline: var(--theme-bg) solid 1px; + outline-offset: 0; + border-radius: 0.25em; + background-color: var(--theme-text-accent); + padding: 0.25em; + box-shadow: + 0 2px 4px rgba(0, 0, 0, 0.02), + 0 1px 0 rgba(0, 0, 0, 0.06); + color: var(--theme-bg); + font-size: larger; + text-align: center; + } +</style> diff --git a/src/components/Header/ThemeToggleButton.css b/src/components/Header/ThemeToggleButton.css new file mode 100644 index 0000000..1e420d0 --- /dev/null +++ b/src/components/Header/ThemeToggleButton.css @@ -0,0 +1,30 @@ +.theme-toggle { + @apply flex items-center gap-1 rounded-full px-2 py-1; + background-color: var(--theme-code-inline-bg); +} + +.theme-toggle > label:focus-within { + outline: none; + color: var(--theme-text-accent); + @apply ring-1 ring-current ring-offset-2; +} + +.theme-toggle > label { + @apply relative flex cursor-pointer items-center justify-center rounded-full opacity-50; + color: var(--theme-code-inline-text); +} + +.theme-toggle .checked { + opacity: 1; + color: var(--theme-accent); +} + +input[name="theme-toggle"] { + position: absolute; + top: 0; + right: 0; + bottom: 0; + left: 0; + opacity: 0; + z-index: -1; +} diff --git a/src/components/Header/ThemeToggleButton.tsx b/src/components/Header/ThemeToggleButton.tsx new file mode 100644 index 0000000..dddb4aa --- /dev/null +++ b/src/components/Header/ThemeToggleButton.tsx @@ -0,0 +1,121 @@ +import type { FunctionalComponent } from "preact"; +import { useState, useEffect } from "preact/hooks"; +import "./ThemeToggleButton.css"; + +const themes = ["light", "auto", "dark"]; + +const icons = [ + <svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" + > + <path stroke="none" d="M0 0h24v24H0z" fill="none" /> + <circle cx="12" cy="12" r="4" /> + <path d="M3 12h1m8 -9v1m8 8h1m-9 8v1m-6.4 -15.4l.7 .7m12.1 -.7l-.7 .7m0 11.4l.7 .7m-12.1 -.7l-.7 .7" /> + </svg>, + <svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" + > + <path stroke="none" d="M0 0h24v24H0z" fill="none" /> + <circle cx="12" cy="12" r="9" /> + <path d="M13 12h5" /> + <path d="M13 15h4" /> + <path d="M13 18h1" /> + <path d="M13 9h4" /> + <path d="M13 6h1" /> + </svg>, + <svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" + > + <path stroke="none" d="M0 0h24v24H0z" fill="none" /> + <path d="M12 3c.132 0 .263 0 .393 0a7.5 7.5 0 0 0 7.92 12.446a9 9 0 1 1 -8.313 -12.454z" /> + <path d="M17 4a2 2 0 0 0 2 2a2 2 0 0 0 -2 2a2 2 0 0 0 -2 -2a2 2 0 0 0 2 -2" /> + <path d="M19 11h2m-1 -1v2" /> + </svg>, +]; + +const ThemeToggle: FunctionalComponent = () => { + const [selectedTheme, setSelectedTheme] = useState(() => { + if (import.meta.env.SSR) { + return undefined; + } + if (typeof localStorage !== undefined && localStorage.getItem("theme")) { + return localStorage.getItem("theme"); + } + return "auto"; + }); + + useEffect(() => { + const root = document.documentElement; + function setTheme(color: string) { + if (color === "light") { + root.classList.remove("theme-dark"); + } else { + root.classList.add("theme-dark"); + } + } + + if (selectedTheme === "auto") { + const matcher = window.matchMedia("(prefers-color-scheme: dark)"); + setAutomaticTheme(); + matcher.addEventListener("change", setAutomaticTheme); + return () => matcher.removeEventListener("change", setAutomaticTheme); + function setAutomaticTheme() { + setTheme(matcher.matches ? "dark" : "light"); + } + } else { + setTheme(selectedTheme || "light"); + } + }, [selectedTheme]); + + return ( + <div className="theme-toggle"> + {themes.map((t, i) => { + const icon = icons[i]; + const checked = t === selectedTheme; + return ( + <label className={checked ? " checked" : ""}> + {icon} + <input + type="radio" + name="theme-toggle" + checked={checked} + value={t} + title={`Use ${t} theme`} + aria-label={`Use ${t} theme`} + onChange={() => { + localStorage.setItem("theme", t); + setSelectedTheme(t); + }} + /> + </label> + ); + })} + </div> + ); +}; + +export default ThemeToggle; diff --git a/src/components/Landing/Companies.astro b/src/components/Landing/Companies.astro new file mode 100644 index 0000000..c01432b --- /dev/null +++ b/src/components/Landing/Companies.astro @@ -0,0 +1,221 @@ +--- +import { getPathParamsFromId, getTextLocalized, translations } from "../../languages"; + +const companies = [ + { + url: "aviasales.png", + alt: "Aviasales", + yOffset: true, + }, + { + url: "healthSamurai.svg", + alt: "Health Samurai", + }, + { + url: "raiffeisen.svg", + alt: "Raiffeisen Bank Russia", + }, + { + url: "unicef.svg", + alt: "UNICEF (United Nations Children’s Fund)", + }, + { + url: "joom.svg", + alt: "Joom Group", + }, + { + url: "sber.png", + alt: "Sber", + }, + { + url: "avito.svg", + alt: "Avito", + scale: 1.4, + }, + { + url: "mts.svg", + alt: "MTS", + }, + { + url: "docsvision.png", + alt: "Docsvision", + scale: 1.2, + }, + { + url: "okoo.png", + alt: "Okoo", + yOffset: true, + }, + { + url: "space307.svg", + alt: "space307", + }, + { + url: "redmadrobot.png", + alt: "REDMADROBOT", + yOffset: true, + }, + { + url: "travelpayouts.svg", + alt: "Travelpayouts", + }, + { + url: "junto.png", + alt: "Junto", + }, + { + url: "automationhero.svg", + alt: "automation hero", + }, + { + url: "radity.png", + alt: "Radity", + }, + { + url: "globalCtoForum.png", + alt: "Global CTO Forum", + }, + { + url: "express24.svg", + alt: "Express24", + scale: 1.4, + }, + { + url: "stellarX.svg", + alt: "StellarX", + }, + { + url: "stmLabs.png", + alt: "STM Labs", + }, + { + url: "tenpixls.png", + alt: "TenPixls", + }, + { + url: "uptarget.png", + alt: "Uptarget", + }, + { + url: "smartomato.svg", + alt: "смартомато", + }, + { + url: "foxford.svg", + alt: "Фоксфорд", + }, + { + url: "codengage.png", + alt: "Codengage", + }, + { + url: "lunatask.png", + alt: "Lunatask", + }, + { + url: "semrush.png", + alt: "Semrush", + }, + { + url: "intouchHealth.png", + alt: "Intouch Health, a Teladoc company", + }, +]; + +const { lang } = getPathParamsFromId(Astro.url.pathname); +--- + +<section class="companies"> + <h3> + {getTextLocalized(translations.Landing.Companies.title, lang)} + </h3> + <ul class="companies-list"> + { + companies.map(({ url, alt, yOffset, scale }) => { + return ( + <li + class="companies-item" + data-logo-offset={yOffset} + style={{ "--logo-scale": scale ?? null }} + > + <img alt={alt} src={`/logo/${url}`} title={alt} /> + </li> + ); + }) + } + </ul> + <div class="companies-add-yours"> + <span> + {getTextLocalized(translations.Landing.Companies.wantToAppear, lang)} + </span> + <a href="https://github.com/effector/effector/issues/278"> + {getTextLocalized(translations.Landing.Companies.tellUs, lang)} + </a> + </div> +</section> + +<style> + :root { + --logos-bg: hsla(var(--color-stone-10), 1); + /* --logos-bg: hsl(217.46deg 77.24% 85.16%); */ + /* --logos-bg: #e3d0b3; */ + --logos-text: hsla(var(--color-gray-10), 1); + --logos-text-light: hsla(var(--color-gray-30), 1); + } + + .companies { + @apply px-5 pb-20 pt-8; + background-color: var(--logos-bg); + --container-max-width: 90vw; + --logo-card-size: 130px; + } + + @media screen and (max-width: 966px) { + .companies { + --container-max-width: 80vw; + --logo-card-size: 150px; + } + } + + .companies h3 { + @apply mb-10 text-4xl lg:mb-6; + -webkit-box-decoration-break: clone; + -webkit-text-fill-color: transparent; + background: linear-gradient(to right bottom, var(--logos-text-light) 30%, var(--logos-text)); + -webkit-background-clip: text; + line-height: 1.3; + text-align: center; + } + + .companies-list { + @apply mx-auto grid items-center justify-center gap-4; + max-width: var(--container-max-width); + grid-template-columns: repeat(auto-fill, minmax(var(--logo-card-size), 1fr)); + justify-items: center; + } + + .companies-item > img, + .companies-item > svg { + object-fit: contain; + width: 100%; + max-width: var(--logo-card-size); + aspect-ratio: 3/2; + transform: scale(var(--logo-scale, 1)); + } + + .companies-item > svg { + width: fit-content; + } + + .companies-item[data-logo-offset] > img { + transform: translateY(-5%); + } + + .companies-add-yours { + @apply mx-auto flex max-w-6xl justify-end gap-1 p-3 text-xs italic; + } + + .companies-add-yours > span { + color: var(--logos-text); + } +</style> diff --git a/src/components/Landing/Feature.astro b/src/components/Landing/Feature.astro new file mode 100644 index 0000000..ac71d2d --- /dev/null +++ b/src/components/Landing/Feature.astro @@ -0,0 +1,59 @@ +--- +interface Props { + kind?: "major" | "minor"; + emoji?: string; + title: string; +} + +const { kind, emoji, title } = Astro.props; +--- + +<article class:list={{ major: kind === "major", minor: kind === "minor" }}> + <div class="emoji">{emoji}<slot name="emoji" /></div> + <div class="title">{title}</div> + <p><slot /></p> +</article> + +<style> + article { + @apply z-10 flex flex-col gap-3 rounded-2xl p-3 text-center shadow-lg transition-shadow duration-500 hover:shadow-xl sm:gap-4 sm:rounded-3xl sm:p-4; + background-color: var(--theme-card); + } + + article .emoji { + @apply flex h-16 w-16 items-center justify-center self-center text-4xl; + } + + article .title { + @apply text-xl sm:text-2xl; + } + + article p { + @apply text-sm sm:text-base; + color: var(--theme-text); + } + + article.major { + @apply row-span-2; + /* background-image: linear-gradient(var(--theme-text-accent), var(--theme-bg)); */ + background-image: radial-gradient( + circle at 50% 30%, + hsla(var(--color-primary-50), 0.4), + hsla(var(--color-primary-80), 0.3) 25%, + var(--theme-bg) 90% + ); + } + article.major .emoji { + @apply h-[50%] w-full text-8xl md:h-[60%]; + } + article.major .title { + @apply text-2xl md:text-3xl; + } + + article.minor { + @apply md:col-span-2; + } + article.minor p { + @apply mx-auto max-w-[50ch]; + } +</style> diff --git a/src/components/Landing/FeaturesGrid.astro b/src/components/Landing/FeaturesGrid.astro new file mode 100644 index 0000000..3bac2e5 --- /dev/null +++ b/src/components/Landing/FeaturesGrid.astro @@ -0,0 +1,14 @@ +<section class="features"> + <div class="wrapper"> + <slot /> + </div> +</section> + +<style> + .features { + } + + .features .wrapper { + @apply mx-auto grid min-h-[680px] w-full max-w-6xl grid-cols-2 gap-3 p-3 sm:gap-6 sm:p-6 md:grid-cols-3 md:grid-rows-3; + } +</style> diff --git a/src/components/Landing/Hero.astro b/src/components/Landing/Hero.astro new file mode 100644 index 0000000..23fe375 --- /dev/null +++ b/src/components/Landing/Hero.astro @@ -0,0 +1,110 @@ +--- +import IconChevron from "@icons/Chevron.astro"; + +interface Props { + subtitle: string; +} + +/** + * Pass any content without slot to be a description. + * Add `slot="links"` to appear in the links section. + * Many links allowed. Only class `.primary` is supported now + */ +--- + +<section class="hero"> + <div class="title">effector</div> + <div class="subtitle">{Astro.props.subtitle}</div> + <p class="description"> + <slot /> + </p> + <div class="links"> + <slot name="links" /> + </div> +</section> + +<style> + .hero { + @apply mx-5 mb-20 mt-12 flex flex-col justify-center gap-6; + } + + .hero .title { + -webkit-box-decoration-break: clone; + -webkit-text-fill-color: transparent; + color: unset; + letter-spacing: -0.02em; + background: linear-gradient(to right bottom, var(--theme-text-light) 30%, var(--theme-text)); + -webkit-background-clip: text; + font-family: "Lexend Deca"; + + @apply m-0 max-w-full p-0 text-center text-5xl font-bold; + line-height: 1; + } + + .hero .subtitle { + -webkit-box-decoration-break: clone; + -webkit-text-fill-color: transparent; + color: unset; + letter-spacing: -0.02em; + background: linear-gradient(to right bottom, var(--theme-text-light) 30%, var(--theme-text)); + -webkit-background-clip: text; + font-family: "Lexend Deca"; + + @apply m-0 p-0 text-center text-2xl font-medium; + line-height: 1.3; + } + + .hero .description { + @apply text-center text-base; + } + + .hero .links { + @apply flex justify-center; + } + + .hero :global(a.primary) { + background: linear-gradient(170deg, hsl(var(--color-primary-70)), hsl(var(--color-primary-50))); + color: var(--theme-bg); + + @apply flex rounded-3xl py-2 pl-6 pr-4 text-base transition-shadow hover:shadow-md; + } + + /* Some shit happens with tailwind, and order of md/lg rules is changed */ + @media (min-width: 768px) { + .hero .title { + @apply text-6xl; + } + + .hero .subtitle { + @apply text-4xl; + line-height: 1.5; + } + + .hero .description { + @apply text-lg; + } + + .hero :global(a.primary) { + @apply text-lg; + } + } + + @media (min-width: 1024px) { + .hero { + @apply mb-32 mt-24; + } + + .hero .title { + @apply text-8xl; + } + + .hero .subtitle { + @apply text-5xl; + line-height: 1.5; + } + + .hero .description { + @apply text-xl; + } + } +</style> diff --git a/src/components/Landing/Stats.astro b/src/components/Landing/Stats.astro new file mode 100644 index 0000000..2232116 --- /dev/null +++ b/src/components/Landing/Stats.astro @@ -0,0 +1,257 @@ +--- +import { Octokit } from "@octokit/rest"; +import { promisify } from "node:util"; +import * as childProcess from "node:child_process"; + +import { GITHUB_REPO } from "../../consts"; +import IconCopy from "../../icons/Copy.astro"; +import { getPathParamsFromId, getTextLocalized } from "../../languages"; +import { translations } from "src/languages"; + +const exec = promisify(childProcess.exec); + +const { lang } = getPathParamsFromId(Astro.url.pathname); + +const [owner, repo] = GITHUB_REPO.split("/"); +const repoInfo = { owner, repo }; + +const octokit = new Octokit({ auth: import.meta.env.GITHUB_TOKEN }); + +const formatDate = (date: Date) => { + const month = (date.getMonth() + 1).toString().padStart(2, "0"); + const day = date.getDate().toString().padStart(2, "0"); + return `${date.getUTCFullYear()}-${month}-${day}`; +}; + +async function getNpmStats() { + const to = new Date(); + const from = new Date("2018-01-17T03:17:09.763Z"); + const fromDateString = formatDate(from); + const toDateString = formatDate(to); + + const downloadCounts = await fetch( + `https://npm-stat.com/api/download-counts?package=effector&from=${fromDateString}&until=${toDateString}`, + ).then((r) => r.json()); + + const result = await exec("npm info effector --json"); + const npm = JSON.parse(result.stdout); + const latest = npm["dist-tags"].latest; + + const totalDownloads = + Object.values<number>(downloadCounts.effector) + .slice(-30) + .reduce((total, count) => total + count) / 1000; + + return { + latest, + downloads: `${totalDownloads.toFixed(0)}K`, + }; +} + +async function getRepoStats() { + const { data: repo } = await octokit.repos.get(repoInfo); + + let contributorsCount = 0; + let page = 1; + while (true) { + const { data: pageContributors } = await octokit.repos.listContributors({ + ...repoInfo, + per_page: 100, + page, + }); + contributorsCount += pageContributors.length; + + if (pageContributors.length < 100) { + break; + } + page++; + } + + return { + stars: repo.stargazers_count.toLocaleString("en-US"), + contributors: contributorsCount, + license: repo.license?.spdx_id, + }; +} + +async function getGzipSize() { + try { + const response = await fetch("https://bundlephobia.com/api/size?package=effector@latest"); + + if (response.ok) { + const { gzip } = await response.json(); + + if (!gzip) { + throw new Error("No gzip size in the bundlephobia answer"); + } + + return { + size: `${(gzip / 1024).toFixed(1)} kB`, + }; + } else { + console.error(`Bundlephobia answer is not OK: ${response.statusText}`); + return { size: "11.9 kB" }; + } + } catch (error) { + console.error("Failed to fetch gzip size:", error); + } +} + +const statsMeta = { + size: { + label: getTextLocalized(translations.Landing.Stats.size, lang), + link: "https://bundlephobia.com/package/effector@latest", + }, + contributors: { + label: getTextLocalized(translations.Landing.Stats.contributors, lang), + link: "https://github.com/effector/effector/graphs/contributors", + }, + stars: { + label: getTextLocalized(translations.Landing.Stats.stars, lang), + link: "https://star-history.com/#effector/effector&Date", + }, + downloads: { + label: getTextLocalized(translations.Landing.Stats.downloads, lang), + link: "https://npmtrends.com/effector", + }, + latest: { + label: getTextLocalized(translations.Landing.Stats.latest, lang), + link: "https://github.com/effector/effector/releases", + }, + license: { + label: getTextLocalized(translations.Landing.Stats.license, lang), + link: "https://raw.githubusercontent.com/effector/effector/master/LICENSE", + }, +}; + +const gettingStartedText = getTextLocalized( + translations.Landing.Stats.StartByAddingEffectorAsDependency, + lang, +); + +const stats = await Promise.all([getRepoStats(), getNpmStats(), getGzipSize()]).then( + ([repo, npm, size]) => ({ ...repo, ...npm, ...size }), +); +--- + +<div class="wrapper"> + <h3> + {getTextLocalized(translations.Landing.Stats.title, lang)} + </h3> + <div class="stats"> + <div class="counts"> + { + Object.entries(stats).map(([name, counter]) => { + return ( + <a + class="stats-card" + href={statsMeta[name as keyof typeof stats].link} + target="_blank" + rel="noreferrer noopener" + > + <span class="text-4xl">{counter}</span> + <span>{statsMeta[name as keyof typeof stats].label}</span> + </a> + ); + }) + } + </div> + <div class="stats-bar"> + <span class="getting-started-message">{gettingStartedText}:</span> + <div class="install-command"> + <span class="inline-block"> + <span class="command-line-sign">$ </span>npm install <span class="package-name" + >effector</span + > + </span> + <copy-button class="copy-button" data-value="npm install effector" aria-role="button"> + <IconCopy /> + </copy-button> + </div> + </div> + </div> +</div> + +<style> + .wrapper { + @apply mx-auto max-w-6xl px-3 py-8 sm:px-6 sm:py-12; + } + + .wrapper h3 { + @apply mb-4 text-4xl sm:mb-10 lg:mb-6; + -webkit-box-decoration-break: clone; + -webkit-text-fill-color: transparent; + background: linear-gradient(to right bottom, var(--theme-text-light) 30%, var(--theme-text)); + -webkit-background-clip: text; + line-height: 1.3; + text-align: center; + } + + .stats { + @apply min-h-[4rem] rounded-3xl bg-[var(--theme-card)] p-4 shadow-lg; + } + + .counts { + @apply mb-6 grid select-none grid-cols-2 gap-2 sm:grid-cols-3 lg:grid-cols-6; + } + + .stats-card { + @apply flex min-w-[8rem] flex-col items-center rounded-lg p-2.5 text-[color:var(--theme-text)] focus:no-underline; + @apply transition-all hover:bg-[var(--theme-accent)] hover:text-[color:var(--theme-bg)] hover:shadow-xl focus:bg-[var(--theme-accent)]; + } + + .stats-bar { + @apply flex flex-wrap items-center justify-between gap-6 md:pl-2; + } + + .getting-started-message { + @apply hidden select-none md:inline; + } + + .command-line-sign { + @apply select-none text-[color:var(--theme-text-light)]; + } + + .package-name { + color: var(--theme-text-accent); + } + + .install-command { + @apply flex flex-1 items-center justify-between rounded-lg bg-[var(--theme-bg)] p-2 pl-4 font-mono md:max-w-xl; + } + + .copy-button { + @apply flex cursor-pointer items-center justify-center rounded-md bg-[var(--theme-divider)] p-1; + @apply transition-all hover:bg-[var(--theme-accent)] hover:text-[color:var(--theme-bg)] hover:shadow-md; + } + + .copy-button:global(.copied) { + @apply animate-ping; + animation-iteration-count: 1; + animation-duration: 400ms; + } +</style> + +<script> + class CopyButton extends HTMLElement { + constructor() { + super(); + + const copyValue = async () => { + try { + await navigator.clipboard.writeText(this.dataset.value!); + this.classList.add("copied"); + setTimeout(() => { + this.classList.remove("copied"); + }, 300); + } catch (error) { + console.error("Failed to copy text:", error); + } + }; + + this.addEventListener("click", copyValue); + } + } + + customElements.define("copy-button", CopyButton); +</script> diff --git a/src/components/LeftSidebar/LeftSidebar.astro b/src/components/LeftSidebar/LeftSidebar.astro new file mode 100644 index 0000000..7c1c97a --- /dev/null +++ b/src/components/LeftSidebar/LeftSidebar.astro @@ -0,0 +1,160 @@ +--- +import type { MarkdownHeading } from "astro"; +import { getPathParamsFromId } from "../../languages"; +import { + getLocalizedSidebar, + getSidebarForSlug, + markActiveNavigation, + MOBILE_NAVIGATION, +} from "../../navigation"; +import NestedLinks from "../NestedLinks.astro"; + +type Props = { + currentPage: string; + headings: MarkdownHeading[]; +}; + +const { currentPage } = Astro.props; +const currentPageMatch = currentPage.endsWith("/") ? currentPage.slice(0, -1) : currentPage; + +const { slug, lang } = getPathParamsFromId(Astro.url.pathname); +const baseSidebar = await getLocalizedSidebar(slug, lang); +// TODO: add collapsible groups +--- + +<nav aria-labelledby="grid-left"> + <ul class="nav-groups"> + { + baseSidebar.map((group) => ( + <li> + <div class="nav-group"> + <h2 class="nav-group-title">{group.title}</h2> + <ul> + {group.items.map((item) => ( + <li class="nav-link"> + <a + href={item.link} + aria-current={currentPageMatch === item.link ? "page" : false} + target={item.link.startsWith("/") ? undefined : "_blank"} + > + {item.title} + </a> + </li> + ))} + </ul> + </div> + </li> + )) + } + </ul> +</nav> + +<script is:inline> + window.addEventListener("DOMContentLoaded", () => { + var target = document.querySelector('[aria-current="page"]'); + if (target && target.offsetTop > window.innerHeight - 100) { + document.querySelector(".nav-groups").scrollTop = target.offsetTop; + } + }); +</script> + +<style> + nav { + width: 100%; + } + + .nav-groups { + position: sticky; + top: calc(var(--theme-navbar-height) + 2rem); + padding: 2rem 0; + height: 100%; + max-height: 100vh; + overflow-x: visible; + overflow-y: auto; + } + + .nav-groups > li + li { + margin-top: 2rem; + } + + .nav-groups > :first-child { + padding-top: var(--doc-padding); + } + + .nav-groups > :first-child h2 { + margin-top: 0; + } + + .nav-groups h2 { + border-top: none; + } + + .nav-groups > :last-child { + margin-bottom: var(--theme-navbar-height); + padding-bottom: 2rem; + } + + .nav-group { + @apply flex flex-col gap-1; + } + + .nav-group-title { + @apply m-0 px-4 pt-2; + font-weight: 700; + font-size: 1rem; + text-transform: uppercase; + } + + .nav-group ul { + @apply flex flex-col gap-0.5; + } + + .nav-link a { + @apply flex items-center rounded-md px-4 py-1.5 text-base; + color: inherit; + font: inherit; + text-decoration: none; + } + + .nav-link a:hover, + .nav-link a:focus { + background-color: var(--theme-bg-hover); + } + + .nav-link a[aria-current="page"] { + background-color: var(--theme-accent); + color: var(--theme-bg); + font-weight: 600; + } + + .nav-link a[href^="http://"]::after, + .nav-link a[href^="https://"]::after + { + display: inline-block; + background-image: url("/external.svg"); + background-position: center; + background-size: contain; + background-repeat: no-repeat; + width: 1em; + height: 1em; + content: ""; + } + + :global(.theme-dark) .nav-link a[href^="http://"]::after, + :global(.theme-dark) .nav-link a[href^="https://"]::after + { + filter: invert(); + } + + @media (min-width: 50em) { + .nav-groups { + padding: 0; + } + } +</style> + +<style is:global> + :root.theme-dark .nav-link a[aria-current="page"] { + color: hsla(var(--color-base-white), 100%, 1); + } +</style> diff --git a/src/components/LiveDemo.jsx b/src/components/LiveDemo.jsx new file mode 100644 index 0000000..d82dd09 --- /dev/null +++ b/src/components/LiveDemo.jsx @@ -0,0 +1,23 @@ +import {Sandpack} from '@codesandbox/sandpack-react' + +const customSetup = { + dependencies: { + effector: 'latest' + }, +} + +export default function LiveDemo({demoFile, layout = 'console'}) { + const files = { + '/index.js': demoFile, + } + + return ( + <Sandpack + template="vanilla" + theme="auto" + files={files} + customSetup={customSetup} + options={{layout}} + /> + ) +} diff --git a/src/components/MobileNavigation.astro b/src/components/MobileNavigation.astro new file mode 100644 index 0000000..d3b8d43 --- /dev/null +++ b/src/components/MobileNavigation.astro @@ -0,0 +1,117 @@ +--- +import { markActiveNavigation, MOBILE_NAVIGATION, SOCIAL_LINKS } from "../navigation"; +import { createChangeLangLinks, getPathParamsFromId, getTextLocalized } from "../languages"; + +import NestedLinks from "./NestedLinks.astro"; + +import IconGithub from "../icons/Github.astro"; +import IconTwitter from "../icons/Twitter.astro"; +import IconDiscord from "../icons/Discord.astro"; +import IconYoutube from "../icons/Youtube.astro"; + +const socialIcons = { + github: IconGithub, + twitter: IconTwitter, + discord: IconDiscord, + youtube: IconYoutube, +}; + +const { slug, lang } = getPathParamsFromId(Astro.url.pathname); +const languageLinks = createChangeLangLinks({ slug }); +const activeNavigation = markActiveNavigation(`/${slug.replace(/\/$/, "")}`, MOBILE_NAVIGATION); +--- + +<div class="navigation"> + <nav> + <NestedLinks items={activeNavigation} firstLevel /> + </nav> + <footer> + <div class="socials"> + { + SOCIAL_LINKS.map((link) => { + const Icon = socialIcons[link.icon]; + return ( + <a class="social" href={link.link} class="link only-medium" target="_blank"> + <Icon /> + </a> + ); + }) + } + </div> + <select class="language-switch" id="language-switch"> + { + languageLinks.map((link) => { + return ( + <option selected={link.link === Astro.url.pathname} value={link.link}> + {getTextLocalized(link, lang)} + </option> + ); + }) + } + </select> + </footer> +</div> + +<style> + :global(.mobile-menu-opened) .navigation { + display: flex; + } + + .navigation { + @apply fixed z-50 hidden w-screen flex-col overflow-hidden overflow-y-auto; + + top: var(--theme-navbar-height); + bottom: 0; + + will-change: transform, opacity; + contain: layout style; + backface-visibility: hidden; + background-color: var(--theme-bg); + } + + nav { + @apply flex grow flex-col overflow-y-auto py-4; + font-family: "Lexend Deca", sans-serif; + + overscroll-behavior: contain; + padding-left: max(env(safe-area-inset-left), 1rem); + padding-right: max(env(safe-area-inset-right), 1rem); + } + + footer { + @apply z-10 flex justify-between py-2; + + padding-left: max(env(safe-area-inset-left), 1rem); + padding-right: max(env(safe-area-inset-right), 1rem); + + box-shadow: 0 -4px 6px -4px rgb(0 0 0 / 0.1); + background-color: var(--theme-bg); + } + + .socials { + @apply flex gap-2; + } + + .social { + @apply cursor-pointer rounded px-3 py-3 transition-colors; + color: var(--theme-text); + } + + .social:hover { + background-color: var(--theme-divider); + } + + .language-switch { + @apply box-content flex items-center justify-center rounded p-2 text-base; + } +</style> + +<script> + document.querySelectorAll("#language-switch").forEach((switcher) => { + const select = switcher as HTMLSelectElement; + + select.addEventListener("change", function () { + document.location.pathname = select.value; + }); + }); +</script> diff --git a/src/components/NestedLinks.astro b/src/components/NestedLinks.astro new file mode 100644 index 0000000..b4b3280 --- /dev/null +++ b/src/components/NestedLinks.astro @@ -0,0 +1,201 @@ +--- +import { createLink, getPathParamsFromId, getTextLocalized } from "../languages"; +import { isNavGroup, isNavLink, isNavLinkGroup, type LMobileNavItem } from "../navigation"; + +import IconChevronRight from "../icons/Chevron.astro"; +import IconExternal from "../icons/External.astro"; +import { nanoid } from "nanoid"; + +const { lang } = getPathParamsFromId(Astro.url.pathname); + +interface Props { + items: LMobileNavItem[]; + firstLevel?: boolean; + expandDefault?: boolean; +} + +const { firstLevel = false, expandDefault, items } = Astro.props; +const instanceId = nanoid(5); +--- + +<ul class:list={{ nested: !firstLevel }}> + { + items.map((item) => { + const isExpandable = isNavLinkGroup(item) || isNavGroup(item); + const isLink = isNavLink(item) || isNavLinkGroup(item); + const text = getTextLocalized(item, lang); + const expanded = expandDefault ? expandDefault : item.active; + + if (isLink) { + const external = item.link.startsWith("https://") || item.link.startsWith("http://"); + return ( + <li> + <div class="line"> + {isExpandable ? ( + <button + type="button" + data-target={item.id} + data-instance={instanceId} + class:list={{ expander: true, standalone: true, expanded }} + > + <IconChevronRight size={18} /> + </button> + ) : null} + <a + class:list={{ active: item.active }} + href={createLink(item, lang)} + target={external ? "_blank" : undefined} + > + {text} + {external ? <IconExternal /> : null} + </a> + </div> + {isExpandable ? ( + <div + data-id={item.id} + data-instance={instanceId} + class:list={{ "expand-section": true, expanded }} + > + <Astro.self items={item.items} /> + </div> + ) : null} + </li> + ); + } + + if (isExpandable) { + return ( + <li> + <div class="line"> + <button + data-target={item.id} + data-instance={instanceId} + type="button" + class:list={{ expander: true, noLink: true, expanded }} + > + <IconChevronRight size={18} /> + {text} + </button> + </div> + <div + data-id={item.id} + data-instance={instanceId} + class:list={{ "expand-section": true, expanded }} + > + <Astro.self items={item.items} /> + </div> + </li> + ); + } + + return ( + <li> + <div class="line"> + <span>{text}</span> + </div> + </li> + ); + }) + } +</ul> + +<script> + document.querySelectorAll(".expander").forEach((button) => { + const btn = button as HTMLButtonElement; + const id = btn.dataset.target; + const instance = btn.dataset.instance; + const target = document.querySelector(`[data-id="${id}"][data-instance="${instance}"]`); + if (target) { + btn.addEventListener("click", function () { + btn.classList.toggle("expanded"); + target.classList.toggle("expanded"); + }); + } + }); +</script> + +<style> + ul { + @apply relative flex flex-col gap-1; + } + + ul.nested { + @apply pl-3; + } + + ul.nested::before { + @apply absolute inset-y-1 left-0 w-[1px]; + content: ""; + background-color: var(--theme-divider); + } + + li { + @apply relative flex flex-col gap-2; + background-color: var(--theme-bg); + } + + li > .line { + @apply flex items-center justify-between gap-1; + } + + .line span { + @apply select-none px-4 py-2 text-base; + font-weight: 300; + } + + a { + @apply flex grow cursor-pointer items-center gap-0 rounded px-4 py-2 text-base transition-colors; + color: var(--theme-text); + + -webkit-touch-callout: none; + -webkit-tap-highlight-color: transparent; + word-break: break-word; + } + + a:hover { + background-color: var(--theme-divider); + } + + a.active { + color: var(--theme-text-accent); + } + + button { + @apply cursor-pointer rounded p-2 transition-colors; + color: var(--theme-text); + } + + button:hover { + background-color: var(--theme-divider); + } + + button.noLink { + @apply flex grow p-2 text-base font-light; + } + + button.standalone { + background-color: var(--theme-divider); + @apply -ml-1 box-content flex h-6 w-6 items-center justify-center; + } + + button.standalone:hover { + background-color: var(--theme-divider-light); + } + + .expander :global(svg) { + @apply transform-gpu will-change-transform; + } + + .expander.expanded :global(svg) { + @apply rotate-90; + } + + .expand-section { + display: none; + @apply flex-col; + } + + .expand-section:global(.expanded) { + display: flex; + } +</style> diff --git a/src/components/NotTranslatedYet.astro b/src/components/NotTranslatedYet.astro new file mode 100644 index 0000000..bf7090c --- /dev/null +++ b/src/components/NotTranslatedYet.astro @@ -0,0 +1,29 @@ +--- +import { GITHUB_BRANCH, GITHUB_DOCS_CONTENT_DIR, GITHUB_REPO } from "../consts"; +import { getTextLocalized, translations } from "../languages"; + +interface Props { + lang: string; +} + +const { lang } = Astro.props; + +const DOCS_LINK = `https://github.com/${GITHUB_REPO}/tree/${GITHUB_BRANCH}/${GITHUB_DOCS_CONTENT_DIR}/${lang}`; +--- + +<div class="admonition admonition-info" data-pagefind-ignore> + <div class="admonition-heading"> + <span class="admonition-title"> + {getTextLocalized(translations.ThisPageIsNotTranslatedYet, lang)} + </span> + </div> + <div class="admonition-content"> + <p> + {getTextLocalized(translations.PleaseOpenPRWithTranslations, lang)} + <a href={DOCS_LINK} target="_blank">{getTextLocalized(translations.usingThisLink, lang)}</a>. + </p> + <p> + {getTextLocalized(translations.ShowingContentForDefaultLanguage, lang)}. + </p> + </div> +</div> diff --git a/src/components/PageContent/Announcement.astro b/src/components/PageContent/Announcement.astro new file mode 100644 index 0000000..27ffefa --- /dev/null +++ b/src/components/PageContent/Announcement.astro @@ -0,0 +1,50 @@ +--- +import { createLink, getPathParamsFromId, getTextLocalized } from "src/languages"; +import { ANNOUNCEMENT } from "../../consts"; + +const { lang = "en" } = getPathParamsFromId(Astro.url.pathname); +function isRemote(link: string) { + return link.startsWith("http://") || link.startsWith("https://"); +} +--- + +{ + ANNOUNCEMENT ? ( + <div class="announcement" data-pagefind-ignore> + <div class="title">{getTextLocalized({ text: ANNOUNCEMENT.title }, lang)}</div> + <div class="text">{getTextLocalized(ANNOUNCEMENT, lang)}</div> + {ANNOUNCEMENT.button ? ( + <div> + <a + href={createLink(ANNOUNCEMENT.button, lang)} + target={isRemote(ANNOUNCEMENT.button.link) ? "_blank" : undefined} + > + {getTextLocalized(ANNOUNCEMENT.button, lang)} + </a> + </div> + ) : null} + </div> + ) : null +} + +<style> + .announcement { + @apply mb-3 flex flex-col gap-1 rounded-lg px-4 py-2; + background-color: var(--theme-admonition-info-bg); + color: var(--theme-admonition-info-text); + } + + .title { + @apply text-lg uppercase; + } + + .text { + @apply text-base; + } + + .announcement a { + @apply -mx-2 inline-block rounded-md px-2 py-1; + background-color: var(--theme-admonition-info-border); + color: white; + } +</style> diff --git a/src/components/PageContent/Contributors.astro b/src/components/PageContent/Contributors.astro new file mode 100644 index 0000000..e1ebc84 --- /dev/null +++ b/src/components/PageContent/Contributors.astro @@ -0,0 +1,208 @@ +--- +import { Octokit } from "@octokit/rest"; +import { + GITHUB_COMMITS_URL, + GITHUB_DOCS_CONTENT_DIR, + GITHUB_DOCS_ROOT, + GITHUB_REPO, +} from "../../consts"; +import { getPathParamsFromId, getTextLocalized, translations } from "src/languages"; + +// fetch all commits for just this page's path +type Props = { + documentId: string; +}; +const { documentId } = Astro.props; +const { lang } = getPathParamsFromId(Astro.url.pathname); + +const fullFilePath = [GITHUB_DOCS_ROOT, GITHUB_DOCS_CONTENT_DIR, documentId].join(""); +const commitsURL = [GITHUB_COMMITS_URL, fullFilePath].join(""); + +const [owner, repo] = GITHUB_REPO.split("/"); + +const octokit = new Octokit({ auth: import.meta.env.GITHUB_TOKEN }); + +async function loadContributors() { + if (!import.meta.env.GITHUB_TOKEN) { + return []; + } + const filePath = [GITHUB_DOCS_ROOT, GITHUB_DOCS_CONTENT_DIR, documentId].join(""); + const { data: commits } = await octokit.repos.listCommits({ + owner, + repo, + path: filePath, + per_page: 100, + }); + + interface Contributor { + id: number; + login: string; + avatar: string; + commits: number; + } + + const contributors = new Map<number, Contributor>(); + + function add(user: { id: number; login: string; avatar: string }) { + const exist = contributors.get(user.id); + // Let's count total amount of commits + if (exist) { + exist.commits++; + } else { + contributors.set(user.id, { ...user, commits: 1 }); + } + } + commits.forEach((commit) => { + if (commit.author) { + add({ + id: commit.author.id, + login: commit.author.login, + avatar: commit.author.avatar_url, + }); + } + if (commit.committer) { + add({ + id: commit.committer.id, + login: commit.committer.login, + avatar: commit.committer.avatar_url, + }); + } + }); + return Array.from(contributors.values()) + .filter((user) => user.login !== "web-flow") + .sort((a, b) => b.commits - a.commits); +} + +const contributors = await loadContributors().catch((error) => { + if (!import.meta.env.GITHUB_TOKEN) { + console.info("Provide GITHUB_TOKEN env with Personal Access Token."); + } + console.info("Failed to load contributors. Skipping..."); + console.error(error); + return []; +}); + +const recentContributors = contributors.slice(0, 5).sort((a, b) => a.commits - b.commits); // only show avatars for the 3 most recent contributors +const additionalContributors = contributors.length - recentContributors.length; // list the rest of them as # of extra contributors +--- + +<div class="title" data-pagefind-ignore> + {getTextLocalized(translations.Contributors, lang)} +</div> + +<!-- Thanks to @5t3ph for https://smolcss.dev/#smol-avatar-list! --> +<div class="contributors" data-pagefind-ignore> + { + recentContributors.length > 0 && ( + <ul class="avatar-list" style={`--avatar-count: ${recentContributors.length}`}> + {recentContributors.map((contributor) => ( + <li> + <a href={`https://github.com/${contributor.login}`}> + <img + alt={`Contributor ${contributor.login}`} + title={`Contributor ${contributor.login}`} + width="64" + height="64" + src={contributor.avatar} + /> + </a> + </li> + ))} + </ul> + ) + } + { + additionalContributors > 0 && ( + <span> + <a href={commitsURL}>{`and ${additionalContributors} additional contributor${ + additionalContributors > 1 ? "s" : "" + }.`}</a> + </span> + ) + } + <a href={commitsURL}>Commits</a> +</div> + +<style> + .title { + @apply m-0 mb-2 border-0 p-0 uppercase; + font-weight: 700; + font-size: 1rem; + text-transform: uppercase; + font-family: + Lexend Deca, + sans-serif; + } + + .avatar-list { + --avatar-size: 2.5rem; + --avatar-count: 3; + + display: grid; + list-style: none; + /* Default to displaying most of the avatar to + enable easier access on touch devices, ensuring + the WCAG touch target size is met or exceeded */ + grid-template-columns: repeat(var(--avatar-count), max(44px, calc(var(--avatar-size) / 1.15))); + /* `padding` matches added visual dimensions of + the `box-shadow` to help create a more accurate + computed component size */ + padding: 0.08em; + font-size: var(--avatar-size); + } + + @media (any-hover: hover) and (any-pointer: fine) { + .avatar-list { + /* We create 1 extra cell to enable the computed + width to match the final visual width */ + grid-template-columns: repeat(calc(var(--avatar-count) + 1), calc(var(--avatar-size) / 1.75)); + } + } + + .avatar-list li { + width: var(--avatar-size); + height: var(--avatar-size); + } + + .avatar-list li:hover ~ li a, + .avatar-list li:focus-within ~ li a { + transform: translateX(33%); + } + + .avatar-list img, + .avatar-list a { + display: block; + border-radius: 50%; + } + + .avatar-list a { + transition: transform 180ms ease-in-out; + } + + .avatar-list img { + width: 100%; + height: 100%; + object-fit: cover; + background-color: var(--theme-bg); + box-shadow: + 0 0 0 0.05em var(--theme-bg), + 0 0 0 0.08em var(--theme-divider-dark); + } + + .avatar-list a:focus { + outline: 2px solid transparent; + /* Double-layer trick to work for dark and light backgrounds */ + box-shadow: + 0 0 0 0.08em var(--theme-accent), + 0 0 0 0.12em white; + } + + .contributors { + display: flex; + align-items: center; + } + + .contributors > * + * { + margin-left: 0.75rem; + } +</style> diff --git a/src/components/PageContent/PageContent.astro b/src/components/PageContent/PageContent.astro new file mode 100644 index 0000000..d8d5ea8 --- /dev/null +++ b/src/components/PageContent/PageContent.astro @@ -0,0 +1,182 @@ +--- +import type { MarkdownHeading } from "astro"; +import { getPathParamsFromId } from "../../languages"; +import MoreMenu from "../RightSidebar/MoreMenu.astro"; +import TableOfContents from "../RightSidebar/TableOfContents"; + +type Props = { + title: string; + headings: MarkdownHeading[]; + translations: { lang: string; slug: string }[]; + breadcrumbs?: { title: string; path: string }[]; + documentId: string; + pagefindWeight?: number; + indexing: boolean; +}; + +const { + title, + headings, + indexing, + documentId, + translations = [], + breadcrumbs = [], + pagefindWeight = 0, +} = Astro.props; +const { lang } = getPathParamsFromId(Astro.url.pathname); +--- + +<article + id="article" + class="content" + data-pagefind-body={indexing ? true : null} + data-pagefind-sort="weight[data-weight]" + data-weight={pagefindWeight} +> + <section class="main-section"> + <nav data-pagefind-ignore class="navigation"> + <ul class="breadcrumbs" itemscope itemtype="https://schema.org/BreadcrumbList"> + <li itemscope itemtype="https://schema.org/ListItem"> + <a itemprop="item" href={`/${lang}`}> + <svg viewBox="0 0 24 24"> + <path + d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" + fill="currentColor"></path> + </svg> + </a> + <meta itemprop="position" content="0" /> + </li> + { + breadcrumbs.map(({ path, title }, index) => ( + <li itemscope itemtype="https://schema.org/ListItem"> + <a itemprop="item" href={path} class:list={{ active: Astro.url.pathname === path }}> + {title} + </a> + <meta itemprop="position" content={(index + 1).toString()} /> + </li> + )) + } + <li itemscope itemtype="https://schema.org/ListItem"> + <span itemprop="item"> + {title} + </span> + <meta itemprop="position" content={breadcrumbs.length.toString()} /> + </li> + </ul> + { + translations.length ? ( + <span class="translations" data-pagefind-ignore> + [ + {translations.map((tr) => ( + <a href={`/${tr.lang}/${tr.slug}`}>{tr.lang}</a> + ))} + ] + </span> + ) : null + } + </nav> + <nav class="block xl:hidden" data-pagefind-ignore> + <TableOfContents + lang={lang} + collapsed + client:media="(max-width: 1280px)" + client:only="preact" + headings={headings} + /> + </nav> + <slot /> + </section> + <nav class="mb-8 block xl:hidden" data-pagefind-ignore> + <MoreMenu documentId={documentId} /> + </nav> +</article> + +<style> + .content { + display: flex; + flex-direction: column; + padding: 0; + height: 100%; + width: 100%; + /* max-width: 75ch; */ + } + + .content > section { + margin-bottom: 4rem; + } + + .main-section .navigation { + display: flex; + flex-direction: column; + flex-wrap: nowrap; + justify-content: space-between; + + @media (min-width: 512px) { + flex-direction: row; + align-items: center; + } + } + + .main-section .navigation .translations { + font-size: 1rem; + } + + .breadcrumbs { + display: flex; + flex-wrap: nowrap; + gap: 1rem; + margin: 0; + list-style-type: none; + color: var(--theme-text); + } + + .breadcrumbs li { + display: flex; + flex-wrap: nowrap; + align-items: center; + } + + .breadcrumbs li a { + text-wrap: nowrap; + } + + .breadcrumbs li:last-child span { + font-weight: 600; + } + + .breadcrumbs li:not(:last-child)::after { + content: " "; + background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 256 256"><polygon fill="black" points="79.093,0 48.907,30.187 146.72,128 48.907,225.813 79.093,256 207.093,128"/></svg>') + center; + display: inline-block; + height: 1ch; + width: 1ch; + margin-left: 0.5rem; + opacity: 0.5; + } + + :root.theme-dark .breadcrumbs li:not(:last-child)::after { + background: url('data:image/svg+xml;utf8,<svg xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 256 256"><polygon fill="white" points="79.093,0 48.907,30.187 146.72,128 48.907,225.813 79.093,256 207.093,128"/></svg>') + center; + } + + .breadcrumbs li a svg { + display: inline-block; + width: 2ch; + height: 2ch; + margin-top: -4px; + } + + .breadcrumbs li a.active { + text-decoration: underline; + } + + .translations a:hover { + text-decoration: underline; + } + + .translations a:not(:last-child)::after { + content: ", "; + color: var(--theme-text-light); + } +</style> diff --git a/src/components/RightSidebar/MoreMenu.astro b/src/components/RightSidebar/MoreMenu.astro new file mode 100644 index 0000000..ffb297f --- /dev/null +++ b/src/components/RightSidebar/MoreMenu.astro @@ -0,0 +1,61 @@ +--- +import clsx from "clsx"; +import { + COMMUNITY_INVITE_URL, + GITHUB_DOCS_CONTENT_DIR, + GITHUB_DOCS_ROOT, + GITHUB_EDIT_URL, +} from "../../consts"; +import { getPathParamsFromId, getTextLocalized, translations } from "../../languages"; + +import IconDiscordLined from "../../icons/DiscordLined.astro"; +import IconEditPencil from "../../icons/EditPencil.astro"; + +import styles from "./TableOfContents.module.css"; + +type Props = { + documentId: string; +}; + +const { documentId } = Astro.props; +const showMoreSection = Boolean(COMMUNITY_INVITE_URL); +const { lang } = getPathParamsFromId(Astro.url.pathname); +const editFilePath = [GITHUB_DOCS_ROOT, GITHUB_DOCS_CONTENT_DIR, documentId].join(""); +const editUrl = [GITHUB_EDIT_URL, editFilePath].join(""); +--- + +{ + showMoreSection && ( + <h2 class:list={{ more: true, [styles.title]: true }}> + {getTextLocalized(translations.More, lang)} + </h2> + ) +} +<ul class={styles.contents}> + { + documentId && ( + <li class={clsx(styles.link, styles.level2)}> + <a class="edit-on-github" href={editUrl} target="_blank"> + <IconEditPencil size={20} /> + <span>{getTextLocalized(translations.EditThisPage, lang)}</span> + </a> + </li> + ) + } + { + COMMUNITY_INVITE_URL && ( + <li class={clsx(styles.link, styles.level2)}> + <a href={COMMUNITY_INVITE_URL} target="_blank"> + <IconDiscordLined size={20} /> + <span>{getTextLocalized(translations.JoinOurCommunity, lang)}</span> + </a> + </li> + ) + } +</ul> + +<style> + body .more { + margin-top: 1rem; + } +</style> diff --git a/src/components/RightSidebar/RightSidebar.astro b/src/components/RightSidebar/RightSidebar.astro new file mode 100644 index 0000000..d3fa832 --- /dev/null +++ b/src/components/RightSidebar/RightSidebar.astro @@ -0,0 +1,42 @@ +--- +import type { MarkdownHeading } from "astro"; +import TableOfContents from "./TableOfContents"; +import MoreMenu from "./MoreMenu.astro"; + +type Props = { + headings: MarkdownHeading[]; + documentId: string; + lang: string; +}; + +const { headings, documentId, lang } = Astro.props; +--- + +<nav class="sidebar-nav" aria-labelledby="grid-right"> + <div class="sidebar-nav-inner"> + <TableOfContents + lang={lang} + client:media="(min-width: 50em)" + client:only="preact" + headings={headings} + /> + <MoreMenu documentId={documentId} /> + </div> +</nav> + +<style> + .sidebar-nav { + position: sticky; + top: var(--theme-navbar-height); + width: 100%; + height: 100%; + max-height: calc(100vh - var(--theme-navbar-height)); + } + + .sidebar-nav-inner { + padding: 0; + padding-top: var(--doc-padding); + height: 100%; + overflow: auto; + } +</style> diff --git a/src/components/RightSidebar/TableOfContents.module.css b/src/components/RightSidebar/TableOfContents.module.css new file mode 100644 index 0000000..1fb5aef --- /dev/null +++ b/src/components/RightSidebar/TableOfContents.module.css @@ -0,0 +1,108 @@ +.title { + @apply m-0 mb-2 border-0 p-0 uppercase; + font-weight: 700; + font-size: 1rem; + text-transform: uppercase; + font-family: + Lexend Deca, + sans-serif; +} + +.contents { + @apply pr-3 text-sm; +} + +.link { + @apply relative m-0 max-w-full; +} + +.link a { + @apply scroll-py-6 py-1; +} + +:global(.content) ul.contents { + list-style-type: none; + @apply text-base; +} + +.link::before { + content: ""; + @apply absolute bottom-0 right-0 top-0 w-8; + background: linear-gradient(90deg, transparent, var(--theme-bg, white)); +} + +.link a { + @apply flex overflow-clip whitespace-nowrap; +} + +.link a:hover { + color: var(--theme-text-dark); + text-decoration: underline; +} + +.link.active a { + color: var(--theme-text-accent); +} + +.level1:not(:first-child) a { + @apply pt-6; +} + +.level1 a { + @apply font-bold; + color: var(--theme-text); +} + +.level2 { + @apply pl-3; +} + +.level2:not(:first-of-type) a { + @apply pt-3; +} + +.level2 a { + @apply font-medium; + color: var(--theme-text); +} + +.level3 { + @apply pl-7; +} + +.level3 a { + @apply font-normal; + color: var(--theme-text-light); +} + +.expandDetails { + @apply block min-w-max select-none flex-nowrap overflow-hidden text-ellipsis; +} + +.expandDetails summary { + display: inline-block; + -webkit-tap-highlight-color: transparent; + list-style: none; +} + +.expandDetails summary::-webkit-details-marker /* Safari */, +.expandDetails summary::marker /* Latest Chrome, Edge, Firefox */ { + display: none; +} + +.expandDetails summary span { + background-color: var(--theme-code-inline-bg); + color: var(--theme-code-inline-text); + @apply inline-block cursor-pointer rounded-xl px-5 py-2 text-base uppercase; +} + +.expandDetails[open] summary span { + @apply rounded-b-none; +} + +.expandContent { + background-color: var(--theme-code-inline-bg); + --theme-bg: var(--theme-code-inline-bg); + max-width: 52ch; + @apply rounded-2xl rounded-tl-none px-1 py-3; +} diff --git a/src/components/RightSidebar/TableOfContents.tsx b/src/components/RightSidebar/TableOfContents.tsx new file mode 100644 index 0000000..30370c7 --- /dev/null +++ b/src/components/RightSidebar/TableOfContents.tsx @@ -0,0 +1,119 @@ +import type { MarkdownHeading } from "astro"; +import type { FunctionalComponent } from "preact"; +import { useState, useEffect, useRef } from "preact/hooks"; +import { unescape } from "html-escaper"; +import clsx from "clsx"; + +import { getTextLocalized, translations } from "../../languages"; +import styles from "./TableOfContents.module.css"; + +type ItemOffsets = { + id: string; + topOffset: number; +}; + +const TableOfContents: FunctionalComponent<{ + headings: MarkdownHeading[]; + collapsed?: boolean; + lang: string; +}> = ({ headings = [], collapsed = false, lang }) => { + const toc = useRef<HTMLUListElement>(null); + const onThisPageID = "on-this-page-heading"; + const itemOffsets = useRef<ItemOffsets[]>([]); + const [currentID, setCurrentID] = useState("overview"); + useEffect(() => { + const getItemOffsets = () => { + const titles = document.querySelectorAll("article :is(h1, h2, h3, h4)"); + itemOffsets.current = Array.from(titles).map((title) => ({ + id: title.id, + topOffset: title.getBoundingClientRect().top + window.scrollY, + })); + }; + + getItemOffsets(); + window.addEventListener("resize", getItemOffsets); + + return () => { + window.removeEventListener("resize", getItemOffsets); + }; + }, []); + + useEffect(() => { + if (!toc.current) return; + + const setCurrent: IntersectionObserverCallback = (entries) => { + for (const entry of entries) { + if (entry.isIntersecting) { + const { id } = entry.target; + if (id === onThisPageID) continue; + setCurrentID(entry.target.id); + break; + } + } + }; + + const observerOptions: IntersectionObserverInit = { + // Negative top margin accounts for `scroll-margin`. + // Negative bottom margin means heading needs to be towards top of viewport to trigger intersection. + rootMargin: "-100px 0% -66%", + threshold: 1, + }; + + const headingsObserver = new IntersectionObserver(setCurrent, observerOptions); + + // Observe all the headings in the main page content. + document.querySelectorAll("article :is(h1,h2,h3)").forEach((h) => headingsObserver.observe(h)); + + // Stop observing when the component is unmounted. + return () => headingsObserver.disconnect(); + }, [toc.current]); + + const onLinkClick: React.MouseEventHandler<HTMLAnchorElement> = (e) => { + setCurrentID(e.currentTarget.getAttribute("href")?.replace("#", "")!); + }; + + if (headings.length === 0) return null; + + const items = ( + <ul ref={toc} className={styles.contents}> + {headings + .filter(({ depth }) => depth > 0 && depth < 4) + .map((heading) => { + const linkClass = clsx(styles.link, styles[`level${heading.depth}`], { + [styles.active]: currentID === heading.slug, + }); + + return ( + <li className={linkClass}> + <a href={`#${heading.slug}`} id={`toc-${heading.slug}`} onClick={onLinkClick}> + {unescape(heading.text)} + </a> + </li> + ); + })} + </ul> + ); + + // When component setup as collapsed by default + if (collapsed) { + return ( + <details className={styles.expandDetails}> + <summary id={onThisPageID}> + <span>{getTextLocalized(translations.OnThisPage, lang)}</span> + </summary> + <div className={styles.expandContent}>{items}</div> + </details> + ); + } + + return ( + <> + <h2 id={onThisPageID} className={styles.title}> + {getTextLocalized(translations.OnThisPage, lang)} + </h2> + {items} + </> + ); +}; + +export default TableOfContents; diff --git a/src/components/TranslationDisclaimer.astro b/src/components/TranslationDisclaimer.astro new file mode 100644 index 0000000..e34365a --- /dev/null +++ b/src/components/TranslationDisclaimer.astro @@ -0,0 +1,21 @@ +--- +import { getTextLocalized, translations } from "../languages"; + +type Props = { + lang: string; +}; + +const { lang } = Astro.props; +--- + +<div class="admonition admonition-warning" data-pagefind-ignore> + <div class="admonition-heading"> + <span class="admonition-title"> + {getTextLocalized(translations.TranslationDisclaimer.title, lang)} + </span> + </div> + <div class="admonition-content"> + <p>{getTextLocalized(translations.TranslationDisclaimer.firstLine, lang)}</p> + <p>{getTextLocalized(translations.TranslationDisclaimer.secondLine, lang)}</p> + </div> +</div> diff --git a/src/consts.ts b/src/consts.ts new file mode 100644 index 0000000..a98b197 --- /dev/null +++ b/src/consts.ts @@ -0,0 +1,97 @@ +import type { LText } from "./languages"; + +export const SITE = { + title: "effector", + description: "Business logic with ease.", + defaultLanguage: "en", +} as const; + +export const OPEN_GRAPH = { + image: { + src: "/banner.png", + alt: "effector logo is a comet moving away", + }, + twitter: "effectorjs", +}; + +export const KNOWN_LANGUAGES = { + English: "en", + Russian: "ru", + "O'zbekcha": "uz", +} as const; +export const KNOWN_LANGUAGE_CODES = Object.values(KNOWN_LANGUAGES); + +// TODO: update this urls +export const GITHUB_REPO = "effector/effector"; +export const GITHUB_BRANCH = "master"; + +// It is useful when documentation package located in a subdirectory +// There would be 'beta/'. Slash at the end is required +export const GITHUB_DOCS_ROOT = "documentation/"; + +// Used to convert pathname into file path in the repository +// It is where the docs are located related to the docs package.json file +export const GITHUB_DOCS_CONTENT_DIR = "src/content/docs/"; + +// @see https://developer.stackblitz.com/codeflow/integrating-web-publisher +// Format: https://pr.new/github.com/{repo-owner's-username}/{repo}/edit/{branch}/{file-path-in-the-repo} +// export const GITHUB_EDIT_URL = `https://pr.new/github.com/${GITHUB_REPO}/edit/${GITHUB_BRANCH}/`; +// If there will be function, we can add `initialPath` parameter + +export const GITHUB_EDIT_URL = `https://github.com/${GITHUB_REPO}/edit/${GITHUB_BRANCH}/`; +export const GITHUB_COMMITS_URL = `https://github.com/${GITHUB_REPO}/commits/${GITHUB_BRANCH}/`; + +export const LINKS = { + github: "https://github.com/effector/effector", + discord: "https://discord.gg/yHcMcuRWeC", + twitter: `https://twitter.com/${OPEN_GRAPH.twitter}`, + blog: "https://patreon.com/zero_bias", + repl: "https://share.effector.dev", + changelog: "https://changelog.effector.dev", + + community: "https://community.effector.dev/", + telegramRU: "https://t.me/effector_ru", + telegramEN: "https://t.me/effector_en", + devTo: "https://dev.to/effector", + reddit: "https://www.reddit.com/r/effectorjs/", + youtube: "https://youtube.com/@effectorjs", + linesOfCode: "https://t.me/lines_of_code_diagrams", + + zerobias: "https://github.com/zerobias", +}; + +export const COMMUNITY_INVITE_URL = LINKS.discord; + +// See "Algolia" section of the README for more information. +export const ALGOLIA = { + indexName: "effector-beta", + appId: "ARB8LV9Z4L", + apiKey: import.meta.env.ALGOLIA_API_KEY!, +}; + +export const ANNOUNCEMENT: Announcement | null = { + title: { en: "Pay attention", ru: "Обратите внимание", uz: "Etibor bering" }, + text: { + en: "This documentation is for the as yet unreleased version of effector Spacewatch 23.0.", + ru: "Эта версия документации предназначена для еще не вышедшего релиза effector Spacewatch 23.0.", + uz: "Bu hujjat hali chiqmagan effector Spacewatch 23.x versiyasiga tegishli", + }, + button: { + text: { + en: "View actual documentation", + ru: "Посмотреть актуальную документацию", + uz: "Aktual hujjatni ko'rish", + }, + link: "https://effector.dev", + }, +}; + +export interface Announcement { + title: LText; + text: LText; + button?: { + text: LText; + // Slug without language or the absolute URL. + link: string; + }; +} diff --git a/src/content/config.ts b/src/content/config.ts new file mode 100644 index 0000000..3ff7c1b --- /dev/null +++ b/src/content/config.ts @@ -0,0 +1,23 @@ +import { defineCollection, z } from "astro:content"; +import { SITE } from "../consts"; + +const docs = defineCollection({ + schema: z.object({ + title: z.string().default(SITE.title), + description: z.string().default(SITE.description), + lang: z + .union([z.literal("en"), z.literal("ru"), z.literal("uz")]) + .default(SITE.defaultLanguage), + dir: z.union([z.literal("ltr"), z.literal("rtl")]).default("ltr"), + image: z + .object({ + src: z.string(), + alt: z.string(), + }) + .optional(), + ogLocale: z.string().optional(), + redirectFrom: z.array(z.string()).optional(), + }), +}); + +export const collections = { docs }; diff --git a/src/content/docs/en/FAQ.md b/src/content/docs/en/FAQ.md new file mode 100644 index 0000000..e603ff7 --- /dev/null +++ b/src/content/docs/en/FAQ.md @@ -0,0 +1,12 @@ +--- +title: FAQ +description: Frequent questions and answers about effector +redirectFrom: + - /FAQ + - /docs/faq +--- + +## Why do we need to give names to events, effects etc. ? + +This will help in the future, in the development of the effector devtools, and now it is used in the [playground](https://share.effector.dev) on the left sidebar. +If you don't want to do it, you can use the [babel plugin](https://www.npmjs.com/package/@effector/babel-plugin). It will automatically generate the name for events and effects from the variable name. diff --git a/src/content/docs/en/api/effector-react/Gate.md b/src/content/docs/en/api/effector-react/Gate.md new file mode 100644 index 0000000..878e520 --- /dev/null +++ b/src/content/docs/en/api/effector-react/Gate.md @@ -0,0 +1,92 @@ +--- +title: Effector React Gate +redirectFrom: + - /api/effector-react/Gate + - /docs/api/effector-react/Gate +--- + +_Gate_ is a hook for conditional rendering, based on the current value (or values) in props. It can solve problems such as compiling all required data when a component mounts, or showing an alternative component if there is insufficient data in props. Gate is also useful for routing or animations, similar to ReactTransitionGroup. + +This enables the creation of a feedback loop by sending props back to a _Store_. + +Gate can be integrated via the [useGate](/en/api/effector-react/useGate) hook or as a component with props. Gate stores and events function as standard units within an application. + +Gate has two potential states: + +- **Opened**, indicating the component is mounted. +- **Closed**, indicating the component is unmounted. + +<br/> + +**Example of using Gate as a component:** + +```tsx +<Gate history={history} /> +``` + +# Properties (#properties) + +## `.state` Store (#properties-state) + +:::warning{title="Important"} +Do not modify the `state` value! It is a [derived store](/en/api/effector/Store#readonly) and should remain in a predictable state. +::: + +`Store<Props>`: [DerivedStore](/en/api/effector/Store#readonly) containing the current state of the gate. This state derives from the second argument of [useGate](/en/api/effector-react/useGate) and from props when rendering the gate as a component. + +### Example (#properties-state-example) + +```tsx +const Gate = createGate(); + +Gate.state.watch((state) => console.info("gate state updated", state)); + +function App() { + useGate(Gate, { props: "yep" }); + return <div>Example</div>; +} + +ReactDOM.render(<App />, root); +// => gate state updated { props: "yep" } +``` + +## `.open` Event (#properties-open) + +:::info{title="Important"} +Do not manually invoke this event. It is an event that is triggered based on the gate's state. +::: + +[Event<Props>](/en/api/effector/Event): Event fired upon gate mounting. + +## `.close` Event (#properties-close) + +:::info{title=Important} +Do not manually invoke this event. It is an event that is triggered based on the gate's state. +::: + +[Event<Props>](/en/api/effector/Event): Event fired upon gate unmounting. + +## `.status` Store (#properties-status) + +:::warning{title="Important"} +Do not modify the `status` value! It is a [derived store](/en/api/effector/Store#readonly) and should remain in a predictable state. +::: + +[Store<boolean>](/en/api/effector/Store): Boolean [DerivedStore](/en/api/effector/Store#readonly) indicating whether the gate is mounted. + +### Example (#properties-status-example) + +```tsx +const Gate = createGate(); + +Gate.status.watch((opened) => console.info("is Gate opened?", opened)); +// => is Gate opened? false + +function App() { + useGate(Gate); + return <div>Example</div>; +} + +ReactDOM.render(<App />, root); +// => is Gate opened? true +``` diff --git a/src/content/docs/en/api/effector-react/Provider.md b/src/content/docs/en/api/effector-react/Provider.md new file mode 100644 index 0000000..288244d --- /dev/null +++ b/src/content/docs/en/api/effector-react/Provider.md @@ -0,0 +1,86 @@ +--- +title: Provider +description: Effector React +redirectFrom: + - /api/effector-react/Provider + - /docs/api/effector-react/Provider +--- + +React `Context.Provider` component, which takes any [Scope](/en/api/effector/Scope) in its `value` prop and makes all hooks in the subtree work with this scope: + +- `useUnit($store)` (and etc.) will read the state and subscribe to updates of the `$store` in this scope +- `useUnit(event)` (and etc.) will [bind](/en/api/effector/scopeBind) provided event or effect to this scope + +# Usage (#usage) + +## Example Usage (#usage-example) + +Here is an example of `<Provider />` usage. + +```tsx +import { createEvent, createStore, fork } from "effector"; +import { useUnit, Provider } from "effector-react"; +import { render } from "react-dom"; + +const buttonClicked = createEvent(); +const $count = createStore(0); + +$count.on(buttonClicked, (counter) => counter + 1); + +const App = () => { + const [count, handleClick] = useUnit([$count, buttonClicked]); + + return ( + <> + <p>Count: {count}</p> + <button onClick={() => handleClick()}>increment</button> + </> + ); +}; + +const myScope = fork({ + values: [[$count, 42]], +}); + +render( + <Provider value={myScope}> + <App /> + </Provider>, + document.getElementById("root"), +); +``` + +The `<App />` component is placed in the subtree of `<Provider value={myScope} />`, so its `useUnit([$count, inc])` call will return + +- State of the `$count` store in the `myScope` +- Version of `buttonClicked` event, which is bound to the `myScope`, which, if called, updates the `$count` state in the `myScope` + +## Multiple Providers Usage (#usage-multiple-providers) + +There can be as many `<Provider />` instances in the tree, as you may need. + +```tsx +import { fork } from "effector"; +import { Provider } from "effector-react"; +import { App } from "@/app"; + +const scopeA = fork(); +const scopeB = fork(); + +const ParallelWidgets = () => ( + <> + <Provider value={scopeA}> + <App /> + </Provider> + <Provider value={scopeB}> + <App /> + </Provider> + </> +); +``` + +# Provider Properties (#properties) + +## `value` (#properties-value) + +`Scope`: any [Scope](/en/api/effector/Scope). All hooks in the subtree will work with this scope. diff --git a/src/content/docs/en/api/effector-react/connect.md b/src/content/docs/en/api/effector-react/connect.md new file mode 100644 index 0000000..1b90b0d --- /dev/null +++ b/src/content/docs/en/api/effector-react/connect.md @@ -0,0 +1,52 @@ +--- +title: connect +redirectFrom: + - /api/effector-react/connect + - /docs/api/effector-react/connect +--- + +```ts +import { connect } from "effector-react"; +``` + +:::warning{title="Deprecated"} +since [effector-react 23.0.0](https://changelog.effector.dev/#effector-react-23-0-0). + +Consider using [hooks api](/en/api/effector-react/index#hooks) in modern projects. +::: + +Wrapper for [useStore](/en/api/effector-react/useStore) to use during migration from redux and class-based projects. Will merge store value fields to component props. + +# Methods (#methods) + +## `connect($store)(Component)` (#methods-connect-store-component) + +### Formulae (#methods-connect-store-component-formulae) + +```ts +connect($store: Store<T>)(Component): Component +``` + +### Arguments (#methods-connect-store-component-arguments) + +1. `$store` ([Store](/en/api/effector/Store)): store or object with stores + +### Returns (#methods-connect-store-component-returns) + +`(Component) => Component`: Function, which accepts react component and return component with store fields merged into props + +## `connect(Component)($store)` (#methods-connect-component-store) + +### Formulae (#methods-connect-component-store-formulae) + +```ts +connect(Component)($store: Store<T>): Component +``` + +### Arguments (#methods-connect-component-store-arguments) + +1. `Component` (React.ComponentType): react component + +### Returns (#methods-connect-component-store-returns) + +`($store: Store<T>) => Component`: Function, which accepts a store and returns component with store fields merged into props diff --git a/src/content/docs/en/api/effector-react/createComponent.md b/src/content/docs/en/api/effector-react/createComponent.md new file mode 100644 index 0000000..104b4f2 --- /dev/null +++ b/src/content/docs/en/api/effector-react/createComponent.md @@ -0,0 +1,57 @@ +--- +title: createComponent +description: Creates a store-based React component +redirectFrom: + - /api/effector-react/createComponent + - /docs/api/effector-react/createComponent +--- + +```ts +import { createComponent } from "effector-react"; +``` + +:::warning{title="Deprecated"} +since [effector-react 23.0.0](https://changelog.effector.dev/#effector-react-23-0-0). + +You can use [hooks api](/en/api/effector-react/index#hooks) in `createComponent` since [effector-react@20.3.0](https://changelog.effector.dev/#effector-20-3-0). +::: + +# Methods (#methods) + +## `createComponent($store, render)` (#createComponent-store-render) + +Creates a store-based React component. The `createComponent` method is useful for transferring logic and data of state to your View component. + +### Arguments (#createComponent-store-render-arguments) + +1. `$store` (_Store | Object_): `Store` or object of `Store` +2. `render` (_Function_): Render function which will be called with props and state + +### Returns (#createComponent-store-render-returns) + +(_`React.Component`_): Returns a React component. + +### Example (#createComponent-store-render-example) + +```jsx +import { createStore, createEvent } from "effector"; +import { createComponent } from "effector-react"; + +const increment = createEvent(); + +const $counter = createStore(0).on(increment, (n) => n + 1); + +const MyCounter = createComponent($counter, (props, state) => ( + <div> + Counter: {state} + <button onClick={increment}>increment</button> + </div> +)); + +const MyOwnComponent = () => { + // any stuff here + return <MyCounter />; +}; +``` + +[Try it](https://share.effector.dev/kJoLGB6g) diff --git a/src/content/docs/en/api/effector-react/createGate.md b/src/content/docs/en/api/effector-react/createGate.md new file mode 100644 index 0000000..9366d25 --- /dev/null +++ b/src/content/docs/en/api/effector-react/createGate.md @@ -0,0 +1,84 @@ +--- +title: createGate +description: Creates a gate to consume data from view +redirectFrom: + - /api/effector-react/createGate + - /docs/api/effector-react/createGate +--- + +```ts +import { createGate, type Gate } from "effector-react"; +``` + +# Methods (#methods) + +## `createGate(name?)` (#methods-createGate-name) + +Creates a [_Gate_](/en/api/effector-react/Gate) + +### Formulae (#methods-createGate-name-formulae) + +```ts +createGate(name?: string): Gate<T> +``` + +### Arguments (#methods-createGate-name-arguments) + +1. `name?` (_string_): Optional name which will be used as the name of a created React component + +### Returns (#methods-createGate-name-returns) + +[`Gate<T>`](/en/api/effector-react/Gate) + +### Examples (#methods-createGate-name-examples) + +#### Basic Usage (#methods-createGate-name-examples-basic) + +```jsx +import React from "react"; +import ReactDOM from "react-dom"; +import { createGate } from "effector-react"; + +const Gate = createGate("gate with props"); + +const App = () => ( + <section> + <Gate foo="bar" /> + </section> +); + +Gate.state.watch((state) => { + console.log("current state", state); +}); +// => current state {} + +ReactDOM.render(<App />, document.getElementById("root")); +// => current state {foo: 'bar'} + +ReactDOM.unmountComponentAtNode(document.getElementById("root")); +// => current state {} +``` + +[Try it](https://share.effector.dev/mMZSQclh) + +## `createGate(config?)` (#methods-createGate-config) + +Creates a [_Gate_](/en/api/effector-react/Gate), if `defaultState` is defined, [Gate.state](/en/api/effector-react/Gate#properties-state) will be created with passed value. + +### Formulae (#methods-createGate-config-formulae) + +```ts +createGate({ defaultState?: T, domain?: Domain, name?: string }): Gate<T> +``` + +### Arguments (#methods-createGate-config-arguments) + +`config` (_Object_): Optional configuration object + +- `defaultState?`: Optional default state for [Gate.state](/en/api/effector-react/Gate#properties-state) +- `domain?` ([_Domain_](/en/api/effector/Domain)): Optional domain which will be used to create gate units ([Gate.open](/en/api/effector-react/Gate#properties-open) event, [Gate.state](/en/api/effector-react/Gate#properties-state) store, and so on) +- `name?` (_string_): Optional name which will be used as the name of a created React component + +### Returns (#methods-createGate-config-returns) + +[`Gate<T>`](/en/api/effector-react/Gate) diff --git a/src/content/docs/en/api/effector-react/createStoreConsumer.md b/src/content/docs/en/api/effector-react/createStoreConsumer.md new file mode 100644 index 0000000..ba9e102 --- /dev/null +++ b/src/content/docs/en/api/effector-react/createStoreConsumer.md @@ -0,0 +1,46 @@ +--- +title: createStoreConsumer +description: Creates store-based component with render-props +redirectFrom: + - /api/effector-react/createStoreConsumer + - /docs/api/effector-react/createStoreConsumer +--- + +```ts +import { createStoreConsumer } from "effector-react"; +``` + +:::warning{title="Deprecated"} +since [effector-react 23.0.0](https://changelog.effector.dev/#effector-react-23-0-0). + +Consider using [hooks api](/en/api/effector-react/index#hooks) in modern projects. +::: + +# Methods (#methods) + +## `createStoreConsumer($store)` (#methods-createStoreConsumer-store) + +Creates a store-based React component which is watching for changes in the store. Based on _Render Props_ technique. + +### Arguments (#methods-createStoreConsumer-store-arguments) + +1. `$store` ([`Store`](/en/api/effector/Store)) + +### Returns (#methods-createStoreConsumer-store-returns) + +(`React.Component`) + +### Examples (#methods-createStoreConsumer-store-examples) + +```jsx +import { createStore } from "effector"; +import { createStoreConsumer } from "effector-react"; + +const $firstName = createStore("Alan"); + +const FirstName = createStoreConsumer($firstName); + +const App = () => <FirstName>{(name) => <h1>{name}</h1>}</FirstName>; +``` + +[Try it](https://share.effector.dev/HbH1tpzQ) diff --git a/src/content/docs/en/api/effector-react/index.md b/src/content/docs/en/api/effector-react/index.md new file mode 100644 index 0000000..21f4cc8 --- /dev/null +++ b/src/content/docs/en/api/effector-react/index.md @@ -0,0 +1,39 @@ +--- +title: effector-react +redirectFrom: + - /api/effector-react + - /docs/api/effector-react +--- + +Effector bindings for ReactJS. + +# Hooks (#hooks) + +- [useUnit(units)](/en/api/effector-react/useUnit) +- [useList(store, renderItem)](/en/api/effector-react/useList) +- [useStoreMap({ store, keys, fn })](/en/api/effector-react/useStoreMap) +- [useStore(store)](/en/api/effector-react/useStore) +- [useEvent(unit)](/en/api/effector-react/useEvent) + +# Components (#components) + +- [Provider](/en/api/effector-react/Provider) + +# Gate API (#gate-api) + +- [Gate](/en/api/effector-react/Gate) +- [createGate()](/en/api/effector-react/createGate) +- [useGate(GateComponent, props)](/en/api/effector-react/useGate) + +# Higher Order Components API (#higher-order-components-api) + +- [createComponent(store, render)](/en/api/effector-react/createComponent) +- [createStoreConsumer(store)](/en/api/effector-react/createStoreConsumer) renders props style +- [connect(store)(Component)](/en/api/effector-react/connect) "connect" style + +# Import map (#import-map) + +Package `effector-react` provides couple different entry points for different purposes: + +- [effector-react/compat](/en/api/effector-react/module/сompat) +- [effector-react/scope](/en/api/effector-react/module/scope) diff --git a/src/content/docs/en/api/effector-react/module/scope.md b/src/content/docs/en/api/effector-react/module/scope.md new file mode 100644 index 0000000..5805f84 --- /dev/null +++ b/src/content/docs/en/api/effector-react/module/scope.md @@ -0,0 +1,103 @@ +--- +title: effector-react/scope +description: Deprecated separate module of effector-react that enforces library to use Scope +--- + +```ts +import {} from "effector-react/scope"; +``` + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) the core team recommends using main module of `effector-react` instead. +::: + +Provides all exports from [effector-react](/en/api/effector-react), but enforces application to use [Scope](/en/api/effector/scope) for all components. + +## Usage (#usage) + +You can use this module in the same way as [effector-react](/en/api/effector-react), but it will require passing [Scope](/en/api/effector/scope) to [Provider](/en/api/effector-react/Provider) component. + +```jsx +// main.js +import { fork } from "effector"; +import { Provider } from "effector-react/scope"; + +import React from "react"; +import ReactDOM from "react-dom/client"; + +const scope = fork(); +const root = ReactDOM.createRoot(document.getElementById("root")); + +root.render( + <Provider value={scope}> + <Application /> + </Provider>, +); +``` + +## Migration (#migration) + +Since `effector-react/scope` is deprecated, it is better to migrate to [effector-react](/en/api/effector-react) by removing `scope` from import path. + +```diff ++ import { Provider } from "effector-react"; +- import { Provider } from "effector-react/scope"; +``` + +:::warning{title="Continues migration"} +`effector-react` and `effector-react/scope` do not share any code, so you have to migrate all your code to `effector-react` in the same time, because otherwise you will get runtime errors. These errors will be thrown because `effector-react` and `effector-react/scope` will use different instances `Provider` and do not have access to each other's `Provider`. +::: + +If you use [Babel](https://babeljs.io/), you need to remove parameter [`reactSsr`](/en/api/effector/babel-plugin#reactssr) from `babel-plugin` configuration. + +```diff +{ + "plugins": [ + [ + "effector/babel-plugin", + { +- "reactSsr": true + } + ] + ] +} +``` + +If you use [SWC](/en/api/effector/swc-plugin), you need to remove [`bindings.react.scopeReplace`](https://github.com/effector/swc-plugin#bindings) parameter from `@effector/swc-plugin` configuration. + +```diff +{ + "$schema": "https://json.schemastore.org/swcrc", + "jsc": { + "experimental": { + "plugins": [ + "@effector/swc-plugin", + { + "bindings": { + "react": { +- "scopeReplace": true + } + } + } + ] + } + } +} +``` + +## Scope Enforcement (#scope-enforcement) + +All modern hooks of `effector-react` are designed to work with [Scope](/en/api/effector/scope). If you want to imitate the behavior of `effector-react/scope` module, you can use the second parameter of hooks with an option `forceScope: true`. In this case, the hook will throw an error if the [Scope](/en/api/effector/scope) is not passed to [Provider](/en/api/effector-react/Provider). + +```diff +- import { useUnit } from 'effector-react/scope' ++ import { useUnit } from 'effector-react' + + +function Example() { +- const { text } = useUnit({ text: $text }) ++ const { text } = useUnit({ text: $text }, { forceScope: true }) + + return <p>{text}</p> +} +``` diff --git "a/src/content/docs/en/api/effector-react/module/\321\201ompat.md" "b/src/content/docs/en/api/effector-react/module/\321\201ompat.md" new file mode 100644 index 0000000..c0f39ff --- /dev/null +++ "b/src/content/docs/en/api/effector-react/module/\321\201ompat.md" @@ -0,0 +1,94 @@ +--- +title: effector-react/compat +description: Separate module of effector-react with compatibility up to IE11 and Chrome 47 (browser for Smart TV devices) +--- + +```ts +import {} from "effector-react/compat"; +``` + +The library provides a separate module with compatibility up to IE11 and Chrome 47 (browser for Smart TV devices). + +:::warning{title="Bundler, Not Transpiler"} +Since third-party libraries can import `effector-react` directly, you **should not** use transpilers like Babel to replace `effector-react` with `effector-react/compat` in your code because by default, Babel will not transform third-party code. + +**Use a bundler instead**, as it will replace `effector-react` with `effector-react/compat` in all modules, including those from third parties. + +::: + +Since `effector-react` uses `effector` under the hood, you need to use the compat-version of `effector` as well. Please, read [`effector/compat`](/en/api/effector/module/compat) for details. + +## Required Polyfills (#required-polyfills) + +You need to install polyfills for these objects: + +- `Promise` +- `Object.assign` +- `Array.prototype.flat` +- `Map` +- `Set` + +In most cases, a bundler can automatically add polyfills. + +### Vite (#required-polyfills-vite) + +<details> +<summary>Vite Configuration Example</summary> + +```js +import { defineConfig } from "vite"; +import legacy from "@vitejs/plugin-legacy"; + +export default defineConfig({ + plugins: [ + legacy({ + polyfills: ["es.promise", "es.object.assign", "es.array.flat", "es.map", "es.set"], + }), + ], +}); +``` + +</details> + +# Usage (#usage) + +## Manual Usage (#usage-manual) + +You can use it instead of the `effector-react` package if you need to support old browsers. + +```diff +- import {useUnit} from 'effector-react' ++ import {useUnit} from 'effector-react/compat' +``` + +## Automatic Replacement (#usage-automatic-replacement) + +However, you can set up your bundler to automatically replace `effector` with `effector/compat` in your code. + +### Webpack (#usage-automatic-replacement-webpack) + +```js +module.exports = { + resolve: { + alias: { + effector: "effector/compat", + "effector-react": "effector-react/compat", + }, + }, +}; +``` + +### Vite (#usage-automatic-replacement-vite) + +```js +import { defineConfig } from "vite"; + +export default defineConfig({ + resolve: { + alias: { + effector: "effector/compat", + "effector-react": "effector-react/compat", + }, + }, +}); +``` diff --git a/src/content/docs/en/api/effector-react/useEvent.md b/src/content/docs/en/api/effector-react/useEvent.md new file mode 100644 index 0000000..007bc21 --- /dev/null +++ b/src/content/docs/en/api/effector-react/useEvent.md @@ -0,0 +1,128 @@ +--- +title: useEvent +redirectFrom: + - /api/effector-react/useEvent + - /docs/api/effector-react/useEvent +--- + +```ts +import { useEvent } from "effector-react"; +``` + +:::info{title="since"} +`useEvent` introduced in [effector-react 20.9.0](https://changelog.effector.dev/#effector-20-9-0) +::: + +:::warning{title="This is API is deprecated"} + +Prefer [`useUnit`](/api/effector-react/useUnit) hook instead. +::: + +Bind event to current [_scope_](/en/api/effector/Scope) to use in dom event handlers.<br/> +Only `effector-react/scope` version works this way, `useEvent` of `effector-react` is a no-op and does not require `Provider` with scope. + +:::info{title="Note"} +Useful only if you have server-side rendering or writing tests for React-components. +::: + +# Methods (#methods) + +## `useEvent(unit)` (#methods-useEvent-unit) + +### Arguments (#methods-useEvent-unit-arguments) + +1. `unit` ([_Event_](/en/api/effector/Event) or [_Effect_](/en/api/effector/Effect)): Event or effect which will be bound to current `scope` + +### Returns (#methods-useEvent-unit-returns) + +(Function): Function to pass to event handlers. Will trigger a given unit in the current scope. + +### Examples (#methods-useEvent-unit-examples) + +#### Basic Usage (#methods-useEvent-unit-examples-basic) + +```jsx +import ReactDOM from "react-dom"; +import { createEvent, createStore, fork } from "effector"; +import { useStore, useEvent, Provider } from "effector-react"; + +const incremented = createEvent(); +const $count = createStore(0); + +$count.on(incremented, (counter) => counter + 1); + +const App = () => { + const count = useStore($count); + const handleIncrement = useEvent(incremented); + + return ( + <> + <p>Count: {count}</p> + <button onClick={() => handleIncrement()}>increment</button> + </> + ); +}; + +const scope = fork(); + +ReactDOM.render( + <Provider value={scope}> + <App /> + </Provider>, + document.getElementById("root"), +); +``` + +[Try it](https://share.effector.dev/GyiJvLdo) + +## `useEvent(shape)` (#methods-useEvent-shape) + +### Arguments (#methods-useEvent-shape-arguments) + +1. `shape` Object or array of ([_Event_](/en/api/effector/Event) or [_Effect_](/en/api/effector/Effect)): Events or effects as values which will be bound to the current `scope` + +### Returns (#methods-useEvent-shape-returns) + +(Object or Array): List of functions with the same names or keys as an argument to pass to event handlers. Will trigger a given unit in the current scope. + +### Examples (#methods-useEvent-shape-examples) + +#### Object Usage (#methods-useEvent-shape-examples-object) + +```jsx +import ReactDOM from "react-dom"; +import { createStore, createEvent, fork } from "effector"; +import { useStore, useEvent, Provider } from "effector-react"; + +const incremented = createEvent(); +const decremented = createEvent(); + +const $count = createStore(0); + +$count.on(incremented, (counter) => counter + 1); +$count.on(decremented, (counter) => counter - 1); + +const App = () => { + const counter = useStore($count); + const handler = useEvent({ incremented, decremented }); + // or + const [handleIncrement, handleDecrement] = useEvent([incremented, decremented]); + + return ( + <> + <p>Count: {counter}</p> + <button onClick={() => handler.incremented()}>increment</button> + <button onClick={() => handler.decremented()}>decrement</button> + </> + ); +}; + +const scope = fork(); + +ReactDOM.render( + <Provider value={scope}> + <App /> + </Provider>, + document.getElementById("root"), +); +``` diff --git a/src/content/docs/en/api/effector-react/useGate.md b/src/content/docs/en/api/effector-react/useGate.md new file mode 100644 index 0000000..e7ae202 --- /dev/null +++ b/src/content/docs/en/api/effector-react/useGate.md @@ -0,0 +1,57 @@ +--- +title: useGate +description: Hook for passing data to Gate +redirectFrom: + - /api/effector-react/useGate + - /docs/api/effector-react/useGate +--- + +```ts +import { useGate } from "effector-react"; +``` + +# Methods (#methods) + +## `useGate(Gate, props?)` (#methods-useGate-Gate-props) + +Hook for passing data to [_Gate_](/en/api/effector-react/Gate). + +### Formulae (#methods-useGate-Gate-props-formulae) + +```ts +const CustomGate: Gate<T>; + +useGate(CustomGate, props?: T): void; +``` + +### Arguments (#methods-useGate-Gate-props-arguments) + +1. `Gate` ([`Gate<T>`](/en/api/effector-react/Gate)) +2. `props` (`T`) + +### Returns (#methods-useGate-Gate-props-returns) + +(`void`) + +### Examples (#methods-useGate-Gate-props-examples) + +#### Basic (#methods-useGate-Gate-props-examples-basic) + +```js +import { createGate, useGate } from "effector-react"; +import { Route } from "react-router"; + +const PageGate = createGate("page"); + +PageGate.state.watch(({ match }) => { + console.log(match); +}); + +const Home = (props) => { + useGate(PageGate, props); + + return <section>Home</section>; +}; + +const App = () => <Route component={Home} />; +``` diff --git a/src/content/docs/en/api/effector-react/useList.md b/src/content/docs/en/api/effector-react/useList.md new file mode 100644 index 0000000..e68fe6f --- /dev/null +++ b/src/content/docs/en/api/effector-react/useList.md @@ -0,0 +1,225 @@ +--- +title: useList +redirectFrom: + - /api/effector-react/useList + - /docs/api/effector-react/useList +--- + +```ts +import { useList } from "effector-react"; +``` + +:::info{title="since"} +`useList` introduced in [effector-react 20.1.1](https://changelog.effector.dev/#effector-react-20-1-1) +::: + +Hook function for efficient rendering of list store. +Every item will be memoized and updated only when their data change. + +# Methods (#methods) + +## `useList($store, fn)` (#methods-useList-store-fn) + +Using `index` as `key` for each element in the list. + +### Formulae (#methods-useList-store-fn-formulae) + +```ts +useList( + $store: Store<T[]>, + fn: (value: T, index: number) => React.ReactNode, +): React.ReactNode; +``` + +### Arguments (#methods-useList-store-fn-arguments) + +1. `$store` ([`Store<T>`](/en/api/effector/Store)): Store with an array of items +2. `fn` (_Function_): Render function which will be called for every item in list + +### Returns (#methods-useList-store-fn-returns) + +(`React.Node`) + +### Examples (#methods-useList-store-fn-examples) + +#### Basic (#methods-useList-store-fn-examples-basic) + +```jsx +import { createStore } from "effector"; +import { useList } from "effector-react"; + +const $users = createStore([ + { id: 1, name: "Yung" }, + { id: 2, name: "Lean" }, + { id: 3, name: "Kyoto" }, + { id: 4, name: "Sesh" }, +]); + +const App = () => { + // we don't need keys here any more + const list = useList($users, ({ name }, index) => ( + <li> + [{index}] {name} + </li> + )); + + return <ul>{list}</ul>; +}; +``` + +[Try it](https://share.effector.dev/dV9dmuz3) + +#### With store updates (#methods-useList-store-fn-examples-with-store-updates) + +```jsx +import { createStore, createEvent } from "effector"; +import { useList, useUnit } from "effector-react"; + +const todoSubmitted = createEvent(); +const todoToggled = createEvent(); + +const $todoList = createStore([ + { text: "write useList example", done: true }, + { text: "update readme", done: false }, +]); + +$todoList.on(todoToggled, (list, id) => + list.map((todo, index) => { + if (index === id) + return { + ...todo, + done: !todo.done, + }; + return todo; + }), +); + +$todoList.on(todoSubmitted, (list, text) => [...list, { text, done: false }]); + +todoSubmitted.watch((e) => { + e.preventDefault(); +}); + +const TodoList = () => { + const [onTodoToggle] = useUnit([todoToggled]); + return useList($todoList, ({ text, done }, index) => { + const todo = done ? ( + <del> + <span>{text}</span> + </del> + ) : ( + <span>{text}</span> + ); + + return <li onClick={() => onTodoToggle(index)}>{todo}</li>; + }); +}; + +const App = () => { + const [onTodoSubmit] = useUnit([todoSubmitted]); + + function handleSubmit(e) { + e.preventDefault(); + onTodoSubmit(e.currentTarget.elements.content.value); + } + + return ( + <div> + <h1>todo list</h1> + <form onSubmit={handleSubmit}> + <label htmlFor="content">New todo</label> + <input type="text" name="content" required /> + <input type="submit" value="Add" /> + </form> + <ul> + <TodoList /> + </ul> + </div> + ); +}; +``` + +[Try it](https://share.effector.dev/dUay9F3U) + +## `useList($store, config)` (#methods-useList-store-config) + +Used when you need to pass dependencies to react (to update items when some of its dependencies are changed). + +By default, `useList` rerenders only when some of its items were changed. +However, sometimes we need to update items when some external value (e.g. props field or state of another store) changes. +In such case, we need to tell React about our dependencies and pass keys explicitly. + +### Formulae (#methods-useList-store-config-formulae) + +```ts +useList( + $store: Store<T[]>, + config: { + keys: any[], + getKey?: (value: T) => React.Key, + fn: (value: T, index: number) => React.ReactNode, + placeholder?: React.ReactNode, + } +): React.ReactNode; +``` + +### Arguments (#methods-useList-store-config-arguments) + +1. `$store` ([`Store<T>`](/en/api/effector/Store)): Store with an array of items +2. `config` (`Object`) + - `keys` (`Array`): Array of dependencies, which will be passed to react by `useList` + - `fn` (`(value: T) => React.ReactNode`): Render function which will be called for every item in list + - `getKey` (`(value) => React.Key`): Optional function to compute key for every item of list + - `placeholder` (`React.ReactNode`): Optional react node to render instead of an empty list + +:::info{title="since"} +`getKey` option introduced in [effector-react@21.3.0](https://changelog.effector.dev/#effector-react-21-3-0) +::: + +:::info{title="since"} +`placeholder` option introduced in [effector-react@22.1.0](https://changelog.effector.dev/#effector-react-22-1-0) +::: + +### Returns (#methods-useList-store-config-returns) + +(`React.Node`) + +### Examples (#methods-useList-store-config-examples) + +#### Basic (#methods-useList-store-config-examples-config) + +```jsx +import ReactDOM from "react-dom"; +import { createEvent, createStore, restore } from "effector"; +import { useUnit, useList } from "effector-react"; + +const renameUser = createEvent(); + +const $user = createStore("alice"); +const $friends = createStore(["bob"]); + +$user.on(renameUser, (_, name) => name); + +const App = () => { + const user = useUnit($user); + + return useList($friends, { + keys: [user], + fn: (friend) => ( + <div> + {friend} is a friend of {user} + </div> + ), + }); +}; + +ReactDOM.render(<App />, document.getElementById("root")); +// => <div> bob is a friend of alice </div> + +setTimeout(() => { + renameUser("carol"); + // => <div> bob is a friend of carol </div> +}, 500); +``` + +[Try it](https://share.effector.dev/ijRS5TYh) diff --git a/src/content/docs/en/api/effector-react/useProvidedScope.md b/src/content/docs/en/api/effector-react/useProvidedScope.md new file mode 100644 index 0000000..34397af --- /dev/null +++ b/src/content/docs/en/api/effector-react/useProvidedScope.md @@ -0,0 +1,47 @@ +--- +title: useProvidedScope +description: Effector React +redirectFrom: + - /api/effector-react/useProvidedScope + - /docs/api/effector-react/useProvidedScope +--- + +```ts +import { useProvidedScope } from "effector-react"; +``` + +Low-level React Hook, which returns current [Scope](/api/effector/Scope) from [Provider](/api/effector-react/Provider). + +:::warning{title="This is a Low-Level API"} +The `useProvidedScope` hook is a low-level API for library developers and **is not intended to be used in production code** directly. + +For production `effector-react` usage, see the [`useUnit`](/api/effector-react/useUnit) hook. +::: + +# Methods (#methods) + +## `useProvidedScope()` (#methods-useProvidedScope) + +### Formulae (#methods-useProvidedScope-formulae) + +```ts +useProvidedScope(): Scope | null +``` + +### Returns (#methods-useProvidedScope-returns) + +([`Scope | null`](/api/effector/Scope)) — if no Scope provided, returns `null`. + +### Examples (#methods-useProvidedScope-examples) + +This hook can be used in library internals to handle various edge-cases, where `createWatch` and `scopeBind` APIs are also needed. + +For production code usage, see the [`useUnit`](/api/effector-react/useUnit) hook instead. + +```tsx +const useCustomLibraryInternals = () => { + const scope = useProvidedScope(); + + // ... +}; +``` diff --git a/src/content/docs/en/api/effector-react/useStore.md b/src/content/docs/en/api/effector-react/useStore.md new file mode 100644 index 0000000..29d4907 --- /dev/null +++ b/src/content/docs/en/api/effector-react/useStore.md @@ -0,0 +1,64 @@ +--- +title: useStore +redirectFrom: + - /api/effector-react/useStore + - /docs/api/effector-react/useStore +--- + +```ts +import { useStore } from "effector-react"; +``` + +React hook, which subscribes to a [store](/en/api/effector/Store) and returns its current value, so when the store is updated, the component will update automatically. + +:::warning{title="This is API is deprecated"} + +Prefer [`useUnit`](/api/effector-react/useUnit) hook instead. +::: + +# Methods (#methods) + +## `useStore($store): State` (#methods-useStore-store) + +### Formulae (#methods-useStore-store-formulae) + +```ts +useStore($store: Store<State>): State +``` + +### Arguments (#methods-useStore-store-arguments) + +1. `$store`: [Store](/en/api/effector/Store) + +### Returns (#methods-useStore-store-returns) + +(_`State`_): The value from the store + +### Examples (#methods-useStore-store-examples) + +```jsx +import { createStore } from "effector"; +import { useStore, useEvent } from "effector-react"; + +const $counter = createStore(0); + +const { incrementClicked, decrementClicked } = createApi($counter, { + incrementClicked: (state) => state + 1, + decrementClicked: (state) => state - 1, +}); + +const App = () => { + const counter = useStore($counter); + const [onIncrement, onDecrement] = useEvent([incrementClicked, decrementClicked]); + + return ( + <div> + {counter} + <button onClick={onIncrement}>Increment</button> + <button onClick={onDecrement}>Decrement</button> + </div> + ); +}; +``` + +[Try it](https://share.effector.dev/DHzp3z4r) diff --git a/src/content/docs/en/api/effector-react/useStoreMap.md b/src/content/docs/en/api/effector-react/useStoreMap.md new file mode 100644 index 0000000..f924147 --- /dev/null +++ b/src/content/docs/en/api/effector-react/useStoreMap.md @@ -0,0 +1,140 @@ +--- +title: useStoreMap +redirectFrom: + - /api/effector-react/useStoreMap + - /docs/api/effector-react/useStoreMap +--- + +```ts +import { useStoreMap } from "effector-react"; +``` + +:::info{title="since"} +`useStoreMap` introduced in [effector-react 19.1.2](https://changelog.effector.dev/#effector-react-19-1-2) +::: + +React hook, which subscribes to a [store](/en/api/effector/Store) and transforms its value with a given function. The component will update only when the selector function result will change. + +You can read the motivation in the [issue](https://github.com/effector/effector/issues/118). + +# Methods (#methods) + +## `useStoreMap($store, fn)` (#methods-useStoreMap-store-fn) + +:::info{title="since"} +Short version of `useStoreMap` introduced in [effector-react@21.3.0](https://changelog.effector.dev/#effector-react-21-3-0) +::: + +Common use case: subscribe to changes in selected part of store only + +### Formulae (#methods-useStoreMap-store-fn-formulae) + +```ts +useStoreMap( + $store: Store<State>, + fn: (state: State) => Result, +): Result +``` + +### Arguments (#methods-useStoreMap-store-fn-arguments) + +1. `$store`: Source [`Store<State>`](/en/api/effector/Store) +2. `fn` (`(state: State) => Result`): Selector function to receive part of source store + +### Returns (#methods-useStoreMap-store-fn-returns) + +(`Result`): Value from the `fn` function call. + +### Examples (#methods-useStoreMap-store-fn-examples) + +TBD + +## `useStoreMap(config)` (#methods-useStoreMap-config) + +Overload used when you need to pass dependencies to react (to update items when some of its dependencies are changed) + +### Formulae (#methods-useStoreMap-config-formulae) + +```ts +useStoreMap({ + store: Store<State>, + keys: any[], + fn: (state: State, keys: any[]) => Result, + updateFilter?: (newResult: Result, oldResult: Result) => boolean, + defaultValue?: Result, +}): Result; +``` + +### Arguments (#methods-useStoreMap-config-arguments) + +1. `config` (_Object_): Configuration object + - `store`: Source [`Store<State>`](/en/api/effector/Store) + - `keys` (_Array_): This argument will be passed to React.useMemo to avoid unnecessary updates + - `fn` (`(state: State, keys: any[]) => Result`): Selector function to receive part of source store + - `updateFilter` (`(newResult, oldResult) => boolean`): _Optional_ function used to compare old and new updates to prevent unnecessary rerenders. Uses [createStore updateFilter](/en/api/effector/createStore) option under the hood + - `defaultValue`: Optional default value, used whenever `fn` returns undefined + +:::info{title="since"} +`updateFilter` option introduced in [effector-react@21.3.0](https://changelog.effector.dev/#effector-react-21-3-0) +::: + +:::info{title="since"} +`defaultValue` option introduced in [effector-react@22.1.0](https://changelog.effector.dev/#effector-react-22-1-0) +::: + +### Returns (#methods-useStoreMap-config-returns) + +(`Result`): Value from the `fn` function call, or the `defaultValue`. + +### Examples (#methods-useStoreMap-config-examples) + +#### Basic (#methods-useStoreMap-config-examples-basic) + +This hook is useful for working with lists, especially with large ones + +```jsx +import { createStore } from "effector"; +import { useList, useStoreMap } from "effector-react"; + +const usersRaw = [ + { + id: 1, + name: "Yung", + }, + { + id: 2, + name: "Lean", + }, + { + id: 3, + name: "Kyoto", + }, + { + id: 4, + name: "Sesh", + }, +]; + +const $users = createStore(usersRaw); +const $ids = createStore(usersRaw.map(({ id }) => id)); + +const User = ({ id }) => { + const user = useStoreMap({ + store: $users, + keys: [id], + fn: (users, [userId]) => users.find(({ id }) => id === userId) ?? null, + }); + + return ( + <div> + <strong>[{user.id}]</strong> {user.name} + </div> + ); +}; + +const UserList = () => { + return useList($ids, (id) => <User id={id} />); +}; +``` + +[Try it](https://share.effector.dev/cAZWHCit) diff --git a/src/content/docs/en/api/effector-react/useUnit.md b/src/content/docs/en/api/effector-react/useUnit.md new file mode 100644 index 0000000..2445dc1 --- /dev/null +++ b/src/content/docs/en/api/effector-react/useUnit.md @@ -0,0 +1,192 @@ +--- +title: useUnit +description: Effector React +redirectFrom: + - /api/effector-react/useUnit + - /docs/api/effector-react/useUnit +--- + +```ts +import { useUnit } from "effector-react"; +``` + +:::info{title="since"} +`useUnit` introduced in [effector-react 22.1.0](https://changelog.effector.dev/#effector-react-22-1-0) +::: + +React hook, which takes any unit or shape of units. + +In the case of [stores](/en/api/effector/Store), it subscribes the component to the provided [store](/en/api/effector/Store) and returns its current value, so when the store updates, the component will update automatically. + +In the case of [events](/en/api/effector/Event)/[effects](/en/api/effector/Effect) – it binds to the current [_scope_](/en/api/effector/Scope) to use in DOM event handlers. +Only the `effector-react/scope` version works this way; the `useUnit` of `effector-react` is no-op for events and does not require a `Provider` with scope. + +# Methods (#methods) + +## `useUnit(unit)` (#methods-useUnit-unit) + +Creates function that calls original unit but bounded to [`Scope`](/en/api/effector/Scope) if provided. + +### Formulae (#methods-useUnit-unit-formulae) + +```ts +useUnit(event: EventCallable<T>): (payload: T) => T; +useUnit(effect: Effect<Params, Done, any>): (payload: Params) => Promise<Done>; +``` + +### Arguments (#methods-useUnit-unit-arguments) + +1. `unit` ([`EventCallable<T>`](/en/api/effector/Event#eventCallable) or [`Effect<Params, Done, Fail>`](/en/api/effector/Effect)): Event or effect which will be bound to the current `scope`. + +### Returns (#methods-useUnit-unit-returns) + +(Function): Function to pass to event handlers. Will trigger the given unit in the current scope. + +### Examples (#methods-useUnit-unit-examples) + +#### Basic (#methods-useUnit-unit-examples-basic) + +```jsx +import { createEvent, createStore, fork } from "effector"; +import { useUnit, Provider } from "effector-react"; +import { render } from "react-dom"; + +const incrementClicked = createEvent(); +const $count = createStore(0); + +$count.on(incrementClicked, (count) => count + 1); + +const App = () => { + const [count, onIncrement] = useUnit([$count, incrementClicked]); + + return ( + <> + <p>Count: {count}</p> + <button onClick={() => onIncrement()}>increment</button> + </> + ); +}; + +const scope = fork(); + +render( + () => ( + <Provider value={scope}> + <App /> + </Provider> + ), + document.getElementById("root"), +); +``` + +## `useUnit($store)` (#methods-useUnit-store) + +Reads value from the `$store` and rerenders component when `$store` updates in [`Scope`](/en/api/effector/Scope) if provided. + +### Formulae (#methods-useUnit-store-formulae) + +```ts +useUnit($store: Store<T>): T; +``` + +### Arguments (#methods-useUnit-store-arguments) + +1. `$store`: effector ([_Store_](/en/api/effector/Store)) + +### Returns (#methods-useUnit-store-returns) + +Current value of the store. + +### Examples (#methods-useUnit-store-examples) + +#### Basic (#methods-useUnit-store-examples-basic) + +```js +import { createStore, createApi } from "effector"; +import { useUnit } from "effector-react"; + +const $counter = createStore(0); + +const { incrementClicked, decrementClicked } = createApi($counter, { + incrementClicked: (count) => count + 1, + decrementClicked: (count) => count - 1, +}); + +const App = () => { + const counter = useUnit($counter); + const [onIncrement, onDecrement] = useUnit([incrementClicked, decrementClicked]); + + return ( + <div> + {counter} + <button onClick={onIncrement}>Increment</button> + <button onClick={onDecrement}>Decrement</button> + </div> + ); +}; +``` + +## `useUnit(shape)` (#methods-useUnit-shape) + +### Formulae (#methods-useUnit-shape-formulae) + +```ts +useUnit({ a: Store<A>, b: Event<B>, ... }): { a: A, b: (payload: B) => B; ... } + +useUnit([Store<A>, Event<B>, ... ]): [A, (payload: B) => B, ... ] +``` + +### Arguments (#methods-useUnit-shape-arguments) + +1. `shape`: Object or array of ([`EventCallable`](/en/api/effector/Event#eventCallable), [`Effect`](/en/api/effector/Effect), or [`Store`](/en/api/effector/Store)) + +### Returns (#methods-useUnit-shape-returns) + +(`Object` or `Array`): + +- If passed `EventCallable` or `Effect`: Functions with the same names or keys as the argument to pass to event handlers. Will trigger the given unit in the current scope. <br/> + _Note: events or effects will be bound to `Scope` **only** if component wrapped into [`Provider`](/en/api/effector-react/Provider)._ +- If passed `Store`: The current value of the store. + +### Examples (#methods-useUnit-shape-examples) + +#### Basic (#methods-useUnit-shape-examples-basic) + +```jsx +import { createStore, createEvent, fork } from "effector"; +import { useUnit, Provider } from "effector-react"; + +const incremented = createEvent(); +const decremented = createEvent(); + +const $count = createStore(0); + +$count.on(incremented, (count) => count + 1); +$count.on(decremented, (count) => count - 1); + +const App = () => { + const count = useUnit($count); + const on = useUnit({ incremented, decremented }); + // or + const [a, b] = useUnit([incremented, decremented]); + + return ( + <> + <p>Count: {count}</p> + <button onClick={() => on.incremented()}>increment</button> + <button onClick={() => on.decremented()}>decrement</button> + </> + ); +}; + +const scope = fork(); + +render( + () => ( + <Provider value={scope}> + <App /> + </Provider> + ), + document.getElementById("root"), +); +``` diff --git a/src/content/docs/en/api/effector-solid/Gate.md b/src/content/docs/en/api/effector-solid/Gate.md new file mode 100644 index 0000000..50f4f02 --- /dev/null +++ b/src/content/docs/en/api/effector-solid/Gate.md @@ -0,0 +1,55 @@ +--- +title: Effector Solid Gate +description: Effector Solid +redirectFrom: + - /api/effector-solid/Gate + - /docs/api/effector-solid/gate +--- + +_Gate_ is a hook for conditional rendering, based on current value (or values) in props. +An example of a problem that Gate can solve – you can put together all required data when component was mounted, or show another component if there is not enough data in props. +Gate also looks good for Routing or animation. + +This allows you to send props back to _Store_ to create a feedback loop. + +Gate can be used via the [useGate](/en/api/effector-solid/useGate) hook or as a component with props (`<Gate history={history} />`). +Gate stores and events can be used in the application as regular units. + +Gate can have two states: + +- **Open**, which means mounted +- **Closed**, which means unmounted + +# Properties (#properties) + +## `.state` Store (#properties-state) + +:::warning{title="Important"} +Do not modify the `state` value! It is a [derived store](/en/api/effector/Store#readonly) and should be kept in a predictable state. +::: + +`Store<Props>`: [Derived Store](/en/api/effector/Store#readonly) with the current state of the given gate. The state comes from the second argument of [useGate](/en/api/effector-solid/useGate) and from props when rendering the gate as a component. + +## `.open` Event (#properties-open) + +:::info{title="Important"} +Do not manually call this event. It is an event that depends on a Gate's state. +::: + +[Event<Props>](/en/api/effector/Event): Event which will be called during the gate's mounting. + +## `.close` Event (#properties-close) + +:::info{title="Important"} +Do not manually call this event. It is an event that depends on a Gate's state. +::: + +[Event<Props>](/en/api/effector/Event): Event which will be called during the gate's unmounting. + +## `.status` Store (#properties-status) + +:::warning{title="Important"} +Do not modify the `status` value! It is a [derived store](/en/api/effector/Store#readonly) and should be in a predictable state. +::: + +`Store<boolean>`: Boolean [Derived Store](/en/api/effector/Store#readonly), which shows if the given gate is mounted. diff --git a/src/content/docs/en/api/effector-solid/createGate.md b/src/content/docs/en/api/effector-solid/createGate.md new file mode 100644 index 0000000..676faa9 --- /dev/null +++ b/src/content/docs/en/api/effector-solid/createGate.md @@ -0,0 +1,77 @@ +--- +title: createGate +description: Creates a gate to consume data from view +redirectFrom: + - /api/effector-solid/createGate + - /docs/api/effector-solid/createGate +--- + +# Methods (#methods) + +## `createGate(config)` (#methods-createGate-config) + +### Formulae (#methods-createGate-config-formulae) + +```ts +createGate(config): Gate +``` + +### Arguments (#methods-createGate-config-arguments) + +`config` (_Object_): Optional configuration object + +- `defaultState?`: Optional default state for [Gate.state](/en/api/effector-solid/Gate#state) +- `domain?` ([_Domain_]/apieffector/Domain)): Optional domain which will be used to create gate units ([Gate.open](/en/api/effector-solid/Gate#open) event, [Gate.state](/en/api/effector-solid/Gate#state) store and so on) +- `name?` (_string_): Optional name which will be used as name of a created Solid component + +### Returns (#methods-createGate-config-returns) + +[_Gate_](/en/api/effector-solid/Gate) + +### Examples (#methods-createGate-config-examples) + +TBD + +## `createGate(name?)` (#methods-createGate-name) + +### Formulae (#methods-createGate-name-formulae) + +```ts +createGate(name): Gate +``` + +### Arguments (#methods-createGate-name-arguments) + +1. `name?` (_string_): Optional name which will be used as name of a created Solid component + +### Returns (#methods-createGate-name-returns) + +[_Gate_](/en/api/effector-solid/Gate) + +### Examples (#methods-createGate-name-examples) + +#### Basic usage (#methods-createGate-name-examples-basic) + +```js +import { createGate } from "effector-solid"; +import { render } from "solid-js/web"; + +const Gate = createGate("gate with props"); + +const App = () => ( + <section> + <Gate foo="bar" /> + </section> +); + +Gate.state.watch((state) => { + console.log("current state", state); +}); +// => current state {} + +const unmount = render(() => <App />, document.getElementById("root")); +// => current state {foo: 'bar'} + +unmount(); +// => current state {} +``` diff --git a/src/content/docs/en/api/effector-solid/index.md b/src/content/docs/en/api/effector-solid/index.md new file mode 100644 index 0000000..e8038af --- /dev/null +++ b/src/content/docs/en/api/effector-solid/index.md @@ -0,0 +1,25 @@ +--- +title: effector-solid +redirectFrom: + - /api/effector-solid + - /docs/api/effector-solid +--- + +Effector bindings for SolidJS. + +# Reactive Helpers (#reactive-helpers) + +- [useUnit(unit)](/en/api/effector-solid/useUnit) +- [useStoreMap({ store, keys, fn })](/en/api/effector-solid/useStoreMap) + +# Gate API (#gate-api) + +- [Gate](/en/api/effector-solid/Gate) +- [createGate()](/en/api/effector-solid/createGate) +- [useGate(GateComponent, props)](/en/api/effector-solid/useGate) + +# Import Map (#import-map) + +Package `effector-solid` provides couple different entry points for different purposes: + +- [effector-solid/scope](/en/api/effector-solid/module/scope) diff --git a/src/content/docs/en/api/effector-solid/module/scope.md b/src/content/docs/en/api/effector-solid/module/scope.md new file mode 100644 index 0000000..714290b --- /dev/null +++ b/src/content/docs/en/api/effector-solid/module/scope.md @@ -0,0 +1,64 @@ +--- +title: effector-solid/scope +description: Deprecated separate module of effector-solid that enforces library to use Scope +--- + +```ts +import {} from "effector-solid/scope"; +``` + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) the core team recommends using the main module of `effector-solid` instead. +::: + +Provides all exports from [effector-solid](/en/api/effector-solid), but enforces the application to use [Scope](/en/api/effector/scope) for all components. + +## Usage (#usage) + +You can use this module in the same way as [effector-solid](/en/api/effector-solid), but it will require passing [Scope](/en/api/effector/scope) to [Provider](/en/api/effector-solid/Provider) component. + +```jsx +// main.js +import { fork } from "effector"; +import { Provider } from "effector-solid/scope"; +import { render } from "solid-js/web"; + +const scope = fork(); + +render( + <Provider value={scope}> + <Application /> + </Provider>, + document.getElementById("root"), +); +``` + +## Migration (#migration) + +Since `effector-solid/scope` is deprecated, it is recommended to migrate to [effector-solid](/en/api/effector-solid) by removing `scope` from the import path. + +```diff ++ import { Provider } from "effector-solid"; +- import { Provider } from "effector-solid/scope"; +``` + +:::warning{title="Continued migration"} +`effector-solid` and `effector-solid/scope` do not share any code, so you have to migrate all your code to `effector-solid` at the same time, because otherwise, you will get runtime errors. These errors will occur because `effector-solid` and `effector-solid/scope` will use different instances of `Provider` and do not have access to each other's `Provider`. +::: + +## Scope enforcement (#scope-enforcement) + +All modern hooks of `effector-solid` are designed to work with [Scope](/en/api/effector/scope). If you want to imitate the behavior of the `effector-solid/scope` module, you can pass a second parameter to hooks with an option `forceScope: true`. In this case, the hook will throw an error if the [Scope](/en/api/effector/scope) is not passed to [Provider](/en/api/effector-solid/Provider). + +```diff +- import { useUnit } from 'effector-solid/scope' ++ import { useUnit } from 'effector-solid' + + +function MyComponent() { +- const { test } = useUnit({ text: $text }) ++ const { test } = useUnit({ text: $text }, { forceScope: true }) + + return <p>{text}</p> +} +``` diff --git a/src/content/docs/en/api/effector-solid/useGate.md b/src/content/docs/en/api/effector-solid/useGate.md new file mode 100644 index 0000000..b44bd94 --- /dev/null +++ b/src/content/docs/en/api/effector-solid/useGate.md @@ -0,0 +1,58 @@ +--- +title: useGate +description: Function for passing data to Gate +redirectFrom: + - /api/effector-solid/useGate + - /docs/api/effector-solid/useGate +--- + +```ts +import { useGate } from "effector-solid"; +``` + +Function for passing data to [_Gate_](/en/api/effector-solid/Gate). + +# Methods (#methods) + +## `useGate(Gate, props)` (#methods-useGate-Gate-props) + +### Formulae (#methods-useGate-Gate-props-formulae) + +```ts +useGate(Gate: Gate<Props>, props: Props): void; +``` + +### Arguments (#methods-useGate-Gate-props-arguments) + +1. `Gate` ([`Gate<Props>`](/en/api/effector-solid/Gate)) +2. `props` (_Props_) + +### Returns (#methods-useGate-Gate-props-returns) + +(`void`) + +### Examples (#methods-useGate-Gate-props-examples) + +#### Basic Usage (#methods-useGate-Gate-props-examples-basic-usage) + +```jsx +import { createGate, useGate } from "effector-solid"; +import { Route, Routes } from "solid-app-router"; + +const PageGate = createGate("page"); + +const Home = (props) => { + useGate(PageGate, props); + return <section>Home</section>; +}; + +PageGate.state.watch(({ match }) => { + console.log(match); +}); + +const App = () => ( + <Routes> + <Route element={<Home />} /> + </Routes> +); +``` diff --git a/src/content/docs/en/api/effector-solid/useStoreMap.md b/src/content/docs/en/api/effector-solid/useStoreMap.md new file mode 100644 index 0000000..fe852e3 --- /dev/null +++ b/src/content/docs/en/api/effector-solid/useStoreMap.md @@ -0,0 +1,117 @@ +--- +title: useStoreMap +redirectFrom: + - /api/effector-solid/useStoreMap + - /docs/api/effector-solid/useStoreMap +--- + +```ts +import { useStoreMap } from "effector-solid"; +``` + +# Methods (#methods) + +## `useStoreMap($store, fn)` (#methods-useStoreMap-store-fn) + +Function, which subscribes to a [store](/en/api/effector/Store) and transforms its value with a given function. Signal will update only when the selector function result will change. + +Common use case: subscribe to changes in selected part of store only. + +### Formulae (#methods-useStoreMap-store-fn-formulae) + +```ts +useStoreMap( + $store: Store<State>, + fn: (state: State) => Result, +): Accessor<Result>; +``` + +### Arguments (#methods-useStoreMap-store-fn-arguments) + +1. `$store`: Source [`Store<T>`](/en/api/effector/Store) +2. `fn` (`(state: T) => Result`): Selector function to receive part of source store + +### Returns (#methods-useStoreMap-store-fn-returns) + +(`Result`) + +### Examples (#methods-useStoreMap-store-fn-examples) + +TBD + +## `useStoreMap(config)` (#methods-useStoreMap-config) + +### Formulae (#methods-useStoreMap-config-formulae) + +```ts +useStoreMap({ + store: Store<State>, + keys: any[], + fn: (state: State, keys: any[]) => Result, + updateFilter? (newResult, oldResult) => boolean, +}): Result; +``` + +### Arguments (#methods-useStoreMap-config-arguments) + +1. `params` (_Object_): Configuration object + - `store`: Source [store](/en/api/effector/Store) + - `keys` (_Array_): Will be passed to `fn` selector + - `fn` (_(state, keys) => result_): Selector function to receive part of the source store + - `updateFilter` (_(newResult, oldResult) => boolean_): _Optional_ function used to compare old and new updates to prevent unnecessary rerenders. Uses [createStore updateFilter](/en/api/effector/createStore#methods-createStore-defaultState-config-formulae) option under the hood + +### Returns (#methods-useStoreMap-config-returns) + +(`Accessor<Result>`) + +### Examples (#methods-useStoreMap-config-examples) + +This hook is very useful for working with lists, especially large ones. + +```jsx +import { createStore } from "effector"; +import { useUnit, useStoreMap } from "effector-solid"; +import { For } from "solid-js/web"; + +const usersRaw = [ + { + id: 1, + name: "Yung", + }, + { + id: 2, + name: "Lean", + }, + { + id: 3, + name: "Kyoto", + }, + { + id: 4, + name: "Sesh", + }, +]; + +const $users = createStore(usersRaw); +const $ids = createStore(usersRaw.map(({ id }) => id)); + +const User = ({ id }) => { + const user = useStoreMap({ + store: $users, + keys: [id], + fn: (users, [userId]) => users.find(({ id }) => id === userId) ?? null, + }); + + return ( + <div> + <strong>[{user()?.id}]</strong> {user()?.name} + </div> + ); +}; + +const UserList = () => { + const ids = useUnit($ids); + + return <For each={ids()}>{(id) => <User key={id} id={id} />}</For>; +}; +``` diff --git a/src/content/docs/en/api/effector-solid/useUnit.md b/src/content/docs/en/api/effector-solid/useUnit.md new file mode 100644 index 0000000..6701ae9 --- /dev/null +++ b/src/content/docs/en/api/effector-solid/useUnit.md @@ -0,0 +1,175 @@ +--- +title: useUnit +description: Effector Solid +redirectFrom: + - /api/effector-solid/useUnit + - /docs/api/effector-solid/useUnit +--- + +```ts +import { useUnit } from "effector-solid"; +``` + +Binds effector stores to the Solid reactivity system or, in the case of events/effects – binds to current [_scope_](/en/api/effector/Scope) to use in dom event handlers. +Only `effector-solid/scope` version works this way, `useUnit` of `effector-solid` is no-op for events and does not require `Provider` with scope. + +# Methods (#methods) + +## `useUnit(unit)` (#methods-useUnit-unit) + +### Arguments (#methods-useUnit-unit-arguments) + +```ts +useUnit(event: EventCallable<T>): (payload: T) => T; +useUnit(effect: Effect<Params, Done, any>): (payload: Params) => Promise<Done>; +``` + +### Arguments (#methods-useUnit-unit-arguments) + +1. `unit` ([`EventCallable<T>`](/en/api/effector/Event#eventCallable) or [`Effect<Params, Done, Fail>`](/en/api/effector/Effect)): Event or effect which will be bound to current `scope`. + +### Returns (#methods-useUnit-unit-returns) + +(`Function`): Function to pass to event handlers. Will trigger the given unit in the current scope. + +### Example (#methods-useUnit-unit-example) + +A basic Solid component using `useUnit` with events and stores. + +```jsx +import { render } from "solid-js/web"; +import { createEvent, createStore, fork } from "effector"; +import { useUnit, Provider } from "effector-solid"; + +const incremented = createEvent(); +const $count = createStore(0); + +$count.on(incremented, (count) => count + 1); + +const App = () => { + const [count, handleIncrement] = useUnit([$count, incremented]); + + return ( + <> + <p>Count: {count()}</p> + <button onClick={() => handleIncrement()}>Increment</button> + </> + ); +}; + +const scope = fork(); + +render( + () => ( + <Provider value={scope}> + <App /> + </Provider> + ), + document.getElementById("root"), +); +``` + +## `useUnit(store)` (#methods-useUnit-store) + +### Formulae (#methods-useUnit-store-formulae) + +```ts +useUnit($store: Store<State>): Accessor<State>; +``` + +### Arguments (#methods-useUnit-store-arguments) + +1. `$store` effector ([_Store_](/en/api/effector/Store)). + +### Returns (#methods-useUnit-store-returns) + +(`Accessor<State>`) which will subscribe to store state. + +### Example (#methods-useUnit-store-example) + +```jsx +import { createStore, createApi } from "effector"; +import { useUnit } from "effector-solid"; + +const $counter = createStore(0); + +const { incremented, decremented } = createApi($counter, { + incremented: (count) => count + 1, + decremented: (count) => count - 1, +}); + +const App = () => { + const counter = useUnit($counter); + const [handleIncrement, handleDecrement] = useUnit([incremented, decremented]); + + return ( + <div> + {counter()} + <button onClick={incremented}>Increment</button> + <button onClick={decremented}>Decrement</button> + </div> + ); +}; +``` + +## `useUnit(shape)` (#methods-useUnit-shape) + +### Formulae (#methods-useUnit-shape-formulae) + +```ts +useUnit({ a: Store<A>, b: Event<B>, ... }): { a: Accessor<A>, b: (payload: B) => B; ... } + +useUnit([Store<A>, Event<B>, ... ]): [Accessor<A>, (payload: B) => B, ... ] +``` + +### Arguments (#methods-useUnit-shape-arguments) + +1. `shape` Object or array of ([`EventCallable`](/en/api/effector/Event#eventCallable), [`Effect`](/en/api/effector/Effect), or [`Store`](/en/api/effector/Store)): Events, or effects, or stores as accessors which will be bound to the current `scope`. + +### Returns (#methods-useUnit-shape-returns) + +(`Object` or `Array`): + +- If `EventCallable` or `Effect`: functions with the same names or keys as argument to pass to event handlers. Will trigger given unit in current scope _Note: events or effects will be bound **only** if `useUnit` is imported from `effector-solid/scope`_. +- If `Store`: accessor signals which will subscribe to the store state. + +### Examples (#methods-useUnit-shape-examples) + +```jsx +import { render } from "solid-js/web"; +import { createStore, createEvent, fork } from "effector"; +import { useUnit, Provider } from "effector-solid/scope"; + +const incremented = createEvent(); +const decremented = createEvent(); + +const $count = createStore(0) + .on(incremented, (count) => count + 1) + .on(decremented, (count) => count - 1); + +const App = () => { + const count = useUnit($count); + const on = useUnit({ incremented, decremented }); + // or + const [a, b] = useUnit([incremented, decremented]); + + return ( + <> + <p>Count: {count()}</p> + <button onClick={() => on.incremented()}>Increment</button> + <button onClick={() => on.decremented()}>Decrement</button> + </> + ); +}; + +const scope = fork(); + +render( + () => ( + <Provider value={scope}> + <App /> + </Provider> + ), + document.getElementById("root"), +); +``` diff --git a/src/content/docs/en/api/effector-vue/ComponentOptions.md b/src/content/docs/en/api/effector-vue/ComponentOptions.md new file mode 100644 index 0000000..bf09980 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/ComponentOptions.md @@ -0,0 +1,63 @@ +--- +title: ComponentOptions +redirectFrom: + - /api/effector-vue/ComponentOptions + - /docs/api/effector-vue/component-options +--- + +# ComponentOptions (#ComponentOptions) + +## `effector` (#ComponentOptions-effector) + +### Returns (#ComponentOptions-effector-returns) + +(_`Function | Object | Store`_): `Store` or object of `Store`'s, or function which will be called with the Component instance as `this`. + +### Examples (#ComponentOptions-effector-examples) + +#### Basic Usage (#ComponentOptions-effector-examples-basic) + +```js +import Vue from "vue"; +import { createStore, combine } from "effector"; + +const counter = createStore(0); + +new Vue({ + data() { + return { + foo: "bar", + }; + }, + effector() { + // would create `state` in template + return combine( + this.$store(() => this.foo), + counter, + (foo, counter) => `${foo} + ${counter}`, + ); + }, +}); +``` + +#### Using Object Syntax (#ComponentOptions-effector-examples-object) + +```js +import { counter } from "./stores"; + +new Vue({ + effector: { + counter, // would create `counter` in template + }, +}); +``` + +#### Using Store Directly (#ComponentOptions-effector-examples-direct) + +```js +import { counter } from "./stores"; + +new Vue({ + effector: counter, // would create `state` in template +}); +``` diff --git a/src/content/docs/en/api/effector-vue/EffectorScopePlugin.md b/src/content/docs/en/api/effector-vue/EffectorScopePlugin.md new file mode 100644 index 0000000..77a85a4 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/EffectorScopePlugin.md @@ -0,0 +1,34 @@ +--- +title: EffectorScopePlugin +--- + +The Plugin provides a general scope which needs for read and update effector's stores, call effector's events. Required for SSR. + +# Plugins (#plugins) + +## `EffectorScopePlugin({ scope, scopeName })` (#plugins-EffectorScopePlugin-scope-scopeName) + +### Arguments (#plugins-EffectorScopePlugin-scope-scopeName-arguments) + +1. `scope` [Scope](/en/api/effector/Scope) +2. `scopeName?` custom scopeName (default: `root`) + +### Examples (#plugins-EffectorScopePlugin-scope-scopeName-examples) + +#### Basic Usage (#plugins-EffectorScopePlugin-scope-scopeName-examples-basic) + +```js +import { createSSRApp } from "vue"; +import { EffectorScopePlugin } from "effector-vue"; +import { fork } from "effector"; + +const app = createSSRApp(AppComponent); +const scope = fork(); + +app.use( + EffectorScopePlugin({ + scope, + scopeName: "app-scope-name", + }), +); +``` diff --git a/src/content/docs/en/api/effector-vue/Gate.md b/src/content/docs/en/api/effector-vue/Gate.md new file mode 100644 index 0000000..be29294 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/Gate.md @@ -0,0 +1,52 @@ +--- +title: Effector Vue Gate +description: Effector Vue +redirectFrom: + - /api/effector-vue/Gate + - /docs/api/effector-vue/gate +--- + +_Gate_ is a hook for conditional rendering, based on current value (or values) in props. An example of a problem that Gate can solve – you can put together all required data, when component was mounted. + +This allows you to send props back to _Store_ to create feedback loop. + +Gate can be used via [useGate](/en/api/effector-vue/useGate) hook. Gate stores and events can be used in the application as regular units + +Gate can have two states: + +- **Open**, which means mounted +- **Closed**, which means unmounted + +# Gate Properties (#properties) + +## `.state` (#properties-state) + +:::warning{title="Important"} +Do not modify `state` value! It is [derived store](/en/api/effector/Store#readonly) and should be in predictable state. +::: + +`Store<Props>`: [DerivedStore](/en/api/effector/Store#readonly) with current state of the given gate. The state comes from the second argument of [useGate](/en/api/effector-vue/useGate) and from props when rendering gate as a component. + +## `.open` (#properties-open) + +:::info{title="Important"} +Do not manually call this event. It is an event that depends on a Gate state. +::: + +[Event<Props>](/en/api/effector/Event): Event which will be called during gate mounting + +## `.close` (#properties-close) + +:::info{title="Important"} +Do not manually call this event. It is an event that depends on a Gate state. +::: + +[Event<Props>](/en/api/effector/Event): Event which will be called during a gate unmounting. + +## `.status` (#properties-status) + +:::warning{title="Important"} +Do not modify `status` value! It is [derived store](/en/api/effector/Store#readonly) and should be in predictable state. +::: + +`Store<boolean>`: Boolean [DerivedStore](/en/api/effector/Store#readonly), which show if given gate is mounted. diff --git a/src/content/docs/en/api/effector-vue/VueEffector.md b/src/content/docs/en/api/effector-vue/VueEffector.md new file mode 100644 index 0000000..ef34fe2 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/VueEffector.md @@ -0,0 +1,36 @@ +--- +title: VueEffector +description: effector-vue plugin for vue 2 +redirectFrom: + - /api/effector-vue/VueEffector + - /docs/api/effector-vue/vue-effector +--- + +```ts +import { VueEffector } from "effector-vue"; +``` + +`effector-vue` plugin for vue 2 + +# Methods (#methods) + +## `VueEffector(Vue, options?)` (#methods-VueEffector-Vue-options) + +### Arguments (#methods-VueEffector-Vue-options-arguments) + +1. `Vue` (_class Vue_): Vue class +2. `options` (_Object_): Plugin options + - TBD + +### Returns (#methods-VueEffector-Vue-options-returns) + +(_`void`_) + +### Examples (#methods-VueEffector-Vue-options-examples) + +```js +import Vue from "vue"; +import { VueEffector } from "effector-vue"; + +Vue.use(VueEffector); +``` diff --git a/src/content/docs/en/api/effector-vue/VueSSRPlugin.md b/src/content/docs/en/api/effector-vue/VueSSRPlugin.md new file mode 100644 index 0000000..8e88f54 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/VueSSRPlugin.md @@ -0,0 +1,41 @@ +--- +title: VueSSRPlugin +redirectFrom: + - /api/effector-vue/VueSSRPlugin + - /docs/api/effector-vue/VueSSRPlugin +--- + +The Plugin provides a general scope which needs for read and update effector's stores, call effector's events. Required for SSR. + +# Plugins (#plugins) + +## `VueSSRPlugin({ scope, scopeName })` (#plugins-VueSSRPlugin-scope-scopeName) + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) `VueSSRPlugin` is deprecated. Use [`EffectorScopePlugin`](./EffectorScopePlugin) instead. +::: + +## Arguments (#plugins-VueSSRPlugin-scope-scopeName-arguments) + +1. `scope` [Scope](/en/api/effector/Scope) +2. `scopeName?` custom scopeName (default: `root`) + +## Examples (#plugins-VueSSRPlugin-scope-scopeName-examples) + +### Basic usage (#plugins-VueSSRPlugin-scope-scopeName-examples-basicUsage) + +```js +import { createSSRApp } from "vue"; +import { VueSSRPlugin } from "effector-vue/ssr"; +import { fork } from "effector"; + +const app = createSSRApp(AppComponent); +const scope = fork(); + +app.use( + VueSSRPlugin({ + scope, + scopeName: "app-scope-name", + }), +); +``` diff --git a/src/content/docs/en/api/effector-vue/createComponent.md b/src/content/docs/en/api/effector-vue/createComponent.md new file mode 100644 index 0000000..f52b438 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/createComponent.md @@ -0,0 +1,49 @@ +--- +title: createComponent +redirectFrom: + - /api/effector-vue/createComponent +--- + +# Methods (#methods) + +## `createComponent(options, store?)` (#methods-createComponent-options-store) + +### Arguments (#methods-createComponent-options-store-arguments) + +1. `options` (_Object_): component options (hooks, methods, computed properties) +2. `store` (_Object_): Store object from effector + +### Returns (#methods-createComponent-options-store-returns) + +(_`vue component`_) + +### Example (#methods-createComponent-options-store-example) + +```html +<template> {{ $counter }} </template> +``` + +```js +// component.vue +import { createComponent } from "effector-vue"; + +const $counter = createStore(0); +const { update } = createApi($counter, { + update: (_, value: number) => value, +}); + +export default createComponent( + { + name: "Counter", + + methods: { + update, + handleClick() { + const value = this.$counter + 1; // this.$counter <- number ( typescript tips ) + this.update(value); + }, + }, + }, + { $counter }, +); +``` diff --git a/src/content/docs/en/api/effector-vue/createGate.md b/src/content/docs/en/api/effector-vue/createGate.md new file mode 100644 index 0000000..5fb1049 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/createGate.md @@ -0,0 +1,80 @@ +--- +title: createGate +description: Creates a gate to consume data from view. Designed for vue 3 +redirectFrom: + - /api/effector-vue/createGate + - /docs/api/effector-vue/createGate +--- + +Creates a [_Gate_](/apieffector-vue/Gate) to consume data from view, designed for vue 3. If `defaultState` is defined, [Gate.state](/apieffector-vue/Gate#state) will be created with passed value. + +# Methods (#methods) + +## `createGate(config?: {defaultState?, domain?, name?})` (#methods-createGate-config) + +### Arguments (#methods-createGate-config-arguments) + +`config` (_Object_): Optional configuration object + +- `defaultState?`: Optional default state for [Gate.state](/en/api/effector-vue/Gate#state) +- `domain?` ([_Domain_](/en/api/effector/Domain)): Optional domain which will be used to create gate units ([Gate.open](/en/api/effector-vue/Gate#open) event, [Gate.state](/en/api/effector-vue/Gate#state) store, and so on) +- `name?` (_string_): Optional name which will be used as the name of a created Vue component + +### Returns (#methods-createGate-config-returns) + +[_Gate_](/en/api/effector-vue/Gate) + +### Examples (#methods-createGate-config-examples) + +#### Basic Usage (#methods-createGate-config-examples-basic) + +```js +import { createGate, useGate } from "effector-vue/composition"; + +const ListGate = createGate({ + name: "Gate with required props", +}); + +const ListItem = { + template: ` + <div> + {{id}} + </div> + `, + props: { + id: { + type: String, + required: true, + }, + }, + setup(props) { + useGate(ListGate, () => props.id); + }, +}; + +const app = { + template: ` + <div> + <ListItem :id="id" /> + </div> + `, + components: { + ListItem, + }, + setup() { + const id = ref("1"); + return { id }; + }, +}; + +Gate.state.watch((state) => { + console.log("current state", state); +}); +// => current state null + +app.mount("#app"); +// => current state 1 + +app.unmount(); +// => current state null +``` diff --git a/src/content/docs/en/api/effector-vue/index.md b/src/content/docs/en/api/effector-vue/index.md new file mode 100644 index 0000000..d952456 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/index.md @@ -0,0 +1,38 @@ +--- +title: effector-vue +redirectFrom: + - /api/effector-vue + - /docs/api/effector-vue +--- + +Effector binginds for Vue. + +# Top-Level Exports (#top-level-exports) + +- [VueEffector(Vue, options?)](/en/api/effector-vue/VueEffector) +- [createComponent(ComponentOptions, store?)](/en/api/effector-vue/createComponent) +- [EffectorScopePlugin({scope, scopeName?})](/en/api/effector-vue/EffectorScopePlugin) + +# ComponentOptions API (#componentOptions-api) + +- [ComponentOptions\<V\>](/en/api/effector-vue/ComponentOptions) + +# Hooks (#hooks) + +- [useUnit(shape)](/en/api/effector-vue/useUnit) +- [useStore(store)](/en/api/effector-vue/useStore) +- [useStoreMap({store, keys, fn})](/en/api/effector-vue/useStoreMap) +- [useVModel(store)](/en/api/effector-vue/useVModel) + +# Gate API (#gate-api) + +- [Gate](/en/api/effector-vue/Gate) +- [createGate()](/en/api/effector-vue/createGate) +- [useGate(GateComponent, props)](/en/api/effector-vue/useGate) + +# Import map (#import-map) + +Package `effector-vue` provides couple different entry points for different purposes: + +- [effector-vue/composition](/en/api/effector-vue/module/composition) +- [effector-vue/ssr](/en/api/effector-vue/module/ssr) diff --git a/src/content/docs/en/api/effector-vue/module/composition.md b/src/content/docs/en/api/effector-vue/module/composition.md new file mode 100644 index 0000000..b7bc175 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/module/composition.md @@ -0,0 +1,17 @@ +--- +title: effector-vue/composition +description: Separate module of effector-vue that provides additional API for composition API +--- + +```ts +import {} from "effector-vue/composition"; +``` + +Provides additional API for [effector-vue](/en/api/effector-vue) that allows to use [Composition API](https://v3.vuejs.org/guide/composition-api-introduction.html) + +## APIs (#api) + +- [useUnit(shape)](/en/api/effector-vue/useUnit) +- [useStore($store)](/en/api/effector-vue/useStore) +- [useStoreMap({ store, keys, fn })](/en/api/effector-vue/useStoreMap) +- [useVModel($store)](/en/api/effector-vue/useVModel) diff --git a/src/content/docs/en/api/effector-vue/module/ssr.md b/src/content/docs/en/api/effector-vue/module/ssr.md new file mode 100644 index 0000000..6322212 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/module/ssr.md @@ -0,0 +1,19 @@ +--- +title: effector-vue/ssr +description: Deprecated separate module of effector-vue that enforces library to use Scope +--- + +```ts +import {} from "effector-vue/ssr"; +``` + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) the core team recommends using main module of `effector-vue` of `effector-vue/composition` instead. +::: + +Provides additional API for [effector-vue](/en/api/effector-vue) that enforces library to use [Scope](/en/api/effector/scope) + +## APIs + +- [useEvent(event)](../useEvent) +- [VueSSRPlugin](../VueSSRPlugin) diff --git a/src/content/docs/en/api/effector-vue/useEvent.md b/src/content/docs/en/api/effector-vue/useEvent.md new file mode 100644 index 0000000..5a8fb71 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/useEvent.md @@ -0,0 +1,54 @@ +--- +title: useEvent +redirectFrom: + - /api/effector-vue/useEvent + - /docs/api/effector-vue/useEvent +--- + +```ts +import { useEvent } from "effector-vue/ssr"; +``` + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) `useEvent` is deprecated. Use [`useUnit`](./useUnit#useUnit) instead. +::: + +Bind event to current fork instance to use in dom event handlers. Used **only** with ssr, in application without forks `useEvent` will do nothing + +# Methods (#methods) + +## `useEvent(unit)` (#methods-useEvent-unit) + +### Arguments (#methods-useEvent-unit-arguments) + +1. `unit` ([_Event_](/en/api/effector/Event) or [_Effect_](/en/api/effector/Effect)): Event or effect which will be bound to current `scope` + +### Returns (#methods-useEvent-unit-returns) + +(`Function`): Function to pass to event handlers. Will trigger a given unit in current scope + +### Examples (#methods-useEvent-unit-examples) + +#### Basic (#methods-useEvent-unit-examples-basic) + +```js +import { createStore, createEvent } from "effector"; +import { useEvent } from "effector-vue/ssr"; + +const incremented = createEvent(); +const $count = createStore(0); + +$count.on(incremented, (x) => x + 1); + +export default { + setup() { + const counter = useStore($count); + const onIncrement = useEvent(incremented); + + return { + onIncrement, + counter, + }; + }, +}; +``` diff --git a/src/content/docs/en/api/effector-vue/useGate.md b/src/content/docs/en/api/effector-vue/useGate.md new file mode 100644 index 0000000..41bc1a5 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/useGate.md @@ -0,0 +1,30 @@ +--- +title: useGate +description: Using a gate to consume data from view. Designed for vue 3 +redirectFrom: + - /api/effector-vue/useGate + - /docs/api/effector-vue/useGate +--- + +```ts +import { useGate } from "effector-vue/composition"; +``` + +# Methods (#methods) + +## `useGate(Gate, props)` (#methods-useGate-Gate-props) + +Using a [`Gate`](/en/api/effector-vue/Gate) to consume data from view. Designed for Vue 3 + +### Arguments (#methods-useGate-Gate-props-arguments) + +1. `Gate<Props>` ([_Gate_](/en/api/effector-vue/Gate)) +2. `props` (_Props_) + +### Returns (#methods-useGate-Gate-props-returns) + +(_`void`_) + +### Examples (#methods-useGate-Gate-props-examples) + +[See example](/en/api/effector-vue/Gate) diff --git a/src/content/docs/en/api/effector-vue/useStore.md b/src/content/docs/en/api/effector-vue/useStore.md new file mode 100644 index 0000000..babc3bb --- /dev/null +++ b/src/content/docs/en/api/effector-vue/useStore.md @@ -0,0 +1,49 @@ +--- +title: useStore +description: Hook function, which subscribes to watcher, that observes changes in store. Designed for vue 3 +redirectFrom: + - /api/effector-vue/useStore + - /docs/api/effector-vue/useStore +--- + +```ts +import { useStore } from "effector-vue/composition"; +``` + +A hook function, which subscribes to watcher, that observes changes in the current **readonly** store, so when recording results, the component will update automatically. You can mutate the store value **only via [createEvent](/en/api/effector/createEvent)**. Designed for vue 3 + +## `useStore($store)` (#useStore-store) + +### Arguments (#useStore-store-arguments) + +1. `$store` ([`Store<State>`](/en/api/effector/Store)) + +### Returns (#useStore-store-returns) + +(`readonly(State)`) + +### Example (#useStore-store-example) + +```js +import { createStore, createApi } from "effector"; +import { useStore } from "effector-vue/composition"; + +const $counter = createStore(0); + +const { incremented, decremented } = createApi($counter, { + incremented: (count) => count + 1, + decremented: (count) => count - 1, +}); + +export default { + setup() { + const counter = useStore($counter); + + return { + counter, + incremented, + decremented, + }; + }, +}; +``` diff --git a/src/content/docs/en/api/effector-vue/useStoreMap.md b/src/content/docs/en/api/effector-vue/useStoreMap.md new file mode 100644 index 0000000..d50f303 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/useStoreMap.md @@ -0,0 +1,130 @@ +--- +title: useStoreMap +redirectFrom: + - /api/effector-vue/useStoreMap + - /docs/api/effector-vue/useStoreMap +--- + +```ts +import { useStoreMap } from "effector-vue/composition"; +``` + +Function, which subscribes to [store](/en/api/effector/Store) and transforms its value with a given function. Signal will update only when the selector function result will change + +# Methods (#methods) + +## `useStoreMap($store, fn)` (#methods-useStoreMap-store-fn) + +### Formulae (#methods-useStoreMap-store-fn-formulae) + +```ts +useStoreMap( + $store: Store<State>, + fn: (state: State) => Result, +): ComputedRef<Result>; +``` + +### Arguments (#methods-useStoreMap-store-fn-arguments) + +1. `$store`: Source [`Store<State>`](/en/api/effector/Store) +2. `fn` (_(state) => result_): Selector function to receive part of source store + +### Returns (#methods-useStoreMap-store-fn-returns) + +(`ComputedRef<Result>`) + +## `useStoreMap(config)` (#methods-useStoreMap-config) + +### Formulae (#methods-useStoreMap-config-formulae) + +```ts +useStoreMap({ + store: Store<State>, + keys?: () => Keys, + fn: (state: State, keys: Keys) => Result, + defaultValue?: Result, +}): ComputedRef<Result>; +``` + +### Arguments (#methods-useStoreMap-config-arguments) + +1. `params` (_Object_): Configuration object + - `store`: Source [store](/en/api/effector/Store) + - `keys` (`() => Keys`): Will be passed to `fn` selector + - `fn` (`(state: State, keys: Keys) => Result`): Selector function to receive part of source store + - `defaultValue` (`Result`): Optional default value if `fn` returned `undefined` + +### Returns (#methods-useStoreMap-config-returns) + +(`ComputedRef<Result>`) + +### Examples (#methods-useStoreMap-config-examples) + +This hook is very useful for working with lists, especially with large ones + +##### User.vue (#methods-useStoreMap-config-example-userVue) + +```js +import { createStore } from "effector"; +import { useUnit, useStoreMap } from "effector-vue/composition"; + +const $users = createStore([ + { + id: 1, + name: "Yung", + }, + { + id: 2, + name: "Lean", + }, + { + id: 3, + name: "Kyoto", + }, + { + id: 4, + name: "Sesh", + }, +]); + +export default { + props: { + id: Number, + }, + setup(props) { + const user = useStoreMap({ + store: $users, + keys: () => props.id, + fn: (users, userId) => users.find(({ id }) => id === userId), + }); + + return { user }; + }, +}; +``` + +```jsx +<div> + <strong>[{user.id}]</strong> {user.name} +</div> +``` + +##### App.vue (#methods-useStoreMap-config-examples-appVue) + +```js +const $ids = createStore(data.map(({ id }) => id)); + +export default { + setup() { + const ids = useStore($ids); + + return { ids }; + }, +}; +``` + +```jsx +<div> + <User v-for="id in ids" :key="id" :id="id" /> +</div> +``` diff --git a/src/content/docs/en/api/effector-vue/useUnit.md b/src/content/docs/en/api/effector-vue/useUnit.md new file mode 100644 index 0000000..029303a --- /dev/null +++ b/src/content/docs/en/api/effector-vue/useUnit.md @@ -0,0 +1,150 @@ +--- +title: useUnit +description: TDB +redirectFrom: + - /docs/api/effector-vue/useUnit +--- + +```ts +import { useUnit } from "effector-vue/composition"; +``` + +Bind [_Stores_](../effector/Store) to Vue reactivity system or, in the case of [_Events_](../effector/Event)/[_Effects_](../effector/Effect) - bind to current [_Scope_](../effector/Scope) to use in DOM event handlers. + +**Designed for Vue 3 and Composition API exclusively.** + +:::info{title="Future"} +This API can completely replace the following APIs: + +- [useStore($store)](./useStore) +- [useEvent(event)](./useEvent) + +In the future, these APIs can be deprecated and removed. + +::: + +# Methods (#methods) + +## `useUnit(unit)` (#methods-useUnit-unit) + +### Arguments (#methods-useUnit-unit-arguments) + +1. `unit` ([_Event_](../effector/Event) or [_Effect_](../effector/Effect)): Event or effect which will be bound to current [_Scope_](../effector/Scope) + +### Returns (#methods-useUnit-unit-returns) + +(`Function`): Function to pass to event handlers. Will trigger given unit in current scope + +### Examples (#methods-useUnit-unit-examples) + +#### Basic Usage (#methods-useUnit-unit-examples-basic) + +```js +// model.js +import { createEvent, createStore, fork } from "effector"; + +const incremented = createEvent(); +const $count = createStore(0); + +$count.on(incremented, (count) => count + 1); +``` + +```html +// App.vue + +<script setup> + import { useUnit } from "effector-vue/composition"; + + import { incremented, $count } from "./model.js"; + + const onClick = useUnit(incremented); +</script> + +<template> + <button @click="onClick">increment</button> +</template> +``` + +### `useUnit($store)` (#methods-useUnit-store) + +#### Arguments (#methods-useUnit-store-arguments) + +1. `$store` ([_Store_](../effector/Store)): Store which will be bound to Vue reactivity system + +#### Returns (#methods-useUnit-store-returns) + +Reactive value of given [_Store_](../effector/Store) + +#### Examples (#methods-useUnit-store-examples) + +##### Basic Usage (#methods-useUnit-store-examples-basic) + +```js +// model.js +import { createEvent, createStore, fork } from "effector"; + +const incremented = createEvent(); +const $count = createStore(0); + +$count.on(incremented, (count) => count + 1); +``` + +```html +// App.vue + +<script setup> + import { useUnit } from "effector-vue/composition"; + + import { $count } from "./model.js"; + + const count = useUnit($count); +</script> + +<template> + <p>Count: {{ count }}</p> +</template> +``` + +### `useUnit(shape)` (#methods-useUnit-shape) + +#### Arguments (#methods-useUnit-shape-arguments) + +1. `shape` Object or array of ([_Events_](../effector/Event) or [_Effects_](../effector/Effect) or [_Stores_](../effector/Store)): Every unit will be processed by `useUnit` and returned as a reactive value in case of [_Store_](../effector/Store) or as a function to pass to event handlers in case of [_Event_](../effector/Event) or [_Effect_](../effector/Effect). + +#### Returns (#methods-useUnit-shape-returns) + +(Object or Array): + +- if [_Event_](../effector/Event) or [_Effect_](../effector/Effect): functions with the same names or keys as argument to pass to event handlers. Will trigger given unit in current [_Scope_](../effector/Scope). +- if [_Store_](../effector/Store): reactive value of given [_Store_](../effector/Store) with the same names or keys as argument. + +#### Examples (#methods-useUnit-shape-examples) + +##### Basic Usage (#methods-useUnit-shape-examples-basic) + +```js +// model.js +import { createEvent, createStore, fork } from "effector"; + +const incremented = createEvent(); +const $count = createStore(0); + +$count.on(incremented, (count) => count + 1); +``` + +```html +// App.vue + +<script setup> + import { useUnit } from "effector-vue/composition"; + + import { $count, incremented } from "./model.js"; + + const { count, handleClick } = useUnit({ count: $count, handleClick: incremented }); +</script> + +<template> + <p>Count: {{ count }}</p> + <button @click="handleClick">increment</button> +</template> +``` diff --git a/src/content/docs/en/api/effector-vue/useVModel.md b/src/content/docs/en/api/effector-vue/useVModel.md new file mode 100644 index 0000000..fd949c4 --- /dev/null +++ b/src/content/docs/en/api/effector-vue/useVModel.md @@ -0,0 +1,108 @@ +--- +title: useVModel +description: hook function, which subscribes to watcher, that observes changes in the current store. Designed for vue 3 +redirectFrom: + - /api/effector-vue/useVModel + - /docs/api/effector-vue/useVModel +--- + +```ts +import { useVModel } from "effector-vue/composition"; +``` + +A hook function, which subscribes to a watcher that observes changes in the current store, so when recording results, the component will automatically update. It is primarily used when working with forms (`v-model`) in Vue 3. + +# Methods (#methods) + +## `useVModel($store)` (#methods-useVModel-store) + +### Formulae (#methods-useVModel-store-formulae) + +```ts +useVModel($store: Store<State>): Ref<UnwrapRef<State>>; +``` + +Designed for Vue 3. + +### Arguments (#methods-useVModel-store-arguments) + +1. `$store` ([_Store_](/en/api/effector/Store)) +2. `shape of Stores` ([_Store_](/en/api/effector/Store)) + +### Returns (#methods-useVModel-store-returns) + +(`State`) + +### Examples (#methods-useVModel-examples) + +#### Single Store (#methods-useVModel-examples-singleStore) + +```js +import { createStore, createApi } from "effector"; +import { useVModel } from "effector-vue/composition"; + +const $user = createStore({ + name: "", + surname: "", + skills: ["CSS", "HTML"], +}); + +export default { + setup() { + const user = useVModel($user); + + return { user }; + }, +}; +``` + +```html +<div id="app"> + <input type="text" v-model="user.name" /> + <input type="text" v-model="user.surname" /> + + <div> + <input type="checkbox" v-model="user.skills" value="HTML" /> + <input type="checkbox" v-model="user.skills" value="CSS" /> + <input type="checkbox" v-model="user.skills" value="JS" /> + </div> +</div> +``` + +#### Store Shape (#methods-useVModel-examples-storeShape) + +```js +import { createStore, createApi } from "effector"; +import { useVModel } from "effector-vue/composition"; + +const $name = createStore(""); +const $surname = createStore(""); +const $skills = createStore([]); + +const model = { + name: $name, + surname: $surname, + skills: $skills, +}; + +export default { + setup() { + const user = useVModel(model); + + return { user }; + }, +}; +``` + +```html +<div id="app"> + <input type="text" v-model="user.name" /> + <input type="text" v-model="user.surname" /> + + <div> + <input type="checkbox" v-model="user.skills" value="HTML" /> + <input type="checkbox" v-model="user.skills" value="CSS" /> + <input type="checkbox" v-model="user.skills" value="JS" /> + </div> +</div> +``` diff --git a/src/content/docs/en/api/effector/Domain.md b/src/content/docs/en/api/effector/Domain.md new file mode 100644 index 0000000..e22026e --- /dev/null +++ b/src/content/docs/en/api/effector/Domain.md @@ -0,0 +1,299 @@ +--- +title: Domain +description: Domain, its methods and properties +redirectFrom: + - /api/effector/Domain + - /docs/api/effector/domain +--- + +```ts +import { type Domain } from "effector"; +``` + +Domain is a namespace for your events, stores and effects. + +Domain can subscribe to event, effect, store or nested domain creation with `onCreateEvent`, `onCreateStore`, `onCreateEffect`, `onCreateDomain` methods. + +It is useful for logging or other side effects. + +# Unit creators (#unit-creators) + +:::info{title="since"} +[effector 20.7.0](https://changelog.effector.dev/#effector-20-7-0) +::: + +## `createEvent(name?)` (#unit-creators-createEvent-name) + +### Arguments (#unit-creators-createEvent-name-arguments) + +1. `name`? (_string_): event name + +### Returns (#unit-creators-createEvent-name-returns) + +[_Event_](/en/api/effector/Event): New event + +## `createEffect(handler?)` (#unit-creators-createEffect-handler) + +Creates an [effect](/en/api/effector/Effect) with given handler. + +### Arguments (#unit-creators-createEffect-handler-arguments) + +1. `handler`? (_Function_): function to handle effect calls, also can be set with [use(handler)](#use) + +### Returns (#unit-creators-createEffect-handler-returns) + +[_Effect_](/en/api/effector/Effect): A container for async function. + +:::info{title="since"} +[effector 21.3.0](https://changelog.effector.dev/#effector-21-3-0) +::: + +## `createEffect(name?)` (#unit-creators-createEffect-name) + +### Arguments (#unit-creators-createEffect-name-arguments) + +1. `name`? (_string_): effect name + +### Returns (#unit-creators-createEffect-name-returns) + +[_Effect_](/en/api/effector/Effect): A container for async function. + +## `createStore(defaultState)` (#unit-creators-createStore-defaultState) + +### Arguments (#unit-creators-createStore-defaultState-arguments) + +1. `defaultState` (_State_): store default state + +### Returns (#unit-creators-createStore-defaultState-returns) + +[_Store_](/en/api/effector/Store): New store + +## `createDomain(name?)` (#unit-creators-createDomain-name) + +### Arguments (#unit-creators-createDomain-name-arguments) + +1. `name`? (_string_): domain name + +### Returns (#unit-creators-createDomain-name-returns) + +[_Domain_](/en/api/effector/Domain): New domain + +## Aliases (#unit-creators-aliases) + +### `event(name?)` (#unit-creators-aliases-event-name) + +An alias for [domain.createEvent](/en/api/effector/Domain#createevent-name) + +### `effect(name?)` (#unit-creators-aliases-effect-name) + +An alias for [domain.createEffect](/en/api/effector/Domain#createeffect-name) + +### `store(defaultState)` (#unit-creators-aliases-store-defaultState) + +An alias for [domain.createStore](/en/api/effector/Domain#createstore-defaultstate) + +### `domain(name?)` (#unit-creators-aliases-domain-name) + +An alias for [domain.createDomain](/en/api/effector/Domain#createdomain-name) + +# Domain Properties (#properties) + +## `.history` (#unit-creators-history) + +Contains mutable read-only sets of units inside a domain. + +:::info{title="since"} +[effector 20.3.0](https://changelog.effector.dev/#effector-20-3-0) +::: + +### Formulae (#unit-creators-history-formulae) + +```ts +interface DomainHistory { + stores: Set<Store<any>>; + events: Set<Event<any>>; + domains: Set<Domain>; + effects: Set<Effect<any, any, any>>; +} + +const { stores, events, domains, effects } = domain.history; +``` + +When any kind of unit created inside a domain, it appears in a set with the name of type(stores, events, domains, effects) in the same order as created. + +### Examples (#unit-creators-history-examples) + +#### Basic (#unit-creators-history-examples-basic) + +```js +import { createDomain } from "effector"; +const domain = createDomain(); +const eventA = domain.event(); +const $storeB = domain.store(0); +console.log(domain.history); +// => {stores: Set{storeB}, events: Set{eventA}, domains: Set, effects: Set} +``` + +[Try it](https://share.effector.dev/flIV7Fja) + +# Domain hooks (#domain-hooks) + +## `onCreateEvent(callback)` (#domain-hooks-onCreateEvent-callback) + +### Formulae (#domain-hooks-onCreateEvent-callback-formulae) + +```ts +domain.onCreateEvent((event: Event<any>) => {}); +``` + +- Function passed to `onCreateEvent` called every time, as new event created in `domain` +- Function called with `event` as first argument +- The result of function call is ignored + +### Arguments (#domain-hooks-onCreateEvent-callback-arguments) + +1. `callback` ([_Watcher_]): A function that receives [Event](/en/api/effector/Event) and will be called during every [domain.createEvent](/en/api/effector/Domain#unit-creators-createEvent-name) call + +### Returns (#domain-hooks-onCreateEvent-callback-returns) + +[_Subscription_]: Unsubscribe function. + +### Example (#domain-hooks-onCreateEvent-callback-example) + +```js +import { createDomain } from "effector"; + +const domain = createDomain(); + +domain.onCreateEvent((event) => { + console.log("new event created"); +}); + +const a = domain.createEvent(); +// => new event created + +const b = domain.createEvent(); +// => new event created +``` + +[Try it](https://share.effector.dev/QCQpga6u) + +## `onCreateEffect(callback)` (#domain-hooks-onCreateEffect-callback) + +### Formulae (#domain-hooks-onCreateEffect-callback-formulae) + +```ts +domain.onCreateEffect((effect: Effect<any, any, any>) => {}); +``` + +- Function passed to `onCreateEffect` called every time, as new effect created in `domain` +- Function called with `effect` as first argument +- The result of function call is ignored + +### Arguments (#domain-hooks-onCreateEffect-callback-arguments) + +1. `callback` ([_Watcher_]): A function that receives [Effect](/en/api/effector/Effect) and will be called during every [domain.createEffect](/en/api/effector/Domain#unit-creators-createEffect-handler) call + +### Returns (#domain-hooks-onCreateEffect-callback-returns) + +[_Subscription_]: Unsubscribe function. + +### Example (#domain-hooks-onCreateEffect-callback-example) + +```js +import { createDomain } from "effector"; + +const domain = createDomain(); + +domain.onCreateEffect((effect) => { + console.log("new effect created"); +}); + +const fooFx = domain.createEffect(); +// => new effect created + +const barFx = domain.createEffect(); +// => new effect created +``` + +[Try it](https://share.effector.dev/uT6f8vv9) + +## `onCreateStore(callback)` (#domain-hooks-onCreateStore-callback) + +### Formulae (#domain-hooks-onCreateStore-callback-formulae) + +```ts +domain.onCreateStore(($store: Store<any>) => {}); +``` + +- Function passed to `onCreateStore` called every time, as new store created in `domain` +- Function called with `$store` as first argument +- The result of function call is ignored + +### Arguments (#domain-hooks-onCreateStore-callback-arguments) + +1. `callback` ([_Watcher_]): A function that receives [Store](/en/api/effector/Store) and will be called during every [domain.createStore](/en/api/effector/Domain#unit-creators-createStore-defaultState) call + +### Returns (#domain-hooks-onCreateStore-callback-returns) + +[_Subscription_]: Unsubscribe function. + +### Example (#domain-hooks-onCreateStore-callback-example) + +```js +import { createDomain } from "effector"; + +const domain = createDomain(); + +domain.onCreateStore((store) => { + console.log("new store created"); +}); + +const $a = domain.createStore(null); +// => new store created +``` + +[Try it](https://share.effector.dev/OGlYOtfz) + +## `onCreateDomain(callback)` (#domain-hooks-onCreateDomain-callback) + +### Formulae (#domain-hooks-onCreateDomain-callback-formulae) + +```ts +domain.onCreateDomain((domain) => {}); +``` + +- Function passed to `onCreateDomain` called every time, as subdomain created in `domain` +- Function called with `domain` as first argument +- The result of function call is ignored + +### Arguments (#domain-hooks-onCreateDomain-callback-arguments) + +1. `callback` ([_Watcher_]): A function that receives [Domain](/en/api/effector/Domain) and will be called during every [domain.createDomain](/en/api/effector/Domain#unit-creators-createDomain-name) call + +### Returns (#domain-hooks-onCreateDomain-callback-returns) + +[_Subscription_]: Unsubscribe function. + +### Example (#domain-hooks-onCreateDomain-callback-example) + +```js +import { createDomain } from "effector"; + +const domain = createDomain(); + +domain.onCreateDomain((domain) => { + console.log("new domain created"); +}); + +const a = domain.createDomain(); +// => new domain created + +const b = domain.createDomain(); +// => new domain created +``` + +[Try it](https://share.effector.dev/dvBLiwHf) + +[_watcher_]: /en/explanation/glossary#watcher +[_subscription_]: /en/explanation/glossary#subscription diff --git a/src/content/docs/en/api/effector/Effect.md b/src/content/docs/en/api/effector/Effect.md new file mode 100644 index 0000000..6d1c936 --- /dev/null +++ b/src/content/docs/en/api/effector/Effect.md @@ -0,0 +1,583 @@ +--- +title: Effect +description: Effect, its methods and properties +redirectFrom: + - /api/effector/Effect + - /docs/api/effector/effect +--- + +```ts +import { type Effect } from "effector"; +``` + +**Effect** is a container for async function or any throwing function. + +It can be safely used in place of the original async function. + +# Methods (#methods) + +## `.use(handler)` (#methods-use-handler) + +Provides a function, which will be called when the effect is triggered. + +### Formulae (#methods-use-handler-formulae) + +```ts +effect.use(fn); +``` + +- Set handler `fn` for `effect` +- If effect already had an implementation at the time of the call, it will be replaced by a new one + +> Hint: current handler can be extracted with [effect.use.getCurrent()](#methods-use-getCurrent). + +You must provide a handler either through [.use](#methods-use-handler) method or `handler` property in [createEffect](/en/api/effector/createEffect), otherwise effect will throw with `no handler used in _%effect name%_` error when effect will be called. + +:::tip{title="See also"} +[Testing api calls with effects and stores](https://www.patreon.com/posts/testing-api-with-32415095) +::: + +### Arguments (#methods-use-handler-arguments) + +1. `handler` (_Function_): Function, that receives the first argument passed to an effect call. + +### Returns (#methods-use-handler-returns) + +([_Effect_](/en/api/effector/Effect)): The same effect + +### Examples (#methods-use-handler-examples) + +```js +const fetchUserReposFx = createEffect(); + +fetchUserReposFx.use(async (params) => { + console.log("fetchUserReposFx called with", params); + + const url = `https://api.github.com/users/${params.name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +fetchUserReposFx({ name: "zerobias" }); +// => fetchUserRepos called with {name: 'zerobias'} +``` + +[Try it](https://share.effector.dev/TlYuDeve) + +## `.use.getCurrent()` (#methods-use-getCurrent) + +Returns current handler of effect. Useful for testing. + +### Formulae (#methods-use-getCurrent-formulae) + +```ts +fn = effect.use.getCurrent(); +``` + +- Returns current handler `fn` for `effect` +- If no handler was assigned to `effect`, default handler will be returned ([that throws an error](https://share.effector.dev/8PBjt3TL)) + +> Hint: to set a new handler use [effect.use(handler)](#methods-use-handler) + +### Returns (#methods-use-getCurrent-returns) + +(_Function_): Current handler, defined by `handler` property or via `.use` call. + +### Examples (#methods-use-getCurrent-examples) + +```js +const handlerA = () => "A"; +const handlerB = () => "B"; + +const fx = createEffect(handlerA); + +console.log(fx.use.getCurrent() === handlerA); +// => true + +fx.use(handlerB); +console.log(fx.use.getCurrent() === handlerB); +// => true +``` + +[Try it](https://share.effector.dev/CM6hgtOM) + +## `.watch(watcher)` (#methods-watch-watcher) + +Subscribe to effect calls. + +### Formulae (#methods-watch-watcher-formulae) + +```ts +const unwatch = effect.watch(watcher); +``` + +- Call `watcher` on each `effect` call, pass payload of `effect` as argument to `watcher` +- When `unwatch` is called, stop calling `watcher` + +### Arguments (#methods-watch-watcher-arguments) + +1. `watcher` ([_Watcher_](/en/explanation/glossary#watcher)): A function that receives `payload`. + +### Returns (#methods-watch-watcher-returns) + +[_Subscription_](/en/explanation/glossary#subscription): Unsubscribe function. + +### Examples (#methods-watch-watcher-examples) + +```js +import { createEffect } from "effector"; + +const fx = createEffect((params) => params); + +fx.watch((params) => { + console.log("effect called with value", params); +}); + +await fx(10); +// => effect called with value 10 +``` + +[Try it](https://share.effector.dev/VN1ef0TZ) + +## `.prepend(fn)` (#methods-prepend-fn) + +Creates an event, upon trigger it sends transformed data into the source event. +Works kind of like reverse `.map`. +In case of `.prepend` data transforms **before the original event occurs** and in the case of `.map`, data transforms **after original event occurred**. + +### Formulae (#methods-prepend-fn-formulae) + +```ts +const event = effect.prepend(fn); +``` + +- When `event` is triggered, call `fn` with payload from `event`, then trigger `effect` with the result of `fn()` +- `event` will have `EventCallable<T>` type, so can be used as `target` in methods like `sample()` + +### Arguments (#methods-prepend-fn-arguments) + +1. `fn` (_Function_): A function that receives `payload`, [should be **pure**](/en/explanation/glossary#purity). + +### Returns (#methods-prepend-fn-returns) + +[_Event_](/en/api/effector/Event): New event. + +## `.map(fn)` (#methods-map-fn) + +Creates a new event, which will be called after the original effect is called, applying the result of a `fn` as a payload. It is a special function which allows you to decompose dataflow, extract or transform data. + +### Formulae (#methods-map-fn-formulae) + +```ts +const second = first.map(fn); +``` + +- When `first` is triggered, pass payload from `first` to `fn` +- Trigger `second` with the result of the `fn()` call as payload +- `second` event will have `Event<T>` type, so it CAN NOT be used as `target` in methods like `sample()` + +### Arguments (#methods-map-fn-arguments) + +1. `fn` (_Function_): A function that receives `payload`, [should be **pure**](/en/explanation/glossary#purity). + +### Returns (#methods-map-fn-returns) + +[_Event_](/en/api/effector/Event): New event. + +### Examples (#methods-map-fn-examples) + +```js +import { createEffect } from "effector"; + +const userUpdate = createEffect(({ name, role }) => { + console.log(name, role); +}); +const userNameUpdated = userUpdate.map(({ name }) => name); // you may decompose dataflow with .map() method +const userRoleUpdated = userUpdate.map(({ role }) => role.toUpperCase()); // either way you can transform data + +userNameUpdated.watch((name) => console.log(`User's name is [${name}] now`)); +userRoleUpdated.watch((role) => console.log(`User's role is [${role}] now`)); + +await userUpdate({ name: "john", role: "admin" }); +// => User's name is [john] now +// => User's role is [ADMIN] now +// => john admin +``` + +[Try it](https://share.effector.dev/MmBBKXZe) + +# Properties (#properties) + +You are not supposed to use parts of effect (like `.done` and `.pending`) as a `target` in [sample](/en/api/effector/sample) (even though they are events and stores), since effect is a complete entity on its own. This behavior will not be supported. + +In the examples below constant `effect` has this signature: + +```ts +effect: Effect<Params, Done, Fail>; +``` + +## `.done` Event (#properties-done) + +[_Event_](/en/api/effector/Event), which is triggered when _handler_ is _resolved_. + +:::warning{title="Important"} +Do not manually call this event. It is an event that depends on effect. +::: + +### Formulae (#properties-done-formulae) + +```ts +effect.done: Event<{ params: Params; done: Done }>; +``` + +### Properties (#properties-done-properties) + +Event triggered with an object of `params` and `result`: + +1. `params` (_Params_): An argument passed to the effect call +2. `result` (_Done_): A result of the resolved handler + +### Examples (#properties-done-examples) + +```js +import { createEffect } from "effector"; + +const fx = createEffect((value) => value + 1); + +fx.done.watch(({ params, result }) => { + console.log("Call with params", params, "resolved with value", result); +}); + +await fx(2); +// => Call with params 2 resolved with value 3 +``` + +[Try it](https://share.effector.dev/VogsNaDn) + +## `.doneData` Event (#properties-doneData) + +:::info{title="since"} +[effector 20.12.0](https://changelog.effector.dev/#effector-20-12-0) +::: + +Event, which is triggered by the result of the effect execution. + +:::warning{title="Important"} +Do not manually call this event. It is an event that depends on the effect. +::: + +### Formulae (#properties-doneData-formulae) + +```ts +effect.doneData: Event<Done>; +``` + +- `doneData` is an event, that triggered when `effect` is successfully resolved with `result` from [.done](#properties-done) + +[_Event_](/en/api/effector/Event) triggered when _handler_ is _resolved_. + +### Examples (#properties-doneData-examples) + +```js +import { createEffect } from "effector"; + +const fx = createEffect((value) => value + 1); + +fx.doneData.watch((result) => { + console.log(`Effect was successfully resolved, returning ${result}`); +}); + +await fx(2); +// => Effect was successfully resolved, returning 3 +``` + +[Try it](https://share.effector.dev/rNesMDtw) + +## `.fail` Event (#properties-fail) + +[_Event_](/en/api/effector/Event), which is triggered when handler is rejected or throws error. + +:::warning{title="Important"} +Do not manually call this event. It is an event that depends on effect. +::: + +### Formulae (#properties-fail-formulae) + +```ts +effect.fail: Event<{ params: Params; error: Fail }>; +``` + +### Properties (#properties-fail-properties) + +Event triggered with an object of `params` and `error`: + +1. `params` (_Params_): An argument passed to effect call +2. `error` (_Fail_): An error caught from the handler + +### Examples (#properties-fail-examples) + +```js +import { createEffect } from "effector"; + +const fx = createEffect(async (value) => { + throw Error(value - 1); +}); + +fx.fail.watch(({ params, error }) => { + console.log("Call with params", params, "rejected with error", error.message); +}); + +fx(2); +// => Call with params 2 rejected with error 1 +``` + +[Try it](https://share.effector.dev/hCPCHQ5N) + +## `.failData` Event (#properties-failData) + +:::info{title="since"} +[effector 20.12.0](https://changelog.effector.dev/#effector-20-12-0) +::: + +Event, which is triggered with error thrown by the effect. + +:::warning{title="Important"} +Do not manually call this event. It is an event that depends on effect. +::: + +### Formulae (#properties-failData-formulae) + +```ts +effect.failData: Event<Fail>; +``` + +- `failData` is an event, that triggered when `effect` is rejected with `error` from [.fail](#properties-fail) + +[_Event_](/en/api/effector/Event) triggered when handler is rejected or throws error. + +### Examples (#properties-failData-examples) + +```js +import { createEffect } from "effector"; + +const fx = createEffect(async (value) => { + throw Error(value - 1); +}); + +fx.failData.watch((error) => { + console.log(`Execution failed with error ${error.message}`); +}); + +fx(2); +// => Execution failed with error 1 +``` + +[Try it](https://share.effector.dev/rNU3tqEx) + +## `.finally` Event (#properties-finally) + +:::info{title="since"} +[effector 20.0.0](https://changelog.effector.dev/#effector-20-0-0) +::: + +Event, which is triggered when handler is resolved, rejected or throws error. + +:::warning{title="Important"} +Do not manually call this event. It is an event that depends on effect. +::: + +### Properties (#properties-finally-properties) + +```ts +type Success = { status: 'done'; params: Params; result: Done } +type Failure = { status: 'fail'; params: Params; error: Fail } + +effect.finally: Event<Success | Failure>; +``` + +### Properties (#properties-finally-properties) + +[_Event_](/en/api/effector/Event), which is triggered with an object of `status`, `params` and `error` or `result`: + +1. `status` (_string_): A status of effect (`done` or `fail`) +2. `params` (_Params_): An argument passed to effect call +3. `error` (_Fail_): An error caught from the handler +4. `result` (_Done_): A result of the resolved handler + +### Examples (#properties-finally-examples) + +```js +import { createEffect } from "effector"; + +const fetchApiFx = createEffect(async ({ time, ok }) => { + await new Promise((resolve) => setTimeout(resolve, time)); + if (ok) return `${time} ms`; + throw Error(`${time} ms`); +}); + +fetchApiFx.finally.watch((value) => { + switch (value.status) { + case "done": + console.log("Call with params", value.params, "resolved with value", value.result); + break; + case "fail": + console.log("Call with params", value.params, "rejected with error", value.error.message); + break; + } +}); + +await fetchApiFx({ time: 100, ok: true }); +// => Call with params {time: 100, ok: true} +// resolved with value 100 ms + +fetchApiFx({ time: 100, ok: false }); +// => Call with params {time: 100, ok: false} +// rejected with error 100 ms +``` + +[Try it](https://share.effector.dev/f90vETOc) + +## `.pending` Store (#properties-pending) + +Store contains `true` when effect is called but not resolved yet. Useful to show loaders. + +:::warning{title="Important"} +Do not modify store value! It is [derived store](/en/api/effector/Store#readonly) and should be in predictable state. +::: + +### Formulae (#properties-pending-formulae) + +```ts +effect.pending: Store<boolean>; +``` + +- [Store](/en/api/effector/Store) will update when `done` or `fail` are triggered +- [Store](/en/api/effector/Store) contains `true` value until the effect is resolved or rejected + +### Returns (#properties-pending-returns) + +[_DerivedStore_](/en/api/effector/Store#readonly): Store that represents current state of the effect + +### Examples (#properties-pending-examples) + +```jsx +import React from "react"; +import ReactDOM from "react-dom"; +import { createEffect } from "effector"; +import { useUnit } from "effector-react"; + +const fetchApiFx = createEffect((ms) => new Promise((resolve) => setTimeout(resolve, ms))); + +fetchApiFx.pending.watch(console.log); + +const Loading = () => { + const loading = useUnit(fetchApiFx.pending); + + return <div>{loading ? "Loading..." : "Load complete"}</div>; +}; + +ReactDOM.render(<Loading />, document.getElementById("root")); + +fetchApiFx(3000); +``` + +[Try it](https://share.effector.dev/wDMQKqhl) + +It's property is a shorthand for common use case: + +```js +import { createEffect, createStore } from "effector"; + +const fetchApiFx = createEffect(); + +// now you can use fetchApiFx.pending instead +const $isLoading = createStore(false) + .on(fetchApiFx, () => true) + .on(fetchApiFx.done, () => false) + .on(fetchApiFx.fail, () => false); +``` + +## `.inFlight` Store (#properties-inFlight) + +:::info{title="since"} +[effector 20.11.0](https://changelog.effector.dev/#effector-20-11-0) +::: + +Shows how many effect calls aren't settled yet. Useful for rate limiting. + +:::warning{title="Important"} +Do not modify `$count` value! It is [derived store](/en/api/effector/Store#readonly) and should be in predictable state. +::: + +### Formulae (#properties-inFlight-formulae) + +```ts +effect.inFlight: Store<number>; +``` + +- The [store](/en/api/effector/Store) will be `0` if no calls of `effect` in pending state, its default state +- On each call of `effect` state in the store will be increased +- When effect resolves to any state(done or fail) state in the store will be decreased + +### Returns (#properties-inFlight-returns) + +[_DerivedStore_](/en/api/effector/Store#readonly): Store that represents count of the running effects + +### Examples (#properties-inFlight-examples) + +```js +import { createEffect } from "effector"; + +const fx = createEffect(() => new Promise((rs) => setTimeout(rs, 500))); + +fx.inFlight.watch((amount) => { + console.log("in-flight requests:", amount); +}); +// => 0 + +const req1 = fx(); +// => 1 + +const req2 = fx(); +// => 2 + +await Promise.all([req1, req2]); + +// => 1 +// => 0 +``` + +[Try it](https://share.effector.dev/XsM8fZXa) + +# Types (#types) + +```ts +import { type EffectParams, type EffectResult, type EffectError } from "effector"; +``` + +## `EffectParams<FX>` (#types-EffectParams) + +Allows to extract type of Params from `effect`. + +```ts +const effect: Effect<Params, Done, Fail>; +type Params = EffectParams<typeof effect>; +``` + +## `EffectResult<FX>` (#types-EffectResult) + +Allows to extract type of result from `effect`. + +```ts +const effect: Effect<Params, Done, Fail>; +type Done = EffectResult<typeof effect>; +``` + +## `EffectError<FX>` (#types-EffectError) + +Allows to extract type of error from `effect`. + +```ts +const effect: Effect<Params, Done, Fail>; +type Fail = EffectError<typeof effect>; +``` diff --git a/src/content/docs/en/api/effector/Event.md b/src/content/docs/en/api/effector/Event.md new file mode 100644 index 0000000..2cc25ae --- /dev/null +++ b/src/content/docs/en/api/effector/Event.md @@ -0,0 +1,893 @@ +--- +title: Event +keywords: + - event + - unit +description: Event, its methods and properties +redirectFrom: + - /api/effector/Event + - /docs/api/effector/event +--- + +```ts +import { type Event, type EventCallable } from "effector"; +``` + +The **Event** in effector represents a user action, a step in the application process, a command to execute, or an intention to make modifications, among other things. +This unit is designed to be a carrier of information/intention/state within the application, not the holder of a state. + +# `EventCallable<T>` (#eventCallable) + +## Construction (#eventCallable-construction) + +There are many ways to create an event: + +- The most common [`createEvent`](/en/api/effector/createEvent) +- Using [Domain `createEvent`](/en/api/effector/Domain#unit-creators-createEvent-name) +- Via [Event's methods](#eventCallable-methods) and it's supertype [EventCallable's methods](#eventCallable-methods) +- Some [Effect's methods](/en/api/effector/Effect#methods) return new events and readonly events +- Operators such as: [`createApi`](/en/api/effector/createApi) + +### Declaring types (#eventCallable-declaringTypes) + +Event carries some data and in a TypeScript ecosystem each data should have a defined type. When an event is explicitly created by [`createEvent`](/en/api/effector/createEvent), type of the argument must be provided as a Generic type argument: + +```ts +import { createEvent } from "effector"; + +interface ItemAdded { + id: string; + title: string; +} + +const itemAdded = createEvent<ItemAdded>(); +``` + +In most cases, there is no reason to use `void` with another type (~~`Event<void | number>`~~). Use `void` only to declare the Event or EventCallable without the argument at all. That's why it is possible to send data from an event with an argument into an event without an argument. + +```ts +sample({ + clock: withData, // Event<number> + target: withoutData, // Event<void> +}); +``` + +We **strongly recommend** using `null` for empty values when intended: + +```ts +import { createEvent } from "effector"; + +const maybeDataReceived = createEvent<Data | null>(); +// maybeDataReceived: EventCallable<Data | null> +``` + +[Read more in the explanation section](/en/explanation/events#typescript). + +## Call as function `event(argument)` (#eventCallable-call-argument) + +Initiates an event with the provided argument, which in turn activates any registered subscribers. + +[Read more in the explanation section](/en/explanation/events#event-calling). + +### Formulae (#eventCallable-call-argument-formulae) + +```ts +const event: EventCallable<T>; +event(argument: T): T; +``` + +- `event` called as a function always returns its `argument` as is +- all subscribers of event receives the `argument` passed into +- when `T` is `void`, `event` can be called without arguments +- `T` by default is `void`, so generic type argument can be omitted + +:::warning{title="Important"} + +In Effector, any event supports only **a single argument**. +It is not possible to call an event with two or more arguments, as in `someEvent(first, second)`. + +All arguments beyond the first will be ignored. +The core team has implemented this rule for specific reasons related to the design and functionality. +::: + +### Arguments (#eventCallable-call-argument-arguments) + +1. `argument` is a value of `T`. It's optional if the event is defined as `EventCallable<void>`. + +### Throws (#eventCallable-call-argument-throws) + +#### call of readonly event is not supported, use createEvent instead (#eventCallable-call-argument-throws-call-of-readonly-event) + +:::info{title="since"} +[effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0-spacewatch) +::: + +When user tried to call `Event`. In the most cases it happens when you tried to call derived event: + +```ts +const numberReceived = createEvent<number>(); // EventCallable<number> +const stringifiedReceived = numberReceived.map((number) => String(number)); // Event<string> + +stringifiedReceived("123"); // THROWS! +``` + +The same for all methods returning `Event`. + +To fix it create separate event via `createEvent`, and connect them by `sample`: + +```ts +const numberReceived = createEvent<number>(); +const stringifiedReceived = createEvent<string>(); + +sample({ + clock: numberReceived, + fn: (number) => String(number), + target: stringifiedReceived, +}); + +stringifiedReceived("123"); // OK +``` + +#### unit call from pure function is not supported, use operators like sample instead (#eventCallable-call-argument-throws-unit-call-from-pure) + +:::info{title="since"} +[effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0-spacewatch) +::: + +Happens when events or effects called from [pure functions](/en/glossary#purity), like mappers: + +```ts +const someHappened = createEvent<number>(); +const another = createEvent(); + +const derived = someHappened.map((number) => { + another(); // THROWS! + return String(number); +}); +``` + +To fix this, use `sample`: + +```ts +const someHappened = createEvent<number>(); +const another = createEvent(); +const derived = createEvent<string>(); + +sample({ + clock: someHappened, + target: another, +}); + +// The same as .map(), but using `target` +sample({ + clock: someHappened, + fn: (number) => String(number), + target: derived, +}); +``` + +### Returns (#eventCallable-call-argument-returns) + +`T`: Represents the same value that is passed into the `event`. + +### Types (#eventCallable-call-argument-types) + +```ts +import { createEvent, Event } from "effector"; + +const someHappened = createEvent<number>(); +// someHappened: EventCallable<number> +someHappened(1); + +const anotherHappened = createEvent(); +// anotherHappened: EventCallable<void> +anotherHappened(); +``` + +An event can be specified with a single generic type argument. By default, this argument is set to void, indicating that the event does not accept any parameters. + +## Methods (#eventCallable-methods) + +Since the `createEvent` factory creates `EventCallable` for you, its methods will be described first, even though it is a extension of the `Event` type. + +All the methods and properties from [Event](#event-methods) are also available on `EventCallable` instance. + +:::tip +You can think of the EventCallable and Event as type and its super type: + +`EventCallable<T> extends Event<T>` +::: + +### `.prepend(fn)` (#eventCallable-methods-prepend-fn) + +Creates a new `EventCallable`, that should be called, upon trigger it sends transformed data into the original event. + +Works kind of like reverse `.map`. In case of `.prepend` data transforms **before the original event occurs** and in the +case of `.map`, data transforms **after original event occurred**. + +If the original event belongs to some [domain](/en/api/effector/Domain), then a new event will belong to it as well. + +#### Formulae (#eventCallable-methods-prepend-fn-formulae) + +```ts +const first: EventCallable<T>; +const second: EventCallable<T> = first.prepend(fn); +``` + +- When `second` event is triggered +- Call `fn` with argument from the `second` event +- Trigger `first` event with the result of `fn()` + +#### Arguments (#eventCallable-methods-prepend-fn-arguments) + +1. `fn` (_Function_): A function that receives `argument`, and should be **pure**. + +#### Throws (#eventCallable-methods-prepend-fn-throws) + +##### unit call from pure function is not supported, use operators like sample instead (#eventCallable-methods-prepend-fn-throws-unit-call-from-pure) + +:::info{title="since"} +[effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0-spacewatch) +::: + +Happens when events or effects called from [pure functions](/en/glossary#purity), like mappers: + +```ts +const someHappened = createEvent<string>(); +const another = createEvent<number>(); + +const reversed = someHappened.prepend((input: number) => { + another(input); // THROWS! + return String(input); +}); +``` + +To fix this, use `sample`: + +```ts +const someHappened = createEvent<string>(); +const another = createEvent<number>(); +const reversed = createEvent<number>(); + +// The same as .prepend(), but using `sample` +sample({ + clock: reversed, + fn: (input) => String(input), + target: someHappened, +}); + +sample({ + clock: reversed, + target: another, +}); +``` + +#### Returns (#eventCallable-methods-prepend-fn-returns) + +[`EventCallable<T>`](/en/api/effector/Event): New event. + +#### Types (#eventCallable-methods-prepend-fn-types) + +There TypeScript requires explicitly setting type of the argument of `fn` function: + +```ts +import { createEvent } from "effector"; + +const original = createEvent<{ input: string }>(); + +const prepended = original.prepend((input: string) => ({ input })); +// ^^^^^^ here +``` + +Type of the `original` event argument and the resulting type of the `fn` must be the same. + +#### Examples (#eventCallable-methods-prepend-fn-examples) + +##### Basic (#eventCallable-methods-prepend-fn-examples-basic) + +```js +import { createEvent } from "effector"; + +const userPropertyChanged = createEvent(); + +userPropertyChanged.watch(({ field, value }) => { + console.log(`User property "${field}" changed to ${value}`); +}); + +const changeName = userPropertyChanged.prepend((name) => ({ + field: "name", + value: name, +})); +const changeRole = userPropertyChanged.prepend((role) => ({ + field: "role", + value: role.toUpperCase(), +})); + +changeName("john"); +// => User property "name" changed to john + +changeRole("admin"); +// => User property "role" changed to ADMIN + +changeName("alice"); +// => User property "name" changed to alice +``` + +[Try it](https://share.effector.dev/XGxlG4LD) + +##### Meaningful example (#eventCallable-methods-prepend-fn-examples-meaningful) + +You can think of this method like a wrapper function. Let's assume we have function with not ideal API, but we want to +call it frequently: + +```ts +import { sendAnalytics } from "./analytics"; + +export function reportClick(item: string) { + const argument = { type: "click", container: { items: [arg] } }; + return sendAnalytics(argument); +} +``` + +This is exactly how `.prepend()` works: + +```ts +import { sendAnalytics } from "./analytics"; + +export const reportClick = sendAnalytics.prepend((item: string) => { + return { type: "click", container: { items: [arg] } }; +}); + +reportClick("example"); +// reportClick triggered "example" +// sendAnalytics triggered { type: "click", container: { items: ["example"] } } +``` + +Check all other methods on [Event](#event-methods). + +# `Event<T>` (#event) + +A **Event** is a super type of `EventCallable` with different approach. Firstly, invoking a Event is not +allowed, and it cannot be used as a `target` in the `sample` operator, and so on. + +The primary purpose of a Event is to be triggered by internal code withing the effector library or ecosystem. +For instance, the `.map()` method returns a Event, which is subsequently called by the `.map()` method itself. + +:::info +There is no need for user code to directly invoke such an Event. + +If you find yourself needing to call a Event, it may be necessary to reevaluate and restructure your +application's logic. +::: + +All the functionalities provided by an Event are also supported in an EventCallable. + +## Construction (#event-construction) + +There is no way to manually create Event, but some methods and operators returns derived events, they are return +`Event<T>` type: + +- Event's methods like: [`.map(fn)`](#event-map-fn), [`.filter({fn})`](#event-methods-filterMap-fn), and so on +- Store's property: ['.updates'](/en/api/effector/Store#updates) +- Effect's [methods](/en/api/effector/Effect#effect) and [properties](/en/api/effector/Effect#properties) +- operators like: [`sample`](/en/api/effector/sample), [`merge`](/en/api/effector/merge) + +## Throws (#event-throws) + +- **Errors related to incorrect usage**: More details in specific method sections. + +## Declaring types (#event-types) + +It becomes necessary in cases where a factory or library requires an event to subscribe to its updates, ensuring proper +integration and interaction with the provided functionality: + +```ts +const event: Event<T>; +``` + +## Methods (#event-methods) + +### `.map(fn)` (#event-methods-map-fn) + +Creates a new derived Event, which will be called after the original event is called, using the result of the fn +function as its argument. This special function enables you to break down and manage data flow, as well as extract or +transform data within your business logic model. + +#### Formulae (#event-methods-map-fn-formulae) + +```ts +const first: Event<T> | EventCallable<T>; +const second: Event<F> = first.map(fn); +``` + +- When `first` is triggered, pass payload from `first` to `fn`. +- Trigger `second` with the result of the `fn()` call as payload. +- The function `fn` is invoked each time the `first` event is triggered. +- Also, the `second` event triggered each time the `first` is triggered. + +#### Arguments (#event-methods-map-fn-arguments) + +1. `fn` (_Function_): A function that receives `argument`, and [should be **pure**](/en/explanation/glossary#purity). + +#### Throws (#event-methods-map-fn-throws) + +##### unit call from pure function is not supported, use operators like sample instead (#event-methods-map-fn-throws-unit-call-from-pure) + +:::info{title="since"} +[effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0-spacewatch) +::: + +Happens when events or effects called from [pure functions](/en/glossary#purity), like mappers: + +```ts +const someHappened = createEvent<number>(); +const another = createEvent(); + +const derived = someHappened.map((number) => { + another(); // THROWS! + return String(number); +}); +``` + +To fix this, use `sample`: + +```ts +const someHappened = createEvent<number>(); +const another = createEvent(); +const derived = createEvent<string>(); + +sample({ + clock: someHappened, + target: another, +}); + +// The same as .map(), but using `target` +sample({ + clock: someHappened, + fn: (number) => String(number), + target: derived, +}); +``` + +#### Returns (#event-methods-map-fn-returns) + +[`Event<T>`](#event): The new event. + +#### Types (#event-methods-map-fn-types) + +The resulting type of the `fn` function will be utilized to define the type of the derived event. + +```ts +import { createEvent } from "effector"; + +const first = createEvent<number>(); +// first: Event<number> + +const second = first.map((count) => count.toString()); +// second: Event<string> +``` + +The `first` event can be represented as either `Event<T>` or `Event<T>`. <br/> +The `second` event will always be represented as `Event<T>`. + +#### Examples (#event-methods-map-fn-examples) + +```js +import { createEvent } from "effector"; + +const userUpdated = createEvent(); + +// you may decompose dataflow with .map() method +const userNameUpdated = userUpdated.map(({ user }) => name); + +// either way you can transform data +const userRoleUpdated = userUpdated.map((user) => user.role.toUpperCase()); + +userNameUpdated.watch((name) => console.log(`User's name is [${name}] now`)); +userRoleUpdated.watch((role) => console.log(`User's role is [${role}] now`)); + +userUpdated({ name: "john", role: "admin" }); +// => User's name is [john] now +// => User's role is [ADMIN] now +``` + +[Try it](https://share.effector.dev/duDut6nR) + +### `.filter({ fn })` (#event-methods-filter-fn) + +This method generates a new derived Event that will be invoked after the original event, but only if the `fn` +function returns `true`. This special function enables you to break down data flow into a branches and +subscribe on them within the business logic model. + +:::tip +[sample](/en/api/effector/sample) operator with `filter` argument is the preferred filtering method. +::: + +#### Formulae (#event-methods-filter-fn-formulae) + +```ts +const first: Event<T> | EventCallable<T>; +const second: Event<T> = first.filter({ fn }); +``` + +- When `first` is triggered, pass payload from `first` to `fn`. +- The `second` event will be triggered only if `fn` returns `true`, with the argument from `first` event. +- The function `fn` is invoked each time the `first` event is triggered. +- Also, the `second` event triggered each time the `first` is triggered, **and** the `fn` returned `true`. + +#### Arguments (#event-methods-filter-fn-arguments) + +1. `fn` (_Function_): A function that receives `argument`, and [should be **pure**](/en/explanation/glossary#purity). + +:::info{title="Note"} +Here, due to legacy restrictions `fn` is required to use object form because `event.filter(fn)` was an alias +for [Event filterMap](/en/api/effector/Event#event-methods-filterMap-fn). + +Use it always like this `.filter({ fn })`. +::: + +#### Throws (#event-methods-filter-fn-throws) + +##### unit call from pure function is not supported, use operators like sample instead (#event-methods-filter-fn-throws-unit-call-from-pure) + +:::info{title="since"} +[effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0-spacewatch) +::: + +Happens when events or effects called from [pure functions](/en/glossary#purity), like guards: + +```ts +const countReceived = createEvent<number>(); +const eachReceived = createEvent<number>(); + +const receivedEven = someHappened.filter({ + fn(count) { + eachReceived(count); // THROWS! + return count % 2 === 0; + }, +}); +``` + +To fix this, use `sample` to call `eachReceived`: + +```ts +const countReceived = createEvent<number>(); +const eachReceived = createEvent<number>(); + +const receivedEven = someHappened.filter({ + fn(count) { + return count % 2 === 0; + }, +}); + +sample({ + clock: someHappened, + target: eachReceived, +}); +``` + +#### Returns (#event-methods-filter-fn-returns) + +[`Event<T>`](#event): The new event + +#### Types (#event-methods-filter-fn-types) + +Method `.filter()` always returns Event. Also this event will have the same type as the original type: + +```ts +import { createEvent } from "effector"; + +const numberReceived = createEvent<number>(); +// numberReceived: Event<number> + +const evenReceived = numberReceived.filter({ + fn: (number) => number % 2 === 0, +}); +// evenReceived: Event<number> + +evenReceived.watch(console.info); +numberReceived(5); // nothing +numberReceived(2); // => 2 +``` + +#### Examples (#event-methods-filter-fn-examples) + +```js +import { createEvent, createStore } from "effector"; + +const numbers = createEvent(); +const positiveNumbers = numbers.filter({ + fn: ({ x }) => x > 0, +}); + +const $lastPositive = createStore(0).on(positiveNumbers, (n, { x }) => x); + +$lastPositive.watch((x) => { + console.log("last positive:", x); +}); + +// => last positive: 0 + +numbers({ x: 0 }); +// no reaction + +numbers({ x: -10 }); +// no reaction + +numbers({ x: 10 }); +// => last positive: 10 +``` + +[Try it](https://share.effector.dev/H2Iu4iJH) + +#### Meaningful example (#event-methods-filter-fn-examples-meaningful) + +Let's assume a standard situation when you want to buy sneakers in the shop, but there is no size. You subscribe to the +particular size of the sneakers' model, and in addition, you want to receive a notification if they have it, and ignore +any other notification. Therefore, filtering can be helpful for that. Event filtering works in the same way. If `filter` +returns `true`, the event will be called. + +```ts +const sneackersReceived = createEvent<Sneakers>(); +const uniqueSizeReceived = sneackersReceived.filter({ + fn: (sneackers) => sneackers.size === 48, +}); +``` + +### `.filterMap(fn)` (#event-methods-filterMap-fn) + +:::info{title="since"} +[effector 20.0.0](https://changelog.effector.dev/#effector-20-0-0) +::: + +This methods generates a new derived Event that **may be invoked** after the original event, but with the +transformed argument. This special method enabled you to simultaneously transform data and filter out trigger of the +event. + +This method looks like the `.filter()` and `.map()` merged in the one. That's it. The reason for creating was an +impossibility for event filtering. + +This method is mostly useful with JavaScript APIs whose returns `undefined` sometimes. + +#### Formulae (#event-methods-filterMap-fn-formulae) + +```ts +const first: Event<T> | EventCallable<T>; +const second: Event<F> = first.filterMap(fn); +``` + +- When `first` is triggered, call `fn` with payload from `first` +- If `fn()` returned `undefined` do not trigger `second` +- If `fn()` returned some data, trigger `second` with data from `fn()` + +#### Arguments (#event-methods-filterMap-fn-arguments) + +1. `fn` (_Function_): A function that receives `argument`, [should be **pure**](/en/explanation/glossary#purity). + +The `fn` function should return some data. When `undefined` is returned, the update of derived event will be skipped. + +#### Throws (#event-methods-filterMap-fn-throws) + +##### unit call from pure function is not supported, use operators like sample instead (#event-methods-filterMap-fn-throws-unit-call-from-pure) + +:::info{title="since"} +[effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0-spacewatch) +::: + +Happens when events or effects called from [pure functions](/en/glossary#purity), like mappers: + +```ts +const countReceived = createEvent<number>(); +const eachReceived = createEvent<number>(); + +const receivedEven = someHappened.filterMap((count) => { + eachReceived(count); // THROWS! + return count % 2 === 0 ? Math.abs(count) : undefined; +}); +``` + +To fix this, use `sample` to call `eachReceived`: + +```ts +const countReceived = createEvent<number>(); +const eachReceived = createEvent<number>(); + +const receivedEven = someHappened.filterMap((count) => { + return count % 2 === 0 ? Math.abs(count) : undefined; +}); + +sample({ + clock: someHappened, + target: eachReceived, +}); +``` + +#### Returns (#event-methods-filterMap-fn-returns) + +[`Event<T>`](#event): The new event + +#### Types (#event-methods-filterMap-fn-types) + +The type for the derived event is automatically inferred from the `fn` declaration. +No need to explicitly set type for variable or generic type argument: + +```ts +import { createEvent } from "effector"; + +const first = createEvent<number>(); +// first: Event<number> + +const second = first.filterMap((count) => { + if (count === 0) return; + return count.toString(); +}); +// second: Event<string> +``` + +The `first` event can be represented as either `Event<T>` or `EventCallable<T>`. <br/> +The `second` event will always be represented as `Event<T>`. + +#### Examples (#event-methods-filterMap-fn-examples) + +```tsx +import { createEvent } from "effector"; + +const listReceived = createEvent<string[]>(); + +// Array.prototype.find() returns `undefined` when no item is found +const effectorFound = listReceived.filterMap((list) => list.find((name) => name === "effector")); + +effectorFound.watch((name) => console.info("found", name)); + +listReceived(["redux", "effector", "mobx"]); // => found effector +listReceived(["redux", "mobx"]); +``` + +[Try it](https://share.effector.dev/ARDanMAM) + +#### Meaningful example (#event-methods-filterMap-fn-examples-meaningful) + +Consider a scenario where you walk into a grocery store with a specific task: you need to purchase 10 apples, but only +if they're red. If they're not red, you're out of luck. +Let's consider by steps: + +1. Take one apple; +2. Have a look, is it red(put in a pack) or not(take another). + +And you repeat this until you complete the task. Now think about it in the effector terms, and we consider the positive +case: + +1. Take an apple – event; +2. Have a look, red or no – filter; +3. You keep it – map; +4. Put in pack – event. +5. Pack – store + +### `.watch(watcher)` (#event-methods-watch-watcher) + +This method enables you to call callback on each event trigger with the argument of the event. + +:::tip{title="Keep in mind"} +The `watch` method neither handles nor reports exceptions, manages the completion of asynchronous operations, nor +addresses data race issues. + +Its primary intended use is for short-term debugging and logging purposes. +::: + +[Read more in the explanation section](/en/explanation/events#event-watch). + +#### Formulae (#event-methods-watch-watcher-formulae) + +```ts +const event: Event<T> | EventCallable<T>; +const unwatch: () => void = event.watch(fn); +``` + +- The `fn` will be called on each `event` trigger, passed argument of the `event` to the `fn`. +- When `unwatch` is called, stop calling `fn` on each `event` trigger. + +#### Arguments (#event-methods-watch-watcher-arguments) + +1. `watcher` ([_Watcher_](/en/explanation/glossary#watcher)): A function that receives `argument` from the event. + +#### Returns (#event-methods-watch-watcher-returns) + +[_Subscription_](/en/explanation/glossary#subscription): Unsubscribe function. + +#### Examples (#event-methods-watch-watcher-examples) + +```js +import { createEvent } from "effector"; + +const sayHi = createEvent(); +const unwatch = sayHi.watch((name) => console.log(`${name}, hi there!`)); + +sayHi("Peter"); // => Peter, hi there! +unwatch(); + +sayHi("Drew"); // => nothing happened +``` + +[Try it](https://share.effector.dev/9YVgCl4C) + +### `.subscribe(observer)` (#event-methods-subscribe-observer) + +This is the low-level method to integrate event with the standard `Observable` pattern. + +:::tip{title="Keep in mind"} +You don't need to use this method on your own. It is used under the hood by rendering engines or so on. +::: + +Read more: + +- https://rxjs.dev/guide/observable +- https://github.com/tc39/proposal-observable + +## Properties (#event-properties) + +These set of property is mostly set by [`effector/babel-plugin`](/en/api/effector/babel-plugin) +or [`@effector/swc-plugin`](https://github.com/effector/swc-plugin). So they are exist only when babel or SWC is used. + +### `.sid` (#event-properties-sid) + +It is an unique identifier for each event. + +It is important to note, SID is not changes on each app start, it is statically written inside your app bundle to +absolutely identify units. + +It can be useful to send events between workers or +server/browser: [examples/worker-rpc](https://github.com/effector/effector/tree/master/examples/worker-rpc). + +It has the `string | null` type. + +### `.shortName` (#event-properties-shortName) + +It is a `string` type property, contains the name of the variable event declared at. + +```ts +import { createEvent } from "effector"; + +const demo = createEvent(); +// demo.shortName === 'demo' +``` + +But reassign event to another variable changes nothing: + +```ts +const another = demo; +// another.shortName === 'demo' +``` + +### `.compositeName` (#event-properties-compositeName) + +This property contains the full internal chain of units. For example, event can be created by the domain, so the +composite name will contain a domain name inside it. + +```ts +import { createEvent, createDomain } from "effector"; + +const first = createEvent(); +const domain = createDomain(); +const second = domain.createEvent(); + +console.log(first); +// => { shortName: "first", fullName: "first", path: ["first"] } + +console.log(second); +// => { shortName: "second", fullName: "domain/second", path: ["domain", "second"] } +``` + +# Types (#types) + +```ts +import { type EventPayload } from "effector"; +``` + +## `EventPayload<E>` (#types-EventPayload) + +Extracts type of payload from `Event` or `EventCallable`. + +```ts +const event: Event<Payload>; +type Payload = EventPayload<typeof event>; +``` diff --git a/src/content/docs/en/api/effector/Scope.md b/src/content/docs/en/api/effector/Scope.md new file mode 100644 index 0000000..46d9a2f --- /dev/null +++ b/src/content/docs/en/api/effector/Scope.md @@ -0,0 +1,102 @@ +--- +title: Scope +redirectFrom: + - /api/effector/Scope + - /docs/api/effector/scope +--- + +```ts +import { type Scope } from "effector"; +``` + +`Scope` is a fully isolated instance of application. +The primary purpose of scope includes SSR (Server-Side Rendering) but is not limited to this use case. A `Scope` contains an independent clone of all units (including connections between them) and basic methods to access them. + +A `Scope` can be created using [fork](/en/api/effector/fork). + +## Imperative effects calls with scope (#scope-imperativeEffectCalls) + +When making imperative effect calls within effect handlers, it is supported but **not** within `watch` functions. For effect handlers that call other effects, ensure to only call effects, not common asynchronous functions. Furthermore, effect calls should be awaited: + +**✅ Correct usage for an effect without inner effects:** + +```js +const delayFx = createEffect(async () => { + await new Promise((resolve) => setTimeout(resolve, 80)); +}); +``` + +**✅ Correct usage for an effect with inner effects:** + +```js +const authUserFx = createEffect(); +const sendMessageFx = createEffect(); + +const sendWithAuthFx = createEffect(async () => { + await authUserFx(); + await delayFx(); + await sendMessageFx(); +}); +``` + +**❌ Incorrect usage for an effect with inner effects:** + +```js +const sendWithAuthFx = createEffect(async () => { + await authUserFx(); + + // Incorrect! This should be wrapped in an effect. + await new Promise((resolve) => setTimeout(resolve, 80)); + + // Context is lost here. + await sendMessageFx(); +}); +``` + +For scenarios where an effect might call another effect or perform asynchronous computations, but not both, consider utilizing the [attach](/en/api/effector/attach) method instead for more succinct imperative calls. + +# Methods (#methods) + +## `.getState($store)` (#methods-getState) + +Returns the value of a store in a given `Scope`. + +### Formulae (#methods-getState-formulae) + +```ts +const scope: Scope; +const $value: Store<T> | StoreWritable<T>; + +const value: T = scope.getState($value); +``` + +### Returns (#methods-getState-returns) + +`T` the value of the store + +### Examples (#methods-getState-examples) + +Create two instances of an application, trigger events in them, and test the `$counter` store value in both instances: + +```js +import { createStore, createEvent, fork, allSettled } from "effector"; + +const inc = createEvent(); +const dec = createEvent(); +const $counter = createStore(0); + +$counter.on(inc, (value) => value + 1); +$counter.on(dec, (value) => value - 1); + +const scopeA = fork(); +const scopeB = fork(); + +await allSettled(inc, { scope: scopeA }); +await allSettled(dec, { scope: scopeB }); + +console.log($counter.getState()); // => 0 +console.log(scopeA.getState($counter)); // => 1 +console.log(scopeB.getState($counter)); // => -1 +``` + +[Try it](https://share.effector.dev/0grlV3bA) diff --git a/src/content/docs/en/api/effector/Store.md b/src/content/docs/en/api/effector/Store.md new file mode 100644 index 0000000..ab7d0a0 --- /dev/null +++ b/src/content/docs/en/api/effector/Store.md @@ -0,0 +1,325 @@ +--- +title: Store +keywords: + - store + - unit +description: Store, its methods and properties +redirectFrom: + - /api/effector/Store + - /docs/api/effector/store +--- + +```ts +import { type Store, type StoreWritable } from "effector"; +``` + +_Store_ is an object that holds the state value. Store gets updates when it receives a value that is not equal (`!==`) to the current one and to `undefined`. Store is a [Unit](/en/explanation/glossary#common-unit). Some stores can be [derived](#store-derived). + +# Methods (#methods) + +## `.map(fn)` (#methods-map-fn) + +Creates a derived store. It will call a provided function with the state when the original store updates, and will use the result to update the derived store. + +### Formulae (#methods-map-fn-formulae) + +```ts +const $second = $first.map(fn); +``` + +### Arguments (#methods-map-fn-arguments) + +1. `fn` (_Function_): Function that receives `state` and returns a new state for the derived store. +2. `config` (_Object_): Optional configuration. + +### Returns (#methods-map-fn-returns) + +[_DerivedStore_](/en/api/effector/Store#readonly): New derived store. + +### Examples (#methods-map-fn-examples) + +#### Basic (#methods-map-fn-examples-basic) + +```js +import { createEvent, createStore } from "effector"; + +const changed = createEvent(); +const $title = createStore("").on(changed, (_, newTitle) => newTitle); +const $length = $title.map((title) => title.length); + +$length.watch((length) => { + console.log("new length", length); +}); + +changed("hello"); +changed("world"); +changed("hello world"); +``` + +[Try it](https://share.effector.dev/XGKGMvpF) + +#### SkipVoid (#methods-map-fn-examples-skipVoid) + +```js +const $length = $title.map((title) => title.length, { skipVoid: false }); +``` + +## `.on(trigger, reducer)` (#methods-on-trigger-reducer) + +Updates state when `trigger` is triggered by using a [reducer](/en/explanation/glossary#reducer). + +### Formulae (#methods-on-trigger-reducer-formulae) + +```ts +$store.on(trigger, reducer); +``` + +### Arguments (#methods-on-trigger-reducer-arguments) + +1. `trigger`: _Event_, _Effect_, or another _Store_. +2. `reducer`: _Reducer_: Function that receives `state` and `params` and returns a new state. + +### Returns (#methods-on-trigger-reducer-returns) + +[_Store_](/en/api/effector/Store): Current store. + +### Examples (#methods-on-trigger-reducer-examples) + +#### Basic (#methods-on-trigger-reducer-examples-basic) + +```js +import { createEvent, createStore } from "effector"; + +const $store = createStore(0); +const changed = createEvent(); + +$store.on(changed, (value, incrementor) => value + incrementor); + +$store.watch((value) => { + console.log("updated", value); +}); + +changed(2); +changed(2); +``` + +[Try it](https://share.effector.dev/O0JnDtIl) + +## `.watch(watcher)` (#methods-watch-watcher) + +Calls `watcher` function each time when the store is updated. + +### Formulae (#methods-watch-watcher-formulae) + +```ts +const unwatch = $store.watch(watcher); +``` + +### Arguments (#methods-watch-watcher-arguments) + +1. `watcher`: [_Watcher_](/en/explanation/glossary#watcher): Watcher function that receives the current store state as the first argument. + +### Returns (#methods-watch-watcher-returns) + +[_Subscription_](/en/explanation/glossary#subscription): Unsubscribe function. + +### Examples (#methods-watch-watcher-examples) + +#### Basic (#methods-watch-watcher-examples-basic) + +```js +const add = createEvent(); +const $store = createStore(0).on(add, (state, payload) => state + payload); + +$store.watch((value) => console.log(`current value: ${value}`)); +add(4); +add(3); +``` + +## `.reset(...triggers)` (#methods-reset-triggers) + +Resets store state to the default value. + +### Formulae (#methods-reset-triggers-formulae) + +```ts +$store.reset(...triggers); +``` + +### Arguments (#methods-reset-triggers-arguments) + +1. `triggers`: (_(Event | Effect | Store)[]_): any number of _Events_, _Effects_, or _Stores_. + +### Returns (#methods-reset-triggers-returns) + +[_Store_](/en/api/effector/Store): Current store. + +### Examples (#methods-reset-triggers-examples) + +#### Basic (#methods-reset-triggers-examples-basic) + +```js +import { createEvent, createStore } from "effector"; + +const increment = createEvent(); +const reset = createEvent(); + +const $store = createStore(0) + .on(increment, (state) => state + 1) + .reset(reset); + +$store.watch((state) => console.log("changed", state)); + +increment(); +increment(); +reset(); +``` + +[Try it](https://share.effector.dev/7W8m2Zdg) + +## `.off(trigger)` (#methods-off-trigger) + +Removes reducer for the given `trigger`. + +### Formulae (#methods-off-trigger-formulae) + +```ts +$store.off(trigger); +``` + +### Arguments (#methods-off-trigger-arguments) + +1. `trigger`: _Event_, _Effect_, or _Store_. + +### Returns (#methods-off-trigger-returns) + +[_Store_](/en/api/effector/Store): Current store. + +### Examples (#methods-off-trigger-examples) + +#### Basic (#methods-off-trigger-examples-basic) + +```js +import { createEvent, createStore, merge } from "effector"; + +const changedA = createEvent(); +const changedB = createEvent(); + +const $store = createStore(0); +const changed = merge([changedA, changedB]); + +$store.on(changed, (state, params) => state + params); +$store.off(changed); +``` + +[Try it](https://share.effector.dev/bzdoyLHm) + +# Properties (#properties) + +## `.updates` (#properties-updates) + +### Returns (#properties-updates-returns) + +[_Event_](/en/api/effector/Event): Event that represents updates of the given store. + +### Example (#properties-updates-example) + +```js +import { createStore, is } from "effector"; + +const $clicksAmount = createStore(0); +is.event($clicksAmount.updates); + +$clicksAmount.updates.watch((amount) => { + console.log(amount); +}); +``` + +[Try it](https://share.effector.dev/F5L5kLTE) + +## `.reinit` (#properties-reinit) + +### Returns (#properties-reinit-returns) + +[_Event_](/en/api/effector/Event): Event that can reinitialize a store with a default value. + +### Example (#properties-reinit-example) + +```js +import { createStore, createEvent, sample, is } from "effector"; + +const $counter = createStore(0); +is.event($counter.reinit); + +const increment = createEvent(); + +$counter.reinit(); +console.log($counter.getState()); +``` + +[Try it](https://share.effector.dev/vtJncyYn) + +## `.shortName` (#properties-shortName) + +### Returns (#properties-shortName-returns) + +(_`string`_): ID or short name of the store. + +## `.defaultState` (#properties-defaultState) + +### Returns (#properties-defaultState-returns) + +(_`State`_): Default state of the store. + +### Example (#properties-defaultState-example) + +```ts +const $store = createStore("DEFAULT"); +console.log($store.defaultState === "DEFAULT"); +``` + +# Utility methods (#utility-methods) + +## `.getState()` (#utility-methods-getState) + +Returns the current state of the store. + +### Returns (#utility-methods-getState-returns) + +(_`State`_): Current state of the store. + +### Example (#utility-methods-getState-example) + +```js +import { createEvent, createStore } from "effector"; + +const add = createEvent(); + +const $number = createStore(0).on(add, (state, data) => state + data); + +add(2); +add(3); + +console.log($number.getState()); +``` + +[Try it](https://share.effector.dev/YrnlMuRj) + +# Readonly store (#readonly) + +TBD + +# Types (#types) + +```ts +import { type StoreValue } from "effector"; +``` + +## `StoreValue<S>` (#types-StoreValue) + +Extracts type of `Store` or `StoreWritable` value. + +```ts +const $store: Store<Value>; +type Value = StoreValue<typeof $store>; +``` diff --git a/src/content/docs/en/api/effector/allSettled.md b/src/content/docs/en/api/effector/allSettled.md new file mode 100644 index 0000000..9d72c77 --- /dev/null +++ b/src/content/docs/en/api/effector/allSettled.md @@ -0,0 +1,92 @@ +--- +title: allSettled +description: Call provided unit in scope and wait for finishing all the triggered effects +redirectFrom: + - /api/effector/allSettled + - /docs/api/effector/allsettled +--- + +# Methods (#methods) + +## `allSettled(unit, {scope, params?})` (#methods-allSettled-unit-scope-params) + +Calls the provided unit within the current scope and wait for all triggered effects to complete. + +### Formulae (#methods-allSettled-unit-scope-params-formulae) + +```ts +allSettled<T>(unit: Event<T>, {scope: Scope, params?: T}): Promise<void> +allSettled<T>(unit: Effect<T, Done, Fail>, {scope: Scope, params?: T}): Promise< + | {status: 'done'; value: Done} + | {status: 'fail'; value: Fail} +> +allSettled<T>(unit: Store<T>, {scope: Scope, params?: T}): Promise<void> +``` + +### Arguments (#methods-allSettled-unit-scope-params-arguments) + +1. `unit`: [_Event_](/en/api/effector/Event) or [_Effect_](/en/api/effector/Effect) to be called +2. `scope`: [_Scope_](/en/api/effector/Scope) +3. `params`: params passed to `unit` + +:::info{title="since"} +Return value for effect is supported since [effector 21.4.0](https://changelog.effector.dev/#effector-21-4-0) +::: + +### Examples (#methods-allSettled-unit-scope-params-examples) + +:::tip{title="Contribution"} +TBD + +Please, [open PullRequest](https://github.com/effector/effector) and contribute examples for this section via "Edit this page" link below. +::: + +## `allSettled(scope)` (#methods-allSettled-scope) + +Checks the provided scope for any ongoing computations and wait for their completion. + +### Formulae (#methods-allSettled-scope-formulae) + +```ts +allSettled<T>(scope): Promise<void> +``` + +### Arguments (#methods-allSettled-scope-arguments) + +1. `scope`: [_Scope_](/en/api/effector/Scope) + +:::info{title="since"} +Supported since effector 22.5.0 +::: + +### Examples (#methods-allSettled-scope-examples) + +#### Usage in tests (#methods-allSettled-scope-examples-tests) + +For example, tests that validate the integration with an external reactive API + +```ts +test('integration with externalSource', async () => { + const scope = fork() + + const updated = createEvent() + + sample({ + clock: updated, + target: someOtherLogicStart, + }) + + // 1. Subscribe event to external source + const externalUpdated = scopeBind(updated, {scope}) + externalSource.listen(() => externalUpdates()) + + // 2. Trigger update of external source + externalSource.trigger() + + // 3. Wait for all triggered computations in effector's scope, even though these were not triggered by effector itself + await allSettled(scope) + + // 4. Check anything as usual + expect(...).toBe(...) +}) +``` diff --git a/src/content/docs/en/api/effector/attach.md b/src/content/docs/en/api/effector/attach.md new file mode 100644 index 0000000..3ff8218 --- /dev/null +++ b/src/content/docs/en/api/effector/attach.md @@ -0,0 +1,620 @@ +--- +title: attach +description: Wrapper for effect, which allows to map effect arguments and use data from stores. +redirectFrom: + - /api/effector/attach + - /docs/api/effector/attach +--- + +```ts +import { attach } from "effector"; +``` + +:::info{title="since"} +Available since [effector 20.13.0](https://changelog.effector.dev/#effector-20-13-0). + +Since [effector 22.4.0](https://changelog.effector.dev/#effector-encke-22-4-0), it is available to check whether effect is created via `attach` method — [is.attached](/en/api/effector/is#is-attached). +::: + +Creates new [effects](/en/api/effector/Effect) based on the other effects, [stores](/en/api/effector/Store). Allows mapping params and handling errors. + +Use cases: declarative way to pass values from stores to effects and argument preprocessing. Most useful case is `attach({ source, async effect })`. + +:::tip +The attached effects are the same first-class citizens as the regular effects made by [createEffect](/en/api/effector/createEffect). You should place them in the same files as regular effects, also you can use the same naming strategy. +::: + +# Methods (#methods) + +## `attach({effect})` (#methods-attach-effect) + +:::info{title="since"} +[effector 21.5.0](https://changelog.effector.dev/#effector-21-5-0) +::: + +Create effect which will call `effect` with params as it is. That allows creating separate effects with shared behavior. + +### Formulae (#methods-attach-effect-formulae) + +```ts +const attachedFx = attach({ effect: originalFx }); +``` + +- When `attachedFx` is triggered, then `originalFx` is triggered too +- When `originalFx` is finished (fail/done), then `attachedFx` must be finished with the same state. + +### Arguments (#methods-attach-effect-arguments) + +- `effect` ([_Effect_](/en/api/effector/Effect)): Wrapped effect + +### Returns (#methods-attach-effect-returns) + +[_Effect_](/en/api/effector/Effect): New effect + +### Types (#methods-attach-effect-types) + +```ts +const originalFx: Effect<Params, Done, Fail>; + +const attachedFx: Effect<Params, Done, Fail> = attach({ + effect: originalFx, +}); +``` + +In case of this simple variant of `attach`, types of `originalFx` and `attachedFx` will be the same. + +### Examples (#methods-attach-effect-examples) + +It allows to create _local_ copy of the effect, to react only on triggers emitted from the current _local_ code. + +```ts +import { createEffect, attach } from "effector"; + +const originalFx = createEffect((word: string) => { + console.info("Printed:", word); +}); + +const attachedFx = attach({ effect: originalFx }); + +originalFx.watch(() => console.log("originalFx")); +originalFx.done.watch(() => console.log("originalFx.done")); + +attachedFx.watch(() => console.log("attachedFx")); +attachedFx.done.watch(() => console.log("attachedFx.done")); + +originalFx("first"); +// => originalFx +// => Printed: first +// => originalFx.done + +attachedFx("second"); +// => attachedFx +// => originalFx +// Printed: second +// => originalFx.done +// => attachedFx.done +``` + +[Try it](https://share.effector.dev/7Uhk4XfW) + +## `attach({source, effect})` (#methods-attach-source-effect) + +Create effect which will trigger given one with values from `source` stores. + +### Formulae (#methods-attach-source-effect-formulae) + +```ts +const attachedFx = attach({ + source, + effect: originalFx, +}); +``` + +- When `attachedFx` is triggered, read data from `source`, trigger with the data `originalFx` +- When `originalFx` is finished, pass the same resolution (done/fail) into `attachedFx` and finish it + +### Arguments (#methods-attach-source-effect-arguments) + +- `source` ([_Store_](/en/api/effector/Store) | `{[key: string]: Store}`): Store or object with stores, values of which will be passed to the second argument of `mapParams` +- `effect` ([_Effect_](/en/api/effector/Effect)): Original effect + +### Returns (#methods-attach-source-effect-returns) + +[_Effect_](/en/api/effector/Effect): New effect + +### Types (#methods-attach-source-effect-types) + +:::tip +You don't need to explicitly set types for each declaration. The purpose of the following example is to provide a clear understanding. +::: + +In most userland code you will write code like this, without explicit types of the `let`/`const`: + +```ts +const originalFx = createEffect<OriginalParams, SomeResult, SomeError>(async () => {}); +const $store = createStore(initialValue); + +const attachedFx = attach({ + source: $store, + effect: originalFx, +}); +``` + +#### Single store + +```ts +const originalFx: Effect<T, Done, Fail>; +const $store: Store<T>; + +const attachedFx: Effect<void, Done, Fail> = attach({ + source: $store, + effect: originalFx, +}); +``` + +[Try it](https://tsplay.dev/NBJDDN) + +Types of the `source` store and `effect` params must be the same. +But the `attachedFx` will omit the type of params, it means the attached effect not requires any params at all. + +#### Shape of stores + +```ts +const originalFx: Effect<{ a: A; b: B }, Done, Fail>; +const $a: Store<A>; +const $b: Store<B>; + +const attachedFx: Effect<void, Done, Fail> = attach({ + source: { a: $a, b: $b }, + effect: originalFx, +}); +``` + +[Try it](https://tsplay.dev/mbE58N) + +Types of the `source` object must be the same as `originalFx` params. But the `attachedFx` will omit the type of params, it means the attached effect not requires any params at all. + +### Examples (#methods-attach-source-effect-examples) + +```ts +const requestPageFx = createEffect<{ page: number; size: number }, string[]>( + async ({ page, size }) => { + console.log("Requested", page); + return page * size; + }, +); + +const $page = createStore(1); +const $size = createStore(20); + +const requestNextPageFx = attach({ + source: { page: $page, size: $size }, + effect: requestPageFx, +}); + +$page.on(requestNextPageFx.done, (page) => page + 1); + +requestPageFx.doneData.watch((position) => console.log("requestPageFx.doneData", position)); + +await requestNextPageFx(); +// => Requested 1 +// => requestPageFx.doneData 20 + +await requestNextPageFx(); +// => Requested 2 +// => requestPageFx.doneData 40 + +await requestNextPageFx(); +// => Requested 3 +// => requestPageFx.doneData 60 +``` + +[Try it](https://share.effector.dev/FGqlrrnw) + +## `attach({source, async effect})` (#methods-attach-source-async-effect) + +:::info{title="since"} +[effector 22.0.0](https://changelog.effector.dev/#effector-22-0-0) +::: + +Creates effect which will call async function with values from the `source` stores. + +### Formulae (#methods-attach-source-async-effect-formulae) + +```ts +const attachedFx = attach({ + source, + async effect(source, params) {}, +}); +``` + +- When `attachedFx` is triggered, read data from the `source`, call `effect` function. +- When `effect` function returns resolved `Promise`, finish `attachedFx` with the data from the function as `attachedFx.done`. +- When `effect` throws exception, or returns rejected `Promise`, finish `attachedFx` with the data from function as `attachedFx.fail`. + +### Arguments (#methods-attach-source-async-effect-arguments) + +- `effect` (_Function_): `(source: Source, params: Params) => Promise<Result> | Result` +- `source` ([_Store_](/en/api/effector/Store) | `{[key: string]: Store}`): Store or object with stores, values of which will be passed to the first argument of `effect` + +### Returns (#methods-attach-source-async-effect-returns) + +[_Effect_](/en/api/effector/Effect): New effect + +### Usage with scope (#methods-attach-source-async-effect-scope) + +Any effects called inside `async effect` function will propagate scope. + +```ts +const outerFx = createEffect((count: number) => { + console.log("Hit", count); +}); + +const $store = createStore(0); +const attachedFx = attach({ + source: $store, + async effect(count, _: void) {}, +}); +``` + +**Scope is lost** if there are any asynchronous function calls made: + +```ts +const attachedFx = attach({ + source: $store, + async effect(source) { + // Here is ok, the effect is called + const resultA = await anotherFx(); + + // Be careful: + const resultB = await regularFunction(); + // Here scope is lost. + }, +}); +``` + +To solve this case, you need to just wrap your `regularFunction` into effect: + +```ts +const regularFunctionFx = createEffect(regularFunction); +``` + +### Types (#methods-attach-source-async-effect-types) + +#### Single store (#methods-attach-source-async-effect-types-single-store) + +```ts +const $store: Store<T>; + +const attachedFx: Effect<Params, Done, Fail> = attach({ + source: $store, + async effect(source, params: Params): Done | Promise<Done> {}, +}); +``` + +You need to type explicitly only `params` argument. All other types of arguments should be inferred automatically. Also, you may want to explicitly set the return type of the `effect` function. + +If you want to remove any arguments from the `attachedFx` you need to just remove second argument from `effect` function: + +```ts +const attachedFx: Effect<void, void, Fail> = attach({ + source: $store, + async effect(source) {}, +}); +``` + +#### Multiple stores (#methods-attach-source-async-effect-types-multiple-stores) + +:::tip +For details review [previous section of types](#methods-attach-source-async-effect-types). Here the same logic. +::: + +```ts +// Userland example, without explicit type declarations +const $foo = createStore(100); +const $bar = createStore("demo"); + +const attachedFx = attach({ + source: { foo: $foo, bar: $bar }, + async effect({ foo, bar }, { baz }: { baz: boolean }) { + console.log("Hit!", { foo, bar, baz }); + }, +}); + +attachedFx({ baz: true }); +// => Hit! { foo: 100, bar: "demo", baz: true } +``` + +[Try it](https://tsplay.dev/m3xjbW) + +### Example (#methods-attach-source-async-effect-example) + +:::warning{title="TBD"} +Please, open pull request via "Edit this page" link. +::: + +## `attach({effect, mapParams})` (#methods-attach-effect-mapParams) + +Creates effect which will trigger given one by transforming params by `mapParams` function. + +### Formulae (#methods-attach-effect-mapParams-formulae) + +```ts +const attachedFx = attach({ + effect: originalFx, + mapParams, +}); +``` + +- When `attachedFx` triggered, payload passed into `mapParams` function, then the result of it passed into `originalFx` +- When `originalFx` is finished, then `attachedFx` must be finished with the same resolution (done/fail). +- If `mapParams` throws an exception, then `attachedFx` must be finished with the error as `attachedFx.fail`. But `originalFx` will not be triggered at all. + +### Arguments (#methods-attach-effect-mapParams-arguments) + +- `effect` ([_Effect_](/en/api/effector/Effect)): Wrapped effect +- `mapParams` (`(newParams) => effectParams`): Function which receives new params and maps them to the params of the wrapped `effect`. Works mostly like [event.prepend](/en/api/effector/Event#prepend-fn). Errors happened in `mapParams` function will force attached effect to fail. + +### Returns (#methods-attach-effect-mapParams-returns) + +[_Effect_](/en/api/effector/Effect): New effect + +### Types (#methods-attach-effect-mapParams-types) + +```ts +const originalFx: Effect<A, Done, Fail>; + +const attachedFx: Effect<B, Done, Fail> = attach({ + effect: originalFx, + mapParams: (params: B): A {}, +}); +``` + +`mapParams` must return the same type `originalFx` receives as params. + +If `attachedFx` must be called without any arguments, then `params` can be safely removed from the `mapParams`: + +```ts +const attachedFx: Effect<void, Done, Fail> = attach({ + effect: originalFx, + mapParams: (): A {}, +}); +``` + +[Try it](https://tsplay.dev/wXOYoW) + +But if `mapParams` function throws an exception, it is on your own to check types compatibility, because of TypeScript. + +```ts +const attachedFx: Effect<void, Done, Fail> = attach({ + effect: originalFx, + mapParams: (): A { + throw new AnyNonFailType(); // It can be noncompatible with `Fail` type + }, +}); +``` + +### Examples (#methods-attach-effect-mapParams-examples) + +#### Map arguments (#methods-attach-effect-mapParams-examples-map-arguments) + +```ts +const originalFx = createEffect<{ input: number }, void>((a) => a); + +const attachedFx = attach({ + effect: originalFx, + mapParams(a: number) { + return { input: a * 100 }; + }, +}); + +originalFx.watch((params) => console.log("originalFx", params)); + +attachedFx(1); +// => originalFx { input: 100 } +``` + +[Try it](https://share.effector.dev/TFRlrmhm) + +#### Handle exceptions (#methods-attach-effect-mapParams-examples-handle-exceptions) + +```ts +const originalFx = createEffect<{ a: number }, void>((a) => a); + +const attachedFx = attach({ + effect: originalFx, + mapParams(a: number) { + throw new Error("custom error"); + return { a }; + }, +}); + +attachedFx.failData.watch((error) => console.log("attachedFx.failData", error)); + +attachedFx(1); +// => attachedFx.failData +// => Error: custom error +``` + +[Try it](https://share.effector.dev/VYvWQoOk) + +## `attach({source, mapParams, effect})` (#methods-attach-source-mapParams-effect) + +Creates effect which will read values from `source` stores, pass them with params to `mapParams` function and then call `effect` with the result. + +### Formulae (#methods-attach-source-mapParams-effect-formulae) + +:::tip{title="Note"} +This variant of `attach` mostly works like the [attach({effect, mapParams})](#methods-attach-effect-mapParams). The same things are omitted from this section. +::: + +```ts +const attachedFx = attach({ + source, + mapParams, + effect: originalFx, +}); +``` + +- When `attachedFx` triggered, payload passed into `mapParams` function with value from `source` store, then the result of it passed into `originalFx` +- When `originalFx` is finished, then `attachedFx` must be finished with the same resolution (done/fail). +- If `mapParams` throws an exception, then `attachedFx` must be finished with the error as `attachedFx.fail`. But `originalFx` will not be triggered at all. + +### Arguments (#methods-attach-source-mapParams-effect-arguments) + +- `source` ([_Store_](/en/api/effector/Store) | `{[key: string]: Store}`): Store or object with stores, values of which will be passed to the second argument of `mapParams` +- `mapParams` (`(newParams, values) => effectParams`): Function which receives new params and current value of `source` and combines them to the params of the wrapped `effect`. Errors happened in `mapParams` function will force attached effect to fail +- `effect` ([_Effect_](/en/api/effector/Effect)): Wrapped effect + +### Returns (#methods-attach-source-mapParams-effect-returns) + +[_Effect_](/en/api/effector/Effect): New effect + +### Types (#methods-attach-source-mapParams-effect-types) + +:::warning{title="TBD"} +Please, open pull request via "Edit this page" link. +::: + +### Examples (#methods-attach-source-mapParams-effect-examples) + +#### With factory (#methods-attach-source-mapParams-effect-example-with-factory) + +```ts +// ./api/request.ts +import { createEffect, createStore } from "effector"; + +export const backendRequestFx = createEffect(async ({ token, data, resource }) => { + return fetch(`https://example.com/api${resource}`, { + method: "POST", + headers: { + Authorization: `Bearer ${token}`, + }, + body: JSON.stringify(data), + }); +}); + +export const $requestsSent = createStore(0); + +$requestsSent.on(backendRequestFx, (total) => total + 1); +``` + +```ts +// ./api/authorized.ts +import { attach, createStore } from "effector"; + +const $token = createStore("guest_token"); + +export const authorizedRequestFx = attach({ + effect: backendRequestFx, + source: $token, + mapParams: ({ data, resource }, token) => ({ data, resource, token }), +}); + +export function createRequest(resource) { + return attach({ + effect: authorizedRequestFx, + mapParams: (data) => ({ data, resource }), + }); +} +``` + +```ts +// ./api/index.ts +import { createRequest } from "./authorized"; +import { $requestsSent } from "./request"; + +const getUserFx = createRequest("/user"); +const getPostsFx = createRequest("/posts"); + +$requestsSent.watch((total) => { + console.log(`client analytics: sent ${total} requests`); +}); + +const user = await getUserFx({ name: "alice" }); +/* +POST https://example.com/api/user +{"name": "alice"} +Authorization: Bearer guest_token +*/ + +// => client analytics: sent 1 requests + +const posts = await getPostsFx({ user: user.id }); +/* +POST https://example.com/api/posts +{"user": 18329} +Authorization: Bearer guest_token +*/ + +// => client analytics: sent 2 requests +``` + +To allow factory works correct, add a path to a `./api/authorized` into `factories` option for Babel plugin: + +```json5 +// .babelrc +{ + plugins: [ + [ + "effector/babel-plugin", + { + factories: ["src/path-to-your-entity/api/authorized"], + }, + ], + ], +} +``` + +## Parameters (#attach-parameters) + +`attach()` also receives extra parameters, you can use it when you need. + +### `name` (#attach-parameters-name) + +```ts +attach({ name: string }); +``` + +It allows us to explicitly set the name of the created attached effect: + +```ts +import { attach } from "effector"; + +const attachedFx = attach({ + name: "anotherUsefulName", + source: $store, + async effect(source, params: Type) { + // ... + }, +}); + +attachedFx.shortName; // "anotherUsefulName" +``` + +This parameter exists in **any variant** of the `attach`. + +### `domain` (#attach-parameters-domain) + +```ts +attach({ domain: Domain }); +``` + +It allows to create effect inside specified domain. + +> Note: this property can only be used with a plain function `effect`. + +```ts +import { createDomain, createStore, attach } from "effector"; + +const reportErrors = createDomain(); +const $counter = createStore(0); + +const attachedFx = attach({ + domain: reportErrors, + source: $counter, + async effect(counter) { + // ... + }, +}); +``` diff --git a/src/content/docs/en/api/effector/babel-plugin.md b/src/content/docs/en/api/effector/babel-plugin.md new file mode 100644 index 0000000..25762cd --- /dev/null +++ b/src/content/docs/en/api/effector/babel-plugin.md @@ -0,0 +1,370 @@ +--- +title: Babel plugin +redirectFrom: + - /api/effector/babel-plugin + - /docs/api/effector/babel-plugin +--- + +Built-in plugin for babel can be used for ssr and debugging. It inserts a name a [Unit](/en/explanation/glossary#unit), +inferred from variable name and `sid` ([Stable IDentifier](/en/explanation/sids)), computed from the location in the source code. + +For example, in case [effects without handlers](/en/api/effector/Effect#use-handler), it improves error messages by +clearly showing in which effect error happened. + +```js +import { createEffect } from "effector"; + +const fetchFx = createEffect(); + +fetchFx(); + +// => no handler used in fetchFx +``` + +[Try it](https://share.effector.dev/Yb8vQ1Ly) + +# Usage (#usage) + +In the simplest case, it can be used without any configuration: + +```json +// .babelrc +{ + "plugins": ["effector/babel-plugin"] +} +``` + +# SID (#sid) + +:::info{title="since"} +[effector 20.2.0](https://changelog.effector.dev/#effector-20-2-0) +::: + +Stable hash identifier for events, effects, stores and domains, preserved between environments, to handle client-server +interaction within the same codebase. + +The crucial value of sid is that it can be autogenerated by `effector/babel-plugin` with default config, and it will be stable between builds. + +:::tip{title="Deep dive explanation"} +If you need the detailed deep-dive explanation about why we need SIDs and how they are used internally, you can find it by [following this link](/en/explanation/sids) +::: + +See [example project](https://github.com/effector/effector/tree/master/examples/worker-rpc) + +```js +// common.js +import { createEffect } from "effector"; + +export const getUser = createEffect({ sid: "GET /user" }); +console.log(getUsers.sid); +// => GET /user +``` + +```js +// worker.js +import { getUsers } from "./common.js"; + +getUsers.use((userID) => fetch(userID)); + +getUsers.done.watch(({ result }) => { + postMessage({ sid: getUsers.sid, result }); +}); + +onmessage = async ({ data }) => { + if (data.sid !== getUsers.sid) return; + getUsers(data.userID); +}; +``` + +```js +// client.js +import { createEvent } from "effector"; +import { getUsers } from "./common.js"; + +const onMessage = createEvent(); + +const worker = new Worker("worker.js"); +worker.onmessage = onMessage; + +getUsers.use( + (userID) => + new Promise((rs) => { + worker.postMessage({ sid: getUsers.sid, userID }); + const unwatch = onMessage.watch(({ data }) => { + if (data.sid !== getUsers.sid) return; + unwatch(); + rs(data.result); + }); + }), +); +``` + +# Configuration (#configuration) + +## `importName` (#configuration-importName) + +Specifying import name or names to process by plugin. Import should be used in the code as specified. + +### Formulae (#configuration-importName-formulae) + +```json +[ + "effector/babel-plugin", + { + "importName": ["effector"] + } +] +``` + +- Type: `string | string[]` +- Default: `['effector', 'effector/compat']` + +## `factories` (#configuration-factories) + +Accepts an array of module names which exports treat as custom factories, therefore, each function call provides a unique prefix for [sids](/en/api/effector/babel-plugin#sid) of units inside them. Used to +SSR([Server Side Rendering](/en/api/effector/Scope)) and it's not required for client-only application. + +:::info{title="since"} +[effector 21.6.0](https://changelog.effector.dev/#effector-21-6-0) +::: + +### Formulae (#configuration-factories-formulae) + +```json +[ + "effector/babel-plugin", + { + "factories": ["path/here"] + } +] +``` + +- Type: `string[]` + +- Factories can have any number of arguments. +- Factories can create any number of units. +- Factories can call any effector methods. +- Factories can call other factories from other modules. +- Modules with factories can export any number of functions. +- Factories should be compiled with `effector/babel-plugin` as well as code which use them. + +### Examples (#configuration-factories-examples) + +```json +// .babelrc +{ + "plugins": [ + [ + "effector/babel-plugin", + { + "factories": ["src/createEffectStatus", "~/createCommonPending"] + } + ] + ] +} +``` + +```js +// ./src/createEffectStatus.js +import { rootDomain } from "./rootDomain"; + +export function createEffectStatus(fx) { + const $status = rootDomain.createStore("init").on(fx.finally, (_, { status }) => status); + + return $status; +} +``` + +```js +// ./src/statuses.js +import { createEffectStatus } from "./createEffectStatus"; +import { fetchUserFx, fetchFriendsFx } from "./api"; + +export const $fetchUserStatus = createEffectStatus(fetchUserFx); +export const $fetchFriendsStatus = createEffectStatus(fetchFriendsFx); +``` + +Import `createEffectStatus` from `'./createEffectStatus'` was treated as factory function, so each store created by it +has its own [sid](/en/api/effector/babel-plugin#sid) and will be handled by [serialize](/en/api/effector/serialize) +independently, although without `factories` they will share the same `sid`. + +## `reactSsr` (#configuration-reactSsr) + +Replaces imports from `effector-react` to `effector-react/scope`. Useful for building both server-side and client-side +builds from the same codebase. + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) the core team recommends deleting this option from `babel-plugin` configuration because [effector-react](/en/api/effector-react) supports SSR by default. +::: + +### Formulae (#configuration-reactSsr-formulae) + +```json +[ + "effector/babel-plugin", + { + "reactSsr": false + } +] +``` + +- Type: `boolean` +- Default: `false` + +## `addNames` (#configuration-addNames) + +Adds name to units factories call. Useful for minification and obfuscation of production builds. + +:::info{title="since"} +[effector 21.8.0](https://changelog.effector.dev/#effector-21-8-0) +::: + +### Formulae (#configuration-addNames-formulae) + +```json +[ + "effector/babel-plugin", + { + "addNames": true + } +] +``` + +- Type: `boolean` +- Default: `true` + +## `addLoc` (#configuration-addLoc) + +Adds location to methods' calls. Used by devtools, for example [effector-logger](https://github.com/effector/logger). + +### Formulae (#configuration-addLoc-formulae) + +```json +[ + "effector/babel-plugin", + { + "addLoc": false + } +] +``` + +- Type: `boolean` +- Default: `false` + +## `debugSids` (#configuration-debugSids) + +Adds a file path and variable name of a unit definition to a sid. Useful for debugging SSR. + +## Formulae (#configuration-debugSids-formulae) + +```json +[ + "effector/babel-plugin", + { + "debugSids": false + } +] +``` + +- Type: `boolean` +- Default: `false` + +## `noDefaults` (#configuration-noDefaults) + +Option for `effector/babel-plugin` for making custom unit factories with clean configuration. + +:::info{title="since"} +[effector 20.2.0](https://changelog.effector.dev/#effector-20-2-0) +::: + +### Formulae (#configuration-noDefaults-formulae) + +```json +[ + "effector/babel-plugin", + { + "noDefaults": false + } +] +``` + +- Type: `boolean` +- Default: `false` + +### Examples (#configuration-noDefaults-examples) + +```json +// .babelrc +{ + "plugins": [ + ["effector/babel-plugin", { "addLoc": true }], + [ + "effector/babel-plugin", + { + "importName": "@lib/createInputField", + "storeCreators": ["createInputField"], + "noDefaults": true + }, + "createInputField" + ] + ] +} +``` + +```js +// @lib/createInputField.js +import { createStore } from "effector"; +import { resetForm } from "./form"; + +export function createInputField(defaultState, { sid, name }) { + return createStore(defaultState, { sid, name }).reset(resetForm); +} +``` + +```js +// src/state.js +import { createInputField } from "@lib/createInputField"; + +const foo = createInputField("-"); +/* + +will be treated as store creator and compiled to + +const foo = createInputField('-', { + name: 'foo', + sid: 'z&si65' +}) + +*/ +``` + +# Usage with Bundlers (#bundlers) + +## Vite + React (SSR) (#bundlers-ViteReactSSR) + +To use with `effector/babel-plugin`, you have to following next steps: + +1. Install `@vitejs/plugin-react` package. +2. `vite.config.js` should be follows: + +> Note: `effector/babel-plugin` is not a package, it is bundled with `effector` + +```js +// vite.config.js +import { defineConfig } from "vite"; +import react from "@vitejs/plugin-react"; + +export default defineConfig({ + plugins: [ + react({ + babel: { + plugins: ["effector/babel-plugin"], + // Use .babelrc files + babelrc: true, + // Use babel.config.js files + configFile: true, + }, + }), + ], +}); +``` diff --git a/src/content/docs/en/api/effector/clearNode.md b/src/content/docs/en/api/effector/clearNode.md new file mode 100644 index 0000000..0ead7bd --- /dev/null +++ b/src/content/docs/en/api/effector/clearNode.md @@ -0,0 +1,84 @@ +--- +title: clearNode +description: Method for destroying stores, events, effects, subscriptions, and domains +redirectFrom: + - /api/effector/clearNode + - /docs/api/effector/clearnode +--- + +```ts +import { clearNode } from "effector"; +``` + +Method for destroying stores, events, effects, subscriptions, and domains. + +# Methods (#methods) + +## `clearNode(unit, config?)` (#methods-clearNode-unit-config) + +### Formulae (#methods-clearNode-unit-config-formulae) + +```ts +clearNode(unit, config?: {deep?: boolean}): void +``` + +### Arguments (#methods-clearNode-unit-config-arguments) + +1. `unit` ([_Store_](/en/api/effector/Store)/[_Event_](/en/api/effector/Event)/[_Effect_](/en/api/effector/Effect)/[_Domain_](/en/api/effector/Domain)/[_Scope_](/en/api/effector/Scope)): unit to be erased. +2. `config: {}` (optional): config object. + - `deep?: boolean` (optional): erase node _and_ all of its computed values. + +### Returns (#methods-clearNode-unit-config-returns) + +`void` + +### Examples (#methods-clearNode-unit-config-examples) + +#### Simple (#methods-clearNode-unit-config-examples-simple) + +```js +import { createStore, createEvent, clearNode } from "effector"; + +const inc = createEvent(); +const $store = createStore(0).on(inc, (x) => x + 1); + +inc.watch(() => console.log("inc called")); +$store.watch((x) => console.log("store state: ", x)); +// => store state: 0 +inc(); +// => inc called +// => store state: 1 +clearNode($store); +inc(); +// => inc called +``` + +[Try it](https://share.effector.dev/WjuSl6aN) + +#### Deep clear (#methods-clearNode-unit-config-examples-deep) + +```js +import { createStore, createEvent, clearNode } from "effector"; + +const inc = createEvent(); +const trigger = inc.prepend(() => {}); +const $store = createStore(0).on(inc, (x) => x + 1); + +trigger.watch(() => console.log("trigger called")); +inc.watch(() => console.log("inc called")); +$store.watch((x) => console.log("store state: ", x)); +// => store state: 0 +trigger(); +// => trigger called +// => inc called +// => store state: 1 +clearNode(trigger, { deep: true }); +trigger(); +// no reaction +inc(); +// no reaction! +// all units, which depend on trigger, are erased +// including inc and store, because it depends on inc +``` + +[Try it](https://share.effector.dev/EkETZtKI) diff --git a/src/content/docs/en/api/effector/combine.mdx b/src/content/docs/en/api/effector/combine.mdx new file mode 100644 index 0000000..fc94cc4 --- /dev/null +++ b/src/content/docs/en/api/effector/combine.mdx @@ -0,0 +1,167 @@ +--- +title: combine +redirectFrom: + - /api/effector/combine + - /docs/api/effector/combine +--- + +import LiveDemo from "../../../../../components/LiveDemo.jsx"; + +This method allows you to get state from each passed store and **combine** it to a single value and save into a single store, that updates every time like each passed store. + +:::warning{title="Caution"} +`combine` returns not just a common store. Instead, it returns [DerivedStore](/en/api/effector/Store#readonly), it cannot be modified by the events or used as `target` in [sample](/en/api/effector/sample). +::: + +# Methods (#methods) + +## `combine(...stores, fn)` (#methods-combine-stores-fn) + +### Formulae (#methods-combine-stores-fn-formulae) + +```ts +const $first: Store<A> +const $second: StoreWritable<B> +const $third: Store<C> | StoreWritable<C> + +$result: Store<D> = combine( + $first, $second, $third, ..., + (first: A, second: B, third: C, ...) => result +) +``` + +- After call `combine`, state of each store is extracted and passed to function arguments, `result` of a function call will be state of store `$result` +- Any number of stores can be passed to `combine`, but the latest argument always should be function-reducer that returns new state +- If function returned the same `result` as previous, store `$result` will not be triggered +- If several stores updated at the same time (during one tick) there will be single call of function and single update of `$result` store + +### Returns (#methods-combine-stores-fn-returns) + +[_DerivedStore_](/en/api/effector/Store#readonly): New derived store + +### Examples (#methods-combine-stores-fn-examples) + +import demo_combineStoresFn from "./demo/_combine-stores-fn.live.js?raw"; + +<LiveDemo client:only="preact" demoFile={demo_combineStoresFn} /> + +## `combine({ A, B, C }, fn?)` (#methods-combine-object-fn) + +:::info +Formerly known as `createStoreObject` +::: + +### Formulae (#methods-combine-object-fn-formulae) + +```ts +const $first: Store<A>; +const $second: StoreWritable<B>; +const $third: Store<C> | StoreWritable<C>; + +$result: Store<{ a: A; b: B; c: C }> = combine({ a: $first, b: $second, c: $third }); +``` + +- Read state from stores `$first`, `$second`, `$third` and assign it to properties `a`, `b`, `c` accordingly, that object will be saved to `$result` store +- Store `$result` contain object `{a, b, c}` and will be updated on each update of passed stores +- If several stores updated at the same time (during one tick) there will be single update of `$result` store + +### Formulae with `fn` (#methods-combine-object-fn-formulae-fn) + +```ts +const $first: Store<A>; +const $second: StoreWritable<B>; +const $third: Store<C> | StoreWritable<C>; + +$result: Store<D> = combine( + { a: $first, b: $second, c: $third }, + ({ a, b, c }: { a: A; b: B; c: C }): D => result, +); +``` + +- Read state from stores `$first`, `$second`, `$third` and assign it to properties `a`, `b`, `c` accordingly, calls function with that object +- The `result` of the function call saved in `$result` store +- If function returned the same `result` as previous, store `$result` will not be triggered +- If several stores updated at the same time (during one tick) there will be single call of function and single update of `$result` store + +### Returns (#methods-combine-object-fn-returns) + +[_DerivedStore_](/en/api/effector/Store#readonly): New derived store + +### Examples (#methods-combine-object-fn-examples) + +import demo_combineObjectFn from "./demo/_combine-object-fn.live.js?raw"; + +<LiveDemo client:only="preact" demoFile={demo_combineObjectFn} /> + +## `combine([A, B, C], fn?)` (#methods-combine-array-fn) + +### Formulae (#methods-combine-array-fn-formulae) + +```ts +const $first: Store<A>; +const $second: StoreWritable<B>; +const $third: Store<C> | StoreWritable<C>; + +$result: Store<D> = combine([$first, $second, $third], ([A, B, C]): D => result); +``` + +- Read state from stores `$first`, `$second`, `$third` and assign it to array with the same order as passed stores, call function with that array +- The `result` of the function call saved in `$result` store +- If function returned the same `result` as previous, store `$result` will not be triggered +- If several stores updated at the same time (during one tick) there will be single call of function and single update of `$result` store + +### Formulae without `fn` (#methods-combine-array-fn-formulae-no-fn) + +```ts +const $first: Store<A>; +const $second: StoreWritable<B>; +const $third: Store<C> | StoreWritable<C>; + +$result: Store<[A, B, C]> = combine([$first, $second, $third]); +``` + +- Read state from stores `$first`, `$second`, `$third` and assign it to array with the same order as passed stores, that array will be saved to `$result` store +- Store `$result` will be updated on each update of passed stores +- If several stores updated at the same time (during one tick) there will be single update of `$result` store + +### Returns (#methods-combine-array-fn-returns) + +[_DerivedStore_](/en/api/effector/Store#readonly): New derived store + +### Examples (#methods-combine-array-fn-examples) + +import demo_combineArrayFn from "./demo/_combine-array-fn.live.js?raw"; + +<LiveDemo client:only="preact" demoFile={demo_combineArrayFn} /> + +## `combine` with primitives and objects (#methods-combine-primitives-objects) + +It works the same as before. Now primitives and objects can be used in `combine`, and `combine` will not be triggered. Effector will not track mutations of objects and primitives. + +### Examples (#methods-combine-primitives-objects-examples) + +import demo_combineNonStoresFn from "./demo/_combine-non-stores-fn.live.js?raw"; + +<LiveDemo client:only="preact" demoFile={demo_combineNonStoresFn} /> + +# Parameters (#parameters) + +All overloads of `combine` with `fn` provided are also supporting optional configuration object as the last parameter. + +## `.skipVoid` (#parameters-skipVoid) + +Flag to control how specifically store should handle `undefined` value _(since `effector 23.0.0`)_. If set to `false` - store will use `undefined` as a value. If set to `true` (deprecated), store will read `undefined` as a "skip update" command and will do nothing + +### Formulae (#parameters-skipVoid-formulae) + +```ts +combine($a, $b, callback, { skipVoid: true }); +``` + +- Type: `boolean` + +### Examples (#parameters-skipVoid-examples) + +```js +const $withFn = combine($a, $b, (a, b) => a || b, { skipVoid: false }); +``` diff --git a/src/content/docs/en/api/effector/createApi.md b/src/content/docs/en/api/effector/createApi.md new file mode 100644 index 0000000..a1c76d5 --- /dev/null +++ b/src/content/docs/en/api/effector/createApi.md @@ -0,0 +1,57 @@ +--- +title: createApi +redirectFrom: + - /api/effector/createApi + - /docs/api/effector/createApi +--- + +```ts +import { createApi } from "effector"; +``` + +`createApi` is a shortcut for generating [events](/en/api/effector/Event) connected to a [store](/en/api/effector/Store) by supplying an object with [_reducers_](/en/explanation/glossary#reducer) for these events. If the source `store` is part of a [domain](/en/api/effector/Domain), then the newly created events will also be within that domain. + +# Methods (#methods) + +## `createApi(store, api)` (#methods-createApi-store-api) + +### Formulae (#methods-createApi-store-api-formulae) + +```ts +createApi(store, api): objectWithEvents +``` + +### Arguments (#methods-createApi-store-api-arguments) + +1. `store` [_Store_](/en/api/effector/Store) +2. `api` (_Object_) An object with [_reducers_](/en/explanation/glossary#reducer) + +### Returns (#methods-createApi-store-api-returns) + +(_Object_) An object with [events](/en/api/effector/Event) + +### Examples (#methods-createApi-store-api-examples) + +```js +import { createStore, createApi } from "effector"; + +const $playerPosition = createStore(0); + +// Creating events and attaching them to the store +const api = createApi($playerPosition, { + moveLeft: (pos, offset) => pos - offset, + moveRight: (pos, offset) => pos + offset, +}); + +$playerPosition.watch((pos) => { + console.log("position", pos); +}); +// => position 0 + +api.moveRight(10); +// => position 10 +api.moveLeft(5); +// => position 5 +``` + +[Try it](https://share.effector.dev/SjVy8dzF) diff --git a/src/content/docs/en/api/effector/createDomain.md b/src/content/docs/en/api/effector/createDomain.md new file mode 100644 index 0000000..709e2fc --- /dev/null +++ b/src/content/docs/en/api/effector/createDomain.md @@ -0,0 +1,47 @@ +--- +title: createDomain +description: createDomain is a method for creating a domain +redirectFrom: + - /api/effector/createDomain + - /docs/api/effector/createDomain +--- + +```ts +import { createDomain, type Domain } from "effector"; +``` + +# Methods (#methods) + +## `createDomain(name?)` (#methods-createDomain-name) + +Creates a [domain](/en/api/effector/Domain) + +### Formulae (#methods-createDomain-name-formulae) + +```typescript +createDomain(name?): Domain +``` + +### Arguments (#methods-createDomain-name-arguments) + +1. `name`? (_string_): domain name. Useful for debugging + +### Returns (#methods-createDomain-name-returns) + +[_Domain_](/en/api/effector/Domain): New domain + +### Examples (#methods-createDomain-name-examples) + +```js +import { createDomain } from "effector"; + +const domain = createDomain(); // Unnamed domain +const httpDomain = createDomain("http"); // Named domain + +const statusCodeChanged = httpDomain.createEvent(); +const downloadFx = httpDomain.createEffect(); +const apiDomain = httpDomain.createDomain(); // nested domain +const $data = httpDomain.createStore({ status: -1 }); +``` + +[Try it](https://share.effector.dev/GMpjINHa) diff --git a/src/content/docs/en/api/effector/createEffect.md b/src/content/docs/en/api/effector/createEffect.md new file mode 100644 index 0000000..94d8ffd --- /dev/null +++ b/src/content/docs/en/api/effector/createEffect.md @@ -0,0 +1,187 @@ +--- +title: createEffect +description: Method for creating an effect +redirectFrom: + - /api/effector/createEffect + - /docs/api/effector/createEffect +--- + +```ts +import { createEffect, type Effect } from "effector"; +``` + +Method for creating an [effect](/en/api/effector/Effect). + +# Methods (#methods) + +## `createEffect(handler)` (#methods-createEffect-handler) + +Creates an effect with the given handler. + +### Formulae (#methods-createEffect-handler-formulae) + +```typescript +createEffect(handler?): Effect<Params, Done, Fail> +``` + +### Arguments (#methods-createEffect-handler-arguments) + +1. `handler` (_Function_): Function to handle effect calls, can also be set using [`.use(handler)`](/en/api/effector/Effect#methods-use-handler). + +### Returns (#methods-createEffect-handler-returns) + +[_Effect_](/en/api/effector/Effect): A new effect. + +:::tip{title="Reminder"} +You must provide a handler either in [`createEffect`](/en/api/effector/createEffect) or in [`.use`](/en/api/effector/Effect#methods-use-handler) method later; otherwise, the effect will throw with the `no handler used in _%effect name%_` error. +::: + +:::info{title="since"} +[effector 21.3.0](https://changelog.effector.dev/#effector-21-3-0) +::: + +### Examples (#methods-createEffect-handler-examples) + +#### Create effect with handler (#methods-createEffect-handler-examples-create-effect-with-handler) + +```js +import { createEffect } from "effector"; + +const fetchUserReposFx = createEffect(async ({ name }) => { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +fetchUserReposFx.done.watch(({ params, result }) => { + console.log(result); +}); + +await fetchUserReposFx({ name: "zerobias" }); +``` + +[Try it](https://share.effector.dev/7K23rdej) + +#### Change state on effect completion (#methods-createEffect-handler-examples-change-state-on-effect-completion) + +```js +import { createStore, createEffect } from "effector"; + +const fetchUserReposFx = createEffect(async ({ name }) => { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +const $repos = createStore([]).on(fetchUserReposFx.doneData, (_, repos) => repos); + +$repos.watch((repos) => { + console.log(`${repos.length} repos`); +}); +// => 0 repos + +await fetchUserReposFx({ name: "zerobias" }); +// => 26 repos +``` + +[Try it](https://share.effector.dev/uAJFC1XM) + +#### Set handler to effect after creating (#methods-createEffect-handler-examples-set-handler-to-effect-after-creating) + +```js +import { createEffect } from "effector"; + +const fetchUserReposFx = createEffect(); + +fetchUserReposFx.use(async ({ name }) => { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +await fetchUserReposFx({ name: "zerobias" }); +``` + +[Try it](https://share.effector.dev/e1QPH9Uq) + +#### Watch effect status (#methods-createEffect-handler-examples-watch-effect-status) + +```js +import { createEffect } from "effector"; + +const fetchUserReposFx = createEffect(async ({ name }) => { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +fetchUserReposFx.pending.watch((pending) => { + console.log(`effect is pending?: ${pending ? "yes" : "no"}`); +}); + +fetchUserReposFx.done.watch(({ params, result }) => { + console.log(params); // {name: 'zerobias'} + console.log(result); // resolved value +}); + +fetchUserReposFx.fail.watch(({ params, error }) => { + console.error(params); // {name: 'zerobias'} + console.error(error); // rejected value +}); + +fetchUserReposFx.finally.watch(({ params, status, result, error }) => { + console.log(params); // {name: 'zerobias'} + console.log(`handler status: ${status}`); + + if (error) { + console.error("handler rejected", error); + } else { + console.log("handler resolved", result); + } +}); + +await fetchUserReposFx({ name: "zerobias" }); +``` + +[Try it](https://share.effector.dev/LeurvtYA) + +## `createEffect(config)` (#methods-createEffect-config) + +Creates an effect with handler and name from a given config object. + +### Formulae (#methods-createEffect-config-formulae) + +```typescript +createEffect({ handler, name }): Effect<Params, Done, Fail> +``` + +### Arguments (#methods-createEffect-config-arguments) + +1. `config?: {}` (_Object_): Effect configuration. + - `handler` (_Function_): Function to handle effect calls, can also be set using [`.use(handler)`](#use). + - `name?` (_string_): Optional effect name. + +### Returns (#methods-createEffect-config-returns) + +[_Effect_](/en/api/effector/Effect): A new effect. + +### Examples (#methods-createEffect-config-examples) + +#### Create named effect (#methods-createEffect-config-examples-create-named-effect) + +```js +import { createEffect } from "effector"; + +const fetchUserReposFx = createEffect({ + name: "fetch user repositories", + async handler({ name }) { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); + }, +}); + +await fetchUserReposFx({ name: "zerobias" }); +``` + +[Try it](https://share.effector.dev/GynSzKee) diff --git a/src/content/docs/en/api/effector/createEvent.md b/src/content/docs/en/api/effector/createEvent.md new file mode 100644 index 0000000..4a13017 --- /dev/null +++ b/src/content/docs/en/api/effector/createEvent.md @@ -0,0 +1,95 @@ +--- +title: createEvent +description: createEvent is a method for creating an event +redirectFrom: + - /api/effector/createEvent + - /docs/api/effector/createEvent +--- + +```ts +import { createEvent } from "effector"; +``` + +# Methods (#methods) + +## `createEvent(name?)` (#methods-createEvent-name) + +Method for creating an [event](/en/api/effector/Event). + +### Formulae (#methods-createEvent-name-formulae) + +```ts +createEvent<T>(name?): Event<T> +createEvent(name?): Event<void> +``` + +### Arguments (#methods-createEvent-name-arguments) + +1. `name`? (_string_): Event name + +### Returns (#methods-createEvent-name-returns) + +[_EventCallable_](/en/api/effector/Event#eventCallable): New event + +### Notes (#methods-createEvent-name-notes) + +[Event](/en/api/effector/Event) – it is a function which allows to change state when called (see [simple example](#methods-createEvent-name-examples-simple)) also it can be a good way to extract data (see [map and watch example](#methods-createEvent-name-examples-map-watch)). Also, it allows us to send data to another event or effect via effector operators. + +### Examples (#methods-createEvent-name-examples) + +#### Simple (#methods-createEvent-name-examples-simple) + +```js +import { createStore, createEvent } from "effector"; + +const incrementBy = createEvent(); +const resetCounter = createEvent(); +const $counter = createStore(0); + +$counter.on(incrementBy, (counter, number) => counter + number).reset(resetCounter); + +$counter.watch((counter) => { + console.log("counter is now", counter); +}); +// => counter is now 0 + +incrementBy(10); +// => counter is now 10 + +incrementBy(10); +// => counter is now 20 + +incrementBy(10); +// => counter is now 30 + +resetCounter(); +// => counter is now 0 +``` + +[Try it](https://share.effector.dev/oFkPG4yJ) + +We created a store `$counter` and an event `incrementBy`, and started watching the store.<br/> +Notice the function call `incrementBy(10)`. Whenever you will call `incrementBy(10)`, you can look at the console and see how state of `$counter` changes. + +#### Using `.map` and `.watch` (#methods-createEvent-name-examples-map-watch) + +```js +import { createEvent } from "effector"; + +const fullNameReceived = createEvent(); + +const firstNameReceived = fullNameReceived.map((fullName) => fullName.split(" ")[0]); +const lastNameReceived = fullNameReceived.map((fullName) => fullName.split(" ")[1]); +const firstNameUppercaseReceived = firstNameReceived.map((firstName) => firstName.toUpperCase()); + +firstNameReceived.watch((firstName) => console.log("First name", firstName)); +lastNameReceived.watch((lastName) => console.log("Last name", lastName)); +firstNameUppercaseReceived.watch((firstName) => console.log("Upper case", firstName)); + +fullNameReceived("John Doe"); +// => First name John +// => Last name Doe +// => Upper case JOHN +``` + +[Try it](https://share.effector.dev/TJWghQ2z) diff --git a/src/content/docs/en/api/effector/createStore.md b/src/content/docs/en/api/effector/createStore.md new file mode 100644 index 0000000..2d29eff --- /dev/null +++ b/src/content/docs/en/api/effector/createStore.md @@ -0,0 +1,265 @@ +--- +title: createStore +description: createStore is a method for creating a store +redirectFrom: + - /api/effector/createStore + - /docs/api/effector/createStore +--- + +```ts +import { createStore, type Store, type StoreWritable } from "effector"; +``` + +# Methods (#methods) + +## `createStore(defaultState)` (#methods-createStore-defaultState) + +Method for creating a [store](/en/api/effector/Store). + +### Formulae (#methods-createStore-defaultState-formulae) + +```ts +createStore<T>(defaultState: T): StoreWritable<T> +``` + +### Arguments (#methods-createStore-defaultState-arguments) + +1. `defaultState` (_State_): Default state + +### Throws (#methods-createStore-defaultState-throws) + +#### unit call from pure function is not supported, use operators like sample instead (#methods-createStore-defaultState-throws-unit-call-from-pure) + +> Since: effector 23.0.0 + +Occurs when events or effects are called from [pure functions](/en/explanation/glossary#purity), like updateFilter: + +```ts +const someHappened = createEvent<number>(); +const $counter = createStore(0, { + updateFilter(a, b) { + someHappened(a); // THROWS! + return a < b; + }, +}); +``` + +To resolve this, use `sample`: + +```ts +const someHappened = createEvent<number>(); +const $counter = createStore(0, { + updateFilter(a, b) { + return a < b; + }, +}); + +sample({ + clock: $counter, + target: someHappened, +}); +``` + +### Returns (#methods-createStore-defaultState-returns) + +[_Store_](/en/api/effector/Store): New store + +### Examples (#methods-createStore-defaultState-examples) + +#### Basic (#methods-createStore-defaultState-examples-basic) + +```js +import { createEvent, createStore } from "effector"; + +const addTodo = createEvent(); +const clearTodoList = createEvent(); + +const $todos = createStore([]) + // Will update store when addTodo is fired + .on(addTodo, (list, todo) => [...list, todo]) + // Will reset store to default state when clearTodos is fired + .reset(clearTodoList); + +// Create mapped store +const $selectedTodos = $todos.map((todos) => { + return todos.filter((todo) => todo.selected); +}); + +// Log initial store value and each change +$todos.watch((todos) => { + console.log("todos", todos); +}); +// => todos [] + +addTodo("go shopping"); +// => todos ['go shopping'] + +addTodo("go to the gym"); +// => todos ['go shopping', 'go to the gym'] + +clearTodoList(); +// => todos [] +``` + +[Try it](https://share.effector.dev/MNibrAFC) + +## `createStore(defaultState, config)` (#methods-createStore-defaultState-config) + +Method for creating a [store](/en/api/effector/Store) but with configuration. + +### Formulae (#methods-createStore-defaultState-config-formulae) + +```ts +createStore<T, SerializedState extends Json = Json>(defaultState: T, config: { + name?: string + updateFilter?: (update: T, current: T) => boolean + skipVoid?: boolean + serialize?: 'ignore' | { + write: (state: State) => SerializedState + read: (json: SerializedState) => State + } +}): StoreWritable<T> +``` + +### Arguments (#methods-createStore-defaultState-config-arguments) + +1. `defaultState` (_State_): Default state +2. `config` (_Object_): Optional configuration + - `name` (_String_): Name for the store. Babel plugin can set it from the variable name, if not passed explicitly in config. + - `updateFilter` (_Function_): Function that prevents store from updating when it returns `false`. Accepts updated state as the first argument and current state as the second argument. Redundant for most cases since store already ensures that update is not `undefined` and not equal (`!==`) to current state _(since `effector 21.8.0`)_ + - `serialize: 'ignore'`: Option to disable store serialization when [serialize](/en/api/effector/serialize) is called _(since `effector 22.0.0`)_ + - `serialize` (_Object_): Configuration object to handle store state serialization in custom way. `write` – called on [serialize](/en/api/effector/serialize), transforms value to JSON value – primitive type or plain object/array. `read` – parse store state from JSON value, called on [fork](/en/api/effector/fork), if provided `values` is the result of `serialize` call. + - `domain`: (_Domain_): Domain to attach store to after creation. + - `skipVoid`: (_boolean_): Flag to control how specifically store should handle `undefined` value _(since `effector 23.0.0`)_. If set to `false` - store will use `undefined` as a value. If set to `true` (deprecated), store will interpret `undefined` as a "skip update" command and will do nothing. + +### Throws (#methods-createStore-defaultState-config-throws) + +The same behaviour like for regular [`createStore(defaultState)`](#methods-createStore-defaultState-throws). + +### Returns (#methods-createStore-defaultState-config-returns) + +[_Store_](/en/api/effector/Store): New store + +### Examples (#methods-createStore-defaultState-config-examples) + +#### With `updateFilter` (#methods-createStore-defaultState-examples-updateFilter) + +```js +import { createEvent, createStore, sample } from "effector"; + +const punch = createEvent(); +const veryStrongHit = createEvent(); + +const $lastPunchStrength = createStore(0, { + // If store should be updated with strength less than 400 kg + // update will be skipped + updateFilter: (strength) => strength >= 400, +}); + +$lastPunchStrength.on(punch, (_, strength) => strength); + +// Each store update should trigger event `veryStrongHit` +sample({ clock: $lastPunchStrength, target: veryStrongHit }); + +// Watch on store prints initial state +$lastPunchStrength.watch((strength) => console.log("Strength: %skg", strength)); +// => Strength: 0kg + +veryStrongHit.watch((strength) => { + console.log("Wooow! It was very strong! %skg", strength); +}); + +punch(200); // updateFilter prevented update +punch(300); // Same here, store doesn't update, value remains `0` +punch(500); // Yeeah! updateFilter allows store update +// => Strength: 500kg +// => Wooow! It was very strong! 500kg +punch(100); // No update as well +``` + +[Try it](https://share.effector.dev/rtxfqObf) + +#### With `serialize: ignore` (#methods-createStore-defaultState-examples-serializeIgnore) + +```js +import { createEvent, createStore, serialize, fork, allSettled } from "effector"; + +const readPackage = createEvent(); + +const $name = createStore(""); +const $version = createStore(0, { serialize: "ignore" }); + +$name.on(readPackage, (_, { name }) => name); +$version.on(readPackage, (_, { version }) => version); + +// Watchers always called for scoped changes +$name.watch((name) => console.log("name '%s'", name)); +$version.watch((version) => console.log("version %s", version)); +// => name '' +// => version 0 + +// Please, note, `fork()` call doesn't trigger watches +// In the opposit of `hydrate()` call +const scope = fork(); + +// By default serialize saves value only for the changed stores +// Review `onlyChanges` option https://effector.dev/api/effector/serialize +const values = serialize(scope); +console.log(values); +// => {} + +// Let's change our stores +await allSettled(readPackage, { + scope, + params: { name: "effector", version: 22 }, +}); +// => name 'effector' +// => version 22 + +const actualValues = serialize(scope); +console.log(actualValues); +// => {n74m6b: "effector"} +// `$version` store has `serialize: ignore`, so it's not included +``` + +[Try it](https://share.effector.dev/aLKAHDOM) + +#### Custom `serialize` configuration (#methods-createStore-defaultState-examples-customSerialize) + +```ts +import { createEvent, createStore, serialize, fork, allSettled } from "effector"; + +const saveDate = createEvent(); +const $date = createStore<null | Date>(null, { + // Date object is automatically serialized to ISO date string by JSON.stringify + // but it is not parsed to Date object by JSON.parse + // which will lead to a mismatch during server side rendering + // + // Custom `serialize` config solves this issue + serialize: { + write: (dateOrNull) => (dateOrNull ? dateOrNull.toISOString() : dateOrNull), + read: (isoStringOrNull) => (isoStringOrNull ? new Date(isoStringOrNull) : isoStringOrNull), + }, +}).on(saveDate, (_, p) => p); + +const serverScope = fork(); + +await allSettled(saveDate, { scope: serverScope, params: new Date() }); + +const serverValues = serialize(serverScope); +// `serialize.write` of `$date` store is called + +console.log(serverValues); +// => { nq1e2rb: "2022-11-05T15:38:53.108Z" } +// Date object saved as ISO string + +const clientScope = fork({ values: serverValues }); +// `serialize.read` of `$date` store is called + +const currentValue = clientScope.getState($date); +console.log(currentValue); +// => Date 11/5/2022, 10:40:13 PM +// ISO date string is parsed back to Date object +``` + +[Try it](https://share.effector.dev/YFkUlqPv) diff --git a/src/content/docs/en/api/effector/createWatch.md b/src/content/docs/en/api/effector/createWatch.md new file mode 100644 index 0000000..91cf84c --- /dev/null +++ b/src/content/docs/en/api/effector/createWatch.md @@ -0,0 +1,68 @@ +--- +title: createWatch +redirectFrom: + - /docs/api/effector/createwatch +--- + +```ts +import { createWatch } from "effector"; +``` + +# Methods (#methods) + +## `createWatch(config)` (#methods-createWatch-config) + +Creates a subscription on unit (store, event, or effect). + +### Formulae (#methods-createWatch-config-formulae) + +```ts +createWatch<T>(config: { + unit: Unit<T> + fn: (payload: T) => void + scope?: Scope +}): Subscription +``` + +### Arguments (#methods-createWatch-config-arguments) + +1. `config` (_Object_): Configuration + - `unit` (_Unit_): Target unit (store, event of effect) that will be watched + - `fn` (_Function_): Function that will be called when the unit is triggered. Accepts the unit's payload as the first argument. + - `scope` ([_Scope_](/en/api/effector/Scope)): An optional scope object (forked instance) to restrict watcher calls on particular scope. + +### Returns (#methods-createWatch-config-returns) + +[_Subscription_](/en/explanation/glossary#subscription): Unsubscribe function + +### Examples (#methods-createWatch-config-examples) + +#### With scope (#methods-createWatch-config-examples-scope) + +```js +import { createWatch, createEvent, fork, allSettled } from "effector"; + +const changeName = createEvent(); + +const scope = fork(); + +const unwatch = createWatch({ unit: changeName, scope, fn: console.log }); + +await allSettled(changeName, { scope, params: "John" }); // output: John +changeName("John"); // no output +``` + +#### Without scope (#methods-createWatch-config-examples-no-scope) + +```js +import { createWatch, createEvent, fork, allSettled } from "effector"; + +const changeName = createEvent(); + +const scope = fork(); + +const unwatch = createWatch({ unit: changeName, fn: console.log }); + +await allSettled(changeName, { scope, params: "John" }); // output: John +changeName("John"); // output: John +``` diff --git a/src/content/docs/en/api/effector/demo/_combine-array-fn.live.js b/src/content/docs/en/api/effector/demo/_combine-array-fn.live.js new file mode 100644 index 0000000..293ac80 --- /dev/null +++ b/src/content/docs/en/api/effector/demo/_combine-array-fn.live.js @@ -0,0 +1,11 @@ +import { createStore, combine } from "effector"; + +const $r = createStore(255); +const $g = createStore(0); +const $b = createStore(255); + +const $color = combine([$r, $g, $b]); +$color.watch(console.log); // => [255, 0, 255] + +const $sum = combine([$r, $g, $b], ([r, g, b]) => r + g + b); +$sum.watch(console.log); // => 510 diff --git a/src/content/docs/en/api/effector/demo/_combine-non-stores-fn.live.js b/src/content/docs/en/api/effector/demo/_combine-non-stores-fn.live.js new file mode 100644 index 0000000..88d2818 --- /dev/null +++ b/src/content/docs/en/api/effector/demo/_combine-non-stores-fn.live.js @@ -0,0 +1,22 @@ +import { createStore, combine } from "effector"; + +const $a = createStore("a"); +const b = 2; +const c = [false]; +const d = { value: 1 }; + +const $resultUsingComa = combine($a, b, c, d); +const $resultUsingArray = combine([$a, b, c, d]); +const $resultUsingObject = combine({ $a, b, c, d }); + +const $withFn = combine($a, b, c, d, (a, b) => ({ a, b })); + +$resultUsingComa.watch(console.log); // => ["a", 2, [false], {value: 1}] +$resultUsingArray.watch(console.log); // => ["a", 2, [false], {value: 1}] +$resultUsingObject.watch(console.log); // => {$a: "a", b: 2, c: [false], d: {value: 1}} +$withFn.watch(console.log); // => {a: "a", b: 2} + +// will not trigger combine, but object and array will be changed because of reference +// uncomment the code below to see changes +// c.push(true) +// d.value = 2 diff --git a/src/content/docs/en/api/effector/demo/_combine-object-fn.live.js b/src/content/docs/en/api/effector/demo/_combine-object-fn.live.js new file mode 100644 index 0000000..d46156a --- /dev/null +++ b/src/content/docs/en/api/effector/demo/_combine-object-fn.live.js @@ -0,0 +1,11 @@ +import { createStore, combine } from "effector"; + +const $r = createStore(255); +const $g = createStore(0); +const $b = createStore(255); + +const $color = combine({ r: $r, g: $g, b: $b }); +$color.watch(console.log); // => {r: 255, b: 0, b: 255} + +const $sum = combine({ r: $r, g: $g, b: $b }, ({ r, g, b }) => r + g + b); +$sum.watch(console.log); // => 510 diff --git a/src/content/docs/en/api/effector/demo/_combine-stores-fn.live.js b/src/content/docs/en/api/effector/demo/_combine-stores-fn.live.js new file mode 100644 index 0000000..09bf515 --- /dev/null +++ b/src/content/docs/en/api/effector/demo/_combine-stores-fn.live.js @@ -0,0 +1,13 @@ +import { createStore, combine } from "effector"; + +const $balance = createStore(0); +const $username = createStore("zerobias"); + +const $greeting = combine($balance, $username, (balance, username) => { + return `Hello, ${username}. Your balance is ${balance}`; +}); + +$greeting.watch((data) => console.log(data)); // => Hello, zerobias. Your balance is 0 + +const $arrStores = combine([$balance, $username]); +$arrStores.watch(console.log); // => [0, 'zerobias'] diff --git a/src/content/docs/en/api/effector/fork.md b/src/content/docs/en/api/effector/fork.md new file mode 100644 index 0000000..705fa13 --- /dev/null +++ b/src/content/docs/en/api/effector/fork.md @@ -0,0 +1,233 @@ +--- +title: fork +redirectFrom: + - /api/effector/fork + - /docs/api/effector/fork +--- + +```ts +import { fork, type Scope } from "effector"; +``` + +# Methods (#methods) + +## `fork()` (#methods-fork) + +:::info{title="since"} + +introduced in [effector 22.0.0](https://changelog.effector.dev/#effector-22-0-0) + +::: + +Creates an isolated instance of application. +Primary purposes of this method are SSR and testing. + +### Formulae (#methods-fork-formulae) + +```ts +fork(): Scope +``` + +### Returns (#methods-fork-returns) + +[_Scope_](/en/api/effector/Scope): New fresh scope + +### Examples (#methods-fork-examples) + +#### Create two instances with independent counter state (#methods-fork-examples-create-two-instances) + +```js +import { createStore, createEvent, fork, allSettled } from "effector"; + +const inc = createEvent(); +const dec = createEvent(); +const $counter = createStore(0); + +$counter.on(inc, (value) => value + 1); +$counter.on(dec, (value) => value - 1); + +const scopeA = fork(); +const scopeB = fork(); + +await allSettled(inc, { scope: scopeA }); +await allSettled(dec, { scope: scopeB }); + +console.log($counter.getState()); // => 0 +console.log(scopeA.getState($counter)); // => 1 +console.log(scopeB.getState($counter)); // => -1 +``` + +[Try it](https://share.effector.dev/dBSC59h8) + +## `fork(options)` (#methods-fork-options) + +Allows to set values for stores in scope and replace handlers for effects. + +:::info{title="since"} + +support for array of tuples in `values` and `handlers` introduced in [effector 22.0.0](https://changelog.effector.dev/#effector-22-0-0) + +::: + +### Formulae (#methods-fork-options-formulae) + +```ts +fork(options: { values?, handlers? }): Scope +``` + +### Arguments (#methods-fork-options-arguments) + +1. `options: { values?, handlers? }` — Object with optional values and handlers + +#### `values` (#methods-fork-options-arguments-values) + +Option to provide initial states for stores. + +Can be used in three ways: + +1. Array of tuples with stores and values: + +```ts +fork({ + values: [ + [$user, "alice"], + [$age, 21], + ], +}); +``` + +2. Map with stores and values: + +```ts +fork({ + values: new Map().set($user, "alice").set($age, 21), +}); +``` + +3. Plain object: `{[sid: string]: value}` + +```ts +fork({ + values: { + [$user.sid]: "alice", + [$age.sid]: 21, + }, +}); +``` + +<br /> + +:::info{title="Explanation"} +Such objects are created by [serialize](/en/api/effector/serialize), in application code **array of tuples is preferred** +::: + +#### `handlers` (#methods-fork-options-arguments-handlers) + +Option to provide handlers for effects. + +Can be used in different ways: + +1. Array of tuples with effects and handlers: + +```ts +fork({ + handlers: [ + [getMessageFx, (params) => ({ id: 0, text: "message" })], + [getUserFx, async (params) => ({ name: "alice", age: 21 })], + ], +}); +``` + +2. Map with effects and handlers: + +```ts +fork({ + handlers: new Map() + .set(getMessageFx, (params) => ({ id: 0, text: "message" })) + .set(getUserFx, async (params) => ({ name: "alice", age: 21 })), +}); +``` + +3. Plain object: `{[sid: string]: handler}` + +```ts +fork({ + handlers: { + [getMessageFx.sid]: (params) => ({ id: 0, text: "message" }), + [getUserFx.sid]: async (params) => ({ name: "alice", age: 21 }), + }, +}); +``` + +<br /> + +:::warning{title="deprecation"} +Such objects are deprecated since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) and will be removed in future versions. Array of tuples is preferred. +::: + +### Returns (#methods-fork-options-returns) + +[_Scope_](/en/api/effector/Scope): New fresh scope + +### Examples (#methods-fork-options-examples) + +#### Set initial state for store and change handler for effect (#methods-fork-examples-set-initial-state-and-change-handler) + +This is an example of test, which ensures that after a request to the server, the value of `$friends` is filled. + +```ts +import { createEffect, createStore, fork, allSettled } from "effector"; + +const fetchFriendsFx = createEffect<{ limit: number }, string[]>(async ({ limit }) => { + /* some client-side data fetching */ + return []; +}); +const $user = createStore("guest"); +const $friends = createStore([]); + +$friends.on(fetchFriendsFx.doneData, (_, result) => result); + +const testScope = fork({ + values: [[$user, "alice"]], + handlers: [[fetchFriendsFx, () => ["bob", "carol"]]], +}); + +/* trigger computations in scope and await all called effects */ +await allSettled(fetchFriendsFx, { + scope: testScope, + params: { limit: 10 }, +}); + +/* check value of store in scope */ +console.log(testScope.getState($friends)); +// => ['bob', 'carol'] +``` + +[Try it](https://share.effector.dev/gnNbGZuu) + +## `fork(domain, options?)` (#methods-fork-domain) + +:::info{title="since"} + +introduced in [effector 21.0.0](https://changelog.effector.dev/#effector-21-0-0) + +::: + +### Formulae (#methods-fork-domain-formulae) + +```ts +fork(domain: Domain, options?: { values?, handlers? }): Scope +``` + +### Arguments (#methods-fork-domain-arguments) + +1. `domain` ([_Domain_](/en/api/effector/Domain)): Optional domain to fork. +2. `options: { values?, handlers? }` — Object with optional [values](#methods-fork-options-arguments-values) and [handlers](#methods-fork-options-arguments-handlers) + +### Returns (#methods-fork-domain-returns) + +[_Scope_](/en/api/effector/Scope): New fresh scope + +### Examples (#methods-fork-domain-examples) + +TBD diff --git a/src/content/docs/en/api/effector/forward.md b/src/content/docs/en/api/effector/forward.md new file mode 100644 index 0000000..9f4b459 --- /dev/null +++ b/src/content/docs/en/api/effector/forward.md @@ -0,0 +1,112 @@ +--- +title: forward +description: Method to create connection between units in a declarative way. Send updates from one set of units to another +redirectFrom: + - /api/effector/forward + - /docs/api/effector/forward +--- + +```ts +import { forward, type Subscription } from "effector"; +``` + +Method to create connection between units in a declarative way. Send updates from one set of units to another. + +# Methods (#methods) + +## `forward({ from, to })` (#methods-forward) + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0). + +The core team recommends using [sample](/en/api/effector/sample) instead of `forward`. +::: + +### Formulae (#methods-forward-formulae) + +```ts +forward({ + from: Unit | Unit[], + to: Unit | Unit[] +}): Subscription +``` + +### Arguments (#methods-forward-arguments) + +1. `from` ([Unit | Unit\[\]](/en/explanation/glossary#common-unit)): Source of updates. Forward will listen for changes of these units + + - if an [_Event_] is passed, `to` will be triggered on each event trigger and receives event argument + - if a [_Store_] is passed, `to` will be triggered on each store **change** and receives new value of the store + - if an [_Effect_] is passed, `to` will be triggered on each effect call and receives effect parameter + - if an array of [units](/en/explanation/glossary#common-unit) is passed, `to` will be triggered when any unit in `from` array is triggered + +2. `to` ([Unit | Unit\[\]](/en/explanation/glossary#common-unit)): Target for updates. `forward` will trigger these units with data from `from` + - if passed an [_Event_], it will be triggered with data from `from` unit + - if passed a [_Store_], data from `from` unit will be written to store and **trigger its update** + - if passed an [_Effect_], it will be called with data from `from` unit as parameter + - if `to` is an array of [units](/en/explanation/glossary#common-unit), each unit in that array will be triggered + +### Returns (#methods-forward-returns) + +[Subscription](/en/explanation/glossary#subscription): Unsubscribe function. It breaks connection between `from` and `to`. After call, `to` will not be triggered anymore. + +:::info{title="since"} +Arrays of units are supported since [effector 20.6.0](https://changelog.effector.dev/#effector-20-6-0) +::: + +### Examples (#methods-forward-examples) + +#### Send store updates to another store (#methods-forward-examples-send-store-updates) + +```js +import { createStore, createEvent, forward } from "effector"; + +const $store = createStore(1); +const event = createEvent(); + +forward({ + from: event, + to: $store, +}); + +$store.watch((state) => console.log("store changed: ", state)); +// => store changed: 1 + +event(200); +// => store changed: 200 +``` + +[Try it](https://share.effector.dev/UeJbgRG9) + +#### Forward between arrays of units (#methods-forward-examples-forward-between-arrays) + +```js +import { createEvent, forward } from "effector"; + +const firstSource = createEvent(); +const secondSource = createEvent(); + +const firstTarget = createEvent(); +const secondTarget = createEvent(); + +forward({ + from: [firstSource, secondSource], + to: [firstTarget, secondTarget], +}); + +firstTarget.watch((e) => console.log("first target", e)); +secondTarget.watch((e) => console.log("second target", e)); + +firstSource("A"); +// => first target A +// => second target A +secondSource("B"); +// => first target B +// => second target B +``` + +[Try it](https://share.effector.dev/8aVpg8nU) + +[_effect_]: /en/api/effector/Effect +[_store_]: /en/api/effector/Store +[_event_]: /en/api/effector/Event diff --git a/src/content/docs/en/api/effector/fromObservable.md b/src/content/docs/en/api/effector/fromObservable.md new file mode 100644 index 0000000..8ede09a --- /dev/null +++ b/src/content/docs/en/api/effector/fromObservable.md @@ -0,0 +1,47 @@ +--- +title: fromObservable +redirectFrom: + - /api/effector/fromObservable + - /docs/api/effector/fromObservable +--- + +```ts +import { fromObservable, type Observable } from "effector"; +``` + +# Methods (#methods) + +## `fromObservable()` (#methods-fromObservable) + +Creates an event containing all items from an Observable. + +### Formulae (#methods-fromObservable-formulae) + +```ts +fromObservable<T>(source: Observable<T>): Event<T> +``` + +### Arguments (#methods-fromObservable-arguments) + +1. `observable` (_Observable_) + +### Returns (#methods-fromObservable-returns) + +[_Event_](/en/api/effector/Event): New event + +### Examples (#methods-fromObservable-examples) + +#### Basic use case (#methods-fromObservable-examples-basic-use-case) + +```js +import { interval } from "rxjs"; +import { fromObservable } from "effector"; + +//emit value in sequence every 1 second +const source = interval(1000); + +const event = fromObservable(source); + +//output: 0,1,2,3,4,5.... +event.watch(console.log); +``` diff --git a/src/content/docs/en/api/effector/guard.md b/src/content/docs/en/api/effector/guard.md new file mode 100644 index 0000000..7286fe0 --- /dev/null +++ b/src/content/docs/en/api/effector/guard.md @@ -0,0 +1,176 @@ +--- +title: guard +description: Method for conditional event routing. +redirectFrom: + - /api/effector/guard + - /docs/api/effector/guard +--- + +```ts +import { guard } from "effector"; +``` + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0). + +The core team recommends using [sample](/en/api/effector/sample) instead of `guard`. +::: + +Method for conditional event routing. +It provides a way to control one dataflow with the help of another: when the condition and the data are in different places, we can use `guard` with stores as filters to trigger events when condition state is true, thereby modulate signals without mixing them. + +# Methods (#methods) + +## `guard({ clock?, source?, filter, target? })` (#methods-guard-clock-source-filter-target) + +### Formulae (#methods-guard-clock-source-filter-target-formulae) + +```ts +guard({ clock?, source?, filter, target? }): target +``` + +:::info +Either `clock` or `source` is required +::: + +When `clock` is triggered, check `filter` for [truthy] and call `target` with data from `source` if `true`. + +- If `clock` is not passed, `guard` will be triggered on every `source` update +- If `source` is not passed, call `target` with data from `clock` +- If `target` is not passed, create [_Event_](/en/api/effector/Event) with type of `source` and return it from `guard()` +- If `filter` is [_Store_](/en/api/effector/Store), check it value for [truthy] +- If `filter` is `Function`, call it with data from `source` and check result for [truthy] + +[truthy]: https://developer.mozilla.org/en-US/docs/Glossary/Truthy + +:::info{title="since"} +`clock` in `guard` is available since [effector 21.8.0](https://changelog.effector.dev/#effector-21-8-0) +::: + +## `guard({source, filter, target?})` (#methods-guard-source-filter-target) + +### Arguments (#methods-guard-source-filter-target-arguments) + +1. `params` (_Object_): Configuration object + +### Returns (#methods-guard-source-filter-target-returns) + +[_Event_](/en/api/effector/Event), which fires upon `clock` trigger + +### Examples (#methods-guard-source-filter-target-examples) + +#### Basic (#methods-guard-source-filter-target-examples-basic) + +```js +import { createStore, createEffect, createEvent, guard } from "effector"; + +const clickRequest = createEvent(); +const fetchRequest = createEffect((n) => new Promise((rs) => setTimeout(rs, 2500, n))); + +const $clicks = createStore(0).on(clickRequest, (x) => x + 1); +const $requestsCount = createStore(0).on(fetchRequest, (x) => x + 1); + +const $isIdle = fetchRequest.pending.map((pending) => !pending); + +/* +1. on clickRequest +2. if $isIdle is true +3. take current $clicks value +4. and call fetchRequest with it +*/ +guard({ + clock: clickRequest /* 1 */, + filter: $isIdle /* 2 */, + source: $clicks /* 3 */, + target: fetchRequest /* 4 */, +}); +``` + +See [ui visualization](https://share.effector.dev/zLB4NwNV) + +#### Function predicate (#methods-guard-source-filter-target-examples-function-predicate) + +```js +import { createEffect, createEvent, guard } from "effector"; + +const submitForm = createEvent(); +const searchUser = createEffect(); + +guard({ + source: submitForm, + filter: (user) => user.length > 0, + target: searchUser, +}); + +submitForm(""); // nothing happens +submitForm("alice"); // ~> searchUser('alice') +``` + +[Try it](https://share.effector.dev/84j97tZ7) + +## `guard(source, {filter: booleanStore})` (#methods-guard-source-filter-booleanStore) + +### Arguments (#methods-guard-source-filter-booleanStore-arguments) + +1. `source` ([_Store_](/en/api/effector/Store)/[_Event_](/en/api/effector/Event)/[_Effect_](/en/api/effector/Effect)): Source unit. Will trigger given `guard` on updates +2. `filter` ([_Store_](/en/api/effector/Store)): Filter store + +### Examples (#methods-guard-source-filter-booleanStore-examples) + +#### Store filter (#methods-guard-source-filter-booleanStore-examples-store-filter) + +```js +import { createEvent, createStore, createApi, guard } from "effector"; + +const trigger = createEvent(); +const $unlocked = createStore(true); + +const { lock, unlock } = createApi($unlocked, { + lock: () => false, + unlock: () => true, +}); + +const target = guard(trigger, { + filter: $unlocked, +}); + +target.watch(console.log); +trigger("A"); +lock(); +trigger("B"); // nothing happens +unlock(); +trigger("C"); +``` + +[Try it](https://share.effector.dev/6bqOCO4y) + +## `guard(source, {filter: predicate})` (#methods-guard-source-filter-predicate) + +### Arguments (#methods-guard-source-filter-predicate-arguments) + +1. `source` ([_Store_](/en/api/effector/Store)/[_Event_](/en/api/effector/Event)/[_Effect_](/en/api/effector/Effect)): Source unit. Will trigger given `guard` on updates +2. `filter` (_(payload) => Boolean_): Predicate function, [should be **pure**](/en/explanation/glossary#purity) + +### Examples (#methods-guard-source-filter-predicate-examples) + +#### Predicate function (#methods-guard-source-filter-predicate-examples-predicate-function) + +```js +import { createEvent, guard } from "effector"; + +const source = createEvent(); +const target = guard(source, { + filter: (x) => x > 0, +}); + +target.watch(() => { + console.log("target called"); +}); + +source(0); +// nothing happens +source(1); +// target called +``` + +[Try it](https://share.effector.dev/ethzpd8Y) diff --git a/src/content/docs/en/api/effector/hydrate.md b/src/content/docs/en/api/effector/hydrate.md new file mode 100644 index 0000000..2716102 --- /dev/null +++ b/src/content/docs/en/api/effector/hydrate.md @@ -0,0 +1,56 @@ +--- +title: hydrate +redirectFrom: + - /api/effector/hydrate + - /docs/api/effector/hydrate +--- + +```ts +import { hydrate } from "effector"; +``` + +A companion method for [_serialize_](/en/api/effector/serialize). Hydrates provided values into corresponding stores within a provided domain or scope. The main purpose is an application state hydration on the client side after SSR. + +# Methods (#methods) + +## `hydrate(domainOrScope, {values})` (#methods-hydrate-domainOrScope-values) + +:::warning +You need to make sure that the store is created beforehand, otherwise, the hydration might fail. This could be the case if you keep store initialization/hydration scripts separate from stores' creation. +::: + +### Formulae (#methods-hydrate-domainOrScope-values-formulae) + +```ts +hydrate(domainOrScope: Domain | Scope, { values: Map<Store<any>, any> | {[sid: string]: any} }): void +``` + +### Arguments (#methods-hydrate-domainOrScope-values-arguments) + +1. `domainOrScope`: [domain](/en/api/effector/Domain) or [scope](/en/api/effector/Scope) which will be filled with given `values` +2. `values`: a mapping from store sids to store values or a Map where keys are [store](/en/api/effector/Store) objects and values contain initial store value + +### Returns (#methods-hydrate-domainOrScope-values-returns) + +`void` + +### Examples (#methods-hydrate-domainOrScope-values-examples) + +Populate store with a predefined value + +```js +import { createStore, createDomain, fork, serialize, hydrate } from "effector"; + +const domain = createDomain(); +const $store = domain.createStore(0); + +hydrate(domain, { + values: { + [$store.sid]: 42, + }, +}); + +console.log($store.getState()); // 42 +``` + +[Try it](https://share.effector.dev/zZoQ5Ewm) diff --git a/src/content/docs/en/api/effector/index.md b/src/content/docs/en/api/effector/index.md new file mode 100644 index 0000000..f896421 --- /dev/null +++ b/src/content/docs/en/api/effector/index.md @@ -0,0 +1,69 @@ +--- +title: effector +redirectFrom: + - /api/effector +--- + +List of the methods + +## Unit Definitions (#unit-definitions) + +- [Event](/en/api/effector/Event) +- [Effect](/en/api/effector/Effect) +- [Store](/en/api/effector/Store) +- [Domain](/en/api/effector/Domain) +- [Scope](/en/api/effector/Scope) + +## Unit Creators (#unit-creators) + +- [createEvent](/en/api/effector/createEvent) +- [createStore](/en/api/effector/createStore) +- [createEffect](/en/api/effector/createEffect) +- [createDomain](/en/api/effector/createDomain) + +## Common Methods (#common-methods) + +- [combine(...stores, f)](/en/api/effector/combine) +- [attach({effect, mapParams?, source?})](/en/api/effector/attach) +- [sample({clock, source, fn, target})](/en/api/effector/sample) +- [merge([eventA, eventB])](/en/api/effector/merge) +- [split(event, cases)](/en/api/effector/split) +- [createApi(store, api)](/en/api/effector/createApi) + +## Fork API (#fork-api) + +- [fork](/en/api/effector/fork) +- [serialize](/en/api/effector/serialize) +- [allSettled](/en/api/effector/allSettled) +- [scopeBind](/en/api/effector/scopeBind) +- [hydrate](/en/api/effector/hydrate) + +## Plugins (#plugins) + +- [effector/babel-plugin](/en/api/effector/babel-plugin) +- [@effector/swc-plugin](https://github.com/effector/swc-plugin) + +## Utilities (#utilities) + +- [is](/en/api/effector/is) +- [fromObservable(observable)](/en/api/effector/fromObservable) + +## Low Level API (#low-level-api) + +- [clearNode](/en/api/effector/clearNode) +- [withRegion](/en/api/effector/withRegion) +- [launch](/en/api/effector/launch) +- [inspect](/en/api/effector/inspect) + +## Import Map (#import-map) + +Package `effector` provides couple different entry points for different purposes: + +- [effector/compat](/en/api/effector/module/compat) +- [effector/inspect](/en/api/effector/module/inspect) +- [effector/babel-plugin](/en/api/effector/module/babel-plugin) + +## Deprecated Methods (#deprecated-methods) + +- [forward({from, to})](/en/api/effector/forward) +- [guard({source, filter, target})](/en/api/effector/guard) diff --git a/src/content/docs/en/api/effector/inspect.md b/src/content/docs/en/api/effector/inspect.md new file mode 100644 index 0000000..63fe880 --- /dev/null +++ b/src/content/docs/en/api/effector/inspect.md @@ -0,0 +1,190 @@ +--- +title: inspect +redirectFrom: + - /api/effector/inspect + - /docs/api/effector/inspect +--- + +```ts +import { inspect } from "effector/inspect"; +``` + +Special API methods designed to handle debugging and monitoring use cases without giving too much access to internals of your actual app. + +Useful to create developer tools and production monitoring and observability instruments. + +# Inspect API (#inspect-api) + +Allows us to track any computations that have happened in the effector's kernel. + +## `inspect()` (#inspect-api-inspect) + +### Example (#inspect-api-inspect-example) + +```ts +import { inspect, type Message } from "effector/inspect"; + +import { someEvent } from "./app-code"; + +function logInspectMessage(m: Message) { + const { name, value, kind } = m; + + return console.log(`[${kind}] ${name} ${value}`); +} + +inspect({ + fn: (m) => { + logInspectMessage(m); + }, +}); + +someEvent(42); +// will log something like +// [event] someEvent 42 +// [on] 42 +// [store] $count 1337 +// ☝️ let's say that reducer adds 1295 to provided number +// +// and so on, any triggers +``` + +[Scope](/en/api/effector/Scope) limits the extent to which computations can be tracked. If no scope is provided - default out-of-scope mode computations will be tracked. + +```ts +import { fork, allSettled } from "effector"; +import { inspect, type Message } from "effector/inspect"; + +import { someEvent } from "./app-code"; + +function logInspectMessage(m: Message) { + const { name, value, kind } = m; + + return console.log(`[${kind}] ${name} ${value}`); +} + +const myScope = fork(); + +inspect({ + scope: myScope, + fn: (m) => { + logInspectMessage(m); + }, +}); + +someEvent(42); +// ☝️ No logs! That's because tracking was restricted by myScope + +allSettled(someEvent, { scope: myScope, params: 42 }); +// [event] someEvent 42 +// [on] 42 +// [store] $count 1337 +``` + +## Tracing (#inspect-api-tracing) + +Adding `trace: true` setting allows looking up previous computations, that led to this specific one. It is useful to debug the specific reason for some events happening + +### Example (#inspect-api-tracing-example) + +```ts +import { fork, allSettled } from "effector"; +import { inspect, type Message } from "effector/inspect"; + +import { someEvent, $count } from "./app-code"; + +function logInspectMessage(m: Message) { + const { name, value, kind } = m; + + return console.log(`[${kind}] ${name} ${value}`); +} + +const myScope = fork(); + +inspect({ + scope: myScope, + trace: true, // <- explicit setting is needed + fn: (m) => { + if (m.kind === "store" && m.sid === $count.sid) { + m.trace.forEach((tracedMessage) => { + logInspectMessage(tracedMessage); + // ☝️ here we are logging the trace of specific store update + }); + } + }, +}); + +allSettled(someEvent, { scope: myScope, params: 42 }); +// [on] 42 +// [event] someEvent 42 +// ☝️ traces are provided in backwards order, because we are looking back in time +``` + +## Errors (#inspect-api-errors) + +Effector does not allow exceptions in pure functions. In such case, branch computation is stopped and an exception is logged. There is also a special message type in such case: + +### Example (#inspect-api-errors-example) + +```ts +inspect({ + fn: (m) => { + if (m.type === "error") { + // do something about it + console.log(`${m.kind} ${m.name} computation has failed with ${m.error}`); + } + }, +}); +``` + +# Inspect Graph (#inspect-graph) + +Allows us to track declarations of units, [factories](/en/api/effector/babel-plugin#factories), and [regions](/en/api/effector/withRegion). + +## Example (#inspect-graph-example) + +```ts +import { createStore } from "effector"; +import { inspectGraph, type Declaration } from "effector/inspect"; + +function printDeclaration(d: Declaration) { + console.log(`${d.kind} ${d.name}`); +} + +inspectGraph({ + fn: (d) => { + printDeclaration(d); + }, +}); + +const $count = createStore(0); +// logs "store $count" to console +``` + +## `withRegion` (#inspect-graph-withRegion) + +Meta-data provided via region's root node is available on declaration. + +### Example (#inspect-graph-withRegion-example) + +```ts +import { createNode, withRegion, createStore } from "effector"; +import { inspectGraph, type Declaration } from "effector/inspect"; + +function createCustomSomething(config) { + const $something = createStore(0); + + withRegion(createNode({ meta: { hello: "world" } }), () => { + // some code + }); + + return $something; +} +inspectGraph({ + fn: (d) => { + if (d.type === "region") console.log(d.meta.hello); + }, +}); + +const $some = createCustomSomething({}); +// logs "world" +``` diff --git a/src/content/docs/en/api/effector/is.md b/src/content/docs/en/api/effector/is.md new file mode 100644 index 0000000..3ddbc5c --- /dev/null +++ b/src/content/docs/en/api/effector/is.md @@ -0,0 +1,382 @@ +--- +title: is +redirectFrom: + - /api/effector/is + - /docs/api/effector/is +--- + +```ts +import { is, type Unit } from "effector"; +``` + +Namespace for unit validators. + +# Methods (#methods) + +## `is.store(value)` (#methods-isStore) + +Checks if given value is [_store_](/en/api/effector/Store) + +### Returns (#methods-isStore-returns) + +`boolean` — Type-guard + +### Examples (#methods-isStore-examples) + +```js +import { is, createStore, createEvent, createEffect, createDomain } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +is.store($store); +// => true + +is.store(event); +// => false + +is.store(fx); +// => false + +is.store(createDomain()); +// => false + +is.store(fx.pending); +// => true + +is.store(fx.done); +// => false + +is.store($store.updates); +// => false + +is.store(null); +// => false +``` + +[Try it](https://share.effector.dev/4vzdWan1) + +## `is.event(value)` (#methods-isEvent) + +Checks if given value is [_event_](/en/api/effector/Event) + +### Returns (#methods-isEvent-returns) + +`boolean` — Type-guard + +### Examples (#methods-isEvent-examples) + +```js +import { is, createStore, createEvent, createEffect, createDomain } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +is.event($store); +// => false + +is.event(event); +// => true + +is.event(fx); +// => false + +is.event(createDomain()); +// => false + +is.event(fx.pending); +// => false + +is.event(fx.done); +// => true + +is.event($store.updates); +// => true + +is.event(null); +// => false +``` + +[Try it](https://share.effector.dev/hB0JEiIo) + +## `is.effect(value)` (#methods-isEffect) + +Checks if given value is [_effect_](/en/api/effector/Effect) + +### Returns (#methods-isEffect-returns) + +`boolean` — Type-guard + +### Examples (#methods-isEffect-examples) + +```js +import { is, createStore, createEvent, createEffect, createDomain } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +is.effect($store); +// => false + +is.effect(event); +// => false + +is.effect(fx); +// => true + +is.effect(createDomain()); +// => false + +is.effect(null); +// => false +``` + +[Try it](https://share.effector.dev/ZdZ2N6VG) + +## `is.targetable` (#methods-isTargetable) + +Checks if given value can be used in operators target (or be called as a function in case of events) + +### Returns (#methods-isTargetable-returns) + +`boolean` — Type-guard + +### Examples (#methods-isTargetable-examples) + +```js +import { is, createStore, createEvent, createEffect } from "effector"; + +const $store = createStore(null); +const $mapped = $store.map((x) => x); +const event = createEvent(); +const mappedEvent = event.map((x) => x); +const fx = createEffect(); + +is.targetable($store); +// => true + +is.targetable($mapped); +// => false + +is.targetable(event); +// => true + +is.targetable(mappedEvent); +// => false + +is.targetable(fx); +// => true +``` + +## `is.domain(value)` (#methods-isDomain) + +Checks if given value is [_domain_](/en/api/effector/Domain) + +### Returns (#methods-isDomain-returns) + +`boolean` — Type-guard + +### Examples (#methods-isDomain-examples) + +```js +import { is, createStore, createEvent, createEffect, createDomain } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +is.domain($store); +// => false + +is.domain(event); +// => false + +is.domain(fx); +// => false + +is.domain(createDomain()); +// => true + +is.domain(null); +// => false +``` + +[Try it](https://share.effector.dev/Iea0gmfD) + +## `is.scope(value)` (#methods-isScope) + +:::info{title="since"} +[effector 22.0.0](https://changelog.effector.dev/#effector-22-0-0) +::: + +Checks if given value is [_scope_](/en/api/effector/Scope) since [effector 22.0.0](https://changelog.effector.dev/#effector-22-0-0). + +### Returns (#methods-isScope-returns) + +`boolean` — Type-guard + +### Examples (#methods-isScope-examples) + +```js +import { fork } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); +const scope = fork(); + +is.scope(scope); +// => true + +is.scope($store); +// => false + +is.scope(event); +// => false + +is.scope(fx); +// => false + +is.scope(createDomain()); +// => false + +is.scope(null); +// => false +``` + +[Try it](https://share.effector.dev/hF0krFUK) + +## `is.unit(value)` (#methods-isUnit) + +Checks if given value is [Unit](/en/explanation/glossary#unit): [Store](/en/api/effector/Store), [Event](/en/api/effector/Event), [Effect](/en/api/effector/Effect), [Domain](/en/api/effector/Domain) or [Scope](/en/api/effector/Scope) + +### Returns (#methods-isUnit-returns) + +`boolean` — Type-guard + +### Examples (#methods-isUnit-examples) + +```js +import { is, createStore, createEvent, createEffect, createDomain, fork } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); +const scope = fork(); + +is.unit(scope); +// => true + +is.unit($store); +// => true + +is.unit(event); +// => true + +is.unit(fx); +// => true + +is.unit(createDomain()); +// => true + +is.unit(fx.pending); +// => true + +is.unit(fx.done); +// => true + +is.unit($store.updates); +// => true + +is.unit(null); +// => false +``` + +[Try it](https://share.effector.dev/iOpDvweB) + +## `is.attached(value)` (#methods-isAttached) + +:::info{title="since"} +[effector 22.4.0](https://changelog.effector.dev/#effector-22-4-0) +::: + +Checks if given value is [_effect_](/en/api/effector/Effect) created via [_attach_](/en/api/effector/attach) method. If passed not an effect, returns `false`. + +### Returns (#methods-isAttached-returns) + +`boolean` — Type-guard + +### Usage (#methods-isAttached-usage) + +Sometimes you need to add an error log on effects failures, but only on effects that have been "localized" via `attach`. +If you leave `onCreateEffect` as it is, without checks, the error log will be duplicated, because it will happen on the parent and the child effect. + +```js +import { createDomain, attach, is } from "effector"; + +const logFailuresDomain = createDomain(); + +logFailuresDomain.onCreateEffect((effect) => { + if (is.attached(effect)) { + effect.fail.watch(({ params, error }) => { + console.warn(`Effect "${effect.compositeName.fullName}" failed`, params, error); + }); + } +}); + +const baseRequestFx = logFailuresDomain.createEffect((path) => { + throw new Error(`path ${path}`); +}); + +const loadDataFx = attach({ + mapParams: () => "/data", + effect: baseRequestFx, +}); + +const loadListFx = attach({ + mapParams: () => "/list", + effect: baseRequestFx, +}); + +loadDataFx(); +loadListFx(); +``` + +[Try it](https://share.effector.dev/NxQseHOR) + +### Examples (#methods-isAttached-examples) + +```js +import { is, createStore, createEvent, createEffect, createDomain, attach } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +const childFx = attach({ + effect: fx, +}); + +is.attached(childFx); +// => true + +is.attached(fx); +// => false + +is.attached($store); +// => false + +is.attached(event); +// => false + +is.attached(createDomain()); +// => false + +is.attached(null); +// => false +``` + +[Try it](https://share.effector.dev/qsdTF7og) diff --git a/src/content/docs/en/api/effector/launch.md b/src/content/docs/en/api/effector/launch.md new file mode 100644 index 0000000..a19030b --- /dev/null +++ b/src/content/docs/en/api/effector/launch.md @@ -0,0 +1,53 @@ +--- +title: launch +redirectFrom: + - /api/effector/launch + - /docs/api/effector/launch +--- + +```ts +import { launch, type Unit, type Node } from "effector"; +``` + +:::info{title="since"} +[effector 20.10.0](https://changelog.effector.dev/#effector-20-10-0) +::: + +# Methods (#methods) + +## `launch({ target, params })` (#methods-launch-config) + +Low level method for running computation in units (events, effects or stores). Mostly used by library developers for fine-grained control of computations. + +### Formulae (#methods-launch-config-formulae) + +```ts +launch({ + target, + params, + defer?: boolean, + page?: any, + scope?: Scope, + meta?: Record<string, any>, +}): void +``` + +### Arguments (#methods-launch-config-arguments) + +TBD + +### Returns (#methods-launch-config-returns) + +`void` + +## `launch(unit, params)` (#methods-launch-unit-params) + +### Formulae (#methods-launch-unit-params-formulae) + +```ts +launch(unit: Unit | Node, params: T): void +``` + +### Returns (#methods-launch-unit-params-returns) + +`void` diff --git a/src/content/docs/en/api/effector/merge.md b/src/content/docs/en/api/effector/merge.md new file mode 100644 index 0000000..a5e659a --- /dev/null +++ b/src/content/docs/en/api/effector/merge.md @@ -0,0 +1,103 @@ +--- +title: merge +description: merge is a method for creating an event triggered by given units +redirectFrom: + - /api/effector/merge + - /docs/api/effector/merge +--- + +```ts +import { merge, type Unit } from "effector"; +``` + +# Methods (#methods) + +## `merge(units)` (#methods-merge-units) + +:::info{title="since"} +[effector 20.0.0](https://changelog.effector.dev/#effector-20-0-0) +::: + +Merges an array of units (events, effects, or stores), returning a new event that triggers upon any of the given units being triggered. + +```ts +merge(units: Unit[]): Event<T> +``` + +### Arguments (#methods-merge-units-arguments) + +1. `units`: An array of [units](/en/explanation/glossary#common-unit) to be merged. + +### Returns (#methods-merge-units-returns) + +[_Event_](/en/api/effector/Event): A new event that fires when any of the given units is triggered. + +:::tip +In the case of a store, the resulting event will fire upon store updates. +::: + +### Types (#methods-merge-units-types) + +TBD + +### Examples (#methods-merge-units-examples) + +#### Basic Usage (#methods-merge-units-examples-basic-usage) + +```js +import { createEvent, merge } from "effector"; + +const foo = createEvent(); +const bar = createEvent(); +const baz = merge([foo, bar]); +baz.watch((v) => console.log("merged event triggered: ", v)); + +foo(1); +// => merged event triggered: 1 +bar(2); +// => merged event triggered: 2 +``` + +[Try it](https://share.effector.dev/WxUgr6dZ) + +#### Working with Stores (#methods-merge-units-examples-working-with-stores) + +```js +import { createEvent, createStore, merge } from "effector"; + +const setFoo = createEvent(); +const setBar = createEvent(); + +const $foo = createStore(0).on(setFoo, (_, v) => v); +const $bar = createStore(100).on(setBar, (_, v) => v); + +const anyUpdated = merge([$foo, $bar]); +anyUpdated.watch((v) => console.log(`state changed to: ${v}`)); + +setFoo(1); // => state changed to: 1 +setBar(123); // => state changed to: 123 +``` + +[Try it](https://share.effector.dev/Rp9wuRvl) + +#### Merging a Store and an Event (#methods-merge-units-examples-merging-a-store-and-an-event) + +```js +import { createEvent, createStore, merge } from "effector"; + +const setFoo = createEvent(); +const otherEvent = createEvent(); + +const $foo = createStore(0).on(setFoo, (_, v) => v); +const merged = merge([$foo, otherEvent]); + +merged.watch((v) => console.log(`merged event payload: ${v}`)); + +setFoo(999); +// => merged event payload: 999 + +otherEvent("bar"); +// => merged event payload: bar +``` + +[Try it](https://share.effector.dev/pKkiyhVQ) diff --git a/src/content/docs/en/api/effector/module/babel-plugin.md b/src/content/docs/en/api/effector/module/babel-plugin.md new file mode 100644 index 0000000..14b1d13 --- /dev/null +++ b/src/content/docs/en/api/effector/module/babel-plugin.md @@ -0,0 +1,10 @@ +--- +title: effector/babel-plugin +description: Separate module of Effector with plugin for Babel that improves DX over the library +--- + +Since Effector allows to automate many common tasks (like setting [Stable IDentifiers](/en/explanation/sids) and providing debug information for [Units](/en/explanation/glossary#unit)), there is a built-in plugin for Babel that enhances the developer experience when using the library. + +# Usage (#methods-babel-plugin-usage) + +Please refer to the [Babel plugin](/en/api/effector/babel-plugin) documentation for usage examples. diff --git a/src/content/docs/en/api/effector/module/inspect.md b/src/content/docs/en/api/effector/module/inspect.md new file mode 100644 index 0000000..46f212f --- /dev/null +++ b/src/content/docs/en/api/effector/module/inspect.md @@ -0,0 +1,14 @@ +--- +title: effector/inspect +description: Separate module of Effector with Inspect API +--- + +Effector has special API methods designed to handle debugging and monitoring use cases without giving too much access to the internals of your actual app — [Inspect API](/en/api/effector/inspect). + +## Why a Separate Module? (#why-a-separate-module) + +Inspect API is designed to be disposable. By design, any feature that uses Inspect API can be removed from the production build without any side effects. To emphasize this, Inspect API is not included in the main module. Instead, it's available in a separate module `effector/inspect`. + +## Usage (#usage) + +Please refer to [Inspect API](/en/api/effector/inspect) docs for usage examples. diff --git "a/src/content/docs/en/api/effector/module/\321\201ompat.md" "b/src/content/docs/en/api/effector/module/\321\201ompat.md" new file mode 100644 index 0000000..959f1c8 --- /dev/null +++ "b/src/content/docs/en/api/effector/module/\321\201ompat.md" @@ -0,0 +1,100 @@ +--- +title: effector/compat +description: Separate module of Effector with compatibility up to IE11 and Chrome 47 (browser for Smart TV devices) +--- + +```ts +import {} from "effector/compat"; +``` + +The library provides a separate module with compatibility up to IE11 and Chrome 47 (browser for Smart TV devices). + +:::warning{title="Bundler, Not Transpiler"} +Since third-party libraries can import `effector` directly, you **should not** use transpilers like Babel to replace `effector` with `effector/compat` in your code because by default, Babel will not transform third-party code. + +**Use a bundler instead**, as it will replace `effector` with `effector/compat` in all modules, including those from third parties. + +::: + +## Required Polyfills (#required-polyfills) + +You need to install polyfills for these objects: + +- `Promise` +- `Object.assign` +- `Array.prototype.flat` +- `Map` +- `Set` + +In most cases, a bundler can automatically add polyfills. + +### Vite (#required-polyfills-vite) + +<details> +<summary>Vite Configuration Example</summary> + +```js +import { defineConfig } from "vite"; +import legacy from "@vitejs/plugin-legacy"; + +export default defineConfig({ + plugins: [ + legacy({ + polyfills: ["es.promise", "es.object.assign", "es.array.flat", "es.map", "es.set"], + }), + ], +}); +``` + +</details> + +# Usage (#usage) + +## Manual Replacement (#usage-manual) + +You can use `effector/compat` instead of the `effector` package if you need to support old browsers. + +```diff +- import {createStore} from 'effector' ++ import {createStore} from 'effector/compat' +``` + +## Automatic Replacement (#usage-automatic) + +However, you can set up your bundler to automatically replace `effector` with `effector/compat` in your code. + +### Webpack (#usage-automatic-webpack) + +<details> +<summary>Webpack Configuration Example</summary> + +```js +module.exports = { + resolve: { + alias: { + effector: "effector/compat", + }, + }, +}; +``` + +</details> + +### Vite (#usage-automatic-vite) + +<details> +<summary>Vite Configuration Example</summary> + +```js +import { defineConfig } from "vite"; + +export default defineConfig({ + resolve: { + alias: { + effector: "effector/compat", + }, + }, +}); +``` + +</details> diff --git a/src/content/docs/en/api/effector/restore.md b/src/content/docs/en/api/effector/restore.md new file mode 100644 index 0000000..a130018 --- /dev/null +++ b/src/content/docs/en/api/effector/restore.md @@ -0,0 +1,136 @@ +--- +title: restore +redirectFrom: + - /api/effector/restore + - /docs/api/effector/restore +--- + +```ts +import { restore } from "effector"; +``` + +# Methods (#methods) + +## `restore(event, defaultState)` (#methods-restore-event-defaultState) + +Creates a [_StoreWritable_](/en/api/effector/Store) from an [_Event_](/en/api/effector/Event). It works like a shortcut for `createStore(defaultState).on(event, (_, payload) => payload)` + +:::warning{title="It is not a derived store"} +Restore creates a new store. It is not a [DerivedStore](/en/api/effector/Store#readonly). That means you can modify its state via events, and use it as `target` in [sample](/en/api/effector/sample). +::: + +### Formulae (#methods-restore-event-defaultState-formulae) + +```ts +restore(event: Event<T>, defaultState: T): StoreWritable<T> +``` + +### Arguments (#methods-restore-event-defaultState-arguments) + +1. `event` [_Event_](/en/api/effector/Event) +2. `defaultState` (_Payload_) + +### Returns (#methods-restore-event-defaultState-returns) + +[_StoreWritable_](/en/api/effector/Store): New store + +### Examples (#methods-restore-event-defaultState-examples) + +#### Basic (#methods-restore-event-defaultState-examples-basic) + +```js +import { createEvent, restore } from "effector"; + +const event = createEvent(); +const $store = restore(event, "default"); + +$store.watch((state) => console.log("state: ", state)); +// state: default + +event("foo"); +// state: foo +``` + +[Try it](https://share.effector.dev/MGGQnTlQ) + +## `restore(effect, defaultState)` (#methods-restore-effect-defaultState) + +Creates a [_StoreWritable_](/en/api/effector/Store) out of successful results of an [_Effect_](/en/api/effector/Effect). It works like a shortcut for `createStore(defaultState).on(effect.done, (_, {result}) => result)` + +### Formulae (#methods-restore-effect-defaultState-formulae) + +```ts +restore(effect: Effect<Params, Done, Fail>, defaultState: Done): StoreWritable<Done> +``` + +### Arguments (#methods-restore-effect-defaultState-arguments) + +1. `effect` [_Effect_](/en/api/effector/Effect) +2. `defaultState` (_Done_) + +### Returns (#methods-restore-effect-defaultState-returns) + +[_StoreWritable_](/en/api/effector/Store): New store + +### Types (#methods-restore-effect-defaultState-types) + +Store will have the same type as `Done` from `Effect<Params, Done, Fail>`. Also, `defaultState` should have `Done` type. + +### Examples (#methods-restore-effect-defaultState-examples) + +#### Effect (#methods-restore-effect-defaultState-examples-effect) + +```js +import { createEffect, restore } from "effector"; + +const fx = createEffect(() => "foo"); +const $store = restore(fx, "default"); + +$store.watch((state) => console.log("state: ", state)); +// => state: default + +await fx(); +// => state: foo +``` + +[Try it](https://share.effector.dev/tP6RQsri) + +## `restore(shape)` (#methods-restore-shape) + +Creates an object with stores from an object with values. + +### Formulae (#methods-restore-shape-formulae) + +TBD + +### Arguments (#methods-restore-shape-arguments) + +1. `shape` (_State_) + +### Returns (#methods-restore-shape-returns) + +[_StoreWritable_](/en/api/effector/Store): New store. + +### Examples (#methods-restore-shape-examples) + +#### Object (#methods-restore-shape-examples-object) + +```js +import { restore } from "effector"; + +const { foo: $foo, bar: $bar } = restore({ + foo: "foo", + bar: 0, +}); + +$foo.watch((foo) => { + console.log("foo", foo); +}); +// => foo 'foo' +$bar.watch((bar) => { + console.log("bar", bar); +}); +// => bar 0 +``` + +[Try it](https://share.effector.dev/NQX0kotI) diff --git a/src/content/docs/en/api/effector/sample.md b/src/content/docs/en/api/effector/sample.md new file mode 100644 index 0000000..56a2a73 --- /dev/null +++ b/src/content/docs/en/api/effector/sample.md @@ -0,0 +1,498 @@ +--- +title: sample +redirectFrom: + - /api/effector/sample + - /docs/api/effector/sample +--- + +```ts +import { sample } from "effector"; +``` + +# Methods (#methods) + +# `sample({ source?, clock?, filter?, fn?, target? })` (#methods-sample-config) + +This method can be used for linking two nodes, resulting in the third one, which will fire only upon the `clock` node trigger. + +Quite a common case, when you need to handle an event with some store's state. Instead of using `store.getState()`, which may cause race conditions and inconsistency of state, it is more suitable to use the `sample` method. + +## Formulae (#methods-sample-config-formulae) + +```ts +sample({ source?, clock?, filter?, fn?, target?}): target +``` + +When `clock` is triggered, read the value from `source` and trigger `target` with it. + +- If the `clock` is not passed, `sample` will be triggered on every `source` update. +- If the `filter` is not passed, continue as it is. If `filter` return `false` or contains `Store<false>` cancel execution otherwise continue +- If the `fn` is passed, pass value from `source` through before passing to `target` +- If the `target` is not passed, create it and return from `sample()` + +## Schema (#methods-sample-config-schema) + + + +## Types (#methods-sample-config-types) + +### Type of the created `target` (#methods-sample-config-types-target) + +If `target` is not passed to `sample()` call, it will be created internally. The type of unit is described in the table below: + +| clock\source | [_Store_](/en/api/effector/Store) | [_Event_](/en/api/effector/Event) | [_Effect_](/en/api/effector/Effect) | +| ----------------------------------- | --------------------------------- | --------------------------------- | ----------------------------------- | +| [_Store_](/en/api/effector/Store) | `Store` | `Event` | `Event` | +| [_Event_](/en/api/effector/Event) | `Event` | `Event` | `Event` | +| [_Effect_](/en/api/effector/Effect) | `Event` | `Event` | `Event` | + +How to read it: + +1. You need to know the type of the `source`, it is a column +2. Type of the `clock` in the rows +3. Match the column and the row + +For example: + +```ts +import { sample } from "effector"; + +const $store = sample({ clock: $store, source: $store }); +// Result will be store, because `source` and `clock` are stores. + +const event = sample({ clock: event, source: $store }); +// Because not all arguments are stores. +``` + +# `sample({clock?, source, filter?, fn?, target?, greedy?})` (#methods-sample-greedy) + +## Formulae (#methods-sample-greedy-formulae) + +TBD + +## Arguments (#methods-sample-greedy-arguments) + +`params` (_Object_): Configuration object + +- `clock?`: [Unit](/en/explanation/glossary#common-unit) or array of units + - If event or effect: trigger `target` upon event or effect is called + - If store: trigger `target` upon store is updated + - If array of units: trigger `target` upon any given unit is called or updated. Shorthand for inline [merge](/en/api/effector/merge) call + - If not passed: `source` is used as `clock` +- `source?`: [Unit](/en/explanation/glossary#common-unit) or object/array with stores + - If event or effect: take last invocation argument value. That event or effect must be invoked at least once + - If store: take current state of given store + - If array or object with stores: take values from given stores combined to object or array. Shorthand for inline [combine](/en/api/effector/combine) call + - If not passed: `clock` is used as `source` +- `target?`: [Unit](/en/explanation/glossary#common-unit) or array of units + - If event or effect: call given event or effect upon `clock` is triggered + - If store: update given store upon `clock` is triggered + - If array of units: trigger every given unit upon `clock` is triggered + - If not passed: new unit will be created under the hood and will be returned as a result of the `sample()` call. Type of created target is described [in table beyond](/en/api/effector/sample#sample-types-target) +- `filter?` _(Function or [Store](/en/api/effector/Store))_ `((sourceData, clockData) => result): boolean | Store<boolean>`: If returns value of the function or store contains `true` continue execution otherwise cancel +- `fn?` _(Function)_ `((sourceData, clockData) => result)`: Combinator function, which will transform data from `source` and `clock` before passing it to `target`, [should be **pure**](/en/explanation/glossary#purity). If not passed, data from `source` will be passed to `target` as it is +- `greedy?` (boolean) Modifier defines whether sampler will wait for resolving calculation result, and will batch all updates, resulting only one trigger, or will be triggered upon every linked node invocation, e.g. if `greedy` is `true`, `sampler` will fire on trigger of every node, linked to `clock`, whereas `non-greedy sampler(greedy: false)` will fire only upon the last linked node trigger + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) property `greedy` is deprecated. + +Use `batch` instead of `greedy`. +::: + +:::info{title="since"} +Array of units in `target` are supported since [effector 21.8.0](https://changelog.effector.dev/#effector-21-8-0) +::: + +## Returns (#methods-sample-greedy-returns) + +([_Event_](/en/api/effector/Event) | [_Store_](/en/api/effector/Store)) - Unit, which fires/updates upon `clock` is triggered, if `source` is not passed. [The type of returned unit depends on the types of `clock` and `source`](#sample-types-target). + +## Examples (#methods-sample-greedy-examples) + +```js +import { createStore, createEvent, createEffect, sample } from "effector"; + +const submitForm = createEvent(); +const signInFx = createEffect((params) => { + console.log(params); +}); + +const $userName = createStore("john"); + +sample({ + clock: submitForm /* 1 */, + source: $userName /* 2 */, + fn: (name, password) => ({ name, password }) /* 3 */, + target: signInFx /* 4 */, +}); + +submitForm(12345678); +// 1. when submitForm is called with params (12345678) +// 2. take $userName store`s state ('john') +// 3. transform payload from event (1) and current store`s state (2) +// 4. trigger effect signInFx with params received at the step (3) +``` + +[Try it](https://share.effector.dev/PAjWhOJc) + +# `sample(sourceUnit, clockUnit, fn?)` (#sample-sourceUnit-clockUnit-fn) + +It is just another form of the `sample` invocation, with the same sense. + +## Formulae (#sample-sourceUnit-clockUnit-fn-formulae) + +TBD + +## Arguments (#sample-sourceUnit-clockUnit-fn-arguments) + +- `sourceUnit`: Source [unit](/en/explanation/glossary#common-unit) + - If event or effect. Take last invocation argument value. That event or effect must be invoked at least once + - If store. Take current store's state +- `clockUnit`: Clock [unit](/en/explanation/glossary#common-unit). If not passed, `source` is used as `clock` + - If event or effect. Trigger the sampled unit, upon event or effect is called + - If store. Trigger the sampled unit, upon store is updated +- `fn?` (_(sourceData, clockData) => result_): Optional combinator function, [should be **pure**](/en/explanation/glossary#purity). Since, this handler is supposed to organize data flow, you should avoid declaring side effects here. It's more appropriate to place it in `watch` method for sampled node. + +**Returns** + +([_Event_](/en/api/effector/Event) | [_Store_](/en/api/effector/Store)) – Unit, which fires/updates upon `clock` is triggered, if `source` is not passed. +[The type of returned unit depends on the types of `clock` and `source`](#sample-types-target). + +## Examples (#sample-sourceUnit-clockUnit-fn-examples) + +```js +import { createStore, createEvent, createEffect, sample } from "effector"; + +const submitForm = createEvent(); + +const signInFx = createEffect((params) => { + console.log(params); +}); + +const $userName = createStore("john"); + +const sampleUnit = sample( + $userName /* 2 */, + submitForm /* 1 */, + (name, password) => ({ name, password }) /* 3 */, +); +/* 4 */ +sample({ + clock: sampleUnit, + target: signInFx, +}); + +submitForm(12345678); +// 1. when submitForm is called with params (12345678) +// 2. take $userName store`s state ('john') +// 3. transform payload from event (1) and current store`s state (2) +// 4. when sampleUnit (event in this case) is triggered, +// send it payload to effect signInFx with params received at the step (3) +``` + +[Try it](https://share.effector.dev/WO6UT8bV) + +## `sample({name?})` (#sample-name) + +:::info{title="since"} +[effector 20.4.0](https://changelog.effector.dev/#effector-20-4-0) +::: + +Every [unit](/en/explanation/glossary#unit) in effector may have a name. +You now can name sampled entities in the same manner as basic ones. + +```js +import { createStore, sample } from "effector"; + +const $store = createStore(null); + +const sampled = sample({ + source: $store, + name: "sampled $store", +}); + +console.log(sampled.shortName); // 'sampled foo' +``` + +# Objects and Arrays of _Store_ in `sample({ source })` (#sample-source-objects-arrays) + +## Object of Stores (#sample-source-object-stores) + +:::info{title="since"} +[effector 20.8.0](https://changelog.effector.dev/#effector-20-8-0) +::: + +`sample` can be called with an object of [_Store_](/en/api/effector/Store) as `source`: + +```js +import { createStore, createEvent, sample } from "effector"; + +const trigger = createEvent(); + +const $a = createStore("A"); +const $b = createStore(1); + +// Target has type `Event<{ a: string, b: number }>` +const target = sample({ + clock: trigger, + source: { a: $a, b: $b }, +}); + +target.watch((obj) => { + console.log("sampled object", obj); +}); + +trigger(); +// => sampled object {a: 'A', b: 1} +``` + +[Try it](https://share.effector.dev/Wp9nq14k) + +### Array of Stores (#sample-source-array-stores) + +:::info{title="since"} +[effector 20.8.0](https://changelog.effector.dev/#effector-20-8-0) +::: + +`sample` can be called with an array of [_Store_](/en/api/effector/Store) as `source`: + +> Note: Typescript requires adding `as const` after the array is entered. + +```ts +import { createStore, createEvent, sample } from "effector"; + +const trigger = createEvent(); + +const $a = createStore("A"); +const $b = createStore(1); + +// Target has type `Event<[string, number]>` +const target = sample({ + clock: trigger, + source: [$a, $b] as const, +}); + +target.watch((obj) => { + console.log("sampled array", obj); +}); + +// You can easily destructure arguments to set explicit names +target.watch(([a, b]) => { + console.log("explicit names", a, b); +}); + +trigger(); +// => sampled array ["A", 1] +// => explicit names "A" 1 +``` + +[Try it](https://share.effector.dev/duqTwRgT) + +### Array of _Units_ in `sample({ clock })` (#sample-clock-array) + +:::info{title="since"} +[effector 21.2.0](https://changelog.effector.dev/#effector-21-2-0) +::: + +`clock` field in `sample` supports passing arrays of units, acting similarly to a `merge` call. + +```js +import {createStore, createEvent, createEffect, sample, merge} from 'effector' + +const showNotification = createEvent<string>() +const trigger = createEvent() +const fx = createEffect() +const $store = createStore('') + +// array of units in `clock` +sample({ + clock: [trigger, fx.doneData], + source: $store, + target: showNotification, +}) + +// merged unit in `clock` +sample({ + clock: merge([trigger, fx.doneData]), + source: $store, + target: showNotification, +}) +``` + +[Try it](https://share.effector.dev/1YEHUFs7) + +## Filtering updates with `sample({ filter })` (#sample-filter) + +:::info{title="since"} +[effector 22.2.0](https://changelog.effector.dev/#effector-22-2-0) +::: + +The new variant of the `sample` works the same but with one extra method `filter`. Whenever `filter` returns `true` continue execution otherwise cancel. Let's see an example below. + +Henry wants to send money to William. Henry – sender and William – recipient. To send money, sender should know the recipient address, besides sender has to sign the transaction. This example shows how exactly the `sample` works with a `filter`. The main points are: + +1. Make sure balance is positive and more than sending amount +2. Having recipient address +3. Signed transaction +4. Make sure sender balance has been changed + +```js +import { createStore, createEvent, createEffect, sample } from "effector"; + +const sign = createEvent(); +const sentMoney = createEvent(); +const $recipientAddress = createStore("a23x3xd"); +const $balance = createStore(20000); +const $isSigned = createStore(false); +const transactionFx = createEffect( + ({ amountToSend, recipientAddress }) => + new Promise((res) => + setTimeout(res, 3000, { + amount: amountToSend, + recipientAddress, + }), + ), +); + +$isSigned.on(sign, () => true).reset(transactionFx); +$balance.on(transactionFx.doneData, (balance, { amount }) => balance - amount); + +sample({ + source: { + recipientAddress: $recipientAddress, + isSigned: $isSigned, + balance: $balance, + }, + clock: sentMoney, + filter: ({ isSigned, balance }, amountToSend) => isSigned && balance > amountToSend, + fn({ recipientAddress }, amountToSend) { + return { recipientAddress, amountToSend }; + }, + target: transactionFx, +}); + +$balance.watch((balance) => console.log("balance: ", balance)); +$isSigned.watch((isSigned) => console.log("is signed: ", isSigned)); + +sign(); +sentMoney(1000); +``` + +[Try it](https://share.effector.dev/XTxkCYC0) + +<!-- ## Other examples + +### Example 2 + +```js +import {createEvent, createStore, sample} from 'effector' + +const clickButton = createEvent() +const closeModal = clickButton.map(() => 'close modal') + +const lastEvent = createStore(null) + .on(clickButton, (_, data) => data) + .on(closeModal, () => 'modal') + +lastEvent.updates.watch(data => { + // here we need everything + //console.log(`sending important analytics event: ${data}`) +}) + +lastEvent.updates.watch(data => { + //here we need only final value + //console.log(`render <div class="yourstatus">${data}</div>`) +}) + +const analyticReportsEnabled = createStore(false) + +const commonSampling = sample({ + clock: merge([clickButton, closeModal]), + source: analyticReportsEnabled, + fn: (isEnabled, data) => ({isEnabled, data}), +}) + +const greedySampling = sample({ + clock: merge([clickButton, closeModal]), + source: analyticReportsEnabled, + fn: (isEnabled, data) => ({isEnabled, data}), + greedy: true, +}) + +commonSampling.watch(data => console.log('non greedy update', data)) +greedySampling.watch(data => console.log('greedy update', data)) + +clickButton('click A') +clickButton('click B') +``` + +[Try it](https://share.effector.dev/RCo60EEK) + +### Example `sample(sourceEvent, clockEvent, fn?)` + +```js +import {createEvent, sample} from 'effector' + +const event1 = createEvent() +const event2 = createEvent() + +const sampled = sample(event1, event2, (a, b) => `${a} ${b}`) +sampled.watch(console.log) + +event1('Hello') +event2('World') // => Hello World +event2('effector!') // => Hello effector! + +sampled('Can be invoked too!') // => Can be invoked too! +``` + +[Try it](https://share.effector.dev/vXKWDhwL) + +### Example `sample(event, store, fn?)` + +```js +import {createEvent, createStore, sample} from 'effector' + +const event = createEvent() +const inc = createEvent() +const count = createStore(0).on(inc, state => state + 1) + +const sampled = sample( + event, + count, + (c, i) => `Current count is ${i}, last event invocation: ${c}`, +) +sampled.watch(console.log) + +inc() // => nothing + +event('foo') +inc() // => Current count is 2, last event invocation: foo + +event('bar') +inc() // => Current count is 3, last event invocation: bar +``` + +[Try it](https://share.effector.dev/L4nbGjxM) + +### Example `sample(sourceStore, clockStore, fn?)` + +```js +import {createEvent, createStore, sample} from 'effector' + +const inc = createEvent() +const setName = createEvent() + +const name = createStore('John').on(setName, (_, v) => v) + +const clock = createStore(0).on(inc, i => i + 1) + +const sampled = sample(name, clock, (name, i) => `${name} has ${i} coins`) +sampled.watch(console.log) +// => John has 0 coins (initial store update triggered sampled store) + +setName('Doe') +inc() // => Doe has 1 coins +``` + +[Try it](https://share.effector.dev/h3zED3yW) --> diff --git a/src/content/docs/en/api/effector/scopeBind.md b/src/content/docs/en/api/effector/scopeBind.md new file mode 100644 index 0000000..6b0aa99 --- /dev/null +++ b/src/content/docs/en/api/effector/scopeBind.md @@ -0,0 +1,115 @@ +--- +title: scopeBind +description: scopeBind is a method to bind unit to scope +redirectFrom: + - /api/effector/scopeBind + - /docs/api/effector/scopeBind +--- + +```ts +import { scopeBind } from "effector"; +``` + +`scopeBind` is a method to bind a unit (an Event or Effect) to a [Scope](/en/api/effector/Scope) to be called later. Effector supports imperative calling of events within watchers, however, there are instances where you must explicitly bind events to the scope, such as when triggering events from within `setTimeout` or `setInterval` callbacks. + +# Methods (#scopeBind-methods) + +## `scopeBind(event, options?)` (#scopeBind-methods-scopeBind-event) + +### Formulae (#scopeBind-methods-scopeBind-event-formulae) + +```ts +scopeBind<T>(event: EventCallable<T>): (payload: T) => void +scopeBind<T>(event: EventCallable<T>, options?: {scope?: Scope, safe?: boolean}): (payload: T) => void +``` + +### Arguments (#scopeBind-methods-scopeBind-event-arguments) + +1. `event` [_EventCallable_](/en/api/effector/Event) or [_Effect_](/en/api/effector/Effect) to be bound to the scope. +2. `options` (_Object_): Optional configuration. + - `scope` (_Scope_): Scope to bind event to. + - `safe` (_Boolean_): Flag for exception suppression if there is no scope. + +### Returns (#scopeBind-methods-scopeBind-event-returns) + +`(payload: T) => void` — A function with the same types as `event`. + +### Examples (#scopeBind-methods-scopeBind-event-examples) + +#### Basic Usage (#scopeBind-methods-scopeBind-event-examples-basic-usage) + +We are going to call `changeLocation` inside `history.listen` callback so there is no way for effector to associate event with corresponding scope, and we should explicitly bind event to scope using `scopeBind`. + +```ts +const $history = createStore(history); +const initHistory = createEvent(); +const changeLocation = createEvent<string>(); + +const installHistoryFx = attach({ + source: $history, + effect: (history) => { + const locationUpdate = scopeBind(changeLocation); + + history.listen((location) => { + locationUpdate(location); + }); + }, +}); + +sample({ + clock: initHistory, + target: installHistoryFx, +}); +``` + +[See full example](https://share.effector.dev/nJo1zRil) + +## `scopeBind(callback, options?)` (#scopeBind-methods-scopeBind-callback) + +Binds arbitrary callback to a scope to be called later. The bound version of the function retains all properties of the original, e.g., if the original function would throw when called with a certain argument, the bound version will also throw under the same circumstances. + +:::info{title="since"} +Feature is available since `effector 23.1.0` release. +::: + +:::warning +To be compatible with the Fork API, callbacks **must** adhere to the same rules as `Effect` handlers: + +- Synchronous functions can be used as they are. +- Asynchronous functions must follow the [rules described in "Imperative Effect calls with scope"](/en/api/effector/scope/). + +::: + +### Formulae (#scopeBind-methods-scopeBind-callback-formulae) + +```ts +scopeBind(callback: T, options?: { scope?: Scope; safe?: boolean }): (payload: T) => void; +``` + +### Arguments (#scopeBind-methods-scopeBind-callback-arguments) + +1. `callback` (_Function_): Any function to be bound to the scope. +2. `options` (_Object_): Optional configuration. + - `scope` (_Scope_): Scope to bind the event to. + - `safe` (_Boolean_): Flag for exception suppression if there is no scope. + +### Returns (#scopeBind-methods-scopeBind-callback-returns) + +`(payload: T) => void` — A function with the same types as `callback`. + +### Examples (#scopeBind-methods-scopeBind-callback-examples) + +```ts +const locationChanged = createEvent(); + +const listenToHistoryFx = attach({ + source: $history, + effect: (history) => { + return history.listen( + scopeBind((location) => { + locationChanged(location); + }), + ); + }, +}); +``` diff --git a/src/content/docs/en/api/effector/serialize.md b/src/content/docs/en/api/effector/serialize.md new file mode 100644 index 0000000..4a282ce --- /dev/null +++ b/src/content/docs/en/api/effector/serialize.md @@ -0,0 +1,107 @@ +--- +title: serialize +description: serialize is a method for serializing application states within a scope +redirectFrom: + - /api/effector/serialize + - /docs/api/effector/serialize +--- + +```ts +import { serialize, type Scope } from "effector"; +``` + +# Methods (#methods) + +## `serialize(scope, params)` (#methods-serialize) + +A companion method for [_fork_](/en/api/effector/fork). It allows us to get a serialized value for all the store states within a [scope](/en/api/effector/Scope). The main purpose is an application state serialization on the server side during SSR. + +:::warning{title="Requirements"} +[_Babel plugin_](/en/api/effector/babel-plugin) or [_SWC plugin_](https://github.com/effector/swc-plugin) is required for using this method, as these plugins provide the SIDs for stores, which are required for stable state serialization. + +You can find deep-dive [explanation here](/en/explanation/sids) +::: + +### Formulae (#methods-serialize-formulae) + +```ts +serialize(scope: Scope, { ignore?: Array<Store<any>>; onlyChanges?: boolean }): {[sid: string]: any} +``` + +### Arguments (#methods-serialize-arguments) + +1. `scope` [_Scope_](/en/api/effector/Scope): a scope object (forked instance) +2. `ignore` Optional array of [_Store_](/en/api/effector/Store) to be omitted during serialization (added 20.14.0) +3. `onlyChanges` Optional boolean flag to ignore stores which didn't change in fork (prevent default values from being carried over network) + +:::warning{title="Deprecated"} +Since [effector 23.0.0](https://changelog.effector.dev/#effector-23-0-0) property `onlyChanges` is deprecated. +::: + +### Returns (#methods-serialize-returns) + +An object with store values using sids as a keys + +:::warning{title="Reminder"} +If a store [does not have a sid](/en/api/effector/babel-plugin#sid), its value will be omitted during serialization. +::: + +### Examples (#methods-serialize-examples) + +#### Serialize forked instance state (#methods-serialize-examples-serializeForkedInstanceState) + +```js +import { createDomain, fork, serialize } from "effector"; + +const domain = createDomain(); +const $store = domain.createStore(42); +const scope = fork(domain); + +console.log(serialize(scope)); // => {[sid]: 42} +``` + +[Try it](https://share.effector.dev/zlRJbjei) + +#### Using with `onlyChanges` (#methods-serialize-examples-usingWithOnlyChanges) + +With `onlyChanges`, this method will serialize only stores which were changed by some trigger during work or defined in `values` field by [fork](/en/api/effector/fork) or [hydrate(scope)](/en/api/effector/hydrate). Once being changed, a store will stay marked as changed in given scope even if it was turned back to the default state during work, otherwise client will not update that store on its side, which is unexpected and inconsistent. +This allows us to hydrate client state several times, for example, during route changes in next.js + +```js +import { createDomain, fork, serialize, hydrate } from "effector"; + +const app = createDomain(); + +/** store which we want to hydrate by server */ +const $title = app.createStore("dashboard"); + +/** store which is not used by server */ +const $clientTheme = app.createStore("light"); + +/** scope in client app */ +const clientScope = fork(app, { + values: new Map([ + [$clientTheme, "dark"], + [$title, "profile"], + ]), +}); + +/** server side scope of chats page created for each request */ +const chatsPageScope = fork(app, { + values: new Map([[$title, "chats"]]), +}); + +/** this object will contain only $title data + * as $clientTheme never changed in server scope */ +const chatsPageData = serialize(chatsPageScope, { onlyChanges: true }); +console.log(chatsPageData); +// => {'-l644hw': 'chats'} + +/** thereby, filling values from a server will touch only relevant stores */ +hydrate(clientScope, { values: chatsPageData }); + +console.log(clientScope.getState($clientTheme)); +// => dark +``` + +[Try it](https://share.effector.dev/BQhzISFV) diff --git a/src/content/docs/en/api/effector/split.md b/src/content/docs/en/api/effector/split.md new file mode 100644 index 0000000..bf7c365 --- /dev/null +++ b/src/content/docs/en/api/effector/split.md @@ -0,0 +1,398 @@ +--- +title: split +redirectFrom: + - /api/effector/split + - /docs/api/effector/split +--- + +```ts +import { split } from "effector"; +``` + +Choose one of cases by given conditions. It "splits" source unit into several events, which fires when payload matches their conditions. Works like pattern matching for payload values and external stores + +# Concepts (#concepts) + +## Case mode (#concepts-case-mode) + +Mode in which target case is selected by the name of its field. Case could be selected from data in `source` by [case function](/en/api/effector/split#case-function) or from external [case store](/en/api/effector/split#case-store) which kept current case name. After selection data from `source` will be sent to corresponding `cases[fieldName]` (if there is one), if none of the fields matches, then the data will be sent to `cases.__` (if there is one). + +**See also**: + +- [case store](/en/api/effector/split#case-store) +- [case function](/en/api/effector/split#case-function) + +## Matching mode (#concepts-matching-mode) + +Mode in which each case is sequentially matched by stores and functions in fields of `match` object. +If one of the fields got `true` from store value or return of function, then the data from `source` will be sent to corresponding `cases[fieldName]` (if there is one), if none of the fields matches, then the data will be sent to `cases.__` (if there is one) + +**See also**: + +- [matcher store](/en/api/effector/split#matcher-store) +- [matcher function](/en/api/effector/split#matcher-function) + +## Case store (#concepts-case-store) + +Store with a string which will be used to choose the case by its name. Placed directly in `match` field. + +```ts +split({ + source: Unit<T> + // case store + match: Store<'first' | 'second'>, + cases: { + first: Unit<T>, + second: Unit<T>, + __?: Unit<T> + } +}) +``` + +## Case function (#concepts-case-function) + +String-returning function which will be called with value from `source` to choose the case by its name. Placed directly in `match` field, [should be **pure**](/en/explanation/glossary#purity) + +```ts +split({ + source: Unit<T> + // case function + match: (value: T) => 'first' | 'second', + cases: { + first: Unit<T>, + second: Unit<T>, + __?: Unit<T> + } +}) +``` + +## Matcher store (#concepts-matcher-store) + +Boolean store which indicates whether to choose the particular case or try the next one. Placed in fields of `match` object, might be mixed with [matcher functions](/en/api/effector/split#matcher-function) + +```ts +split({ + source: Unit<T> + match: { + // matcher store + first: Store<boolean>, + second: Store<boolean> + }, + cases: { + first: Unit<T>, + second: Unit<T>, + __?: Unit<T> + } +}) +``` + +## Matcher function (#concepts-matcher-function) + +:::info +Case store, case function and matcher store are supported since [effector 21.8.0](https://changelog.effector.dev/#effector-21-8-0) +::: + +Boolean-returning function which indicates whether to choose the particular case or try the next one. Placed in fields of `match` object, might be mixed with [matcher stores](/en/api/effector/split#matcher-store), [should be **pure**](/en/explanation/glossary#purity) + +```ts +split({ + source: Unit<T> + match: { + // matcher function + first: (value: T) => boolean, + second: (value: T) => boolean + }, + cases: { + first: Unit<T>, + second: Unit<T>, + __?: Unit<T> + } +}) +``` + +# Methods (#methods) + +## `split({ source, match, cases })` (#methods-split-source-match-cases) + +:::info{title="since"} +[effector 21.0.0](https://changelog.effector.dev/#effector-21-0-0) +::: + +### Formulae (#methods-split-source-match-cases-formulae) + +```ts +split({ source, match, cases }); +``` + +```ts +split({ + source: Unit<T> + // case function + match: (data: T) => 'a' | 'b', + cases: { + a: Unit<T>, + b: Unit<T>, + __?: Unit<T> + } +}) +split({ + source: Unit<T> + // case store + match: Store<'a' | 'b'>, + cases: { + a: Unit<T>, + b: Unit<T>, + __?: Unit<T> + } +}) +split({ + source: Unit<T> + match: { + // matcher function + a: (data: T) => boolean, + // matcher store + b: Store<boolean> + }, + cases: { + a: Unit<T>, + b: Unit<T>, + __?: Unit<T> + } +}) +``` + +### Arguments (#methods-split-source-match-cases-arguments) + +- `source`: [Unit](/en/explanation/glossary#common-unit) which will trigger computation in `split` +- `match`: Single [store with string](/en/api/effector/split#case-store), single [function which returns string](/en/api/effector/split#case-function) or object with [boolean stores](/en/api/effector/split#matching-store) and [functions which returns boolean](/en/api/effector/split#matching-function) +- `cases`: Object with [units](/en/explanation/glossary#common-unit) to which data will be passed from `source` after case selection + +### Returns (#methods-split-source-match-cases-returns) + +`void` + +### Examples (#methods-split-source-match-cases-examples) + +#### Basic (#methods-split-source-match-cases-examples-basic) + +```js +import { split, createEffect, createEvent } from "effector"; +const messageReceived = createEvent(); +const showTextPopup = createEvent(); +const playAudio = createEvent(); +const reportUnknownMessageTypeFx = createEffect(({ type }) => { + console.log("unknown message:", type); +}); + +split({ + source: messageReceived, + match: { + text: (msg) => msg.type === "text", + audio: (msg) => msg.type === "audio", + }, + cases: { + text: showTextPopup, + audio: playAudio, + __: reportUnknownMessageTypeFx, + }, +}); + +showTextPopup.watch(({ value }) => { + console.log("new message:", value); +}); + +messageReceived({ + type: "text", + value: "Hello", +}); +// => new message: Hello +messageReceived({ + type: "image", + imageUrl: "...", +}); +// => unknown message: image +``` + +[Try it](https://share.effector.dev/W6VYZbfH) + +#### Direct match (#methods-split-source-match-cases-examples-direct-match) + +You can match directly to store api as well: + +```js +import { split, createStore, createEvent, createApi } from "effector"; + +const messageReceived = createEvent(); + +const $textContent = createStore([]); + +split({ + source: messageReceived, + match: { + text: (msg) => msg.type === "text", + audio: (msg) => msg.type === "audio", + }, + cases: createApi($textContent, { + text: (list, { value }) => [...list, value], + audio: (list, { duration }) => [...list, `audio ${duration} ms`], + __: (list) => [...list, "unknown message"], + }), +}); + +$textContent.watch((messages) => { + console.log(messages); +}); + +messageReceived({ + type: "text", + value: "Hello", +}); +// => ['Hello'] +messageReceived({ + type: "image", + imageUrl: "...", +}); +// => ['Hello', 'unknown message'] +messageReceived({ + type: "audio", + duration: 500, +}); +// => ['Hello', 'unknown message', 'audio 500 ms'] +``` + +[Try it](https://share.effector.dev/32FNNk8H) + +## `split(source, match)` (#methods-split-source-match) + +:::info{title="since"} +[effector 20.0.0](https://changelog.effector.dev/#effector-20-0-0) +::: + +### Formulae (#methods-split-source-match-formulae) + +```ts +split(source, match); +``` + +### Arguments (#methods-split-source-match-arguments) + +1. `source`: [Unit](/en/explanation/glossary#common-unit) which will trigger computation in `split` +2. `match` (_Object_): Schema of cases, which uses names of resulting events as keys, and matching function*((value) => Boolean)* + +### Returns (#methods-split-source-match-returns) + +(Object) – Object, having keys, defined in `match` argument, plus `__`(two underscores) – which stands for `default` (no matches met) case. + +### Examples (#methods-split-source-match-examples) + +#### Basic (#methods-split-source-match-examples-basic) + +```js +import { createEvent, split } from "effector"; + +const message = createEvent(); + +const messageByAuthor = split(message, { + bob: ({ user }) => user === "bob", + alice: ({ user }) => user === "alice", +}); +messageByAuthor.bob.watch(({ text }) => { + console.log("[bob]: ", text); +}); +messageByAuthor.alice.watch(({ text }) => { + console.log("[alice]: ", text); +}); + +message({ user: "bob", text: "Hello" }); +// => [bob]: Hello +message({ user: "alice", text: "Hi bob" }); +// => [alice]: Hi bob + +/* default case, triggered if no one condition met */ +const { __: guest } = messageByAuthor; +guest.watch(({ text }) => { + console.log("[guest]: ", text); +}); +message({ user: "unregistered", text: "hi" }); +// => [guest]: hi +``` + +[Try it](https://share.effector.dev/QXZsR5yM) + +:::info +Only the first met match will trigger resulting event +::: + +#### Another (#methods-split-source-match-examples-another) + +```js +import { createEvent, split } from "effector"; + +const message = createEvent(); + +const { short, long, medium } = split(message, { + short: (m) => m.length <= 5, + medium: (m) => m.length > 5 && m.length <= 10, + long: (m) => m.length > 10, +}); + +short.watch((m) => console.log(`short message '${m}'`)); +medium.watch((m) => console.log(`medium message '${m}'`)); +long.watch((m) => console.log(`long message '${m}'`)); + +message("Hello, Bob!"); +// => long message 'Hello, Bob!' + +message("Hi!"); +// => short message 'Hi!' +``` + +[Try it](https://share.effector.dev/ke2tM78I) + +## `split({ source, clock?, match, cases })` (#methods-split-source-clock-match-cases) + +:::info{title="since"} +[effector 22.2.0](https://changelog.effector.dev/#effector-22-2-0) +::: + +It works the same as [split with cases](/en/api/effector/split#methods-split-source-match-cases), however computations in `split` will be started after `clock` is triggered. + +### Formulae (#methods-split-source-clock-match-cases-formulae) + +```js +split({source, clock?, match, cases}) +``` + +### Arguments (#methods-split-source-clock-match-cases-arguments) + +TBD + +### Examples (#methods-split-source-clock-match-cases-examples) + +```js +const options = ["save", "delete", "forward"]; +const $message = createStore({ id: 1, text: "Bring me a cup of coffee, please!" }); +const $mode = createStore(""); +const selectedMessageOption = createEvent(); +const saveMessageFx = createEffect(() => "save"); +const forwardMessageFx = createEffect(() => "forward"); +const deleteMessageFx = createEffect(() => "delete"); + +$mode.on(selectedMessageOption, (_, opt) => options.find((item) => item === opt)); + +split({ + source: $message, + clock: selectedMessageOption, + match: $mode, + cases: { + save: saveMessageFx, + delete: deleteMessageFx, + forward: forwardMessageFx, + }, +}); + +selectedMessageOption("delet"); // nothing happens +selectedMessageOption("delete"); +``` + +[Try it](https://share.effector.dev/VJmD5KdN) diff --git a/src/content/docs/en/api/effector/withRegion.md b/src/content/docs/en/api/effector/withRegion.md new file mode 100644 index 0000000..24ac878 --- /dev/null +++ b/src/content/docs/en/api/effector/withRegion.md @@ -0,0 +1,62 @@ +--- +title: withRegion +redirectFrom: + - /api/effector/withRegion + - /docs/api/effector/withRegion +--- + +```ts +import { withRegion } from "effector"; +``` + +The method is based on the idea of region-based memory management (see [Region-based memory management](https://en.wikipedia.org/wiki/Region-based_memory_management) for reference). + +# Methods (#methods) + +## `withRegion(unit, callback)` (#methods-withRegion) + +:::info{title="since"} +[effector 20.11.0](https://changelog.effector.dev/#effector-20-11-0) +::: + +The method allows to explicitly transfer ownership of all units (including links created with `sample`, `forward`, etc...) defined in the callback to `unit`. As an implication, all the created links will be erased as soon as `clearNode` is called on [_Unit_](/en/explanation/glossary#unit). + +### Formulae (#methods-withRegion-unit-callback-formulae) + +```ts +withRegion(unit: Unit<T> | Step, callback: () => void): void +``` + +### Arguments (#methods-withRegion-unit-callback-arguments) + +1. `unit`: _Unit_ | _Step_ — which will serve as "local area" or "region" owning all the units created within the provided callback. +2. `callback`: `() => void` — The callback where all the relevant units should be defined. + +### Examples (#methods-withRegion-unit-callback-examples) + +```js +import { createDomain, createEvent, restore, withRegion, clearNode } from "effector"; + +const first = createEvent(); +const second = createEvent(); +const $store = restore(first, ""); +const domain = createDomain(); + +withRegion(domain, () => { + // Following links created with `forward` or `sample` are owned by the provided unit `domain` + // and will be disposed as soon as `clearNode` is called on `domain`. + forward({ + from: second, + to: first, + }); +}); + +$store.watch(console.log); + +first("hello"); +second("world"); + +clearNode(domain); + +second("will not trigger updates of `$store`"); +``` diff --git a/src/content/docs/en/api/index.mdx b/src/content/docs/en/api/index.mdx new file mode 100644 index 0000000..3762232 --- /dev/null +++ b/src/content/docs/en/api/index.mdx @@ -0,0 +1,49 @@ +--- +title: API Reference +--- + +import FeatureCard from "@components/FeatureCard.astro"; +import IconReact from "@icons/React.astro"; +import IconVue from "@icons/Vue.astro"; +import IconSolid from "@icons/Solid.astro"; +import IconEffector from "@icons/Effector.astro"; + +# Effector Packages + +Effector provides a range of packages to accommodate your specific needs. There are packages supported by the core team. + +<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-1 xl:grid-cols-2 gap-4 mb-50"> + +<FeatureCard + title="effector" + description="The core library forms the foundation for most written code." + link="/en/api/effector" +> + <IconEffector slot="icon" /> +</FeatureCard> + +<FeatureCard + title="effector-react" + description="Specialized hooks and gates, designed to seamlessly integrate with React." + link="/en/api/effector-react" +> + <IconReact slot="icon" /> +</FeatureCard> + +<FeatureCard + title="effector-solid" + description="Bindings for performant reactivity framework." + link="/en/api/effector-solid" +> + <IconSolid slot="icon" /> +</FeatureCard> + +<FeatureCard + title="effector-vue" + description="Bindings for progressive framework" + link="/en/api/effector-vue" +> + <IconVue slot="icon" /> +</FeatureCard> + +</div> diff --git a/src/content/docs/en/conventions/naming.md b/src/content/docs/en/conventions/naming.md new file mode 100644 index 0000000..adb3a3f --- /dev/null +++ b/src/content/docs/en/conventions/naming.md @@ -0,0 +1,41 @@ +--- +title: Naming +description: Naming conventions for stores, events and effects +redirectFrom: + - /docs/conventions/naming + - /conventions/naming +--- + +First of all, to avoid any misconceptions and get better developer experience for all of us. This document contains several pretty simple rules to keep consistency between different projects written with effector. + +## Stores naming + +Your stores should be distinguished by a `$`. The choice between prefix or postfix is mostly a matter of personal preference. This should be done to have a better search experience in your IDE. + +```js +const $user = createStore({}); +``` + +## Effect naming + +It is recommended to add the `Fx` postfix to the end of your effects. It will let you differentiate your effects from the events. + +```js +const fetchUserFx = createEffect(async () => { + const res = await fetch("my pretty url"); + return res.json(); +}); +``` + +## Event naming + +There are no any specific rules for this. However, the proposal is to name events that directly trigger store updates, as like as they have already happened. + +```js +const emailChanged = createEvent(); + +$user.on(emailChanged, (state, email) => ({ + ...state, + email, +})); +``` diff --git a/src/content/docs/en/core-principles/own-your-data.md b/src/content/docs/en/core-principles/own-your-data.md new file mode 100644 index 0000000..aa24bdf --- /dev/null +++ b/src/content/docs/en/core-principles/own-your-data.md @@ -0,0 +1,11 @@ +--- +title: Own your data principle +redirectFrom: + - /core-principles/own-your-data +--- + +Effector will not force you to turn your data into abstract or custom entities – your data are your data and effector only provides infrastructure to handle it. + +That means that you should not use effector's entities (Store, Event, etc) to represent your data – only to describe the surrounding logic. + +- Effector Store with an array of other Stores inside – anti-pattern, use key-value pattern instead. diff --git a/src/content/docs/en/core-principles/releases.md b/src/content/docs/en/core-principles/releases.md new file mode 100644 index 0000000..278fdb5 --- /dev/null +++ b/src/content/docs/en/core-principles/releases.md @@ -0,0 +1,26 @@ +--- +title: Releases policy +redirectFrom: + - /core-principles/releases +--- + +The main goal of effector is to **make developer experience better**, as a part of this strategy we are committing to some rules of effector releases. + +## No breaking changes without prior deprecation + +Before each breaking change, the effector must provide a deprecation warning for **at least a year before.** + +For example: + +- When version 22 was released, feature "A" was marked as deprecated. The library gives a warning to the console when it is used. +- A year later, in version 23 release, feature "A" is removed. + +## Release cycle + +Major updates (i.e. with breaking changes) of the effector are released **no more than once a year.** + +Minor and patch updates (i.e., with fixes and new features) are released when ready. If a new feature requires breaking changes – it is also released in a major update. + +This is necessary to allow developers to plan their work smoothly, taking into account possible changes in effector. + +It also obliges effector maintainers to be extremely careful when designing new features and breaking changes to old library features, because the opportunity to remove or heavily modify something in the public API only appears once every two years. diff --git a/src/content/docs/en/core-principles/testing.md b/src/content/docs/en/core-principles/testing.md new file mode 100644 index 0000000..9e0a399 --- /dev/null +++ b/src/content/docs/en/core-principles/testing.md @@ -0,0 +1,13 @@ +--- +title: Testing +redirectFrom: + - /core-principles/testing +--- + +We believe that the only way to write good code is to test it. + +This has the following consequences: + +- Every effector function is created with testing in mind, so users don't have to come up with complicated ways to test their code. +- Effector is heavily tested itself. +- Any fixes or features without proper testing **will not be accepted**. diff --git a/src/content/docs/en/core-principles/typings.md b/src/content/docs/en/core-principles/typings.md new file mode 100644 index 0000000..a5e7833 --- /dev/null +++ b/src/content/docs/en/core-principles/typings.md @@ -0,0 +1,17 @@ +--- +title: Typings +redirectFrom: + - /core-principles/typing +--- + +We believe that good type support is a necessary part of good DX. + +## TypeScript + +Effector is aiming to provide first-class support of TypeScript types. +Effector is written in TypeScript, and there are [a lot of type-tests in the codebase, including auto-generated ones.](https://github.com/effector/effector/tree/master/src/types) + +However, TypeScript itself does not aim for [applying a sound or "provably correct" type system](https://github.com/Microsoft/TypeScript/wiki/TypeScript-Design-Goals#non-goals), instead it strikes a balance between correctness and productivity. +So, we cannot guarantee that all the types are correct, but we are going to do our best to provide the best possible type inference. + +Public typings of effector are [located here](https://github.com/effector/effector/blob/master/packages/effector/index.d.ts), separate from the main code of the library. diff --git a/src/content/docs/en/ecosystem-development/unit-shape-protocol.md b/src/content/docs/en/ecosystem-development/unit-shape-protocol.md new file mode 100644 index 0000000..211e8aa --- /dev/null +++ b/src/content/docs/en/ecosystem-development/unit-shape-protocol.md @@ -0,0 +1,69 @@ +--- +title: Protocol @@unitShape +description: Re-use UI-library bindings for your own effector-based libraries +redirectFrom: + - /docs/ecosystem-development/unit-shape-protocol + - /ecosystem-development/unit-shape-protocol +--- + +:::info +Available since [effector-react 22.4.0](https://changelog.effector.dev/#effector-react-22-4-0), effector-solid 0.22.7 +::: + +Effector provides a way to use units ([Stores](/en/api/effector/Store), [Events](/en/api/effector/Event), [Effects](/en/api/effector/Effect)) in UI libraries with a special bindings like `effector-react`, `effector-solid`, etc. Normally, they allow binding any shape of units to a UI-framework: + +```ts +import { createStore } from "effector"; +import { useUnit } from "effector-react"; + +const $value = createStore("Hello!"); + +const Component = () => { + const { value } = useUnit({ value: $value }); + + return <p>{value}</p>; +}; +``` + +But what if you want to create your own library on top of effector with some custom entities? For example, you want to create a router library with a custom `Route` entity, and you want to allow users to use it with `effector-react` bindings: + +```ts +import { createRoute } from "my-router-library"; +import { useUnit } from "effector-react"; + +const mainPageRoute = createRoute(/* ... */); + +const Component = () => { + const { params } = useUnit(mainPageRoute); + + return <p>{params.name}</p>; +}; +``` + +It is possible with the `@@unitShape` protocol. It allows defining the shape of a unit in the custom entity and then using it in UI libraries. Just add field `@@unitShape` with a function that return shape of units to your entity: + +```ts +function createRoute(/* ... */) { + const $params = createStore(/* ... */); + + return { + "@@unitShape": () => ({ + params: $params, + }), + }; +} +``` + +## FAQ + +--- + +**Q**: How frequently `@@unitShape`-function is called? + +**A**: As many times as `useUnit` itself is called – it depends on a UI-library. For example, `effector-react` calls it as any other hook – once per component render, but `effector-solid` calls `useUnit` once per component mount. + +--- + +**Q**: How can I know what UI-library is used for particular `@@unitShape` call? + +**A**: You cannot. `@@unitShape` has to be universal for all UI-libraries either has to check what UI-library is used inside by UI-library methods (like `Context` in React or Solid). diff --git a/src/content/docs/en/explanation/computation-priority.md b/src/content/docs/en/explanation/computation-priority.md new file mode 100644 index 0000000..7cd9654 --- /dev/null +++ b/src/content/docs/en/explanation/computation-priority.md @@ -0,0 +1,70 @@ +--- +title: Computation priority +description: How effector calculates units +redirectFrom: + - /en/advanced-guide/computation-priority + - /explanation/computation-priority + - /docs/advanced-guide/computation-priority + - /docs/explanation/computation-priority +--- + +For sure, you've noticed that function [should be pure](/en/explanation/glossary#purity)... or watch if there is a place +for side effect. We will talk about this in the current section – **Computation priority** + +A real example of queue priority — people waiting for medical treatment in a hospital, extreme emergency cases will have +the highest priority and move to the start of the queue and less significant to the end. + +Computation priority allows us to have side effects, and it's one of the main reasons to create this concept: + +- Letting pure functions to execute first. +- Side effects can follow a consistent state of the application. + +Actually, pure computation cannot be observed out of the scope, therefore, the definition of **_pure computation_** used +in this library gives us an opportunity to optimize grouping. + +Priority: + +[Source code](https://github.com/effector/effector/blob/master/src/effector/kernel.ts#L169) + +``` +1. child -> forward +2. pure -> map, on +3. sampler -> sample, guard, combine +4. effect -> watch, effect handler +``` + +> Whenever you allow side effects in pure computations, the library will work by the worst scenario. Thereby, increasing non-consistency of application and breaking pure computations. Don't ignore that. + +Let's consider prioritizing in the example below. + +```js +let count = 0; +const fx = createEffect(() => { + // side effect 1 + count += 1; +}); + +fx.done.watch(() => { + // side effect 1 already executed + console.log("expect count to be 1", count === 1); + // side effect 2 + count += 1; +}); + +fx(); +// side effect 1 already executed +// side effect 2 already executed as well +// that's what we expected to happen +// that's watchmen effect +console.log("expect count to be 2", count === 2); +// example which violated that agreement: setState in react +// which defer any side effect long after setState call itself +``` + +[Try it](https://share.effector.dev/IRAmt9Uq) + +:::info +Whenever a library notices side effect in a pure function it moves it to the end of the [**priority queue**](https://en.wikipedia.org/wiki/Priority_queue). +::: + +We hope that this information cleared some things on how the library works. diff --git a/src/content/docs/en/explanation/events.md b/src/content/docs/en/explanation/events.md new file mode 100644 index 0000000..59c84ab --- /dev/null +++ b/src/content/docs/en/explanation/events.md @@ -0,0 +1,183 @@ +--- +title: Events +keywords: + - event + - unit +description: How events works, where to use +--- + +The **Event** in effector represents a user action, a step in the application process, a command to execute, or an intention to make modifications, among other things. This unit is designed to be a carrier of information/intention/state within the application, not the holder of a state. + +In most situations, it is recommended to create events directly within the module, rather than placing them within conditional statements or classes, in order to maintain simplicity and readability. An exception to this recommendation is the use of factory functions; however, these should also be invoked at the root level of the module. + +:::info +Event instances persist throughout the entire runtime of the application and inherently represent a portion of the business logic. + +Attempting to delete instances and clear memory for the purpose of saving resources is not advised, as it may adversely impact the functionality and performance of the application. +::: + +## Calling the event (#event-calling) + +There are two ways to trigger event: imperative and declarative. + +The **imperative** method involves invoking the event as if it were a function: + +```ts +import { createEvent } from "effector"; + +const callHappened = createEvent<void>(); + +callHappened(); // event triggered +``` + +The **declarative** approach utilizes the event as a target for operators, such as sample, or as an argument when passed into factory functions: + +```ts +import { createEvent, sample } from "effector"; + +const firstTriggered = createEvent<void>(); +const secondTriggered = createEvent<void>(); + +sample({ + clock: firstTriggered, + target: secondTriggered, +}); +``` + +> When the `firstTriggered` event is invoked, the `secondTriggered` event will be subsequently called, creating a sequence of events. + +This method is employed to link various units within a single event chain. In most cases, the chain will have multiple branches, allowing for diverse interactions and processes within the application logic. + +**You need to know:** In Effector, any event supports only **a single argument**. +It is not possible to call an event with two or more arguments, as in `someEvent(first, second)`. + +All arguments beyond the first will be ignored. +The core team has implemented this rule for specific reasons related to the design and functionality. +This approach enables the argument to be accessed in any situation without adding types complexity. + +If multiple arguments need to be passed, encapsulate them within an object: + +```ts +import { createEvent } from "effector"; +const requestReceived = createEvent<{ id: number; title: string }>(); +requestReceived({ id: 1, title: "example" }); +``` + +This rule also contributes to the clarity of each argument's meaning, both at the call side and subscription side. It promotes clean and organized code, making it easier to understand and maintain. + +## Watching the event (#event-watch) + +To ascertain when an event is called, effector and its ecosystem offer various methods with distinct capabilities. Debugging is the primary use case for this purpose, and we highly recommend using [`patronum/debug`](https://patronum.effector.dev/methods/debug/) to display when an event is triggered and the argument it carries. + +```ts +import { createEvent, sample } from "effector"; +import { debug } from "patronum"; + +const firstTriggered = createEvent<void>(); +const secondTriggered = createEvent<void>(); + +sample({ + clock: firstTriggered, + target: secondTriggered, +}); + +debug(firstTriggered, secondTriggered); + +firstTriggered(); +// => [event] firstTriggered undefined +// => [event] secondTriggered undefined +``` + +However, if your environment does not permit the addition of further dependencies, you may use the `.watch()` method with caution. + +```ts +import { createEvent, sample } from "effector"; + +const firstTriggered = createEvent<void>(); +const secondTriggered = createEvent<void>(); + +sample({ + clock: firstTriggered, + target: secondTriggered, +}); + +firstTriggered.watch(() => console.info("[event] firstTriggered")); +secondTriggered.watch(() => console.info("[event] secondTriggered")); + +firstTriggered(); +// => [event] firstTriggered +// => [event] secondTriggered +``` + +:::tip{title="Keep in mind"} +The `watch` method neither handles nor reports exceptions, manages the completion of asynchronous operations, nor addresses data race issues. + +Its primary intended use is for short-term debugging and logging purposes. +::: + +## Working with TypeScript (#typescript) + +When an event is invoked, TypeScript will verify that the type of the argument passed matches the type defined in the event, ensuring consistency and type safety within the code. + +This is also works for operators like `sample` or `split`: + +```ts +import { sample, createEvent } from "effector"; + +const someHappened = createEvent<number>(); +const anotherHappened = createEvent<string>(); + +sample({ + // @ts-expect-error error: "clock should extend target type"; targets: { clockType: number; targetType: string; } + clock: someHappened, + target: anotherHappened, +}); +``` + +[Try it](https://tsplay.dev/WyoPKN) + +To specify the argument type for an event, it is essential to first determine the intended purpose, what do you want to do with this event: + +- If you intend to **invoke** an event or use it as a target, you should utilize the `EventCallable<T>` type. +- If your goal is to **subscribe** to updates, or use the event as a `clock` or `source`, you should employ the `Event<T>` type. + +_Where `T` represents the type of the event's argument._ + +```ts +import { type Event, createStore, createEvent } from "effector"; + +function createCounter(counterChanged: Event<number>) { + const $counter = createStore(0); + sample({ + clock: $counter, + target: counterChanged, + }); +} + +const whenCounterChanged = createEvent<number>(); +createCounter(whenCounterChanged); +``` + +## Using `Event` (#event-using) + +A `Event` is a super type of `EventCallable` with different approach. Firstly, invoking a `Event` is not allowed, and it cannot be used as a target in the sample operator, and so on. + +The primary purpose of a `Event` is to be triggered by internal code withing the effector library or ecosystem. For instance, the `.map()` method returns a `Event`, which is subsequently called by the `.map()` method itself. + +To utilize the `Event` type, simply import it from the `"effector"` package and integrate it into your code as needed: + +```ts +import { type Event, createStore, createEvent } from "effector"; + +function createCounter(increment: Event<void>) { + const $counter = createStore(0); + + $counter.on(increment, (count) => count + 1); +} + +const incrementCounter = createEvent<number>(); +createCounter(incrementCounter); +incrementCounter(); +``` + +It is allowed to pass `EventCallable<T>` into argument with type `Event<T>`. The primary purpose of Event is to accept any event type while explicitly signaling the code's intention to listen to the event, rather than invoking it. diff --git a/src/content/docs/en/explanation/glossary.md b/src/content/docs/en/explanation/glossary.md new file mode 100644 index 0000000..f09aebc --- /dev/null +++ b/src/content/docs/en/explanation/glossary.md @@ -0,0 +1,162 @@ +--- +title: Glossary +description: Glossary of basic terms in effector +redirectFrom: + - /docs/glossary + - /docs/explanation/glossary + - /explanation/glossary + - /en/glossary +--- + +Glossary of basic terms in effector. + +## Event (#event) + +_Event_ is a function you can subscribe to. It can be an intention to change the store, indication of something happening in the application, a command to be executed, aggregated analytics trigger and so on. + +[Event](/en/api/effector/Event) in api documentation + +## Store (#store) + +_Store_ is an object that holds state. +There can be multiple stores. + +[Store](/en/api/effector/Store) in api documentation + +## Effect (#effect) + +_Effect_ is a container for (possibly async) side effects. +It exposes special events and stores, such as `.pending`, `.done`, `.fail`, `.finally`, etc... + +It can be safely used in place of the original async function. + +It returns promise with the result of a function call. + +The only requirement for the function: + +- **Must** have zero or one argument + +[Effect](/en/api/effector/Effect) in api documentation + +## Domain (#domain) + +_Domain_ is a namespace for your events, stores and effects. + +Domains are notified when events, stores, effects, or nested domains are created via `.onCreateEvent`, `.onCreateStore`, `.onCreateEffect`, `.onCreateDomain` methods. + +It is useful for logging or other side effects. + +[Domain](/en/api/effector/Domain) in api documentation + +## Unit (#unit) + +Data type used to describe business logic of applications. Most of the effector methods deal with unit processing. +There are five unit types: [Store](/en/api/effector/Store), [Event](/en/api/effector/Event), [Effect](/en/api/effector/Effect), [Domain](/en/api/effector/Domain) and [Scope](/en/api/effector/Scope). + +## Common unit (#common-unit) + +Common units can be used to trigger updates of other units. There are three common unit types: [Store](/en/api/effector/Store), [Event](/en/api/effector/Event) and [Effect](/en/api/effector/Effect). **When a method accepts units, it means that it accepts events, effects, and stores** as a source of reactive updates. + +## Purity (#purity) + +Most of the functions in api must not call other events or effects: it's easier to reason about application's data flow when imperative triggers are grouped inside watchers and effect handlers rather than spread across entire business logic. + +**Correct**, imperative: + +```js +import { createStore, createEvent } from "effector"; + +const submitLoginSize = createEvent(); + +const $login = createStore("guest"); +const $loginSize = $login.map((login) => login.length); + +$loginSize.watch((size) => { + submitLoginSize(size); +}); +``` + +[Try it](https://share.effector.dev/D5hV8C70) + +Reference: [Store.map](/en/api/effector/Store#map-fn), [Store.watch](/en/api/effector/Store#watch-watcher) + +**Better**, declarative: + +```js +import { createStore, createEvent, sample } from "effector"; + +const submitLoginSize = createEvent(); + +const $login = createStore("guest"); +const $loginSize = $login.map((login) => login.length); + +sample({ + clock: $loginSize, + target: submitLoginSize, +}); +``` + +[Try it](https://share.effector.dev/it0gXQLI) + +Reference: [sample](/en/api/effector/sample) + +**Incorrect**: + +```js +import { createStore, createEvent } from "effector"; + +const submitLoginSize = createEvent(); + +const $login = createStore("guest"); +const $loginSize = $login.map((login) => { + // no! use `sample` instead + submitLoginSize(login.length); + return login.length; +}); +``` + +## Reducer (#reducer) + +```typescript +type StoreReducer<State, E> = (state: State, payload: E) => State | void; +type EventOrEffectReducer<T, E> = (state: T, payload: E) => T; +``` + +_Reducer_ calculates a new state given the previous state and an event's payload. For stores, if reducer returns undefined or the same state (`===`), then there will be no update for a given store. + +## Watcher (#watcher) + +```typescript +type Watcher<T> = (update: T) => any; +``` + +_Watcher_ is used for **side effects**. Accepted by [Event.watch](/en/api/effector/Event#watch-watcher), [Store.watch](/en/api/effector/Store#watchwatcher) and [Domain.onCreate\* hooks](/en/api/effector/Domain#oncreateeventhook). Return value of a watcher is ignored. + +## Subscription (#subscription) + +```ts +import { type Subscription } from "effector"; +``` + +Looks like: + +```typescript +type Subscription = { + (): void; + unsubscribe(): void; +}; +``` + +**Function**, returned by [forward](/en/api/effector/forward), [Event.watch](/en/api/effector/Event#event-watch-watcher), [Store.watch](/en/api/effector/Store#methods-watch-watcher) and some other methods. Used for cancelling a subscription. After the first call, subscription will do nothing. + +:::warning +**Managing subscriptions manually distracts from business logic improvements.** +<br/><br/> +Effector provides a wide range of features to minimize the need to remove subscriptions. This sets it apart from most other reactive libraries. +::: + +[effect]: /en/api/effector/Effect +[store]: /en/api/effector/Store +[event]: /en/api/effector/Event +[domain]: /en/api/effector/Domain +[scope]: /en/api/effector/Scope diff --git a/src/content/docs/en/explanation/prior-art.md b/src/content/docs/en/explanation/prior-art.md new file mode 100644 index 0000000..b2c7df0 --- /dev/null +++ b/src/content/docs/en/explanation/prior-art.md @@ -0,0 +1,33 @@ +--- +id: prior-art +title: Prior Art +redirectFrom: + - /en/advanced-guide/prior-art + - /explanation/prior-art + - /docs/explanation/prior-art + - /advanced-guide/prior-art +--- + +## Papers + +- **Functional Pearl. Weaving a Web** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/weaver+zipper.pdf) _Ralf Hinze and Johan Jeuring_ +- **A graph model of data and workflow provenance** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/A+graph+model+of+data+and+workflow+provenance.pdf) <br/> _Umut Acar, Peter Buneman, James Cheney, Jan Van den Bussche, Natalia Kwasnikowska and Stijn Vansummeren_ +- **An Applicative Control-Flow Graph Based on Huet’s Zipper** [[pdf]](http://zero-bias-papers.s3-website-eu-west-1.amazonaws.com/zipcfg.pdf) <br/> _Norman Ramsey and Joao Dias_ +- **Elm: Concurrent FRP for Functional GUIs** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/elm-concurrent-frp.pdf) <br/> _Evan Czaplicki_ +- **Inductive Graphs and Functional Graph Algorithms** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/Inductive+Graphs+and+Functional+Graph+Algorithms.pdf) <br/> _Martin Erwig_ +- **Notes on Graph Algorithms Used in Optimizing Compilers** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/Graph+Algorithms+Used+in+Optimizing+Compilers.pdf) <br/> _Carl D. Offner_ +- **Backtracking, Interleaving, and Terminating Monad Transformers** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/Backtracking%2C+Interleaving%2C+and+Terminating+Monad+Transformers.pdf) <br/> _Oleg Kiselyov, Chung-chieh Shan, Daniel P. Friedman and Amr Sabry_ +- **Typed Tagless Final Interpreters** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/Typed+Tagless+Final+Interpreters.pdf) _Oleg Kiselyov_ + +## Books + +- **Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions** [[book]](https://www.amazon.com/o/asin/0321200683/ref=nosim/enterpriseint-20), [[messaging patterns overview]](https://www.enterpriseintegrationpatterns.com/patterns/messaging/) <br/> _Gregor Hohpe and Bobby Woolf_ + +## API + +- [re-frame](https://github.com/day8/re-frame) +- [flux](https://facebook.github.io/flux/) +- [redux](https://redux.js.org/) +- [redux-act](https://github.com/pauldijou/redux-act) +- [most](https://github.com/cujojs/most) +- nodejs [events](https://nodejs.org/dist/latest-v12.x/docs/api/events.html#events_emitter_on_eventname_listener) diff --git a/src/content/docs/en/explanation/sids.md b/src/content/docs/en/explanation/sids.md new file mode 100644 index 0000000..4d158ff --- /dev/null +++ b/src/content/docs/en/explanation/sids.md @@ -0,0 +1,322 @@ +--- +title: SIDs +description: Stable IDentifiers +redirectFrom: + - /en/explanation/sids + - /explanation/sids + - /docs/explanation/sids +--- + +The SID is a Stable IDentifier of an effector unit. It can be used for different purposes, but the main use case is Server Side Rendering. + +The SIDs have two important properties: + +1. They are **unique** – each SID for each unit should be unique. +2. They are **stable** between different environments – each SID of each unit in some environment (e.g. server code) should be equal to a SID of this unit in any other environment (e.g. client code). + +## How to add SIDs (#how-to-add-sids) + +The SIDs can be added manually and automatically, but it is important that they are set before any bundling happens — otherwise, there is no way to guarantee stability. + +### Manual way (#how-to-add-sids-manual) + +```tsx +import { createStore } from "effector"; + +export const $myStore = createStore(42, { sid: "my-stable-id" }); +``` + +It is important, that all SIDs are also **unique**. If you are using the manual way, you have to guarantee that by yourself. + +### Automatic way (#how-to-add-sids-automatic) + +For sure, manually creating unique ids is a quite boring job. + +Thankfully, there are [`effector/babel-plugin`](/api/effector/babel-plugin) and [`@effector/swc-plugin`](https://github.com/effector/swc-plugin), which will provide SIDs automatically. + +Because code-transpilation tools are working at the file level and are run before bundling happens – it is possible to make SIDs **stable** for every environment. + +:::tip +It is preferable to use [`effector/babel-plugin`](/api/effector/babel-plugin) or [`@effector/swc-plugin`](https://github.com/effector/swc-plugin) instead of adding SIDs manually. +::: + +## Why do we need Stable Identifiers (#why-do-we-need-sids) + +Because of **multi-store** architecture, Effector code in the applications is written in **atomic** and **distributed** way and there is no single central "root store" or "controller", which needs to be notified about all stores/reducers/etc, created anywhere in the app. + +And since there is no central "root store" – no additional setup (like Reducer Manager, etc) is required to support micro-frontends and code-splitting, everything works out of the box. + +**Code example** + +Notice, that there is no central point at all – any event of any "feature" can be triggered from anywhere and the rest of them will react accordingly. + +```tsx +// src/features/first-name/model.ts +import { createStore, createEvent } from "effector"; + +export const firstNameChanged = createEvent<string>(); +export const $firstName = createStore(""); + +$firstName.on(firstNameChanged, (_, firstName) => firstName); + +// src/features/last-name/model.ts +import { createStore, createEvent } from "effector"; + +export const lastNameChanged = createEvent<string>(); +export const $lastName = createStore(""); + +$lastName.on(lastNameChanged, (_, lastName) => lastName); + +// src/features/form/model.ts +import { createEvent, sample, combine } from "effector"; + +import { $firstName, firstNameChanged } from "@/features/first-name"; +import { $lastName, lastNameChanged } from "@/features/last-name"; + +export const formValuesFilled = createEvent<{ firstName: string; lastName: string }>(); + +export const $fullName = combine($firstName, $lastName, (first, last) => `${first} ${last}`); + +sample({ + clock: formValuesFilled, + fn: (values) => values.firstName, + target: firstNameChanged, +}); + +sample({ + clock: formValuesFilled, + fn: (values) => values.lastName, + target: lastNameChanged, +}); +``` + +If this application was a SPA or any other kind of client-only app — this would be the end of the article. + +### Serialization boundary (#serialization-boundary) + +But in the case of Server Side Rendering, there is always a **serialization boundary** — a point, where all state is stringified, added to a server response, and sent to a client browser. + +#### Problem (#serialization-boundary-problem) + +And at this point we **still need to collect the states of all stores of the app** somehow! + +Also, after the client browser has received a page — we need to "hydrate" everything back: unpack these values at the client and add this "server-calculated" state to client-side instances of all stores. + +#### Solution (#serialization-boundary-solution) + +This is a hard problem and to solve this, `effector` needs a way to connect the "server-calculated" state of some store with its client-side instance. + +While **it could be** done by introducing a "root store" or something like that, which would manage store instances and their state for us, it would also bring to us all the downsides of this approach, e.g. much more complicated code-splitting – so this is still undesirable. + +This is where SIDs will help us a lot. +Because SID is, by definition, the same for the same store in any environment, `effector` can simply rely on it to handle state serializing and hydration. + +#### Example (#serialization-boundary-example) + +This is a generic server-side rendering handler. The `renderHtmlToString` function is an implementation detail, which will depend on the framework you use. + +```tsx +// src/server/handler.ts +import { fork, allSettled, serialize } from "effector"; + +import { formValuesFilled } from "@/features/form"; + +async function handleServerRequest(req) { + const scope = fork(); // creates isolated container for application state + + // calculates the state of the app in this scope + await allSettled(formValuesFilled, { + scope, + params: { + firstName: "John", + lastName: "Doe", + }, + }); + + // extract scope values to simple js object of `{[storeSid]: storeState}` + const values = serialize(scope); + + const serializedState = JSON.stringify(values); + + return renderHtmlToString({ + scripts: [ + ` + <script> + self._SERVER_STATE_ = ${serializedState} + </script> + `, + ], + }); +} +``` + +Notice, that there are no direct imports of any stores of the application here. +The state is collected automatically and its serialized version already has all the information, which will be needed for hydration. + +When the generated response arrives in a client browser, the server state must be hydrated to the client stores. +Thanks to SIDs, state hydration also works automatically: + +```tsx +// src/client/index.ts +import { Provider } from "effector-react"; + +const serverState = window._SERVER_STATE_; + +const clientScope = fork({ + values: serverState, // simply assign server state to scope +}); + +clientScope.getState($lastName); // "Doe" + +hydrateApp( + <Provider value={clientScope}> + <App /> + </Provider>, +); +``` + +At this point, the state of all stores in the `clientScope` is the same, as it was at the server and there was **zero** manual work to do it. + +## Unique SIDs (#unique-sids) + +The stability of SIDs is ensured by the fact, that they are added to the code before any bundling has happened. + +But since both `babel` and `swc` plugins are able "to see" contents of one file at each moment, there is a case, where SIDs will be stable, but **might not be unique** + +To understand why, we need to dive a bit deeper into plugin internals. + +Both `effector` plugins use the same approach to code transformation. Basically, they do two things: + +1. Add `sid`-s and any other meta-information to raw Effector's factories calls, like `createStore` or `createEvent`. +2. Wrap any custom factories with `withFactory` helper that allows you to make `sid`-s of inner units unique as well. + +### Built-in unit factories (#built-in-factories) + +Let's take a look at the first case. For the following source code: + +```ts +const $name = createStore(null); +``` + +The plugin will apply these transformations: + +```ts +const $name = createStore(null, { sid: "j3l44" }); +``` + +:::tip +Plugins create `sid`-s as a hash of the location in the source code of a unit. It allows making `sid`-s unique and stable. +::: + +### Custom factories (#custom-factories) + +The second case is about custom factories. These are usually created to abstract away some common pattern. + +Examples of custom factories: + +- `createQuery`, `createMutation` from [`farfetched`](https://farfetched.pages.dev/) +- `debounce`, `throttle`, etc from [`patronum`](https://patronum.effector.dev/) +- Any custom factory in your code, e.g. factory of a [feature-flag entity](https://farfetched.pages.dev/recipes/feature_flags.html) + +For this explanation, we will create a very simple factory: + +```ts +// src/shared/lib/create-name/index.ts +export function createName() { + const updateName = createEvent(); + const $name = createStore(null); + + $name.on(updateName, (_, nextName) => nextName); + + return { $name }; +} + +// src/feature/persons/model.ts +import { createName } from "@/shared/lib/create-name"; + +const personOne = createName(); +const personTwo = createName(); +``` + +First, the plugin will add `sid` to the inner stores of the factory + +```ts +// src/shared/lib/create-name/index.ts +export function createName() { + const updateName = createEvent(); + const $name = createStore(null, { sid: "ffds2" }); + + $name.on(updateName, (_, nextName) => nextName); + + return { $name }; +} + +// src/feature/persons/model.ts +import { createName } from "@/shared/lib/create-name"; + +const personOne = createName(); +const personTwo = createName(); +``` + +But it's not enough, because we can create two instances of `createName` and internal stores of both of these instances will have the same SIDs! +These SIDs will be stable, but not unique. + +To fix it we need to inform the plugin about our custom factory: + +```json +// .babelrc +{ + "plugins": [ + [ + "effector/babel-plugin", + { + "factories": ["@/shared/lib/create-name"] + } + ] + ] +} +``` + +Since the plugin "sees" only one file at a time, we need to provide it with the actual import path used in the module. + +:::tip +If relative import paths are used in the module, then the full path from the project root must be added to the `factories` list, so the plugin could resolve it. + +If absolute or aliased (like in the example) paths are used, then specifically this aliased path must be added to the `factories` list. + +Most of the popular ecosystem projects are already included in plugin's default settings. +::: + +Now the plugin knows about our factory and it will wrap `createName` with the internal `withFactory` helper: + +```ts +// src/shared/lib/create-name/index.ts +export function createName() { + const updateName = createEvent(); + const $name = createStore(null, { sid: "ffds2" }); + + $name.on(updateName, (_, nextName) => nextName); + + return { $name }; +} + +// src/feature/persons/model.ts +import { withFactory } from "effector"; +import { createName } from "@/shared/lib/create-name"; + +const personOne = withFactory({ + sid: "gre24f", + fn: () => createName(), +}); +const personTwo = withFactory({ + sid: "lpefgd", + fn: () => createName(), +}); +``` + +Thanks to that `sid`-s of inner units of a factory are also unique, and we can safely serialize and deserialize them. + +```ts +personOne.$name.sid; // gre24f|ffds2 +personTwo.$name.sid; // lpefgd|ffds2 +``` diff --git a/src/content/docs/en/guides/migration-guide-v23.md b/src/content/docs/en/guides/migration-guide-v23.md new file mode 100644 index 0000000..7d67e1a --- /dev/null +++ b/src/content/docs/en/guides/migration-guide-v23.md @@ -0,0 +1,115 @@ +--- +title: Migration guide +redirectFrom: + - /guides/migration-guide-v23 + - /guides/migration-guide + - /en/guides/migration-guide +--- + +This guide covers the steps required to migrate to Effector 23 from a previous version. +Several features were declared deprecated in this release: + +- `forward` and `guard` operators +- `greedy` option of `sample` was renamed into `batch` +- "derived" and "callable" unit types are officially separated now +- the ability to use `undefined` as a magic "skip" value in reducers + +## Deprecation of `forward` and `guard` + +Those operators are pretty old and lived through many releases of Effector. +But all of their use-cases are already covered by `sample` now, so it is their time to go. You will see a deprecation warning in console for every call of those operators in your code. + +:::tip +You can migrate from both of them by using the official [Effector's ESLint plugin](https://eslint.effector.dev/), which has `no-forward` and `no-guard` rules with built-in [auto-fix feature](https://eslint.org/docs/latest/use/command-line-interface#fix-problems). +::: + +## `greedy` to `batch` + +The `sample` operator had `greedy` option to disable updates batching in rare edge-cases. +But the name "greedy" wasn't that obvious for the users, so it is renamed into `batch` and it's signature is reversed. + +You will see a deprecation warning in console for every usage of `greedy` option in your code. + +:::tip +You can migrate from one to the other by simply running "Find and Replace" from `greedy: true` to `batch: false` in your favorite IDE. +::: + +## Separate types for derived and callable units + +Derived units now fully separated from "callable/writable" ones: + +- Main factories `createEvent` and `createStore` now return types `EventCallable` and `StoreWritable` (because you can call and write to these units at any moment). +- Methods and operators like `unit.map(...)` or `combine(...)` now return types `Event` and `Store`, which are "read-only" i.e. you can only use them as `clock` or `source`, but not as a `target`. +- `EventCallable` type is assignable to `Event`, but not the other way around, same for stores. +- There are also runtime exceptions for types mismatch. + +Most likely you will not need to do anything, you will just get better types. + +But you might have issues with external libraries, **which are not updated to Effector 23 yet**: + +- Most of the libraries are just _accepting_ units as clocks and sources – those cases are ok. +- If some operator from the external library is accepting some unit as a `target`, you still will see an good-old `Event` type in this case, so you will not have a type error here even if there is actually an issue. +- If some _factory_ returns an event, which you are expected to call in your own code, then you will get a type error and you will need to typecast this event to `EventCallable`. + +:::tip +If you run into any of these cases, just create an issue in the repo of this library with a request to support Effector 23 version. +Owners of the project will see relevant type errors in their own source code and tests, once they update Effector in their repo. +::: + +If you have these issues in your own custom factories or libraries, then you should already see a relevant type errors in the source code of your library. +Just replace `Event` with `EventCallable`, `Store` with `StoreWritable` or `Unit` with `UnitTargetable` everywhere it is relevant (i.e. you are going to call or write into these units somehow). + +## Magic `undefined` skip is deprecated + +There is an old feature in Effector: `undefined` is used as a "magic" value to skip updates in reducers in rare cases, e.g. + +```ts +const $value = createStore(0).on(newValueReceived, (_oldValue, newValue) => newValue); +``` + +☝️ if `newValue` is `undefined`, then update will be skipped. + +The idea of making each mapper and reducer work as a sort of `filterMap` was considered useful in early Effector, but is very rarely used properly, and is confusing and distracting, so it should be deprecated and removed. + +To do so each and every store factory now supports special `skipVoid` configuration setting, which controls, how specifically store should handle `undefined` value. If set to `false` – store will use `undefined` as a value. +If set to `true` (deprecated), store will read `undefined` as a "skip update" command and will do nothing. + +You will see a warning for each return of undefined in your mappers or reducers in your code, with a requirement to provide an explicit `skipVoid` setting on your store. + +:::tip +If you do want to skip store update in certain cases, then it is better to explicitly return previous state, when possible. +::: + +It is recommended to use `{skipVoid: false}` at all times, so you are able to use an `undefined` as a normal value. + +If you do need `undefined` as a "magic skip" value – then you can use `{skipVoid: true}` to preserve current behavior. You still will get a deprecation warning though, but only one for declaration instead of one for every such update. + +The `skipVoid` setting is temporary and only needed as a way to properly deprecate this feature from Effector. In Effector 24 `skipVoid` itself will be deprecated and then removed. + +## `useStore` and `useEvent` to `useUnit` in `effector-react` + +We merged two old hooks into one, its advantage is that you can pass many units to it at once and it batches all the stores' updates into one single update. + +It's safe to just swap the calls of the old hooks with the new one: + +```ts +const Component = () => { + const foo = useStore($foo) + const bar = useStore($bar) + const onSubmit = useEvent(triggerSubmit) +} +``` +Becomes: +```ts +const Component = () => { + const foo = useUnit($foo) + const bar = useUnit($bar) + const onSubmit = useUnit(triggerSubmit) +} +``` +Or shorter: +```ts +const Component = () => { + const [foo, bar, onSubmit] = useUnit([$foo, $bar, triggerSubmit]) +} +``` diff --git a/src/content/docs/en/guides/server-side-rendering.md b/src/content/docs/en/guides/server-side-rendering.md new file mode 100644 index 0000000..57fbd52 --- /dev/null +++ b/src/content/docs/en/guides/server-side-rendering.md @@ -0,0 +1,311 @@ +--- +title: Server Side Rendering +redirectFrom: + - /guides/ssr + - /guides/server-side-rendering + - /en/guides/ssr + - /en/guides/server-side-rendering +--- + +Server-side rendering (SSR) means that the content of your site is generated on the server and then sent to the browser – which these days is achieved in very different ways and forms. + +:::info +Generally, if the rendering happens at the runtime – it is called SSR. If the rendering happens at the build-time – it is usually called Server Side Generation (SSG), which in fact is basically a subset of SSR. + +This difference it is not important for this guide, everything said applies both to SSR and SSG. +::: + +In this guide we will cover two main kinds of Server Side Rendering patterns and how effector should be used in these cases. + +## Non-Isomorphic SSR + +You don't need to do anything special to support non-isomorphic SSR/SSG workflow. + +This way initial HTML is usually generated separately, by using some sort of template engine, which is quite often run with different (not JS) programming language. +The frontend code in this case works only at the client browser and **is not used in any way** to generate the server response. + +This approach works for effector, as well as any javascript code. Any SPA application is basically an edge-case of it, as its HTML template does not contain any content, except for `<script src="my-app.js" />` link. + +:::tip +If you have non-isomorphic SSR – just use effector the way you would for an SPA app. +::: + +## Isomorphic SSR + +When you have an isomorphic SSR application, **most of the frontend code is shared with server** and **is used to generate the response** HTML. + +You can also think of it as an approach, where your app **starts at the server** – and then gets transferred over the network to the client browser, where it **continues** the work it started doing at the server. + +That's where the name comes from – despite the fact, that the code is bundled for and run in different environments, its output remains (mostly) the same, if given the same input. + +There are a lot of different frameworks, which are built upon this approach – e.g. Next.js, Remix.run, Razzle.js, Nuxt.js, Astro, etc + +:::tip{title="Next.js"} +Next.js does SSR/SSG in the special way, which requires a bit of custom handling on the effector side. + +This is done via dedicated [`@effector/next`](https://github.com/effector/next) package – use it, if you want to use effector with Next.js. +::: + +For this guide we will not focus on any specific framework or server implementation – these details will be abstracted away. + +### SIDs + +To handle isomorphic SSR with effector we need a reliable way to [`serialize`](/en/api/effector/serialize/) state, to pass it over the network. This where we need to have Stable IDentifiers for each store in our app. + +:::info +Deep-dive explanation about SIDs [can be found here](/en/explanation/sids). +::: + +To add SIDs – [just use one of effector's plugins](/en/explanation/sids#how-to-add-sids-automatic). + +### Common application code + +The main feature of isomorphic SSR – the same code is used to both server render and client app. + +For sake of example we will use a very simple React-based counter app – all of it will be contained in one module: + +```tsx +// app.tsx +import React from "react"; +import { createEvent, createStore, createEffect, sample, combine } from "effector"; +import { useUnit } from "effector-react"; + +// model +export const appStarted = createEvent(); +export const $pathname = createStore<string | null>(null); + +const $counter = createStore<number | null>(null); + +const fetchUserCounterFx = createEffect(async () => { + await sleep(100); // in real life it would be some api request + + return Math.floor(Math.random() * 100); +}); + +const buttonClicked = createEvent(); +const saveUserCounterFx = createEffect(async (count: number) => { + await sleep(100); // in real life it would be some api request +}); + +sample({ + clock: appStarted, + source: $counter, + filter: (count) => count === null, // if count is already fetched - do not fetch it again + target: fetchUserCounterFx, +}); + +sample({ + clock: fetchUserCounterFx.doneData, + target: $counter, +}); + +sample({ + clock: buttonClicked, + source: $counter, + fn: (count) => count + 1, + target: [$counter, saveUserCounterFx], +}); + +const $countUpdatePending = combine( + [fetchUserCounterFx.pending, saveUserCounterFx.pending], + (updates) => updates.some((upd) => upd === true), +); + +const $isClient = createStore(typeof document !== "undefined", { + /** + * Here we're explicitly telling effector, that this store, which depends on the environment, + * should be never included in serialization + * as it's should be always calculated based on actual current env + * + * This is not actually necessary, because only diff of state changes is included into serialization + * and this store is not going to be changed. + * + * But it is good to add this setting anyway - to highlight the intention + */ + serialize: "ignore" +}); + +const notifyFx = createEffect((message: string) => { + alert(message); +}); + +sample({ + clock: [ + saveUserCounterFx.done.map(() => "Counter update is saved successfully"), + saveUserCounterFx.fail.map(() => "Could not save the counter update :("), + ], + // It is totally ok to have some splits in the app's logic based on current environment + // + // Here we want to trigger notification alert only at the client + filter: $isClient, + target: notifyFx, +}); + +// ui +export function App() { + const clickButton = useUnit(buttonClicked); + const { count, updatePending } = useUnit({ + count: $counter, + updatePending: $countUpdatePending, + }); + + return ( + <div> + <h1>Counter App</h1> + <h2>{updatePending ? "Counter is updating" : `Current count is ${count ?? "unknown"}`}</h2> + <button onClick={() => clickButton()}>Update counter</button> + </div> + ); +} +``` + +This is our app's code which will be used to both server-side render and to handle client's needs. + +:::tip +Notice, that it is important, that all of effector units – stores, events, etc – are "bound" to the react component via `useUnit` hook. + +You can use the official eslint plugin of effector to validate that and to follow other best practices – checkout the [eslint.effector.dev](https://eslint.effector.dev/) website. +::: + +## Server entrypoint + +The way of the `<App />` to the client browsers starts at the server. For this we need to create **separate entrypoint** for the specific server-related code, which will also handle the server-side render part. + +In this example we're not going to dive deep into various possible server implementations – we will focus on the request handler itself instead. + +:::info +Alongside with basic SSR needs, like calculating the final state of the app and serializing it, effector also handles **the isolation of user's data between requests**. + +It is very important feature, as Node.js servers usually handle more than one user request at the same moment of time. + +Since JS-based platforms, including Node.js, usually have single "main" thread – all logical computations are happening in the same context, with the same memory available. +So, if state is not properly isolated, one user may receive the data, prepared for another user, which is very undesirable. + +effector handles this problem automatically inside the `fork` feature. Read [the relevant docs for details](/en/api/effector/fork). +::: + +This is the code for server request handler, which contains all server-specific stuff that need to be done. +Notice, that for meaningful parts of our app we are still using the "shared" `app.tsx` code. + +```tsx +// server.tsx +import { renderToString } from "react-dom/server"; +import { Provider } from "effector-react"; +import { fork, allSettled, serialize } from "effector"; + +import { appStarted, App, $pathname } from "./app"; + +export async function handleRequest(req) { + // 1. create separate instance of effector's state - special `Scope` object + const scope = fork({ + values: [ + // some parts of app's state can be immediately set to relevant states, + // before any computations started + [$pathname, req.pathname], + ], + }); + + // 2. start app's logic - all computations will be performed according to the model's logic, + // as well as any required effects + await allSettled(appStarted, { + scope, + }); + + // 3. Serialize the calculated state, so it can be passed over the network + const storesValues = serialize(scope); + + // 4. Render the app - also into some serializable version + const app = renderToString( + // by using Provider with the scope we tell the <App />, which state of the stores it should use + <Provider value={scope}> + <App /> + </Provider>, + ); + + // 5. prepare serialized HTML response + // + // This is serialization (or network) boundary + // The point, where all state is stringified to be sent over the network + // + // effectors state is stored as a `<script>`, which will set the state into global object + // `react`'s state is stored as a part of the DOM tree. + return ` + <html> + <head> + <script> + self._SERVER_STATE_ = ${JSON.stringify(storesValues)} + </script> + <link rel="stylesheet" href="styles.css" /> + <script defer src="app.js" /> + </head> + <body> + <div id="app"> + ${app} + </div> + </body> + </html> + `; +} +``` + +☝️ In this code we have created the HTML string, which user will receive over the network and which contains serialized state of the whole app. + +## Client entrypoint + +When the generated HTML string reaches the client browser, has been processed by the parser and all the required assets have been loaded – our application code starts working on the client. + +At this point `<App />` needs to restore its past state (which was computed on the server), so that it doesn't start from scratch, but starts from the same point the work reached on the server. + +The process of restoring the server state at the client is usually called **hydration** and this is what client entrypoint should actually do: + +```tsx +// client.tsx +import React from "react"; +import { hydrateRoot } from "react-dom/client"; +import { fork, allSettled } from "effector"; +import { Provider } from "effector-react"; + +import { App, appStarted } from "./app"; + +/** + * 1. Find, where the server state is stored and retrieve it + * + * See the server handler code to find out, where it was saved in the HTML + */ +const effectorState = globalThis._SERVER_STATE_; +const reactRoot = document.querySelector("#app"); + +/** + * 2. Initiate the client scope of effector with server-calculated values + */ +const clientScope = fork({ + values: effectorState, +}); + +/** + * 3. "Hydrate" React state in the DOM tree + */ +hydrateRoot( + reactRoot, + <Provider value={clientScope}> + <App /> + </Provider>, +); + +/** + * 4. Call the same starting event at the client + * + * This is optional and actually depends on how your app's logic is organized + */ +allSettled(appStarted, { scope: clientScope }); +``` + +☝️ At this point the App is ready to use! + +## Recap + +1. You don't need to do anything special for **non-isomorphic** SSR, all SPA-like patterns will work. +2. Isomorphic SSR requires a bit of special preparation – you will need [SIDs for stores](/en/explanation/sids). +3. Common code of the **isomorphic** SSR app handles all meaningful parts – how the UI should look, how state should be calculated, when and which effects should be run. +4. Server-specific code calculates and **serializes** all of the app's state into the HTML string. +5. Client-specific code retrieves this state and uses it to **"hydrate"** the app on the client. diff --git a/src/content/docs/en/guides/testing.md b/src/content/docs/en/guides/testing.md new file mode 100644 index 0000000..1e2ae99 --- /dev/null +++ b/src/content/docs/en/guides/testing.md @@ -0,0 +1,147 @@ +--- +title: Testing effector +redirectFrom: + - /guides/testing +--- + +Effector's tests are usually written via [Fork API](/en/api/effector/fork). + +Fork creates an independent context instance, which we can use to emulate some specific situation or environment. + +## Counter example + +For example, we have some typical counter, but with asynchronous checking through our backend. Let's assume we have next requirements: + +- When the user clicks a button, we check if the current counter is less than 100, and then check that click through our backend api. +- If the validation is successful, we increase the counter by 1. +- If the validation fails, we have to drop the counter to 0. + +```ts +import {createEvent, createStore, createEffect, sample} from 'effector' + +export const buttonClicked = createEvent() + +export const validateClickFx = createEffect(async () => (/* some api call */)) + +export const $clicksCount = createStore(0) + +sample({ + source: $clicksCount, + clock: buttonClicked, + filter: count => count < 100, + target: validateClickFx, +}) + +sample({ + source: $clicksCount, + clock: validateClickFx.done, + fn: count => count + 1, + target: $clicksCount, +}) + +sample({ + clock: validateClickFx.fail, + fn: () => 0, + target: $clicksCount, +}) +``` + +### Test setup + +Our main scenario is: + +1. User clicks the button +2. Validation ends successfully +3. Counter is up by 1 + +Let's test it: + +1. We create a new [Scope](/en/api/effector/Scope) via `fork` call. We can treat it as an independent instance of our effector's app. +2. We check, that initially count is equal to `0`. +3. Then we emulate `buttonClicked` event with `allSettled` – this promise will resolve once all computations are over. +4. We check that we have a desired state in the end. + +```ts +import { fork, allSettled } from "effector"; + +import { $clicksCount, buttonClicked, validateClickFx } from "./model"; + +test("main case", async () => { + const scope = fork(); // 1 + + expect(scope.getState($clicksCount)).toEqual(0); // 2 + + await allSettled(buttonClicked, { scope }); // 3 + + expect(scope.getState($clicksCount)).toEqual(1); // 4 +}); +``` + +### Custom effect handlers + +But this test has a problem — it uses real backend api. But since this is a unit test, we should mock this request somehow. + +We can provide custom handler via `fork` configuration. + +```ts +test("main case", async () => { + const scope = fork({ + handlers: [ + // List of [effect, mock handler] pairs + [validateClickFx, () => mockResponse], + ], + }); + + expect(scope.getState($clicksCount)).toEqual(0); + + await allSettled(buttonClicked, { scope }); + + expect(scope.getState($clicksCount)).toEqual(1); +}); +``` + +### Custom store values + +We have another scenario: + +1. Count is more than 100 already. +2. User clicks the button. +3. There should be no effect call. + +For that case, we will need to mock initial "more than 100" states somehow. + +We can provide custom initial value via `fork` configuration too. + +```ts +test("bad case", async () => { + const MOCK_VALUE = 101; + const mockFunction = testRunner.fn(); + + const scope = fork({ + values: [ + // List of [store, mockValue] pairs + [$clicksCount, MOCK_VALUE], + ], + handlers: [ + // List of [effect, mock handler] pairs + [ + validateClickFx, + () => { + mockFunction(); + + return mockResponse; + }, + ], + ], + }); + + expect(scope.getState($clicksCount)).toEqual(MOCK_VALUE); + + await allSettled(buttonClicked, { scope }); + + expect(scope.getState($clicksCount)).toEqual(MOCK_VALUE); + expect(mockFunction).toHaveBeenCalledTimes(0); +}); +``` + +That is how we can test every use case we want to cover. diff --git a/src/content/docs/en/introduction/community.md b/src/content/docs/en/introduction/community.md new file mode 100644 index 0000000..6eb2d3a --- /dev/null +++ b/src/content/docs/en/introduction/community.md @@ -0,0 +1,177 @@ +--- +title: Community +description: Articles and the team behind the project +redirectFrom: + - /docs/introduction/community + - /introduction/community +--- + +## Articles + +- [dev.to/effector](https://dev.to/effector) — space on the public platform +- [community.effector.dev](https://community.effector.dev) — personal space +- [reddit.com/r/effectorjs](https://reddit.com/r/effectorjs) — subreddit +- [twitter.com/effectorJS](https://twitter.com/effectorJS) — retweets, releases, announces + +## Videos + +- [Youtube Channel](https://www.youtube.com/channel/UCm8PRc_yjz3jXHH0JylVw1Q) + +## Where can I ask a question? + +1. First of all, you can review the [issues](https://github.com/effector/effector/issues) and [discussions](https://github.com/effector/effector/discussions) of the repository +2. We have some chat spaces: + - Telegram — [t.me/effector_en](https://t.me/effector_en) + - Discord — [discord.gg/t3KkcQdt](https://discord.gg/t3KkcQdt) + - Reddit — [reddit.com/r/effectorjs](https://www.reddit.com/r/effectorjs/) + - Gitter — [gitter.im/effector/community](https://gitter.im/effector/community) + +## Russian-speaking community + +- Ask a question — [t.me/effector_ru](https://t.me/effector_ru) +- News and announces — [t.me/effector_news](https://t.me/effector_news) +- Videos: + - Effector Meetup 1 — [youtube.com/watch?v=IacUIo9fXhI](https://www.youtube.com/watch?v=IacUIo9fXhI) + - Effector Meetup 2 — [youtube.com/watch?v=nLYc4PaTXYk](https://www.youtube.com/watch?v=nLYc4PaTXYk) + - Implement feature in the project — [youtube.com/watch?v=dtrWzH8O_4k](https://www.youtube.com/watch?v=dtrWzH8O_4k) + - How aviasales migrate on effector — [youtube.com/watch?v=HYaSnVEZiFk](https://www.youtube.com/watch?v=HYaSnVEZiFk) + - Let’s write a game — [youtube.com/watch?v=tjjxIQd0E8c](https://www.youtube.com/watch?v=tjjxIQd0E8c) + - Effector 22.2.0 Halley — [youtube.com/watch?v=pTq9AbmS0FI](https://www.youtube.com/watch?v=pTq9AbmS0FI) + - Effector 22.4.0 Encke — [youtube.com/watch?v=9UjgcNn0K_o](https://www.youtube.com/watch?v=9UjgcNn0K_o) + +## Support and sponsor + +- OpenCollective — [opencollective.com/effector](https://opencollective.com/effector) +- Patreon — [patreon.com/zero_bias](https://www.patreon.com/zero_bias) + +<br /><br /> + +## Meet the Effector Team (#meet-the-team) + +The Effector Team members work full time on the projects which use effector to solve business tasks. +Each member uses the library every day as a user and tries to improve the user experience as a core team member. + +### Dmitry Boldyrev + +<img width="256" src="https://avatars.githubusercontent.com/u/15912112?v=4" /> + +[Github](https://github.com/zerobias) • [Twitter](https://twitter.com/zero__bias) • [Commits](https://github.com/effector/effector/commits?author=zerobias) + +Dmitry made the first version of effector in 2018 to solve reactive event-driver architecture in the messenger. +Now his main focus is to improve the UX in the effector itself and speed up the kernel. + +### Sergey Sova + +<img width="256" src="https://avatars.githubusercontent.com/u/5620073?v=4" /> + +[Github](https://github.com/sergeysova) • [Twitter](https://twitter.com/_sergeysova) • [Commits](https://github.com/effector/effector/commits?author=sergeysova) + +Since 2018, Sergey has made some ecosystem packages: [patronum](https://github.com/effector/patronum), [logger](https://github.com/effector/logger), [inspector](https://github.com/effector/inspector). +His main task is to improve the UX through the ecosystem and documentation. + +### Alexandr Horoshih + +<img width="256" src="https://avatars.githubusercontent.com/u/32790736?v=4" /> + +[Github](https://github.com/AlexandrHoroshih) • [Telegram](https://t.me/AlexandrHoroshih) • [Commits](https://github.com/effector/effector/commits?author=AlexandrHoroshih) + +Alexander contributed to each package of effector core and org repository. +He reviewed contributions and improved the DX of the core functionality. + +### Kirill Mironov + +<img width="256" src="https://i.imgur.com/JFaZkm9.jpg" /> + +[Github](https://github.com/Drevoed) • [Telegram](https://t.me/vetrokm) + +Kirill made the [swc-plugin](https://github.com/effector/swc-plugin), the [bindings for SolidJS](https://github.com/effector/effector/tree/master/packages/effector-solid), +and now improves ecosystem and core functionality. + +### Igor Kamyşev + +<img width="256" src="https://avatars.githubusercontent.com/u/26767722?v=4" /> + +[Github](https://github.com/igorkamyshev) • [Telegram](https://t.me/igorkamyshev) • [Commits](https://github.com/effector/effector/commits?author=igorkamyshev) + +Igor is working on [Farfetched](https://farfetched.pages.dev) is the advanced data fetching tool. +Igor made [eslint-plugin-effector](https://eslint.effector.dev) and reviewed many of the PRs and issues of the effector and ecosystem packages. + +### Yan Lobaty + +<img width="256" src="https://i.imgur.com/DomL22D.jpg" /> + +[Github](https://github.com/YanLobat) • [Telegram](https://t.me/lobatik) • [Commits](https://github.com/effector/effector/commits?author=YanLobat) + +Yan made many contributions with fixes and improvements to all effector repositories. +Yan helps us to write explanations and reference documentation. You may hear about the workshop Yan made about effector. + +### Egor Guscha + +<img width="256" src="https://avatars.githubusercontent.com/u/22044607?v=4" /> + +[Github](https://github.com/egorguscha) • [Twitter](https://twitter.com/simpleigich) + +Since 2019, working in the effector core team on documentation, learning materials, and ecosystem improving. + +<br /><br /> + +## Acknowledgments + +### Ilya Lesik + +<img width="256" src="https://avatars.githubusercontent.com/u/1270648?v=4" /> + +[Github](https://github.com/ilyalesik) • [Twitter](https://twitter.com/ilialesik) + +Ilya made the list of awesome packages of effector ecosystem. + +### Evgeniy Fedotov + +<img width="256" src="https://avatars.githubusercontent.com/u/18236014?v=4" /> + +[Github](https://github.com/EvgenyiFedotov) • [Telegram](https://t.me/evgeniyfedotov) + +Evgeniy made [effector-reflect](https://github.com/effector/reflect) and helps us write documentation. + +### Valeriy Kobzar + +<img width="256" src="https://avatars.githubusercontent.com/u/1615093?v=4" /> + +[Github](https://github.com/kobzarvs) • [Telegram](https://t.me/ValeryKobzar) • [Commits](https://github.com/effector/effector/commits?author=kobzarvs) + +Valeriy developed server-side code for [REPL](https://share.effector.dev) and wrote many documentation pages. + +### Anton Kosykh + +<img width="256" src="https://i.imgur.com/GD0zWpH.jpg" /> + +[Github](https://github.com/Kelin2025) • [Telegram](https://t.me/kelin2025) + +One of the earliest users of effector, working on [Atomic Router](https://atomic-router.github.io/) and ecosystem packages like [effector-history](https://github.com/kelin2025/effector-history), +[effector-pagination](https://github.com/kelin2025/effector-pagination) and [effector-factorio](https://github.com/Kelin2025/effector-factorio) + +### Andrei Tshurotshkin + +[Github](https://github.com/goodmind) + +Andrei was at the origin of the effector. He wrote all the first documentation, implemented the first REPL version, and featured many core methods. + +### Roman Titov + +[Github](https://github.com/popuguytheparrot) • [Telegram](https://t.me/popuguy) + +Roman promotes effector among the front-end community and works on documentation. + +_This list is not exhaustive._ + +<br /><br /> + +## Contributors + +Please, open [README.md](https://github.com/effector/effector#contributors) to see the full list of our contributors. +We have the [github action](https://github.com/effector/effector/blob/master/.github/workflows/contributors.yml) to regenerate this list. +Also, you can open the [Insights page](https://github.com/effector/effector/graphs/contributors) on the main repository. + +We’d like to give thanks to all contributors for effector and the ecosystem. + +Thank you for your support and love over all this time :heart: diff --git a/src/content/docs/en/introduction/core-concepts.md b/src/content/docs/en/introduction/core-concepts.md new file mode 100644 index 0000000..c603f15 --- /dev/null +++ b/src/content/docs/en/introduction/core-concepts.md @@ -0,0 +1,80 @@ +--- +title: Core Concepts +redirectFrom: + - /docs/introduction/core-concepts +--- + +## Event + +[_Event_] is an intention to do something: start a computation, send a message to another application section or update states. + +```js +const event = createEvent(); +const onMessage = createEvent(); + +const socket = new WebSocket("wss://echo.websocket.org"); +socket.onmessage = (msg) => onMessage(msg); + +const data = onMessage.map((msg) => msg.data).map(JSON.parse); + +// Handle side effects +data.watch(console.log); +``` + +## Store + +[_Store_] is an object that holds state value. There can be multiple stores. + +```js +const $users = createStore([]) // <-- Default state + // add reducer for getUser.doneData event (fires when promise resolved) + .on(getUserFx.doneData, (state, user) => [...state, user]); + +const $messages = createStore([]) + // from WebSocket + .on(data, (state, message) => [...state, message]); + +$users.watch(console.log); // [{id: 1, ...}, {id: 2, ...}] +$messages.watch(console.log); +``` + +## Effect + +[_Effect_] is a container for side effects, possibly async with linked events and stores to subscribe. + +```js +const getUserFx = createEffect(async (params) => { + const req = await fetch(`https://example.com/get-user/${params.id}`); + + return req.json(); +}); + +// subscribe to effect call +getUserFx.watch((params) => { + console.log(params); // {id: 1} +}); + +// subscribe to promise resolve +getUserFx.done.watch(({ result, params }) => { + console.log(params); // {id: 1} + console.log(result); // resolved value +}); + +// subscribe to promise reject (or throw) +getUserFx.fail.watch(({ error, params }) => { + console.error(params); // {id: 1} + console.error(error); // rejected value +}); + +// you can replace function anytime +getUserFx.use(() => "test result"); + +// call effect with your params +getUserFx({ id: 1 }); + +const data = await getUserFx({ id: 2 }); // handle promise +``` + +[_store_]: /en/api/effector/Store +[_effect_]: /en/api/effector/Effect +[_event_]: /en/api/effector/Event diff --git a/src/content/docs/en/introduction/ecosystem.md b/src/content/docs/en/introduction/ecosystem.md new file mode 100644 index 0000000..b043ef8 --- /dev/null +++ b/src/content/docs/en/introduction/ecosystem.md @@ -0,0 +1,61 @@ +--- +title: Ecosystem +description: Packages and templates of effector ecosystem +redirectFrom: + - /docs/ecosystem + - /introduction/ecosystem +--- + +Packages and templates of effector ecosystem + +More content in [awesome-effector repository](https://github.com/effector/awesome) + +:::info{title="Legend"} +Stage 4. 💚 — Stable, supported, awesome<br/> +Stage 3. 🛠️ — Stable, but still in development, v0.x<br/> +Stage 2. ☢️️ — Unstable/Incomplete, works in most cases, may be redesigned<br/> +Stage 1. 🧨 — Breaks in most cases, it must be redesigned, do not use in production<br/> +Stage 0. ⛔️ — Abandoned/Needs maintainer, may be broken; it must be migrated from<br/> +::: + +## Packages + +- [patronum](https://github.com/effector/patronum) 💚 — Effector utility library delivering modularity and convenience. +- [@effector/reflect](https://github.com/effector/reflect) 💚 — Classic HOCs redesigned to connect React components to Effector units in an efficient, composable and (sort of) "fine-grained reactive" way. +- [@withease/redux](https://withease.pages.dev/redux/) 💚 — Smooth migration from redux to effector. +- [@withease/i18next](https://withease.pages.dev/i18next) 💚 — A powerful internationalization framework bindings. +- [@withease/web-api](https://withease.pages.dev/web-api/) 💚 — Web API bindings — network status, tab visibility, and more. +- [@withease/factories](https://withease.pages.dev/factories/) 💚 — Set of helpers to create factories in your application. +- [effector-storage](https://github.com/yumauri/effector-storage) 💚 - Small module to sync stores with all kinds of storages (local/session storage, IndexedDB, cookies, server side storage, etc). +- [farfetched](https://farfetched.pages.dev) 🛠 — The advanced data fetching tool for web applications. +- [@effector/next](https://github.com/effector/next) 🛠 - Official bindings for Next.js +- [effector-localstorage](https://github.com/lessmess-dev/effector-localstorage) 🛠 — Module for effector that sync stores with localStorage. +- [effector-hotkey](https://github.com/kelin2025/effector-hotkey) 🛠 — Hotkeys made easy. +- [atomic-router](https://github.com/atomic-router/atomic-router) ☢️ — View-library agnostic router. +- [effector-undo](https://github.com/tanyaisinmybed/effector-undo) ☢️ — Simple undo/redo functionality. +- [forest](https://github.com/effector/effector/tree/master/packages/forest) ☢️ — Reactive UI engine for web. +- [effector-utils](https://github.com/Kelin2025/effector-utils) ⛔ — Effector utilities library. + +## DX + +- [eslint-plugin-effector](https://eslint.effector.dev) 🛠 — Enforcing best practices. +- [SWC plugin](https://github.com/effector/swc-plugin) ☢️ — SWC plugin to efficiently work with effector. +- [effector-logger](https://github.com/effector/logger) 🛠 — Simple logger for stores, events, effects and domains. +- [@effector/redux-devtools-adapter](https://github.com/effector/redux-devtools-adapter) 🛠 - Simple adapter, which logs updates to Redux DevTools. +- [effector-swc-plugin](https://github.com/kireevmp/effector-swc-plugin) 🛠 — Third-party SWC plugin. + +## Form management + +- [effector-final-form](https://github.com/binjospookie/effector-final-form) 🛠️ – Effector bindings for Final Form. +- [filledout](https://filledout.github.io) ☢️ — Form manager with easy-to-use yup validation +- [effector-forms](https://github.com/aanation/effector-forms) ☢️ — Form manager for effector. +- [effector-react-form](https://github.com/GTOsss/effector-react-form) ☢️ — Connect your forms with state manager. +- [efform](https://github.com/tehSLy/efform) ⛔ — Form manager, based on effector state manager, designed to deliver high-quality DX. +- [effector-reform](https://github.com/movpushmov/effector-reform) ☢️️ — form manager, which implements composable forms concept + +## Templates + +- [ViteJS+React Template](https://github.com/effector/vite-react-template) 💚 — Try effector with React and TypeScript in seconds! +- [ViteJS+TypeScript Template](https://github.com/mmnkuh/effector-vite-template) 🛠 — Another ViteJS + TypeScript template. +- [effector SSR](https://github.com/effector/razzle-template) ⛔️ — SSR on React, TypeScript, Razzle and Styled. +- [CRA template](https://github.com/effector/cra-template) ⛔️ — Simple CreateReactApp template. diff --git a/src/content/docs/en/introduction/examples.md b/src/content/docs/en/introduction/examples.md new file mode 100644 index 0000000..afefaf1 --- /dev/null +++ b/src/content/docs/en/introduction/examples.md @@ -0,0 +1,62 @@ +--- +title: Examples +redirectFrom: + - /docs/introduction/examples + - /introduction/examples +--- + +It's difficult to overestimate the learning curve for any technology. +That's why effector provides you a few simple examples that may cover your basic needs and also give more confidence for the users for upcoming projects using effector. + +## Simple examples + +### [UI loading](https://share.effector.dev/fEsYTDxe) + +To display loader during effects resolving + +### [Effects sequence](https://share.effector.dev/RYQ5z59Q) + +We'll need it when second request to the server requires resolved data from the first one + +### [Abort effect](https://share.effector.dev/W4I0ghLt) + +When we need to cancel our effect since it's pointless at the time + +### [Modal dialog](https://share.effector.dev/DzljrdjR) + +To connect react modal with state + +### [Range input](https://share.effector.dev/oRB2iB8M) + +To connect a custom range input component with state + +## More examples + +- [Snake game (interactive A\* algorithm visualisation)](https://dmitryshelomanov.github.io/snake/) ([source code](https://github.com/dmitryshelomanov/snake)) +- [Ballcraft game](https://ballcraft.now.sh/) ([source code](https://github.com/kobzarvs/effector-craftball)) +- [Client-server interaction with effects](https://github.com/effector/effector/tree/master/examples/worker-rpc) GitHub +- [Reddit reader](https://share.effector.dev/T5CyxSFl) With effects for data fetching and effector-react hooks +- [Lists rendering](https://share.effector.dev/OlakwECa) With `useList` hook +- [Dynamic typing status](https://share.effector.dev/tAnzG5oJ) +- [Forward data between effects](https://share.effector.dev/RYQ5z59Q) +- [Range input component](https://share.effector.dev/oRB2iB8M) +- [Modal dialog](https://share.effector.dev/DzljrdjR) +- [Conditional filtering](https://share.effector.dev/1EsAGMyq) +- [Request cancellation](https://share.effector.dev/W4I0ghLt) +- [Dynamic form fields, saving and loading from localStorage with effects](https://share.effector.dev/Qxt0zAdd) +- [Loading initial state from localStorage with domains](https://share.effector.dev/YbiBnyAD) +- [Dynamic page selection with useStoreMap](https://share.effector.dev/AvWnrFXy) +- [Update on scroll with guard](https://share.effector.dev/avjCFH22) +- [Night theme switcher component](https://share.effector.dev/4MU8H3YW) +- [Computed bounce menu animation](https://share.effector.dev/ZXEtGBBq) +- [Values history](https://share.effector.dev/NsPi84mV) +- [Read default state from backend](https://share.effector.dev/hA3WTBIT) +- [Requests cache](https://share.effector.dev/jvE7r0By) +- [Watch last two store state values](https://share.effector.dev/LRVsYhIc) +- [Stores from react context](https://codesandbox.io/s/pensive-euler-i4qs5) Codesandbox +- [Basic todolist example](https://codesandbox.io/s/vmx6wxww43) Codesandbox +- [Recent users projects](https://github.com/effector/effector/network/dependents) +- [BallSort game](https://ballsort.sova.dev/) with [source code](https://github.com/sergeysova/ballsort) +- [Sudoku game](https://sudoku-effector.pages.dev/) with [source code](https://github.com/Shiyan7/sudoku-effector) + +<!-- - [RealWorld app](https://github.com/mg901/react-effector-realworld-example-app) ([RealWorld apps](https://github.com/gothinkster/realworld)) --> diff --git a/src/content/docs/en/introduction/installation.md b/src/content/docs/en/introduction/installation.md new file mode 100644 index 0000000..bb32d21 --- /dev/null +++ b/src/content/docs/en/introduction/installation.md @@ -0,0 +1,123 @@ +--- +title: Installation +description: How to install and setup effector +redirectFrom: + - /docs/introduction/installation + - /introduction/installation +--- + +## Via package manager + +Effector doesn't depend on NPM, you can use any package manager you want.<br/> +For example: [yarn](https://yarnpkg.com/), [pnpm](https://pnpm.io/). + +```bash +npm install effector +``` + +### React + +```bash +npm install effector effector-react +``` + +Also, you can start from [Stackblitz template](https://stackblitz.com/fork/github/effector/vite-react-template) with [TypeScript](https://typescriptlang.org/), [ViteJS](https://vitejs.dev/), and [React](https://reactjs.org/) already set up. + +### Vue + +```bash +npm install effector effector-vue +``` + +### Solid + +```bash +npm install effector effector-solid +``` + +### Svelte + +Svelte works with effector out of the box, no additional packages needed. + +## Online playground + +Examples in this documentation are running in [our online playground](https://share.effector.dev), which allows someone to test and share ideas quickly, without install. Code sharing, TypeScript and React supported out of the box. [Project repository](https://github.com/effector/repl). + +## Deno + +:::info{title="since"} +[effector 21.0.0](https://changelog.effector.dev/#effector-21-0-0) +::: + +Just import `effector.mjs` from any CDN. + +```typescript +import { createStore } from "https://cdn.jsdelivr.net/npm/effector/effector.mjs"; +``` + +Sample CDNS: + +- https://www.jsdelivr.com/package/npm/effector +- https://cdn.jsdelivr.net/npm/effector/effector.cjs.js +- https://cdn.jsdelivr.net/npm/effector/effector.mjs +- https://cdn.jsdelivr.net/npm/effector-react/effector-react.cjs.js +- https://cdn.jsdelivr.net/npm/effector-vue/effector-vue.cjs.js + +## DevTools + +Use [effector-logger](https://github.com/effector/logger) for printing updates to console, displaying current store values with browser ui and connecting application to familiar redux devtools. + +For server-side rendering and writing test you may need plugins for your compiler toolkit: + +### Babel + +To use Babel plugin, you don't need to install additional packages, plugin bundled to `effector` package. + +[Read this for more details](/en/api/effector/babel-plugin). + +### SWC + +```bash +npm install --development @effector/swc-plugin @swc/core +``` + +[Documentation](https://github.com/effector/swc-plugin). + +## Compatibility + +The library provides separate modules with compatibility up to IE11 and Chrome 47 (browser for Smart TV devices): `effector/compat`, `effector-react/compat`, and `effector-vue/compat` + +Usage with manual import replacement: + +```diff +- import {createStore} from 'effector' ++ import {createStore} from 'effector/compat' +``` + +Usage with [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver) in your `.babelrc`: + +```json +{ + "plugins": [ + [ + "babel-plugin-module-resolver", + { + "alias": { + "^effector$": "effector/compat", + "^effector-react$": "effector-react/compat" + } + } + ] + ] +} +``` + +### Polyfills + +Effector uses some APIs and objects that older browsers may not have, so you may need to install them yourself if you intend to support such browsers. + +You may need to install the following polyfills: + +- `Promise` +- `Object.assign` +- `Array.prototype.flat` diff --git a/src/content/docs/en/introduction/motivation.md b/src/content/docs/en/introduction/motivation.md new file mode 100644 index 0000000..04f41ad --- /dev/null +++ b/src/content/docs/en/introduction/motivation.md @@ -0,0 +1,31 @@ +--- +title: Motivation +redirectFrom: + - /docs/introduction/motivation + - /introduction/motivation +--- + +Most applications have the logic for which they're created. +This logic itself can be very complex and based on reactive principles, we call it **business logic**. + +In order for the user to benefit from the logic described above, it is necessary to create a user interface +and implement the logic for it; we call it **UI-logic**. + +The easiest way to figure out what is what — is to remember what tasks your project manager comes to you with, +or what the product tasks look like. +There's no description of how buttons, dropdowns, and form fields should work internally or which api should be used. +There is only a description of how the user interacts with the application. +The users don't care what technologies and frameworks are used under the hood – it is up to the developers to decide, which tools to use to achieve required quality. + +In most cases, the product requirements team doesn't think in terms of UI components; it thinks through user behavior scenarios. +More importantly for developers, the way frameworks like React, Angular, or Vue work often doesn't allow +the business logic to be described the way the product team described it. These frameworks are designed very differently +and have different operating principles, whereas business logic is always based on the same principles: + +1. users can interact with the application through the interface +2. they can see changes on the page +3. they can notice how the application interacts with the outside world + +Effector offers the possibility to describe the business logic in the same language as the product development team communicates, +using basic primitives: Event, Store, Effect respectively. At the same time, the UI logic remains the responsibility of the framework. +Let each framework solve its task as efficiently as possible. diff --git a/src/content/docs/en/recipes/common/countdown.md b/src/content/docs/en/recipes/common/countdown.md new file mode 100644 index 0000000..c6809e3 --- /dev/null +++ b/src/content/docs/en/recipes/common/countdown.md @@ -0,0 +1,81 @@ +--- +title: Countdown timer on setTimeout +redirectFrom: + - /docs/recipes/countdown + - /recipes/common/countdown +--- + +Sometimes we need a simple countdown. The next example allows us to handle each tick and abort the timer. + +[Link to a playground](https://share.effector.dev/bIFZNWxZ) + +Task: + +1. Execute tick every `timeout` milliseconds +2. Each tick should send left seconds to listeners +3. Countdown can be stopped (`abort` argument) +4. Countdown can't be started if already started + +```js +function createCountdown(name, { start, abort = createEvent(`${name}Reset`), timeout = 1000 }) { + // tick every 1 second + const $working = createStore(true, { name: `${name}Working` }); + const tick = createEvent(`${name}Tick`); + const timerFx = createEffect(`${name}Timer`).use(() => wait(timeout)); + + $working.on(abort, () => false).on(start, () => true); + + sample({ + source: start, + filter: timerFx.pending.map((is) => !is), + target: tick, + }); + + sample({ + clock: tick, + target: timerFx, + }); + + const willTick = sample({ + source: timerFx.done.map(({ params }) => params - 1), + filter: (seconds) => seconds >= 0, + }); + + sample({ + source: willTick, + filter: $working, + target: tick, + }); + + return { tick }; +} + +function wait(ms) { + return new Promise((resolve) => { + setTimeout(resolve, ms); + }); +} +``` + +Usage: + +```js +const startCountdown = createEvent(); +const abortCountdown = createEvent(); + +const countdown = createCountdown("simple", { + start: startCountdown, + abort: abortCountdown, +}); + +// handle each tick +countdown.tick.watch((remainSeconds) => { + console.info("Tick. Remain seconds: ", remainSeconds); +}); + +// let's start +startCountdown(15); // 15 ticks to count down, 1 tick per second + +// abort after 5 second +setTimeout(abortCountdown, 5000); +``` diff --git a/src/content/docs/en/recipes/index.md b/src/content/docs/en/recipes/index.md new file mode 100644 index 0000000..a96b8de --- /dev/null +++ b/src/content/docs/en/recipes/index.md @@ -0,0 +1,9 @@ +--- +title: Recipes +redirectFrom: + - /recipes +--- + +You can find some examples of usage in the navigation. + +Feel free to [open PullRequests](https://github.com/effector/effector). diff --git a/src/content/docs/en/recipes/nextjs/integrate.md b/src/content/docs/en/recipes/nextjs/integrate.md new file mode 100644 index 0000000..af5caf8 --- /dev/null +++ b/src/content/docs/en/recipes/nextjs/integrate.md @@ -0,0 +1,7 @@ +--- +title: Integrate Next.js with effector +redirectFrom: + - /recipes/nextjs/integrate +--- + +There is the official Next.js bindings package - [`@effector/next`](https://github.com/effector/next). Follow its documentation to find out, how to integrate Next.js with effector. diff --git a/src/content/docs/en/recipes/nextjs/router.md b/src/content/docs/en/recipes/nextjs/router.md new file mode 100644 index 0000000..9a69e5d --- /dev/null +++ b/src/content/docs/en/recipes/nextjs/router.md @@ -0,0 +1,74 @@ +--- +title: Integrate with Next.js router +redirectFrom: + - /recipes/nextjs/router +--- + +:::tip +There is the official Next.js bindings package - [`@effector/next`](https://github.com/effector/next). Follow its documentation to find out, how to integrate Next.js with effector. +::: + + +This is a simplified example of integration with the Next.js router. +We create a similar model for storing the router instance: + +```js +import { attach, createEvent, createStore, sample } from 'effector'; +import { NextRouter } from 'next/router'; + +const attachRouterEv = createEvent<NextRouter | null>(); +const $router = createStore<NextRouter | null>(null); + +$router.on(attachRouterEv, (_, router) => router); + +const goToRouteEv = createEvent<string>(); + +const goToRouteFx = attach({ + source: $router, + effect: (router, param) => { + return router && router.asPath !== param && router.push(param); + }, +}); + +sample({ + clock: goToRouteEv, + target: goToRouteFx, +}); + +export { $router, attachRouterEv, goToRouteFx }; + +``` + +We take the router instance from \__app.tsx_: + +```js +import { useUnit } from 'effector-react'; +import { useRouter } from 'next/router'; + + ... + + const router = useRouter(); + const attachRouter = useEvent(attachRouterEv); + + useEffect(() => { + attachRouter(router); + }, [router, attachRouter]); + + ... + +``` + +And we use it in our models: + +```js +import { sample } from 'effector'; + + ... + +sample({ + clock: redirectEv, + fn: () => '/home', + target: goToRouteFx, +}); + +``` diff --git a/src/content/docs/en/recipes/nextjs/scope-bind.md b/src/content/docs/en/recipes/nextjs/scope-bind.md new file mode 100644 index 0000000..d67e12f --- /dev/null +++ b/src/content/docs/en/recipes/nextjs/scope-bind.md @@ -0,0 +1,50 @@ +--- +title: Use scopeBind in Next.js +redirectFrom: + - /recipes/nextjs/scope-bind +--- + +:::tip +There is the official Next.js bindings package - [`@effector/next`](https://github.com/effector/next). Follow its documentation to find out, how to integrate Next.js with effector. +::: + +There are situations when we need to get values from external libraries through callbacks. +If we directly bind [events](/en/api/effector/createEvent), then we will face the loss of the scope. +To solve this problem, we can use [scopeBind](/en/api/effector/scopeBind). + +We have some external library that returns us the status of our connection. +Let's call it an instance in the store and call it _$service_, and we will take the status through an event. + +```js +import { createEvent, createStore } from "effector"; + +const $connectStatus = createStore("close"); +const connectEv = createEvent(); + +sample({ + clock: connectEv, + targt: $connectStatus, +}); +``` + +Next, we need to create an effect, within which we will connect our [event](/en/api/effector/createEvent) and _service_. + +```js +import { attach, scopeBind } from "effector"; + +const connectFx = attach({ + source: { + service: $service, + }, + async effect({ service }) { + /** + * `scopeBind` will automatically derive current scope, if called inside of an Effect + */ + const serviceStarted = scopeBind(connectEv); + + return await service.on("service_start", serviceStarted); + }, +}); +``` + +After calling our [effect](/en/api/effector/createEffect), the [event](/en/api/effector/createEvent) will be tied to the [scope](/en/api/effector/Scope) and will be able to take the current value from our _service_. diff --git a/src/content/docs/en/recipes/react-native/asyncstorage-counter.md b/src/content/docs/en/recipes/react-native/asyncstorage-counter.md new file mode 100644 index 0000000..e7be7cd --- /dev/null +++ b/src/content/docs/en/recipes/react-native/asyncstorage-counter.md @@ -0,0 +1,111 @@ +--- +title: AsyncStorage Counter on React Native +redirectFrom: + - /docs/recipes/react-native/asyncstorage-counter + - /recipes/react-native/asyncstorage-counter +--- + +The following example is a React Native counter that stores data to AsyncStorage. It uses store, events and effects. + +```js +import * as React from "react"; +import { Text, View, StyleSheet, TouchableOpacity } from "react-native"; +import AsyncStorage from "@react-native-community/async-storage"; + +import { createStore, createEvent, createEffect, sample } from "effector"; +import { useUnit } from "effector-react"; + +const init = createEvent(); +const increment = createEvent(); +const decrement = createEvent(); +const reset = createEvent(); + +const fetchCountFromAsyncStorageFx = createEffect(async () => { + const value = parseInt(await AsyncStorage.getItem("count")); + return !isNaN(value) ? value : 0; +}); + +const updateCountInAsyncStorageFx = createEffect(async (count) => { + try { + await AsyncStorage.setItem("count", `${count}`, (err) => { + if (err) console.error(err); + }); + } catch (err) { + console.error(err); + } +}); + +const $counter = createStore(0); + +sample({ + clock: fetchCountFromAsyncStorageFx.doneData, + target: init, +}); + +$counter + .on(init, (state, value) => value) + .on(increment, (state) => state + 1) + .on(decrement, (state) => state - 1) + .reset(reset); + +sample({ + clock: $counter, + target: updateCountInAsyncStorageFx, +}); + +fetchCountFromAsyncStorageFx(); + +export default () => { + const count = useUnit(counter); + + return ( + <View style={styles.container}> + <Text style={styles.paragraph}>{count}</Text> + <View style={styles.buttons}> + <TouchableOpacity key="dec" onPress={decrement} style={styles.button}> + <Text style={styles.label}>-</Text> + </TouchableOpacity> + <TouchableOpacity key="reset" onPress={reset} style={styles.button}> + <Text style={styles.label}>0</Text> + </TouchableOpacity> + <TouchableOpacity key="inc" onPress={increment} style={styles.button}> + <Text style={styles.label}>+</Text> + </TouchableOpacity> + </View> + </View> + ); +}; + +const styles = StyleSheet.create({ + container: { + flex: 1, + justifyContent: "center", + paddingTop: 20, + backgroundColor: "#ecf0f1", + padding: 8, + }, + paragraph: { + margin: 24, + fontSize: 60, + fontWeight: "bold", + textAlign: "center", + }, + buttons: { + flexDirection: "row", + alignSelf: "center", + justifyContent: "space-between", + }, + button: { + marginHorizontal: 10, + paddingVertical: 10, + paddingHorizontal: 20, + backgroundColor: "#4287f5", + borderRadius: 5, + }, + label: { + fontSize: 30, + color: "#ffffff", + fontWeight: "bold", + }, +}); +``` diff --git a/src/content/docs/en/recipes/react/counter.md b/src/content/docs/en/recipes/react/counter.md new file mode 100644 index 0000000..89f654b --- /dev/null +++ b/src/content/docs/en/recipes/react/counter.md @@ -0,0 +1,43 @@ +--- +title: React Counter +redirectFrom: + - /docs/recipes/react/counter + - /recipes/react/counter +--- + +```js +import React from "react"; +import ReactDOM from "react-dom"; +import { createEvent, createStore, combine } from "effector"; +import { useUnit } from "effector-react"; + +const plus = createEvent(); + +const $counter = createStore(1); + +const $counterText = $counter.map((count) => `current value = ${count}`); +const $counterCombined = combine({ counter: $counter, text: $counterText }); + +$counter.on(plus, (count) => count + 1); + +function App() { + const counter = useUnit($counter); + const counterText = useUnit($counterText); + const counterCombined = useUnit($counterCombined); + + return ( + <div> + <button onClick={plus}>Plus</button> + <div>counter: {counter}</div> + <div>counterText: ${counterText}</div> + <div> + counterCombined: {counterCombined.counter}, {counterCombined.text} + </div> + </div> + ); +} + +ReactDOM.render(<App />, document.getElementById("root")); +``` + +[Try it](https://share.effector.dev/2n8Bh4CZ) diff --git a/src/content/docs/en/recipes/react/dynamic-form-schema.md b/src/content/docs/en/recipes/react/dynamic-form-schema.md new file mode 100644 index 0000000..83a7646 --- /dev/null +++ b/src/content/docs/en/recipes/react/dynamic-form-schema.md @@ -0,0 +1,413 @@ +--- +title: Dynamic form schema +redirectFrom: + - /docs/recipes/react/dynamic-form-schema + - /recipes/react/dynamic-form-schema +--- + +[Try it](https://share.effector.dev/fow5fA0A) + +```js +import { createEvent, createEffect, createStore, createApi, sample } from "effector"; +import { useList, useUnit } from "effector-react"; + +const submitForm = createEvent(); +const addMessage = createEvent(); +const changeFieldType = createEvent(); + +const showTooltipFx = createEffect(() => new Promise((rs) => setTimeout(rs, 1500))); + +const saveFormFx = createEffect((data) => { + localStorage.setItem("form_state/2", JSON.stringify(data, null, 2)); +}); +const loadFormFx = createEffect(() => { + return JSON.parse(localStorage.getItem("form_state/2")); +}); + +const $fieldType = createStore("text"); +const $message = createStore("done"); +const $mainForm = createStore({}); +const $types = createStore({ + username: "text", + email: "text", + password: "text", +}); + +const $fields = $types.map((state) => Object.keys(state)); + +$message.on(addMessage, (_, message) => message); + +$mainForm.on(loadFormFx.doneData, (form, result) => { + let changed = false; + + form = { ...form }; + for (const key in result) { + const { value } = result[key]; + if (value == null) continue; + if (form[key] === value) continue; + changed = true; + form[key] = value; + } + if (!changed) return; + + return form; +}); + +const mainFormApi = createApi($mainForm, { + upsertField(form, name) { + if (name in form) return; + + return { ...form, [name]: "" }; + }, + changeField(form, [name, value]) { + if (form[name] === value) return; + + return { ...form, [name]: value }; + }, + addField(form, [name, value = ""]) { + if (form[name] === value) return; + + return { ...form, [name]: value }; + }, + deleteField(form, name) { + if (!(name in form)) return; + form = { ...form }; + delete form[name]; + + return form; + }, +}); + +$types.on(mainFormApi.addField, (state, [name, value, type]) => { + if (state[name] === type) return; + + return { ...state, [name]: value }; +}); +$types.on(mainFormApi.deleteField, (state, name) => { + if (!(name in state)) return; + state = { ...state }; + delete state[name]; + + return state; +}); +$types.on(loadFormFx.doneData, (state, result) => { + let changed = false; + + state = { ...state }; + for (const key in result) { + const { type } = result[key]; + + if (type == null) continue; + if (state[key] === type) continue; + changed = true; + state[key] = type; + } + if (!changed) return; + + return state; +}); + +const changeFieldInput = mainFormApi.changeField.prepend((e) => [ + e.currentTarget.name, + e.currentTarget.type === "checkbox" ? e.currentTarget.checked : e.currentTarget.value, +]); + +const submitField = mainFormApi.addField.prepend((e) => [ + e.currentTarget.fieldname.value, + e.currentTarget.fieldtype.value === "checkbox" + ? e.currentTarget.fieldvalue.checked + : e.currentTarget.fieldvalue.value, + e.currentTarget.fieldtype.value, +]); + +const submitRemoveField = mainFormApi.deleteField.prepend((e) => e.currentTarget.field.value); + +$fieldType.on(changeFieldType, (_, e) => e.currentTarget.value); +$fieldType.reset(submitField); + +submitForm.watch((e) => { + e.preventDefault(); +}); +submitField.watch((e) => { + e.preventDefault(); + e.currentTarget.reset(); +}); +submitRemoveField.watch((e) => { + e.preventDefault(); +}); + +sample({ + clock: [submitForm, submitField, submitRemoveField], + source: { values: $mainForm, types: $types }, + target: saveFormFx, + fn({ values, types }) { + const form = {}; + + for (const [key, value] of Object.entries(values)) { + form[key] = { + value, + type: types[key], + }; + } + + return form; + }, +}); + +sample({ + clock: addMessage, + target: showTooltipFx, +}); +sample({ + clock: submitField, + fn: () => "added", + target: addMessage, +}); +sample({ + clock: submitRemoveField, + fn: () => "removed", + target: addMessage, +}); +sample({ + clock: submitForm, + fn: () => "saved", + target: addMessage, +}); + +loadFormFx.finally.watch(() => { + ReactDOM.render(<App />, document.getElementById("root")); +}); + +function useFormField(name) { + const type = useStoreMap({ + store: $types, + keys: [name], + fn(state, [field]) { + if (field in state) return state[field]; + + return "text"; + }, + }); + const value = useStoreMap({ + store: $mainForm, + keys: [name], + fn(state, [field]) { + if (field in state) return state[field]; + + return ""; + }, + }); + mainFormApi.upsertField(name); + + return [value, type]; +} + +function Form() { + const pending = useUnit(saveFormFx.pending); + + return ( + <form onSubmit={submitForm} data-form autocomplete="off"> + <header> + <h4>Form</h4> + </header> + {useList($fields, (name) => ( + <InputField name={name} /> + ))} + + <input type="submit" value="save form" disabled={pending} /> + </form> + ); +} + +function InputField({ name }) { + const [value, type] = useFormField(name); + let input = null; + + switch (type) { + case "checkbox": + input = ( + <input + id={name} + name={name} + value={name} + checked={value} + onChange={changeFieldInput} + type="checkbox" + /> + ); + break; + case "text": + default: + input = <input id={name} name={name} value={value} onChange={changeFieldInput} type="text" />; + } + + return ( + <> + <label htmlFor={name} style={{ display: "block" }}> + <strong>{name}</strong> + </label> + {input} + </> + ); +} + +function FieldForm() { + const currentFieldType = useUnit($fieldType); + const fieldValue = + currentFieldType === "checkbox" ? ( + <input id="fieldvalue" name="fieldvalue" type="checkbox" /> + ) : ( + <input id="fieldvalue" name="fieldvalue" type="text" defaultValue="" /> + ); + + return ( + <form onSubmit={submitField} autocomplete="off" data-form> + <header> + <h4>Insert new field</h4> + </header> + <label htmlFor="fieldname"> + <strong>name</strong> + </label> + <input id="fieldname" name="fieldname" type="text" required defaultValue="" /> + <label htmlFor="fieldvalue"> + <strong>value</strong> + </label> + {fieldValue} + <label htmlFor="fieldtype"> + <strong>type</strong> + </label> + <select id="fieldtype" name="fieldtype" onChange={changeFieldType}> + <option value="text">text</option> + <option value="checkbox">checkbox</option> + </select> + <input type="submit" value="insert" /> + </form> + ); +} + +function RemoveFieldForm() { + return ( + <form onSubmit={submitRemoveField} data-form> + <header> + <h4>Remove field</h4> + </header> + <label htmlFor="field"> + <strong>name</strong> + </label> + <select id="field" name="field" required> + {useList($fields, (name) => ( + <option value={name}>{name}</option> + ))} + </select> + <input type="submit" value="remove" /> + </form> + ); +} + +const Tooltip = () => { + const [visible, text] = useUnit([showTooltipFx.pending, $message]); + + return <span data-tooltip={text} data-visible={visible} />; +}; + +const App = () => ( + <> + <Tooltip /> + <div id="app"> + <Form /> + <FieldForm /> + <RemoveFieldForm /> + </div> + </> +); + +await loadFormFx(); + +css` + [data-tooltip]:before { + display: block; + background: white; + width: min-content; + content: attr(data-tooltip); + position: sticky; + top: 0; + left: 50%; + color: darkgreen; + font-family: sans-serif; + font-weight: 800; + font-size: 20px; + padding: 5px 5px; + transition: transform 100ms ease-out; + } + + [data-tooltip][data-visible="true"]:before { + transform: translate(0px, 0.5em); + } + + [data-tooltip][data-visible="false"]:before { + transform: translate(0px, -2em); + } + + [data-form] { + display: contents; + } + + [data-form] > header { + grid-column: 1 / span 2; + } + + [data-form] > header > h4 { + margin-block-end: 0; + } + + [data-form] label { + grid-column: 1; + justify-self: end; + } + + [data-form] input:not([type="submit"]), + [data-form] select { + grid-column: 2; + } + + [data-form] input[type="submit"] { + grid-column: 2; + justify-self: end; + width: fit-content; + } + + #app { + width: min-content; + display: grid; + grid-column-gap: 5px; + grid-row-gap: 8px; + grid-template-columns: repeat(2, 3fr); + } +`; + +function css(tags, ...attrs) { + const value = style(tags, ...attrs); + const node = document.createElement("style"); + node.id = "insertedStyle"; + node.appendChild(document.createTextNode(value)); + const sheet = document.getElementById("insertedStyle"); + + if (sheet) { + sheet.disabled = true; + sheet.parentNode.removeChild(sheet); + } + document.head.appendChild(node); + + function style(tags, ...attrs) { + if (tags.length === 0) return ""; + let result = " " + tags[0]; + + for (let i = 0; i < attrs.length; i++) { + result += attrs[i]; + result += tags[i + 1]; + } + + return result; + } +} +``` diff --git a/src/content/docs/en/recipes/react/effects.md b/src/content/docs/en/recipes/react/effects.md new file mode 100644 index 0000000..86f63c3 --- /dev/null +++ b/src/content/docs/en/recipes/react/effects.md @@ -0,0 +1,49 @@ +--- +title: Effects with React +redirectFrom: + - /docs/recipes/react/example-effects + - /recipes/react/effects +--- + +```js +import React from "react"; +import ReactDOM from "react-dom"; +import { createEffect, createStore } from "effector"; +import { useUnit } from "effector-react"; + +const url = + "https://gist.githubusercontent.com/" + + "zerobias/24bc72aa8394157549e0b566ac5059a4/raw/" + + "b55eb74b06afd709e2d1d19f9703272b4d753386/data.json"; + +const loadUserClicked = createEvent(); + +const fetchUserFx = createEffect((url) => fetch(url).then((req) => req.json())); + +const $user = createStore(null); + +sample({ + clock: loadUserClicked, + fn: () => url, + target: fetchUserFx, +}); + +$user.on(fetchUserFx.doneData, (_, user) => user.username); + +const App = () => { + const [user, pending] = useUnit([$user, fetchUserFx.pending]); + const handleUserLoad = useUnit(loadUserClicked); + return ( + <div> + {user ? <div>current user: {user}</div> : <div>no current user</div>} + <button disable={pending} onClick={handleUserLoad}> + load user + </button> + </div> + ); +}; + +ReactDOM.render(<App />, document.getElementById("root")); +``` + +[Try it](https://share.effector.dev/7no9rJTU) diff --git a/src/content/docs/en/recipes/react/forms.md b/src/content/docs/en/recipes/react/forms.md new file mode 100644 index 0000000..ed5a1fe --- /dev/null +++ b/src/content/docs/en/recipes/react/forms.md @@ -0,0 +1,208 @@ +--- +title: Forms +redirectFrom: + - /docs/recipes/react/example-forms + - /recipes/react/forms +--- + +## Example 1 + +```jsx +import React from "react"; +import ReactDOM from "react-dom"; +import { createEffect, createStore, createEvent, sample } from "effector"; +import { useStoreMap } from "effector-react"; + +const formSubmitted = createEvent(); +const fieldUpdate = createEvent(); + +const sendFormFx = createEffect((params) => { + console.log(params); +}); + +const $form = createStore({}); + +$form.on(fieldUpdate, (form, { key, value }) => ({ + ...form, + [key]: value, +})); + +sample({ + clock: formSubmitted, + source: $form, + target: sendFormFx, +}); + +const handleChange = fieldUpdate.prepend((event) => ({ + key: event.target.name, + value: event.target.value, +})); + +const Field = ({ name, type, label }) => { + const value = useStoreMap({ + store: $form, + keys: [name], + fn: (values) => values[name] ?? "", + }); + return ( + <div> + {label} <input name={name} type={type} value={value} onChange={handleChange} /> + </div> + ); +}; + +const App = () => ( + <form onSubmit={formSubmitted}> + <Field name="login" label="Login" /> + <Field name="password" type="password" label="Password" /> + <button type="submit">Submit!</button> + </form> +); + +formSubmitted.watch((e) => { + e.preventDefault(); +}); + +ReactDOM.render(<App />, document.getElementById("root")); +``` + +[Try it](https://share.effector.dev/vvDfdTxp) + +Let's break down the code above. + +These are just events & effects definitions. + +```js +const sendFormFx = createEffect((params) => { + console.log(params); +}); +const formSubmitted = createEvent(); // will be used further, and indicates, we have an intention to submit form +const fieldUpdate = createEvent(); //has intention to change $form's state in a way, defined in reducer further +const $form = createStore({}); + +$form.on(fieldUpdate, (form, { key, value }) => ({ + ...form, + [key]: value, +})); +``` + +The next piece of code shows how we can obtain a state in effector in the right way. This kind of state retrieving provides state consistency, and removes any possible race conditions, which can occur in some cases, when using `getState`. + +```js +sample({ + clock: formSubmitted, // when `formSubmitted` is triggered + source: $form, // Take LATEST state from $form, and + target: sendFormFx, // pass it to `sendFormFx`, in other words -> sendFormFx(state) + //fn: (sourceState, clockParams) => transformedData // we could additionally transform data here, but if we need just pass source's value, we may omit this property +}); +``` + +So far, so good, we've almost set up our model (events, effects and stores). Next thing is to create event, which will be used as `onChange` callback, which requires some data transformation, before data appear in `fieldUpdate` event. + +```js +const handleChange = fieldUpdate.prepend((event) => ({ + key: event.target.name, + value: event.target.value, +})); // upon trigger `handleChange`, passed data will be transformed in a way, described in function above, and returning value will be passed to original `setField` event. +``` + +Next, we have to deal with how inputs should work. [useStoreMap](/en/api/effector-react/useStoreMap) hook here prevents component rerender upon non-relevant changes. + +```jsx +const Field = ({ name, type, label }) => { + const value = useStoreMap({ + store: $form, // take $form's state + keys: [name], // watch for changes of `name` + fn: (values) => values[name] ?? "", // retrieve data from $form's state in this way (note: there will be an error, if undefined is returned) + }); + + return ( + <div> + {label}{" "} + <input + name={name} + type={type} + value={value} + onChange={handleChange /*note, bound event is here!*/} + /> + </div> + ); +}; +``` + +And, finally, the `App` itself! Note, how we got rid of any business-logic in view layer. It's simpler to debug, to share logic, and even more: logic is framework independent now. + +```jsx +const App = () => ( + <form onSubmit={submitted /*note, there is an event, which is `clock` for `sample`*/}> + <Field name="login" label="Login" /> + <Field name="password" type="password" label="Password" /> + <button type="submit">Submit!</button> + </form> +); +``` + +Prevent the default html form submit behavior using react event from `submitted`: + +```js +submitted.watch((e) => { + e.preventDefault(); +}); +``` + +## Example 2 + +This example demonstrates how to manage state by using an uncontrolled form, handle data loading, create components that depend on stores, and transform data passed between events. + +```jsx +import React from "react"; +import ReactDOM from "react-dom"; +import { createEffect, createStore } from "effector"; +import { useUnit, createComponent } from "effector-react"; + +//defining simple Effect, which results a string in 3 seconds +const sendFormFx = createEffect( + (formData) => new Promise((rs) => setTimeout(rs, 1000, `Signed in as [${formData.get("name")}]`)), +); + +//applying side-effect, upon sendFormFx `doneData` +sendFormFx.doneData.watch((result) => { + console.log(result); +}); + +const Loader = () => { + //approach #1: explicit store usage, with hook `useStore` + const loading = useUnit(sendFormFx.pending); //typeof loading === "boolean" + + return loading ? <div>Loading...</div> : null; +}; + +const SubmitButton = createComponent(sendFormFx.pending, (props, loading) => ( + //approach #2: implicit store usage + //actually `createComponent` is deprecated + <button disabled={loading} type="submit"> + Submit + </button> +)); + +const onSubmit = sendFormFx.prepend((e) => new FormData(e.target)); //transforming upcoming data, from DOM Event to FormData + +onSubmit.watch((e) => { + e.preventDefault(); +}); + +const App = () => ( + <form onSubmit={onSubmit}> + Login: <input name="name" /> + <br /> + Password: <input name="password" type="password" /> + <br /> + <Loader /> + <SubmitButton /> + </form> +); + +ReactDOM.render(<App />, document.getElementById("root")); +``` + +[Try it](https://share.effector.dev/yhE6HfCt) diff --git a/src/content/docs/en/recipes/react/gate.md b/src/content/docs/en/recipes/react/gate.md new file mode 100644 index 0000000..5d82bab --- /dev/null +++ b/src/content/docs/en/recipes/react/gate.md @@ -0,0 +1,78 @@ +--- +title: Gate +description: Gate – a bridge between props and store +redirectFrom: + - /docs/recipes/react/gate + - /recipes/react/gate +--- + +Gate is a bridge between props and stores. + +Imagine you have the task of transferring something from React props to the effector store. +Suppose you pass the history object from the react-router to the store, or pass some callbacks from render-props. +In a such situation [Gate](/en/api/effector-react/Gate) will help. + +```js +import { createStore, createEffect, sample } from "effector"; +import { useUnit, createGate } from "effector-react"; + +// Effect for api request +const getTodoFx = createEffect(async ({ id }) => { + const req = await fetch(`https://jsonplaceholder.typicode.com/todos/${id}`); + return req.json(); +}); + +// Our main store +const $todo = createStore(null); +const TodoGate = createGate(); + +$todo.on(getTodoFx.doneData, (_, todo) => todo); + +// We callgetTodoFx effect every time Gate updates its state. +sample({ clock: TodoGate.state, target: getTodoFx }); + +TodoGate.open.watch(() => { + //called each time when TodoGate is mounted +}); +TodoGate.close.watch(() => { + //called each time when TodoGate is unmounted +}); + +function Todo() { + const [todo, loading] = useUnit([$todo, getTodoFx.pending]); + + if (loading) { + return <div>Loading...</div>; + } + + if (!todo || Object.keys(todo).length === 0) { + return <div>empty</div>; + } + + return ( + <div> + <p>title: {todo.title}</p> + <p>id: {todo.id}</p> + </div> + ); +} + +const App = () => { + // value which need to be accessed outside from react + const [id, setId] = React.useState(0); + + return ( + <> + <button onClick={() => setId(id + 1)}>Get next Todo</button> + {/*In this situation, we have the ability to simultaneously + render a component and make a request, rather than wait for the component*/} + <TodoGate id={id} /> + <Todo /> + </> + ); +}; + +ReactDOM.render(<App />, document.getElementById("root")); +``` + +[Try it](https://share.effector.dev/u6YeYVaM) diff --git a/src/content/docs/en/recipes/react/slots.md b/src/content/docs/en/recipes/react/slots.md new file mode 100644 index 0000000..47aa704 --- /dev/null +++ b/src/content/docs/en/recipes/react/slots.md @@ -0,0 +1,130 @@ +--- +title: Slots +redirectFrom: + - /docs/recipes/react/slots + - /recipes/react/slots +--- + +A slot is a place in a component where you can insert any unknown component. It's a well-known abstraction used by frameworks +such as Vue.js and Svelte. + +Slots aren't present in the React. With React, you can achieve this goal using props or `React.Context`. +In large projects, this is not convenient, because it generates "props hell" or smears the logic. + +Using React with effector, we can achieve slot goals without the problems described above. + +- [Slots proposal](https://github.com/WICG/webcomponents/blob/gh-pages/proposals/Slots-Proposal) +- [Vue.js docs](https://v3.vuejs.org/guide/component-slots.html) +- [Svelte docs](https://svelte.dev/docs#slot) +- [@space307/effector-react-slots](https://github.com/space307/effector-react-slots) + +[Open ReplIt](https://replit.com/@binjospookie/effector-react-slots-example) + +```tsx +import { createApi, createStore, createEvent, sample, split } from "effector"; +import { useStoreMap } from "effector-react"; +import React from "react"; + +import type { ReactElement, PropsWithChildren } from "react"; + +type Component<S> = (props: PropsWithChildren<S>) => ReactElement | null; +type Store<S> = { + readonly component: Component<S>; +}; + +function createSlotFactory<Id>({ slots }: { readonly slots: Record<string, Id> }) { + const api = { + remove: createEvent<{ readonly id: Id }>(), + set: createEvent<{ readonly id: Id; readonly component: Component<any> }>(), + }; + + function createSlot<P>({ id }: { readonly id: Id }) { + const defaultToStore: Store<P> = { + component: () => null, + }; + const $slot = createStore<Store<P>>(defaultToStore); + const slotApi = createApi($slot, { + remove: (state) => ({ ...state, component: defaultToStore.component }), + set: (state, payload: Component<P>) => ({ ...state, component: payload }), + }); + const isSlotEventCalling = (payload: { readonly id: Id }) => payload.id === id; + + sample({ + clock: api.remove, + filter: isSlotEventCalling, + target: slotApi.remove, + }); + + sample({ + clock: api.set, + filter: isSlotEventCalling, + fn: ({ component }) => component, + target: slotApi.set, + }); + + function Slot(props: P = {} as P) { + const Component = useStoreMap({ + store: $slot, + fn: ({ component }) => component, + keys: [], + }); + + return <Component {...props} />; + } + + return { + $slot, + }; + } + + return { + api, + createSlot, + }; +} + +const SLOTS = { FOO: "foo" } as const; + +const { api, createSlot } = createSlotFactory({ slots: SLOTS }); + +const { Slot: FooSlot } = createSlot({ id: SLOTS.FOO }); + +const ComponentWithSlot = () => ( + <> + <h1>Hello, Slots!</h1> + <FooSlot /> + </> +); + +const updateFeatures = createEvent<string>(""); +const $featureToggle = createStore<string>(""); + +const MyAwesomeFeature = () => <p>Look at my horse</p>; +const VeryAwesomeFeature = () => <p>My horse is amaizing</p>; + +$featureToggle.on(updateFeatures, (_, feature) => feature); + +split({ + source: $featureToggle, + match: { + awesome: (data) => data === "awesome", + veryAwesome: (data) => data === "veryAwesome", + hideAll: (data) => data === "hideAll", + }, + cases: { + awesome: api.set.prepend(() => ({ + id: SLOTS.FOO, + component: MyAwesomeFeature, + })), + veryAwesome: api.set.prepend(() => ({ + id: SLOTS.FOO, + component: VeryAwesomeFeature, + })), + hideAll: api.remove.prepend(() => ({ id: SLOTS.FOO })), + }, +}); + +// updateFeatures('awesome'); // render MyAwesomeFeature in slot +// updateFeatures('veryAwesome'); // render VeryAwesomeFeature in slot +// updateFeatures('hideAll'); // render nothing in slot +``` diff --git a/src/content/docs/en/recipes/react/todo-creator.md b/src/content/docs/en/recipes/react/todo-creator.md new file mode 100644 index 0000000..e89af1c --- /dev/null +++ b/src/content/docs/en/recipes/react/todo-creator.md @@ -0,0 +1,95 @@ +--- +title: ToDo creator +redirectFrom: + - /docs/recipes/react/todo-creator + - /recipes/react/todo-creator +--- + +[Try it](https://share.effector.dev/AeiP1Jeb) + +```tsx +import React from "react"; +import ReactDOM from "react-dom"; +import { createStore, createEvent, sample } from "effector"; +import { useStore, useList } from "effector-react"; + +function createTodoListApi(initial: string[] = []) { + const insert = createEvent<string>(); + const remove = createEvent<number>(); + const change = createEvent<string>(); + const reset = createEvent<void>(); + + const $input = createStore<string>(""); + const $todos = createStore<string[]>(initial); + + $input.on(change, (_, value) => value); + + $input.reset(insert); + $todos.on(insert, (todos, newTodo) => [...todos, newTodo]); + + $todos.on(remove, (todos, index) => todos.filter((_, i) => i !== index)); + + $input.reset(reset); + + const submit = createEvent<React.SyntheticEvent>(); + submit.watch((event) => event.preventDefault()); + + sample({ + clock: submit, + source: $input, + target: insert, + }); + + return { + submit, + remove, + change, + reset, + $todos, + $input, + }; +} + +const firstTodoList = createTodoListApi(["hello, world!"]); +const secondTodoList = createTodoListApi(["hello, world!"]); + +function TodoList({ label, model }) { + const input = useStore(model.$input); + + const todos = useList(model.$todos, (value, index) => ( + <li> + {value}{" "} + <button type="button" onClick={() => model.remove(index)}> + Remove + </button> + </li> + )); + + return ( + <> + <h1>{label}</h1> + <ul>{todos}</ul> + <form> + <label>Insert todo: </label> + <input + type="text" + value={input} + onChange={(event) => model.change(event.currentTarget.value)} + /> + <input type="submit" onClick={model.submit} value="Insert" /> + </form> + </> + ); +} + +function App() { + return ( + <> + <TodoList label="First todo list" model={firstTodoList} /> + <TodoList label="Second todo list" model={secondTodoList} /> + </> + ); +} + +ReactDOM.render(<App />, document.getElementById("root")); +``` diff --git a/src/content/docs/en/recipes/react/todo-with-validation.md b/src/content/docs/en/recipes/react/todo-with-validation.md new file mode 100644 index 0000000..cf0cada --- /dev/null +++ b/src/content/docs/en/recipes/react/todo-with-validation.md @@ -0,0 +1,94 @@ +--- +title: TODO list with input validation +redirectFrom: + - /docs/recipes/react/todo-with-validation + - /recipes/react/todo-with-validation +--- + +[Try it](https://share.effector.dev/QTvCCXEg) + +```js +import { createEvent, createStore, createEffect, restore, combine, sample } from "effector"; +import { useUnit, useList } from "effector-react"; + +const submit = createEvent(); +const submitted = createEvent(); +const completed = createEvent(); +const changed = createEvent(); +const removed = createEvent(); + +const validateFx = createEffect(([todo, todos]) => { + if (todos.some((item) => item.text === todo)) throw "This todo is already on the list"; + if (!todo.trim().length) throw "Required field"; + return null; +}); + +const $todo = createStore(""); +const $todos = createStore([]); +const $error = createStore(""); + +$todo.on(changed, (_, todo) => todo); +$error.reset(changed); + +$todos.on(completed, (list, index) => + list.map((todo, foundIndex) => ({ + ...todo, + completed: index === foundIndex ? !todo.completed : todo.completed, + })), +); +$todos.on(removed, (state, index) => state.filter((_, i) => i !== index)); + +sample({ + clock: submit, + source: [$todo, $todos], + target: validateFx, +}); + +sample({ + clock: validateFx.done, + source: $todo, + target: submitted, +}); + +$todos.on(submitted, (list, text) => [...list, { text, completed: false }]); +$todo.reset(submitted); + +$error.on(validateFx.failData, (_, error) => error); + +submit.watch((e) => e.preventDefault()); + +const App = () => { + const [todo, error] = useUnit([$todo, $error]); + const list = useList($todos, (todo, index) => ( + <li style={{ textDecoration: todo.completed ? "line-through" : "" }}> + <input type="checkbox" checked={todo.completed} onChange={() => completed(index)} /> + {todo.text} + <button type="button" onClick={() => removed(index)} className="delete"> + x + </button> + </li> + )); + return ( + <div> + <h1>Todos</h1> + <form> + <input + className="text" + type="text" + name="todo" + value={todo} + onChange={(e) => changed(e.target.value)} + /> + <button type="submit" onClick={submit} className="submit"> + Submit + </button> + {error && <div className="error">{error}</div>} + </form> + + <ul style={{ listStyle: "none" }}>{list}</ul> + </div> + ); +}; + +ReactDOM.render(<App />, document.getElementById("root")); +``` diff --git a/src/content/docs/en/typescript/typing-effector.md b/src/content/docs/en/typescript/typing-effector.md new file mode 100644 index 0000000..606d09f --- /dev/null +++ b/src/content/docs/en/typescript/typing-effector.md @@ -0,0 +1,217 @@ +--- +title: Typing effector +description: Best practices for writing well-typed code +redirectFrom: + - /docs/typescript/typing-effector + - /typescript/typing-effector +--- + +Best practices for writing well-typed code + +## `createEvent` + +By default, this method returns `Event<void>`. + +```typescript +const event = createEvent(); +// event has type Event<void> +event(); +``` + +Event type can be defined as generic + +```typescript +const event = createEvent<number>(); +// event has type Event<number> +event(0); +``` + +## `createEffect` + +TypeScript can infer an effect result type from a given handler, but the argument type should be defined either in handler argument or as generic type + +```typescript +const sendMessageFx = createEffect(async (params: { text: string }) => { + // ... + return "ok"; +}); +// sendMessageFx has type Effect<{text: string}, string> + +const sendWarningFx = createEffect<{ warn: string }, string>(async ({ warn }) => { + // ... + return "ok"; +}); +// sendWarningFx has type Effect<{warn: string}, string> +``` + +## `createEffect` and custom errors + +When you need custom error types (`Fail` type in `Effect`) you can define all generics explicitly: + +```typescript +const sendWarningFx = createEffect<{ warn: string }, string, AxiosError>(async ({ warn }) => { + // ... + return "ok"; +}); +// sendWarningFx has type Effect<{warn: string}, string, AxiosError> +``` + +In case when effect's handler is defined before effect itself you can allow typescript to infer the type of `Params` and `Done` by using `typeof handler` in first generic and optionally provide `Fail` type as second one + +```typescript +const sendMessage = async (params: { text: string }) => { + // ... + return "ok"; +}; + +const sendMessageFx = createEffect<typeof sendMessage, AxiosError>(sendMessage); +// sendMessageFx has type Effect<{text: string}, string, AxiosError> +``` + +:::info{title="since"} +[effector 21.6.0](https://changelog.effector.dev/#effector-21-6-0) +::: + +## `event.prepend` + +To add types to events, created by [event.prepend](/en/api/effector/Event#prepend-fn), you need to add a type either by prepending function argument or as generic type + +```typescript +const message = createEvent<string>(); + +const userMessage = message.prepend(({ text }: { text: string }) => text); +// userMessage has type Event<{text: string}> + +const warningMessage = message.prepend<{ warn: string }>(({ warn }) => warn); +// warningMessage has type Event<{warn: string}> +``` + +## `attach` + +To allow typescript to infer types of created effect, add a type to `mapParams` first argument, which will become effect `params` type + +```typescript +const sendTextFx = createEffect<{ text: string }, "ok">(); + +const sendWarningFx = attach({ + effect: sendTextFx, + mapParams: ({ warn }: { warn: string }) => ({ text: warn }), +}); +// sendWarningFx has type Effect<{warn: string}, 'ok'> +``` + +## `split` + +[TypeScript type predicates](https://www.typescriptlang.org/docs/handbook/advanced-types.html#using-type-predicates) can be used to split a common event type to several cases (hence the name) + +```typescript +type UserMessage = { kind: "user"; text: string }; +type WarnMessage = { kind: "warn"; warn: string }; + +const message = createEvent<UserMessage | WarnMessage>(); + +const { userMessage, warnMessage } = split(message, { + userMessage: (msg): msg is UserMessage => msg.kind === "user", + warnMessage: (msg): msg is WarnMessage => msg.kind === "warn", +}); +// userMessage has type Event<UserMessage> +// warnMessage has type Event<WarnMessage> +``` + +## `sample` + +Since `effector@22.2.0` update `sample` also supports a `filter` field, which can also be a [TypeScript type predicate](https://www.typescriptlang.org/docs/handbook/advanced-types.html#using-type-predicates). + +```typescript +type UserMessage = { kind: "user"; text: string }; +type WarnMessage = { kind: "warn"; warn: string }; + +const message = createEvent<UserMessage | WarnMessage>(); +const userMessage = createEvent<UserMessage>(); + +sample({ + clock: message, + filter: (msg): msg is UserMessage => msg.kind === "user", + target: userMessage, +}); +``` + +### `filter + fn` + +However, `sample` also has a `fn` field to apply custom transformations. +There is a caveat with TypeScript type inference mechanic, which requires user to explicitly type `filter` arguments for type inference to work + +```typescript +type UserMessage = { kind: "user"; text: string }; +type WarnMessage = { kind: "warn"; warn: string }; +type Message = UserMessage | WarnMessage; + +const message = createEvent<Message>(); +const userText = createEvent<string>(); + +sample({ + clock: message, + // need to explicitly type `msg` as `Message` there + filter: (msg: Message): msg is UserMessage => msg.kind === "user", + // to get correct type inference here + fn: (msg) => msg.text, + target: userText, +}); + +// userMessage has type Event<string> +``` + +Otherwise, TypeScript will fall back to `any`. + +However, TypeScript will not allow you to set an incorrect `filter` type + +```typescript +const message = createEvent<Message>(); +const userMessage = createEvent<UserMessage>(); + +sample({ + clock: message, + // Type 'Message' is not assignable to type '{ kind: "user" | "wrong"; text: number; }'. + filter: (msg: { kind: "user" | "wrong"; text: number }): msg is UserMessage => + msg.kind === "user", + fn: (msg) => msg.text, + target: userMessage, +}); +``` + +## `createApi` + +To allow TypeScript to infer types of created events, adding a type to second argument of given reducers + +```typescript +const $count = createStore(0); + +const { add, sub } = createApi($count, { + add: (x, add: number) => x + add, + sub: (x, sub: number) => x - sub, +}); + +// add has type Event<number> +// sub has type Event<number> +``` + +## `is` + +`is` methods can help to infer a unit type (thereby `is` methods acts as [TypeScript type guards](https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-differentiating-types)) which can help to write strongly-typed helper functions + +```typescript +export function getUnitType(unit: unknown) { + if (is.event(unit)) { + // here unit has Event<any> type + return "event"; + } + if (is.effect(unit)) { + // here unit has Effect<any, any> type + return "effect"; + } + if (is.store(unit)) { + // here unit has Store<any> type + return "store"; + } +} +``` diff --git a/src/content/docs/en/typescript/usage-with-effector-react.md b/src/content/docs/en/typescript/usage-with-effector-react.md new file mode 100644 index 0000000..acda50b --- /dev/null +++ b/src/content/docs/en/typescript/usage-with-effector-react.md @@ -0,0 +1,642 @@ +--- +id: usage-with-effector-react +title: Usage with effector-react +redirectFrom: + - /docs/typescript/usage-with-effector-react + - /typescript/usage-with-effector-react +--- + +**TypeScript** is a typed superset of JavaScript. It became popular +recently in applications due to the benefits it can bring. If you are new to +TypeScript, it is highly recommended to become familiar with it first, before +proceeding. You can check out its documentation +[here](https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html). + +TypeScript has a potential to bring the following benefits to application: + +1. Type safety for state, stores and events +2. Easy refactoring of typed code +3. A superior developer experience in a team environment + +**A Practical Example** + +We will be going through a simplistic chat application to demonstrate a +possible approach to include static typing. This chat application will have API mock that load and saves data from localStorage. + +The full source code is available on +[github](https://github.com/effector/effector/tree/master/examples/react-and-ts). +Note that, by going through this example yourself, you will experience some benefits of using TypeScript. + +## Let's create API mock + +There is a directory structure inherited from the [feature-sliced](https://feature-sliced.design) methodology. + +Let's define a simple type, that our improvised API will return. + +```ts +// File: /src/shared/api/message.ts +interface Author { + id: string; + name: string; +} + +export interface Message { + id: string; + author: Author; + text: string; + timestamp: number; +} +``` + +Our API will load and save data to `localStorage`, and we need some functions to load data: + +```ts +// File: /src/shared/api/message.ts +const LocalStorageKey = "effector-example-history"; + +function loadHistory(): Message[] | void { + const source = localStorage.getItem(LocalStorageKey); + if (source) { + return JSON.parse(source); + } + return undefined; +} +function saveHistory(messages: Message[]) { + localStorage.setItem(LocalStorageKey, JSON.stringify(messages)); +} +``` + +I also created some libraries to generate identifiers and wait to simulate network requests. + +```ts +// File: /src/shared/lib/oid.ts +export const createOid = () => + ((new Date().getTime() / 1000) | 0).toString(16) + + "xxxxxxxxxxxxxxxx".replace(/[x]/g, () => ((Math.random() * 16) | 0).toString(16)).toLowerCase(); +``` + +```ts +// File: /src/shared/lib/wait.ts +export function wait(timeout = Math.random() * 1500) { + return new Promise((resolve) => setTimeout(resolve, timeout)); +} +``` + +OK. Now we can create effects that will load messages. + +```ts +// File: /src/shared/api/message.ts +// Here effect defined with static types. void defines no arguments. +// Second type argument defines a successful result type. +// Third argument is optional and defines a failure result type. +export const messagesLoadFx = createEffect<void, Message[], Error>(async () => { + const history = loadHistory(); + await wait(); + return history ?? []; +}); + +interface SendMessage { + text: string; + author: Author; +} + +// But we can use type inferring and set arguments types in the handler defintion. +// Hover your cursor on `messagesLoadFx` to see the inferred types: +// `Effect<{ text: string; authorId: string; authorName: string }, void, Error>` +export const messageSendFx = createEffect(async ({ text, author }: SendMessage) => { + const message: Message = { + id: createOid(), + author, + timestamp: Date.now(), + text, + }; + const history = await messagesLoadFx(); + saveHistory([...history, message]); + await wait(); +}); + +// Please, note that we will `wait()` for `messagesLoadFx` and `wait()` in the current effect +// Also, note that `saveHistory` and `loadHistory` can throw exceptions, +// in that case effect will trigger `messageDeleteFx.fail` event. +export const messageDeleteFx = createEffect(async (message: Message) => { + const history = await messagesLoadFx(); + const updated = history.filter((found) => found.id !== message.id); + await wait(); + saveHistory(updated); +}); +``` + +OK, now we are done with the messages, let's create effects to manage user session. + +Really, I prefer to start design code from implementing interfaces: + +```ts +// File: /src/shared/api/session.ts +// It is called session because it describes current user session, not the User at all. +export interface Session { + id: string; + name: string; +} +``` + +Also, to generate usernames and don't require to type it by themselves, import `unique-names-generator`: + +```ts +// File: /src/shared/api/session.ts +import { uniqueNamesGenerator, Config, starWars } from "unique-names-generator"; + +const nameGenerator: Config = { dictionaries: [starWars] }; +const createName = () => uniqueNamesGenerator(nameGenerator); +``` + +Let's create effects to manage session: + +```ts +// File: /src/shared/api/session.ts +const LocalStorageKey = "effector-example-session"; + +// Note, that we need explicit types definition in that case, because `JSON.parse()` returns `any` +export const sessionLoadFx = createEffect<void, Session | null>(async () => { + const source = localStorage.getItem(LocalStorageKey); + await wait(); + if (!source) { + return null; + } + return JSON.parse(source); +}); + +// By default, if there are no arguments, no explicit type arguments, and no return statement provided +// effect will have type: `Effect<void, void, Error>` +export const sessionDeleteFx = createEffect(async () => { + localStorage.removeItem(LocalStorageKey); + await wait(); +}); + +// Look at the type of the `sessionCreateFx` constant. +// It will be `Effect<void, Session, Error>` because TypeScript can infer type from `session` constant +export const sessionCreateFx = createEffect(async () => { + // I explicitly set type for the next constant, because it allows TypeScript help me + // If I forgot to set property, I'll see error in the place of definition + // Also it allows IDE to autocomplete property names + const session: Session = { + id: createOid(), + name: createName(), + }; + localStorage.setItem(LocalStorageKey, JSON.stringify(session)); + return session; +}); +``` + +How we need to import these effects? + +I surely recommend writing short imports and using reexports. +It allows to securely refactor code structure inside `shared/api` and the same slices, +and don't worry about refactoring other imports and unnecessary changes in the git history. + +```ts +// File: /src/shared/api/index.ts +export * as messageApi from "./message"; +export * as sessionApi from "./session"; + +// Types reexports made just for convenience +export type { Message } from "./message"; +export type { Session } from "./session"; +``` + +## Create a page with the logic + +Typical structure of the pages: + +``` +src/ + pages/ + <page-name>/ + page.tsx — just the View layer + model.ts — a business-logic code + index.ts — reexports, sometimes there will be a connection-glue code +``` + +I recommend writing code in the view layer from the top to bottom, more common code at the top. +Let's model our view layer. We will have two main sections at the page: messages history and a message form. + +```tsx +// File: /src/pages/chat/page.tsx +export function ChatPage() { + return ( + <div className="parent"> + <ChatHistory /> + <MessageForm /> + </div> + ); +} + +function ChatHistory() { + return ( + <div className="chat-history"> + <div>There will be messages list</div> + </div> + ); +} + +function MessageForm() { + return ( + <div className="message-form"> + <div>There will be message form</div> + </div> + ); +} +``` + +OK. Now we know what kind of structure we have, and we can start to model business-logic processes. +The view layer should do two tasks: render data from stores and report events to the model. +The view layer doesn't know how data are loaded, how it should be converted and sent back. + +```ts +// File: /src/pages/chat/model.ts +import { createEvent, createStore } from "effector"; + +// And the events report just what happened +export const messageDeleteClicked = createEvent<Message>(); +export const messageSendClicked = createEvent(); +export const messageEnterPressed = createEvent(); +export const messageTextChanged = createEvent<string>(); +export const loginClicked = createEvent(); +export const logoutClicked = createEvent(); + +// At the moment, there is just raw data without any knowledge how to load +export const $loggedIn = createStore<boolean>(false); +export const $userName = createStore(""); +export const $messages = createStore<Message[]>([]); +export const $messageText = createStore(""); + +// Page should NOT know where the data came from. +// That's why we just reexport them. +// We can rewrite this code to `combine` or independent store, +// page should NOT be changed, just because we changed the implementation +export const $messageDeleting = messageApi.messageDeleteFx.pending; +export const $messageSending = messageApi.messageSendFx.pending; +``` + +Now we can implement components. + +```tsx +// File: /src/pages/chat/page.tsx +import { useList, useUnit } from "effector-react"; +import * as model from "./model"; + +// export function ChatPage { ... } + +function ChatHistory() { + const [messageDeleting, onMessageDelete] = useUnit([model.$messageDeleting, model.messageDeleteClicked]); + + // Hook `useList` allows React not rerender messages really doesn't changed + const messages = useList(model.$messages, (message) => ( + <div className="message-item" key={message.timestamp}> + <h3>From: {message.author.name}</h3> + <p>{message.text}</p> + <button onClick={() => onMessageDelete(message)} disabled={messageDeleting}> + {messageDeleting ? "Deleting" : "Delete"} + </button> + </div> + )); + // We don't need `useCallback` here because we pass function to an HTML-element, not a custom component + + return <div className="chat-history">{messages}</div>; +} +``` + +I split `MessageForm` to the different components, to simplify code: + +```tsx +// File: /src/pages/chat/page.tsx +function MessageForm() { + const isLogged = useUnit(model.$loggedIn); + return isLogged ? <SendMessage /> : <LoginForm />; +} + +function SendMessage() { + const [userName, messageText, messageSending] = useUnit([model.$userName, model.$messageText, model.$messageSending]); + + const [handleLogout, handleTextChange, handleEnterPress, handleSendClick] = useUnit([ + model.logoutClicked, + model.messageTextChanged, + model.messageEnterPressed, + model.messageSendClicked, + ]); + + const handleKeyPress = (event: React.KeyboardEvent<HTMLInputElement>) => { + if (event.key === "Enter") { + handleEnterPress(); + } + }; + + return ( + <div className="message-form"> + <h3>{userName}</h3> + <input + value={messageText} + onChange={(event) => handleTextChange(event.target.value)} + onKeyPress={handleKeyPress} + className="chat-input" + placeholder="Type a message..." + /> + <button onClick={() => handleSendClick()} disabled={messageSending}> + {messageSending ? "Sending..." : "Send"} + </button> + <button onClick={() => handleLogout()}>Log out</button> + </div> + ); +} + +function LoginForm() { + const handleLogin = useUnit(model.loginClicked); + + return ( + <div className="message-form"> + <div>Please, log in to be able to send messages</div> + <button onClick={() => handleLogin()}>Login as a random user</button> + </div> + ); +} +``` + +## Manage user session like a Pro + +Let's create a session entity. An entity is a business unit. + +```ts +// File: /src/entities/session/index.ts +import { Session } from "shared/api"; +import { createStore } from "effector"; + +// Entity just stores session and some internal knowledge about it +export const $session = createStore<Session | null>(null); +// When store `$session` is updated, store `$isLogged` will be updated too +// They are in sync. Derived store are depends on data from original. +export const $isLogged = $session.map((session) => session !== null); +``` + +Now we can implement login or logout features on the page. Why not here? +If we place login logic here, we will have a very implicit scenario, +when you call `sessionCreateFx` you won't see code called after effect. +But consequences will be visible in the DevTools and application behaviour. + +Try to write the code in as obvious a way as possible in one file, +so that you and any teammate can trace the sequence of execution. + +## Implement logic + +OK. Now we can load a user session and the messages lists on the page mount. +But, we don't have any event when we can start. Let's fix it. + +You can use [Gate](/en/recipes/react/gate), but I prefer to use explicit events. + +```ts +// File: /src/pages/chat/model.ts +// Just add a new event +export const pageMounted = createEvent(); +``` + +Just add `useEffect` and call bound event inside. + +```tsx +// File: /src/pages/chat/page.tsx +export function ChatPage() { + const handlePageMount = useUnit(model.pageMounted); + + React.useEffect(() => { + handlePageMount(); + }, [handlePageMount]); + + return ( + <div className="parent"> + <ChatHistory /> + <MessageForm /> + </div> + ); +} +``` + +> Note: if you don't plan to write tests for effector code and/or implement SSR you can omit any usage of `useEvent`. + +At the moment we can load a session and the messages list. + +Just add reaction to the event, and any other code should be written in chronological order after each event: + +```ts +// File: /src/pages/chat/model.ts +// Don't forget to import { sample } from "effector" +import { Message, messageApi, sessionApi } from "shared/api"; +import { $session } from "entities/session"; + +// export stores +// export events + +// Here the logic place + +// You can read this code like: +// When page mounted, call messages load and session load simultaneously +sample({ + clock: pageMounted, + target: [messageApi.messagesLoadFx, sessionApi.sessionLoadFx], +}); +``` + +After that we need to define reactions on `messagesLoadFx.done` and `messagesLoadFx.fail`, and the same for `sessionLoadFx`. + +```ts +// File: /src/pages/chat/model.ts +// `.doneData` is a shortcut for `.done`, because `.done` returns `{ params, result }` +// Do not name your arguments like `state` or `payload` +// Use explicit names of the content they contain +$messages.on(messageApi.messagesLoadFx.doneData, (_, messages) => messages); + +$session.on(sessionApi.sessionLoadFx.doneData, (_, session) => session); +``` + +OK. Session and messages loaded. Let's allow the users to log in. + +```ts +// File: /src/pages/chat/model.ts +// When login clicked we need to create a new session +sample({ + clock: loginClicked, + target: sessionApi.sessionCreateFx, +}); +// When session created, just write it to a session store +sample({ + clock: sessionApi.sessionCreateFx.doneData, + target: $session, +}); +// If session create is failed, just reset the session +sample({ + clock: sessionApi.sessionCreateFx.fail, + fn: () => null, + target: $session, +}); +``` + +Now we'll implement a logout process: + +```ts +// File: /src/pages/chat/model.ts +// When logout clicked we need to reset session and clear our storage +sample({ + clock: logoutClicked, + target: sessionApi.sessionDeleteFx, +}); +// In any case, failed or not, we need to reset session store +sample({ + clock: sessionApi.sessionDeleteFx.finally, + fn: () => null, + target: $session, +}); +``` + +> Note: most of the comments wrote just for educational purpose. In real life, application code will be self-describable + +But if we start the dev server and try to log in, we see nothing changed. +This is because we created `$loggedIn` store in the model, but don't change it. Let's fix: + +```ts +// File: /src/pages/chat/model.ts +import { $isLogged, $session } from "entities/session"; + +// At the moment, there is just raw data without any knowledge how to load +export const $loggedIn = $isLogged; +export const $userName = $session.map((session) => session?.name ?? ""); +``` + +Here we just reexported our custom store from the session entity, but our View layer doesn't change. +The same situation with `$userName` store. Just reload the page, and you'll see, that session loaded correctly. + +## Send message + +Now we can log in and log out. I think you want to send a message. This is pretty simple: + +```ts +// File: /src/pages/chat/model.ts +$messageText.on(messageTextChanged, (_, text) => text); + +// We have two different events to send message +// Let event `messageSend` react on any of them +const messageSend = merge([messageEnterPressed, messageSendClicked]); + +// We need to take a message text and author info then send it to the effect +sample({ + clock: messageSend, + source: { author: $session, text: $messageText }, + target: messageApi.messageSendFx, +}); +``` + +But if in the `tsconfig.json` you set `"strictNullChecks": true`, you will see the error there. +It is because store `$session` contains `Session | null` and `messageSendFx` wants `Author` in the arguments. +`Author` and `Session` are compatible, but not the `null`. + +To fix this strange behaviour, we need to use `filter` there: + +```ts +// File: /src/pages/chat/model.ts +sample({ + clock: messageSend, + source: { author: $session, text: $messageText }, + filter: (form): form is { author: Session; text: string } => { + return form.author !== null; + }, + target: messageApi.messageSendFx, +}); +``` + +I want to focus your attention on the return type `form is {author: Session; text: string}`. +This feature called [type guard](https://www.typescriptlang.org/docs/handbook/advanced-types.html#user-defined-type-guards) +and allows TypeScript to reduce `Session | null` type to more specific `Session` via condition inside the function. + +Now we can read this like: when a message should be sent, take session and message text, check that session exists, and send it. + +OK. Now we can write a new message to a server. +But if we don't call `messagesLoadFx` again we didn't see any changes, +because `$messages` store didn't update. We can write generic code for this case. +The easiest way is to return the sent message from the effect. + +```ts +// File: /src/shared/api/message.ts +export const messageSendFx = createEffect(async ({ text, author }: SendMessage) => { + const message: Message = { + id: createOid(), + author, + timestamp: Date.now(), + text, + }; + const history = await messagesLoadFx(); + await wait(); + saveHistory([...history, message]); + return message; +}); +``` + +Now we can just append a message to the end of the list: + +```ts +// File: /src/pages/chat/model.ts +$messages.on(messageApi.messageSendFx.doneData, (messages, newMessage) => [ + ...messages, + newMessage, +]); +``` + +But at the moment, sent a message still left in the input. + +```ts +// File: /src/pages/chat/model.ts +$messageText.on(messageSendFx, () => ""); + +// If message sending is failed, just restore the message +sample({ + clock: messageSendFx.fail, + fn: ({ params }) => params.text, + target: $messageText, +}); +``` + +## Deleting the message + +It is pretty simple. + +```ts +// File: /src/pages/chat/model.ts +sample({ + clock: messageDeleteClicked, + target: messageApi.messageDeleteFx, +}); + +$messages.on(messageApi.messageDeleteFx.done, (messages, { params: toDelete }) => + messages.filter((message) => message.id !== toDelete.id), +); +``` + +But you can see the bug, when "Deleting" state doesn't disable. +This is because `useList` caches renders, and doesn't know about dependency on `messageDeleting` state. +To fix it, we need to provide `keys`: + +```tsx +// File: /src/pages/chat/page.tsx +const messages = useList(model.$messages, { + keys: [messageDeleting], + fn: (message) => ( + <div className="message-item" key={message.timestamp}> + <h3>From: {message.author.name}</h3> + <p>{message.text}</p> + <button onClick={() => handleMessageDelete(message)} disabled={messageDeleting}> + {messageDeleting ? "Deleting" : "Delete"} + </button> + </div> + ), +}); +``` + +## Conclusion + +This is a simple example of an application on effector with React and TypeScript. + +You can clone this [effector/examples/react-and-ts](https://github.com/effector/effector/tree/master/examples/react-and-ts) and run this example on your computer. diff --git a/src/content/docs/en/typescript/utility-types.md b/src/content/docs/en/typescript/utility-types.md new file mode 100644 index 0000000..cae60f5 --- /dev/null +++ b/src/content/docs/en/typescript/utility-types.md @@ -0,0 +1,126 @@ +--- +title: Utility Types +redirectFrom: + - /docs/typescript/utility-types + - /typescript/utility-types +--- + +Effector provides several utility types to facilitate getting a type of value from the unit. + +## `UnitValue<Type>` + +Taking out of [Unit](/en/explanation/glossary#common-unit) value type. + +### Example + +```ts +import { createEffect, createStore, createDomain, createEvent, fork, UnitValue } from "effector"; + +const event = createEvent<{ id: string; name?: string } | { id: string }>(); +const $store = createStore([false, true]); +const effect = createEffect<{ token: string }, any, string>(() => {}); +const domain = createDomain(); +const scope = fork(); + +type UnitEventType = UnitValue<typeof event>; +// {id: string; name?: string | undefined} | {id: string} + +type UnitStoreType = UnitValue<typeof store>; +// boolean[] + +type UnitEffectType = UnitValue<typeof effect>; +// {token: string} + +type UnitDomainType = UnitValue<typeof domain>; +// any + +type UnitScopeType = UnitValue<typeof scope>; +// any +``` + +## `StoreValue<Type>` + +Taking out of [Store](/en/api/effector/Store) value type. + +### Example + +```ts +import { createStore, StoreValue } from "effector"; + +const $store = createStore(true); + +type StoreValueType = StoreValue<typeof $store>; +// boolean +``` + +## `EventPayload<Type>` + +Taking out of [Event](/en/api/effector/Event) payload type. + +### Example + +```ts +import { createEvent, EventPayload } from "effector"; + +const event = createEvent<{ id: string }>(); + +type EventPayloadType = EventPayload<typeof event>; +// {id: string} +``` + +## `EffectParams<Type>` + +Taking out of [Effect](/en/api/effector/Effect) params type. + +### Example + +```ts +import { createEffect, EffectParams } from "effector"; + +const fx = createEffect< + { id: string }, + { name: string; isAdmin: boolean }, + { statusText: string; status: number } +>(() => ({ name: "Alice", isAdmin: false })); + +type EffectParamsType = EffectParams<typeof fx>; +// {id: string} +``` + +## `EffectResult<Type>` + +Taking out of [Effect](/en/api/effector/Effect) result type. + +### Example + +```ts +import { createEffect, EffectResult } from "effector"; + +const fx = createEffect< + { id: string }, + { name: string; isAdmin: boolean }, + { statusText: string; status: number } +>(() => ({ name: "Alice", isAdmin: false })); + +type EffectResultType = EffectResult<typeof fx>; +// {name: string; isAdmin: boolean} +``` + +## `EffectError<Type>` + +Taking out of [Effect](/en/api/effector/Effect) error type. + +### Example + +```ts +import { createEffect, EffectError } from "effector"; + +const fx = createEffect< + { id: string }, + { name: string; isAdmin: boolean }, + { statusText: string; status: number } +>(() => ({ name: "Alice", isAdmin: false })); + +type EffectErrorType = EffectError<typeof fx>; +// {statusText: string; status: number} +``` diff --git a/src/content/docs/ru/api/effector-react/index.md b/src/content/docs/ru/api/effector-react/index.md new file mode 100644 index 0000000..e7aa908 --- /dev/null +++ b/src/content/docs/ru/api/effector-react/index.md @@ -0,0 +1,26 @@ +--- +title: Справочник по API +description: Перечень основных методов API, по группам +--- + +Перечень основных методов API, по группам + +## Хуки + +- [useStore(store)](/ru/api/effector-react/useStore) +- [useStoreMap({ store, keys, fn })](/ru/api/effector-react/useStoreMap) +- [useList(store, renderItem)](/ru/api/effector-react/useList) +- [useUnit(units)](/ru/api/effector-react/useUnit) +- [useEvent(unit)](/ru/api/effector-react/useEvent) + +## Gate API + +- [Gate](/ru/api/effector-react/Gate) +- [createGate()](/ru/api/effector-react/createGate) +- [useGate(GateComponent, props)](/ru/api/effector-react/useGate) + +## Higher Order Components API + +- [createComponent(store, render)](/ru/api/effector-react/createComponent) +- [createStoreConsumer(store)](/ru/api/effector-react/createStoreConsumer) +- [connect(store)(Component)](/ru/api/effector-react/connect) diff --git a/src/content/docs/ru/api/effector-react/useEvent.md b/src/content/docs/ru/api/effector-react/useEvent.md new file mode 100644 index 0000000..a52da6c --- /dev/null +++ b/src/content/docs/ru/api/effector-react/useEvent.md @@ -0,0 +1,184 @@ +--- +title: useEvent +lang: ru +--- + +Реакт-хук, который привязывает событие к текущему [scope](/ru/api/effector/Scope) для использования в обработчиках событий + +Используется с серверным рендерингом и в тестировании, импортируется из `effector-react/scope` + +## _useEvent(unit)_ (#useEvent-unit) + +Привязывает юнит к скоупу компонента + +### Формула (#useEvent-unit-formulae) + +```ts +declare const event: Event<T> +declare const fx: Effect<T, S> + +const eventFn = useEvent(/*unit*/ event) +-> (data: T) => T + +const fxFn = useEvent(/*unit*/ fx) +-> (data: T) => Promise<S> +``` + +### Аргументы (#useEvent-unit-args) + +1. **`unit`**: [Событие](/ru/api/effector/Event) или [эффект](/ru/api/effector/Effect) для привязки к скоупу компонента + +### Возвращает (#useEvent-unit-return) + +Функцию для запуска юнита в скоупе компонента + +### Пример (#useEvent-unit-usage-example) + +```jsx +import ReactDOM from "react-dom"; +import { createEvent, createStore, fork } from "effector"; +import { useStore, useEvent, Provider } from "effector-react"; + +const inc = createEvent(); +const $count = createStore(0).on(inc, (x) => x + 1); + +const App = () => { + const count = useStore($count); + const incFn = useEvent(inc); + return ( + <> + <p>Count: {count}</p> + <button onClick={() => incFn()}>increment</button> + </> + ); +}; + +const scope = fork(); + +ReactDOM.render( + <Provider value={scope}> + <App /> + </Provider>, + document.getElementById("root"), +); +``` + +[Запустить пример](https://share.effector.dev/GyiJvLdo) + +## _useEvent([a, b])_ (#useEvent-list) + +Привязывает массив событий или эффектов к скоупу компонента + +### Формула (#useEvent-list-formulae) + +```ts +declare const a: Event<T> +declare const bFx: Effect<T, S> + +const [aFn, bFn] = useEvent(/*list*/ [a, bFx]) +-> [(data: T) => T, (data: T) => Promise<S>] +``` + +### Аргументы (#useEvent-list-args) + +1. **`list`**: Массив [событий](/ru/api/effector/Event) или [эффектов](/ru/api/effector/Effect) + +### Возвращает (#useEvent-list-return) + +Массив функций для запуска юнитов в скоупе компонента + +### Пример (#useEvent-list-usage-example) + +```jsx +import ReactDOM from "react-dom"; +import { createEvent, createStore, fork } from "effector"; +import { useStore, useEvent, Provider } from "effector-react"; + +const inc = createEvent(); +const dec = createEvent(); +const $count = createStore(0) + .on(inc, (x) => x + 1) + .on(dec, (x) => x - 1); + +const App = () => { + const count = useStore($count); + const [incFn, decFn] = useEvent([inc, dec]); + return ( + <> + <p>Count: {count}</p> + <button onClick={() => incFn()}>increment</button> + <button onClick={() => decFn()}>decrement</button> + </> + ); +}; + +const scope = fork(); + +ReactDOM.render( + <Provider value={scope}> + <App /> + </Provider>, + document.getElementById("root"), +); +``` + +[Запустить пример](https://share.effector.dev/tskNc0Pt) + +## _useEvent({a, b})_ (#useEvent-shape) + +Привязывает объект событий или эффектов к скоупу компонента + +### Формула (#useEvent-shape-formulae) + +```ts +declare const a: Event<T> +declare const bFx: Effect<T, S> + +const {a: aFn, b: bFn} = useEvent(/*shape*/ {a, b: bFx}) +-> {a: (data: T) => T, b: (data: T) => Promise<S>} +``` + +### Аргументы (#useEvent-shape-args) + +1. **`shape`**: Объект [событий](/ru/api/effector/Event) или [эффектов](/ru/api/effector/Effect) + +### Возвращает (#useEvent-shape-return) + +Объект функций для запуска юнитов в скоупе компонента + +### Пример (#useEvent-shape-usage-example) + +```jsx +import ReactDOM from "react-dom"; +import { createEvent, createStore, fork } from "effector"; +import { useStore, useEvent, Provider } from "effector-react"; + +const inc = createEvent(); +const dec = createEvent(); +const $count = createStore(0) + .on(inc, (x) => x + 1) + .on(dec, (x) => x - 1); + +const App = () => { + const count = useStore($count); + const handlers = useEvent({ inc, dec }); + return ( + <> + <p>Count: {count}</p> + <button onClick={() => handlers.inc()}>increment</button> + <button onClick={() => handlers.dec()}>decrement</button> + </> + ); +}; + +const scope = fork(); + +ReactDOM.render( + <Provider value={scope}> + <App /> + </Provider>, + document.getElementById("root"), +); +``` + +[Запустить пример](https://share.effector.dev/ulRZefVW) diff --git a/src/content/docs/ru/api/effector-react/useList.md b/src/content/docs/ru/api/effector-react/useList.md new file mode 100644 index 0000000..71bd4cd --- /dev/null +++ b/src/content/docs/ru/api/effector-react/useList.md @@ -0,0 +1,224 @@ +--- +title: useList +lang: ru +--- + +:::info{title="since"} +`useList` появился в [effector-react 20.1.1](https://changelog.effector.dev/#effector-react-20-1-1) +::: + +React-хук для эффективного рендеринга сторов хранящих массивы данных. +Каждый элемент будет мемоизирован и обновлен только при изменении его данных + +## Сокращённая запись (#useList-short) + +### Формула (#useList-short-formulae) + +```ts +function useList(store: Store<T[]>, fn: (item: T, key: number) => React.ReactNode): React.ReactNode; +``` + +### Аргументы (#useList-short-args) + +1. **`store`**: [Стор](/ru/api/effector/Store) с массивом данных +2. **`fn`**: `(item: T, key: number) => React.ReactNode` + + Рендер-функция для отображения в ui отдельного элемента массива. Явная простановка `key` реакт-элементам внутри рендер-функции не требуется, ключ элемента проставляется автоматически + + **Аргументы** + + - **`item`**: Элемент массива + - **`key`**: Индекс элемента, выступает как ключ для React + + **Возвращает**: `React.ReactNode` + +### Возвращает (#useList-short-return) + +`React.ReactNode` + +## Полная запись (#useList-full) + +Используется, когда необходимо вычислять ключ элемента или обновлять элементы при изменении какого-либо внешнего значения, доступного только через React (например, поля props из замыкания компонента или состояния другого стора) + +По умолчанию `useList` обновляется только тогда, когда некоторые из его элементов были изменены. +Однако иногда необходимо обновлять элементы при изменении какого-либо внешнего значения (например, поля props или состояния другого стора). +В таком случае нужно сообщить React о дополнительных зависимостях, в таком случае элемент будет перерендерен и в случае их изменения + +### Формула (#useList-full-formulae) + +```ts +function useList( + store: Store<T[]>, + config: { + keys: any[]; + fn: (item: T, key: React.Key) => React.ReactNode; + getKey?: (item: T) => React.Key; + }, +): React.ReactNode; +``` + +### Аргументы (#useList-full-args) + +1. **`store`**: [Стор](/ru/api/effector/Store) с массивом данных +2. **`config`**: Объект конфигурации + + - **`keys`**: Массив зависимостей, которые будут переданы в React + - **`fn`**: `(item: T, key: React.Key) => React.ReactNode` + + Рендер-функция для отображения в ui отдельного элемента массива. Явная простановка `key` реакт-элементам внутри рендер-функции не требуется, ключ элемента проставляется автоматически + + **Аргументы** + + - **`item`**: Элемент массива + - **`key`**: Ключ элемента, вычисляется с помощью `getKey`, если есть, в противном случае используется индекс элемента + + **Возвращает**: `React.ReactNode` + + - **`getKey?`**: `(item: T) => React.Key` + + Функция для вычисления ключа элемента на основе данных. Полученный ключ будет передан в React + + **Аргументы** + + - **`item`**: Элемент массива + + **Возвращает**: `React.Key` + + - **`placeholder?`**: `React.ReactNode` Опциональный реакт-элемент который будет использован в случае пустого массива + +### Возвращает (#useList-full-return) + +`React.ReactNode` + +:::info +Опция `getKey` добавлена в effector-react 21.3.0 +::: + +:::info +Опция `placeholder` добавлена в effector-react 22.1.0 +::: + +## Примеры + +### Пример 1 + +```jsx +import { createStore } from "effector"; +import { useList } from "effector-react"; + +const $users = createStore([ + { id: 1, name: "Yung" }, + { id: 2, name: "Lean" }, + { id: 3, name: "Kyoto" }, + { id: 4, name: "Sesh" }, +]); + +const App = () => { + const list = useList($users, ({ name }, index) => ( + <li> + [{index}] {name} + </li> + )); + + return <ul>{list}</ul>; +}; +``` + +[Запустить пример](https://share.effector.dev/dV9dmuz3) + +### Пример 2 + +```jsx +import { createStore, createEvent } from "effector"; +import { useList } from "effector-react"; + +const addTodo = createEvent(); +const toggleTodo = createEvent(); + +const $todoList = createStore([ + { text: "write useList example", done: true }, + { text: "update readme", done: false }, +]) + .on(toggleTodo, (list, id) => + list.map((todo, i) => { + if (i === id) + return { + ...todo, + done: !todo.done, + }; + return todo; + }), + ) + .on(addTodo, (list, e) => [ + ...list, + { + text: e.currentTarget.elements.content.value, + done: false, + }, + ]); + +addTodo.watch((e) => { + e.preventDefault(); +}); + +const TodoList = () => + useList($todoList, ({ text, done }, i) => { + const todo = done ? ( + <del> + <span>{text}</span> + </del> + ) : ( + <span>{text}</span> + ); + return <li onClick={() => toggleTodo(i)}>{todo}</li>; + }); +const App = () => ( + <div> + <h1>todo list</h1> + <form onSubmit={addTodo}> + <label htmlFor="content">New todo</label> + <input type="text" name="content" required /> + <input type="submit" value="Add" /> + </form> + <ul> + <TodoList /> + </ul> + </div> +); +``` + +[Запустить пример](https://share.effector.dev/dUay9F3U) + +### Пример с конфигурацией + +```jsx +import ReactDOM from "react-dom"; +import { createEvent, createStore, restore } from "effector"; +import { useStore, useList } from "effector-react"; + +const renameUser = createEvent(); +const $user = restore(renameUser, "alice"); +const $friends = createStore(["bob"]); + +const App = () => { + const user = useStore($user); + return useList($friends, { + keys: [user], + fn: (friend) => ( + <div> + {friend} is a friend of {user} + </div> + ), + }); +}; + +ReactDOM.render(<App />, document.getElementById("root")); +// => <div> bob is a friend of alice </div> + +setTimeout(() => { + renameUser("carol"); + // => <div> bob is a friend of carol </div> +}, 500); +``` + +[Запустить пример](https://share.effector.dev/ijRS5TYh) diff --git a/src/content/docs/ru/api/effector-react/useProvidedScope.md b/src/content/docs/ru/api/effector-react/useProvidedScope.md new file mode 100644 index 0000000..a06415b --- /dev/null +++ b/src/content/docs/ru/api/effector-react/useProvidedScope.md @@ -0,0 +1,32 @@ +--- +title: useProvidedScope +lang: ru +--- + +Низкоуровневый Реакт хук, который возвращает текущий [Scope](/ru/api/effector/Scope) из [Provider](/ru/api/effector-react/Provider). + +:::warning{title="Это низкоуровневый API"} +Хук `useProvidedScope` это низкоуровневый API для разработчиков библиотек и не предназначен для использования в продакшен коде напрямую. + +Для использования `effector-react` в продакшен коде используейте хук [`useUnit`](/ru/api/effector-react/useUnit). +::: + +## `useProvidedScope()` + +### Возвращает (#useProvidedScope-returns) + +- [Scope](/ru/api/effector/Scope) или `null`, если `Scope` не передан. + +### Пример (#useProvidedScope-example) + +Этот хук может быть использован внутри библиотеки для обработки различных крайних случаев, где также необходимы `createWatch` и `scopeBind`. + +Для продакшен кода используйте [`useUnit`](/ru/api/effector-react/useUnit) хук. + +```tsx +const useCustomLibraryInternals = () => { + const scope = useProvidedScope(); + + // ... +}; +``` diff --git a/src/content/docs/ru/api/effector-react/useStore.md b/src/content/docs/ru/api/effector-react/useStore.md new file mode 100644 index 0000000..793fec2 --- /dev/null +++ b/src/content/docs/ru/api/effector-react/useStore.md @@ -0,0 +1,46 @@ +--- +title: useStore +description: Реакт-хук для подписки компонента на стор +lang: ru +--- + +Реакт-хук, который подписывается на [стор](/ru/api/effector/Store) и возвращает его текущее значение, поэтому при обновлении стора, компонент также будет автоматически обновлён + +```ts +useStore(store: Store<T>): T +``` + +**Аргументы** + +1. `store`: [Store](/ru/api/effector/Store) + +**Возвращает** + +(_State_) + +### Пример + +```jsx +import { createStore, createApi } from "effector"; +import { useStore } from "effector-react"; + +const $counter = createStore(0); + +const { increment, decrement } = createApi($counter, { + increment: (state) => state + 1, + decrement: (state) => state - 1, +}); + +const App = () => { + const counter = useStore($counter); + return ( + <div> + {counter} + <button onClick={increment}>Increment</button> + <button onClick={decrement}>Decrement</button> + </div> + ); +}; +``` + +[Запустить пример](https://share.effector.dev/DHzp3z4r) diff --git a/src/content/docs/ru/api/effector-react/useStoreMap.md b/src/content/docs/ru/api/effector-react/useStoreMap.md new file mode 100644 index 0000000..3313886 --- /dev/null +++ b/src/content/docs/ru/api/effector-react/useStoreMap.md @@ -0,0 +1,113 @@ +--- +title: useStoreMap +lang: ru +--- + +Реакт-хук, который подписывается на [стор](/ru/api/effector/Store) и трансформирует его значение с переданной функцией. Компонент будет обновляться только когда результат функции будет отличаться от предыдущего + +Типичный вариант использования: подписаться на изменения отдельного поля в сторе + +```ts +useStoreMap<State, Result>( + store: Store<State>, + fn: (state: State) => Result +): Result +``` + +:::info +Краткая форма `useStoreMap` добавлена в `effector-react@21.3.0` +::: + +**Аргументы** + +1. `store`: Используемый [стор](/ru/api/effector/Store) +2. `fn` (_(state) => result_): Функция-селектор + +**Возвращает** + +(_Result_) + +```ts +useStoreMap<Source, Result>({ + store: Store<Source>; + keys: any[]; + fn: (state: Source, keys: any[]) => Result; + updateFilter?: (newResult: Result, oldResult: Result) => boolean; + defaultValue?: Result; +}): Result +``` + +Перегрузка для случаев, когда требуется передать зависимости в React (для обновления элементов при изменении этих зависимостей) + +**Аргументы** + +1. `params` (_Object_): Объект конфигурации + - `store`: Используемый [стор](/ru/api/effector/Store) + - `keys` (_Array_): Массив, который будет передан в React.useMemo + - `fn` (_(state, keys) => result_): Функция-селектор + - `updateFilter` (_(newResult, oldResult) => boolean_): _Опционально_ функция, используемая для сравнения старого и нового результата работы хука, предназначено для избежания лишних ререндеров. Реализация опции для работы использует [createStore updateFilter](/ru/api/effector/createStore) + - `defaultValue`: Опциональное значение по умолчанию, используется когда `fn` возвращает undefined + +**Возвращает** + +(_Result_) + +:::info +Опция `updateFilter` добавлена в `effector-react@21.3.0` +::: + +:::info +Опция `defaultValue` добавлена в `effector-react@22.1.0` +::: + +#### Пример + +Этот хук полезен для работы со списками, особенно с большими + +```jsx +import { createStore } from "effector"; +import { useStore, useStoreMap } from "effector-react"; + +const data = [ + { + id: 1, + name: "Yung", + }, + { + id: 2, + name: "Lean", + }, + { + id: 3, + name: "Kyoto", + }, + { + id: 4, + name: "Sesh", + }, +]; + +const $users = createStore(data); +const $ids = createStore(data.map(({ id }) => id)); + +const User = ({ id }) => { + const user = useStoreMap({ + store: $users, + keys: [id], + fn: (users, [userId]) => users.find(({ id }) => id === userId), + }); + + return ( + <div> + <strong>[{user.id}]</strong> {user.name} + </div> + ); +}; + +const UserList = () => { + const ids = useStore($ids); + return ids.map((id) => <User key={id} id={id} />); +}; +``` + +[Запустить пример](https://share.effector.dev/cAZWHCit) diff --git a/src/content/docs/ru/api/effector-react/useUnit.md b/src/content/docs/ru/api/effector-react/useUnit.md new file mode 100644 index 0000000..33018de --- /dev/null +++ b/src/content/docs/ru/api/effector-react/useUnit.md @@ -0,0 +1,146 @@ +--- +title: useUnit +lang: ru +--- + +React hook, который принимает любой юнит (стор, событие или эффект) или любой объект с юнитами в качестве значений. + +В случае [сторов](/ru/api/effector/Store) этот хук подписывает компонент на предоставленный [стор](/ru/api/effector/Store) и возвращает его текущее значение, поэтому при обновлении стора компонент будет обновлен автоматически. + +В случае [событий](/ru/api/effector/Event) или [эффектов](/ru/api/effector/Effect) – привязка к текущему [_scope_](/ru/api/effector/Scope) для использования в обработчиках браузерных событий. +Только версия `effector-react/scope` работает таким образом, `useUnit` из `effector-react` является no-op для событий и не требует `Provider` с scope. + +:::info +Метод `useUnit` добавлен в effector-react 22.1.0 +::: + +## `useUnit(unit)` + +### Arguments + +1. `unit` [Событие](/ru/api/effector/Event) или [эффект](/ru/api/effector/Effect) для привязки к скоупу. + +**Returns** + +(Function): Функция для запуска юнита в скоупе компонента + +### Example + +```jsx +import { createEvent, createStore, fork } from "effector"; +import { useUnit, Provider } from "effector-react"; + +const inc = createEvent(); +const $count = createStore(0).on(inc, (x) => x + 1); + +const App = () => { + const [count, incFn] = useUnit([$count, inc]); + + return ( + <> + <p>Count: {count}</p> + <button onClick={() => incFn()}>increment</button> + </> + ); +}; + +const scope = fork(); + +render( + () => ( + <Provider value={scope}> + <App /> + </Provider> + ), + document.getElementById("root"), +); +``` + +## `useUnit(store)` + +### Arguments + +1. `store` ([_Store_](/ru/api/effector/Store)) + +**Returns** + +Текущее значение стора. + +#### Example + +```js +import { createStore, createApi } from "effector"; +import { useUnit } from "effector-react"; + +const $counter = createStore(0); + +const { increment, decrement } = createApi($counter, { + increment: (state) => state + 1, + decrement: (state) => state - 1, +}); + +const App = () => { + const counter = useUnit($counter); + + return ( + <div> + {counter} + <button onClick={increment}>Increment</button> + <button onClick={decrement}>Decrement</button> + </div> + ); +}; +``` + +## `useUnit(shape)` + +### Arguments + +1. `shape` Объект или массив содержащий любые ([_событий_](/ru/api/effector/Event), [_эффекты_](/ru/api/effector/Effect) или [_сторы_](/ru/api/effector/Store)) + +**Returns** + +(Объект или Массив): + +- В случае событий и эффектов: функции с теми же именами или ключами в качестве аргумента для передачи обработчикам событий. Эти функции запустят события и эффекты в текущем скоупе. _Примечание: события или эффекты будут привязаны к скоупу **только**, если `useUnit` импортирован из `effector-react/scope`_. +- В случае сторов: текущее значение стора. + +### Example + +```jsx +import { createStore, createEvent, fork } from "effector"; +import { useUnit, Provider } from "effector-react"; + +const inc = createEvent(); +const dec = createEvent(); + +const $count = createStore(0) + .on(inc, (x) => x + 1) + .on(dec, (x) => x - 1); + +const App = () => { + const count = useUnit($count); + const handler = useUnit({ inc, dec }); + // or + const [a, b] = useUnit([inc, dec]); + + return ( + <> + <p>Count: {count}</p> + <button onClick={() => handler.inc()}>increment</button> + <button onClick={() => handler.dec()}>decrement</button> + </> + ); +}; + +const scope = fork(); + +render( + () => ( + <Provider value={scope}> + <App /> + </Provider> + ), + document.getElementById("root"), +); +``` diff --git a/src/content/docs/ru/api/effector/Effect.md b/src/content/docs/ru/api/effector/Effect.md new file mode 100644 index 0000000..7df8776 --- /dev/null +++ b/src/content/docs/ru/api/effector/Effect.md @@ -0,0 +1,625 @@ +--- +title: Effect +keywords: + - effect + - side-effect + - unit + - эффект + - сайд-эффект + - юнит +description: Effect, его методы и свойства +lang: ru +--- + +_Effect (эффект)_ это контейнер для сайд-эффектов, возможно асинхронных. В комплекте имеет ряд заранее созданных эвентов и сторов, облегчающих стандартные действия. Является [юнитом](/ru/explanation/glossary#common-unit) + +Эффекты можно вызывать как обычные функции (_императивный вызов_) а также подключать их и их свойства в различные методы api включая [sample](/ru/api/effector/sample), [guard](/ru/api/effector/guard) и [split](/ru/api/effector/split) (_декларативное подключение_). При императивном вызове принимают максимум один аргумент и всегда возвращают промис, отражающий ход выполнения сайд-эффекта + +# Методы (#methods) + +## `use(handler)` (#use-handler) + +Определяет имплементацию эффекта: функцию, которая будет вызвана при срабатывании. Используется для случаев когда имплементация не установлена [при создании](/ru/api/effector/createEffect) или когда требуется изменение поведения эффекта при тестировании + +Если на момент вызова эффект уже имел имплементацию, то она будет заменена на новую + +:::tip{title="статья от автора"} +[Testing api calls with effects and stores](https://www.patreon.com/posts/testing-api-with-32415095) +::: + +:::info +Нужно предоставить имплементацию либо через use, либо через [createEffect](/ru/api/effector/createEffect), иначе при вызове эффекта возникнет ошибка "no handler used in _%effect name%_" +::: + +### Формула (#use-handler-formulae) + +```ts +declare const fx: Effect<T, S>; + +fx.use(/*handler*/ (params: T) => S | Promise<S>); +``` + +### Аргументы (#use-handler-arguments) + +1. **`handler`**: `(params: T) => S | Promise<S>` + + Функция-имплементация эффекта. Может быть как синхронной, так и асинхронной + + **Аргументы** + + 1. **`params`**: Данные, с которыми был вызван эффект + + **Возвращает** + + Результат выполнения эффекта в виде значения, либо в виде промиса со значением + +### Возвращает (#use-handler-return) + +Текущий эффект + +:::info +Если значение имплементации известно сразу, то оптимальнее использовать `createEffect(handler)` + +`createEffect().use(handler)` это антипаттерн, который ухудшает вывод типов +::: + +### Пример (#use-handler-example) + +```js +import { createEffect } from "effector"; + +const fetchUserReposFx = createEffect(); + +// .... + +fetchUserReposFx.use(async ({ name }) => { + console.log("fetchUserReposFx вызван для github пользователя", name); + + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +await fetchUserReposFx({ name: "zerobias" }); +// => fetchUserReposFx вызван для github пользователя zerobias +``` + +[Запустить пример](https://share.effector.dev/Vp8tPzBh) + +## `use.getCurrent()` (#use-getCurrent) + +Метод для получения текущей имплементации эффекта. Используется для тестирования + +Если у эффекта ещё не была установлена имплементация, то будет возвращена функция по умолчанию, при срабатывании она [выбрасывает ошибку](https://share.effector.dev/8PBjt3TL) + +### Формула (#getCurrent-formulae) + +```ts +declare const fx: Effect<P, D> + +fx.use.getCurrent() +-> (params: P) => D +``` + +### Возвращает (#getCurrent-return) + +Функцию-имплементацию эффекта, которая была установлена через [createEffect](/ru/api/effector/createEffect) или с помощью метода [use](#use) + +### Пример (#getCurrent-example) + +```js +const handlerA = () => "A"; +const handlerB = () => "B"; + +const fx = createEffect(handlerA); + +console.log(fx.use.getCurrent() === handlerA); +// => true + +fx.use(handlerB); +console.log(fx.use.getCurrent() === handlerB); +// => true +``` + +[Запустить пример](https://share.effector.dev/CM6hgtOM) + +## `watch(watcher)` (#watch-watcher) + +Вызывает дополнительную функцию с сайд-эффектами при каждом срабатывании эффекта + +:::info +По мере усложнения логики проекта оптимальнее заменить на комбинацию дополнительного эффекта и [sample](/ru/api/effector/sample) +::: + +### Формула (#watch-watcher-formulae) + +```ts +declare const fx: Effect<T, any> + +fx.watch(/*watcher*/ (data: T) => any) +-> Subscription +``` + +### Аргументы (#watch-watcher-arguments) + +1. **`watcher`**: `(data: T) => any` + + Функция с сайд-эффектами, в качестве первого аргумента получает значение с которым был вызван эффект. Возвращаемое значение не используется + +### Возвращает (#watch-watcher-return) + +[_Subscription_](/ru/explanation/glossary#subscription): Функция отмены подписки, после её вызова `watcher` перестаёт получать обновления и удаляется из памяти. Повторные вызовы функции отмены подписки не делают ничего + +### Пример (#watch-watcher-example) + +```js +import { createEffect } from "effector"; + +const fx = createEffect((params) => params); + +fx.watch((params) => { + console.log("эффект вызван с аргументом", params); +}); + +await fx(10); +// => эффект вызван с аргументом 10 +``` + +[Запустить пример](https://share.effector.dev/iNb7YIdV) + +## `prepend(fn)` (#prepend-fn) + +Создаёт событие-триггер для преобразования данных _перед_ запуском эффекта. По сравнению с [map](#map), работает в обратном направлении + +### Формула (#prepend-fn-formulae) + +```ts +declare const fx: Effect<S, any> + +const trigger = fx.prepend(/*fn*/(data: T) => S) +-> Event<T> +``` + +При вызове события `trigger`, функция-обработчик `fn` будет вызвана с поступившими данными, после чего `fx` будет вызван с результатом вычислений + +``` + + trigger -> fn -> fx + +``` + +### Аргументы (#prepend-fn-arguments) + +1. **`fn`**: `(data: T) => S` + + Функция-обработчик, которая будет вычислять данные для передачи в `fx` на основе данных события `trigger`. [Должна быть **чистой**](/ru/explanation/glossary#purity) + + **Аргументы** + + - **`data`**: Данные с которыми сработало событие `trigger` + + **Возвращает** + + Данные для передачи в `fx` + +### Возвращает (#prepend-fn-return) + +Новое событие + +## `map(fn)` (#map-fn) + +Создает производное событие на основе данных эффекта + +### Формула (#map-fn-formulae) + +```ts +declare const fxA: Effect<T, any> + +const eventB = fxA.map(/*fn*/(data: T) => S) +-> Event<S> +``` + +При вызове `fxA`, функция-обработчик `fn` будет вызвана с поступившими данными, после чего производное событие `eventB` будет вызвано с результатом вычислений + +``` + + fxA -> fn -> eventB + +``` + +### Аргументы (#map-fn-arguments) + +1. **`fn`**: `(data: T) => S` + + Функция-обработчик, которая будет вычислять данные для передачи в производное событие `eventB` на основе данных из `fxA`. [Должна быть **чистой**](/ru/explanation/glossary#purity) + + **Аргументы** + + - **`data`**: Данные с которыми сработал эффект `fxA` + + **Возвращает** + + Данные для передачи в производное событие `eventB` + +### Возвращает (#map-fn-return) + +Новое, производное событие + +### Пример (#map-fn-example) + +```js +import { createEffect } from "effector"; + +const updateUserFx = createEffect(({ name, role }) => {}); +const userNameUpdate = updateUserFx.map(({ name }) => name); +const userRoleUpdate = updateUserFx.map(({ role }) => role.toUpperCase()); + +userNameUpdate.watch((name) => { + console.log(`Началось изменение имени пользователя на ${name}`); +}); +userRoleUpdate.watch((role) => { + console.log(`Началось изменение роли пользователя на ${role}`); +}); + +await updateUserFx({ name: "john", role: "admin" }); +// => Началось изменение имени пользователя на john +// => Началось изменение роли пользователя на ADMIN +``` + +[Запустить пример](https://share.effector.dev/4UFLTo5p) + +# Свойства (#properties) + +## `done` (#done) + +[Событие](/ru/api/effector/Event), которое срабатывает с результатом выполнения эффекта и аргументом, переданным при вызове + +### Формула (#done-formulae) + +```ts +declare const fx: Effect<P, D> + +fx.done +-> Event<{params: P; result: D}> +``` + +:::info{title="Вызов вручную запрещён"} +Это свойство управляется самим эффектом +::: + +### Пример (#done-example) + +```js +import { createEffect } from "effector"; + +const fx = createEffect((value) => value + 1); + +fx.done.watch(({ params, result }) => { + console.log("Вызов с аргументом", params, "завершён со значением", result); +}); + +await fx(2); +// => Вызов с аргументом 2 завершён со значением 3 +``` + +[Запустить пример](https://share.effector.dev/tnSg24Ca) + +## `doneData` (#doneData) + +[Событие](/ru/api/effector/Event), которое срабатывает с результатом выполнения эффекта + +### Формула (#doneData-formulae) + +```ts +declare const fx: Effect<any, D> + +fx.doneData +-> Event<D> +``` + +:::info{title="Вызов вручную запрещён"} +Это свойство управляется самим эффектом +::: + +:::info +Добавлено в effector 20.12.0 +::: + +### Пример (#doneData-example) + +```js +import { createEffect } from "effector"; + +const fx = createEffect((value) => value + 1); + +fx.doneData.watch((result) => { + console.log(`Эффект успешно выполнился, вернув ${result}`); +}); + +await fx(2); +// => Эффект успешно выполнился, вернув 3 +``` + +[Запустить пример](https://share.effector.dev/KexWC7GO) + +## `fail` (#fail) + +[Событие](/ru/api/effector/Event), которое срабатывает с ошибкой, возникшей при выполнении эффекта и аргументом, переданным при вызове + +### Формула (#fail-formulae) + +```ts +declare const fx: Effect<P, any, E> + +fx.fail +-> Event<{params: P; error: E}> +``` + +:::info{title="Вызов вручную запрещён"} +Это свойство управляется самим эффектом +::: + +### Пример (#fail-example) + +```js +import { createEffect } from "effector"; + +const fx = createEffect(async (value) => { + throw Error(value - 1); +}); + +fx.fail.watch(({ params, error }) => { + console.log("Вызов с аргументом", params, "завершился с ошибкой", error.message); +}); + +fx(2); +// => Вызов с аргументом 2 завершился с ошибкой 1 +``` + +[Запустить пример](https://share.effector.dev/5xHVmzIJ) + +## `failData` (#failData) + +:::info +Добавлено в effector 20.12.0 +::: + +[Событие](/ru/api/effector/Event), которое срабатывает с ошибкой, возникшей при выполнении эффекта + +### Формула (#failData-formulae) + +```ts +declare const fx: Effect<any, any, E> + +fx.failData +-> Event<E> +``` + +:::info{title="Вызов вручную запрещён"} +Это свойство управляется самим эффектом +::: + +### Пример (#failData-example) + +```js +import { createEffect } from "effector"; + +const fx = createEffect(async (value) => { + throw Error(value - 1); +}); + +fx.failData.watch((error) => { + console.log(`Вызов завершился с ошибкой ${error.message}`); +}); + +fx(2); +// => Вызов завершился с ошибкой 1 +``` + +[Запустить пример](https://share.effector.dev/i5ktYSqM) + +## `finally` (#finally) + +:::info +Добавлено в effector 20.0.0 +::: + +[Событие](/ru/api/effector/Event), которое срабатывает при завершении эффекта с подробной информацией об аргументах, результатах и статусе выполнения + +### Формула (#finally-formulae) + +```ts +declare const fx: Effect<P, D, E> + +fx.finally +-> Event< + | {status: 'done'; params: P; result: D} + | {status: 'fail'; params: P; error: E} +> +``` + +:::info{title="Вызов вручную запрещён"} +Это свойство управляется самим эффектом +::: + +### Пример (#finally-example) + +```js +import { createEffect } from "effector"; + +const fetchApiFx = createEffect(async ({ time, ok }) => { + await new Promise((resolve) => setTimeout(resolve, time)); + if (ok) return `${time} ms`; + throw Error(`${time} ms`); +}); + +fetchApiFx.finally.watch((value) => { + switch (value.status) { + case "done": + console.log("Вызов с аргументом", value.params, "завершён со значением", value.result); + break; + case "fail": + console.log("Вызов с аргументом", value.params, "завершён с ошибкой", value.error.message); + break; + } +}); + +await fetchApiFx({ time: 100, ok: true }); +// => Вызов с аргументом {time: 100, ok: true} +// завершён со значением 100 ms + +fetchApiFx({ time: 100, ok: false }); +// => Вызов с аргументом {time: 100, ok: false} +// завершён с ошибкой 100 ms +``` + +[Запустить пример](https://share.effector.dev/Oqvy2x35) + +## `pending` (#pending) + +[Стор](/ru/api/effector/Store), который показывает, что эффект находится в процессе выполнения + +### Формула (#pending-formulae) + +```ts +declare const fx: Effect<any, any> + +fx.pending +-> Store<boolean> +``` + +Это свойство избавляет от необходимости писать подобный код: + +```js +import { createEffect, createStore } from "effector"; + +const requestFx = createEffect(); + +const $isRequestPending = createStore(false) + .on(requestFx, () => true) + .on(requestFx.done, () => false) + .on(requestFx.fail, () => false); +``` + +:::info{title="Изменение значения вручную запрещено"} +Это свойство управляется самим эффектом +::: + +### Пример (#pending-example) + +#### Отображение индикатора загрузки с React (#pending-example-react) + +```jsx +import React from "react"; +import ReactDOM from "react-dom"; +import { createEffect } from "effector"; +import { useStore } from "effector-react"; + +const fetchApiFx = createEffect(async (ms) => { + await new Promise((resolve) => setTimeout(resolve, ms)); +}); + +fetchApiFx.pending.watch(console.log); +// => false + +const App = () => { + const loading = useStore(fetchApiFx.pending); + return <div>{loading ? "Загрузка..." : "Загрузка завершена"}</div>; +}; + +ReactDOM.render(<App />, document.getElementById("root")); + +fetchApiFx(1000); +// => true +// => false +``` + +[Запустить пример](https://share.effector.dev/e9y5uETf) + +## `inFlight` (#inFlight) + +:::info +Добавлено в effector 20.11.0 +::: + +[Стор](/ru/api/effector/Store), который показывает число запущенных эффектов, которые находятся в процессе выполнения. Используется для ограничения числа одновременных запросов + +### Формула (#inFlight-formulae) + +```ts +declare const fx: Effect<any, any> + +fx.inFlight +-> Store<number> +``` + +Это свойство избавляет от необходимости писать подобный код: + +```js +import { createEffect, createStore } from "effector"; + +const requestFx = createEffect(); + +const $requestsInFlight = createStore(0) + .on(requestFx, (n) => n + 1) + .on(requestFx.done, (n) => n - 1) + .on(requestFx.fail, (n) => n - 1); +``` + +:::info{title="Изменение значения вручную запрещено"} +Это свойство управляется самим эффектом +::: + +### Пример (#inFlight-example) + +```js +import { createEffect } from "effector"; + +const fx = createEffect(async () => { + await new Promise((resolve) => setTimeout(resolve, 500)); +}); + +fx.inFlight.watch((amount) => { + console.log("выполняется запросов:", amount); +}); +// => выполняется запросов: 0 + +const req1 = fx(); +// => выполняется запросов: 1 + +const req2 = fx(); +// => выполняется запросов: 2 + +await Promise.all([req1, req2]); + +// => выполняется запросов: 1 +// => выполняется запросов: 0 +``` + +[Запустить пример](https://share.effector.dev/ADD0M4NV) + +## `shortName` (#shortName) + +Имя эффекта. Задаётся либо явно, через поле `name` в [createEffect](/ru/api/effector/createEffect), либо автоматически через [babel plugin](/ru/api/effector/babel-plugin). Используется для обработки сущностей программно, например при использовании [хуков домена](/ru/api/effector/Domain#onCreateEffect) + +### Формула (#shortName-formulae) + +```ts +declare const fx: Effect<any, any> + +fx.shortName +-> string +``` + +## `sid` (#sid) + +Стабильный идентификатор эффекта. Задаётся автоматически через [Babel plugin](/ru/api/effector/babel-plugin) + +### Формула (#sid-formulae) + +```ts +declare const fx: Effect<any, any> + +fx.sid +-> string | null +``` diff --git a/src/content/docs/ru/api/effector/Event.md b/src/content/docs/ru/api/effector/Event.md new file mode 100644 index 0000000..5ce089a --- /dev/null +++ b/src/content/docs/ru/api/effector/Event.md @@ -0,0 +1,407 @@ +--- +title: Event +keywords: + - event + - unit + - message + - command + - событие + - юнит + - сообщение + - команда +description: Event, его методы и свойства +lang: ru +--- + +_Event (событие, эвент)_ это декларация намерения сделать что-либо: запустить вычисления, отправить сообщение другой секции приложения или обновить состояния в приложении. Одна из основных управляющих сущностей, при срабатывании запускает цепочки реактивных вычислений в приложении. Является [юнитом](/ru/explanation/glossary#common-unit) + +События можно вызывать как обычные функции (_императивный вызов_) а также подключать в различные методы api включая [sample](/ru/api/effector/sample), [guard](/ru/api/effector/guard) и [split](/ru/api/effector/split) (_декларативное подключение_). При императивном вызове принимают максимум один аргумент и всегда возвращают переданные данные + +# Методы (#methods) + +## `map(fn)` (#map-fn) + +Создает производное событие на основе данных из исходного + +### Формула (#map-fn-formulae) + +```ts +declare const eventA: Event<T> + +const eventB = eventA.map(/*fn*/(data: T) => S) +-> Event<S> +``` + +При вызове исходного события `eventA`, функция-обработчик `fn` будет вызвана с поступившими данными, после чего производный эвент `eventB` будет вызван с результатом вычислений + +``` + + eventA -> fn -> eventB + +``` + +### Аргументы (#map-fn-arguments) + +1. **`fn`**: `(data: T) => S` + + Функция-обработчик, которая будет вычислять данные для передачи в производное событие `eventB` на основе данных из исходного эвента `eventA`. [Должна быть **чистой**](/ru/explanation/glossary#purity) + + **Аргументы** + + - **`data`**: Данные с которыми сработало исходное событие `eventA` + + **Возвращает** + + Данные для передачи в производное событие `eventB` + +### Возвращает (#map-fn-returns) + +Новое, производное событие + +### Пример (#map-fn-example) + +```js +import { createEvent } from "effector"; + +const updateUser = createEvent(); +const userNameUpdated = updateUser.map(({ name }) => name); +const userRoleUpdated = updateUser.map(({ role }) => role.toUpperCase()); + +userNameUpdated.watch((name) => console.log(`Имя пользователя изменено на ${name}`)); +userRoleUpdated.watch((role) => console.log(`Роль пользователя изменена на ${role}`)); + +updateUser({ name: "john", role: "admin" }); +// => Имя пользователя изменено на john +// => Роль пользователя изменена на ADMIN +``` + +[Запустить пример](https://share.effector.dev/U3w3dlbO) + +## `prepend(fn)` (#prepend-fn) + +Создаёт событие-триггер для преобразования данных _перед_ запуском исходного эвента. По сравнению с [map](#map), работает в обратном направлении + +### Формула (#prepend-fn-formulae) + +```ts +declare const targetEvent: Event<S> + +const trigger = targetEvent.prepend(/*fn*/(data: T) => S) +-> Event<T> +``` + +При вызове события `trigger`, функция-обработчик `fn` будет вызвана с поступившими данными, после чего эвент `targetEvent` будет вызван с результатом вычислений + +``` + + trigger -> fn -> targetEvent + +``` + +### Аргументы (#prepend-fn-arguments) + +1. **`fn`**: `(data: T) => S` + + Функция-обработчик, которая будет вычислять данные для передачи в исходное событие `targetEvent` на основе данных эвента `trigger`. [Должна быть **чистой**](/ru/explanation/glossary#purity) + + **Аргументы** + + - **`data`**: Данные с которыми сработало событие `trigger` + + **Возвращает** + + Данные для передачи в исходное событие `targetEvent` + +### Возвращает (#prepend-fn-returns) + +Новое событие + +### Пример (#prepend-fn-example) + +##### Пример использования (#prepend-fn-examples-usage) + +```js +import { createEvent } from "effector"; + +const userPropertyChanged = createEvent(); + +userPropertyChanged.watch(({ field, value }) => { + console.log(`Свойство пользователя "${field}" изменено на ${value}`); +}); + +const changeName = userPropertyChanged.prepend((name) => ({ + field: "name", + value: name, +})); +const changeRole = userPropertyChanged.prepend((role) => ({ + field: "role", + value: role.toUpperCase(), +})); + +changeName("john"); +// => Свойство пользователя "name" изменено на john + +changeRole("admin"); +// => Свойство пользователя "role" изменено на ADMIN + +changeName("alice"); +// => Свойство пользователя "name" изменено на alice +``` + +[Запустить пример](https://share.effector.dev/ets1GxTA) + +## `filterMap(fn)` (#filterMap-fn) + +Создает производное событие на основе данных из исходного с возможностью отмены вызова + +:::info +Метод добавлен в effector 20.0.0 +::: + +### Формула (#filterMap-formulae) + +```ts +declare const eventA: Event<T> + +const eventB = eventA.filterMap( + /*fn*/ (data: T) => S | void +) +-> Event<S> +``` + +При вызове исходного события `eventA`, функция-обработчик `fn` будет вызвана с поступившими данными, после чего, если функция вернула не _undefined_, производный эвент `eventB` будет вызван с результатом вычислений + +``` + + eventA -> fn -> eventB + +``` + +:::info +Если требуется только фильтрация вызовов без трансформации данных, то оптимальнее использовать [guard](/ru/api/effector/guard) +::: + +### Аргументы (#filterMap-fn-arguments) + +1. **`fn`**: `(data: T) => S | void` + + Функция-обработчик, которая будет вычислять данные для передачи в производное событие `eventB` на основе данных из исходного эвента `eventA`. [Должна быть **чистой**](/ru/explanation/glossary#purity) + + **Аргументы** + + - **`data`**: Данные с которыми сработало исходное событие `eventA` + + **Возвращает** + + Данные для передачи в производное событие `eventB` либо _undefined_, если вызов `eventB` не требуется + +### Возвращает (#filterMap-fn-returns) + +Новое, производное событие + +### Пример (#filterMap-fn-example) + +#### Использование с методами JavaScript возвращающими undefined (#filterMap-fn-example-usage-with-functions-returning-undefined) + +```jsx +const listReceived = createEvent<string[]>() +const effectorFound = listReceived.filterMap(list => list.find(name => name === 'effector')) + +effectorFound.watch(name => console.info("found", name)) +listReceived(["redux", "effector", "mobx"]) // found effector +listReceived(["redux", "mobx"]) +``` + +[Запустить пример](https://share.effector.dev/ARDanMAM) + +#### Использование c nullable React ref (#filterMap-fn-example-usage-with-nullable-ref) + +:::info +Методы _modal.showModal_ и _modal.close_ – стандартные возможности dom-элемента `<dialog>` + +[Статья в MDN](https://developer.mozilla.org/en-US/docs/Web/API/HTMLDialogElement/showModal) про _showModal_ +::: + +```jsx +import React from "react"; +import { createEvent, createStore } from "effector"; + +const openModal = createEvent(); +const closeModal = createEvent(); + +const openModalUnboxed = openModal.filterMap((ref) => { + if (ref.current) return ref.current; +}); +const closeModalUnboxed = closeModal.filterMap((ref) => { + if (ref.current) return ref.current; +}); + +openModalUnboxed.watch((modal) => modal.showModal()); +closeModalUnboxed.watch((modal) => modal.close()); + +const App = () => { + const modalRef = React.useRef(null); + return ( + <> + <dialog ref={modalRef}> + <form method="dialog"> + <fieldset> + <legend>Модальное окно</legend> + Нажмите для закрытия + <button onSubmit={() => closeModal(modalRef)} type="submit"> + ❌ + </button> + </fieldset> + </form> + </dialog> + + <button onClick={() => openModal(modalRef)}>Открыть модальное окно</button> + </> + ); +}; +``` + +[Запустить пример](https://share.effector.dev/OzA9AbpY) + +## `filter({fn})` (#filter-fn) + +Создает производное событие с возможностью отмены вызова + +:::tip +Более гибким способом фильтрации является [sample](/ru/api/effector/sample), рекомендуется использовать именно его. +::: + +### Формула (#filter-fn-formulae) + +```ts +declare const eventA: Event<T> + +const eventB = eventA.filter(/*config*/ {fn: (data: T) => boolean}) +-> Event<T> +``` + +При вызове исходного события `eventA`, функция-обработчик `fn` будет вызвана с поступившими данными, после чего, если функция вернула [истинное значение](https://developer.mozilla.org/ru/docs/Glossary/Truthy), производный эвент `eventB` будет вызван с теми же данными + +### Аргументы (#filter-fn-arguments) + +1. **`config`**: Объект конфигурации + + - **`fn`**: `(data: T) => boolean` + + Функция-предикат, которая определяет необходимость вызова производного события `eventB` возвращая [истинное значение](https://developer.mozilla.org/ru/docs/Glossary/Truthy),[должна быть **чистой**](/ru/explanation/glossary#purity) + +### Возвращает (#filter-fn-returns) + +Новое, производное событие + +:::info +Объектная форма аргумента используется потому что _event.filter(fn)_ был сокращённой формой [_filterMap_](#filterMap) +::: + +### Пример (#filter-fn-example) + +```js +import { createEvent, createStore } from "effector"; + +const numbers = createEvent(); + +const positiveNumbers = numbers.filter({ + fn: ({ x }) => x > 0, +}); + +const $lastPositive = createStore(0).on(positiveNumbers, (n, { x }) => x); + +$lastPositive.watch((x) => { + console.log("последнее положительное значение:", x); +}); + +// => последнее положительное значение: 0 + +numbers({ x: 0 }); +// ничего не произошло + +numbers({ x: -10 }); +// ничего не произошло + +numbers({ x: 10 }); +// => последнее положительное значение: 10 +``` + +[Запустить пример](https://share.effector.dev/NjKNAxmz) + + +## `watch(watcher)` (#watch-watcher) + +Вызывает функцию с сайд-эффектами при каждом срабатывании события + +:::info +По мере усложнения логики проекта оптимальнее заменить на комбинацию [эффекта](/ru/api/effector/Effect) и [sample](/ru/api/effector/sample) +::: + +### Формула (#watch-watcher-formulae) + +```ts +declare const event: Event<T> + +event.watch(/*watcher*/ (data: T) => any) +-> Subscription +``` + +### Аргументы (#watch-watcher-arguments) + +1. **`watcher`**: `(data: T) => any` + + Функция с сайд-эффектами, в качестве первого аргумента получает значение с которым было вызвано событие. Возвращаемое значение не используется + +### Возвращает (#watch-watcher-returns) + +[_Subscription_](/ru/explanation/glossary#subscription): Функция отмены подписки, после её вызова `watcher` перестаёт получать обновления и удаляется из памяти. Повторные вызовы функции отмены подписки не делают ничего + +### Пример (#watch-watcher-example) + +```js +import { createEvent } from "effector"; + +const sayHi = createEvent(); +const stop = sayHi.watch((name) => { + console.log(`Привет, ${name}!`); +}); + +sayHi("Боб"); +// => Привет, Боб! + +stop(); + +sayHi("Алиса"); +// => ничего не произошло +``` + +[Запустить пример](https://share.effector.dev/FeEWVUbj) + +# Свойства (#properties) + +## `shortName` (#shortName) + +Имя события. Задаётся либо явно, через поле `name` [в createEvent](/ru/api/effector/createEvent), либо автоматически через [Babel plugin](/ru/api/effector/babel-plugin). Используется для обработки сущностей программно, например при использовании [хуков домена](/ru/api/effector/Domain#onCreateEvent) + +### Формула (#shortName-formulae) + +```ts +declare const event: Event<any> + +event.shortName +-> string +``` + +## `sid` (#sid) + +Стабильный идентификатор события. Задаётся автоматически через [Babel plugin](/ru/api/effector/babel-plugin) + +### Формула (#sid-formulae) + +```ts +declare const event: Event<any> + +event.sid +-> string | null +``` diff --git a/src/content/docs/ru/api/effector/Scope.md b/src/content/docs/ru/api/effector/Scope.md new file mode 100644 index 0000000..c8d70f9 --- /dev/null +++ b/src/content/docs/ru/api/effector/Scope.md @@ -0,0 +1,104 @@ +--- +title: Scope +description: Независимый изолированный инстанс приложения +lang: ru +--- + +Независимый изолированный инстанс приложения, содержит копию всех юнитов (включая связи между ними) и основные методы для доступа к ним. + +Основные области применения – реализация SSR и тестирование приложения. + +Scope может быть создан с помощью [fork](/ru/api/effector/fork) + +## Формула + +```ts +interface Scope { + getState<T>(store: Store<T>): T; +} +``` + +## Методы (#methods) + +### getState + +Возвращает значение [стора](/ru/api/effector/Store) в данном scope + +```ts +scope.getState<T>(store: Store<T>): T +``` + +#### Пример использования getState + +Создание двух инстансов приложения, вызов событий в них и проверка сохранения значения стора `$counter` в каждом из них + +```js +import { createStore, createEvent, createDomain, forward, fork, allSettled } from "effector"; + +const domain = createDomain(); +const inc = domain.createEvent(); +const dec = domain.createEvent(); +const $counter = domain + .createStore(0) + .on(inc, (value) => value + 1) + .on(dec, (value) => value - 1); + +const scopeA = fork(domain); +const scopeB = fork(domain); + +await allSettled(inc, { scope: scopeA }); +await allSettled(dec, { scope: scopeB }); + +console.log($counter.getState()); // => 0 +console.log(scopeA.getState($counter)); // => 1 +console.log(scopeB.getState($counter)); // => -1 +``` + +[Запустить пример](https://share.effector.dev/0grlV3bA) + +## Императивные вызовы эффектов и scope + +Если эффект вызывает другие эффекты, то он может вызывать **только** эффекты, а не обычные асинхронные функции, и вызовы эффектов должны иметь await: + +**Правильно**, эффект без внутренних эффектов: + +```js +const delayFx = app.createEffect(async () => { + await new Promise((rs) => setTimeout(rs, 80)); +}); +``` + +**Правильно**, эффект с внутренними эффектами: + +```js +const authUserFx = app.createEffect(); +const sendMessageFx = app.createEffect(); + +const sendWithAuthFx = app.createEffect(async () => { + await authUserFx(); + await delayFx(); + await sendMessageFx(); +}); +``` + +**Неправильно**, эффект с внутренними эффектами после обычных асинхронных вызовов: + +```js +const sendWithAuthFx = app.createEffect(async () => { + await authUserFx(); + //НЕ ПРАВИЛЬНО! этот код следует сделать отдельным эффектом delayFx + await new Promise((rs) => setTimeout(rs, 80)); + //потеря контекста + await sendMessageFx(); +}); +``` + +Таким образом, любой эффект может либо вызывать другой эффект, либо выполнять некоторые асинхронные вычисления, но не то и другое + +:::tip +Вместо императивных вызовов оптимальнее использовать [attach](/ru/api/effector/attach) +::: + +:::warning +Императивные вызовы эффектов поддерживаются только в обработчиках других эффектов, **не** в `watch` функциях +::: diff --git a/src/content/docs/ru/api/effector/Store.md b/src/content/docs/ru/api/effector/Store.md new file mode 100644 index 0000000..263fc34 --- /dev/null +++ b/src/content/docs/ru/api/effector/Store.md @@ -0,0 +1,685 @@ +--- +title: Store +description: Store, его методы и свойства +lang: ru +--- + +_Store (стор)_ – это объект, который хранит значение состояния, то есть какие-либо данные. Стор обновляется при получении значения, которое не равно (`!==`) текущему и `undefined`. Является [юнитом](/ru/explanation/glossary#common-unit) + +<br /> +<br /> + +# Методы (#methods) + +## `map(fn)` (#map-fn) + +Создает производный стор на основе данных из исходного + +### Формула (#map-fn-formulae) + +```ts +declare const $first: Store<T>; // исходный стор + +let $second: Store<S>; // производный стор + +$second = $first.map(/*fn*/ (state: T) => S); +``` + +При обновлении исходного стора `$first`, функция-обработчик `fn` будет вызвана с новым состоянием `$first` и последним состоянием `$second`, результат вычислений будет сохранён в производном сторе `$second`, то есть реактивно обновит его значение + +:::info +С версии [effector 21.8.0](https://github.com/effector/effector/releases/tag/effector%4021.8.0) второй аргумент функции `fn` и `firstState` были депрекейтнуты, вместо этого используйте [updateFilter](/ru/api/effector/createStore) или создание нового стора с помощью `createStore`. +::: + +### Аргументы (#map-fn-arguments) + +1. **`fn`**: `(state: T) => S` + + Функция-обработчик, которая будет вычислять новое состояние производного стора `$second` на основе значения исходного стора `$first`. Функция также генерирует и исходное состояние стора, поэтому в первый раз запускается в момент вызова `.map`, то есть ещё до создания производного стора. [Должна быть **чистой**](/ru/explanation/glossary#purity) + + **Аргументы** + + - **`state`**: Текущее состояние исходного стора `$first` на момент начала работы `fn` + + **Возвращает** + + Новое значение для хранения в производном сторе `$second`. Если функция возвращает undefined или текущее состояние производного стора, то обновления не будет + +### Возвращает (#map-fn-returns) + +Новый, производный стор + +### Пример (#map-fn-example) + +```js +import { createEvent, createStore } from "effector"; + +const changed = createEvent(); +const title = createStore("").on(changed, (_, newTitle) => newTitle); +const length = title.map((title) => title.length); + +length.watch((length) => { + console.log("длина строки", length); +}); +// => длина строки 0 + +changed("hello"); +// => длина строки 5 + +changed("world"); +// ничего не произошло + +changed("hello world"); +// => длина строки 11 +``` + +[Запустить пример](https://share.effector.dev/NmQAHZny) + +## `on(trigger, reducer)` (#on-trigger-reducer) + +Обновляет состояние стора с помощью функции-обработчика при срабатывании триггера + +### Формула (#on-trigger-reducer-formulae) + +```ts +declare const $store: Store<T>; // обновляемый стор + +declare const event: Event<S>; // триггер обновления +declare const fx: Effect<S, any>; // триггер обновления +declare const $storeB: Store<S>; // триггер обновления + +$store.on(/*clock*/ event, /*fn*/ (state: T, data: S) => T); +$store.on(/*clock*/ fx, /*fn*/ (state: T, data: S) => T); +$store.on(/*clock*/ $storeB, /*fn*/ (state: T, data: S) => T); +$store.on(/*clock*/ [event, fx, $storeB], /*fn*/ (state: T, data: S) => T); +``` + +### Аргументы (#on-trigger-reducer-arguments) + +1. **`trigger`**: [Юнит](/ru/explanation/glossary#common-unit) или массив юнитов + + Триггер начала вычисления или несколько триггеров. Для каждого триггера последний установленный обработчик будет заменять предыдущие обработчики (полезно для динамического поведения) + + **Разновидности**: + + - **событие или эффект**: срабатывание этого события/эффекта будет запускать обновление `$store` + - **стор**: обновление этого стора будет запускать обновление `$store` + - **массив юнитов**: срабатывание любого из юнитов будет запускать обновление `$store` + +2. **`reducer`**: `(state: T, data: S) => T` + + Функция-обработчик, которая будет вычислять новое состояние `$store` на основе его предыдущего состояния и данных из `trigger`, [должна быть **чистой**](/ru/explanation/glossary#purity) + + **Аргументы** + + - **`state`**: Текущее состояние стора на момент начала работы `fn` + - **`data`**: Данные, принятые от сработавшего `trigger` + + **Разновидности**, в зависимости от типа сработавшего `trigger`: + + - **событие**: значение, с которым было вызвано событие + - **эффект**: значение, с которым был вызван эффект + - **стор**: новое значение стора + + **Возвращает** + + Новое значение для хранения в `$store`. Если функция возвращает undefined или текущее состояние стора, то обновления не будет + +### Возвращает (#on-trigger-reducer-returns) + +Текущий стор + +:::info +Поддержка массивов в `trigger` добавлена в effector 20.15.0 +::: + +### Пример (#on-trigger-reducer-example) + +```js +import { createEvent, createStore } from "effector"; + +const store = createStore(0); +const trigger = createEvent(); + +store.on(trigger, (state, data) => state + data); + +store.watch((value) => { + console.log(value); +}); +// => 0 + +trigger(2); +// => 2 + +trigger(2); +// => 4 +``` + +[Запустить пример](https://share.effector.dev/HLeTYPlO) + +##### Использование массива юнитов в `trigger` (#on-trigger-reducer-example-trigger-array) + +```js +import { createEvent, createStore } from "effector"; + +const store = createStore(0); +const triggerA = createEvent(); +const triggerB = createEvent(); + +store.on([triggerA, triggerB], (state, data) => state + data); + +store.watch((value) => { + console.log(value); +}); +// => 0 + +triggerA(2); +// => 2 + +triggerB(2); +// => 4 +``` + +[Запустить пример](https://share.effector.dev/KDmGet6T) + +## `watch(watcher)` (#watch-watcher) + +Вызывает функцию с сайд-эффектами при каждом обновлении стора. В первый раз вызывается сразу же при создании, с текущим значением стора + +:::info +По мере усложнения логики проекта оптимальнее заменить на комбинацию [эффекта](/ru/api/effector/Effect) и [sample](/ru/api/effector/sample) +::: + +### Формула (#watch-watcher-formulae) + +```ts +declare const $store: Store<T> + +$store.watch(/*watcher*/ (state: T) => any) +-> Subscription +``` + +### Аргументы (#watch-watcher-arguments) + +- **`watcher`**: `(state: T) => any` + + Функция с сайд-эффектами, получает текущее состояние стора в качестве первого аргумента. Возвращаемое значение не используется + +### Возвращает (#watch-watcher-returns) + +[_Subscription_](/ru/explanation/glossary#subscription): Функция отмены подписки, после её вызова `watcher` перестаёт получать обновления и удаляется из памяти. Повторные вызовы функции отмены подписки не делают ничего + +### Пример (#watch-watcher-example) + +```js +const add = createEvent(); +const store = createStore(0).on(add, (state, payload) => state + payload); + +store.watch((value) => { + console.log(`текущее значение: ${value}`); +}); +// => текущее значение: 0 + +add(4); +// => текущее значение: 4 + +add(3); +// => текущее значение: 7 +``` + +[Запустить пример](https://share.effector.dev/AJzyxwnx) + +## `reset(...triggers)` (#reset-triggers) + +Сбрасывает состояние стора к [исходному значению](#defaultState) при срабатывании триггера + +### Формула (#reset-triggers-formulae) + +```ts +declare const $store: Store<T>; // обновляемый стор + +declare const event: Event<any>; // триггер обновления +declare const fx: Effect<any, any>; // триггер обновления +declare const $storeB: Store<any>; // триггер обновления + +$store.reset(/*clock*/ event); +$store.reset(/*clock*/ fx); +$store.reset(/*clock*/ $storeB); +$store.reset(/*clock*/ [event, fx, $storeB]); +$store.reset(/*clock*/ ...[event, fx, $storeB]); +``` + +### Аргументы (#reset-triggers-arguments) + +- **`trigger`**: [Юнит](/ru/explanation/glossary#common-unit) или массив юнитов + + Триггер запуска обновления стора или несколько триггеров. Если на момент срабатывания стор уже находится в исходном состоянии, то обновления не будет + + **Разновидности**: + + - **событие или эффект**: срабатывание этого события/эффекта будет запускать обновление `$store` + - **стор**: обновление этого стора будет запускать обновление `$store` + - **массив юнитов**: срабатывание любого из юнитов будет запускать обновление `$store` + +### Возвращает (#reset-triggers-returns) + +Текущий стор + +:::info +Поддержка массивов в `trigger` добавлена в effector 20.15.0 +::: + +### Пример (#reset-triggers-example) + +```js +import { createEvent, createStore } from "effector"; + +const store = createStore(0); +const increment = createEvent(); +const resetTrigger = createEvent(); + +store.on(increment, (state) => state + 1); +store.reset(resetTrigger); + +store.watch((state) => { + console.log(state); +}); +// => 0 + +increment(); +// => 1 + +increment(); +// => 2 + +resetTrigger(); +// => 0 + +resetTrigger(); +// ничего не произошло (стор уже находится в исходном состоянии) +``` + +[Запустить пример](https://share.effector.dev/Ms4nlZiJ) + +##### Использование массива юнитов в `trigger` (#reset-triggers-example-triggers-array) + +```js +import { createEvent, createStore } from "effector"; + +const store = createStore(0); +const increment = createEvent(); +const triggerA = createEvent(); +const triggerB = createEvent(); + +store.on(increment, (state) => state + 1); +store.reset([triggerA, triggerB]); + +store.watch((state) => { + console.log(state); +}); +// => 0 + +increment(); +// => 1 + +increment(); +// => 2 + +triggerA(); +// => 0 + +triggerB(); +// ничего не произошло (стор уже находится в исходном состоянии) +``` + +[Запустить пример](https://share.effector.dev/4pJEOFiM) + +## `off(trigger)` (#off-trigger) + +Удаляет обработчик для данного триггера, который был установлен через [.on](#on) или [.reset](#reset). Если для данного триггера не было обработчика, этот метод ничего не делает + +```ts +declare const $store: Store<any>; // обновляемый стор + +declare const event: Event<any>; // триггер обновления +declare const fx: Effect<any, any>; // триггер обновления +declare const $storeB: Store<any>; // триггер обновления + +$store.off(/*clock*/ event); +$store.off(/*clock*/ fx); +$store.off(/*clock*/ $storeB); +``` + +### Аргументы (#off-trigger-arguments) + +- **`trigger`**: [Юнит](/ru/explanation/glossary#common-unit)-триггер + +### Возвращает (#off-trigger-returns) + +Текущий стор + +### Пример (#off-trigger-example) + +```js +import { createEvent, createStore } from "effector"; + +const click = createEvent(); +const $clicks = createStore(0); + +$clicks.on(click, (n) => n + 1); + +$clicks.watch((n) => { + console.log(n); +}); +// => 0 + +click(); +// => 1 + +$clicks.off(click); + +click(); +// ничего не произошло +``` + +[Запустить пример](https://share.effector.dev/FeMrtQn3) + +## `thru(fn)` (#thru-fn) + +Вызывает функцию с заданным стором и возвращает результат как есть. Используется для последовательных трансформаций заранее описанными функциями пока в javascript не добавлен [pipeline proposal](https://github.com/tc39/proposal-pipeline-operator) + +### Формула (#thru-fn-formulae) + +```ts +declare const $store: Store<T>; + +const result: S = $store.thru(/*fn*/ (store: Store<T>) => S); +``` + +### Аргументы (#thru-fn-arguments) + +- **`fn`**: `(store: Store<T>) => S` + + Функция, которая получает сам стор в аргументы и возвращает некоторое значение, [должна быть **чистой**](/ru/explanation/glossary#purity) + +### Возвращает (#thru-fn-returns) + +Любое значение, которое вернёт `fn` + +### Пример (#thru-fn-example) + +```js +import { createStore, createEvent } from "effector"; + +const enhance = (fn) => (store) => store.map(fn); + +const inc = createEvent(); +const $num = createStore(1); + +$num.on(inc, (n) => n + 1); + +//prettier-ignore +const $result = $num + .thru(enhance(x => x + 1)) + .thru(enhance(x => x * 10)) + +$num.watch((n) => { + console.log("num", n); +}); +// => num 1 + +$result.watch((n) => { + console.log("result", n); +}); +// => result 20 + +inc(); +// => num 2 +// => result 30 +``` + +[Запустить пример](https://share.effector.dev/RRSyqVus) + +# Свойства (#properties) + +## `updates` (#updates) + +Дочернее событие стора, будет вызвано при каждом обновлении стора. Используется только для определения сайд-эффектов через _store.updates.watch_, где будут срабатывать начиная с первого обновления, в отличие от [_store.watch_](#watch), обработчики в котором запускаются при создании немедленно + +:::warning{title="Вызов вручную запрещён"} +Это свойство управляется самим стором. +::: + +:::info +По мере усложнения логики проекта оптимальнее заменить на комбинацию эффекта и [sample](/ru/api/effector/sample) +::: + +### Формула (#updates-formulae) + +```ts +declare const $store: Store<T> + +$store.updates +-> Event<T> +``` + +### Пример (#updates-example) + +##### Вызов сайд-эффектов начиная с первого обновления (#updates-skip-init-example) + +```js +import { createStore, createEvent } from "effector"; + +const click = createEvent(); +const clicksAmount = createStore(0); + +clicksAmount.on(click, (n) => n + 1); + +clicksAmount.watch((amount) => { + console.log("вызов с текущим состоянием, включая исходное", amount); +}); + +// => вызов с текущим состоянием, включая исходное 0 + +clicksAmount.updates.watch((amount) => { + console.log("вызов с текущим состоянием, начиная с первого обновления", amount); +}); + +// ничего не произошло + +click(); +// => вызов с текущим состоянием, включая исходное 1 +// => вызов с текущим состоянием, начиная с первого обновления 1 +``` + +[Запустить пример](https://share.effector.dev/X6E8sJqo) + +## `shortName` (#shortName) + +Имя стора. Задаётся либо явно, через поле `name` в [createStore](/ru/api/effector/createStore), либо автоматически через [Babel plugin](/ru/api/effector/babel-plugin). Используется для обработки сущностей программно, например при использовании [хуков домена](/ru/api/effector/Domain#onCreateStore) + +### Формула (#shortName-formulae) + +```ts +declare const $store: Store<any> + +$store.shortName +-> string +``` + +### Пример (#shortName-example) + +```js +import { createDomain, createEvent } from "effector"; + +const increment = createEvent(); + +const storesDomain = createDomain(); + +storesDomain.onCreateStore((store) => { + console.log(`создан стор '${store.shortName}'`); + store.watch((value) => { + console.log(`значение стора '${store.shortName}':`, value); + }); +}); + +const $foo = storesDomain.createStore(0, { name: "foo" }); +// => создан стор 'foo' +// => значение стора 'foo': 0 +const $bar = storesDomain.createStore(0, { name: "bar" }); +// => создан стор 'bar' +// => значение стора 'bar': 0 +$foo.on(increment, (n) => n + 1); + +increment(); +// => значение стора 'foo': 1 +``` + +[Запустить пример](https://share.effector.dev/CspgMvEI) + +## `defaultState` (#defaultState) + +Начальное состояние стора, то, с которым он создавался. К этому состоянию будет возвращать метод [reset](#reset-triggers) + +### Формула (#defaultState-formulae) + +```ts +declare const $store: Store<T> + +$store.defaultState +-> T +``` + +### Пример (#defaultState-example) + +```ts +const $store = createStore("DEFAULT"); + +console.log($store.defaultState === "DEFAULT"); +// => true +``` + +## `sid` (#sid) + +Стабильный идентификатор стора. Задаётся автоматически через [Babel plugin](/ru/api/effector/babel-plugin) + +### Формула (#sid-formulae) + +```ts +declare const $store: Store<any> + +$store.sid +-> string | null +``` + +# Дополнительные методы + +## `getState()` (#getState) + +Возвращает текущее значение стора + +:::warning{title="Опасно использовать в своем коде"} + +`.getState` **порождает трудноотлаживаемый императивный код и состояния гонки данных** + +Оптимальнее использовать декларативные методы: + +- [**sample**](/ru/api/effector/sample) для использования данных из стора в других вычислениях +- [**attach**](/ru/api/effector/attach) для передачи данных в эффекты + +::: + +### Формула (#getState-formulae) + +```ts +declare const $store: Store<T>; + +const currentValue: T = $store.getState(); +``` + +### Пример (#getState-example) + +```js +import { createEvent, createStore } from "effector"; + +const add = createEvent(); + +const $number = createStore(0); + +$number.on(add, (state, data) => state + data); + +$number.watch((n) => { + console.log(n); +}); +// => 0 + +add(2); +// => 2 + +add(3); +// => 5 +``` + +[Запустить пример](https://share.effector.dev/YrnlMuRj) + +## `watch(trigger, watcher)` (#watch-trigger-watcher) + +Сокращённая запись для описания сайд-эффекта, который необходимо запускать только при срабатывании определённого триггера и в котором необходимо как состояние стора так и данные из триггера + +:::info +По мере усложнения логики проекта оптимальнее заменить на [attach](/ru/api/effector/attach) +::: + +### Формула (#watch-trigger-watcher-formulae) + +```ts +declare const $store: Store<T> +declare const trigger: Event<S> + +$store.watch( + /*clock*/ trigger, + /*fn*/ (state: T, data: S) => any, +) +-> Subscription +``` + +### Аргументы (#watch-trigger-watcher-arguments) + +1. **`trigger`**: [Юнит](/ru/explanation/glossary#common-unit)-триггер +2. **`fn`**: `(state: T, data: S) => any` + + Функция с сайд-эффектами. Возвращаемое значение не используется + + **Аргументы** + + - **`state`**: Текущее состояние стора на момент начала работы `fn` + - **`data`**: Данные, принятые от сработавшего `trigger` + +### Возвращает (#watch-trigger-watcher-returns) + +[_Subscription_](/ru/explanation/glossary#subscription): Функция отмены подписки + +### Пример (#watch-trigger-watcher-example) + +```js +import { createEvent, createStore } from "effector"; + +const foo = createEvent(); +const bar = createEvent(); + +const store = createStore(0); + +store.watch(foo, (storeValue, eventValue) => { + console.log(`triggered ${storeValue}, ${eventValue}`); +}); + +foo(1); +// => triggered 0, 1 + +bar(2); + +foo(3); +// => triggered 0, 3 +``` + +[Запустить пример](https://share.effector.dev/xEltaFyH) diff --git a/src/content/docs/ru/api/effector/babel-plugin.md b/src/content/docs/ru/api/effector/babel-plugin.md new file mode 100644 index 0000000..e12d847 --- /dev/null +++ b/src/content/docs/ru/api/effector/babel-plugin.md @@ -0,0 +1,248 @@ +--- +title: Babel plugin +lang: ru +--- + +Встроенный плагин для babel, который можно использовать для ssr и отладки. Он вставляет имя юнита, выводимое из имени переменной, и `sid` (стабильный идентификатор), вычисляемый по расположению в исходном коде. + +К примеру, в случае [эффектов без обработчиков](/ru/api/effector/Effect#use-handler), это улучшит сообщение об ошибке, четко показывая, в каком эффекте произошла ошибка. + +```js +import { createEffect } from "effector"; + +const fetchFx = createEffect(); + +fetchFx(); + +// => no handler used in fetchFx +``` + +[Запустить пример](https://share.effector.dev/Yb8vQ1Ly) + +## Использование + +В простейшем случае его можно использовать без какой-либо настройки: + +```json +// .babelrc +{ + "plugins": ["effector/babel-plugin"] +} +``` + +### sid + +:::info +Добавлено в effector 20.2.0 +::: + +Стабильный идентификатор для событий, эффектов, сторов и доменов, сохраняемый между окружениями, для обработки клиент-серверного взаимодействия в рамках одной кодовой базы. +Ключевым преимуществом является то, что sid может быть автоматически сгенерирован через `effector/babel-plugin` с конфигурацией по умолчанию и будет стабилен между сборками. + +[Пример проекта](https://github.com/effector/effector/tree/master/examples/worker-rpc) + +```js +// common.js +import { createEffect } from "effector"; + +export const getUser = createEffect({ sid: "GET /user" }); +console.log(getUsers.sid); +// => GET /user +``` + +```js +// worker.js +import { getUsers } from "./common.js"; + +getUsers.use((userID) => fetch(userID)); + +getUsers.done.watch(({ result }) => { + postMessage({ sid: getUsers.sid, result }); +}); + +onmessage = async ({ data }) => { + if (data.sid !== getUsers.sid) return; + getUsers(data.userID); +}; +``` + +```js +// client.js +import { createEvent } from "effector"; +import { getUsers } from "./common.js"; + +const onMessage = createEvent(); + +const worker = new Worker("worker.js"); +worker.onmessage = onMessage; + +getUsers.use( + (userID) => + new Promise((rs) => { + worker.postMessage({ sid: getUsers.sid, userID }); + const unwatch = onMessage.watch(({ data }) => { + if (data.sid !== getUsers.sid) return; + unwatch(); + rs(data.result); + }); + }), +); +``` + +## Конфигурация + +### importName + +- Type: `string | string[]` +- Default: `['effector', 'effector/compat']` + +Имя импорта или имена импортов, которые(-й) будут(-ет) обрабатываться плагином. + +### factories + +:::info +Добавлено в effector 21.6.0 +::: + +- Type: `string[]` + +Принимает массив имен модулей, экспорты которых будут рассматриваться как пользовательские фабрики, и каждый вызов таких фабрик будет иметь уникальный префикс для [сидов](/ru/api/effector/babel-plugin#sid) юнитов внутри них. Применяется для реализации SSR, для чисто клиентского приложения не требуется. + +- Фабрики могут иметь любое количество аргументов +- Фабрики могут создавать любое количество юнитов +- Фабрики могут вызывать любые эффекторные методы +- Фабрики могут вызывать другие фабрики из других модулей +- Модули с фабриками могут экспортировать любое количество функций +- Фабрики должны быть скомпилированы с `effector/babel-plugin`, как и код, который их использует + +#### Пример + +```json +// .babelrc +{ + "plugins": [ + [ + "effector/babel-plugin", + { + "factories": ["src/createEffectStatus", "~/createCommonPending"] + } + ] + ] +} +``` + +```js +// ./src/createEffectStatus.js +import { rootDomain } from "./rootDomain"; + +export function createEffectStatus(fx) { + const $status = rootDomain.createStore("init").on(fx.finally, (_, { status }) => status); + return $status; +} +``` + +```js +// ./src/statuses.js +import { createEffectStatus } from "./createEffectStatus"; +import { fetchUserFx, fetchFriendsFx } from "./api"; + +export const $fetchUserStatus = createEffectStatus(fetchUserFx); +export const $fetchFriendsStatus = createEffectStatus(fetchFriendsFx); +``` + +Импорт `createEffectStatus` из `'./createEffectStatus'` рассматривается как фабричная функция, поэтому каждый созданный ею стор получит свой собственный [sid](/ru/api/effector/babel-plugin#sid) и будет обрабатываться [serialize](/ru/api/effector/serialize) независимо, в то время как без `factories` они все будут иметь один и тот же `sid`. + +### reactSsr + +:::info +Добавлено в effector 21.5.0 +::: + +- Type: `boolean` +- Default: `false` + +Заменяет импорты из `effector-react` на `effector-react/scope`. Полезно для создания серверных и клиентских сборок из одной и той же кодовой базы. + +### addNames + +:::info +Добавлено в effector 21.8.0 +::: + +- Type: `boolean` +- Default: `true` + +Добавляет имена к вызовам фабрик юнитов. Отключение применяется для минификации и обфускации продакшн сборок. + +### addLoc + +- Type: `boolean` +- Default: `false` + +Добавляет местоположение к вызовам методов. Используется инструментами для разработчиков, например, [effector-logger](https://github.com/effector/logger) + +### debugSids + +> `debugSids: boolean` + +Добавляет в sid путь к файлу и имя переменной где объявлен unit. Очень полезно при отладке SSR. + +### noDefaults + +:::info +Добавлено в effector 20.2.0 +::: + +- Type: `boolean` +- Default: `false` + +Опция для `effector/babel-plugin` для создания пользовательских фабрик юнитов с чистой конфигурацией, изначально не делающей ничего. + +:::info +Оптимальнее использовать [factories](#factories) +::: + +```json +// .babelrc +{ + "plugins": [ + ["effector/babel-plugin", { "addLoc": true }], + [ + "effector/babel-plugin", + { + "importName": "@lib/createInputField", + "storeCreators": ["createInputField"], + "noDefaults": true + }, + "createInputField" + ] + ] +} +``` + +```js +// @lib/createInputField.js +import { createStore } from "effector"; +import { resetForm } from "./form"; + +export function createInputField(defaultState, { sid, name }) { + return createStore(defaultState, { sid, name }).reset(resetForm); +} +``` + +```js +// src/state.js +import { createInputField } from "@lib/createInputField"; + +const foo = createInputField("-"); +/* + +will be treated as store creator and compiled to + +const foo = createInputField('-', { + name: 'foo', + sid: 'z&si65' +}) + +*/ +``` diff --git a/src/content/docs/ru/api/effector/clearNode.md b/src/content/docs/ru/api/effector/clearNode.md new file mode 100644 index 0000000..1854cd1 --- /dev/null +++ b/src/content/docs/ru/api/effector/clearNode.md @@ -0,0 +1,76 @@ +--- +title: clearNode +description: Низкоуровневый метод для уничтожения юнитов и их связей +lang: ru +--- + +Низкоуровневый метод для уничтожения юнитов и их связей + +## Формула + +```ts +clearNode(unit: Unit): void +clearNode(unit: Unit, config: {deep?: boolean}): void +``` + +### Аргументы + +1. **`unit`**: Любой [юнит](/ru/explanation/glossary#unit) включая [домены](/ru/api/effector/Domain) и [scope](/ru/api/effector/Scope). Переданный юнит будет уничтожен и удалён из памяти +2. **`config?`**: Объект конфигурации + + - **`deep?`**: _boolean_ + + Глубокое удаление. Уничтожает юнит и _все_ его производные + +### Возвращает + +_void_ + +## Примеры + +### Пример удаления стора + +```js +import { createStore, createEvent, clearNode } from "effector"; + +const inc = createEvent(); +const store = createStore(0).on(inc, (x) => x + 1); +inc.watch(() => console.log("inc called")); +store.watch((x) => console.log("store state: ", x)); +// => store state: 0 +inc(); +// => inc called +// => store state: 1 +clearNode(store); +inc(); +// => inc called +``` + +[Запустить пример](https://share.effector.dev/WjuSl6aN) + +### Пример с deep + +```js +import { createStore, createEvent, clearNode } from "effector"; + +const inc = createEvent(); +const trigger = inc.prepend(() => {}); +const store = createStore(0).on(inc, (x) => x + 1); +trigger.watch(() => console.log("trigger called")); +inc.watch(() => console.log("inc called")); +store.watch((x) => console.log("store state: ", x)); +// => store state: 0 +trigger(); +// => trigger called +// => inc called +// => store state: 1 +clearNode(trigger, { deep: true }); +trigger(); +// no reaction +inc(); +// no reaction! +// all units, which depend on trigger, are erased +// including inc and store, because it depends on inc +``` + +[Запустить пример](https://share.effector.dev/EkETZtKI) diff --git a/src/content/docs/ru/api/effector/combine.md b/src/content/docs/ru/api/effector/combine.md new file mode 100644 index 0000000..5ce15a3 --- /dev/null +++ b/src/content/docs/ru/api/effector/combine.md @@ -0,0 +1,279 @@ +--- +title: combine +lang: ru +--- + +Этот метод позволяет получить состояние из каждого переданного сторов и комбинировать их в одно значение, сохраняя в новом производном сторе. +Полученный стор будет обновляться каждый раз, как обновляется любой из переданных сторов + +Если несколько сторов обновятся одновременно, то метод обработает их всех разом, то есть `combine` батчит обновления, что приводит к более эффективной работе без излишних вычислений + +## Общая формула + +```ts +declare const a: Store<A>; +declare const b: Store<B>; + +$c = combine({ a, b }) > Store<{ a: A; b: B }>; + +$c = combine([a, b]) > Store<[A, B]>; + +$c = combine({ a, b }, (values: { a: A; b: B }) => C) > Store<C>; + +$c = combine([a, b], (values: [A, B]) => C) > Store<C>; + +$c = combine(a, b, (a: A, b: B) => C) > Store<C>; +``` + +## Сочетание состояний + +### _combine( { a, b } )_ (#combine-shape) + +Комбинирует объект сторов в стор с объектом значений + +#### Формула (#combine-shape-formulae) + +```ts +declare const a: Store<A>; +declare const b: Store<B>; + +$c = combine(/*shape*/ { a, b }) > Store<{ a: A; b: B }>; +``` + +#### Аргументы (#combine-shape-args) + +- **`shape`**: Объект сторов + + Обновление любого из сторов означает изменение значения соответствующего поля в производном сторе <br/> + Количество сторов не ограничено + +#### Возвращает + +Новый, производный стор + +### _combine( \[ a, b \] )_ (#combine-list) + +Комбинирует массив сторов в стор с массивом значений + +#### Формула (#combine-list-formulae) + +```ts +declare const a: Store<A>; +declare const b: Store<B>; + +$c = combine(/*shape*/ [a, b]) > Store<[A, B]>; +``` + +#### Аргументы (#combine-list-args) + +- **`shape`**: Массив сторов + + Обновление любого из сторов означает изменение значения соответствующего элемента в производном сторе, <br/> + количество сторов не ограничено + +#### Возвращает (#combine-list-return) + +Новый, производный стор + +## Трансформация состояний + +### _combine( { a, b }, ({ a, b }) => result )_ (#transform-shape) + +Трансформирует объект сторов через функцию, принимающую объект значений + +#### Формула (#transform-shape-formulae) + +```ts +declare const a: Store<A>; +declare const b: Store<B>; + +$c = combine(/*shape*/ { a, b }, /*fn*/ (values: { a: A; b: B }) => C) > Store<C>; +``` + +#### Аргументы (#transform-shape-args) + +- **`shape`**: Объект сторов. Количество сторов не ограничено +- **`fn`**: `(values: {a: A; b: B}) => C` + + Функция-обработчик + + Преобразует данные перед отправлением в производный стор, <br/> + [должна быть **чистой**](/ru/explanation/glossary#purity) + + **Аргументы** + + - **`values`**: Объект значений + + **Возвращает**: Новое значение для хранения в производном сторе <br/> + Если функция возвращает undefined или текущее состояние производного стора, то обновления не будет + +#### Возвращает (#transform-shape-return) + +Новый, производный стор + +### _combine( \[ a, b \], (\[ a, b \]) => result )_ (#transform-list) + +Трансформирует массив сторов через функцию, принимающую массив значений + +#### Формула (#transform-list-formulae) + +```ts +declare const a: Store<A>; +declare const b: Store<B>; + +$c = combine(/*stores*/ [a, b], /*fn*/ (values: [A, B]) => C) > Store<C>; +``` + +#### Аргументы (#transform-list-args) + +- **`stores`**: Массив сторов <br/> + Количество используемых сторов не ограничено + +- **`fn`**: `(values: [A, B]) => C` + + Функция-обработчик + + Преобразует данные перед отправлением в производный стор, <br/> + [должна быть **чистой**](/ru/explanation/glossary#purity) + + **Аргументы** + + - **`values`**: Массив значений + + **Возвращает**: Новое значение для хранения в производном сторе <br/> + Если функция возвращает undefined или текущее состояние производного стора, то обновления не будет + +#### Возвращает (#transform-list-return) + +Новый, производный стор + +### _combine( a, b, ( a, b ) => result )_ (#transform-spread) + +Трансформирует произвольное число сторов через функцию, принимающую соответствующее число значений в аргументах + +#### Формула (#transform-spread-formulae) + +```ts +declare const a: Store<A>; +declare const b: Store<B>; + +$c = combine(/*...stores*/ a, b, /*fn*/ (a: A, b: B) => C) > Store<C>; +``` + +#### Аргументы (#transform-spread-args) + +- **`...stores`**: Аргументы со сторами, по одному стору на аргумент <br/> + В типах максимальное количество используемых сторов - 12, при превышении числа рекомендуется использовать [вариант с массивом](#transform-list) + +- **`fn`**: `(...values: [A, B]) => C` + + Функция-обработчик + + Преобразует данные перед отправлением в производный стор, <br/> + число аргументов зависит от числа переданных сторов. <br/> + [Должна быть **чистой**](/ru/explanation/glossary#purity) + + **Аргументы** + + - **`values`**: Аргументы со значениями, по одному аргументу от каждого стора + + **Возвращает**: Новое значение для хранения в производном сторе <br/> + Если функция возвращает undefined или текущее состояние производного стора, то обновления не будет + +#### Возвращает (#transform-spread-return) + +Новый, производный стор + +## Примеры + +#### Пример + +```js +import { createStore, combine } from "effector"; + +const balance = createStore(0); +const username = createStore("zerobias"); + +const greeting = combine(balance, username, (balance, username) => { + return `Hello, ${username}. Your balance is ${balance}`; +}); + +greeting.watch((data) => console.log(data)); // => Hello, zerobias. Your balance is 0 + +const arrStores = combine([balance, username]); +arrStores.watch(console.log); // => [0, 'zerobias'] +``` + +[Запустить пример](https://share.effector.dev/jyX3NCLt) + +#### Пример + +```js +import { createStore, combine } from "effector"; + +const r = createStore(255); +const g = createStore(0); +const b = createStore(255); + +const color = combine({ r, g, b }); +color.watch(console.log); // => {r: 255, b: 0, b: 255} + +const sum = combine({ r, g, b }, ({ r, g, b }) => r + g + b); +sum.watch(console.log); // => 510 +``` + +[Запустить пример](https://share.effector.dev/9AckAVg7) + +#### Пример + +```js +import { createStore, combine } from "effector"; + +const r = createStore(255); +const g = createStore(0); +const b = createStore(255); + +const color = combine([r, g, b]); +color.watch(console.log); +// => [255, 0, 255] + +const sum = combine([r, g, b], ([r, g, b]) => r + g + b); +sum.watch(console.log); +// => 510 +``` + +[Запустить пример](https://share.effector.dev/ch4CKPrX) + +## `combine` с примитивами и объектами + +В `combine` можно передавать не только сторы, но и примитивы и объекты, и при этом сигнатура метода остается прежней. Однако effector не будет отслеживать изменения этих типов данных, поэтому `combine` не будет вызван при их изменении. + +#### Пример + +```js +const $a = createStore("a"); +const b = 2; +const c = [false]; +const d = { value: 1 }; + +const $resultUsingComa = combine($a, b, c, d); +const $resultUsingArray = combine([$a, b, c, d]); +const $resultUsingObject = combine({ $a, b, c, d }); + +const $withFn = combine($a, b, c, d, (a, b) => ({ a, b })); + +$resultUsingComa.watch(console.log); +// => ["a", 2, [false], {value: 1}] +$resultUsingArray.watch(console.log); +// => ["a", 2, [false], {value: 1}] +$resultUsingObject.watch(console.log); +// => {$a: "a", b: 2, c: [false], d: {value: 1}} +$withFn.watch(console.log); +// => {$a: "a", b: 2} + +// Раскомментируйте код ниже, чтобы увидеть изменения +// c.push(true) +// d.value = 2 +``` + +[Запустить пример](https://share.effector.dev/XWk1lG4a) diff --git a/src/content/docs/ru/api/effector/createApi.md b/src/content/docs/ru/api/effector/createApi.md new file mode 100644 index 0000000..2edddd0 --- /dev/null +++ b/src/content/docs/ru/api/effector/createApi.md @@ -0,0 +1,74 @@ +--- +title: createApi +description: Способ массового создания событий-команд для обновления стора +lang: ru +--- + +Способ массового создания событий-команд для обновления стора на основе объекта с функциями-обработчиками. Если стор принадлежит какому-либо [домену](/ru/api/effector/Domain), то новые события также будут принадлежать ему + +## Формула + +```ts +declare const $store: Store<T>; // управляемый стор + +const api: { + event1: Event<S>; // созданное событие-команда + event2: Event<Q>; // созданное событие-команда +} = createApi( + /*store*/ $store, + /*handlers*/ { + event1: /*handler*/ (state: T, data: S) => T, + event2: /*handler*/ (state: T, data: Q) => T, + }, +); +``` + +### Аргументы + +1. **`store`**: [Стор](/ru/api/effector/Store), чьим значением требуется управлять +2. **`handlers`**: Объект с функциями-обработчиками, на каждую функцию будет создано по событию + + **`handler`**: `(state: T, data: S) => T` + + Функция-обработчик, которая будет вычислять новое состояние `store` на основе его предыдущего состояния и данных, отправленных в полученное событие-команду, [должна быть **чистой**](/ru/explanation/glossary#purity) + + **Аргументы** + + - **`state`**: Текущее состояние стора + - **`data`**: Значение, с которым было вызвано событие + + **Возвращает** + + Новое значение для хранения в `store`. Если функция возвращает undefined или текущее состояние стора, то обновления не будет + +### Возвращает + +Объект с событиями, по событию на каждый переданный обработчик + +## Примеры + +### Управление позицией игрока + +```js +import { createStore, createApi } from "effector"; + +const playerPosition = createStore(0); + +const api = createApi(playerPosition, { + moveLeft: (pos, n) => pos - n, + moveRight: (pos, n) => pos + n, +}); + +playerPosition.watch((pos) => { + console.log("position", pos); +}); +// => position 0 + +api.moveRight(10); +// => position 10 + +api.moveLeft(5); +// => position 5 +``` + +[Запустить пример](https://share.effector.dev/1ujGqL37) diff --git a/src/content/docs/ru/api/effector/createEffect.md b/src/content/docs/ru/api/effector/createEffect.md new file mode 100644 index 0000000..7a25fc1 --- /dev/null +++ b/src/content/docs/ru/api/effector/createEffect.md @@ -0,0 +1,177 @@ +--- +title: createEffect +description: метод для создания эффекта +lang: ru +--- + +Метод для создания [эффектов](/ru/api/effector/Effect). + +## createEffect с обработчиком событий + +### Формула (#formulae_handler) + +```typescript +createEffect(handler?) +``` + +**Аргументы** + +1. `handler` (_Function_): Функция для обработки вызовов эффектов, также может быть задана с помощью [use(handler)](/ru/api/effector/Effect#use-handler) + +**Возвращает** + +[_Effect_](/ru/api/effector/Effect): Новый эффект + +:::info +Вы должны задать обработчик в [createEffect](/ru/api/effector/createEffect) или же в [.use](/ru/api/effector/Effect#use-handler) методе позже, иначе эффект выбросит исключение "no handler used in _%effect name%_" +::: + +:::info{title="since"} +[effector 21.3.0](https://changelog.effector.dev/#effector-21-3-0) +::: + +### Примеры + +#### Создание эффекта с обработчиком событий + +```js +import { createEffect } from "effector"; + +const fetchUserReposFx = createEffect(async ({ name }) => { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +fetchUserReposFx.done.watch(({ params, result }) => { + console.log(result); +}); + +await fetchUserReposFx({ name: "zerobias" }); +``` + +[Запустить пример](https://share.effector.dev/7K23rdej) + +#### Изменение состояния по завершению эффекта + +```js +import { createStore, createEffect } from "effector"; + +const fetchUserReposFx = createEffect(async ({ name }) => { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +const $repos = createStore([]).on(fetchUserReposFx.doneData, (_, repos) => repos); + +$repos.watch((repos) => { + console.log(`${repos.length} repos`); +}); +// => 0 репозиториев + +await fetchUserReposFx({ name: "zerobias" }); +// => 26 репозиториев +``` + +[Запустить пример](https://share.effector.dev/uAJFC1XM) + +#### Назначение обработчика для эффекта после его создания + +```js +import { createEffect } from "effector"; + +const fetchUserReposFx = createEffect(); + +fetchUserReposFx.use(async ({ name }) => { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +await fetchUserReposFx({ name: "zerobias" }); +``` + +[Запустить пример](https://share.effector.dev/e1QPH9Uq) + +#### Наблюдение за состоянием эффекта + +```js +import { createEffect } from "effector"; + +const fetchUserReposFx = createEffect(async ({ name }) => { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); +}); + +fetchUserReposFx.pending.watch((pending) => { + console.log(`effect is pending?: ${pending ? "yes" : "no"}`); +}); + +fetchUserReposFx.done.watch(({ params, result }) => { + console.log(params); // {name: 'zerobias'} + console.log(result); // разрешенное значение, результат +}); + +fetchUserReposFx.fail.watch(({ params, error }) => { + console.error(params); // {name: 'zerobias'} + console.error(error); // отклоненное значение, ошибка +}); + +fetchUserReposFx.finally.watch(({ params, status, result, error }) => { + console.log(params); // {name: 'zerobias'} + console.log(`handler status: ${status}`); + + if (error) { + console.log("handler rejected", error); + } else { + console.log("handler resolved", result); + } +}); + +await fetchUserReposFx({ name: "zerobias" }); +``` + +[Запустить пример](https://share.effector.dev/LeurvtYA) + +## createEffect с параметрами + +Создает эффект с обработчиком событий и именем, которые заданы в объекте параметров + +### Формула (#formulae_config) + +```typescript +createEffect({ handler, name }); +``` + +**Аргументы** + +1. `config`? (_Params_): Эффект + - `handler` (_Function_): Функция для обработки вызовов эффектов, также может быть назначена с [use(handler)](#use) + - `name`? (_string_): Необязательное имя эффекта + +**Возвращает** + +[_Effect_](/ru/api/effector/Effect): Новый эффект + +### Примеры + +#### Создание эффекта с заданным именем + +```js +import { createEffect } from "effector"; + +const fetchUserReposFx = createEffect({ + name: "fetch user repositories", + async handler({ name }) { + const url = `https://api.github.com/users/${name}/repos`; + const req = await fetch(url); + return req.json(); + }, +}); + +await fetchUserReposFx({ name: "zerobias" }); +``` + +[Запустить пример](https://share.effector.dev/GynSzKee) diff --git a/src/content/docs/ru/api/effector/createEvent.md b/src/content/docs/ru/api/effector/createEvent.md new file mode 100644 index 0000000..7afc8c3 --- /dev/null +++ b/src/content/docs/ru/api/effector/createEvent.md @@ -0,0 +1,74 @@ +--- +title: createEvent +description: Метод для создания событий +lang: ru +--- + +Метод для создания [событий](/ru/api/effector/Event) + +## Формула (#formulae) + +```ts +event = createEvent() > Event<void>; + +event = createEvent<T>() > Event<T>; + +event = createEvent(/*name*/ "eventName") > Event<void>; +``` + +### Аргументы (#args) + +1. **`name?`**: _string_ + + Опциональное имя события + +### Возвращает (#return) + +Новое [событие](/ru/api/effector/Event) + +## Примеры (#examples) + +### Обновление состояния с помощью вызова события + +```js +import { createStore, createEvent } from "effector"; + +const addNumber = createEvent(); +const $store = createStore(0).on(addNumber, (state, number) => state + number); + +$store.watch((state) => { + console.log("state", state); +}); +// => 0 + +addNumber(10); +// => 10 + +addNumber(10); +// => 20 + +addNumber(10); +// => 30 +``` + +[Запустить пример](https://share.effector.dev/0OeoZMPc) + +Мы создали событие (addNumber) и стор $store, после чего подписались на обновления стора.<br/> +Обратите внимание на вызов функции `addNumber(10)`. Всякий раз, когда вы будете вызывать `addNumber(10)`, вы можете посмотреть в консоль и увидеть, как меняется состояние + +### Обработка данных с помощью производных событий + +```js +import { createEvent } from "effector"; + +const extractPartOfArray = createEvent(); +const array = extractPartOfArray.map((arr) => arr.slice(2)); + +array.watch((part) => { + console.log(part); +}); +extractPartOfArray([1, 2, 3, 4, 5, 6]); +// => [3, 4, 5, 6] +``` + +[Запустить пример](https://share.effector.dev/4lWsZr2k) diff --git a/src/content/docs/ru/api/effector/createStore.md b/src/content/docs/ru/api/effector/createStore.md new file mode 100644 index 0000000..231c10c --- /dev/null +++ b/src/content/docs/ru/api/effector/createStore.md @@ -0,0 +1,117 @@ +--- +title: createStore +description: Метод для создания независимого стора +lang: ru +--- + +Метод для создания независимого [стора](/ru/api/effector/Store) + +## Формула (#createStore-formulae) + +```ts +createStore<T>(defaultState: T): Store<T> +createStore<T>(defaultState: T, config: { + name?: string + updateFilter?: (update: T, current: T) => boolean + serialize?: 'ignore' +}): Store<T> +``` + +### Аргументы (#createStore-args) + +1. **`defaultState`**: Исходное состояние +2. **`config`**: Опциональный объект конфигурации + + - **`name`**: Имя стора. Babel-plugin может определить его из имени переменной стора, если имя не передано явно в конфигурации + - **`updateFilter`**: `(update: T, current: T) => boolean` + + Функция, которая предотвращает обновление стора, если она возвращает `false`. Следует использовать для случаев, когда стандартного запрета на обновление (если значение, которое предполагается записать в стор, равняется _undefined_ или текущему значению стора) недостаточно. + + **Аргументы** + + - **`update`**: Значение, которое предлагается записать в стор + - **`current`**: Текущее значение стора + + **Возвращает**: `boolean` + + Если возвращается _false_, то обновления не будет + + - **`serialize`**: `'ignore'` + + Опция, запрещающая сериализацию стора при вызовах [serialize](/ru/api/effector/serialize) + + - **`serialize`**: Объект конфигурации кастомной сериализации стора. `write` вызывается при вызове [serialize](/ru/api/effector/serialize) и приводит состояние стора к JSON-значению – примитив или простой объект/массив. `read` вызывается при [fork](/ru/api/effector/fork), если предоставленные `values` – результат вызова [serialize](/ru/api/effector/serialize) + +### Возвращает (#createStore-return) + +Новый [стор](/ru/api/effector/Store) + +:::info + +- Опция `updateFilter` добавлена в effector 21.8.0 +- Опция `serialize` добавлена в effector 22.0.0 + +::: + +## Пример + +```js +import { createEvent, createStore } from "effector"; + +const addTodo = createEvent(); +const clearTodos = createEvent(); + +const $todos = createStore([]) + .on(addTodo, (state, todo) => [...state, todo]) + .reset(clearTodos); + +const $selectedTodos = $todos.map((todos) => { + return todos.filter((todo) => !!todo.selected); +}); + +$todos.watch((state) => { + console.log("todos", state); +}); +``` + +[Запустить пример](https://share.effector.dev/tquiUgdq) + +#### Пример с кастомной конфигурацией `serialize` + +```ts +import { createEvent, createStore, serialize, fork, allSettled } from "effector"; + +const saveDate = createEvent(); +const $date = createStore<null | Date>(null, { + // Объект Date автоматически приводится в строку ISO-даты при вызове JSON.stringify + // но не приводится обратно к Date при вызове JSON.parse – результатом будет та же строка ISO-даты + // Это приведет к расхождению состояния стора при гидрации состояния на клиенте при серверном рендеринге + // + // Кастомная конфигурация `serialize` решает эту проблему + serialize: { + write: (dateOrNull) => (dateOrNull ? dateOrNull.toISOString() : dateOrNull), + read: (isoStringOrNull) => (isoStringOrNull ? new Date(isoStringOrNull) : isoStringOrNull), + }, +}).on(saveDate, (_, p) => p); + +const serverScope = fork(); + +await allSettled(saveDate, { scope: serverScope, params: new Date() }); + +const serverValues = serialize(serverScope); +// `serialize.write` стора `$date` был вызван + +console.log(serverValues); +// => { nq1e2rb: "2022-11-05T15:38:53.108Z" } +// Объект Date из стора сохранен как ISO-дата + +const clientScope = fork({ values: serverValues }); +// `serialize.read` стора `$date` был вызван + +const currentValue = clientScope.getState($date); +console.log(currentValue); +// => Date 11/5/2022, 10:40:13 PM +// Строка ISO-даты приведена обратно к объекту Date +``` + +[Запустить пример](https://share.effector.dev/YFkUlqPv) diff --git a/src/content/docs/ru/api/effector/createWatch.md b/src/content/docs/ru/api/effector/createWatch.md new file mode 100644 index 0000000..744c24a --- /dev/null +++ b/src/content/docs/ru/api/effector/createWatch.md @@ -0,0 +1,55 @@ +--- +id: createWatch +title: createWatch +--- + +Создает подписку на юнит (стор, ивент или эффект). + +```ts +createWatch<T>(config: { + unit: Unit<T> + fn: (payload: T) => void + scope?: Scope +}): Subscription +``` + +**Аргументы** + +1. `config` (_Object_): Конфигурация + - `unit` (_Unit_): Целевой юнит (стор, ивент или эффект), за которым нужно наблюдать + - `fn` (_Function_): Функция, которая будет вызываться при каждом обновлении юнита. Первым аргументом получает содержимое обновления. + - `scope` ([_Scope_](/ru/api/effector/Scope)): Опциональный скоуп. Если передан, то функция будет вызываться только при обновлении юнита именно на этом скоупе. + +**Возвращает** + +[_Subscription_](/ru/explanation/glossary#subscription): Функция отмены подписки + +#### Пример (со скоупом) + +```js +import { createWatch, createEvent, fork, allSettled } from "effector"; + +const changeName = createEvent(); + +const scope = fork(); + +const unwatch = createWatch({ unit: changeName, scope, fn: console.log }); + +await allSettled(changeName, { scope, params: "Иван" }); // output: Иван +changeName("Иван"); // no output +``` + +#### Пример (без скоупа) + +```js +import { createWatch, createEvent, fork, allSettled } from "effector"; + +const changeName = createEvent(); + +const scope = fork(); + +const unwatch = createWatch({ unit: changeName, fn: console.log }); + +await allSettled(changeName, { scope, params: "Иван" }); // output: Иван +changeName("Иван"); // output: Иван +``` diff --git a/src/content/docs/ru/api/effector/forward.md b/src/content/docs/ru/api/effector/forward.md new file mode 100644 index 0000000..7d0fc52 --- /dev/null +++ b/src/content/docs/ru/api/effector/forward.md @@ -0,0 +1,127 @@ +--- +title: forward +description: Метод для создания связи между юнитами в декларативной форме. Отправляет обновления из одного набора юнитов в другой +lang: ru +--- + +:::info{title="since"} +С версии [effector 22.0.0](https://changelog.effector.dev/#effector-22-0-0) рекомендуется использовать [sample](/ru/api/effector/sample) вместо `forward`. +::: + +Метод для создания связи между юнитами в декларативной форме. Отправляет обновления из одного набора юнитов в другой + +## Формула + +```ts +declare const a: Event<T> +declare const fxA: Effect<T, any> +declare const $a: Store<T> + +declare const b: Event<T> +declare const fxB: Effect<T, any> +declare const $b: Store<T> + +forward({from: a, to: b}) +forward({ + from: fxA, + to: [b, fxB, $b] +}) +forward({ + from: [a, fxA, $a], + to: fxB +}) +forward({ + from: [a, fxA, $a], + to: [b, fxB, $b] +}) +-> Subscription +``` + +``` + + from -> to + +``` + +### Аргументы (#args) + +1. **`config`**: Объект конфигурации + + - **`from`**: [Юнит](/ru/explanation/glossary#common-unit) или массив юнитов + + **Разновидности**: + + - **событие или эффект**: срабатывание этого события/эффекта будет запускать юниты `to` + - **стор**: обновление этого стора будет запускать юниты `to` + - **массив юнитов**: срабатывание любого из юнитов будет запускать юниты `to` + + - **`to`**: [Юнит](/ru/explanation/glossary#common-unit) или массив юнитов + + **Разновидности**: + + - **событие или эффект**: при срабатывании `from` будет вызван данный юнит + - **стор**: при срабатывании `from` состояние юнита будет обновлено + - **массив юнитов**: при срабатывании `from` будут запущены все юниты + +### Возвращает (#return) + +[Subscription](/ru/explanation/glossary#subscription): Функция отмены подписки, после её вызова реактивная связь между `from` и `to` разрушается + +:::info +Массивы юнитов поддерживаются с [effector 20.6.0](https://changelog.effector.dev/#effector-20-6-0) +::: + +Для наилучшей типизации при использовании массивов юнитов, типы значений должны совпадать либо быть явно приведены к общему базису + +## Примеры + +### Сохранение в сторе данных из события + +```js +import { createStore, createEvent, forward } from "effector"; + +const $store = createStore(1); +const event = createEvent(); + +forward({ + from: event, + to: $store, +}); + +$store.watch((state) => console.log("store changed: ", state)); +// => store changed: 1 + +event(200); +// => store changed: 200 +``` + +[Запустить пример](https://share.effector.dev/UeJbgRG9) + +### Создание связи между массивами юнитов + +```js +import { createEvent, forward } from "effector"; + +const firstSource = createEvent(); +const secondSource = createEvent(); + +const firstTarget = createEvent(); +const secondTarget = createEvent(); + +forward({ + from: [firstSource, secondSource], + to: [firstTarget, secondTarget], +}); + +firstTarget.watch((e) => console.log("first target", e)); +secondTarget.watch((e) => console.log("second target", e)); + +firstSource("A"); +// => first target A +// => second target A +secondSource("B"); +// => first target B +// => second target B +``` + +[Запустить пример](https://share.effector.dev/8aVpg8nU) diff --git a/src/content/docs/ru/api/effector/fromObservable.md b/src/content/docs/ru/api/effector/fromObservable.md new file mode 100644 index 0000000..bed8bfb --- /dev/null +++ b/src/content/docs/ru/api/effector/fromObservable.md @@ -0,0 +1,37 @@ +--- +title: fromObservable +lang: ru +--- + +Создаёт [событие](/ru/api/effector/Event), которое будет срабатывать при каждом обновлении переданного observable. Применяется для реализации взаимодействия с библиотеками на основе стримов, например `rxjs` и `most` + +Для обратного действия подписки стримов на юниты эффектора можно воспользоваться методами вроде `from` из `rxjs`: юниты эффектора распознаются как сущности, на которые можно подписаться + +## Формула + +```ts +function fromObservable(stream: Observable<T>): Event<T>; +``` + +### Аргументы + +1. **`observable`**: Observable + +### Возвращает + +Новое [событие](/ru/api/effector/Event) + +## Пример + +```js +import { interval } from "rxjs"; +import { fromObservable } from "effector"; + +//emit value in sequence every 1 second +const source = interval(1000); + +const event = fromObservable(source); + +//output: 0,1,2,3,4,5.... +event.watch(console.log); +``` diff --git a/src/content/docs/ru/api/effector/guard.md b/src/content/docs/ru/api/effector/guard.md new file mode 100644 index 0000000..3789bc6 --- /dev/null +++ b/src/content/docs/ru/api/effector/guard.md @@ -0,0 +1,195 @@ +--- +title: guard +description: Метод для запуска юнитов по условию, условием может быть функция-предикат или отдельный стор. Позволяет описывать бизнес-правила независимо от других сущностей +lang: ru +--- + +:::info +C effector 22.2.0 предпочтительнее использовать [sample](/ru/api/effector/sample) +::: + +:::info +Добавлен в effector 20.4.0 +::: + +Метод для запуска юнитов по условию, условием может быть функция-предикат или отдельный стор. Позволяет описывать бизнес-правила независимо от других сущностей. +Типичный вариант использования – когда необходимо запускать события лишь когда в определённом сторе значение равно `true`. Тем самым обеспечивается управление потоками данных без их смешивания + +## Формула + +```ts +guard({clock?, source?, filter, target?}): target +``` + +:::info +`clock` или `source` обязателен +::: + +При срабатывании `clock`, после проверки `filter` на [истинность](https://developer.mozilla.org/ru/docs/Glossary/Truthy), вызывается `target` с данными из `source` + +- Если `clock` не передан, `guard` будет срабатывать при каждом обновлении `source` +- Если `source` не передан, `target` будет вызван с данными из `clock` +- Если `target` не передан, будет создано новое [событие](/ru/api/effector/Event) и возвращено в качестве результата +- Если `filter` это [стор](/ru/api/effector/Store), то его значение будет проверено на [истинность](https://developer.mozilla.org/ru/docs/Glossary/Truthy) +- Если `filter` это функция-предикат, то она будет вызвана с данными из `source` и `clock`, а результат проверен на [истинность](https://developer.mozilla.org/ru/docs/Glossary/Truthy) + +:::info +`clock` добавлен в effector 21.8.0 +::: + +## `guard({clock?, source?, filter, target?})` + +Основная запись метода + +**Аргументы** + +`params` (_Object_): Объект конфигурации + +- **`filter`**: [Стор](/ru/api/effector/Store) или функция-предикат + + **Разновидности**: + + - **стор**: `target` будет запущен только если в этом сторе [истинное значение](https://developer.mozilla.org/ru/docs/Glossary/Truthy) + - **функция-предикат** `(source, clock) => boolean`: `target` будет запущен только если эта функция вернёт [истинное значение](https://developer.mozilla.org/ru/docs/Glossary/Truthy). Функция [должна быть **чистой**](/ru/explanation/glossary#purity) + +- **`clock?`**: [Юнит](/ru/explanation/glossary#common-unit) или массив юнитов + + **Разновидности**: + + - **событие или эффект**: срабатывание этого события/эффекта, после проверки условия в `filter` будет запускать `target` + - **стор**: обновление этого стора, после проверки условия в `filter` будет запускать `target` + - **массив юнитов**: срабатывание любого из юнитов, после проверки условия в `filter` будет запускать `target`. Сокращение для вызова [merge](/ru/api/effector/merge) + - **поле отсутствует**: `source` будет использоваться в качестве `clock` + +- **`source?`**: [Юнит](/ru/explanation/glossary#common-unit) или массив/объект со сторами + + **Разновидности**: + + - **событие или эффект**: при срабатывании `clock` будет взято последнее значение с которым запускался этот юнит (перед этим он должен будет запуститься хотя бы раз) + - **стор**: при срабатывании `clock` будет взято текущее значение этого стора + - **массив или объект со сторами**: при срабатывании `clock` будут взяты текущие значения из заданных сторов, объединенных в объект или массив. Сокращение для вызова [combine](/ru/api/effector/combine) + - **поле отсутствует**: `clock` будет использоваться в качестве `source` + +- **`target?`**: [Юнит](/ru/explanation/glossary#common-unit) или массив юнитов + + **Разновидности**: + + - **событие или эффект**: при срабатывании `clock`, после проверки условия в `filter` будет вызван данный юнит + - **стор**: при срабатывании `clock`, после проверки условия в `filter` состояние юнита будет обновлено + - **массив юнитов**: при срабатывании `clock`, после проверки условия в `filter` будут запущены все юниты + - **поле отсутствует**: новое [событие](/ru/api/effector/Event) будет создано и возвращено в результате вызова `guard` + +**Возвращает** + +[_Event_](/ru/api/effector/Event), событие, которое будет срабатывать после проверки условия в `filter` + +### Пример со стором в `filter` + +```js +import { createStore, createEffect, createEvent, guard } from "effector"; + +const clickRequest = createEvent(); +const fetchRequest = createEffect((n) => new Promise((rs) => setTimeout(rs, 2500, n))); + +const clicks = createStore(0).on(clickRequest, (x) => x + 1); +const requests = createStore(0).on(fetchRequest, (x) => x + 1); + +const isIdle = fetchRequest.pending.map((pending) => !pending); + +/* +1. при срабатывании clickRequest +2. если значение isIdle равно true +3. прочитать значение из clicks +4. и вызвать с ним эффект fetchRequest +*/ +guard({ + clock: clickRequest /* 1 */, + filter: isIdle /* 2 */, + source: clicks /* 3 */, + target: fetchRequest /* 4 */, +}); +``` + +[Пример rate limiting](https://share.effector.dev/zLB4NwNV) + +### Пример с функцией-предикатом в `filter` + +```js +import { createEffect, createEvent, guard } from "effector"; + +const searchUser = createEffect(); +const submitForm = createEvent(); + +guard({ + source: submitForm, + filter: (user) => user.length > 0, + target: searchUser, +}); + +submitForm(""); // ничего не произошло +submitForm("alice"); // ~> searchUser('alice') +``` + +[Запустить пример](https://share.effector.dev/84j97tZ7) + +## `guard(source, {filter})` + +Альтернативная запись метода + +**Аргументы** + +- **`source`**: [Юнит](/ru/explanation/glossary#common-unit) +- **`filter`**: [Стор](/ru/api/effector/Store) или функция-предикат + + **Разновидности**: + + - **стор**: `target` будет запущен только если в этом сторе [истинное значение](https://developer.mozilla.org/ru/docs/Glossary/Truthy) + - **функция-предикат** `(source) => boolean`: `target` будет запущен только если эта функция вернёт [истинное значение](https://developer.mozilla.org/ru/docs/Glossary/Truthy). Функция [должна быть **чистой**](/ru/explanation/glossary#purity) + +#### Пример со стором в `filter` + +```js +import { createEvent, createStore, createApi, guard } from "effector"; + +const trigger = createEvent(); +const $unlocked = createStore(true); +const { lock, unlock } = createApi($unlocked, { + lock: () => false, + unlock: () => true, +}); + +const target = guard(trigger, { + filter: $unlocked, +}); + +target.watch(console.log); +trigger("A"); +lock(); +trigger("B"); // ничего не произошло +unlock(); +trigger("C"); +``` + +[Запустить пример](https://share.effector.dev/6bqOCO4y) + +#### Пример с функцией-предикатом в `filter` + +```js +import { createEvent, guard } from "effector"; + +const source = createEvent(); +const target = guard(source, { + filter: (x) => x > 0, +}); + +target.watch(() => { + console.log("target вызван"); +}); + +source(0); +// ничего не произошло +source(1); +// target вызван +``` + +[Запустить пример](https://share.effector.dev/ethzpd8Y) diff --git a/src/content/docs/ru/api/effector/index.md b/src/content/docs/ru/api/effector/index.md new file mode 100644 index 0000000..f9d9104 --- /dev/null +++ b/src/content/docs/ru/api/effector/index.md @@ -0,0 +1,61 @@ +--- +title: effector +description: Перечень основных методов API, по группам +lang: ru +--- + +Перечень основных методов API, по группам + +## Типы юнитов + +- [Event](/ru/api/effector/Event) +- [Effect](/ru/api/effector/Effect) +- [Store](/ru/api/effector/Store) +- [Domain](/ru/api/effector/Domain) +- [Scope](/ru/api/effector/Scope) + +## Создание юнитов + +- [createEvent](/ru/api/effector/createEvent) +- [createStore](/ru/api/effector/createStore) +- [createEffect](/ru/api/effector/createEffect) +- [createDomain](/ru/api/effector/createDomain) + +## Основные методы библиотеки + +- [combine(...stores, f)](/ru/api/effector/combine) +- [attach({effect, mapParams?, source?})](/ru/api/effector/attach) +- [sample({clock, source, fn, target})](/ru/api/effector/sample) +- [merge([eventA, eventB])](/ru/api/effector/merge) +- [split(event, cases)](/ru/api/effector/split) +- [createApi(store, api)](/ru/api/effector/createApi) + +## Fork API + +- [fork](/ru/api/effector/fork) +- [serialize](/ru/api/effector/serialize) +- [allSettled](/ru/api/effector/allSettled) +- [scopeBind](/ru/api/effector/scopeBind) +- [hydrate](/ru/api/effector/hydrate) + +## Плагины для компилятора + +- [effector/babel-plugin](/ru/api/effector/babel-plugin) +- [@effector/swc-plugin](https://github.com/effector/swc-plugin) + +## Служебные функции + +- [is](/ru/api/effector/is) +- [fromObservable(observable)](/ru/api/effector/fromObservable) + +## Низкоуровневый API + +- [clearNode](/ru/api/effector/clearNode) +- [withRegion](/ru/api/effector/withRegion) +- [launch](/ru/api/effector/launch) +- [inspect](/ru/api/effector/inspect) + +## Устаревшие методы + +- [forward({from, to})](/ru/api/effector/forward) +- [guard({source, filter, target})](/ru/api/effector/guard) diff --git a/src/content/docs/ru/api/effector/is.md b/src/content/docs/ru/api/effector/is.md new file mode 100644 index 0000000..86aec22 --- /dev/null +++ b/src/content/docs/ru/api/effector/is.md @@ -0,0 +1,326 @@ +--- +title: is +lang: ru +--- + +Объект с валидаторами юнитов + +## `is.store(value)` + +Проверяет, является ли переданное значение [_стором_](/ru/api/effector/Store) + +**Возвращает** + +boolean + +```js +import { is, createStore, createEvent, createEffect, createDomain } from "effector"; + +const store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +is.store(store); +// => true + +is.store(event); +// => false + +is.store(fx); +// => false + +is.store(createDomain()); +// => false + +is.store(fx.pending); +// => true + +is.store(fx.done); +// => false + +is.store(store.updates); +// => false + +is.store(null); +// => false +``` + +[Запустить пример](https://share.effector.dev/4vzdWan1) + +## `is.event(value)` + +Проверяет, является ли переданное значение [_событием_](/ru/api/effector/Event) + +**Возвращает** + +boolean + +```js +import { is, createStore, createEvent, createEffect, createDomain } from "effector"; + +const store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +is.event(store); +// => false + +is.event(event); +// => true + +is.event(fx); +// => false + +is.event(createDomain()); +// => false + +is.event(fx.pending); +// => false + +is.event(fx.done); +// => true + +is.event(store.updates); +// => true + +is.event(null); +// => false +``` + +[Запустить пример](https://share.effector.dev/hB0JEiIo) + +## `is.effect(value)` + +Проверяет, является ли переданное значение [_эффектом_](/ru/api/effector/Effect) + +**Возвращает** + +boolean + +```js +import { is, createStore, createEvent, createEffect, createDomain } from "effector"; + +const store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +is.effect(store); +// => false + +is.effect(event); +// => false + +is.effect(fx); +// => true + +is.effect(createDomain()); +// => false + +is.effect(null); +// => false +``` + +[Запустить пример](https://share.effector.dev/ZdZ2N6VG) + +## `is.domain(value)` + +Проверяет, является ли переданное значение [_доменом_](/ru/api/effector/Domain) + +**Возвращает** + +boolean + +```js +import { is, createStore, createEvent, createEffect, createDomain } from "effector"; + +const store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +is.domain(store); +// => false + +is.domain(event); +// => false + +is.domain(fx); +// => false + +is.domain(createDomain()); +// => true + +is.domain(null); +// => false +``` + +[Запустить пример](https://share.effector.dev/Iea0gmfD) + +## `is.scope(value)` + +:::info +Добавлен в effector 22.0.0 +::: + +Проверяет, является ли переданное значение [_скоупом_](/ru/api/effector/Scope) + +**Возвращает** + +boolean + +```js +import { fork } from "effector"; + +const store = createStore(null); +const event = createEvent(); +const fx = createEffect(); +const scope = fork(); + +is.scope(scope); +// => true + +is.scope(store); +// => false + +is.scope(event); +// => false + +is.scope(fx); +// => false + +is.scope(createDomain()); +// => false + +is.scope(null); +// => false +``` + +[Запустить пример](https://share.effector.dev/hF0krFUK) + +## `is.unit(value)` + +Проверяет, является ли переданное значение [юнитом](/ru/explanation/glossary#unit): [стором](/ru/api/effector/Store), [эвентом](/ru/api/effector/Event), [эффектом](/ru/api/effector/Effect), [доменом](/ru/api/effector/Domain) или [скоупом](/ru/api/effector/Scope) + +**Возвращает** + +boolean + +```js +import { is, createStore, createEvent, createEffect, createDomain, fork } from "effector"; + +const store = createStore(null); +const event = createEvent(); +const fx = createEffect(); +const scope = fork(); + +is.unit(scope); +// => true + +is.unit(store); +// => true + +is.unit(event); +// => true + +is.unit(fx); +// => true + +is.unit(createDomain()); +// => true + +is.unit(fx.pending); +// => true + +is.unit(fx.done); +// => true + +is.unit(store.updates); +// => true + +is.unit(null); +// => false +``` + +[Запустить пример](https://share.effector.dev/iOpDvweB) + +## `is.attached(value)` + +:::info +Добавлен в effector 22.4.0 +::: + +Проверяет, что переданный [_effect_](/ru/api/effector/Effect) был создан с помощью метода [_attach_](/ru/api/effector/attach). +Если в качестве аргумента был передан не effect, возвращает `false`. + +**Возвращает** + +boolean + +```js +import { is, createStore, createEvent, createEffect, createDomain, attach } from "effector"; + +const $store = createStore(null); +const event = createEvent(); +const fx = createEffect(); + +const childFx = attach({ + effect: fx, +}); + +is.attached(childFx); +// => true + +is.attached(fx); +// => false + +is.attached($store); +// => false + +is.attached(event); +// => false + +is.attached(createDomain()); +// => false + +is.attached(null); +// => false +``` + +[Запустить пример](https://share.effector.dev/qsdTF7og) + +### Пример использования + +Иногда нужно добавить отображение ошибок на эффекты, но только на те, которые были "локализованы" через `attach`. +Если оставить `onCreateEffect` как есть, без проверок, то лог ошибки будет задублирован. + +```js +import { createDomain, attach, is } from "effector"; + +const logFailuresDomain = createDomain(); + +logFailuresDomain.onCreateEffect((effect) => { + if (is.attached(effect)) { + effect.fail.watch(({ params, error }) => { + console.warn(`Effect "${effect.compositeName.fullName}" failed`, params, error); + }); + } +}); + +const baseRequestFx = logFailuresDomain.createEffect((path) => { + throw new Error(`path ${path}`); +}); + +const loadDataFx = attach({ + mapParams: () => "/data", + effect: baseRequestFx, +}); + +const loadListFx = attach({ + mapParams: () => "/list", + effect: baseRequestFx, +}); + +loadDataFx(); +loadListFx(); +``` + +[Запустить пример](https://share.effector.dev/NxQseHOR) diff --git a/src/content/docs/ru/api/effector/launch.md b/src/content/docs/ru/api/effector/launch.md new file mode 100644 index 0000000..6344a84 --- /dev/null +++ b/src/content/docs/ru/api/effector/launch.md @@ -0,0 +1,22 @@ +--- +title: launch +lang: ru +--- + +Низкоуровневый метод для запуска вычислений в [юнитах](/ru/explanation/glossary#common-unit). В основном используется разработчиками библиотек для тонкого контроля вычислений + +:::info +Добавлен в effector 20.10.0 +::: + +## Формула + +```ts +declare const $store: Store<T> +declare const event: Event<T> +declare const fx: Effect<T, any> + +launch({target: $store, params: T}): void +launch({target: event, params: T}): void +launch({target: fx, params: T}): void +``` diff --git a/src/content/docs/ru/api/effector/merge.md b/src/content/docs/ru/api/effector/merge.md new file mode 100644 index 0000000..8bcf73b --- /dev/null +++ b/src/content/docs/ru/api/effector/merge.md @@ -0,0 +1,97 @@ +--- +title: merge +description: метод для объединения апдейтов массива юнитов в новое событие, которое будет срабатывать при запуске любой из переданных сущностей +lang: ru +--- + +Объединяет апдейты массива [юнитов](/ru/explanation/glossary#common-unit) в новое событие, которое будет срабатывать при запуске любой из переданных сущностей + +:::info +Добавлено в effector 20.0.0 +::: + +## Формула + +```ts +declare const $store: Store<T>; // триггер +declare const event: Event<T>; // триггер +declare const fx: Effect<T, any>; // триггер + +const result: Event<T> = merge(/*clock*/ [$store, event, fx]); +``` + +### Аргументы + +- **`clock`**: Массив [юнитов](/ru/explanation/glossary#common-unit) для объединения + +### Возвращает + +[_Event_](/ru/api/effector/Event): Новое событие + +:::tip +В случае передачи стора, итоговое событие будет срабатывать при обновлении этого стора +::: + +## Примеры + +#### Пример 1 + +```js +import { createEvent, merge } from "effector"; + +const foo = createEvent(); +const bar = createEvent(); +const baz = merge([foo, bar]); +baz.watch((v) => console.log("merged event triggered: ", v)); + +foo(1); +// => merged event triggered: 1 +bar(2); +// => merged event triggered: 2 +``` + +[Запустить пример](https://share.effector.dev/WxUgr6dZ) + +#### Пример 2 + +```js +import { createEvent, createStore, merge } from "effector"; + +const setFoo = createEvent(); +const setBar = createEvent(); + +const $foo = createStore(0).on(setFoo, (_, v) => v); + +const $bar = createStore(100).on(setBar, (_, v) => v); + +const anyUpdated = merge([$foo, $bar]); +anyUpdated.watch((v) => console.log(`state changed to: ${v}`)); + +setFoo(1); // => state changed to: 1 +setBar(123); // => state changed to: 123 +``` + +[Запустить пример](https://share.effector.dev/Rp9wuRvl) + +#### Пример 3 + +```js +import { createEvent, createStore, merge } from "effector"; + +const setFoo = createEvent(); +const otherEvent = createEvent(); + +const $foo = createStore(0).on(setFoo, (_, v) => v); + +const merged = merge([$foo, otherEvent]); + +merged.watch((v) => console.log(`merged event payload: ${v}`)); + +setFoo(999); +// => merged event payload: 999 + +otherEvent("bar"); +// => merged event payload: bar +``` + +[Запустить пример](https://share.effector.dev/pKkiyhVQ) diff --git a/src/content/docs/ru/api/effector/sample.md b/src/content/docs/ru/api/effector/sample.md new file mode 100644 index 0000000..627d6c2 --- /dev/null +++ b/src/content/docs/ru/api/effector/sample.md @@ -0,0 +1,371 @@ +--- +title: sample +description: Метод для связывания юнитов связью вида "при срабатывании `clock` прочитать значение из `source` и передать в `target`" +lang: ru +--- + +Метод для связывания [юнитов](/ru/explanation/glossary#common-unit) связью вида _"при срабатывании `clock` прочитать значение из `source` и передать в `target`"_ + +Типичный вариант использования – когда необходимо обработать какое-либо событие используя данные из стора. Вместо использования `store.getState()`, которое может вызвать несогласованность состояния, лучше использовать метод `sample` + +## Формула + +```ts +sample({ source?, clock?, filter?, fn?, target?}): target +``` + +При срабатывании `clock` прочитать значение из `source` и передать в `target` + +- Если `clock` не передан, `sample` будет срабатывать при каждом обновлении `source`. +- Если `filter` не передан, продолжить выполнение как есть. Если `filter` возвращает `false` или его значение `Store<false>`, то отменить выполнение, а иначе продолжить +- Если передан `fn`, то при срабатывании передать значения из `source` и `clock` в эту функцию, а в `target` передать результат вычисления +- Если `target` не передан, то `sample` создаст и вернёт новый [юнит](/ru/explanation/glossary#common-unit) + +## Иллюстрация принципа работы + + + +## Тип создаваемого `target` + +Если `target` не передан, то он будет создан при вызове. Тип создаваемого юнита описан в данной таблице: + +| clock\source | [_Store_](/ru/api/effector/Store) | [_Event_](/ru/api/effector/Event) | [_Effect_](/ru/api/effector/Effect) | +| ----------------------------------- | --------------------------------- | --------------------------------- | ----------------------------------- | +| [_Store_](/ru/api/effector/Store) | `Store` | `Event` | `Event` | +| [_Event_](/ru/api/effector/Event) | `Event` | `Event` | `Event` | +| [_Effect_](/ru/api/effector/Effect) | `Event` | `Event` | `Event` | + +Использование таблицы: + +1. Выбираем тип источника `source`, это столбец +2. Тип `clock` – это строка +3. Устанавливаем соответствие между столбцом и строкой + +Например: + +```ts +const $store = sample({ clock: $store, source: $store }); +// Результатом будет стор, так как `source` и `clock` являются сторами + +const event = sample({ clock: event, source: $store }); +// Результатом будет эвент, так как `clock` – не стор +``` + +## `sample({clock?, source?, fn?, target?, greedy?})` + +Основная запись метода + +**Аргументы** + +`params` (_Object_): Объект конфигурации + +- **`clock?`**: [Юнит](/ru/explanation/glossary#common-unit) или массив юнитов + + **Разновидности**: + + - **событие или эффект**: срабатывание этого события/эффекта будет запускать `target` + - **стор**: обновление этого стора будет запускать `target` + - **массив юнитов**: срабатывание любого из юнитов будет запускать `target`. Сокращение для вызова [merge](/ru/api/effector/merge) + - **поле отсутствует**: `source` будет использоваться в качестве `clock` + +- **`source?`**: [Юнит](/ru/explanation/glossary#common-unit) или массив/объект со сторами + + **Разновидности**: + + - **событие или эффект**: при срабатывании `clock` будет взято последнее значение с которым запускался этот юнит (перед этим он должен будет запуститься хотя бы раз) + - **стор**: при срабатывании `clock` будет взято текущее значение этого стора + - **массив или объект со сторами**: при срабатывании `clock` будут взяты текущие значения из заданных сторов, объединенных в объект или массив. Сокращение для вызова [combine](/ru/api/effector/combine) + - **поле отсутствует**: `clock` будет использоваться в качестве `source` + +- **`target?`**: [Юнит](/ru/explanation/glossary#common-unit) или массив юнитов + + **Разновидности**: + + - **событие или эффект**: при срабатывании `clock` будет вызван данный юнит + - **стор**: при срабатывании `clock` состояние юнита будет обновлено + - **массив юнитов**: при срабатывании `clock` будут запущены все юниты + - **поле отсутствует**: новый юнит будет создан и возвращен в результате вызова `sample`. Его тип [зависит от типов `clock` и `source`](#тип-создаваемого-target) + +- **`fn?`**: `(sourceData, clockData) => result` + + Функция-обработчик, которая будет преобразовывать данные из `source` и `clock` перед отправлением в `target`, [должна быть **чистой**](/ru/explanation/glossary#purity). В случае отсутствия этого поля, данные из `source` будут передаваться в `target` как есть + +- **`greedy?`**: `boolean` + + Модификатор, определяющий, будет ли `target` ожидать окончательного значения `clock` прежде чем запуститься самому. При `greedy: false` `target` будет срабатывать только раз после каждой серии идущих подряд обновлений, а при `greedy: true`, `target` сработает по разу при каждом триггере `clock`. Иными словами, эта опция отключает стабилизацию апдейтов `clock` и вынуждает обрабатывать все промежуточные значения. Батчинг обновлений повышает общую эффективность работы системы, поэтому по умолчанию greedy установлен в `false` + +:::info +Поддержка массивов юнитов в `target` добавлена в effector 21.8.0 +::: + +**Возвращает** + +([_Event_](/ru/api/effector/Event) | [_Store_](/ru/api/effector/Store)) – Юнит, который будет срабатывать при срабатывании `clock`, если `target` не передан. +Тип возвращаемого юнита [зависит от типов clock и source](#тип-создаваемого-target) + +#### Пример + +```js +const $userName = createStore("john"); +const signIn = createEffect((params) => { + console.log(params); +}); +const submitForm = createEvent(); + +sample({ + clock: submitForm /* 1 */, + source: $userName /* 2 */, + fn: (name, password) => ({ name, password }) /* 3 */, + target: signIn /* 4 */, +}); + +submitForm(12345678); +// 1. при вызове submitForm с аргументом 12345678 +// 2. прочитать значение из стора $userName ('john') +// 3. преобразовать значение из submitForm (1) и $userName (2) +// 4. и передать результат вычислений в эффект signIn +``` + +[Запустить пример](https://share.effector.dev/PAjWhOJc) + +## `sample(source, clock, fn?): Unit` + +Альтернативная запись метода, всегда имеет неявный `target` + +**Аргументы** + +- **`source`**: [Юнит](/ru/explanation/glossary#common-unit) + + **Разновидности**: + + - **событие или эффект**: при срабатывании `clock` будет взято последнее значение с которым запускался этот юнит (перед этим он должен будет запуститься хотя бы раз) + - **стор**: при срабатывании `clock` будет взято текущее значение этого стора + +- **`clock`**: [Юнит](/ru/explanation/glossary#common-unit) + + **Разновидности**: + + - **событие или эффект**: срабатывание этого события/эффекта будет запускать `target` + - **стор**: обновление этого стора будет запускать `target` + - **поле отсутствует**: `source` будет использоваться в качестве `clock` + +- **`fn?`**: `(sourceData, clockData) => result` + + Функция-обработчик, которая будет преобразовывать данные из `source` и `clock` перед отправлением в `target`, [должна быть **чистой**](/ru/explanation/glossary#purity). В случае отсутствия этого поля, данные из `source` будут передаваться в `target` как есть. Поскольку этот обработчик призван организовывать поток данных, следует избегать объявления в нём сайд-эффектов. Правильнее будет поместить их в эффекты или в метод `watch` возвращаемого юнита + +**Возвращает** + +([_Event_](/ru/api/effector/Event) | [_Store_](/ru/api/effector/Store)) – Юнит, который будет срабатывать при срабатывании `clock`, если `target` не передан. +Тип возвращаемого юнита [зависит от типов clock и source](#тип-создаваемого-target). + +#### Пример + +```js +const $userName = createStore("john"); +const signIn = createEffect((params) => { + console.log(params); +}); +const submitForm = createEvent(); + +const sampleUnit = sample( + $userName /* 2 */, + submitForm /* 1 */, + (name, password) => ({ name, password }) /* 3 */, +); + +forward({ + from: sampleUnit, + to: signIn /* 4 */, +}); + +submitForm(12345678); +// 1. при вызове submitForm с аргументом 12345678 +// 2. прочитать значение из стора $userName ('john') +// 3. преобразовать значение из submitForm (1) и $userName (2) +// 4. и передать результат вычислений в эффект signIn +``` + +[Запустить пример](https://share.effector.dev/nln8pwfj) + +## `sample({name?})` + +:::info +Добавлено в effector 20.4.0 +::: + +Любой [юнит](/ru/explanation/glossary#unit) в эффекторе может иметь имя, поле `name` в `sample` позволяет указать имя создаваемому `target` + +```js +import { createStore, sample } from "effector"; + +const foo = createStore(null); + +const sampled = sample({ + source: foo, + name: "sampled foo", +}); + +console.log(sampled.shortName); // 'sampled foo' +``` + +## Объекты и массивы в `source` + +### Объект со сторами + +:::info +Добавлено в effector 20.8.0 +::: +`sample` может быть вызван с объектом [сторов](/ru/api/effector/Store) в `source`: + +```js +import { createStore, createEvent, sample } from "effector"; +const trigger = createEvent(); + +const a = createStore("A"); +const b = createStore(1); + +// target имеет тип `Event<{ a: string, b: number }>` +const target = sample({ + clock: trigger, + source: { a, b }, +}); + +target.watch((obj) => { + console.log("sampled object", obj); +}); + +trigger(); +// => sampled object {a: 'A', b: 1} +``` + +[Запустить пример](https://share.effector.dev/Wp9nq14k) + +### Массив сторов + +:::info +Добавлено в effector 20.8.0 +::: +`sample` может быть вызван с массивом [сторов](/ru/api/effector/Store) в `source`: + +```js +import { createStore, createEvent, sample } from "effector"; +const trigger = createEvent(); + +const a = createStore("A"); +const b = createStore(1); + +// target имеет тип `Event<[string, number]>` +const target = sample({ + clock: trigger, + source: [a, b], +}); + +target.watch((obj) => { + console.log("sampled array", obj); +}); + +// Можно деструктурировать аргументы, чтобы задать явные имена +target.watch(([a, b]) => { + console.log("explicit names", a, b); +}); + +trigger(); +// => sampled array ["A", 1] +// => explicit names "A" 1 +``` + +[Запустить пример](https://share.effector.dev/duqTwRgT) + +## Массивы юнитов в `clock` + +:::info +Добавлено в effector 21.2.0 +::: + +Передача массивов юнитов в `clock` работает как вызов [merge](/ru/api/effector/merge) + +```js +import {createStore, createEvent, createEffect, sample, merge} from 'effector' + +const showNotification = createEvent<string>() +const trigger = createEvent() +const fx = createEffect() +const store = createStore('') + +// массив юнитов в `clock` +sample({ + clock: [trigger, fx.doneData], + source: store, + target: showNotification, +}) + +// объединённый юнит в `clock` +sample({ + clock: merge([trigger, fx.doneData]), + source: store, + target: showNotification, +}) +``` + +[Запустить пример](https://share.effector.dev/1YEHUFs7) + +## Пример с `filter` + +:::info{title="since"} +[effector 22.2.0](https://changelog.effector.dev/#effector-22-2-0) +::: + +Новый вариант использования `sample` работает так же, но с одним дополнительным методом `filter`. Когда `filter` возвращает `true` продолжить выполнение, иначе отменить. Взглянем на пример ниже. + +Вася хочет отправить Пете деньги. Вася – отправитель, а Петя – получатель. Чтобы отправить деньги, отправитель должен знать адрес получателя, кроме того транзакция должна быть подписана. Пример показывает как работает `sample` с `filter`. Основные моменты, которые необходимо учесть: + +1. Убедиться, что баланс положительный и больше чем отправляемая сумма. +2. Наличие адреса получателя +3. Подписанная транзакция +4. Убедиться, что баланс отправителя изменился + +```js +import { createStore, createEvent, createEffect, sample } from "effector"; + +const sign = createEvent(); +const sentMoney = createEvent(); + +const $recipientAddress = createStore("a23x3xd"); +const $balance = createStore(20000); +const $isSigned = createStore(false); + +const transactionFx = createEffect( + ({ amountToSend, recipientAddress }) => + new Promise((res) => + setTimeout(res, 3000, { + amount: amountToSend, + recipientAddress, + }), + ), +); + +$isSigned.on(sign, () => true).reset(transactionFx); +$balance.on(transactionFx.doneData, (balance, { amount }) => balance - amount); + +sample({ + source: { + recipientAddress: $recipientAddress, + isSigned: $isSigned, + balance: $balance, + }, + clock: sentMoney, + filter: ({ isSigned, balance }, amountToSend) => isSigned && balance > amountToSend, + fn({ recipientAddress }, amountToSend) { + return { recipientAddress, amountToSend }; + }, + target: transactionFx, +}); + +$balance.watch((balance) => console.log("balance: ", balance)); +$isSigned.watch((isSigned) => console.log("is signed: ", isSigned)); + +sign(); +sentMoney(1000); +``` + +[Запустить пример](https://share.effector.dev/XTxkCYC0) diff --git a/src/content/docs/ru/api/effector/scopeBind.md b/src/content/docs/ru/api/effector/scopeBind.md new file mode 100644 index 0000000..7ac9d4f --- /dev/null +++ b/src/content/docs/ru/api/effector/scopeBind.md @@ -0,0 +1,38 @@ +--- +title: scopeBind +description: Метод привязки события или эффекта к scope для последующего вызова +lang: ru +--- + +Метод привязки события или эффекта к [scope](/ru/api/effector/Scope) для последующего вызова. <br/> + +Иногда необходимо привязать события к scope явно, например, при вызове событий в рамках колбэков setTimeout/setInterval + +## Формула + +```ts +scopeBind<T>(event: Event<T>): (payload: T) => void +``` + +### Аргументы + +1. **`event`**: [Событие](/ru/api/effector/Event) для привязки к scope + +## Пример + +Мы собираемся вызвать `changeLocation` внутри колбэка `history.listen`, поэтому у эффектора нет возможности связать событие с соответствующей областью видимости, и мы должны явно привязать событие к области видимости с помощью `scopeBind` + +```js +const installHistory = app.createEvent<any>() +const changeLocation = app.createEvent<string>() + +installHistory.watch(history => { + + const locationUpdate = scopeBind(changeLocation) + history.listen(location => { + locationUpdate(location.pathname) + }) +}) +``` + +[Полный пример](https://github.com/effector/effector/blob/master/examples/react-ssr/src/app.tsx#L128) diff --git a/src/content/docs/ru/api/index.mdx b/src/content/docs/ru/api/index.mdx new file mode 100644 index 0000000..7fc6056 --- /dev/null +++ b/src/content/docs/ru/api/index.mdx @@ -0,0 +1,48 @@ +--- +title: Справочник API +--- + +import FeatureCard from "@components/FeatureCard.astro"; +import IconReact from "@icons/React.astro"; +import IconVue from "@icons/Vue.astro"; +import IconSolid from "@icons/Solid.astro"; +import IconEffector from "@icons/Effector.astro"; + +Effector предлагает ряд пакетов для интеграции с популярными фреймворками и библиотеками. +Следующие пакеты поддерживаются основной командой effector. + +<div class="grid grid-cols-1 sm:grid-cols-2 md:grid-cols-1 xl:grid-cols-2 gap-4 mb-50"> + +<FeatureCard + title="effector" + description="Фундамент основного кода логики в приложениях." + link="/ru/api/effector" +> + <IconEffector slot="icon" /> +</FeatureCard> + +<FeatureCard + title="effector-react" + description="Хуки для компактной и удобной интеграции с React компонентами." + link="/ru/api/effector-react" +> + <IconReact slot="icon" /> +</FeatureCard> + +<FeatureCard + title="effector-solid" + description="Интеграция с сигналами фреймворка Solid." + link="/ru/api/effector-solid" +> + <IconSolid slot="icon" /> +</FeatureCard> + +<FeatureCard + title="effector-vue" + description="Хуки, методы, плагины для работы в рамках Vue." + link="/ru/api/effector-vue" +> + <IconVue slot="icon" /> +</FeatureCard> + +</div> diff --git a/src/content/docs/ru/explanation/glossary.md b/src/content/docs/ru/explanation/glossary.md new file mode 100644 index 0000000..80edf2b --- /dev/null +++ b/src/content/docs/ru/explanation/glossary.md @@ -0,0 +1,144 @@ +--- +title: Глоссарий +description: Словарь основных понятий +lang: ru +--- + +## Event + +_Event_ (_событие_, _ивент_) это функция, на вызовы которой можно подписаться. Она может обозначать намерение изменить состояния в приложении, указанием на то, что происходит в приложении, быть командой для управления сущностями, триггером вычислений и так далее. + +[Event](/ru/api/effector/Event) в документации. + +## Store + +_Store_ (_состояние_, _стор_) это объект который хранит состояние. В приложении могут совместно существовать множество состояний + +[Store](/ru/api/effector/Store) в документации. + +## Effect + +_Effect_ это контейнер для сайд-эффектов, возможно асинхронных. В комплекте имеет ряд заранее созданных эвентов и сторов, облегчающих стандартные действия + +При императивном вызове всегда возвращает Promise с результатом. + +Может иметь один аргумент или не иметь ни одного + +[Effect](/ru/api/effector/Effect) в документации + +## Domain + +_Domain_ это способ группировки и применения массовых обработок к юнитам. Домены получают уведомления о создании событий, сторов, эффектов и вложенных доменов. Часто используются для логирования и SSR + +[Domain](/ru/api/effector/Domain) в документации + +## Unit (#unit) + +Тип данных, используемый для описания бизнес-логики приложений. Большинство методов эффектора имеют дело с обработкой юнитов. +Существует пять типов юнитов: [_Store_](/ru/api/effector/Store), [Event](/ru/api/effector/Event), [Effect](/ru/api/effector/Effect), [Domain](/ru/api/effector/Domain) и [_Scope_](/ru/api/effector/Scope) + +## Common unit (#common-unit) + +Обычные юниты можно использовать для запуска обновлений других юнитов. Существует три типа обычных юнитов: [Store (стор)](/ru/api/effector/Store), [Event (событие)](/ru/api/effector/Event) и [Effect (эффект)](/ru/api/effector/Effect). **Когда метод принимает юниты, это означает, что он принимает события, эффекты и сторы** в качестве источника реактивных обновлений + +## Purity (#purity) + +Большинство функций, передаваемых в методы api не должны вызывать другие события или эффекты: легче рассуждать о потоке данных приложения, когда императивные триггеры сгруппированы внутри обработчиков эффектов, а не рассредоточены по всей бизнес-логике + +**Правильно**, императивно: + +```js +import { createStore, createEvent } from "effector"; + +const login = createStore("guest"); + +const loginSize = login.map((login) => login.length); + +const submitLoginSize = createEvent(); + +loginSize.watch((size) => { + submitLoginSize(size); +}); +``` + +[Запустить пример](https://share.effector.dev/D5hV8C70) + +`store.map` [в документации](/ru/api/effector/Store#map-fn) + +`store.watch` [в документации](/ru/api/effector/Store#watch-watcher) + +**Правильно**, декларативно: + +```js +import { createStore, createEvent, forward } from "effector"; + +const login = createStore("guest"); + +const loginSize = login.map((login) => login.length); + +const submitLoginSize = createEvent(); + +forward({ + from: loginSize, + to: submitLoginSize, +}); +``` + +[Запустить пример](https://share.effector.dev/it0gXQLI) + +[forward in docs](/ru/api/effector/forward) + +**Неправильно**: + +```js +import { createStore, createEvent, forward } from "effector"; + +const submitLoginSize = createEvent(); + +const login = createStore("guest"); +const loginSize = login.map((login) => { + // лучше переместить этот вызов в watch или эффект + submitLoginSize(login.length); + return login.length; +}); +``` + +## Reducer + +```typescript +type StoreReducer<State, E> = (state: State, payload: E) => State | void; +type EventOrEffectReducer<T, E> = (state: T, payload: E) => T; +``` + +_Reducer_ вычисляет новое состояние, учитывая предыдущее состояние и данные из события. Для сторов, если reducer возвращает undefined или то же состояние (===), то обновления не будет + +## Watcher + +```typescript +type Watcher<T> = (update: T) => any; +``` + +_Watcher_ – функция с сайд-эффектами, для работы которых не нужны возможности по перехвату ошибок и уведомления подписчиков об завершении асинхронной работы. Используется в [event.watch](/ru/api/effector/Event#watch-watcher), [store.watch](/ru/api/effector/Store#watchwatcher) и [хуках домена](/ru/api/effector/Domain#oncreateeventhook). Возвращаемое значение игнорируется + +## Subscription + +```typescript +type Subscription = { + (): void; + unsubscribe(): void; +}; +``` + +Функция отмены подписки, после её вызова [watcher](#watcher) перестаёт получать обновления и удаляется из памяти. Повторные вызовы функции отмены подписки не делают ничего + +:::warning{title="Предупреждение"} +**Ручное управление подписками мешает сосредоточиться на управлении данными и бизнес-логикой** +<br/><br/> +Эффектор предоставляет широкий набор возможностей, чтобы свести необходимость удаления подписок к минимуму. Это отличает его от большинства других реактивных библиотек +::: + +[effect]: /ru/api/effector/Effect +[store]: /ru/api/effector/Store +[event]: /ru/api/effector/Event +[domain]: /ru/api/effector/Domain +[scope]: /ru/api/effector/Scope diff --git a/src/content/docs/ru/explanation/prior-art.md b/src/content/docs/ru/explanation/prior-art.md new file mode 100644 index 0000000..9bb71ac --- /dev/null +++ b/src/content/docs/ru/explanation/prior-art.md @@ -0,0 +1,28 @@ +--- +title: Prior Art +lang: ru +--- + +## Пейперы + +- **Functional Pearl. Weaving a Web** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/weaver+zipper.pdf) _Ralf Hinze and Johan Jeuring_ +- **A graph model of data and workflow provenance** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/A+graph+model+of+data+and+workflow+provenance.pdf) <br/> _Umut Acar, Peter Buneman, James Cheney, Jan Van den Bussche, Natalia Kwasnikowska and Stijn Vansummeren_ +- **An Applicative Control-Flow Graph Based on Huet’s Zipper** [[pdf]](http://zero-bias-papers.s3-website-eu-west-1.amazonaws.com/zipcfg.pdf) <br/> _Norman Ramsey and Joao Dias_ +- **Elm: Concurrent FRP for Functional GUIs** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/elm-concurrent-frp.pdf) <br/> _Evan Czaplicki_ +- **Inductive Graphs and Functional Graph Algorithms** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/Inductive+Graphs+and+Functional+Graph+Algorithms.pdf) <br/> _Martin Erwig_ +- **Notes on Graph Algorithms Used in Optimizing Compilers** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/Graph+Algorithms+Used+in+Optimizing+Compilers.pdf) <br/> _Carl D. Offner_ +- **Backtracking, Interleaving, and Terminating Monad Transformers** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/Backtracking%2C+Interleaving%2C+and+Terminating+Monad+Transformers.pdf) <br/> _Oleg Kiselyov, Chung-chieh Shan, Daniel P. Friedman and Amr Sabry_ +- **Typed Tagless Final Interpreters** [[pdf]](https://zero-bias-papers.s3-eu-west-1.amazonaws.com/Typed+Tagless+Final+Interpreters.pdf) _Oleg Kiselyov_ + +## Книги + +- **Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions** [[book]](https://www.amazon.com/o/asin/0321200683/ref=nosim/enterpriseint-20), [[messaging patterns overview]](https://www.enterpriseintegrationpatterns.com/patterns/messaging/) <br/> _Gregor Hohpe and Bobby Woolf_ + +## API + +- [re-frame](https://github.com/day8/re-frame) +- [flux](https://facebook.github.io/flux/) +- [redux](https://redux.js.org/) +- [redux-act](https://github.com/pauldijou/redux-act) +- [most](https://github.com/cujojs/most) +- nodejs [events](https://nodejs.org/dist/latest-v12.x/docs/api/events.html#events_emitter_on_eventname_listener) diff --git a/src/content/docs/ru/introduction/ecosystem.md b/src/content/docs/ru/introduction/ecosystem.md new file mode 100644 index 0000000..8ecba68 --- /dev/null +++ b/src/content/docs/ru/introduction/ecosystem.md @@ -0,0 +1,34 @@ +--- +title: Экосистема effector +description: Пакеты и шаблоны экосистемы эффектора +lang: ru +--- + +Пакеты и шаблоны экосистемы эффектора + +Более обширный обзор экосистемы в репозитории [awesome-effector](https://github.com/effector/awesome) + +## Пакеты + +- [patronum](https://github.com/effector/patronum) – effector utility library delivering modularity and convenience. +- [effector-logger](https://github.com/effector/logger) – Simple logger with stores inspector. +- [eslint-plugin-effector](https://eslint.effector.dev) – Помогает придерживаться лучших практик в проекте. +- [effector-reeffect](https://github.com/yumauri/effector-reeffect) – Concurrent effects for effector. +- [effector-localstorage](https://github.com/lessmess-dev/effector-localstorage) – Module for effector that sync stores with localStorage. +- [effector-storage](https://github.com/yumauri/effector-storage) – Another module for effector to sync stores with localStorage/sessionStorage. +- [effector-routing](https://github.com/Kelin2025/effector-routing) – Simple abstract router on top of effector. +- [effector-undo](https://github.com/tanyaisinmybed/effector-undo) – Simple undo/redo functionality for effector. +- [effector-utils](https://github.com/Kelin2025/effector-utils) – effector utilities library. +- [effector-next](https://github.com/weyheyhey/effector-next) – effector wrappers for Next.js. +- [forest](https://github.com/effector/effector/tree/master/packages/forest) – UI engine for web based on effector. + +### Управление формами + +- [effector-forms](https://github.com/aanation/effector-forms) – Form manager for effector. +- [efform](https://github.com/tehSLy/efform) – Form manager, based on effector state manager, designed to deliver high-quality DX. +- [effector-react-form](https://github.com/GTOsss/effector-react-form) + +## Шаблоны + +- [effector SSR](https://github.com/effector/razzle-template) – SSR on React, TypeScript, Razzle and Styled. +- [CRA template](https://github.com/effector/cra-template) – Simple CreateReactApp template. diff --git a/src/content/docs/ru/introduction/examples.md b/src/content/docs/ru/introduction/examples.md new file mode 100644 index 0000000..412bb16 --- /dev/null +++ b/src/content/docs/ru/introduction/examples.md @@ -0,0 +1,10 @@ +--- +title: Примеры +lang: ru +--- + +- [Индикатор загрузки](https://share.effector.dev/fEsYTDxe): отображение индикатора загрузки во время выполнения эффектов +- [Последовательность эффектов](https://share.effector.dev/RYQ5z59Q): когда второй запрос к серверу требует данных из первого +- [Отмена эффекта](https://share.effector.dev/W4I0ghLt): когда пропадает необходимость в результатах эффекта, который ещё выполняется +- [Модальное окно](https://share.effector.dev/DzljrdjR): связывание модального окна отображаемого через React с состоянием в сторе +- [Вход диапазона](https://share.effector.dev/oRB2iB8M): подключение компонента ввода диапазона к состоянию diff --git a/src/content/docs/ru/introduction/installation.md b/src/content/docs/ru/introduction/installation.md new file mode 100644 index 0000000..ba91cb7 --- /dev/null +++ b/src/content/docs/ru/introduction/installation.md @@ -0,0 +1,122 @@ +--- +title: Установка +description: Установка эффектора и сопутствующих пакетов +lang: ru +--- + +## С помощью пакетного менеджера + +Effector не требует использования какого-то одного пакетного менеджера, можете использовать любой на свой выбор.<br/> +Например: [yarn](https://yarnpkg.com/), [pnpm](https://pnpm.io/). + +```bash +npm install effector +``` + +### React + +```bash +npm install effector effector-react +``` + +Вы можете начать использовать effector онлайн с помощью [шаблона Stackblitz](https://stackblitz.com/fork/github/effector/vite-react-template) внутри которого уже настроен [TypeScript](https://typescriptlang.org/), [ViteJS](https://vitejs.dev/) и [React](https://reactjs.org/). + +### Vue + +```bash +npm install effector effector-vue +``` + +### Solid + +```bash +npm install effector effector-solid +``` + +### Svelte + +Svelte работает с effector без установки дополнительных пакетов. + +## Online playground + +Все примеры в этой документации запускаются в [нашей онлайн песочнице](https://share.effector.dev). Она позволяет запускать, тестировать и распространять свои идеи бесплатно и без установки. React и синтаксис TypeScript поддерживаются без дополнительной настройки. [Репозиторий проекта](https://github.com/effector/repl). + +## Deno + +:::info{title="поддерживается с версии"} +[effector 21.0.0](https://changelog.effector.dev/#effector-21-0-0) +::: + +Чтобы использовать effector, просто импортируйте `effector.mjs` из любого CDN. + +```typescript +import { createStore } from "https://cdn.jsdelivr.net/npm/effector/effector.mjs"; +``` + +Примеры CDN: + +- https://www.jsdelivr.com/package/npm/effector +- https://cdn.jsdelivr.net/npm/effector/effector.cjs.js +- https://cdn.jsdelivr.net/npm/effector/effector.mjs +- https://cdn.jsdelivr.net/npm/effector-react/effector-react.cjs.js +- https://cdn.jsdelivr.net/npm/effector-vue/effector-vue.cjs.js + +## DevTools + +Используйте [effector-logger](https://github.com/effector/logger) для вывода изменений сторов в консоль, вывода их значений в браузерный интерфейс и подключения к Redux Dev Tools. + +Для рендеринга на сервере и написания тестов вам понадобятся плагины для компилятора: + +### Babel + +Плагин для Babel включен в поставку основного пакета `effector` и не требует установки. + +[Читайте детали по ссылке](/ru/api/effector/babel-plugin). + +### SWC + +```bash +npm install --development @effector/swc-plugin @swc/core +``` + +[Документация плагина](https://github.com/effector/swc-plugin). + +## Совместимость + +Для совместимости с устаревшими версиями браузеров до IE11 и Chrome 47 (версия браузера для Smart TV) используйте импорты из файлов: `effector/compat`, `effector-react/compat` и `effector-vue/compat`. + +Вы можете заменить импорты вручную: + +```diff +- import {createStore} from 'effector' ++ import {createStore} from 'effector/compat' +``` + +А также используя плагин [babel-plugin-module-resolver](https://github.com/tleunen/babel-plugin-module-resolver). +Примерная конфигурация в `.babelrc`: + +```json +{ + "plugins": [ + [ + "babel-plugin-module-resolver", + { + "alias": { + "^effector$": "effector/compat", + "^effector-react$": "effector-react/compat" + } + } + ] + ] +} +``` + +### Polyfills + +Effector использует некоторые глобальные объекты, в старых версиях браузеров их может не быть, поэтому вам может понадобиться установить их самостоятельно, если вы собираетесь поддерживать такие браузеры. + +Вам может понадобиться установить следующие полифиллы: + +- `Promise` +- `Object.assign` +- `Array.prototype.flat` diff --git a/src/content/docs/ru/recipes/index.md b/src/content/docs/ru/recipes/index.md new file mode 100644 index 0000000..5ae9278 --- /dev/null +++ b/src/content/docs/ru/recipes/index.md @@ -0,0 +1,8 @@ +--- +title: Рецепты +lang: ru +--- + +Основной список рецептов находится в навигации. + +Чтобы добавить новые, [открывайте PullRequest](https://github.com/effector/effector). diff --git a/src/content/docs/ru/typescript/typing-effector.md b/src/content/docs/ru/typescript/typing-effector.md new file mode 100644 index 0000000..966a0a1 --- /dev/null +++ b/src/content/docs/ru/typescript/typing-effector.md @@ -0,0 +1,173 @@ +--- +title: Типизация с эффектором +description: Лучшие практики для написания хорошо типизированного кода +lang: ru +--- + +Лучшие практики для написания хорошо типизированного кода + +## `createEvent` + +По умолчанию этот метод возвращает `Event<void>` + +```typescript +const event = createEvent(); +// => Event<void> +event(); +``` + +Тип события может быть указан как дженерик + +```typescript +const event = createEvent<number>(); +// => Event<number> +event(0); +``` + +## `createEffect` + +TypeScript может вывести тип результата эффекта из заданного обработчика, но тип аргумента должен быть определен либо в аргументе обработчика, либо как дженерик + +```typescript +const sendMessageFx = createEffect(async (params: { text: string }) => { + // ... + return "ok"; +}); +// => Effect<{text: string}, string> + +const sendWarningFx = createEffect<{ warn: string }, string>(async ({ warn }) => { + // ... + return "ok"; +}); +// => Effect<{warn: string}, string> +``` + +## Типизация ошибок с `createEffect` + +Некоторый код может выдать исключения только некоторых типов, например библиотека axios в качестве ошибок использует только `AxiosError`. В эффектах для описания типов ошибок используется дженерик `Fail`. + +Для его указания, в случае, когда тип аргумента и тип результата задаётся явно (первым и вторым дженериком метода [createEffect](/ru/api/effector/createEffect) соответственно), используется третий дженерик метода: + +```typescript +const sendWarningFx = createEffect<{ warn: string }, string, AxiosError>(async ({ warn }) => { + // ... + return "ok"; +}); +// => Effect<{warn: string}, string, AxiosError> +``` + +В случае, когда обработчик эффекта определен до самого эффекта, TypeScript может определить тип `Params` и `Done` используя `typeof handler` в первом generic, не указывая сами типы явно. В таком случае описание типа ошибок можно передать в опциональный второй дженерик метода: + +```typescript +const sendMessage = async (params: { text: string }) => { + // ... + return "ok"; +}; + +const sendMessageFx = createEffect<typeof sendMessage, AxiosError>(sendMessage); +// => Effect<{text: string}, string, AxiosError> +``` + +:::info +`Fail` в качестве второго дженерика добавлен в effector 21.6.0 +::: + +## `event.prepend` + +Чтобы добавить типы к событиям, созданным с помощью [event.prepend](/ru/api/effector/Event#prepend-fn), необходимо добавить тип либо в аргумент функции prepend, либо как дженерик + +```typescript +const message = createEvent<string>(); + +const userMessage = message.prepend(({ text }: { text: string }) => text); +// userMessage имеет тип Event<{text: string}> + +const warningMessage = message.prepend<{ warn: string }>(({ warn }) => warn); +// warningMessage имеет тип Event<{warn: string}> +``` + +## `attach` + +Чтобы позволить TypeScript выводить типы создаваемого эффекта, можно добавить тип к первому аргументу `mapParams`, который станет дженериком `Params` у результата + +```typescript +const sendTextFx = createEffect<{ text: string }, "ok">(); + +const sendWarningFx = attach({ + effect: sendTextFx, + mapParams: ({ warn }: { warn: string }) => ({ text: warn }), +}); +// sendWarningFx имеет тип Effect<{warn: string}, 'ok'> +``` + +## `split` + +[TypeScript type predicates](https://www.typescriptlang.org/docs/handbook/advanced-types.html#using-type-predicates) можно использовать для разделения исходного типа события на несколько вариантов (отсюда и название) + +```typescript +type UserMessage = { kind: "user"; text: string }; +type WarnMessage = { kind: "warn"; warn: string }; + +const message = createEvent<UserMessage | WarnMessage>(); + +const { userMessage, warnMessage } = split(message, { + userMessage: (msg): msg is UserMessage => msg.kind === "user", + warnMessage: (msg): msg is WarnMessage => msg.kind === "warn", +}); +// userMessage имеет тип Event<UserMessage> +// warnMessage имеет тип Event<WarnMessage> +``` + +## `guard` + +[TypeScript type predicates](https://www.typescriptlang.org/docs/handbook/advanced-types.html#using-type-predicates) можно использовать для вывода типа результата с помощью функции `filter` + +```typescript +type UserMessage = { kind: "user"; text: string }; +type WarnMessage = { kind: "warn"; warn: string }; + +const message = createEvent<UserMessage | WarnMessage>(); + +const userMessage = guard(message, { + filter: (msg): msg is UserMessage => msg.kind === "user", +}); + +// userMessage имеет тип Event<UserMessage> +``` + +## `createApi` + +Чтобы позволить TypeScript выводить типы создаваемых событий, можно добавить тип ко второму аргументу обработчиков + +```typescript +const $count = createStore(0); + +const { add, sub } = createApi($count, { + add: (x, add: number) => x + add, + sub: (x, sub: number) => x - sub, +}); + +// add имеет тип Event<number> +// sub имеет тип Event<number> +``` + +## `is` + +Методы группы [is](/ru/api/effector/is) могут помочь вывести тип юнита, то есть они действуют как [TypeScript type guards](https://www.typescriptlang.org/docs/handbook/advanced-types.html#type-guards-and-differentiating-types). Это применяется в написании типизированных утилит + +```typescript +export function getUnitType(unit: unknown) { + if (is.event(unit)) { + // здесь юнит имеет тип Event<any> + return "event"; + } + if (is.effect(unit)) { + // здесь юнит имеет тип Effect<any, any> + return "effect"; + } + if (is.store(unit)) { + // здесь юнит имеет тип Store<any> + return "store"; + } +} +``` diff --git a/src/content/docs/ru/typescript/utility-types.md b/src/content/docs/ru/typescript/utility-types.md new file mode 100644 index 0000000..f689474 --- /dev/null +++ b/src/content/docs/ru/typescript/utility-types.md @@ -0,0 +1,124 @@ +--- +title: Служебные типы +lang: ru +--- + +Эффектор предоставляет несколько утилитарных типов для облегчения получения типа значения юнита. + +## `UnitValue<Type>` + +Получение типа значения переданного [Unit](/ru/explanation/glossary). + +### Пример + +```ts +import { createEffect, createStore, createDomain, createEvent, fork, UnitValue } from "effector"; + +const event = createEvent<{ id: string; name?: string } | { id: string }>(); +const $store = createStore([false, true]); +const effect = createEffect<{ token: string }, any, string>(() => {}); +const domain = createDomain(); +const scope = fork(); + +type UnitEventType = UnitValue<typeof event>; +// {id: string; name?: string | undefined} | {id: string} + +type UnitStoreType = UnitValue<typeof store>; +// boolean[] + +type UnitEffectType = UnitValue<typeof effect>; +// {token: string} + +type UnitDomainType = UnitValue<typeof domain>; +// any + +type UnitScopeType = UnitValue<typeof scope>; +// any +``` + +## `StoreValue<Type>` + +Получение типа значения [Store](/ru/api/effector/Store). + +### Пример + +```ts +import { createStore, StoreValue } from "effector"; + +const $store = createStore(true); + +type StoreValueType = StoreValue<typeof $store>; +// boolean +``` + +## `EventPayload<Type>` + +Получение типа значения переданного в [Event](/ru/api/effector/Event). + +### Пример + +```ts +import { createEvent, EventPayload } from "effector"; + +const event = createEvent<{ id: string }>(); + +type EventPayloadType = EventPayload<typeof event>; +// {id: string} +``` + +## `EffectParams<Type>` + +Получение типа параметров [Effect](/ru/api/effector/Effect). + +### Пример + +```ts +import { createEffect, EffectParams } from "effector"; + +const fx = createEffect< + { id: string }, + { name: string; isAdmin: boolean }, + { statusText: string; status: number } +>(() => ({ name: "Alice", isAdmin: false })); + +type EffectParamsType = EffectParams<typeof fx>; +// {id: string} +``` + +## `EffectResult<Type>` + +Получение типа результата [Effect](/ru/api/effector/Effect). + +### Пример + +```ts +import { createEffect, EffectResult } from "effector"; + +const fx = createEffect< + { id: string }, + { name: string; isAdmin: boolean }, + { statusText: string; status: number } +>(() => ({ name: "Alice", isAdmin: false })); + +type EffectResultType = EffectResult<typeof fx>; +// {name: string; isAdmin: boolean} +``` + +## `EffectError<Type>` + +Получение типа ошибки [Effect](/ru/api/effector/Effect). + +### Пример + +```ts +import { createEffect, EffectError } from "effector"; + +const fx = createEffect< + { id: string }, + { name: string; isAdmin: boolean }, + { statusText: string; status: number } +>(() => ({ name: "Alice", isAdmin: false })); + +type EffectErrorType = EffectError<typeof fx>; +// {statusText: string; status: number} +``` diff --git a/src/docs.ts b/src/docs.ts new file mode 100644 index 0000000..1b672ad --- /dev/null +++ b/src/docs.ts @@ -0,0 +1,51 @@ +import { type CollectionEntry, getCollection } from "astro:content"; +import { getPathParamsFromId } from "./languages"; + +type DocsEntry = CollectionEntry<"docs">; + +export const translatedDocsIndex = await getTranslatedDocsIndex(); + +export async function getTranslatedDocsIndex() { + // Slugs without lang prefix is required to generate all documents even not translated yet. + const sourceSlugs = new Set<string>(); + // Slug WITH lang prefix per entry mapping, here the translated pages + const docs: Record<string, DocsEntry> = {}; + + const docsList = await getCollection("docs"); + + docsList.forEach((doc) => { + let { slug, lang } = getPathParamsFromId(doc.id); + if (slug.endsWith("/index")) { + slug = slug.replace(/\/index$/, ""); + } + sourceSlugs.add(slug); + + docs[`${lang}/${slug}`] = doc; + }); + + return { docs, sourceSlugs }; +} + +export function getBreadcrumbs({ + path: originalPath, + docs, +}: { + path: string; + docs: Record<string, DocsEntry>; +}) { + const path = originalPath.replace(/\/$/, "").replace(/^\//, ""); + const breadcrumbs = []; + + let foundIndex = 0; + while ((foundIndex = path.indexOf("/", foundIndex + 1)) !== -1) { + const part = path.slice(0, foundIndex); + breadcrumbs.push(part); + } + + return breadcrumbs + .filter((path) => docs[path]) + .map((path) => ({ + title: docs[path].data.title, + path: `/${path}`, + })); +} diff --git a/src/env.d.ts b/src/env.d.ts new file mode 100644 index 0000000..2d22614 --- /dev/null +++ b/src/env.d.ts @@ -0,0 +1,16 @@ +/// <reference types="astro/client" /> +/// <reference path="../.astro/types.d.ts" /> + +interface ImportMetaEnv { + readonly GITHUB_TOKEN: string | undefined; +} + +interface ImportMeta { + readonly env: ImportMetaEnv; +} + +declare module "@pagefind/default-ui" { + export class PagefindUI { + constructor(options: {}); + } +} diff --git a/src/icons/Chevron.astro b/src/icons/Chevron.astro new file mode 100644 index 0000000..1b43bd8 --- /dev/null +++ b/src/icons/Chevron.astro @@ -0,0 +1,21 @@ +--- +interface Props { + size?: number; +} +const { size = 24 } = Astro.props; +--- + +<svg + xmlns="http://www.w3.org/2000/svg" + width={size} + height={size} + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" +> + <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> + <polyline points="9 6 15 12 9 18"></polyline> +</svg> diff --git a/src/icons/Copy.astro b/src/icons/Copy.astro new file mode 100644 index 0000000..ed77a1d --- /dev/null +++ b/src/icons/Copy.astro @@ -0,0 +1,26 @@ +--- +type Props = { size?: number }; +const { size = 24 } = Astro.props; +--- + +<svg xmlns="http://www.w3.org/2000/svg" width={size} height={size} fill="none" viewBox="0 0 20 20"> + <g + stroke="currentColor" + stroke-linecap="round" + stroke-linejoin="round" + stroke-width="1.25" + clip-path="url(#a)" + > + <path + d="M15 6.667H8.333c-.92 0-1.666.746-1.666 1.666V15c0 .92.746 1.667 1.666 1.667H15c.92 0 1.667-.747 1.667-1.667V8.333c0-.92-.746-1.666-1.667-1.666Z" + ></path> + <path + d="M13.333 6.667V5a1.667 1.667 0 0 0-1.666-1.667H5A1.667 1.667 0 0 0 3.333 5v6.667A1.667 1.667 0 0 0 5 13.333h1.667" + ></path> + </g> + <defs> + <clipPath id="a"> + <path fill="#fff" d="M0 0h20v20H0z"></path> + </clipPath> + </defs> +</svg> diff --git a/src/icons/Discord.astro b/src/icons/Discord.astro new file mode 100644 index 0000000..4366a77 --- /dev/null +++ b/src/icons/Discord.astro @@ -0,0 +1,12 @@ +<svg + class="only-medium" + role="img" + width="20" + viewBox="0 0 24 24" + xmlns="http://www.w3.org/2000/svg" +> + <path + fill="currentColor" + d="M20.317 4.3698a19.7913 19.7913 0 00-4.8851-1.5152.0741.0741 0 00-.0785.0371c-.211.3753-.4447.8648-.6083 1.2495-1.8447-.2762-3.68-.2762-5.4868 0-.1636-.3933-.4058-.8742-.6177-1.2495a.077.077 0 00-.0785-.037 19.7363 19.7363 0 00-4.8852 1.515.0699.0699 0 00-.0321.0277C.5334 9.0458-.319 13.5799.0992 18.0578a.0824.0824 0 00.0312.0561c2.0528 1.5076 4.0413 2.4228 5.9929 3.0294a.0777.0777 0 00.0842-.0276c.4616-.6304.8731-1.2952 1.226-1.9942a.076.076 0 00-.0416-.1057c-.6528-.2476-1.2743-.5495-1.8722-.8923a.077.077 0 01-.0076-.1277c.1258-.0943.2517-.1923.3718-.2914a.0743.0743 0 01.0776-.0105c3.9278 1.7933 8.18 1.7933 12.0614 0a.0739.0739 0 01.0785.0095c.1202.099.246.1981.3728.2924a.077.077 0 01-.0066.1276 12.2986 12.2986 0 01-1.873.8914.0766.0766 0 00-.0407.1067c.3604.698.7719 1.3628 1.225 1.9932a.076.076 0 00.0842.0286c1.961-.6067 3.9495-1.5219 6.0023-3.0294a.077.077 0 00.0313-.0552c.5004-5.177-.8382-9.6739-3.5485-13.6604a.061.061 0 00-.0312-.0286zM8.02 15.3312c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9555-2.4189 2.157-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.9555 2.4189-2.1569 2.4189zm7.9748 0c-1.1825 0-2.1569-1.0857-2.1569-2.419 0-1.3332.9554-2.4189 2.1569-2.4189 1.2108 0 2.1757 1.0952 2.1568 2.419 0 1.3332-.946 2.4189-2.1568 2.4189Z" + ></path> +</svg> diff --git a/src/icons/DiscordLined.astro b/src/icons/DiscordLined.astro new file mode 100644 index 0000000..7df6934 --- /dev/null +++ b/src/icons/DiscordLined.astro @@ -0,0 +1,28 @@ +--- +type Props = { size?: number }; +const { size = 24 } = Astro.props; +--- + +<svg + xmlns="http://www.w3.org/2000/svg" + width={size} + height={size} + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" +> + <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> + <circle cx="9" cy="12" r="1"></circle> + <circle cx="15" cy="12" r="1"></circle> + <path d="M7.5 7.5c3.5 -1 5.5 -1 9 0"></path> + <path d="M7 16.5c3.5 1 6.5 1 10 0"></path> + <path + d="M15.5 17c0 1 1.5 3 2 3c1.5 0 2.833 -1.667 3.5 -3c.667 -1.667 .5 -5.833 -1.5 -11.5c-1.457 -1.015 -3 -1.34 -4.5 -1.5l-1 2.5" + ></path> + <path + d="M8.5 17c0 1 -1.356 3 -1.832 3c-1.429 0 -2.698 -1.667 -3.333 -3c-.635 -1.667 -.476 -5.833 1.428 -11.5c1.388 -1.015 2.782 -1.34 4.237 -1.5l1 2.5" + ></path> +</svg> diff --git a/src/icons/Dots.astro b/src/icons/Dots.astro new file mode 100644 index 0000000..5708e5d --- /dev/null +++ b/src/icons/Dots.astro @@ -0,0 +1,16 @@ +<svg + xmlns="http://www.w3.org/2000/svg" + width="20" + height="20" + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" +> + <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> + <circle cx="5" cy="12" r="1"></circle> + <circle cx="12" cy="12" r="1"></circle> + <circle cx="19" cy="12" r="1"></circle> +</svg> diff --git a/src/icons/EditPencil.astro b/src/icons/EditPencil.astro new file mode 100644 index 0000000..ff0c29a --- /dev/null +++ b/src/icons/EditPencil.astro @@ -0,0 +1,21 @@ +--- +type Props = { size?: number }; +const { size = 24 } = Astro.props; +--- + +<svg + xmlns="http://www.w3.org/2000/svg" + width={size} + height={size} + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" +> + <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> + <path d="M9 7h-3a2 2 0 0 0 -2 2v9a2 2 0 0 0 2 2h9a2 2 0 0 0 2 -2v-3"></path> + <path d="M9 15h3l8.5 -8.5a1.5 1.5 0 0 0 -3 -3l-8.5 8.5v3"></path> + <line x1="16" y1="5" x2="19" y2="8"></line> +</svg> diff --git a/src/icons/Effector.astro b/src/icons/Effector.astro new file mode 100644 index 0000000..98f9518 --- /dev/null +++ b/src/icons/Effector.astro @@ -0,0 +1,382 @@ +--- +interface Props { + class?: string; +} +--- + +<svg + xmlns="http://www.w3.org/2000/svg" + width="100%" + height="100%" + viewBox="0 0 1600 1600" + preserveAspectRatio="xMidYMid meet" + class={Astro.props.class} +> + <g id="layer101" fill="#7f2400" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z" + ></path> + </g> + <g id="layer102" fill="#943102" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-687 -622 c0 -6 -14 -19 -31 -29 -26 -16 -35 -17 -51 -8 -17 11 -16 13 19 29 44 20 63 22 63 8z m47 -47 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m-144 -9 c9 -9 -31 -51 -65 -70 -38 -20 -37 1 1 44 29 31 50 39 64 26z" + ></path> + </g> + <g id="layer103" fill="#af3a01" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-658 -611 c7 -5 11 -14 7 -19 -4 -6 2 -16 13 -22 13 -6 18 -16 14 -26 -5 -13 -17 -15 -59 -12 -64 5 -111 32 -93 54 21 25 93 41 118 25z m-352 -58 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m248 -18 c31 -19 35 -25 20 -26 -11 -1 -24 -1 -28 0 -5 1 -28 -14 -50 -34 -23 -19 -50 -41 -59 -49 -41 -35 -108 -57 -108 -35 0 21 2 24 22 32 19 7 19 6 7 -10 -7 -10 0 -6 17 10 30 27 51 36 39 17 -3 -5 -1 -10 4 -10 14 0 14 17 0 26 -7 4 8 25 37 55 27 27 51 49 54 49 3 0 23 -12 45 -25z m100 -25 c3 -5 -1 -10 -10 -10 -9 0 -13 5 -10 10 3 6 8 10 10 10 2 0 7 -4 10 -10z m56 -10 c10 0 19 -4 19 -10 0 -13 -6 -13 -31 0 -10 6 -19 16 -18 23 0 9 2 9 6 0 2 -7 13 -13 24 -13z m-421 -100 c0 -5 -7 -10 -17 -10 -9 0 -31 -11 -50 -26 -32 -24 -33 -24 -33 -5 0 14 11 26 33 35 39 17 67 20 67 6z m507 -37 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z" + ></path> + </g> + <g id="layer104" fill="#b94703" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-658 -611 c7 -5 11 -13 8 -18 -3 -5 11 -20 32 -34 25 -15 35 -27 27 -32 -8 -5 -5 -12 8 -22 11 -8 16 -18 13 -22 -4 -4 -57 -7 -118 -8 -109 -1 -111 -1 -131 -28 -11 -15 -39 -38 -61 -51 -48 -28 -147 -43 -158 -25 -11 18 -63 -27 -69 -59 -3 -15 -15 -31 -26 -37 -12 -6 -28 -16 -36 -23 -35 -28 -38 34 -5 75 13 15 26 35 30 45 3 9 19 19 35 23 22 4 32 14 37 33 4 15 10 21 12 15 3 -7 17 -13 31 -13 52 0 106 28 159 81 l52 53 46 -23 c25 -12 51 -21 58 -18 6 2 -4 11 -23 20 -61 27 -65 32 -44 55 20 22 96 30 123 13z m-312 -66 c-15 -14 -27 -30 -27 -35 0 -6 -9 -10 -20 -10 -14 0 -20 6 -18 18 2 10 -2 16 -10 14 -8 -1 -12 3 -10 10 4 11 41 21 98 27 9 0 4 -9 -13 -24z m303 -135 c0 -5 -9 -10 -20 -10 -11 0 -20 5 -20 10 0 6 9 10 20 10 11 0 20 -4 20 -10z m27 -7 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m159 -20 c-7 -7 -26 7 -26 19 0 6 6 6 15 -2 9 -7 13 -15 11 -17z m-26 -32 c0 -11 -5 -10 -20 4 -15 14 -17 20 -8 26 13 8 28 -7 28 -30z" + ></path> + </g> + <g id="layer105" fill="#cd3b01" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-664 -609 c10 -2 16 -11 13 -18 -3 -8 15 -23 45 -39 27 -15 50 -34 51 -42 0 -8 1 -20 2 -26 1 -7 -12 -15 -28 -18 -21 -4 -30 -12 -33 -29 -2 -17 1 -22 11 -18 20 8 27 -3 15 -24 -7 -13 -21 -19 -47 -19 -46 0 -112 18 -112 30 0 15 39 32 60 25 11 -4 20 -3 20 2 0 5 -23 14 -51 20 -59 14 -71 10 -134 -48 -51 -47 -81 -59 -153 -60 -57 -1 -97 -14 -88 -27 7 -11 -15 -34 -63 -67 -23 -16 -47 -39 -51 -51 -12 -31 -30 -40 -30 -15 0 11 8 25 18 30 13 7 19 22 20 47 1 21 6 42 12 48 5 5 10 18 10 28 0 10 6 18 14 18 8 0 16 6 19 14 3 8 19 17 35 21 22 4 32 14 37 33 4 15 10 21 12 15 14 -39 130 4 195 73 l47 48 45 -23 c26 -12 52 -21 59 -18 6 2 -4 11 -23 20 -62 28 -64 31 -45 61 16 25 22 27 59 21 23 -4 49 -9 59 -12z m-311 -84 c-41 -39 -62 -43 -62 -13 0 8 -7 14 -16 14 -33 0 6 29 44 33 80 8 78 9 34 -34z m-172 -63 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m690 -60 c0 -8 -3 -22 -6 -31 -6 -14 -10 -13 -31 7 -22 21 -23 23 -6 29 29 12 43 10 43 -5z m-44 -60 c10 -24 22 -43 25 -40 4 2 12 -3 19 -10 9 -12 6 -18 -14 -31 -14 -10 -26 -21 -26 -26 0 -16 32 -10 46 9 12 15 13 13 14 -22 0 -22 -3 -36 -7 -33 -3 4 -12 2 -19 -4 -10 -8 -24 -1 -56 29 -24 22 -52 41 -62 43 -10 2 -24 11 -29 20 -15 23 15 52 45 45 13 -3 17 -3 10 0 -10 5 -10 9 -1 20 9 11 8 15 -6 20 -13 5 -14 9 -3 15 28 18 46 9 64 -35z m94 -108 c0 -18 -2 -20 -9 -8 -6 8 -7 18 -5 22 9 14 14 9 14 -14z m-210 -22 c0 -3 -4 -8 -10 -11 -5 -3 -10 -1 -10 4 0 6 5 11 10 11 6 0 10 -2 10 -4z" + ></path> + </g> + <g id="layer106" fill="#d14c02" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-664 -609 c10 -2 16 -11 13 -18 -3 -8 15 -23 45 -39 27 -15 50 -34 51 -42 0 -8 1 -20 2 -26 1 -7 -12 -15 -28 -18 -21 -4 -30 -12 -33 -28 -2 -17 1 -22 14 -20 12 2 18 -3 18 -17 0 -19 -6 -20 -82 -18 -49 2 -83 -2 -83 -7 0 -15 -34 -12 -56 5 -23 17 -60 19 -70 4 -12 -20 -71 -39 -126 -40 -77 -1 -88 -6 -88 -37 0 -29 -16 -43 -83 -74 -22 -10 -36 -22 -32 -28 7 -12 -12 -40 -26 -40 -18 0 -9 48 9 52 14 4 19 16 20 43 1 21 6 43 12 49 5 5 10 21 10 35 0 29 26 61 50 61 23 0 50 31 33 37 -24 8 -13 49 20 80 25 24 44 32 92 38 l60 7 -22 -24 c-13 -13 -23 -35 -23 -48 0 -23 0 -23 21 -4 20 18 21 18 31 1 8 -16 14 -14 51 23 23 22 45 40 49 40 4 0 25 -9 47 -21 23 -11 46 -19 53 -16 8 3 1 9 -14 16 -16 6 -39 18 -52 26 l-24 16 22 25 c18 21 27 23 61 18 22 -3 48 -8 58 -11z m-479 -157 c-6 -16 -24 -23 -24 -8 0 10 22 33 27 28 2 -2 1 -11 -3 -20z m-31 -51 c-21 -29 -38 -33 -23 -6 8 16 20 25 38 30 2 1 -5 -10 -15 -24z m717 1 c0 -8 -3 -22 -6 -31 -6 -14 -10 -13 -31 7 -22 21 -23 23 -6 29 29 12 43 10 43 -5z m-44 -60 c10 -24 22 -43 25 -40 4 2 12 -3 19 -10 9 -12 6 -18 -14 -31 -14 -10 -26 -21 -26 -26 0 -16 32 -10 46 9 12 15 13 13 14 -22 0 -22 -3 -36 -7 -33 -3 4 -12 2 -19 -4 -10 -8 -24 -1 -56 29 -24 22 -52 41 -62 43 -10 2 -24 11 -29 20 -15 23 15 52 45 45 13 -3 17 -3 10 0 -10 5 -10 9 -1 20 9 11 8 15 -6 20 -13 5 -14 9 -3 15 28 18 46 9 64 -35z m-166 -46 c0 -5 -9 -10 -20 -10 -11 0 -20 5 -20 10 0 6 9 10 20 10 11 0 20 -4 20 -10z m-340 -20 c0 -5 -5 -10 -11 -10 -5 0 -7 5 -4 10 3 6 8 10 11 10 2 0 4 -4 4 -10z m600 -42 c0 -18 -2 -20 -9 -8 -6 8 -7 18 -5 22 9 14 14 9 14 -14z m-210 -22 c0 -3 -4 -8 -10 -11 -5 -3 -10 -1 -10 4 0 6 5 11 10 11 6 0 10 -2 10 -4z" + ></path> + <path d="M670 750 c19 -13 30 -13 30 0 0 6 -10 10 -22 10 -19 0 -20 -2 -8 -10z"></path> + </g> + <g id="layer107" fill="#ea3d00" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-661 -609 c8 -3 13 -11 10 -18 -2 -7 15 -24 42 -39 26 -14 58 -34 72 -45 l25 -20 -23 -23 c-26 -29 -27 -32 -7 -52 9 -8 26 -38 39 -65 13 -28 25 -48 28 -46 3 3 11 -2 18 -10 19 -23 29 -103 18 -141 -7 -27 -14 -33 -40 -36 -34 -3 -35 -6 -53 -91 -9 -46 -30 -26 -30 29 0 43 -3 50 -27 62 -17 8 -28 21 -28 33 0 13 -7 19 -21 19 -24 0 -48 26 -49 51 0 9 -12 30 -27 46 -16 17 -28 38 -28 47 0 15 -40 46 -92 72 -7 3 -27 -6 -44 -20 -17 -14 -35 -26 -40 -26 -5 0 -9 -9 -9 -20 0 -22 12 -25 40 -10 20 11 50 4 50 -11 0 -5 -8 -12 -17 -15 -58 -18 -64 -23 -53 -44 14 -27 6 -25 -35 6 -21 15 -36 21 -40 15 -10 -17 -53 -13 -64 7 -7 11 -13 13 -18 6 -9 -13 -49 -27 -78 -28 -14 -1 -28 -17 -47 -54 -25 -49 -28 -52 -38 -32 -15 28 -9 65 10 65 11 0 15 11 16 38 0 21 6 43 12 49 7 7 12 23 12 36 0 36 18 62 44 62 35 0 52 25 32 45 -19 19 -12 37 31 77 24 23 40 28 109 34 56 5 83 3 88 -5 8 -12 -34 -33 -69 -35 -13 -1 -21 -9 -24 -26 l-3 -25 22 20 c21 19 22 19 32 1 9 -17 14 -15 48 23 21 22 43 41 49 41 6 0 28 -9 50 -21 23 -11 46 -19 53 -17 6 2 -15 18 -48 34 -59 29 -69 46 -40 67 11 8 114 1 142 -10z m-188 -15 c-3 -7 -15 -13 -28 -13 -13 0 -25 6 -27 13 -3 8 6 12 27 12 21 0 30 -4 28 -12z m-288 -137 c-10 -20 -30 -29 -30 -14 0 10 33 44 37 39 3 -2 0 -14 -7 -25z m17 -18 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z m-54 -38 c-18 -25 -40 -35 -27 -12 14 24 27 37 36 37 5 0 1 -11 -9 -25z m721 9 c3 -9 6 -32 6 -51 l0 -36 -35 39 c-40 45 -41 51 -17 57 32 9 40 7 46 -9z m56 -178 c0 -47 -22 -16 -26 36 -3 42 -3 42 11 18 8 -14 14 -38 15 -54z m-745 -118 c4 -3 9 -27 11 -53 6 -47 5 -47 -17 -32 -12 9 -30 34 -39 55 l-18 40 29 -2 c16 -1 31 -5 34 -8z m682 -105 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z" + ></path> + </g> + <g id="layer108" fill="#b1562f" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-661 -609 c8 -3 13 -11 10 -18 -2 -7 15 -24 42 -39 26 -14 58 -34 72 -45 l25 -20 -23 -23 c-26 -29 -27 -32 -7 -52 9 -8 26 -38 39 -65 13 -28 25 -48 28 -46 3 3 11 -2 18 -10 19 -23 29 -103 18 -141 -7 -27 -14 -33 -40 -36 -34 -3 -35 -6 -53 -91 -9 -46 -30 -26 -30 29 0 43 -3 50 -27 62 -17 8 -28 21 -28 33 0 13 -7 19 -23 19 -15 0 -28 9 -34 23 -6 12 -16 34 -23 49 -7 14 -23 29 -35 32 -13 3 -42 28 -65 56 -23 27 -46 50 -50 50 -5 0 -24 -10 -44 -22 -50 -33 -48 -76 3 -49 10 6 28 7 40 4 17 -4 19 -8 10 -19 -6 -8 -20 -14 -31 -14 -27 0 -33 -27 -12 -52 19 -20 19 -21 -6 -13 -14 4 -38 18 -54 30 l-29 23 -29 -21 c-28 -21 -30 -21 -42 -4 -15 19 -46 23 -63 6 -6 -6 -9 -28 -6 -49 4 -26 0 -47 -12 -67 -16 -28 -16 -31 4 -76 23 -50 27 -77 11 -77 -5 0 -10 5 -10 10 0 6 -12 23 -27 38 -16 15 -36 44 -45 65 -16 36 -16 37 2 37 44 0 81 73 44 87 -17 6 -63 -41 -64 -67 0 -11 -4 -10 -16 5 -18 25 -15 70 6 70 11 0 15 11 16 38 0 21 6 43 12 49 7 7 12 24 12 39 0 15 11 40 24 56 13 15 27 39 31 52 4 13 23 40 41 61 33 36 39 39 109 45 41 4 82 4 91 1 15 -6 15 -8 -1 -26 -23 -26 -10 -26 22 0 32 25 43 25 92 -1 23 -11 46 -19 53 -17 6 2 -15 18 -48 34 -59 29 -69 46 -40 67 11 8 114 1 142 -10z m-188 -15 c-3 -7 -15 -13 -28 -13 -13 0 -25 6 -27 13 -3 8 6 12 27 12 21 0 30 -4 28 -12z m-288 -137 c-10 -20 -30 -29 -30 -14 0 10 33 44 37 39 3 -2 0 -14 -7 -25z m-37 -56 c-18 -25 -40 -35 -27 -12 14 24 27 37 36 37 5 0 1 -11 -9 -25z m721 9 c3 -9 6 -32 6 -51 l0 -36 -35 39 c-40 45 -41 51 -17 57 32 9 40 7 46 -9z m56 -178 c0 -47 -22 -16 -26 36 -3 42 -3 42 11 18 8 -14 14 -38 15 -54z m-63 -223 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z" + ></path> + </g> + <g id="layer109" fill="#f35701" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-639 -617 c51 -24 71 -42 32 -30 -29 9 -25 -2 8 -20 15 -8 40 -26 57 -39 l29 -25 -22 -24 c-27 -28 -27 -28 -2 -57 15 -17 20 -19 20 -8 0 21 50 34 61 16 5 -7 9 -33 9 -57 0 -42 -1 -43 -15 -25 -22 29 -18 0 6 -40 25 -43 42 -47 34 -8 l-6 27 15 -25 c19 -32 21 -80 2 -80 -8 0 -18 -19 -25 -44 -10 -40 -14 -45 -43 -48 -34 -3 -35 -6 -53 -91 -9 -46 -30 -26 -30 29 0 43 -3 50 -27 62 -17 8 -28 21 -28 33 0 13 -7 19 -23 19 -15 0 -28 9 -34 23 -6 12 -16 34 -23 49 -7 14 -23 29 -35 32 -13 3 -42 28 -65 56 -23 27 -46 50 -50 50 -5 0 -24 -10 -44 -22 -50 -33 -48 -76 3 -49 10 6 28 7 40 4 17 -4 19 -8 10 -19 -6 -8 -20 -14 -31 -14 -27 0 -33 -27 -12 -52 19 -20 19 -21 -6 -13 -14 4 -38 18 -54 30 l-29 23 -29 -21 c-28 -21 -30 -21 -42 -4 -15 19 -46 23 -63 6 -6 -6 -9 -28 -6 -49 4 -26 0 -47 -12 -67 -16 -28 -16 -31 4 -76 23 -50 27 -77 11 -77 -5 0 -10 5 -10 10 0 6 -12 23 -27 38 -16 15 -36 44 -45 65 -16 36 -16 37 2 37 44 0 81 73 44 87 -17 6 -63 -41 -64 -66 0 -11 -6 -9 -20 7 -26 27 -25 47 1 66 16 11 22 28 25 66 3 34 13 64 32 92 15 22 36 58 47 78 11 21 33 52 48 70 26 31 33 33 103 37 42 3 83 2 91 -1 14 -6 14 -9 -2 -26 -23 -26 -10 -26 22 0 14 11 37 20 52 20 25 1 25 1 5 13 -21 12 -21 35 0 49 24 17 112 7 164 -17z m-301 -1 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m91 -6 c-3 -7 -15 -13 -28 -13 -13 0 -25 6 -27 13 -3 8 6 12 27 12 21 0 30 -4 28 -12z m-288 -137 c-6 -12 -17 -21 -26 -21 -11 0 -12 4 -4 19 9 18 31 32 38 25 2 -1 -1 -12 -8 -23z m-36 -56 c-16 -25 -34 -33 -34 -16 0 12 29 41 41 41 5 0 2 -11 -7 -25z m713 -392 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z" + ></path> + </g> + <g id="layer110" fill="#db592c" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-639 -617 c54 -25 69 -41 30 -30 -21 5 -22 4 -5 -7 78 -55 116 -88 107 -93 -14 -8 6 -35 26 -35 20 0 34 -33 34 -81 0 -40 -1 -41 -15 -23 -22 29 -18 0 6 -40 25 -43 42 -47 34 -8 l-6 27 15 -25 c20 -32 21 -80 2 -80 -9 0 -19 -19 -26 -50 -7 -27 -21 -62 -33 -76 -19 -25 -21 -25 -33 -9 -15 20 -18 16 -28 -44 -4 -19 -14 -43 -24 -54 -9 -11 -17 -28 -17 -40 0 -13 -22 -38 -60 -69 -75 -60 -113 -78 -167 -78 l-43 0 47 25 c26 14 56 25 66 25 10 0 27 10 38 22 l19 22 -27 -17 c-37 -23 -46 -21 -41 7 4 20 14 27 57 37 86 20 96 42 45 98 -29 32 -30 38 -24 86 6 50 5 53 -22 63 -15 7 -41 11 -58 9 -24 -2 -30 2 -30 18 0 11 9 24 21 29 21 9 20 10 -12 43 -40 40 -51 41 -66 8 -10 -21 -8 -29 10 -48 12 -13 22 -28 22 -34 0 -15 -30 -25 -44 -14 -6 5 -38 19 -70 31 -56 21 -60 22 -93 6 -18 -9 -42 -16 -52 -16 -20 0 -37 -42 -25 -61 3 -5 0 -16 -6 -24 -13 -16 -8 -50 17 -102 11 -24 12 -36 3 -52 -9 -19 -7 -23 16 -32 15 -5 33 -8 41 -5 18 7 17 32 -2 40 -19 7 -20 26 -1 26 8 0 22 -14 30 -32 20 -39 20 -48 0 -48 -10 0 -14 -7 -12 -22 2 -18 10 -23 33 -24 33 0 55 -10 55 -23 0 -10 -47 -3 -80 12 -50 23 -100 60 -105 78 -4 10 -22 33 -41 51 -19 18 -34 42 -34 54 0 26 -58 144 -71 144 -17 0 -9 39 12 54 16 11 22 28 25 66 3 34 13 64 32 92 15 22 36 58 47 78 11 21 33 53 49 71 28 33 30 34 120 36 107 3 108 3 77 12 -44 12 -33 27 26 38 101 18 153 15 211 -12z m-301 -1 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m-197 -143 c-6 -12 -17 -21 -26 -21 -11 0 -12 4 -4 19 9 18 31 32 38 25 2 -1 -1 -12 -8 -23z m-36 -56 c-16 -25 -34 -33 -34 -16 0 12 29 41 41 41 5 0 2 -11 -7 -25z m-114 -199 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m253 -126 c-7 -8 -22 24 -16 34 4 5 10 1 13 -10 4 -10 6 -21 3 -24z m637 26 c0 -2 -3 -11 -6 -20 -9 -24 -33 -20 -27 4 4 16 33 30 33 16z m-621 -89 c-9 -21 -15 -24 -25 -16 -11 9 -10 15 4 34 22 30 37 16 21 -18z m558 -4 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z" + ></path> + <path d="M520 880 c0 -5 15 -10 33 -10 24 0 28 3 17 10 -20 13 -50 13 -50 0z"></path> + <path d="M840 710 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"></path> + <path d="M588 113 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"></path> + </g> + <g id="layer111" fill="#fe6801" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-639 -617 c53 -25 70 -42 30 -30 -29 9 -19 0 55 -49 41 -28 55 -42 47 -51 -12 -14 6 -35 31 -35 17 0 39 -46 39 -81 0 -10 9 -33 20 -51 22 -36 28 -132 9 -158 -8 -12 -10 -9 -6 12 2 15 0 33 -4 40 -6 9 -9 5 -9 -12 0 -26 -32 -103 -52 -127 -8 -10 -14 -10 -24 -2 -10 8 -15 2 -23 -29 -6 -21 -20 -47 -31 -57 -12 -11 -18 -25 -15 -36 4 -12 -5 -26 -31 -46 -21 -15 -50 -40 -66 -54 -34 -33 -78 -49 -132 -49 -46 0 -49 -4 37 43 16 8 28 17 28 21 -4 39 1 44 52 56 87 21 98 43 46 99 -29 32 -30 38 -24 86 6 50 5 53 -22 63 -15 7 -41 11 -58 9 -24 -2 -30 2 -30 18 0 11 9 24 21 29 21 9 20 10 -12 43 -40 40 -51 41 -66 8 -10 -21 -8 -29 10 -48 12 -13 22 -28 22 -34 0 -15 -30 -25 -44 -14 -6 5 -38 19 -70 31 -56 21 -60 22 -93 6 -18 -9 -42 -16 -52 -16 -20 0 -37 -42 -25 -61 3 -5 0 -16 -6 -24 -13 -16 -8 -50 17 -102 11 -24 12 -36 3 -52 -9 -19 -7 -23 16 -32 15 -5 33 -8 41 -5 18 7 17 32 -2 40 -19 7 -20 26 -1 26 8 0 22 -14 30 -32 20 -39 20 -48 0 -48 -10 0 -14 -7 -12 -23 2 -17 10 -22 33 -23 33 0 55 -10 55 -23 0 -24 -124 25 -160 63 -66 69 -99 116 -109 152 -6 22 -25 61 -42 87 -34 51 -34 74 1 152 27 58 33 85 21 85 -15 0 -14 26 2 42 6 8 19 27 27 43 8 15 31 37 50 47 19 11 43 29 53 40 17 20 70 31 140 28 25 0 27 1 15 14 -8 8 -26 16 -39 18 -13 2 8 8 46 12 39 4 75 9 80 11 38 13 135 3 183 -20z m-648 -399 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m253 -126 c-7 -8 -22 24 -16 34 4 5 10 1 13 -10 4 -10 6 -21 3 -24z m637 17 c0 -7 -12 -24 -27 -38 -16 -14 -34 -34 -41 -44 -12 -19 -12 -19 -6 3 14 56 74 119 74 79z m-621 -80 c-9 -21 -15 -24 -25 -16 -11 9 -10 15 4 34 22 30 37 16 21 -18z m-98 -124 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8 3 21 -13z" + ></path> + <path d="M558 873 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"></path> + <path + d="M890 651 c0 -7 11 -26 25 -43 14 -17 25 -23 25 -15 0 7 -11 27 -25 43 -14 16 -25 23 -25 15z" + ></path> + <path d="M643 153 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path d="M588 113 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"></path> + </g> + <g id="layer112" fill="#b76f4a" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-639 -617 c54 -25 69 -41 30 -30 -21 5 -22 5 -4 -7 99 -67 135 -100 155 -140 11 -24 21 -54 21 -66 0 -12 9 -36 20 -54 22 -36 28 -132 9 -158 -8 -12 -10 -9 -6 12 2 15 0 33 -4 40 -6 9 -9 5 -9 -12 0 -26 -32 -103 -52 -127 -8 -10 -14 -10 -24 -2 -10 8 -15 2 -23 -29 -6 -21 -20 -47 -31 -57 -12 -11 -18 -25 -15 -36 4 -12 -5 -26 -31 -46 -21 -15 -50 -40 -66 -55 -35 -33 -117 -61 -146 -51 -20 8 -17 11 30 35 38 20 48 29 36 33 -9 4 -29 0 -45 -8 -46 -23 -98 -28 -165 -16 -67 12 -62 8 -167 129 -21 25 -44 63 -50 86 -6 22 -25 61 -42 87 -34 51 -34 74 1 152 27 58 33 85 21 85 -15 0 -14 26 2 42 6 8 19 27 27 43 8 15 31 37 50 47 19 11 43 29 53 40 17 20 70 31 140 28 25 0 27 1 15 14 -8 8 -26 16 -39 18 -13 2 8 8 46 12 39 4 75 9 80 11 38 13 135 3 183 -20z m-648 -399 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m906 -80 c-12 -25 -33 -55 -46 -68 -14 -14 -31 -33 -38 -44 -12 -18 -12 -17 -6 5 7 27 37 72 79 119 16 17 30 32 31 32 1 0 -8 -20 -20 -44z m-861 -176 c3 -5 4 -10 1 -10 -3 0 -8 5 -11 10 -3 6 -4 10 -1 10 3 0 8 -4 11 -10z m135 -65 c13 -14 21 -25 18 -25 -2 0 -15 11 -28 25 -13 14 -21 25 -18 25 2 0 15 -11 28 -25z m347 -172 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z" + ></path> + <path d="M558 873 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"></path> + <path + d="M890 651 c0 -7 11 -26 25 -43 14 -17 25 -23 25 -15 0 7 -11 27 -25 43 -14 16 -25 23 -25 15z" + ></path> + <path d="M643 153 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + </g> + <g id="layer113" fill="#d46a34" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-613 -626 c30 -18 44 -31 37 -36 -8 -4 7 -21 42 -48 55 -41 97 -106 97 -150 0 -12 9 -36 20 -54 22 -36 28 -132 9 -158 -8 -12 -10 -9 -6 12 2 15 0 33 -4 40 -6 9 -9 5 -9 -12 0 -26 -32 -103 -52 -127 -8 -10 -14 -10 -24 -2 -10 8 -15 2 -23 -29 -6 -21 -20 -47 -31 -57 -12 -11 -18 -25 -15 -36 4 -12 -5 -26 -31 -46 -21 -15 -50 -40 -66 -55 -35 -33 -117 -61 -146 -51 -20 8 -17 11 30 35 38 20 48 29 36 33 -9 4 -29 0 -45 -8 -46 -23 -98 -28 -165 -16 -67 12 -62 8 -167 129 -22 25 -43 59 -47 75 -9 40 -32 84 -60 117 l-22 27 20 58 c11 32 24 63 28 68 15 20 20 63 8 67 -7 3 -9 14 -4 31 4 17 11 25 18 21 6 -4 8 -3 4 4 -7 11 40 72 56 72 17 0 69 41 63 50 -9 15 11 20 89 21 66 1 73 3 61 16 -11 10 -25 12 -48 8 -25 -6 -30 -5 -20 5 6 7 45 15 85 17 40 3 75 7 78 10 3 2 39 3 80 1 61 -2 84 -8 124 -32z m-627 -253 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m-47 -137 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m906 -80 c-12 -25 -33 -55 -46 -68 -14 -14 -31 -33 -38 -44 -12 -18 -12 -17 -6 5 7 27 37 72 79 119 16 17 30 32 31 32 1 0 -8 -20 -20 -44z m-861 -176 c3 -5 4 -10 1 -10 -3 0 -8 5 -11 10 -3 6 -4 10 -1 10 3 0 8 -4 11 -10z m135 -65 c13 -14 21 -25 18 -25 -2 0 -15 11 -28 25 -13 14 -21 25 -18 25 2 0 15 -11 28 -25z m347 -172 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z" + ></path> + <path + d="M890 651 c0 -7 11 -26 25 -43 14 -17 25 -23 25 -15 0 7 -11 27 -25 43 -14 16 -25 23 -25 15z" + ></path> + <path d="M643 153 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + </g> + <g id="layer114" fill="#f46f32" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-834 -589 c-5 -13 -3 -15 13 -8 25 12 124 8 160 -5 45 -17 144 -84 141 -95 -2 -5 16 -33 40 -63 24 -29 43 -63 43 -76 0 -13 11 -48 25 -78 28 -59 31 -99 10 -143 -11 -24 -14 -26 -14 -10 -1 12 -15 -5 -38 -48 -27 -51 -39 -65 -48 -57 -10 8 -15 4 -20 -18 -3 -16 -17 -40 -31 -53 -15 -14 -22 -29 -19 -40 4 -12 -6 -26 -31 -46 -21 -15 -50 -40 -66 -55 -35 -33 -117 -61 -146 -51 -20 8 -17 11 30 35 38 20 48 29 36 33 -9 4 -29 0 -45 -8 -46 -23 -98 -28 -165 -16 -67 12 -64 10 -166 129 -22 25 -47 68 -56 96 -9 28 -25 60 -35 71 -41 43 -41 53 -5 147 39 102 38 97 19 90 -9 -4 -15 0 -15 9 0 22 62 110 85 122 36 18 61 40 68 58 5 13 18 17 54 18 48 0 104 16 73 19 -8 1 -24 2 -35 1 -20 -2 -20 -1 -1 14 11 8 34 15 52 15 17 0 37 7 44 15 18 21 51 20 43 -2z m-406 -290 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m-47 -137 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m902 -88 c-14 -29 -34 -62 -46 -74 -12 -11 -26 -29 -32 -40 -20 -34 -27 -6 -8 30 15 28 102 136 110 136 0 0 -10 -24 -24 -52z m-857 -168 c3 -5 4 -10 1 -10 -3 0 -8 5 -11 10 -3 6 -4 10 -1 10 3 0 8 -4 11 -10z m135 -65 c13 -14 21 -25 18 -25 -2 0 -15 11 -28 25 -13 14 -21 25 -18 25 2 0 15 -11 28 -25z m347 -172 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z" + ></path> + <path d="M800 850 c14 -11 30 -20 35 -20 6 0 -1 9 -15 20 -14 11 -29 20 -35 20 -5 0 1 -9 15 -20z" + ></path> + <path d="M643 153 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + </g> + <g id="layer115" fill="#da774e" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-737 -587 c80 -14 95 -21 198 -86 12 -7 22 -18 22 -22 0 -5 -14 1 -31 13 -16 12 -32 20 -35 18 -5 -6 106 -82 120 -83 5 0 10 -11 12 -25 5 -47 21 -105 44 -154 18 -39 21 -59 16 -100 -5 -44 -4 -49 8 -33 19 25 27 21 20 -10 -8 -31 -36 -76 -68 -109 -12 -11 -26 -29 -32 -40 -19 -32 -27 -7 -9 28 10 18 23 44 31 58 7 14 15 39 18 55 6 29 6 29 -10 -5 -33 -72 -55 -101 -69 -90 -10 9 -15 4 -20 -19 -3 -17 -15 -42 -26 -56 -17 -21 -18 -25 -5 -25 9 0 16 -6 16 -14 0 -18 -17 -30 -22 -17 -1 6 -32 -17 -68 -51 -81 -76 -164 -107 -208 -79 -10 6 -7 11 15 19 34 12 70 38 62 46 -3 3 -24 -4 -46 -15 -41 -20 -77 -23 -177 -17 -41 3 -52 8 -65 29 -24 40 -72 101 -97 124 -12 11 -29 45 -38 75 -8 31 -24 64 -34 75 -38 41 -40 54 -21 117 9 33 22 65 27 71 5 7 13 22 16 34 6 18 4 22 -8 17 -10 -4 -16 -1 -16 9 0 22 62 110 85 122 36 18 61 40 68 58 5 13 18 17 54 18 48 0 104 16 73 19 -8 1 -24 2 -35 1 -20 -2 -20 -1 -1 14 11 8 34 15 52 15 17 0 37 7 44 15 15 19 33 19 140 0z m-503 -292 c-3 -10 -5 -2 -5 17 0 19 2 27 5 18 2 -10 2 -26 0 -35z m-51 -117 c9 -18 7 -27 -7 -45 l-18 -22 -6 35 c-11 54 11 76 31 32z m64 -289 c0 -6 -9 -2 -20 8 -11 10 -17 22 -13 28 6 10 33 -19 33 -36z m141 -75 c-13 -4 -71 45 -71 61 0 5 19 -6 41 -24 24 -19 37 -35 30 -37z m554 28 c-3 -5 -11 -10 -16 -10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-75 -34 c0 -2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z m-265 -86 c8 -13 -5 -13 -25 0 -13 8 -13 10 2 10 9 0 20 -4 23 -10z m71 -39 c5 1 16 0 24 -4 8 -3 22 -8 30 -10 8 -3 -1 -6 -20 -6 -33 0 -70 17 -70 34 0 4 6 2 14 -4 8 -6 18 -11 22 -10z" + ></path> + </g> + <g id="layer116" fill="#b78d65" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-697 -593 c62 -13 179 -86 200 -124 9 -16 23 -30 31 -30 8 0 14 -7 14 -15 1 -21 24 -96 47 -154 14 -36 19 -65 16 -102 -3 -29 -1 -51 4 -48 4 3 8 12 8 20 0 8 5 12 10 9 12 -8 3 -51 -19 -85 -21 -34 -103 -131 -107 -127 -2 2 1 19 6 38 9 31 8 32 -5 15 -15 -20 -15 -20 -15 0 -1 15 -4 12 -17 -11 -8 -16 -22 -38 -31 -47 -14 -16 -13 -18 1 -18 10 0 17 -6 17 -14 0 -18 -17 -30 -22 -17 -1 6 -32 -17 -68 -51 -81 -76 -164 -107 -208 -79 -10 6 -7 11 15 19 34 12 70 38 62 46 -3 3 -24 -4 -46 -15 -41 -20 -77 -23 -177 -17 -41 3 -52 8 -65 29 -24 39 -72 101 -97 124 -12 11 -30 45 -39 75 -10 30 -21 59 -26 64 -12 14 -12 -11 1 -34 9 -18 8 -18 -16 -5 -31 16 -44 33 -44 58 0 11 4 15 11 11 8 -5 10 2 7 21 -6 30 -1 51 31 135 14 37 16 49 6 36 -8 -11 -15 -23 -15 -28 0 -4 -7 -8 -16 -8 -12 0 -15 6 -10 23 3 12 6 33 7 47 0 23 1 23 8 5 7 -18 11 -15 30 22 26 52 78 113 97 113 7 0 23 14 36 30 17 24 29 30 59 30 21 0 46 3 56 7 16 6 15 8 -7 14 l-25 6 30 13 c17 6 44 18 60 26 32 15 117 12 205 -7z m-594 -403 c9 -18 7 -27 -7 -45 l-18 -22 -6 35 c-11 54 11 76 31 32z m64 -289 c0 -6 -9 -2 -20 8 -11 10 -17 22 -13 28 6 10 33 -19 33 -36z m754 -2 c-4 -8 -10 -15 -15 -15 -4 0 -6 7 -3 15 4 8 10 15 15 15 4 0 6 -7 3 -15z m-613 -73 c-13 -4 -71 45 -71 61 0 5 19 -6 41 -24 24 -19 37 -35 30 -37z m554 28 c-3 -5 -11 -10 -16 -10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-75 -34 c0 -2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z m-265 -86 c8 -13 -5 -13 -25 0 -13 8 -13 10 2 10 9 0 20 -4 23 -10z m71 -39 c5 1 16 0 24 -4 8 -3 22 -8 30 -10 8 -3 -1 -6 -20 -6 -33 0 -70 17 -70 34 0 4 6 2 14 -4 8 -6 18 -11 22 -10z" + ></path> + <path d="M915 412 c-29 -56 -30 -58 -7 -39 19 17 38 64 29 73 -2 2 -12 -13 -22 -34z"></path> + </g> + <g id="layer117" fill="#f6784c" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-697 -593 c62 -13 179 -86 200 -124 9 -16 23 -30 31 -30 8 0 14 -7 14 -15 1 -21 24 -96 47 -154 14 -36 19 -65 16 -102 -3 -29 -1 -51 4 -48 4 3 8 12 8 20 0 8 5 12 10 9 12 -8 3 -51 -19 -85 -21 -34 -103 -131 -107 -127 -2 2 1 19 6 38 9 31 8 32 -5 15 -15 -20 -15 -20 -15 0 -1 15 -4 12 -17 -11 -8 -16 -22 -38 -31 -47 -14 -16 -13 -18 1 -18 10 0 17 -6 17 -14 0 -18 -17 -30 -22 -17 -1 6 -32 -17 -68 -51 -81 -76 -164 -107 -208 -79 -10 6 -7 11 15 19 34 12 70 38 62 46 -3 3 -24 -4 -46 -15 -41 -20 -77 -23 -177 -17 -41 3 -52 8 -65 29 -24 39 -72 101 -97 124 -12 11 -30 45 -39 75 -10 30 -21 59 -26 64 -12 14 -12 -11 1 -34 9 -18 8 -18 -16 -5 -31 16 -44 33 -44 58 0 11 4 15 11 11 8 -5 10 2 7 21 -6 30 -1 51 31 135 14 37 16 49 6 36 -8 -11 -15 -23 -15 -28 0 -4 -7 -8 -15 -8 -12 0 -13 9 -9 48 7 52 24 81 24 42 0 -21 4 -18 26 20 30 53 73 100 91 100 7 0 22 14 35 30 18 25 29 30 62 30 23 0 48 5 56 11 12 8 9 10 -12 6 -38 -6 -35 8 5 23 17 6 46 18 62 26 32 15 116 12 205 -7z m-594 -403 c9 -18 7 -27 -7 -45 l-18 -22 -6 35 c-11 54 11 76 31 32z m64 -289 c0 -6 -9 -2 -20 8 -11 10 -17 22 -13 28 6 10 33 -19 33 -36z m754 -2 c-4 -8 -10 -15 -15 -15 -4 0 -6 7 -3 15 4 8 10 15 15 15 4 0 6 -7 3 -15z m-613 -73 c-13 -4 -71 45 -71 61 0 5 19 -6 41 -24 24 -19 37 -35 30 -37z m554 28 c-3 -5 -11 -10 -16 -10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-75 -34 c0 -2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z m-265 -86 c8 -13 -5 -13 -25 0 -13 8 -13 10 2 10 9 0 20 -4 23 -10z m71 -39 c5 1 16 0 24 -4 8 -3 22 -8 30 -10 8 -3 -1 -6 -20 -6 -33 0 -70 17 -70 34 0 4 6 2 14 -4 8 -6 18 -11 22 -10z" + ></path> + <path d="M915 412 c-29 -56 -30 -58 -7 -39 19 17 38 64 29 73 -2 2 -12 -13 -22 -34z"></path> + </g> + <g id="layer118" fill="#ff9927" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-725 -587 c102 -22 220 -92 239 -142 5 -14 12 -23 16 -19 8 8 34 -14 28 -24 -6 -10 17 -101 39 -152 9 -21 16 -59 17 -85 0 -26 3 -42 6 -35 2 6 9 10 14 6 11 -7 1 -51 -20 -84 -21 -34 -103 -131 -107 -127 -2 2 1 19 6 38 9 31 8 32 -5 15 -15 -20 -15 -20 -15 0 0 12 -9 4 -25 -25 -29 -51 -30 -52 -10 -45 9 4 15 0 15 -9 0 -9 -7 -22 -15 -31 -8 -8 -15 -18 -15 -22 0 -5 5 -3 12 4 17 17 29 15 22 -3 -4 -8 -16 -15 -28 -15 -13 0 -33 -11 -46 -25 -13 -14 -31 -25 -39 -25 -13 1 -12 4 4 15 40 28 65 50 65 58 0 13 -34 -10 -79 -53 -58 -57 -142 -84 -196 -64 -11 5 -2 13 35 30 27 13 50 28 50 34 0 13 -13 13 -26 0 -19 -19 -128 -47 -149 -39 -11 4 -36 8 -55 9 -49 2 -127 47 -169 100 -36 44 -36 44 -6 23 17 -12 43 -35 59 -52 29 -30 46 -39 46 -23 0 4 -25 33 -54 65 -40 43 -59 72 -71 112 -8 30 -20 57 -25 60 -13 8 -13 -1 0 -25 15 -28 -21 -20 -42 10 -18 26 -25 65 -10 56 5 -3 10 26 10 65 1 39 4 74 7 80 4 5 2 9 -4 9 -7 0 -8 17 -5 48 7 52 24 81 24 42 0 -21 4 -18 26 20 30 53 73 100 91 100 7 0 22 14 35 30 18 25 29 30 62 30 23 0 48 5 56 11 12 8 9 10 -12 6 -38 -6 -35 8 5 23 17 6 46 18 62 25 40 18 89 18 177 0z m-566 -404 c4 -11 7 -11 21 0 17 13 17 12 2 -11 -9 -14 -22 -35 -29 -47 -14 -21 -14 -21 -26 13 -9 25 -9 45 -1 76 l11 42 9 -29 c5 -17 11 -36 13 -44z m60 -273 c3 -11 3 -22 0 -25 -9 -10 -36 18 -36 38 0 24 27 14 36 -13z m758 -23 c-4 -8 -10 -15 -15 -15 -4 0 -6 7 -3 15 4 8 10 15 15 15 4 0 6 -7 3 -15z m-703 -12 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8 3 21 -13z m604 -103 c-3 -5 -11 -10 -16 -10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-50 -20 c-3 -5 -14 -10 -23 -9 -14 0 -13 2 3 9 27 11 27 11 20 0z m-231 -35 c26 -14 51 -23 56 -20 4 3 13 -2 20 -10 7 -9 21 -13 31 -10 9 3 20 1 24 -5 8 -13 -87 -14 -101 0 -5 5 -34 23 -64 39 -37 21 -48 31 -34 31 12 0 42 -11 68 -25z m-249 5 c3 -5 4 -10 1 -10 -3 0 -8 5 -11 10 -3 6 -4 10 -1 10 3 0 8 -4 11 -10z m32 -17 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z" + ></path> + <path d="M155 649 c-4 -6 -5 -12 -2 -15 2 -3 7 2 10 11 7 17 1 20 -8 4z"></path> + <path d="M930 440 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"></path> + <path d="M906 388 l-17 -33 20 24 c18 20 27 41 18 41 -1 0 -11 -15 -21 -32z"></path> + </g> + <g id="layer119" fill="#fe9034" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-652 -481 c-3 -5 -19 -13 -36 -16 -17 -4 -48 -16 -68 -27 l-36 -21 30 27 c37 32 126 62 110 37z m-73 -106 c102 -22 220 -92 239 -142 5 -14 12 -23 16 -19 8 8 34 -14 28 -24 -6 -10 17 -101 39 -152 9 -21 16 -59 16 -85 0 -35 3 -44 10 -33 5 8 10 11 10 5 0 -5 7 -1 15 9 15 19 15 19 15 -1 0 -12 -6 -28 -12 -35 -7 -7 -22 -29 -32 -48 -21 -38 -107 -143 -112 -137 -2 2 1 19 6 38 9 31 8 32 -5 15 -15 -20 -15 -20 -15 0 0 12 -9 4 -25 -25 -29 -51 -30 -52 -10 -45 9 4 15 0 15 -9 0 -9 -7 -22 -15 -31 -8 -8 -15 -18 -15 -22 0 -5 5 -3 12 4 17 17 29 15 22 -3 -4 -8 -16 -15 -28 -15 -13 0 -33 -11 -46 -25 -13 -14 -31 -25 -39 -25 -13 1 -12 4 4 15 40 28 65 50 65 58 0 13 -34 -10 -79 -53 -58 -57 -142 -84 -196 -64 -11 5 -2 13 35 30 27 13 50 28 50 34 0 13 -13 13 -26 0 -19 -19 -128 -47 -149 -39 -11 4 -36 8 -55 9 -49 2 -127 47 -169 100 -36 44 -36 44 -6 23 17 -12 43 -35 59 -52 29 -30 46 -39 46 -23 0 4 -25 33 -54 65 -40 43 -59 72 -71 112 -8 30 -20 57 -25 60 -13 8 -13 -1 0 -25 15 -28 -21 -20 -42 10 -18 26 -25 65 -10 56 5 -3 10 26 10 65 1 39 4 74 7 80 4 5 2 9 -4 9 -7 0 -8 17 -5 48 7 52 24 81 24 42 0 -21 4 -18 26 20 30 53 73 100 91 100 7 0 22 14 35 30 18 25 29 30 62 30 23 0 48 5 56 11 12 8 9 10 -12 6 -38 -6 -35 8 5 23 17 6 46 18 62 25 40 18 89 18 177 0z m-566 -404 c4 -11 7 -11 21 0 17 13 17 12 2 -11 -9 -14 -22 -35 -29 -47 -14 -21 -14 -21 -26 13 -9 25 -9 45 -1 76 l11 42 9 -29 c5 -17 11 -36 13 -44z m1014 29 c-6 -12 -14 -19 -17 -16 -4 3 -13 0 -22 -7 -14 -11 -15 -10 -1 8 31 43 45 56 48 46 2 -5 -2 -20 -8 -31z m-954 -302 c3 -11 3 -22 0 -25 -9 -10 -36 18 -36 38 0 24 27 14 36 -13z m758 -23 c-4 -8 -10 -15 -15 -15 -4 0 -6 7 -3 15 4 8 10 15 15 15 4 0 6 -7 3 -15z m-703 -12 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8 3 21 -13z m604 -103 c-3 -5 -11 -10 -16 -10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-50 -20 c-3 -5 -14 -10 -23 -9 -14 0 -13 2 3 9 27 11 27 11 20 0z m-231 -35 c26 -14 51 -23 56 -20 4 3 13 -2 20 -10 7 -9 21 -13 31 -10 9 3 20 1 24 -5 8 -13 -87 -14 -101 0 -5 5 -34 23 -64 39 -37 21 -48 31 -34 31 12 0 42 -11 68 -25z m-249 5 c3 -5 4 -10 1 -10 -3 0 -8 5 -11 10 -3 6 -4 10 -1 10 3 0 8 -4 11 -10z m32 -17 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z" + ></path> + <path d="M155 649 c-4 -6 -5 -12 -2 -15 2 -3 7 2 10 11 7 17 1 20 -8 4z"></path> + <path d="M930 440 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"></path> + <path d="M906 388 l-17 -33 20 24 c18 20 27 41 18 41 -1 0 -11 -15 -21 -32z"></path> + </g> + <g id="layer120" fill="#d69064" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-710 -438 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m77 -29 c-4 -9 -109 -66 -146 -79 -10 -3 -18 -10 -18 -15 0 -11 5 -12 95 -31 52 -12 136 -55 185 -97 21 -17 36 -23 48 -17 16 7 62 13 62 7 0 -1 -9 -20 -20 -41 -19 -37 -20 -43 -6 -93 8 -30 21 -71 30 -91 9 -21 16 -58 16 -84 l0 -47 23 26 c50 57 93 112 110 141 10 17 15 22 11 11 -3 -11 -9 -31 -12 -45 -3 -14 -17 -41 -32 -60 -14 -19 -46 -64 -70 -100 -46 -69 -131 -173 -136 -167 -2 2 1 19 6 38 9 31 8 32 -5 15 -15 -20 -15 -20 -15 0 0 12 -9 4 -25 -25 -29 -51 -30 -52 -10 -45 9 4 15 0 15 -9 0 -9 -7 -22 -15 -31 -8 -8 -15 -18 -15 -22 0 -5 5 -3 12 4 17 17 29 15 22 -3 -4 -8 -16 -15 -28 -15 -13 0 -33 -11 -46 -25 -13 -14 -31 -25 -39 -25 -13 1 -12 4 4 15 40 28 65 50 65 58 0 13 -34 -10 -79 -53 -58 -57 -142 -84 -196 -64 -11 5 -2 13 35 30 27 13 50 28 50 34 0 7 -7 7 -22 -1 -44 -24 -133 -46 -153 -38 -11 4 -36 8 -55 9 -49 2 -127 47 -169 100 -36 44 -36 44 -6 23 17 -12 43 -35 59 -52 29 -30 46 -39 46 -23 0 4 -25 33 -54 65 -40 43 -59 72 -71 112 -8 30 -20 57 -25 60 -13 8 -13 -1 0 -25 15 -28 -21 -20 -42 10 -18 26 -25 65 -10 56 5 -3 10 26 10 65 1 39 4 74 7 80 4 5 2 9 -4 9 -7 0 -8 17 -5 48 7 52 24 81 24 42 0 -21 4 -18 26 20 30 53 73 100 91 100 7 0 22 14 35 30 18 25 29 30 62 30 23 0 48 5 56 11 12 8 9 10 -12 6 -38 -6 -35 8 5 23 17 6 47 18 65 26 18 8 42 14 54 14 11 0 37 16 56 36 19 20 50 43 69 50 18 8 33 19 33 24 0 6 13 9 29 8 16 -1 27 -7 25 -13z m-658 -524 c4 -11 7 -11 21 0 17 13 17 12 2 -11 -9 -14 -22 -35 -29 -47 -14 -21 -14 -21 -26 13 -9 25 -9 45 -1 76 l11 42 9 -29 c5 -17 11 -36 13 -44z m60 -273 c3 -11 3 -22 0 -25 -9 -10 -36 18 -36 38 0 24 27 14 36 -13z m758 -23 c-4 -8 -10 -15 -15 -15 -4 0 -6 7 -3 15 4 8 10 15 15 15 4 0 6 -7 3 -15z m-703 -12 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8 3 21 -13z m604 -103 c-3 -5 -11 -10 -16 -10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-45 -14 c0 -8 -81 -59 -86 -54 -7 8 48 46 84 57 1 1 2 -1 2 -3z m-236 -41 c26 -14 51 -23 56 -20 4 3 13 -2 20 -10 7 -9 21 -13 31 -10 9 3 20 1 24 -5 8 -13 -87 -14 -101 0 -5 5 -34 23 -64 39 -37 21 -48 31 -34 31 12 0 42 -11 68 -25z m-249 5 c3 -5 4 -10 1 -10 -3 0 -8 5 -11 10 -3 6 -4 10 -1 10 3 0 8 -4 11 -10z m32 -17 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z" + ></path> + <path d="M703 1063 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path d="M155 649 c-4 -6 -5 -12 -2 -15 2 -3 7 2 10 11 7 17 1 20 -8 4z"></path> + <path d="M930 440 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"></path> + <path d="M906 388 l-17 -33 20 24 c18 20 27 41 18 41 -1 0 -11 -15 -21 -32z"></path> + </g> + <g id="layer121" fill="#f78f55" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-710 -438 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m77 -29 c-4 -9 -109 -66 -146 -79 -10 -3 -18 -10 -18 -15 0 -11 17 -17 80 -26 57 -9 155 -58 197 -97 23 -23 36 -29 50 -23 17 8 63 14 63 8 0 -1 -9 -19 -20 -40 -16 -33 -18 -44 -9 -83 6 -25 20 -65 32 -90 11 -25 20 -66 21 -92 l0 -47 20 24 c51 57 92 111 109 139 10 17 15 22 11 11 -3 -11 -9 -31 -12 -45 -3 -14 -17 -41 -32 -60 -14 -19 -48 -66 -73 -105 -52 -78 -142 -180 -133 -152 3 10 0 25 -8 33 -12 12 -17 9 -35 -22 -25 -42 -26 -45 -6 -38 9 4 15 0 15 -9 0 -9 -7 -22 -15 -31 -8 -8 -15 -18 -15 -22 0 -5 5 -3 12 4 17 17 29 15 22 -3 -4 -8 -16 -15 -28 -15 -13 0 -33 -11 -46 -25 -13 -14 -31 -25 -39 -25 -13 1 -12 4 4 15 40 28 65 50 65 58 0 13 -34 -10 -79 -53 -58 -57 -142 -84 -196 -64 -11 5 -2 13 35 30 27 13 50 28 50 34 0 7 -7 7 -22 -1 -44 -24 -133 -46 -153 -38 -11 4 -36 8 -55 9 -49 2 -127 47 -169 100 -36 44 -36 44 -6 23 17 -12 43 -35 59 -52 29 -30 46 -39 46 -23 0 4 -25 34 -56 66 -30 33 -58 72 -61 88 -3 15 -12 28 -19 28 -8 0 -14 5 -14 11 0 5 5 7 10 4 15 -9 12 9 -6 31 -15 19 -15 19 -9 -2 3 -14 0 -24 -8 -27 -21 -8 -63 71 -50 92 18 28 27 103 13 111 -9 5 -9 21 -1 66 11 56 22 79 41 79 5 0 23 19 40 43 17 24 46 50 63 57 18 8 28 14 24 15 -20 1 16 39 43 45 17 4 28 10 25 14 -2 5 24 16 58 26 34 10 66 22 72 27 5 4 22 8 38 8 21 0 40 11 65 36 19 20 50 43 69 50 18 8 33 19 33 24 0 6 13 9 29 8 16 -1 27 -7 25 -13z m270 -467 c7 -29 8 -53 1 -46 -11 10 -23 68 -15 68 4 0 10 -10 14 -22z m-928 -57 c4 -11 7 -11 21 0 17 13 17 12 2 -11 -9 -14 -22 -35 -29 -47 -14 -21 -14 -21 -26 13 -9 25 -9 45 -1 76 l11 42 9 -29 c5 -17 11 -36 13 -44z m60 -273 c3 -11 3 -22 0 -25 -9 -10 -36 18 -36 38 0 24 27 14 36 -13z m762 -20 c-2 -6 -10 -14 -16 -16 -7 -2 -10 2 -6 12 7 18 28 22 22 4z m-707 -15 c13 -16 12 -17 -3 -4 -10 7 -18 15 -18 17 0 8 8 3 21 -13z m604 -103 c-3 -5 -11 -10 -16 -10 -6 0 -7 5 -4 10 3 6 11 10 16 10 6 0 7 -4 4 -10z m-45 -14 c0 -8 -81 -59 -86 -54 -7 8 48 46 84 57 1 1 2 -1 2 -3z m-236 -41 c26 -14 51 -23 56 -20 4 3 13 -2 20 -10 7 -9 21 -13 31 -10 9 3 20 1 24 -5 8 -13 -87 -14 -101 0 -5 5 -34 23 -64 39 -37 21 -48 31 -34 31 12 0 42 -11 68 -25z m-249 5 c3 -5 4 -10 1 -10 -3 0 -8 5 -11 10 -3 6 -4 10 -1 10 3 0 8 -4 11 -10z m32 -17 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z" + ></path> + <path d="M703 1063 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path d="M150 640 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"></path> + <path d="M930 440 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"></path> + <path d="M906 388 l-17 -33 20 24 c18 20 27 41 18 41 -1 0 -11 -15 -21 -32z"></path> + <path d="M874 338 c-4 -7 -3 -8 4 -4 12 7 16 16 8 16 -3 0 -8 -5 -12 -12z"></path> + </g> + <g id="layer122" fill="#f9956d" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-710 -438 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m77 -29 c-3 -6 -24 -21 -47 -33 -88 -46 -107 -57 -107 -64 0 -4 26 -12 58 -19 62 -13 158 -57 209 -95 33 -25 49 -30 55 -15 2 5 17 6 35 4 l31 -5 -18 -31 c-11 -17 -16 -35 -13 -40 3 -5 1 -12 -4 -16 -6 -4 -5 -17 4 -36 l14 -30 -4 27 c-2 15 0 25 5 22 5 -3 7 -22 3 -43 -4 -24 1 -55 15 -93 11 -32 20 -64 20 -73 0 -8 7 -15 15 -15 8 0 15 5 15 10 0 6 17 29 39 53 21 23 46 56 55 72 10 17 14 21 10 10 -3 -11 -9 -31 -12 -45 -3 -13 -24 -50 -46 -81 -23 -32 -52 -76 -65 -98 -13 -22 -50 -68 -82 -103 -55 -59 -71 -69 -50 -30 6 11 4 21 -4 29 -11 10 -17 7 -29 -19 -20 -39 -20 -44 -2 -29 12 10 14 7 11 -18 -5 -37 1 -38 32 -9 19 18 23 19 23 5 0 -9 -11 -24 -25 -33 -14 -9 -25 -21 -25 -27 0 -10 -30 -36 -42 -37 -4 0 -4 8 -1 17 5 12 -3 9 -28 -10 -50 -38 -161 -77 -217 -77 -62 0 -86 15 -39 24 35 6 94 45 70 46 -6 0 -14 -4 -17 -9 -4 -5 -29 -15 -56 -22 -28 -7 -50 -16 -50 -21 0 -9 82 -53 94 -50 5 2 17 -5 27 -14 19 -17 21 -16 52 13 33 31 61 48 131 77 39 16 39 16 21 -4 -10 -11 -22 -17 -27 -14 -8 5 -90 -54 -114 -82 -19 -23 -87 -20 -122 4 -17 13 -47 29 -66 37 -20 9 -36 22 -36 30 0 10 -10 15 -31 15 -35 0 -115 37 -178 83 -32 24 -45 40 -45 59 -2 25 -1 26 16 11 25 -22 34 -10 14 19 -9 12 -16 30 -16 40 0 9 -9 22 -20 28 -16 9 -20 8 -20 -7 -1 -10 -15 9 -31 41 -25 47 -29 63 -21 80 6 12 13 34 17 51 l7 30 -23 -29 c-12 -15 -28 -44 -35 -65 l-13 -36 -1 33 c0 18 -4 41 -9 51 -6 10 -5 35 2 66 6 28 12 42 15 32 7 -33 30 -69 37 -58 3 6 8 37 11 68 5 62 23 108 41 108 6 0 26 19 43 43 17 24 46 50 63 57 18 8 28 14 24 15 -20 1 16 39 43 45 17 4 28 10 25 14 -2 5 24 16 58 27 34 10 73 24 87 31 14 7 31 13 39 13 7 0 21 8 30 18 9 10 25 22 36 26 16 6 17 9 5 16 -12 8 -11 10 5 10 11 0 34 9 50 20 31 21 86 24 79 5z m271 -487 c5 -31 5 -32 -6 -8 -6 14 -15 33 -20 42 -15 29 -10 44 6 21 8 -12 18 -37 20 -55z m-933 -170 c-7 -7 -12 -8 -12 -2 0 14 12 26 19 19 2 -3 -1 -11 -7 -17z m938 -62 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m-943 -43 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z m923 13 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m-854 -43 c4 -13 4 -27 0 -30 -9 -10 -45 27 -40 41 8 21 34 14 40 -11z m174 -219 c0 -2 -13 2 -30 11 -16 9 -30 18 -30 21 0 2 14 -2 30 -11 17 -9 30 -18 30 -21z m60 1 c-7 -8 -20 -15 -29 -15 -11 1 -8 5 9 15 32 18 35 18 20 0z" + ></path> + <path d="M703 1063 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path + d="M235 250 c-8 -12 19 -46 49 -62 14 -8 12 -1 -10 28 -15 22 -29 40 -30 42 -1 2 -5 -2 -9 -8z" + ></path> + <path d="M752 184 c-24 -19 -39 -34 -34 -34 5 0 26 16 48 35 50 44 42 44 -14 -1z"></path> + </g> + <g id="layer123" fill="#ffad53" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -100 -101 -23 -38 -56 -76 -74 -87 -18 -11 -31 -23 -28 -26 3 -3 -15 -30 -39 -60 -42 -52 -45 -58 -39 -97 4 -22 11 -45 16 -51 5 -5 9 -20 9 -34 0 -45 17 -8 28 62 11 67 26 102 42 92 5 -3 17 10 29 27 30 49 113 126 144 133 15 4 25 11 22 15 -3 4 7 11 23 15 64 16 202 74 199 84 -1 3 4 16 11 28 8 15 18 20 33 16 16 -5 20 -3 15 6 -5 8 -3 11 5 10 8 -2 24 2 36 9 26 14 72 12 67 -3 -3 -6 -21 -19 -42 -30 -20 -10 -45 -26 -55 -34 -18 -15 -18 -16 0 -22 14 -6 11 -8 -12 -8 -23 -1 -27 -4 -15 -11 8 -5 25 -10 36 -10 24 0 198 -84 227 -108 12 -11 21 -13 25 -6 5 8 51 11 69 5 2 -1 -6 -16 -16 -35 -19 -33 -19 -34 0 -65 10 -17 19 -41 19 -52 0 -11 9 -37 20 -59 11 -22 20 -52 19 -67 0 -25 -2 -23 -16 15 -8 24 -16 42 -18 40 -8 -8 20 -98 32 -102 7 -3 13 -1 13 5 0 5 17 28 39 52 21 23 46 56 55 72 10 17 14 21 10 10 -3 -11 -9 -31 -12 -45 -3 -13 -25 -51 -49 -83 -23 -33 -43 -64 -43 -71 0 -18 -44 -71 -134 -165 -52 -52 -59 -77 -13 -40 41 31 33 3 -15 -54 -41 -48 -38 -54 7 -18 20 16 20 16 1 -6 -19 -23 -88 -63 -109 -63 -7 0 -33 -20 -59 -44 -38 -35 -57 -45 -96 -50 -44 -6 -53 -3 -92 25 -24 17 -59 36 -79 42 -20 5 -30 12 -23 14 19 7 3 23 -23 23 -27 0 -86 28 -155 73 -58 38 -71 55 -64 82 3 14 -4 35 -20 59 -38 57 -62 124 -48 138 7 7 12 23 12 36 0 20 -3 22 -14 13 -21 -17 -29 -63 -16 -95 7 -19 7 -33 0 -47 -9 -15 -7 -19 5 -19 19 0 70 -104 60 -121 -5 -7 -24 5 -51 32 -43 43 -45 45 -43 104 0 33 -4 80 -9 105 -6 26 -7 86 -4 142 l7 97 45 46 c24 25 40 45 34 45 -11 0 -63 -52 -86 -87 -12 -18 -14 -57 -12 -203 3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-707 -436 c0 -2 -7 -6 -15 -10 -8 -3 -15 -1 -15 4 0 6 7 10 15 10 8 0 15 -2 15 -4z m-43 -13 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m-297 -118 c-43 -44 -58 -51 -47 -21 5 13 72 64 87 65 2 1 -16 -19 -40 -44z m745 -545 c-10 -11 -21 -17 -24 -14 -3 3 3 12 13 20 28 20 32 17 11 -6z m-45 -63 c-11 -18 -32 -44 -47 -58 l-27 -24 27 35 c15 19 33 45 39 58 6 12 15 22 19 22 5 0 0 -15 -11 -33z m-793 -189 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m39 -81 c17 -9 34 -14 37 -11 3 3 15 0 27 -6 13 -7 20 -8 16 -2 -3 6 -2 13 4 17 5 3 10 2 10 -4 0 -6 8 -8 18 -4 14 5 13 1 -5 -17 -20 -21 -25 -22 -61 -12 -21 6 -54 26 -73 44 -20 18 -28 28 -20 22 9 -7 30 -19 47 -27z m121 17 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m353 -48 c0 -2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z" + ></path> + <path d="M703 1063 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path d="M590 1019 c0 -5 5 -7 10 -4 6 3 10 8 10 11 0 2 -4 4 -10 4 -5 0 -10 -5 -10 -11z"></path> + <path d="M930 730 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"></path> + <path d="M180 314 c0 -21 25 -62 33 -54 3 3 -4 21 -14 40 -14 26 -19 30 -19 14z"></path> + <path d="M836 303 c-6 -14 -5 -15 5 -6 7 7 10 15 7 18 -3 3 -9 -2 -12 -12z"></path> + <path + d="M270 205 c13 -14 26 -25 28 -25 3 0 -5 11 -18 25 -13 14 -26 25 -28 25 -3 0 5 -11 18 -25z" + ></path> + <path + d="M765 155 c-16 -14 -36 -25 -43 -25 -7 0 -27 -7 -45 -16 -17 -9 -65 -20 -107 -24 -74 -7 -75 -7 -32 -15 24 -4 46 -14 49 -21 8 -22 37 -16 64 12 13 14 52 39 85 54 34 16 64 36 67 44 9 22 -3 19 -38 -9z" + ></path> + <path d="M555 139 c-29 -13 -34 -19 -19 -19 12 0 32 9 45 20 29 24 25 24 -26 -1z"></path> + </g> + <g id="layer124" fill="#fcb073" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -7 -40 -15 -11 -8 -31 -15 -44 -15 -13 0 -57 -11 -98 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -100 -101 -23 -38 -56 -76 -74 -87 -18 -11 -31 -23 -28 -26 3 -3 -15 -30 -39 -60 -42 -52 -45 -58 -39 -97 4 -22 11 -45 16 -51 5 -5 9 -20 9 -34 0 -45 17 -8 28 62 11 67 26 102 42 92 5 -3 17 10 29 27 30 49 113 126 144 134 16 3 25 9 22 12 -5 6 124 57 172 69 13 3 20 9 17 14 -3 5 1 9 8 9 8 0 22 14 31 30 10 17 24 30 30 30 7 0 30 10 52 22 22 12 50 21 63 20 29 -2 78 28 61 38 -7 5 3 12 25 20 54 17 54 7 2 -32 -25 -18 -45 -38 -46 -44 0 -5 -21 -20 -47 -33 -27 -12 -59 -30 -73 -38 -23 -16 -23 -17 -5 -24 17 -6 15 -8 -10 -8 -23 -1 -27 -4 -15 -11 8 -5 25 -10 36 -10 24 0 198 -83 226 -108 16 -13 18 -13 24 2 5 12 10 14 20 5 7 -6 22 -8 34 -4 25 8 25 -4 3 -44 -17 -30 -17 -32 0 -62 9 -17 17 -39 17 -50 0 -11 9 -37 20 -59 11 -22 20 -52 19 -67 0 -25 -2 -23 -16 15 -8 24 -16 42 -18 40 -8 -7 19 -98 29 -98 13 1 101 116 112 145 4 11 17 29 28 40 12 11 31 34 43 50 22 30 22 30 23 6 0 -15 -35 -76 -87 -153 -49 -71 -93 -137 -99 -148 -27 -49 -53 -81 -138 -169 -52 -52 -59 -77 -13 -40 41 31 33 3 -15 -54 -41 -48 -38 -54 7 -18 20 16 20 16 1 -6 -19 -23 -88 -63 -109 -63 -7 0 -33 -20 -59 -44 -38 -35 -57 -45 -96 -50 -44 -6 -53 -3 -92 25 -24 17 -59 36 -79 42 -20 5 -30 12 -23 14 19 7 3 23 -23 23 -27 0 -86 28 -155 73 -58 38 -71 55 -64 82 3 14 -4 35 -20 59 -38 57 -62 124 -48 138 7 7 12 23 12 36 0 20 -3 22 -14 13 -21 -17 -29 -63 -16 -95 7 -19 7 -33 0 -47 -9 -15 -7 -19 5 -19 19 0 70 -104 60 -121 -5 -7 -24 5 -51 32 -43 43 -45 45 -43 104 0 33 -4 80 -9 105 -6 26 -7 86 -4 142 l7 97 45 46 c24 25 40 45 34 45 -11 0 -63 -52 -86 -87 -12 -18 -14 -57 -12 -203 3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 112 20 12 52 45 70 71 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-303 -387 c9 -23 -2 -39 -39 -57 -36 -18 -47 -11 -20 12 11 9 13 16 5 24 -7 7 -3 14 12 23 30 16 35 16 42 -2z m-84 -25 c-8 -6 -24 -15 -35 -21 -16 -8 -15 -6 4 10 13 12 28 21 35 21 6 0 4 -5 -4 -10z m-320 -30 c-14 -4 -34 -8 -45 -9 -16 -1 -17 1 -5 9 8 5 29 9 45 9 29 -1 29 -1 5 -9z m290 -44 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m-630 -81 c-43 -44 -58 -51 -47 -21 5 13 72 64 87 65 2 1 -16 -19 -40 -44z m660 -204 c0 -6 -4 -13 -10 -16 -5 -3 -10 1 -10 9 0 9 5 16 10 16 6 0 10 -4 10 -9z m281 -63 c-22 -34 -41 -58 -41 -52 0 6 8 22 19 35 10 13 26 39 35 57 10 19 20 32 23 29 2 -3 -14 -34 -36 -69z m-214 -304 c-17 -25 -47 -62 -66 -82 -25 -27 -28 -29 -12 -7 12 17 33 48 47 70 23 34 51 65 61 65 1 0 -12 -21 -30 -46z m-820 -226 c-3 -8 -6 -5 -6 6 -1 11 2 17 5 13 3 -3 4 -12 1 -19z m39 -81 c17 -9 34 -14 37 -11 3 3 15 0 27 -6 13 -7 20 -8 16 -2 -3 6 -2 13 4 17 5 3 10 2 10 -4 0 -6 8 -8 18 -4 14 5 13 1 -5 -17 -20 -21 -25 -22 -61 -12 -21 6 -54 26 -73 44 -20 18 -28 28 -20 22 9 -7 30 -19 47 -27z m121 17 c-3 -3 -12 -4 -19 -1 -8 3 -5 6 6 6 11 1 17 -2 13 -5z m353 -48 c0 -2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z" + ></path> + <path d="M930 730 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"></path> + <path d="M180 314 c0 -21 25 -62 33 -54 3 3 -4 21 -14 40 -14 26 -19 30 -19 14z"></path> + <path d="M836 303 c-6 -14 -5 -15 5 -6 7 7 10 15 7 18 -3 3 -9 -2 -12 -12z"></path> + <path + d="M270 205 c13 -14 26 -25 28 -25 3 0 -5 11 -18 25 -13 14 -26 25 -28 25 -3 0 5 -11 18 -25z" + ></path> + <path + d="M765 155 c-16 -14 -36 -25 -43 -25 -7 0 -27 -7 -45 -16 -17 -9 -65 -20 -107 -24 -74 -7 -75 -7 -32 -15 24 -4 46 -14 49 -21 8 -22 37 -16 64 12 13 14 52 39 85 54 34 16 64 36 67 44 9 22 -3 19 -38 -9z" + ></path> + <path d="M555 139 c-29 -13 -34 -19 -19 -19 12 0 32 9 45 20 29 24 25 24 -26 -1z"></path> + </g> + <g id="layer125" fill="#ffc35e" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -32 -9 -46 -20 l-25 -20 24 0 c13 0 38 8 55 19 36 22 105 45 112 38 3 -3 -16 -21 -42 -41 -34 -26 -42 -36 -28 -37 10 0 -19 -19 -66 -41 l-85 -40 31 -16 c17 -9 30 -21 28 -27 -4 -12 154 -91 163 -81 3 3 11 -2 18 -11 11 -15 15 -14 46 7 19 13 28 17 22 10 -21 -23 -15 -32 17 -25 25 6 30 4 30 -13 0 -11 -7 -22 -15 -26 -20 -7 -19 -32 1 -40 8 -3 12 -2 9 4 -3 6 -1 10 4 10 14 0 14 -13 0 -43 -9 -19 -8 -30 5 -49 9 -13 18 -46 21 -73 9 -90 12 -92 62 -24 25 34 50 75 55 90 5 16 15 29 21 29 7 0 21 14 32 30 23 35 31 37 37 12 4 -12 -29 -70 -92 -164 -53 -80 -100 -157 -104 -171 -3 -15 -17 -34 -31 -43 -13 -8 -50 -46 -82 -82 -32 -37 -45 -57 -29 -44 38 29 44 21 17 -23 -24 -42 -26 -49 -8 -39 6 4 -1 -7 -17 -24 -17 -18 -34 -32 -40 -32 -6 0 -28 -17 -51 -38 -22 -20 -34 -30 -27 -22 13 16 16 30 5 30 -5 0 -29 -20 -55 -44 -38 -34 -57 -45 -96 -50 -44 -6 -52 -3 -98 29 -57 41 -97 45 -131 13 -20 -19 -27 -20 -61 -10 -21 7 -54 26 -73 44 -20 18 -28 28 -20 22 29 -21 78 -43 84 -38 3 3 15 1 26 -6 12 -6 21 -7 20 -3 -3 19 2 27 10 15 6 -10 10 -10 21 3 10 13 9 15 -8 15 -12 0 -25 6 -29 14 -13 23 -100 65 -111 54 -7 -7 -12 -3 -17 10 -3 12 -19 35 -34 51 -25 26 -30 28 -35 14 -6 -14 -15 -9 -52 28 -43 43 -45 45 -43 104 0 33 -4 80 -9 105 -6 26 -7 86 -4 142 l7 97 45 46 c24 25 49 45 55 45 5 -1 -2 -11 -17 -23 -15 -12 -39 -38 -53 -57 -21 -29 -25 -42 -19 -73 3 -21 12 -50 19 -64 15 -28 16 -27 35 60 8 37 23 60 70 109 33 33 60 69 60 79 0 22 73 60 159 85 34 9 66 23 72 30 10 12 8 13 -7 9 -10 -3 -5 1 11 9 17 8 37 15 46 16 8 0 29 16 46 35 17 19 41 35 52 35 12 0 21 4 21 9 0 12 -60 3 -115 -16 -22 -8 -35 -9 -30 -4 6 5 44 21 85 35 41 14 67 26 57 26 -10 0 -52 -11 -93 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 111 51 33 159 188 174 250 l7 30 -28 -25 c-31 -27 -16 -5 29 43 15 16 28 39 28 51 1 18 2 19 6 2 3 -10 -5 -31 -16 -47 -12 -16 -17 -29 -12 -29 15 0 41 42 41 66 0 19 15 45 86 154 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-299 -392 c8 -13 8 -20 1 -20 -5 0 -8 -4 -4 -9 3 -6 -10 -17 -29 -26 -18 -9 -44 -27 -57 -41 -36 -38 -56 -32 -53 17 2 49 7 54 70 79 61 24 57 24 72 0z m-643 -97 c-11 -3 -50 -32 -87 -65 -42 -36 -68 -54 -68 -44 0 8 11 23 25 33 14 10 45 33 68 50 23 18 51 32 62 32 l20 -1 -20 -5z m715 -7 c0 -15 -37 -32 -48 -22 -6 6 27 35 41 36 4 0 7 -6 7 -14z m-383 -23 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m153 -7 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z m180 -83 c0 -13 -74 -83 -87 -83 -23 0 -14 15 18 29 17 7 35 24 41 37 10 22 28 33 28 17z m-285 -13 c3 -5 2 -10 -4 -10 -5 0 -13 5 -16 10 -3 6 -2 10 4 10 5 0 13 -4 16 -10z m473 -186 c-26 -47 -58 -90 -58 -79 0 11 73 126 77 121 2 -2 -6 -21 -19 -42z m-260 8 c6 -18 -15 -14 -22 4 -4 10 -1 14 6 12 6 -2 14 -10 16 -16z m225 -7 c-3 -9 -8 -14 -10 -11 -3 3 -2 9 2 15 9 16 15 13 8 -4z m-157 -282 c-70 -99 -86 -120 -116 -148 -23 -22 -29 -25 -24 -11 5 14 4 17 -5 11 -10 -6 -11 -3 -2 13 6 12 17 24 24 28 8 5 7 2 -2 -9 -8 -10 -11 -20 -8 -23 6 -7 67 74 67 89 0 11 82 94 89 90 2 -2 -8 -20 -23 -40z m-346 -387 c0 -2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z" + ></path> + <path d="M983 1113 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path d="M749 1113 c-6 -7 -7 -13 -2 -13 5 0 17 6 27 13 16 12 17 14 2 14 -9 0 -21 -6 -27 -14z" + ></path> + <path d="M648 953 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"></path> + <path d="M254 848 c-4 -7 -3 -8 4 -4 12 7 16 16 8 16 -3 0 -8 -5 -12 -12z"></path> + <path + d="M94 519 c-21 -26 -26 -61 -13 -85 9 -18 10 -30 1 -48 -9 -20 -8 -25 5 -28 8 -2 25 -22 38 -46 38 -71 38 -21 -1 56 -37 75 -40 92 -23 109 6 6 9 21 7 33 -2 19 -5 21 -14 9z" + ></path> + <path d="M190 291 c0 -6 4 -13 10 -16 6 -3 7 1 4 9 -7 18 -14 21 -14 7z"></path> + <path + d="M754 144 c-36 -25 -137 -56 -186 -57 -26 0 -45 -4 -42 -9 3 -4 16 -8 30 -8 14 0 27 -7 30 -15 9 -22 31 -18 62 11 15 14 53 39 85 55 31 16 57 31 57 34 0 9 -14 4 -36 -11z" + ></path> + <path d="M550 135 c-14 -8 -20 -14 -15 -14 6 0 21 6 35 14 14 8 21 14 15 14 -5 0 -21 -6 -35 -14z" + ></path> + </g> + <g id="layer126" fill="#fea492" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -32 -9 -46 -20 l-25 -20 26 0 c14 0 34 7 45 15 26 20 40 19 23 -2 -12 -14 -12 -16 1 -11 8 3 14 12 14 20 -1 15 92 56 102 45 3 -3 -17 -22 -46 -43 -30 -22 -47 -40 -41 -44 6 -3 -26 -23 -71 -44 l-83 -37 31 -17 c17 -9 30 -21 28 -27 -4 -12 154 -91 163 -81 3 3 11 -2 18 -11 11 -15 15 -14 46 7 19 13 28 17 22 10 -21 -23 -15 -32 17 -25 25 6 30 4 30 -13 0 -11 -7 -22 -15 -26 -24 -9 -19 -39 5 -31 23 7 25 -3 9 -38 -9 -19 -8 -30 5 -49 9 -13 18 -46 21 -73 9 -90 12 -92 62 -24 25 34 50 75 55 90 5 16 15 29 22 29 13 0 70 84 86 126 6 15 13 25 15 22 3 -3 -2 -21 -10 -41 -8 -20 -15 -47 -15 -60 0 -13 -10 -39 -23 -58 -13 -19 -57 -83 -98 -144 -42 -60 -79 -122 -82 -137 -4 -15 -18 -35 -32 -44 -13 -8 -50 -46 -82 -82 -32 -37 -45 -57 -29 -44 38 29 44 21 17 -23 -24 -42 -26 -49 -8 -39 6 4 -1 -7 -17 -24 -17 -18 -34 -32 -40 -32 -6 0 -28 -17 -51 -38 -22 -20 -34 -30 -27 -22 13 16 16 30 5 30 -5 0 -29 -20 -55 -44 -38 -34 -57 -45 -96 -50 -44 -6 -52 -3 -98 29 -57 41 -97 45 -131 13 -20 -19 -27 -20 -61 -10 -21 7 -54 26 -73 44 -20 18 -28 28 -20 22 29 -21 78 -43 84 -38 3 3 15 1 26 -6 12 -6 21 -7 20 -3 -3 19 2 27 10 15 6 -10 10 -10 21 3 10 13 9 15 -8 15 -12 0 -25 6 -29 14 -13 23 -100 65 -111 54 -7 -7 -12 -3 -17 10 -3 12 -19 35 -34 51 -25 26 -30 28 -35 14 -6 -14 -15 -9 -52 28 -43 43 -45 45 -43 104 0 33 -4 80 -9 105 -6 26 -7 86 -4 142 l7 97 45 46 c24 25 49 45 55 45 5 -1 -2 -11 -17 -23 -15 -12 -39 -38 -53 -57 -21 -29 -25 -42 -19 -73 3 -21 12 -50 19 -64 15 -28 16 -27 35 60 8 37 23 60 70 109 33 33 60 69 60 79 0 22 73 60 159 85 34 9 66 23 72 30 10 12 8 13 -7 9 -10 -3 -5 1 11 9 17 8 37 15 46 16 8 0 29 16 46 35 17 19 41 35 52 35 12 0 21 4 21 9 0 12 -60 3 -115 -16 -22 -8 -35 -9 -30 -4 6 5 44 21 85 35 41 14 67 26 57 26 -10 0 -52 -11 -93 -25 -41 -14 -91 -25 -112 -25 -23 0 -59 -13 -97 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 38 -75 124 -121 237 -127 41 -2 91 -8 111 -13 20 -5 70 -8 110 -6 90 4 118 21 247 149 50 48 106 99 126 111 51 33 159 188 174 250 l7 30 -28 -25 c-31 -27 -16 -5 29 43 15 16 28 39 28 51 1 18 2 19 6 2 3 -10 -5 -31 -16 -47 -12 -16 -17 -29 -12 -29 15 0 41 42 41 66 0 19 15 45 86 154 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-298 -386 c15 -17 -1 -56 -23 -56 -7 0 -31 -16 -53 -35 -23 -19 -47 -35 -54 -35 -7 0 -22 -8 -33 -17 -17 -16 -17 -14 3 12 14 19 21 40 19 60 -3 27 2 32 52 57 64 32 73 33 89 14z m-644 -103 c-11 -3 -50 -32 -87 -65 -42 -36 -68 -54 -68 -44 0 8 11 23 25 33 14 10 45 33 68 50 23 18 51 32 62 32 l20 -1 -20 -5z m715 -7 c0 -15 -37 -32 -48 -22 -6 6 27 35 41 36 4 0 7 -6 7 -14z m-383 -23 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m333 -90 c0 -13 -74 -83 -87 -83 -23 0 -14 15 18 29 17 7 35 24 41 37 10 22 28 33 28 17z m-285 -13 c3 -5 2 -10 -4 -10 -5 0 -13 5 -16 10 -3 6 -2 10 4 10 5 0 13 -4 16 -10z m505 -132 c-33 -64 -98 -157 -87 -126 3 10 27 48 52 86 25 38 45 76 45 84 0 17 11 30 18 23 3 -3 -10 -33 -28 -67z m-292 -46 c6 -18 -15 -14 -22 4 -4 10 -1 14 6 12 6 -2 14 -10 16 -16z m225 -7 c-3 -9 -8 -14 -10 -11 -3 3 -2 9 2 15 9 16 15 13 8 -4z m-157 -282 c-70 -99 -86 -120 -116 -148 -23 -22 -29 -25 -24 -11 5 14 4 17 -5 11 -10 -6 -11 -3 -2 13 6 12 17 24 24 28 8 5 7 2 -2 -9 -8 -10 -11 -20 -8 -23 6 -7 67 74 67 89 0 11 82 94 89 90 2 -2 -8 -20 -23 -40z m-346 -387 c0 -2 -8 -10 -17 -17 -16 -13 -17 -12 -4 4 13 16 21 21 21 13z" + ></path> + <path d="M983 1113 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path d="M648 953 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"></path> + <path d="M254 848 c-4 -7 -3 -8 4 -4 12 7 16 16 8 16 -3 0 -8 -5 -12 -12z"></path> + <path + d="M94 519 c-21 -26 -26 -61 -13 -85 9 -18 10 -30 1 -48 -9 -20 -8 -25 5 -28 8 -2 25 -22 38 -46 38 -71 38 -21 -1 56 -37 75 -40 92 -23 109 6 6 9 21 7 33 -2 19 -5 21 -14 9z" + ></path> + <path d="M190 291 c0 -6 4 -13 10 -16 6 -3 7 1 4 9 -7 18 -14 21 -14 7z"></path> + <path + d="M754 144 c-36 -25 -137 -56 -186 -57 -26 0 -45 -4 -42 -9 3 -4 16 -8 30 -8 14 0 27 -7 30 -15 9 -22 31 -18 62 11 15 14 53 39 85 55 31 16 57 31 57 34 0 9 -14 4 -36 -11z" + ></path> + <path d="M550 135 c-14 -8 -20 -14 -15 -14 6 0 21 6 35 14 14 8 21 14 15 14 -5 0 -21 -6 -35 -14z" + ></path> + </g> + <g id="layer127" fill="#fcb688" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -32 -9 -46 -20 l-25 -20 26 0 c14 0 34 7 45 15 26 20 40 19 23 -2 -12 -14 -12 -16 1 -11 8 3 14 12 14 20 -1 15 92 56 102 45 3 -3 -17 -22 -46 -43 -30 -22 -47 -40 -41 -44 6 -3 -26 -23 -71 -44 l-83 -37 31 -17 c17 -9 30 -21 28 -27 -4 -12 154 -91 163 -81 3 3 11 -2 18 -11 11 -15 15 -14 46 7 19 13 28 17 22 10 -21 -23 -15 -32 17 -25 25 6 30 4 30 -13 0 -11 -7 -22 -15 -26 -8 -3 -15 -13 -15 -21 0 -12 6 -15 21 -10 19 6 21 4 15 -19 -5 -19 -3 -24 8 -20 21 8 29 -12 14 -38 -7 -13 -11 -27 -10 -31 1 -4 4 -29 7 -54 9 -88 12 -89 62 -22 25 34 50 75 55 90 5 16 15 29 22 29 13 0 70 84 86 126 6 15 13 25 15 22 3 -3 -2 -21 -10 -41 -8 -20 -15 -47 -15 -60 0 -13 -10 -39 -23 -58 -13 -19 -57 -83 -98 -144 -42 -60 -79 -122 -82 -137 -4 -15 -18 -35 -32 -44 -13 -8 -50 -46 -82 -82 -32 -37 -45 -57 -29 -44 38 29 44 21 17 -23 -26 -44 -26 -52 -3 -34 13 10 12 8 -3 -11 -28 -34 -58 -59 -71 -60 -13 0 -53 -42 -68 -71 -6 -13 -27 -29 -46 -36 -32 -12 -33 -12 -15 2 48 37 77 69 65 73 -6 2 -29 -14 -51 -37 -22 -22 -45 -41 -52 -41 -7 0 -4 -5 5 -10 11 -7 26 -7 43 0 41 15 133 90 202 163 34 37 80 77 101 91 54 34 162 187 177 251 l7 30 -28 -25 c-31 -27 -16 -5 29 43 15 16 28 39 28 51 1 18 2 19 6 2 3 -10 -5 -31 -16 -47 -12 -16 -17 -29 -12 -29 15 0 41 42 41 66 0 19 15 45 86 154 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-298 -386 c15 -17 -1 -56 -23 -56 -7 0 -31 -16 -53 -35 -23 -19 -47 -35 -54 -35 -7 0 -22 -8 -33 -17 -17 -16 -17 -14 3 12 14 19 21 40 19 60 -3 27 2 32 52 57 64 32 73 33 89 14z m71 -110 c0 -15 -37 -32 -48 -22 -6 6 27 35 41 36 4 0 7 -6 7 -14z m-383 -23 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m333 -90 c0 -13 -74 -83 -87 -83 -23 0 -14 15 18 29 17 7 35 24 41 37 10 22 28 33 28 17z m-285 -13 c3 -5 2 -10 -4 -10 -5 0 -13 5 -16 10 -3 6 -2 10 4 10 5 0 13 -4 16 -10z m505 -132 c-33 -64 -98 -157 -87 -126 3 10 27 48 52 86 25 38 45 76 45 84 0 17 11 30 18 23 3 -3 -10 -33 -28 -67z m-67 -53 c-3 -9 -8 -14 -10 -11 -3 3 -2 9 2 15 9 16 15 13 8 -4z m-157 -282 c-70 -99 -86 -120 -116 -148 -23 -22 -29 -25 -24 -11 5 14 4 17 -5 11 -10 -6 -11 -3 -2 13 6 12 17 24 24 28 8 5 7 2 -2 -9 -8 -10 -11 -20 -8 -23 6 -7 67 74 67 89 0 11 82 94 89 90 2 -2 -8 -20 -23 -40z" + ></path> + <path d="M983 1113 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path + d="M545 1085 c-38 -13 -88 -24 -110 -25 -26 0 -61 -12 -100 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 10 -21 27 -44 37 -52 13 -10 12 -7 -4 14 -21 27 -22 57 -2 57 18 0 8 29 -20 59 -25 27 -29 29 -34 12 -2 -10 0 -27 6 -37 10 -18 0 -12 -59 42 -29 26 -54 94 -52 146 0 29 -1 111 -4 181 l-5 129 40 46 c44 52 95 87 79 55 -34 -67 -52 -118 -51 -146 l1 -32 9 37 c6 26 28 58 69 99 33 34 60 70 60 80 0 22 73 60 159 85 34 9 66 23 72 30 10 12 8 13 -7 9 -10 -3 -5 1 11 9 17 8 37 15 46 16 8 0 29 16 46 35 17 19 41 35 52 35 12 0 21 4 21 9 0 12 -60 3 -115 -16 -22 -8 -35 -9 -30 -4 6 5 44 21 85 35 41 14 66 25 55 25 -11 0 -51 -10 -90 -24z m-120 -42 c-11 -3 -55 -42 -97 -87 -76 -79 -77 -80 -71 -46 9 55 21 69 79 97 30 14 57 29 60 34 3 5 15 8 27 8 20 -1 21 -2 2 -6z m0 -53 c-3 -5 -12 -10 -18 -10 -7 0 -6 4 3 10 19 12 23 12 15 0z m-229 -168 c-16 -15 -25 -20 -21 -12 13 25 38 50 44 45 3 -3 -8 -18 -23 -33z" + ></path> + <path d="M648 953 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"></path> + <path d="M254 848 c-4 -7 -3 -8 4 -4 12 7 16 16 8 16 -3 0 -8 -5 -12 -12z"></path> + <path d="M970 721 c0 -6 4 -13 10 -16 6 -3 7 1 4 9 -7 18 -14 21 -14 7z"></path> + <path d="M91 613 c-1 -6 -4 -20 -7 -30 -5 -17 -5 -17 6 0 6 10 9 23 6 30 -3 9 -5 9 -5 0z"></path> + <path + d="M91 516 c-10 -11 -12 -31 -8 -66 7 -60 61 -189 70 -167 3 9 -10 47 -29 85 -37 75 -40 92 -23 109 6 6 9 21 7 33 -3 21 -4 22 -17 6z" + ></path> + <path d="M190 291 c0 -6 4 -13 10 -16 6 -3 7 1 4 9 -7 18 -14 21 -14 7z"></path> + <path d="M240 170 c0 -11 49 -46 78 -54 40 -13 23 10 -28 36 -27 14 -50 22 -50 18z"></path> + <path + d="M720 129 c-30 -15 -74 -31 -97 -35 -44 -6 -44 -7 -15 -53 1 -3 15 7 30 21 15 14 55 40 90 57 34 17 62 33 62 36 0 8 -12 4 -70 -26z" + ></path> + <path d="M550 135 c-14 -8 -20 -14 -15 -14 6 0 21 6 35 14 14 8 21 14 15 14 -5 0 -21 -6 -35 -14z" + ></path> + <path d="M373 93 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path d="M230 86 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21 13z"></path> + <path d="M528 83 c7 -3 16 -2 19 1 4 3 -2 6 -13 5 -11 0 -14 -3 -6 -6z"></path> + <path + d="M375 50 c-3 -5 -18 -10 -32 -10 -57 0 -11 -12 61 -15 42 -3 88 -7 103 -10 23 -4 -37 18 -109 41 -9 2 -19 0 -23 -6z" + ></path> + <path d="M293 43 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path d="M553 3 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"></path> + </g> + <g id="layer128" fill="#ffc879" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -21 -1 -56 -22 -56 -34 0 -3 16 1 36 9 47 19 60 19 43 -2 -12 -14 -12 -16 1 -11 8 3 14 12 14 20 -1 15 92 56 102 45 3 -3 -18 -23 -46 -43 -40 -28 -49 -39 -36 -43 16 -6 -25 -32 -109 -66 -38 -16 -39 -17 -18 -28 19 -8 27 -6 47 16 15 16 36 27 51 27 37 0 31 -14 -14 -35 -34 -15 -59 -41 -49 -50 7 -6 148 -75 153 -75 4 0 3 6 0 13 -3 6 2 2 11 -11 19 -25 34 -29 34 -7 0 8 6 15 13 15 6 0 23 13 37 30 19 23 29 27 40 20 12 -9 9 -15 -20 -40 -19 -16 -30 -30 -24 -30 6 0 17 7 24 14 8 10 18 12 33 7 12 -5 32 -5 45 0 27 10 29 19 2 14 -11 -2 -20 -1 -20 3 1 12 72 53 84 48 7 -3 7 -5 -1 -5 -7 -1 -13 -7 -13 -15 0 -14 -107 -116 -122 -116 -4 0 -8 -7 -8 -15 0 -8 6 -12 13 -10 6 3 23 -11 37 -30 27 -37 45 -44 54 -20 6 15 26 21 26 7 0 -4 -18 -31 -40 -61 -39 -52 -46 -73 -34 -105 5 -13 14 -7 40 26 19 24 41 58 50 77 9 19 37 55 62 80 25 25 51 61 59 80 8 18 16 31 19 29 2 -3 -3 -21 -11 -41 -8 -20 -15 -47 -15 -61 0 -13 -24 -59 -53 -103 -51 -75 -81 -147 -51 -123 10 9 11 6 7 -12 -5 -20 0 -18 35 16 40 38 79 124 68 151 -2 7 2 21 10 32 9 10 13 12 9 6 -3 -7 0 -13 7 -13 15 1 68 80 68 103 0 9 5 19 11 23 26 16 -42 -121 -92 -184 -10 -14 -19 -35 -19 -49 0 -13 -16 -42 -38 -66 -21 -23 -64 -78 -97 -122 -59 -80 -163 -187 -174 -181 -3 2 -15 -8 -25 -22 -17 -22 -17 -25 -3 -19 15 5 16 3 7 -13 -11 -21 -62 -60 -79 -60 -6 0 -27 -22 -46 -49 -22 -31 -48 -53 -68 -60 l-32 -11 26 20 c15 11 35 32 44 47 18 26 17 26 -23 -6 -23 -18 -42 -37 -42 -42 0 -5 -8 -9 -17 -9 -17 -1 -17 -1 -1 -10 11 -7 26 -7 43 0 41 15 133 90 202 163 34 37 80 77 102 91 21 14 54 47 72 73 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-298 -385 c13 -16 -7 -79 -24 -73 -14 5 -56 -18 -79 -43 -10 -11 -23 -18 -28 -15 -5 3 -19 -2 -31 -13 -22 -18 -22 -18 -6 2 22 29 23 75 1 75 -32 0 104 75 144 79 6 1 17 -5 23 -12z m76 -120 c8 -17 7 -26 -5 -38 -15 -14 -19 -12 -49 18 l-33 33 26 0 c14 0 26 4 26 10 0 16 24 1 35 -23z m-335 -117 c14 -11 22 -20 18 -20 -14 0 -58 23 -58 32 0 13 13 9 40 -12z m27 13 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z" + ></path> + <path d="M618 1103 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"></path> + <path + d="M525 1080 c-27 -11 -68 -20 -90 -20 -26 0 -60 -11 -100 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 10 -21 27 -44 37 -52 13 -10 12 -7 -4 14 -21 27 -22 57 -2 57 16 0 10 18 -17 50 -20 23 -29 28 -35 19 -4 -7 -3 -22 3 -33 11 -21 6 -18 -58 40 -29 26 -54 94 -52 146 0 29 -1 111 -4 181 l-5 129 40 46 c43 51 147 120 147 98 0 -17 -33 -46 -53 -46 -19 0 -67 -101 -66 -139 1 -24 2 -23 9 7 9 40 51 102 64 95 5 -3 6 -2 3 4 -3 5 7 19 23 31 20 15 34 39 45 79 9 32 22 69 29 83 16 35 120 89 171 90 33 0 140 32 154 46 10 10 -28 1 -74 -16z" + ></path> + <path + d="M540 1053 c-48 -18 -98 -44 -110 -58 -22 -27 -32 -16 -11 12 12 14 19 28 17 30 -12 12 -47 -14 -106 -79 -36 -40 -56 -68 -45 -64 11 4 52 17 90 28 68 19 113 42 64 32 -25 -4 42 31 74 40 9 2 17 11 17 20 0 8 12 22 28 30 26 15 14 21 -18 9z" + ></path> + <path d="M92 508 c-7 -7 -12 -21 -12 -32 1 -18 3 -17 16 7 17 31 15 44 -4 25z"></path> + <path d="M1069 487 c-14 -18 -29 -39 -34 -47 -15 -25 23 9 47 42 28 40 18 44 -13 5z"></path> + <path d="M90 415 c0 -5 5 -17 10 -25 5 -8 10 -10 10 -5 0 6 -5 17 -10 25 -5 8 -10 11 -10 5z" + ></path> + <path + d="M910 308 c-30 -35 -42 -52 -27 -39 25 23 27 23 28 5 0 -16 2 -15 10 5 5 13 19 36 30 53 39 54 13 39 -41 -24z" + ></path> + <path d="M120 343 c0 -6 8 -17 18 -24 16 -13 16 -13 2 6 -8 11 -16 22 -17 24 -2 2 -3 0 -3 -6z" + ></path> + <path d="M250 159 c0 -12 59 -41 73 -36 7 2 -7 13 -30 25 -24 11 -43 16 -43 11z"></path> + <path d="M763 143 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path + d="M665 105 c-16 -8 -40 -14 -53 -15 -20 0 -22 -4 -16 -22 10 -34 12 -34 47 -1 17 17 41 35 52 41 28 16 6 13 -30 -3z" + ></path> + <path d="M230 86 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21 13z"></path> + <path + d="M375 50 c-3 -5 -18 -10 -32 -10 -57 0 -11 -12 61 -15 42 -3 88 -7 103 -10 23 -4 -37 18 -109 41 -9 2 -19 0 -23 -6z" + ></path> + <path d="M293 43 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path d="M553 3 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"></path> + </g> + <g id="layer129" fill="#fdcd8f" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -21 -1 -56 -22 -56 -33 0 -4 24 3 53 15 28 11 83 32 122 45 38 14 84 37 102 50 19 14 35 24 38 22 2 -3 -46 -38 -106 -79 -75 -50 -106 -76 -95 -80 16 -5 -26 -31 -109 -65 -38 -16 -39 -17 -18 -28 19 -8 27 -6 47 16 15 16 36 27 51 27 37 0 31 -14 -14 -35 -34 -15 -59 -41 -49 -50 7 -6 148 -75 153 -75 4 0 3 6 -1 13 -4 6 5 1 19 -12 22 -20 27 -22 27 -8 0 9 6 17 13 17 6 0 23 13 37 30 19 23 29 27 40 20 12 -9 9 -15 -20 -40 -19 -16 -30 -30 -24 -30 6 0 17 7 24 14 8 10 18 12 33 7 25 -9 47 -4 47 10 0 6 -4 7 -10 4 -5 -3 -10 -3 -10 2 1 19 100 67 100 49 0 -10 -107 -116 -117 -116 -17 0 -8 -56 14 -84 24 -29 38 -33 47 -11 6 15 26 21 26 7 0 -4 -18 -31 -40 -61 -39 -52 -46 -73 -34 -105 5 -13 14 -7 40 26 18 24 43 62 56 86 12 24 29 49 38 55 24 18 67 79 75 107 10 34 52 83 58 67 2 -6 7 9 11 34 6 39 13 51 45 73 21 15 43 38 50 53 6 14 14 23 18 20 7 -8 -30 -68 -58 -93 -30 -27 -55 -77 -40 -82 8 -3 8 -9 0 -24 -6 -11 -12 -30 -13 -42 -2 -11 -17 -36 -34 -55 -18 -18 -32 -37 -32 -42 0 -14 -63 -113 -77 -122 -14 -9 -47 -67 -38 -67 3 0 0 -10 -6 -23 -11 -20 -11 -21 4 -9 13 11 15 10 10 -10 -5 -20 0 -18 35 16 40 39 79 124 68 152 -3 7 5 25 16 41 35 46 41 50 24 16 -23 -45 -14 -41 19 8 15 23 22 38 16 35 -19 -12 -12 8 14 39 19 24 24 26 25 12 0 -22 -20 -63 -76 -150 -24 -37 -44 -77 -44 -88 0 -10 -17 -38 -38 -62 -21 -23 -64 -78 -97 -122 -59 -80 -163 -187 -174 -181 -3 2 -15 -8 -25 -22 -17 -22 -17 -25 -3 -19 15 5 16 3 7 -13 -11 -21 -62 -60 -79 -60 -6 0 -27 -22 -46 -49 -22 -31 -48 -53 -68 -60 l-32 -11 26 20 c15 11 35 32 44 47 18 26 17 26 -23 -6 -23 -18 -42 -37 -42 -42 0 -5 -8 -9 -17 -9 -17 -1 -17 -1 -1 -10 11 -7 26 -7 43 0 41 15 133 90 202 163 34 37 80 77 102 91 21 14 54 47 72 73 18 26 48 70 66 97 18 26 33 56 33 66 0 9 13 31 30 48 17 18 30 42 30 55 0 21 14 47 86 157 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-327 -296 c0 -2 -7 -7 -16 -10 -8 -3 -12 -2 -9 4 6 10 25 14 25 6z m40 -100 c0 -22 -25 -66 -35 -62 -5 2 -19 -1 -30 -7 -26 -13 -118 -88 -128 -104 -4 -7 -12 -13 -18 -13 -5 0 3 19 18 43 35 52 41 87 16 87 -24 0 34 38 102 66 50 20 75 17 75 -10z m180 -25 c-25 -20 -58 -49 -75 -66 -26 -25 -28 -30 -12 -33 10 -2 26 2 35 10 12 9 11 6 -3 -10 -13 -16 -26 -21 -42 -18 -13 4 -25 1 -30 -8 -6 -11 -15 -6 -41 20 l-34 34 26 0 c14 0 26 5 26 10 0 6 11 10 25 10 14 0 25 -5 25 -11 0 -8 5 -8 15 1 8 7 15 19 15 26 0 8 4 14 9 14 4 0 28 15 52 34 59 45 66 34 9 -13z m23 -126 c4 -8 2 -17 -3 -20 -6 -4 -10 3 -10 14 0 25 6 27 13 6z m-473 -75 c14 -11 22 -20 18 -20 -14 0 -58 23 -58 32 0 13 13 9 40 -12z m27 13 c-4 -3 -10 -3 -14 0 -3 4 0 7 7 7 7 0 10 -3 7 -7z m303 -343 c0 -5 -5 -10 -11 -10 -5 0 -7 5 -4 10 3 6 8 10 11 10 2 0 4 -4 4 -10z" + ></path> + <path d="M618 1103 c6 -2 18 -2 25 0 6 3 1 5 -13 5 -14 0 -19 -2 -12 -5z"></path> + <path + d="M525 1080 c-27 -11 -68 -20 -90 -20 -26 0 -60 -11 -100 -33 -49 -28 -66 -45 -101 -102 -23 -37 -50 -72 -60 -78 -39 -21 -98 -72 -124 -108 l-27 -37 3 -182 c3 -208 13 -243 84 -300 22 -18 49 -49 60 -69 10 -21 27 -44 37 -52 13 -10 12 -7 -4 14 -21 27 -22 57 -2 57 16 0 10 18 -17 50 -20 23 -29 28 -35 19 -4 -7 -3 -22 3 -33 11 -21 6 -18 -58 40 -29 26 -54 94 -52 146 0 29 -1 111 -4 181 l-5 129 40 46 c43 51 147 120 147 98 0 -17 -33 -46 -53 -46 -19 0 -67 -101 -66 -139 1 -24 2 -23 9 7 9 40 51 102 64 95 5 -3 6 -2 3 4 -3 5 7 19 23 31 20 15 34 39 45 79 9 32 22 69 29 83 16 35 120 89 171 90 33 0 140 32 154 46 10 10 -28 1 -74 -16z" + ></path> + <path + d="M540 1053 c-48 -18 -98 -44 -110 -58 -22 -27 -32 -16 -11 12 12 14 19 28 17 30 -12 12 -47 -14 -106 -79 -36 -40 -56 -68 -45 -64 11 4 52 17 90 28 68 19 113 42 64 32 -25 -4 42 31 74 40 9 2 17 11 17 20 0 8 12 22 28 30 26 15 14 21 -18 9z" + ></path> + <path d="M1250 829 c0 -18 2 -19 15 -9 8 7 15 16 15 21 0 5 -7 9 -15 9 -9 0 -15 -9 -15 -21z" + ></path> + <path d="M960 800 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"></path> + <path d="M92 508 c-7 -7 -12 -21 -12 -32 1 -18 3 -17 16 7 17 31 15 44 -4 25z"></path> + <path d="M1069 487 c-14 -18 -29 -39 -34 -47 -15 -25 23 9 47 42 28 40 18 44 -13 5z"></path> + <path d="M90 415 c0 -5 5 -17 10 -25 5 -8 10 -10 10 -5 0 6 -5 17 -10 25 -5 8 -10 11 -10 5z" + ></path> + <path + d="M910 308 c-30 -35 -42 -52 -27 -39 25 23 27 23 28 5 0 -16 2 -15 10 5 5 13 19 36 30 53 39 54 13 39 -41 -24z" + ></path> + <path d="M120 343 c0 -6 8 -17 18 -24 16 -13 16 -13 2 6 -8 11 -16 22 -17 24 -2 2 -3 0 -3 -6z" + ></path> + <path d="M250 159 c0 -12 59 -41 73 -36 7 2 -7 13 -30 25 -24 11 -43 16 -43 11z"></path> + <path d="M763 143 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path + d="M665 105 c-16 -8 -40 -14 -53 -15 -20 0 -22 -4 -16 -22 10 -34 12 -34 47 -1 17 17 41 35 52 41 28 16 6 13 -30 -3z" + ></path> + <path d="M230 86 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21 13z"></path> + <path + d="M375 50 c-3 -5 -18 -10 -32 -10 -57 0 -11 -12 61 -15 42 -3 88 -7 103 -10 23 -4 -37 18 -109 41 -9 2 -19 0 -23 -6z" + ></path> + <path d="M293 43 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path d="M553 3 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"></path> + </g> + <g id="layer130" fill="#fcddaa" stroke="none"> + <path + d="M1367 1532 c-40 -37 -85 -77 -102 -87 -16 -10 -58 -42 -91 -71 -34 -29 -72 -55 -85 -59 -13 -4 -37 -17 -53 -28 -45 -32 -288 -147 -310 -147 -12 0 -30 -8 -41 -16 -19 -16 -19 -16 5 -9 43 12 204 75 220 85 37 24 92 51 96 47 3 -2 -45 -37 -106 -77 -60 -40 -110 -75 -110 -78 0 -2 11 -2 25 0 32 7 24 -6 -15 -22 -32 -13 -38 -25 -17 -33 15 -5 -28 -55 -58 -67 -18 -7 -15 -10 20 -25 22 -10 49 -22 60 -28 18 -9 18 -8 7 6 -11 13 -7 20 32 46 50 34 67 55 39 44 -15 -5 -14 -2 5 19 12 13 22 27 22 30 0 3 -10 9 -22 12 -22 6 -21 8 12 26 19 10 46 24 60 30 14 6 46 22 73 36 70 36 72 34 51 -46 -2 -10 9 -23 31 -34 30 -17 39 -17 59 -6 51 27 98 73 93 91 -3 11 2 19 13 22 16 4 29 -15 30 -44 0 -3 -29 -29 -65 -59 -36 -30 -65 -58 -65 -63 0 -6 8 -3 18 6 14 12 21 14 30 5 8 -8 -5 -24 -51 -62 -87 -72 -139 -126 -161 -167 -19 -36 -19 -36 1 -56 19 -19 20 -19 43 -1 13 10 29 17 36 14 7 -3 15 2 18 10 8 20 26 18 26 -3 0 -13 12 -6 41 25 31 33 40 49 35 66 -4 16 1 29 14 41 11 10 20 26 20 36 0 10 5 21 11 25 6 3 9 16 7 29 -4 16 -1 21 11 19 10 -2 28 14 47 44 17 26 38 46 45 45 17 -3 52 54 37 59 -6 2 1 15 16 28 14 14 26 30 26 37 0 6 4 14 10 18 14 9 -17 -88 -33 -100 -7 -5 -11 -17 -10 -25 2 -9 -15 -45 -37 -82 -22 -37 -40 -73 -40 -80 0 -7 -6 -25 -14 -39 -7 -14 -16 -38 -20 -53 -4 -16 -21 -46 -38 -67 -17 -22 -29 -41 -26 -44 3 -3 27 24 53 60 27 36 49 65 50 65 2 0 -1 -17 -6 -38 -8 -35 -47 -109 -92 -172 -9 -13 -17 -29 -17 -34 0 -5 14 13 32 40 17 27 41 65 54 84 12 19 26 49 30 65 4 17 15 41 26 54 10 13 18 29 18 35 0 6 15 43 33 81 18 39 39 90 46 115 7 25 19 56 26 70 7 14 16 41 20 60 4 19 11 40 16 45 4 6 10 22 12 35 3 14 14 41 25 60 16 28 19 47 15 93 -3 31 -9 57 -14 57 -5 0 -9 6 -9 13 0 24 -39 51 -81 54 -38 4 -44 0 -112 -65z m-192 -223 c-4 -5 -15 -9 -26 -9 -26 0 -17 15 10 17 12 1 19 -2 16 -8z m-56 -3 c-2 -2 -15 -9 -29 -16 -23 -12 -24 -12 -11 3 7 10 20 17 29 17 8 0 13 -2 11 -4z m-75 -41 c-10 -8 -23 -15 -28 -15 -6 0 -1 7 10 15 10 8 23 15 28 15 6 0 1 -7 -10 -15z m21 -26 c-4 -5 -12 -9 -19 -9 -7 0 -25 -9 -39 -20 -31 -24 -44 -26 -26 -3 31 36 104 65 84 32z m-5 -33 c0 -6 -75 -56 -85 -56 -4 0 10 13 31 29 36 27 54 36 54 27z m-136 -51 c-31 -29 -43 -33 -23 -7 17 20 31 32 42 32 4 0 -4 -11 -19 -25z m543 8 c-4 -3 -7 0 -7 7 0 7 3 10 7 7 3 -4 3 -10 0 -14z" + ></path> + <path d="M613 1103 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path + d="M510 1075 c-36 -13 -58 -24 -50 -24 8 -1 44 10 80 24 36 13 58 24 50 24 -8 0 -44 -11 -80 -24z" + ></path> + <path + d="M335 1027 c-49 -28 -67 -45 -100 -100 -24 -39 -56 -76 -80 -92 -54 -36 -92 -73 -116 -112 -18 -28 -19 -39 -10 -90 l10 -58 -4 60 c-5 64 3 84 55 137 33 33 117 88 136 88 16 0 37 43 24 48 -10 4 15 55 37 74 27 24 95 60 128 69 27 6 28 7 5 8 -14 0 -52 -14 -85 -32z m-104 -140 c-10 -9 -11 -8 -5 6 3 10 9 15 12 12 3 -3 0 -11 -7 -18z" + ></path> + <path + d="M919 981 l-87 -79 25 -18 25 -19 46 45 c25 25 45 48 44 53 -1 4 2 7 7 7 5 0 11 -15 15 -32 4 -18 10 -28 14 -23 11 15 70 55 82 55 19 0 10 20 -15 32 -14 6 -25 17 -25 24 0 11 -29 34 -42 34 -2 0 -42 -36 -89 -79z" + ></path> + <path d="M533 1043 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path + d="M345 968 c-39 -39 -61 -67 -50 -61 11 6 37 13 59 16 21 3 43 13 50 22 6 8 33 24 61 34 27 10 51 23 53 29 5 15 -58 -1 -91 -23 -38 -24 -43 -14 -12 24 52 61 0 31 -70 -41z" + ></path> + <path d="M664 1005 c-10 -8 -14 -15 -8 -15 6 0 17 7 24 15 16 19 9 19 -16 0z"></path> + <path + d="M700 945 c0 -2 18 -14 41 -26 23 -11 38 -16 35 -10 -4 5 -20 17 -38 25 -34 17 -38 19 -38 11z" + ></path> + <path d="M136 756 c-30 -52 -34 -69 -7 -35 25 32 44 70 38 75 -3 3 -16 -15 -31 -40z"></path> + <path d="M1105 739 c-9 -14 -2 -20 14 -10 8 6 9 11 3 15 -6 3 -14 1 -17 -5z"></path> + <path + d="M1186 662 c-16 -31 -35 -69 -42 -84 -8 -14 -14 -34 -14 -44 0 -15 6 -13 31 13 36 36 71 125 61 153 -6 16 -12 9 -36 -38z m4 -26 c0 -3 -5 -8 -12 -12 -7 -4 -8 -3 -4 4 7 12 16 16 16 8z" + ></path> + <path d="M100 670 c0 -7 3 -10 7 -7 3 4 3 10 0 14 -4 3 -7 0 -7 -7z"></path> + <path + d="M1031 626 c-13 -14 -20 -30 -16 -36 4 -7 16 1 31 21 13 18 24 34 24 36 0 10 -20 0 -39 -21z" + ></path> + <path + d="M1220 605 c0 -8 -19 -37 -42 -64 -24 -27 -61 -75 -83 -107 -22 -33 -73 -91 -112 -130 -40 -39 -73 -75 -73 -79 0 -20 -56 -78 -86 -91 -18 -8 -46 -33 -63 -58 -19 -27 -43 -48 -63 -55 l-33 -11 26 22 c46 41 58 65 17 34 -21 -16 -38 -32 -38 -37 0 -5 -8 -9 -17 -9 -17 -1 -17 -1 -1 -10 11 -7 26 -7 43 0 41 15 133 90 202 163 34 37 80 77 102 91 21 14 54 47 72 73 18 26 48 70 66 97 18 26 33 56 33 66 0 9 14 31 30 48 26 27 41 72 25 72 -3 0 -5 -7 -5 -15z m-180 -284 c-16 -31 -32 -36 -18 -7 6 14 15 26 20 26 5 0 4 -9 -2 -19z" + ></path> + <path + d="M27 455 c3 -140 19 -184 83 -235 22 -18 49 -49 60 -69 10 -21 27 -44 37 -52 13 -10 12 -7 -4 14 -21 27 -22 57 -2 57 16 0 10 18 -17 50 -20 23 -29 28 -35 19 -4 -7 -3 -22 3 -33 11 -21 6 -18 -58 40 -30 27 -56 97 -50 138 3 23 -1 75 -8 116 l-13 75 4 -120z" + ></path> + <path d="M92 508 c-14 -14 -16 -42 -3 -34 7 5 23 46 17 46 -1 0 -7 -5 -14 -12z"></path> + <path d="M910 307 l-25 -32 27 20 c15 11 29 26 32 33 10 22 -9 11 -34 -21z"></path> + <path d="M623 89 c-24 -7 -30 -13 -26 -29 7 -27 15 -25 46 10 29 32 28 33 -20 19z"></path> + <path d="M230 86 c0 -2 8 -10 18 -17 15 -13 16 -12 3 4 -13 16 -21 21 -21 13z"></path> + <path + d="M375 50 c-3 -5 -18 -10 -32 -10 -57 0 -11 -12 61 -15 42 -3 88 -7 103 -10 23 -4 -37 18 -109 41 -9 2 -19 0 -23 -6z" + ></path> + <path d="M293 43 c4 -3 10 -3 14 0 3 4 0 7 -7 7 -7 0 -10 -3 -7 -7z"></path> + <path d="M553 3 c9 -2 23 -2 30 0 6 3 -1 5 -18 5 -16 0 -22 -2 -12 -5z"></path> + </g> +</svg> diff --git a/src/icons/External.astro b/src/icons/External.astro new file mode 100644 index 0000000..832796a --- /dev/null +++ b/src/icons/External.astro @@ -0,0 +1,15 @@ +<svg + xmlns="http://www.w3.org/2000/svg" + width="18" + height="18" + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" +> + <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> + <line x1="17" y1="7" x2="7" y2="17"></line> + <polyline points="8 7 17 7 17 16"></polyline> +</svg> diff --git a/src/icons/Github.astro b/src/icons/Github.astro new file mode 100644 index 0000000..4a9fa8d --- /dev/null +++ b/src/icons/Github.astro @@ -0,0 +1,10 @@ +--- + +--- + +<svg role="img" width="20" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"> + <path + fill="currentColor" + d="M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12" + ></path> +</svg> diff --git a/src/icons/Language.astro b/src/icons/Language.astro new file mode 100644 index 0000000..05c9989 --- /dev/null +++ b/src/icons/Language.astro @@ -0,0 +1,18 @@ +<svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" +> + <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> + <path d="M4 5h7"></path> + <path d="M9 3v2c0 4.418 -2.239 8 -5 8"></path> + <path d="M5 9c-.003 2.144 2.952 3.908 6.7 4"></path> + <path d="M12 20l4 -9l4 9"></path> + <path d="M19.1 18h-6.2"></path> +</svg> diff --git a/src/icons/Menu.astro b/src/icons/Menu.astro new file mode 100644 index 0000000..1d78783 --- /dev/null +++ b/src/icons/Menu.astro @@ -0,0 +1,27 @@ +--- +interface Props { + class?: string; +} +--- + +<svg + class={Astro.props.class} + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" +> + <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> + <g> + <line x1="4" y1="6" x2="20" y2="6"></line> + </g> + <line x1="4" y1="12" x2="20" y2="12"></line> + <g> + <line x1="4" y1="18" x2="20" y2="18"></line> + </g> +</svg> diff --git a/src/icons/React.astro b/src/icons/React.astro new file mode 100644 index 0000000..11a77bf --- /dev/null +++ b/src/icons/React.astro @@ -0,0 +1,21 @@ +--- +interface Props { + class?: string; +} +--- + +<svg + width="100%" + height="100%" + viewBox="-10.5 -9.45 21 18.9" + fill="none" + xmlns="http://www.w3.org/2000/svg" + class={Astro.props.class} +> + <circle cx="0" cy="0" r="2" fill="#087ea4"></circle> + <g stroke="#087ea4" stroke-width="1" fill="none"> + <ellipse rx="10" ry="4.5"></ellipse> + <ellipse rx="10" ry="4.5" transform="rotate(60)"></ellipse> + <ellipse rx="10" ry="4.5" transform="rotate(120)"></ellipse> + </g> +</svg> diff --git a/src/icons/Solid.astro b/src/icons/Solid.astro new file mode 100644 index 0000000..5adc1a7 --- /dev/null +++ b/src/icons/Solid.astro @@ -0,0 +1,52 @@ +--- +interface Props { + class?: string; +} +--- + +<svg + class={Astro.props.class} + width="100%" + height="100%" + xmlns="http://www.w3.org/2000/svg" + viewBox="0 0 166 155.3" +> + <defs> + <linearGradient id="a" gradientUnits="userSpaceOnUse" x1="27.5" y1="3" x2="152" y2="63.5"> + <stop offset=".1" stop-color="#76b3e1"></stop> + <stop offset=".3" stop-color="#dcf2fd"></stop> + <stop offset="1" stop-color="#76b3e1"></stop> + </linearGradient> + <linearGradient id="b" gradientUnits="userSpaceOnUse" x1="95.8" y1="32.6" x2="74" y2="105.2"> + <stop offset="0" stop-color="#76b3e1"></stop> + <stop offset=".5" stop-color="#4377bb"></stop> + <stop offset="1" stop-color="#1f3b77"></stop> + </linearGradient> + <linearGradient id="c" gradientUnits="userSpaceOnUse" x1="18.4" y1="64.2" x2="144.3" y2="149.8"> + <stop offset="0" stop-color="#315aa9"></stop> + <stop offset=".5" stop-color="#518ac8"></stop> + <stop offset="1" stop-color="#315aa9"></stop> + </linearGradient> + <linearGradient id="d" gradientUnits="userSpaceOnUse" x1="75.2" y1="74.5" x2="24.4" y2="260.8"> + <stop offset="0" stop-color="#4377bb"></stop> + <stop offset=".5" stop-color="#1a336b"></stop> + <stop offset="1" stop-color="#1a336b"></stop> + </linearGradient> + </defs> + <path + d="M163 35S110-4 69 5l-3 1c-6 2-11 5-14 9l-2 3-15 26 26 5c11 7 25 10 38 7l46 9 18-30z" + fill="#76b3e1"></path> + <path + d="M163 35S110-4 69 5l-3 1c-6 2-11 5-14 9l-2 3-15 26 26 5c11 7 25 10 38 7l46 9 18-30z" + opacity=".3" + fill="url(#a)"></path> + <path d="M52 35l-4 1c-17 5-22 21-13 35 10 13 31 20 48 15l62-21S92 26 52 35z" fill="#518ac8" + ></path> + <path + d="M52 35l-4 1c-17 5-22 21-13 35 10 13 31 20 48 15l62-21S92 26 52 35z" + opacity=".3" + fill="url(#b)"></path> + <path d="M134 80a45 45 0 00-48-15L24 85 4 120l112 19 20-36c4-7 3-15-2-23z" fill="url(#c)"></path> + <path d="M114 115a45 45 0 00-48-15L4 120s53 40 94 30l3-1c17-5 23-21 13-34z" fill="url(#d)"> + </path> +</svg> diff --git a/src/icons/Twitter.astro b/src/icons/Twitter.astro new file mode 100644 index 0000000..9c9160f --- /dev/null +++ b/src/icons/Twitter.astro @@ -0,0 +1,12 @@ +<svg + class="only-medium" + role="img" + width="20" + viewBox="0 0 24 24" + xmlns="http://www.w3.org/2000/svg" +> + <path + fill="currentColor" + d="M23.953 4.57a10 10 0 01-2.825.775 4.958 4.958 0 002.163-2.723c-.951.555-2.005.959-3.127 1.184a4.92 4.92 0 00-8.384 4.482C7.69 8.095 4.067 6.13 1.64 3.162a4.822 4.822 0 00-.666 2.475c0 1.71.87 3.213 2.188 4.096a4.904 4.904 0 01-2.228-.616v.06a4.923 4.923 0 003.946 4.827 4.996 4.996 0 01-2.212.085 4.936 4.936 0 004.604 3.417 9.867 9.867 0 01-6.102 2.105c-.39 0-.779-.023-1.17-.067a13.995 13.995 0 007.557 2.209c9.053 0 13.998-7.496 13.998-13.985 0-.21 0-.42-.015-.63A9.935 9.935 0 0024 4.59z" + ></path> +</svg> diff --git a/src/icons/Vue.astro b/src/icons/Vue.astro new file mode 100644 index 0000000..e4d587b --- /dev/null +++ b/src/icons/Vue.astro @@ -0,0 +1,10 @@ +--- +interface Props { + class?: string; +} +--- + +<svg viewBox="0 0 128 128" width="100%" height="100%" class={Astro.props.class}> + <path fill="#42b883" d="M78.8,10L64,35.4L49.2,10H0l64,110l64-110C128,10,78.8,10,78.8,10z"></path> + <path fill="#35495e" d="M78.8,10L64,35.4L49.2,10H25.6L64,76l38.4-66H78.8z"></path> +</svg> diff --git a/src/icons/Youtube.astro b/src/icons/Youtube.astro new file mode 100644 index 0000000..bd59f09 --- /dev/null +++ b/src/icons/Youtube.astro @@ -0,0 +1,15 @@ +<svg + xmlns="http://www.w3.org/2000/svg" + width="24" + height="24" + viewBox="0 0 24 24" + stroke-width="1.5" + stroke="currentColor" + fill="none" + stroke-linecap="round" + stroke-linejoin="round" +> + <path stroke="none" d="M0 0h24v24H0z" fill="none"></path> + <rect x="3" y="5" width="18" height="14" rx="4"></rect> + <path d="M10 9l5 3l-5 3z"></path> +</svg> diff --git a/src/languages.ts b/src/languages.ts new file mode 100644 index 0000000..ad8d37a --- /dev/null +++ b/src/languages.ts @@ -0,0 +1,243 @@ +import path from "node:path"; +import { KNOWN_LANGUAGES, KNOWN_LANGUAGE_CODES, SITE } from "./consts"; + +export { KNOWN_LANGUAGES, KNOWN_LANGUAGE_CODES }; + +export type LText = { + [Key in (typeof KNOWN_LANGUAGE_CODES)[number]]?: string; +} & { en: string }; + +export const langPathRegex = /\/([a-z]{2}-?[A-Z]{0,2})\//; + +export function getLanguageFromURL(pathname: string) { + const langCodeMatch = pathname.match(langPathRegex); + const langCode = langCodeMatch ? langCodeMatch[1] : "en"; + return langCode as (typeof KNOWN_LANGUAGE_CODES)[number]; +} + +export function getPathParamsFromId(pathname: string) { + const strippedPath = pathname.startsWith("/") ? pathname.slice(1) : pathname; + const ext = path.extname(strippedPath); + const parts = strippedPath.replace(ext, "").split("/"); + const lang = parts.shift()! || SITE.defaultLanguage; + const slug = parts.join("/") || "/"; + return { lang, slug }; +} + +export function getTextLocalized(item: { text: LText }, lang: string): string { + if (lang in item.text) { + return item.text[lang as "en" | "ru" | "uz"]!; + } + return item.text.en; +} + +export function createLink(item: { text: LText; link: string }, lang: string): string { + if (item.link.startsWith("/")) { + return `/${lang}${item.link}`; + } + return item.link; +} + +export function createChangeLangLinks({ slug }: { slug: string }) { + return Object.entries(KNOWN_LANGUAGES).map(([name, code]) => ({ + text: { en: name }, + link: slug === "/" ? `/${code}` : `/${code}/${slug}`, + })); +} + +export const translations = { + docs: { text: { en: "Docs", ru: "Меню" } }, + Documentation: { text: { en: "Documentation", ru: "Документация" } }, + ThisPageIsNotTranslatedYet: { + text: { + en: "This page is not translated yet", + ru: "Эта страница еще не переведена", + uz: "Bu sahifa hali tarjima qilinmagan", + }, + }, + TranslationDisclaimer: { + title: { + text: { + en: "", + ru: "Перевод поддерживается сообществом", + uz: "Tarjima jamiyat tomonidan qollanilyapti", + }, + }, + firstLine: { + text: { + en: "", + ru: "Документация на английском языке - самая актуальная, поскольку её пишет и обновляет команда effector. Перевод документации на другие языки осуществляется сообществом по мере наличия сил и желания.", + uz: "Ingliz tilidagi hujjatlar eng dolzarb hisoblanadi, chunki u effector guruhi tomonidan yozilgan va yangilanadi. Hujjatlarni boshqa tillarga tarjima qilish jamiyat tomonidan kuch va istaklar mavjud bo'lganda amalga oshiriladi.", + }, + }, + secondLine: { + text: { + en: "", + ru: "Помните, что переведенные статьи могут быть неактуальными, поэтому для получения наиболее точной и актуальной информации рекомендуем использовать оригинальную англоязычную версию документации.", + uz: "Esda tutingki, tarjima qilingan maqolalar yangilanmasligi mumkin, shuning uchun eng aniq va dolzarb ma'lumot uchun hujjatlarning asl inglizcha versiyasidan foydalanishni tavsiya etamiz.\n", + }, + }, + }, + PleaseOpenPRWithTranslations: { + text: { + en: "To add new translation open Pull Request", + ru: "Чтобы добавить перевод, откройте Pull Request", + uz: "Tarjima qoshish uchun havola boyicha o'tib Pull Request oching", + }, + }, + usingThisLink: { + text: { + en: "using this link", + ru: "по этой ссылке", + uz: "(havolaga o'tish)", + }, + }, + ShowingContentForDefaultLanguage: { + text: { + en: "Showing content for default language", + ru: "Отображается содержимое для языка по умолчанию", + uz: "Standart til uchun tarkibni ko'rsatadi", + }, + }, + OnThisPage: { + text: { + en: "On this page", + ru: "Оглавление", + uz: "Mundarija", + }, + }, + EditThisPage: { + text: { + en: "Edit this page", + ru: "Внести правки", + uz: "O'zgartirish kiritish", + }, + }, + JoinOurCommunity: { + text: { + en: "Join our community", + ru: "Войти в чат", + uz: "Chatga kirish", + }, + }, + More: { + text: { + en: "More", + ru: "Дополнительно", + uz: "Qoshimcha", + }, + }, + Contributors: { + text: { + en: "Contributors", + ru: "Соавторы", + uz: "Hammualliflar", + }, + }, + Landing: { + Stats: { + title: { text: { en: "Effector at a Glance", ru: "effector в цифрах" } }, + size: { text: { en: "gzipped size", ru: "размер gzip", uz: "gzip hajmi" } }, + contributors: { text: { en: "contributors", ru: "соавторы", uz: "hammualliflar" } }, + stars: { text: { en: "stars", ru: "звёзды", uz: "yulduzchalar" } }, + downloads: { text: { en: "downloads", ru: "установки", uz: "yuklanmalar" } }, + latest: { text: { en: "latest version", ru: "актуальная версия", uz: "joriy versiya" } }, + license: { text: { en: "license", ru: "лицензия", uz: "litsenziya" } }, + StartByAddingEffectorAsDependency: { + text: { + en: "Start by adding effector as a dependency", + ru: "Начните с установки effector", + uz: "Effectorni ornatishdan boshlang", + }, + }, + }, + Companies: { + title: { + text: { + en: "Companies using effector", + ru: "Компании использующие effector", + uz: "Effektordan foydalanadigan kompaniyalar", + }, + }, + wantToAppear: { + text: { + en: "Want to appear on this page?", + ru: "Хотите попасть в этот список?", + uz: "Ushbu ro'yxatga kirishni xohlaysizmi?", + }, + }, + tellUs: { + text: { + en: "Tell us", + ru: "Расскажите нам", + uz: "Bizga habar bering", + }, + }, + }, + }, + Pagefind: { + placeholder: { text: { en: "Search", ru: "Поиск", uz: "Qidiruv" } }, + clear_search: { text: { en: "Clear", ru: "Очистить", uz: "Tozalash" } }, + load_more: { + text: { en: "Load more results", ru: "Загрузить еще", uz: "Ko'proq natijalarni yuklash" }, + }, + search_label: { + text: { en: "Search this site", ru: "Поиск по сайту", uz: "Sayt boyisha qidiruv" }, + }, + filters_label: { text: { en: "Filters", ru: "Фильтры", uz: "Filterlar" } }, + zero_results: { + text: { + en: "No results for [SEARCH_TERM]", + ru: "Про [SEARCH_TERM] ничего не найдено", + uz: "[SEARCH_TERM] bo‘yicha hech narsa yoq", + }, + }, + many_results: { + text: { + en: "[COUNT] results for [SEARCH_TERM]", + ru: "Найдено [COUNT] по поиску [SEARCH_TERM]", + uz: "[SEARCH_TERM] uchun [COUNT] ta natija", + }, + }, + one_result: { + text: { en: "[COUNT] result for [SEARCH_TERM]", uz: "[SEARCH_TERM] uchun [COUNT] ta natija" }, + }, + alt_search: { + text: { + en: "No results for [SEARCH_TERM]. Showing results for [DIFFERENT_TERM] instead", + uz: "[SEARCH_TERM] boʻyicha hech narsa topilmadi. Oʻrniga [DIFFERENT TERM] boyicha natijalar koʻrsatilmoqda", + }, + }, + search_suggestion: { + text: { + en: "No results for [SEARCH_TERM]. Try one of the following searches:", + uz: "[SEARCH_TERM] boʻyicha hech narsa topilmadi. Quyidagi qidiruvlardan birini sinab ko'ring:", + }, + }, + searching: { + text: { + en: "Searching for [SEARCH_TERM]…", + ru: "Поиск [SEARCH_TERM]…", + uz: "[SEARCH_TERM] qidirilmoqda…", + }, + }, + }, + Search: { + label: { text: { en: "Search", ru: "Поиск", uz: "Qidiruv" } }, + shortcutLabel: { + text: { + en: "(Press / to Search)", + ru: "(Нажмите / для поиска)", + uz: "(Qidirish uchun / tugmasini bosing)", + }, + }, + cancelLabel: { text: { en: "Cancel", ru: "Отмена", uz: "Bekor qilish" } }, + devWarning: { + text: { + en: "Search is only available in production builds. \nTry building and previewing the site to test it out locally.", + ru: "Поиск недоступен в сборке для разработки. \nСоберите и включите preview для проверки поиска локально.", + uz: "Qidiruv ishlanma tuzilmasida mavjud emas. \nLokal qidiruvingizni sinab ko'rish uchun preview ni bosib yoqing.", + }, + }, + }, +}; diff --git a/src/layouts/CommonLayout.astro b/src/layouts/CommonLayout.astro new file mode 100644 index 0000000..795aba7 --- /dev/null +++ b/src/layouts/CommonLayout.astro @@ -0,0 +1,42 @@ +--- +import type { CollectionEntry } from "astro:content"; +import HeadCommon from "../components/HeadCommon.astro"; +import HeadSEO from "../components/HeadSEO.astro"; +import Header from "../components/Header/Header.astro"; +import Footer from "../components/Footer/Footer.astro"; +import { SITE } from "../consts"; + +type DocsEntry = CollectionEntry<"docs">["data"]; +export interface Props extends DocsEntry { + redirectTo?: string; +} + +const { redirectTo, ...data } = Astro.props; +const canonicalURL = new URL(Astro.url.pathname, Astro.site); +const currentPage = Astro.url.pathname; +--- + +<html dir={data.dir} lang={data.lang} class="initial"> + <head> + <HeadCommon /> + <HeadSEO {...data} canonicalUrl={canonicalURL} /> + {redirectTo ? <meta http-equiv="refresh" content={`0;URL=${redirectTo}`} /> : null} + <title> + {`${data.title} | ${SITE.title}`} + </title> + <style> + body { + --doc-padding: 2rem; + display: grid; + grid-template-rows: 1fr auto; + width: 100%; + } + </style> + </head> + + <body> + <Header currentPage={currentPage} /> + <slot /> + <Footer /> + </body> +</html> diff --git a/src/layouts/Landing.astro b/src/layouts/Landing.astro new file mode 100644 index 0000000..ff5c3bf --- /dev/null +++ b/src/layouts/Landing.astro @@ -0,0 +1,28 @@ +--- +import CommonLayout from "../layouts/CommonLayout.astro"; + +interface Props { + title: string; + lang: "en" | "ru" | "uz"; + description: string; + dir?: "ltr" | "rtl"; +} + +const { title, lang, description, dir = "ltr" } = Astro.props; +--- + +<CommonLayout lang={lang} title={title} dir={dir} description={description}> + <div class="landing"> + <slot /> + </div> +</CommonLayout> + +<style> + :root { + --header-max-width: 98rem; + } + + .landing { + margin-top: var(--theme-navbar-height); + } +</style> diff --git a/src/layouts/MainLayout.astro b/src/layouts/MainLayout.astro new file mode 100644 index 0000000..a3ca197 --- /dev/null +++ b/src/layouts/MainLayout.astro @@ -0,0 +1,173 @@ +--- +import type { MarkdownHeading } from "astro"; +import type { CollectionEntry } from "astro:content"; + +import CommonLayout from "./CommonLayout.astro"; + +import PageContent from "@components/PageContent/PageContent.astro"; +import Contributors from "@components/PageContent/Contributors.astro"; +import LeftSidebar from "@components/LeftSidebar/LeftSidebar.astro"; +import RightSidebar from "@components/RightSidebar/RightSidebar.astro"; +import Announcement from "@components/PageContent/Announcement.astro"; + +export type Props = CollectionEntry<"docs">["data"] & { + headings: MarkdownHeading[]; + translations: { lang: string; slug: string }[]; + breadcrumbs: { title: string; path: string }[]; + lang: string; + documentId: string; + redirectTo?: string; + pagefindWeight?: number; + indexing?: boolean; +}; + +const { + headings, + translations, + breadcrumbs, + lang, + documentId, + pagefindWeight, + indexing = true, + ...data +} = Astro.props; +const currentPage = Astro.url.pathname; +--- + +<CommonLayout lang={lang} {...data}> + <style> + :root { + --gutter: 0.5rem; + --content-max-width: 56rem; + } + + main { + margin-top: var(--theme-navbar-height); + } + + .layout { + display: grid; + grid-template-columns: minmax(var(--gutter), 1fr) minmax(0, var(--content-max-width)) minmax( + var(--gutter), + 1fr + ); + grid-auto-flow: column; + overflow-x: hidden; + } + + #grid-left { + display: none; + position: fixed; + z-index: 10; + background-color: var(--theme-bg); + height: 100%; + + position: sticky; + top: var(--theme-navbar-height, 0); + padding: 0; + height: calc(100vh - var(--theme-navbar-height, 0)); + } + + #grid-main { + display: flex; + grid-column: 2; + flex-direction: column; + padding-block: var(--doc-padding); + padding-inline: 1rem; + height: 100%; + } + + #grid-right { + display: none; + } + + @media (min-width: 768px) { + :root { + --sidebar-left-width: 20rem; + } + + .layout { + grid-template-columns: var(--sidebar-left-width) minmax(0, var(--content-max-width)); + gap: 1em; + overflow: initial; + } + + #grid-left { + display: flex; + position: sticky; + grid-column: 1; + padding-left: 2rem; + } + + #grid-main { + padding-right: 2rem; + } + } + + @media (min-width: 1280px) { + :root { + --sidebar-right-width: 18rem; + --header-max-width: calc( + var(--sidebar-left-width) + var(--content-max-width) + var(--sidebar-right-width) + ); + } + + .layout { + grid-template-columns: var(--sidebar-left-width) minmax(0, var(--content-max-width)) var( + --sidebar-right-width + ); + margin-right: auto; + margin-left: auto; + padding-right: 0; + padding-left: 0; + } + + #grid-right { + display: flex; + grid-column: 3; + } + } + + @media (min-width: 1536px) { + :root { + --sidebar-left-width: 22rem; + --sidebar-right-width: 20rem; + } + } + </style> + <style is:global> + .layout > * { + width: 100%; + height: 100%; + } + + @media (max-width: 768px) { + body.mobile-menu-opened { + overflow: hidden; + } + } + </style> + + <main class="layout"> + <aside id="grid-left" title="Site Navigation" data-pagefind-ignore> + <LeftSidebar currentPage={currentPage} headings={headings} /> + </aside> + <div id="grid-main"> + <PageContent + title={data.title} + headings={headings} + documentId={documentId} + translations={translations} + breadcrumbs={breadcrumbs} + pagefindWeight={pagefindWeight} + indexing={indexing} + > + <slot /> + </PageContent> + <Contributors documentId={documentId} /> + </div> + <aside id="grid-right" title="Table of Contents" data-pagefind-ignore> + <RightSidebar lang={lang} headings={headings} documentId={documentId} /> + </aside> + </main> +</CommonLayout> diff --git a/src/navigation.ts b/src/navigation.ts new file mode 100644 index 0000000..0686aa0 --- /dev/null +++ b/src/navigation.ts @@ -0,0 +1,1004 @@ +import { getCollection } from "astro:content"; +import { nanoid } from "nanoid"; +import { SITE, LINKS } from "./consts"; +import { getTextLocalized, createLink, type LText } from "./languages"; + +const defaultSidebar: LSidebarGroup[] = [ + { + text: { en: "Introduction", ru: "Начало работы", uz: "Kirish" }, + items: [ + { + text: { en: "Motivation", ru: "Мотивация", uz: "Motivatsiya" }, + link: "/introduction/motivation", + }, + { + text: { en: "Community", ru: "Сообщество", uz: "Jamiyat" }, + link: "/introduction/community", + }, + { + text: { en: "Installation", ru: "Установка", uz: "O'rnatma" }, + link: "/introduction/installation", + }, + { + text: { en: "Ecosystem", ru: "Экосистема effector", uz: "Effector ekosistemasi" }, + link: "/introduction/ecosystem", + }, + { + text: { en: "Examples", ru: "Примеры", uz: "Namunalar" }, + link: "/introduction/examples", + }, + { + text: { en: "FAQ", ru: "Частые вопросы", uz: "Tezt-tez soraladigan savollar" }, + link: "/FAQ", + }, + ], + }, + { + text: { en: "Conventions", ru: "Соглашения", uz: "Shartnomalar" }, + items: [ + { + text: { en: "Naming", ru: "Именование", uz: "Nomlanmalar" }, + link: "/conventions/naming", + }, + ], + }, + { + text: { + en: "TypeScript Guide", + ru: "Использование с TypeScript", + uz: "Typescript bilan ishlash", + }, + items: [ + { + text: { en: "Typing effector", ru: "Типизация effector", uz: "Effector tipizatsiyasi" }, + link: "/typescript/typing-effector", + }, + { + text: { en: "Usage with `effector-react`", uz: "`effector-react` dan foydalaning" }, + link: "/typescript/usage-with-effector-react", + }, + { + text: { en: "Utility Types", ru: "Служебные типы", uz: "Utilit turlari" }, + link: "/typescript/utility-types", + }, + ], + }, + { + text: { en: "Guides", ru: "Руководства", uz: "Qo'llanmalar" }, + items: [ + { + text: { en: "Writing tests", uz: "Testlar yozish" }, + link: "/guides/testing", + }, + { + text: { en: "Server Side Rendering" }, + link: "/guides/server-side-rendering", + }, + { + text: { en: "Migration guide" }, + link: "/guides/migration-guide-v23", + }, + { + text: { en: "Migrating from Redux" }, + link: "https://withease.pages.dev/magazine/migration_from_redux.html", + }, + ], + }, + { + text: { en: "Core principles", ru: "Основные принципы", uz: "Asosiy tamoyillar" }, + items: [ + { + text: { en: "Releases policy" }, + link: "/core-principles/releases", + }, + { + text: { en: "Testing" }, + link: "/core-principles/testing", + }, + { + text: { en: "Typings" }, + link: "/core-principles/typings", + }, + ], + }, + { + text: { + en: "For library developers", + uz: "Biblioteka dasturchilari uchun", + }, + items: [ + { + text: { en: "Universal @@unitShape protocol" }, + link: "/ecosystem-development/unit-shape-protocol", + }, + ], + }, + { + text: { en: "Explanation", ru: "Погружение", uz: "Tushuntirish" }, + items: [ + { + text: { en: "Glossary", ru: "Глоссарий", uz: "Lug'at" }, + link: "/explanation/glossary", + }, + { + text: { en: "Events", ru: "События", uz: "Events" }, + link: "/explanation/events", + }, + { + text: { en: "Computation Priority", uz: "Hisoblash ustuvorligi" }, + link: "/explanation/computation-priority", + }, + { + text: { en: "Prior Art", ru: "Prior Art", uz: "Prior Art" }, + link: "/explanation/prior-art", + }, + { + text: { en: "SIDs" }, + link: "/explanation/sids", + }, + ], + }, +]; + +const recipes = [ + { + text: { en: "Common", uz: "Umumiy" }, + items: [ + { + text: { en: "Countdown Timer", uz: "Hisob taymeri" }, + link: "/recipes/common/countdown", + }, + ], + }, + { + text: { en: "React" }, + items: [ + { + text: { en: "Counter" }, + link: "/recipes/react/counter", + }, + { + text: { en: "Effects" }, + link: "/recipes/react/effects", + }, + { + text: { en: "Forms" }, + link: "/recipes/react/forms", + }, + { + text: { en: "Gate" }, + link: "/recipes/react/gate", + }, + { + text: { en: "ToDo Creator" }, + link: "/recipes/react/todo-creator", + }, + { + text: { en: "Dynamic Form Schema", uz: "Dinamik shakl sxemasi" }, + link: "/recipes/react/dynamic-form-schema", + }, + { + text: { + en: "ToDo List with Validation", + uz: "Validation bilan tasdiqlangan ishlar ro'yxati", + }, + link: "/recipes/react/todo-with-validation", + }, + { + text: { en: "Slots", uz: "Slotlar" }, + link: "/recipes/react/slots", + }, + ], + }, + { + text: { en: "React Native" }, + items: [ + { + text: { en: "AsyncStorage Counter" }, + link: "/recipes/react-native/asyncstorage-counter", + }, + ], + }, + { + text: { en: "Next.js" }, + items: [ + { + text: { + en: "Integrate Next.js with effector", + uz: "Next.js effector bilan integratsiyasi", + }, + link: "/recipes/nextjs/integrate", + }, + { + text: { en: "Integrate with Next.js router", uz: "Next.js router bilan integratsiyasi" }, + link: "/recipes/nextjs/router", + }, + { + text: { en: "Use scopeBind in Next.js", uz: "Next.js da scopeBind dan foydalaning" }, + link: "/recipes/nextjs/scope-bind", + }, + ], + }, +]; + +const effectorReact = [ + { + text: { en: "Hooks" }, + items: [ + { + text: { en: "useUnit", ru: "useUnit", uz: "useUnit" }, + link: "/api/effector-react/useUnit", + quickMenu: true, + }, + { + text: { en: "useList", ru: "useList", uz: "useList" }, + link: "/api/effector-react/useList", + quickMenu: true, + }, + { + text: { en: "useStoreMap", ru: "useStoreMap", uz: "useStoreMap" }, + link: "/api/effector-react/useStoreMap", + quickMenu: true, + }, + { + text: { en: "useStore", ru: "useStore", uz: "useStore" }, + link: "/api/effector-react/useStore", + }, + { + text: { en: "useEvent", ru: "useEvent", uz: "useEvent" }, + link: "/api/effector-react/useEvent", + }, + ], + }, + { + text: { en: "Components", uz: "Komponentlar" }, + items: [ + { + text: { en: "Provider", ru: "Provider", uz: "Provider" }, + link: "/api/effector-react/Provider", + quickMenu: true, + }, + ], + }, + { + text: { en: "Gates" }, + items: [ + { + text: { en: "Gate" }, + link: "/api/effector-react/Gate", + quickMenu: true, + }, + { + text: { en: "createGate", uz: "createGate" }, + link: "/api/effector-react/createGate", + quickMenu: true, + }, + { + text: { en: "useGate", uz: "useGate" }, + link: "/api/effector-react/useGate", + }, + ], + }, + { + text: { en: "Import map" }, + items: [ + { + text: { en: "effector-react/compat" }, + link: "/api/effector-react/module/сompat", + }, + { + text: { en: "effector-react/scope" }, + link: "/api/effector-react/module/scope", + }, + ], + }, + { + text: { en: "Low-level API" }, + collapsed: true, + items: [ + { + text: { en: "useProvidedScope" }, + link: "/api/effector-react/useProvidedScope", + }, + ], + }, + { + text: { en: "HOC-like APIs", uz: "HOCsimon APIlar" }, + collapsed: true, + items: [ + { + text: { en: "connect" }, + link: "/api/effector-react/connect", + }, + { + text: { en: "createComponent" }, + link: "/api/effector-react/createComponent", + }, + { + text: { en: "createStoreConsumer" }, + link: "/api/effector-react/createStoreConsumer", + }, + ], + }, +]; + +const effectorSolid = [ + { + text: { en: "Hooks" }, + items: [ + { + text: { en: "useUnit" }, + link: "/api/effector-solid/useUnit", + quickMenu: true, + }, + { + text: { en: "useStoreMap" }, + link: "/api/effector-solid/useStoreMap", + quickMenu: true, + }, + ], + }, + { + text: { en: "Gates" }, + items: [ + { + text: { en: "Gate" }, + link: "/api/effector-solid/Gate", + quickMenu: true, + }, + { + text: { en: "createGate" }, + link: "/api/effector-solid/createGate", + quickMenu: true, + }, + { + text: { en: "useGate" }, + link: "/api/effector-solid/useGate", + quickMenu: true, + }, + ], + }, + { + text: { en: "Import map" }, + items: [ + { + text: { en: "effector-solid/scope" }, + link: "/api/effector-solid/module/scope", + }, + ], + }, +]; + +const effectorVue = [ + { + text: { en: "Common methods" }, + items: [ + { + text: { en: "VueEffector" }, + link: "/api/effector-vue/VueEffector", + quickMenu: true, + }, + { + text: { en: "EffectorScopePlugin" }, + link: "/api/effector-vue/EffectorScopePlugin", + quickMenu: true, + }, + { + text: { en: "createComponent" }, + link: "/api/effector-vue/createComponent", + quickMenu: true, + }, + ], + }, + { + text: { en: "Options and properties", uz: "Variantlar va xususiyatlar" }, + items: [ + { + text: { en: "ComponentOptions" }, + link: "/api/effector-vue/ComponentOptions", + quickMenu: true, + }, + ], + }, + { + text: { en: "Gates" }, + items: [ + { + text: { en: "Gate" }, + link: "/api/effector-vue/Gate", + quickMenu: true, + }, + { + text: { en: "createGate" }, + link: "/api/effector-vue/createGate", + quickMenu: true, + }, + { + text: { en: "useGate" }, + link: "/api/effector-vue/useGate", + quickMenu: true, + }, + ], + }, + { + text: { en: "Hooks" }, + items: [ + { + text: { en: "useUnit" }, + link: "/api/effector-vue/useUnit", + quickMenu: true, + }, + { + text: { en: "useStore" }, + link: "/api/effector-vue/useStore", + }, + { + text: { en: "useStoreMap" }, + link: "/api/effector-vue/useStoreMap", + quickMenu: true, + }, + { + text: { en: "useVModel" }, + link: "/api/effector-vue/useVModel", + quickMenu: true, + }, + ], + }, + { + text: { en: "Scoped API" }, + items: [ + { + text: { en: "useEvent" }, + link: "/api/effector-vue/useEvent", + }, + { + text: { en: "VueSSRPlugin" }, + link: "/api/effector-vue/VueSSRPlugin", + }, + ], + }, + { + text: { en: "Import map" }, + items: [ + { + text: { en: "effector-vue/composition" }, + link: "/api/effector-vue/module/composition", + }, + { + text: { en: "effector-vue/ssr" }, + link: "/api/effector-vue/module/ssr", + }, + ], + }, +]; + +const effector = [ + { + text: { en: "Unit Types", ru: "Юниты", uz: "Yunitlar" }, + items: [ + { + text: { en: "Event" }, + link: "/api/effector/Event", + }, + { + text: { en: "Store" }, + link: "/api/effector/Store", + }, + { + text: { en: "Effect" }, + link: "/api/effector/Effect", + }, + { + text: { en: "Domain" }, + link: "/api/effector/Domain", + }, + { + text: { en: "Scope" }, + link: "/api/effector/Scope", + }, + ], + }, + { + text: { en: "Creators", ru: "Создатели" }, + items: [ + { + text: { en: "createEvent" }, + link: "/api/effector/createEvent", + quickMenu: true, + }, + { + text: { en: "createStore" }, + link: "/api/effector/createStore", + quickMenu: true, + }, + { + text: { en: "createEffect" }, + link: "/api/effector/createEffect", + quickMenu: true, + }, + { + text: { en: "createDomain" }, + link: "/api/effector/createDomain", + }, + { + text: { en: "attach" }, + link: "/api/effector/attach", + quickMenu: true, + }, + { + text: { en: "merge" }, + link: "/api/effector/merge", + quickMenu: true, + }, + ], + }, + { + text: { en: "Methods", ru: "Методы", uz: "Usullar" }, + items: [ + { + text: { en: "sample" }, + link: "/api/effector/sample", + quickMenu: true, + }, + { + text: { en: "combine" }, + link: "/api/effector/combine", + quickMenu: true, + }, + { + text: { en: "split" }, + link: "/api/effector/split", + quickMenu: true, + }, + { + text: { en: "createApi" }, + link: "/api/effector/createApi", + quickMenu: true, + }, + { + text: { en: "restore" }, + link: "/api/effector/restore", + quickMenu: true, + }, + { + text: { en: "forward" }, + link: "/api/effector/forward", + }, + { + text: { en: "guard" }, + link: "/api/effector/guard", + }, + ], + }, + { + text: { en: "Fork API" }, + collapsed: true, + items: [ + { + text: { en: "fork" }, + link: "/api/effector/fork", + quickMenu: true, + }, + { + text: { en: "serialize" }, + link: "/api/effector/serialize", + quickMenu: true, + }, + { + text: { en: "allSettled" }, + link: "/api/effector/allSettled", + quickMenu: true, + }, + { + text: { en: "scopeBind" }, + link: "/api/effector/scopeBind", + quickMenu: true, + }, + { + text: { en: "hydrate" }, + link: "/api/effector/hydrate", + }, + ], + }, + { + text: { en: "Utilities", ru: "Служебные функции", uz: "Utility funktsiyalari" }, + collapsed: true, + items: [ + { + text: { en: "is" }, + link: "/api/effector/is", + }, + { + text: { en: "fromObservable" }, + link: "/api/effector/fromObservable", + }, + ], + }, + { + text: { en: "Low-level API" }, + collapsed: true, + items: [ + { + text: { en: "createWatch" }, + link: "/api/effector/createWatch", + }, + { + text: { en: "clearNode" }, + link: "/api/effector/clearNode", + }, + { + text: { en: "withRegion" }, + link: "/api/effector/withRegion", + }, + { + text: { en: "launch" }, + link: "/api/effector/launch", + }, + { + text: { en: "inspect" }, + link: "/api/effector/inspect", + }, + ], + }, + { + text: { en: "Import map" }, + items: [ + { + text: { en: "effector/compat" }, + link: "/api/effector/module/сompat", + }, + { + text: { en: "effector/inspect" }, + link: "/api/effector/module/inspect", + }, + { + text: { en: "effector/babel-plugin" }, + link: "/api/effector/module/babel-plugin", + }, + ], + }, + { + text: { en: "Compiler Plugins" }, + items: [ + { + text: { en: "Babel plugin" }, + link: "/api/effector/babel-plugin", + }, + { + text: { en: "SWC plugin" }, + link: "https://github.com/effector/swc-plugin", + }, + ], + }, +]; + +const api = [ + { + text: { en: "Packages", ru: "Пакеты", uz: "Paketlar" }, + items: [ + { text: { en: "effector" }, link: "/api/effector" }, + { text: { en: "effector-react" }, link: "/api/effector-react" }, + { text: { en: "effector-solid" }, link: "/api/effector-solid" }, + { text: { en: "effector-vue" }, link: "/api/effector-vue" }, + { text: { en: "@effector/next" }, link: "https://github.com/effector/next" }, + ], + }, +]; + +interface QuickMenuItem { + link: string; + groups: LSidebarItem[][]; +} + +export const QUICK_MENU: Record<string, QuickMenuItem> = { + effector: { + link: "/api/effector", + groups: navigationToQuickMenu(effector), + }, + "effector-react": { + link: "/api/effector-react", + groups: navigationToQuickMenu(effectorReact), + }, + "effector-solid": { + link: "/api/effector-solid", + groups: navigationToQuickMenu(effectorSolid), + }, + "effector-vue": { + link: "/api/effector-vue", + groups: navigationToQuickMenu(effectorVue), + }, +}; + +// Be careful: order of the items is important. +// Sidebar searches for the first matches. +export const SIDEBARS: LSidebar = { + "/api/effector-react": effectorReact, + "/api/effector-solid": effectorSolid, + "/api/effector-vue": effectorVue, + "/api/effector": effector, + "/api": api, + "/recipes": recipes, + "/": defaultSidebar, +}; +const sidebarEntries = Object.entries(SIDEBARS); + +export const DOCS_VERSIONS = [ + { text: { en: "v23.x (actual)", ru: "v23.x (актуальная)", uz: "v23.x (dolzarb)" }, link: "/" }, + { text: { en: "v22.8.8" }, link: "https://v22.effector.dev" }, + { text: { en: "v21.8.12" }, link: "https://v21.effector.dev" }, + { text: { en: "v20.17.2" }, link: "https://v20.effector.dev" }, +]; + +type SocialIcon = "github" | "twitter" | "discord" | "youtube"; +export const SOCIAL_LINKS: { text: LText; icon: SocialIcon; link: string }[] = [ + { text: { en: "GitHub" }, icon: "github", link: LINKS.github }, + { text: { en: "Twitter" }, icon: "twitter", link: LINKS.twitter }, + { text: { en: "Discord" }, icon: "discord", link: LINKS.discord }, +]; + +export const DESKTOP_NAVIGATION: LSidebarItem[] = [ + { text: { en: "Learn", ru: "Изучение", uz: "O'rganish" }, link: "/introduction/installation" }, + { text: { en: "API" }, link: "/api", features: ["API"] }, + { text: { en: "Recipes", ru: "Рецепты", uz: "Retseptlar" }, link: "/recipes" }, + { text: { en: "Blog", ru: "Блог", uz: "Blog" }, link: LINKS.blog }, + { text: { en: "Playground", ru: "Песочница", uz: "Playground" }, link: LINKS.repl }, + { text: { en: "Changelog", ru: "Изменения", uz: "O'zgarishlar" }, link: LINKS.changelog }, +]; + +export const MOBILE_NAVIGATION = createMobileNavigation([ + { + text: { en: "Documentation", ru: "Документация", uz: "Hujjat" }, + items: defaultSidebar, + }, + { + text: { en: "API" }, + link: "/api", + items: [ + { text: { en: "effector" }, link: "/api/effector", items: effector }, + { text: { en: "effector-react" }, link: "/api/effector-react", items: effectorReact }, + { text: { en: "effector-solid" }, link: "/api/effector-solid", items: effectorSolid }, + { text: { en: "effector-vue" }, link: "/api/effector-vue", items: effectorVue }, + ], + }, + { + text: { en: "Recipes", ru: "Рецепты", uz: "Retseptlar" }, + link: "/recipes", + items: recipes, + }, + { text: { en: "Blog", ru: "Блог", uz: "Blog" }, link: LINKS.blog }, + { text: { en: "Playground", ru: "Песочница", uz: "Playground" }, link: LINKS.repl }, + { text: { en: "Changelog", ru: "Изменения", uz: "O'zgarishlar" }, link: LINKS.changelog }, +] satisfies LMobileNavItem[]); + +export const FOOTER_LINKS = [ + { + text: { en: "Docs", ru: "Документация", uz: "Hujjatlar" }, + items: [ + { + text: { en: "Getting started", ru: "С чего начать", uz: "Boshlash" }, + link: "/introduction/installation", + }, + { text: { en: "API Reference", uz: "API Havolasi" }, link: "/api" }, + { + text: { en: "Writings tests", ru: "Тестирование кода", uz: "Kodni testlash" }, + link: "/guides/testing", + }, + { + text: { en: "Release policy", ru: "Политика релизов", uz: "Relizlar siyosati" }, + link: "/core-principles/releases", + }, + { text: { en: "What's new", ru: "Что нового", uz: "Yangiliklar" }, link: LINKS.changelog }, + { text: { en: "Blog", ru: "Блог", uz: "Blog" }, link: LINKS.blog }, + ], + }, + { + text: { en: "Community", ru: "Сообщество", uz: "Jamiyat" }, + items: [ + { text: { en: "Official", ru: "Официальное", uz: "Rasmiy" }, link: LINKS.community }, + { text: { en: "Discord" }, link: LINKS.discord }, + { text: { en: "dev.to" }, link: LINKS.devTo }, + { text: { en: "Twitter" }, link: LINKS.twitter }, + { text: { en: "Telegram 🇷🇺" }, link: LINKS.telegramRU }, + { text: { en: "Telegram 🇺🇸" }, link: LINKS.telegramEN }, + ], + }, + { + text: { en: "More", ru: "Больше", uz: "Ko'proq" }, + items: [ + { text: { en: "Github" }, link: LINKS.github }, + { text: { en: "Reddit" }, link: LINKS.reddit }, + { text: { en: "Youtube" }, link: LINKS.youtube }, + { text: { en: "Lines of Code" }, link: LINKS.linesOfCode }, + { text: { en: "ChatGPT" }, link: "https://chat.openai.com/g/g-thabaCJlt-effector-assistant" }, + { text: { en: "Made by Astro" }, link: "https://astro.build" }, + ], + }, +] satisfies FooterGroup[]; + +type FooterGroup = { + text: LText; + items: FooterItem[]; +}; + +type FooterItem = { + text: LText; + link: string; +}; + +export type LMobileNavItem = LMobileNavLink | LMobileNavGroup | LMobileNavLinkGroup; + +type LMobileNavLink = { + text: LText; + link: string; + id?: string; + active?: boolean; +}; + +export function isNavLink(item: LMobileNavItem): item is LMobileNavLink { + return "link" in item && !("items" in item); +} + +type LMobileNavGroup = { + text: LText; + items: LMobileNavItem[]; + id?: string; + active?: boolean; +}; + +export function isNavGroup(item: LMobileNavItem): item is LMobileNavGroup { + return !("link" in item) && "items" in item; +} + +type LMobileNavLinkGroup = { + text: LText; + link: string; + items: LMobileNavItem[]; + id?: string; + active?: boolean; +}; + +export function isNavLinkGroup(item: LMobileNavItem): item is LMobileNavLinkGroup { + return "link" in item && "items" in item; +} + +interface LSidebar { + [path: string]: LSidebarGroup[]; +} + +interface LSidebarGroup { + text: LText; + items: LSidebarItem[]; + collapsed?: boolean; +} + +export type NavigationFeatures = "API"; + +type LSidebarItem = { + text: LText; + link: string; + quickMenu?: boolean; + features?: NavigationFeatures[]; +}; + +export function getSidebarForSlug(slug: string): LSidebarGroup[] { + const path = slug.startsWith("/") ? slug : `/${slug}`; + return sidebarEntries.find(([prefix]) => path.startsWith(prefix))?.[1] ?? defaultSidebar; +} + +export async function getLocalizedSidebar(slug: string, lang: string) { + const sidebar = getSidebarForSlug(slug); + const slugs = await getSlugs(); + + return sidebar.map((group) => { + const groupTitle = getTextLocalized(group, lang); + return { + title: groupTitle, + collapsed: group.collapsed, + items: group.items.map((item) => { + const itemTitle = getTextLocalized(item, lang); + + if (isRemoteUrl(item.link)) { + return { + title: itemTitle, + link: item.link, + }; + } + + const link = createLink(item, lang); + + // Translated page exists + if (slugs.has(link.toLowerCase())) { + return { + title: itemTitle, + link, + }; + } + + // If original page exists + const originalLink = createLink(item, SITE.defaultLanguage); + if (slugs.has(originalLink.toLowerCase())) { + return { + title: `${itemTitle} (${SITE.defaultLanguage.toUpperCase()})`, + link, + }; + } + + // If no original page exists, may be link is wrong? + return { + title: `${itemTitle} (404)`, + link: item.link, + }; + }), + }; + }); +} + +function getSlugs() { + return getCollection("docs").then((docs) => new Set(docs.map((doc) => `/${doc.slug}`))); +} + +function isRemoteUrl(link: string) { + return link.startsWith("https://") || link.startsWith("http://"); +} + +function createMobileNavigation(nav: LMobileNavItem[]) { + return nav.map((item): LMobileNavItem => { + if ("items" in item) { + return { + ...item, + id: nanoid(6), + items: createMobileNavigation(item.items), + active: false, + }; + } + return { + ...item, + id: nanoid(6), + active: false, + }; + }); +} + +export function markActiveNavigation(link: string, navigation: LMobileNavItem[]) { + // We want to mutate the array and items inside. + // Immutable will be awful for dev perf (on each reload immutable recreate deep array) + const nav = structuredClone(navigation); + + function findActive(group: LMobileNavItem) { + // If user on the page that exactly matches link + // When user on the `effector-react` API page we want only highlight the group-link, not all the childs + if (isNavLink(group) || isNavLinkGroup(group)) { + if (link === group.link) { + group.active = true; + return true; + } + } + + // If we found an active element, early return + if (isNavGroup(group) || isNavLinkGroup(group)) { + for (const item of group.items) { + item.active = findActive(item); + if (item.active) { + return true; + } + } + } + + return false; + } + + for (const item of nav) { + if (findActive(item)) { + item.active = true; + break; + } + } + + return nav; +} + +function navigationToQuickMenu(nav: LSidebarGroup[]) { + return nav + .map((element) => element.items.filter((item) => item.quickMenu)) + .filter((items) => items.length > 0); +} diff --git a/src/pages/[...slug].astro b/src/pages/[...slug].astro new file mode 100644 index 0000000..9a1bede --- /dev/null +++ b/src/pages/[...slug].astro @@ -0,0 +1,62 @@ +--- +import { type CollectionEntry, getCollection } from "astro:content"; +import type { InferGetStaticPropsType, InferGetStaticParamsType } from "astro"; +import MainLayout from "src/layouts/MainLayout.astro"; +import { getPathParamsFromId } from "src/languages"; + +interface Path { + params: { slug: string }; + props: { redirectTo: CollectionEntry<"docs"> }; +} + +export async function getStaticPaths() { + const alreadyUsedPaths = new Set<string>(); + const paths: Path[] = []; + const pagesWithRedirect = await getCollection("docs", (page) => page.data.redirectFrom); + + for (const page of pagesWithRedirect) { + for (const slug of page.data.redirectFrom!) { + const actualPath = slug.startsWith("/") ? slug.slice(1) : slug; + if (alreadyUsedPaths.has(actualPath)) { + throw new Error( + `'redirectFrom' path "${actualPath}" already claimed. Cannot use for "${page.id}"`, + ); + } + + paths.push({ + params: { slug: actualPath }, + props: { redirectTo: page }, + }); + + alreadyUsedPaths.add(actualPath); + } + } + + return paths; +} + +type Props = InferGetStaticPropsType<typeof getStaticPaths>; +type Params = InferGetStaticParamsType<typeof getStaticPaths>; +const { redirectTo } = Astro.props; +const { slug } = Astro.params as Params; + +// It is important to use .id instead of .slug, because .slug loses case from url +// we need /api/effector/Event instead of /api/effector/event +const pageParams = getPathParamsFromId(redirectTo.id.replace(/\.(md|mdx)$/, "")); +const url = `/${pageParams.lang}/${pageParams.slug}`; +--- + +<MainLayout + documentId={slug} + headings={[]} + translations={[]} + breadcrumbs={[]} + redirectTo={url} + pagefindWeight={100} + {...redirectTo.data} +> + <div class="admonition admonition-info"> + Redirecting to: {redirectTo.data.title}. + <a href={url}>Click here if not redirected automatically.</a> + </div> +</MainLayout> diff --git a/src/pages/[lang]/[...slug].astro b/src/pages/[lang]/[...slug].astro new file mode 100644 index 0000000..005845f --- /dev/null +++ b/src/pages/[lang]/[...slug].astro @@ -0,0 +1,68 @@ +--- +import type { CollectionEntry } from "astro:content"; +import type { InferGetStaticPropsType } from "astro"; + +import { KNOWN_LANGUAGE_CODES } from "../../languages"; +import { getBreadcrumbs, translatedDocsIndex } from "../../docs"; +import { SITE } from "../../consts"; + +import MainLayout from "../../layouts/MainLayout.astro"; +import NotTranslatedYet from "../../components/NotTranslatedYet.astro"; +import TranslationDisclaimer from "../../components/TranslationDisclaimer.astro"; + +export async function getStaticPaths() { + const { sourceSlugs, docs } = translatedDocsIndex; + const paths: { + params: { lang: string; slug: string }; + props: { post: CollectionEntry<"docs"> | null }; + }[] = []; + + // Create path for each slug for each language + for (const slug of sourceSlugs.values()) { + for (const lang of KNOWN_LANGUAGE_CODES) { + paths.push({ + params: { lang, slug }, + props: { post: docs[`${lang}/${slug}`] ?? null }, + }); + } + } + + return paths; +} + +export type Props = InferGetStaticPropsType<typeof getStaticPaths>; +const { slug, lang } = Astro.params; + +const { docs } = translatedDocsIndex; +const breadcrumbs = getBreadcrumbs({ docs, path: Astro.url.pathname }); + +const { post } = Astro.props; +const defaultLanguagePost = docs[`${SITE.defaultLanguage}/${slug}`]; + +const translations: { lang: string; slug: string }[] = []; + +// Create link for each translated page +KNOWN_LANGUAGE_CODES.forEach((langCode) => { + if (langCode !== lang && docs[`${langCode}/${slug}`]) { + translations.push({ lang: langCode, slug: slug! }); + } +}); + +const translationExists = Boolean(post); + +const { Content, headings } = post ? await post.render() : await defaultLanguagePost.render(); +const postData = (post ?? defaultLanguagePost).data; +--- + +<MainLayout + documentId={post?.id ?? defaultLanguagePost.id} + headings={headings} + {...postData} + translations={translations} + breadcrumbs={breadcrumbs} + indexing={translationExists} +> + {!post ? <NotTranslatedYet lang={lang!} /> : null} + <Content /> + {lang !== SITE.defaultLanguage ? <TranslationDisclaimer lang={lang!} /> : null} +</MainLayout> diff --git a/src/pages/en.astro b/src/pages/en.astro new file mode 100644 index 0000000..ccc034d --- /dev/null +++ b/src/pages/en.astro @@ -0,0 +1 @@ +<meta http-equiv="refresh" content={`0;URL=/`} /> diff --git a/src/pages/index.astro b/src/pages/index.astro new file mode 100644 index 0000000..c3138b9 --- /dev/null +++ b/src/pages/index.astro @@ -0,0 +1,81 @@ +--- +import IconChevron from "@icons/Chevron.astro"; +import Hero from "@components/Landing/Hero.astro"; +import FeaturesGrid from "@components/Landing/FeaturesGrid.astro"; +import Feature from "@components/Landing/Feature.astro"; +import Stats from "@components/Landing/Stats.astro"; +import Companies from "@components/Landing/Companies.astro"; + +import Landing from "../layouts/Landing.astro"; +import { SITE } from "../consts"; + +const features = [ + { + emoji: "☄️", + kind: "major", + title: "Effector Spacewatch", + description: + "Experience the power of effector v23.0, featuring refined typings, universal hooks support.", + }, + { + emoji: "🛡️", + title: "Type safe", + description: + "Excellent TypeScript support out of the box. With the type testing in the repository.", + }, + { + emoji: "⚙️", + title: "Framework agnostic", + description: "Works with any UI or server framework. Tested with React, Solid, Vue.", + }, + { + emoji: "⚡️", + title: "Performant", + description: + "Initialization of the whole logic at the app start provides a boost at the runtime.", + }, + { + emoji: "📦", + title: "10Kb", + description: + "Effector supports tree-shaking and provides maximum opportunities with the small size.", + }, + { + emoji: "🫂", + title: "Just JavaScript", + description: + "There is no Proxies, classes and some magic inside. Just JavaScript code that works.", + }, + { + emoji: "🧑💻", + kind: "minor", + title: "Developer-friendly", + description: + "Simple API surface with helpful community. Easy to write tests. Easy to setup server rendering.", + }, +] as { emoji: string; kind?: "minor" | "major"; title: string; description: string }[]; +--- + +<Landing title="Welcome" lang={SITE.defaultLanguage} dir="ltr" description={SITE.description}> + <Hero subtitle="Write business logic with ease"> + Meet the new standard for modern TypeScript development. + <br /> + Type safe, reactive, framework agnostic. + + <a slot="links" class="primary" href="/en/introduction/installation"> + <span>Getting started</span> + <IconChevron /> + </a> + </Hero> + <FeaturesGrid> + { + features.map((feat) => ( + <Feature title={feat.title} emoji={feat.emoji} kind={feat.kind}> + {feat.description} + </Feature> + )) + } + </FeaturesGrid> + <Stats /> + <Companies /> +</Landing> diff --git a/src/pages/ru.astro b/src/pages/ru.astro new file mode 100644 index 0000000..2ef593d --- /dev/null +++ b/src/pages/ru.astro @@ -0,0 +1,79 @@ +--- +import IconChevron from "@icons/Chevron.astro"; +import Hero from "@components/Landing/Hero.astro"; +import FeaturesGrid from "@components/Landing/FeaturesGrid.astro"; +import Feature from "@components/Landing/Feature.astro"; +import Stats from "@components/Landing/Stats.astro"; +import Companies from "@components/Landing/Companies.astro"; + +import Landing from "../layouts/Landing.astro"; +import { SITE } from "../consts"; + +const features = [ + { + emoji: "☄️", + kind: "major", + title: "Effector Spacewatch", + description: + "Оцените мощь effector v23.0, отличающегося улучшенной типизацией, поддержкой универсальных хуков.", + }, + { + emoji: "🛡️", + title: "Типобезопасен", + description: "Отличная поддержка TypeScript из коробки. С тестированием типов в репозитории.", + }, + { + emoji: "⚙️", + title: "Framework agnostic", + description: + "Работает с любым UI или серверным фреймворком. Протестировано с React, Solid, Vue.", + }, + { + emoji: "⚡️", + title: "Производителен", + description: "Инициализация всей логики при запуске обеспечивает быструю работу приложения.", + }, + { + emoji: "📦", + title: "10Kb", + description: "Поддерживает tree-shaking и предлагает максимум возможностей в небольшом пакете.", + }, + { + emoji: "🫂", + title: "Просто JavaScript", + description: + "Здесь нет Proxy, классов и какой-то магии. Просто JavaScript-код, который работает.", + }, + { + emoji: "🧑💻", + kind: "minor", + title: "Дружелюбный", + description: + "Дружелюбное сообщество всегда поможет найти ответы. Легко писать тесты. Легко поднимать серверный рендеринг", + }, +] as { emoji: string; kind?: "minor" | "major"; title: string; description: string }[]; +--- + +<Landing lang="ru" title="Приветствуем" dir="ltr" description={SITE.description}> + <Hero subtitle="Write business logic with ease"> + Познакомьтесь с новым стандартом для современной разработки на TypeScript. + <br /> + Безопасный для типов, реактивный, не зависящий от фреймворка. + + <a slot="links" class="primary" href="/ru/introduction/installation"> + <span>Начать изучение</span> + <IconChevron /> + </a> + </Hero> + <FeaturesGrid> + { + features.map((feat) => ( + <Feature title={feat.title} emoji={feat.emoji} kind={feat.kind}> + {feat.description} + </Feature> + )) + } + </FeaturesGrid> + <Stats /> + <Companies /> +</Landing> diff --git a/src/pages/uz.astro b/src/pages/uz.astro new file mode 100644 index 0000000..bdb8436 --- /dev/null +++ b/src/pages/uz.astro @@ -0,0 +1,80 @@ +--- +import IconChevron from "@icons/Chevron.astro"; +import Hero from "@components/Landing/Hero.astro"; +import FeaturesGrid from "@components/Landing/FeaturesGrid.astro"; +import Feature from "@components/Landing/Feature.astro"; +import Stats from "@components/Landing/Stats.astro"; +import Companies from "@components/Landing/Companies.astro"; + +import Landing from "../layouts/Landing.astro"; +import { SITE } from "../consts"; + +const features = [ + { + emoji: "☄️", + kind: "major", + title: "Effector Spacewatch", + description: + "`Effector`ning v23.0 kuchidan bahramand bo'ling, yaxshilangan tipizatsiyasi va universal xuklar qollanilishi bilan.", + }, + { + emoji: "🛡️", + title: "Xavfsiz tiplar", + description: + "Typescriptni qutisidan ajoyib qollanilishi. Repezitoriyda tiplar testlanishi bilan.", + }, + { + emoji: "⚙️", + title: "Framework agnostic", + description: + "Har qanday UI yoki server freymvorklari bilan ishlay olishi. React, Solid, Vue bilan testlangan.", + }, + { + emoji: "⚡️", + title: "Samarali", + description: + "Ishga tushganda barcha mantiqiy initsializatsiya ishga tushirishi dasturni tez ishlashiga yordam beradi.", + }, + { + emoji: "📦", + title: "10Kb", + description: + "Tree-sharking ni qollaydigan kichik hajimdagi paket maksimal imkoniyatlarni taqdim etadi.", + }, + { + emoji: "🫂", + title: "Oddiy JavaScript", + description: "Bu yerda Proxy, klasslar yoki sehirlar yoq. JavaScript da ishlidigan oddiy kod.", + }, + { + emoji: "🧑💻", + kind: "minor", + title: "Do'stona jamiyat", + description: + "Do'stona jamiyat har doim javob berishga yordam beradi. Testlarni yozish oson. Server renderini osongina oshiring", + }, +] as { emoji: string; kind?: "minor" | "major"; title: string; description: string }[]; +--- + +<Landing lang="uz" title="Ustunligi" dir="ltr" description={SITE.description}> + <Hero subtitle="Biznes mantiqni oson yozing"> + Typescript yordamida yangi standartlarda zamonaviy dasturlashni boshlang. + <br /> + Freymvorklardan mustaqil, reaktiv va xavfsiz + <a slot="links" class="primary" href="/uz/introduction/installation"> + <span>O`rganishni boshlash</span> + <IconChevron /> + </a> + </Hero> + <FeaturesGrid> + { + features.map((feat) => ( + <Feature title={feat.title} emoji={feat.emoji} kind={feat.kind}> + {feat.description} + </Feature> + )) + } + </FeaturesGrid> + <Stats /> + <Companies /> +</Landing> diff --git a/src/styles/index.css b/src/styles/index.css new file mode 100644 index 0000000..38d17ea --- /dev/null +++ b/src/styles/index.css @@ -0,0 +1,577 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; +@tailwind variants; + +@font-face { + font-style: normal; + font-weight: 400; + src: + local("Lexend Deca Regular"), + local("Lexend Deca"), + url("/fonts/LexendDeca-Regular.woff2") format("woff2"), + url("/fonts/LexendDeca-Regular.ttf") format("ttf"); + font-family: "Lexend Deca"; + font-display: swap; +} + +@font-face { + font-style: normal; + font-weight: 300; + src: + local("Lexend Deca Light"), + local("Lexend Deca"), + url("/fonts/LexendDeca-Light.ttf") format("ttf"); + font-family: "Lexend Deca"; + font-display: swap; +} + +* { + box-sizing: border-box; + margin: 0; +} + +/* Global focus outline reset */ +*:focus:not(:focus-visible) { + outline: none; +} + +:root { + --user-font-scale: 1rem - 16px; +} + +body { + display: flex; + flex-direction: column; + max-width: 100vw; + min-height: 100vh; + font-size: 1rem; + font-size: clamp(0.9rem, 0.75rem + 0.375vw + var(--user-font-scale), 1rem); + line-height: 1.5; + font-family: var(--font-body); +} + +nav ul { + padding: 0; + list-style: none; +} + +.content > section > * + * { + margin-top: 1.25rem; +} + +.content > section > :first-child { + margin-top: 0; +} + +/* Typography */ +h1, +h2, +h3, +h4, +h5, +h6 { + position: relative; + outline: none; + font-weight: 600; + line-height: 1; + font-family: var(--font-mono); +} + +.content section h1 { + border-top: 1px solid var(--theme-divider); + padding-top: 3rem; + font-size: 2.5rem; + line-height: 1; + margin: 3rem 0 2rem; +} + +.content section h2 { + font-size: 2rem; + line-height: 1.2; + margin: 4rem 0 1rem; + letter-spacing: -0.02em; +} + +.content section h3 { + font-size: 1.5rem; + line-height: 1.2; + margin: 2.5rem 0 1rem; + letter-spacing: -0.02em; +} + +.content section h4 { + font-size: 1.3rem; + line-height: 1.2; + letter-spacing: -0.05em; +} + +.content section h5 { + font-size: 1.2rem; + line-height: 1.2; +} + +.content section :is(h4, h5, h6):not(:first-child) { + margin-top: 2rem; + + .href { + letter-spacing: 0.01em; + } +} + +.content section :is(h1, h2, h3, h4, h5, h6) > code { + font-size: 0.9em; +} + +.href { + display: inline-flex; + align-items: center; + margin-right: 0.5ch; + cursor: pointer; + opacity: 1; + color: var(--theme-divider-dark); + letter-spacing: -0.1em; +} + +@media (hover: hover) { + :where(h1, h2, h3, h4, h5):hover .href { + color: var(--theme-accent); + } +} + +@media (hover: none) { + :where(h1, h2, h3, h4, h5):active .href { + color: var(--theme-accent); + } +} + +.content section :where(h1, h2, h3, h4, h5) .href .icon::after { + content: "#"; +} + +@media (min-width: 512px) { + .content section h1 .href .icon::after { + content: "#"; + } + .content section h2 .href .icon::after { + content: "##"; + } + .content section h3 .href .icon::after { + content: "###"; + } + .content section h4 .href .icon::after { + content: "####"; + } + .content section h5 .href .icon::after { + content: "#####"; + } + .content section h6 .href .icon::after { + content: "######"; + } +} + +p { + line-height: 1.65em; +} + +/** + * Avoid 300ms click delay on touch devices that support the `touch-action` + * CSS property. + * + * In particular, unlike most other browsers, IE11+Edge on Windows 10 on + * touch devices and IE Mobile 10-11 DON'T remove the click delay when + * `<meta name="viewport" content="width=device-width">` is present. + * However, they DO support removing the click delay via + * `touch-action: manipulation`. + * + * See: + * - http://v4-alpha.getbootstrap.com/content/reboot/#click-delay-optimization-for-touch + * - http://caniuse.com/#feat=css-touch-action + * - http://patrickhlauke.github.io/touch/tests/results/#suppressing-300ms-delay + */ +a, +area, +button, +[role="button"], +input, +label, +select, +summary, +textarea { + touch-action: manipulation; +} + +.content ul { + line-height: 1.1em; +} + +p, +.content ul { + color: var(--theme-text-light); +} + +small, +.text_small { + font-size: 0.833rem; +} + +a { + align-items: center; + gap: 0.5rem; + color: var(--theme-text-accent); + font-weight: 400; + text-underline-offset: 0.08em; +} + +a:hover { + text-decoration: none; +} + +.content ul { + list-style: disc; + line-height: 2; +} + +article > section nav :is(ul, ol) > * + * { + margin-top: inherit; +} + +article > section li > :is(p, pre, blockquote):not(:first-child) { + margin-top: 1rem; +} + +article > section :is(ul, ol) { + padding-left: 1em; +} + +article > section nav :is(ul, ol) { + padding-left: inherit; +} + +article > section nav { + margin-top: 1rem; + margin-bottom: 2rem; +} + +article > section ::marker { + color: var(--theme-text-light); + font-weight: bold; +} + +article > section iframe { + aspect-ratio: 16 / 9; + width: 100%; + height: auto; +} + +article > section ol { + list-style-type: decimal; +} + +article > section ol ::marker { + font-weight: 500; +} + +article > section ol li { + line-height: 2; +} + +body a > code { + color: var(--theme-text-accent); + text-underline-offset: var(--padding-block); + background-color: hsla(var(--theme-accent-color), 0.1); +} + +a:focus { + outline: 2px solid currentColor; + outline-offset: 0.25em; + text-decoration: underline; +} + +strong { + color: inherit; + font-weight: 600; +} + +/* Supporting Content */ + +:not(pre) > code { + --border-radius: 3px; + --padding-block: 0.2rem; + --padding-inline: 0.33rem; + margin: calc(var(--padding-block) * -1) 0; + border-radius: var(--border-radius); + background-color: var(--theme-code-inline-bg); + padding: var(--padding-block) var(--padding-inline); + color: inherit; + font-size: 0.95em; + + font-family: var(--font-mono); + word-break: break-word; +} + +pre.astro-code > code { + all: unset; +} + +pre > code { + font-size: 1em; +} + +table, +pre { + --padding-block: 1rem; + --padding-inline: 2rem; + position: relative; + margin-right: calc(var(--padding-inline) * -1); + margin-left: calc(var(--padding-inline) * -1); + padding: var(--padding-block) var(--padding-inline); + padding-right: calc(var(--padding-inline) * 2); + overflow-x: auto; + overflow-y: hidden; + font-size: 0.85em; + + line-height: 1.5; + font-family: var(--font-mono); +} + +table { + margin: 0; + border-collapse: collapse; + padding: var(--padding-block) 0; + width: 100%; +} + +/* Zebra striping */ +tr:nth-of-type(odd) { + background: var(--theme-bg-hover); +} +th { + background: var(--color-black); + color: var(--theme-color); + font-weight: bold; +} +td, +th { + padding: 6px; + text-align: left; +} + +pre { + background-color: var(--theme-code-bg); + color: var(--theme-code-text); +} + +blockquote code { + background-color: var(--theme-bg); +} + +@media (min-width: 37.75em) { + pre { + --padding-inline: 1.25rem; + margin-right: 0; + margin-left: 0; + border-radius: 8px; + } +} + +blockquote { + @apply my-8 rounded-md rounded-l-none border-l-4 px-5 py-4; + border-color: var(--theme-text-light); + background-color: var(--theme-bg-offset); + line-height: 1.7; +} + +blockquote p, +blockquote li { + color: var(--theme-text); +} + +img { + max-width: 100%; +} + +button { + display: flex; + display: flex; + align-items: center; + align-items: center; + justify-items: center; + gap: 0.25em; + gap: 0.25em; + border: 0; + border-radius: 99em; + background: var(--theme-bg); + background-color: var(--theme-bg); + padding: 0.33em 0.67em; + color: var(--theme-text); + font-size: 1rem; +} + +h2.heading { + margin-bottom: 0.5rem; + padding: 0.1rem 1rem; + font-weight: 700; + font-size: 1rem; + text-transform: uppercase; +} + +.header-link { + transition: + border-inline-start-color 100ms ease-out, + background-color 200ms ease-out; + border-left: 4px solid var(--theme-divider); + font-size: 0.9em; +} + +.header-link a { + display: inline-flex; + gap: 0.5em; + padding: 0.4rem 0; + width: 100%; + overflow: hidden; + color: inherit; + font: inherit; + line-height: 1.3; + unicode-bidi: plaintext; + text-decoration: none; + text-overflow: ellipsis; + white-space: nowrap; +} + +@media (min-width: 50em) { + .header-link a { + padding: 0.275rem 0; + } +} + +.header-link:hover, +.header-link:focus, +.header-link:focus-within { + border-inline-start-color: var(--theme-accent-secondary); +} + +.header-link:hover a, +.header-link a:focus { + color: var(--theme-text); + text-decoration: underline; +} +.header-link svg { + opacity: 0.6; +} +.header-link:hover svg { + opacity: 0.8; +} + +/* Add line and padding on the left side */ +.header-link { + padding-inline-start: 1rem; +} +.header-link.depth-3 { + padding-inline-start: 2rem; +} +.header-link.depth-4 { + padding-inline-start: 3rem; +} + +/* Screenreader Only Text */ +.sr-only { + clip: rect(0, 0, 0, 0); + position: absolute; + margin: -1px; + border-width: 0; + padding: 0; + width: 1px; + height: 1px; + overflow: hidden; + white-space: nowrap; +} + +.focus\:not-sr-only:focus, +.focus\:not-sr-only:focus-visible { + clip: auto; + position: static; + margin: 0; + padding: 0; + width: auto; + height: auto; + overflow: visible; + white-space: normal; +} + +:target { + scroll-margin: calc(var(--theme-sidebar-offset, 5rem) + 2rem) 0 2rem; +} + +/* Highlight TOC header link matching the current scroll position */ +.current-header-link { + /* Indicates the current heading for forced colors users in older browsers */ + outline: 1px solid transparent; + background-color: var(--theme-bg-accent); +} + +@media (forced-colors: active) { + .current-header-link { + border: 1px solid CanvasText; + } +} + +.current-header-link a { + color: var(--theme-text); +} + +.admonition { + @apply -mx-8 mb-2 box-border gap-2 p-4; + /* Strange behavior: tw adds `items-center` when `flex` is applied */ + display: flex; + flex-direction: column; + + --admonition-bg: gray; + --admonition-border: black; + --admonition-text: white; + border-left: 0.8rem solid var(--admonition-border); + background-color: var(--admonition-bg); + color: var(--admonition-text); +} + +@media (min-width: 37.75em) { + :root .admonition { + @apply mx-0 rounded-xl rounded-l-none; + } +} + +.admonition-title { + @apply font-medium uppercase; +} + +.admonition a { + text-decoration: underline; + color: var(--admonition-text); +} + +.admonition code { + background-color: var(--admonition-bg); + color: var(--admonition-text); +} + +.admonition-content p + p { + @apply mt-4; +} + +.admonition-tip { + --admonition-bg: var(--theme-admonition-tip-bg); + --admonition-border: var(--theme-admonition-tip-border); + --admonition-text: var(--theme-admonition-tip-text); +} + +.admonition-warning { + --admonition-bg: var(--theme-admonition-warning-bg); + --admonition-border: var(--theme-admonition-warning-border); + --admonition-text: var(--theme-admonition-warning-text); +} + +.admonition-info { + --admonition-bg: var(--theme-admonition-info-bg); + --admonition-border: var(--theme-admonition-info-border); + --admonition-text: var(--theme-admonition-info-text); +} diff --git a/src/styles/language.css b/src/styles/language.css new file mode 100644 index 0000000..92c6dac --- /dev/null +++ b/src/styles/language.css @@ -0,0 +1,102 @@ +code .token.keyword, +code .token.builtin { + color: var(--code-keyword); +} + +code .token.literal-property, +code .token.property { + color: var(--code-property); +} + +code .token.string, +code .token.attr-value { + color: var(--code-string); +} + +code .token.number { + color: var(--code-number); +} + +code .token.boolean, +code .token.constant { + color: var(--code-constant); +} + +code .token.function-variable, +code .token.function { + color: var(--code-function); +} + +code .token.operator, +code .token.punctuation { + color: var(--code-punctuation); +} + +code .token.tag { + color: var(--code-tag); +} + +code .token.class-name { + color: var(--code-class); +} + +code .token.inserted { + color: var(--code-function); +} + +code .token.deleted.prefix, +code .token.inserted.prefix { + user-select: none; +} + +code .token.deleted { + color: var(--code-class); +} + +code .token.attr-name { + color: var(--code-attr); +} + +code .token.comment { + color: var(--code-comment); +} + +pre[class*="language-"] { + background-color: var(--code-background); + color: var(--code-foreground); + @apply shadow-md; +} + +/* Modified https://github.com/uloco/theme-bluloco-light */ +:root { + --code-background: #f9f9f9; + --code-foreground: #383a42; + --code-comment: #a0a1a7; + --code-keyword: #0098dd; + --code-function: #23974a; + --code-property: #a05a48; + --code-string: #c5a332; + --code-number: #ce33c0; + --code-constant: #823ff1; + --code-tag: #275fe4; + --code-attr: #df631c; + --code-class: #d52753; + --code-punctuation: #7a82da; +} + +/* https://github.com/uloco/theme-bluloco-dark */ +.theme-dark:root { + --code-background: #282c34; + --code-foreground: #abb2bf; + --code-comment: #636d83; + --code-keyword: #10b1fe; + --code-function: #3fc56b; + --code-property: #ce9887; + --code-string: #f9c859; + --code-number: #ff78f8; + --code-constant: #9f7efe; + --code-tag: #3691ff; + --code-attr: #ff936a; + --code-class: #ff6480; + --code-punctuation: #7a82da; +} diff --git a/src/styles/theme.css b/src/styles/theme.css new file mode 100644 index 0000000..f1c364d --- /dev/null +++ b/src/styles/theme.css @@ -0,0 +1,226 @@ +:root { + --font-fallback: -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, + Apple Color Emoji, Segoe UI Emoji; + --font-body: system-ui, var(--font-fallback); + --font-mono: "JetBrains Mono", "IBM Plex Mono", Consolas, "Andale Mono WT", "Andale Mono", + "Lucida Console", "Lucida Sans Typewriter", "DejaVu Sans Mono", "Bitstream Vera Sans Mono", + "Liberation Mono", "Nimbus Mono L", Monaco, "Courier New", Courier, monospace; + + /* + * Variables with --color-base prefix define + * the hue, and saturation values to be used for + * hsla colors. + * + * ex: + * + * --color-base-{color}: {hue}, {saturation}; + * + */ + + --color-base-white: 0, 0%; + --color-base-black: 240, 100%; + --color-base-gray: 215, 14%; + --color-base-blue: 212, 100%; + --color-base-blue-dark: 212, 72%; + --color-base-green: 158, 79%; + --color-base-orange: 22, 100%; + --color-base-purple: 269, 79%; + --color-base-red: 351, 100%; + --color-base-yellow: 41, 100%; + --color-base-primary: 33, 100%; + --color-base-primary-light: 30, 87%; + + /* + * Color palettes are made using --color-base + * variables, along with a lightness value to + * define different variants. + * + */ + + --color-zink-5: 210, 20%, 98.04%; + --color-zinc-10: 240deg, 5%, 96%; + --color-zinc-40: 240deg, 5%, 65%; + --color-zinc-60: 215deg, 14%, 34%; + --color-zinc-70: 240deg, 5%, 26%; + --color-zinc-80: 240deg, 4%, 16%; + --color-zinc-90: 240deg, 6%, 10%; + + --color-stone-5: 60deg, 9%, 98%; + --color-stone-10: 60deg, 5%, 96%; + --color-stone-20: 20deg, 6%, 90%; + --color-stone-30: 24deg, 6%, 83%; + --color-stone-40: 24deg, 5%, 64%; + --color-stone-70: 30deg, 6%, 25%; + --color-stone-90: 24deg, 10%, 10%; + + --color-gray-5: var(--color-base-gray), 5%; + --color-gray-10: var(--color-base-gray), 10%; + --color-gray-20: var(--color-base-gray), 20%; + --color-gray-30: var(--color-base-gray), 30%; + --color-gray-40: var(--color-base-gray), 40%; + --color-gray-50: var(--color-base-gray), 50%; + --color-gray-60: var(--color-base-gray), 60%; + --color-gray-70: var(--color-base-gray), 70%; + --color-gray-80: var(--color-base-gray), 80%; + --color-gray-90: var(--color-base-gray), 90%; + --color-gray-95: var(--color-base-gray), 95%; + + --color-primary-20: var(--color-base-primary), 33%; + --color-primary-30: var(--color-base-primary), 37%; + --color-primary-40: var(--color-base-primary), 42%; + --color-primary-50: var(--color-base-primary), 50%; + --color-primary-60: var(--color-base-primary), 56%; + --color-primary-70: var(--color-base-primary), 61%; + --color-primary-80: var(--color-base-primary), 69%; + --color-primary-text: var(--color-white), 100%; + + --color-blue: var(--color-base-blue), 61%; + --color-blue-dark: var(--color-base-blue-dark), 39%; + --color-green: var(--color-base-green), 42%; + --color-orange: var(--color-base-orange), 50%; + --color-purple: var(--color-base-purple), 54%; + --color-red: var(--color-base-red), 54%; + --color-yellow: var(--color-base-yellow), 59%; +} + +:root { + --theme-accent-opacity: 0.15; + --theme-accent-color: var(--color-primary-50); + --theme-accent: hsl(var(--theme-accent-color)); + --theme-text-accent: hsl(var(--color-primary-50)); + + --theme-divider: hsla(var(--color-gray-90), 1); + --theme-divider-light: hsla(var(--color-gray-95), 0.6); + --theme-divider-dark: hsla(var(--color-gray-70), 0.6); + + --theme-backdrop-color: rgba(255, 255, 255, 0.3); + + --theme-text: hsla(var(--color-gray-10), 1); + --theme-text-dark: hsla(var(--color-base-black), 1); + --theme-text-light: hsla(var(--color-gray-30), 1); + --theme-text-lighter: hsla(var(--color-gray-80), 1); + + --theme-bg: hsla(var(--color-stone-10), 1); + --theme-bg-hover: hsla(var(--color-gray-95), 1); + --theme-bg-offset: hsla(var(--color-gray-90), 1); + --theme-bg-accent: hsla(var(--color-orange), var(--theme-accent-opacity)); + + --theme-card: hsla(0, 0%, 100%, 1); + --theme-card-hover: hsla(0, 0%, 98%, 1); + --theme-card-divider: hsla(0, 0%, 0%, 0.1); + + --theme-code-inline-bg: hsla(var(--color-gray-90), 1); + --theme-code-inline-text: var(--theme-text); + --theme-code-bg: hsla(var(--color-stone-40), 1); + --theme-code-text: hsla(var(--color-gray-95), 1); + + --theme-navbar-bg: rgba(255, 255, 255, 0.9); + --theme-navbar-height: 4rem; + + --theme-selection-color: hsla(var(--color-blue), 1); + --theme-selection-bg: hsla(var(--color-blue), var(--theme-accent-opacity)); + + --theme-admonition-tip-bg: hsla(142deg, 69%, 58%, 26%); + --theme-admonition-tip-border: hsla(142deg, 71%, 45%, 1); + --theme-admonition-tip-text: hsla(143deg, 64%, 18%, 1); + + --theme-admonition-info-bg: hsla(199deg, 89%, 48%, 20%); + --theme-admonition-info-border: hsla(199deg, 89%, 48%, 1); + --theme-admonition-info-text: hsla(201deg, 90%, 18%, 1); + + --theme-admonition-warning-bg: hsla(38deg, 92%, 50%, 23%); + --theme-admonition-warning-border: hsla(38deg, 92%, 50%, 1); + --theme-admonition-warning-text: hsla(23deg, 83%, 18%, 1); + + /* DocSearch [Algolia] */ + --docsearch-modal-background: var(--theme-bg); + --docsearch-searchbox-focus-background: var(--theme-divider); + --docsearch-footer-background: var(--theme-divider); + --docsearch-footer-shadow: none; + --docsearch-text-color: var(--theme-text); + --docsearch-hit-background: var(--theme-divider); + --docsearch-hit-shadow: none; + --docsearch-hit-color: var(--theme-text); + --docsearch-modal-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + + color-scheme: light; +} + +body { + background: var(--theme-bg); + color: var(--theme-text); +} + +:root.theme-dark { + --theme-accent-opacity: 0.15; + --theme-accent-color: var(--color-primary-50); + --theme-accent: hsla(var(--theme-accent-color), 1); + --theme-text-accent: hsla(var(--color-primary-40), 1); + + --theme-divider: hsla(var(--color-zinc-70), 1); + --theme-divider-light: hsla(var(--color-gray-30), 0.6); + --theme-divider-dark: hsla(var(--color-gray-40), 1); + + --theme-backdrop-color: rgba(0, 0, 0, 0.3); + + --theme-text: hsla(var(--color-gray-90), 1); + --theme-text-light: hsla(var(--color-gray-80), 1); + --theme-text-lighter: hsla(var(--color-gray-40), 1); + + --theme-bg: hsla(var(--color-zinc-80), 1); + --theme-bg-hover: hsla(var(--color-zinc-90), 1); + --theme-bg-offset: hsla(var(--color-zinc-70), 1); + --theme-bg-accent: hsla(var(--color-orange), var(--theme-accent-opacity)); + + --theme-card: hsla(var(--color-zinc-70), 1); + --theme-card-hover: hsla(var(--color-zinc-60), 1); + --theme-card-divider: hsla(0, 0%, 0%, 0.2); + + --theme-code-inline-bg: hsla(var(--color-zinc-70), 1); + --theme-code-inline-text: hsla(var(--color-zinc-10), 1); + --theme-code-bg: hsla(var(--color-stone-90), 1); + --theme-code-text: hsla(var(--color-stone-30), 1); + + --theme-selection-color: hsla(var(--color-base-white), 100%, 1); + --theme-selection-bg: hsla(var(--color-red), var(--theme-accent-opacity)); + + --theme-navbar-bg: hsla(var(--color-zinc-70), 0.8); + + --theme-admonition-tip-bg: hsl(143deg, 45%, 24%); + --theme-admonition-tip-border: hsla(142deg, 71%, 28%, 1); + --theme-admonition-tip-text: hsl(143deg, 10%, 95%); + + --theme-admonition-info-bg: hsl(199deg, 45%, 24%); + --theme-admonition-info-border: hsla(199deg, 89%, 28%, 1); + --theme-admonition-info-text: hsl(199deg, 10%, 95%); + + --theme-admonition-warning-bg: hsl(38deg, 45%, 24%); + --theme-admonition-warning-border: hsla(38deg, 92%, 28%, 1); + --theme-admonition-warning-text: hsl(38deg, 10%, 95%); + + /* DocSearch [Algolia] */ + --docsearch-modal-background: var(--theme-bg); + --docsearch-searchbox-focus-background: var(--theme-divider); + --docsearch-footer-background: var(--theme-divider); + --docsearch-footer-shadow: none; + --docsearch-logo-color: #3b82f6; + --docsearch-text-color: var(--theme-text); + --docsearch-key-gradient: linear-gradient(-225deg, #18181b, #71717a); + --docsearch-key-shadow: inset 0 -2px 0 0 #27272a, inset 0 0 1px 1px #71717a; + --docsearch-muted-color: #a1a1aa; + --docsearch-hit-background: var(--theme-divider); + --docsearch-hit-shadow: none; + --docsearch-hit-color: var(--theme-text); + --docsearch-modal-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + + color-scheme: dark; +} + +:root.theme-dark .DocSearch-Logo :where(.cls-1, .cls-2) { + fill: #3b82f6; +} + +::selection { + background-color: var(--theme-selection-bg); + color: var(--theme-selection-color); +} diff --git a/tailwind.config.cjs b/tailwind.config.cjs new file mode 100644 index 0000000..cfa2a65 --- /dev/null +++ b/tailwind.config.cjs @@ -0,0 +1,8 @@ +/** @type {import('tailwindcss').Config} */ +module.exports = { + content: ["./src/**/*.{astro,html,js,jsx,md,mdx,svelte,ts,tsx,vue}"], + theme: { + extend: {}, + }, + plugins: [require("@tailwindcss/typography")], +}; diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..465b936 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,13 @@ +{ + "extends": "astro/tsconfigs/strict", + "compilerOptions": { + "jsx": "preserve", + "skipLibCheck": true, + "baseUrl": ".", + "strictNullChecks": true, + "paths": { + "@components/*": ["src/components/*"], + "@icons/*": ["src/icons/*"] + } + } +}