svelte-comp 1.2.2 → 1.2.6

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 (84) hide show
  1. package/README.md +1 -1
  2. package/package.json +1 -1
  3. package/dist/App.svelte +0 -551
  4. package/dist/App.svelte.d.ts +0 -3
  5. package/dist/Container.svelte +0 -60
  6. package/dist/Container.svelte.d.ts +0 -12
  7. package/dist/app.css +0 -235
  8. package/dist/index.d.ts +0 -5
  9. package/dist/index.js +0 -6
  10. package/dist/lang.d.ts +0 -1081
  11. package/dist/lang.js +0 -1096
  12. package/dist/lib/Accordion.svelte +0 -155
  13. package/dist/lib/Accordion.svelte.d.ts +0 -40
  14. package/dist/lib/Button.svelte +0 -170
  15. package/dist/lib/Button.svelte.d.ts +0 -53
  16. package/dist/lib/Card.svelte +0 -103
  17. package/dist/lib/Card.svelte.d.ts +0 -42
  18. package/dist/lib/Carousel.svelte +0 -293
  19. package/dist/lib/Carousel.svelte.d.ts +0 -13
  20. package/dist/lib/CheckBox.svelte +0 -210
  21. package/dist/lib/CheckBox.svelte.d.ts +0 -53
  22. package/dist/lib/CodeView.svelte +0 -307
  23. package/dist/lib/CodeView.svelte.d.ts +0 -64
  24. package/dist/lib/ColorPicker.svelte +0 -161
  25. package/dist/lib/ColorPicker.svelte.d.ts +0 -40
  26. package/dist/lib/DatePicker.svelte +0 -170
  27. package/dist/lib/DatePicker.svelte.d.ts +0 -53
  28. package/dist/lib/Dialog.svelte +0 -235
  29. package/dist/lib/Dialog.svelte.d.ts +0 -58
  30. package/dist/lib/Field.svelte +0 -299
  31. package/dist/lib/Field.svelte.d.ts +0 -8
  32. package/dist/lib/FilePicker.svelte +0 -241
  33. package/dist/lib/FilePicker.svelte.d.ts +0 -52
  34. package/dist/lib/Form.svelte +0 -438
  35. package/dist/lib/Form.svelte.d.ts +0 -20
  36. package/dist/lib/Hamburger.svelte +0 -211
  37. package/dist/lib/Hamburger.svelte.d.ts +0 -52
  38. package/dist/lib/Menu.svelte +0 -623
  39. package/dist/lib/Menu.svelte.d.ts +0 -33
  40. package/dist/lib/PaginatedCard.svelte +0 -73
  41. package/dist/lib/PaginatedCard.svelte.d.ts +0 -11
  42. package/dist/lib/Pagination.svelte +0 -98
  43. package/dist/lib/Pagination.svelte.d.ts +0 -9
  44. package/dist/lib/PrimaryColorSelect.svelte +0 -113
  45. package/dist/lib/PrimaryColorSelect.svelte.d.ts +0 -9
  46. package/dist/lib/ProgressBar.svelte +0 -141
  47. package/dist/lib/ProgressBar.svelte.d.ts +0 -48
  48. package/dist/lib/ProgressCircle.svelte +0 -192
  49. package/dist/lib/ProgressCircle.svelte.d.ts +0 -39
  50. package/dist/lib/Radio.svelte +0 -189
  51. package/dist/lib/Radio.svelte.d.ts +0 -55
  52. package/dist/lib/SearchInput.svelte +0 -97
  53. package/dist/lib/SearchInput.svelte.d.ts +0 -12
  54. package/dist/lib/Select.svelte +0 -524
  55. package/dist/lib/Select.svelte.d.ts +0 -21
  56. package/dist/lib/Slider.svelte +0 -253
  57. package/dist/lib/Slider.svelte.d.ts +0 -56
  58. package/dist/lib/Splitter.svelte +0 -150
  59. package/dist/lib/Splitter.svelte.d.ts +0 -43
  60. package/dist/lib/Switch.svelte +0 -167
  61. package/dist/lib/Switch.svelte.d.ts +0 -42
  62. package/dist/lib/Table.svelte +0 -299
  63. package/dist/lib/Table.svelte.d.ts +0 -17
  64. package/dist/lib/Tabs.svelte +0 -213
  65. package/dist/lib/Tabs.svelte.d.ts +0 -48
  66. package/dist/lib/ThemeToggle.svelte +0 -127
  67. package/dist/lib/ThemeToggle.svelte.d.ts +0 -32
  68. package/dist/lib/TimePicker.svelte +0 -269
  69. package/dist/lib/TimePicker.svelte.d.ts +0 -48
  70. package/dist/lib/Toast.svelte +0 -226
  71. package/dist/lib/Toast.svelte.d.ts +0 -14
  72. package/dist/lib/Tooltip.svelte +0 -110
  73. package/dist/lib/Tooltip.svelte.d.ts +0 -40
  74. package/dist/lib/index.d.ts +0 -32
  75. package/dist/lib/index.js +0 -33
  76. package/dist/lib/lang.d.ts +0 -149
  77. package/dist/lib/lang.js +0 -141
  78. package/dist/lib/types/index.d.ts +0 -111
  79. package/dist/lib/types/index.js +0 -26
  80. package/dist/main.d.ts +0 -3
  81. package/dist/main.js +0 -7
  82. package/dist/styles.css +0 -232
  83. package/dist/utils/index.d.ts +0 -34
  84. package/dist/utils/index.js +0 -268
