@syscore/ui-library 1.1.12 → 1.2.0
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/client/components/icons/AchievementBadges.tsx +33 -0
- package/client/components/icons/ConceptIcons.tsx +169 -22
- package/client/components/icons/NavLogo.tsx +4 -4
- package/client/components/icons/ProviderBadges.tsx +28 -28
- package/client/components/icons/ProviderSeals.tsx +35 -35
- package/client/components/icons/StandardLogo.tsx +47 -0
- package/client/components/icons/UtilityChevronDown.tsx +1 -1
- package/client/components/icons/UtilityClearRegular.tsx +43 -0
- package/client/components/icons/UtilityCompare.tsx +71 -0
- package/client/components/icons/UtilityHome.tsx +26 -0
- package/client/components/icons/UtilityReset.tsx +7 -7
- package/client/components/icons/UtilitySave.tsx +35 -0
- package/client/components/icons/UtilityScopeLarge.tsx +86 -0
- package/client/components/icons/UtilityShow.tsx +41 -0
- package/client/components/icons/UtilityTarget.tsx +21 -0
- package/client/components/icons/UtilityTargetActive.tsx +34 -0
- package/client/components/icons/UtilityText.tsx +8 -8
- package/client/components/ui/accordion.tsx +6 -9
- package/client/components/ui/alert-dialog.tsx +6 -19
- package/client/components/ui/alert.tsx +5 -6
- package/client/components/ui/avatar.tsx +3 -9
- package/client/components/ui/badge.tsx +5 -8
- package/client/components/ui/breadcrumb.tsx +24 -11
- package/client/components/ui/button.tsx +40 -56
- package/client/components/ui/calendar.tsx +24 -28
- package/client/components/ui/card.tsx +6 -9
- package/client/components/ui/carousel.tsx +14 -14
- package/client/components/ui/chart.tsx +25 -28
- package/client/components/ui/checkbox.tsx +3 -8
- package/client/components/ui/code-badge.tsx +22 -0
- package/client/components/ui/command.tsx +12 -48
- package/client/components/ui/context-menu.tsx +17 -32
- package/client/components/ui/dialog.tsx +9 -18
- package/client/components/ui/drawer.tsx +7 -13
- package/client/components/ui/dropdown-menu.tsx +17 -29
- package/client/components/ui/form.tsx +4 -4
- package/client/components/ui/hover-card.tsx +1 -4
- package/client/components/ui/input-otp.tsx +7 -10
- package/client/components/ui/input.tsx +34 -9
- package/client/components/ui/label.tsx +2 -4
- package/client/components/ui/menubar.tsx +19 -40
- package/client/components/ui/navigation-menu.tsx +10 -27
- package/client/components/ui/navigation.tsx +861 -0
- package/client/components/ui/pagination.tsx +8 -8
- package/client/components/ui/popover.tsx +1 -4
- package/client/components/ui/progress.tsx +2 -5
- package/client/components/ui/radio-group.tsx +4 -7
- package/client/components/ui/resizable.tsx +4 -10
- package/client/components/ui/scroll-area.tsx +5 -8
- package/client/components/ui/{SearchField.tsx → search.tsx} +7 -10
- package/client/components/ui/select.tsx +19 -44
- package/client/components/ui/separator.tsx +2 -2
- package/client/components/ui/sheet.tsx +12 -23
- package/client/components/ui/sidebar.tsx +55 -82
- package/client/components/ui/skeleton.tsx +1 -1
- package/client/components/ui/slider.tsx +4 -7
- package/client/components/ui/sonner.tsx +5 -8
- package/client/components/ui/switch.tsx +2 -9
- package/client/components/ui/table.tsx +9 -18
- package/client/components/ui/tabs.tsx +43 -203
- package/client/components/ui/tag.tsx +68 -0
- package/client/components/ui/textarea.tsx +1 -4
- package/client/components/ui/toast.tsx +9 -19
- package/client/components/ui/toaster.tsx +1 -1
- package/client/components/ui/toggle-group.tsx +20 -3
- package/client/components/ui/toggle.tsx +13 -13
- package/client/components/ui/tooltip.tsx +147 -10
- package/client/global.css +5421 -1049
- package/client/storybook.css +1164 -0
- package/client/ui/AspectRatio.stories.tsx +1 -1
- package/client/ui/Button.stories.tsx +5 -5
- package/client/ui/Card.stories.tsx +223 -2
- package/client/ui/CodeBadge.stories.tsx +76 -0
- package/client/ui/Dialog.stories.tsx +52 -5
- package/client/ui/Icons.stories.tsx +31 -31
- package/client/ui/Input.stories.tsx +125 -0
- package/client/ui/Label.stories.tsx +8 -11
- package/client/ui/Navigation.stories.tsx +1 -1
- package/client/ui/RadioGroup/RadioGroup.stories.tsx +1 -1
- package/client/ui/SearchField.stories.tsx +1 -1
- package/client/ui/{Select/Select.stories.tsx → Select.stories.tsx} +2 -2
- package/client/ui/{Switch/Switch.stories.tsx → Switch.stories.tsx} +3 -3
- package/client/ui/Tabs.stories.tsx +174 -10
- package/client/ui/Tag.stories.tsx +48 -1
- package/client/ui/{Textarea/Textarea.stories.tsx → Textarea.stories.tsx} +9 -10
- package/client/ui/Toggle.stories.tsx +3 -3
- package/client/ui/Tooltip.stories.tsx +28 -4
- package/dist/ui/index.cjs.js +1 -1
- package/dist/ui/index.d.ts +4 -6
- package/dist/ui/index.es.js +1227 -2235
- package/dist/ui/ui-library.css +1 -0
- package/package.json +3 -3
- package/client/components/ui/Navigation.tsx +0 -958
- package/client/components/ui/StrategyTable.tsx +0 -303
- package/client/components/ui/Tag.tsx +0 -127
- package/client/ui/Input/Input.stories.tsx +0 -69
- package/client/ui/StrategyTable.stories.tsx +0 -138
- package/client/ui/WELLDashboard/WELLDashboard.stories.tsx +0 -115
- package/client/ui/WELLDashboard/index.tsx +0 -317
- /package/client/hooks/{UseTabs.tsx → use-tabs.tsx} +0 -0
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
-
import { Button } from "
|
|
3
|
-
import { UtilityReset } from "
|
|
4
|
-
import { UtilityClose } from "
|
|
5
|
-
import { UtilityChevronDown } from "
|
|
6
|
-
import { NavAccount } from "
|
|
2
|
+
import { Button } from "../components/ui/button";
|
|
3
|
+
import { UtilityReset } from "../components/icons/UtilityReset";
|
|
4
|
+
import { UtilityClose } from "../components/icons/UtilityClose";
|
|
5
|
+
import { UtilityChevronDown } from "../components/icons/UtilityChevronDown";
|
|
6
|
+
import { NavAccount } from "../components/icons/NavAccount";
|
|
7
7
|
|
|
8
8
|
const meta = {
|
|
9
9
|
title: "Review/Button",
|
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { useState } from "react";
|
|
3
|
+
|
|
2
4
|
import {
|
|
3
5
|
Card,
|
|
4
6
|
CardHeader,
|
|
@@ -6,8 +8,19 @@ import {
|
|
|
6
8
|
CardTitle,
|
|
7
9
|
CardDescription,
|
|
8
10
|
CardContent,
|
|
9
|
-
} from "../components/ui/
|
|
10
|
-
import { Button } from "
|
|
11
|
+
} from "../components/ui/card";
|
|
12
|
+
import { Button } from "../components/ui/button";
|
|
13
|
+
import {
|
|
14
|
+
Select,
|
|
15
|
+
SelectContent,
|
|
16
|
+
SelectItem,
|
|
17
|
+
SelectTrigger,
|
|
18
|
+
SelectValue,
|
|
19
|
+
} from "../components/ui/select";
|
|
20
|
+
import { Label } from "../components/ui/label";
|
|
21
|
+
import { Toggle } from "../components/ui/toggle";
|
|
22
|
+
|
|
23
|
+
import { UtilityReset } from "../components/icons/UtilityReset";
|
|
11
24
|
|
|
12
25
|
const meta = {
|
|
13
26
|
title: "Review/Card",
|
|
@@ -82,3 +95,211 @@ export const Multiple: Story = {
|
|
|
82
95
|
</div>
|
|
83
96
|
),
|
|
84
97
|
};
|
|
98
|
+
|
|
99
|
+
export const FiltersPanel: Story = {
|
|
100
|
+
render: () => (
|
|
101
|
+
<Card className="w-[344px] bg-cyan-50 border-gray-100 rounded-xl p-6 shadow-none flex flex-col gap-6">
|
|
102
|
+
<div className="flex items-center justify-between w-full h-8">
|
|
103
|
+
<Label className="text-gray-800 overline-large">Filters</Label>
|
|
104
|
+
<Button
|
|
105
|
+
variant="secondary-light"
|
|
106
|
+
size="icon"
|
|
107
|
+
className="size-8 rounded-full border-gray-100 bg-white p-0"
|
|
108
|
+
>
|
|
109
|
+
<UtilityReset className="size-4" />
|
|
110
|
+
</Button>
|
|
111
|
+
</div>
|
|
112
|
+
|
|
113
|
+
<div className="flex flex-col gap-6 w-full">
|
|
114
|
+
{/* Segmented Control */}
|
|
115
|
+
<div className="flex flex-col gap-3">
|
|
116
|
+
<Label className="text-gray-600">Label</Label>
|
|
117
|
+
<Toggle
|
|
118
|
+
options={[
|
|
119
|
+
{ label: "Active", value: "active" },
|
|
120
|
+
{ label: "Inactive", value: "inactive" },
|
|
121
|
+
]}
|
|
122
|
+
defaultValue="active"
|
|
123
|
+
/>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
{/* Search Selects */}
|
|
127
|
+
{[1, 2, 3].map((i) => (
|
|
128
|
+
<div key={i} className="flex flex-col gap-3">
|
|
129
|
+
<Label className="text-gray-600">Label</Label>
|
|
130
|
+
<Select>
|
|
131
|
+
<SelectTrigger className="h-12 border-gray-200 rounded-[6px] bg-white px-4">
|
|
132
|
+
<SelectValue placeholder="Placeholder" />
|
|
133
|
+
</SelectTrigger>
|
|
134
|
+
<SelectContent>
|
|
135
|
+
<SelectItem value="option1">Option 1</SelectItem>
|
|
136
|
+
<SelectItem value="option2">Option 2</SelectItem>
|
|
137
|
+
</SelectContent>
|
|
138
|
+
</Select>
|
|
139
|
+
</div>
|
|
140
|
+
))}
|
|
141
|
+
</div>
|
|
142
|
+
</Card>
|
|
143
|
+
),
|
|
144
|
+
};
|
|
145
|
+
|
|
146
|
+
// export const AttributesPanel: Story = {
|
|
147
|
+
// render: () => {
|
|
148
|
+
// const [activeTag, setActiveTag] = useState<string>("tag1");
|
|
149
|
+
// const tags = [
|
|
150
|
+
// { id: "tag1", label: "Tag" },
|
|
151
|
+
// { id: "tag2", label: "Tag" },
|
|
152
|
+
// { id: "tag3", label: "Tag" },
|
|
153
|
+
// ];
|
|
154
|
+
|
|
155
|
+
// return (
|
|
156
|
+
// <Card className="w-[344px] bg-cyan-50 border-gray-100 rounded-xl p-6 shadow-none flex flex-col gap-6">
|
|
157
|
+
// <div className="flex items-center justify-between w-full h-8">
|
|
158
|
+
// <Label className="text-gray-800 overline-large">Attributes</Label>
|
|
159
|
+
// </div>
|
|
160
|
+
|
|
161
|
+
// <div className="flex flex-col gap-6 w-full">
|
|
162
|
+
// {/* Segmented Control */}
|
|
163
|
+
// <div className="flex flex-col gap-3">
|
|
164
|
+
// <Label className="text-gray-600">Label</Label>
|
|
165
|
+
// <Toggle
|
|
166
|
+
// options={[
|
|
167
|
+
// { label: "Active", value: "active" },
|
|
168
|
+
// { label: "Inactive", value: "inactive" },
|
|
169
|
+
// ]}
|
|
170
|
+
// defaultValue="active"
|
|
171
|
+
// />
|
|
172
|
+
// </div>
|
|
173
|
+
|
|
174
|
+
// {/* Tags */}
|
|
175
|
+
// <div className="flex flex-col gap-3">
|
|
176
|
+
// <Label className="text-gray-600">Field name</Label>
|
|
177
|
+
// <div className="flex flex-wrap gap-3 items-start">
|
|
178
|
+
// {tags.map((tag) => (
|
|
179
|
+
// <Tag
|
|
180
|
+
// key={tag.id}
|
|
181
|
+
// active={activeTag === tag.id}
|
|
182
|
+
// onClick={() => setActiveTag(tag.id)}
|
|
183
|
+
// >
|
|
184
|
+
// {tag.label}
|
|
185
|
+
// </Tag>
|
|
186
|
+
// ))}
|
|
187
|
+
// </div>
|
|
188
|
+
// </div>
|
|
189
|
+
// </div>
|
|
190
|
+
// </Card>
|
|
191
|
+
// );
|
|
192
|
+
// },
|
|
193
|
+
// };
|
|
194
|
+
|
|
195
|
+
import {
|
|
196
|
+
IconConceptAir,
|
|
197
|
+
IconConceptCommunity,
|
|
198
|
+
IconConceptLight,
|
|
199
|
+
IconConceptMaterials,
|
|
200
|
+
IconConceptMind,
|
|
201
|
+
IconConceptMovement,
|
|
202
|
+
IconConceptNourishment,
|
|
203
|
+
IconConceptSound,
|
|
204
|
+
IconConceptThermalComfort,
|
|
205
|
+
IconConceptWater,
|
|
206
|
+
} from "../components/icons/ConceptIcons";
|
|
207
|
+
|
|
208
|
+
// ... existing imports
|
|
209
|
+
|
|
210
|
+
export const NavigatorPanel: Story = {
|
|
211
|
+
render: () => {
|
|
212
|
+
const [activeConcept, setActiveConcept] = useState<string>("community");
|
|
213
|
+
const [activeTheme, setActiveTheme] = useState<string>("C7");
|
|
214
|
+
const [activeStrategy, setActiveStrategy] = useState<string>("C7.4");
|
|
215
|
+
|
|
216
|
+
const concepts = [
|
|
217
|
+
{ id: "mind", Icon: IconConceptMind },
|
|
218
|
+
{ id: "community", Icon: IconConceptCommunity },
|
|
219
|
+
{ id: "movement", Icon: IconConceptMovement },
|
|
220
|
+
{ id: "water", Icon: IconConceptWater },
|
|
221
|
+
{ id: "air", Icon: IconConceptAir },
|
|
222
|
+
{ id: "light", Icon: IconConceptLight },
|
|
223
|
+
{ id: "thermal", Icon: IconConceptThermalComfort },
|
|
224
|
+
{ id: "nourishment", Icon: IconConceptNourishment },
|
|
225
|
+
{ id: "sound", Icon: IconConceptSound },
|
|
226
|
+
{ id: "materials", Icon: IconConceptMaterials },
|
|
227
|
+
];
|
|
228
|
+
|
|
229
|
+
const themes = Array.from({ length: 9 }, (_, i) => `C${9 - i}`).reverse();
|
|
230
|
+
const strategies = ["C7.1", "C7.2", "C7.3", "C7.4"];
|
|
231
|
+
|
|
232
|
+
return (
|
|
233
|
+
<Card className="w-[344px] bg-cyan-50 border-gray-100 rounded-xl p-6 shadow-none flex flex-col gap-6">
|
|
234
|
+
{/* Concepts */}
|
|
235
|
+
<div className="flex flex-col gap-3">
|
|
236
|
+
<Label className="text-gray-600">Concept</Label>
|
|
237
|
+
<div className="flex flex-wrap gap-2">
|
|
238
|
+
{concepts.map(({ id, Icon }) => (
|
|
239
|
+
<button
|
|
240
|
+
key={id}
|
|
241
|
+
onClick={() => setActiveConcept(id)}
|
|
242
|
+
className="rounded-full transition-transform hover:scale-105 focus:outline-none focus:ring-2 focus:ring-cyan-500 focus:ring-offset-2"
|
|
243
|
+
>
|
|
244
|
+
<Icon active={activeConcept === id} className="size-12" />
|
|
245
|
+
</button>
|
|
246
|
+
))}
|
|
247
|
+
</div>
|
|
248
|
+
</div>
|
|
249
|
+
|
|
250
|
+
{/* Theme */}
|
|
251
|
+
<div className="flex flex-col gap-3">
|
|
252
|
+
<Label className="text-gray-600">Theme</Label>
|
|
253
|
+
<div className="flex flex-wrap gap-2">
|
|
254
|
+
{themes.map((theme) => (
|
|
255
|
+
<button
|
|
256
|
+
key={theme}
|
|
257
|
+
onClick={() => setActiveTheme(theme)}
|
|
258
|
+
className={`w-12 h-8 rounded-[6px] flex items-center justify-center transition-colors ${
|
|
259
|
+
activeTheme === theme
|
|
260
|
+
? "bg-cyan-800 text-white"
|
|
261
|
+
: "bg-blue-100 text-blue-600 hover:bg-blue-200"
|
|
262
|
+
}`}
|
|
263
|
+
>
|
|
264
|
+
<span className="body-small font-semibold">{theme}</span>
|
|
265
|
+
</button>
|
|
266
|
+
))}
|
|
267
|
+
</div>
|
|
268
|
+
</div>
|
|
269
|
+
|
|
270
|
+
{/* Strategy */}
|
|
271
|
+
<div className="flex flex-col gap-3">
|
|
272
|
+
<Label className="text-gray-600">Strategy</Label>
|
|
273
|
+
<div className="flex flex-wrap gap-2">
|
|
274
|
+
{strategies.map((strategy) => (
|
|
275
|
+
<button
|
|
276
|
+
key={strategy}
|
|
277
|
+
onClick={() => setActiveStrategy(strategy)}
|
|
278
|
+
className={`w-12 h-8 rounded-[6px] flex items-center justify-center transition-colors ${
|
|
279
|
+
activeStrategy === strategy
|
|
280
|
+
? "bg-[#0F748A]/10 border border-[#0F748A]/20 text-cyan-900"
|
|
281
|
+
: "bg-blue-100 text-blue-600 hover:bg-blue-200"
|
|
282
|
+
}`}
|
|
283
|
+
>
|
|
284
|
+
<span className="body-small font-semibold">{strategy}</span>
|
|
285
|
+
</button>
|
|
286
|
+
))}
|
|
287
|
+
</div>
|
|
288
|
+
</div>
|
|
289
|
+
|
|
290
|
+
{/* Scope */}
|
|
291
|
+
<div className="flex flex-col gap-3">
|
|
292
|
+
<Label className="text-gray-600">Scope</Label>
|
|
293
|
+
<Toggle
|
|
294
|
+
className="w-full h-8 border border-gray-100 bg-white rounded-full p-0 [&>button]:flex-1"
|
|
295
|
+
options={[
|
|
296
|
+
{ label: "Non-core", value: "non-core" },
|
|
297
|
+
{ label: "Core", value: "core" },
|
|
298
|
+
]}
|
|
299
|
+
defaultValue="non-core"
|
|
300
|
+
/>
|
|
301
|
+
</div>
|
|
302
|
+
</Card>
|
|
303
|
+
);
|
|
304
|
+
},
|
|
305
|
+
};
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { CodeBadge } from "../components/ui/code-badge";
|
|
3
|
+
|
|
4
|
+
const meta = {
|
|
5
|
+
title: "Review/CodeBadge",
|
|
6
|
+
component: CodeBadge,
|
|
7
|
+
tags: ["autodocs"],
|
|
8
|
+
parameters: {
|
|
9
|
+
layout: "centered",
|
|
10
|
+
},
|
|
11
|
+
} satisfies Meta<typeof CodeBadge>;
|
|
12
|
+
|
|
13
|
+
export default meta;
|
|
14
|
+
|
|
15
|
+
type Story = StoryObj<typeof meta>;
|
|
16
|
+
|
|
17
|
+
export const Default: Story = {
|
|
18
|
+
args: {
|
|
19
|
+
code: "A01",
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
|
|
23
|
+
export const WithClassName: Story = {
|
|
24
|
+
render: () => (
|
|
25
|
+
<div className="flex gap-4">
|
|
26
|
+
<CodeBadge
|
|
27
|
+
code="C01"
|
|
28
|
+
className="bg-plum-50 border-plum-200 text-plum-800"
|
|
29
|
+
/>
|
|
30
|
+
<CodeBadge
|
|
31
|
+
code="A02"
|
|
32
|
+
className="bg-cyan-50 border-cyan-200 text-cyan-800"
|
|
33
|
+
/>
|
|
34
|
+
<CodeBadge
|
|
35
|
+
code="W03"
|
|
36
|
+
className="bg-blue-50 border-blue-200 text-blue-800"
|
|
37
|
+
/>
|
|
38
|
+
<CodeBadge
|
|
39
|
+
code="N04"
|
|
40
|
+
className="bg-green-50 border-green-200 text-green-800"
|
|
41
|
+
/>
|
|
42
|
+
</div>
|
|
43
|
+
),
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
export const WithStyle: Story = {
|
|
47
|
+
render: () => (
|
|
48
|
+
<div className="flex gap-4">
|
|
49
|
+
<CodeBadge
|
|
50
|
+
code="R01"
|
|
51
|
+
className="border-none"
|
|
52
|
+
style={{
|
|
53
|
+
backgroundColor: "#EFF5FB",
|
|
54
|
+
color: "#2E74AD",
|
|
55
|
+
}}
|
|
56
|
+
/>
|
|
57
|
+
<CodeBadge
|
|
58
|
+
code="R02"
|
|
59
|
+
className="border-none"
|
|
60
|
+
style={{
|
|
61
|
+
backgroundColor: "#7B4F9D",
|
|
62
|
+
color: "white",
|
|
63
|
+
}}
|
|
64
|
+
/>
|
|
65
|
+
<CodeBadge
|
|
66
|
+
code="R03"
|
|
67
|
+
className="border-none"
|
|
68
|
+
style={{
|
|
69
|
+
backgroundColor: "#2E74AD",
|
|
70
|
+
color: "white",
|
|
71
|
+
}}
|
|
72
|
+
/>
|
|
73
|
+
</div>
|
|
74
|
+
),
|
|
75
|
+
};
|
|
76
|
+
|
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
-
import { Button } from "
|
|
2
|
+
import { Button } from "../components/ui/button";
|
|
3
|
+
import { Input } from "../components/ui/input";
|
|
4
|
+
import { Label } from "../components/ui/label";
|
|
3
5
|
import { useState } from "react";
|
|
4
6
|
import {
|
|
5
7
|
Dialog,
|
|
6
8
|
DialogContent,
|
|
7
9
|
DialogDescription,
|
|
10
|
+
DialogFooter,
|
|
8
11
|
DialogHeader,
|
|
9
12
|
DialogTitle,
|
|
10
13
|
DialogTrigger,
|
|
11
|
-
} from "
|
|
12
|
-
import { cn } from "@/lib/utils";
|
|
14
|
+
} from "../components/ui/dialog";
|
|
13
15
|
|
|
14
16
|
const meta = {
|
|
15
17
|
title: "Review/Dialog",
|
|
@@ -29,7 +31,7 @@ export const Default: Story = {
|
|
|
29
31
|
const [open, setOpen] = useState(false);
|
|
30
32
|
return (
|
|
31
33
|
<>
|
|
32
|
-
<Dialog open={open}>
|
|
34
|
+
<Dialog open={open} onOpenChange={setOpen}>
|
|
33
35
|
<DialogTrigger asChild>
|
|
34
36
|
<Button
|
|
35
37
|
size="large"
|
|
@@ -58,7 +60,7 @@ export const Default: Story = {
|
|
|
58
60
|
variant="general-primary"
|
|
59
61
|
onClick={() => setOpen(false)}
|
|
60
62
|
>
|
|
61
|
-
Yes
|
|
63
|
+
Yes, delete user
|
|
62
64
|
</Button>
|
|
63
65
|
</div>
|
|
64
66
|
</DialogContent>
|
|
@@ -67,3 +69,48 @@ export const Default: Story = {
|
|
|
67
69
|
);
|
|
68
70
|
},
|
|
69
71
|
};
|
|
72
|
+
|
|
73
|
+
export const WithForm: Story = {
|
|
74
|
+
render: () => {
|
|
75
|
+
const [open, setOpen] = useState(false);
|
|
76
|
+
return (
|
|
77
|
+
<Dialog open={open} onOpenChange={setOpen}>
|
|
78
|
+
<DialogTrigger asChild>
|
|
79
|
+
<Button variant="general-secondary">Edit Profile</Button>
|
|
80
|
+
</DialogTrigger>
|
|
81
|
+
<DialogContent className="sm:max-w-[425px]">
|
|
82
|
+
<DialogHeader>
|
|
83
|
+
<DialogTitle>Edit profile</DialogTitle>
|
|
84
|
+
<DialogDescription>
|
|
85
|
+
Make changes to your profile here. Click save when you're done.
|
|
86
|
+
</DialogDescription>
|
|
87
|
+
</DialogHeader>
|
|
88
|
+
<div className="grid gap-4 py-4">
|
|
89
|
+
<div className=" flex flex-col gap-y-3">
|
|
90
|
+
<Label htmlFor="name">Name</Label>
|
|
91
|
+
<Input id="name" defaultValue="Pedro Duarte" />
|
|
92
|
+
</div>
|
|
93
|
+
<div className=" flex flex-col gap-y-3">
|
|
94
|
+
<Label htmlFor="username">Username</Label>
|
|
95
|
+
<Input
|
|
96
|
+
id="username"
|
|
97
|
+
defaultValue="@peduarte"
|
|
98
|
+
className="col-span-3"
|
|
99
|
+
/>
|
|
100
|
+
</div>
|
|
101
|
+
</div>
|
|
102
|
+
<DialogFooter>
|
|
103
|
+
<Button
|
|
104
|
+
size="utility"
|
|
105
|
+
variant="general-primary"
|
|
106
|
+
type="submit"
|
|
107
|
+
onClick={() => setOpen(false)}
|
|
108
|
+
>
|
|
109
|
+
Save changes
|
|
110
|
+
</Button>
|
|
111
|
+
</DialogFooter>
|
|
112
|
+
</DialogContent>
|
|
113
|
+
</Dialog>
|
|
114
|
+
);
|
|
115
|
+
},
|
|
116
|
+
};
|
|
@@ -10,45 +10,45 @@ import {
|
|
|
10
10
|
IconConceptNourishment,
|
|
11
11
|
IconConceptSound,
|
|
12
12
|
IconConceptMaterials,
|
|
13
|
-
} from "
|
|
14
|
-
import { NavLogo } from "
|
|
15
|
-
import { NavAccount } from "
|
|
16
|
-
import { NavBullet } from "
|
|
17
|
-
import { UtilityAccordion } from "
|
|
18
|
-
import { UtilityChevronDown } from "
|
|
19
|
-
import { UtilityClassification } from "
|
|
20
|
-
import { UtilityClose } from "
|
|
21
|
-
import { UtilityDrag } from "
|
|
22
|
-
import { UtilityEdit } from "
|
|
23
|
-
import { UtilityOptions } from "
|
|
24
|
-
import { UtilityPortfolio } from "
|
|
25
|
-
import { UtilityReset } from "
|
|
26
|
-
import { UtilityScoring } from "
|
|
27
|
-
import { UtilitySearch } from "
|
|
28
|
-
import { UtilitySort } from "
|
|
29
|
-
import { UtilityText } from "
|
|
30
|
-
import { SealWell } from "
|
|
31
|
-
import { SealIwbiMember } from "
|
|
32
|
-
import { SealWellCertification } from "
|
|
33
|
-
import { SealWellCommunity } from "
|
|
34
|
-
import { SealWellResidence } from "
|
|
35
|
-
import { SealWorksWithWell } from "
|
|
36
|
-
import { SealEnterpriseProvider } from "
|
|
37
|
-
import { SealPerformanceTestingProvider } from "
|
|
38
|
-
import { SealSurveyProvider } from "
|
|
13
|
+
} from "../components/icons/ConceptIcons";
|
|
14
|
+
import { NavLogo } from "../components/icons/NavLogo";
|
|
15
|
+
import { NavAccount } from "../components/icons/NavAccount";
|
|
16
|
+
import { NavBullet } from "../components/icons/NavBullet";
|
|
17
|
+
import { UtilityAccordion } from "../components/icons/UtilityAccordion";
|
|
18
|
+
import { UtilityChevronDown } from "../components/icons/UtilityChevronDown";
|
|
19
|
+
import { UtilityClassification } from "../components/icons/UtilityClassification";
|
|
20
|
+
import { UtilityClose } from "../components/icons/UtilityClose";
|
|
21
|
+
import { UtilityDrag } from "../components/icons/UtilityDrag";
|
|
22
|
+
import { UtilityEdit } from "../components/icons/UtilityEdit";
|
|
23
|
+
import { UtilityOptions } from "../components/icons/UtilityOptions";
|
|
24
|
+
import { UtilityPortfolio } from "../components/icons/UtilityPortfolio";
|
|
25
|
+
import { UtilityReset } from "../components/icons/UtilityReset";
|
|
26
|
+
import { UtilityScoring } from "../components/icons/UtilityScoring";
|
|
27
|
+
import { UtilitySearch } from "../components/icons/UtilitySearch";
|
|
28
|
+
import { UtilitySort } from "../components/icons/UtilitySort";
|
|
29
|
+
import { UtilityText } from "../components/icons/UtilityText";
|
|
30
|
+
import { SealWell } from "../components/icons/SealWell";
|
|
31
|
+
import { SealIwbiMember } from "../components/icons/SealIwbiMember";
|
|
32
|
+
import { SealWellCertification } from "../components/icons/SealWellCertification";
|
|
33
|
+
import { SealWellCommunity } from "../components/icons/SealWellCommunity";
|
|
34
|
+
import { SealWellResidence } from "../components/icons/SealWellResidence";
|
|
35
|
+
import { SealWorksWithWell } from "../components/icons/SealWorksWithWell";
|
|
36
|
+
import { SealEnterpriseProvider } from "../components/icons/ProviderSeals";
|
|
37
|
+
import { SealPerformanceTestingProvider } from "../components/icons/ProviderSeals";
|
|
38
|
+
import { SealSurveyProvider } from "../components/icons/ProviderSeals";
|
|
39
39
|
import {
|
|
40
40
|
BadgeEnterpriseProvider,
|
|
41
41
|
BadgePerformanceTestingProvider,
|
|
42
42
|
BadgeProductProvider,
|
|
43
43
|
BadgeSurveyProvider,
|
|
44
|
-
} from "
|
|
45
|
-
import { WatermarkMemberOrg } from "
|
|
46
|
-
import { WaterMarkWWWProducts } from "
|
|
47
|
-
import { WaterMarkWellProjects } from "
|
|
44
|
+
} from "../components/icons/ProviderBadges";
|
|
45
|
+
import { WatermarkMemberOrg } from "../components/icons/WatermarkMemberOrg";
|
|
46
|
+
import { WaterMarkWWWProducts } from "../components/icons/WaterMarkWWWProducts";
|
|
47
|
+
import { WaterMarkWellProjects } from "../components/icons/WaterMarkWellProjects";
|
|
48
48
|
import {
|
|
49
49
|
SealProductProvider,
|
|
50
50
|
SealProviders,
|
|
51
|
-
} from "
|
|
51
|
+
} from "../components/icons/ProviderSeals";
|
|
52
52
|
|
|
53
53
|
const meta = {
|
|
54
54
|
title: "Review/Icons",
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import type { Meta, StoryObj } from "@storybook/react";
|
|
2
|
+
import { Input } from "../components/ui/input";
|
|
3
|
+
import { Label } from "../components/ui/label";
|
|
4
|
+
import { Button } from "../components/ui/button";
|
|
5
|
+
import { Search, Copy } from "lucide-react";
|
|
6
|
+
|
|
7
|
+
const meta = {
|
|
8
|
+
title: "Review/Input",
|
|
9
|
+
component: Input,
|
|
10
|
+
tags: ["autodocs"],
|
|
11
|
+
parameters: {
|
|
12
|
+
layout: "centered",
|
|
13
|
+
},
|
|
14
|
+
} satisfies Meta<typeof Input>;
|
|
15
|
+
|
|
16
|
+
export default meta;
|
|
17
|
+
|
|
18
|
+
type Story = StoryObj<typeof meta>;
|
|
19
|
+
|
|
20
|
+
export const Default: Story = {
|
|
21
|
+
args: {
|
|
22
|
+
placeholder: "Enter text...",
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
export const WithType: Story = {
|
|
27
|
+
render: () => (
|
|
28
|
+
<div className="space-y-4 w-full max-w-md">
|
|
29
|
+
<div className="space-y-3">
|
|
30
|
+
<Label>Text</Label>
|
|
31
|
+
<Input type="text" placeholder="Enter text..." />
|
|
32
|
+
</div>
|
|
33
|
+
<div className="space-y-3">
|
|
34
|
+
<Label>Email</Label>
|
|
35
|
+
<Input type="email" placeholder="Enter email..." />
|
|
36
|
+
</div>
|
|
37
|
+
<div className="space-y-3">
|
|
38
|
+
<Label>Password</Label>
|
|
39
|
+
<Input type="password" placeholder="Enter password..." />
|
|
40
|
+
</div>
|
|
41
|
+
<div className="space-y-3">
|
|
42
|
+
<Label>Number</Label>
|
|
43
|
+
<Input type="number" placeholder="Enter number..." />
|
|
44
|
+
</div>
|
|
45
|
+
</div>
|
|
46
|
+
),
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
export const Disabled: Story = {
|
|
50
|
+
args: {
|
|
51
|
+
placeholder: "Disabled input",
|
|
52
|
+
disabled: true,
|
|
53
|
+
},
|
|
54
|
+
};
|
|
55
|
+
|
|
56
|
+
export const ReadOnly: Story = {
|
|
57
|
+
args: {
|
|
58
|
+
placeholder: "Read-only input",
|
|
59
|
+
value: "This is read-only",
|
|
60
|
+
readOnly: true,
|
|
61
|
+
},
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
export const WithIcons: Story = {
|
|
65
|
+
render: () => (
|
|
66
|
+
<div className="space-y-4 min-w-[300px]">
|
|
67
|
+
<div className="space-y-3">
|
|
68
|
+
<Label>Currency (Span)</Label>
|
|
69
|
+
<Input
|
|
70
|
+
placeholder="0.00"
|
|
71
|
+
type="number"
|
|
72
|
+
startIcon={<span>€</span>}
|
|
73
|
+
endIcon={<span>EUR</span>}
|
|
74
|
+
/>
|
|
75
|
+
</div>
|
|
76
|
+
|
|
77
|
+
<div className="space-y-3">
|
|
78
|
+
<Label>Search (Icon)</Label>
|
|
79
|
+
<Input
|
|
80
|
+
placeholder="Search..."
|
|
81
|
+
startIcon={<Search className="h-4 w-4" />}
|
|
82
|
+
/>
|
|
83
|
+
</div>
|
|
84
|
+
</div>
|
|
85
|
+
),
|
|
86
|
+
};
|
|
87
|
+
|
|
88
|
+
export const WithButton: Story = {
|
|
89
|
+
render: () => (
|
|
90
|
+
<div className="space-y-4 min-w-[400px]">
|
|
91
|
+
<div className="space-y-3">
|
|
92
|
+
<Label>Icon Button</Label>
|
|
93
|
+
<Input
|
|
94
|
+
placeholder="Copy link"
|
|
95
|
+
value="https://example.com/share/123"
|
|
96
|
+
readOnly
|
|
97
|
+
endIcon={
|
|
98
|
+
<button
|
|
99
|
+
className="hover:text-gray-900 transition-colors"
|
|
100
|
+
onClick={() => alert("Copied!")}
|
|
101
|
+
>
|
|
102
|
+
<Copy className="h-4 w-4" />
|
|
103
|
+
</button>
|
|
104
|
+
}
|
|
105
|
+
/>
|
|
106
|
+
</div>
|
|
107
|
+
|
|
108
|
+
<div className="space-y-3">
|
|
109
|
+
<Label>Wide Button (Auto-fit)</Label>
|
|
110
|
+
<Input
|
|
111
|
+
placeholder="Enter email"
|
|
112
|
+
endIcon={
|
|
113
|
+
<Button
|
|
114
|
+
size="utility"
|
|
115
|
+
className="h-8 px-3"
|
|
116
|
+
onClick={() => alert("Subscribed!")}
|
|
117
|
+
>
|
|
118
|
+
Subscribe
|
|
119
|
+
</Button>
|
|
120
|
+
}
|
|
121
|
+
/>
|
|
122
|
+
</div>
|
|
123
|
+
</div>
|
|
124
|
+
),
|
|
125
|
+
};
|