src/global/variables.stories.tsx (213 lines of code) (raw):

import {useEffect, useRef, useState, useSyncExternalStore} from 'react'; import {GLOBAL_DARK_CLASS_NAME} from './theme'; export default { title: 'Style-only/Theme palette', parameters: { notes: ` Ring UI colors are based on CSS custom properties spec. You can use them in you markup directly. `, }, }; const formatColorPropertyValue = (value: string) => { if (value.indexOf('RGB(') > -1 && value.indexOf(')') > 0) { const rgbComponents = value .substring(value.indexOf('RGB(') + 'RGB('.length, value.indexOf(')')) .split(',') .map(it => { try { return Number.parseInt(it.trim(), 10); } catch (err) { return 0; } }) .map(it => it.toString(16)) .map(it => (it.length === 1 ? `0${it}` : it)) .join('') .toUpperCase(); return `#${rgbComponents} - ${value}`; } return value; }; interface ColorItemProps { propName: string; } function ColorItem({propName}: ColorItemProps) { const ref = useRef<HTMLDivElement>(null); const [colorValue, setColorValue] = useState<string>(); const isDarkTheme = useSyncExternalStore( onStoreChange => { const observer = new MutationObserver(onStoreChange); observer.observe(document.documentElement, {attributeFilter: ['class']}); observer.observe(document.body, {attributeFilter: ['class']}); return () => observer.disconnect(); }, () => document.documentElement.classList.contains(GLOBAL_DARK_CLASS_NAME) || document.body.classList.contains(GLOBAL_DARK_CLASS_NAME), ); useEffect(() => { if (ref.current) { const value = getComputedStyle(ref.current).getPropertyValue(propName).toUpperCase(); setColorValue(formatColorPropertyValue(value)); } }, [propName, isDarkTheme]); return ( <div className='color-item'> <div className='color-square' style={{backgroundColor: `var(${propName})`}} /> <div className='color-info'> <div>{propName}</div> <div className='color-value' ref={ref}> {colorValue} </div> </div> </div> ); } const renderColors = () => ( <div className='container'> <h3>Element colors:</h3> <div className='colors-group'> <ColorItem propName='--ring-line-color' /> <ColorItem propName='--ring-borders-color' /> <ColorItem propName='--ring-icon-color' /> <ColorItem propName='--ring-icon-white-color' /> <ColorItem propName='--ring-icon-secondary-color' /> <ColorItem propName='--ring-border-disabled-color' /> <ColorItem propName='--ring-border-selected-disabled-color' /> <ColorItem propName='--ring-icon-disabled-color' /> <ColorItem propName='--ring-border-hover-color' /> <ColorItem propName='--ring-border-hover-success-color' /> <ColorItem propName='--ring-border-hover-error-color' /> <ColorItem propName='--ring-border-accent-color' /> <ColorItem propName='--ring-icon-hover-color' /> <ColorItem propName='--ring-main-color' /> <ColorItem propName='--ring-action-link-color' /> <ColorItem propName='--ring-main-hover-color' /> <ColorItem propName='--ring-main-success-color' /> <ColorItem propName='--ring-main-success-hover-color' /> <ColorItem propName='--ring-main-error-color' /> <ColorItem propName='--ring-main-error-hover-color' /> <ColorItem propName='--ring-main-warning-color' /> <ColorItem propName='--ring-main-warning-hover-color' /> <ColorItem propName='--ring-main-purple-color' /> <ColorItem propName='--ring-main-purple-hover-color' /> <ColorItem propName='--ring-icon-error-color' /> <ColorItem propName='--ring-icon-warning-color' /> <ColorItem propName='--ring-icon-success-color' /> <ColorItem propName='--ring-icon-highlight-color' /> <ColorItem propName='--ring-icon-highlight-hover-color' /> <ColorItem propName='--ring-success-border-color' /> <ColorItem propName='--ring-success-border-hover-color' /> <ColorItem propName='--ring-error-border-color' /> <ColorItem propName='--ring-error-border-hover-color' /> <ColorItem propName='--ring-warning-border-color' /> <ColorItem propName='--ring-warning-border-hover-color' /> <ColorItem propName='--ring-highlight-border-color' /> <ColorItem propName='--ring-highlight-border-hover-color' /> <ColorItem propName='--ring-purple-border-color' /> <ColorItem propName='--ring-purple-border-hover-color' /> <ColorItem propName='--ring-pale-control-color' /> <ColorItem propName='--ring-popup-border-color' /> <ColorItem propName='--ring-popup-shadow-color' /> <ColorItem propName='--ring-popup-secondary-shadow-color' /> <ColorItem propName='--ring-message-shadow-color' /> <ColorItem propName='--ring-pinned-shadow-color' /> <ColorItem propName='--ring-button-danger-hover-color' /> <ColorItem propName='--ring-button-primary-border-color' /> </div> <h3>Text colors:</h3> <div className='colors-group'> <ColorItem propName='--ring-search-color' /> <ColorItem propName='--ring-hint-color' /> <ColorItem propName='--ring-link-color' /> <ColorItem propName='--ring-link-hover-color' /> <ColorItem propName='--ring-error-color' /> <ColorItem propName='--ring-warning-color' /> <ColorItem propName='--ring-success-color' /> <ColorItem propName='--ring-purple-text-color' /> <ColorItem propName='--ring-text-color' /> <ColorItem propName='--ring-active-text-color' /> <ColorItem propName='--ring-white-text-color' /> <ColorItem propName='--ring-heading-color' /> <ColorItem propName='--ring-secondary-color' /> <ColorItem propName='--ring-disabled-color' /> </div> <h3>Background colors:</h3> <div className='colors-group'> <ColorItem propName='--ring-content-background-color' /> <ColorItem propName='--ring-popup-background-color' /> <ColorItem propName='--ring-sidebar-background-color' /> <ColorItem propName='--ring-secondary-background-color' /> <ColorItem propName='--ring-selected-background-color' /> <ColorItem propName='--ring-hover-background-color' /> <ColorItem propName='--ring-navigation-background-color' /> <ColorItem propName='--ring-tag-background-color' /> <ColorItem propName='--ring-tag-hover-background-color' /> <ColorItem propName='--ring-removed-background-color' /> <ColorItem propName='--ring-warning-background-color' /> <ColorItem propName='--ring-highlight-background-color' /> <ColorItem propName='--ring-added-background-color' /> <ColorItem propName='--ring-purple-background-color' /> <ColorItem propName='--ring-disabled-background-color' /> <ColorItem propName='--ring-disabled-selected-background-color' /> <ColorItem propName='--ring-button-danger-active-color' /> <ColorItem propName='--ring-button-primary-background-color' /> <ColorItem propName='--ring-table-loader-background-color' /> <ColorItem propName='--ring-removed-subtle-background-color' /> <ColorItem propName='--ring-warning-subtle-background-color' /> <ColorItem propName='--ring-highlight-subtle-background-color' /> <ColorItem propName='--ring-added-subtle-background-color' /> <ColorItem propName='--ring-purple-subtle-background-color' /> <ColorItem propName='--ring-main-container-light-color' /> <ColorItem propName='--ring-success-container-light-color' /> <ColorItem propName='--ring-error-container-light-color' /> <ColorItem propName='--ring-warning-container-light-color' /> <ColorItem propName='--ring-highlight-container-light-color' /> <ColorItem propName='--ring-grey-container-light-color' /> <ColorItem propName='--ring-purple-container-light-color' /> <ColorItem propName='--ring-highlight-fill-color' /> <ColorItem propName='--ring-grey-fill-color' /> <ColorItem propName='--ring-grey-fill-accent-color' /> </div> </div> ); export const basic = () => ( <div> <h2>Default theme</h2> {renderColors()} </div> ); basic.storyName = 'Theme palette'; basic.parameters = { storyStyles: ` <style> .container { background-color: var(--ring-content-background-color); color: var(--ring-text-color); font-family: var(--ring-font-family); } .colors-group { display: flex; flex-wrap: wrap; font-family: var(--ring-font-family-monospace); } .color-square { width: calc(var(--ring-unit) * 4); height: calc(var(--ring-unit) * 4); border-radius: var(--ring-border-radius); border: 1px solid var(--ring-line-color); } .color-info { margin-left: var(--ring-unit); } .color-value { font-size: var(--ring-font-size-smaller); color: var(--ring-secondary-color); } .color-item { display: flex; flex-basis: 30%; padding: 4px var(--ring-unit); align-items: center; } </style> `, };