@reliability-design/web 1.0.2 → 1.0.6
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/dist/components/rel-accordion/README.md +132 -0
- package/dist/components/rel-accordion/rel-accordion.ts +61 -29
- package/dist/components/rel-alert/README.md +141 -0
- package/dist/components/rel-alert/rel-alert.ts +110 -67
- package/dist/components/rel-avatar/README.md +119 -0
- package/dist/components/rel-avatar/rel-avatar.ts +8 -15
- package/dist/components/rel-badge/README.md +86 -0
- package/dist/components/rel-badge/rel-badge.ts +28 -21
- package/dist/components/rel-breadcrumb/README.md +102 -0
- package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +24 -18
- package/dist/components/rel-button/README.md +130 -0
- package/dist/components/rel-button/rel-button.ts +39 -59
- package/dist/components/rel-calendar/README.md +109 -0
- package/dist/components/rel-calendar/index.ts +1 -0
- package/dist/components/rel-calendar/rel-calendar.ts +467 -0
- package/dist/components/rel-card/README.md +94 -0
- package/dist/components/rel-card/rel-card.ts +21 -11
- package/dist/components/rel-cardmedia/README.md +127 -0
- package/dist/components/rel-cardmedia/rel-cardmedia.ts +22 -18
- package/dist/components/rel-carousel/README.md +166 -0
- package/dist/components/rel-carousel/index.ts +1 -0
- package/dist/components/rel-carousel/rel-carousel.ts +469 -0
- package/dist/components/rel-chart/README.md +286 -0
- package/dist/components/rel-chart/index.ts +1 -0
- package/dist/components/rel-chart/rel-chart.ts +736 -0
- package/dist/components/rel-checkbox/README.md +77 -0
- package/dist/components/rel-checkbox/rel-checkbox.ts +36 -45
- package/dist/components/rel-chip/README.md +114 -0
- package/dist/components/rel-chip/rel-chip.ts +47 -122
- package/dist/components/rel-container/README.md +99 -0
- package/dist/components/rel-container/rel-container.ts +1 -6
- package/dist/components/rel-date-picker/README.md +253 -0
- package/dist/components/rel-date-picker/index.ts +1 -0
- package/dist/components/rel-date-picker/rel-date-picker.ts +916 -0
- package/dist/components/rel-divider/README.md +100 -0
- package/dist/components/rel-divider/rel-divider.ts +37 -37
- package/dist/components/rel-drawer/README.md +200 -0
- package/dist/components/rel-drawer/index.ts +1 -0
- package/dist/components/rel-drawer/rel-drawer.ts +621 -0
- package/dist/components/rel-kbd/README.md +151 -0
- package/dist/components/rel-kbd/rel-kbd.ts +118 -0
- package/dist/components/rel-layout/README.md +88 -0
- package/dist/components/rel-layout/rel-layout.ts +12 -14
- package/dist/components/rel-menu/README.md +151 -0
- package/dist/components/rel-menu/rel-menu.ts +18 -10
- package/dist/components/rel-menubar/README.md +329 -0
- package/dist/components/rel-menubar/index.ts +2 -0
- package/dist/components/rel-menubar/rel-menubar-menu.ts +16 -0
- package/dist/components/rel-menubar/rel-menubar.ts +576 -0
- package/dist/components/rel-nav-menu/README.md +289 -0
- package/dist/components/rel-nav-menu/index.ts +3 -0
- package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +143 -0
- package/dist/components/rel-nav-menu/rel-nav-menu-panel.ts +53 -0
- package/dist/components/rel-nav-menu/rel-nav-menu.ts +331 -0
- package/dist/components/rel-navbar/README.md +126 -0
- package/dist/components/rel-navbar/rel-navbar.ts +91 -0
- package/dist/components/rel-otp/README.md +440 -0
- package/dist/components/rel-otp/index.ts +1 -0
- package/dist/components/rel-otp/rel-otp.ts +504 -0
- package/dist/components/rel-pagination/README.md +410 -0
- package/dist/components/rel-pagination/index.ts +1 -0
- package/dist/components/rel-pagination/rel-pagination.ts +376 -0
- package/dist/components/rel-popover/README.md +568 -0
- package/dist/components/rel-popover/index.ts +2 -0
- package/dist/components/rel-popover/rel-popover-content.ts +55 -0
- package/dist/components/rel-popover/rel-popover.ts +327 -0
- package/dist/components/rel-progress/README.md +110 -0
- package/dist/components/rel-progress/rel-progress.ts +58 -20
- package/dist/components/rel-quote-page/README.md +166 -0
- package/dist/components/rel-quote-page/rel-quote-page.ts +816 -0
- package/dist/components/rel-radio/README.md +120 -0
- package/dist/components/rel-radio/rel-radio.ts +41 -73
- package/dist/components/rel-resizable/README.md +140 -0
- package/dist/components/rel-resizable/index.ts +3 -0
- package/dist/components/rel-resizable/rel-resizable-group.ts +374 -0
- package/dist/components/rel-resizable/rel-resizable-handle.ts +149 -0
- package/dist/components/rel-resizable/rel-resizable-panel.ts +47 -0
- package/dist/components/rel-segmented-button/README.md +141 -0
- package/dist/components/rel-segmented-button/rel-segmented-button.ts +18 -13
- package/dist/components/rel-select/README.md +107 -0
- package/dist/components/rel-select/rel-select.ts +14 -14
- package/dist/components/rel-sheet/README.md +224 -0
- package/dist/components/rel-sheet/rel-sheet.ts +683 -0
- package/dist/components/rel-sidebar/README.md +209 -0
- package/dist/components/rel-sidebar/rel-sidebar.ts +1158 -0
- package/dist/components/rel-slider/README.md +135 -0
- package/dist/components/rel-slider/rel-slider.ts +19 -7
- package/dist/components/rel-snackbar/README.md +134 -0
- package/dist/components/rel-snackbar/rel-snackbar.ts +73 -2
- package/dist/components/rel-stepper/README.md +160 -0
- package/dist/components/rel-stepper/rel-stepper.ts +29 -8
- package/dist/components/rel-switch/README.md +102 -0
- package/dist/components/rel-switch/rel-switch.ts +22 -11
- package/dist/components/rel-tab/README.md +163 -0
- package/dist/components/rel-tab/rel-tab.ts +46 -22
- package/dist/components/rel-table/README.md +178 -0
- package/dist/components/rel-table/rel-table-body.ts +16 -0
- package/dist/components/rel-table/rel-table-caption.ts +22 -0
- package/dist/components/rel-table/rel-table-cell.ts +49 -0
- package/dist/components/rel-table/rel-table-footer.ts +18 -0
- package/dist/components/rel-table/rel-table-head.ts +33 -0
- package/dist/components/rel-table/rel-table-header.ts +16 -0
- package/dist/components/rel-table/rel-table-row.ts +32 -0
- package/dist/components/rel-table/rel-table.ts +47 -0
- package/dist/components/rel-textfield/README.md +90 -0
- package/dist/components/rel-textfield/rel-textfield.ts +37 -21
- package/dist/components/rel-toast/README.md +148 -0
- package/dist/components/rel-toast/rel-toast.ts +32 -14
- package/dist/components/rel-tooltip/README.md +103 -0
- package/dist/components/rel-tooltip/rel-tooltip.ts +9 -9
- package/dist/index.d.mts +846 -7
- package/dist/index.d.ts +846 -7
- package/dist/index.js +10860 -1803
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +10820 -1809
- package/dist/index.mjs.map +1 -1
- package/dist/styles/vars.css +293 -183
- package/dist/vars-ITL2K3KO.css +294 -0
- package/package.json +2 -2
- package/dist/components/rel-accordion/rel-accordion.stories.ts +0 -313
- package/dist/components/rel-alert/rel-alert.stories.ts +0 -412
- package/dist/components/rel-avatar/rel-avatar.stories.ts +0 -327
- package/dist/components/rel-badge/rel-badge.stories.ts +0 -350
- package/dist/components/rel-breadcrumb/rel-breadcrumb.stories.ts +0 -306
- package/dist/components/rel-button/rel-button.stories.ts +0 -356
- package/dist/components/rel-card/rel-card.stories.ts +0 -299
- package/dist/components/rel-cardmedia/rel-cardmedia.stories.ts +0 -368
- package/dist/components/rel-checkbox/rel-checkbox.stories.ts +0 -414
- package/dist/components/rel-chip/rel-chip.stories.ts +0 -552
- package/dist/components/rel-container/rel-container.stories.ts +0 -239
- package/dist/components/rel-divider/rel-divider.stories.ts +0 -229
- package/dist/components/rel-layout/rel-layout.stories.ts +0 -713
- package/dist/components/rel-menu/rel-menu.stories.ts +0 -910
- package/dist/components/rel-progress/rel-progress.stories.ts +0 -817
- package/dist/components/rel-radio/rel-radio.stories.ts +0 -1048
- package/dist/components/rel-segmented-button/rel-segmented-button.stories.ts +0 -1079
- package/dist/components/rel-select/rel-select.stories.ts +0 -1201
- package/dist/components/rel-slider/rel-slider.stories.ts +0 -730
- package/dist/components/rel-snackbar/rel-snackbar.stories.ts +0 -808
- package/dist/components/rel-stepper/rel-stepper.stories.ts +0 -752
- package/dist/components/rel-switch/rel-switch.stories.ts +0 -441
- package/dist/components/rel-tab/rel-tab.stories.ts +0 -492
- package/dist/components/rel-textfield/rel-textfield.stories.ts +0 -710
- package/dist/components/rel-toast/rel-toast.stories.ts +0 -394
- package/dist/components/rel-tooltip/rel-tooltip.stories.ts +0 -364
|
@@ -0,0 +1,132 @@
|
|
|
1
|
+
# rel-accordion
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
An animated accordion component with a collapsible body section. Features a clickable header with chevron icon rotation, smooth expand/collapse transitions, and keyboard support. Respects reduced motion preferences.
|
|
5
|
+
|
|
6
|
+
## Usage
|
|
7
|
+
```html
|
|
8
|
+
<!-- Basic accordion -->
|
|
9
|
+
<rel-accordion title="Section 1">
|
|
10
|
+
<p>This is the content of section 1.</p>
|
|
11
|
+
</rel-accordion>
|
|
12
|
+
|
|
13
|
+
<!-- Initially open -->
|
|
14
|
+
<rel-accordion title="FAQ: How does it work?" open>
|
|
15
|
+
<p>This accordion starts in the open state.</p>
|
|
16
|
+
<ul>
|
|
17
|
+
<li>Bullet 1</li>
|
|
18
|
+
<li>Bullet 2</li>
|
|
19
|
+
</ul>
|
|
20
|
+
</rel-accordion>
|
|
21
|
+
|
|
22
|
+
<!-- Multiple accordions -->
|
|
23
|
+
<rel-accordion title="Introduction">
|
|
24
|
+
<p>Introduction content...</p>
|
|
25
|
+
</rel-accordion>
|
|
26
|
+
<rel-accordion title="Features">
|
|
27
|
+
<p>Features content...</p>
|
|
28
|
+
</rel-accordion>
|
|
29
|
+
<rel-accordion title="Pricing">
|
|
30
|
+
<p>Pricing content...</p>
|
|
31
|
+
</rel-accordion>
|
|
32
|
+
|
|
33
|
+
<!-- Listen for open state changes -->
|
|
34
|
+
<rel-accordion id="myAccordion" title="Details"></rel-accordion>
|
|
35
|
+
<script>
|
|
36
|
+
const accordion = document.getElementById('myAccordion');
|
|
37
|
+
accordion.addEventListener('open-change', (e) => {
|
|
38
|
+
console.log('Accordion open:', e.detail); // true or false
|
|
39
|
+
});
|
|
40
|
+
</script>
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## API
|
|
44
|
+
|
|
45
|
+
### Attributes/Properties
|
|
46
|
+
| Name | Type | Default | Description |
|
|
47
|
+
|------|------|---------|-------------|
|
|
48
|
+
| `title` | `string` | `"Accordion"` | Header title text |
|
|
49
|
+
| `open` (reflected) | `boolean` | `false` | Whether the accordion is expanded |
|
|
50
|
+
|
|
51
|
+
## Events
|
|
52
|
+
| Event | Detail | Description |
|
|
53
|
+
|-------|--------|-------------|
|
|
54
|
+
| `open-change` | `boolean` | Fired when the accordion is toggled (detail is the new `open` state) |
|
|
55
|
+
|
|
56
|
+
## Slots
|
|
57
|
+
| Slot | Description |
|
|
58
|
+
|------|-------------|
|
|
59
|
+
| (default) | Accordion body content |
|
|
60
|
+
|
|
61
|
+
## CSS Parts
|
|
62
|
+
None exposed.
|
|
63
|
+
|
|
64
|
+
## Tokens / CSS Variables
|
|
65
|
+
|
|
66
|
+
### Semantic Tokens
|
|
67
|
+
- `--rel-fontFamilies-primary` - Font family
|
|
68
|
+
|
|
69
|
+
### Font Tokens
|
|
70
|
+
- `--rel-fontSizes-lg` - Title font size (20px)
|
|
71
|
+
- `--rel-fontSizes-md` - Body font size (14px)
|
|
72
|
+
- `--rel-fontWeights-medium` - Title font weight (500)
|
|
73
|
+
|
|
74
|
+
### Color Tokens
|
|
75
|
+
- `--rel-colors-white` - Background color
|
|
76
|
+
- `--rel-text-heading` - Title text color
|
|
77
|
+
- `--rel-text-primary` - Body text color, icon stroke color
|
|
78
|
+
- `--rel-border-default` - Border color
|
|
79
|
+
- `--rel-border-info` - Focus outline color
|
|
80
|
+
|
|
81
|
+
### Shadow Tokens
|
|
82
|
+
- `--rel-shadows-shadow-100` - Shadow
|
|
83
|
+
|
|
84
|
+
### Border Tokens
|
|
85
|
+
- `--rel-borders-radius-border-radius-200` - Border radius (8px)
|
|
86
|
+
|
|
87
|
+
### Spacing Tokens
|
|
88
|
+
- `--rel-spacing-space-md` - Header horizontal padding, body horizontal padding in closed state (16px)
|
|
89
|
+
- `--rel-spacing-space-xl` - Body top padding when open (24px)
|
|
90
|
+
- `--rel-spacing-space-lg` - Body bottom padding when open (20px)
|
|
91
|
+
|
|
92
|
+
## Accessibility
|
|
93
|
+
- Header uses `role="button"` and `aria-expanded` attribute
|
|
94
|
+
- Header is keyboard accessible with `tabindex="0"`
|
|
95
|
+
- Supports Enter and Space key activation
|
|
96
|
+
- Focus visible outline on keyboard focus
|
|
97
|
+
|
|
98
|
+
### Keyboard Interactions
|
|
99
|
+
| Key | Action |
|
|
100
|
+
|-----|--------|
|
|
101
|
+
| `Enter` | Toggle accordion open/closed |
|
|
102
|
+
| `Space` | Toggle accordion open/closed |
|
|
103
|
+
| `Tab` | Navigate to/from the header |
|
|
104
|
+
|
|
105
|
+
### Focus Behavior
|
|
106
|
+
- Header receives focus outline (`outline: 2px solid --rel-border-info`)
|
|
107
|
+
- Focus offset is `-2px` inset
|
|
108
|
+
|
|
109
|
+
## Notes / Edge Cases
|
|
110
|
+
- **Animation details**:
|
|
111
|
+
- Chevron rotates 180° when open (`transform: rotate(180deg)`)
|
|
112
|
+
- Body expands from `max-height: 0` to `max-height: 1000px`
|
|
113
|
+
- Body padding animates from `0` to full padding when opening
|
|
114
|
+
- Transitions: `transform 0.25s ease`, `max-height 0.25s ease`, `padding 0.2s ease`
|
|
115
|
+
|
|
116
|
+
- **Reduced motion**: When `prefers-reduced-motion: reduce`, icon rotation and body transitions are disabled
|
|
117
|
+
|
|
118
|
+
- **Body rendering**: The slotted content is always in the DOM (not conditionally rendered), but hidden via `max-height: 0` and `overflow: hidden` when closed
|
|
119
|
+
|
|
120
|
+
- The header has hover styling (`background: --rel-surface-surface`)
|
|
121
|
+
|
|
122
|
+
- The component is `display: block` and `width: 100%`
|
|
123
|
+
|
|
124
|
+
- The accordion border is `1px solid` with rounded corners
|
|
125
|
+
|
|
126
|
+
- The chevron icon is an inline SVG (9-point downward-pointing chevron)
|
|
127
|
+
|
|
128
|
+
- When closed, the body has `padding: 0 var(--rel-spacing-space-md)` to maintain horizontal padding
|
|
129
|
+
|
|
130
|
+
- The `open` attribute is reflected in HTML when set
|
|
131
|
+
|
|
132
|
+
- Multiple accordions can be open simultaneously (no automatic closing of others)
|
|
@@ -1,24 +1,23 @@
|
|
|
1
1
|
import { LitElement, html, css } from "lit";
|
|
2
|
-
import { customElement, property
|
|
2
|
+
import { customElement, property } from "lit/decorators.js";
|
|
3
3
|
|
|
4
4
|
@customElement("rel-accordion")
|
|
5
5
|
export class RelAccordion extends LitElement {
|
|
6
6
|
@property({ type: String }) title = "Accordion";
|
|
7
|
-
@property({ type: Boolean }) open = false;
|
|
7
|
+
@property({ type: Boolean, reflect: true }) open = false;
|
|
8
8
|
|
|
9
9
|
static styles = css`
|
|
10
10
|
:host {
|
|
11
11
|
display: block;
|
|
12
12
|
width: 100%;
|
|
13
|
-
font-family: var(--rel-fontFamilies-primary);
|
|
13
|
+
font-family: var(--rel-fontFamilies-primary, sans-serif);
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
.accordion {
|
|
17
|
-
background: var(--rel-colors-white);
|
|
18
|
-
border: 1px solid var(--rel-border-default);
|
|
19
|
-
border-radius: var(--rel-borders-radius-border-radius-200);
|
|
17
|
+
background: var(--rel-colors-white, #fff);
|
|
18
|
+
border: 1px solid var(--rel-border-default, #ddd);
|
|
19
|
+
border-radius: var(--rel-borders-radius-border-radius-200, 8px);
|
|
20
20
|
box-shadow: var(--rel-shadows-shadow-100);
|
|
21
|
-
transition: all 0.2s ease;
|
|
22
21
|
overflow: hidden;
|
|
23
22
|
}
|
|
24
23
|
|
|
@@ -27,15 +26,25 @@ export class RelAccordion extends LitElement {
|
|
|
27
26
|
display: flex;
|
|
28
27
|
justify-content: space-between;
|
|
29
28
|
align-items: center;
|
|
30
|
-
padding: var(--rel-spacing-space-md);
|
|
29
|
+
padding: var(--rel-spacing-space-md, 16px);
|
|
31
30
|
cursor: pointer;
|
|
32
31
|
user-select: none;
|
|
32
|
+
border-radius: var(--rel-borders-radius-border-radius-200, 8px);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.header:hover {
|
|
36
|
+
background: var(--rel-surface-surface, #f5f5f5);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
.header:focus-visible {
|
|
40
|
+
outline: 2px solid var(--rel-border-info, #0091ea);
|
|
41
|
+
outline-offset: -2px;
|
|
33
42
|
}
|
|
34
43
|
|
|
35
44
|
.title {
|
|
36
|
-
font-size: var(--rel-fontSizes-lg);
|
|
37
|
-
font-weight: var(--rel-fontWeights-medium);
|
|
38
|
-
color: var(--rel-
|
|
45
|
+
font-size: var(--rel-fontSizes-lg, 20px);
|
|
46
|
+
font-weight: var(--rel-fontWeights-medium, 500);
|
|
47
|
+
color: var(--rel-text-heading, #2b2b2b);
|
|
39
48
|
}
|
|
40
49
|
|
|
41
50
|
/* ICON ----------------------------------------------------- */
|
|
@@ -51,41 +60,51 @@ export class RelAccordion extends LitElement {
|
|
|
51
60
|
.icon svg {
|
|
52
61
|
width: 20px;
|
|
53
62
|
height: 20px;
|
|
54
|
-
stroke: var(--rel-
|
|
63
|
+
stroke: var(--rel-text-primary, #333);
|
|
55
64
|
stroke-width: 2;
|
|
56
65
|
fill: none;
|
|
57
66
|
stroke-linecap: round;
|
|
58
67
|
stroke-linejoin: round;
|
|
59
68
|
}
|
|
60
69
|
|
|
61
|
-
.rotated {
|
|
70
|
+
.icon.rotated {
|
|
62
71
|
transform: rotate(180deg);
|
|
63
72
|
}
|
|
64
73
|
|
|
65
74
|
/* BODY ------------------------------------------------------ */
|
|
66
75
|
.body {
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
font-size: var(--rel-fontSizes-
|
|
71
|
-
color: var(--rel-
|
|
72
|
-
|
|
76
|
+
overflow: hidden;
|
|
77
|
+
max-height: 0;
|
|
78
|
+
padding: 0 var(--rel-spacing-space-md, 16px);
|
|
79
|
+
font-size: var(--rel-fontSizes-md, 14px);
|
|
80
|
+
color: var(--rel-text-primary, #333);
|
|
81
|
+
transition: max-height 0.25s ease, padding 0.2s ease;
|
|
73
82
|
}
|
|
74
83
|
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
84
|
+
.body.open {
|
|
85
|
+
max-height: 1000px;
|
|
86
|
+
padding: var(--rel-spacing-space-xl, 24px) var(--rel-spacing-space-md, 16px)
|
|
87
|
+
var(--rel-spacing-space-lg, 20px);
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
@media (prefers-reduced-motion: reduce) {
|
|
91
|
+
.icon,
|
|
92
|
+
.body {
|
|
93
|
+
transition: none;
|
|
83
94
|
}
|
|
84
95
|
}
|
|
85
96
|
`;
|
|
86
97
|
|
|
87
98
|
private toggle() {
|
|
88
99
|
this.open = !this.open;
|
|
100
|
+
|
|
101
|
+
this.dispatchEvent(
|
|
102
|
+
new CustomEvent<boolean>("open-change", {
|
|
103
|
+
detail: this.open,
|
|
104
|
+
bubbles: true,
|
|
105
|
+
composed: true,
|
|
106
|
+
})
|
|
107
|
+
);
|
|
89
108
|
}
|
|
90
109
|
|
|
91
110
|
private chevron() {
|
|
@@ -99,7 +118,17 @@ export class RelAccordion extends LitElement {
|
|
|
99
118
|
render() {
|
|
100
119
|
return html`
|
|
101
120
|
<div class="accordion">
|
|
102
|
-
<div class="header"
|
|
121
|
+
<div class="header"
|
|
122
|
+
role="button"
|
|
123
|
+
tabindex="0"
|
|
124
|
+
aria-expanded="${this.open}"
|
|
125
|
+
@click=${this.toggle}
|
|
126
|
+
@keydown=${(e: KeyboardEvent) => {
|
|
127
|
+
if (e.key === "Enter" || e.key === " ") {
|
|
128
|
+
e.preventDefault();
|
|
129
|
+
this.toggle();
|
|
130
|
+
}
|
|
131
|
+
}}>
|
|
103
132
|
<div class="title">${this.title}</div>
|
|
104
133
|
|
|
105
134
|
<div class="icon ${this.open ? "rotated" : ""}">
|
|
@@ -107,7 +136,10 @@ export class RelAccordion extends LitElement {
|
|
|
107
136
|
</div>
|
|
108
137
|
</div>
|
|
109
138
|
|
|
110
|
-
|
|
139
|
+
<!-- IMPORTANT: slot is ALWAYS rendered -->
|
|
140
|
+
<div class="body ${this.open ? "open" : ""}">
|
|
141
|
+
<slot></slot>
|
|
142
|
+
</div>
|
|
111
143
|
</div>
|
|
112
144
|
`;
|
|
113
145
|
}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
# rel-alert
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
A versatile alert component for displaying informational, success, warning, error, or neutral messages. Features built-in icons, optional dismissibility, secondary message text, and inline links. Automatically hides when dismissed via the `dismissed` reflected attribute.
|
|
5
|
+
|
|
6
|
+
## Usage
|
|
7
|
+
```html
|
|
8
|
+
<!-- Basic neutral alert -->
|
|
9
|
+
<rel-alert
|
|
10
|
+
message1="This is a neutral alert"
|
|
11
|
+
type="neutral">
|
|
12
|
+
</rel-alert>
|
|
13
|
+
|
|
14
|
+
<!-- Info alert with secondary message -->
|
|
15
|
+
<rel-alert
|
|
16
|
+
type="info"
|
|
17
|
+
message1="System Notification"
|
|
18
|
+
message2="Your settings have been updated successfully.">
|
|
19
|
+
</rel-alert>
|
|
20
|
+
|
|
21
|
+
<!-- Success alert -->
|
|
22
|
+
<rel-alert
|
|
23
|
+
type="success"
|
|
24
|
+
message1="Operation Completed"
|
|
25
|
+
message2="Your data has been saved.">
|
|
26
|
+
</rel-alert>
|
|
27
|
+
|
|
28
|
+
<!-- Warning alert -->
|
|
29
|
+
<rel-alert
|
|
30
|
+
type="warning"
|
|
31
|
+
message1="Warning"
|
|
32
|
+
message2="Please verify your input before continuing.">
|
|
33
|
+
</rel-alert>
|
|
34
|
+
|
|
35
|
+
<!-- Error alert -->
|
|
36
|
+
<rel-alert
|
|
37
|
+
type="error"
|
|
38
|
+
message1="Error Occurred"
|
|
39
|
+
message2="Unable to process your request.">
|
|
40
|
+
</rel-alert>
|
|
41
|
+
|
|
42
|
+
<!-- With action link -->
|
|
43
|
+
<rel-alert
|
|
44
|
+
type="info"
|
|
45
|
+
message1="Update Available"
|
|
46
|
+
message2="A new version is ready."
|
|
47
|
+
urlText="Learn More"
|
|
48
|
+
urlHref="https://example.com/release-notes">
|
|
49
|
+
</rel-alert>
|
|
50
|
+
|
|
51
|
+
<!-- Non-dismissible -->
|
|
52
|
+
<rel-alert
|
|
53
|
+
type="warning"
|
|
54
|
+
message1="Required Action"
|
|
55
|
+
dismissible="false">
|
|
56
|
+
</rel-alert>
|
|
57
|
+
|
|
58
|
+
<!-- Listen for dismiss -->
|
|
59
|
+
<rel-alert id="myAlert" type="success" message1="Success!"></rel-alert>
|
|
60
|
+
<script>
|
|
61
|
+
const alert = document.getElementById('myAlert');
|
|
62
|
+
alert.addEventListener('dismiss', () => {
|
|
63
|
+
console.log('Alert was dismissed');
|
|
64
|
+
});
|
|
65
|
+
</script>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## API
|
|
69
|
+
|
|
70
|
+
### Attributes/Properties
|
|
71
|
+
| Name | Type | Default | Description |
|
|
72
|
+
|------|------|---------|-------------|
|
|
73
|
+
| `type` | `"info" \| "success" \| "warning" \| "error" \| "neutral"` | `"neutral"` | Alert type determining icon and color scheme |
|
|
74
|
+
| `message1` | `string` | `""` | Primary message text (bold) |
|
|
75
|
+
| `message2` | `string` | - | Optional secondary message text (smaller, slightly transparent) |
|
|
76
|
+
| `urlText` | `string` | - | Link text (shown below messages) |
|
|
77
|
+
| `urlHref` | `string` | - | Link URL (both `urlText` and `urlHref` required for link to show) |
|
|
78
|
+
| `dismissible` | `boolean` | `true` | Whether to show the close (✕) button |
|
|
79
|
+
| `dismissed` | `boolean` (reflected) | `false` | When true, hides the component via `:host([dismissed])` |
|
|
80
|
+
|
|
81
|
+
## Events
|
|
82
|
+
| Event | Detail | Description |
|
|
83
|
+
|-------|--------|-------------|
|
|
84
|
+
| `dismiss` | None | Fired when the close button is clicked (sets `dismissed` to true) |
|
|
85
|
+
|
|
86
|
+
## Slots
|
|
87
|
+
Default slot not used.
|
|
88
|
+
|
|
89
|
+
## CSS Parts
|
|
90
|
+
None exposed.
|
|
91
|
+
|
|
92
|
+
## Tokens / CSS Variables
|
|
93
|
+
|
|
94
|
+
### Semantic Tokens
|
|
95
|
+
- `--rel-fontFamilies-primary` - Font family
|
|
96
|
+
- `--rel-fontSizes-md` - Primary message font size
|
|
97
|
+
- `--rel-fontSizes-sm` - Secondary message and link font size
|
|
98
|
+
- `--rel-fontWeights-medium` - Primary message and link font weight
|
|
99
|
+
- `--rel-fontWeights-semibold` - Used implicitly in link styling
|
|
100
|
+
|
|
101
|
+
### Spacing Tokens
|
|
102
|
+
- `--rel-spacing-space-xs` - Gap between icon and content
|
|
103
|
+
- `--rel-spacing-space-sm` - Vertical padding
|
|
104
|
+
- `--rel-spacing-space-md` - Horizontal padding
|
|
105
|
+
- `--rel-spacing-space-2xs` - Close button padding
|
|
106
|
+
|
|
107
|
+
### Color Tokens (by type)
|
|
108
|
+
- **info**: `--rel-background-info` (background), `--rel-text-info` (text), `--rel-icon-info` (icon)
|
|
109
|
+
- **success**: `--rel-background-success`, `--rel-text-success`, `--rel-icon-success`
|
|
110
|
+
- **warning**: `--rel-background-warning`, `--rel-text-warning`, `--rel-icon-warning`
|
|
111
|
+
- **error**: `--rel-background-error`, `--rel-text-error`, `--rel-icon-error`
|
|
112
|
+
- **neutral**: `--rel-colors-white` (background), `--rel-text-primary` (text), `--rel-colors-black` (icon), `--rel-border-default` (border)
|
|
113
|
+
|
|
114
|
+
### Border Tokens
|
|
115
|
+
- `--rel-borders-radius-border-radius-200` - Border radius
|
|
116
|
+
|
|
117
|
+
## Accessibility
|
|
118
|
+
- Uses `role="alert"` for screen reader announcements
|
|
119
|
+
- Close button has `aria-label="Dismiss"`
|
|
120
|
+
- Focus visible states on close button with 2px outline
|
|
121
|
+
- Secondary message has reduced opacity for visual hierarchy
|
|
122
|
+
|
|
123
|
+
### Keyboard Interactions
|
|
124
|
+
- `Tab` - Focus the close button (if dismissible)
|
|
125
|
+
- `Space/Enter` - Dismiss the alert (when close button focused)
|
|
126
|
+
|
|
127
|
+
### Focus Behavior
|
|
128
|
+
- Close button shows 2px outline matching the alert's text color with 2px offset
|
|
129
|
+
- Border radius applied to maintain visual consistency
|
|
130
|
+
|
|
131
|
+
## Notes / Edge Cases
|
|
132
|
+
- Icons are built-in SVG graphics that change based on `type` (info: ℹ️, success: ✓, warning: ⚠️, error: ❗, neutral: ℹ️)
|
|
133
|
+
- Icon colors are controlled by type-specific `--rel-icon-*` tokens
|
|
134
|
+
- The alert has a minimum width of `360px`
|
|
135
|
+
- Both `urlText` and `urlHref` must be set for the link to appear
|
|
136
|
+
- Links inherit the alert's text color and are underlined
|
|
137
|
+
- `message2` has `opacity: 0.9` for subtle contrast with `message1`
|
|
138
|
+
- When `dismissed` is set to `true`, the component applies `display: none` via `:host([dismissed])`
|
|
139
|
+
- `dismissed` is a reflected attribute, meaning it appears in the HTML when true
|
|
140
|
+
- The close button is always positioned at the right edge via `margin-left: auto`
|
|
141
|
+
- Neutral type includes a 1px border while colored types do not
|