├── .ci ├── .gitignore └── dead-links.rb ├── .eslintignore ├── .github ├── ISSUE_TEMPLATE │ ├── bug_report.md │ └── content_request.md ├── actions │ ├── dead-links │ │ └── action.yml │ ├── deploy_fw_artifacts │ │ └── action.yml │ └── deploy_repo │ │ └── action.yml ├── issue_template.md ├── pull_request_template.md └── workflows │ ├── child_repo.workflow.yml │ ├── dead_links.workflow.yml │ └── deploy_whole_doc.yml ├── .gitignore ├── .prettierrc ├── .repos └── repositories.json ├── .vscode └── launch.json ├── Dockerfile ├── LICENSE.md ├── README.md ├── package-lock.json ├── package.json ├── scaffolding ├── add_cpp_signature.rb ├── lib │ ├── copyCommand.js │ ├── generateCommand.js │ └── utils.js ├── scaffold └── templates │ ├── action.cpp.md │ ├── action.go.md │ ├── action.java.md │ ├── action.js.md │ └── usage-snippets │ ├── usage.cpp │ ├── usage.go │ ├── usage.java │ ├── usage.js │ └── usage.test.yml └── src ├── .vuepress ├── client.ts ├── components │ ├── AlgoliaTags.vue │ ├── Badge.vue │ ├── ClosedSourcesBanner.vue │ ├── CodeSnippet.vue │ ├── Cta.vue │ ├── CustomBadge.vue │ ├── DeprecatedBadge.vue │ ├── DeprecatedBanner.vue │ ├── GuidesLinks.vue │ ├── Home.vue │ ├── HomeV1.vue │ ├── HowToCategory.vue │ ├── HowToIndex.vue │ ├── JavaDeprecatedBanner.vue │ ├── MajorVersionDeprecation.vue │ ├── MajorVersionSelector.vue │ ├── MenuDropdown.vue │ ├── ModulesIndex.vue │ ├── PluginsIndex.vue │ ├── Redirect.vue │ ├── RedirectLink.vue │ ├── RedirectToFirstChild.vue │ ├── SDKIndex.vue │ ├── SDKSelector.vue │ └── SinceBadge.vue ├── config.ts ├── external-plugins.json ├── frontmatter-in-route-meta │ ├── index.ts │ └── plugin.ts ├── frontmatter-lint │ ├── append-fixes.ts │ ├── index.ts │ ├── plugin.ts │ └── types.ts ├── getVersionString.ts ├── helpers.ts ├── markdown │ ├── code-snippet.ts │ ├── index.ts │ └── plugin.ts ├── meta-tags-plugin │ ├── client.ts │ ├── index.ts │ └── plugin.ts ├── page-attributes │ ├── index.ts │ ├── plugin.ts │ └── types.ts ├── public │ ├── demo_aws_console.gif │ ├── favicon │ │ ├── apple-touch-icon-114x114.png │ │ ├── apple-touch-icon-120x120.png │ │ ├── apple-touch-icon-144x144.png │ │ ├── apple-touch-icon-152x152.png │ │ ├── apple-touch-icon-57x57.png │ │ ├── apple-touch-icon-60x60.png │ │ ├── apple-touch-icon-72x72.png │ │ ├── apple-touch-icon-76x76.png │ │ ├── favicon-128.png │ │ ├── favicon-16x16.png │ │ ├── favicon-196x196.png │ │ ├── favicon-32x32.png │ │ ├── favicon-96x96.png │ │ ├── favicon.ico │ │ ├── mstile-144x144.png │ │ ├── mstile-150x150.png │ │ ├── mstile-310x150.png │ │ ├── mstile-310x310.png │ │ └── mstile-70x70.png │ ├── geolocation │ │ ├── geoBoundingBox.png │ │ ├── geoDistance.png │ │ ├── geoDistanceRange.png │ │ └── geoPolygon.png │ ├── icons.svg │ ├── logo-57x57.png │ ├── logo-min.png │ ├── logos │ │ ├── android.png │ │ ├── android.svg │ │ ├── book.svg │ │ ├── brackets.svg │ │ ├── cluster.svg │ │ ├── computed.svg │ │ ├── cpp.png │ │ ├── cpp.svg │ │ ├── csharp.png │ │ ├── csharp.svg │ │ ├── dart.svg │ │ ├── device-manager.svg │ │ ├── discord.png │ │ ├── go.png │ │ ├── go.svg │ │ ├── hermes.svg │ │ ├── java.png │ │ ├── java.svg │ │ ├── javascript.png │ │ ├── javascript.svg │ │ ├── js.png │ │ ├── js.svg │ │ ├── keycloak.svg │ │ ├── logger.svg │ │ ├── logo-dashboard.svg │ │ ├── logo-data.svg │ │ ├── logo-database.svg │ │ ├── logo-discord.svg │ │ ├── logo-espressif.svg │ │ ├── logo-github.svg │ │ ├── logo-stack-overflow.svg │ │ ├── logo-warm-data.svg │ │ ├── logo-youtube.svg │ │ ├── lua.png │ │ ├── lua.svg │ │ ├── module-logger.svg │ │ ├── open-id.svg │ │ ├── paas-logo.svg │ │ ├── passport.svg │ │ ├── php.png │ │ ├── php.svg │ │ ├── plugin-cloudinary.svg │ │ ├── plugin-multi-tenancy.svg │ │ ├── plugin-prometheus.svg │ │ ├── plugin-s3.svg │ │ ├── plugin.svg │ │ ├── postgresql.svg │ │ ├── probe.svg │ │ ├── python.png │ │ ├── python.svg │ │ ├── rocket.svg │ │ ├── ruby.png │ │ ├── ruby.svg │ │ ├── rust.svg │ │ ├── scheduler.svg │ │ ├── search.svg │ │ ├── settings.svg │ │ ├── tools.svg │ │ ├── workflows.svg │ │ └── write-code.svg │ └── og-image.png ├── sections.json ├── sections.schema.json ├── theme │ ├── Footer.vue │ ├── Header.vue │ ├── Layout.vue │ ├── NotFound.vue │ ├── Sidebar.vue │ ├── TOC.vue │ ├── TopMenu.vue │ ├── TopMenuV1.vue │ ├── client.ts │ ├── index.ts │ ├── styles │ │ ├── _config.scss │ │ ├── base │ │ │ ├── _icons.scss │ │ │ ├── _reset.scss │ │ │ └── _typeset.scss │ │ ├── extensions │ │ │ ├── _admonition.scss │ │ │ ├── _alert.scss │ │ │ ├── _badge.scss │ │ │ ├── _codehilite.scss │ │ │ ├── _docsearch.scss │ │ │ ├── _external-links.scss │ │ │ ├── _footnotes.scss │ │ │ ├── _material-color.scss │ │ │ ├── _material-shadows.scss │ │ │ ├── _menuDropdown.scss │ │ │ ├── _permalinks.scss │ │ │ ├── _ribbon.scss │ │ │ ├── _sdk-selector.scss │ │ │ ├── _select2.scss │ │ │ ├── _tiles.scss │ │ │ ├── modularscale │ │ │ │ ├── _function.scss │ │ │ │ ├── _pow.scss │ │ │ │ ├── _respond.scss │ │ │ │ ├── _round-px.scss │ │ │ │ ├── _settings.scss │ │ │ │ ├── _sort.scss │ │ │ │ ├── _strip-units.scss │ │ │ │ ├── _sugar.scss │ │ │ │ ├── _target.scss │ │ │ │ └── _vars.scss │ │ │ └── pymdown │ │ │ │ ├── _arithmatex.scss │ │ │ │ ├── _critic.scss │ │ │ │ ├── _details.scss │ │ │ │ ├── _emoji.scss │ │ │ │ ├── _inlinehilite.scss │ │ │ │ └── _tasklist.scss │ │ ├── helpers │ │ │ ├── _break.scss │ │ │ └── _px2em.scss │ │ ├── layout │ │ │ ├── _base.scss │ │ │ ├── _content.scss │ │ │ ├── _footer.scss │ │ │ ├── _header.scss │ │ │ ├── _hero.scss │ │ │ ├── _icontable.scss │ │ │ ├── _nav.scss │ │ │ ├── _sidebar.scss │ │ │ ├── _source.scss │ │ │ ├── _tabs.scss │ │ │ ├── _topMenu.scss │ │ │ └── _versions.scss │ │ ├── libs │ │ │ ├── _copy-code.scss │ │ │ ├── _fontawesome.scss │ │ │ ├── _google-fonts.scss │ │ │ ├── _monokai.scss │ │ │ └── _select2.scss │ │ └── main.scss │ └── theme.ts └── util.ts ├── core └── index.md ├── how-to ├── index.md ├── v1.md └── v2.md ├── index.md ├── modules ├── index.md └── v2.md ├── official-plugins ├── index.md ├── v1.md └── v2.md ├── sdk ├── index.md ├── v1.md └── v2.md ├── v1.md └── v2.md /.ci/.gitignore: -------------------------------------------------------------------------------- 1 | data.json 2 | -------------------------------------------------------------------------------- /.eslintignore: -------------------------------------------------------------------------------- 1 | README.md 2 | *.yml 3 | -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Report wrong content or buggy UI 4 | title: '[bug] ' 5 | labels: bug 6 | assignees: '' 7 | --- 8 | 9 | 10 | 11 | ## Expected Behavior 12 | 13 | 14 | 15 | ## Current Behavior 16 | 17 | 18 | 19 | ## Possible Solution 20 | 21 | 22 | 23 | ## Steps to Reproduce 24 | 25 | 26 | 27 | 28 | 1. 2. 3. 4. 29 | 30 | ## Context (Environment) 31 | 32 | 33 | 34 | 35 | 36 | ## Screenshots (if appropriate) -------------------------------------------------------------------------------- /.github/ISSUE_TEMPLATE/content_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: New content request 3 | about: Report missing or incomplete content 4 | title: '[content-request] ' 5 | labels: enhancement 6 | assignees: '' 7 | --- 8 | 9 | **What were you trying to do?** 10 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 11 | 12 | **Where would you expect to find the documentation you were looking for?** 13 | Can be an existing or new section of this doc. 14 | 15 | **Did you find a workaround?** 16 | A clear and concise description of any solution or feature you've considered. 17 | 18 | **Additional context** 19 | Add any other context or screenshots about your request. -------------------------------------------------------------------------------- /.github/actions/dead-links/action.yml: -------------------------------------------------------------------------------- 1 | name: Dead Link Check 2 | description: Tests the existence of dead links in the documentation of a repo. 3 | 4 | inputs: 5 | repo_name: 6 | description: The name of the repository to deploy 7 | required: true 8 | repo_branch: 9 | description: The branch of the repo to deploy 10 | required: true 11 | repo_version: 12 | description: The version of the repo to deploy 13 | required: true 14 | 15 | runs: 16 | using: 'composite' 17 | steps: 18 | - name: Install deps 19 | run: npm i --production=false 20 | shell: bash 21 | - name: Install typhoeus 22 | run: sudo gem install typhoeus 23 | shell: bash 24 | - name: Checks kuzdoc version 25 | run: npx kuzdoc --version 26 | shell: bash 27 | - name: Installs the repo 28 | shell: bash 29 | run: npx kuzdoc install --repo=${{ inputs.repo_name }}-${{ inputs.repo_version }} --repoBranch=${{ inputs.repo_branch }} 30 | - name: Run dead links tests 31 | run: npx kuzdoc dead-links --repo=${{ inputs.repo_name }}-${{ inputs.repo_version }} 32 | shell: bash 33 | -------------------------------------------------------------------------------- /.github/actions/deploy_fw_artifacts/action.yml: -------------------------------------------------------------------------------- 1 | name: Deploy documentation artifacts 2 | description: Deploy documentation artifacts 3 | 4 | inputs: 5 | S3_BUCKET: 6 | description: S3 bucket name 7 | required: true 8 | CLOUDFRONT_ID: 9 | description: Cloudfront distribution ID 10 | required: true 11 | 12 | runs: 13 | using: "composite" 14 | steps: 15 | - name: Install dependencies 16 | run: npm i 17 | shell: bash 18 | - name: Build framework 19 | run: npm run build 20 | shell: bash 21 | - name: Upload to S3 22 | run: aws s3 sync src/.vuepress/dist ${{ inputs.S3_BUCKET }} 23 | shell: bash 24 | -------------------------------------------------------------------------------- /.github/actions/deploy_repo/action.yml: -------------------------------------------------------------------------------- 1 | name: Deploy docs for repo 2 | description: Deploys the docs of a given repository. 3 | 4 | inputs: 5 | repo_name: 6 | description: The name of the repository to deploy 7 | required: true 8 | repo_branch: 9 | description: The branch of the repo to deploy 10 | required: true 11 | repo_version: 12 | description: The version of the repo to deploy 13 | required: true 14 | repo_deploy_path: 15 | description: The path in the destination bucket to deploy the built documentation to 16 | required: true 17 | NO_INVALIDATION: 18 | description: If set to true, the Cloudfront invalidation will not be triggered 19 | required: false 20 | default: false 21 | AWS_ACCESS_KEY_ID: 22 | description: AWS Access key ID 23 | required: true 24 | AWS_SECRET_ACCESS_KEY: 25 | description: AWS secret key 26 | required: true 27 | S3_BUCKET: 28 | description: S3 bucket name 29 | required: true 30 | CLOUDFRONT_ID: 31 | description: Cloudfront distribution ID 32 | required: true 33 | REGION: 34 | description: AWS default region 35 | required: true 36 | 37 | runs: 38 | using: "composite" 39 | steps: 40 | - name: Install dependencies 41 | run: npm i 42 | shell: bash 43 | 44 | - name: Checks kuzdoc version 45 | run: npx kuzdoc --version 46 | shell: bash 47 | 48 | - name: Installs the repo 49 | shell: bash 50 | run: npx kuzdoc install --repo=${{ inputs.repo_name }}-${{ inputs.repo_version }} --repoBranch=${{ inputs.repo_branch }} 51 | 52 | - name: Builds and deploys the repo 53 | if: ${{ inputs.NO_INVALIDATION == 'true' }} 54 | run: npx kuzdoc build-and-deploy --repo=${{ inputs.repo_name }}-${{ inputs.repo_version }} --s3Bucket=${{ inputs.S3_BUCKET }} --cloudfrontId=${{ inputs.CLOUDFRONT_ID }} --noInvalidation 55 | env: 56 | AWS_DEFAULT_REGION: ${{ inputs.REGION }} 57 | AWS_ACCESS_KEY_ID: ${{ inputs.AWS_ACCESS_KEY_ID }} 58 | AWS_SECRET_ACCESS_KEY: ${{ inputs.AWS_SECRET_ACCESS_KEY }} 59 | NODE_OPTIONS: --max-old-space-size=4096 60 | shell: bash 61 | 62 | - name: Builds and deploys the repo 63 | if: ${{ inputs.NO_INVALIDATION == 'false' }} 64 | run: npx kuzdoc build-and-deploy --repo=${{ inputs.repo_name }}-${{ inputs.repo_version }} --s3Bucket=${{ inputs.S3_BUCKET }} --cloudfrontId=${{ inputs.CLOUDFRONT_ID }} 65 | env: 66 | AWS_DEFAULT_REGION: ${{ inputs.REGION }} 67 | AWS_ACCESS_KEY_ID: ${{ inputs.AWS_ACCESS_KEY_ID }} 68 | AWS_SECRET_ACCESS_KEY: ${{ inputs.AWS_SECRET_ACCESS_KEY }} 69 | NODE_OPTIONS: --max-old-space-size=4096 70 | shell: bash 71 | -------------------------------------------------------------------------------- /.github/issue_template.md: -------------------------------------------------------------------------------- 1 | 7 | 8 | ## Expected Behavior 9 | 10 | 11 | ## Current Behavior 12 | 13 | 14 | ## Possible Solution 15 | 16 | 17 | ## Steps to Reproduce 18 | 19 | 20 | 21 | 22 | 1. 23 | 2. 24 | 3. 25 | 4. 26 | 27 | ## Context (Environment) 28 | 29 | 30 | 31 | Kuzzle version: 32 | Node.js version: 33 | SDK version: 34 | -------------------------------------------------------------------------------- /.github/pull_request_template.md: -------------------------------------------------------------------------------- 1 | 5 | 6 | 11 | 12 | 13 | ## What does this PR do? 14 | 15 | 16 | 21 | 22 | ### How should this be manually tested? 23 | 24 | 28 | - Step 1 : 29 | - Step 2 : 30 | - Step 3 : 31 | ... 32 | 33 | ### Other changes 34 | 35 | 39 | 40 | ### Boyscout 41 | 42 | 46 | -------------------------------------------------------------------------------- /.github/workflows/dead_links.workflow.yml: -------------------------------------------------------------------------------- 1 | name: Child repo triggered dead-link check 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | repo_name: 7 | description: "The name of the repository that triggered the workflow" 8 | required: true 9 | branch: 10 | description: "The branch of the child repo to deploy" 11 | required: false 12 | version: 13 | description: "The version of the product in the child repo" 14 | required: true 15 | 16 | env: 17 | NODE_VERSION: 20 18 | 19 | jobs: 20 | dead-links: 21 | name: Check the dead-links on the repo 22 | runs-on: ubuntu-24.04 23 | steps: 24 | - name: Checkout repository 25 | uses: actions/checkout@v4 26 | 27 | - name: Output event inputs for debug 28 | run: echo "Repo ${{ github.event.inputs.repo_name }} triggered this workflow from branch ${{ github.event.inputs.branch }} v${{ github.event.inputs.version }}" 29 | 30 | - name: Install SSH key 31 | uses: shimataro/ssh-key-action@v2 32 | with: 33 | key: ${{ secrets.SSH_KEY }} 34 | name: id_rsa 35 | known_hosts: unnecessary 36 | 37 | - name: Set up Node 38 | uses: actions/setup-node@v4 39 | with: 40 | node-version: ${{ env.NODE_VERSION }} 41 | cache: 'npm' 42 | 43 | - name: Check dead links 44 | uses: ./.github/actions/dead-links 45 | with: 46 | repo_name: ${{ github.event.inputs.repo_name }} 47 | repo_version: ${{ github.event.inputs.version }} 48 | repo_branch: ${{ github.event.inputs.branch }} 49 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.idea 2 | .DS_Store 3 | node_modules 4 | dist 5 | algolia-records.json 6 | frontmatter-errors.json 7 | frontmatter-fixes.json 8 | dead_links.json 9 | .vscode 10 | .cache 11 | .temp 12 | 13 | .repos/plugin* 14 | .repos/sdk-* 15 | .repos/kuzzle* 16 | .repos/paas* 17 | .repos/iot-platform* 18 | 19 | version.md 20 | frontmatter-lint-errors.json 21 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "semi": true 4 | } 5 | -------------------------------------------------------------------------------- /.vscode/launch.json: -------------------------------------------------------------------------------- 1 | { 2 | // Use IntelliSense to learn about possible attributes. 3 | // Hover to view descriptions of existing attributes. 4 | // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 5 | "version": "0.2.0", 6 | "configurations": [ 7 | { 8 | "type": "node", 9 | "request": "launch", 10 | "name": "Debug Frontmatter Fix Tool", 11 | "program": "${workspaceFolder}/src/.vuepress/validate-frontmatter/fix.js", 12 | "args": ["-e", "frontmatter-errors.json", "-d", "src", "-y"], 13 | "cwd": "${workspaceFolder}" 14 | }, 15 | { 16 | "type": "node", 17 | "request": "launch", 18 | "name": "Debug VuePress", 19 | "console": "integratedTerminal", 20 | "runtimeExecutable": "npm", 21 | "runtimeArgs": ["run-script", "debug"], 22 | // "localRoot": "${workspaceFolder}/src/.vuepress/", 23 | "env": { 24 | "ALGOLIA_WRITE_KEY": "1" 25 | }, 26 | // "remoteRoot": "/", 27 | "port": 9229 28 | } 29 | ] 30 | } 31 | -------------------------------------------------------------------------------- /Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:alpine 2 | 3 | LABEL io.kuzzle.vendor="Kuzzle " 4 | LABEL description="Documentation website with running tests" 5 | 6 | WORKDIR /var/app 7 | 8 | COPY . /var/app 9 | 10 | RUN set -eux \ 11 | \ 12 | && npm install 13 | 14 | ENTRYPOINT ["npm", "run"] 15 | CMD ["dev"] 16 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "kuzzleio-documentation", 3 | "version": "4.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "dev": "vuepress dev src --clean-cache", 8 | "vuepress": "vuepress", 9 | "build": "vuepress build src --clean-cache" 10 | }, 11 | "repository": { 12 | "type": "git", 13 | "url": "git://github.com/kuzzleio/documentation.git" 14 | }, 15 | "author": "The Kuzzle Team ", 16 | "license": "Apache-2.0", 17 | "dependencies": { 18 | "@fortawesome/fontawesome-free": "^6.6.0", 19 | "@fortawesome/fontawesome-svg-core": "^6.6.0", 20 | "@fortawesome/free-brands-svg-icons": "^6.6.0", 21 | "@fortawesome/free-solid-svg-icons": "^6.6.0", 22 | "@fortawesome/vue-fontawesome": "^3.0.8", 23 | "fix-indents": "^0.1.2092", 24 | "lodash-es": "^4.17.21" 25 | }, 26 | "devDependencies": { 27 | "@types/lodash-es": "^4.17.12", 28 | "@types/markdown-it": "^14.1.2", 29 | "@types/micromatch": "^4.0.9", 30 | "@vuepress/bundler-vite": "^2.0.0-rc.17", 31 | "@vuepress/plugin-active-header-links": "^2.0.0-rc.103", 32 | "@vuepress/plugin-back-to-top": "^2.0.0-rc.103", 33 | "@vuepress/plugin-copy-code": "^2.0.0-rc.103", 34 | "@vuepress/plugin-docsearch": "^2.0.0-rc.103", 35 | "@vuepress/plugin-google-analytics": "^2.0.0-rc.103", 36 | "@vuepress/plugin-markdown-container": "^2.0.0-rc.103", 37 | "@vuepress/plugin-register-components": "^2.0.0-rc.103", 38 | "@vuepress/plugin-shiki": "^2.0.0-rc.103", 39 | "@vuepress/plugin-sitemap": "^2.0.0-rc.103", 40 | "@vuepress/utils": "^2.0.0-rc.17", 41 | "commander": "^12.1.0", 42 | "eslint": "^9.11.1", 43 | "micromatch": "^4.0.8", 44 | "sass-embedded": "^1.79.4", 45 | "vite-plugin-node-polyfills": "^0.22.0", 46 | "vuepress": "^2.0.0-rc.23" 47 | } 48 | } 49 | -------------------------------------------------------------------------------- /scaffolding/lib/generateCommand.js: -------------------------------------------------------------------------------- 1 | const 2 | { 3 | explodeSdkPath, 4 | renderSnippetTemplate, 5 | renderMarkdownTemplate, 6 | renderSnippetConfigTemplate, 7 | injectSignatures, 8 | injectDescription 9 | } = require('./utils'), 10 | _ = require('lodash'), 11 | path = require('path'); 12 | 13 | async function generateCommand (actionPath) { 14 | if (! actionPath) { 15 | // eslint-disable-next-line no-console 16 | console.error('You must provide a path for the action'); 17 | process.exit(1); 18 | } 19 | 20 | try { 21 | const sdkInfos = explodeSdkPath(actionPath); 22 | 23 | console.log(`Scaffolding: ${sdkInfos.controller}:${sdkInfos.action} (${sdkInfos.language}/${sdkInfos.version})`); 24 | 25 | await renderMarkdownTemplate(sdkInfos, actionPath); 26 | await renderSnippetTemplate(sdkInfos, actionPath); 27 | await renderSnippetConfigTemplate(sdkInfos, actionPath); 28 | 29 | injectDescription(sdkInfos, actionPath); 30 | injectSignatures(sdkInfos, actionPath); 31 | } catch (error) { 32 | console.error(error); 33 | process.exit(1); 34 | } 35 | } 36 | 37 | module.exports = generateCommand; 38 | -------------------------------------------------------------------------------- /scaffolding/scaffold: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const 4 | program = require('commander'); 5 | 6 | program 7 | .command('generate ') 8 | .description('generate a full scaffold for a controller action') 9 | .action(require('./lib/generateCommand.js')); 10 | 11 | program 12 | .command('copy ') 13 | .description('generate a scaffold for a controller action based an existing sdk') 14 | .action(require('./lib/copyCommand.js')); 15 | 16 | program.parse(process.argv); 17 | -------------------------------------------------------------------------------- /scaffolding/templates/action.cpp.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: sdk.html.hbs 3 | title: <%= _.camelCase(action) %> 4 | description: 5 | --- 6 | 7 | # <%= _.camelCase(action) %> 8 | 9 | ## Arguments 10 | 11 | ```cpp 12 | void <%= _.camelCase(action) %>() 13 | ``` 14 | 15 |
16 | 17 | | Argument | Type | Description | 18 | | --- | --- | --- | 19 | | `index` |
std::string
| Index name | 20 | | `collection` |
std::string
| Collection name | 21 | | `id` |
std::string
| The document id | 22 | | `body` |
std::string
| A JSON string containing the body of the document | 23 | | `options` |
kuzzleio::query_options
| A pointer to a `kuzzleio::query_options` containing query options | 24 | 25 | ### options 26 | 27 | | Options | Type (default) | Description | 28 | | ---------- | -------------- | --------------------------------- | 29 | | `queuable` |
boolean
(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | 30 | | `refresh` |
std::string
| If set to `wait_for`, waits for the change to be reflected for `search` (up to 1s) | 31 | 32 | ## Return 33 | 34 | ## Exceptions 35 | 36 | Throws a `KuzzleException` if there is an error. See how to [handle errors]({{ site_base_path }}sdk-reference/cpp/1/error-handling). 37 | 38 | ## Usage 39 | 40 | [snippet=<%= _.kebabCase(action) %>] 41 | -------------------------------------------------------------------------------- /scaffolding/templates/action.go.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: sdk.html.hbs 3 | title: <%= _.camelCase(action) %> 4 | description: 5 | --- 6 | 7 | # <%= _.camelCase(action) %> 8 | 9 | ## Arguments 10 | 11 | ```go 12 | <%= _.upperFirst(_.camelCase(action)) %>() error 13 | ``` 14 | 15 |
16 | 17 | | Arguments | Type | Description | 18 | |--------------|---------|-------------| 19 | | ``changeme`` |
changme
| changeme | 20 | 21 | ### options 22 | 23 | | Options | Type (default) | Description | 24 | | ---------- | -------------- | --------------------------------- | 25 | | `queuable` |
bool
(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | 26 | | `refresh` |
string
| If set to `wait_for`, waits for the change to be reflected for `search` (up to 1s) | 27 | 28 | ## Return 29 | 30 | ## Usage 31 | 32 | [snippet=<%= _.kebabCase(action) %>] 33 | -------------------------------------------------------------------------------- /scaffolding/templates/action.java.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: sdk.html.hbs 3 | title: <%= _.camelCase(action) %> 4 | description: 5 | --- 6 | 7 | # <%= _.camelCase(action) %> 8 | 9 | ## Arguments 10 | 11 | ```java 12 | void <%= _.camelCase(action) %>() 13 | ``` 14 | 15 |
16 | 17 | | Argument | Type | Description | 18 | | --- | --- | --- | 19 | | `index` |
String
| Index name | 20 | | `collection` |
String
| Collection name | 21 | | `id` |
String
| Optional document id. If set to a blank string, will use a auto-generated id | 22 | | `body` |
String
| A JSON string containing the body of the document | 23 | | `options` |
io.kuzzle.sdk.QueryOptions
| The query options | 24 | 25 | ### Options 26 | 27 | | Option | Type (default) | Description | 28 | | ---------- | -------------- | --------------------------------- | 29 | | `queuable` |
boolean
(`true`) | Make this request queuable or not | 30 | | `refresh` |
String
| If set to `wait_for`, waits for the change to be reflected for `search` (up to 1s) | 31 | 32 | ## Return 33 | 34 | ## Exceptions 35 | 36 | Throws a `io.kuzzle.sdk.KuzzleException` if there is an error. See how to [handle error]({{ site_base_path }}sdk-reference/java/1/error-handling). 37 | 38 | ## Usage 39 | 40 | [snippet=<%= _.kebabCase(action) %>] 41 | -------------------------------------------------------------------------------- /scaffolding/templates/action.js.md: -------------------------------------------------------------------------------- 1 | --- 2 | layout: sdk.html.hbs 3 | title: <%= _.camelCase(action) %> 4 | description: 5 | --- 6 | 7 | # <%= _.camelCase(action) %> 8 | 9 | ## Arguments 10 | 11 | ```js 12 | <%= _.camelCase(action) %>() 13 | ``` 14 | 15 |
16 | 17 | | Argument | Type | Description | 18 | | --- | --- | --- | 19 | | `index` |
string
| Index name | 20 | | `collection` |
string
| Collection name | 21 | | `id` |
string
| Optional document id | 22 | | `body` |
object
| The query to match | 23 | | `options` |
object
| An object containing query options. | 24 | 25 | ### options 26 | 27 | | Option | Type (default) | Description | 28 | | ---------- | ----------------- | --------------------------------- | 29 | | `queuable` |
boolean
(`true`) | If true, queues the request during downtime, until connected to Kuzzle again | 30 | | `refresh` |
string
| If set to `wait_for`, waits for the change to be reflected for `search` (up to 1s) | 31 | 32 | ## Resolve 33 | 34 | ## Usage 35 | 36 | [snippet=<%= _.kebabCase(action) %>] 37 | -------------------------------------------------------------------------------- /scaffolding/templates/usage-snippets/usage.cpp: -------------------------------------------------------------------------------- 1 | try { 2 | kuzzle-><%= _.camelCase(controller) %>-><%= _.camelCase(action) %>(); 3 | 4 | std::cout << "Success" << std::endl; 5 | } catch (kuzzleio::KuzzleException &e) { 6 | std::cerr << e.getMessage() << std::endl; 7 | } 8 | -------------------------------------------------------------------------------- /scaffolding/templates/usage-snippets/usage.go: -------------------------------------------------------------------------------- 1 | err := kuzzle.<%= _.upperFirst(_.camelCase(controller)) %>.<%= _.upperFirst(_.camelCase(action)) %>() 2 | 3 | if err != nil { 4 | log.Fatal(err) 5 | } else { 6 | fmt.Println("Success") 7 | } 8 | -------------------------------------------------------------------------------- /scaffolding/templates/usage-snippets/usage.java: -------------------------------------------------------------------------------- 1 | try { 2 | kuzzle.get<%= _.upperFirst(_.camelCase(controller)) %>().<%= _.camelCase(action) %>(); 3 | System.out.println("Success"); 4 | } catch (KuzzleException e) { 5 | System.err.println(e.getMessage()); 6 | } 7 | -------------------------------------------------------------------------------- /scaffolding/templates/usage-snippets/usage.js: -------------------------------------------------------------------------------- 1 | try { 2 | await kuzzle.<%= _.camelCase(controller) %>.<%= _.camelCase(action) %>(); 3 | console.log('Success'); 4 | } catch (error) { 5 | console.error(error.message); 6 | } 7 | -------------------------------------------------------------------------------- /scaffolding/templates/usage-snippets/usage.test.yml: -------------------------------------------------------------------------------- 1 | name: <%= _.camelCase(controller) %>#<%= _.camelCase(action) %> 2 | description: 3 | hooks: 4 | before: 5 | after: 6 | template: default 7 | expected: Success 8 | -------------------------------------------------------------------------------- /src/.vuepress/client.ts: -------------------------------------------------------------------------------- 1 | import { library } from '@fortawesome/fontawesome-svg-core'; 2 | import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'; 3 | import { defineClientConfig } from 'vuepress/client'; 4 | 5 | import { 6 | faAngleLeft, 7 | faArrowUpRightFromSquare, 8 | faBars, 9 | faCaretDown, 10 | faCaretRight, 11 | faCircleCheck, 12 | faCircleInfo, 13 | faGlobe, 14 | faMagnifyingGlass, 15 | faTriangleExclamation, 16 | } from '@fortawesome/free-solid-svg-icons'; 17 | 18 | import { 19 | faDiscord, 20 | faGithub, 21 | faLinkedinIn, 22 | faStackOverflow, 23 | faXTwitter, 24 | faYoutube, 25 | } from '@fortawesome/free-brands-svg-icons'; 26 | 27 | library.add( 28 | faAngleLeft, 29 | faArrowUpRightFromSquare, 30 | faBars, 31 | faCaretDown, 32 | faCaretRight, 33 | faCircleCheck, 34 | faCircleInfo, 35 | faDiscord, 36 | faGithub, 37 | faGlobe, 38 | faLinkedinIn, 39 | faMagnifyingGlass, 40 | faStackOverflow, 41 | faTriangleExclamation, 42 | faXTwitter, 43 | faYoutube, 44 | ); 45 | 46 | export default defineClientConfig({ 47 | enhance({ app, router }) { 48 | // Register the FontAwesomeIcon component 49 | app.component('font-awesome-icon', FontAwesomeIcon); 50 | 51 | // Override the VuePress scroll behavior to set a custom top offset 52 | router.options.scrollBehavior = async (to, from, savedPosition) => { 53 | if (savedPosition) { 54 | return savedPosition; 55 | } 56 | 57 | if (to.hash.length > 1) { 58 | const elem = document.querySelector(to.hash); 59 | 60 | if (elem !== null) { 61 | const top = parseFloat(getComputedStyle(elem).scrollMarginTop); 62 | 63 | return { 64 | el: to.hash, 65 | behavior: 'smooth', 66 | top, 67 | }; 68 | } 69 | } 70 | 71 | const behavior = to.path === from.path ? 'smooth' : 'instant'; 72 | return { top: 0, left: 0, behavior }; 73 | } 74 | }, 75 | }); 76 | -------------------------------------------------------------------------------- /src/.vuepress/components/AlgoliaTags.vue: -------------------------------------------------------------------------------- 1 | 8 | 9 | 70 | -------------------------------------------------------------------------------- /src/.vuepress/components/Badge.vue: -------------------------------------------------------------------------------- 1 | 30 | 31 | -------------------------------------------------------------------------------- /src/.vuepress/components/ClosedSourcesBanner.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 16 | -------------------------------------------------------------------------------- /src/.vuepress/components/CodeSnippet.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 10 | 11 | 13 | -------------------------------------------------------------------------------- /src/.vuepress/components/Cta.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 20 | 21 | 32 | -------------------------------------------------------------------------------- /src/.vuepress/components/CustomBadge.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 29 | -------------------------------------------------------------------------------- /src/.vuepress/components/DeprecatedBadge.vue: -------------------------------------------------------------------------------- 1 | 10 | 11 | 26 | 27 | 29 | -------------------------------------------------------------------------------- /src/.vuepress/components/DeprecatedBanner.vue: -------------------------------------------------------------------------------- 1 | 9 | 10 | 13 | -------------------------------------------------------------------------------- /src/.vuepress/components/GuidesLinks.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 45 | 46 | 60 | -------------------------------------------------------------------------------- /src/.vuepress/components/Home.vue: -------------------------------------------------------------------------------- 1 | 63 | 64 | 79 | 80 | 81 | -------------------------------------------------------------------------------- /src/.vuepress/components/HomeV1.vue: -------------------------------------------------------------------------------- 1 | 81 | 82 | 97 | 98 | 99 | -------------------------------------------------------------------------------- /src/.vuepress/components/HowToCategory.vue: -------------------------------------------------------------------------------- 1 | 12 | 13 | 28 | -------------------------------------------------------------------------------- /src/.vuepress/components/HowToIndex.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 57 | 58 | 60 | -------------------------------------------------------------------------------- /src/.vuepress/components/JavaDeprecatedBanner.vue: -------------------------------------------------------------------------------- 1 | 13 | 14 | 17 | -------------------------------------------------------------------------------- /src/.vuepress/components/MajorVersionDeprecation.vue: -------------------------------------------------------------------------------- 1 | 11 | 12 | 23 | -------------------------------------------------------------------------------- /src/.vuepress/components/MenuDropdown.vue: -------------------------------------------------------------------------------- 1 | 25 | 26 | 83 | -------------------------------------------------------------------------------- /src/.vuepress/components/ModulesIndex.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 48 | 49 | 50 | -------------------------------------------------------------------------------- /src/.vuepress/components/PluginsIndex.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 51 | 52 | 53 | -------------------------------------------------------------------------------- /src/.vuepress/components/Redirect.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 46 | -------------------------------------------------------------------------------- /src/.vuepress/components/RedirectLink.vue: -------------------------------------------------------------------------------- 1 | 6 | 7 | 18 | -------------------------------------------------------------------------------- /src/.vuepress/components/RedirectToFirstChild.vue: -------------------------------------------------------------------------------- 1 | 4 | 5 | 36 | -------------------------------------------------------------------------------- /src/.vuepress/components/SDKIndex.vue: -------------------------------------------------------------------------------- 1 | 43 | 44 | 76 | 77 | 79 | -------------------------------------------------------------------------------- /src/.vuepress/components/SDKSelector.vue: -------------------------------------------------------------------------------- 1 | 54 | 55 | 101 | 102 | 103 | -------------------------------------------------------------------------------- /src/.vuepress/components/SinceBadge.vue: -------------------------------------------------------------------------------- 1 | 10 | 27 | 28 | 30 | -------------------------------------------------------------------------------- /src/.vuepress/external-plugins.json: -------------------------------------------------------------------------------- 1 | { 2 | "1": [ 3 | { 4 | "name": "Prometheus", 5 | "path": "https://github.com/kuzzleio/kuzzle-plugin-prometheus/tree/1-stable", 6 | "version": "1", 7 | "icon": "/logos/plugin-prometheus.svg", 8 | "iconAlt": "prometheus logo" 9 | }, 10 | { 11 | "name": "Passport local", 12 | "path": "https://github.com/kuzzleio/kuzzle-plugin-auth-passport-local/tree/5-stable", 13 | "version": "5", 14 | "icon": "/logos/passport.svg", 15 | "iconAlt": "Passport local logo" 16 | }, 17 | { 18 | "name": "Passport OAuth", 19 | "path": "https://github.com/kuzzleio/kuzzle-plugin-auth-passport-oauth/tree/4-stable", 20 | "version": "4", 21 | "icon": "/logos/passport.svg", 22 | "iconAlt": "Passport oauth logo" 23 | }, 24 | { 25 | "name": "Cluster", 26 | "path": "https://github.com/kuzzleio/kuzzle-plugin-cluster/tree/3-stable", 27 | "version": "3", 28 | "icon": "/logos/cluster.svg", 29 | "iconAlt": "cluster logo" 30 | }, 31 | { 32 | "name": "Computed fields", 33 | "path": "https://github.com/kuzzleio/computed-fields-plugin", 34 | "version": "1", 35 | "icon": "/logos/computed.svg", 36 | "iconAlt": "computed fields logo" 37 | }, 38 | { 39 | "name": "Logger", 40 | "path": "https://github.com/kuzzleio/kuzzle-plugin-logger/tree/2-stable", 41 | "version": "2", 42 | "icon": "/logos/logger.svg", 43 | "iconAlt": "logger logo" 44 | }, 45 | { 46 | "name": "Probe", 47 | "path": "https://github.com/kuzzleio/kuzzle-plugin-probe", 48 | "version": "1", 49 | "icon": "/logos/probe.svg", 50 | "iconAlt": "probe logo" 51 | }, 52 | { 53 | "name": "Probe listener", 54 | "path": "https://github.com/kuzzleio/kuzzle-plugin-probe-listener", 55 | "version": "1", 56 | "icon": "/logos/probe.svg", 57 | "iconAlt": "probe listener logo" 58 | } 59 | ], 60 | "2": [ 61 | { 62 | "name": "Prometheus", 63 | "path": "https://github.com/kuzzleio/kuzzle-plugin-prometheus", 64 | "version": "2", 65 | "icon": "/logos/plugin-prometheus.svg", 66 | "iconAlt": "prometheus logo" 67 | }, 68 | { 69 | "name": "Passport OAuth", 70 | "path": "https://github.com/kuzzleio/kuzzle-plugin-auth-passport-oauth", 71 | "version": "6", 72 | "icon": "/logos/passport.svg", 73 | "iconAlt": "Passport oauth logo" 74 | } 75 | ] 76 | } 77 | -------------------------------------------------------------------------------- /src/.vuepress/frontmatter-in-route-meta/index.ts: -------------------------------------------------------------------------------- 1 | export * from './plugin'; 2 | -------------------------------------------------------------------------------- /src/.vuepress/frontmatter-in-route-meta/plugin.ts: -------------------------------------------------------------------------------- 1 | import { PluginFunction } from 'vuepress'; 2 | 3 | export const PLUGIN_NAME = '@kuzzleio/vuepress-plugin-frontmatter-in-route-meta'; 4 | 5 | export const frontmatterInRouteMetaPlugin = 6 | (): PluginFunction => 7 | () => { 8 | return { 9 | name: PLUGIN_NAME, 10 | extendsPage: (page) => { 11 | page.routeMeta.frontmatter = page.frontmatter; 12 | }, 13 | }; 14 | } 15 | -------------------------------------------------------------------------------- /src/.vuepress/frontmatter-lint/append-fixes.ts: -------------------------------------------------------------------------------- 1 | import { path } from '@vuepress/utils'; 2 | import { assign, endsWith, mapValues } from 'lodash-es'; 3 | import { App, Page } from "vuepress"; 4 | 5 | import { LintError, MissingKeyLintError } from "./types"; 6 | 7 | const codeRE = /api-reference\/.+|protocols\/context\/|protocols\/entrypoint\/|protocols\/methods\/|plugins\/events\/.+|plugin-context|controllers\/.+|core-classes\/.+|virtual-classes\/.+|sdk\/.+\/protocols\/.+|core-structs\/.+|sdk\/.+\/classes\/.+/; 8 | 9 | function computeMissingKeyFix(url: string, error: MissingKeyLintError, nodes: Page[]) { 10 | const node = getNodeByPath(url, nodes); 11 | 12 | if (!node) { 13 | return; 14 | } 15 | 16 | if (error.key === 'code') { 17 | if (codeRE.test(node.path)) { 18 | return { 19 | code: true 20 | }; 21 | } else { 22 | return { 23 | code: false 24 | }; 25 | } 26 | } 27 | 28 | if (error.key === 'type') { 29 | const children = getChildren(node, nodes); 30 | if (children.length) { 31 | if ( 32 | node.frontmatter.type !== 'branch' && 33 | node.frontmatter.type !== 'root' 34 | ) { 35 | return { type: 'branch' }; 36 | } 37 | } else { 38 | if (node.frontmatter.type !== 'page') { 39 | return { type: 'page' }; 40 | } 41 | } 42 | } 43 | } 44 | 45 | function getChildren(node: Page, nodes: Page[]) { 46 | const pathRE = new RegExp(`^${getNodeDirectory(node)}[a-zA-z_0-9\-]+/?$`); 47 | return nodes.filter(p => p.path.match(pathRE) && p.path !== node.path); 48 | } 49 | 50 | function getNodeDirectory(node: Page) { 51 | if (endsWith(node.path, '/')) { 52 | return node.path; 53 | } else { 54 | return path.parse(node.path).dir; 55 | } 56 | } 57 | 58 | function getNodeByPath(path: string, nodes: Page[]) { 59 | return nodes.find(p => p.path === path); 60 | } 61 | 62 | export function appendFixes(errorsByPath: Record, ctx: App) { 63 | return mapValues(errorsByPath, (errors, url) => { 64 | return errors.map(e => { 65 | if (e.error !== 'MISSING_KEY') { 66 | return e; 67 | } 68 | 69 | const fix = computeMissingKeyFix(url, e, ctx.pages); 70 | if (fix) { 71 | return assign({ fix }, e); 72 | } else { 73 | return e; 74 | } 75 | }); 76 | }); 77 | } 78 | -------------------------------------------------------------------------------- /src/.vuepress/frontmatter-lint/index.ts: -------------------------------------------------------------------------------- 1 | export * from './plugin'; 2 | export * from './types'; 3 | -------------------------------------------------------------------------------- /src/.vuepress/frontmatter-lint/types.ts: -------------------------------------------------------------------------------- 1 | export type CommonSpec = { 2 | required: boolean; 3 | }; 4 | 5 | export type StringSpec = { 6 | type: 'string'; 7 | allowedValues?: string[]; 8 | }; 9 | 10 | export type NumberSpec = { 11 | type: 'number'; 12 | }; 13 | 14 | export type BooleanSpec = { 15 | type: 'boolean'; 16 | }; 17 | 18 | export type ArraySpec = { 19 | type: 'array'; 20 | }; 21 | 22 | export type Spec = CommonSpec & (StringSpec | NumberSpec | BooleanSpec | ArraySpec); 23 | 24 | export type FrontmatterLintPluginOptions = { 25 | abortBuild: boolean; 26 | exclude?: string[]; 27 | dumpFile?: string; 28 | dumpToFile: boolean; 29 | specs: Record; 30 | }; 31 | 32 | export type MissingKeyLintError = { 33 | error: 'MISSING_KEY'; 34 | key: string; 35 | }; 36 | 37 | export type EmptyKeyLintError = { 38 | error: 'EMPTY_KEY'; 39 | }; 40 | 41 | export type InvalidKeyLintError = { 42 | error: 'INVALID_KEY'; 43 | key: string; 44 | }; 45 | 46 | export type EmptyValueLintError = { 47 | error: 'EMPTY_VALUE'; 48 | key: string; 49 | }; 50 | 51 | export type InvalidTypeLintError = { 52 | error: 'INVALID_TYPE'; 53 | key: string; 54 | expected: string; 55 | got: string; 56 | }; 57 | 58 | export type InvalidValueLintError = { 59 | error: 'INVALID_VALUE'; 60 | key: string; 61 | expected: string; 62 | got: string; 63 | }; 64 | 65 | export type LintError = 66 | | MissingKeyLintError 67 | | EmptyKeyLintError 68 | | InvalidKeyLintError 69 | | EmptyValueLintError 70 | | InvalidTypeLintError 71 | | InvalidValueLintError; 72 | -------------------------------------------------------------------------------- /src/.vuepress/getVersionString.ts: -------------------------------------------------------------------------------- 1 | let version = 'local-build' 2 | 3 | if (process.env.CI) { 4 | version = `${process.env.TRAVIS_REPO_SLUG}:${process.env.TRAVIS_BRANCH}@${process.env.TRAVIS_COMMIT}--job:${process.env.TRAVIS_JOB_WEB_URL}`; 5 | } 6 | 7 | export default version; 8 | -------------------------------------------------------------------------------- /src/.vuepress/helpers.ts: -------------------------------------------------------------------------------- 1 | import { PageData } from "vuepress"; 2 | 3 | import { ExtraPageData } from "./page-attributes"; 4 | 5 | export const VERSION_QUERY_KEY = 'version'; 6 | export const DEFAULT_VERSION = 2; 7 | 8 | export const getCurrentVersion = (page: PageData) => { 9 | if (!page.currentSection) { 10 | return DEFAULT_VERSION; 11 | } 12 | 13 | return page.currentSection.kuzzleMajor; 14 | }; 15 | 16 | export const createMetaTag = (property: string, content: string) => { 17 | const meta = document.createElement('meta'); 18 | meta.setAttribute('property', property); 19 | meta.setAttribute('content', content); 20 | 21 | return meta; 22 | }; 23 | -------------------------------------------------------------------------------- /src/.vuepress/markdown/index.ts: -------------------------------------------------------------------------------- 1 | export * from './plugin'; 2 | -------------------------------------------------------------------------------- /src/.vuepress/markdown/plugin.ts: -------------------------------------------------------------------------------- 1 | import { Logger } from '@vuepress/helper'; 2 | import { PluginFunction } from 'vuepress'; 3 | 4 | import codeSnippet from './code-snippet'; 5 | 6 | export const PLUGIN_NAME = '@kuzzleio/vuepress-plugin-markdown'; 7 | const logger = new Logger(PLUGIN_NAME); 8 | 9 | export const markdownPlugin = 10 | (): PluginFunction => 11 | (app) => { 12 | return { 13 | name: PLUGIN_NAME, 14 | extendsMarkdown: (md) => { 15 | md.use(codeSnippet, { 16 | docsDir: app.dir.source(), 17 | logger, 18 | }); 19 | }, 20 | }; 21 | } 22 | -------------------------------------------------------------------------------- /src/.vuepress/meta-tags-plugin/client.ts: -------------------------------------------------------------------------------- 1 | import { onMounted } from 'vue'; 2 | import { defineClientConfig, usePageData } from 'vuepress/client'; 3 | 4 | import { DEFAULT_VERSION, createMetaTag } from '../helpers'; 5 | import { ExtraPageData } from '../page-attributes'; 6 | 7 | export default defineClientConfig({ 8 | setup() { 9 | onMounted(() => { 10 | const pageData = usePageData(); 11 | const head = document.head; 12 | 13 | head.appendChild(createMetaTag('article:tag', pageData.value.title)); 14 | head.appendChild(createMetaTag('og:title', pageData.value.title)); 15 | head.appendChild(createMetaTag('og:url', document.URL)); 16 | head.appendChild( 17 | createMetaTag( 18 | 'og:description', 19 | pageData.value.frontmatter.description || this.$site?.description 20 | ) 21 | ); 22 | 23 | if (pageData.value.currentSection) { 24 | head.appendChild( 25 | createMetaTag('article:section', pageData.value.currentSection.name) 26 | ); 27 | 28 | if (pageData.value.currentSection.kuzzleMajor < DEFAULT_VERSION) { 29 | head.appendChild(createMetaTag('robot', 'noindex')); 30 | } 31 | } 32 | }) 33 | }, 34 | }); 35 | -------------------------------------------------------------------------------- /src/.vuepress/meta-tags-plugin/index.ts: -------------------------------------------------------------------------------- 1 | export * from './plugin'; 2 | -------------------------------------------------------------------------------- /src/.vuepress/meta-tags-plugin/plugin.ts: -------------------------------------------------------------------------------- 1 | import { PluginFunction } from 'vuepress'; 2 | import { getDirname, path } from 'vuepress/utils'; 3 | 4 | const __dirname = getDirname(import.meta.url); 5 | 6 | export const PLUGIN_NAME = '@kuzzleio/vuepress-plugin-meta-tags'; 7 | 8 | export const metaTagsPlugin = 9 | (): PluginFunction => 10 | () => { 11 | return { 12 | name: PLUGIN_NAME, 13 | clientConfigFile: path.resolve(__dirname, './client.ts'), 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /src/.vuepress/page-attributes/index.ts: -------------------------------------------------------------------------------- 1 | export * from './plugin'; 2 | export * from './types'; 3 | -------------------------------------------------------------------------------- /src/.vuepress/page-attributes/plugin.ts: -------------------------------------------------------------------------------- 1 | import { transform } from 'lodash-es'; 2 | import { Page, PluginFunction } from 'vuepress'; 3 | 4 | import { 5 | ExtraPageData, 6 | PageAttributesPluginOptions, 7 | PageAttributesSection, 8 | PageAttributesSectionWithPath, 9 | } from './types'; 10 | 11 | export const PLUGIN_NAME = '@kuzzleio/vuepress-plugin-page-attributes'; 12 | 13 | export const pageAttributesPlugin = 14 | ({ sections }: PageAttributesPluginOptions): PluginFunction => 15 | (app) => { 16 | return { 17 | name: PLUGIN_NAME, 18 | extendsPage: (page: Page>) => { 19 | const fullPath = `${app.siteData.base}${page.path}`.replace('//', '/'); 20 | page.data.fullPath = fullPath; 21 | 22 | page.data.sectionsByPath = sections; 23 | page.data.sectionList = transform( 24 | sections, 25 | (result, value, key) => { 26 | result.push({ ...value, path: key }); 27 | }, 28 | [] 29 | ); 30 | page.data.currentSection = page.data.sectionList.find(s => fullPath.startsWith(s.path)) 31 | }, 32 | }; 33 | } 34 | -------------------------------------------------------------------------------- /src/.vuepress/page-attributes/types.ts: -------------------------------------------------------------------------------- 1 | export type PageAttributesSection = { 2 | name: string; 3 | version?: number; 4 | kuzzleMajor: number; 5 | section: string; 6 | subsection?: string; 7 | icon?: string; 8 | released: boolean; 9 | deprecated?: boolean; 10 | closedSources?: boolean; 11 | deprecatedBannerComponent?: string; 12 | }; 13 | 14 | export type PageAttributesSectionWithPath = PageAttributesSection & { path: string }; 15 | 16 | export type PageAttributesPluginOptions = { 17 | sections: Record; 18 | }; 19 | 20 | export type ExtraPageData = { 21 | fullPath: string; 22 | sectionsByPath: Record; 23 | sectionList: PageAttributesSectionWithPath[]; 24 | currentSection: PageAttributesSectionWithPath; 25 | }; 26 | -------------------------------------------------------------------------------- /src/.vuepress/public/demo_aws_console.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/demo_aws_console.gif -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/apple-touch-icon-114x114.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/apple-touch-icon-114x114.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/apple-touch-icon-120x120.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/apple-touch-icon-120x120.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/apple-touch-icon-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/apple-touch-icon-144x144.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/apple-touch-icon-152x152.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/apple-touch-icon-152x152.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/apple-touch-icon-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/apple-touch-icon-57x57.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/apple-touch-icon-60x60.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/apple-touch-icon-60x60.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/apple-touch-icon-72x72.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/apple-touch-icon-72x72.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/apple-touch-icon-76x76.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/apple-touch-icon-76x76.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/favicon-128.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/favicon-128.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/favicon-16x16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/favicon-16x16.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/favicon-196x196.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/favicon-196x196.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/favicon-32x32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/favicon-32x32.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/favicon-96x96.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/favicon-96x96.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/favicon.ico -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/mstile-144x144.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/mstile-144x144.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/mstile-150x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/mstile-150x150.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/mstile-310x150.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/mstile-310x150.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/mstile-310x310.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/mstile-310x310.png -------------------------------------------------------------------------------- /src/.vuepress/public/favicon/mstile-70x70.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/favicon/mstile-70x70.png -------------------------------------------------------------------------------- /src/.vuepress/public/geolocation/geoBoundingBox.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/geolocation/geoBoundingBox.png -------------------------------------------------------------------------------- /src/.vuepress/public/geolocation/geoDistance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/geolocation/geoDistance.png -------------------------------------------------------------------------------- /src/.vuepress/public/geolocation/geoDistanceRange.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/geolocation/geoDistanceRange.png -------------------------------------------------------------------------------- /src/.vuepress/public/geolocation/geoPolygon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/geolocation/geoPolygon.png -------------------------------------------------------------------------------- /src/.vuepress/public/logo-57x57.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/logo-57x57.png -------------------------------------------------------------------------------- /src/.vuepress/public/logo-min.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/logo-min.png -------------------------------------------------------------------------------- /src/.vuepress/public/logos/android.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/logos/android.png -------------------------------------------------------------------------------- /src/.vuepress/public/logos/android.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/book.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/computed.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/cpp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/logos/cpp.png -------------------------------------------------------------------------------- /src/.vuepress/public/logos/cpp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/csharp.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/logos/csharp.png -------------------------------------------------------------------------------- /src/.vuepress/public/logos/csharp.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/dart.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/device-manager.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/discord.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/logos/discord.png -------------------------------------------------------------------------------- /src/.vuepress/public/logos/go.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/logos/go.png -------------------------------------------------------------------------------- /src/.vuepress/public/logos/go.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/java.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/logos/java.png -------------------------------------------------------------------------------- /src/.vuepress/public/logos/java.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/javascript.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/logos/javascript.png -------------------------------------------------------------------------------- /src/.vuepress/public/logos/javascript.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/js.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/logos/js.png -------------------------------------------------------------------------------- /src/.vuepress/public/logos/js.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/keycloak.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/logger.svg: -------------------------------------------------------------------------------- 1 | Svg Vector Icons : http://www.onlinewebfonts.com/icon -------------------------------------------------------------------------------- /src/.vuepress/public/logos/logo-dashboard.svg: -------------------------------------------------------------------------------- 1 | backgroundLayer 1 -------------------------------------------------------------------------------- /src/.vuepress/public/logos/logo-database.svg: -------------------------------------------------------------------------------- 1 | backgroundLayer 1 -------------------------------------------------------------------------------- /src/.vuepress/public/logos/logo-discord.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/logo-github.svg: -------------------------------------------------------------------------------- 1 | backgroundLayer 1 -------------------------------------------------------------------------------- /src/.vuepress/public/logos/logo-stack-overflow.svg: -------------------------------------------------------------------------------- 1 | backgroundLayer 1 -------------------------------------------------------------------------------- /src/.vuepress/public/logos/logo-youtube.svg: -------------------------------------------------------------------------------- 1 | backgroundLayer 1 -------------------------------------------------------------------------------- /src/.vuepress/public/logos/lua.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/logos/lua.png -------------------------------------------------------------------------------- /src/.vuepress/public/logos/lua.svg: -------------------------------------------------------------------------------- 1 | Lua programming language logo -------------------------------------------------------------------------------- /src/.vuepress/public/logos/module-logger.svg: -------------------------------------------------------------------------------- 1 | 2 | 5 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/open-id.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/php.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/logos/php.png -------------------------------------------------------------------------------- /src/.vuepress/public/logos/php.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/plugin-multi-tenancy.svg: -------------------------------------------------------------------------------- 1 | 2 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/plugin-prometheus.svg: -------------------------------------------------------------------------------- 1 | Created by potrace 1.15, written by Peter Selinger 2001-2017 -------------------------------------------------------------------------------- /src/.vuepress/public/logos/plugin-s3.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/plugin.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/probe.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | Svg Vector Icons : http://www.onlinewebfonts.com/icon 6 | 7 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/python.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/logos/python.png -------------------------------------------------------------------------------- /src/.vuepress/public/logos/python.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/rocket.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/ruby.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/logos/ruby.png -------------------------------------------------------------------------------- /src/.vuepress/public/logos/ruby.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/scheduler.svg: -------------------------------------------------------------------------------- 1 | 2 | 4 | 7 | 8 | 10 | 17 | 19 | 20 | 21 | 28 | 30 | 31 | 32 | 33 | 34 | 35 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/search.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/settings.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/tools.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/workflows.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/logos/write-code.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /src/.vuepress/public/og-image.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/kuzzleio/documentation/581ea7eceff7bfbea53fcaeed3ddf9683037a8c5/src/.vuepress/public/og-image.png -------------------------------------------------------------------------------- /src/.vuepress/sections.schema.json: -------------------------------------------------------------------------------- 1 | { 2 | "title": "Sections Schema", 3 | "description": "Defines the format of the sections.json file", 4 | "type": "object", 5 | "additionalProperties": { 6 | "type": "object", 7 | "additionalProperties": false, 8 | "properties": { 9 | "kuzzleMajor": { 10 | "type": "integer" 11 | }, 12 | "section": { 13 | "type": "string" 14 | }, 15 | "subsection": { 16 | "type": "string" 17 | }, 18 | "name": { 19 | "type": "string" 20 | }, 21 | "version": { 22 | "type": "integer" 23 | }, 24 | "icon": { 25 | "type": "string" 26 | }, 27 | "deprecated": { 28 | "type": "boolean" 29 | }, 30 | "deprecatedBannerComponent": { 31 | "type": "string" 32 | }, 33 | "released": { 34 | "type": "boolean" 35 | }, 36 | "closedSources": { 37 | "type": "boolean" 38 | } 39 | }, 40 | "required": ["name", "kuzzleMajor", "section", "released"] 41 | } 42 | } 43 | -------------------------------------------------------------------------------- /src/.vuepress/theme/Footer.vue: -------------------------------------------------------------------------------- 1 | 87 | 88 | 97 | 98 | -------------------------------------------------------------------------------- /src/.vuepress/theme/Header.vue: -------------------------------------------------------------------------------- 1 | 62 | 63 | 101 | 102 | 110 | -------------------------------------------------------------------------------- /src/.vuepress/theme/NotFound.vue: -------------------------------------------------------------------------------- 1 | 62 | 63 | 113 | 114 | 119 | -------------------------------------------------------------------------------- /src/.vuepress/theme/TOC.vue: -------------------------------------------------------------------------------- 1 | 16 | 17 | 57 | 58 | 59 | -------------------------------------------------------------------------------- /src/.vuepress/theme/client.ts: -------------------------------------------------------------------------------- 1 | import { defineClientConfig } from '@vuepress/client'; 2 | 3 | import Layout from './Layout.vue'; 4 | import NotFound from './NotFound.vue'; 5 | import './styles/main.scss'; 6 | 7 | export default defineClientConfig({ 8 | layouts: { 9 | Layout, 10 | NotFound, 11 | }, 12 | }); 13 | -------------------------------------------------------------------------------- /src/.vuepress/theme/index.ts: -------------------------------------------------------------------------------- 1 | export * from './theme'; 2 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/_config.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Variables: typography 3 | // ---------------------------------------------------------------------------- 4 | 5 | // Modular typographic scale 6 | $ms-base: 1.6rem; 7 | $ms-ratio: $major-third; 8 | 9 | // ---------------------------------------------------------------------------- 10 | // Variables: breakpoints 11 | // ---------------------------------------------------------------------------- 12 | 13 | // stylelint-disable unit-whitelist 14 | 15 | // Device-specific breakpoints 16 | $break-devices: ( 17 | mobile: ( 18 | portrait: px2em(220px) px2em(479px), 19 | landscape: px2em(480px) px2em(719px) 20 | ), 21 | tablet: ( 22 | portrait: px2em(720px) px2em(959px), 23 | landscape: px2em(960px) px2em(1219px) 24 | ), 25 | screen: ( 26 | small: px2em(1220px) px2em(1599px), 27 | medium: px2em(1600px) px2em(1999px), 28 | large: px2em(2000px) 29 | ) 30 | ); 31 | 32 | // stylelint-enable unit-whitelist 33 | 34 | // ---------------------------------------------------------------------------- 35 | // Variables: base colors 36 | // ---------------------------------------------------------------------------- 37 | 38 | // Primary and accent colors 39 | $md-color-primary: $clr-indigo-500 !default; 40 | $md-color-accent: $clr-indigo-a200 !default; 41 | $md-color-pink: #e94e77; 42 | $md-color-pink-light: rgba(233, 78, 119, 0.3); 43 | $md-color-blue: #002835; 44 | $md-color-blue-light: RGBA(0, 40, 53, 0.3); 45 | 46 | // Shades of black 47 | $md-color-black: hsla(0, 0%, 0%, 0.87) !default; 48 | $md-color-black--light: hsla(0, 0%, 0%, 0.54) !default; 49 | $md-color-black--lighter: hsla(0, 0%, 0%, 0.26) !default; 50 | $md-color-black--lightest: hsla(0, 0%, 0%, 0.07) !default; 51 | $md-color-black--transparent: hsla(0, 0%, 0%, 0) !default; 52 | 53 | // Shades of white 54 | $md-color-white: hsla(0, 0%, 100%, 1) !default; 55 | $md-color-white--light: hsla(0, 0%, 100%, 0.7) !default; 56 | $md-color-white--lighter: hsla(0, 0%, 100%, 0.3) !default; 57 | $md-color-white--lightest: hsla(0, 0%, 100%, 0.12) !default; 58 | $md-color-white--transparent: hsla(0, 0%, 100%, 0) !default; 59 | 60 | // Custom properties 61 | :root { 62 | // Text 63 | --vp-c-text: #{$md-color-black}; 64 | --vp-c-text-muted: #{$md-color-black--light}; 65 | --vp-c-text-subtle: #{$md-color-black--lighter}; 66 | 67 | // Background 68 | --vp-c-bg: #{$md-color-white}; 69 | --vp-c-bg-alt: #{$md-color-blue}; 70 | --vp-c-bg-elv: #{$md-color-black--light}; 71 | 72 | // Shadow 73 | --vp-c-shadow: #{$md-color-black--lighter}; 74 | 75 | // Accent 76 | --vp-c-accent: #{$md-color-pink}; 77 | --vp-c-accent-hover: #{$md-color-pink}; 78 | --vp-c-accent-bg: #{$md-color-pink}; 79 | --vp-c-accent-text: #{$md-color-black}; 80 | --vp-c-accent-soft: #{$md-color-pink-light}; 81 | } 82 | 83 | // ---------------------------------------------------------------------------- 84 | // Variables: sizing and spacing 85 | // ---------------------------------------------------------------------------- 86 | 87 | // Icons 88 | $md-icon-size: $ms-base * 1.5; 89 | $md-icon-padding: $ms-base * 0.5; 90 | $md-icon-margin: $ms-base * 0.25; 91 | 92 | // Code blocks 93 | $md-code-background: $md-color-blue; 94 | $md-code-background-highlighted: #02171f; 95 | $md-code-color: #c2c6cf; 96 | 97 | // Keystrokes 98 | $md-keyboard-background: #fcfcfc; 99 | $md-keyboard-color: #555555; 100 | 101 | $md-code-background-inline: $md-color-black--lightest; 102 | $md-code-color-inline: $md-color-black--light; 103 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/base/_icons.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Rules 3 | // ---------------------------------------------------------------------------- 4 | 5 | // Icon placeholders 6 | %md-icon { 7 | font-family: 'Font Awesome 6 Free'; 8 | font-style: normal; 9 | font-variant: normal; 10 | font-weight: normal; 11 | line-height: 1; 12 | text-transform: none; 13 | white-space: nowrap; 14 | word-wrap: normal; 15 | direction: ltr; 16 | 17 | // Icon rendered as button 18 | &__button { 19 | display: inline-block; 20 | margin: $md-icon-margin; 21 | padding: $md-icon-padding; 22 | font-size: $md-icon-size; 23 | cursor: pointer; 24 | } 25 | } 26 | 27 | // Representational classes 28 | .md-icon { 29 | @extend %md-icon; 30 | 31 | // Build representational classes 32 | @each $ligature, 33 | $name 34 | in ( 35 | '\F060': 'arrow-back', 36 | '\F061': 'arrow-forward', 37 | '\F0C9': 'menu', 38 | '\F002': 'search' 39 | ) 40 | { 41 | &--#{$name}::before { 42 | content: $ligature; 43 | } 44 | } 45 | 46 | // Adjust for RTL languages 47 | [dir='rtl'] & { 48 | // Flip ligatures for arrows 49 | @each $ligature, 50 | $name 51 | in ( 52 | '\F061': 'arrow-back', 53 | '\F060': 'arrow-forward' 54 | ) 55 | { 56 | &--#{$name}::before { 57 | content: $ligature; 58 | } 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/base/_reset.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Rules 3 | // ---------------------------------------------------------------------------- 4 | 5 | // Enforce correct box model 6 | html { 7 | box-sizing: border-box; 8 | } 9 | 10 | // All elements shall inherit the document default 11 | *, 12 | *::before, 13 | *::after { 14 | box-sizing: inherit; 15 | } 16 | 17 | // Prevent adjustments of font size after orientation changes in IE and iOS 18 | html { 19 | text-size-adjust: none; 20 | } 21 | 22 | // Remove margin in all browsers 23 | body { 24 | margin: 0; 25 | } 26 | 27 | // Reset horizontal rules in FF 28 | hr { 29 | overflow: visible; 30 | box-sizing: content-box; 31 | } 32 | 33 | // Remove gaps in underlined links in iOS >= 8 and Safari >= 8 34 | a { 35 | -webkit-text-decoration-skip: objects; 36 | } 37 | 38 | // Reset tap outlines on iOS and Android 39 | a, 40 | button, 41 | label, 42 | input { 43 | -webkit-tap-highlight-color: transparent; 44 | } 45 | 46 | // Reset link styles 47 | a { 48 | color: inherit; 49 | text-decoration: none; 50 | } 51 | 52 | // Normalize font-size in all browsers 53 | small { 54 | font-size: 80%; 55 | } 56 | 57 | // Prevent subscript and superscript from affecting line-height 58 | sub, 59 | sup { 60 | position: relative; 61 | font-size: 80%; 62 | line-height: 0; 63 | vertical-align: baseline; 64 | } 65 | 66 | // Correct subscript offset 67 | sub { 68 | bottom: -0.25em; 69 | } 70 | 71 | // Correct superscript offset 72 | sup { 73 | top: -0.5em; 74 | } 75 | 76 | // Remove borders on images 77 | img { 78 | border-style: none; 79 | } 80 | 81 | // Reset table styles 82 | table { 83 | border-collapse: separate; 84 | border-spacing: 0; 85 | } 86 | 87 | // Reset table cell styles 88 | td, 89 | th { 90 | font-weight: normal; 91 | vertical-align: top; 92 | } 93 | 94 | // Reset (native) button styles 95 | button { 96 | margin: 0; 97 | padding: 0; 98 | border: 0; 99 | outline-style: none; 100 | background: transparent; 101 | font-size: inherit; 102 | } 103 | 104 | // Reset (native) input styles 105 | input { 106 | border: 0; 107 | outline: 0; 108 | } 109 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/_alert.scss: -------------------------------------------------------------------------------- 1 | .alert { 2 | border-radius: 4px; 3 | padding: 12px 16px; 4 | color: #002835; 5 | line-height: 1.6; 6 | position: relative; 7 | margin-top: 2rem; 8 | font-size: 16px; 9 | 10 | display: flex; 11 | align-items: center; 12 | gap: 12px; 13 | 14 | &.deprecatedBanner { 15 | vertical-align: middle; 16 | } 17 | 18 | p { 19 | margin-top: 0; 20 | margin-bottom: 0; 21 | } 22 | 23 | .content { 24 | overflow: auto; 25 | flex: 1; 26 | 27 | display: flex; 28 | flex-direction: column; 29 | } 30 | 31 | &.alert-success { 32 | background: $clr-blue-100; 33 | 34 | .fa-circle-check { 35 | color: $clr-blue-900; 36 | } 37 | } 38 | 39 | &.alert-info { 40 | background: $clr-green-100; 41 | 42 | .fa-circle-info { 43 | color: $clr-green-900; 44 | } 45 | } 46 | 47 | &.alert-warning { 48 | background: $clr-orange-100; 49 | 50 | a { 51 | color: #002835; 52 | text-decoration: underline; 53 | } 54 | 55 | .fa-triangle-exclamation { 56 | color: $clr-brown-700; 57 | } 58 | } 59 | 60 | &.alert-message { 61 | background: $clr-blue-50; 62 | padding: 20px 20px; 63 | 64 | a { 65 | color: #002835; 66 | text-decoration: underline; 67 | } 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/_badge.scss: -------------------------------------------------------------------------------- 1 | .vp-badge { 2 | display: inline-block; 3 | vertical-align: top; 4 | 5 | height: 18px; 6 | padding: 0 6px; 7 | border-radius: 3px; 8 | 9 | background: $md-color-accent; 10 | color: $md-color-white; 11 | 12 | font-size: 14px; 13 | line-height: 18px; 14 | 15 | transition: 16 | background 0.25s, 17 | color 0.25s; 18 | 19 | & + & { 20 | margin-inline-start: 5px; 21 | } 22 | 23 | &.tip { 24 | background: $clr-green-50; 25 | color: $clr-green-900; 26 | } 27 | 28 | &.warning, 29 | &.warn { 30 | background: $clr-yellow-100; 31 | color: $clr-deep-orange-900; 32 | } 33 | 34 | &.danger, 35 | &.error { 36 | background: $clr-red-50; 37 | color: $clr-red-900; 38 | } 39 | 40 | &.important { 41 | background: $clr-purple-50; 42 | color: $clr-purple-900; 43 | } 44 | 45 | &.info { 46 | background: $clr-blue-50; 47 | color: $clr-blue-900; 48 | } 49 | 50 | &.note { 51 | background: $clr-grey-100; 52 | color: $clr-grey-900; 53 | } 54 | 55 | // update the vertical align for the badge in toc 56 | .table-of-contents & { 57 | vertical-align: middle; 58 | } 59 | } -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/_docsearch.scss: -------------------------------------------------------------------------------- 1 | @use "sass:color"; 2 | 3 | .DocSearch { 4 | // Common 5 | --docsearch-primary-color: #{$md-color-pink}; 6 | --docsearch-text-color: #{$md-color-white}; 7 | --docsearch-highlight-color: var(--docsearch-primary-color); 8 | --docsearch-icon-color: var(--docsearch-text-color); 9 | 10 | // Modal 11 | --docsearch-modal-background: #{$md-color-white}; 12 | 13 | // Searchbox 14 | --docsearch-searchbox-background: #{color.scale($md-color-blue, $lightness: -30%)}; 15 | --docsearch-searchbox-focus-background: #{$md-color-blue}; 16 | --docsearch-searchbox-shadow: inset 0 0 0 2px #{color.scale($md-color-blue, $saturation: -50%, $lightness: 30%)}; 17 | 18 | // Key 19 | --docsearch-key-gradient: linear-gradient( 20 | -225deg, 21 | #{md-color-black--light} 0%, 22 | #{md-color-black} 100% 23 | ); 24 | --docsearch-key-shadow: inset 0 -2px 0 0 #{$md-color-blue}, inset 0 0 1px 1px #{$md-color-blue}, 0 2px 2px 0 #{$md-color-black--lighter}; 25 | --docsearch-key-pressed-shadow: inset 0 0 1px 1px #{$md-color-blue}, 0 2px 2px 0 #{$md-color-black--lighter}; 26 | } 27 | 28 | .DocSearch { 29 | font-size: 1.5rem; 30 | 31 | kbd { 32 | font-size: 1.2rem; 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/_external-links.scss: -------------------------------------------------------------------------------- 1 | .md-main { 2 | // External links in main content 3 | a { 4 | &[href*="://"], 5 | &[target=_blank] { 6 | &::after { 7 | content: ''; 8 | 9 | display: inline-block; 10 | flex-shrink: 0; 11 | 12 | width: 11px; 13 | height: 11px; 14 | margin-top: -2px; 15 | margin-left: 4px; 16 | margin-right: 2px; 17 | 18 | background: $clr-blue-grey-500; 19 | 20 | $external-link-mask-image: url("data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20viewBox%3D%220%200%20512%20512%22%3E%3C%21--%21Font%20Awesome%20Free%206.6.0%20by%20%40fontawesome%20-%20https%3A%2F%2Ffontawesome.com%20License%20-%20https%3A%2F%2Ffontawesome.com%2Flicense%2Ffree%20Copyright%202024%20Fonticons%2C%20Inc.--%3E%3Cpath%20d%3D%22M320%200c-17.7%200-32%2014.3-32%2032s14.3%2032%2032%2032l82.7%200L201.4%20265.4c-12.5%2012.5-12.5%2032.8%200%2045.3s32.8%2012.5%2045.3%200L448%20109.3l0%2082.7c0%2017.7%2014.3%2032%2032%2032s32-14.3%2032-32l0-160c0-17.7-14.3-32-32-32L320%200zM80%2032C35.8%2032%200%2067.8%200%20112L0%20432c0%2044.2%2035.8%2080%2080%2080l320%200c44.2%200%2080-35.8%2080-80l0-112c0-17.7-14.3-32-32-32s-32%2014.3-32%2032l0%20112c0%208.8-7.2%2016-16%2016L80%20448c-8.8%200-16-7.2-16-16l0-320c0-8.8%207.2-16%2016-16l112%200c17.7%200%2032-14.3%2032-32s-14.3-32-32-32L80%2032z%22%2F%3E%3C%2Fsvg%3E"); 21 | -webkit-mask-image: $external-link-mask-image; 22 | mask-image: $external-link-mask-image; 23 | } 24 | } 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/_footnotes.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Rules 3 | // ---------------------------------------------------------------------------- 4 | 5 | // Scoped in typesetted content to match specificity of regular content 6 | .md-typeset { 7 | // All footnote references 8 | [id^='fnref:'] { 9 | display: inline-block; 10 | 11 | // Targeted anchor 12 | &:target { 13 | margin-top: -(4.8rem + 1.2rem + 1.6rem); 14 | padding-top: (4.8rem + 1.2rem + 1.6rem); 15 | pointer-events: none; 16 | } 17 | } 18 | 19 | // All footnote back references 20 | [id^='fn:'] { 21 | // Add spacing to anchor for offset 22 | &::before { 23 | display: none; 24 | height: 0; 25 | content: ''; 26 | } 27 | 28 | // Targeted anchor 29 | &:target::before { 30 | display: block; 31 | margin-top: -(4.8rem + 1.2rem + 1rem); 32 | padding-top: (4.8rem + 1.2rem + 1rem); 33 | pointer-events: none; 34 | } 35 | } 36 | 37 | // Footnotes extension 38 | .footnote { 39 | color: $md-color-black--light; 40 | font-size: ms(-1); 41 | 42 | // Remove additional spacing on footnotes 43 | ol { 44 | margin-left: 0; 45 | } 46 | 47 | // Footnote 48 | li { 49 | transition: color 0.25s; 50 | 51 | // Darken color for targeted footnote 52 | &:target { 53 | color: $md-color-black; 54 | } 55 | 56 | // Remove spacing on first element 57 | :first-child { 58 | margin-top: 0; 59 | } 60 | 61 | // Make back references visible on hover 62 | &:hover .footnote-backref, 63 | &:target .footnote-backref { 64 | transform: translateX(0); 65 | opacity: 1; 66 | } 67 | 68 | // Active or targeted back reference 69 | &:hover .footnote-backref:hover, 70 | &:target .footnote-backref { 71 | color: $md-color-accent; 72 | } 73 | } 74 | } 75 | 76 | // Footnote reference 77 | .footnote-ref { 78 | display: inline-block; 79 | pointer-events: initial; 80 | 81 | // Render a thin line before footnote 82 | &::before { 83 | display: inline; 84 | margin: 0 0.2em; 85 | border-left: 0.1rem solid $md-color-black--lighter; 86 | font-size: 1.25em; 87 | content: ''; 88 | vertical-align: -0.5rem; 89 | } 90 | } 91 | 92 | // Footnote back reference 93 | .footnote-backref { 94 | @extend %md-icon; 95 | 96 | display: inline-block; 97 | transform: translateX(0.5rem); 98 | transition: transform 0.25s 0.125s, color 0.25s, opacity 0.125s 0.125s; 99 | color: $md-color-black--lighter; 100 | // Hack: remove Unicode arrow for icon 101 | font-size: 0; 102 | opacity: 0; 103 | vertical-align: text-bottom; 104 | 105 | // Adjust for RTL languages 106 | [dir='rtl'] & { 107 | transform: translateX(-0.5rem); 108 | } 109 | 110 | // Back reference icon 111 | &::before { 112 | display: inline-block; 113 | font-size: 1.6rem; 114 | content: '\F100'; // angles-left 115 | 116 | // Adjust for RTL languages 117 | [dir='rtl'] & { 118 | transform: scaleX(-1); 119 | } 120 | } 121 | } 122 | } 123 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/_material-shadows.scss: -------------------------------------------------------------------------------- 1 | // 2 | // Name: Material Shadows 3 | // Description: Mixins for Material Design Shadows. 4 | // Version: 3.0.1 5 | // 6 | // Author: Denis Malinochkin 7 | // Git: https://github.com/mrmlnc/material-shadows 8 | // 9 | // twitter: @mrmlnc 10 | // 11 | // ------------------------------------ 12 | 13 | // Mixins 14 | // ------------------------------------ 15 | 16 | @mixin z-depth-transition() { 17 | transition: box-shadow 0.28s cubic-bezier(0.4, 0, 0.2, 1); 18 | } 19 | 20 | @mixin z-depth-focus() { 21 | box-shadow: 0 0 8px rgba(0, 0, 0, 0.18), 0 8px 16px rgba(0, 0, 0, 0.36); 22 | } 23 | 24 | @mixin z-depth-2dp() { 25 | box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 26 | 0 3px 1px -2px rgba(0, 0, 0, 0.2); 27 | } 28 | 29 | @mixin z-depth-3dp() { 30 | box-shadow: 0 3px 4px 0 rgba(0, 0, 0, 0.14), 0 1px 8px 0 rgba(0, 0, 0, 0.12), 31 | 0 3px 3px -2px rgba(0, 0, 0, 0.4); 32 | } 33 | 34 | @mixin z-depth-4dp() { 35 | box-shadow: 0 4px 5px 0 rgba(0, 0, 0, 0.14), 0 1px 10px 0 rgba(0, 0, 0, 0.12), 36 | 0 2px 4px -1px rgba(0, 0, 0, 0.4); 37 | } 38 | 39 | @mixin z-depth-6dp() { 40 | box-shadow: 0 6px 10px 0 rgba(0, 0, 0, 0.14), 0 1px 18px 0 rgba(0, 0, 0, 0.12), 41 | 0 3px 5px -1px rgba(0, 0, 0, 0.4); 42 | } 43 | 44 | @mixin z-depth-8dp() { 45 | box-shadow: 0 8px 10px 1px rgba(0, 0, 0, 0.14), 46 | 0 3px 14px 2px rgba(0, 0, 0, 0.12), 0 5px 5px -3px rgba(0, 0, 0, 0.4); 47 | } 48 | 49 | @mixin z-depth-16dp() { 50 | box-shadow: 0 16px 24px 2px rgba(0, 0, 0, 0.14), 51 | 0 6px 30px 5px rgba(0, 0, 0, 0.12), 0 8px 10px -5px rgba(0, 0, 0, 0.4); 52 | } 53 | 54 | @mixin z-depth-24dp() { 55 | box-shadow: 0 9px 46px 8px rgba(0, 0, 0, 0.14), 56 | 0 24px 38px 3px rgba(0, 0, 0, 0.12), 0 11px 15px -7px rgba(0, 0, 0, 0.4); 57 | } 58 | 59 | @mixin z-depth($dp: 2) { 60 | @if $dp == 2 { 61 | @include z-depth-2dp(); 62 | } @else if $dp == 3 { 63 | @include z-depth-3dp(); 64 | } @else if $dp == 4 { 65 | @include z-depth-4dp(); 66 | } @else if $dp == 6 { 67 | @include z-depth-6dp(); 68 | } @else if $dp == 8 { 69 | @include z-depth-8dp(); 70 | } @else if $dp == 16 { 71 | @include z-depth-16dp(); 72 | } @else if $dp == 24 { 73 | @include z-depth-24dp(); 74 | } 75 | } 76 | 77 | // Class generator 78 | // ------------------------------------ 79 | 80 | @mixin z-depth-classes($transition: false, $focus: false) { 81 | @if $transition == true { 82 | &-transition { 83 | @include z-depth-transition(); 84 | } 85 | } 86 | 87 | @if $focus == true { 88 | &-focus { 89 | @include z-depth-focus(); 90 | } 91 | } 92 | 93 | // The available values for the shadow depth 94 | @each $depth in 2, 3, 4, 6, 8, 16, 24 { 95 | &-#{$depth}dp { 96 | @include z-depth($depth); 97 | } 98 | } 99 | } 100 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/_menuDropdown.scss: -------------------------------------------------------------------------------- 1 | .MenuDropdown { 2 | &-title { 3 | cursor: pointer; 4 | 5 | .fa-caret-down { 6 | margin-left: 4px; 7 | } 8 | } 9 | 10 | &.active:after { 11 | content: ''; 12 | width: 100%; 13 | transition: width 0.3s; 14 | height: 1px; 15 | display: block; 16 | background-color: white; 17 | } 18 | 19 | &-list { 20 | display: none; 21 | padding: 1.5em 1em 1em 1em; 22 | position: fixed; 23 | background-color: #002835; 24 | color: white; 25 | list-style: none; 26 | border-bottom-left-radius: 4px; 27 | border-bottom-right-radius: 4px; 28 | margin-top: 1px; 29 | 30 | &.visible { 31 | display: block; 32 | } 33 | } 34 | 35 | &-list-item { 36 | line-height: 2.2em; 37 | font-size: 0.9em; 38 | } 39 | 40 | &-list-item-link { 41 | &:hover, 42 | &.active { 43 | padding-bottom: 2px; 44 | border-bottom: 1px solid rgba(255, 255, 255, 0.8); 45 | } 46 | } 47 | } 48 | 49 | @include break-to-device(tablet) { 50 | .MenuDropdown { 51 | &-title { 52 | cursor: default; 53 | 54 | svg { 55 | display: none; 56 | } 57 | } 58 | 59 | &.active:after, 60 | &:hover:after { 61 | width: 0%; 62 | } 63 | 64 | &-list { 65 | display: block; 66 | position: relative; 67 | top: 0; 68 | padding-top: 0.5em; 69 | } 70 | } 71 | } 72 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/_permalinks.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Rules 3 | // ---------------------------------------------------------------------------- 4 | 5 | // Scoped in typesetted content to match specificity of regular content 6 | .md-typeset { 7 | // Permalinks extension 8 | .headerlink { 9 | display: inline-block; 10 | margin-left: 1rem; 11 | transform: translate(0, 0.5rem); 12 | transition: transform 0.25s 0.25s, color 0.25s, opacity 0.125s 0.25s; 13 | opacity: 0; 14 | 15 | // Adjust for RTL languages 16 | [dir='rtl'] & { 17 | margin-right: 1rem; 18 | margin-left: initial; 19 | } 20 | 21 | // Higher specificity for color due to palettes integration 22 | html body & { 23 | color: $md-color-black--lighter; 24 | } 25 | 26 | // Hide for print 27 | @media print { 28 | display: none; 29 | } 30 | } 31 | 32 | // Correct anchor offset for link blurring 33 | @each $level, 34 | $delta 35 | in ( 36 | h1: 4rem, 37 | h2: 3.8rem, 38 | h3: 0.9rem, 39 | h4: 0.9rem, 40 | h5: 1.1rem, 41 | h6: 1.1rem 42 | ) 43 | { 44 | #{$level}[id] { 45 | // Scroll 48px from header, 12px from sidebar offset 46 | scroll-margin-top: (4.8rem + 1.2rem + $delta); 47 | 48 | // Make permalink visible on hover 49 | &:hover .headerlink, 50 | &:target .headerlink, 51 | & .headerlink:focus { 52 | transform: translate(0, 0); 53 | opacity: 1; 54 | } 55 | 56 | // Active or targeted permalink 57 | &:hover .headerlink:hover, 58 | &:target .headerlink, 59 | & .headerlink:focus { 60 | color: $md-color-accent; 61 | } 62 | } 63 | } 64 | 65 | .heading-anchor-link { 66 | opacity: 0.2; 67 | color: $md-color-pink; 68 | 69 | &:hover { 70 | opacity: 1; 71 | color: $md-color-pink; 72 | } 73 | } 74 | 75 | } 76 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/_ribbon.scss: -------------------------------------------------------------------------------- 1 | .ribbon { 2 | position: absolute; 3 | right: -5px; 4 | top: -5px; 5 | z-index: 1; 6 | overflow: hidden; 7 | width: 75px; 8 | height: 75px; 9 | text-align: right; 10 | } 11 | .ribbon span { 12 | font-size: 10px; 13 | font-weight: bold; 14 | color: #fff; 15 | text-transform: uppercase; 16 | text-align: center; 17 | line-height: 20px; 18 | transform: rotate(45deg); 19 | -webkit-transform: rotate(45deg); 20 | width: 100px; 21 | display: block; 22 | background: #79a70a; 23 | background: linear-gradient(#e94e77 0%, #e94e77 100%); 24 | box-shadow: 0 3px 10px -5px rgba(0, 0, 0, 1); 25 | position: absolute; 26 | top: 19px; 27 | right: -21px; 28 | } 29 | .ribbon span::before { 30 | content: ''; 31 | position: absolute; 32 | left: 0px; 33 | top: 100%; 34 | z-index: -1; 35 | border-left: 3px solid #e94e77; 36 | border-right: 3px solid transparent; 37 | border-bottom: 3px solid transparent; 38 | border-top: 3px solid #e94e77; 39 | } 40 | .ribbon span::after { 41 | content: ''; 42 | position: absolute; 43 | right: 0px; 44 | top: 100%; 45 | z-index: -1; 46 | border-left: 3px solid transparent; 47 | border-right: 3px solid #e94e77; 48 | border-bottom: 3px solid transparent; 49 | border-top: 3px solid #e94e77; 50 | } 51 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/_sdk-selector.scss: -------------------------------------------------------------------------------- 1 | .api { 2 | padding: 6px !important; 3 | margin: 20px; 4 | border-radius: 4px; 5 | border: 2px solid $clr-indigo; 6 | background-color: $clr-indigo; 7 | color: white; 8 | text-align: center; 9 | transition: background-color 0.1s linear; 10 | } 11 | .api:hover { 12 | opacity: 0.8; 13 | } 14 | .disabled { 15 | pointer-events: none; 16 | opacity: 0.3; 17 | } 18 | .selector { 19 | font-size: 15px; 20 | cursor: pointer; 21 | 22 | &-selectedItem { 23 | border-bottom: 1px solid rgba(233, 78, 119, 0.3); 24 | padding: 10px 10px 5px; 25 | 26 | &-icon { 27 | position: relative; 28 | top: 4px; 29 | width: 22px; 30 | height: 22px; 31 | margin-right: 8px; 32 | } 33 | i { 34 | color: #55595c; 35 | } 36 | } 37 | } 38 | .selector-list { 39 | position: absolute; 40 | width: 80%; 41 | background-color: white; 42 | box-shadow: 0 2px 5px 0 rgba(0, 0, 0, 0.16), 0 2px 10px 0 rgba(0, 0, 0, 0.12); 43 | padding: 0; 44 | margin-top: 0; 45 | transform-origin: 50% 0; 46 | transition: transform 0.1s linear, opacity 0.1s linear; 47 | 48 | @include break-to-device(tablet) { 49 | height: 250px; 50 | overflow-y: scroll; 51 | } 52 | 53 | &-opened { 54 | transform: scaleY(1); 55 | opacity: 1; 56 | } 57 | &-closed { 58 | transform: scaleY(0); 59 | opacity: 0; 60 | } 61 | &-item { 62 | width: 100%; 63 | list-style-type: none; 64 | &-link { 65 | display: block; 66 | height: 100%; 67 | padding: 12px; 68 | } 69 | &-icon { 70 | position: relative; 71 | top: 4px; 72 | width: 22px; 73 | height: 22px; 74 | margin-right: 8px; 75 | } 76 | &:hover { 77 | background-color: #ddd; 78 | } 79 | } 80 | } 81 | 82 | .selector-majorVersion { 83 | .selector-selectedItem { 84 | border: none; 85 | padding: 0; 86 | font-size: 1.7rem; 87 | text-align: center; 88 | 89 | .selector-selectedItem-name { 90 | font-size: 22px; 91 | position: relative; 92 | border-radius: 0.2rem; 93 | line-height: 3rem; 94 | 95 | @include break-from-device(screen) { 96 | font-size: 22px; 97 | } 98 | 99 | &:hover { 100 | background-color: $md-color-white--lightest; 101 | } 102 | 103 | &-wrapper { 104 | border-bottom: 1px solid #6c7a79; 105 | } 106 | } 107 | 108 | .fa-caret-down { 109 | color: white; 110 | margin-left: 6px; 111 | } 112 | } 113 | 114 | .selector-list { 115 | position: fixed; 116 | width: 135px; 117 | height: auto; 118 | text-align: center; 119 | z-index: 10; 120 | 121 | .selector-list-item-link { 122 | color: $clr-indigo; 123 | } 124 | } 125 | } 126 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/_tiles.scss: -------------------------------------------------------------------------------- 1 | .Tiles { 2 | display: grid; 3 | grid-template-columns: repeat(auto-fill, minmax(170px, 1fr)); 4 | grid-gap: 2rem; 5 | 6 | &-item { 7 | padding: 15px 5px 5px 5px; 8 | border-radius: 0.2rem; 9 | box-shadow: 0 2px 2px 0 rgba(0, 0, 0, 0.14), 0 1px 5px 0 rgba(0, 0, 0, 0.12), 10 | 0 3px 1px -2px rgba(0, 0, 0, 0.2); 11 | background-image: linear-gradient(to top, #f5f5fa, #fff); 12 | text-align: center; 13 | position: relative; 14 | 15 | display: flex; 16 | flex-direction: column; 17 | 18 | justify-content: center; 19 | align-items: center; 20 | 21 | width: 100%; 22 | height: 100%; 23 | 24 | &.min { 25 | width: 11%; 26 | height: 11%; 27 | } 28 | 29 | &.medium { 30 | width: 180px; 31 | height: 130px; 32 | } 33 | } 34 | 35 | &-item:last-of-type { 36 | margin-right: 0; 37 | } 38 | 39 | &-item-logo { 40 | width: 70%; 41 | height: 70%; 42 | position: relative; 43 | margin: 0; 44 | } 45 | 46 | &-item-name { 47 | color: $md-color-blue; 48 | margin-top: 0.5rem; 49 | } 50 | 51 | &-item:hover { 52 | top: -2px; 53 | left: -1px; 54 | 55 | &.min { 56 | top: 0px; 57 | left: 0px; 58 | } 59 | 60 | .Languages-item-name { 61 | color: $md-color-pink; 62 | } 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/modularscale/_function.scss: -------------------------------------------------------------------------------- 1 | @function ms-function( 2 | $v: 0, 3 | $base: false, 4 | $ratio: false, 5 | $thread: false, 6 | $settings: $modularscale 7 | ) { 8 | // Parse settings 9 | $ms-settings: ms-settings($base, $ratio, $thread, $settings); 10 | $base: nth($ms-settings, 1); 11 | $ratio: nth($ms-settings, 2); 12 | 13 | // Render target values from settings. 14 | @if unit($ratio) != '' { 15 | $ratio: ms-target($ratio, $base); 16 | } 17 | 18 | // Fast calc if not multi stranded 19 | @if (length($base) == 1) { 20 | @return ms-round-px(ms-pow($ratio, $v) * $base); 21 | } 22 | 23 | // Create new base array 24 | $ms-bases: nth($base, 1); 25 | 26 | // Normalize base values 27 | @for $i from 2 through length($base) { 28 | // initial base value 29 | $ms-base: nth($base, $i); 30 | // If the base is bigger than the main base 31 | @if ($ms-base > nth($base, 1)) { 32 | // divide the value until it aligns with main base. 33 | @while ($ms-base > nth($base, 1)) { 34 | $ms-base: $ms-base / $ratio; 35 | } 36 | $ms-base: $ms-base * $ratio; 37 | } 38 | // If the base is smaller than the main base. 39 | @else if ($ms-base < nth($base,1)) { 40 | // pump up the value until it aligns with main base. 41 | @while $ms-base < nth($base, 1) { 42 | $ms-base: $ms-base * $ratio; 43 | } 44 | } 45 | // Push into new array 46 | $ms-bases: append($ms-bases, $ms-base); 47 | } 48 | 49 | // Sort array from smallest to largest. 50 | $ms-bases: ms-sort($ms-bases); 51 | 52 | // Find step to use in calculation 53 | $vtep: floor($v / length($ms-bases)); 54 | // Find base to use in calculation 55 | $ms-base: round(($v / length($ms-bases) - $vtep) * length($ms-bases)) + 1; 56 | 57 | @return ms-round-px(ms-pow($ratio, $vtep) * nth($ms-bases, $ms-base)); 58 | } 59 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/modularscale/_pow.scss: -------------------------------------------------------------------------------- 1 | // Sass does not have native pow() support so this needs to be added. 2 | // Compass and other libs implement this more extensively. 3 | // In order to keep this simple, use those when they are avalible. 4 | // Issue for pow() support in Sass: https://github.com/sass/sass/issues/684 5 | 6 | @function ms-pow($b, $e) { 7 | // Return 1 if exponent is 0 8 | @if $e == 0 { 9 | @return 1; 10 | } 11 | 12 | // If pow() exists (compass or mathsass) use that. 13 | @if function-exists('pow') { 14 | @return pow($b, $e); 15 | } 16 | 17 | // This does not support non-integer exponents, 18 | // Check and return an error if a non-integer exponent is passed. 19 | @if (floor($e) != $e) { 20 | @error 'Non-integer values are not supported in modularscale by default. Try using mathsass in your project to add non-integer scale support. https://github.com/terkel/mathsass'; 21 | } 22 | 23 | // Seed the return. 24 | $ms-return: $b; 25 | 26 | // Multiply or divide by the specified number of times. 27 | @if $e > 0 { 28 | @for $i from 1 to $e { 29 | $ms-return: $ms-return * $b; 30 | } 31 | } 32 | @if $e < 0 { 33 | @for $i from $e through 0 { 34 | $ms-return: calc($ms-return / $b); 35 | } 36 | } 37 | @return $ms-return; 38 | } 39 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/modularscale/_respond.scss: -------------------------------------------------------------------------------- 1 | // Generate calc() function 2 | // based on Mike Riethmuller's Precise control over responsive typography 3 | // http://madebymike.com.au/writing/precise-control-responsive-typography/ 4 | @function ms-fluid($val1: 1em, $val2: 1em, $break1: 0, $break2: 0) { 5 | $diff: ms-unitless($val2) - ms-unitless($val1); 6 | 7 | // v1 + (v2 - v1) * ( (100vw - b1) / b2 - b1 ) 8 | @return calc( 9 | #{$val1} + #{ms-unitless($val2) - ms-unitless($val1)} * 10 | ((100vw - #{$break1}) / #{ms-unitless($break2) - ms-unitless($break1)}) 11 | ); 12 | } 13 | 14 | // Main responsive mixin 15 | @mixin ms-respond($prop, $val, $map: $modularscale, $ms-important: false) { 16 | $base: $ms-base; 17 | $ratio: $ms-ratio; 18 | 19 | $first-write: true; 20 | $last-break: null; 21 | 22 | $important: ''; 23 | 24 | @if $ms-important == true { 25 | $important: ' !important'; 26 | } 27 | 28 | // loop through all settings with a breakpoint type value 29 | @each $v, $s in $map { 30 | @if type-of($v) == number { 31 | @if unit($v) != '' { 32 | // Write out the first value without a media query. 33 | @if $first-write { 34 | #{$prop}: ms-function($val, $thread: $v, $settings: $map) 35 | #{$important}; 36 | 37 | // Not the first write anymore, reset to false to move on. 38 | $first-write: false; 39 | $last-break: $v; 40 | } 41 | 42 | // Write intermediate breakpoints. 43 | @else { 44 | @media (min-width: $last-break) and (max-width: $v) { 45 | $val1: ms-function($val, $thread: $last-break, $settings: $map); 46 | $val2: ms-function($val, $thread: $v, $settings: $map); 47 | #{$prop}: ms-fluid($val1, $val2, $last-break, $v) #{$important}; 48 | } 49 | $last-break: $v; 50 | } 51 | } 52 | } 53 | } 54 | 55 | // Write the last breakpoint. 56 | @if $last-break { 57 | @media (min-width: $last-break) { 58 | #{$prop}: ms-function($val, $thread: $last-break, $settings: $map) #{$important}; 59 | } 60 | } 61 | } 62 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/modularscale/_round-px.scss: -------------------------------------------------------------------------------- 1 | // No reason to have decimal pixel values, 2 | // normalize them to whole numbers. 3 | 4 | @function ms-round-px($r) { 5 | @if unit($r) == 'px' { 6 | @return round($r); 7 | } 8 | @return $r; 9 | } 10 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/modularscale/_settings.scss: -------------------------------------------------------------------------------- 1 | // Parse settings starting with defaults. 2 | // Settings should cascade down like you would expect in CSS. 3 | // More specific overrides previous settings. 4 | 5 | @function ms-settings($b: false, $r: false, $t: false, $m: $modularscale) { 6 | $base: $ms-base; 7 | $ratio: $ms-ratio; 8 | $thread: map-get($m, $t); 9 | 10 | // Override with user settings 11 | @if map-get($m, base) { 12 | $base: map-get($m, base); 13 | } 14 | @if map-get($m, ratio) { 15 | $ratio: map-get($m, ratio); 16 | } 17 | 18 | // Override with thread settings 19 | @if $thread { 20 | @if map-get($thread, base) { 21 | $base: map-get($thread, base); 22 | } 23 | @if map-get($thread, ratio) { 24 | $ratio: map-get($thread, ratio); 25 | } 26 | } 27 | 28 | // Override with inline settings 29 | @if $b { 30 | $base: $b; 31 | } 32 | @if $r { 33 | $ratio: $r; 34 | } 35 | 36 | @return $base $ratio; 37 | } 38 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/modularscale/_sort.scss: -------------------------------------------------------------------------------- 1 | // Basic list sorting 2 | // Would like to replace with http://sassmeister.com/gist/30e4863bd03ce0e1617c 3 | // Unfortunately libsass has a bug with passing arguments into the min() funciton. 4 | 5 | @function ms-sort($l) { 6 | // loop until the list is confirmed to be sorted 7 | $sorted: false; 8 | @while $sorted == false { 9 | // Start with the assumption that the lists are sorted. 10 | $sorted: true; 11 | 12 | // Loop through the list, checking each value with the one next to it. 13 | // Swap the values if they need to be swapped. 14 | // Not super fast but simple and modular scale doesn't lean hard on sorting. 15 | @for $i from 2 through length($l) { 16 | $n1: nth($l, $i - 1); 17 | $n2: nth($l, $i); 18 | 19 | // If the first value is greater than the 2nd, swap them. 20 | @if $n1 > $n2 { 21 | $l: set-nth($l, $i, $n1); 22 | $l: set-nth($l, $i - 1, $n2); 23 | 24 | // The list isn't sorted and needs to be looped through again. 25 | $sorted: false; 26 | } 27 | } 28 | } 29 | 30 | // Return the sorted list. 31 | @return $l; 32 | } 33 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/modularscale/_strip-units.scss: -------------------------------------------------------------------------------- 1 | // Stripping units is not a best practice 2 | // This function should not be used elsewhere 3 | // It is used here because calc() doesn't do unit logic 4 | // AND target ratios use units as a hack to get a number. 5 | @function ms-unitless($val) { 6 | @return ($val / ($val - $val + 1)); 7 | } 8 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/modularscale/_sugar.scss: -------------------------------------------------------------------------------- 1 | // To attempt to avoid conflicts with other libraries 2 | // all funcitons are namespaced with `ms-`. 3 | // However, to increase usability, a shorthand function is included here. 4 | 5 | @function ms( 6 | $v: 0, 7 | $base: false, 8 | $ratio: false, 9 | $thread: false, 10 | $settings: $modularscale 11 | ) { 12 | @return ms-function($v, $base, $ratio, $thread, $settings); 13 | } 14 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/modularscale/_target.scss: -------------------------------------------------------------------------------- 1 | // Convert number string to number 2 | @function ms-to-num($n) { 3 | $l: str-length($n); 4 | $r: 0; 5 | $m: str-index($n, '.'); 6 | @if $m == null { 7 | $m: $l + 1; 8 | } 9 | // Loop through digits and convert to numbers 10 | @for $i from 1 through $l { 11 | $v: str-slice($n, $i, $i); 12 | @if $v == '1' { 13 | $v: 1; 14 | } 15 | @else if $v == '2' { 16 | $v: 2; 17 | } 18 | @else if $v == '3' { 19 | $v: 3; 20 | } 21 | @else if $v == '4' { 22 | $v: 4; 23 | } 24 | @else if $v == '5' { 25 | $v: 5; 26 | } 27 | @else if $v == '6' { 28 | $v: 6; 29 | } 30 | @else if $v == '7' { 31 | $v: 7; 32 | } 33 | @else if $v == '8' { 34 | $v: 8; 35 | } 36 | @else if $v == '9' { 37 | $v: 9; 38 | } 39 | @else if $v == '0' { 40 | $v: 0; 41 | } @else { 42 | $v: null; 43 | } 44 | @if $v != null { 45 | $m: $m - 1; 46 | $r: $r + ms-pow(10, $m - 1) * $v; 47 | } @else { 48 | $l: $l - 1; 49 | } 50 | } 51 | @return $r; 52 | } 53 | 54 | // Find a ratio based on a target value 55 | @function ms-target($t, $b) { 56 | // Convert to string 57 | $t: $t + ''; 58 | // Remove base units to calulate ratio 59 | $b: ms-unitless(nth($b, 1)); 60 | // Find where 'at' is in the string 61 | $at: str-index($t, 'at'); 62 | 63 | // Slice the value and target out 64 | // and convert strings to numbers 65 | $v: ms-to-num(str-slice($t, 0, $at - 1)); 66 | $t: ms-to-num(str-slice($t, $at + 2)); 67 | 68 | // Solve the modular scale function for the ratio. 69 | @return ms-pow(($v/$b), (1 / $t)); 70 | } 71 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/modularscale/_vars.scss: -------------------------------------------------------------------------------- 1 | // Ratios 2 | $double-octave: 4; 3 | $pi: 3.14159265359; 4 | $major-twelfth: 3; 5 | $major-eleventh: 2.666666667; 6 | $major-tenth: 2.5; 7 | $octave: 2; 8 | $major-seventh: 1.875; 9 | $minor-seventh: 1.777777778; 10 | $major-sixth: 1.666666667; 11 | $phi: 1.618034; 12 | $golden: $phi; 13 | $minor-sixth: 1.6; 14 | $fifth: 1.5; 15 | $augmented-fourth: 1.41421; 16 | $fourth: 1.333333333; 17 | $major-third: 1.25; 18 | $minor-third: 1.2; 19 | $major-second: 1.125; 20 | $minor-second: 1.066666667; 21 | 22 | // Base config 23 | $ms-base: 1em !default; 24 | $ms-ratio: $fifth !default; 25 | $modularscale: () !default; 26 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/pymdown/_arithmatex.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Rules 3 | // ---------------------------------------------------------------------------- 4 | 5 | // Scoped in typesetted content to match specificity of regular content 6 | .md-typeset { 7 | // MathJax integration - add padding to omit vertical scrollbar 8 | .MJXc-display { 9 | margin: 0.75em 0; 10 | padding: 0.75em 0; 11 | overflow: auto; 12 | -webkit-overflow-scrolling: touch; 13 | } 14 | 15 | // Stretch top-level containers 16 | > p > .MJXc-display { 17 | // [mobile -]: Stretch to whole width 18 | @include break-to-device(mobile) { 19 | margin: 0.75em -1.6rem; 20 | padding: 0.25em 1.6rem; 21 | } 22 | } 23 | 24 | // Remove outline on tab index 25 | .MathJax_CHTML { 26 | outline: 0; 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/pymdown/_critic.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Rules 3 | // ---------------------------------------------------------------------------- 4 | 5 | // Scoped in typesetted content to match specificity of regular content 6 | .md-typeset { 7 | // Deletions, additions and comments 8 | del.critic, 9 | ins.critic, 10 | .critic.comment { 11 | margin: 0 0.25em; 12 | padding: 0.0625em 0; 13 | border-radius: 0.2rem; 14 | box-decoration-break: clone; 15 | } 16 | 17 | // Deletion 18 | del.critic { 19 | background-color: $codehilite-diff-deleted; // TODO: dependent on order of inclusion 20 | box-shadow: +0.25em 0 0 $codehilite-diff-deleted, 21 | -0.25em 0 0 $codehilite-diff-deleted; 22 | } 23 | 24 | // Addition 25 | ins.critic { 26 | background-color: $codehilite-diff-inserted; // TODO: dependent on order of inclusion 27 | box-shadow: +0.25em 0 0 $codehilite-diff-inserted, 28 | -0.25em 0 0 $codehilite-diff-inserted; 29 | } 30 | 31 | // Comment 32 | .critic.comment { 33 | background-color: $md-code-background; // TODO: rename, centralize somehow 34 | color: $md-code-color; 35 | box-shadow: +0.25em 0 0 $md-code-background, -0.25em 0 0 $md-code-background; 36 | 37 | // Icon 38 | &::before { 39 | @extend %md-icon; 40 | 41 | padding-right: 0.125em; 42 | color: $md-color-black--lighter; 43 | content: '\F075'; // comment 44 | vertical-align: -0.125em; 45 | } 46 | } 47 | 48 | // Block 49 | .critic.block { 50 | display: block; 51 | margin: 1em 0; 52 | padding-right: 1.6rem; 53 | padding-left: 1.6rem; 54 | box-shadow: none; 55 | 56 | // Decrease spacing on first element 57 | :first-child { 58 | margin-top: 0.5em; 59 | } 60 | 61 | // Decrease spacing on last element 62 | :last-child { 63 | margin-bottom: 0.5em; 64 | } 65 | } 66 | } 67 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/pymdown/_details.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Rules 3 | // ---------------------------------------------------------------------------- 4 | 5 | // Scoped in typesetted content to match specificity of regular content 6 | .md-typeset { 7 | // Details extension 8 | details { 9 | @extend .admonition; 10 | 11 | display: block; 12 | padding-top: 0; 13 | 14 | // Rotate title icon 15 | &[open] > summary::after { 16 | transform: rotate(180deg); 17 | } 18 | 19 | // Remove bottom spacing 20 | &:not([open]) { 21 | padding-bottom: 0; 22 | 23 | // Remove bottom border if block is closed 24 | > summary { 25 | border-bottom: none; 26 | } 27 | } 28 | 29 | // Increase spacing to the right - scoped here for higher specificity 30 | summary { 31 | padding-right: 4rem; 32 | 33 | // Adjust for RTL languages 34 | [dir='rtl'] & { 35 | padding-left: 4rem; 36 | } 37 | } 38 | 39 | // Manually hide and show, if browser doesn't support details 40 | .no-details &:not([open]) { 41 | // Hide all nested tags ... 42 | > * { 43 | display: none; 44 | } 45 | 46 | // ... but show title 47 | summary { 48 | display: block; 49 | } 50 | } 51 | } 52 | 53 | // Title 54 | summary { 55 | @extend .admonition-title; 56 | 57 | // Hack: set to block, so Firefox doesn't render marker 58 | display: block; 59 | outline: none; 60 | cursor: pointer; 61 | 62 | // Remove default details marker 63 | &::-webkit-details-marker { 64 | display: none; 65 | } 66 | 67 | // Icon 68 | &::after { 69 | @extend %md-icon; 70 | 71 | position: absolute; 72 | top: 1rem; 73 | right: 1.5rem; 74 | color: $md-color-black--lighter; 75 | font-size: 1.5rem; 76 | content: '\F107'; // angle-down 77 | 78 | // Adjust for RTL languages 79 | [dir='rtl'] & { 80 | right: initial; 81 | left: 1.2rem; 82 | } 83 | } 84 | } 85 | } 86 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/pymdown/_emoji.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Rules 3 | // ---------------------------------------------------------------------------- 4 | 5 | // Scoped in typesetted content to match specificity of regular content 6 | .md-typeset { 7 | // Correct alignment of emojis 8 | .emojione { 9 | width: 2rem; 10 | vertical-align: text-top; 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/pymdown/_inlinehilite.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Rules 3 | // ---------------------------------------------------------------------------- 4 | 5 | // Scoped in typesetted content to match specificity of regular content 6 | .md-typeset { 7 | // Qualified class selector to distinguish inline code from code blocks 8 | code.codehilite { 9 | $correct: calc(1 / 0.85); 10 | 11 | margin: 0 0.25em * $correct; 12 | padding: 0.0625em * $correct 0; 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/extensions/pymdown/_tasklist.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Rules 3 | // ---------------------------------------------------------------------------- 4 | 5 | // Scoped in typesetted content to match specificity of regular content 6 | .md-typeset { 7 | // Remove list icon on task items 8 | .task-list-item { 9 | position: relative; 10 | list-style-type: none; 11 | 12 | // Make checkbox items align with normal list items, but position 13 | // everything in ems for correct layout at smaller font sizes 14 | [type='checkbox'] { 15 | position: absolute; 16 | top: 0.45em; 17 | left: -2em; 18 | 19 | // Adjust for RTL languages 20 | [dir='rtl'] & { 21 | right: -2em; 22 | left: initial; 23 | } 24 | } 25 | } 26 | 27 | // Wrapper for list controls, in case custom checkboxes are enabled 28 | .task-list-control { 29 | // Checkbox icon in unchecked state 30 | .task-list-indicator::before { 31 | @extend %md-icon; 32 | 33 | position: absolute; 34 | top: 0.15em; 35 | left: -1.25em; 36 | color: $md-color-black--lighter; 37 | font-size: 1.25em; 38 | content: '\F0C8'; // square 39 | vertical-align: -0.25em; 40 | 41 | // Adjust for RTL languages 42 | [dir='rtl'] & { 43 | right: -1.25em; 44 | left: initial; 45 | } 46 | } 47 | 48 | // Checkbox icon in checked state 49 | [type='checkbox']:checked + .task-list-indicator::before { 50 | content: '\F14A'; // square-check 51 | } 52 | 53 | // Hide original checkbox behind icon 54 | [type='checkbox'] { 55 | opacity: 0; 56 | z-index: -1; 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/helpers/_px2em.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Helpers 3 | // ---------------------------------------------------------------------------- 4 | 5 | /// 6 | /// Convert font size in px to em. 7 | /// 8 | /// @group helpers 9 | /// @access public 10 | /// @param {Number} $size Font size in px 11 | /// @param {Number} $base Base font size 12 | /// @return {Number} Font size in em 13 | /// 14 | @function px2em($size, $base: 16px) { 15 | @if unit($size) == px { 16 | @if unit($base) == px { 17 | @return calc($size / $base) * 1em; 18 | } @else { 19 | @error "Invalid base: #{$base} - unit must be 'px'"; 20 | } 21 | } @else { 22 | @error "Invalid size: #{$size} - unit must be 'px'"; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/layout/_content.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Rules 3 | // ---------------------------------------------------------------------------- 4 | 5 | // Content container 6 | $content-margin: 26rem; 7 | 8 | .md-content { 9 | // [tablet landscape +]: Add space for table of contents 10 | @include break-from-device(tablet landscape) { 11 | margin-right: $content-margin; 12 | 13 | // Adjust for RTL languages 14 | [dir='rtl'] & { 15 | margin-right: initial; 16 | margin-left: $content-margin; 17 | } 18 | } 19 | 20 | // [screen +]: Add space for table of contents 21 | @include break-from-device(screen) { 22 | margin-left: $content-margin; 23 | 24 | // Adjust for RTL languages 25 | [dir='rtl'] & { 26 | margin-right: $content-margin; 27 | } 28 | } 29 | 30 | // Define spacing 31 | &__inner { 32 | margin: 0 1.6rem 2.4rem; 33 | padding-top: 1.2rem; 34 | 35 | // [screen +]: Increase horizontal spacing 36 | @include break-from-device(screen) { 37 | margin-right: 0; 38 | margin-left: 0; 39 | } 40 | 41 | // Hack: add pseudo element for spacing, as the overflow of the content 42 | // container may not be hidden due to an imminent offset error on targets 43 | &::before { 44 | display: block; 45 | height: 0.8rem; 46 | content: ''; 47 | } 48 | 49 | // Hack: remove bottom spacing of last element, due to margin collapse 50 | > :last-child { 51 | margin-bottom: 0; 52 | } 53 | } 54 | 55 | // Icons 56 | &__icon { 57 | @extend %md-icon__button; 58 | 59 | position: relative; 60 | margin: 0.8rem 0; 61 | padding: 0; 62 | float: right; 63 | 64 | // Override default link color for icons 65 | .md-typeset & { 66 | color: $md-color-black--lighter; 67 | } 68 | 69 | // Hide for print 70 | @media print { 71 | display: none; 72 | } 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/layout/_hero.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Rules 3 | // ---------------------------------------------------------------------------- 4 | 5 | // Hero teaser 6 | .md-hero { 7 | transition: background 0.25s; 8 | background-color: $md-color-primary; 9 | color: $md-color-white; 10 | font-size: ms(1); 11 | overflow: hidden; 12 | 13 | // Inner wrapper 14 | &__inner { 15 | margin-top: 2rem; 16 | padding: 1.6rem 1.6rem 0.8rem; 17 | transition: transform 0.4s cubic-bezier(0.1, 0.7, 0.1, 1), opacity 0.25s; 18 | transition-delay: 0.1s; 19 | 20 | // [tablet -]: Compensate for missing tabs 21 | @include break-to-device(tablet) { 22 | margin-top: 4.8rem; 23 | margin-bottom: 2.4rem; 24 | } 25 | 26 | // Fade-out tabs background upon scrolling 27 | [data-md-state='hidden'] & { 28 | pointer-events: none; 29 | transform: translateY(1.25rem); 30 | transition: transform 0s 0.4s, opacity 0.1s 0s; 31 | opacity: 0; 32 | } 33 | 34 | // Adjust bottom spacing if there are no tabs 35 | .md-hero--expand & { 36 | margin-bottom: 2.4rem; 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/layout/_icontable.scss: -------------------------------------------------------------------------------- 1 | .IconTable { 2 | width: 100%; 3 | padding: 1em; 4 | 5 | &-item { 6 | display: inline-block; 7 | width: 50%; 8 | height: 6em; 9 | border-left: 1px solid #e1e4e5; 10 | border-bottom: 1px solid #e1e4e5; 11 | padding: 1em; 12 | background-color: #eee; 13 | 14 | &:nth-child(-n + 2) { 15 | border-top: 1px solid #e1e4e5; 16 | } 17 | 18 | &:nth-child(even) { 19 | border-right: 1px solid #e1e4e5; 20 | } 21 | 22 | &:nth-child(4n), 23 | &:nth-child(4n-1) { 24 | background-color: white; 25 | } 26 | } 27 | 28 | &-item-icon { 29 | display: table-cell; 30 | vertical-align: middle; 31 | width: 60px; 32 | height: 60px; 33 | 34 | img { 35 | width: 100%; 36 | } 37 | } 38 | 39 | &-item-text { 40 | display: table-cell; 41 | vertical-align: middle; 42 | padding-left: 1em; 43 | overflow: hidden; 44 | width: calc(100% - 5em); 45 | height: calc(100% - 2em); 46 | } 47 | } 48 | 49 | @media (max-width: 720px) { 50 | .IconTable-item { 51 | background-color: white; 52 | display: block; 53 | width: 100%; 54 | border-right: 1px solid #e1e4e5; 55 | 56 | &:nth-child(odd) { 57 | background-color: #eee; 58 | } 59 | } 60 | } -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/layout/_tabs.scss: -------------------------------------------------------------------------------- 1 | // ---------------------------------------------------------------------------- 2 | // Element-tabs styles override 3 | // ---------------------------------------------------------------------------- 4 | 5 | .el-tabs--border-card { 6 | .el-tabs__header { 7 | .el-tabs__item.is-active, 8 | .el-tabs__item:not(.is-disabled):hover { 9 | color: $md-color-blue; 10 | } 11 | } 12 | } 13 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/layout/_versions.scss: -------------------------------------------------------------------------------- 1 | .since { 2 | font-size: 1.3rem; 3 | opacity: 0.7; 4 | display: inline; 5 | } 6 | 7 | .deprecated { 8 | font-size: 1.3rem; 9 | color: #FFFFFF !important; 10 | background-color: #E94E77; 11 | display: inline; 12 | padding: 0.2em 0.2em 0.2em 0.2em !important; 13 | } 14 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/libs/_copy-code.scss: -------------------------------------------------------------------------------- 1 | .vp-copy-code-button { 2 | color: white; 3 | 4 | &:after { 5 | box-sizing: content-box; 6 | } 7 | } 8 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/libs/_fontawesome.scss: -------------------------------------------------------------------------------- 1 | $fa-font-path: "@fortawesome/fontawesome-free/webfonts"; 2 | 3 | @import "@fortawesome/fontawesome-free/scss/fontawesome"; 4 | @import "@fortawesome/fontawesome-free/scss/solid"; 5 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/libs/_google-fonts.scss: -------------------------------------------------------------------------------- 1 | @import url('https://fonts.googleapis.com/css2?family=Roboto+Mono:ital,wght@0,100..700;1,100..700&family=Roboto:ital,wght@0,100;0,300;0,400;0,500;0,700;0,900;1,100;1,300;1,400;1,500;1,700;1,900&display=swap'); -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/libs/_monokai.scss: -------------------------------------------------------------------------------- 1 | .hljs { 2 | display: block; 3 | overflow-x: auto; 4 | padding: 0.5em; 5 | background: #272822; 6 | color: #ddd; 7 | } 8 | .hljs-tag, 9 | .hljs-keyword, 10 | .hljs-selector-tag, 11 | .hljs-literal, 12 | .hljs-strong, 13 | .hljs-name { 14 | color: #f92672; 15 | } 16 | .hljs-code { 17 | color: #66d9ef; 18 | } 19 | .hljs-class .hljs-title { 20 | color: white; 21 | } 22 | .hljs-attribute, 23 | .hljs-symbol, 24 | .hljs-regexp, 25 | .hljs-link { 26 | color: #bf79db; 27 | } 28 | .hljs-string, 29 | .hljs-bullet, 30 | .hljs-subst, 31 | .hljs-title, 32 | .hljs-section, 33 | .hljs-emphasis, 34 | .hljs-type, 35 | .hljs-built_in, 36 | .hljs-builtin-name, 37 | .hljs-selector-attr, 38 | .hljs-selector-pseudo, 39 | .hljs-addition, 40 | .hljs-variable, 41 | .hljs-template-tag, 42 | .hljs-template-variable { 43 | color: #a6e22e; 44 | } 45 | .hljs-comment, 46 | .hljs-quote, 47 | .hljs-deletion, 48 | .hljs-meta { 49 | color: #75715e; 50 | } 51 | .hljs-keyword, 52 | .hljs-selector-tag, 53 | .hljs-literal, 54 | .hljs-doctag, 55 | .hljs-title, 56 | .hljs-section, 57 | .hljs-type, 58 | .hljs-selector-id { 59 | font-weight: bold; 60 | } 61 | -------------------------------------------------------------------------------- /src/.vuepress/theme/styles/main.scss: -------------------------------------------------------------------------------- 1 | //// 2 | /// Copyright (c) 2016-2018 Martin Donath 3 | /// 4 | 5 | // ---------------------------------------------------------------------------- 6 | // Dependencies 7 | // ---------------------------------------------------------------------------- 8 | 9 | // Modularscale 10 | @import 'extensions/modularscale/vars'; 11 | @import 'extensions/modularscale/settings'; 12 | @import 'extensions/modularscale/pow'; 13 | @import 'extensions/modularscale/strip-units'; 14 | @import 'extensions/modularscale/sort'; 15 | @import 'extensions/modularscale/round-px'; 16 | @import 'extensions/modularscale/target'; 17 | @import 'extensions/modularscale/function'; 18 | @import 'extensions/modularscale/respond'; 19 | @import 'extensions/modularscale/sugar'; 20 | 21 | @import 'extensions/material-color'; 22 | @import 'extensions/material-shadows'; 23 | 24 | // ---------------------------------------------------------------------------- 25 | // Local imports 26 | // ---------------------------------------------------------------------------- 27 | 28 | @import 'helpers/break'; 29 | @import 'helpers/px2em'; 30 | 31 | @import 'config'; 32 | 33 | @import 'base/reset'; 34 | @import 'base/icons'; 35 | @import 'base/typeset'; 36 | 37 | @import 'layout/base'; 38 | @import 'layout/content'; 39 | @import 'layout/header'; 40 | @import 'layout/hero'; 41 | @import 'layout/footer'; 42 | @import 'layout/nav'; 43 | @import 'layout/sidebar'; 44 | @import 'layout/source'; 45 | @import 'layout/tabs'; 46 | @import 'layout/topMenu'; 47 | @import 'layout/versions'; 48 | @import 'layout/icontable'; 49 | 50 | @import 'extensions/admonition'; 51 | @import 'extensions/badge'; 52 | @import 'extensions/codehilite'; 53 | @import 'extensions/docsearch'; 54 | @import 'extensions/external-links'; 55 | @import 'extensions/footnotes'; 56 | @import 'extensions/permalinks'; 57 | @import 'extensions/select2'; 58 | @import 'extensions/alert'; 59 | @import 'extensions/tiles'; 60 | @import 'extensions/ribbon'; 61 | @import 'extensions/sdk-selector'; 62 | @import 'extensions/menuDropdown'; 63 | 64 | @import 'extensions/pymdown/arithmatex'; 65 | @import 'extensions/pymdown/critic'; 66 | @import 'extensions/pymdown/details'; 67 | @import 'extensions/pymdown/emoji'; 68 | @import 'extensions/pymdown/inlinehilite'; 69 | @import 'extensions/pymdown/tasklist'; 70 | 71 | @import 'libs/copy-code'; 72 | @import 'libs/fontawesome'; 73 | @import 'libs/google-fonts'; 74 | @import 'libs/monokai'; 75 | @import 'libs/select2'; 76 | 77 | body, 78 | input { 79 | font-family: 'Roboto', 'Helvetica Neue', Helvetica, Arial, sans-serif; 80 | } 81 | 82 | code, 83 | kbd, 84 | pre { 85 | font-family: 'Roboto Mono', 'Courier New', Courier, monospace; 86 | } 87 | -------------------------------------------------------------------------------- /src/.vuepress/theme/theme.ts: -------------------------------------------------------------------------------- 1 | import { getDirname, path } from '@vuepress/utils'; 2 | 3 | const __dirname = getDirname(import.meta.url); 4 | 5 | export const kuzdocTheme = () => 6 | ({ 7 | name: '@kuzzleio/vuepress-theme-kuzdoc', 8 | clientConfigFile: path.resolve(__dirname, './client.ts'), 9 | }); 10 | -------------------------------------------------------------------------------- /src/.vuepress/util.ts: -------------------------------------------------------------------------------- 1 | import { get, endsWith } from 'lodash-es'; 2 | import path from 'path'; 3 | 4 | export function setItemLocalStorage(key: string, item: string | object) { 5 | const storeItem = typeof item === 'object' ? JSON.stringify(item) : item; 6 | localStorage.setItem(key, storeItem); 7 | } 8 | 9 | function getPageDir(page) { 10 | if (endsWith(page.path, '/')) { 11 | return page.path; 12 | } else { 13 | return path.dirname(page.path); 14 | } 15 | } 16 | 17 | function getParentPath(node) { 18 | return path.normalize(`${getPageDir(node)}../`); 19 | } 20 | 21 | function sortPagesByOrderAndTitle(p1, p2) { 22 | const o1 = +get(p1, 'meta.frontmatter.order', NaN); 23 | const o2 = +get(p2, 'meta.frontmatter.order', NaN); 24 | 25 | if (isNaN(o1) && !isNaN(o2)) { 26 | return 1; 27 | } 28 | if (isNaN(o2) && !isNaN(o1)) { 29 | return -1; 30 | } 31 | if (isNaN(o1) || o1 === o2) { 32 | return p1.meta.frontmatter.title < p2.meta.frontmatter.title ? -1 : 1; 33 | } 34 | 35 | return o1 < o2 ? -1 : 1; 36 | } 37 | 38 | function groupHeaders(headers) { 39 | // group h3s under h2 40 | headers = headers.map(h => Object.assign({}, h)); 41 | let lastH2; 42 | headers.forEach(h => { 43 | if (h.level === 2) { 44 | lastH2 = h; 45 | } else if (lastH2) { 46 | (lastH2.children || (lastH2.children = [])).push(h); 47 | } 48 | }); 49 | return headers.filter(h => h.level === 2); 50 | } 51 | 52 | export const getPageChildren = (page, pages, fullDetpth = false) => { 53 | const pathRE = new RegExp(`^${getPageDir(page)}[a-zA-z_0-9\-]+/?${fullDetpth ? '' : '$'}`); 54 | 55 | return pages 56 | .filter(p => p.path.match(pathRE) && p.path !== page.path) 57 | .sort(sortPagesByOrderAndTitle); 58 | }; 59 | 60 | export const findRootNode = (node, nodes) => { 61 | if (node.frontmatter.type === 'root' || node.path === '/') { 62 | return node; 63 | } 64 | const parent = getParentNode(node, nodes); 65 | if (!parent) { 66 | return node; 67 | } 68 | 69 | return findRootNode(parent, nodes); 70 | }; 71 | 72 | export const getFirstValidChild = (node, nodes) => { 73 | const children = getPageChildren(node, nodes, true); 74 | 75 | if (!children.length) { 76 | return node; 77 | } 78 | 79 | return getFirstValidChild(children[0], nodes); 80 | }; 81 | 82 | export const getNodeByPath = (path, nodes) => { 83 | return nodes.find(p => p.path === path); 84 | }; 85 | 86 | export const getParentNode = (node, nodes) => { 87 | return getNodeByPath(getParentPath(node), nodes); 88 | }; 89 | 90 | export const resolveHeaders = page => { 91 | const headers = groupHeaders(page.headers || []); 92 | return [ 93 | { 94 | type: 'group', 95 | collapsable: false, 96 | title: page.title, 97 | children: headers.map(h => ({ 98 | type: 'auto', 99 | title: h.title, 100 | basePath: page.path, 101 | path: page.path + '#' + h.slug, 102 | children: h.children || [] 103 | })) 104 | } 105 | ]; 106 | }; 107 | -------------------------------------------------------------------------------- /src/core/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: root 4 | order: 0 5 | title: Core 6 | description: Kuzzle Core Documentation 7 | --- 8 | 9 | -------------------------------------------------------------------------------- /src/how-to/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: root 4 | order: 3 5 | title: Kuzzle How to guides and tutorials 6 | meta: 7 | - name: description 8 | content: Here you can find all the Kuzzle how-to divided into different categories 9 | - name: keywords 10 | content: Kuzzle, how to, official, guides, tutorials, monitor iot data, iot backend, keep warm data, massive data import, sync to other db, replicate to postgres, iot 11 | --- 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/how-to/v1.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: root 4 | order: 3 5 | title: How to 6 | --- 7 | 8 | # Kuzzle How to 9 | Here you can find all the Kuzzle how-to divided into different categories 10 | 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/how-to/v2.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: root 4 | order: 3 5 | title: Kuzzle How to guides and tutorials 6 | meta: 7 | - name: description 8 | content: Here you can find all the Kuzzle how-to divided into different categories 9 | - name: keywords 10 | content: Kuzzle, how to, official, guides, tutorials, monitor iot data, iot backend, keep warm data, massive data import, sync to other db, replicate to postgres, iot 11 | --- 12 | 13 | # Kuzzle How to 14 | Here you can find all the Kuzzle how-to divided into different categories 15 | 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: page 4 | order: 0 5 | title: Kuzzle documentation 6 | meta: 7 | - name: description 8 | content: Kuzzle V2 official documentation 9 | - name: keywords 10 | content: Kuzzle, documentation, kuzzle documentation V2, kuzzle V2, what is kuzzle, kuzzle v2 guide, kuzzle v2 tutorial 11 | --- 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/modules/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: root 4 | order: 3 5 | title: Official Kuzzle Modules 6 | meta: 7 | - name: description 8 | content: You can find here a list of officially released kuzzle modules 9 | - name: keywords 10 | content: Kuzzle, modules, official 11 | --- 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/modules/v2.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: root 4 | order: 3 5 | title: Official Kuzzle Modules 6 | meta: 7 | - name: description 8 | content: You can find here a list of officially released kuzzle modules 9 | - name: keywords 10 | content: Kuzzle, modules, official 11 | --- 12 | 13 | # Official Modules 14 | 15 | Below you’ll find the ones we officially released. 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/official-plugins/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: root 4 | order: 3 5 | title: Official Kuzzle Plugins 6 | meta: 7 | - name: description 8 | content: You can find here a list of officially released kuzzle plugins 9 | - name: keywords 10 | content: Kuzzle, plugins, official 11 | --- 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/official-plugins/v1.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: root 4 | order: 3 5 | title: Official Plugins 6 | --- 7 | 8 | # Official Plugins 9 | 10 | Below you’ll find the ones we officially released. 11 | 12 | 13 | -------------------------------------------------------------------------------- /src/official-plugins/v2.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: root 4 | order: 3 5 | title: Kuzzle Official Plugins 6 | meta: 7 | - name: description 8 | content: You can find here a list of officially released kuzzle plugins 9 | - name: keywords 10 | content: Kuzzle, plugins, official 11 | --- 12 | 13 | # Official Plugins 14 | 15 | Below you’ll find the ones we officially released. 16 | 17 | 18 | -------------------------------------------------------------------------------- /src/sdk/index.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: root 4 | order: 3 5 | title: Kuzzle official SDKs references 6 | meta: 7 | - name: description 8 | content: You can find here a list of the officially supported SDK 9 | - name: keywords 10 | content: Kuzzle, sdk, official, JS, Javascript, Golang, C#, Dart, Dart Null Safety, Jvm, Java 11 | --- 12 | 13 | 14 | -------------------------------------------------------------------------------- /src/sdk/v1.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: root 4 | order: 3 5 | title: SDKs 6 | --- 7 | 8 | # SDKs Reference 9 | 10 | Below you’ll find a list of the officially supported SDK, 11 | (we’re working on extending the support to many more). 12 | 13 |
14 | 15 | -------------------------------------------------------------------------------- /src/sdk/v2.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: root 4 | order: 3 5 | title: Kuzzle official SDKs references 6 | meta: 7 | - name: description 8 | content: You can find here a list of the officially supported SDK 9 | - name: keywords 10 | content: Kuzzle, sdk, official, JS, Javascript, Golang, C#, Dart, Dart Null Safety, Jvm, Java 11 | --- 12 | 13 | # SDKs Reference 14 | 15 | Below you’ll find a list of the officially supported SDK, 16 | (we’re working on extending the support to many more). 17 | 18 |
19 | 20 | -------------------------------------------------------------------------------- /src/v1.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: page 4 | order: 0 5 | title: Kuzzle Documentation 6 | description: Kuzzle Documentation 7 | --- 8 | 9 | 10 | -------------------------------------------------------------------------------- /src/v2.md: -------------------------------------------------------------------------------- 1 | --- 2 | code: false 3 | type: page 4 | order: 0 5 | title: What is kuzzle | Introduction 6 | meta: 7 | - name: description 8 | content: Kuzzle V2 official documentation 9 | - name: keywords 10 | content: Kuzzle, documentation, kuzzle documentation V2, kuzzle V2, what is kuzzle, kuzzle v2 guide, kuzzle v2 tutorial 11 | --- 12 | 13 | 14 | --------------------------------------------------------------------------------