svelte-comp 1.2.7 → 1.3.5
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/README.md +12 -11
- package/dist/App.svelte +497 -2
- package/dist/app.css +2 -3
- package/dist/app.d.ts +10 -0
- package/dist/lang.d.ts +3 -3
- package/dist/lang.js +3 -3
- package/dist/lib/Accordion.svelte +14 -14
- package/dist/lib/Badge.svelte +44 -0
- package/dist/lib/Badge.svelte.d.ts +10 -0
- package/dist/lib/Button.svelte +23 -8
- package/dist/lib/Calendar.svelte +384 -377
- package/dist/lib/Card.svelte +6 -6
- package/dist/lib/Carousel.svelte +16 -16
- package/dist/lib/Carousel.svelte.d.ts +1 -1
- package/dist/lib/CheckBox.svelte +2 -2
- package/dist/lib/CodeView.svelte +6 -5
- package/dist/lib/ColorPicker.svelte +6 -6
- package/dist/lib/ContextMenu.svelte +328 -0
- package/dist/lib/ContextMenu.svelte.d.ts +14 -0
- package/dist/lib/DatePicker.svelte +161 -161
- package/dist/lib/Dialog.svelte +10 -10
- package/dist/lib/Field.svelte +1 -1
- package/dist/lib/FilePicker.svelte +127 -74
- package/dist/lib/FilePicker.svelte.d.ts +6 -3
- package/dist/lib/Hamburger.svelte +27 -21
- package/dist/lib/InstallPWA.svelte +94 -0
- package/dist/lib/InstallPWA.svelte.d.ts +8 -0
- package/dist/lib/Menu.svelte +18 -18
- package/dist/lib/NoticeBase.svelte +140 -0
- package/dist/lib/NoticeBase.svelte.d.ts +43 -0
- package/dist/lib/PrimaryColorSelect.svelte +6 -6
- package/dist/lib/ProgressCircle.svelte +7 -9
- package/dist/lib/ProgressCircle.svelte.d.ts +7 -9
- package/dist/lib/SearchInput.svelte +6 -6
- package/dist/lib/Select.svelte +2 -2
- package/dist/lib/Slider.svelte +1 -1
- package/dist/lib/Splitter.svelte +15 -6
- package/dist/lib/Switch.svelte +5 -4
- package/dist/lib/Tabs.svelte +6 -6
- package/dist/lib/ThemeToggle.svelte +1 -0
- package/dist/lib/TimePicker.svelte +103 -95
- package/dist/lib/TimePickerNew.svelte +634 -0
- package/dist/lib/TimePickerNew.svelte.d.ts +49 -0
- package/dist/lib/Toast.svelte +17 -120
- package/dist/lib/Tooltip.svelte +7 -7
- package/dist/lib/Topbar.svelte +112 -0
- package/dist/lib/Topbar.svelte.d.ts +44 -0
- package/dist/lib/__tests__/Accordion.test.d.ts +1 -0
- package/dist/lib/__tests__/Accordion.test.js +171 -0
- package/dist/lib/__tests__/Badge.test.d.ts +1 -0
- package/dist/lib/__tests__/Badge.test.js +41 -0
- package/dist/lib/__tests__/Button.test.d.ts +1 -0
- package/dist/lib/__tests__/Button.test.js +269 -0
- package/dist/lib/__tests__/Calendar.test.d.ts +1 -0
- package/dist/lib/__tests__/Calendar.test.js +171 -0
- package/dist/lib/__tests__/Card.test.d.ts +1 -0
- package/dist/lib/__tests__/Card.test.js +148 -0
- package/dist/lib/__tests__/Carousel.test.d.ts +1 -0
- package/dist/lib/__tests__/Carousel.test.js +439 -0
- package/dist/lib/__tests__/CheckBox.test.d.ts +1 -0
- package/dist/lib/__tests__/CheckBox.test.js +152 -0
- package/dist/lib/__tests__/CodeView.test.d.ts +1 -0
- package/dist/lib/__tests__/CodeView.test.js +157 -0
- package/dist/lib/__tests__/ColorPicker.test.d.ts +1 -0
- package/dist/lib/__tests__/ColorPicker.test.js +93 -0
- package/dist/lib/__tests__/ContextMenu.test.d.ts +1 -0
- package/dist/lib/__tests__/ContextMenu.test.js +67 -0
- package/dist/lib/__tests__/DatePicker.test.d.ts +1 -0
- package/dist/lib/__tests__/DatePicker.test.js +108 -0
- package/dist/lib/__tests__/Dialog.test.d.ts +1 -0
- package/dist/lib/__tests__/Dialog.test.js +183 -0
- package/dist/lib/__tests__/Field.test.d.ts +1 -0
- package/dist/lib/__tests__/Field.test.js +190 -0
- package/dist/lib/__tests__/FilePicker.test.d.ts +1 -0
- package/dist/lib/__tests__/FilePicker.test.js +179 -0
- package/dist/lib/__tests__/Form.integration.test.d.ts +1 -0
- package/dist/lib/__tests__/Form.integration.test.js +158 -0
- package/dist/lib/__tests__/Form.test.d.ts +1 -0
- package/dist/lib/__tests__/Form.test.js +463 -0
- package/dist/lib/__tests__/Hamburger.test.d.ts +1 -0
- package/dist/lib/__tests__/Hamburger.test.js +161 -0
- package/dist/lib/__tests__/InstallPWA.test.d.ts +1 -0
- package/dist/lib/__tests__/InstallPWA.test.js +15 -0
- package/dist/lib/__tests__/Menu.test.d.ts +1 -0
- package/dist/lib/__tests__/Menu.test.js +285 -0
- package/dist/lib/__tests__/NoticeBase.test.d.ts +1 -0
- package/dist/lib/__tests__/NoticeBase.test.js +60 -0
- package/dist/lib/__tests__/PaginatedCard.test.d.ts +1 -0
- package/dist/lib/__tests__/PaginatedCard.test.js +89 -0
- package/dist/lib/__tests__/Pagination.test.d.ts +1 -0
- package/dist/lib/__tests__/Pagination.test.js +168 -0
- package/dist/lib/__tests__/PrimaryColorSelect.test.d.ts +1 -0
- package/dist/lib/__tests__/PrimaryColorSelect.test.js +92 -0
- package/dist/lib/__tests__/ProgressBar.test.d.ts +1 -0
- package/dist/lib/__tests__/ProgressBar.test.js +69 -0
- package/dist/lib/__tests__/ProgressCircle.test.d.ts +1 -0
- package/dist/lib/__tests__/ProgressCircle.test.js +71 -0
- package/dist/lib/__tests__/Radio.test.d.ts +1 -0
- package/dist/lib/__tests__/Radio.test.js +127 -0
- package/dist/lib/__tests__/SearchInput.test.d.ts +1 -0
- package/dist/lib/__tests__/SearchInput.test.js +80 -0
- package/dist/lib/__tests__/Select.test.d.ts +1 -0
- package/dist/lib/__tests__/Select.test.js +408 -0
- package/dist/lib/__tests__/Slider.test.d.ts +1 -0
- package/dist/lib/__tests__/Slider.test.js +213 -0
- package/dist/lib/__tests__/Splitter.test.d.ts +1 -0
- package/dist/lib/__tests__/Splitter.test.js +87 -0
- package/dist/lib/__tests__/Switch.test.d.ts +1 -0
- package/dist/lib/__tests__/Switch.test.js +97 -0
- package/dist/lib/__tests__/Table.test.d.ts +1 -0
- package/dist/lib/__tests__/Table.test.js +349 -0
- package/dist/lib/__tests__/Tabs.test.d.ts +1 -0
- package/dist/lib/__tests__/Tabs.test.js +262 -0
- package/dist/lib/__tests__/ThemeToggle.test.d.ts +1 -0
- package/dist/lib/__tests__/ThemeToggle.test.js +84 -0
- package/dist/lib/__tests__/TimePicker.test.d.ts +1 -0
- package/dist/lib/__tests__/TimePicker.test.js +146 -0
- package/dist/lib/__tests__/TimePickerNew.test.d.ts +1 -0
- package/dist/lib/__tests__/TimePickerNew.test.js +322 -0
- package/dist/lib/__tests__/Toast.test.d.ts +1 -0
- package/dist/lib/__tests__/Toast.test.js +135 -0
- package/dist/lib/__tests__/Tooltip.test.d.ts +1 -0
- package/dist/lib/__tests__/Tooltip.test.js +171 -0
- package/dist/lib/__tests__/Topbar.test.d.ts +1 -0
- package/dist/lib/__tests__/Topbar.test.js +25 -0
- package/dist/lib/__tests__/setupLangContext.d.ts +1 -0
- package/dist/lib/__tests__/setupLangContext.js +65 -0
- package/dist/lib/__tests__/storage.test.d.ts +1 -0
- package/dist/lib/__tests__/storage.test.js +124 -0
- package/dist/lib/__tests__/utils.test.d.ts +1 -0
- package/dist/lib/__tests__/utils.test.js +11 -0
- package/dist/lib/index.d.ts +5 -0
- package/dist/lib/index.js +5 -0
- package/dist/lib/lang.d.ts +64 -0
- package/dist/lib/lang.js +64 -0
- package/dist/lib/types/index.d.ts +1 -0
- package/dist/styles.css +2 -0
- package/dist/utils/index.js +15 -4
- package/package.json +12 -12
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# svelte-comp
|
|
1
|
+
# svelte-comp
|
|
2
2
|
|
|
3
3
|
Lightweight UI component library for **Svelte 5 (Runes API)** styled with **TailwindCSS**.
|
|
4
4
|
Zero slots, simple props, themeable with CSS variables.
|
|
@@ -13,7 +13,7 @@ npm i svelte-comp
|
|
|
13
13
|
|
|
14
14
|
---
|
|
15
15
|
|
|
16
|
-
##
|
|
16
|
+
## 🧰 Setup TailwindCSS
|
|
17
17
|
|
|
18
18
|
```bash
|
|
19
19
|
npm i tailwindcss @tailwindcss/vite
|
|
@@ -29,7 +29,7 @@ import tailwindcss from "@tailwindcss/vite";
|
|
|
29
29
|
export default defineConfig({
|
|
30
30
|
plugins: [
|
|
31
31
|
tailwindcss(),
|
|
32
|
-
svelte() // Must be after tailwindcss()
|
|
32
|
+
svelte(), // Must be after tailwindcss()
|
|
33
33
|
],
|
|
34
34
|
});
|
|
35
35
|
```
|
|
@@ -43,7 +43,7 @@ Add to `src/app.css`:
|
|
|
43
43
|
|
|
44
44
|
---
|
|
45
45
|
|
|
46
|
-
##
|
|
46
|
+
## 🧰 Setup Prism
|
|
47
47
|
|
|
48
48
|
```bash
|
|
49
49
|
npm i prismjs @types/prismjs
|
|
@@ -53,13 +53,14 @@ npm i prismjs @types/prismjs
|
|
|
53
53
|
|
|
54
54
|
## 📁 Components included
|
|
55
55
|
|
|
56
|
-
Accordion
|
|
57
|
-
DatePicker
|
|
58
|
-
|
|
59
|
-
Radio
|
|
60
|
-
|
|
56
|
+
Accordion, Badge, Button, Calendar, Card, Carousel, CheckBox, CodeView,
|
|
57
|
+
ColorPicker, ContextMenu, DatePicker, Dialog, Field, FilePicker, Form,
|
|
58
|
+
Hamburger, InstallPWA, Menu, NoticeBase, PaginatedCard, Pagination,
|
|
59
|
+
PrimaryColorSelect, ProgressBar, ProgressCircle, Radio, SearchInput, Select,
|
|
60
|
+
Slider, Splitter, Switch, Table, Tabs, ThemeToggle, TimePicker, TimepickerNew,
|
|
61
|
+
Toast, Tooltip, Topbar.
|
|
61
62
|
|
|
62
|
-
Full component list in repository
|
|
63
|
+
Full component list in repository.
|
|
63
64
|
|
|
64
65
|
---
|
|
65
66
|
|
|
@@ -87,7 +88,7 @@ Accordion usage:
|
|
|
87
88
|
|
|
88
89
|
---
|
|
89
90
|
|
|
90
|
-
##
|
|
91
|
+
## 📜 License
|
|
91
92
|
|
|
92
93
|
MIT License
|
|
93
94
|
|
package/dist/App.svelte
CHANGED
|
@@ -1,16 +1,32 @@
|
|
|
1
1
|
<script lang="ts">
|
|
2
2
|
import Accordion from "./lib/Accordion.svelte";
|
|
3
|
+
import Badge from "./lib/Badge.svelte";
|
|
3
4
|
import Button from "./lib/Button.svelte";
|
|
5
|
+
import Calendar from "./lib/Calendar.svelte";
|
|
4
6
|
import Card from "./lib/Card.svelte";
|
|
5
7
|
import Carousel from "./lib/Carousel.svelte";
|
|
8
|
+
import CheckBox from "./lib/CheckBox.svelte";
|
|
9
|
+
import CodeView from "./lib/CodeView.svelte";
|
|
6
10
|
import ColorPicker from "./lib/ColorPicker.svelte";
|
|
11
|
+
import ContextMenu from "./lib/ContextMenu.svelte";
|
|
7
12
|
import DatePicker from "./lib/DatePicker.svelte";
|
|
13
|
+
import Dialog from "./lib/Dialog.svelte";
|
|
8
14
|
import Field from "./lib/Field.svelte";
|
|
15
|
+
import FilePicker from "./lib/FilePicker.svelte";
|
|
16
|
+
import Form from "./lib/Form.svelte";
|
|
17
|
+
import InstallPWA from "./lib/InstallPWA.svelte";
|
|
18
|
+
import Menu from "./lib/Menu.svelte";
|
|
19
|
+
import NoticeBase from "./lib/NoticeBase.svelte";
|
|
20
|
+
import PaginatedCard from "./lib/PaginatedCard.svelte";
|
|
21
|
+
import Pagination from "./lib/Pagination.svelte";
|
|
9
22
|
import PrimaryColorSelect from "./lib/PrimaryColorSelect.svelte";
|
|
10
23
|
import ProgressBar from "./lib/ProgressBar.svelte";
|
|
11
24
|
import ProgressCircle from "./lib/ProgressCircle.svelte";
|
|
25
|
+
import Radio from "./lib/Radio.svelte";
|
|
26
|
+
import SearchInput from "./lib/SearchInput.svelte";
|
|
12
27
|
import Select from "./lib/Select.svelte";
|
|
13
28
|
import Slider from "./lib/Slider.svelte";
|
|
29
|
+
import Splitter from "./lib/Splitter.svelte";
|
|
14
30
|
import Switch from "./lib/Switch.svelte";
|
|
15
31
|
import Table from "./lib/Table.svelte";
|
|
16
32
|
import Tabs from "./lib/Tabs.svelte";
|
|
@@ -18,7 +34,8 @@
|
|
|
18
34
|
import TimePicker from "./lib/TimePicker.svelte";
|
|
19
35
|
import Toast from "./lib/Toast.svelte";
|
|
20
36
|
import Tooltip from "./lib/Tooltip.svelte";
|
|
21
|
-
import
|
|
37
|
+
import Topbar from "./lib/Topbar.svelte";
|
|
38
|
+
import type { FieldSchema, MenuAction, MenuItem, SizeKey, ToastVariant } from "./lib/types";
|
|
22
39
|
import Container from "./Container.svelte";
|
|
23
40
|
|
|
24
41
|
const tabs = [
|
|
@@ -122,6 +139,75 @@
|
|
|
122
139
|
{ name: "Oleg", role: "QA", focus: "Automation" },
|
|
123
140
|
];
|
|
124
141
|
|
|
142
|
+
const navItems = [
|
|
143
|
+
{ id: "overview", label: "Overview" },
|
|
144
|
+
{ id: "inputs", label: "Inputs" },
|
|
145
|
+
{ id: "layout", label: "Layout" },
|
|
146
|
+
{ id: "data", label: "Data" },
|
|
147
|
+
];
|
|
148
|
+
let activeNav = $state(navItems[0].id);
|
|
149
|
+
|
|
150
|
+
let searchQuery = $state("");
|
|
151
|
+
let calendarValue = $state<string | null>(null);
|
|
152
|
+
let fileList = $state<FileList | null>(null);
|
|
153
|
+
let dialogOpen = $state(false);
|
|
154
|
+
let radioGroup = $state("daily");
|
|
155
|
+
let newsletterChecked = $state(false);
|
|
156
|
+
let mixedChecked = $state(false);
|
|
157
|
+
let mixedState = $state(true);
|
|
158
|
+
let menuSelection = $state("Pick an action from the menu bar");
|
|
159
|
+
let menuSize = $state<SizeKey>("sm");
|
|
160
|
+
let standalonePage = $state(1);
|
|
161
|
+
const standaloneTotal = 5;
|
|
162
|
+
let codeEditable = $state(false);
|
|
163
|
+
let codeSample = $state(
|
|
164
|
+
"const tokens = ['spacing', 'radius', 'colors'];\n\nexport function tokensReady() {\n return tokens.length > 0;\n}\n"
|
|
165
|
+
);
|
|
166
|
+
let contextMenuStatus = $state("Right-click the panel to open the menu");
|
|
167
|
+
let contextMenuRef = $state<{
|
|
168
|
+
openAt: (event: MouseEvent) => void;
|
|
169
|
+
close: () => void;
|
|
170
|
+
} | null>(null);
|
|
171
|
+
|
|
172
|
+
const menuData: MenuItem[] = [
|
|
173
|
+
{
|
|
174
|
+
name: "File",
|
|
175
|
+
actions: [
|
|
176
|
+
{ id: "new", label: "New", shortcut: "Ctrl+N" },
|
|
177
|
+
{ id: "open", label: "Open", shortcut: "Ctrl+O" },
|
|
178
|
+
{ type: "separator" },
|
|
179
|
+
{ id: "export", label: "Export", shortcut: "Ctrl+E" },
|
|
180
|
+
],
|
|
181
|
+
},
|
|
182
|
+
{
|
|
183
|
+
name: "View",
|
|
184
|
+
actions: [
|
|
185
|
+
{ id: "xs", label: "XS" },
|
|
186
|
+
{ id: "sm", label: "SM" },
|
|
187
|
+
{ id: "md", label: "MD" },
|
|
188
|
+
{ id: "lg", label: "LG" },
|
|
189
|
+
{ id: "xl", label: "XL" },
|
|
190
|
+
],
|
|
191
|
+
},
|
|
192
|
+
];
|
|
193
|
+
|
|
194
|
+
const miniFormSchema: FieldSchema[] = [
|
|
195
|
+
{ name: "project", type: "text", label: "Project", required: true },
|
|
196
|
+
{ name: "owner", type: "email", label: "Owner email", required: true },
|
|
197
|
+
{
|
|
198
|
+
name: "priority",
|
|
199
|
+
type: "select",
|
|
200
|
+
label: "Priority",
|
|
201
|
+
options: [
|
|
202
|
+
{ label: "Low", value: "low" },
|
|
203
|
+
{ label: "Medium", value: "medium" },
|
|
204
|
+
{ label: "High", value: "high" },
|
|
205
|
+
],
|
|
206
|
+
},
|
|
207
|
+
{ name: "subscribe", type: "checkbox", label: "Send updates" },
|
|
208
|
+
];
|
|
209
|
+
let formResult = $state("Not submitted yet");
|
|
210
|
+
|
|
125
211
|
type ToastItem = { id: number; title?: string; message: string; variant: ToastVariant };
|
|
126
212
|
let toasts = $state<ToastItem[]>([]);
|
|
127
213
|
let toastId = 0;
|
|
@@ -150,10 +236,38 @@
|
|
|
150
236
|
function removeToast(id: number) {
|
|
151
237
|
toasts = toasts.filter((t) => t.id !== id);
|
|
152
238
|
}
|
|
239
|
+
|
|
240
|
+
function handleMenuSelect(menu: string, action: MenuAction) {
|
|
241
|
+
const label =
|
|
242
|
+
typeof action === "string"
|
|
243
|
+
? action
|
|
244
|
+
: action.label || action.id || "Action";
|
|
245
|
+
const id = typeof action === "string" ? action : action.id;
|
|
246
|
+
if (id && ["xs", "sm", "md", "lg", "xl"].includes(id)) {
|
|
247
|
+
menuSize = id as SizeKey;
|
|
248
|
+
}
|
|
249
|
+
menuSelection = `${menu}: ${label}`;
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function handleMiniSubmit(values: Record<string, unknown>) {
|
|
253
|
+
formResult = JSON.stringify(values, null, 2);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
function handleContextAction(label: string, variant: ToastVariant) {
|
|
257
|
+
contextMenuStatus = `Last action: ${label}`;
|
|
258
|
+
pushToast(variant);
|
|
259
|
+
}
|
|
153
260
|
</script>
|
|
154
261
|
|
|
262
|
+
<Topbar
|
|
263
|
+
title="svelte-comp"
|
|
264
|
+
showHamburger={true}
|
|
265
|
+
menuItems={navItems}
|
|
266
|
+
onMenuSelect={(id) => (activeNav = id)}
|
|
267
|
+
/>
|
|
268
|
+
|
|
155
269
|
<Container>
|
|
156
|
-
<div class="relative mx-auto max-w-6xl space-y-8 px-6
|
|
270
|
+
<div class="relative mx-auto max-w-6xl space-y-8 px-6 pb-10 pt-24">
|
|
157
271
|
<section
|
|
158
272
|
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
273
|
>
|
|
@@ -537,6 +651,387 @@
|
|
|
537
651
|
</Card>
|
|
538
652
|
</div>
|
|
539
653
|
</div>
|
|
654
|
+
|
|
655
|
+
{#snippet statusHeader()}
|
|
656
|
+
<div class="flex items-center justify-between gap-2">
|
|
657
|
+
<div>
|
|
658
|
+
<p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
|
|
659
|
+
Status
|
|
660
|
+
</p>
|
|
661
|
+
<h2 class="text-lg font-semibold leading-tight">Search and signals</h2>
|
|
662
|
+
</div>
|
|
663
|
+
</div>
|
|
664
|
+
{/snippet}
|
|
665
|
+
|
|
666
|
+
{#snippet optionsHeader()}
|
|
667
|
+
<div class="flex items-center justify-between gap-2">
|
|
668
|
+
<div>
|
|
669
|
+
<p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
|
|
670
|
+
Options
|
|
671
|
+
</p>
|
|
672
|
+
<h2 class="text-lg font-semibold leading-tight">Toggles and calendar</h2>
|
|
673
|
+
</div>
|
|
674
|
+
</div>
|
|
675
|
+
{/snippet}
|
|
676
|
+
|
|
677
|
+
<div class="grid gap-6 lg:grid-cols-2">
|
|
678
|
+
<Card header={statusHeader}>
|
|
679
|
+
<div class="space-y-4">
|
|
680
|
+
<SearchInput
|
|
681
|
+
label="Search components"
|
|
682
|
+
placeholder="Filter by name"
|
|
683
|
+
bind:value={searchQuery}
|
|
684
|
+
/>
|
|
685
|
+
|
|
686
|
+
<div class="flex flex-wrap gap-2">
|
|
687
|
+
<Badge message="Live" variant="success" showIcon />
|
|
688
|
+
<Badge message="Needs review" variant="warning" showIcon />
|
|
689
|
+
<Badge message="Queued" variant="info" />
|
|
690
|
+
</div>
|
|
691
|
+
|
|
692
|
+
{#snippet noticeEnd()}
|
|
693
|
+
<Button variant="ghost" sz="xs">Undo</Button>
|
|
694
|
+
{/snippet}
|
|
695
|
+
|
|
696
|
+
<NoticeBase
|
|
697
|
+
title="Release note"
|
|
698
|
+
message="New components landed in the demo."
|
|
699
|
+
variant="info"
|
|
700
|
+
size="md"
|
|
701
|
+
end={noticeEnd}
|
|
702
|
+
/>
|
|
703
|
+
</div>
|
|
704
|
+
</Card>
|
|
705
|
+
|
|
706
|
+
<Card header={optionsHeader}>
|
|
707
|
+
<div class="space-y-4">
|
|
708
|
+
<div class="space-y-2">
|
|
709
|
+
<Radio
|
|
710
|
+
label="Daily updates"
|
|
711
|
+
value="daily"
|
|
712
|
+
bind:group={radioGroup}
|
|
713
|
+
/>
|
|
714
|
+
<Radio
|
|
715
|
+
label="Weekly updates"
|
|
716
|
+
value="weekly"
|
|
717
|
+
bind:group={radioGroup}
|
|
718
|
+
/>
|
|
719
|
+
<Radio
|
|
720
|
+
label="Monthly updates"
|
|
721
|
+
value="monthly"
|
|
722
|
+
bind:group={radioGroup}
|
|
723
|
+
/>
|
|
724
|
+
</div>
|
|
725
|
+
|
|
726
|
+
<div class="flex flex-wrap gap-3">
|
|
727
|
+
<CheckBox
|
|
728
|
+
label="Send digest emails"
|
|
729
|
+
bind:checked={newsletterChecked}
|
|
730
|
+
/>
|
|
731
|
+
<CheckBox
|
|
732
|
+
label="Mixed state"
|
|
733
|
+
indeterminate={mixedState}
|
|
734
|
+
checked={mixedChecked}
|
|
735
|
+
onChange={(v) => {
|
|
736
|
+
mixedChecked = v;
|
|
737
|
+
mixedState = false;
|
|
738
|
+
}}
|
|
739
|
+
/>
|
|
740
|
+
</div>
|
|
741
|
+
|
|
742
|
+
<div class="grid gap-3 md:grid-cols-[minmax(0,1.1fr)_minmax(0,0.9fr)]">
|
|
743
|
+
<div class="min-w-0">
|
|
744
|
+
<Calendar
|
|
745
|
+
value={calendarValue}
|
|
746
|
+
onChange={(v) => (calendarValue = v)}
|
|
747
|
+
showOutsideDays={true}
|
|
748
|
+
class="w-full"
|
|
749
|
+
/>
|
|
750
|
+
</div>
|
|
751
|
+
<div class="rounded-xl border border-[var(--border-color-default)] bg-[var(--color-bg-surface)] p-4">
|
|
752
|
+
<p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
|
|
753
|
+
Selected date
|
|
754
|
+
</p>
|
|
755
|
+
<p class="text-lg font-semibold">
|
|
756
|
+
{calendarValue ?? "No date yet"}
|
|
757
|
+
</p>
|
|
758
|
+
<p class="text-sm text-[var(--color-text-muted)] mt-2">
|
|
759
|
+
Plan: {radioGroup}
|
|
760
|
+
</p>
|
|
761
|
+
</div>
|
|
762
|
+
</div>
|
|
763
|
+
</div>
|
|
764
|
+
</Card>
|
|
765
|
+
</div>
|
|
766
|
+
|
|
767
|
+
{#snippet filesHeader()}
|
|
768
|
+
<div class="flex items-center justify-between gap-2">
|
|
769
|
+
<div>
|
|
770
|
+
<p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
|
|
771
|
+
Files
|
|
772
|
+
</p>
|
|
773
|
+
<h2 class="text-lg font-semibold leading-tight">Uploads and dialogs</h2>
|
|
774
|
+
</div>
|
|
775
|
+
<InstallPWA inline={true} alwaysShow={true} />
|
|
776
|
+
</div>
|
|
777
|
+
{/snippet}
|
|
778
|
+
|
|
779
|
+
{#snippet formGeneratorHeader()}
|
|
780
|
+
<div class="flex items-center justify-between gap-2">
|
|
781
|
+
<div>
|
|
782
|
+
<p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
|
|
783
|
+
Form
|
|
784
|
+
</p>
|
|
785
|
+
<h2 class="text-lg font-semibold leading-tight">Schema-driven form</h2>
|
|
786
|
+
</div>
|
|
787
|
+
</div>
|
|
788
|
+
{/snippet}
|
|
789
|
+
|
|
790
|
+
<div class="grid gap-6 lg:grid-cols-2">
|
|
791
|
+
<Card header={filesHeader}>
|
|
792
|
+
<div class="space-y-4">
|
|
793
|
+
<FilePicker
|
|
794
|
+
value={fileList}
|
|
795
|
+
onFilesSelected={(files) => (fileList = files)}
|
|
796
|
+
accept="image/*,.pdf"
|
|
797
|
+
/>
|
|
798
|
+
|
|
799
|
+
<div class="flex items-center justify-between rounded-xl border border-[var(--border-color-default)] px-4 py-3">
|
|
800
|
+
<div>
|
|
801
|
+
<p class="text-sm font-medium">Confirm release</p>
|
|
802
|
+
<p class="text-xs text-[var(--color-text-muted)]">
|
|
803
|
+
Last file: {fileList?.[0]?.name ?? "none"}
|
|
804
|
+
</p>
|
|
805
|
+
</div>
|
|
806
|
+
<Button variant="primary" onClick={() => (dialogOpen = true)} sz="sm">
|
|
807
|
+
Open dialog
|
|
808
|
+
</Button>
|
|
809
|
+
</div>
|
|
810
|
+
</div>
|
|
811
|
+
</Card>
|
|
812
|
+
|
|
813
|
+
<Card header={formGeneratorHeader}>
|
|
814
|
+
<div class="space-y-4">
|
|
815
|
+
<Form
|
|
816
|
+
schema={miniFormSchema}
|
|
817
|
+
onSubmit={handleMiniSubmit}
|
|
818
|
+
validateOn="submit"
|
|
819
|
+
/>
|
|
820
|
+
<div class="rounded-xl border border-[var(--border-color-default)] bg-[var(--color-bg-surface)] p-3">
|
|
821
|
+
<p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
|
|
822
|
+
Last submit
|
|
823
|
+
</p>
|
|
824
|
+
<pre class="text-xs whitespace-pre-wrap text-[var(--color-text-default)]">
|
|
825
|
+
{formResult}
|
|
826
|
+
</pre>
|
|
827
|
+
</div>
|
|
828
|
+
</div>
|
|
829
|
+
</Card>
|
|
830
|
+
</div>
|
|
831
|
+
|
|
832
|
+
{#snippet menuHeader()}
|
|
833
|
+
<div class="flex items-center justify-between gap-2">
|
|
834
|
+
<div>
|
|
835
|
+
<p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
|
|
836
|
+
Menu
|
|
837
|
+
</p>
|
|
838
|
+
<h2 class="text-lg font-semibold leading-tight">Navigation controls</h2>
|
|
839
|
+
</div>
|
|
840
|
+
</div>
|
|
841
|
+
{/snippet}
|
|
842
|
+
|
|
843
|
+
{#snippet layoutHeader()}
|
|
844
|
+
<div class="flex items-center justify-between gap-2">
|
|
845
|
+
<div>
|
|
846
|
+
<p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
|
|
847
|
+
Layout
|
|
848
|
+
</p>
|
|
849
|
+
<h2 class="text-lg font-semibold leading-tight">Splitter + context menu</h2>
|
|
850
|
+
</div>
|
|
851
|
+
</div>
|
|
852
|
+
{/snippet}
|
|
853
|
+
|
|
854
|
+
{#snippet firstPane()}
|
|
855
|
+
<div class="h-full grid place-items-center text-sm font-medium">
|
|
856
|
+
First panel
|
|
857
|
+
</div>
|
|
858
|
+
{/snippet}
|
|
859
|
+
|
|
860
|
+
{#snippet secondPane()}
|
|
861
|
+
<div class="h-full grid place-items-center text-sm font-medium">
|
|
862
|
+
Second panel
|
|
863
|
+
</div>
|
|
864
|
+
{/snippet}
|
|
865
|
+
|
|
866
|
+
<div class="grid gap-6 lg:grid-cols-2">
|
|
867
|
+
<Card header={menuHeader}>
|
|
868
|
+
<div class="space-y-4">
|
|
869
|
+
<Menu menus={menuData} sz={menuSize} onSelect={handleMenuSelect} />
|
|
870
|
+
|
|
871
|
+
<div class="text-sm text-[var(--color-text-muted)]">
|
|
872
|
+
{menuSelection}
|
|
873
|
+
</div>
|
|
874
|
+
|
|
875
|
+
<div class="rounded-xl border border-[var(--border-color-default)] p-4">
|
|
876
|
+
<Pagination
|
|
877
|
+
currentPage={standalonePage}
|
|
878
|
+
totalPages={standaloneTotal}
|
|
879
|
+
onPageChange={(p) => (standalonePage = p)}
|
|
880
|
+
/>
|
|
881
|
+
</div>
|
|
882
|
+
|
|
883
|
+
{#snippet pageOne()}
|
|
884
|
+
<div class="p-4 rounded-xl border border-[var(--border-color-default)] bg-[var(--color-bg-surface)]">
|
|
885
|
+
<p class="text-sm font-medium">Release notes</p>
|
|
886
|
+
<p class="text-xs text-[var(--color-text-muted)]">
|
|
887
|
+
Snapshot of changes across components.
|
|
888
|
+
</p>
|
|
889
|
+
</div>
|
|
890
|
+
{/snippet}
|
|
891
|
+
{#snippet pageTwo()}
|
|
892
|
+
<div class="p-4 rounded-xl border border-[var(--border-color-default)] bg-[var(--color-bg-surface)]">
|
|
893
|
+
<p class="text-sm font-medium">Design tasks</p>
|
|
894
|
+
<p class="text-xs text-[var(--color-text-muted)]">
|
|
895
|
+
Review tokens and spacing.
|
|
896
|
+
</p>
|
|
897
|
+
</div>
|
|
898
|
+
{/snippet}
|
|
899
|
+
{#snippet pageThree()}
|
|
900
|
+
<div class="p-4 rounded-xl border border-[var(--border-color-default)] bg-[var(--color-bg-surface)]">
|
|
901
|
+
<p class="text-sm font-medium">QA checklist</p>
|
|
902
|
+
<p class="text-xs text-[var(--color-text-muted)]">
|
|
903
|
+
Validate keyboard and focus behavior.
|
|
904
|
+
</p>
|
|
905
|
+
</div>
|
|
906
|
+
{/snippet}
|
|
907
|
+
|
|
908
|
+
<PaginatedCard
|
|
909
|
+
items={[pageOne, pageTwo, pageThree]}
|
|
910
|
+
itemsPerPage={1}
|
|
911
|
+
/>
|
|
912
|
+
</div>
|
|
913
|
+
</Card>
|
|
914
|
+
|
|
915
|
+
<Card header={layoutHeader}>
|
|
916
|
+
<div class="space-y-4">
|
|
917
|
+
<div class="h-56 rounded-xl border border-[var(--border-color-default)] overflow-hidden">
|
|
918
|
+
<Splitter
|
|
919
|
+
direction="horizontal"
|
|
920
|
+
initialSize={45}
|
|
921
|
+
dividerSize={6}
|
|
922
|
+
minSize={20}
|
|
923
|
+
maxSize={80}
|
|
924
|
+
first={firstPane}
|
|
925
|
+
second={secondPane}
|
|
926
|
+
/>
|
|
927
|
+
</div>
|
|
928
|
+
|
|
929
|
+
<div
|
|
930
|
+
class="rounded-xl border border-[var(--border-color-default)] bg-[var(--color-bg-surface)] p-4 text-sm text-[var(--color-text-muted)]"
|
|
931
|
+
oncontextmenu={(e) => contextMenuRef?.openAt(e)}
|
|
932
|
+
role="button"
|
|
933
|
+
tabindex="0"
|
|
934
|
+
>
|
|
935
|
+
{contextMenuStatus}
|
|
936
|
+
</div>
|
|
937
|
+
|
|
938
|
+
<ContextMenu
|
|
939
|
+
bind:this={contextMenuRef}
|
|
940
|
+
onUndo={() => handleContextAction("Undo", "info")}
|
|
941
|
+
onRedo={() => handleContextAction("Redo", "info")}
|
|
942
|
+
onCopy={() => handleContextAction("Copy", "success")}
|
|
943
|
+
onCut={() => handleContextAction("Cut", "warning")}
|
|
944
|
+
onPaste={() => handleContextAction("Paste", "success")}
|
|
945
|
+
onDelete={() => handleContextAction("Delete", "danger")}
|
|
946
|
+
/>
|
|
947
|
+
</div>
|
|
948
|
+
</Card>
|
|
949
|
+
</div>
|
|
950
|
+
|
|
951
|
+
{#snippet codeHeader()}
|
|
952
|
+
<div class="flex items-center justify-between gap-2">
|
|
953
|
+
<div>
|
|
954
|
+
<p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
|
|
955
|
+
Code
|
|
956
|
+
</p>
|
|
957
|
+
<h2 class="text-lg font-semibold leading-tight">CodeView editor</h2>
|
|
958
|
+
</div>
|
|
959
|
+
<Switch
|
|
960
|
+
checked={codeEditable}
|
|
961
|
+
onChange={(v) => (codeEditable = v)}
|
|
962
|
+
rightLabel={codeEditable ? "Editable" : "Read only"}
|
|
963
|
+
sz="sm"
|
|
964
|
+
/>
|
|
965
|
+
</div>
|
|
966
|
+
{/snippet}
|
|
967
|
+
|
|
968
|
+
{#snippet quickHeader()}
|
|
969
|
+
<div class="flex items-center justify-between gap-2">
|
|
970
|
+
<div>
|
|
971
|
+
<p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
|
|
972
|
+
Actions
|
|
973
|
+
</p>
|
|
974
|
+
<h2 class="text-lg font-semibold leading-tight">Quick actions</h2>
|
|
975
|
+
</div>
|
|
976
|
+
</div>
|
|
977
|
+
{/snippet}
|
|
978
|
+
|
|
979
|
+
<div class="grid gap-6 lg:grid-cols-2">
|
|
980
|
+
<Card header={codeHeader} class="min-h-[360px]">
|
|
981
|
+
<CodeView
|
|
982
|
+
bind:code={codeSample}
|
|
983
|
+
language="js"
|
|
984
|
+
title="tokens.js"
|
|
985
|
+
showCopyButton={true}
|
|
986
|
+
showLineNumbers={true}
|
|
987
|
+
editable={codeEditable}
|
|
988
|
+
activeLine={true}
|
|
989
|
+
class="h-[320px]"
|
|
990
|
+
/>
|
|
991
|
+
</Card>
|
|
992
|
+
|
|
993
|
+
<Card header={quickHeader}>
|
|
994
|
+
<div class="space-y-4">
|
|
995
|
+
<div class="flex flex-wrap gap-2">
|
|
996
|
+
<Button variant="secondary" onClick={() => pushToast("info")}>
|
|
997
|
+
Notify
|
|
998
|
+
</Button>
|
|
999
|
+
<Button variant="success" onClick={() => pushToast("success")}>
|
|
1000
|
+
Success
|
|
1001
|
+
</Button>
|
|
1002
|
+
<Button variant="danger" onClick={() => pushToast("danger")}>
|
|
1003
|
+
Error
|
|
1004
|
+
</Button>
|
|
1005
|
+
</div>
|
|
1006
|
+
|
|
1007
|
+
<div class="rounded-xl border border-[var(--border-color-default)] bg-[var(--color-bg-surface)] p-4">
|
|
1008
|
+
<p class="text-xs uppercase tracking-[0.15em] text-[var(--color-text-muted)]">
|
|
1009
|
+
Active nav
|
|
1010
|
+
</p>
|
|
1011
|
+
<p class="text-lg font-semibold">{activeNav}</p>
|
|
1012
|
+
<p class="text-sm text-[var(--color-text-muted)]">
|
|
1013
|
+
Search: {searchQuery || "empty"}
|
|
1014
|
+
</p>
|
|
1015
|
+
</div>
|
|
1016
|
+
</div>
|
|
1017
|
+
</Card>
|
|
1018
|
+
</div>
|
|
1019
|
+
|
|
1020
|
+
<Dialog
|
|
1021
|
+
open={dialogOpen}
|
|
1022
|
+
title="Confirm release"
|
|
1023
|
+
message="Ready to ship the selected files?"
|
|
1024
|
+
onConfirm={() => {
|
|
1025
|
+
dialogOpen = false;
|
|
1026
|
+
pushToast("success");
|
|
1027
|
+
}}
|
|
1028
|
+
onCancel={() => {
|
|
1029
|
+
dialogOpen = false;
|
|
1030
|
+
}}
|
|
1031
|
+
onClose={() => {
|
|
1032
|
+
dialogOpen = false;
|
|
1033
|
+
}}
|
|
1034
|
+
/>
|
|
540
1035
|
</div>
|
|
541
1036
|
|
|
542
1037
|
{#each toasts as toast (toast.id)}
|
package/dist/app.css
CHANGED
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
/* src/app.css */
|
|
2
|
-
|
|
3
2
|
@import "tailwindcss";
|
|
4
3
|
|
|
5
|
-
/* src/styles.css */
|
|
6
|
-
@import "tailwindcss";
|
|
7
4
|
@custom-variant dark (&:where(.dark, .dark *));
|
|
8
5
|
|
|
9
6
|
@theme {
|
|
@@ -15,6 +12,7 @@
|
|
|
15
12
|
--color-text-warning: oklch(95% 0.05 90deg);
|
|
16
13
|
--color-text-link: oklch(35% 0.3 250deg);
|
|
17
14
|
--color-text-red: oklch(50% 0.25 30deg);
|
|
15
|
+
--color-text-inverse: oklch(100% 0 0deg);
|
|
18
16
|
|
|
19
17
|
/* COLORS — BG */
|
|
20
18
|
--color-bg-page: oklch(98% 0 0deg);
|
|
@@ -108,6 +106,7 @@
|
|
|
108
106
|
--color-text-warning: oklch(95% 0.05 90deg);
|
|
109
107
|
--color-text-link: oklch(65% 0.3 250deg);
|
|
110
108
|
--color-text-red: oklch(50% 0.25 30deg);
|
|
109
|
+
--color-text-inverse: oklch(100% 0 0deg);
|
|
111
110
|
|
|
112
111
|
/* COLORS — BG */
|
|
113
112
|
--color-bg-page: oklch(15% 0 0deg);
|
package/dist/app.d.ts
ADDED
package/dist/lang.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
export declare const TEXTS: {
|
|
2
2
|
readonly en: {
|
|
3
3
|
readonly app: {
|
|
4
|
-
readonly version: "v1.
|
|
4
|
+
readonly version: "v1.3.3";
|
|
5
5
|
readonly title: "Svelte 5 UI Components";
|
|
6
6
|
readonly footer: "© 2025 MaestroFusion360";
|
|
7
7
|
readonly authorUrl: "https://github.com/MaestroFusion360/svelte-comp";
|
|
@@ -360,7 +360,7 @@ export declare const TEXTS: {
|
|
|
360
360
|
};
|
|
361
361
|
readonly ru: {
|
|
362
362
|
readonly app: {
|
|
363
|
-
readonly version: "v1.
|
|
363
|
+
readonly version: "v1.3.3";
|
|
364
364
|
readonly title: "Svelte 5 UI Components";
|
|
365
365
|
readonly footer: "© 2025 MaestroFusion360";
|
|
366
366
|
readonly authorUrl: "https://github.com/MaestroFusion360/svelte-comp";
|
|
@@ -720,7 +720,7 @@ export declare const TEXTS: {
|
|
|
720
720
|
};
|
|
721
721
|
readonly es: {
|
|
722
722
|
readonly app: {
|
|
723
|
-
readonly version: "v1.
|
|
723
|
+
readonly version: "v1.3.3";
|
|
724
724
|
readonly title: "Svelte 5 UI Components";
|
|
725
725
|
readonly footer: "© 2025 MaestroFusion360";
|
|
726
726
|
readonly authorUrl: "https://github.com/MaestroFusion360/svelte-comp";
|