import type { Meta, StoryObj } from '@storybook/vue3-vite' import type { Token } from '@/stories/tokenUtils' import { copyableClass, copyableCopiedClass, readTokens, sortTokensBySize, splitRemPx, tokenTableClass, useCopier, } from '@/stories/tokenUtils' const meta: Meta = { title: 'Foundations/Dimensions', tags: ['!dev'], parameters: { layout: 'padded', controls: { disable: true }, docs: { source: { code: null } }, }, } export default meta type Story = StoryObj type DimensionKind = 'bar' | 'none' | 'radius' | 'square' const previewStyle = (kind: DimensionKind, tokenName: string): string => { const ref = `var(${tokenName})` switch (kind) { case 'bar': return `height: 12px; width: ${ref}; max-width: 100%; background: var(--cp-background-accent-solid, #603dfd); border-radius: 4px;` case 'radius': return `width: 56px; height: 56px; background: var(--cp-background-accent-primary, #eaecff); border: 1px solid var(--cp-border-accent-primary, #ccd0ff); border-radius: ${ref};` case 'square': return `width: ${ref}; height: ${ref}; background: var(--cp-background-accent-solid, #603dfd); border-radius: 2px;` case 'none': return '' } } type SectionArgs = { kind: DimensionKind; prefix: string } const makeSectionStory = (section: SectionArgs): Story => ({ render: () => ({ setup() { const tokens = sortTokensBySize(readTokens([section.prefix])) const { copiedKey, copy } = useCopier() return { kind: section.kind, tokens, copiedKey, copy, tableClass: tokenTableClass, copyClass: copyableClass, copiedClass: copyableCopiedClass, preview: (kind: DimensionKind, tokenName: string) => previewStyle(kind, tokenName), split: (token: Token) => splitRemPx(token), } }, template: `
Token rem px Preview
{{ copiedKey === token.name ? 'Copied!' : token.name }} {{ split(token).rem }} {{ split(token).px }}
No tokens
`, }), }) /** * Responsive breakpoints. These values match the `min-width` media queries * the design system uses to adapt layouts. */ export const Breakpoint: Story = makeSectionStory({ prefix: '--cp-breakpoint-', kind: 'none' }) /** * Border radius scale, from sharp corners to fully rounded pill shapes. */ export const Radius: Story = makeSectionStory({ prefix: '--cp-radius-', kind: 'radius' }) /** * Spacing scale used for padding, margin and gap. Rendered as horizontal * bars to compare relative widths. */ export const Spacing: Story = makeSectionStory({ prefix: '--cp-spacing-', kind: 'bar' }) /** * Width tokens used for icons, avatars and small fixed-size surfaces. */ export const Width: Story = makeSectionStory({ prefix: '--cp-width-', kind: 'square' })