diff --git a/.gitignore b/.gitignore
index 65ec875bde..94a0fe7a6f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,14 +1,15 @@
*.log
*.tgz
.DS_Store
-.changelog
+.cache/
+.changelog/
.next/
.sass-cache
-.stylelintcache
.storybuild/
+.stylelintcache
_site
dist/
+docs/dist
node_modules/
-searchIndex.js
-.cache/
public/
+searchIndex.js
diff --git a/.nowignore b/.nowignore
new file mode 100644
index 0000000000..a6df94c62d
--- /dev/null
+++ b/.nowignore
@@ -0,0 +1,5 @@
+.*.sw?
+.changelog/
+dist/
+docs/dist
+docs/public/
diff --git a/docs/.eslintrc.json b/docs/.eslintrc.json
index cb1a880065..b9893185d7 100644
--- a/docs/.eslintrc.json
+++ b/docs/.eslintrc.json
@@ -13,5 +13,8 @@
"react": {
"version": "detect"
}
+ },
+ "globals": {
+ "__DEV__": "readonly"
}
}
diff --git a/docs/content/support/variables.mdx b/docs/content/support/variables.mdx
new file mode 100644
index 0000000000..6c4f97cc2d
--- /dev/null
+++ b/docs/content/support/variables.mdx
@@ -0,0 +1,16 @@
+---
+title: Variables
+path: support/variables
+status: Experimental
+bundle: alerts
+---
+
+import {Variables, DeprecationIcon} from '../../src/variables'
+
+
+
+The tables below list all of the global SCSS variables defined in [the `support/variables` directory](https://github.com/primer/css/tree/master/src/support/variables).
+
+Variables with a are planned for [deprecation](../tools/deprecations) in a future version of `@primer/css`, and should be avoided.
+
+
diff --git a/docs/gatsby-node.js b/docs/gatsby-node.js
new file mode 100644
index 0000000000..37b8ebbabf
--- /dev/null
+++ b/docs/gatsby-node.js
@@ -0,0 +1,12 @@
+exports.onCreateWebpackConfig = ({actions, stage, plugins}) => {
+ actions.setWebpackConfig({
+ node: {
+ fs: 'empty'
+ },
+ plugins: [
+ plugins.define({
+ __DEV__: stage === 'develop' || stage === 'develop-html'
+ })
+ ]
+ })
+}
diff --git a/docs/package-lock.json b/docs/package-lock.json
index 924bdfe68e..664e3f46d5 100644
--- a/docs/package-lock.json
+++ b/docs/package-lock.json
@@ -1,8 +1,7 @@
{
"name": "docs",
- "version": "1.0.0",
- "lockfileVersion": 1,
"requires": true,
+ "lockfileVersion": 1,
"dependencies": {
"@babel/code-frame": {
"version": "7.5.5",
@@ -1449,11 +1448,6 @@
}
}
},
- "@primer/css": {
- "version": "12.5.0",
- "resolved": "https://registry.npmjs.org/@primer/css/-/css-12.5.0.tgz",
- "integrity": "sha512-MyA2hoCY3UAmMKPHPN+LM1HrwGz5VR92fkEkIzAQgHBYMPstT77tjHkO8OPoWW//DShdYMYAgukZdMJ8lnsfbg=="
- },
"@primer/gatsby-theme-doctocat": {
"version": "0.15.0",
"resolved": "https://registry.npmjs.org/@primer/gatsby-theme-doctocat/-/gatsby-theme-doctocat-0.15.0.tgz",
@@ -6247,11 +6241,18 @@
}
},
"eslint-utils": {
- "version": "1.4.0",
- "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.0.tgz",
- "integrity": "sha512-7ehnzPaP5IIEh1r1tkjuIrxqhNkzUJa9z3R92tLJdZIVdWaczEhr3EbhGtsMrVxi1KeR8qA7Off6SWc5WNQqyQ==",
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz",
+ "integrity": "sha512-fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==",
"requires": {
- "eslint-visitor-keys": "^1.0.0"
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "dependencies": {
+ "eslint-visitor-keys": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz",
+ "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A=="
+ }
}
},
"eslint-visitor-keys": {
@@ -9138,9 +9139,9 @@
"integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ=="
},
"handlebars": {
- "version": "4.2.0",
- "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.2.0.tgz",
- "integrity": "sha512-Kb4xn5Qh1cxAKvQnzNWZ512DhABzyFNmsaJf3OAkWNa4NkaqWcNI8Tao8Tasi0/F4JD9oyG0YxuFyvyR57d+Gw==",
+ "version": "4.5.2",
+ "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.5.2.tgz",
+ "integrity": "sha512-29Zxv/cynYB7mkT1rVWQnV7mGX6v7H/miQ6dbEpYTKq5eJBN7PsRB+ViYJlcT6JINTSu4dVB9kOqEun78h6Exg==",
"requires": {
"neo-async": "^2.6.0",
"optimist": "^0.6.1",
@@ -17924,15 +17925,21 @@
"integrity": "sha512-8OaIKfzL5cpx8eCMAhhvTlft8GYF8b2eQr6JkCyVdrgjcytyOmPCXrqXFcUnhonRpLlh5yxEZVohm6mzaowUOw=="
},
"uglify-js": {
- "version": "3.6.0",
- "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.0.tgz",
- "integrity": "sha512-W+jrUHJr3DXKhrsS7NUVxn3zqMOFn0hL/Ei6v0anCIMoKC93TjcflTagwIHLW7SfMFfiQuktQyFVCFHGUE0+yg==",
+ "version": "3.6.9",
+ "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.6.9.tgz",
+ "integrity": "sha512-pcnnhaoG6RtrvHJ1dFncAe8Od6Nuy30oaJ82ts6//sGSXOP5UjBMEthiProjXmMNHOfd93sqlkztifFMcb+4yw==",
"optional": true,
"requires": {
- "commander": "~2.20.0",
+ "commander": "~2.20.3",
"source-map": "~0.6.1"
},
"dependencies": {
+ "commander": {
+ "version": "2.20.3",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
+ "optional": true
+ },
"source-map": {
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
diff --git a/docs/package.json b/docs/package.json
index 08a1bf57df..09ede56a67 100644
--- a/docs/package.json
+++ b/docs/package.json
@@ -1,18 +1,16 @@
{
- "name": "docs",
"private": true,
- "version": "1.0.0",
- "license": "MIT",
+ "name": "docs",
+ "repository": "primer/css",
"scripts": {
"clean": "gatsby clean",
- "develop": "gatsby develop -H 0.0.0.0",
- "build": "gatsby build --prefix-paths",
- "now-build": "npm run build"
+ "develop": "ln -sf ../dist . && gatsby develop -H 0.0.0.0",
+ "build-content": "gatsby build --prefix-paths",
+ "build": "./script/now-build.sh"
},
"dependencies": {
"@loadable/component": "^5.10.2",
"@primer/components": "^13.2.0",
- "@primer/css": "^12.4.1",
"@primer/gatsby-theme-doctocat": "^0.15.0",
"@primer/octicons": "^9.1.1",
"@primer/octicons-react": "^9.1.1",
@@ -36,5 +34,7 @@
"styled-components": "^4.3.2",
"title-case": "^2.1.1"
},
- "repository": "primer/css"
+ "engines": {
+ "node": "12.x"
+ }
}
diff --git a/docs/script/now-build.sh b/docs/script/now-build.sh
new file mode 100755
index 0000000000..f2bf806b11
--- /dev/null
+++ b/docs/script/now-build.sh
@@ -0,0 +1,12 @@
+#!/bin/bash -e
+
+# Build the base project so we can pull out the JSON data
+cd ..
+npm ci
+npm run dist
+cp -rf dist docs
+
+# Now build the docs site using that data
+cd docs
+npm ci
+CI=true npm run build-content
diff --git a/docs/src/@primer/gatsby-theme-doctocat/nav.yml b/docs/src/@primer/gatsby-theme-doctocat/nav.yml
index ceeda3f2d6..60111abdd1 100644
--- a/docs/src/@primer/gatsby-theme-doctocat/nav.yml
+++ b/docs/src/@primer/gatsby-theme-doctocat/nav.yml
@@ -16,6 +16,8 @@
url: /support/typography
- title: Marketing support
url: /support/marketing-variables
+ - title: Variables
+ url: /support/variables
- title: Utilities
url: /utilities
children:
diff --git a/docs/src/variables.js b/docs/src/variables.js
new file mode 100644
index 0000000000..db87252648
--- /dev/null
+++ b/docs/src/variables.js
@@ -0,0 +1,206 @@
+import React from 'react'
+import {Flex, Link, Text, Tooltip, Flash} from '@primer/components'
+import Octicon, {Alert} from '@primer/octicons-react'
+import themeGet from '@styled-system/theme-get'
+import DoctocatTable from '@primer/gatsby-theme-doctocat/src/components/table'
+import styled from 'styled-components'
+
+const Table = styled(DoctocatTable)`
+ font-size: ${themeGet('fontSizes.1')}px;
+
+ td,
+ th {
+ text-align: left;
+ vertical-align: top;
+ }
+
+ tr:target {
+ th,
+ td {
+ background-color: ${themeGet('colors.yellow.0')};
+ }
+ }
+`
+
+function useVariables() {
+ const deprecations = useDeprecations()
+
+ return React.useMemo(() => {
+ let variablesByFile = new Map()
+
+ try {
+ const variables = require('../dist/variables.json')
+
+ for (const name of Object.keys(variables)) {
+ if (name.endsWith('-font')) {
+ delete variables[name]
+ }
+ }
+
+ variablesByFile = Object.entries(variables).reduce((map, [name, variable]) => {
+ const {
+ source: {path}
+ } = variable
+
+ variable.name = name
+ variable.deprecated = deprecations.variables.hasOwnProperty(name)
+
+ if (map.has(path)) {
+ map.get(path).push(variable)
+ } else {
+ map.set(path, [variable])
+ }
+
+ return map
+ }, variablesByFile)
+
+ for (const variables of variablesByFile.values()) {
+ variables.sort((a, b) => {
+ return a.deprecated - b.deprecated || a.source.line - b.source.line
+ })
+ }
+ } catch (err) {
+ // do nothing
+ }
+
+ return variablesByFile
+ }, [])
+}
+
+function useDeprecations() {
+ return React.useMemo(() => {
+ try {
+ const deprecations = require('../dist/deprecations.json')
+ return deprecations
+ } catch (err) {
+ return {}
+ }
+ }, [])
+}
+
+function Variables({children, ...props}) {
+ const variablesByFile = useVariables()
+
+ if (variablesByFile.size === 0) {
+ return (
+ <>
+
No data available
+ {__DEV__ && (
+
+ This probably means that the root project has not been built; run `npm run dist` and restart your
+ development server.
+
+ )}
+ >
+ )
+ }
+
+ return (
+ <>
+ {children}
+
+ >
+ )
+}
+
+function VariablesDetails({variablesByFile, ...props}) {
+ return Array.from(variablesByFile.entries()).map(([path, variables]) => (
+
+
+ Defined in {path}
+
+
+
+
+ | Name |
+ Value |
+ Aliases |
+
+
+
+ {variables.map(({name, computed, source, refs}) => (
+
+ |
+
+
+ #
+
+
+
+ {name}
+
+
+
+
+
+
+ |
+
+
+ {computed}
+ |
+
+
+ |
+
+ ))}
+
+
+
+ ))
+}
+
+function Mono({nowrap, ...rest}) {
+ return
+}
+
+function Swatch({value, ...rest}) {
+ return /^(#|rgb|hsl)/.test(value) ? : null
+}
+
+const SwatchBox = styled(Text)`
+ display: inline-block;
+ vertical-align: baseline;
+ width: ${p => p.size};
+ height: ${p => p.size};
+ border: 1px solid ${themeGet('colors.gray.3')};
+ border-radius: ${themeGet('radii.1')}px;
+ margin-bottom: -2px;
+`
+
+Swatch.defaultProps = {
+ size: '1em'
+}
+
+function RefList({refs}) {
+ const last = refs.length - 1
+ return refs.map((ref, i) => [
+
+ {ref}
+ ,
+ i < last ? ', ' : ''
+ ])
+}
+
+function DeprecationFlag({variable, ...rest}) {
+ const deprecations = useDeprecations()
+
+ const dep = deprecations.variables[variable]
+ return dep ? (
+
+
+
+
+
+ ) : null
+}
+
+function DeprecationIcon() {
+ return (
+
+
+
+ )
+}
+
+export {Variables, DeprecationIcon}