From 9d9388b04088ac26f0d8372d81e63d877453aaa0 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson Date: Thu, 3 Dec 2020 16:13:36 -0600 Subject: [PATCH 1/3] build: remove links --- .changeset/config.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/config.json b/.changeset/config.json index 967537e..a569f8e 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -2,7 +2,7 @@ "$schema": "https://unpkg.com/@changesets/config@1.4.0/schema.json", "changelog": "@changesets/cli/changelog", "commit": false, - "linked": [["@stacks/ui", "@stacks/ui-*"]], + "linked": [], "access": "public", "baseBranch": "master", "updateInternalDependencies": "patch", From 5c38fe9cc95fbfc3eefafe297cfaf85d5f0d3840 Mon Sep 17 00:00:00 2001 From: Thomas Osmonson Date: Thu, 3 Dec 2020 18:18:41 -0600 Subject: [PATCH 2/3] feat: init docs --- docs/.eslintrc.js | 29 + docs/.github/workflows/main.yml | 19 + docs/.gitignore | 45 + docs/.prettierrc | 1 + docs/.vercelignore | 11 + docs/README.md | 30 + docs/babel.config.js | 4 + docs/next-env.d.ts | 2 + docs/next.config.js | 76 + docs/package.json | 145 + docs/public/app-icon.png | Bin 0 -> 2150 bytes docs/public/favicon-dark.svg | 3 + docs/public/favicon-light.svg | 3 + docs/public/favicon.ico | Bin 0 -> 1150 bytes docs/public/images/pages/colors.png | Bin 0 -> 19327 bytes docs/public/images/pages/getting-started.png | Bin 0 -> 29883 bytes .../images/pages/patterns-principles.png | Bin 0 -> 17821 bytes docs/public/images/pages/system-props.png | Bin 0 -> 20659 bytes docs/public/images/pages/theme.png | Bin 0 -> 18800 bytes docs/public/static/favicon.png | Bin 0 -> 407 bytes .../fonts/opensaucesans-medium-webfont.woff | Bin 0 -> 28024 bytes .../fonts/opensaucesans-medium-webfont.woff2 | Bin 0 -> 21408 bytes .../fonts/opensaucesans-regular-webfont.woff | Bin 0 -> 27284 bytes .../fonts/opensaucesans-regular-webfont.woff2 | Bin 0 -> 20844 bytes docs/src/common/constants.ts | 9 + docs/src/common/data/mdx.ts | 23 + docs/src/common/hooks/use-active-heading.tsx | 54 + docs/src/common/hooks/use-app-state.tsx | 31 + docs/src/common/hooks/use-color-mode.ts | 69 + docs/src/common/hooks/use-fathom.ts | 23 + docs/src/common/hooks/use-favicon.ts | 7 + docs/src/common/hooks/use-headroom.ts | 43 + .../src/common/hooks/use-lock-body-scroll.tsx | 24 + docs/src/common/hooks/use-media-query.tsx | 35 + docs/src/common/hooks/use-mobile-menu.tsx | 27 + docs/src/common/hooks/use-on-screen.tsx | 26 + docs/src/common/hooks/use-scroll.tsx | 65 + docs/src/common/hooks/use-side-nav.ts | 95 + docs/src/common/hooks/use-touchable.tsx | 14 + docs/src/common/navigation.yaml | 31 + docs/src/common/routes/get-routes.js | 83 + docs/src/common/routes/index.ts | 5 + docs/src/common/store/index.ts | 19 + docs/src/common/utils/hover-enabled.ts | 43 + docs/src/common/utils/index.ts | 125 + docs/src/components/app-state/context.ts | 11 + docs/src/components/app-state/index.tsx | 18 + docs/src/components/app-state/types.ts | 7 + docs/src/components/app-wrapper.tsx | 20 + docs/src/components/back-button.tsx | 35 + docs/src/components/color-mode-button.tsx | 20 + docs/src/components/common.tsx | 48 + docs/src/components/content-wrapper.tsx | 19 + .../custom-blocks/page-reference.tsx | 303 + docs/src/components/example.tsx | 196 + docs/src/components/feedback.tsx | 138 + docs/src/components/footer.tsx | 18 + docs/src/components/header.tsx | 258 + docs/src/components/home/card.tsx | 49 + .../components/home/code-example-section.tsx | 39 + docs/src/components/home/code-examples.tsx | 82 + docs/src/components/home/common.tsx | 48 + docs/src/components/home/footer.tsx | 56 + docs/src/components/home/grid.tsx | 19 + docs/src/components/home/text.tsx | 109 + docs/src/components/hover-image.tsx | 58 + docs/src/components/icons/_base.tsx | 18 + docs/src/components/icons/accessible.tsx | 22 + docs/src/components/icons/alert-circle.tsx | 11 + docs/src/components/icons/alert-triangle.tsx | 10 + docs/src/components/icons/apps.tsx | 13 + docs/src/components/icons/arrow-left.tsx | 11 + docs/src/components/icons/arrow-right.tsx | 11 + docs/src/components/icons/atom-alt.tsx | 15 + docs/src/components/icons/atom.tsx | 27 + docs/src/components/icons/blockstack-logo.tsx | 15 + docs/src/components/icons/box.tsx | 12 + docs/src/components/icons/braces.tsx | 10 + docs/src/components/icons/check-circle.tsx | 10 + docs/src/components/icons/circle-check.tsx | 10 + docs/src/components/icons/clipboard-check.tsx | 11 + docs/src/components/icons/clipboard.tsx | 10 + docs/src/components/icons/clock.tsx | 10 + docs/src/components/icons/code.tsx | 11 + docs/src/components/icons/copy.tsx | 10 + docs/src/components/icons/dark-mode.tsx | 15 + docs/src/components/icons/edit.tsx | 11 + docs/src/components/icons/feedback.tsx | 118 + docs/src/components/icons/gauge.tsx | 12 + docs/src/components/icons/info-circle.tsx | 11 + .../src/components/icons/layers-intersect.tsx | 10 + docs/src/components/icons/light-mode.tsx | 13 + .../src/components/icons/magnifying-glass.tsx | 24 + docs/src/components/icons/package.tsx | 23 + docs/src/components/icons/paint.tsx | 21 + docs/src/components/icons/palette.tsx | 22 + docs/src/components/icons/search.tsx | 10 + docs/src/components/icons/server.tsx | 12 + docs/src/components/icons/sitemap.tsx | 13 + docs/src/components/icons/stack.tsx | 11 + docs/src/components/icons/tools.tsx | 14 + docs/src/components/icons/world.tsx | 13 + docs/src/components/layouts/base-layout.tsx | 53 + docs/src/components/lazy-image.tsx | 150 + docs/src/components/main.tsx | 6 + .../components/mdx/components/blockquote.tsx | 112 + docs/src/components/mdx/components/code.tsx | 213 + .../src/components/mdx/components/heading.tsx | 125 + docs/src/components/mdx/components/index.ts | 8 + docs/src/components/mdx/components/link.tsx | 140 + docs/src/components/mdx/components/list.tsx | 14 + .../src/components/mdx/components/section.tsx | 12 + docs/src/components/mdx/components/table.tsx | 48 + .../components/mdx/components/typography.tsx | 44 + docs/src/components/mdx/image.tsx | 107 + docs/src/components/mdx/index.tsx | 2 + docs/src/components/mdx/markdown-wrapper.tsx | 51 + docs/src/components/mdx/md-contents.tsx | 277 + docs/src/components/mdx/mdx-components.tsx | 58 + docs/src/components/mdx/overrides.tsx | 126 + docs/src/components/mdx/styles.tsx | 229 + docs/src/components/mdx/typography.ts | 77 + docs/src/components/meta-head.tsx | 40 + docs/src/components/mobile-menu.tsx | 121 + docs/src/components/page-meta.tsx | 39 + docs/src/components/page-top.tsx | 52 + docs/src/components/pagination.tsx | 171 + docs/src/components/progress-bar.tsx | 91 + docs/src/components/search.tsx | 188 + docs/src/components/side-nav.tsx | 315 + docs/src/components/stacks-logo.tsx | 19 + docs/src/components/status-check.tsx | 102 + docs/src/components/toc.tsx | 116 + docs/src/components/tooltip.tsx | 43 + docs/src/components/typography.tsx | 47 + docs/src/pages/404.md | 18 + docs/src/pages/_app.tsx | 23 + docs/src/pages/_document.tsx | 97 + docs/src/pages/components/box.mdx | 60 + docs/src/pages/components/button.mdx | 133 + docs/src/pages/components/codeblock.mdx | 50 + docs/src/pages/components/color-modes.mdx | 118 + docs/src/pages/components/css-reset.mdx | 29 + docs/src/pages/components/flex.mdx | 45 + docs/src/pages/components/grid.mdx | 47 + docs/src/pages/components/highlighter.mdx | 49 + docs/src/pages/components/icons.mdx | 42 + docs/src/pages/components/input.mdx | 65 + docs/src/pages/components/spinner.mdx | 51 + docs/src/pages/components/stack.mdx | 104 + docs/src/pages/components/text.mdx | 47 + docs/src/pages/contributing.mdx | 137 + docs/src/pages/core/colors.mdx | 61 + docs/src/pages/core/space.mdx | 1 + docs/src/pages/core/system-props.mdx | 406 + docs/src/pages/core/theme.mdx | 182 + docs/src/pages/core/typography.mdx | 0 docs/src/pages/further-reading.mdx | 27 + docs/src/pages/hooks/use-theme.mdx | 27 + docs/src/pages/index.mdx | 16 + docs/src/pages/installation.mdx | 78 + docs/src/pages/patterns-and-principles.mdx | 55 + docs/src/pages/responsive-styles.mdx | 71 + docs/tsconfig.json | 35 + docs/types/mdx.d.ts | 4 + docs/yarn.lock | 12449 ++++++++++++++++ 166 files changed, 21093 insertions(+) create mode 100644 docs/.eslintrc.js create mode 100644 docs/.github/workflows/main.yml create mode 100644 docs/.gitignore create mode 100644 docs/.prettierrc create mode 100644 docs/.vercelignore create mode 100644 docs/README.md create mode 100644 docs/babel.config.js create mode 100644 docs/next-env.d.ts create mode 100755 docs/next.config.js create mode 100755 docs/package.json create mode 100644 docs/public/app-icon.png create mode 100755 docs/public/favicon-dark.svg create mode 100755 docs/public/favicon-light.svg create mode 100644 docs/public/favicon.ico create mode 100644 docs/public/images/pages/colors.png create mode 100644 docs/public/images/pages/getting-started.png create mode 100644 docs/public/images/pages/patterns-principles.png create mode 100644 docs/public/images/pages/system-props.png create mode 100644 docs/public/images/pages/theme.png create mode 100644 docs/public/static/favicon.png create mode 100644 docs/public/static/fonts/opensaucesans-medium-webfont.woff create mode 100644 docs/public/static/fonts/opensaucesans-medium-webfont.woff2 create mode 100644 docs/public/static/fonts/opensaucesans-regular-webfont.woff create mode 100644 docs/public/static/fonts/opensaucesans-regular-webfont.woff2 create mode 100644 docs/src/common/constants.ts create mode 100644 docs/src/common/data/mdx.ts create mode 100644 docs/src/common/hooks/use-active-heading.tsx create mode 100644 docs/src/common/hooks/use-app-state.tsx create mode 100644 docs/src/common/hooks/use-color-mode.ts create mode 100644 docs/src/common/hooks/use-fathom.ts create mode 100644 docs/src/common/hooks/use-favicon.ts create mode 100644 docs/src/common/hooks/use-headroom.ts create mode 100644 docs/src/common/hooks/use-lock-body-scroll.tsx create mode 100644 docs/src/common/hooks/use-media-query.tsx create mode 100644 docs/src/common/hooks/use-mobile-menu.tsx create mode 100644 docs/src/common/hooks/use-on-screen.tsx create mode 100644 docs/src/common/hooks/use-scroll.tsx create mode 100644 docs/src/common/hooks/use-side-nav.ts create mode 100644 docs/src/common/hooks/use-touchable.tsx create mode 100644 docs/src/common/navigation.yaml create mode 100644 docs/src/common/routes/get-routes.js create mode 100644 docs/src/common/routes/index.ts create mode 100644 docs/src/common/store/index.ts create mode 100644 docs/src/common/utils/hover-enabled.ts create mode 100644 docs/src/common/utils/index.ts create mode 100644 docs/src/components/app-state/context.ts create mode 100644 docs/src/components/app-state/index.tsx create mode 100644 docs/src/components/app-state/types.ts create mode 100644 docs/src/components/app-wrapper.tsx create mode 100644 docs/src/components/back-button.tsx create mode 100644 docs/src/components/color-mode-button.tsx create mode 100644 docs/src/components/common.tsx create mode 100644 docs/src/components/content-wrapper.tsx create mode 100644 docs/src/components/custom-blocks/page-reference.tsx create mode 100644 docs/src/components/example.tsx create mode 100644 docs/src/components/feedback.tsx create mode 100644 docs/src/components/footer.tsx create mode 100644 docs/src/components/header.tsx create mode 100644 docs/src/components/home/card.tsx create mode 100644 docs/src/components/home/code-example-section.tsx create mode 100644 docs/src/components/home/code-examples.tsx create mode 100644 docs/src/components/home/common.tsx create mode 100644 docs/src/components/home/footer.tsx create mode 100644 docs/src/components/home/grid.tsx create mode 100644 docs/src/components/home/text.tsx create mode 100644 docs/src/components/hover-image.tsx create mode 100644 docs/src/components/icons/_base.tsx create mode 100644 docs/src/components/icons/accessible.tsx create mode 100644 docs/src/components/icons/alert-circle.tsx create mode 100644 docs/src/components/icons/alert-triangle.tsx create mode 100644 docs/src/components/icons/apps.tsx create mode 100644 docs/src/components/icons/arrow-left.tsx create mode 100644 docs/src/components/icons/arrow-right.tsx create mode 100644 docs/src/components/icons/atom-alt.tsx create mode 100644 docs/src/components/icons/atom.tsx create mode 100644 docs/src/components/icons/blockstack-logo.tsx create mode 100644 docs/src/components/icons/box.tsx create mode 100644 docs/src/components/icons/braces.tsx create mode 100644 docs/src/components/icons/check-circle.tsx create mode 100644 docs/src/components/icons/circle-check.tsx create mode 100644 docs/src/components/icons/clipboard-check.tsx create mode 100644 docs/src/components/icons/clipboard.tsx create mode 100644 docs/src/components/icons/clock.tsx create mode 100644 docs/src/components/icons/code.tsx create mode 100644 docs/src/components/icons/copy.tsx create mode 100644 docs/src/components/icons/dark-mode.tsx create mode 100644 docs/src/components/icons/edit.tsx create mode 100644 docs/src/components/icons/feedback.tsx create mode 100644 docs/src/components/icons/gauge.tsx create mode 100644 docs/src/components/icons/info-circle.tsx create mode 100644 docs/src/components/icons/layers-intersect.tsx create mode 100644 docs/src/components/icons/light-mode.tsx create mode 100644 docs/src/components/icons/magnifying-glass.tsx create mode 100644 docs/src/components/icons/package.tsx create mode 100644 docs/src/components/icons/paint.tsx create mode 100644 docs/src/components/icons/palette.tsx create mode 100644 docs/src/components/icons/search.tsx create mode 100644 docs/src/components/icons/server.tsx create mode 100644 docs/src/components/icons/sitemap.tsx create mode 100644 docs/src/components/icons/stack.tsx create mode 100644 docs/src/components/icons/tools.tsx create mode 100644 docs/src/components/icons/world.tsx create mode 100644 docs/src/components/layouts/base-layout.tsx create mode 100644 docs/src/components/lazy-image.tsx create mode 100644 docs/src/components/main.tsx create mode 100644 docs/src/components/mdx/components/blockquote.tsx create mode 100644 docs/src/components/mdx/components/code.tsx create mode 100644 docs/src/components/mdx/components/heading.tsx create mode 100644 docs/src/components/mdx/components/index.ts create mode 100644 docs/src/components/mdx/components/link.tsx create mode 100644 docs/src/components/mdx/components/list.tsx create mode 100644 docs/src/components/mdx/components/section.tsx create mode 100644 docs/src/components/mdx/components/table.tsx create mode 100644 docs/src/components/mdx/components/typography.tsx create mode 100644 docs/src/components/mdx/image.tsx create mode 100644 docs/src/components/mdx/index.tsx create mode 100644 docs/src/components/mdx/markdown-wrapper.tsx create mode 100644 docs/src/components/mdx/md-contents.tsx create mode 100644 docs/src/components/mdx/mdx-components.tsx create mode 100644 docs/src/components/mdx/overrides.tsx create mode 100644 docs/src/components/mdx/styles.tsx create mode 100644 docs/src/components/mdx/typography.ts create mode 100644 docs/src/components/meta-head.tsx create mode 100644 docs/src/components/mobile-menu.tsx create mode 100644 docs/src/components/page-meta.tsx create mode 100644 docs/src/components/page-top.tsx create mode 100644 docs/src/components/pagination.tsx create mode 100644 docs/src/components/progress-bar.tsx create mode 100644 docs/src/components/search.tsx create mode 100644 docs/src/components/side-nav.tsx create mode 100644 docs/src/components/stacks-logo.tsx create mode 100644 docs/src/components/status-check.tsx create mode 100644 docs/src/components/toc.tsx create mode 100644 docs/src/components/tooltip.tsx create mode 100644 docs/src/components/typography.tsx create mode 100644 docs/src/pages/404.md create mode 100755 docs/src/pages/_app.tsx create mode 100755 docs/src/pages/_document.tsx create mode 100755 docs/src/pages/components/box.mdx create mode 100755 docs/src/pages/components/button.mdx create mode 100644 docs/src/pages/components/codeblock.mdx create mode 100644 docs/src/pages/components/color-modes.mdx create mode 100644 docs/src/pages/components/css-reset.mdx create mode 100755 docs/src/pages/components/flex.mdx create mode 100755 docs/src/pages/components/grid.mdx create mode 100644 docs/src/pages/components/highlighter.mdx create mode 100644 docs/src/pages/components/icons.mdx create mode 100755 docs/src/pages/components/input.mdx create mode 100644 docs/src/pages/components/spinner.mdx create mode 100644 docs/src/pages/components/stack.mdx create mode 100755 docs/src/pages/components/text.mdx create mode 100755 docs/src/pages/contributing.mdx create mode 100644 docs/src/pages/core/colors.mdx create mode 100644 docs/src/pages/core/space.mdx create mode 100755 docs/src/pages/core/system-props.mdx create mode 100755 docs/src/pages/core/theme.mdx create mode 100644 docs/src/pages/core/typography.mdx create mode 100644 docs/src/pages/further-reading.mdx create mode 100755 docs/src/pages/hooks/use-theme.mdx create mode 100644 docs/src/pages/index.mdx create mode 100755 docs/src/pages/installation.mdx create mode 100755 docs/src/pages/patterns-and-principles.mdx create mode 100755 docs/src/pages/responsive-styles.mdx create mode 100644 docs/tsconfig.json create mode 100644 docs/types/mdx.d.ts create mode 100644 docs/yarn.lock diff --git a/docs/.eslintrc.js b/docs/.eslintrc.js new file mode 100644 index 0000000..9a5b99f --- /dev/null +++ b/docs/.eslintrc.js @@ -0,0 +1,29 @@ +module.exports = { + extends: ['@blockstack/eslint-config'], + parser: '@typescript-eslint/parser', + parserOptions: { + createDefaultProgram: true, + project: './tsconfig.json', + }, + env: { + browser: true, + node: true, + es6: true, + }, + globals: { + page: true, + browser: true, + context: true, + jestPuppeteer: true, + }, + rules: { + '@typescript-eslint/no-unsafe-assignment': 0, + '@typescript-eslint/no-unsafe-member-access': 0, + '@typescript-eslint/no-unsafe-call': 0, + '@typescript-eslint/no-unsafe-return': 0, + '@typescript-eslint/explicit-module-boundary-types': 0, + '@typescript-eslint/ban-ts-comment': 0, + '@typescript-eslint/ban-ts-ignore': 0, + '@typescript-eslint/restrict-template-expressions': 0, + }, +}; diff --git a/docs/.github/workflows/main.yml b/docs/.github/workflows/main.yml new file mode 100644 index 0000000..ee13dfa --- /dev/null +++ b/docs/.github/workflows/main.yml @@ -0,0 +1,19 @@ +name: Code quality +on: [push] + +jobs: + code_quality: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Set Node Version + uses: actions/setup-node@v1.4.2 + with: + node-version: 14 + - name: Install deps + run: yarn --frozen-lockfile + - name: Lint + run: yarn lint + - name: Typecheck + run: yarn typecheck diff --git a/docs/.gitignore b/docs/.gitignore new file mode 100644 index 0000000..c87defb --- /dev/null +++ b/docs/.gitignore @@ -0,0 +1,45 @@ +# OS or Editor folders +.DS_Store +node_modules + +# Jekyllg +_site +.sass-cache +.jekyll-metadata +Gemfile.lock +**/.DS_Store +**/desktop.ini +**/.svn + +# dependencies +/node_modules +/.pnp +.pnp.js + +# testing +/coverage + +# next.js +.vercel +/.next/ +/out/ +/build/ + +# production +/build + +# misc +.env* +.idea + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* + +.now +.mdx-data +.cache +.yalc +yalc.lock +.cache diff --git a/docs/.prettierrc b/docs/.prettierrc new file mode 100644 index 0000000..97becfe --- /dev/null +++ b/docs/.prettierrc @@ -0,0 +1 @@ +module.exports = require('@blockstack/prettier-config'); diff --git a/docs/.vercelignore b/docs/.vercelignore new file mode 100644 index 0000000..bc9abd0 --- /dev/null +++ b/docs/.vercelignore @@ -0,0 +1,11 @@ +.github +.next +.vercel +.mdx-data +.idea +node_modules +build +README.md +.cache +.yalc +yalc.lock diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000..4683fdf --- /dev/null +++ b/docs/README.md @@ -0,0 +1,30 @@ +# Blockstack documentation + +![A screenshot of docs.blockstack.org](/public/images/docs-homepage.png) + +## Running and building the site locally + +If you are interested in contributing to the site and making changes, please refer to our [contributing guide here](https://docs.blockstack.org/ecosystem/contributing). + +## Generated documentation + +### Blockstack CLI reference + +The `src/_data/cli-reference.json` file is generated from the `blockstack-cli` subcommand `docs`. + +1. Install the latest version of the cli according to the instructions at: https://github.com/blockstack/cli-blockstack + +2. Generate the json for the cli in the `docs.blockstack` repo. + + ``` + $ blockstack-cli docs > src/_data/cli-reference.json + ``` + +### Clarity Reference + +There is a json file that is generated via the `stacks-blockchain` repo, which automatically brings it over to this repo +via a github action. + +### FAQs + +All of the FAQs found at `/reference/faqs` are pulled dynamically from the zendesk api and rendered in this project. diff --git a/docs/babel.config.js b/docs/babel.config.js new file mode 100644 index 0000000..4d9d5d7 --- /dev/null +++ b/docs/babel.config.js @@ -0,0 +1,4 @@ +module.exports = { + presets: ['next/babel', '@emotion/babel-preset-css-prop'], + plugins: ['./lib/babel-plugin-nextjs-mdx-patch', 'babel-plugin-macros', '@emotion'], +}; diff --git a/docs/next-env.d.ts b/docs/next-env.d.ts new file mode 100644 index 0000000..7b7aa2c --- /dev/null +++ b/docs/next-env.d.ts @@ -0,0 +1,2 @@ +/// +/// diff --git a/docs/next.config.js b/docs/next.config.js new file mode 100755 index 0000000..845c868 --- /dev/null +++ b/docs/next.config.js @@ -0,0 +1,76 @@ +const withBundleAnalyzer = require('@next/bundle-analyzer')({ + enabled: process.env.ANALYZE === 'true', +}); +const path = require('path'); +const { remarkPlugins } = require('./lib/remark-plugins'); +const { rehypePlugins } = require('./lib/rehype-plugins'); +const withFonts = require('next-fonts'); +const withTM = require('next-transpile-modules')(['@tabler/icons/icons-react/dist/index.esm.js']); + +module.exports = withTM( + withFonts( + withBundleAnalyzer({ + experimental: { + modern: true, + polyfillsOptimization: true, + jsconfigPaths: true, + trailingSlash: true, + }, + pageExtensions: ['js', 'ts', 'tsx', 'md', 'mdx'], + webpack: (config, options) => { + config.module.rules.push({ + test: /.mdx?$/, // load both .md and .mdx files + use: [ + options.defaultLoaders.babel, + { + loader: '@mdx-js/loader', + options: { + remarkPlugins, + rehypePlugins, + }, + }, + path.join(__dirname, './lib/mdx-frontmatter-loader'), + ], + }); + + config.module.rules.push({ + test: /\.ya?ml$/, + type: 'json', + use: 'yaml-loader', + }); + + if (!options.dev) { + const splitChunks = config.optimization && config.optimization.splitChunks; + if (splitChunks) { + const cacheGroups = splitChunks.cacheGroups; + const test = /[\\/]node_modules[\\/](preact|preact-render-to-string|preact-context-provider)[\\/]/; + if (cacheGroups.framework) { + cacheGroups.preact = Object.assign({}, cacheGroups.framework, { + test, + }); + cacheGroups.commons.name = 'framework'; + } else { + cacheGroups.preact = { + name: 'commons', + chunks: 'all', + test, + }; + } + } + + // Install webpack aliases: + const aliases = config.resolve.alias || (config.resolve.alias = {}); + aliases.react = aliases['react-dom'] = 'preact/compat'; + // aliases['@stacks/ui'] = '@stacks/ui/dist/index.esm.js'; + aliases['react-ssr-prepass'] = 'preact-ssr-prepass'; + } + config.resolve.alias['@emotion/react'] = path.resolve( + __dirname, + './node_modules/@emotion/react' + ); + + return config; + }, + }) + ) +); diff --git a/docs/package.json b/docs/package.json new file mode 100755 index 0000000..fd1840a --- /dev/null +++ b/docs/package.json @@ -0,0 +1,145 @@ +{ + "name": "@stacks/ui-docs", + "version": "1.0.0", + "dependencies": { + "@docsearch/css": "^1.0.0-alpha.28", + "@docsearch/react": "^1.0.0-alpha.28", + "@emotion/babel-plugin": "^11.0.0-next.15", + "@emotion/babel-preset-css-prop": "^11.0.0-next.10", + "@emotion/cache": "^11.0.0-next.15", + "@emotion/core": "^11.0.0-next.10", + "@emotion/css": "^11.0.0-next.15", + "@emotion/react": "^11.0.0-next.15", + "@emotion/server": "^11.0.0-next.15", + "@hashicorp/remark-plugins": "^3.0.0", + "@mdx-js/loader": "1.6.22", + "@mdx-js/mdx": "^1.6.22", + "@mdx-js/react": "^1.6.22", + "@next/mdx": "^10.0.3", + "@reach/accordion": "^0.12.1", + "@reach/tooltip": "^0.12.1", + "@stacks/ui": "^7.0.0", + "@stacks/ui-core": "^7.0.0", + "@styled-system/theme-get": "^5.1.2", + "@tabler/icons": "^1.36.0", + "@types/mdx-js__react": "^1.5.2", + "@types/node": "^14.14.10", + "@types/nprogress": "^0.2.0", + "@types/reach__tooltip": "^0.2.0", + "algoliasearch": "^4.8.2", + "babel-plugin-macros": "^3.0.0", + "cache-manager": "^3.4.0", + "cache-manager-fs-hash": "^0.0.9", + "capsize": "^1.1.0", + "csstype": "^3.0.3", + "csvtojson": "^2.0.10", + "docsearch.js": "^2.6.3", + "emotion": "^11.0.0", + "emotion-server": "^11.0.0", + "fathom-client": "^3.0.0", + "front-matter": "^4.0.2", + "fs-extra": "^9.0.1", + "github-slugger": "^1.3.0", + "gray-matter": "^4.0.2", + "hast-util-to-string": "^1.0.4", + "html-react-parser": "^0.14.2", + "image-size": "^0.9.1", + "lodash.debounce": "^4.0.8", + "mdi-react": "7.4.0", + "micro-memoize": "^4.0.9", + "modern-normalize": "^1.0.0", + "next": "^10.0.3", + "next-fonts": "^1.4.0", + "next-mdx-remote": "^1.0.0", + "nprogress": "^0.2.0", + "p-all": "^3.0.0", + "preact": "^10.4.8", + "preact-render-to-string": "^5.1.4", + "preact-ssr-prepass": "^1.1.1", + "prettier": "^2.2.1", + "preval.macro": "^5.0.0", + "prismjs": "^1.22.0", + "react-gesture-responder": "^2.1.0", + "react-intersection-observer": "^8.31.0", + "react-spring": "^8.0.27", + "recoil": "^0.1.2", + "remark": "^13.0.0", + "remark-custom-blocks": "^2.5.0", + "remark-emoji": "2.1.0", + "remark-external-links": "^8.0.0", + "remark-footnotes": "^3.0.0", + "remark-frontmatter": "^3.0.0", + "remark-heading-id": "^1.0.0", + "remark-images": "2.0.0", + "remark-normalize-headings": "^2.0.0", + "remark-parse": "^9.0.0", + "remark-sectionize": "^1.1.1", + "remark-slug": "6.0.0", + "remark-squeeze-paragraphs": "^4.0.0", + "remark-unwrap-images": "2.0.0", + "remark-vscode": "^1.0.0-beta.2", + "strip-markdown": "^4.0.0", + "stylis": "^4.0.6", + "swr": "^0.3.2", + "turndown": "^7.0.0", + "typescript": "^4.0.2", + "unified-vscode": "^1.0.0-beta.2", + "unist-builder": "^2.0.3", + "unist-util-is": "^4.0.4", + "unist-util-select": "^3.0.3", + "unist-util-visit": "^2.0.3", + "use-events": "^1.4.2", + "use-is-in-viewport": "^1.0.9", + "yaml-loader": "^0.6.0" + }, + "devDependencies": { + "@babel/preset-react": "^7.12.7", + "@blockstack/eslint-config": "^1.0.5", + "@blockstack/prettier-config": "^0.0.6", + "@next/bundle-analyzer": "^10.0.3", + "@typescript-eslint/eslint-plugin": "^4.9.0", + "@typescript-eslint/parser": "^4.9.0", + "babel-plugin-styled-components": "^1.12.0", + "eslint": "^7.14.0", + "eslint-plugin-import": "^2.22.0", + "eslint-plugin-prettier": "^3.1.4", + "husky": "^4.2.5", + "next-transpile-modules": "^6.0.0", + "react": "^17.0.1", + "react-dom": "^17.0.1", + "rimraf": "^3.0.2", + "tsconfig-paths-webpack-plugin": "^3.3.0" + }, + "private": true, + "scripts": { + "build": "yarn clean:build-files && next telemetry disable && NODE_ENV=production next build", + "build:analyze": "yarn clean:build-files && next telemetry disable && NODE_ENV=production ANALYZE=true next build", + "start": "next telemetry disable && NODE_ENV=production next start", + "clean:build-files": "rimraf .next && rimraf .cache", + "dev": "yarn clean:build-files && next dev", + "build:cli-reference": "blockstack-cli docs > src/_data/cli-reference.json", + "export": "next export", + "lint": "yarn lint:eslint && yarn lint:prettier", + "lint:eslint": "eslint \"src/**/*.{ts,tsx}\" -f unix", + "lint:fix": "eslint \"src/**/*.{ts,tsx}\" -f unix --fix", + "lint:prettier": "prettier --check \"src/**/*.{ts,tsx,md,mdx}\" *.js", + "lint:prettier:fix": "prettier --write \"src/**/*.{ts,tsx,md,mdx}\" *.js", + "typecheck": "tsc --noEmit", + "typecheck:watch": "npm run typecheck -- --watch" + }, + "resolutions": { + "preact": "^10.4.4", + "eslint": "^7.4.0", + "@emotion/cache": "^11.0.0-next.15", + "@emotion/core": "^11.0.0-next.10", + "@emotion/css": "^11.0.0-next.15", + "@emotion/react": "^11.0.0-next.15", + "@emotion/server": "^11.0.0-next.15" + }, + "husky": { + "hooks": { + "pre-commit": "yarn lint:prettier" + } + }, + "prettier": "@blockstack/prettier-config" +} diff --git a/docs/public/app-icon.png b/docs/public/app-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..85f3a33778aaff322099b77e5ca3511f1259a1b4 GIT binary patch literal 2150 zcmai0c~H|?68;5&a10OyBr1k*jLe7v0xrS;63(y#5lI9=kV`=k0l{#|A%r^!$eC~m zjLMO4LpV&LlITDXITO?Lxmol*93G6!V< z0FZM)+PH{x-Vc$I6rBrp)7>H^9fov|0D%2J{}7Oai`J?L1Vy;mTLDc&s-H!Mcp$#Ioll`t?6Z66nwEv zwH?ASHj?zvr3)q=jz3k`nxM-#r;&-G9n&Dxe&t!`5FZ}bNc^N-$$ynge;-b^eOFUR z2)JaWn3k@PnT$PLXxc0Gp+=s8a!YLvltWJg#1ELGbo-rz!~!Bo9FG(__YP4*x-0mn zwPZ$uHmjP9x0Cf%y_8QVhSJeRCF2*Nj<Z*&L(*2CUUfN?W4BNtI}-FJ`<9eK`OjEG zHH&YPXzSM=(Jj@6f@DA!J{C$_@w%2%St&j8QJYbFyxX$@GdC1%anmeCE?qYTT$6RQ zXlVW`s|rjSMJT16n%I*`!RmGR#a1H}l+rNTDd2o^F_S5`;RAtJk6DWmKxD>0Lf|dQB3oRl0dDCd0TR=Zf}BU(ekvm- z?)q<6k%4k{hLPY&sDK&JZw&G>pO4FLy-p(y=?jxT&tl zGt6rrtDQmF?{6;^2rqm8*+8yR>VbcKTUd&)LI+T(a-ScZvI|s-Tv6gW-}v`jmzd<4>1w`)#l%< zJ?fs)2Mw_{A5lOzr$Jeum+a~1(swc0;9D=LIls_-i59oZ@MU39$viU71@4*Ar zyCQ36KSPeZG^f0SgI$@+hax+|>Xzdpr-a3@ygj;auQOl3kcr_pgeuzhL!Dl_LbU=N zc@f$NQ1TOIotVKFGRg`~t_GOgte9(>jHJot!B%RUazdJgr3N(%AY$moHY(?Re&9AQ z$;P1Uls8RbC_yczsrpt`A;4Vd@RcS5~kbt<)fCzA`{>HPM^F^HL0ELoV@1yif{2LDc?ue={SYp z3LV>TGTk=Gm=1pX53?Ppo| z=px6Q)zWIRr@Y0ia~rJ@^Bsk6Gx=2FPere7TK=({%F@}8)%txV$i{>&eXhMZm`nG5 z(K=cGH9?C@TT@$3n`ASS54a3^>(5aOz3rCd>3Y5A2ybI=qN55;xhPYkpF(p_6mVm_ zpS!Umwb50;9U`8zMb%gzEeEMpK2t3^n#&(fU?1i^N({9;`!>EuOj0T?S@dZCjkf=T z(f{fCHJAdsTcw<~Gx30AJcy&7(OgI72bo)R-YQLPnwYWX9K!I3?SHt^5fqrhCC^6f zVUqC)k{}vB6J*|lp&#Iz9Z2c3q`+itncQ}CIR8N6&az3ybrUmS46g@D5@?Aos8~~AE#aZ=1hW~h+gTohKe5y< zz7c(VZKW_R3N&zE!)Y&BV5EuRIf&wqn0_sBZq$|*mDiA17loLs>^H2NC^!(cw7dCR zJfV#obV{WdLK2k!C9JFwn#9_`);m3N$t2?@vLMde)U);{&J*RWvCqNX*P~)Dy77L! z!YLc%dTB>sJpygJzD0@hdZnEU&2noDRE5zSz0Wpk({|b-} z{$Z&bjzB%~H~8LAH$dXaiSdQoJ>Q9d3uLt5O0}o!M6!ey?u;)(3i3d6OlJLjsoeeo z7RqN?e)Y!Y`PB*|r%1cLq}b(>y3|yL(icKA4iKuEWw$Cm|pCTDh`EKXw$I7<9ac%NTz znfwvT4(c3=V?gWk-;@iln$zz%oF+oyhH5UP zF?hw*4(eJto^)$|(V&>27EEtCzJ59aPZ+dNh9U&lLp2U4_z!$;{W(v3(`WvbN zTzW$M=gVUsvfVkA2EN>>6*ghBGvSd2ql8G-{SJfeI8=3stv#()FZ+yIC k(6r!D*VUH?OAB_vVdO7bvBf!yqO|~UutnK4S@|UY4RRm}TL1t6 literal 0 HcmV?d00001 diff --git a/docs/public/favicon-dark.svg b/docs/public/favicon-dark.svg new file mode 100755 index 0000000..4ef1855 --- /dev/null +++ b/docs/public/favicon-dark.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/public/favicon-light.svg b/docs/public/favicon-light.svg new file mode 100755 index 0000000..8f2ddea --- /dev/null +++ b/docs/public/favicon-light.svg @@ -0,0 +1,3 @@ + + + diff --git a/docs/public/favicon.ico b/docs/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..ddeeb6cd041c01c240f3e695a95ec4b413e61eba GIT binary patch literal 1150 zcmbW1O-=$q5QWPG_pDg6F>#M#ybPclIEOCuBmxFKg(k2;F9HcfH~!)G0!1p58lphH zsqRA%ntZgtH!l%y^2}Q%#HyGWvvs;$Q_Xs{#n`CA++HY-r*Zo2|t_M8&S3L z$lHM#WS(7`JS}+H!|Ur#@#=YeuJ{QHh`&Q)X&(@4<&AY;%x~ZX2H>?18|{jy^<9r% zX-hZ<1NB8climYq4VZ)bvp6Du0neds!uS&U;A>`H*Rq;S^ZH`UYBR0q)BGOV@C2S8 zGgd$DVAncj{p;c@>tB2adVjZY3PbSwKQeB@H5A|9U-yrmEqb-KyxN0)pZ`Yf{TA$d ge$>-=etkce^;o^q8Q-2?{~w64QjfFsIMbB*1#Y$$!~g&Q literal 0 HcmV?d00001 diff --git a/docs/public/images/pages/colors.png b/docs/public/images/pages/colors.png new file mode 100644 index 0000000000000000000000000000000000000000..ba7b2428e8a7f11554840bfcc4eee405b5404c3d GIT binary patch literal 19327 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 nnS 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 literal 0 HcmV?d00001 diff --git a/docs/public/images/pages/patterns-principles.png b/docs/public/images/pages/patterns-principles.png new file mode 100644 index 0000000000000000000000000000000000000000..c8eb8df3a1d95119fbbb50655817a068732ef0d1 GIT binary patch literal 17821 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 literal 0 HcmV?d00001 diff --git a/docs/public/images/pages/system-props.png b/docs/public/images/pages/system-props.png new file mode 100644 index 0000000000000000000000000000000000000000..52c36e0c5ac83c824f827de6ed76866c957ccc30 GIT binary patch literal 20659 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 literal 0 HcmV?d00001 diff --git a/docs/public/static/favicon.png b/docs/public/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..73a8a6e06a1892c048905fd7d94e8dca6a5bde5b GIT binary patch literal 407 zcmV;I0cie-P)5dr5Vlbycg|KReTHsPvSnxM27SNs1Uy5lYDHE-!tCW zQ9$_&(Eg|t_IdF$gdadBLup;I0znw@79uzcous3Wx?rI@%AA0uPUA;4_JhZcqm z{U(H*gO?yc6;QERPQeri01+GmGUy?Ybp7uNTmXL0iFe(jL^}Wg002ovPDHLkV1lL3 BvKRmW literal 0 HcmV?d00001 diff --git a/docs/public/static/fonts/opensaucesans-medium-webfont.woff b/docs/public/static/fonts/opensaucesans-medium-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..474f2d8a3030a23dd6886303d64cd4b116b9fb89 GIT binary patch literal 28024 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%0AERSxr+ORSwC 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 '`' + value.replace('`', '').replace('`', '') + '`'; + +const mdxOptions = { + remarkPlugins, + rehypePlugins, +}; + +const renderToStringOptions = { components: Components, mdxOptions }; + +export const convertRemoteDataToMDX = async (arr: any[], key: string) => + Promise.all(arr.map(entry => renderToString(entry[key], renderToStringOptions))); + +export const renderMdx = async (content: string): Promise => + renderToString(content, renderToStringOptions) as Promise; diff --git a/docs/src/common/hooks/use-active-heading.tsx b/docs/src/common/hooks/use-active-heading.tsx new file mode 100644 index 0000000..233668a --- /dev/null +++ b/docs/src/common/hooks/use-active-heading.tsx @@ -0,0 +1,54 @@ +import React, { useEffect } from 'react'; +import { useRouter } from 'next/router'; +import { useAppState } from '@common/hooks/use-app-state'; + +interface ActiveHeadingReturn { + isActive: boolean; + doChangeActiveSlug: (value: string) => void; + location: string; + slugInView?: string; + doChangeSlugInView: (value: string) => void; +} + +const getHash = (url: string) => url?.includes('#') && url.split('#')[1]; + +export const useWatchActiveHeadingChange = () => { + const router = useRouter(); + const asPath = router && router.asPath; + const { activeSlug, doChangeActiveSlug } = useAppState(); + const urlHash = getHash(asPath); + + const handleRouteChange = url => { + if (url) { + const hash = getHash(url); + if (hash) doChangeActiveSlug(hash); + } + }; + + useEffect(() => { + if ((urlHash && !activeSlug) || (urlHash && urlHash !== activeSlug)) { + doChangeActiveSlug(urlHash); + } + router.events.on('hashChangeStart', handleRouteChange); + router.events.on('routeChangeStart', handleRouteChange); + return () => { + router.events.off('hashChangeStart', handleRouteChange); + router.events.off('routeChangeStart', handleRouteChange); + }; + }, []); +}; + +export const useActiveHeading = (_slug: string): ActiveHeadingReturn => { + const { activeSlug, slugInView, doChangeActiveSlug, doChangeSlugInView } = useAppState(); + const location = typeof window !== 'undefined' && window.location.href; + + const isActive = _slug === activeSlug; + + return { + isActive, + doChangeActiveSlug, + location, + slugInView, + doChangeSlugInView, + }; +}; diff --git a/docs/src/common/hooks/use-app-state.tsx b/docs/src/common/hooks/use-app-state.tsx new file mode 100644 index 0000000..ad3c3ff --- /dev/null +++ b/docs/src/common/hooks/use-app-state.tsx @@ -0,0 +1,31 @@ +import React from 'react'; +import { AppStateContext } from '@components/app-state/context'; +import { State } from '@components/app-state/types'; + +interface UseAppStateReturn extends State { + doChangeActiveSlug: (activeSlug: string) => void; + doChangeSlugInView: (slugInView: string) => void; +} + +export const useAppState = (): UseAppStateReturn => { + const { setState, ...rest } = React.useContext(AppStateContext); + + function setter(key: string) { + return (value: T) => + setState((state: State) => ({ + ...state, + [key]: value, + })); + } + + const doChangeActiveSlug = setter('activeSlug'); + + const doChangeSlugInView = setter('slugInView'); + + return { + ...rest, + doChangeActiveSlug, + doChangeSlugInView, + setState, + }; +}; diff --git a/docs/src/common/hooks/use-color-mode.ts b/docs/src/common/hooks/use-color-mode.ts new file mode 100644 index 0000000..5f324f4 --- /dev/null +++ b/docs/src/common/hooks/use-color-mode.ts @@ -0,0 +1,69 @@ +import React from 'react'; +import { useMediaQuery } from '@common/hooks/use-media-query'; +import { THEME_STORAGE_KEY } from '@common/constants'; + +export const useColorMode = (): [string, () => void, (mode: 'dark' | 'light') => void] => { + const [darkmode] = useMediaQuery('(prefers-color-scheme: dark)'); + const [lightmode] = useMediaQuery('(prefers-color-scheme: light)'); + const setMode = typeof localStorage !== 'undefined' && localStorage.getItem(THEME_STORAGE_KEY); + + const [colorMode, setColorMode] = React.useState<'dark' | 'light' | undefined>(undefined); + + const setHtmlBackgroundColor = React.useCallback(() => { + document.documentElement.style.background = getComputedStyle( + document.documentElement + ).getPropertyValue('--colors-bg'); + }, []); + + const setDarkMode = React.useCallback(() => { + localStorage.setItem(THEME_STORAGE_KEY, 'dark'); + setColorMode('dark'); + document.documentElement.classList.add('dark'); + document.documentElement.classList.remove('light'); + setHtmlBackgroundColor(); + }, []); + + const setLightMode = React.useCallback(() => { + localStorage.setItem(THEME_STORAGE_KEY, 'light'); + setColorMode('light'); + document.documentElement.classList.add('light'); + document.documentElement.classList.remove('dark'); + setHtmlBackgroundColor(); + }, []); + + React.useEffect(() => { + if (setMode) { + if (setMode === 'dark') { + setColorMode('dark'); + } + if (setMode === 'light') { + setColorMode('light'); + } + } else { + if (darkmode) { + setDarkMode(); + } + if (lightmode) { + setLightMode(); + } + } + }, [setMode, lightmode, darkmode]); + + const toggleColorMode = React.useCallback(() => { + if (typeof document !== 'undefined') { + if (setMode) { + if (setMode === 'light') { + setDarkMode(); + } else { + setLightMode(); + } + } else if (darkmode) { + setLightMode(); + } else { + setDarkMode(); + } + } + }, [darkmode, lightmode, setMode, colorMode]); + + return [colorMode, toggleColorMode, setColorMode]; +}; diff --git a/docs/src/common/hooks/use-fathom.ts b/docs/src/common/hooks/use-fathom.ts new file mode 100644 index 0000000..51dba2d --- /dev/null +++ b/docs/src/common/hooks/use-fathom.ts @@ -0,0 +1,23 @@ +import { useEffect } from 'react'; +import { useRouter } from 'next/router'; +import * as Fathom from 'fathom-client'; + +export const useFathom = () => { + const router = useRouter(); + + useEffect(() => { + Fathom.load(process.env.FATHOM_ID, { + includedDomains: ['docs.blockstack.org'], + }); + + function onRouteChangeComplete() { + Fathom.trackPageview(); + } + + router.events.on('routeChangeComplete', onRouteChangeComplete); + + return () => { + router.events.off('routeChangeComplete', onRouteChangeComplete); + }; + }, []); +}; diff --git a/docs/src/common/hooks/use-favicon.ts b/docs/src/common/hooks/use-favicon.ts new file mode 100644 index 0000000..a8d733f --- /dev/null +++ b/docs/src/common/hooks/use-favicon.ts @@ -0,0 +1,7 @@ +import { useColorMode } from '@common/hooks/use-color-mode'; + +export const useFaviconName = () => { + const [mode] = useColorMode(); + const darkmode = mode === 'dark'; + return `favicon-${darkmode ? 'light' : 'dark'}.svg`; +}; diff --git a/docs/src/common/hooks/use-headroom.ts b/docs/src/common/hooks/use-headroom.ts new file mode 100644 index 0000000..7196617 --- /dev/null +++ b/docs/src/common/hooks/use-headroom.ts @@ -0,0 +1,43 @@ +import { Ref, useEffect, useState } from 'react'; +import debounce from 'lodash.debounce'; +import { useRect } from '@reach/rect'; +import { useScroll } from '@common/hooks/use-scroll'; + +export const useHeadroom = (target: Ref, { useStyle = true, wait = 0 } = {}) => { + const styleInserted = false; + const rect = useRect(target as any); + const { scrollY, scrollDirection } = useScroll(); + + if (typeof document !== 'undefined') { + const header = document.querySelector('.headroom'); + + const listener = debounce(() => { + header?.classList?.toggle('unpinned', window.pageYOffset >= rect?.height); + }, 50); + + useEffect(() => { + if ( + scrollDirection === 'down' && + header.classList.contains('unpinned') && + header.classList.contains('hidden') + ) { + header.classList.remove('hidden'); + } + if ( + scrollDirection === 'up' && + header.classList.contains('unpinned') && + !header.classList.contains('hidden') + ) { + header.classList.add('hidden'); + } + }, [scrollDirection]); + + useEffect(() => { + if (rect) { + document.addEventListener('scroll', listener, { passive: true }); + + return () => document.removeEventListener('scroll', listener); + } + }, [rect]); + } +}; diff --git a/docs/src/common/hooks/use-lock-body-scroll.tsx b/docs/src/common/hooks/use-lock-body-scroll.tsx new file mode 100644 index 0000000..3055599 --- /dev/null +++ b/docs/src/common/hooks/use-lock-body-scroll.tsx @@ -0,0 +1,24 @@ +import React from 'react'; +import { useSafeLayoutEffect } from '@stacks/ui'; + +export const useLockBodyScroll = (lock: boolean) => { + useSafeLayoutEffect(() => { + // Get original body overflow + const originalStyle = window.getComputedStyle(document.body).overflow; + + if (lock) { + if (document.body.style.overflow !== 'hidden') { + document.body.style.overflow = 'hidden'; + } + } else { + if (document.body.style.overflow !== originalStyle) { + document.body.style.overflow = originalStyle; + } + } + + // Re-enable scrolling when component unmounts + return () => { + document.body.style.overflow = originalStyle; + }; + }, [lock]); // Empty array ensures effect is only run on mount and unmount +}; diff --git a/docs/src/common/hooks/use-media-query.tsx b/docs/src/common/hooks/use-media-query.tsx new file mode 100644 index 0000000..e20b99b --- /dev/null +++ b/docs/src/common/hooks/use-media-query.tsx @@ -0,0 +1,35 @@ +import * as React from 'react'; +import { useSafeLayoutEffect } from '@stacks/ui'; + +const isBrowser = typeof window !== 'undefined'; + +const isSupported = (api: string) => isBrowser && api in window; + +/** + * React hook that tracks state of a CSS media query + * + * @param query the media query to match + */ +export function useMediaQuery(query: string) { + const [matches, setMatches] = React.useState(() => { + if (!isSupported('matchMedia')) return false; + return window.matchMedia(query).matches; + }); + + useSafeLayoutEffect(() => { + if (!isSupported('matchMedia')) return; + + const mediaQueryList = window.matchMedia(query); + const listener = () => setMatches(mediaQueryList.matches); + + mediaQueryList.addListener(listener); + + listener(); + + return () => { + mediaQueryList.removeListener(listener); + }; + }, [query]); + + return [matches, setMatches] as const; +} diff --git a/docs/src/common/hooks/use-mobile-menu.tsx b/docs/src/common/hooks/use-mobile-menu.tsx new file mode 100644 index 0000000..7b86452 --- /dev/null +++ b/docs/src/common/hooks/use-mobile-menu.tsx @@ -0,0 +1,27 @@ +import React, { useCallback } from 'react'; +import { useAppState } from '@common/hooks/use-app-state'; +import { State } from '@components/app-state/types'; + +export const useMobileMenuState = () => { + const { setState, mobileMenu: isOpen } = useAppState(); + + const handleToggle = useCallback( + () => setState((s: State) => ({ ...s, mobileMenu: !s.mobileMenu })), + [isOpen] + ); + const handleClose = useCallback( + () => isOpen && setState((s: State) => ({ ...s, mobileMenu: false })), + [isOpen] + ); + const handleOpen = useCallback( + () => !isOpen && setState((s: State) => ({ ...s, mobileMenu: true })), + [isOpen] + ); + return { + isOpen, + setOpen: setState, + handleToggle, + handleClose, + handleOpen, + }; +}; diff --git a/docs/src/common/hooks/use-on-screen.tsx b/docs/src/common/hooks/use-on-screen.tsx new file mode 100644 index 0000000..bbe19fc --- /dev/null +++ b/docs/src/common/hooks/use-on-screen.tsx @@ -0,0 +1,26 @@ +import { useState, useEffect } from 'react'; + +export function useOnScreen(ref, rootMargin = '0px') { + // State and setter for storing whether element is visible + const [isIntersecting, setIntersecting] = useState(false); + + useEffect(() => { + const observer = new IntersectionObserver( + ([entry]) => { + // Update our state when observer callback fires + setIntersecting(entry.isIntersecting); + }, + { + rootMargin, + } + ); + if (ref.current) { + observer.observe(ref.current); + } + return () => { + observer.unobserve(ref.current); + }; + }, []); // Empty array ensures that effect is only run on mount and unmount + + return isIntersecting; +} diff --git a/docs/src/common/hooks/use-scroll.tsx b/docs/src/common/hooks/use-scroll.tsx new file mode 100644 index 0000000..f60fa28 --- /dev/null +++ b/docs/src/common/hooks/use-scroll.tsx @@ -0,0 +1,65 @@ +/** + * useScroll React custom hook + * Usage: + * const { scrollX, scrollY, scrollDirection } = useScroll();7 + * Original Source: https://gist.github.com/joshuacerbito/ea318a6a7ca4336e9fadb9ae5bbb8f4 + */ +import { useState, useEffect } from 'react'; + +type SSRRect = { + bottom: number; + height: number; + left: number; + right: number; + top: number; + width: number; + x: number; + y: number; +}; +const EmptySSRRect: SSRRect = { + bottom: 0, + height: 0, + left: 0, + right: 0, + top: 0, + width: 0, + x: 0, + y: 0, +}; + +export const useScroll = () => { + const [lastScrollTop, setLastScrollTop] = useState(0); + const [bodyOffset, setBodyOffset] = useState( + typeof window === 'undefined' || !window.document + ? EmptySSRRect + : document.body.getBoundingClientRect() + ); + const [scrollY, setScrollY] = useState(bodyOffset.top); + const [scrollX, setScrollX] = useState(bodyOffset.left); + const [scrollDirection, setScrollDirection] = useState<'down' | 'up' | undefined>(); + + const listener = () => { + setBodyOffset( + typeof window === 'undefined' || !window.document + ? EmptySSRRect + : document.body.getBoundingClientRect() + ); + setScrollY(-bodyOffset.top); + setScrollX(bodyOffset.left); + setScrollDirection(lastScrollTop > -bodyOffset.top ? 'down' : 'up'); + setLastScrollTop(-bodyOffset.top); + }; + + useEffect(() => { + window.addEventListener('scroll', listener); + return () => { + window.removeEventListener('scroll', listener); + }; + }); + + return { + scrollY, + scrollX, + scrollDirection, + }; +}; diff --git a/docs/src/common/hooks/use-side-nav.ts b/docs/src/common/hooks/use-side-nav.ts new file mode 100644 index 0000000..f6496a8 --- /dev/null +++ b/docs/src/common/hooks/use-side-nav.ts @@ -0,0 +1,95 @@ +import React from 'react'; +// @ts-ignore +import nav from '@common/navigation.yaml'; +import { useRouter } from 'next/router'; +import { useMobileMenuState } from '@common/hooks/use-mobile-menu'; +import { useRecoilState } from 'recoil'; +import { sideNavState, SideNavState } from '@common/store'; + +export const useSideNavState = (): [state: SideNavState, setState: any] => { + const [selected, setSelected] = useRecoilState(sideNavState); + + return [selected, setSelected]; +}; +const useAutoUpdateSideNav = () => { + const [selected, setSelected] = useSideNavState(); + const router = useRouter(); + React.useEffect(() => { + let currentSection; + + if (router.pathname === '/') { + currentSection = { + items: nav.sections, + type: 'default', + }; + } else { + nav.sections.forEach(section => { + section.pages.forEach(page => { + if (page.pages) { + const pagesFound = page.pages.find(_page => { + return router.pathname.endsWith(`${page.path}${_page.path}`); + }); + const sectionsFound = page?.sections?.find(_section => { + return _section.pages.find(_page => { + return router.pathname.endsWith(`${page.path}${_page.path}`); + }); + }); + if (pagesFound || sectionsFound) { + currentSection = { + type: 'page', + items: page, + }; + } + } else if (!currentSection && router.pathname.endsWith(page.path)) { + currentSection = { + items: nav.sections, + type: 'default', + }; + } + }); + }); + } + + if (currentSection?.items && selected.items !== currentSection.items) { + setSelected(currentSection); + } + }, [router.pathname]); +}; + +export const useSideNav = () => { + const [{ items, type, expanded, selected }, setSelected] = useSideNavState(); + const { handleClose } = useMobileMenuState(); + + const handleUpdateExpanded = (expanded: string) => setSelected(s => ({ ...s, expanded })); + const handleUpdateSelected = (selected: any | undefined) => + setSelected(s => ({ ...s, selected })); + const handleUpdateType = (type: 'page' | 'default') => setSelected(s => ({ ...s, type })); + + const handleClick = (_selected: any) => { + if (_selected.pages) { + setSelected({ + type: 'page', + items: selected, + }); + } + handleClose(); + }; + + const handleBack = () => + setSelected({ + type: 'default', + items: nav.sections, + }); + + return { + items, + type, + expanded, + selected, + handleClick, + handleBack, + handleUpdateExpanded, + handleUpdateSelected, + handleUpdateType, + }; +}; diff --git a/docs/src/common/hooks/use-touchable.tsx b/docs/src/common/hooks/use-touchable.tsx new file mode 100644 index 0000000..89891d1 --- /dev/null +++ b/docs/src/common/hooks/use-touchable.tsx @@ -0,0 +1,14 @@ +import { useHover, useActive } from 'use-events'; + +export const useTouchable = (options?: any) => { + const [hover, hoverBind] = useHover(); + const [active, activeBind] = useActive(); + return { + bind: { + ...hoverBind, + ...activeBind, + }, + hover, + active, + }; +}; diff --git a/docs/src/common/navigation.yaml b/docs/src/common/navigation.yaml new file mode 100644 index 0000000..2cbdf74 --- /dev/null +++ b/docs/src/common/navigation.yaml @@ -0,0 +1,31 @@ +sections: + - pages: + - path: /installation + - path: /patterns-and-principles + - path: /responsive-styles + - path: /contributing + - title: Core + slug: core + pages: + - path: /system-props + - path: /theme + - path: /colors + - path: /space + - path: /typography + - title: Components + slug: components + pages: + - path: /box + - path: /grid + - path: /flex + - path: /text + - path: /stack + - path: /button + - path: /codeblock + - path: /icons + - path: /color-modes + - path: /css-reset + - title: Hooks + slug: hooks + pages: + - path: /use-theme diff --git a/docs/src/common/routes/get-routes.js b/docs/src/common/routes/get-routes.js new file mode 100644 index 0000000..aa42edb --- /dev/null +++ b/docs/src/common/routes/get-routes.js @@ -0,0 +1,83 @@ +/** + * Routes + * + * This file contains our paths for all of our markdown files and is pre evaluated at runtime to get the content + * from all the markdown: front matter and extracts all the headings from the document. + * + * This data is used to dynamically generate the sidenav. + * + */ +const fm = require('front-matter'); +const fs = require('fs-extra'); +const path = require('path'); + +const slugify = string => + string + .toLowerCase() + .replace(/\s+/g, '-') // Replace spaces with - + .replace(/[^\w\-]+/g, '') // Remove all non-word chars + .replace(/\-\-+/g, '-') // Replace multiple - with single - + .replace(/^-+/, '') // Trim - from start of text + .replace(/-+$/, ''); // Trim - from end of text + +const YAML = require('yaml'); +const yamlFile = fs.readFileSync(path.resolve(__dirname, '../navigation.yaml'), 'utf8'); +const navigation = YAML.parse(yamlFile); + +const getFlatMap = navigation => { + return navigation.sections.flatMap(section => + section.pages.flatMap(page => { + if (page.pages) { + let sectionPages = []; + if (page.sections) { + sectionPages = page.sections.flatMap(_section => { + return _section.pages.flatMap( + sectionPage => sectionPage && sectionPage.path && `${page.path}${sectionPage.path}` + ); + }); + } + const pages = page.pages.flatMap(_page => { + if (_page.pages) { + return _page.pages.flatMap(p => `${page.path}${_page.path}${p.path}`); + } else { + return _page.path && `${page.path}${_page.path}`; + } + }); + return [...pages, ...sectionPages]; + } else { + return `${section.slug ? `/${slugify(section.slug)}` : ''}${page.path}`; + } + }) + ); +}; + +const allRoutes = getFlatMap(navigation).filter(route => route); + +const getHeadings = mdContent => { + const regex = /(#+)(.*)/gm; + const found = mdContent.match(regex); + return found && found.length + ? found.map(f => f && f.split('# ')[1]).filter(f => typeof f !== 'undefined') + : null; +}; + +const routes = allRoutes.map(route => { + try { + const fileContent = fs.readFileSync( + path.join('./src/pages', (route === '/' ? 'index' : route) + '.mdx'), + 'utf8' + ); + const data = fm(fileContent); + const headings = getHeadings(data.body); + return { + path: route, + ...data.attributes, + headings, + }; + } catch (e) { + console.error('ROUTES ERROR'); + console.warn(e); + } +}); + +module.exports = routes; diff --git a/docs/src/common/routes/index.ts b/docs/src/common/routes/index.ts new file mode 100644 index 0000000..9bcb6f6 --- /dev/null +++ b/docs/src/common/routes/index.ts @@ -0,0 +1,5 @@ +import preval from 'preval.macro'; + +const routes = preval`module.exports = require('./get-routes')`; + +export default routes; diff --git a/docs/src/common/store/index.ts b/docs/src/common/store/index.ts new file mode 100644 index 0000000..40c438a --- /dev/null +++ b/docs/src/common/store/index.ts @@ -0,0 +1,19 @@ +import { atom } from 'recoil'; +// @ts-ignore +import nav from '@common/navigation.yaml'; + +export interface SideNavState { + type: 'default' | 'page'; + items: any; + selected: any; + expanded: string; +} +export const sideNavState = atom({ + key: 'app.sidenav', + default: { + type: 'default', + items: nav.sections, + selected: undefined, + expanded: nav.sections[1].title, + }, +}); diff --git a/docs/src/common/utils/hover-enabled.ts b/docs/src/common/utils/hover-enabled.ts new file mode 100644 index 0000000..efde154 --- /dev/null +++ b/docs/src/common/utils/hover-enabled.ts @@ -0,0 +1,43 @@ +const canUseDOM = !!( + typeof window !== 'undefined' && + window.document && + window.document.createElement +); + +let isEnabled = false; + +const HOVER_THRESHOLD_MS = 1000; +let lastTouchTimestamp = 0; + +function enableHover() { + if (isEnabled || Date.now() - lastTouchTimestamp < HOVER_THRESHOLD_MS) { + return; + } + isEnabled = true; +} + +function disableHover() { + lastTouchTimestamp = Date.now(); + if (isEnabled) { + isEnabled = false; + } +} + +if (canUseDOM) { + document.addEventListener('touchstart', disableHover, { + capture: true, + passive: true, + }); + document.addEventListener('touchmove', disableHover, { + capture: true, + passive: true, + }); + document.addEventListener('mousemove', enableHover, { + capture: true, + passive: true, + }); +} + +export function isHoverEnabled() { + return isEnabled; +} diff --git a/docs/src/common/utils/index.ts b/docs/src/common/utils/index.ts new file mode 100644 index 0000000..a613413 --- /dev/null +++ b/docs/src/common/utils/index.ts @@ -0,0 +1,125 @@ +import { Children, isValidElement, ReactNode, ReactElement, ReactText } from 'react'; +import { Property } from 'csstype'; +import { color } from '@stacks/ui'; +import { ColorsStringLiteral } from '@stacks/ui'; + +const camelToKebab = (string: string) => + string + .toString() + .replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2') + .toLowerCase(); + +export const slugify = (string: string): string => + string + .toLowerCase() + .replace(/\s+/g, '-') // Replace spaces with - + .replace(/[^\w\-]+/g, '') // Remove all non-word chars + .replace(/\-\-+/g, '-') // Replace multiple - with single - + .replace(/^-+/, '') // Trim - from start of text + .replace(/-+$/, ''); // Trim - from end of text + +export const capitalize = ([s, ...tring]: string): string => [s.toUpperCase(), ...tring].join(''); +export const convertToTitle = (path: string) => + !path ? null : path === '/' ? 'Home' : capitalize(path.replace('/', '').replace(/-/g, ' ')); +export const border = ( + width = 1, + style: Property.BorderStyle = 'solid', + _color: ColorsStringLiteral = 'border' +): string => `${width}px ${style} ${color(_color)}`; + +// https://github.com/fernandopasik/react-children-utilities/blob/master/src/lib/hasChildren.ts +const hasChildren = (element: ReactNode): element is ReactElement<{ children: ReactNode[] }> => + isValidElement<{ children?: ReactNode[] }>(element) && Boolean(element.props.children); + +// https://github.com/fernandopasik/react-children-utilities/blob/master/src/lib/onlyText.ts + +export const childToString = (child?: ReactText | boolean | unknown | null): string => { + if (typeof child === 'undefined' || child === null || typeof child === 'boolean') { + return ''; + } + + if (JSON.stringify(child) === '{}') { + return ''; + } + + return (child as string | number).toString(); +}; + +export const onlyText = (children: ReactNode): string => { + if (!(children instanceof Array) && !isValidElement(children)) { + return childToString(children); + } + + return Children.toArray(children).reduce((text: string, child: ReactNode): string => { + let newText = ''; + + if (isValidElement(child) && hasChildren(child)) { + newText = onlyText(child.props.children) + '\n'; + } else if (isValidElement(child) && !hasChildren(child)) { + newText = ''; + } else { + newText = childToString(child); + } + + return text.concat(newText); + }, '') as string; +}; + +const getTitleFromHeading = (headings?: any[]) => + headings?.length + ? typeof headings[0] === 'string' + ? headings[0] + : headings[0].content + : undefined; + +export const getTitle = ({ title, headings }: { title?: string; headings?: any[] }): string => + title || getTitleFromHeading(headings); + +export const transition = (timing = '0.2s', properties = 'all') => + `${properties} ${timing} cubic-bezier(0.23, 1, 0.32, 1)`; + +export const getCategory = (pathname: string) => { + const arr = pathname.split('/'); + if (arr.length > 1) { + return arr[1]; + } + return undefined; +}; + +export const getSlug = (asPath: string) => { + if (asPath.includes('#')) { + const slug = asPath.split('#')[1]; + return slug; + } + return; +}; + +interface CancelablePromise { + promise: Promise; + cancel: () => void; +} + +/** Make a Promise "cancelable". + * + * Rejects with {isCanceled: true} if canceled. + * + * The way this works is by wrapping it with internal hasCanceled_ state + * and checking it before resolving. + */ +export const makeCancelable = (promise: Promise): CancelablePromise => { + let hasCanceled_ = false; + + const wrappedPromise = new Promise((resolve, reject) => { + void promise.then((val: any) => (hasCanceled_ ? reject({ isCanceled: true }) : resolve(val))); + void promise.catch((error: any) => + hasCanceled_ ? reject({ isCanceled: true }) : reject(error) + ); + }); + + return { + promise: wrappedPromise, + cancel() { + hasCanceled_ = true; + }, + }; +}; diff --git a/docs/src/components/app-state/context.ts b/docs/src/components/app-state/context.ts new file mode 100644 index 0000000..37a8b0a --- /dev/null +++ b/docs/src/components/app-state/context.ts @@ -0,0 +1,11 @@ +import React from 'react'; +import { State } from '@components/app-state/types'; +import routes from '@common/routes'; + +export const initialState: State = { + mobileMenu: false, + activeSlug: '', + setState: (value: any) => null, + routes, +}; +export const AppStateContext = React.createContext(initialState); diff --git a/docs/src/components/app-state/index.tsx b/docs/src/components/app-state/index.tsx new file mode 100644 index 0000000..b66854b --- /dev/null +++ b/docs/src/components/app-state/index.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { AppStateContext, initialState } from '@components/app-state/context'; + +const AppStateProvider = ({ ...props }: any) => { + const [state, setState] = React.useState(initialState); + + return ( + + ); +}; + +export { AppStateProvider, AppStateContext }; diff --git a/docs/src/components/app-state/types.ts b/docs/src/components/app-state/types.ts new file mode 100644 index 0000000..e3391fb --- /dev/null +++ b/docs/src/components/app-state/types.ts @@ -0,0 +1,7 @@ +export interface State { + mobileMenu: boolean; + activeSlug: string; + slugInView?: string; + setState: (value: any) => void; + routes: any; +} diff --git a/docs/src/components/app-wrapper.tsx b/docs/src/components/app-wrapper.tsx new file mode 100644 index 0000000..57e9638 --- /dev/null +++ b/docs/src/components/app-wrapper.tsx @@ -0,0 +1,20 @@ +import React from 'react'; +import { ColorModeProvider } from '@stacks/ui'; +import { AppStateProvider } from '@components/app-state'; +import { ProgressBar } from '@components/progress-bar'; +import { BaseLayout } from '@components/layouts/base-layout'; +import { Meta } from '@components/meta-head'; +import { useFathom } from '@common/hooks/use-fathom'; + +export const AppWrapper: React.FC = ({ children, isHome }) => { + useFathom(); + return ( + + + + + {children} + + + ); +}; diff --git a/docs/src/components/back-button.tsx b/docs/src/components/back-button.tsx new file mode 100644 index 0000000..1bb0f93 --- /dev/null +++ b/docs/src/components/back-button.tsx @@ -0,0 +1,35 @@ +import React from 'react'; +import { Flex, Box, color, space } from '@stacks/ui'; +import ArrowLeftIcon from 'mdi-react/ArrowLeftIcon'; +import { Text } from '@components/typography'; +import Link from 'next/link'; + +const Wrapper = ({ href, children }) => + href ? ( + + {children} + + ) : ( + children + ); + +export const BackButton = ({ href, ...rest }) => ( + + + + + + Back + + +); diff --git a/docs/src/components/color-mode-button.tsx b/docs/src/components/color-mode-button.tsx new file mode 100644 index 0000000..9619bdf --- /dev/null +++ b/docs/src/components/color-mode-button.tsx @@ -0,0 +1,20 @@ +import React, { forwardRef, memo, Ref } from 'react'; +import { BoxProps, IconButton, useColorMode } from '@stacks/ui'; +import { IconSun, IconSunOff } from '@tabler/icons/icons-react/dist/index.esm'; + +export const ColorModeButton = memo( + forwardRef((props: BoxProps, ref: Ref) => { + const { colorMode, toggleColorMode } = useColorMode(); + const Icon = colorMode === 'light' ? IconSun : IconSunOff; + return ( + + ); + }) +); diff --git a/docs/src/components/common.tsx b/docs/src/components/common.tsx new file mode 100644 index 0000000..3cc75ea --- /dev/null +++ b/docs/src/components/common.tsx @@ -0,0 +1,48 @@ +import React from 'react'; +import { + Box, + Grid, + Flex, + BoxProps, + transition, + space, + GridProps, + color, + FlexProps, +} from '@stacks/ui'; +import { CONTENT_MAX_WIDTH } from '@common/constants'; + +export const CircleIcon: React.FC< + FlexProps & { icon: React.FC; hover?: boolean; dark?: boolean } +> = ({ size = '72px', icon: Icon, hover, dark, ...rest }) => ( + + + + + +); + +export const Section: React.FC = props => ( + +); + +export const SectionWrapper: React.FC = props => ( + +); diff --git a/docs/src/components/content-wrapper.tsx b/docs/src/components/content-wrapper.tsx new file mode 100644 index 0000000..a091a44 --- /dev/null +++ b/docs/src/components/content-wrapper.tsx @@ -0,0 +1,19 @@ +import React from 'react'; +import { Flex, FlexProps, space } from '@stacks/ui'; +import { ForwardRefExoticComponentWithAs, forwardRefWithAs } from '@stacks/ui-core'; + +const ContentWrapper: ForwardRefExoticComponentWithAs = forwardRefWithAs< + FlexProps, + 'div' +>((props, ref) => ( + +)); + +export { ContentWrapper }; diff --git a/docs/src/components/custom-blocks/page-reference.tsx b/docs/src/components/custom-blocks/page-reference.tsx new file mode 100644 index 0000000..196023e --- /dev/null +++ b/docs/src/components/custom-blocks/page-reference.tsx @@ -0,0 +1,303 @@ +import React from 'react'; +import { Box, BoxProps, color, Flex, Grid, space } from '@stacks/ui'; +import { BlockstackLogo } from '@components/icons/blockstack-logo'; +import { StackIcon } from '@components/icons/stack'; +import { SitemapIcon } from '@components/icons/sitemap'; +import { border, onlyText, transition } from '@common/utils'; +import { useTouchable } from '@common/hooks/use-touchable'; +import { Text } from '@components/typography'; +import Link from 'next/link'; +import { useAppState } from '@common/hooks/use-app-state'; +import Image from 'next/image'; +import { getCapsizeStyles, getHeadingStyles } from '@components/mdx/typography'; + +// const Image = ({ +// src, +// isHovered, +// size, +// alt, +// ...rest +// }: BoxProps & { src?: string; isHovered?: boolean; alt?: string }) => ( +// +// {alt} +// +// ); + +const Title: React.FC = ({ children, ...props }) => ( + + {children} + +); + +const Description = ({ children, ...props }) => ( + + {children} + +); + +const FloatingLink = ({ href, contents, ...props }: any) => ( + + + {contents} + + +); +const InlineCard = ({ page }) => { + const { hover, active, bind } = useTouchable({ + behavior: 'link', + }); + return ( + + + {/**/} + + + + + {page.title || page.headings[0]} + + {page.tags?.length ? ( + + {page.tags.map((tag, key) => ( + + {tag} + + ))} + + ) : null} + + {page.description} + + + + ); +}; + +const GridCardImage: React.FC< + BoxProps & { isHovered?: boolean; src?: string; alt?: string } +> = React.memo(({ isHovered, src, alt, ...props }) => ( + + + + + +)); + +const GridItemDetails: React.FC = React.memo( + ({ isHovered, page, ...props }) => ( + <> + + + {page.title || page.headings[0]} + + {page.description} + + + + ) +); + +const GridCard: React.FC = React.memo(({ page, ...rest }) => { + const { hover, active, bind } = useTouchable({ + behavior: 'link', + }); + return ( + + + + + ); +}); + +const getIcon = (icon: string) => { + switch (icon) { + case 'BlockstackIcon': + return (p: BoxProps) => ; + case 'StacksIcon': + return (p: BoxProps) => ( + + + + ); + case 'TestnetIcon': + return (p: BoxProps) => ( + + + + ); + default: + return (p: BoxProps) => ; + } +}; +const GridSmallItem: React.FC = ({ page, ...rest }) => { + const { hover, active, bind } = useTouchable({ + behavior: 'link', + }); + const Icon = getIcon(page.icon); + return ( + + {page.icon ? : null} + + + ); +}; + +const getComponent = (type: 'default' | 'inline' | 'grid' | 'grid-small') => { + switch (type) { + case 'inline': + return InlineCard; + case 'grid': + return GridCard; + case 'grid-small': + return GridSmallItem; + default: + return InlineCard; + } +}; + +export const PageReference: React.FC = React.memo(({ children, ...rest }) => { + const content = onlyText(children).trim(); + const [variant, _paths] = content.includes('\n') ? content.split('\n') : ['default', content]; + const paths = _paths.includes(', ') ? _paths.split(', ') : [_paths]; + const { routes } = useAppState(); + + if (!routes) return null; + + const pages = paths.map(path => routes?.find(route => route.path === path)).filter(page => page); + + const Comp = getComponent(variant as any); + return ( + + + {pages.map((page, key) => ( + + ))} + + + ); +}); diff --git a/docs/src/components/example.tsx b/docs/src/components/example.tsx new file mode 100644 index 0000000..29e0899 --- /dev/null +++ b/docs/src/components/example.tsx @@ -0,0 +1,196 @@ +import React from 'react'; +import { + BlockstackIcon, + Box, + BoxProps, + ChevronIcon, + CodeBlock as BaseCodeBlock, + color, + Flex, + FlexProps, + space, + Stack, + themeColor, +} from '@stacks/ui'; +import Prism from 'prismjs/components/prism-core'; +// import 'prismjs/components/prism-jsx'; +import { Caption, Text } from '@components/typography'; + +import { border } from '@common/utils'; + +export const SimpleCodeBlock = ({ editorCode, language, ...rest }) => ( + +); + +const Circle: React.FC = ({ size = '72px', ...rest }) => ( + +); + +const Avatar = ({ ...rest }) => ; + +const Progress = ({ amount, ...rest }) => ( + + + +); + +const AppItem: React.FC = ({ + name, + usage, + ...rest +}) => ( + + + + {name} + + + {usage} + + + +); + +const ListItem: React.FC = props => ( + +); + +const Title: React.FC = props => ( + +); + +export const ExampleComponent: React.FC = props => ( + + + Data storage + + + + Connected to + + + + My Gaia Hub + + + + + + + App data + + + + + + + +); + +export const exampleCode = ` + + + Data storage + + + + Connected to + + App data + + + + + + +`; + +export const gaiaHubUsage = ` + + + + My Gaia Hub + + + + + +`; + +export const appItem = ` + + + + {name} + + + {usage} + + +`; diff --git a/docs/src/components/feedback.tsx b/docs/src/components/feedback.tsx new file mode 100644 index 0000000..d7eb77c --- /dev/null +++ b/docs/src/components/feedback.tsx @@ -0,0 +1,138 @@ +import React from 'react'; +import { + Box, + Button, + BoxProps, + color, + Flex, + space, + Stack, + transition, + SlideFade, +} from '@stacks/ui'; +import { Text } from '@components/typography'; +import { Link } from '@components/mdx'; +import { SadIcon, NeutralIcon, HappyIcon } from '@components/icons/feedback'; +import { useTouchable } from '@common/hooks/use-touchable'; +import { border } from '@common/utils'; +import { useRouter } from 'next/router'; +import { getHeadingStyles } from '@components/mdx/typography'; +import { css } from '@stacks/ui-core'; +import { StatusCheck } from '@components/status-check'; +import { useColorMode } from '@common/hooks/use-color-mode'; + +const Icon: React.FC }> = ({ icon: IconComponent, ...props }) => { + const { bind, hover, active } = useTouchable(); + const isHovered = hover || active; + const [mode] = useColorMode(); + return ( + + + + ); +}; + +const FeedbackCard = ({ show, onClose }) => { + return ( + + {styles => ( + + + + + + + Dismiss + + + + + + )} + + ); +}; + +export const FeedbackSection: React.FC = props => { + const { pathname } = useRouter(); + const [showButton, setShowButton] = React.useState(false); + const handleShow = () => { + setShowButton(!showButton); + }; + const editPage = pathname === '/' ? '/index' : pathname; + return ( + + + + Was this page helpful? + + handleShow()} icon={SadIcon} /> + handleShow()} icon={NeutralIcon} /> + handleShow()} icon={HappyIcon} /> + + + setShowButton(false)} /> + + + + Edit this page on GitHub + + + + + ); +}; diff --git a/docs/src/components/footer.tsx b/docs/src/components/footer.tsx new file mode 100644 index 0000000..0ee8de4 --- /dev/null +++ b/docs/src/components/footer.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { space } from '@stacks/ui'; +import { Pagination } from '@components/pagination'; +import { Section, SectionWrapper } from '@components/common'; +import { FeedbackSection } from '@components/feedback'; + +const Footer = ({ hidePagination, ...rest }: any) => { + return ( +
+ + + + +
+ ); +}; + +export { Footer }; diff --git a/docs/src/components/header.tsx b/docs/src/components/header.tsx new file mode 100644 index 0000000..b35d0dd --- /dev/null +++ b/docs/src/components/header.tsx @@ -0,0 +1,258 @@ +import React from 'react'; +import { + Flex, + Box, + BlockstackIcon, + Stack, + color, + space, + BoxProps, + ChevronIcon, + FlexProps, + Fade, +} from '@stacks/ui'; +import { Link, LinkProps, Text } from '@components/typography'; +import MenuIcon from 'mdi-react/MenuIcon'; +import CloseIcon from 'mdi-react/CloseIcon'; +import { useMobileMenuState } from '@common/hooks/use-mobile-menu'; + +import { ForwardRefExoticComponentWithAs, forwardRefWithAs } from '@stacks/ui-core'; +import NextLink from 'next/link'; +import { ColorModeButton } from '@components/color-mode-button'; +import { PAGE_WIDTH } from '@common/constants'; +import { border, transition } from '@common/utils'; +import { getCapsizeStyles } from '@components/mdx/typography'; +import { useTouchable } from '@common/hooks/use-touchable'; +import { StacksLogo } from '@components/stacks-logo'; + +const MenuButton = ({ ...rest }: any) => { + const { isOpen, handleOpen, handleClose } = useMobileMenuState(); + const Icon = isOpen ? CloseIcon : MenuIcon; + const handleClick = isOpen ? handleClose : handleOpen; + return ( + + + + ); +}; + +const HeaderWrapper: React.FC = React.forwardRef((props, ref: any) => ( + +)); + +interface NavChildren { + label: string; + href?: string; + target?: string; +} + +interface NavItem { + label: string; + href: string; + target?: string; + children?: NavItem[]; +} + +const nav: NavItem[] = [ + { + label: 'Start building', + href: '', + children: [ + { + label: 'Documentation', + href: 'https://docs.blockstack.org/', + target: '_self', + }, + { + label: 'GitHub', + href: 'https://github.com/blockstack', + }, + { + label: 'Papers', + href: 'https://www.blockstack.org/papers', + }, + { + label: 'Discord', + href: 'https://discord.com/invite/6PcCMU', + }, + ], + }, + { label: 'Testnet', href: 'https://www.blockstack.org/testnet' }, + { label: 'Discover apps', href: 'https://app.co/' }, +]; + +export const HEADER_HEIGHT = 132; + +const HeaderTextItem: ForwardRefExoticComponentWithAs = forwardRefWithAs< + BoxProps & LinkProps, + 'a' +>(({ children, href, as = 'a', ...rest }, ref) => ( + + {children} + +)); + +const NavItem: React.FC = ({ item, ...props }) => { + const { hover, active, bind } = useTouchable({ + behavior: 'link', + }); + return ( + + + {item.label} + + + {item.children ? ( + + + + ) : null} + {item.children ? ( + + {styles => ( + + + {item.children.map((child, _key) => ( + + {child.label} + + ))} + + + )} + + ) : null} + + ); +}; + +const Navigation: React.FC = props => { + return ( + + + {nav.map((item, key) => ( + + ))} + + + ); +}; + +const LogoLink = () => { + const { hover, active, bind } = useTouchable(); + return ( + + + + + + + + UI + + + + + ); +}; + +const Header = ({ hideSubBar, ...rest }: any) => { + return ( + <> + + + + + + + + + + + + + + ); +}; + +export { Header }; diff --git a/docs/src/components/home/card.tsx b/docs/src/components/home/card.tsx new file mode 100644 index 0000000..6a7e918 --- /dev/null +++ b/docs/src/components/home/card.tsx @@ -0,0 +1,49 @@ +import React from 'react'; +import { Grid, Box, Flex, space, color, transition, FlexProps } from '@stacks/ui'; +import NextLink from 'next/link'; +import { useTouchable } from '@common/hooks/use-touchable'; + +interface CardProps extends FlexProps { + href?: string; + dark?: boolean; +} +const LinkComponent = ({ href }: { href: string }) => + href ? ( + + + + ) : null; + +export const Card: React.FC = ({ children, onClick, dark = false, href, ...rest }) => { + const { bind, hover, active } = useTouchable({ + behavior: 'link', + }); + return ( + + {href && } + + {(children as any)({ hover, active })} + + + ); +}; diff --git a/docs/src/components/home/code-example-section.tsx b/docs/src/components/home/code-example-section.tsx new file mode 100644 index 0000000..32739e7 --- /dev/null +++ b/docs/src/components/home/code-example-section.tsx @@ -0,0 +1,39 @@ +import React from 'react'; +import { Box, Flex, space } from '@stacks/ui'; +import { ExampleComponent } from '@components/example'; + +import { CodeExamples } from '@components/home/code-examples'; +import { BodyLarge, H2 } from '@components/home/text'; +import { Section, SectionWrapper } from '@components/home/common'; + +export const CodeSection = () => { + return ( +
+ + + +

Iterate quickly

+ + Build complex UI easily with primitives and highly composable components. + +
+ + + +
+ +
+
+ ); +}; + +export default CodeSection; diff --git a/docs/src/components/home/code-examples.tsx b/docs/src/components/home/code-examples.tsx new file mode 100644 index 0000000..cbe184e --- /dev/null +++ b/docs/src/components/home/code-examples.tsx @@ -0,0 +1,82 @@ +import React from 'react'; +import { Box, Flex, space, color, themeColor } from '@stacks/ui'; + +import { border } from '@common/utils'; + +import { + ExampleComponent, + SimpleCodeBlock, + exampleCode, + gaiaHubUsage, + appItem, +} from '@components/example'; +import { InlineCode } from '@components/mdx'; + +export const CodeExamples = () => { + const [tab, setTab] = React.useState<'example' | 'gaiaHubUsage' | 'appItem'>('example'); + const getExampleCode = () => { + switch (tab) { + case 'example': + return exampleCode; + case 'gaiaHubUsage': + return gaiaHubUsage; + case 'appItem': + return appItem; + } + }; + const handleSetTab = (value: 'example' | 'gaiaHubUsage' | 'appItem') => { + console.log(value); + setTab(value); + }; + const tabs: { label: string; slug: 'example' | 'gaiaHubUsage' | 'appItem' }[] = [ + { label: `ExampleComponent`, slug: 'example' }, + { label: `GaiaHubUsage`, slug: 'gaiaHubUsage' }, + { label: `AppItem`, slug: 'appItem' }, + ]; + return ( + + + + {tabs.map((_tab, key) => { + return ( + handleSetTab(_tab.slug)} + > + {_tab.label} + + ); + })} + + + + + + + + ); +}; diff --git a/docs/src/components/home/common.tsx b/docs/src/components/home/common.tsx new file mode 100644 index 0000000..3cc75ea --- /dev/null +++ b/docs/src/components/home/common.tsx @@ -0,0 +1,48 @@ +import React from 'react'; +import { + Box, + Grid, + Flex, + BoxProps, + transition, + space, + GridProps, + color, + FlexProps, +} from '@stacks/ui'; +import { CONTENT_MAX_WIDTH } from '@common/constants'; + +export const CircleIcon: React.FC< + FlexProps & { icon: React.FC; hover?: boolean; dark?: boolean } +> = ({ size = '72px', icon: Icon, hover, dark, ...rest }) => ( + + + + + +); + +export const Section: React.FC = props => ( + +); + +export const SectionWrapper: React.FC = props => ( + +); diff --git a/docs/src/components/home/footer.tsx b/docs/src/components/home/footer.tsx new file mode 100644 index 0000000..cf00b86 --- /dev/null +++ b/docs/src/components/home/footer.tsx @@ -0,0 +1,56 @@ +import React from 'react'; +import { Box, BoxProps, Grid, space, themeColor } from '@stacks/ui'; + +import { Section, SectionWrapper } from '@components/common'; +import { Text } from '@components/typography'; + +const SectionHeading: React.FC = props => ( + +); + +const SectionItem: React.FC = props => ( + +); + +export const Footer: React.FC = props => ( + +
+ + + + Primitives + Box + Flex + Grid + Text + + + Global & layout + ThemeProvider + CSS Reset + Color Modes + Stack + + + Utilities & hooks + space() + color() + border() + useClipboard + + + Stay up to date + GitHub + Twitter + Discord + Branding assets + + + +
+
+); diff --git a/docs/src/components/home/grid.tsx b/docs/src/components/home/grid.tsx new file mode 100644 index 0000000..a6bde6d --- /dev/null +++ b/docs/src/components/home/grid.tsx @@ -0,0 +1,19 @@ +import React from 'react'; +import { Box, space, color } from '@stacks/ui'; + +import { Body, SubHeading } from '@components/home/text'; +export const GridItem = ({ icon: Icon, title, body, ...rest }) => { + return ( + + {Icon && ( + + + + )} + + {title} + + {body} + + ); +}; diff --git a/docs/src/components/home/text.tsx b/docs/src/components/home/text.tsx new file mode 100644 index 0000000..44a3505 --- /dev/null +++ b/docs/src/components/home/text.tsx @@ -0,0 +1,109 @@ +import React from 'react'; +import { Box, BoxProps, color } from '@stacks/ui'; +import { Text } from '@components/typography'; +import { getCapsizeStyles, getHeadingStyles } from '@components/mdx/typography'; + +export const H1: React.FC = ({ children, ...rest }) => ( + + + {children} + + +); + +export const H2: React.FC = ({ children, ...rest }) => ( + + {children} + +); +export const H3: React.FC = ({ children, ...rest }) => ( + + {children} + +); +export const BodyLarge: React.FC = ({ children, ...rest }) => ( + + {children} + +); + +export const SubHeading = ({ as, children, ...rest }: any) => ( + + {children} + +); +export const Body = ({ as, children, ...rest }: any) => ( + + {children} + +); diff --git a/docs/src/components/hover-image.tsx b/docs/src/components/hover-image.tsx new file mode 100644 index 0000000..c1c2f30 --- /dev/null +++ b/docs/src/components/hover-image.tsx @@ -0,0 +1,58 @@ +import React from 'react'; +import { Box, BoxProps, Grid, space } from '@stacks/ui'; +import { transition } from '@common/utils'; +import { Img } from '@components/mdx/image'; + +const Image = ({ + src, + isHovered, + size, + ...rest +}: BoxProps & { src?: string; isHovered?: boolean }) => ( + + + +); +export const HoverImage: React.FC = React.memo( + ({ isHovered, src, ...props }) => ( + + + + + + ) +); diff --git a/docs/src/components/icons/_base.tsx b/docs/src/components/icons/_base.tsx new file mode 100644 index 0000000..01a1c5a --- /dev/null +++ b/docs/src/components/icons/_base.tsx @@ -0,0 +1,18 @@ +import React from 'react'; +import { Box, BoxProps } from '@stacks/ui'; +export type SvgProps = React.FC; + +export const BaseSvg: SvgProps = props => ( + +); diff --git a/docs/src/components/icons/accessible.tsx b/docs/src/components/icons/accessible.tsx new file mode 100644 index 0000000..bd6c29d --- /dev/null +++ b/docs/src/components/icons/accessible.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { Box, BoxProps } from '@stacks/ui'; + +export const AccessibleIcon: React.FC = props => ( + + + + + + +); diff --git a/docs/src/components/icons/alert-circle.tsx b/docs/src/components/icons/alert-circle.tsx new file mode 100644 index 0000000..3ce06fc --- /dev/null +++ b/docs/src/components/icons/alert-circle.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const AlertCircleIcon: SvgProps = props => ( + + + + + + +); diff --git a/docs/src/components/icons/alert-triangle.tsx b/docs/src/components/icons/alert-triangle.tsx new file mode 100644 index 0000000..d10598f --- /dev/null +++ b/docs/src/components/icons/alert-triangle.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const AlertTriangleIcon: SvgProps = props => ( + + + + + +); diff --git a/docs/src/components/icons/apps.tsx b/docs/src/components/icons/apps.tsx new file mode 100644 index 0000000..eb53a7b --- /dev/null +++ b/docs/src/components/icons/apps.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const AppsIcon: SvgProps = props => ( + + + + + + + + +); diff --git a/docs/src/components/icons/arrow-left.tsx b/docs/src/components/icons/arrow-left.tsx new file mode 100644 index 0000000..e6aead5 --- /dev/null +++ b/docs/src/components/icons/arrow-left.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const ArrowLeftIcon: SvgProps = props => ( + + + + + + +); diff --git a/docs/src/components/icons/arrow-right.tsx b/docs/src/components/icons/arrow-right.tsx new file mode 100644 index 0000000..a09fc76 --- /dev/null +++ b/docs/src/components/icons/arrow-right.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const ArrowRightIcon: SvgProps = props => ( + + + + + + +); diff --git a/docs/src/components/icons/atom-alt.tsx b/docs/src/components/icons/atom-alt.tsx new file mode 100644 index 0000000..e01837c --- /dev/null +++ b/docs/src/components/icons/atom-alt.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const AtomAltIcon: SvgProps = props => ( + + + + + + + + + + +); diff --git a/docs/src/components/icons/atom.tsx b/docs/src/components/icons/atom.tsx new file mode 100644 index 0000000..a6fd5bf --- /dev/null +++ b/docs/src/components/icons/atom.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { Box, BoxProps } from '@stacks/ui'; +export const AtomIcon: React.FC = props => ( + + + + + + +); diff --git a/docs/src/components/icons/blockstack-logo.tsx b/docs/src/components/icons/blockstack-logo.tsx new file mode 100644 index 0000000..e0f420c --- /dev/null +++ b/docs/src/components/icons/blockstack-logo.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import { Box, BoxProps } from '@stacks/ui'; + +export const BlockstackLogo = ({ size = '24px', ...props }: BoxProps) => ( + + + + + +); diff --git a/docs/src/components/icons/box.tsx b/docs/src/components/icons/box.tsx new file mode 100644 index 0000000..0d0c0e4 --- /dev/null +++ b/docs/src/components/icons/box.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const BoxIcon: SvgProps = props => ( + + + + + + + +); diff --git a/docs/src/components/icons/braces.tsx b/docs/src/components/icons/braces.tsx new file mode 100644 index 0000000..19fdf20 --- /dev/null +++ b/docs/src/components/icons/braces.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const BracesIcon: SvgProps = props => ( + + + + + +); diff --git a/docs/src/components/icons/check-circle.tsx b/docs/src/components/icons/check-circle.tsx new file mode 100644 index 0000000..cef5dd7 --- /dev/null +++ b/docs/src/components/icons/check-circle.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const CheckCircleIcon: SvgProps = props => ( + + + + + +); diff --git a/docs/src/components/icons/circle-check.tsx b/docs/src/components/icons/circle-check.tsx new file mode 100644 index 0000000..ddceff1 --- /dev/null +++ b/docs/src/components/icons/circle-check.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const CircleCheck: SvgProps = props => ( + + + + + +); diff --git a/docs/src/components/icons/clipboard-check.tsx b/docs/src/components/icons/clipboard-check.tsx new file mode 100644 index 0000000..c869374 --- /dev/null +++ b/docs/src/components/icons/clipboard-check.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const ClipboardCheckIcon: SvgProps = props => ( + + + + + + +); diff --git a/docs/src/components/icons/clipboard.tsx b/docs/src/components/icons/clipboard.tsx new file mode 100644 index 0000000..05380ea --- /dev/null +++ b/docs/src/components/icons/clipboard.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const ClipboardIcon: SvgProps = props => ( + + + + + +); diff --git a/docs/src/components/icons/clock.tsx b/docs/src/components/icons/clock.tsx new file mode 100644 index 0000000..20df493 --- /dev/null +++ b/docs/src/components/icons/clock.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const ClockIcon: SvgProps = props => ( + + + + + +); diff --git a/docs/src/components/icons/code.tsx b/docs/src/components/icons/code.tsx new file mode 100644 index 0000000..dfa46b7 --- /dev/null +++ b/docs/src/components/icons/code.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const CodeIcon: SvgProps = props => ( + + + + + + +); diff --git a/docs/src/components/icons/copy.tsx b/docs/src/components/icons/copy.tsx new file mode 100644 index 0000000..9ebbc6f --- /dev/null +++ b/docs/src/components/icons/copy.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const CopyIcon: SvgProps = props => ( + + + + + +); diff --git a/docs/src/components/icons/dark-mode.tsx b/docs/src/components/icons/dark-mode.tsx new file mode 100644 index 0000000..c86f7d2 --- /dev/null +++ b/docs/src/components/icons/dark-mode.tsx @@ -0,0 +1,15 @@ +import React from 'react'; +import { Box, BoxProps } from '@stacks/ui'; + +export const DarkModeIcon = (props: BoxProps) => ( + + + + + +); diff --git a/docs/src/components/icons/edit.tsx b/docs/src/components/icons/edit.tsx new file mode 100644 index 0000000..fb13abe --- /dev/null +++ b/docs/src/components/icons/edit.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const EditIcon: SvgProps = props => ( + + + + + + +); diff --git a/docs/src/components/icons/feedback.tsx b/docs/src/components/icons/feedback.tsx new file mode 100644 index 0000000..443d826 --- /dev/null +++ b/docs/src/components/icons/feedback.tsx @@ -0,0 +1,118 @@ +import React from 'react'; +import { Box, BoxProps, transition } from '@stacks/ui'; +export type SvgProps = React.FC; + +export const SadIcon: SvgProps = ({ bg = '#E1E3E8', ...props }) => ( + + + + + + +); + +export const NeutralIcon: SvgProps = ({ bg = '#E1E3E8', ...props }) => ( + + + + + + +); + +export const HappyIcon: SvgProps = ({ bg = '#E1E3E8', ...props }) => ( + + + + + + +); diff --git a/docs/src/components/icons/gauge.tsx b/docs/src/components/icons/gauge.tsx new file mode 100644 index 0000000..80ab8af --- /dev/null +++ b/docs/src/components/icons/gauge.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const GaugeIcon: SvgProps = props => ( + + + + + + + +); diff --git a/docs/src/components/icons/info-circle.tsx b/docs/src/components/icons/info-circle.tsx new file mode 100644 index 0000000..5f7cc12 --- /dev/null +++ b/docs/src/components/icons/info-circle.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const InfoCircleIcon: SvgProps = props => ( + + + + + + +); diff --git a/docs/src/components/icons/layers-intersect.tsx b/docs/src/components/icons/layers-intersect.tsx new file mode 100644 index 0000000..67b1e1d --- /dev/null +++ b/docs/src/components/icons/layers-intersect.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const LayersIntersectIcon: SvgProps = props => ( + + + + + +); diff --git a/docs/src/components/icons/light-mode.tsx b/docs/src/components/icons/light-mode.tsx new file mode 100644 index 0000000..5b964ca --- /dev/null +++ b/docs/src/components/icons/light-mode.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import { Box, BoxProps } from '@stacks/ui'; + +export const LightModeIcon = (props: BoxProps) => ( + + + + + +); diff --git a/docs/src/components/icons/magnifying-glass.tsx b/docs/src/components/icons/magnifying-glass.tsx new file mode 100644 index 0000000..8e92e87 --- /dev/null +++ b/docs/src/components/icons/magnifying-glass.tsx @@ -0,0 +1,24 @@ +import React from 'react'; + +import { Box, BoxProps } from '@stacks/ui'; + +interface MagnifyingGlassProps extends BoxProps { + size?: number; +} + +export const MagnifyingGlass = ({ size = 16, ...props }: MagnifyingGlassProps) => ( + + + + + +); diff --git a/docs/src/components/icons/package.tsx b/docs/src/components/icons/package.tsx new file mode 100644 index 0000000..33cabb8 --- /dev/null +++ b/docs/src/components/icons/package.tsx @@ -0,0 +1,23 @@ +import React from 'react'; +import { Box, BoxProps } from '@stacks/ui'; +export const PackageIcon: React.FC = props => ( + + + + + + + + +); diff --git a/docs/src/components/icons/paint.tsx b/docs/src/components/icons/paint.tsx new file mode 100644 index 0000000..95abaca --- /dev/null +++ b/docs/src/components/icons/paint.tsx @@ -0,0 +1,21 @@ +import React from 'react'; +import { Box, BoxProps } from '@stacks/ui'; +export const PaintIcon: React.FC = props => ( + + + + + + +); diff --git a/docs/src/components/icons/palette.tsx b/docs/src/components/icons/palette.tsx new file mode 100644 index 0000000..e92475d --- /dev/null +++ b/docs/src/components/icons/palette.tsx @@ -0,0 +1,22 @@ +import React from 'react'; +import { Box, BoxProps } from '@stacks/ui'; +export const PaletteIcon: React.FC = props => ( + + + + + + + +); diff --git a/docs/src/components/icons/search.tsx b/docs/src/components/icons/search.tsx new file mode 100644 index 0000000..5e10e65 --- /dev/null +++ b/docs/src/components/icons/search.tsx @@ -0,0 +1,10 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const SearchIcon: SvgProps = props => ( + + + + + +); diff --git a/docs/src/components/icons/server.tsx b/docs/src/components/icons/server.tsx new file mode 100644 index 0000000..5b14932 --- /dev/null +++ b/docs/src/components/icons/server.tsx @@ -0,0 +1,12 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const ServerIcon: SvgProps = props => ( + + + + + + + +); diff --git a/docs/src/components/icons/sitemap.tsx b/docs/src/components/icons/sitemap.tsx new file mode 100644 index 0000000..ab56f0e --- /dev/null +++ b/docs/src/components/icons/sitemap.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const SitemapIcon: SvgProps = props => ( + + + + + + + + +); diff --git a/docs/src/components/icons/stack.tsx b/docs/src/components/icons/stack.tsx new file mode 100644 index 0000000..c43a8e6 --- /dev/null +++ b/docs/src/components/icons/stack.tsx @@ -0,0 +1,11 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const StackIcon: SvgProps = props => ( + + + + + + +); diff --git a/docs/src/components/icons/tools.tsx b/docs/src/components/icons/tools.tsx new file mode 100644 index 0000000..b608c18 --- /dev/null +++ b/docs/src/components/icons/tools.tsx @@ -0,0 +1,14 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const ToolsIcon: SvgProps = props => ( + + + + + + + + + +); diff --git a/docs/src/components/icons/world.tsx b/docs/src/components/icons/world.tsx new file mode 100644 index 0000000..9e83d12 --- /dev/null +++ b/docs/src/components/icons/world.tsx @@ -0,0 +1,13 @@ +import React from 'react'; +import { BaseSvg, SvgProps } from '@components/icons/_base'; + +export const WorldIcon: SvgProps = props => ( + + + + + + + + +); diff --git a/docs/src/components/layouts/base-layout.tsx b/docs/src/components/layouts/base-layout.tsx new file mode 100644 index 0000000..de92a74 --- /dev/null +++ b/docs/src/components/layouts/base-layout.tsx @@ -0,0 +1,53 @@ +import React from 'react'; +import { Flex } from '@stacks/ui'; +import { SideNav } from '../side-nav'; +import { Header } from '../header'; +import { Main } from '../main'; +import { Footer } from '../footer'; + +import { PAGE_WIDTH, SIDEBAR_WIDTH } from '@common/constants'; +import { useWatchActiveHeadingChange } from '@common/hooks/use-active-heading'; +import { useRouter } from 'next/router'; +import { MobileMenu } from '@components/mobile-menu'; + +const BaseLayout: React.FC<{ isHome?: boolean }> = ({ children }) => { + const router = useRouter(); + const isHome = router.pathname === '/'; + + useWatchActiveHeadingChange(); + return ( + + +
+ + + + +
+ + {children} + +
+