` for layout.** Use `Box`, `Stack`, `Inline`, `ResponsiveLayout`, `GridLayout`,
+ `Grid`.
+3. **NEVER set font sizes manually.** Use text components (`Text1`-`Text10`, `Title1`-`Title4`). If those don't
+ cover your necessities you can set custom sizes with `Text` component.
+4. **NEVER set border radius manually.** Use `skinVars.borderRadii.*` or components that handle it (`Boxed`,
+ cards, etc.). For theme-level visual customization without a dedicated component prop, use a custom skin.
+5. **Always wrap your app** with `ThemeContextProvider` and import `@telefonica/mistica/css/mistica.css`.
+6. **Always namespace React hooks**: `React.useState`, `React.useEffect`, `React.useRef`, etc.
+7. **Add `'use client';`** directive to client components when using Next.js app router.
+8. **Set `font-family` and `body` background color.** See [llms.md](./llms.md) rules 9–10 and
+ [fonts.md](./fonts.md) for the per-skin font table, `@font-face` setup, and the `GlobalStyles` pattern.
+
+## Page layout composition
+
+A standard Mistica page follows this structure:
+
+```tsx
+// Navigation
+
+
+// Header section
+
}
+/>
+
+// Content sections
+
+
+
+ {/* Section 1 */}
+
+ Section Title
+ Section description
+
+
+ {/* Section 2 - List */}
+
+ Another Section
+
+
+ {}} />
+ {}} />
+
+
+
+
+
+
+```
+
+### Vertical rhythm
+
+Follow the 24/32/16 rule:
+
+- **Containers**: 24px top and bottom padding (`
`)
+- **Sections**: 32px space between them (``)
+- **Elements**: 16px space between them (``)
+
+## Layout dos and don'ts
+
+### DO: Use layout components
+
+```tsx
+// Vertical spacing
+
+ First
+ Second
+
+
+// Horizontal spacing
+
+ {}}>Accept
+ {}}>Cancel
+
+
+// Padding
+
+ Padded content
+
+
+// Page container
+
+ Responsive content
+
+```
+
+### DON'T: Use divs for spacing/layout
+
+```tsx
+// BAD - raw divs for spacing
+
+
+// GOOD - Mistica components
+
+
+ Text
+
+
+```
+
+## Color dos and don'ts
+
+### DO: Use design tokens
+
+```tsx
+import {skinVars, applyAlpha} from '@telefonica/mistica';
+
+// Direct token usage
+Secondary text
+
+// In styles (when absolutely needed)
+...
+
+// Semi-transparent colors
+const overlay = applyAlpha(skinVars.rawColors.backgroundBrand, 0.8);
+```
+
+### DON'T: Hardcode colors in component code
+
+```tsx
+// BAD - hardcoded colors
+Text
+...
+...
+
+// GOOD - design tokens
+Text
+Content in container
+```
+
+If you need brand-specific defaults, put those colors in a custom skin and then consume them through
+`skinVars.colors.*` instead of styling individual components with palette values.
+
+## Responsive patterns
+
+### Conditional rendering by screen size
+
+```tsx
+const {isDesktopOrBigger, isTabletOrSmaller} = useScreenSize();
+
+return (
+
+
+ {isDesktopOrBigger ? (
+ } right={} />
+ ) : (
+
+
+
+
+ )}
+
+
+);
+```
+
+### Grid templates for desktop/mobile
+
+```tsx
+
+ } right={} />
+
+```
+
+On mobile, GridLayout stacks content vertically automatically.
+
+### Master-detail pattern
+
+```tsx
+const [selectedId, setSelectedId] = React.useState(null);
+
+
+ {items.map((item) => (
+ setSelectedId(item.id)} />
+ ))}
+
+ }
+ detail={selectedId ? : Select an item}
+/>;
+```
+
+## Form patterns
+
+### Automatic state management (preferred)
+
+```tsx
+
+```
+
+### Form with fixed footer
+
+```tsx
+Continue}>
+
+
+
+
+
+
+```
+
+## Carousel patterns
+
+`Carousel`, `CenteredCarousel`, and `Slideshow` are **horizontal-scroll** components. Use them when content
+needs to be navigated left-to-right (e.g. product cards, promotional banners, image galleries).
+
+### Carousel vs CenteredCarousel vs Slideshow
+
+| Component | Best for | Visible items |
+| ------------------ | -------------------------------------------------- | --------------------------- |
+| `Carousel` | Card collections, product grids | Configurable per breakpoint |
+| `CenteredCarousel` | Featured/highlighted items with neighbour peek | 1 on mobile, 3 on desktop |
+| `Slideshow` | Full-width hero banners, autoplay image slideshows | 1 at a time |
+
+### Placement rules
+
+- **`Carousel` and `CenteredCarousel`**: place inside `ResponsiveLayout` so they respect the page grid.
+- **`Slideshow`**: place **outside** `ResponsiveLayout` — it bleeds full-width on mobile and tablet
+ automatically.
+
+```tsx
+{
+ /* Carousel inside ResponsiveLayout */
+}
+
+
+
+ Featured products
+ (
+ navigate(p.url)}>
+ View
+
+ }
+ />
+ ))}
+ />
+
+
+;
+
+{
+ /* Slideshow at page level (outside ResponsiveLayout) */
+}
+,
+ ,
+ ]}
+/>;
+```
+
+## Card patterns
+
+### Asset pattern for cards and rows
+
+The idiomatic way to create card/row assets is `Circle` + icon:
+
+```tsx
+
+
+
+```
+
+### Card grid
+
+```tsx
+
+
+
+ Featured
+ (
+
+
+
+ }
+ title={p.name}
+ description={p.description}
+ buttonPrimary={
+ navigate(p.url)}>
+ View
+
+ }
+ />
+ ))}
+ />
+
+
+
+```
+
+## List patterns
+
+### Unbounded list with NegativeBox
+
+When placing a `RowList` inside a `ResponsiveLayout`, wrap it with `NegativeBox` so hover effects and
+alignment are correct:
+
+```tsx
+
+
+
+ Settings
+
+
+
+
+
+ }
+ title="General"
+ description="App settings"
+ onPress={() => {}}
+ />
+
+
+
+ }
+ title="Notifications"
+ description="Manage alerts"
+ onPress={() => {}}
+ />
+
+
+
+
+
+```
+
+### Boxed list (no NegativeBox needed)
+
+```tsx
+
+ {}} />
+ {}} />
+
+```
+
+## Variant sections
+
+Use `variant` on `ResponsiveLayout` to create colored sections. Components inside adapt automatically:
+
+```tsx
+{
+ /* Default section */
+}
+
+
+ Default background
+
+;
+
+{
+ /* Brand section */
+}
+
+
+
+
+ Brand Section
+ Colors adapt automatically
+ {}}>Action
+
+
+
+;
+
+{
+ /* Alternative section */
+}
+
+
+
+ Alternative background
+
+
+;
+```
+
+## Boxed containers
+
+Use `Boxed` for card-like containers without card semantics:
+
+```tsx
+
+
+
+ Container Title
+ Container content
+
+
+
+```
+
+## Skeleton loading patterns
+
+Replace content with matching skeleton shapes while loading:
+
+```tsx
+const {data, isLoading} = useFetch('/api/data');
+
+if (isLoading) {
+ return (
+
+
+
+
+
+
+
+
+ );
+}
+
+return (
+
+ {data.title}
+ {data.description}
+
+
+ {data.author}
+
+
+);
+```
+
+## Funnel / step-by-step flow
+
+```tsx
+
+
+
+
+
+ }
+/>
+
+
+
+ {currentStep === 0 && }
+ {currentStep === 1 && }
+ {currentStep === 2 && }
+ {currentStep === 3 && }
+
+
+```
+
+## Next.js integration
+
+### Link configuration
+
+```tsx
+import Link from 'next/link';
+
+const theme = {
+ skin: getMovistarNewSkin(),
+ i18n: {locale: 'es-ES', phoneNumberFormattingRegionCode: 'ES'},
+ Link: {type: 'Next14', Component: Link},
+};
+```
+
+### React Router integration
+
+```tsx
+import {Link} from 'react-router-dom';
+
+const theme = {
+ skin: getMovistarNewSkin(),
+ i18n: {locale: 'es-ES', phoneNumberFormattingRegionCode: 'ES'},
+ Link: {type: 'ReactRouter6', Component: Link},
+};
+```
+
+After configuring, use the `to` prop on touchable components for client-side navigation:
+
+```tsx
+Go to dashboard
+
+Settings
+```
+
+## Dark mode
+
+Mistica supports dark mode out of the box via `colorScheme` in theme config:
+
+- `'auto'` (default) -- follows OS/browser preference
+- `'light'` -- force light mode
+- `'dark'` -- force dark mode
+
+All `skinVars.colors.*` tokens automatically resolve to their dark mode values. No additional code is needed.
diff --git a/doc/theme-config.md b/doc/theme-config.md
index 48a329d429..cfc7fba7e6 100644
--- a/doc/theme-config.md
+++ b/doc/theme-config.md
@@ -95,6 +95,13 @@ If your app doesn't follow the branding of mistica builtin skins (Movistar, Vivo
can still use mistica with your custom skin. Just import the `Skin` type and create a new skin config that
implements the `Skin` interface (you need to define all the required color constants):
+If you need to customize default component colors, border radii, or similar visual tokens and there is no
+component prop for that, prefer a custom skin over ad hoc CSS/style overrides. You can:
+
+- start from a built-in skin like `getMovistarNewSkin()` and override the tokens you need
+- start from a built-in palette export like `movistarNewPalette`
+- define your own palette/colors from scratch
+
```ts
import type {Skin} from '@telefonica/mistica';
@@ -121,4 +128,35 @@ const skin: Skin = {
;
```
+You can also extend an existing skin instead of defining everything from scratch:
+
+```ts
+import {getMovistarNewSkin, movistarNewPalette, type Skin} from '@telefonica/mistica';
+
+const baseSkin = getMovistarNewSkin();
+const palette = {
+ ...movistarNewPalette,
+ brandPrimary: '#0050D8',
+};
+
+const skin: Skin = {
+ ...baseSkin,
+ name: 'Acme',
+ colors: {
+ ...baseSkin.colors,
+ brand: palette.brandPrimary,
+ backgroundBrand: palette.brandPrimary,
+ backgroundBrandTop: palette.brandPrimary,
+ backgroundBrandBottom: palette.blue800,
+ buttonPrimaryBackground: palette.brandPrimary,
+ buttonPrimaryBackgroundHover: palette.blue800,
+ buttonPrimaryBackgroundPressed: palette.blue800,
+ textButtonPrimary: palette.white,
+ },
+};
+```
+
+If you also need different default radii, override `borderRadii` in the custom skin rather than setting
+border radius ad hoc in component styles.
+
You can see an example in the [examples folder](../examples/custom-skin/).
diff --git a/package.json b/package.json
index d32447ddf0..c95fa3dc85 100644
--- a/package.json
+++ b/package.json
@@ -13,6 +13,7 @@
"dist/**",
"dist-es/**",
"css/**",
+ "doc/**",
"community.d.ts",
"community.js"
],
diff --git a/skills/mistica/SKILL.md b/skills/mistica/SKILL.md
new file mode 100644
index 0000000000..9280b03fb3
--- /dev/null
+++ b/skills/mistica/SKILL.md
@@ -0,0 +1,79 @@
+---
+name: mistica
+description:
+ Build websites and web applications using Telefonica's Mistica design system React components. Use this
+ skill when writing React UI code with @telefonica/mistica, creating pages, layouts, forms, or any user
+ interface that should follow Telefonica's design guidelines. Triggers on tasks involving Mistica components,
+ Telefonica branding, or when the user mentions Mistica.
+license: MIT
+metadata:
+ author: telefonica
+ version: '1.0.0'
+---
+
+# Mistica Web - Telefonica Design System
+
+Build web interfaces using `@telefonica/mistica`, the React component library for Telefonica's Design System.
+
+## When to Apply
+
+Use this skill when:
+
+- Creating or modifying React components that use `@telefonica/mistica`
+- Building pages, layouts, or UIs for Telefonica-branded applications
+- The user asks to build a website or web app using Mistica
+- Working with Mistica components, design tokens, or skins
+- Generating forms, cards, lists, navigation, feedback screens, or any UI pattern
+
+## Setup
+
+Before writing any code, ensure the project has `@telefonica/mistica` installed. If not:
+
+```
+npm install @telefonica/mistica
+```
+
+## Documentation
+
+All Mistica documentation is available in the installed package. **Before generating any UI code**, read the
+relevant documentation files from `node_modules/@telefonica/mistica/doc/`.
+
+### Step 1: Read the main reference
+
+Always start by reading the main LLM documentation file:
+
+```
+node_modules/@telefonica/mistica/doc/llms.md
+```
+
+This file contains the critical rules, quick start guide, component categories, design token overview, and
+links to all other documentation files.
+
+> **Fallback**: If `node_modules/@telefonica/mistica` is not available, read the equivalent files directly
+> from the GitHub repository: `https://github.com/Telefonica/mistica-web/blob/master/doc/llms.md`
+
+### Step 2: Read specific docs based on the task
+
+Based on what the user needs, read the appropriate documentation files:
+
+| Task | Read this file |
+| --------------------------------- | --------------------------------------------------------- |
+| **Any UI task** (start here) | `node_modules/@telefonica/mistica/doc/patterns.md` |
+| **Using specific components** | `node_modules/@telefonica/mistica/doc/components.md` |
+| **Colors, tokens, theming** | `node_modules/@telefonica/mistica/doc/design-tokens.md` |
+| **Page layouts** | `node_modules/@telefonica/mistica/doc/layout.md` |
+| **Forms** | `node_modules/@telefonica/mistica/doc/forms.md` |
+| **Theme configuration** | `node_modules/@telefonica/mistica/doc/theme-config.md` |
+| **Sheets / bottom sheets** | `node_modules/@telefonica/mistica/doc/sheet.md` |
+| **Analytics tracking** | `node_modules/@telefonica/mistica/doc/analytics.md` |
+| **Fonts setup** | `node_modules/@telefonica/mistica/doc/fonts.md` |
+| **Custom text tokens** | `node_modules/@telefonica/mistica/doc/texts.md` |
+| **Testing** | `node_modules/@telefonica/mistica/doc/testing.md` |
+| **Migration from older versions** | `node_modules/@telefonica/mistica/doc/migration-guide.md` |
+| **Lottie animations** | `node_modules/@telefonica/mistica/doc/lottie.md` |
+
+## Rules
+
+Treat `node_modules/@telefonica/mistica/doc/llms.md` as the canonical source of truth for critical rules,
+page structure, and Mistica best practices. Do not rely on abbreviated rules here when `llms.md` is
+available.