@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,327 @@
1
+ import type { Meta, StoryObj } from '@storybook/web-components-vite';
2
+ import { html } from 'lit';
3
+ import './rel-avatar';
4
+
5
+ /**
6
+ * The Avatar component displays user profile images, initials, or icons in a circular format.
7
+ * Built with Lit web components for framework-agnostic usage.
8
+ *
9
+ * ## Features
10
+ * - **3 Types**: image, text (initials), icon
11
+ * - **4 Sizes**: xs (18px), sm (24px), md (32px), lg (40px)
12
+ * - **Circular Shape**: Perfect circle for all variants
13
+ * - **Flexible Content**: Supports images, text initials, or custom icons
14
+ * - **Fallback Support**: Graceful handling of missing images
15
+ */
16
+ const meta: Meta = {
17
+ title: 'Components/Avatar',
18
+ tags: ['autodocs'],
19
+ component: 'rel-avatar',
20
+ argTypes: {
21
+ type: {
22
+ control: { type: 'select' },
23
+ options: ['image', 'text', 'icon'],
24
+ description: 'Type of avatar content',
25
+ table: {
26
+ defaultValue: { summary: 'image' },
27
+ type: { summary: 'string' },
28
+ },
29
+ },
30
+ size: {
31
+ control: { type: 'select' },
32
+ options: ['xs', 'sm', 'md', 'lg'],
33
+ description: 'Avatar size',
34
+ table: {
35
+ defaultValue: { summary: 'md' },
36
+ type: { summary: 'string' },
37
+ },
38
+ },
39
+ src: {
40
+ control: 'text',
41
+ description: 'Image source URL (for type="image")',
42
+ table: {
43
+ type: { summary: 'string' },
44
+ },
45
+ },
46
+ text: {
47
+ control: 'text',
48
+ description: 'Text initials (for type="text")',
49
+ table: {
50
+ type: { summary: 'string' },
51
+ },
52
+ },
53
+ alt: {
54
+ control: 'text',
55
+ description: 'Image alt text for accessibility',
56
+ table: {
57
+ defaultValue: { summary: 'Avatar' },
58
+ type: { summary: 'string' },
59
+ },
60
+ },
61
+ },
62
+ render: (args) => {
63
+ if (args.type === 'icon') {
64
+ return html`
65
+ <rel-avatar
66
+ type="icon"
67
+ size="${args.size || 'md'}"
68
+ >
69
+ <span>👤</span>
70
+ </rel-avatar>
71
+ `;
72
+ }
73
+ return html`
74
+ <rel-avatar
75
+ type="${args.type || 'image'}"
76
+ size="${args.size || 'md'}"
77
+ src="${args.src || ''}"
78
+ text="${args.text || ''}"
79
+ alt="${args.alt || 'Avatar'}"
80
+ ></rel-avatar>
81
+ `;
82
+ },
83
+ };
84
+
85
+ export default meta;
86
+ type Story = StoryObj;
87
+
88
+ /**
89
+ * Image avatar - displays a profile picture
90
+ */
91
+ export const ImageAvatar: Story = {
92
+ args: {
93
+ type: 'image',
94
+ size: 'md',
95
+ src: 'https://i.pravatar.cc/150?img=1',
96
+ alt: 'John Doe',
97
+ },
98
+ };
99
+
100
+ /**
101
+ * Text avatar - displays user initials
102
+ */
103
+ export const TextAvatar: Story = {
104
+ args: {
105
+ type: 'text',
106
+ size: 'md',
107
+ text: 'JD',
108
+ },
109
+ };
110
+
111
+ /**
112
+ * Icon avatar - displays a custom icon
113
+ */
114
+ export const IconAvatar: Story = {
115
+ args: {
116
+ type: 'icon',
117
+ size: 'md',
118
+ },
119
+ };
120
+
121
+ /**
122
+ * Extra small size - 18px diameter
123
+ */
124
+ export const ExtraSmall: Story = {
125
+ args: {
126
+ type: 'image',
127
+ size: 'xs',
128
+ src: 'https://i.pravatar.cc/150?img=2',
129
+ },
130
+ };
131
+
132
+ /**
133
+ * Small size - 24px diameter
134
+ */
135
+ export const Small: Story = {
136
+ args: {
137
+ type: 'image',
138
+ size: 'sm',
139
+ src: 'https://i.pravatar.cc/150?img=3',
140
+ },
141
+ };
142
+
143
+ /**
144
+ * Medium size - 32px diameter (default)
145
+ */
146
+ export const Medium: Story = {
147
+ args: {
148
+ type: 'image',
149
+ size: 'md',
150
+ src: 'https://i.pravatar.cc/150?img=4',
151
+ },
152
+ };
153
+
154
+ /**
155
+ * Large size - 40px diameter
156
+ */
157
+ export const Large: Story = {
158
+ args: {
159
+ type: 'image',
160
+ size: 'lg',
161
+ src: 'https://i.pravatar.cc/150?img=5',
162
+ },
163
+ };
164
+
165
+ /**
166
+ * All sizes - showcase of all avatar sizes with images
167
+ */
168
+ export const AllSizes: Story = {
169
+ render: () => html`
170
+ <div style="display: flex; gap: 16px; align-items: center; padding: 24px; background: #000;">
171
+ <rel-avatar type="image" size="xs" src="https://i.pravatar.cc/150?img=6"></rel-avatar>
172
+ <rel-avatar type="image" size="sm" src="https://i.pravatar.cc/150?img=7"></rel-avatar>
173
+ <rel-avatar type="image" size="md" src="https://i.pravatar.cc/150?img=8"></rel-avatar>
174
+ <rel-avatar type="image" size="lg" src="https://i.pravatar.cc/150?img=9"></rel-avatar>
175
+ </div>
176
+ `,
177
+ };
178
+
179
+ /**
180
+ * All types - showcase of all avatar types
181
+ */
182
+ export const AllTypes: Story = {
183
+ render: () => html`
184
+ <div style="display: flex; gap: 16px; align-items: center; padding: 24px; background: #000;">
185
+ <div style="text-align: center;">
186
+ <rel-avatar type="image" size="lg" src="https://i.pravatar.cc/150?img=10"></rel-avatar>
187
+ <p style="color: #fff; font-size: 12px; margin-top: 8px;">Image</p>
188
+ </div>
189
+
190
+ <div style="text-align: center;">
191
+ <rel-avatar type="text" size="lg" text="AB"></rel-avatar>
192
+ <p style="color: #fff; font-size: 12px; margin-top: 8px;">Text</p>
193
+ </div>
194
+
195
+ <div style="text-align: center;">
196
+ <rel-avatar type="icon" size="lg">
197
+ <span>👤</span>
198
+ </rel-avatar>
199
+ <p style="color: #fff; font-size: 12px; margin-top: 8px;">Icon</p>
200
+ </div>
201
+ </div>
202
+ `,
203
+ };
204
+
205
+ /**
206
+ * Text initials - different initial combinations
207
+ */
208
+ export const TextInitials: Story = {
209
+ render: () => html`
210
+ <div style="display: flex; gap: 16px; padding: 24px; background: #000;">
211
+ <rel-avatar type="text" size="lg" text="JD"></rel-avatar>
212
+ <rel-avatar type="text" size="lg" text="AB"></rel-avatar>
213
+ <rel-avatar type="text" size="lg" text="XY"></rel-avatar>
214
+ <rel-avatar type="text" size="lg" text="MK"></rel-avatar>
215
+ </div>
216
+ `,
217
+ };
218
+
219
+ /**
220
+ * Icon variations - different icons
221
+ */
222
+ export const IconVariations: Story = {
223
+ render: () => html`
224
+ <div style="display: flex; gap: 16px; padding: 24px; background: #000;">
225
+ <rel-avatar type="icon" size="lg">
226
+ <span>👤</span>
227
+ </rel-avatar>
228
+ <rel-avatar type="icon" size="lg">
229
+ <span>🏢</span>
230
+ </rel-avatar>
231
+ <rel-avatar type="icon" size="lg">
232
+ <span>⚙️</span>
233
+ </rel-avatar>
234
+ <rel-avatar type="icon" size="lg">
235
+ <span>📧</span>
236
+ </rel-avatar>
237
+ </div>
238
+ `,
239
+ };
240
+
241
+ /**
242
+ * User list - avatars in a typical user list layout
243
+ */
244
+ export const UserList: Story = {
245
+ render: () => html`
246
+ <div style="display: flex; flex-direction: column; gap: 12px; padding: 24px; background: #000;">
247
+ <div style="display: flex; align-items: center; gap: 12px;">
248
+ <rel-avatar type="image" size="md" src="https://i.pravatar.cc/150?img=11"></rel-avatar>
249
+ <div>
250
+ <p style="color: #fff; margin: 0; font-size: 14px; font-weight: 600;">John Doe</p>
251
+ <p style="color: #999; margin: 0; font-size: 12px;">john.doe@example.com</p>
252
+ </div>
253
+ </div>
254
+
255
+ <div style="display: flex; align-items: center; gap: 12px;">
256
+ <rel-avatar type="text" size="md" text="AB"></rel-avatar>
257
+ <div>
258
+ <p style="color: #fff; margin: 0; font-size: 14px; font-weight: 600;">Alice Brown</p>
259
+ <p style="color: #999; margin: 0; font-size: 12px;">alice.brown@example.com</p>
260
+ </div>
261
+ </div>
262
+
263
+ <div style="display: flex; align-items: center; gap: 12px;">
264
+ <rel-avatar type="image" size="md" src="https://i.pravatar.cc/150?img=12"></rel-avatar>
265
+ <div>
266
+ <p style="color: #fff; margin: 0; font-size: 14px; font-weight: 600;">Sarah Wilson</p>
267
+ <p style="color: #999; margin: 0; font-size: 12px;">sarah.wilson@example.com</p>
268
+ </div>
269
+ </div>
270
+ </div>
271
+ `,
272
+ };
273
+
274
+ /**
275
+ * Avatar group - overlapping avatars
276
+ */
277
+ export const AvatarGroup: Story = {
278
+ render: () => html`
279
+ <div style="padding: 24px; background: #000;">
280
+ <div style="display: flex; margin-left: 16px;">
281
+ <rel-avatar type="image" size="md" src="https://i.pravatar.cc/150?img=13" style="margin-left: -16px; border: 2px solid #000;"></rel-avatar>
282
+ <rel-avatar type="image" size="md" src="https://i.pravatar.cc/150?img=14" style="margin-left: -16px; border: 2px solid #000;"></rel-avatar>
283
+ <rel-avatar type="text" size="md" text="JD" style="margin-left: -16px; border: 2px solid #000;"></rel-avatar>
284
+ <rel-avatar type="text" size="md" text="+5" style="margin-left: -16px; border: 2px solid #000;"></rel-avatar>
285
+ </div>
286
+ </div>
287
+ `,
288
+ };
289
+
290
+ /**
291
+ * Size comparison - all sizes of each type
292
+ */
293
+ export const SizeComparison: Story = {
294
+ render: () => html`
295
+ <div style="display: flex; flex-direction: column; gap: 24px; padding: 24px; background: #000;">
296
+ <div>
297
+ <p style="color: #00F49C; margin: 0 0 12px 0; font-weight: 600;">Image Avatars</p>
298
+ <div style="display: flex; gap: 12px; align-items: center;">
299
+ <rel-avatar type="image" size="xs" src="https://i.pravatar.cc/150?img=15"></rel-avatar>
300
+ <rel-avatar type="image" size="sm" src="https://i.pravatar.cc/150?img=15"></rel-avatar>
301
+ <rel-avatar type="image" size="md" src="https://i.pravatar.cc/150?img=15"></rel-avatar>
302
+ <rel-avatar type="image" size="lg" src="https://i.pravatar.cc/150?img=15"></rel-avatar>
303
+ </div>
304
+ </div>
305
+
306
+ <div>
307
+ <p style="color: #00F49C; margin: 0 0 12px 0; font-weight: 600;">Text Avatars</p>
308
+ <div style="display: flex; gap: 12px; align-items: center;">
309
+ <rel-avatar type="text" size="xs" text="AB"></rel-avatar>
310
+ <rel-avatar type="text" size="sm" text="AB"></rel-avatar>
311
+ <rel-avatar type="text" size="md" text="AB"></rel-avatar>
312
+ <rel-avatar type="text" size="lg" text="AB"></rel-avatar>
313
+ </div>
314
+ </div>
315
+
316
+ <div>
317
+ <p style="color: #00F49C; margin: 0 0 12px 0; font-weight: 600;">Icon Avatars</p>
318
+ <div style="display: flex; gap: 12px; align-items: center;">
319
+ <rel-avatar type="icon" size="xs"><span>👤</span></rel-avatar>
320
+ <rel-avatar type="icon" size="sm"><span>👤</span></rel-avatar>
321
+ <rel-avatar type="icon" size="md"><span>👤</span></rel-avatar>
322
+ <rel-avatar type="icon" size="lg"><span>👤</span></rel-avatar>
323
+ </div>
324
+ </div>
325
+ </div>
326
+ `,
327
+ };
@@ -0,0 +1,100 @@
1
+ import { LitElement, html, css } from "lit";
2
+ import { customElement, property } from "lit/decorators.js";
3
+
4
+ @customElement("rel-avatar")
5
+ export class RelAvatar extends LitElement {
6
+ @property({ type: String }) size: "lg" | "md" | "sm" | "xs" = "md";
7
+ @property({ type: String }) type: "image" | "text" | "icon" = "image";
8
+
9
+ @property({ type: String }) src = "";
10
+ @property({ type: String }) text = "";
11
+ @property({ type: String }) alt = "Avatar";
12
+
13
+ static styles = css`
14
+ :host {
15
+ display: inline-flex;
16
+ font-family: var(--rel-fontFamilies-primary);
17
+ }
18
+
19
+ .avatar {
20
+ display: inline-flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ border-radius: 50%;
24
+ overflow: hidden;
25
+
26
+ background-color: var(--rel-colors-gray-heading);
27
+ color: var(--rel-colors-white);
28
+ font-weight: var(--rel-fontWeights-bold);
29
+
30
+ user-select: none;
31
+ text-transform: uppercase;
32
+ }
33
+
34
+ /* -------------------------
35
+ CORRECTED SIZE CLASSES
36
+ ------------------------- */
37
+ .avatar-lg {
38
+ width: 40px;
39
+ height: 40px;
40
+ font-size: var(--rel-fontSizes-xl);
41
+ line-height: 38px;
42
+ }
43
+
44
+ .avatar-md {
45
+ width: 32px;
46
+ height: 32px;
47
+ font-size: var(--rel-fontSizes-lg);
48
+ line-height: 32px;
49
+ }
50
+
51
+ .avatar-sm {
52
+ width: 24px;
53
+ height: 24px;
54
+ font-size: var(--rel-fontSizes-md);
55
+ line-height: 24px;
56
+ }
57
+
58
+ .avatar-xs {
59
+ width: 18px;
60
+ height: 18px;
61
+ font-size: var(--rel-fontSizes-xs);
62
+ line-height: 18px;
63
+ }
64
+
65
+ img {
66
+ width: 100%;
67
+ height: 100%;
68
+ object-fit: cover;
69
+ }
70
+
71
+ .icon-slot {
72
+ width: 100%;
73
+ height: 100%;
74
+ display: inline-flex;
75
+ align-items: center;
76
+ justify-content: center;
77
+ }
78
+
79
+ .icon-slot ::slotted(*) {
80
+ font-size: var(--rel-fontSizes-md);
81
+ }
82
+
83
+ .icon-slot ::slotted(svg) {
84
+ width: 50%;
85
+ height: 50%;
86
+ }
87
+ `;
88
+
89
+ render() {
90
+ return html`
91
+ <div class="avatar avatar-${this.size}">
92
+ ${this.type === "image"
93
+ ? html`<img src=${this.src!} alt=${this.alt} />`
94
+ : this.type === "text"
95
+ ? html`<span>${this.text}</span>`
96
+ : html`<span class="icon-slot"><slot></slot></span>`}
97
+ </div>
98
+ `;
99
+ }
100
+ }