@reliability-design/web 1.0.2

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 (60) hide show
  1. package/dist/components/rel-accordion/rel-accordion.stories.ts +313 -0
  2. package/dist/components/rel-accordion/rel-accordion.ts +114 -0
  3. package/dist/components/rel-alert/rel-alert.stories.ts +412 -0
  4. package/dist/components/rel-alert/rel-alert.ts +194 -0
  5. package/dist/components/rel-avatar/rel-avatar.stories.ts +327 -0
  6. package/dist/components/rel-avatar/rel-avatar.ts +100 -0
  7. package/dist/components/rel-badge/rel-badge.stories.ts +350 -0
  8. package/dist/components/rel-badge/rel-badge.ts +70 -0
  9. package/dist/components/rel-breadcrumb/rel-breadcrumb.stories.ts +306 -0
  10. package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +97 -0
  11. package/dist/components/rel-button/rel-button.stories.ts +356 -0
  12. package/dist/components/rel-button/rel-button.ts +204 -0
  13. package/dist/components/rel-card/rel-card.stories.ts +299 -0
  14. package/dist/components/rel-card/rel-card.ts +33 -0
  15. package/dist/components/rel-cardmedia/rel-cardmedia.stories.ts +368 -0
  16. package/dist/components/rel-cardmedia/rel-cardmedia.ts +80 -0
  17. package/dist/components/rel-checkbox/rel-checkbox.stories.ts +414 -0
  18. package/dist/components/rel-checkbox/rel-checkbox.ts +164 -0
  19. package/dist/components/rel-chip/rel-chip.stories.ts +552 -0
  20. package/dist/components/rel-chip/rel-chip.ts +261 -0
  21. package/dist/components/rel-container/rel-container.stories.ts +239 -0
  22. package/dist/components/rel-container/rel-container.ts +74 -0
  23. package/dist/components/rel-divider/rel-divider.stories.ts +229 -0
  24. package/dist/components/rel-divider/rel-divider.ts +44 -0
  25. package/dist/components/rel-layout/rel-layout.stories.ts +713 -0
  26. package/dist/components/rel-layout/rel-layout.ts +60 -0
  27. package/dist/components/rel-menu/rel-menu.stories.ts +910 -0
  28. package/dist/components/rel-menu/rel-menu.ts +319 -0
  29. package/dist/components/rel-progress/rel-progress.stories.ts +817 -0
  30. package/dist/components/rel-progress/rel-progress.ts +182 -0
  31. package/dist/components/rel-radio/rel-radio.stories.ts +1048 -0
  32. package/dist/components/rel-radio/rel-radio.ts +187 -0
  33. package/dist/components/rel-segmented-button/rel-segmented-button.stories.ts +1079 -0
  34. package/dist/components/rel-segmented-button/rel-segmented-button.ts +150 -0
  35. package/dist/components/rel-select/rel-select.stories.ts +1201 -0
  36. package/dist/components/rel-select/rel-select.ts +261 -0
  37. package/dist/components/rel-slider/rel-slider.stories.ts +730 -0
  38. package/dist/components/rel-slider/rel-slider.ts +440 -0
  39. package/dist/components/rel-snackbar/rel-snackbar.stories.ts +808 -0
  40. package/dist/components/rel-snackbar/rel-snackbar.ts +212 -0
  41. package/dist/components/rel-stepper/rel-stepper.stories.ts +752 -0
  42. package/dist/components/rel-stepper/rel-stepper.ts +425 -0
  43. package/dist/components/rel-switch/rel-switch.stories.ts +441 -0
  44. package/dist/components/rel-switch/rel-switch.ts +161 -0
  45. package/dist/components/rel-tab/rel-tab.stories.ts +492 -0
  46. package/dist/components/rel-tab/rel-tab.ts +145 -0
  47. package/dist/components/rel-textfield/rel-textfield.stories.ts +710 -0
  48. package/dist/components/rel-textfield/rel-textfield.ts +224 -0
  49. package/dist/components/rel-toast/rel-toast.stories.ts +394 -0
  50. package/dist/components/rel-toast/rel-toast.ts +154 -0
  51. package/dist/components/rel-tooltip/rel-tooltip.stories.ts +364 -0
  52. package/dist/components/rel-tooltip/rel-tooltip.ts +80 -0
  53. package/dist/index.d.mts +372 -0
  54. package/dist/index.d.ts +372 -0
  55. package/dist/index.js +4593 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/index.mjs +4544 -0
  58. package/dist/index.mjs.map +1 -0
  59. package/dist/styles/vars.css +184 -0
  60. package/package.json +32 -0
