@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.
Files changed (145) hide show
  1. package/dist/components/rel-accordion/README.md +132 -0
  2. package/dist/components/rel-accordion/rel-accordion.ts +61 -29
  3. package/dist/components/rel-alert/README.md +141 -0
  4. package/dist/components/rel-alert/rel-alert.ts +110 -67
  5. package/dist/components/rel-avatar/README.md +119 -0
  6. package/dist/components/rel-avatar/rel-avatar.ts +8 -15
  7. package/dist/components/rel-badge/README.md +86 -0
  8. package/dist/components/rel-badge/rel-badge.ts +28 -21
  9. package/dist/components/rel-breadcrumb/README.md +102 -0
  10. package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +24 -18
  11. package/dist/components/rel-button/README.md +130 -0
  12. package/dist/components/rel-button/rel-button.ts +39 -59
  13. package/dist/components/rel-calendar/README.md +109 -0
  14. package/dist/components/rel-calendar/index.ts +1 -0
  15. package/dist/components/rel-calendar/rel-calendar.ts +467 -0
  16. package/dist/components/rel-card/README.md +94 -0
  17. package/dist/components/rel-card/rel-card.ts +21 -11
  18. package/dist/components/rel-cardmedia/README.md +127 -0
  19. package/dist/components/rel-cardmedia/rel-cardmedia.ts +22 -18
  20. package/dist/components/rel-carousel/README.md +166 -0
  21. package/dist/components/rel-carousel/index.ts +1 -0
  22. package/dist/components/rel-carousel/rel-carousel.ts +469 -0
  23. package/dist/components/rel-chart/README.md +286 -0
  24. package/dist/components/rel-chart/index.ts +1 -0
  25. package/dist/components/rel-chart/rel-chart.ts +736 -0
  26. package/dist/components/rel-checkbox/README.md +77 -0
  27. package/dist/components/rel-checkbox/rel-checkbox.ts +36 -45
  28. package/dist/components/rel-chip/README.md +114 -0
  29. package/dist/components/rel-chip/rel-chip.ts +47 -122
  30. package/dist/components/rel-container/README.md +99 -0
  31. package/dist/components/rel-container/rel-container.ts +1 -6
  32. package/dist/components/rel-date-picker/README.md +253 -0
  33. package/dist/components/rel-date-picker/index.ts +1 -0
  34. package/dist/components/rel-date-picker/rel-date-picker.ts +916 -0
  35. package/dist/components/rel-divider/README.md +100 -0
  36. package/dist/components/rel-divider/rel-divider.ts +37 -37
  37. package/dist/components/rel-drawer/README.md +200 -0
  38. package/dist/components/rel-drawer/index.ts +1 -0
  39. package/dist/components/rel-drawer/rel-drawer.ts +621 -0
  40. package/dist/components/rel-kbd/README.md +151 -0
  41. package/dist/components/rel-kbd/rel-kbd.ts +118 -0
  42. package/dist/components/rel-layout/README.md +88 -0
  43. package/dist/components/rel-layout/rel-layout.ts +12 -14
  44. package/dist/components/rel-menu/README.md +151 -0
  45. package/dist/components/rel-menu/rel-menu.ts +18 -10
  46. package/dist/components/rel-menubar/README.md +329 -0
  47. package/dist/components/rel-menubar/index.ts +2 -0
  48. package/dist/components/rel-menubar/rel-menubar-menu.ts +16 -0
  49. package/dist/components/rel-menubar/rel-menubar.ts +576 -0
  50. package/dist/components/rel-nav-menu/README.md +289 -0
  51. package/dist/components/rel-nav-menu/index.ts +3 -0
  52. package/dist/components/rel-nav-menu/rel-nav-menu-item.ts +143 -0
  53. package/dist/components/rel-nav-menu/rel-nav-menu-panel.ts +53 -0
  54. package/dist/components/rel-nav-menu/rel-nav-menu.ts +331 -0
  55. package/dist/components/rel-navbar/README.md +126 -0
  56. package/dist/components/rel-navbar/rel-navbar.ts +91 -0
  57. package/dist/components/rel-otp/README.md +440 -0
  58. package/dist/components/rel-otp/index.ts +1 -0
  59. package/dist/components/rel-otp/rel-otp.ts +504 -0
  60. package/dist/components/rel-pagination/README.md +410 -0
  61. package/dist/components/rel-pagination/index.ts +1 -0
  62. package/dist/components/rel-pagination/rel-pagination.ts +376 -0
  63. package/dist/components/rel-popover/README.md +568 -0
  64. package/dist/components/rel-popover/index.ts +2 -0
  65. package/dist/components/rel-popover/rel-popover-content.ts +55 -0
  66. package/dist/components/rel-popover/rel-popover.ts +327 -0
  67. package/dist/components/rel-progress/README.md +110 -0
  68. package/dist/components/rel-progress/rel-progress.ts +58 -20
  69. package/dist/components/rel-quote-page/README.md +166 -0
  70. package/dist/components/rel-quote-page/rel-quote-page.ts +816 -0
  71. package/dist/components/rel-radio/README.md +120 -0
  72. package/dist/components/rel-radio/rel-radio.ts +41 -73
  73. package/dist/components/rel-resizable/README.md +140 -0
  74. package/dist/components/rel-resizable/index.ts +3 -0
  75. package/dist/components/rel-resizable/rel-resizable-group.ts +374 -0
  76. package/dist/components/rel-resizable/rel-resizable-handle.ts +149 -0
  77. package/dist/components/rel-resizable/rel-resizable-panel.ts +47 -0
  78. package/dist/components/rel-segmented-button/README.md +141 -0
  79. package/dist/components/rel-segmented-button/rel-segmented-button.ts +18 -13
  80. package/dist/components/rel-select/README.md +107 -0
  81. package/dist/components/rel-select/rel-select.ts +14 -14
  82. package/dist/components/rel-sheet/README.md +224 -0
  83. package/dist/components/rel-sheet/rel-sheet.ts +683 -0
  84. package/dist/components/rel-sidebar/README.md +209 -0
  85. package/dist/components/rel-sidebar/rel-sidebar.ts +1158 -0
  86. package/dist/components/rel-slider/README.md +135 -0
  87. package/dist/components/rel-slider/rel-slider.ts +19 -7
  88. package/dist/components/rel-snackbar/README.md +134 -0
  89. package/dist/components/rel-snackbar/rel-snackbar.ts +73 -2
  90. package/dist/components/rel-stepper/README.md +160 -0
  91. package/dist/components/rel-stepper/rel-stepper.ts +29 -8
  92. package/dist/components/rel-switch/README.md +102 -0
  93. package/dist/components/rel-switch/rel-switch.ts +22 -11
  94. package/dist/components/rel-tab/README.md +163 -0
  95. package/dist/components/rel-tab/rel-tab.ts +46 -22
  96. package/dist/components/rel-table/README.md +178 -0
  97. package/dist/components/rel-table/rel-table-body.ts +16 -0
  98. package/dist/components/rel-table/rel-table-caption.ts +22 -0
  99. package/dist/components/rel-table/rel-table-cell.ts +49 -0
  100. package/dist/components/rel-table/rel-table-footer.ts +18 -0
  101. package/dist/components/rel-table/rel-table-head.ts +33 -0
  102. package/dist/components/rel-table/rel-table-header.ts +16 -0
  103. package/dist/components/rel-table/rel-table-row.ts +32 -0
  104. package/dist/components/rel-table/rel-table.ts +47 -0
  105. package/dist/components/rel-textfield/README.md +90 -0
  106. package/dist/components/rel-textfield/rel-textfield.ts +37 -21
  107. package/dist/components/rel-toast/README.md +148 -0
  108. package/dist/components/rel-toast/rel-toast.ts +32 -14
  109. package/dist/components/rel-tooltip/README.md +103 -0
  110. package/dist/components/rel-tooltip/rel-tooltip.ts +9 -9
  111. package/dist/index.d.mts +846 -7
  112. package/dist/index.d.ts +846 -7
  113. package/dist/index.js +10860 -1803
  114. package/dist/index.js.map +1 -1
  115. package/dist/index.mjs +10820 -1809
  116. package/dist/index.mjs.map +1 -1
  117. package/dist/styles/vars.css +293 -183
  118. package/dist/vars-ITL2K3KO.css +294 -0
  119. package/package.json +2 -2
  120. package/dist/components/rel-accordion/rel-accordion.stories.ts +0 -313
  121. package/dist/components/rel-alert/rel-alert.stories.ts +0 -412
  122. package/dist/components/rel-avatar/rel-avatar.stories.ts +0 -327
  123. package/dist/components/rel-badge/rel-badge.stories.ts +0 -350
  124. package/dist/components/rel-breadcrumb/rel-breadcrumb.stories.ts +0 -306
  125. package/dist/components/rel-button/rel-button.stories.ts +0 -356
  126. package/dist/components/rel-card/rel-card.stories.ts +0 -299
  127. package/dist/components/rel-cardmedia/rel-cardmedia.stories.ts +0 -368
  128. package/dist/components/rel-checkbox/rel-checkbox.stories.ts +0 -414
  129. package/dist/components/rel-chip/rel-chip.stories.ts +0 -552
  130. package/dist/components/rel-container/rel-container.stories.ts +0 -239
  131. package/dist/components/rel-divider/rel-divider.stories.ts +0 -229
  132. package/dist/components/rel-layout/rel-layout.stories.ts +0 -713
  133. package/dist/components/rel-menu/rel-menu.stories.ts +0 -910
  134. package/dist/components/rel-progress/rel-progress.stories.ts +0 -817
  135. package/dist/components/rel-radio/rel-radio.stories.ts +0 -1048
  136. package/dist/components/rel-segmented-button/rel-segmented-button.stories.ts +0 -1079
  137. package/dist/components/rel-select/rel-select.stories.ts +0 -1201
  138. package/dist/components/rel-slider/rel-slider.stories.ts +0 -730
  139. package/dist/components/rel-snackbar/rel-snackbar.stories.ts +0 -808
  140. package/dist/components/rel-stepper/rel-stepper.stories.ts +0 -752
  141. package/dist/components/rel-switch/rel-switch.stories.ts +0 -441
  142. package/dist/components/rel-tab/rel-tab.stories.ts +0 -492
  143. package/dist/components/rel-textfield/rel-textfield.stories.ts +0 -710
  144. package/dist/components/rel-toast/rel-toast.stories.ts +0 -394
  145. 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: 0.85rem;
38
- font-weight: 500;
39
- color: #111;
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 #ccc;
48
- border-radius: 6px;
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: 0.9rem;
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: #999;
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: #7e8186;
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: #111;
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: #d50000;
130
+ border-color: var(--rel-border-error, #cc0000);
120
131
  }
121
132
 
122
133
  .textfield-wrapper.disabled .textfield-container {
123
- border-color: #d7d9db;
134
+ border-color: var(--rel-border-default, #ddd);
124
135
  }
125
136
 
126
137
  /* Supporting text */
127
138
  .textfield-support {
128
- font-size: 0.75rem;
129
- color: #666;
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: #d50000;
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: { value: this.value },
173
+ new CustomEvent<string>("input-change", {
174
+ detail: this.value,
159
175
  bubbles: true,
160
176
  composed: true,
161
177
  })