UNPKG

@workday/canvas-kit-react

Version:

The parent module that contains all Workday Canvas Kit React components

128 lines (127 loc) 5.18 kB
/** * Sana Canvas theme presets. * * Sana is a distinct theme from classic Canvas — not a delta on `defaultCanvasTheme`. * Full visual treatment (fonts, shapes, system surfaces) comes from global CSS: * import `@workday/canvas-tokens-web/css/sana/_variables.css` and set * `data-theme="sana-canvas"` on `<html>`. * * These JS presets reference Sana brand CSS variables so `CanvasProvider` can forward * them to popup containers (menus, selects, modals). Keep in sync with * `@workday/canvas-tokens-web/css/sana/_variables.css`. * * | Preset | Use case | * |--------|----------| * | `sanaCanvasNumericalTheme` | Numerical `brand` shape for popup forwarding | * | `sanaCanvasProviderTheme` | Same — pass to root `CanvasProvider` when `<html>` is unavailable | */ import { base, brand } from '@workday/canvas-tokens-web'; /** Reference a canvas-tokens CSS variable (resolves under `[data-theme="sana-canvas"]`). */ const varRef = (token) => `var(${token})`; /** * Sana extends the neutral ramp with steps not yet exported from canvas-tokens-web JS. * Defined in `@workday/canvas-tokens-web/css/sana/_variables.css`. */ const sanaBrandNeutral = { '150': '--cnvs-brand-neutral-150', '850': '--cnvs-brand-neutral-850', A150: '--cnvs-brand-neutral-a150', }; /** * Sana Canvas brand tokens for scoped `CanvasProvider` / popup forwarding. * Values are `var()` references to Sana brand variables — not merged from `defaultCanvasTheme`. */ export const sanaCanvasNumericalTheme = { // Explicit brand vars only — multi-key ramps write 1:1; no system shortcut bundles run. themeScope: 'brand', brand: { action: { base: varRef(brand.neutral975), dark: varRef(brand.neutral950), darkest: varRef(brand.neutral900), accent: varRef(base.neutral0), lightest: varRef(brand.neutral25), lighter: varRef(brand.neutral50), light: varRef(brand.neutral200), }, neutral: { '25': varRef(brand.neutral25), '50': varRef(brand.neutral50), '100': varRef(brand.neutral100), '150': varRef(sanaBrandNeutral['150']), '200': varRef(brand.neutral200), '300': varRef(brand.neutral300), '400': varRef(brand.neutral400), '500': varRef(brand.neutral500), '600': varRef(brand.neutral600), '700': varRef(brand.neutral700), '800': varRef(brand.neutral800), '850': varRef(sanaBrandNeutral['850']), '900': varRef(brand.neutral900), '950': varRef(brand.neutral950), '975': varRef(brand.neutral975), A25: varRef(brand.neutralA25), A50: varRef(brand.neutralA50), A100: varRef(brand.neutralA100), A150: varRef(sanaBrandNeutral.A150), A200: varRef(brand.neutralA200), }, primary: { '500': varRef(brand.primary500), '600': varRef(brand.primary600), '700': varRef(brand.primary700), A25: varRef(brand.primaryA25), A50: varRef(brand.primaryA50), A100: varRef(brand.primaryA100), }, critical: { '500': varRef(brand.critical500), '600': varRef(brand.critical600), '700': varRef(brand.critical700), A25: varRef(brand.criticalA25), A50: varRef(brand.criticalA50), }, caution: { '400': varRef(brand.caution400), '500': varRef(brand.caution500), A25: varRef(brand.cautionA25), A50: varRef(brand.cautionA50), }, positive: { '600': varRef(brand.positive600), '800': varRef(brand.positive800), A25: varRef(brand.positiveA25), A50: varRef(brand.positiveA50), }, }, selected: { fg: varRef(brand.neutralA900), surface: varRef(brand.neutralA100), }, }; /** * Pass to root `CanvasProvider` to forward Sana brand CSS variables onto popup containers * (menus, selects, modals, tooltips). * * **When to use it** * - **Required** when you cannot set `data-theme="sana-canvas"` on `<html>` (embedded apps, * microfrontends, third-party shells). Popups portal to `document.body` and will not inherit * a nested `data-theme` — this preset copies Sana brand vars onto the popup stack container. * - Also useful in tests without global Sana CSS, or custom popup hosts outside normal cascade. * * **When you can skip it** * - Prefer setting `data-theme="sana-canvas"` on `<html>` with Sana CSS imported. Popups then * inherit brand variables from the document and no `theme` prop is needed. * * @example * ```tsx * // Preferred — control <html> * import '@workday/canvas-tokens-web/css/sana/_variables.css'; * // <html data-theme="sana-canvas"> * <CanvasProvider><App /></CanvasProvider> * * // No access to <html> — required for popup parity * <CanvasProvider theme={sanaCanvasProviderTheme}><App /></CanvasProvider> * ``` */ export const sanaCanvasProviderTheme = sanaCanvasNumericalTheme;