diff --git a/examples/custom-theme/.gitignore b/examples/custom-theme/.gitignore new file mode 100644 index 000000000000..a547bf36d8d1 --- /dev/null +++ b/examples/custom-theme/.gitignore @@ -0,0 +1,24 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +pnpm-debug.log* +lerna-debug.log* + +node_modules +dist +dist-ssr +*.local + +# Editor directories and files +.vscode/* +!.vscode/extensions.json +.idea +.DS_Store +*.suo +*.ntvs* +*.njsproj +*.sln +*.sw? diff --git a/examples/custom-theme/index.html b/examples/custom-theme/index.html new file mode 100644 index 000000000000..b46ab83364e3 --- /dev/null +++ b/examples/custom-theme/index.html @@ -0,0 +1,13 @@ + + + + + + + Vite App + + +
+ + + diff --git a/examples/custom-theme/package.json b/examples/custom-theme/package.json new file mode 100644 index 000000000000..ebd9900197bd --- /dev/null +++ b/examples/custom-theme/package.json @@ -0,0 +1,22 @@ +{ + "name": "custom-theme", + "private": true, + "version": "0.12.0", + "scripts": { + "dev": "vite", + "build": "vite build", + "preview": "vite preview" + }, + "dependencies": { + "@carbon/react": "^1.14.0", + "react": "^17.0.0", + "react-dom": "^17.0.0" + }, + "devDependencies": { + "@types/react": "^18.0.0", + "@types/react-dom": "^18.0.0", + "@vitejs/plugin-react": "1.1.3", + "sass": "^1.51.0", + "vite": "^2.9.5" + } +} diff --git a/examples/custom-theme/src/App.jsx b/examples/custom-theme/src/App.jsx new file mode 100644 index 000000000000..29b9237decc2 --- /dev/null +++ b/examples/custom-theme/src/App.jsx @@ -0,0 +1,20 @@ +import { Button } from '@carbon/react'; +import React from 'react'; + +function App() { + return ( +
+ +
$background
+
$background-active
+
$background-inverse
+
$focus
+
$interactive
+
$text-error
+
$button-primary
+
$custom-token
+
+ ); +} + +export default App; diff --git a/examples/custom-theme/src/favicon.svg b/examples/custom-theme/src/favicon.svg new file mode 100644 index 000000000000..de4aeddc12bd --- /dev/null +++ b/examples/custom-theme/src/favicon.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/examples/custom-theme/src/index.scss b/examples/custom-theme/src/index.scss new file mode 100644 index 000000000000..cb948032c55e --- /dev/null +++ b/examples/custom-theme/src/index.scss @@ -0,0 +1,69 @@ +// Full token list: https://github.com/carbon-design-system/carbon/blob/main/packages/themes/docs/sass.md#api + +@use '@carbon/react/scss/themes' as *; + +//overriding theme tokens and adding a custom token +@use '@carbon/react/scss/theme' with ( + $theme: ( + // add a completely new token + custom-token: #bada44, + // redefine existing tokens to new values + text-error: rebeccapurple, + focus: pink, + ) +); + +// override a component token +@use '@carbon/react/scss/components/button/tokens' as button-tokens with ( + $button-primary: #3f51b5 +); +@use '@carbon/react'; + +:root { + @include theme.theme(); +} + +.color { + padding: 1rem; + margin: 1rem; + height: 3rem; + width: 20rem; +} + +.background { + background: theme.$background; + border: 2px solid rgba(theme.get('custom-token'), 0.95); +} + +.background-active { + background: theme.$background-active; +} + +.background-inverse { + background: theme.$background-inverse; + color: theme.$focus; +} + +.focus { + background: theme.$focus; +} + +.interactive { + background: theme.$interactive; + color: white; +} + +.text-error { + background: theme.$text-error; + color: white; +} + +.button-primary { + background: button-tokens.$button-primary; + color: white; +} + +// You can access a custom variable via the theme.get() mixin +.custom-token { + background: rgba(theme.get('custom-token'), 0.95); +} diff --git a/examples/custom-theme/src/main.jsx b/examples/custom-theme/src/main.jsx new file mode 100644 index 000000000000..475f242ecfef --- /dev/null +++ b/examples/custom-theme/src/main.jsx @@ -0,0 +1,12 @@ +import './index.scss' + +import React from 'react' +import ReactDOM from 'react-dom' +import App from './App' + +ReactDOM.render( + + + , + document.getElementById('root') +); diff --git a/examples/custom-theme/vite.config.js b/examples/custom-theme/vite.config.js new file mode 100644 index 000000000000..a50be4eeb474 --- /dev/null +++ b/examples/custom-theme/vite.config.js @@ -0,0 +1,11 @@ +import { defineConfig } from 'vite'; +import react from '@vitejs/plugin-react'; + +// https://vitejs.dev/config/ +export default defineConfig({ + plugins: [ + react({ + jsxRuntime: 'classic', + }), + ], +}); diff --git a/packages/styles/docs/sass.md b/packages/styles/docs/sass.md index 2d65f622acfe..8f9b5e92b924 100644 --- a/packages/styles/docs/sass.md +++ b/packages/styles/docs/sass.md @@ -279,16 +279,14 @@ There are also some helpers that you can use from this entrypoint. These include: - `theme.get` to get access to the value of a token from the theme -- `theme.extend` to extend the current theme with new values You can use these in the following way: ```scss @use '@carbon/styles/scss/theme'; - -@include theme.extend( - ( - custom-token: #000000, +@use '@carbon/styles/scss/theme' with ( + $theme: ( + custom-token: #bada44, ) ); diff --git a/yarn.lock b/yarn.lock index 0521781949bf..658eb77bcc08 100644 --- a/yarn.lock +++ b/yarn.lock @@ -12802,6 +12802,21 @@ __metadata: languageName: node linkType: hard +"custom-theme@workspace:examples/custom-theme": + version: 0.0.0-use.local + resolution: "custom-theme@workspace:examples/custom-theme" + dependencies: + "@carbon/react": ^1.14.0 + "@types/react": ^18.0.0 + "@types/react-dom": ^18.0.0 + "@vitejs/plugin-react": 1.1.3 + react: ^17.0.0 + react-dom: ^17.0.0 + sass: ^1.51.0 + vite: ^2.9.5 + languageName: unknown + linkType: soft + "cyclist@npm:^1.0.1": version: 1.0.1 resolution: "cyclist@npm:1.0.1"