From 038c63942b6d78cdd63a925fe30de3918e337dee Mon Sep 17 00:00:00 2001 From: Gab Date: Mon, 13 Jul 2026 20:53:55 -0300 Subject: [PATCH 1/3] [NO-ISSUE] feat(webkit): add Brand component consolidating the Azion logo lockups --- .specs/brand.md | 105 ++++++++++++++ .../components/content/brand/Brand.stories.js | 118 ++++++++++++++++ packages/webkit/package.json | 1 + .../components/content/brand/brand.figma.ts | 24 ++++ .../components/content/brand/brand.test.ts | 128 ++++++++++++++++++ .../src/components/content/brand/brand.vue | 56 ++++++++ 6 files changed, 432 insertions(+) create mode 100644 .specs/brand.md create mode 100644 apps/storybook/src/stories/components/content/brand/Brand.stories.js create mode 100644 packages/webkit/src/components/content/brand/brand.figma.ts create mode 100644 packages/webkit/src/components/content/brand/brand.test.ts create mode 100644 packages/webkit/src/components/content/brand/brand.vue diff --git a/.specs/brand.md b/.specs/brand.md new file mode 100644 index 000000000..228cba67d --- /dev/null +++ b/.specs/brand.md @@ -0,0 +1,105 @@ +--- +name: brand +category: content +structure: monolithic +status: implemented +spec_version: 1 +figma: + url: https://www.figma.com/design/t97pXRs7xME3SJDs5iZ5RF/Webkit?node-id=587-3946 + node_id: 587:3946 +checksum: 62d98081182fc1883def54d3bfaea330a30141becc0ecc3e31cdca35e26e7f8d +created: 2026-07-13 +last_updated: 2026-07-13 +--- + +# Brand — Component Spec + +## Purpose + +The Azion brand logo, rendered as an inline SVG lockup. A single `kind` prop selects the lockup: `default` (the AZION wordmark) for standard surfaces, `reduced` (the "A" glyph) for compact headers and tight spaces, and `extended` (the AZION wordmark with the "move to the edge technologies®" tagline) for marketing-oriented layouts. It consolidates the loose `@aziontech/webkit/svg/azion/*` assets — which remain individually importable — behind one component. + +## Usage + +```vue + + + +``` + +## Props + +| Prop | Type | Default | Required | JSDoc | +|---|---|---|---|---| +| `kind` | `'default' \| 'reduced' \| 'extended'` | `'default'` | no | Brand lockup to render: `default` (AZION wordmark), `reduced` (the "A" glyph for tight spaces), `extended` (wordmark with the "move to the edge technologies®" tagline). | +| `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | no | Size token; sets the lockup height (16 / 24 / 32 px) while width scales automatically so each `kind` keeps its own aspect ratio. | + +## Events + +| _none_ | — | — | + +## Slots + +| _none_ | — | — | + +## States + +- Visual states: `default` +- `data-kind` mirrors the `kind` prop +- `data-size` mirrors the `size` prop + +## Motion & Animations + +_none_ + +## Tokens + +| Region | Token (DESIGN.md) | +|---|---| +| brand mark (SVG fill, asset-owned) | `var(--primary)` | + +## Theme gaps + +| Figma variable | Temporary primitive | Follow-up | +|---|---|---| +| brand orange (`#F3652B`) | hardcoded HEX inside the `svg/azion/*` assets | `TODO: tokenizar the brand assets to `var(--primary)`` | + +## Accessibility (WCAG 2.1 AA) + +- The root carries `role="img"` and a default `aria-label` (`Azion`) so the logo has an accessible name; consumers may override the label via a passed `aria-label`. +- Non-interactive: the logo is not focusable and emits no events; the inner SVG is presentational. +- Contrast ≥3:1 for the brand mark against its background (large graphic). +- `motion-reduce` not applicable — the component is static. + +## Stories (Storybook) + +- Default +- Types — composite story rendering every `kind` value (`default`, `reduced`, `extended`) side-by-side. +- Sizes — composite story rendering every `size` value (`small`, `medium`, `large`) side-by-side. + +## Constraints — DO NOT + + + +- Do not add props beyond the Props table above. If you need a prop that is not listed, emit `BLOCKED: missing prop ` and stop — do not invent. +- Do not add events beyond the Events table above. Same rule for slots and sub-components. +- Do not invent imports. Every `@aziontech/webkit/*` path must exist in `packages/webkit/package.json#exports`. Every relative import must resolve to a real file. Every npm package must be installed. +- Do not use HEX/RGB/HSL colors, Tailwind palette names (e.g. `bg-blue-500`), raw typography classes (e.g. `text-sm`), `any`, `@ts-ignore`, or `class` inside `defineProps`. +- Do not install or import positioning/animation libraries (`@floating-ui/*`, `popper.js`, `tippy.js`, `gsap`, `framer-motion`, `motion`, `@vueuse/motion`, `@formkit/auto-animate`, drag-drop runtimes, scroll virtualization libs). Use CSS + Vue primitives (``, ``). See `.claude/rules/dependencies.md`. +- Do not improvise animations. Every `animate-*` / `transition-*` class must come from `packages/theme/src/tokens/semantic/animations.js`; every motion-bearing class pairs with `motion-reduce:*` on the same class string; no component-local `@keyframes`. +- Do not create class presets in JavaScript (`const kindClasses = {...}`, `const sharedClasses = [...]`, `const sizeClasses = {...}`, `const rootClasses = computed(...)`). Variants live on `data-*` attributes consumed by Tailwind `data-[attr=value]:`. All utilities live inline on the root element's `class` attribute. No `