@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.
- package/dist/components/rel-accordion/rel-accordion.stories.ts +313 -0
- package/dist/components/rel-accordion/rel-accordion.ts +114 -0
- package/dist/components/rel-alert/rel-alert.stories.ts +412 -0
- package/dist/components/rel-alert/rel-alert.ts +194 -0
- package/dist/components/rel-avatar/rel-avatar.stories.ts +327 -0
- package/dist/components/rel-avatar/rel-avatar.ts +100 -0
- package/dist/components/rel-badge/rel-badge.stories.ts +350 -0
- package/dist/components/rel-badge/rel-badge.ts +70 -0
- package/dist/components/rel-breadcrumb/rel-breadcrumb.stories.ts +306 -0
- package/dist/components/rel-breadcrumb/rel-breadcrumb.ts +97 -0
- package/dist/components/rel-button/rel-button.stories.ts +356 -0
- package/dist/components/rel-button/rel-button.ts +204 -0
- package/dist/components/rel-card/rel-card.stories.ts +299 -0
- package/dist/components/rel-card/rel-card.ts +33 -0
- package/dist/components/rel-cardmedia/rel-cardmedia.stories.ts +368 -0
- package/dist/components/rel-cardmedia/rel-cardmedia.ts +80 -0
- package/dist/components/rel-checkbox/rel-checkbox.stories.ts +414 -0
- package/dist/components/rel-checkbox/rel-checkbox.ts +164 -0
- package/dist/components/rel-chip/rel-chip.stories.ts +552 -0
- package/dist/components/rel-chip/rel-chip.ts +261 -0
- package/dist/components/rel-container/rel-container.stories.ts +239 -0
- package/dist/components/rel-container/rel-container.ts +74 -0
- package/dist/components/rel-divider/rel-divider.stories.ts +229 -0
- package/dist/components/rel-divider/rel-divider.ts +44 -0
- package/dist/components/rel-layout/rel-layout.stories.ts +713 -0
- package/dist/components/rel-layout/rel-layout.ts +60 -0
- package/dist/components/rel-menu/rel-menu.stories.ts +910 -0
- package/dist/components/rel-menu/rel-menu.ts +319 -0
- package/dist/components/rel-progress/rel-progress.stories.ts +817 -0
- package/dist/components/rel-progress/rel-progress.ts +182 -0
- package/dist/components/rel-radio/rel-radio.stories.ts +1048 -0
- package/dist/components/rel-radio/rel-radio.ts +187 -0
- package/dist/components/rel-segmented-button/rel-segmented-button.stories.ts +1079 -0
- package/dist/components/rel-segmented-button/rel-segmented-button.ts +150 -0
- package/dist/components/rel-select/rel-select.stories.ts +1201 -0
- package/dist/components/rel-select/rel-select.ts +261 -0
- package/dist/components/rel-slider/rel-slider.stories.ts +730 -0
- package/dist/components/rel-slider/rel-slider.ts +440 -0
- package/dist/components/rel-snackbar/rel-snackbar.stories.ts +808 -0
- package/dist/components/rel-snackbar/rel-snackbar.ts +212 -0
- package/dist/components/rel-stepper/rel-stepper.stories.ts +752 -0
- package/dist/components/rel-stepper/rel-stepper.ts +425 -0
- package/dist/components/rel-switch/rel-switch.stories.ts +441 -0
- package/dist/components/rel-switch/rel-switch.ts +161 -0
- package/dist/components/rel-tab/rel-tab.stories.ts +492 -0
- package/dist/components/rel-tab/rel-tab.ts +145 -0
- package/dist/components/rel-textfield/rel-textfield.stories.ts +710 -0
- package/dist/components/rel-textfield/rel-textfield.ts +224 -0
- package/dist/components/rel-toast/rel-toast.stories.ts +394 -0
- package/dist/components/rel-toast/rel-toast.ts +154 -0
- package/dist/components/rel-tooltip/rel-tooltip.stories.ts +364 -0
- package/dist/components/rel-tooltip/rel-tooltip.ts +80 -0
- package/dist/index.d.mts +372 -0
- package/dist/index.d.ts +372 -0
- package/dist/index.js +4593 -0
- package/dist/index.js.map +1 -0
- package/dist/index.mjs +4544 -0
- package/dist/index.mjs.map +1 -0
- package/dist/styles/vars.css +184 -0
- package/package.json +32 -0
|
@@ -0,0 +1,261 @@
|
|
|
1
|
+
import { LitElement, html, css } from "lit";
|
|
2
|
+
import { customElement, property, state } from "lit/decorators.js";
|
|
3
|
+
|
|
4
|
+
@customElement("rel-chip")
|
|
5
|
+
export class RelChip extends LitElement {
|
|
6
|
+
@property({ type: String }) label: string = "Label";
|
|
7
|
+
|
|
8
|
+
@property({ type: String }) tone: "default" | "blue" | "yellow" | "red" | "green" = "default";
|
|
9
|
+
|
|
10
|
+
@property({ type: String }) leadingIcon?: string;
|
|
11
|
+
|
|
12
|
+
@property({ type: String }) trailingIcon?: string;
|
|
13
|
+
|
|
14
|
+
@property({ type: String }) avatar?: string;
|
|
15
|
+
|
|
16
|
+
@property({ type: Boolean }) removable: boolean = false;
|
|
17
|
+
|
|
18
|
+
@property({ type: Boolean }) outline: boolean = false;
|
|
19
|
+
|
|
20
|
+
@state() private removed: boolean = false;
|
|
21
|
+
|
|
22
|
+
static styles = css`
|
|
23
|
+
:host {
|
|
24
|
+
display: inline-block;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
:host([removed]) {
|
|
28
|
+
display: none;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.chip {
|
|
32
|
+
display: inline-flex;
|
|
33
|
+
align-items: center;
|
|
34
|
+
font-family: var(--rel-fontFamilies-primary);
|
|
35
|
+
font-size: var(--rel-fontSizes-md);
|
|
36
|
+
font-weight: var(--rel-fontWeights-medium);
|
|
37
|
+
border-radius: var(--rel-borders-radius-border-radius-500);
|
|
38
|
+
padding: var(--rel-spacing-space-2xs) var(--rel-spacing-space-sm);
|
|
39
|
+
gap: var(--rel-spacing-space-2xs);
|
|
40
|
+
cursor: pointer;
|
|
41
|
+
transition: all 0.2s ease-in-out;
|
|
42
|
+
border: var(--rel-borders-width-stroke-100) solid transparent;
|
|
43
|
+
user-select: none;
|
|
44
|
+
white-space: nowrap;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.chip:hover {
|
|
48
|
+
filter: brightness(0.92);
|
|
49
|
+
transform: translateY(-1px);
|
|
50
|
+
box-shadow: var(--rel-shadows-shadow-100);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
.chip:focus:not(:focus-visible) {
|
|
54
|
+
outline: none;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
.chip:active {
|
|
58
|
+
transform: scale(0.97) translateY(0);
|
|
59
|
+
box-shadow: none;
|
|
60
|
+
filter: brightness(0.88);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/* Tone Variants - Filled */
|
|
64
|
+
.chip-default {
|
|
65
|
+
background: var(--rel-colors-gray-border);
|
|
66
|
+
color: var(--rel-colors-black);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
.chip-default:focus {
|
|
70
|
+
outline: var(--rel-borders-width-stroke-200) solid var(--rel-colors-gray-primary);
|
|
71
|
+
outline-offset: var(--rel-spacing-space-3xs);
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
.chip-blue {
|
|
75
|
+
background: var(--rel-colors-blue-tertiary);
|
|
76
|
+
color: var(--rel-colors-white);
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
.chip-blue:focus {
|
|
80
|
+
outline: var(--rel-borders-width-stroke-200) solid var(--rel-colors-blue-tertiary);
|
|
81
|
+
outline-offset: var(--rel-spacing-space-3xs);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.chip-yellow {
|
|
85
|
+
background: var(--rel-colors-yellow-pending);
|
|
86
|
+
color: var(--rel-colors-black);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.chip-yellow:focus {
|
|
90
|
+
outline: var(--rel-borders-width-stroke-200) solid var(--rel-colors-yellow-pending);
|
|
91
|
+
outline-offset: var(--rel-spacing-space-3xs);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
.chip-red {
|
|
95
|
+
background: var(--rel-colors-red-secondary);
|
|
96
|
+
color: var(--rel-colors-white);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
.chip-red:focus {
|
|
100
|
+
outline: var(--rel-borders-width-stroke-200) solid var(--rel-colors-red-secondary);
|
|
101
|
+
outline-offset: var(--rel-spacing-space-3xs);
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
.chip-green {
|
|
105
|
+
background: var(--rel-colors-green-success);
|
|
106
|
+
color: var(--rel-colors-white);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.chip-green:focus {
|
|
110
|
+
outline: var(--rel-borders-width-stroke-200) solid var(--rel-colors-green-success);
|
|
111
|
+
outline-offset: var(--rel-spacing-space-3xs);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/* Outline Variants */
|
|
115
|
+
.chip-outline.chip-default {
|
|
116
|
+
background: transparent;
|
|
117
|
+
border-color: var(--rel-colors-gray-border);
|
|
118
|
+
color: var(--rel-colors-black);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
.chip-outline.chip-blue {
|
|
122
|
+
background: transparent;
|
|
123
|
+
border-color: var(--rel-colors-blue-tertiary);
|
|
124
|
+
color: var(--rel-colors-blue-tertiary);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
.chip-outline.chip-yellow {
|
|
128
|
+
background: transparent;
|
|
129
|
+
border-color: var(--rel-colors-yellow-pending);
|
|
130
|
+
color: var(--rel-colors-yellow-pending);
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
.chip-outline.chip-red {
|
|
134
|
+
background: transparent;
|
|
135
|
+
border-color: var(--rel-colors-red-secondary);
|
|
136
|
+
color: var(--rel-colors-red-secondary);
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
.chip-outline.chip-green {
|
|
140
|
+
background: transparent;
|
|
141
|
+
border-color: var(--rel-colors-green-success);
|
|
142
|
+
color: var(--rel-colors-green-success);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
.chip-avatar {
|
|
146
|
+
width: 20px;
|
|
147
|
+
height: 20px;
|
|
148
|
+
border-radius: var(--rel-borders-radius-border-radius-500);
|
|
149
|
+
object-fit: cover;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
.chip-icon {
|
|
153
|
+
display: flex;
|
|
154
|
+
align-items: center;
|
|
155
|
+
line-height: 0;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
.chip-icon ::slotted(svg),
|
|
159
|
+
.chip-icon svg {
|
|
160
|
+
width: 16px;
|
|
161
|
+
height: 16px;
|
|
162
|
+
fill: currentColor;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
.chip-label {
|
|
166
|
+
line-height: var(--rel-lineHeights-md);
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
.chip-remove {
|
|
170
|
+
background: transparent;
|
|
171
|
+
border: none;
|
|
172
|
+
color: inherit;
|
|
173
|
+
font-size: var(--rel-fontSizes-md);
|
|
174
|
+
cursor: pointer;
|
|
175
|
+
display: flex;
|
|
176
|
+
align-items: center;
|
|
177
|
+
padding: 0;
|
|
178
|
+
margin-left: var(--rel-spacing-space-3xs);
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
.chip-remove:hover {
|
|
182
|
+
opacity: 0.6;
|
|
183
|
+
}
|
|
184
|
+
`;
|
|
185
|
+
|
|
186
|
+
private get classes() {
|
|
187
|
+
return [
|
|
188
|
+
"chip",
|
|
189
|
+
`chip-${this.tone}`,
|
|
190
|
+
this.outline ? "chip-outline" : "",
|
|
191
|
+
].join(" ");
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
private handleRemove(event: Event) {
|
|
195
|
+
event.stopPropagation();
|
|
196
|
+
this.removed = true;
|
|
197
|
+
this.dispatchEvent(
|
|
198
|
+
new CustomEvent("removed", {
|
|
199
|
+
bubbles: true,
|
|
200
|
+
composed: true,
|
|
201
|
+
})
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
private handleKeyDown(event: KeyboardEvent) {
|
|
206
|
+
if (!this.removable) return;
|
|
207
|
+
|
|
208
|
+
if (event.key === "Backspace" || event.key === "Delete") {
|
|
209
|
+
event.preventDefault();
|
|
210
|
+
this.handleRemove(event);
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
render() {
|
|
215
|
+
if (this.removed) {
|
|
216
|
+
return null;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
return html`
|
|
220
|
+
<button
|
|
221
|
+
class="${this.classes}"
|
|
222
|
+
type="button"
|
|
223
|
+
role="button"
|
|
224
|
+
aria-label="${this.label}"
|
|
225
|
+
@keydown=${this.handleKeyDown}
|
|
226
|
+
tabindex="0"
|
|
227
|
+
>
|
|
228
|
+
${this.avatar
|
|
229
|
+
? html`<img src="${this.avatar}" alt="avatar" class="chip-avatar" />`
|
|
230
|
+
: ""}
|
|
231
|
+
${this.leadingIcon
|
|
232
|
+
? html`<span class="chip-icon leading">
|
|
233
|
+
<slot name="leading-icon">${this.renderIcon(this.leadingIcon)}</slot>
|
|
234
|
+
</span>`
|
|
235
|
+
: ""}
|
|
236
|
+
<span class="chip-label">${this.label}</span>
|
|
237
|
+
${this.trailingIcon
|
|
238
|
+
? html`<span class="chip-icon trailing">
|
|
239
|
+
<slot name="trailing-icon">${this.renderIcon(this.trailingIcon)}</slot>
|
|
240
|
+
</span>`
|
|
241
|
+
: ""}
|
|
242
|
+
${this.removable
|
|
243
|
+
? html`<button
|
|
244
|
+
type="button"
|
|
245
|
+
class="chip-remove"
|
|
246
|
+
@click=${this.handleRemove}
|
|
247
|
+
aria-label="Remove chip"
|
|
248
|
+
>
|
|
249
|
+
|
|
250
|
+
</button>`
|
|
251
|
+
: ""}
|
|
252
|
+
</button>
|
|
253
|
+
`;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
private renderIcon(iconString: string) {
|
|
257
|
+
const template = document.createElement("template");
|
|
258
|
+
template.innerHTML = iconString.trim();
|
|
259
|
+
return html`${template.content.cloneNode(true)}`;
|
|
260
|
+
}
|
|
261
|
+
}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from '@storybook/web-components-vite';
|
|
2
|
+
import { html } from 'lit';
|
|
3
|
+
import './rel-container';
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* The Container component is a flexible layout wrapper with customizable padding, background, and shadow.
|
|
7
|
+
* Built with Lit web components for framework-agnostic usage with full token support.
|
|
8
|
+
*
|
|
9
|
+
* ## Features
|
|
10
|
+
* - **3 Padding Sizes**: sm (8px), md (16px), lg (32px)
|
|
11
|
+
* - **3 Background Options**: white, light, none (transparent)
|
|
12
|
+
* - **Optional Shadow**: Elevation shadow for depth
|
|
13
|
+
* - **Fully Token-Driven**: Uses design system tokens
|
|
14
|
+
* - **Flexible Content**: Accepts any slotted content
|
|
15
|
+
*/
|
|
16
|
+
const meta: Meta = {
|
|
17
|
+
title: 'Components/Container',
|
|
18
|
+
tags: ['autodocs'],
|
|
19
|
+
component: 'rel-container',
|
|
20
|
+
argTypes: {
|
|
21
|
+
padding: {
|
|
22
|
+
control: { type: 'select' },
|
|
23
|
+
options: ['sm', 'md', 'lg'],
|
|
24
|
+
description: 'Padding size',
|
|
25
|
+
table: {
|
|
26
|
+
defaultValue: { summary: 'md' },
|
|
27
|
+
type: { summary: 'string' },
|
|
28
|
+
},
|
|
29
|
+
},
|
|
30
|
+
background: {
|
|
31
|
+
control: { type: 'select' },
|
|
32
|
+
options: ['white', 'light', 'none'],
|
|
33
|
+
description: 'Background color variant',
|
|
34
|
+
table: {
|
|
35
|
+
defaultValue: { summary: 'white' },
|
|
36
|
+
type: { summary: 'string' },
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
shadow: {
|
|
40
|
+
control: 'boolean',
|
|
41
|
+
description: 'Apply elevation shadow',
|
|
42
|
+
table: {
|
|
43
|
+
defaultValue: { summary: false },
|
|
44
|
+
type: { summary: 'boolean' },
|
|
45
|
+
},
|
|
46
|
+
},
|
|
47
|
+
},
|
|
48
|
+
render: (args) => html`
|
|
49
|
+
<rel-container
|
|
50
|
+
padding="${args.padding || 'md'}"
|
|
51
|
+
background="${args.background || 'white'}"
|
|
52
|
+
?shadow="${args.shadow}"
|
|
53
|
+
>
|
|
54
|
+
<p style="margin: 0; color: #333;">
|
|
55
|
+
This is content inside the container. The container provides padding, background, and optional shadow.
|
|
56
|
+
</p>
|
|
57
|
+
</rel-container>
|
|
58
|
+
`,
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
export default meta;
|
|
62
|
+
type Story = StoryObj;
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Default container with white background and medium padding
|
|
66
|
+
*/
|
|
67
|
+
export const Default: Story = {
|
|
68
|
+
args: {
|
|
69
|
+
padding: 'md',
|
|
70
|
+
background: 'white',
|
|
71
|
+
shadow: false,
|
|
72
|
+
},
|
|
73
|
+
};
|
|
74
|
+
|
|
75
|
+
/**
|
|
76
|
+
* Container with shadow for elevation effect
|
|
77
|
+
*/
|
|
78
|
+
export const WithShadow: Story = {
|
|
79
|
+
args: {
|
|
80
|
+
padding: 'md',
|
|
81
|
+
background: 'white',
|
|
82
|
+
shadow: true,
|
|
83
|
+
},
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
/**
|
|
87
|
+
* All padding sizes comparison
|
|
88
|
+
*/
|
|
89
|
+
export const PaddingSizes: Story = {
|
|
90
|
+
render: () => html`
|
|
91
|
+
<div style="display: flex; flex-direction: column; gap: 24px; background: #e0e0e0; padding: 24px;">
|
|
92
|
+
<div>
|
|
93
|
+
<h3 style="margin-bottom: 12px; font-size: 16px; font-weight: 600;">Small Padding (8px)</h3>
|
|
94
|
+
<rel-container padding="sm" background="white" shadow>
|
|
95
|
+
<p style="margin: 0; color: #333;">Small padding content</p>
|
|
96
|
+
</rel-container>
|
|
97
|
+
</div>
|
|
98
|
+
|
|
99
|
+
<div>
|
|
100
|
+
<h3 style="margin-bottom: 12px; font-size: 16px; font-weight: 600;">Medium Padding (16px)</h3>
|
|
101
|
+
<rel-container padding="md" background="white" shadow>
|
|
102
|
+
<p style="margin: 0; color: #333;">Medium padding content</p>
|
|
103
|
+
</rel-container>
|
|
104
|
+
</div>
|
|
105
|
+
|
|
106
|
+
<div>
|
|
107
|
+
<h3 style="margin-bottom: 12px; font-size: 16px; font-weight: 600;">Large Padding (32px)</h3>
|
|
108
|
+
<rel-container padding="lg" background="white" shadow>
|
|
109
|
+
<p style="margin: 0; color: #333;">Large padding content</p>
|
|
110
|
+
</rel-container>
|
|
111
|
+
</div>
|
|
112
|
+
</div>
|
|
113
|
+
`,
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* All background variants comparison
|
|
118
|
+
*/
|
|
119
|
+
export const BackgroundVariants: Story = {
|
|
120
|
+
render: () => html`
|
|
121
|
+
<div style="display: flex; flex-direction: column; gap: 24px; background: #e0e0e0; padding: 24px;">
|
|
122
|
+
<div>
|
|
123
|
+
<h3 style="margin-bottom: 12px; font-size: 16px; font-weight: 600;">White Background</h3>
|
|
124
|
+
<rel-container padding="md" background="white" shadow>
|
|
125
|
+
<p style="margin: 0; color: #333;">White background container</p>
|
|
126
|
+
</rel-container>
|
|
127
|
+
</div>
|
|
128
|
+
|
|
129
|
+
<div>
|
|
130
|
+
<h3 style="margin-bottom: 12px; font-size: 16px; font-weight: 600;">Light Background</h3>
|
|
131
|
+
<rel-container padding="md" background="light" shadow>
|
|
132
|
+
<p style="margin: 0; color: #333;">Light gray background container</p>
|
|
133
|
+
</rel-container>
|
|
134
|
+
</div>
|
|
135
|
+
|
|
136
|
+
<div>
|
|
137
|
+
<h3 style="margin-bottom: 12px; font-size: 16px; font-weight: 600;">No Background (Transparent)</h3>
|
|
138
|
+
<rel-container padding="md" background="none">
|
|
139
|
+
<p style="margin: 0; color: #333; background: white; padding: 8px; border-radius: 4px;">
|
|
140
|
+
Transparent background container (content has its own background for visibility)
|
|
141
|
+
</p>
|
|
142
|
+
</rel-container>
|
|
143
|
+
</div>
|
|
144
|
+
</div>
|
|
145
|
+
`,
|
|
146
|
+
};
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Container with complex nested content
|
|
150
|
+
*/
|
|
151
|
+
export const ComplexContent: Story = {
|
|
152
|
+
render: () => html`
|
|
153
|
+
<div style="background: #e0e0e0; padding: 24px;">
|
|
154
|
+
<rel-container padding="lg" background="white" shadow>
|
|
155
|
+
<h2 style="margin: 0 0 16px 0; font-size: 24px; font-weight: 600; color: #333;">User Profile</h2>
|
|
156
|
+
<div style="display: flex; gap: 16px; align-items: center; margin-bottom: 16px;">
|
|
157
|
+
<img src="/assets/dummy 1.jpeg" alt="User" style="width: 60px; height: 60px; border-radius: 50%; object-fit: cover;" />
|
|
158
|
+
<div>
|
|
159
|
+
<h3 style="margin: 0 0 4px 0; font-size: 18px; font-weight: 600; color: #333;">John Doe</h3>
|
|
160
|
+
<p style="margin: 0; color: #666; font-size: 14px;">Software Engineer</p>
|
|
161
|
+
</div>
|
|
162
|
+
</div>
|
|
163
|
+
<p style="margin: 0; color: #555; line-height: 1.6;">
|
|
164
|
+
This container holds complex content including headings, images, and text.
|
|
165
|
+
The container provides consistent spacing and visual structure.
|
|
166
|
+
</p>
|
|
167
|
+
</rel-container>
|
|
168
|
+
</div>
|
|
169
|
+
`,
|
|
170
|
+
};
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Nested containers for card-like layouts
|
|
174
|
+
*/
|
|
175
|
+
export const NestedContainers: Story = {
|
|
176
|
+
render: () => html`
|
|
177
|
+
<div style="background: #e0e0e0; padding: 24px;">
|
|
178
|
+
<rel-container padding="lg" background="light">
|
|
179
|
+
<h2 style="margin: 0 0 16px 0; font-size: 20px; font-weight: 600; color: #333;">Dashboard</h2>
|
|
180
|
+
|
|
181
|
+
<div style="display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 16px;">
|
|
182
|
+
<rel-container padding="md" background="white" shadow>
|
|
183
|
+
<h3 style="margin: 0 0 8px 0; font-size: 16px; font-weight: 600; color: #333;">Total Users</h3>
|
|
184
|
+
<p style="margin: 0; font-size: 32px; font-weight: 700; color: #0059F4;">1,234</p>
|
|
185
|
+
</rel-container>
|
|
186
|
+
|
|
187
|
+
<rel-container padding="md" background="white" shadow>
|
|
188
|
+
<h3 style="margin: 0 0 8px 0; font-size: 16px; font-weight: 600; color: #333;">Revenue</h3>
|
|
189
|
+
<p style="margin: 0; font-size: 32px; font-weight: 700; color: #00A86B;">$56,789</p>
|
|
190
|
+
</rel-container>
|
|
191
|
+
|
|
192
|
+
<rel-container padding="md" background="white" shadow>
|
|
193
|
+
<h3 style="margin: 0 0 8px 0; font-size: 16px; font-weight: 600; color: #333;">Active Sessions</h3>
|
|
194
|
+
<p style="margin: 0; font-size: 32px; font-weight: 700; color: #FFB020;">89</p>
|
|
195
|
+
</rel-container>
|
|
196
|
+
</div>
|
|
197
|
+
</rel-container>
|
|
198
|
+
</div>
|
|
199
|
+
`,
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
/**
|
|
203
|
+
* All combinations showcase
|
|
204
|
+
*/
|
|
205
|
+
export const AllCombinations: Story = {
|
|
206
|
+
render: () => html`
|
|
207
|
+
<div style="display: flex; flex-direction: column; gap: 32px; background: #e0e0e0; padding: 24px;">
|
|
208
|
+
<div>
|
|
209
|
+
<h2 style="margin-bottom: 16px; font-size: 20px; font-weight: 600;">Without Shadow</h2>
|
|
210
|
+
<div style="display: flex; flex-direction: column; gap: 16px;">
|
|
211
|
+
<rel-container padding="sm" background="white">
|
|
212
|
+
<p style="margin: 0; color: #333;">Small padding, white background, no shadow</p>
|
|
213
|
+
</rel-container>
|
|
214
|
+
<rel-container padding="md" background="light">
|
|
215
|
+
<p style="margin: 0; color: #333;">Medium padding, light background, no shadow</p>
|
|
216
|
+
</rel-container>
|
|
217
|
+
<rel-container padding="lg" background="white">
|
|
218
|
+
<p style="margin: 0; color: #333;">Large padding, white background, no shadow</p>
|
|
219
|
+
</rel-container>
|
|
220
|
+
</div>
|
|
221
|
+
</div>
|
|
222
|
+
|
|
223
|
+
<div>
|
|
224
|
+
<h2 style="margin-bottom: 16px; font-size: 20px; font-weight: 600;">With Shadow</h2>
|
|
225
|
+
<div style="display: flex; flex-direction: column; gap: 16px;">
|
|
226
|
+
<rel-container padding="sm" background="white" shadow>
|
|
227
|
+
<p style="margin: 0; color: #333;">Small padding, white background, with shadow</p>
|
|
228
|
+
</rel-container>
|
|
229
|
+
<rel-container padding="md" background="light" shadow>
|
|
230
|
+
<p style="margin: 0; color: #333;">Medium padding, light background, with shadow</p>
|
|
231
|
+
</rel-container>
|
|
232
|
+
<rel-container padding="lg" background="white" shadow>
|
|
233
|
+
<p style="margin: 0; color: #333;">Large padding, white background, with shadow</p>
|
|
234
|
+
</rel-container>
|
|
235
|
+
</div>
|
|
236
|
+
</div>
|
|
237
|
+
</div>
|
|
238
|
+
`,
|
|
239
|
+
};
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { LitElement, html, css } from "lit";
|
|
2
|
+
import { customElement, property } from "lit/decorators.js";
|
|
3
|
+
|
|
4
|
+
@customElement("rel-container")
|
|
5
|
+
export class RelContainer extends LitElement {
|
|
6
|
+
@property({ type: String }) padding: "sm" | "md" | "lg" = "md";
|
|
7
|
+
|
|
8
|
+
@property({ type: Boolean }) shadow: boolean = false;
|
|
9
|
+
|
|
10
|
+
@property({ type: String }) background: "light" | "white" | "none" = "white";
|
|
11
|
+
|
|
12
|
+
static styles = css`
|
|
13
|
+
:host {
|
|
14
|
+
display: block;
|
|
15
|
+
width: 100%;
|
|
16
|
+
box-sizing: border-box;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
.reliability-container {
|
|
20
|
+
border-radius: var(--rel-borders-radius-border-radius-200);
|
|
21
|
+
display: block;
|
|
22
|
+
width: 100%;
|
|
23
|
+
box-sizing: border-box;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/* Background Variants */
|
|
27
|
+
.bg-white {
|
|
28
|
+
background-color: var(--rel-colors-white);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.bg-light {
|
|
32
|
+
background-color: var(--rel-colors-gray-light);
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
.bg-none {
|
|
36
|
+
background: transparent;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/* Padding Variants */
|
|
40
|
+
.padding-sm {
|
|
41
|
+
padding: var(--rel-spacing-space-xs);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
.padding-md {
|
|
45
|
+
padding: var(--rel-spacing-space-md);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.padding-lg {
|
|
49
|
+
padding: var(--rel-spacing-space-2xl);
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/* Shadow */
|
|
53
|
+
.shadow {
|
|
54
|
+
box-shadow: var(--rel-shadows-shadow-300);
|
|
55
|
+
}
|
|
56
|
+
`;
|
|
57
|
+
|
|
58
|
+
private get classes() {
|
|
59
|
+
return [
|
|
60
|
+
"reliability-container",
|
|
61
|
+
`bg-${this.background}`,
|
|
62
|
+
`padding-${this.padding}`,
|
|
63
|
+
this.shadow ? "shadow" : "",
|
|
64
|
+
].join(" ");
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
render() {
|
|
68
|
+
return html`
|
|
69
|
+
<div class="${this.classes}">
|
|
70
|
+
<slot></slot>
|
|
71
|
+
</div>
|
|
72
|
+
`;
|
|
73
|
+
}
|
|
74
|
+
}
|