# experimenta Vue Komponenten-Beispiele Dieser Ordner enthält **Referenz-Implementierungen** der experimenta Design System Komponenten als Vue 3 Single File Components (SFC). Diese Komponenten dienen als **Vorlagen und Beispiele** für die Entwicklung eigener Komponenten oder können direkt in das Projekt kopiert werden. --- ## Verfügbare Komponenten ### 1. ExperimentaButton.vue Animierter Button mit Gradient-Hintergrund nach experimenta Design System. **Features:** - Primary & Secondary Variants - Responsive Größen (Small, Medium, Large) - Link-Verhalten (kann als `` oder ` Click me ``` ### Tailwind Klassen verwenden Alle Komponenten verwenden Tailwind CSS Utilities. Du kannst sie anpassen: ```vue Custom Margin ``` ### Custom Variants hinzufügen Beispiel: Eine neue Button-Variant hinzufügen: ```vue ``` --- ## TypeScript Support Alle Komponenten sind **TypeScript-ready** mit vollständigen Prop-Definitionen. Beispiel für Type-Safe Usage: ```vue ``` --- ## Accessibility (A11y) Alle Komponenten folgen **WCAG 2.1 AA Standards**: - ✅ **Keyboard Navigation** (Tab, Enter, Space) - ✅ **Focus Indicators** (sichtbarer Focus-Ring) - ✅ **ARIA Labels** (Screen Reader Support) - ✅ **Color Contrast** (mindestens 4.5:1 Ratio) --- ## Testing Beispiel für Vitest Unit Tests: ```typescript // ExperimentaButton.spec.ts import { mount } from '@vue/test-utils' import ExperimentaButton from './ExperimentaButton.vue' describe('ExperimentaButton', () => { it('renders primary button by default', () => { const wrapper = mount(ExperimentaButton, { slots: { default: 'Click me' }, }) expect(wrapper.find('.btn-primary').exists()).toBe(true) expect(wrapper.text()).toBe('Click me') }) it('emits click event', async () => { const wrapper = mount(ExperimentaButton) await wrapper.trigger('click') expect(wrapper.emitted('click')).toBeTruthy() }) it('renders as link when href is provided', () => { const wrapper = mount(ExperimentaButton, { props: { href: 'https://example.com' }, }) expect(wrapper.element.tagName).toBe('A') expect(wrapper.attributes('href')).toBe('https://example.com') }) }) ``` --- ## Storybook Integration (Optional) Erstelle Stories für visuelle Dokumentation: ```typescript // ExperimentaButton.stories.ts import type { Meta, StoryObj } from '@storybook/vue3' import ExperimentaButton from './ExperimentaButton.vue' const meta: Meta = { title: 'Components/ExperimentaButton', component: ExperimentaButton, tags: ['autodocs'], } export default meta type Story = StoryObj export const Primary: Story = { args: { variant: 'primary', }, render: (args) => ({ components: { ExperimentaButton }, setup() { return { args } }, template: 'Click me', }), } export const Secondary: Story = { args: { variant: 'secondary', }, render: (args) => ({ components: { ExperimentaButton }, setup() { return { args } }, template: 'Cancel', }), } ``` --- ## Weitere Ressourcen - **Design System Dokumentation**: `docs/DESIGN_SYSTEM.md` - **Tailwind Config**: `tailwind.config.ts` - **CSS Custom Properties**: `assets/css/tailwind.css` - **Design-Vorlagen**: `design-examples/*.html` --- **Fragen oder Feedback?** → docs@experimenta.science