@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,350 @@
1
+ import type { Meta, StoryObj } from '@storybook/web-components-vite';
2
+ import { html } from 'lit';
3
+ import './rel-badge';
4
+
5
+ /**
6
+ * The Badge component displays notification counts or status indicators.
7
+ * Built with Lit web components for framework-agnostic usage.
8
+ *
9
+ * ## Features
10
+ * - **2 Variants**: number (displays count), dot (indicator only)
11
+ * - **3 Sizes**: sm (20px), md (28px), lg (40px)
12
+ * - **Perfect Circles**: Consistent circular shape across all sizes
13
+ * - **Red Background**: High-contrast notification color
14
+ * - **Number Display**: Shows notification count up to 99+
15
+ */
16
+ const meta: Meta = {
17
+ title: 'Components/Badge',
18
+ tags: ['autodocs'],
19
+ component: 'rel-badge',
20
+ argTypes: {
21
+ variant: {
22
+ control: { type: 'select' },
23
+ options: ['number', 'dot'],
24
+ description: 'Badge variant',
25
+ table: {
26
+ defaultValue: { summary: 'number' },
27
+ type: { summary: 'string' },
28
+ },
29
+ },
30
+ size: {
31
+ control: { type: 'select' },
32
+ options: ['sm', 'md', 'lg'],
33
+ description: 'Badge size',
34
+ table: {
35
+ defaultValue: { summary: 'md' },
36
+ type: { summary: 'string' },
37
+ },
38
+ },
39
+ number: {
40
+ control: 'text',
41
+ description: 'Number to display (for variant="number")',
42
+ table: {
43
+ type: { summary: 'string' },
44
+ },
45
+ },
46
+ },
47
+ render: (args) => html`
48
+ <rel-badge
49
+ variant="${args.variant || 'number'}"
50
+ size="${args.size || 'md'}"
51
+ number="${args.number || '1'}"
52
+ ></rel-badge>
53
+ `,
54
+ };
55
+
56
+ export default meta;
57
+ type Story = StoryObj;
58
+
59
+ /**
60
+ * Number badge - displays a notification count
61
+ */
62
+ export const NumberBadge: Story = {
63
+ args: {
64
+ variant: 'number',
65
+ size: 'md',
66
+ number: '5',
67
+ },
68
+ };
69
+
70
+ /**
71
+ * Dot badge - simple indicator without count
72
+ */
73
+ export const DotBadge: Story = {
74
+ args: {
75
+ variant: 'dot',
76
+ size: 'md',
77
+ },
78
+ };
79
+
80
+ /**
81
+ * Small size - 20px diameter
82
+ */
83
+ export const Small: Story = {
84
+ args: {
85
+ variant: 'number',
86
+ size: 'sm',
87
+ number: '3',
88
+ },
89
+ };
90
+
91
+ /**
92
+ * Medium size - 28px diameter (default)
93
+ */
94
+ export const Medium: Story = {
95
+ args: {
96
+ variant: 'number',
97
+ size: 'md',
98
+ number: '9',
99
+ },
100
+ };
101
+
102
+ /**
103
+ * Large size - 40px diameter
104
+ */
105
+ export const Large: Story = {
106
+ args: {
107
+ variant: 'number',
108
+ size: 'lg',
109
+ number: '12',
110
+ },
111
+ };
112
+
113
+ /**
114
+ * Single digit - notification count less than 10
115
+ */
116
+ export const SingleDigit: Story = {
117
+ args: {
118
+ variant: 'number',
119
+ size: 'md',
120
+ number: '7',
121
+ },
122
+ };
123
+
124
+ /**
125
+ * Double digit - notification count between 10-99
126
+ */
127
+ export const DoubleDigit: Story = {
128
+ args: {
129
+ variant: 'number',
130
+ size: 'md',
131
+ number: '42',
132
+ },
133
+ };
134
+
135
+ /**
136
+ * High count - very high notification count
137
+ */
138
+ export const HighCount: Story = {
139
+ args: {
140
+ variant: 'number',
141
+ size: 'md',
142
+ number: '99+',
143
+ },
144
+ };
145
+
146
+ /**
147
+ * All sizes - showcase of all badge sizes with numbers
148
+ */
149
+ export const AllSizes: Story = {
150
+ render: () => html`
151
+ <div style="display: flex; gap: 20px; align-items: center; padding: 24px; background: #000;">
152
+ <div style="text-align: center;">
153
+ <rel-badge variant="number" size="sm" number="3"></rel-badge>
154
+ <p style="color: #fff; font-size: 12px; margin-top: 8px;">Small (20px)</p>
155
+ </div>
156
+
157
+ <div style="text-align: center;">
158
+ <rel-badge variant="number" size="md" number="9"></rel-badge>
159
+ <p style="color: #fff; font-size: 12px; margin-top: 8px;">Medium (28px)</p>
160
+ </div>
161
+
162
+ <div style="text-align: center;">
163
+ <rel-badge variant="number" size="lg" number="12"></rel-badge>
164
+ <p style="color: #fff; font-size: 12px; margin-top: 8px;">Large (40px)</p>
165
+ </div>
166
+ </div>
167
+ `,
168
+ };
169
+
170
+ /**
171
+ * All variants - number vs dot badges
172
+ */
173
+ export const AllVariants: Story = {
174
+ render: () => html`
175
+ <div style="display: flex; gap: 32px; align-items: center; padding: 24px; background: #000;">
176
+ <div style="text-align: center;">
177
+ <rel-badge variant="number" size="lg" number="5"></rel-badge>
178
+ <p style="color: #fff; font-size: 12px; margin-top: 8px;">Number</p>
179
+ </div>
180
+
181
+ <div style="text-align: center;">
182
+ <rel-badge variant="dot" size="lg"></rel-badge>
183
+ <p style="color: #fff; font-size: 12px; margin-top: 8px;">Dot</p>
184
+ </div>
185
+ </div>
186
+ `,
187
+ };
188
+
189
+ /**
190
+ * Dot sizes - all sizes of dot variant
191
+ */
192
+ export const DotSizes: Story = {
193
+ render: () => html`
194
+ <div style="display: flex; gap: 20px; align-items: center; padding: 24px; background: #000;">
195
+ <div style="text-align: center;">
196
+ <rel-badge variant="dot" size="sm"></rel-badge>
197
+ <p style="color: #fff; font-size: 12px; margin-top: 8px;">Small</p>
198
+ </div>
199
+
200
+ <div style="text-align: center;">
201
+ <rel-badge variant="dot" size="md"></rel-badge>
202
+ <p style="color: #fff; font-size: 12px; margin-top: 8px;">Medium</p>
203
+ </div>
204
+
205
+ <div style="text-align: center;">
206
+ <rel-badge variant="dot" size="lg"></rel-badge>
207
+ <p style="color: #fff; font-size: 12px; margin-top: 8px;">Large</p>
208
+ </div>
209
+ </div>
210
+ `,
211
+ };
212
+
213
+ /**
214
+ * Number variations - different notification counts
215
+ */
216
+ export const NumberVariations: Story = {
217
+ render: () => html`
218
+ <div style="display: flex; gap: 16px; align-items: center; padding: 24px; background: #000;">
219
+ <rel-badge variant="number" size="md" number="1"></rel-badge>
220
+ <rel-badge variant="number" size="md" number="5"></rel-badge>
221
+ <rel-badge variant="number" size="md" number="12"></rel-badge>
222
+ <rel-badge variant="number" size="md" number="99"></rel-badge>
223
+ <rel-badge variant="number" size="md" number="99+"></rel-badge>
224
+ </div>
225
+ `,
226
+ };
227
+
228
+ /**
229
+ * With icons - badges positioned on icons
230
+ */
231
+ export const WithIcons: Story = {
232
+ render: () => html`
233
+ <div style="display: flex; gap: 40px; padding: 24px; background: #000;">
234
+ <div style="position: relative; display: inline-block;">
235
+ <span style="font-size: 32px;">🔔</span>
236
+ <rel-badge variant="number" size="sm" number="3" style="position: absolute; top: -4px; right: -4px;"></rel-badge>
237
+ </div>
238
+
239
+ <div style="position: relative; display: inline-block;">
240
+ <span style="font-size: 32px;">📧</span>
241
+ <rel-badge variant="number" size="sm" number="12" style="position: absolute; top: -4px; right: -4px;"></rel-badge>
242
+ </div>
243
+
244
+ <div style="position: relative; display: inline-block;">
245
+ <span style="font-size: 32px;">💬</span>
246
+ <rel-badge variant="dot" size="sm" style="position: absolute; top: -2px; right: -2px;"></rel-badge>
247
+ </div>
248
+ </div>
249
+ `,
250
+ };
251
+
252
+ /**
253
+ * Navigation menu - badges on menu items
254
+ */
255
+ export const NavigationMenu: Story = {
256
+ render: () => html`
257
+ <div style="display: flex; flex-direction: column; gap: 12px; padding: 24px; background: #000; width: 250px;">
258
+ <div style="display: flex; align-items: center; justify-content: space-between; padding: 12px; background: #1A1A1A; border-radius: 8px;">
259
+ <div style="display: flex; align-items: center; gap: 12px;">
260
+ <span style="font-size: 20px;">📬</span>
261
+ <span style="color: #fff; font-size: 14px;">Messages</span>
262
+ </div>
263
+ <rel-badge variant="number" size="sm" number="5"></rel-badge>
264
+ </div>
265
+
266
+ <div style="display: flex; align-items: center; justify-content: space-between; padding: 12px; background: #1A1A1A; border-radius: 8px;">
267
+ <div style="display: flex; align-items: center; gap: 12px;">
268
+ <span style="font-size: 20px;">🔔</span>
269
+ <span style="color: #fff; font-size: 14px;">Notifications</span>
270
+ </div>
271
+ <rel-badge variant="number" size="sm" number="23"></rel-badge>
272
+ </div>
273
+
274
+ <div style="display: flex; align-items: center; justify-content: space-between; padding: 12px; background: #1A1A1A; border-radius: 8px;">
275
+ <div style="display: flex; align-items: center; gap: 12px;">
276
+ <span style="font-size: 20px;">⭐</span>
277
+ <span style="color: #fff; font-size: 14px;">Updates</span>
278
+ </div>
279
+ <rel-badge variant="dot" size="sm"></rel-badge>
280
+ </div>
281
+ </div>
282
+ `,
283
+ };
284
+
285
+ /**
286
+ * Real-world examples - practical usage scenarios
287
+ */
288
+ export const RealWorldExamples: Story = {
289
+ render: () => html`
290
+ <div style="display: flex; flex-direction: column; gap: 24px; padding: 24px; background: #000;">
291
+ <!-- Notification Bell -->
292
+ <div>
293
+ <p style="color: #00F49C; margin: 0 0 12px 0; font-weight: 600;">Notification Bell</p>
294
+ <div style="position: relative; display: inline-block;">
295
+ <button style="background: #1A1A1A; border: 1px solid #2A2A2A; color: #fff; padding: 12px 16px; border-radius: 8px; cursor: pointer; font-size: 20px;">
296
+ 🔔
297
+ </button>
298
+ <rel-badge variant="number" size="sm" number="7" style="position: absolute; top: -6px; right: -6px;"></rel-badge>
299
+ </div>
300
+ </div>
301
+
302
+ <!-- Shopping Cart -->
303
+ <div>
304
+ <p style="color: #00F49C; margin: 0 0 12px 0; font-weight: 600;">Shopping Cart</p>
305
+ <div style="position: relative; display: inline-block;">
306
+ <button style="background: #00F49C; border: none; color: #000; padding: 12px 20px; border-radius: 1000px; cursor: pointer; font-weight: 600;">
307
+ 🛒 Cart
308
+ </button>
309
+ <rel-badge variant="number" size="sm" number="3" style="position: absolute; top: -6px; right: -6px;"></rel-badge>
310
+ </div>
311
+ </div>
312
+
313
+ <!-- Status Indicator -->
314
+ <div>
315
+ <p style="color: #00F49C; margin: 0 0 12px 0; font-weight: 600;">Status Indicator</p>
316
+ <div style="display: flex; align-items: center; gap: 8px;">
317
+ <rel-badge variant="dot" size="md"></rel-badge>
318
+ <span style="color: #fff;">New activity detected</span>
319
+ </div>
320
+ </div>
321
+ </div>
322
+ `,
323
+ };
324
+
325
+ /**
326
+ * Size comparison - all sizes side by side
327
+ */
328
+ export const SizeComparison: Story = {
329
+ render: () => html`
330
+ <div style="display: flex; flex-direction: column; gap: 24px; padding: 24px; background: #000;">
331
+ <div>
332
+ <p style="color: #00F49C; margin: 0 0 12px 0; font-weight: 600;">Number Badges</p>
333
+ <div style="display: flex; gap: 16px; align-items: center;">
334
+ <rel-badge variant="number" size="sm" number="5"></rel-badge>
335
+ <rel-badge variant="number" size="md" number="12"></rel-badge>
336
+ <rel-badge variant="number" size="lg" number="99+"></rel-badge>
337
+ </div>
338
+ </div>
339
+
340
+ <div>
341
+ <p style="color: #00F49C; margin: 0 0 12px 0; font-weight: 600;">Dot Badges</p>
342
+ <div style="display: flex; gap: 16px; align-items: center;">
343
+ <rel-badge variant="dot" size="sm"></rel-badge>
344
+ <rel-badge variant="dot" size="md"></rel-badge>
345
+ <rel-badge variant="dot" size="lg"></rel-badge>
346
+ </div>
347
+ </div>
348
+ </div>
349
+ `,
350
+ };
@@ -0,0 +1,70 @@
1
+ import { LitElement, html, css } from "lit";
2
+ import { customElement, property } from "lit/decorators.js";
3
+
4
+ @customElement("rel-badge")
5
+ export class RelBadge extends LitElement {
6
+ @property({ type: String }) number = "";
7
+ @property({ type: String }) size: "sm" | "md" | "lg" = "md";
8
+ @property({ type: String }) variant: "dot" | "number" = "number";
9
+
10
+ static styles = css`
11
+ :host {
12
+ display: inline-flex;
13
+ }
14
+
15
+ .badge {
16
+ display: inline-flex;
17
+ align-items: center;
18
+ justify-content: center;
19
+ font-family: "Poppins", sans-serif;
20
+ font-weight: 600;
21
+ background-color: var(--rel-colors-red-primary);
22
+ color: var(--rel-colors-white);
23
+ border-radius: 50%;
24
+ }
25
+
26
+ /* PERFECT CIRCLES — FIXED SIZES */
27
+ .badge-sm {
28
+ width: 20px;
29
+ height: 20px;
30
+ font-size: 12px;
31
+ }
32
+
33
+ .badge-md {
34
+ width: 28px;
35
+ height: 28px;
36
+ font-size: 14px;
37
+ }
38
+
39
+ .badge-lg {
40
+ width: 40px;
41
+ height: 40px;
42
+ font-size: 20px;
43
+ }
44
+
45
+ /* DOT — smaller circle */
46
+ .badge-dot {
47
+ width: 10px !important;
48
+ height: 10px !important;
49
+ padding: 0 !important;
50
+ }
51
+
52
+ .badge-number {
53
+ display: flex;
54
+ align-items: center;
55
+ justify-content: center;
56
+ }
57
+ `;
58
+
59
+ private get classes() {
60
+ return ["badge", `badge-${this.size}`, `badge-${this.variant}`].join(" ");
61
+ }
62
+
63
+ render() {
64
+ const isDot = this.variant === "dot";
65
+
66
+ return html`
67
+ <span class="${this.classes}">${isDot ? "" : this.number}</span>
68
+ `;
69
+ }
70
+ }