package/README.md CHANGED
@@ -53,7 +53,7 @@ npm i prismjs @types/prismjs
53
53
 
54
54
  ## 📁 Components included
55
55
 
56
- Accordion • Button • Card • Carousel • CheckBox • CodeView • ColorPicker •
56
+ Accordion • Button • Calendar • Card • Carousel • CheckBox • CodeView • ColorPicker •
57
57
  DatePicker • Dialog • Field • FilePicker • Form • Hamburger • Menu •
58
58
  PaginatedCard • Pagination • PrimaryColorSelect • ProgressBar • ProgressCircle •
59
59
  Radio • SearchInput • Select • Slider • Splitter • Switch • Tabs • Table • ThemeToggle •
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "svelte-comp",
3
- "version": "1.2.2",
3
+ "version": "1.2.6",
4
4
  "license": "MIT",
5
5
  "description": "A comprehensive component library built on Svelte 5 (runes) with design tokens (tailwind), accessibility focus, and TypeScript support",
6
6
  "devDependencies": {
package/dist/App.svelte DELETED
@@ -1,551 +0,0 @@
1
- <script lang="ts">
2
- import Accordion from "./lib/Accordion.svelte";
3
- import Button from "./lib/Button.svelte";
4
- import Card from "./lib/Card.svelte";
5
- import Carousel from "./lib/Carousel.svelte";
6
- import ColorPicker from "./lib/ColorPicker.svelte";
7
- import DatePicker from "./lib/DatePicker.svelte";
8
- import Field from "./lib/Field.svelte";
9
- import PrimaryColorSelect from "./lib/PrimaryColorSelect.svelte";
10
- import ProgressBar from "./lib/ProgressBar.svelte";
11
- import ProgressCircle from "./lib/ProgressCircle.svelte";
12
- import Select from "./lib/Select.svelte";
13
- import Slider from "./lib/Slider.svelte";
14
- import Switch from "./lib/Switch.svelte";
15
- import Table from "./lib/Table.svelte";
16
- import Tabs from "./lib/Tabs.svelte";
17
- import ThemeToggle from "./lib/ThemeToggle.svelte";
18
- import TimePicker from "./lib/TimePicker.svelte";
19
- import Toast from "./lib/Toast.svelte";
20
- import Tooltip from "./lib/Tooltip.svelte";
21
- import type { ToastVariant } from "./lib/types";
22
- import Container from "./Container.svelte";
23
-
24
- const tabs = [
25
- { id: "overview", label: "Overview" },
26
- { id: "team", label: "Team" },
27
- { id: "table", label: "Data" },
28
- ];
29
- let activeTab = $state(tabs[0].id);
30
-
31
- let sliderValue = $state(68);
32
- let autoplay = $state(true);
33
-
34
- const planOptions = [
35
- { label: "Starter", value: "starter" },
36
- { label: "Pro", value: "pro" },
37
- { label: "Enterprise", value: "enterprise" },
38
- ];
39
-
40
- let selectedPlan = $state(planOptions[1].value);
41
- let featureName = $state("Dashboard 2.0");
42
- let contactEmail = $state("team@studio.dev");
43
- let dateValue = $state<string | null>(null);
44
- let timeValue = $state<string | null>(null);
45
- let accentColor = $state<string | null>("#7c3aed");
46
-
47
- const accordionItems = [
48
- {
49
- title: "Composition",
50
- content:
51
- "Card, Tabs, Table and Carousel let you assemble complex screens without extra layout work.",
52
- },
53
- {
54
- title: "Forms",
55
- content:
56
- "Field, Select, DatePicker, TimePicker and ColorPicker share spacing, tokens and state handling.",
57
- },
58
- {
59
- title: "Feedback",
60
- content:
61
- "ProgressBar, ProgressCircle, Toast and Dialog keep users informed without noise.",
62
- },
63
- ];
64
-
65
- const carouselItems = [
66
- {
67
- title: "Smooth forms",
68
- content:
69
- "Clean fields, tight spacing and built-in hints help ship surveys in minutes.",
70
- },
71
- {
72
- title: "Smart navigation",
73
- content:
74
- "Tabs and Accordion keep content nearby while Carousel saves horizontal space.",
75
- },
76
- {
77
- title: "Status signals",
78
- content:
79
- "Toast and progress indicators deliver context quickly without blocking flows.",
80
- },
81
- ];
82
-
83
- const tableColumns = [
84
- { key: "name", label: "Feature", width: "42%" },
85
- { key: "owner", label: "Owner" },
86
- { key: "status", label: "Status" },
87
- { key: "eta", label: "ETA", align: "end" },
88
- ] as const;
89
-
90
- const tableRows = [
91
- { id: 1, name: "Onboarding", owner: "Anna", status: "Ready", eta: "Today" },
92
- { id: 2, name: "Theming", owner: "Mark", status: "In progress", eta: "Fri" },
93
- { id: 3, name: "Notifications", owner: "Oleg", status: "Testing", eta: "Thu" },
94
- { id: 4, name: "Data tables", owner: "Ira", status: "In progress", eta: "Next week" },
95
- { id: 5, name: "Carousel", owner: "Anton", status: "Design", eta: "In two weeks" },
96
- { id: 6, name: "Accessibility", owner: "Sasha", status: "Review", eta: "Today" },
97
- ];
98
-
99
- const pageSize = 4;
100
- let tablePage = $state(1);
101
- const totalPages = $derived(
102
- Math.max(1, Math.ceil(tableRows.length / pageSize))
103
- );
104
- const pagedRows = $derived(
105
- tableRows.slice((tablePage - 1) * pageSize, tablePage * pageSize)
106
- );
107
-
108
- $effect(() => {
109
- if (tablePage > totalPages) tablePage = totalPages;
110
- if (tablePage < 1) tablePage = 1;
111
- });
112
-
113
- const quality = [
114
- { label: "UI polish", value: 86 },
115
- { label: "Accessibility", value: 72 },
116
- { label: "Performance", value: 64 },
117
- ];
118
-
119
- const team = [
120
- { name: "Anna", role: "Product", focus: "UX flows" },
121
- { name: "Mark", role: "Frontend", focus: "Components" },
122
- { name: "Oleg", role: "QA", focus: "Automation" },
123
- ];
124
-
125
- type ToastItem = { id: number; title?: string; message: string; variant: ToastVariant };
126
- let toasts = $state<ToastItem[]>([]);
127
- let toastId = 0;
128
-
129
- function pushToast(variant: ToastVariant) {
130
- const messageMap: Record<ToastVariant, string> = {
131
- success: "Changes saved and ready to roll out.",
132
- info: "Components share tokens, typography, and behavior.",
133
- warning: "Double-check disabled, focus, and hover states.",
134
- danger: "Tests caught a blocking issue. Investigate.",
135
- };
136
- const titleMap: Record<ToastVariant, string> = {
137
- success: "Success",
138
- info: "Heads up",
139
- warning: "Warning",
140
- danger: "Error",
141
- };
142
-
143
- const id = ++toastId;
144
- toasts = [
145
- ...toasts,
146
- { id, variant, title: titleMap[variant], message: messageMap[variant] },
147
- ];
148
- }
149
-
150
- function removeToast(id: number) {
151
- toasts = toasts.filter((t) => t.id !== id);
152
- }
153
- </script>
154
-
155
- <Container>
156
- <div class="relative mx-auto max-w-6xl space-y-8 px-6 py-10">
157
- <section
158
- class="relative rounded-[28px] border border-[var(--border-color-default)] bg-gradient-to-br from-[var(--color-bg-surface)] via-white/70 to-[var(--color-bg-muted)] shadow-[0_20px_60px_-25px_var(--shadow-color)] dark:from-[var(--color-bg-surface)] dark:via-slate-900/70 dark:to-slate-900/50"
159
- >
160
- <div
161
- class="absolute inset-0 bg-[radial-gradient(circle_at_20%_20%,rgba(99,102,241,0.18),transparent_35%),radial-gradient(circle_at_80%_0%,rgba(16,185,129,0.14),transparent_25%)]"
162
- ></div>
163
-
164
- <div class="relative grid gap-8 p-8 md:p-10 lg:grid-cols-[1.1fr_0.9fr]">
165
- <div class="space-y-4">
166
- <p class="text-xs uppercase tracking-[0.25em] text-[var(--color-text-muted)]">
167
- svelte-comp
168
- </p>
169
- <h1 class="text-3xl font-bold leading-tight md:text-4xl">
170
- Component showcase
171
- </h1>
172
- <p class="text-[var(--color-text-muted)] md:w-3/4">
173
- Toggle theme, tweak the primary color, and try the main lib components in a cohesive layout.
174
- </p>
175
-
176
- <div class="flex flex-wrap gap-3">
177
- <Button variant="primary" onClick={() => pushToast("info")} sz="lg">
178
- Launch interactive
179
- </Button>
180
- <Button variant="ghost" onClick={() => pushToast("warning")} sz="lg">
181
- Remind to review
182
- </Button>
183
- </div>
184
-
185
- <div class="flex flex-wrap gap-3 text-sm text-[var(--color-text-muted)]">
186
- <span
187
- class="inline-flex items-center gap-2 rounded-full border border-[var(--border-color-default)] bg-[var(--color-bg-surface)] px-3 py-2"
188
- >
189
- <span class="h-2 w-2 animate-pulse rounded-full bg-[var(--color-bg-primary)]"></span>
190
- Live preview is on
191
- </span>
192
- <span
193
- class="inline-flex items-center gap-2 rounded-full border border-[var(--border-color-default)] bg-[var(--color-bg-surface)] px-3 py-2"
194
- >
195
- <span class="h-2 w-2 rounded-full bg-[var(--color-bg-secondary)]"></span>
196
- {tabs.length} sections below
197
- </span>
198
- </div>
199
- </div>
200
-
201
- <div
202
- class="space-y-4 rounded-2xl border border-[var(--border-color-default)] bg-white/70 p-5 shadow-lg dark:bg-slate-900/60"
203
- >
204
- <div class="flex items-start justify-between gap-3">
205
- <div>
206
- <p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
207
- Theme
208
- </p>
209
- <p class="text-lg font-semibold">Mode and accent</p>
210
- </div>
211
-
212
- <Tooltip text="Toggles document-level theme" position="bottom">
213
- <ThemeToggle class="relative shadow-sm" sz="sm" />
214
- </Tooltip>
215
- </div>
216
-
217
- <PrimaryColorSelect class="w-full" />
218
-
219
- <div
220
- class="flex items-center justify-between rounded-xl border border-[var(--border-color-default)] bg-[var(--color-bg-muted)]/70 px-4 py-3"
221
- >
222
- <div>
223
- <p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
224
- Autoplay
225
- </p>
226
- <p class="text-sm font-medium">Carousel</p>
227
- </div>
228
- <Switch
229
- checked={autoplay}
230
- onChange={(v) => (autoplay = v)}
231
- sz="sm"
232
- rightLabel={autoplay ? "On" : "Off"}
233
- />
234
- </div>
235
-
236
- <div class="grid gap-3 md:grid-cols-2">
237
- <ProgressCircle value={sliderValue} label="Readiness" />
238
- <ProgressBar value={sliderValue} label="Sprint focus" />
239
- </div>
240
- </div>
241
- </div>
242
- </section>
243
-
244
- {#snippet controlsHeader()}
245
- <div class="flex items-center justify-between gap-2">
246
- <div>
247
- <p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
248
- Actions
249
- </p>
250
- <h2 class="text-lg font-semibold leading-tight">Quick triggers</h2>
251
- </div>
252
- <Tooltip text="Buttons use the full variant set" position="left">
253
- <span
254
- class="inline-flex h-9 w-9 items-center justify-center rounded-full bg-[var(--color-bg-muted)] text-sm font-semibold text-[var(--color-text-default)]"
255
- >
256
- ?
257
- </span>
258
- </Tooltip>
259
- </div>
260
- {/snippet}
261
-
262
- {#snippet formHeader()}
263
- <div class="flex items-center justify-between">
264
- <div>
265
- <p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
266
- Form
267
- </p>
268
- <h2 class="text-lg font-semibold leading-tight">Mini brief</h2>
269
- </div>
270
- <Tooltip text="Field, Select, DatePicker, TimePicker and ColorPicker" position="left">
271
- <span
272
- class="inline-flex h-8 w-8 items-center justify-center rounded-full bg-[var(--color-bg-muted)] text-sm font-semibold text-[var(--color-text-default)]"
273
- >
274
- i
275
- </span>
276
- </Tooltip>
277
- </div>
278
- {/snippet}
279
-
280
- <div class="grid gap-6 lg:grid-cols-2">
281
- <Card header={controlsHeader}>
282
- <div class="space-y-4">
283
- <div class="flex flex-wrap gap-2">
284
- <Button variant="primary" onClick={() => pushToast("success")}>Primary</Button>
285
- <Button variant="secondary">Secondary</Button>
286
- <Button variant="ghost">Ghost</Button>
287
- <Button variant="pill">Pill</Button>
288
- <Button variant="danger" onClick={() => pushToast("danger")}>Danger</Button>
289
- </div>
290
-
291
- <div
292
- class="flex items-center justify-between gap-3 rounded-xl border border-[var(--border-color-default)] px-4 py-3"
293
- >
294
- <div class="space-y-1">
295
- <p class="text-sm font-medium">Live mode</p>
296
- <p class="text-xs text-[var(--color-text-muted)]">
297
- Keep autoplay and progress linked across the page
298
- </p>
299
- </div>
300
- <Switch checked={autoplay} onChange={(v) => (autoplay = v)} sz="sm" />
301
- </div>
302
-
303
- <div class="space-y-2">
304
- <div class="flex items-center justify-between text-sm">
305
- <span class="text-[var(--color-text-muted)]">Drag to refresh progress</span>
306
- <span class="font-mono text-[var(--color-text-default)]">{sliderValue}%</span>
307
- </div>
308
- <Slider
309
- value={sliderValue}
310
- min={0}
311
- max={100}
312
- onInput={(v) => (sliderValue = v)}
313
- showValue={false}
314
- />
315
- </div>
316
-
317
- <div class="grid gap-3 md:grid-cols-2">
318
- <ProgressBar value={sliderValue} label="Iteration" />
319
- <ProgressCircle value={sliderValue} label="Readiness" />
320
- </div>
321
-
322
- <div class="flex flex-wrap gap-2">
323
- <Button variant="success" onClick={() => pushToast("success")} sz="sm">
324
- Success toast
325
- </Button>
326
- <Button variant="warning" onClick={() => pushToast("warning")} sz="sm">
327
- Warning toast
328
- </Button>
329
- <Button variant="info" onClick={() => pushToast("info")} sz="sm">
330
- Info toast
331
- </Button>
332
- </div>
333
- </div>
334
- </Card>
335
-
336
- <Card header={formHeader}>
337
- <div class="space-y-4">
338
- <div class="grid gap-3 md:grid-cols-2">
339
- <Field
340
- label="Name"
341
- value={featureName}
342
- onChange={(v) => (featureName = String(v))}
343
- />
344
- <Field
345
- label="Contact email"
346
- type="email"
347
- value={contactEmail}
348
- onChange={(v) => (contactEmail = String(v))}
349
- />
350
- </div>
351
-
352
- <Select
353
- label="Plan"
354
- options={planOptions}
355
- value={selectedPlan}
356
- placeholder="Choose a plan"
357
- onChange={(v) => (selectedPlan = v)}
358
- />
359
-
360
- <div class="grid gap-3 md:grid-cols-3">
361
- <DatePicker
362
- label="Launch date"
363
- value={dateValue}
364
- onChange={(v) => (dateValue = v)}
365
- />
366
- <TimePicker
367
- label="Release time"
368
- value={timeValue}
369
- onChange={(v) => (timeValue = v)}
370
- />
371
- <ColorPicker
372
- label="Accent"
373
- value={accentColor}
374
- onChange={(v) => (accentColor = v)}
375
- />
376
- </div>
377
-
378
- <div class="flex justify-end gap-3">
379
- <Button
380
- variant="ghost"
381
- onClick={() => {
382
- featureName = "Dashboard 2.0";
383
- selectedPlan = planOptions[1].value;
384
- contactEmail = "team@studio.dev";
385
- dateValue = null;
386
- timeValue = null;
387
- accentColor = "#7c3aed";
388
- }}
389
- >
390
- Reset
391
- </Button>
392
- <Button variant="primary" onClick={() => pushToast("success")}>
393
- Save
394
- </Button>
395
- </div>
396
- </div>
397
- </Card>
398
- </div>
399
-
400
- {#snippet dataHeader()}
401
- <div class="flex items-center justify-between gap-3">
402
- <div>
403
- <p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
404
- Data
405
- </p>
406
- <h2 class="text-lg font-semibold leading-tight">Sprint snapshot</h2>
407
- </div>
408
- <Button variant="secondary" sz="sm" onClick={() => pushToast("info")}>
409
- Refresh
410
- </Button>
411
- </div>
412
- {/snippet}
413
-
414
- {#snippet accordionHeader()}
415
- <div class="flex items-center justify-between gap-3">
416
- <div>
417
- <p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
418
- Details
419
- </p>
420
- <h3 class="text-lg font-semibold leading-tight">Sections</h3>
421
- </div>
422
- </div>
423
- {/snippet}
424
-
425
- {#snippet carouselHeader()}
426
- <div class="flex items-center justify-between gap-3">
427
- <div>
428
- <p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
429
- Carousel
430
- </p>
431
- <h3 class="text-lg font-semibold leading-tight">Stories</h3>
432
- </div>
433
- <span class="text-xs text-[var(--color-text-muted)]">
434
- Autoplay {autoplay ? "on" : "off"}
435
- </span>
436
- </div>
437
- {/snippet}
438
-
439
- <div class="grid gap-6 lg:grid-cols-[1.2fr_0.8fr]">
440
- <Card header={dataHeader} class="h-full">
441
- <Tabs
442
- tabs={tabs}
443
- activeTab={activeTab}
444
- onChange={(id) => (activeTab = id)}
445
- variant="underline"
446
- fitted={true}
447
- >
448
- {#if activeTab === "overview"}
449
- <div class="grid gap-4 md:grid-cols-3">
450
- <div
451
- class="rounded-xl border border-[var(--border-color-default)] bg-[var(--color-bg-surface)] p-4"
452
- >
453
- <p class="text-xs uppercase tracking-[0.1em] text-[var(--color-text-muted)]">
454
- Readiness
455
- </p>
456
- <p class="text-2xl font-bold">{sliderValue}%</p>
457
- <p class="text-sm text-[var(--color-text-muted)]">
458
- Synced with the slider above
459
- </p>
460
- </div>
461
-
462
- <div
463
- class="rounded-xl border border-[var(--border-color-default)] bg-[var(--color-bg-surface)] p-4"
464
- >
465
- <p class="text-xs uppercase tracking-[0.1em] text-[var(--color-text-muted)]">
466
- Plan
467
- </p>
468
- <p class="text-lg font-semibold">{selectedPlan}</p>
469
- <p class="text-sm text-[var(--color-text-muted)]">
470
- Contact: {contactEmail}
471
- </p>
472
- </div>
473
-
474
- <div
475
- class="rounded-xl border border-[var(--border-color-default)] bg-[var(--color-bg-surface)] p-4"
476
- >
477
- <p class="text-xs uppercase tracking-[0.1em] text-[var(--color-text-muted)]">
478
- Release window
479
- </p>
480
- <p class="text-lg font-semibold">
481
- {dateValue ?? "Not selected yet"}
482
- </p>
483
- <p class="text-sm text-[var(--color-text-muted)]">
484
- {timeValue ?? "Time is being planned"}
485
- </p>
486
- </div>
487
- </div>
488
-
489
- <div class="mt-4 grid gap-3 md:grid-cols-3">
490
- {#each quality as metric (metric.label)}
491
- <ProgressBar value={metric.value} label={metric.label} sz="sm" />
492
- {/each}
493
- </div>
494
- {:else if activeTab === "team"}
495
- <div class="space-y-3">
496
- {#each team as person (person.name)}
497
- <div
498
- class="flex items-center justify-between rounded-xl border border-[var(--border-color-default)] bg-[var(--color-bg-surface)] px-4 py-3"
499
- >
500
- <div>
501
- <p class="font-semibold">{person.name}</p>
502
- <p class="text-sm text-[var(--color-text-muted)]">{person.role}</p>
503
- </div>
504
- <span
505
- class="rounded-full bg-[var(--color-bg-muted)] px-3 py-1 text-xs text-[var(--color-text-default)]"
506
- >
507
- {person.focus}
508
- </span>
509
- </div>
510
- {/each}
511
- </div>
512
- {:else}
513
- <Table
514
- columns={tableColumns}
515
- rows={pagedRows}
516
- variant="zebra"
517
- pagination={{ currentPage: tablePage, totalPages, onPageChange: (p) => (tablePage = p) }}
518
- />
519
- {/if}
520
- </Tabs>
521
- </Card>
522
-
523
- <div class="grid gap-6">
524
- <Card header={accordionHeader}>
525
- <Accordion items={accordionItems} multiple={true} defaultOpen={[0]} />
526
- </Card>
527
-
528
- <Card header={carouselHeader}>
529
- <Carousel
530
- items={carouselItems}
531
- autoplay={autoplay}
532
- interval={4200}
533
- showDots={true}
534
- showArrows={true}
535
- sz="sm"
536
- />
537
- </Card>
538
- </div>
539
- </div>
540
- </div>
541
-
542
- {#each toasts as toast (toast.id)}
543
- <Toast
544
- title={toast.title}
545
- message={toast.message}
546
- variant={toast.variant}
547
- onClose={() => removeToast(toast.id)}
548
- timeout={3500}
549
- />
550
- {/each}
551
- </Container>
@@ -1,3 +0,0 @@
1
- declare const App: import("svelte").Component<Record<string, never>, {}, "">;
2
- type App = ReturnType<typeof App>;
3
- export default App;
@@ -1,60 +0,0 @@
1
- <!-- src/Container.svelte -->
2
- <script lang="ts">
3
- import type { Snippet } from "svelte";
4
- import { cx } from "./utils";
5
-
6
- type Props = {
7
- header?: Snippet;
8
- footer?: Snippet;
9
- left?: Snippet;
10
- right?: Snippet;
11
- children?: Snippet;
12
- class?: string;
13
- };
14
-
15
- let {
16
- header,
17
- footer,
18
- left,
19
- right,
20
- children,
21
- class: externalClass = "",
22
- }: Props = $props();
23
-
24
- const baseClass =
25
- "min-h-dvh w-full bg-[var(--color-bg-page,oklch(98%_0_0))] text-[var(--color-text-default,oklch(15%_0_0))] transition-colors duration-[var(--transition-normal,300ms)]";
26
-
27
- const rootClass = $derived(cx(baseClass, externalClass));
28
- </script>
29
-
30
- <div class={rootClass}>
31
- <div class="grid min-h-dvh grid-rows-[auto_1fr_auto]">
32
- {#if header}
33
- <header class="p-[var(--spacing-md,1rem)]">
34
- {@render header?.()}
35
- </header>
36
- {/if}
37
-
38
- {#if left}
39
- <aside class="hidden lg:block p-[var(--spacing-md,1rem)]">
40
- {@render left?.()}
41
- </aside>
42
- {/if}
43
-
44
- <main class="p-[var(--spacing-md,1rem)]">
45
- {@render children?.()}
46
- </main>
47
-
48
- {#if right}
49
- <aside class="hidden lg:block p-[var(--spacing-md,1rem)]">
50
- {@render right?.()}
51
- </aside>
52
- {/if}
53
-
54
- {#if footer}
55
- <footer class="p-[var(--spacing-md,1rem)]">
56
- {@render footer?.()}
57
- </footer>
58
- {/if}
59
- </div>
60
- </div>
@@ -1,12 +0,0 @@
1
- import type { Snippet } from "svelte";
2
- type Props = {
3
- header?: Snippet;
4
- footer?: Snippet;
5
- left?: Snippet;
6
- right?: Snippet;
7
- children?: Snippet;
8
- class?: string;
9
- };
10
- declare const Container: import("svelte").Component<Props, {}, "">;
11
- type Container = ReturnType<typeof Container>;
12
- export default Container;