@@ -0,0 +1,261 @@
1
+ import { LitElement, html, css } from "lit";
2
+ import { customElement, property } from "lit/decorators.js";
3
+
4
+ export type SelectState = "default" | "error" | "disabled";
5
+ export type SelectSize = "small" | "medium" | "large";
6
+ export type SelectBorder = "rounded" | "sharp";
7
+
8
+ @customElement("rel-select")
9
+ export class RelSelect extends LitElement {
10
+ @property({ type: String }) label: string = "";
11
+
12
+ @property({ type: Array }) options: string[] = [];
13
+
14
+ @property({ type: String }) selected: string = "";
15
+
16
+ @property({ type: String }) state: SelectState = "default";
17
+
18
+ @property({ type: String }) supportingText: string = "";
19
+
20
+ @property({ type: String }) size: SelectSize = "medium";
21
+
22
+ @property({ type: String }) border: SelectBorder = "rounded";
23
+
24
+ @property({ type: String }) leftIcon: string = "";
25
+
26
+ @property({ type: String }) rightIcon: string = "";
27
+
28
+ static styles = css`
29
+ :host {
30
+ display: block;
31
+ font-family: var(--rel-fontFamilies-primary);
32
+ width: 100%;
33
+ }
34
+
35
+ .select-wrapper {
36
+ display: flex;
37
+ flex-direction: column;
38
+ width: 100%;
39
+ }
40
+
41
+ .select-label {
42
+ font-size: var(--rel-fontSizes-sm);
43
+ margin-bottom: var(--rel-spacing-space-3xs);
44
+ font-weight: var(--rel-fontWeights-medium);
45
+ color: var(--rel-colors-gray-heading);
46
+ }
47
+
48
+ .select-container {
49
+ position: relative;
50
+ display: flex;
51
+ align-items: center;
52
+ }
53
+
54
+ .icon {
55
+ position: absolute;
56
+ display: flex;
57
+ align-items: center;
58
+ justify-content: center;
59
+ pointer-events: none;
60
+ top: 50%;
61
+ transform: translateY(-50%);
62
+ font-size: 16px;
63
+ color: var(--rel-colors-gray-primary);
64
+ }
65
+
66
+ .icon.left {
67
+ left: 12px;
68
+ }
69
+
70
+ .icon.right {
71
+ right: 36px;
72
+ }
73
+
74
+ select {
75
+ flex: 1;
76
+ appearance: none;
77
+ border: 1px solid var(--rel-colors-gray-border);
78
+ background-color: var(--rel-colors-white);
79
+ background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 12 12'%3E%3Cpath fill='%23666' d='M6 9L1 4h10z'/%3E%3C/svg%3E");
80
+ background-repeat: no-repeat;
81
+ background-position: right 12px center;
82
+ font-family: var(--rel-fontFamilies-primary);
83
+ cursor: pointer;
84
+ transition: all 0.2s ease-in-out;
85
+ color: var(--rel-colors-gray-heading);
86
+ width: 100%;
87
+ outline: none;
88
+ }
89
+
90
+ select:hover:not(:disabled) {
91
+ border-color: var(--rel-colors-gray-primary);
92
+ }
93
+
94
+ select:focus:not(:disabled) {
95
+ border-color: var(--rel-colors-black);
96
+ box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.1);
97
+ }
98
+
99
+ /* States */
100
+ select.error {
101
+ border-color: var(--rel-colors-red-secondary);
102
+ }
103
+
104
+ select.error:focus {
105
+ box-shadow: 0 0 0 3px rgba(213, 0, 0, 0.1);
106
+ }
107
+
108
+ select:disabled {
109
+ background-color: var(--rel-colors-gray-bg);
110
+ border-color: var(--rel-colors-gray-border);
111
+ color: var(--rel-colors-gray-placeholder);
112
+ cursor: not-allowed;
113
+ opacity: 0.6;
114
+ }
115
+
116
+ /* Sizes */
117
+ .select-small select {
118
+ font-size: var(--rel-fontSizes-xs);
119
+ padding: var(--rel-spacing-space-3xs) var(--rel-spacing-space-lg)
120
+ var(--rel-spacing-space-3xs) var(--rel-spacing-space-2xs);
121
+ }
122
+
123
+ .select-medium select {
124
+ font-size: var(--rel-fontSizes-sm);
125
+ padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-xl)
126
+ var(--rel-spacing-space-2xs) var(--rel-spacing-space-xs);
127
+ }
128
+
129
+ .select-large select {
130
+ font-size: var(--rel-fontSizes-md);
131
+ padding: var(--rel-spacing-space-xs) var(--rel-spacing-space-2xl)
132
+ var(--rel-spacing-space-xs) var(--rel-spacing-space-sm);
133
+ }
134
+
135
+ /* With icons */
136
+ .with-left-icon.select-small select {
137
+ padding-left: var(--rel-spacing-space-xl);
138
+ }
139
+
140
+ .with-left-icon.select-medium select {
141
+ padding-left: var(--rel-spacing-space-2xl);
142
+ }
143
+
144
+ .with-left-icon.select-large select {
145
+ padding-left: var(--rel-spacing-space-3xl);
146
+ }
147
+
148
+ .with-right-icon.select-small select {
149
+ padding-right: var(--rel-spacing-space-2xl);
150
+ }
151
+
152
+ .with-right-icon.select-medium select {
153
+ padding-right: var(--rel-spacing-space-3xl);
154
+ }
155
+
156
+ .with-right-icon.select-large select {
157
+ padding-right: 4rem;
158
+ }
159
+
160
+ /* Border */
161
+ .border-rounded select {
162
+ border-radius: var(--rel-borders-radius-border-radius-300);
163
+ }
164
+
165
+ .border-sharp select {
166
+ border-radius: 0;
167
+ }
168
+
169
+ /* Supporting text */
170
+ .supporting-text {
171
+ font-size: var(--rel-fontSizes-xs);
172
+ margin-top: var(--rel-spacing-space-3xs);
173
+ color: var(--rel-colors-gray-placeholder);
174
+ }
175
+
176
+ .error-text {
177
+ color: var(--rel-colors-red-secondary);
178
+ }
179
+ `;
180
+
181
+ private onChange(event: Event) {
182
+ const value = (event.target as HTMLSelectElement).value;
183
+ this.selected = value;
184
+ this.dispatchEvent(
185
+ new CustomEvent("changed", {
186
+ detail: { value },
187
+ bubbles: true,
188
+ composed: true,
189
+ })
190
+ );
191
+ }
192
+
193
+ render() {
194
+ const containerClasses = [
195
+ "select-container",
196
+ this.leftIcon ? "with-left-icon" : "",
197
+ this.rightIcon ? "with-right-icon" : "",
198
+ `select-${this.size}`,
199
+ ]
200
+ .filter(Boolean)
201
+ .join(" ");
202
+
203
+ const wrapperClasses = [
204
+ "select-wrapper",
205
+ `select-${this.state}`,
206
+ `border-${this.border}`,
207
+ ].join(" ");
208
+
209
+ const selectClasses = [this.state === "error" ? "error" : ""]
210
+ .filter(Boolean)
211
+ .join(" ");
212
+
213
+ const isDisabled = this.state === "disabled";
214
+
215
+ return html`
216
+ <div class="${wrapperClasses}">
217
+ ${this.label
218
+ ? html`<label class="select-label">${this.label}</label>`
219
+ : ""}
220
+
221
+ <div class="${containerClasses}">
222
+ ${this.leftIcon
223
+ ? html`<span class="icon left">${this.leftIcon}</span>`
224
+ : ""}
225
+
226
+ <select
227
+ class="${selectClasses}"
228
+ ?disabled="${isDisabled}"
229
+ @change="${this.onChange}"
230
+ .value="${this.selected}">
231
+ <option value="" disabled ?selected="${!this.selected}" hidden>
232
+ Select Option
233
+ </option>
234
+ ${this.options.map(
235
+ (option) => html`
236
+ <option value="${option}" ?selected="${option === this.selected}">
237
+ ${option}
238
+ </option>
239
+ `
240
+ )}
241
+ </select>
242
+
243
+ ${this.rightIcon
244
+ ? html`<span class="icon right">${this.rightIcon}</span>`
245
+ : ""}
246
+ </div>
247
+
248
+ ${this.supportingText
249
+ ? html`
250
+ <span
251
+ class="supporting-text ${this.state === "error"
252
+ ? "error-text"
253
+ : ""}">
254
+ ${this.supportingText}
255
+ </span>
256
+ `
257
+ : ""}
258
+ </div>
259
+ `;
260
+ }
261
+ }