|
| 1 | +# Button Component |
| 2 | + |
| 3 | +An accessible, customizable button component for Vue applications, built as a web component. |
| 4 | + |
| 5 | +## Installation |
| 6 | + |
| 7 | +```bash |
| 8 | +npm install @vue-web-component-library/button |
| 9 | +# or |
| 10 | +pnpm add @vue-web-component-library/button |
| 11 | +# or |
| 12 | +yarn add @vue-web-component-library/button |
| 13 | +``` |
| 14 | + |
| 15 | +## Usage |
| 16 | + |
| 17 | +```html |
| 18 | +<!-- Import the component --> |
| 19 | +<script> |
| 20 | +import '@vue-web-component-library/button'; |
| 21 | +</script> |
| 22 | + |
| 23 | +<!-- Basic usage --> |
| 24 | +<vwc-button>Click me</vwc-button> |
| 25 | + |
| 26 | +<!-- With variants --> |
| 27 | +<vwc-button variant="primary">Primary Button</vwc-button> |
| 28 | +<vwc-button variant="secondary">Secondary Button</vwc-button> |
| 29 | +<vwc-button variant="outline">Outline Button</vwc-button> |
| 30 | +<vwc-button variant="ghost">Ghost Button</vwc-button> |
| 31 | + |
| 32 | +<!-- With sizes --> |
| 33 | +<vwc-button size="sm">Small Button</vwc-button> |
| 34 | +<vwc-button size="md">Medium Button</vwc-button> |
| 35 | +<vwc-button size="lg">Large Button</vwc-button> |
| 36 | + |
| 37 | +<!-- Disabled state --> |
| 38 | +<vwc-button disabled>Disabled Button</vwc-button> |
| 39 | + |
| 40 | +<!-- Using slots for complex content --> |
| 41 | +<vwc-button> |
| 42 | + <span slot="before">🔍</span> |
| 43 | + Search |
| 44 | + <span slot="after">→</span> |
| 45 | +</vwc-button> |
| 46 | +``` |
| 47 | + |
| 48 | +## Props |
| 49 | + |
| 50 | +| Prop | Type | Default | Description | |
| 51 | +|-----------|-------------------------------------|------------|--------------------------------| |
| 52 | +| `variant` | `'primary' \| 'secondary' \| 'outline' \| 'ghost'` | `'primary'` | The visual style of the button | |
| 53 | +| `size` | `'sm' \| 'md' \| 'lg'` | `'md'` | The size of the button | |
| 54 | +| `type` | `'button' \| 'submit' \| 'reset'` | `'button'` | The button type attribute | |
| 55 | +| `disabled`| `boolean` | `false` | Disables the button when true | |
| 56 | +| `id` | `string` | `undefined`| Optional ID for the button | |
| 57 | + |
| 58 | +## Events |
| 59 | + |
| 60 | +| Event | Description | |
| 61 | +|---------|---------------------------------------------| |
| 62 | +| `click` | Emitted when the button is clicked | |
| 63 | + |
| 64 | +## Slots |
| 65 | + |
| 66 | +| Slot | Description | |
| 67 | +|-----------|----------------------------------------| |
| 68 | +| (default) | The button text or content | |
| 69 | +| `before` | Content to place before the main text | |
| 70 | +| `after` | Content to place after the main text | |
| 71 | + |
| 72 | +## Customization |
| 73 | + |
| 74 | +You can customize the appearance of the button by overriding CSS variables: |
| 75 | + |
| 76 | +```css |
| 77 | +:root { |
| 78 | + /* Base styles */ |
| 79 | + --vwc-button-gap: 0.75rem; |
| 80 | + --vwc-button-font-family: system-ui, sans-serif; |
| 81 | + --vwc-button-font-weight: 500; |
| 82 | + --vwc-button-radius: 4px; |
| 83 | + --vwc-button-border: 1px solid transparent; |
| 84 | + --vwc-button-transition: all 0.2s ease-in-out; |
| 85 | + --vwc-button-focus-outline: 2px solid currentColor; |
| 86 | + --vwc-button-focus-outline-offset: 2px; |
| 87 | + --vwc-button-disabled-opacity: 0.5; |
| 88 | + |
| 89 | + /* Size variants */ |
| 90 | + --vwc-button-sm-font-size: 0.875rem; |
| 91 | + --vwc-button-sm-padding: 0.375rem 0.75rem; |
| 92 | + --vwc-button-sm-height: 2rem; |
| 93 | + |
| 94 | + --vwc-button-md-font-size: 1rem; |
| 95 | + --vwc-button-md-padding: 0.5rem 1rem; |
| 96 | + --vwc-button-md-height: 2.5rem; |
| 97 | + |
| 98 | + --vwc-button-lg-font-size: 1.125rem; |
| 99 | + --vwc-button-lg-padding: 0.625rem 1.25rem; |
| 100 | + --vwc-button-lg-height: 3rem; |
| 101 | + |
| 102 | + /* Primary variant */ |
| 103 | + --vwc-button-primary-bg: #3b82f6; |
| 104 | + --vwc-button-primary-text: white; |
| 105 | + --vwc-button-primary-hover-bg: #2563eb; |
| 106 | + |
| 107 | + /* Secondary variant */ |
| 108 | + --vwc-button-secondary-bg: #9ca3af; |
| 109 | + --vwc-button-secondary-text: white; |
| 110 | + --vwc-button-secondary-hover-bg: #6b7280; |
| 111 | + |
| 112 | + /* Outline variant */ |
| 113 | + --vwc-button-outline-bg: transparent; |
| 114 | + --vwc-button-outline-text: #3b82f6; |
| 115 | + --vwc-button-outline-border: currentColor; |
| 116 | + --vwc-button-outline-hover-bg: rgb(59 130 246 / 0.1); |
| 117 | + |
| 118 | + /* Ghost variant */ |
| 119 | + --vwc-button-ghost-bg: transparent; |
| 120 | + --vwc-button-ghost-text: #3b82f6; |
| 121 | + --vwc-button-ghost-border: transparent; |
| 122 | + --vwc-button-ghost-hover-bg: rgb(59 130 246 / 0.1); |
| 123 | +} |
| 124 | +``` |
| 125 | + |
| 126 | +## Accessibility |
| 127 | + |
| 128 | +- Uses native `<button>` element |
| 129 | +- Maintains proper focus states |
| 130 | +- Uses `aria-disabled` for disabled state |
| 131 | +- Ensures proper color contrast for text/background |
0 commit comments