@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,178 @@
|
|
|
1
|
+
# rel-table
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
A simple table wrapper component providing optional border and compact mode styling. Uses slots to accept standard HTML table content (thead, tbody, tfoot). Features horizontal scrolling for overflow and semantic table structure.
|
|
5
|
+
|
|
6
|
+
## Usage
|
|
7
|
+
```html
|
|
8
|
+
<!-- Basic table -->
|
|
9
|
+
<rel-table>
|
|
10
|
+
<thead>
|
|
11
|
+
<tr>
|
|
12
|
+
<th>Name</th>
|
|
13
|
+
<th>Email</th>
|
|
14
|
+
<th>Role</th>
|
|
15
|
+
</tr>
|
|
16
|
+
</thead>
|
|
17
|
+
<tbody>
|
|
18
|
+
<tr>
|
|
19
|
+
<td>John Doe</td>
|
|
20
|
+
<td>john@example.com</td>
|
|
21
|
+
<td>Admin</td>
|
|
22
|
+
</tr>
|
|
23
|
+
<tr>
|
|
24
|
+
<td>Jane Smith</td>
|
|
25
|
+
<td>jane@example.com</td>
|
|
26
|
+
<td>User</td>
|
|
27
|
+
</tr>
|
|
28
|
+
</tbody>
|
|
29
|
+
</rel-table>
|
|
30
|
+
|
|
31
|
+
<!-- Bordered table -->
|
|
32
|
+
<rel-table bordered>
|
|
33
|
+
<thead>
|
|
34
|
+
<tr>
|
|
35
|
+
<th>Product</th>
|
|
36
|
+
<th>Price</th>
|
|
37
|
+
<th>Quantity</th>
|
|
38
|
+
</tr>
|
|
39
|
+
</thead>
|
|
40
|
+
<tbody>
|
|
41
|
+
<tr>
|
|
42
|
+
<td>Widget</td>
|
|
43
|
+
<td>$10.00</td>
|
|
44
|
+
<td>5</td>
|
|
45
|
+
</tr>
|
|
46
|
+
<tr>
|
|
47
|
+
<td>Gadget</td>
|
|
48
|
+
<td>$25.00</td>
|
|
49
|
+
<td>2</td>
|
|
50
|
+
</tr>
|
|
51
|
+
</tbody>
|
|
52
|
+
</rel-table>
|
|
53
|
+
|
|
54
|
+
<!-- Compact table -->
|
|
55
|
+
<rel-table compact>
|
|
56
|
+
<thead>
|
|
57
|
+
<tr>
|
|
58
|
+
<th>ID</th>
|
|
59
|
+
<th>Status</th>
|
|
60
|
+
</tr>
|
|
61
|
+
</thead>
|
|
62
|
+
<tbody>
|
|
63
|
+
<tr>
|
|
64
|
+
<td>001</td>
|
|
65
|
+
<td>Active</td>
|
|
66
|
+
</tr>
|
|
67
|
+
<tr>
|
|
68
|
+
<td>002</td>
|
|
69
|
+
<td>Pending</td>
|
|
70
|
+
</tr>
|
|
71
|
+
</tbody>
|
|
72
|
+
</rel-table>
|
|
73
|
+
|
|
74
|
+
<!-- Bordered and compact -->
|
|
75
|
+
<rel-table bordered compact>
|
|
76
|
+
<thead>
|
|
77
|
+
<tr>
|
|
78
|
+
<th>Date</th>
|
|
79
|
+
<th>Event</th>
|
|
80
|
+
</tr>
|
|
81
|
+
</thead>
|
|
82
|
+
<tbody>
|
|
83
|
+
<tr>
|
|
84
|
+
<td>2024-01-15</td>
|
|
85
|
+
<td>Launch</td>
|
|
86
|
+
</tr>
|
|
87
|
+
<tr>
|
|
88
|
+
<td>2024-02-20</td>
|
|
89
|
+
<td>Update</td>
|
|
90
|
+
</tr>
|
|
91
|
+
</tbody>
|
|
92
|
+
</rel-table>
|
|
93
|
+
|
|
94
|
+
<!-- Responsive table with horizontal scroll -->
|
|
95
|
+
<rel-table bordered>
|
|
96
|
+
<thead>
|
|
97
|
+
<tr>
|
|
98
|
+
<th>Column 1</th>
|
|
99
|
+
<th>Column 2</th>
|
|
100
|
+
<th>Column 3</th>
|
|
101
|
+
<th>Column 4</th>
|
|
102
|
+
<th>Column 5</th>
|
|
103
|
+
<th>Column 6</th>
|
|
104
|
+
<th>Column 7</th>
|
|
105
|
+
<th>Column 8</th>
|
|
106
|
+
</tr>
|
|
107
|
+
</thead>
|
|
108
|
+
<tbody>
|
|
109
|
+
<tr>
|
|
110
|
+
<td>Data 1</td>
|
|
111
|
+
<td>Data 2</td>
|
|
112
|
+
<td>Data 3</td>
|
|
113
|
+
<td>Data 4</td>
|
|
114
|
+
<td>Data 5</td>
|
|
115
|
+
<td>Data 6</td>
|
|
116
|
+
<td>Data 7</td>
|
|
117
|
+
<td>Data 8</td>
|
|
118
|
+
</tr>
|
|
119
|
+
</tbody>
|
|
120
|
+
</rel-table>
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## API
|
|
124
|
+
|
|
125
|
+
### Attributes/Properties
|
|
126
|
+
| Name | Type | Default | Description |
|
|
127
|
+
|------|------|---------|-------------|
|
|
128
|
+
| `bordered` (reflected) | `boolean` | `false` | Adds border and border-radius to the table wrapper |
|
|
129
|
+
| `compact` (reflected) | `boolean` | `false` | Applies compact spacing (currently defined but not styled in component) |
|
|
130
|
+
|
|
131
|
+
## Events
|
|
132
|
+
None.
|
|
133
|
+
|
|
134
|
+
## Slots
|
|
135
|
+
| Slot | Description |
|
|
136
|
+
|------|-------------|
|
|
137
|
+
| (default) | Standard HTML table content (`<thead>`, `<tbody>`, `<tfoot>`, `<tr>`, `<th>`, `<td>`, etc.) |
|
|
138
|
+
|
|
139
|
+
## CSS Parts
|
|
140
|
+
None exposed.
|
|
141
|
+
|
|
142
|
+
## Tokens / CSS Variables
|
|
143
|
+
|
|
144
|
+
### Semantic Tokens
|
|
145
|
+
- `--rel-fontFamilies-primary` - Font family
|
|
146
|
+
- `--rel-fontSizes-md` - Table font size
|
|
147
|
+
|
|
148
|
+
### Color Tokens
|
|
149
|
+
- `--rel-colors-gray-primary` - Table text color
|
|
150
|
+
- `--rel-colors-gray-border` - Border color (when bordered is true)
|
|
151
|
+
|
|
152
|
+
### Border Tokens
|
|
153
|
+
- `--rel-borders-width-stroke-100` - Border width
|
|
154
|
+
- `--rel-borders-radius-border-radius-200` - Table wrapper border radius
|
|
155
|
+
|
|
156
|
+
## Accessibility
|
|
157
|
+
- Uses semantic native `<table>` element for proper screen reader support
|
|
158
|
+
- Ensure slotted table content includes proper `<thead>`, `<th>`, and `scope` attributes
|
|
159
|
+
- `caption-side: bottom` allows captions to be read after table content
|
|
160
|
+
|
|
161
|
+
### Keyboard Interactions
|
|
162
|
+
- Standard browser table navigation
|
|
163
|
+
- Focusable elements within cells can be tabbed to
|
|
164
|
+
|
|
165
|
+
### Focus Behavior
|
|
166
|
+
- No specific focus handling (standard table behavior)
|
|
167
|
+
|
|
168
|
+
## Notes / Edge Cases
|
|
169
|
+
- The component wraps the table in a `.table-wrapper` div with `overflow-x: auto` for horizontal scrolling
|
|
170
|
+
- The inner `<table>` element uses `border-collapse: collapse` for standard table rendering
|
|
171
|
+
- **bordered mode**: Applies a border with `--rel-borders-width-stroke-100` and rounded corners to the wrapper
|
|
172
|
+
- The `bordered` and `compact` attributes are reflected in HTML (appear as actual attributes when set)
|
|
173
|
+
- **compact mode**: Currently reflected but no styling is applied in the component (may be intended for future use or external styling)
|
|
174
|
+
- The table is `width: 100%` by default
|
|
175
|
+
- The component is `display: block` and takes full width of its container
|
|
176
|
+
- The table uses `caption-side: bottom` for any `<caption>` elements
|
|
177
|
+
- You must provide your own cell padding, row styling, and hover effects via global CSS or inline styles
|
|
178
|
+
- The component provides minimal structural styling; most table appearance is controlled by the browser and your custom CSS
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { LitElement, html, css } from "lit";
|
|
2
|
+
import { customElement } from "lit/decorators.js";
|
|
3
|
+
|
|
4
|
+
@customElement("rel-table-body")
|
|
5
|
+
export class RelTableBody extends LitElement {
|
|
6
|
+
static styles = css`
|
|
7
|
+
:host {
|
|
8
|
+
display: table-row-group;
|
|
9
|
+
font-family: var(--rel-fontFamilies-primary);
|
|
10
|
+
}
|
|
11
|
+
`;
|
|
12
|
+
|
|
13
|
+
render() {
|
|
14
|
+
return html`<slot></slot>`;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { LitElement, html, css } from "lit";
|
|
2
|
+
import { customElement } from "lit/decorators.js";
|
|
3
|
+
|
|
4
|
+
@customElement("rel-table-caption")
|
|
5
|
+
export class RelTableCaption extends LitElement {
|
|
6
|
+
static styles = css`
|
|
7
|
+
:host {
|
|
8
|
+
display: table-caption;
|
|
9
|
+
caption-side: bottom;
|
|
10
|
+
font-family: var(--rel-fontFamilies-primary);
|
|
11
|
+
margin-top: var(--rel-spacing-space-md);
|
|
12
|
+
padding-top: var(--rel-spacing-space-sm);
|
|
13
|
+
font-size: var(--rel-fontSizes-sm);
|
|
14
|
+
color: var(--rel-colors-gray-placeholder);
|
|
15
|
+
text-align: center;
|
|
16
|
+
}
|
|
17
|
+
`;
|
|
18
|
+
|
|
19
|
+
render() {
|
|
20
|
+
return html`<slot></slot>`;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { LitElement, html, css } from "lit";
|
|
2
|
+
import { customElement, property } from "lit/decorators.js";
|
|
3
|
+
|
|
4
|
+
@customElement("rel-table-cell")
|
|
5
|
+
export class RelTableCell extends LitElement {
|
|
6
|
+
@property({ type: String, reflect: true }) align: "left" | "center" | "right" = "left";
|
|
7
|
+
@property({ type: Number, reflect: true }) colspan?: number;
|
|
8
|
+
|
|
9
|
+
static styles = css`
|
|
10
|
+
:host {
|
|
11
|
+
display: table-cell;
|
|
12
|
+
font-family: var(--rel-fontFamilies-primary);
|
|
13
|
+
padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);
|
|
14
|
+
font-size: var(--rel-fontSizes-md);
|
|
15
|
+
color: var(--rel-colors-gray-primary);
|
|
16
|
+
vertical-align: middle;
|
|
17
|
+
text-align: left;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
:host([align="center"]) {
|
|
21
|
+
text-align: center;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
:host([align="right"]) {
|
|
25
|
+
text-align: right;
|
|
26
|
+
}
|
|
27
|
+
`;
|
|
28
|
+
|
|
29
|
+
render() {
|
|
30
|
+
return html`<slot></slot>`;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
updated(changedProperties: Map<string, any>) {
|
|
34
|
+
super.updated(changedProperties);
|
|
35
|
+
// Handle colspan attribute
|
|
36
|
+
if (changedProperties.has("colspan") && this.colspan) {
|
|
37
|
+
// Apply colspan to the host element since it's display: table-cell
|
|
38
|
+
this.style.setProperty("--colspan", this.colspan.toString());
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
connectedCallback() {
|
|
43
|
+
super.connectedCallback();
|
|
44
|
+
// Set colspan attribute on the host element for table layout
|
|
45
|
+
if (this.colspan) {
|
|
46
|
+
this.setAttribute("colspan", this.colspan.toString());
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { LitElement, html, css } from "lit";
|
|
2
|
+
import { customElement } from "lit/decorators.js";
|
|
3
|
+
|
|
4
|
+
@customElement("rel-table-footer")
|
|
5
|
+
export class RelTableFooter extends LitElement {
|
|
6
|
+
static styles = css`
|
|
7
|
+
:host {
|
|
8
|
+
display: table-footer-group;
|
|
9
|
+
font-family: var(--rel-fontFamilies-primary);
|
|
10
|
+
font-weight: var(--rel-fontWeights-medium, 500);
|
|
11
|
+
background-color: var(--rel-colors-gray-light);
|
|
12
|
+
}
|
|
13
|
+
`;
|
|
14
|
+
|
|
15
|
+
render() {
|
|
16
|
+
return html`<slot></slot>`;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { LitElement, html, css } from "lit";
|
|
2
|
+
import { customElement, property } from "lit/decorators.js";
|
|
3
|
+
|
|
4
|
+
@customElement("rel-table-head")
|
|
5
|
+
export class RelTableHead extends LitElement {
|
|
6
|
+
@property({ type: String, reflect: true }) align: "left" | "center" | "right" = "left";
|
|
7
|
+
|
|
8
|
+
static styles = css`
|
|
9
|
+
:host {
|
|
10
|
+
display: table-cell;
|
|
11
|
+
font-family: var(--rel-fontFamilies-primary);
|
|
12
|
+
padding: var(--rel-spacing-space-sm) var(--rel-spacing-space-md);
|
|
13
|
+
text-align: left;
|
|
14
|
+
font-weight: var(--rel-fontWeights-medium, 500);
|
|
15
|
+
font-size: var(--rel-fontSizes-sm);
|
|
16
|
+
color: var(--rel-colors-gray-placeholder);
|
|
17
|
+
vertical-align: middle;
|
|
18
|
+
height: 48px;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
:host([align="center"]) {
|
|
22
|
+
text-align: center;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
:host([align="right"]) {
|
|
26
|
+
text-align: right;
|
|
27
|
+
}
|
|
28
|
+
`;
|
|
29
|
+
|
|
30
|
+
render() {
|
|
31
|
+
return html`<slot></slot>`;
|
|
32
|
+
}
|
|
33
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { LitElement, html, css } from "lit";
|
|
2
|
+
import { customElement } from "lit/decorators.js";
|
|
3
|
+
|
|
4
|
+
@customElement("rel-table-header")
|
|
5
|
+
export class RelTableHeader extends LitElement {
|
|
6
|
+
static styles = css`
|
|
7
|
+
:host {
|
|
8
|
+
display: table-header-group;
|
|
9
|
+
font-family: var(--rel-fontFamilies-primary);
|
|
10
|
+
}
|
|
11
|
+
`;
|
|
12
|
+
|
|
13
|
+
render() {
|
|
14
|
+
return html`<slot></slot>`;
|
|
15
|
+
}
|
|
16
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { LitElement, html, css } from "lit";
|
|
2
|
+
import { customElement, property } from "lit/decorators.js";
|
|
3
|
+
|
|
4
|
+
@customElement("rel-table-row")
|
|
5
|
+
export class RelTableRow extends LitElement {
|
|
6
|
+
@property({ type: Boolean, reflect: true }) selected = false;
|
|
7
|
+
|
|
8
|
+
static styles = css`
|
|
9
|
+
:host {
|
|
10
|
+
display: table-row;
|
|
11
|
+
font-family: var(--rel-fontFamilies-primary);
|
|
12
|
+
border-bottom: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);
|
|
13
|
+
transition: background-color 0.15s ease;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
:host(:hover) {
|
|
17
|
+
background-color: var(--rel-colors-gray-light);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
:host([selected]) {
|
|
21
|
+
background-color: var(--rel-colors-gray-surface);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
:host([selected]:hover) {
|
|
25
|
+
background-color: var(--rel-colors-gray-warm);
|
|
26
|
+
}
|
|
27
|
+
`;
|
|
28
|
+
|
|
29
|
+
render() {
|
|
30
|
+
return html`<slot></slot>`;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { LitElement, html, css } from "lit";
|
|
2
|
+
import { customElement, property } from "lit/decorators.js";
|
|
3
|
+
|
|
4
|
+
@customElement("rel-table")
|
|
5
|
+
export class RelTable extends LitElement {
|
|
6
|
+
@property({ type: Boolean, reflect: true }) bordered = false;
|
|
7
|
+
@property({ type: Boolean, reflect: true }) compact = false;
|
|
8
|
+
|
|
9
|
+
static styles = css`
|
|
10
|
+
:host {
|
|
11
|
+
display: block;
|
|
12
|
+
font-family: var(--rel-fontFamilies-primary);
|
|
13
|
+
position: relative;
|
|
14
|
+
width: 100%;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
.table-wrapper {
|
|
18
|
+
position: relative;
|
|
19
|
+
width: 100%;
|
|
20
|
+
overflow-x: auto;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
:host([bordered]) .table-wrapper {
|
|
24
|
+
border: var(--rel-borders-width-stroke-100) solid var(--rel-colors-gray-border);
|
|
25
|
+
border-radius: var(--rel-borders-radius-border-radius-200);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
table {
|
|
29
|
+
width: 100%;
|
|
30
|
+
caption-side: bottom;
|
|
31
|
+
border-collapse: collapse;
|
|
32
|
+
font-size: var(--rel-fontSizes-md);
|
|
33
|
+
color: var(--rel-colors-gray-primary);
|
|
34
|
+
font-family: var(--rel-fontFamilies-primary);
|
|
35
|
+
}
|
|
36
|
+
`;
|
|
37
|
+
|
|
38
|
+
render() {
|
|
39
|
+
return html`
|
|
40
|
+
<div class="table-wrapper">
|
|
41
|
+
<table>
|
|
42
|
+
<slot></slot>
|
|
43
|
+
</table>
|
|
44
|
+
</div>
|
|
45
|
+
`;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# rel-textfield
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
A text input field component with support for labels, icons, validation states, and supporting text. Used for single-line text entry in forms and user interfaces.
|
|
6
|
+
|
|
7
|
+
## Usage
|
|
8
|
+
|
|
9
|
+
```html
|
|
10
|
+
<!-- Basic usage -->
|
|
11
|
+
<rel-textfield label="Email" placeholder="Enter your email"></rel-textfield>
|
|
12
|
+
|
|
13
|
+
<!-- With icons and supporting text -->
|
|
14
|
+
<rel-textfield
|
|
15
|
+
label="Password"
|
|
16
|
+
type="password"
|
|
17
|
+
leftIcon="🔒"
|
|
18
|
+
supportingText="Must be at least 8 characters">
|
|
19
|
+
</rel-textfield>
|
|
20
|
+
|
|
21
|
+
<!-- Setting value via JavaScript -->
|
|
22
|
+
<rel-textfield id="myField" label="Username"></rel-textfield>
|
|
23
|
+
<script>
|
|
24
|
+
const field = document.getElementById('myField');
|
|
25
|
+
field.value = 'john.doe';
|
|
26
|
+
</script>
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
## API
|
|
30
|
+
|
|
31
|
+
### Attributes/Properties
|
|
32
|
+
|
|
33
|
+
| Name | Type | Default | Description |
|
|
34
|
+
|------|------|---------|-------------|
|
|
35
|
+
| `label` | `string` | - | Label text displayed above the input |
|
|
36
|
+
| `placeholder` | `string` | `""` | Placeholder text |
|
|
37
|
+
| `type` | `string` | `"text"` | Input type (text, email, password, etc.) |
|
|
38
|
+
| `value` | `string` | `""` | Current input value |
|
|
39
|
+
| `leftIcon` | `string` | - | Icon content on the left side |
|
|
40
|
+
| `rightIcon` | `string` | - | Icon content on the right side |
|
|
41
|
+
| `supportingText` | `string` | - | Helper or error text below input |
|
|
42
|
+
| `state` | `"default" \| "focused" \| "error" \| "disabled"` | `"default"` | Visual state |
|
|
43
|
+
| `size` | `"small" \| "medium" \| "large"` | `"medium"` | Size variant |
|
|
44
|
+
|
|
45
|
+
## Events
|
|
46
|
+
|
|
47
|
+
| Event | Detail | Description |
|
|
48
|
+
|-------|--------|-------------|
|
|
49
|
+
| `input-change` | `string` (the current value) | Fires when the input value changes through user interaction |
|
|
50
|
+
|
|
51
|
+
## Slots
|
|
52
|
+
|
|
53
|
+
Default slot not used. All content controlled via properties.
|
|
54
|
+
|
|
55
|
+
## CSS Parts
|
|
56
|
+
|
|
57
|
+
None exposed.
|
|
58
|
+
|
|
59
|
+
## Tokens / CSS Variables
|
|
60
|
+
|
|
61
|
+
- `--rel-fontFamilies-primary`: Font family
|
|
62
|
+
- `--rel-fontSizes-sm`, `--rel-fontSizes-md`: Font sizes
|
|
63
|
+
- `--rel-fontWeights-medium`: Font weight for label
|
|
64
|
+
- `--rel-text-heading`: Label color
|
|
65
|
+
- `--rel-text-primary`: Input text color
|
|
66
|
+
- `--rel-text-placeholder`: Placeholder and icon color
|
|
67
|
+
- `--rel-text-disabled`: Disabled text color
|
|
68
|
+
- `--rel-border-default`: Default border color
|
|
69
|
+
- `--rel-colors-primary-500`: Focus border color
|
|
70
|
+
- `--rel-border-error`: Error state border color
|
|
71
|
+
- `--rel-colors-white`: Input background (light mode)
|
|
72
|
+
- `--rel-surface-surface`: Disabled background
|
|
73
|
+
- `--rel-spacing-space-*`: Spacing tokens
|
|
74
|
+
- `--rel-borders-radius-border-radius-200`: Border radius
|
|
75
|
+
|
|
76
|
+
## Accessibility
|
|
77
|
+
|
|
78
|
+
- Associates `<label>` with input via `for`/`id`
|
|
79
|
+
- Supports native HTML5 input attributes (`required`, `disabled`, `readonly`, `maxlength`)
|
|
80
|
+
- Focus ring visible on keyboard navigation (`:focus-visible`)
|
|
81
|
+
- Error state communicated visually via border color
|
|
82
|
+
- Supporting text can provide `aria-describedby` context
|
|
83
|
+
|
|
84
|
+
## Notes / Edge Cases
|
|
85
|
+
|
|
86
|
+
- The `state` prop overrides internal focus state if set explicitly
|
|
87
|
+
- Icons are decorative (text content, not `<img>` elements)
|
|
88
|
+
- Input type `password` does not auto-toggle visibility (use `rightIcon` for toggle button)
|
|
89
|
+
- Error state must be set programmatically; no built-in validation
|
|
90
|
+
- Disabled inputs cannot be focused or edited
|
|
@@ -21,22 +21,22 @@ export class RelTextfield extends LitElement {
|
|
|
21
21
|
static styles = css`
|
|
22
22
|
:host {
|
|
23
23
|
display: block;
|
|
24
|
-
font-family: var(--rel-fontFamilies-primary);
|
|
24
|
+
font-family: var(--rel-fontFamilies-primary, sans-serif);
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
/* Wrapper */
|
|
28
28
|
.textfield-wrapper {
|
|
29
29
|
display: flex;
|
|
30
30
|
flex-direction: column;
|
|
31
|
-
gap: 4px;
|
|
31
|
+
gap: var(--rel-spacing-space-2xs, 4px);
|
|
32
32
|
width: 100%;
|
|
33
33
|
}
|
|
34
34
|
|
|
35
35
|
/* Label */
|
|
36
36
|
.textfield-label {
|
|
37
|
-
font-size:
|
|
38
|
-
font-weight: 500;
|
|
39
|
-
color: #
|
|
37
|
+
font-size: var(--rel-fontSizes-sm, 12px);
|
|
38
|
+
font-weight: var(--rel-fontWeights-medium, 500);
|
|
39
|
+
color: var(--rel-text-heading, #2b2b2b);
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
/* Container */
|
|
@@ -44,14 +44,14 @@ export class RelTextfield extends LitElement {
|
|
|
44
44
|
display: flex;
|
|
45
45
|
align-items: center;
|
|
46
46
|
position: relative;
|
|
47
|
-
border: 1px solid #
|
|
48
|
-
border-radius:
|
|
49
|
-
background: white;
|
|
47
|
+
border: 1px solid var(--rel-border-default, #ddd);
|
|
48
|
+
border-radius: var(--rel-borders-radius-border-radius-200, 8px);
|
|
49
|
+
background: var(--rel-colors-white, #fff);
|
|
50
50
|
transition: border 0.2s;
|
|
51
51
|
}
|
|
52
52
|
|
|
53
53
|
.textfield-container.disabled {
|
|
54
|
-
background: #f5f5f5;
|
|
54
|
+
background: var(--rel-surface-surface, #f5f5f5);
|
|
55
55
|
cursor: not-allowed;
|
|
56
56
|
}
|
|
57
57
|
|
|
@@ -60,22 +60,23 @@ export class RelTextfield extends LitElement {
|
|
|
60
60
|
flex: 1;
|
|
61
61
|
border: none;
|
|
62
62
|
outline: none;
|
|
63
|
-
font-size:
|
|
63
|
+
font-size: var(--rel-fontSizes-md, 14px);
|
|
64
64
|
padding: 0.5rem 0.75rem;
|
|
65
65
|
background: transparent;
|
|
66
|
-
font-family: var(--rel-fontFamilies-primary);
|
|
66
|
+
font-family: var(--rel-fontFamilies-primary, sans-serif);
|
|
67
|
+
color: var(--rel-text-primary, #333);
|
|
67
68
|
}
|
|
68
69
|
|
|
69
70
|
.textfield-input:disabled {
|
|
70
71
|
cursor: not-allowed;
|
|
71
|
-
color: #
|
|
72
|
+
color: var(--rel-text-disabled, #9e9e9e);
|
|
72
73
|
}
|
|
73
74
|
|
|
74
75
|
.icon {
|
|
75
76
|
position: absolute;
|
|
76
77
|
display: flex;
|
|
77
78
|
pointer-events: none;
|
|
78
|
-
color: #
|
|
79
|
+
color: var(--rel-text-placeholder, #a9a9a9);
|
|
79
80
|
}
|
|
80
81
|
|
|
81
82
|
.icon.left {
|
|
@@ -112,25 +113,40 @@ export class RelTextfield extends LitElement {
|
|
|
112
113
|
|
|
113
114
|
/* States */
|
|
114
115
|
.textfield-wrapper.focused .textfield-container {
|
|
115
|
-
border-color: #
|
|
116
|
+
border-color: var(--rel-colors-primary-500, #0091ea);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.textfield-input:focus-visible {
|
|
120
|
+
outline: none;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
.textfield-wrapper.focused .textfield-container,
|
|
124
|
+
.textfield-container:focus-within {
|
|
125
|
+
border-color: var(--rel-colors-primary-500, #0091ea);
|
|
126
|
+
box-shadow: 0 0 0 1px var(--rel-colors-primary-500, #0091ea);
|
|
116
127
|
}
|
|
117
128
|
|
|
118
129
|
.textfield-wrapper.error .textfield-container {
|
|
119
|
-
border-color: #
|
|
130
|
+
border-color: var(--rel-border-error, #cc0000);
|
|
120
131
|
}
|
|
121
132
|
|
|
122
133
|
.textfield-wrapper.disabled .textfield-container {
|
|
123
|
-
border-color: #
|
|
134
|
+
border-color: var(--rel-border-default, #ddd);
|
|
124
135
|
}
|
|
125
136
|
|
|
126
137
|
/* Supporting text */
|
|
127
138
|
.textfield-support {
|
|
128
|
-
font-size:
|
|
129
|
-
color: #
|
|
139
|
+
font-size: var(--rel-fontSizes-xs, 10px);
|
|
140
|
+
color: var(--rel-text-placeholder, #a9a9a9);
|
|
130
141
|
}
|
|
131
142
|
|
|
132
143
|
.textfield-support.error {
|
|
133
|
-
color: #
|
|
144
|
+
color: var(--rel-text-error, #cc0000);
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/* Placeholder */
|
|
148
|
+
.textfield-input::placeholder {
|
|
149
|
+
color: var(--rel-text-placeholder, #a9a9a9);
|
|
134
150
|
}
|
|
135
151
|
`;
|
|
136
152
|
|
|
@@ -154,8 +170,8 @@ export class RelTextfield extends LitElement {
|
|
|
154
170
|
const input = e.target as HTMLInputElement;
|
|
155
171
|
this.value = input.value;
|
|
156
172
|
this.dispatchEvent(
|
|
157
|
-
new CustomEvent("input-change", {
|
|
158
|
-
detail:
|
|
173
|
+
new CustomEvent<string>("input-change", {
|
|
174
|
+
detail: this.value,
|
|
159
175
|
bubbles: true,
|
|
160
176
|
composed: true,
|
|
161
177
|
})
|