snice 3.1.0 → 3.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +90 -41
- package/dist/components/accordion/snice-accordion-item.js +1 -1
- package/dist/components/accordion/snice-accordion-item.js.map +1 -1
- package/dist/components/accordion/snice-accordion.js +1 -1
- package/dist/components/accordion/snice-accordion.js.map +1 -1
- package/dist/components/alert/snice-alert.js +1 -1
- package/dist/components/alert/snice-alert.js.map +1 -1
- package/dist/components/avatar/snice-avatar.js +1 -1
- package/dist/components/avatar/snice-avatar.js.map +1 -1
- package/dist/components/badge/snice-badge.js +1 -1
- package/dist/components/badge/snice-badge.js.map +1 -1
- package/dist/components/banner/snice-banner.d.ts +22 -0
- package/dist/components/banner/snice-banner.js +180 -0
- package/dist/components/banner/snice-banner.js.map +1 -0
- package/dist/components/banner/snice-banner.types.d.ts +14 -0
- package/dist/components/breadcrumbs/snice-breadcrumbs.js +1 -1
- package/dist/components/breadcrumbs/snice-breadcrumbs.js.map +1 -1
- package/dist/components/button/snice-button.js +1 -1
- package/dist/components/button/snice-button.js.map +1 -1
- package/dist/components/card/snice-card.js +1 -1
- package/dist/components/card/snice-card.js.map +1 -1
- package/dist/components/checkbox/snice-checkbox.js +1 -1
- package/dist/components/checkbox/snice-checkbox.js.map +1 -1
- package/dist/components/chip/snice-chip.js +1 -1
- package/dist/components/chip/snice-chip.js.map +1 -1
- package/dist/components/color-display/snice-color-display.d.ts +14 -0
- package/dist/components/color-display/snice-color-display.js +151 -0
- package/dist/components/color-display/snice-color-display.js.map +1 -0
- package/dist/components/color-display/snice-color-display.types.d.ts +10 -0
- package/dist/components/color-picker/snice-color-picker.d.ts +50 -0
- package/dist/components/color-picker/snice-color-picker.js +489 -0
- package/dist/components/color-picker/snice-color-picker.js.map +1 -0
- package/dist/components/color-picker/snice-color-picker.types.d.ts +19 -0
- package/dist/components/date-picker/snice-date-picker.js +1 -1
- package/dist/components/date-picker/snice-date-picker.js.map +1 -1
- package/dist/components/divider/snice-divider.js +1 -1
- package/dist/components/divider/snice-divider.js.map +1 -1
- package/dist/components/drawer/snice-drawer.js +1 -1
- package/dist/components/drawer/snice-drawer.js.map +1 -1
- package/dist/components/empty-state/snice-empty-state.d.ts +13 -0
- package/dist/components/empty-state/snice-empty-state.js +121 -0
- package/dist/components/empty-state/snice-empty-state.js.map +1 -0
- package/dist/components/empty-state/snice-empty-state.types.d.ts +9 -0
- package/dist/components/file-upload/snice-file-upload.d.ts +45 -0
- package/dist/components/file-upload/snice-file-upload.js +394 -0
- package/dist/components/file-upload/snice-file-upload.js.map +1 -0
- package/dist/components/file-upload/snice-file-upload.types.d.ts +22 -0
- package/dist/components/image/snice-image.d.ts +22 -0
- package/dist/components/image/snice-image.js +201 -0
- package/dist/components/image/snice-image.js.map +1 -0
- package/dist/components/image/snice-image.types.d.ts +17 -0
- package/dist/components/input/snice-input.js +1 -1
- package/dist/components/input/snice-input.js.map +1 -1
- package/dist/components/kpi/snice-kpi.d.ts +16 -0
- package/dist/components/kpi/snice-kpi.js +162 -0
- package/dist/components/kpi/snice-kpi.js.map +1 -0
- package/dist/components/kpi/snice-kpi.types.d.ts +12 -0
- package/dist/components/layout/snice-layout-blog.js +1 -1
- package/dist/components/layout/snice-layout-blog.js.map +1 -1
- package/dist/components/layout/snice-layout-card.js +1 -1
- package/dist/components/layout/snice-layout-card.js.map +1 -1
- package/dist/components/layout/snice-layout-centered.js +1 -1
- package/dist/components/layout/snice-layout-centered.js.map +1 -1
- package/dist/components/layout/snice-layout-dashboard.js +1 -1
- package/dist/components/layout/snice-layout-dashboard.js.map +1 -1
- package/dist/components/layout/snice-layout-fullscreen.js +1 -1
- package/dist/components/layout/snice-layout-fullscreen.js.map +1 -1
- package/dist/components/layout/snice-layout-landing.js +1 -1
- package/dist/components/layout/snice-layout-landing.js.map +1 -1
- package/dist/components/layout/snice-layout-minimal.js +1 -1
- package/dist/components/layout/snice-layout-minimal.js.map +1 -1
- package/dist/components/layout/snice-layout-sidebar.js +1 -1
- package/dist/components/layout/snice-layout-sidebar.js.map +1 -1
- package/dist/components/layout/snice-layout-split.js +1 -1
- package/dist/components/layout/snice-layout-split.js.map +1 -1
- package/dist/components/layout/snice-layout.js +1 -1
- package/dist/components/layout/snice-layout.js.map +1 -1
- package/dist/components/link/snice-link.d.ts +13 -0
- package/dist/components/link/snice-link.js +137 -0
- package/dist/components/link/snice-link.js.map +1 -0
- package/dist/components/link/snice-link.types.d.ts +11 -0
- package/dist/components/login/snice-login.js +1 -1
- package/dist/components/login/snice-login.js.map +1 -1
- package/dist/components/modal/snice-modal.js +1 -1
- package/dist/components/modal/snice-modal.js.map +1 -1
- package/dist/components/nav/snice-nav.js +1 -1
- package/dist/components/nav/snice-nav.js.map +1 -1
- package/dist/components/progress/snice-progress.js +1 -1
- package/dist/components/progress/snice-progress.js.map +1 -1
- package/dist/components/radio/snice-radio.js +1 -1
- package/dist/components/radio/snice-radio.js.map +1 -1
- package/dist/components/select/snice-select.js +1 -1
- package/dist/components/select/snice-select.js.map +1 -1
- package/dist/components/skeleton/snice-skeleton.js +1 -1
- package/dist/components/skeleton/snice-skeleton.js.map +1 -1
- package/dist/components/slider/snice-slider.d.ts +53 -0
- package/dist/components/slider/snice-slider.js +479 -0
- package/dist/components/slider/snice-slider.js.map +1 -0
- package/dist/components/slider/snice-slider.types.d.ts +26 -0
- package/dist/components/snice-cell-C0slgOpe.js +4 -0
- package/dist/components/snice-cell-C0slgOpe.js.map +1 -0
- package/dist/components/sparkline/snice-sparkline.d.ts +21 -0
- package/dist/components/sparkline/snice-sparkline.js +228 -0
- package/dist/components/sparkline/snice-sparkline.js.map +1 -0
- package/dist/components/sparkline/snice-sparkline.types.d.ts +16 -0
- package/dist/components/spinner/snice-spinner.d.ts +10 -0
- package/dist/components/spinner/snice-spinner.js +109 -0
- package/dist/components/spinner/snice-spinner.js.map +1 -0
- package/dist/components/spinner/snice-spinner.types.d.ts +8 -0
- package/dist/components/stepper/snice-stepper-panel.d.ts +8 -0
- package/dist/components/stepper/snice-stepper-panel.js +70 -0
- package/dist/components/stepper/snice-stepper-panel.js.map +1 -0
- package/dist/components/stepper/snice-stepper-panel.types.d.ts +4 -0
- package/dist/components/stepper/snice-stepper.d.ts +15 -0
- package/dist/components/stepper/snice-stepper.js +163 -0
- package/dist/components/stepper/snice-stepper.js.map +1 -0
- package/dist/components/stepper/snice-stepper.types.d.ts +13 -0
- package/dist/components/switch/snice-switch.js +1 -1
- package/dist/components/switch/snice-switch.js.map +1 -1
- package/dist/components/table/snice-cell-actions.js +1 -1
- package/dist/components/table/snice-cell-actions.js.map +1 -1
- package/dist/components/table/snice-cell-boolean.js +1 -1
- package/dist/components/table/snice-cell-color.js +1 -1
- package/dist/components/table/snice-cell-color.js.map +1 -1
- package/dist/components/table/snice-cell-currency.js +1 -1
- package/dist/components/table/snice-cell-date.js +1 -1
- package/dist/components/table/snice-cell-duration.js +1 -1
- package/dist/components/table/snice-cell-email.js +1 -1
- package/dist/components/table/snice-cell-email.js.map +1 -1
- package/dist/components/table/snice-cell-filesize.js +1 -1
- package/dist/components/table/snice-cell-image.js +1 -1
- package/dist/components/table/snice-cell-image.js.map +1 -1
- package/dist/components/table/snice-cell-json.js +1 -1
- package/dist/components/table/snice-cell-json.js.map +1 -1
- package/dist/components/table/snice-cell-link.js +1 -1
- package/dist/components/table/snice-cell-link.js.map +1 -1
- package/dist/components/table/snice-cell-location.js +1 -1
- package/dist/components/table/snice-cell-location.js.map +1 -1
- package/dist/components/table/snice-cell-number.js +1 -1
- package/dist/components/table/snice-cell-percentage.js +1 -1
- package/dist/components/table/snice-cell-percentage.js.map +1 -1
- package/dist/components/table/snice-cell-phone.js +1 -1
- package/dist/components/table/snice-cell-phone.js.map +1 -1
- package/dist/components/table/snice-cell-progress.js +1 -1
- package/dist/components/table/snice-cell-rating.js +1 -1
- package/dist/components/table/snice-cell-sparkline.js +1 -1
- package/dist/components/table/snice-cell-status.js +1 -1
- package/dist/components/table/snice-cell-status.js.map +1 -1
- package/dist/components/table/snice-cell-tag.js +1 -1
- package/dist/components/table/snice-cell-tag.js.map +1 -1
- package/dist/components/table/snice-cell-text.js +1 -1
- package/dist/components/table/snice-cell.js +1 -1
- package/dist/components/table/snice-header.js +1 -1
- package/dist/components/table/snice-header.js.map +1 -1
- package/dist/components/table/snice-row.js +2 -2
- package/dist/components/table/snice-row.js.map +1 -1
- package/dist/components/table/snice-table.js +1 -1
- package/dist/components/tabs/snice-tab-panel.js +1 -1
- package/dist/components/tabs/snice-tab-panel.js.map +1 -1
- package/dist/components/tabs/snice-tab.js +1 -1
- package/dist/components/tabs/snice-tab.js.map +1 -1
- package/dist/components/tabs/snice-tabs.js +1 -1
- package/dist/components/tabs/snice-tabs.js.map +1 -1
- package/dist/components/textarea/snice-textarea.d.ts +52 -0
- package/dist/components/textarea/snice-textarea.js +407 -0
- package/dist/components/textarea/snice-textarea.js.map +1 -0
- package/dist/components/textarea/snice-textarea.types.d.ts +30 -0
- package/dist/components/timeline/snice-timeline.d.ts +11 -0
- package/dist/components/timeline/snice-timeline.js +112 -0
- package/dist/components/timeline/snice-timeline.js.map +1 -0
- package/dist/components/timeline/snice-timeline.types.d.ts +16 -0
- package/dist/components/tooltip/snice-tooltip.js +2 -2
- package/dist/components/tooltip/snice-tooltip.js.map +1 -1
- package/dist/index.cjs +125 -158
- package/dist/index.cjs.map +1 -1
- package/dist/index.esm.js +125 -158
- package/dist/index.esm.js.map +1 -1
- package/dist/index.iife.js +125 -158
- package/dist/index.iife.js.map +1 -1
- package/dist/parts.d.ts +13 -16
- package/dist/symbols.cjs +1 -1
- package/dist/symbols.esm.js +1 -1
- package/dist/template.d.ts +0 -1
- package/dist/transitions.cjs +1 -1
- package/dist/transitions.esm.js +1 -1
- package/docs/ai/README.md +10 -1
- package/docs/ai/components/banner.md +84 -0
- package/docs/ai/components/color-display.md +48 -0
- package/docs/ai/components/color-picker.md +75 -0
- package/docs/ai/components/empty-state.md +72 -0
- package/docs/ai/components/file-upload.md +93 -0
- package/docs/ai/components/image.md +60 -0
- package/docs/ai/components/kpi.md +158 -0
- package/docs/ai/components/link.md +77 -0
- package/docs/ai/components/slider.md +87 -0
- package/docs/ai/components/sparkline.md +168 -0
- package/docs/ai/components/spinner.md +47 -0
- package/docs/ai/components/stepper.md +216 -0
- package/docs/ai/components/textarea.md +87 -0
- package/docs/ai/components/timeline.md +77 -0
- package/docs/components/banner.md +106 -0
- package/docs/components/color-display.md +96 -0
- package/docs/components/color-picker.md +81 -0
- package/docs/components/empty-state.md +79 -0
- package/docs/components/file-upload.md +263 -0
- package/docs/components/image.md +110 -0
- package/docs/components/kpi.md +251 -0
- package/docs/components/link.md +229 -0
- package/docs/components/slider.md +297 -0
- package/docs/components/sparkline.md +293 -0
- package/docs/components/spinner.md +63 -0
- package/docs/components/stepper.md +410 -0
- package/docs/components/textarea.md +235 -0
- package/docs/components/timeline.md +192 -0
- package/package.json +2 -1
- package/dist/components/snice-cell-BLFVdxPp.js +0 -4
- package/dist/components/snice-cell-BLFVdxPp.js.map +0 -1
|
@@ -0,0 +1,229 @@
|
|
|
1
|
+
# Link Component
|
|
2
|
+
|
|
3
|
+
A customizable link component with multiple variants, external link handling, and accessibility features.
|
|
4
|
+
|
|
5
|
+
## Features
|
|
6
|
+
|
|
7
|
+
- **Multiple Variants**: default, primary, secondary, muted
|
|
8
|
+
- **External Link Handling**: Automatic `target="_blank"` and security attributes
|
|
9
|
+
- **Hash Routing**: Built-in support for hash-based navigation
|
|
10
|
+
- **Router Integration**: Emits events for custom router integration
|
|
11
|
+
- **Accessibility**: Proper ARIA attributes and keyboard navigation
|
|
12
|
+
- **Disabled State**: Visual and functional disabled state
|
|
13
|
+
- **Customizable**: Full theme integration
|
|
14
|
+
|
|
15
|
+
## Basic Usage
|
|
16
|
+
|
|
17
|
+
```html
|
|
18
|
+
<snice-link href="/about">About Us</snice-link>
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
## Properties
|
|
22
|
+
|
|
23
|
+
| Property | Type | Default | Description |
|
|
24
|
+
|----------|------|---------|-------------|
|
|
25
|
+
| `href` | `string` | `''` | Link URL |
|
|
26
|
+
| `target` | `LinkTarget` | `'_self'` | Target attribute ('_self', '_blank', '_parent', '_top') |
|
|
27
|
+
| `variant` | `LinkVariant` | `'default'` | Visual style variant |
|
|
28
|
+
| `disabled` | `boolean` | `false` | Disable the link |
|
|
29
|
+
| `external` | `boolean` | `false` | Treat as external link (auto _blank + security) |
|
|
30
|
+
| `underline` | `boolean` | `false` | Show text underline |
|
|
31
|
+
| `hash` | `boolean` | `false` | Automatically prepend # to href (for hash routing) |
|
|
32
|
+
|
|
33
|
+
## Variants
|
|
34
|
+
|
|
35
|
+
### Default
|
|
36
|
+
```html
|
|
37
|
+
<snice-link href="/page">Default link</snice-link>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
### Primary
|
|
41
|
+
```html
|
|
42
|
+
<snice-link href="/page" variant="primary">Primary link</snice-link>
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
### Secondary
|
|
46
|
+
```html
|
|
47
|
+
<snice-link href="/page" variant="secondary">Secondary link</snice-link>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
### Muted
|
|
51
|
+
```html
|
|
52
|
+
<snice-link href="/page" variant="muted">Muted link</snice-link>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## External Links
|
|
56
|
+
|
|
57
|
+
External links automatically open in a new tab with security attributes:
|
|
58
|
+
|
|
59
|
+
```html
|
|
60
|
+
<snice-link href="https://example.com" external>
|
|
61
|
+
External Link
|
|
62
|
+
</snice-link>
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
This automatically adds:
|
|
66
|
+
- `target="_blank"`
|
|
67
|
+
- `rel="noopener noreferrer"`
|
|
68
|
+
- External link icon (↗)
|
|
69
|
+
|
|
70
|
+
## Underline
|
|
71
|
+
|
|
72
|
+
```html
|
|
73
|
+
<snice-link href="/page" underline>Underlined link</snice-link>
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
## Disabled State
|
|
77
|
+
|
|
78
|
+
```html
|
|
79
|
+
<snice-link href="/page" disabled>Disabled link</snice-link>
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Hash Routing
|
|
83
|
+
|
|
84
|
+
For hash-based navigation (Single Page Applications):
|
|
85
|
+
|
|
86
|
+
```html
|
|
87
|
+
<!-- Automatically prepends # to href -->
|
|
88
|
+
<snice-link href="home" hash>Home</snice-link>
|
|
89
|
+
<snice-link href="about" hash>About</snice-link>
|
|
90
|
+
<snice-link href="contact" hash>Contact</snice-link>
|
|
91
|
+
|
|
92
|
+
<!-- Renders as: <a href="#home">Home</a> -->
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Router Integration
|
|
96
|
+
|
|
97
|
+
The `navigate` event allows decoupled router integration:
|
|
98
|
+
|
|
99
|
+
```html
|
|
100
|
+
<snice-link href="profile" hash id="profile-link">Profile</snice-link>
|
|
101
|
+
|
|
102
|
+
<script>
|
|
103
|
+
document.getElementById('profile-link').addEventListener('navigate', (e) => {
|
|
104
|
+
console.log('Navigating to:', e.detail.href);
|
|
105
|
+
|
|
106
|
+
// Custom routing logic
|
|
107
|
+
myRouter.navigate(e.detail.href);
|
|
108
|
+
|
|
109
|
+
// Optionally prevent default navigation
|
|
110
|
+
// e.preventDefault();
|
|
111
|
+
});
|
|
112
|
+
</script>
|
|
113
|
+
```
|
|
114
|
+
|
|
115
|
+
### Example Router Setup
|
|
116
|
+
|
|
117
|
+
```html
|
|
118
|
+
<nav>
|
|
119
|
+
<snice-link href="home" hash>Home</snice-link>
|
|
120
|
+
<snice-link href="products" hash>Products</snice-link>
|
|
121
|
+
<snice-link href="about" hash>About</snice-link>
|
|
122
|
+
</nav>
|
|
123
|
+
|
|
124
|
+
<script>
|
|
125
|
+
// Listen to all navigate events
|
|
126
|
+
document.addEventListener('navigate', (e) => {
|
|
127
|
+
const route = e.detail.href;
|
|
128
|
+
|
|
129
|
+
// Update view based on route
|
|
130
|
+
switch(route) {
|
|
131
|
+
case 'home':
|
|
132
|
+
showHomeView();
|
|
133
|
+
break;
|
|
134
|
+
case 'products':
|
|
135
|
+
showProductsView();
|
|
136
|
+
break;
|
|
137
|
+
case 'about':
|
|
138
|
+
showAboutView();
|
|
139
|
+
break;
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
</script>
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
## In Context
|
|
146
|
+
|
|
147
|
+
Links work naturally within text:
|
|
148
|
+
|
|
149
|
+
```html
|
|
150
|
+
<p>
|
|
151
|
+
This is a paragraph with an <snice-link href="/page">inline link</snice-link>
|
|
152
|
+
in the middle of the text.
|
|
153
|
+
</p>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
## Events
|
|
157
|
+
|
|
158
|
+
| Event | Detail | Description |
|
|
159
|
+
|-------|--------|-------------|
|
|
160
|
+
| `click` | `MouseEvent` | Emitted when link is clicked (prevented if disabled) |
|
|
161
|
+
| `navigate` | `{ href: string }` | Emitted on hash link click (bubbles, composed, cancelable) |
|
|
162
|
+
|
|
163
|
+
## CSS Parts
|
|
164
|
+
|
|
165
|
+
Use `::part()` to style internal elements:
|
|
166
|
+
|
|
167
|
+
```css
|
|
168
|
+
snice-link::part(link) {
|
|
169
|
+
font-weight: bold;
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
snice-link::part(external-icon) {
|
|
173
|
+
color: blue;
|
|
174
|
+
}
|
|
175
|
+
```
|
|
176
|
+
|
|
177
|
+
## Theming
|
|
178
|
+
|
|
179
|
+
The component uses these CSS custom properties:
|
|
180
|
+
|
|
181
|
+
```css
|
|
182
|
+
--snice-color-primary
|
|
183
|
+
--snice-color-primary-dark
|
|
184
|
+
--snice-color-primary-darker
|
|
185
|
+
--snice-color-text
|
|
186
|
+
--snice-color-text-secondary
|
|
187
|
+
--snice-color-text-muted
|
|
188
|
+
--snice-color-text-disabled
|
|
189
|
+
--snice-transition-fast
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
## Accessibility
|
|
193
|
+
|
|
194
|
+
- Proper `href` attribute for keyboard navigation
|
|
195
|
+
- Correct `rel` attributes for external links
|
|
196
|
+
- Disabled state prevents interaction
|
|
197
|
+
- Screen reader friendly
|
|
198
|
+
|
|
199
|
+
## Examples
|
|
200
|
+
|
|
201
|
+
### Navigation Menu
|
|
202
|
+
```html
|
|
203
|
+
<nav>
|
|
204
|
+
<snice-link href="/">Home</snice-link>
|
|
205
|
+
<snice-link href="/about">About</snice-link>
|
|
206
|
+
<snice-link href="/contact">Contact</snice-link>
|
|
207
|
+
</nav>
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
### Footer Links
|
|
211
|
+
```html
|
|
212
|
+
<footer>
|
|
213
|
+
<snice-link href="/privacy" variant="muted">Privacy</snice-link>
|
|
214
|
+
<snice-link href="/terms" variant="muted">Terms</snice-link>
|
|
215
|
+
<snice-link href="https://twitter.com" external variant="muted">
|
|
216
|
+
Twitter
|
|
217
|
+
</snice-link>
|
|
218
|
+
</footer>
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
### Action Links
|
|
222
|
+
```html
|
|
223
|
+
<snice-link href="/download" variant="primary">
|
|
224
|
+
Download Now
|
|
225
|
+
</snice-link>
|
|
226
|
+
<snice-link href="/learn-more" variant="secondary">
|
|
227
|
+
Learn More
|
|
228
|
+
</snice-link>
|
|
229
|
+
```
|
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
# Slider Component
|
|
2
|
+
|
|
3
|
+
The `<snice-slider>` component provides an interactive range slider for selecting numeric values with mouse, touch, and keyboard support.
|
|
4
|
+
|
|
5
|
+
## Table of Contents
|
|
6
|
+
- [Basic Usage](#basic-usage)
|
|
7
|
+
- [Properties](#properties)
|
|
8
|
+
- [Methods](#methods)
|
|
9
|
+
- [Events](#events)
|
|
10
|
+
- [Keyboard Navigation](#keyboard-navigation)
|
|
11
|
+
- [Features](#features)
|
|
12
|
+
- [Examples](#examples)
|
|
13
|
+
|
|
14
|
+
## Basic Usage
|
|
15
|
+
|
|
16
|
+
```html
|
|
17
|
+
<snice-slider
|
|
18
|
+
label="Volume"
|
|
19
|
+
min="0"
|
|
20
|
+
max="100"
|
|
21
|
+
value="50"
|
|
22
|
+
show-value
|
|
23
|
+
></snice-slider>
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import 'snice/components/slider/snice-slider';
|
|
28
|
+
|
|
29
|
+
const slider = document.querySelector('snice-slider');
|
|
30
|
+
slider.addEventListener('@snice/slider-change', (e) => {
|
|
31
|
+
console.log('Value:', e.detail.value);
|
|
32
|
+
});
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## Properties
|
|
36
|
+
|
|
37
|
+
| Property | Type | Default | Description |
|
|
38
|
+
|----------|------|---------|-------------|
|
|
39
|
+
| `value` | `number` | `0` | Current slider value |
|
|
40
|
+
| `min` | `number` | `0` | Minimum value |
|
|
41
|
+
| `max` | `number` | `100` | Maximum value |
|
|
42
|
+
| `step` | `number` | `1` | Step increment |
|
|
43
|
+
| `size` | `'small' \| 'medium' \| 'large'` | `'medium'` | Size variant |
|
|
44
|
+
| `variant` | `'default' \| 'primary' \| 'success' \| 'warning' \| 'danger'` | `'default'` | Color variant |
|
|
45
|
+
| `label` | `string` | `''` | Label text |
|
|
46
|
+
| `helperText` | `string` | `''` | Helper text below slider |
|
|
47
|
+
| `errorText` | `string` | `''` | Error message (shown when invalid) |
|
|
48
|
+
| `disabled` | `boolean` | `false` | Whether slider is disabled |
|
|
49
|
+
| `readonly` | `boolean` | `false` | Whether slider is readonly |
|
|
50
|
+
| `required` | `boolean` | `false` | Whether slider is required |
|
|
51
|
+
| `invalid` | `boolean` | `false` | Whether to show invalid state |
|
|
52
|
+
| `name` | `string` | `''` | Form field name |
|
|
53
|
+
| `showValue` | `boolean` | `false` | Display current value |
|
|
54
|
+
| `showTicks` | `boolean` | `false` | Show tick marks |
|
|
55
|
+
| `vertical` | `boolean` | `false` | Vertical orientation |
|
|
56
|
+
|
|
57
|
+
## Methods
|
|
58
|
+
|
|
59
|
+
### `focus(): void`
|
|
60
|
+
Give focus to the slider thumb.
|
|
61
|
+
|
|
62
|
+
```typescript
|
|
63
|
+
slider.focus();
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
### `blur(): void`
|
|
67
|
+
Remove focus from the slider thumb.
|
|
68
|
+
|
|
69
|
+
```typescript
|
|
70
|
+
slider.blur();
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### `checkValidity(): boolean`
|
|
74
|
+
Check if the slider passes validation.
|
|
75
|
+
|
|
76
|
+
```typescript
|
|
77
|
+
const isValid = slider.checkValidity();
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
### `reportValidity(): boolean`
|
|
81
|
+
Report validation status to the user.
|
|
82
|
+
|
|
83
|
+
```typescript
|
|
84
|
+
slider.reportValidity();
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### `setCustomValidity(message: string): void`
|
|
88
|
+
Set a custom validation message.
|
|
89
|
+
|
|
90
|
+
```typescript
|
|
91
|
+
slider.setCustomValidity('Value must be between 10 and 90');
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## Events
|
|
95
|
+
|
|
96
|
+
### `@snice/slider-input`
|
|
97
|
+
Fired continuously while dragging the slider.
|
|
98
|
+
|
|
99
|
+
**Detail**: `{ value: number, slider: SniceSliderElement }`
|
|
100
|
+
|
|
101
|
+
```typescript
|
|
102
|
+
slider.addEventListener('@snice/slider-input', (e) => {
|
|
103
|
+
console.log('Current value:', e.detail.value);
|
|
104
|
+
});
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
### `@snice/slider-change`
|
|
108
|
+
Fired when the slider value is committed (after drag ends or keyboard input).
|
|
109
|
+
|
|
110
|
+
**Detail**: `{ value: number, slider: SniceSliderElement }`
|
|
111
|
+
|
|
112
|
+
```typescript
|
|
113
|
+
slider.addEventListener('@snice/slider-change', (e) => {
|
|
114
|
+
console.log('Final value:', e.detail.value);
|
|
115
|
+
});
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
## Keyboard Navigation
|
|
119
|
+
|
|
120
|
+
The slider supports full keyboard navigation:
|
|
121
|
+
|
|
122
|
+
| Key | Action |
|
|
123
|
+
|-----|--------|
|
|
124
|
+
| `←` / `↓` | Decrease by step |
|
|
125
|
+
| `→` / `↑` | Increase by step |
|
|
126
|
+
| `Home` | Jump to minimum |
|
|
127
|
+
| `End` | Jump to maximum |
|
|
128
|
+
| `Page Down` | Decrease by 10× step |
|
|
129
|
+
| `Page Up` | Increase by 10× step |
|
|
130
|
+
|
|
131
|
+
## Features
|
|
132
|
+
|
|
133
|
+
- **Input Devices**: Full mouse, touch, and keyboard support
|
|
134
|
+
- **Form Integration**: Form-associated custom element with validation
|
|
135
|
+
- **Visual Variants**: Five color options (default, primary, success, warning, danger)
|
|
136
|
+
- **Orientations**: Horizontal (default) or vertical layout
|
|
137
|
+
- **Value Display**: Optional current value indicator
|
|
138
|
+
- **Tick Marks**: Optional visual step indicators
|
|
139
|
+
- **Step Control**: Configure increment size
|
|
140
|
+
- **Accessibility**: Full ARIA support with keyboard navigation
|
|
141
|
+
|
|
142
|
+
## Examples
|
|
143
|
+
|
|
144
|
+
### Basic Slider
|
|
145
|
+
|
|
146
|
+
```html
|
|
147
|
+
<snice-slider
|
|
148
|
+
label="Volume"
|
|
149
|
+
min="0"
|
|
150
|
+
max="100"
|
|
151
|
+
value="50"
|
|
152
|
+
></snice-slider>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### With Value Display
|
|
156
|
+
|
|
157
|
+
```html
|
|
158
|
+
<snice-slider
|
|
159
|
+
label="Brightness"
|
|
160
|
+
min="0"
|
|
161
|
+
max="100"
|
|
162
|
+
value="75"
|
|
163
|
+
show-value
|
|
164
|
+
></snice-slider>
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
### With Tick Marks
|
|
168
|
+
|
|
169
|
+
```html
|
|
170
|
+
<snice-slider
|
|
171
|
+
label="Rating"
|
|
172
|
+
min="0"
|
|
173
|
+
max="10"
|
|
174
|
+
step="1"
|
|
175
|
+
show-ticks
|
|
176
|
+
show-value
|
|
177
|
+
></snice-slider>
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Different Variants
|
|
181
|
+
|
|
182
|
+
```html
|
|
183
|
+
<snice-slider variant="default" label="Default"></snice-slider>
|
|
184
|
+
<snice-slider variant="primary" label="Primary"></snice-slider>
|
|
185
|
+
<snice-slider variant="success" label="Success"></snice-slider>
|
|
186
|
+
<snice-slider variant="warning" label="Warning"></snice-slider>
|
|
187
|
+
<snice-slider variant="danger" label="Danger"></snice-slider>
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
### Different Sizes
|
|
191
|
+
|
|
192
|
+
```html
|
|
193
|
+
<snice-slider size="small" label="Small"></snice-slider>
|
|
194
|
+
<snice-slider size="medium" label="Medium"></snice-slider>
|
|
195
|
+
<snice-slider size="large" label="Large"></snice-slider>
|
|
196
|
+
```
|
|
197
|
+
|
|
198
|
+
### Custom Range and Step
|
|
199
|
+
|
|
200
|
+
```html
|
|
201
|
+
<!-- Temperature: 60-80°F in 0.5° increments -->
|
|
202
|
+
<snice-slider
|
|
203
|
+
label="Temperature"
|
|
204
|
+
min="60"
|
|
205
|
+
max="80"
|
|
206
|
+
step="0.5"
|
|
207
|
+
value="72"
|
|
208
|
+
show-value
|
|
209
|
+
></snice-slider>
|
|
210
|
+
|
|
211
|
+
<!-- Percentage: 0-100 in 5% increments -->
|
|
212
|
+
<snice-slider
|
|
213
|
+
label="Discount"
|
|
214
|
+
min="0"
|
|
215
|
+
max="100"
|
|
216
|
+
step="5"
|
|
217
|
+
value="20"
|
|
218
|
+
show-value
|
|
219
|
+
show-ticks
|
|
220
|
+
></snice-slider>
|
|
221
|
+
```
|
|
222
|
+
|
|
223
|
+
### Vertical Slider
|
|
224
|
+
|
|
225
|
+
```html
|
|
226
|
+
<snice-slider
|
|
227
|
+
label="Volume"
|
|
228
|
+
min="0"
|
|
229
|
+
max="100"
|
|
230
|
+
value="60"
|
|
231
|
+
vertical
|
|
232
|
+
show-value
|
|
233
|
+
></snice-slider>
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
### Error State
|
|
237
|
+
|
|
238
|
+
```html
|
|
239
|
+
<snice-slider
|
|
240
|
+
label="Age"
|
|
241
|
+
min="0"
|
|
242
|
+
max="120"
|
|
243
|
+
value="150"
|
|
244
|
+
invalid
|
|
245
|
+
error-text="Value must be between 0 and 120"
|
|
246
|
+
></snice-slider>
|
|
247
|
+
```
|
|
248
|
+
|
|
249
|
+
### In a Form
|
|
250
|
+
|
|
251
|
+
```html
|
|
252
|
+
<form id="settings-form">
|
|
253
|
+
<snice-slider
|
|
254
|
+
name="volume"
|
|
255
|
+
label="Volume"
|
|
256
|
+
min="0"
|
|
257
|
+
max="100"
|
|
258
|
+
value="50"
|
|
259
|
+
required
|
|
260
|
+
></snice-slider>
|
|
261
|
+
|
|
262
|
+
<snice-slider
|
|
263
|
+
name="brightness"
|
|
264
|
+
label="Brightness"
|
|
265
|
+
min="0"
|
|
266
|
+
max="100"
|
|
267
|
+
value="75"
|
|
268
|
+
></snice-slider>
|
|
269
|
+
|
|
270
|
+
<button type="submit">Save Settings</button>
|
|
271
|
+
</form>
|
|
272
|
+
|
|
273
|
+
<script>
|
|
274
|
+
document.getElementById('settings-form').addEventListener('submit', (e) => {
|
|
275
|
+
e.preventDefault();
|
|
276
|
+
const formData = new FormData(e.target);
|
|
277
|
+
console.log('Volume:', formData.get('volume'));
|
|
278
|
+
console.log('Brightness:', formData.get('brightness'));
|
|
279
|
+
});
|
|
280
|
+
</script>
|
|
281
|
+
```
|
|
282
|
+
|
|
283
|
+
### Real-time Value Display
|
|
284
|
+
|
|
285
|
+
```html
|
|
286
|
+
<snice-slider id="volume-slider" min="0" max="100" value="50"></snice-slider>
|
|
287
|
+
<div id="volume-display">Volume: 50</div>
|
|
288
|
+
|
|
289
|
+
<script>
|
|
290
|
+
const slider = document.getElementById('volume-slider');
|
|
291
|
+
const display = document.getElementById('volume-display');
|
|
292
|
+
|
|
293
|
+
slider.addEventListener('@snice/slider-input', (e) => {
|
|
294
|
+
display.textContent = `Volume: ${e.detail.value}`;
|
|
295
|
+
});
|
|
296
|
+
</script>
|
|
297
|
+
```
|