svelte-comp 1.3.3 → 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.
Files changed (120) hide show
  1. package/README.md +12 -11
  2. package/dist/App.svelte +540 -540
  3. package/dist/app.css +2 -3
  4. package/dist/app.d.ts +10 -0
  5. package/dist/lib/Accordion.svelte +14 -14
  6. package/dist/lib/Button.svelte +23 -8
  7. package/dist/lib/Card.svelte +6 -6
  8. package/dist/lib/Carousel.svelte +16 -16
  9. package/dist/lib/Carousel.svelte.d.ts +1 -1
  10. package/dist/lib/CheckBox.svelte +2 -2
  11. package/dist/lib/CodeView.svelte +6 -5
  12. package/dist/lib/ContextMenu.svelte +19 -13
  13. package/dist/lib/Dialog.svelte +3 -3
  14. package/dist/lib/Field.svelte +1 -1
  15. package/dist/lib/FilePicker.svelte +66 -11
  16. package/dist/lib/FilePicker.svelte.d.ts +6 -1
  17. package/dist/lib/Hamburger.svelte +12 -12
  18. package/dist/lib/Menu.svelte +18 -18
  19. package/dist/lib/NoticeBase.svelte +5 -5
  20. package/dist/lib/Select.svelte +2 -2
  21. package/dist/lib/Slider.svelte +1 -1
  22. package/dist/lib/Splitter.svelte +15 -6
  23. package/dist/lib/Switch.svelte +5 -4
  24. package/dist/lib/Tabs.svelte +6 -6
  25. package/dist/lib/ThemeToggle.svelte +1 -0
  26. package/dist/lib/TimePickerNew.svelte +634 -0
  27. package/dist/lib/TimePickerNew.svelte.d.ts +49 -0
  28. package/dist/lib/Tooltip.svelte +7 -7
  29. package/dist/lib/Topbar.svelte +6 -6
  30. package/dist/lib/__tests__/Accordion.test.d.ts +1 -0
  31. package/dist/lib/__tests__/Accordion.test.js +171 -0
  32. package/dist/lib/__tests__/Badge.test.d.ts +1 -0
  33. package/dist/lib/__tests__/Badge.test.js +41 -0
  34. package/dist/lib/__tests__/Button.test.d.ts +1 -0
  35. package/dist/lib/__tests__/Button.test.js +269 -0
  36. package/dist/lib/__tests__/Calendar.test.d.ts +1 -0
  37. package/dist/lib/__tests__/Calendar.test.js +171 -0
  38. package/dist/lib/__tests__/Card.test.d.ts +1 -0
  39. package/dist/lib/__tests__/Card.test.js +148 -0
  40. package/dist/lib/__tests__/Carousel.test.d.ts +1 -0
  41. package/dist/lib/__tests__/Carousel.test.js +439 -0
  42. package/dist/lib/__tests__/CheckBox.test.d.ts +1 -0
  43. package/dist/lib/__tests__/CheckBox.test.js +152 -0
  44. package/dist/lib/__tests__/CodeView.test.d.ts +1 -0
  45. package/dist/lib/__tests__/CodeView.test.js +157 -0
  46. package/dist/lib/__tests__/ColorPicker.test.d.ts +1 -0
  47. package/dist/lib/__tests__/ColorPicker.test.js +93 -0
  48. package/dist/lib/__tests__/ContextMenu.test.d.ts +1 -0
  49. package/dist/lib/__tests__/ContextMenu.test.js +67 -0
  50. package/dist/lib/__tests__/DatePicker.test.d.ts +1 -0
  51. package/dist/lib/__tests__/DatePicker.test.js +108 -0
  52. package/dist/lib/__tests__/Dialog.test.d.ts +1 -0
  53. package/dist/lib/__tests__/Dialog.test.js +183 -0
  54. package/dist/lib/__tests__/Field.test.d.ts +1 -0
  55. package/dist/lib/__tests__/Field.test.js +190 -0
  56. package/dist/lib/__tests__/FilePicker.test.d.ts +1 -0
  57. package/dist/lib/__tests__/FilePicker.test.js +179 -0
  58. package/dist/lib/__tests__/Form.integration.test.d.ts +1 -0
  59. package/dist/lib/__tests__/Form.integration.test.js +158 -0
  60. package/dist/lib/__tests__/Form.test.d.ts +1 -0
  61. package/dist/lib/__tests__/Form.test.js +463 -0
  62. package/dist/lib/__tests__/Hamburger.test.d.ts +1 -0
  63. package/dist/lib/__tests__/Hamburger.test.js +161 -0
  64. package/dist/lib/__tests__/InstallPWA.test.d.ts +1 -0
  65. package/dist/lib/__tests__/InstallPWA.test.js +15 -0
  66. package/dist/lib/__tests__/Menu.test.d.ts +1 -0
  67. package/dist/lib/__tests__/Menu.test.js +285 -0
  68. package/dist/lib/__tests__/NoticeBase.test.d.ts +1 -0
  69. package/dist/lib/__tests__/NoticeBase.test.js +60 -0
  70. package/dist/lib/__tests__/PaginatedCard.test.d.ts +1 -0
  71. package/dist/lib/__tests__/PaginatedCard.test.js +89 -0
  72. package/dist/lib/__tests__/Pagination.test.d.ts +1 -0
  73. package/dist/lib/__tests__/Pagination.test.js +168 -0
  74. package/dist/lib/__tests__/PrimaryColorSelect.test.d.ts +1 -0
  75. package/dist/lib/__tests__/PrimaryColorSelect.test.js +92 -0
  76. package/dist/lib/__tests__/ProgressBar.test.d.ts +1 -0
  77. package/dist/lib/__tests__/ProgressBar.test.js +69 -0
  78. package/dist/lib/__tests__/ProgressCircle.test.d.ts +1 -0
  79. package/dist/lib/__tests__/ProgressCircle.test.js +71 -0
  80. package/dist/lib/__tests__/Radio.test.d.ts +1 -0
  81. package/dist/lib/__tests__/Radio.test.js +127 -0
  82. package/dist/lib/__tests__/SearchInput.test.d.ts +1 -0
  83. package/dist/lib/__tests__/SearchInput.test.js +80 -0
  84. package/dist/lib/__tests__/Select.test.d.ts +1 -0
  85. package/dist/lib/__tests__/Select.test.js +408 -0
  86. package/dist/lib/__tests__/Slider.test.d.ts +1 -0
  87. package/dist/lib/__tests__/Slider.test.js +213 -0
  88. package/dist/lib/__tests__/Splitter.test.d.ts +1 -0
  89. package/dist/lib/__tests__/Splitter.test.js +87 -0
  90. package/dist/lib/__tests__/Switch.test.d.ts +1 -0
  91. package/dist/lib/__tests__/Switch.test.js +97 -0
  92. package/dist/lib/__tests__/Table.test.d.ts +1 -0
  93. package/dist/lib/__tests__/Table.test.js +349 -0
  94. package/dist/lib/__tests__/Tabs.test.d.ts +1 -0
  95. package/dist/lib/__tests__/Tabs.test.js +262 -0
  96. package/dist/lib/__tests__/ThemeToggle.test.d.ts +1 -0
  97. package/dist/lib/__tests__/ThemeToggle.test.js +84 -0
  98. package/dist/lib/__tests__/TimePicker.test.d.ts +1 -0
  99. package/dist/lib/__tests__/TimePicker.test.js +146 -0
  100. package/dist/lib/__tests__/TimePickerNew.test.d.ts +1 -0
  101. package/dist/lib/__tests__/TimePickerNew.test.js +322 -0
  102. package/dist/lib/__tests__/Toast.test.d.ts +1 -0
  103. package/dist/lib/__tests__/Toast.test.js +135 -0
  104. package/dist/lib/__tests__/Tooltip.test.d.ts +1 -0
  105. package/dist/lib/__tests__/Tooltip.test.js +171 -0
  106. package/dist/lib/__tests__/Topbar.test.d.ts +1 -0
  107. package/dist/lib/__tests__/Topbar.test.js +25 -0
  108. package/dist/lib/__tests__/setupLangContext.d.ts +1 -0
  109. package/dist/lib/__tests__/setupLangContext.js +65 -0
  110. package/dist/lib/__tests__/storage.test.d.ts +1 -0
  111. package/dist/lib/__tests__/storage.test.js +124 -0
  112. package/dist/lib/__tests__/utils.test.d.ts +1 -0
  113. package/dist/lib/__tests__/utils.test.js +11 -0
  114. package/dist/lib/index.d.ts +1 -0
  115. package/dist/lib/index.js +1 -0
  116. package/dist/lib/lang.d.ts +4 -0
  117. package/dist/lib/lang.js +4 -0
  118. package/dist/styles.css +2 -0
  119. package/dist/utils/index.js +15 -4
  120. package/package.json +12 -12
@@ -0,0 +1,285 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
12
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ // $lib/__tests__/Menu.test.ts
38
+ import { render, fireEvent } from "@testing-library/svelte";
39
+ import { describe, it, expect, vi } from "vitest";
40
+ import Menu from "../Menu.svelte";
41
+ var menus = [
42
+ {
43
+ name: "File",
44
+ actions: [
45
+ "New",
46
+ { id: "open", label: "Open…" },
47
+ "Save",
48
+ {
49
+ id: "export",
50
+ label: "Export",
51
+ submenu: [
52
+ { id: "csv", label: "CSV" },
53
+ { id: "pdf", label: "PDF" },
54
+ ],
55
+ },
56
+ {
57
+ id: "convert",
58
+ label: "Convert",
59
+ submenu: ["DOC", "RTF"],
60
+ },
61
+ ],
62
+ },
63
+ {
64
+ name: "View",
65
+ actions: ["xs", "sm", "md", "lg", "xl"],
66
+ },
67
+ ];
68
+ var csvAction = { id: "csv", label: "CSV" };
69
+ var pdfAction = { id: "pdf", label: "PDF" };
70
+ var exportAction = {
71
+ id: "export",
72
+ label: "Export",
73
+ submenu: [csvAction, pdfAction],
74
+ };
75
+ var submenuMenus = [
76
+ {
77
+ name: "File",
78
+ actions: ["New", exportAction],
79
+ },
80
+ ];
81
+ describe("Menu", function () {
82
+ it("opens submenu on click and calls onSelect for action", function () { return __awaiter(void 0, void 0, void 0, function () {
83
+ var handle, _a, getByText, queryByText, fileBtn, openAction;
84
+ return __generator(this, function (_b) {
85
+ switch (_b.label) {
86
+ case 0:
87
+ handle = vi.fn();
88
+ _a = render(Menu, {
89
+ props: { menus: menus, onSelect: handle },
90
+ }), getByText = _a.getByText, queryByText = _a.queryByText;
91
+ fileBtn = getByText("File");
92
+ return [4 /*yield*/, fireEvent.click(fileBtn)];
93
+ case 1:
94
+ _b.sent();
95
+ expect(getByText("New")).toBeTruthy();
96
+ openAction = getByText("Open…");
97
+ return [4 /*yield*/, fireEvent.click(openAction)];
98
+ case 2:
99
+ _b.sent();
100
+ expect(handle).toHaveBeenCalledTimes(1);
101
+ expect(handle).toHaveBeenCalledWith("File", menus[0].actions[1]);
102
+ expect(queryByText("New")).toBeNull();
103
+ return [2 /*return*/];
104
+ }
105
+ });
106
+ }); });
107
+ it("closes menu on Escape and restores focus to trigger", function () { return __awaiter(void 0, void 0, void 0, function () {
108
+ var _a, getByText, queryByText, fileBtn, menuEl;
109
+ return __generator(this, function (_b) {
110
+ switch (_b.label) {
111
+ case 0:
112
+ _a = render(Menu, { props: { menus: menus } }), getByText = _a.getByText, queryByText = _a.queryByText;
113
+ fileBtn = getByText("File");
114
+ return [4 /*yield*/, fireEvent.click(fileBtn)];
115
+ case 1:
116
+ _b.sent();
117
+ expect(getByText("New")).toBeTruthy();
118
+ menuEl = getByText("New").closest('[role="menu"]');
119
+ expect(menuEl).toBeTruthy();
120
+ return [4 /*yield*/, fireEvent.keyDown(menuEl, { key: "Escape" })];
121
+ case 2:
122
+ _b.sent();
123
+ expect(queryByText("New")).toBeNull();
124
+ expect(document.activeElement).toBe(fileBtn);
125
+ return [2 /*return*/];
126
+ }
127
+ });
128
+ }); });
129
+ it("toggles submenu on repeated clicks", function () { return __awaiter(void 0, void 0, void 0, function () {
130
+ var _a, getByText, queryByText, fileBtn;
131
+ return __generator(this, function (_b) {
132
+ switch (_b.label) {
133
+ case 0:
134
+ _a = render(Menu, { props: { menus: menus } }), getByText = _a.getByText, queryByText = _a.queryByText;
135
+ fileBtn = getByText("File");
136
+ return [4 /*yield*/, fireEvent.click(fileBtn)];
137
+ case 1:
138
+ _b.sent();
139
+ expect(getByText("New")).toBeTruthy();
140
+ return [4 /*yield*/, fireEvent.click(fileBtn)];
141
+ case 2:
142
+ _b.sent();
143
+ expect(queryByText("New")).toBeNull();
144
+ return [2 /*return*/];
145
+ }
146
+ });
147
+ }); });
148
+ it("switches open menu on hover while another is open", function () { return __awaiter(void 0, void 0, void 0, function () {
149
+ var _a, getByText, queryByText, fileBtn, viewBtn;
150
+ return __generator(this, function (_b) {
151
+ switch (_b.label) {
152
+ case 0:
153
+ _a = render(Menu, { props: { menus: menus } }), getByText = _a.getByText, queryByText = _a.queryByText;
154
+ fileBtn = getByText("File");
155
+ viewBtn = getByText("View");
156
+ return [4 /*yield*/, fireEvent.click(fileBtn)];
157
+ case 1:
158
+ _b.sent();
159
+ expect(getByText("New")).toBeTruthy();
160
+ return [4 /*yield*/, fireEvent.mouseEnter(viewBtn)];
161
+ case 2:
162
+ _b.sent();
163
+ expect(queryByText("New")).toBeNull();
164
+ expect(getByText("md")).toBeTruthy();
165
+ return [2 /*return*/];
166
+ }
167
+ });
168
+ }); });
169
+ it("opens submenu and selects nested action", function () { return __awaiter(void 0, void 0, void 0, function () {
170
+ var handle, _a, getByText, queryByText, fileBtn;
171
+ return __generator(this, function (_b) {
172
+ switch (_b.label) {
173
+ case 0:
174
+ handle = vi.fn();
175
+ _a = render(Menu, {
176
+ props: { menus: submenuMenus, onSelect: handle },
177
+ }), getByText = _a.getByText, queryByText = _a.queryByText;
178
+ fileBtn = getByText("File");
179
+ return [4 /*yield*/, fireEvent.click(fileBtn)];
180
+ case 1:
181
+ _b.sent();
182
+ return [4 /*yield*/, fireEvent.click(getByText("Export"))];
183
+ case 2:
184
+ _b.sent();
185
+ return [4 /*yield*/, fireEvent.click(getByText("CSV"))];
186
+ case 3:
187
+ _b.sent();
188
+ expect(handle).toHaveBeenCalledWith("File", csvAction);
189
+ expect(queryByText("Export")).toBeNull();
190
+ return [2 /*return*/];
191
+ }
192
+ });
193
+ }); });
194
+ it("supports keyboard navigation into submenu", function () { return __awaiter(void 0, void 0, void 0, function () {
195
+ var handle, _a, getByText, queryByText, fileBtn, menuEl, subMenuEl;
196
+ return __generator(this, function (_b) {
197
+ switch (_b.label) {
198
+ case 0:
199
+ handle = vi.fn();
200
+ _a = render(Menu, {
201
+ props: { menus: submenuMenus, onSelect: handle },
202
+ }), getByText = _a.getByText, queryByText = _a.queryByText;
203
+ fileBtn = getByText("File");
204
+ return [4 /*yield*/, fireEvent.keyDown(fileBtn, { key: "ArrowDown" })];
205
+ case 1:
206
+ _b.sent();
207
+ expect(getByText("New")).toBeTruthy();
208
+ menuEl = getByText("New").closest('[role="menu"]');
209
+ expect(menuEl).toBeTruthy();
210
+ return [4 /*yield*/, fireEvent.keyDown(menuEl, { key: "ArrowDown" })];
211
+ case 2:
212
+ _b.sent();
213
+ return [4 /*yield*/, fireEvent.keyDown(menuEl, { key: "ArrowRight" })];
214
+ case 3:
215
+ _b.sent();
216
+ subMenuEl = getByText("CSV").closest('[role="menu"]');
217
+ expect(subMenuEl).toBeTruthy();
218
+ return [4 /*yield*/, fireEvent.keyDown(subMenuEl, { key: "Enter" })];
219
+ case 4:
220
+ _b.sent();
221
+ expect(handle).toHaveBeenCalledWith("File", csvAction);
222
+ expect(queryByText("Export")).toBeNull();
223
+ return [2 /*return*/];
224
+ }
225
+ });
226
+ }); });
227
+ it("applies size styling from sz prop to the menu bar", function () {
228
+ var getByText = render(Menu, { props: { menus: menus, sz: "md" } }).getByText;
229
+ var nav = getByText("View").closest("nav");
230
+ expect(nav === null || nav === void 0 ? void 0 : nav.className).toContain("h-[calc(var(--spacing-xl)+var(--spacing-xs))]");
231
+ expect(nav === null || nav === void 0 ? void 0 : nav.className).toContain("[font-size:var(--text-md)]");
232
+ });
233
+ it("ignores separators during interaction", function () { return __awaiter(void 0, void 0, void 0, function () {
234
+ var handle, menusWithSep, _a, getByText, queryByRole, sep;
235
+ return __generator(this, function (_b) {
236
+ switch (_b.label) {
237
+ case 0:
238
+ handle = vi.fn();
239
+ menusWithSep = [
240
+ {
241
+ name: "File",
242
+ actions: ["One", { type: "separator" }, "Two"],
243
+ },
244
+ ];
245
+ _a = render(Menu, {
246
+ props: { menus: menusWithSep, onSelect: handle },
247
+ }), getByText = _a.getByText, queryByRole = _a.queryByRole;
248
+ return [4 /*yield*/, fireEvent.click(getByText("File"))];
249
+ case 1:
250
+ _b.sent();
251
+ sep = queryByRole("separator");
252
+ expect(sep).toBeTruthy();
253
+ return [4 /*yield*/, fireEvent.click(sep)];
254
+ case 2:
255
+ _b.sent();
256
+ expect(handle).not.toHaveBeenCalled();
257
+ return [2 /*return*/];
258
+ }
259
+ });
260
+ }); });
261
+ it("switches between submenus on hover", function () { return __awaiter(void 0, void 0, void 0, function () {
262
+ var _a, getByText, queryByText;
263
+ return __generator(this, function (_b) {
264
+ switch (_b.label) {
265
+ case 0:
266
+ _a = render(Menu, {
267
+ props: { menus: menus },
268
+ }), getByText = _a.getByText, queryByText = _a.queryByText;
269
+ return [4 /*yield*/, fireEvent.click(getByText("File"))];
270
+ case 1:
271
+ _b.sent();
272
+ return [4 /*yield*/, fireEvent.click(getByText("Export"))];
273
+ case 2:
274
+ _b.sent();
275
+ expect(getByText("CSV")).toBeTruthy();
276
+ return [4 /*yield*/, fireEvent.click(getByText("Convert"))];
277
+ case 3:
278
+ _b.sent();
279
+ expect(queryByText("CSV")).toBeNull();
280
+ expect(getByText("DOC")).toBeTruthy();
281
+ return [2 /*return*/];
282
+ }
283
+ });
284
+ }); });
285
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,60 @@
1
+ // $lib/__tests__/NoticeBase.test.ts
2
+ import { render } from "@testing-library/svelte";
3
+ import { describe, it, expect } from "vitest";
4
+ import NoticeBase from "../NoticeBase.svelte";
5
+ describe("NoticeBase", function () {
6
+ it("renders title and message", function () {
7
+ var getByText = render(NoticeBase, {
8
+ props: { title: "Heads up", message: "Something happened" },
9
+ }).getByText;
10
+ expect(getByText("Heads up")).toBeTruthy();
11
+ expect(getByText("Something happened")).toBeTruthy();
12
+ });
13
+ it("toggles icon visibility with showIcon", function () {
14
+ var _a = render(NoticeBase, {
15
+ props: { message: "Icon on" },
16
+ }), container = _a.container, unmount = _a.unmount;
17
+ expect(container.querySelector('span[aria-hidden="true"]')).toBeTruthy();
18
+ unmount();
19
+ var noIconContainer = render(NoticeBase, {
20
+ props: { message: "Icon off", showIcon: false },
21
+ }).container;
22
+ expect(noIconContainer.querySelector('span[aria-hidden="true"]')).toBeNull();
23
+ });
24
+ it("applies inline and size styles", function () {
25
+ var _a = render(NoticeBase, {
26
+ props: { message: "Inline", inline: true },
27
+ }), container = _a.container, unmount = _a.unmount;
28
+ var inlineRoot = container.firstElementChild;
29
+ expect(inlineRoot.className).not.toContain("shadow-lg");
30
+ unmount();
31
+ var sized = render(NoticeBase, {
32
+ props: { message: "Sized", size: "md" },
33
+ }).container;
34
+ var sizedRoot = sized.firstElementChild;
35
+ expect(sizedRoot.className).toContain("px-[var(--spacing-md)]");
36
+ });
37
+ it("applies variant styling classes", function () {
38
+ var variants = [
39
+ { variant: "success", token: "color-bg-success" },
40
+ { variant: "danger", token: "color-bg-danger" },
41
+ { variant: "warning", token: "color-bg-warning" },
42
+ { variant: "info", token: "color-bg-page" },
43
+ ];
44
+ variants.forEach(function (_a) {
45
+ var variant = _a.variant, token = _a.token;
46
+ var container = render(NoticeBase, {
47
+ props: { message: "Notice", variant: variant },
48
+ }).container;
49
+ var root = container.firstElementChild;
50
+ expect(root.className).toContain(token);
51
+ });
52
+ });
53
+ it("exposes status role", function () {
54
+ var getByRole = render(NoticeBase, {
55
+ props: { message: "Status" },
56
+ }).getByRole;
57
+ var notice = getByRole("status");
58
+ expect(notice.getAttribute("aria-live")).toBe("polite");
59
+ });
60
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,89 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
12
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ // src/lib/__tests__/PaginatedCard.test.ts
38
+ import { render, fireEvent } from "@testing-library/svelte";
39
+ import { describe, it, expect } from "vitest";
40
+ import { createRawSnippet } from "svelte";
41
+ import { tick } from "svelte";
42
+ import PaginatedCard from "../PaginatedCard.svelte";
43
+ var textSnippet = function (text) {
44
+ return createRawSnippet(function () { return ({ render: function () { return "<span>".concat(text, "</span>"); } }); });
45
+ };
46
+ var items = [
47
+ textSnippet("Item 1"),
48
+ textSnippet("Item 2"),
49
+ textSnippet("Item 3"),
50
+ textSnippet("Item 4"),
51
+ textSnippet("Item 5"),
52
+ ];
53
+ describe("PaginatedCard", function () {
54
+ it("renders first page and pagination count", function () {
55
+ var getByText = render(PaginatedCard, {
56
+ props: { items: items, itemsPerPage: 2 },
57
+ }).getByText;
58
+ expect(getByText("Item 1")).toBeTruthy();
59
+ expect(getByText("Item 2")).toBeTruthy();
60
+ expect(getByText("Page 1 of 3")).toBeTruthy();
61
+ });
62
+ it("changes page when next is clicked", function () { return __awaiter(void 0, void 0, void 0, function () {
63
+ var _a, getByText, queryByText;
64
+ return __generator(this, function (_b) {
65
+ switch (_b.label) {
66
+ case 0:
67
+ _a = render(PaginatedCard, {
68
+ props: { items: items, itemsPerPage: 2 },
69
+ }), getByText = _a.getByText, queryByText = _a.queryByText;
70
+ return [4 /*yield*/, fireEvent.click(getByText(">"))];
71
+ case 1:
72
+ _b.sent();
73
+ return [4 /*yield*/, tick()];
74
+ case 2:
75
+ _b.sent();
76
+ expect(queryByText("Item 1")).toBeNull();
77
+ expect(getByText("Item 3")).toBeTruthy();
78
+ expect(getByText("Item 4")).toBeTruthy();
79
+ return [2 /*return*/];
80
+ }
81
+ });
82
+ }); });
83
+ it("shows at least one page for empty items", function () {
84
+ var getByText = render(PaginatedCard, {
85
+ props: { items: [], itemsPerPage: 3 },
86
+ }).getByText;
87
+ expect(getByText("Page 1 of 1")).toBeTruthy();
88
+ });
89
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,168 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ var __generator = (this && this.__generator) || function (thisArg, body) {
11
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === "function" ? Iterator : Object).prototype);
12
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
13
+ function verb(n) { return function (v) { return step([n, v]); }; }
14
+ function step(op) {
15
+ if (f) throw new TypeError("Generator is already executing.");
16
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
17
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
18
+ if (y = 0, t) op = [op[0] & 2, t.value];
19
+ switch (op[0]) {
20
+ case 0: case 1: t = op; break;
21
+ case 4: _.label++; return { value: op[1], done: false };
22
+ case 5: _.label++; y = op[1]; op = [0]; continue;
23
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
24
+ default:
25
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
26
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
27
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
28
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
29
+ if (t[2]) _.ops.pop();
30
+ _.trys.pop(); continue;
31
+ }
32
+ op = body.call(thisArg, _);
33
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
34
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
35
+ }
36
+ };
37
+ // $lib/__tests__/Pagination.test.ts
38
+ import { render, fireEvent } from "@testing-library/svelte";
39
+ import { describe, it, expect, vi } from "vitest";
40
+ import Pagination from "../Pagination.svelte";
41
+ describe("Pagination", function () {
42
+ it("renders current page and total pages", function () {
43
+ var getByText = render(Pagination, {
44
+ props: { currentPage: 2, totalPages: 5, onPageChange: vi.fn() },
45
+ }).getByText;
46
+ expect(getByText("Page 2 of 5")).toBeTruthy();
47
+ });
48
+ it("renders page buttons for visible pages", function () {
49
+ var getAllByRole = render(Pagination, {
50
+ props: { currentPage: 2, totalPages: 5, onPageChange: vi.fn() },
51
+ }).getAllByRole;
52
+ var buttons = getAllByRole("button");
53
+ expect(buttons.length).toBeGreaterThan(2);
54
+ });
55
+ it("calls onPageChange when page button is clicked", function () { return __awaiter(void 0, void 0, void 0, function () {
56
+ var onPageChange, getByText, page3Button;
57
+ return __generator(this, function (_a) {
58
+ switch (_a.label) {
59
+ case 0:
60
+ onPageChange = vi.fn();
61
+ getByText = render(Pagination, {
62
+ props: { currentPage: 2, totalPages: 5, onPageChange: onPageChange },
63
+ }).getByText;
64
+ page3Button = getByText("3");
65
+ return [4 /*yield*/, fireEvent.click(page3Button)];
66
+ case 1:
67
+ _a.sent();
68
+ expect(onPageChange).toHaveBeenCalledWith(3);
69
+ return [2 /*return*/];
70
+ }
71
+ });
72
+ }); });
73
+ it("calls onPageChange when next button is clicked", function () { return __awaiter(void 0, void 0, void 0, function () {
74
+ var onPageChange, getByRole, nextButton;
75
+ return __generator(this, function (_a) {
76
+ switch (_a.label) {
77
+ case 0:
78
+ onPageChange = vi.fn();
79
+ getByRole = render(Pagination, {
80
+ props: { currentPage: 2, totalPages: 5, onPageChange: onPageChange },
81
+ }).getByRole;
82
+ nextButton = getByRole("button", { name: ">" });
83
+ return [4 /*yield*/, fireEvent.click(nextButton)];
84
+ case 1:
85
+ _a.sent();
86
+ expect(onPageChange).toHaveBeenCalledWith(3);
87
+ return [2 /*return*/];
88
+ }
89
+ });
90
+ }); });
91
+ it("calls onPageChange when previous button is clicked", function () { return __awaiter(void 0, void 0, void 0, function () {
92
+ var onPageChange, getByRole, prevButton;
93
+ return __generator(this, function (_a) {
94
+ switch (_a.label) {
95
+ case 0:
96
+ onPageChange = vi.fn();
97
+ getByRole = render(Pagination, {
98
+ props: { currentPage: 2, totalPages: 5, onPageChange: onPageChange },
99
+ }).getByRole;
100
+ prevButton = getByRole("button", { name: "<" });
101
+ return [4 /*yield*/, fireEvent.click(prevButton)];
102
+ case 1:
103
+ _a.sent();
104
+ expect(onPageChange).toHaveBeenCalledWith(1);
105
+ return [2 /*return*/];
106
+ }
107
+ });
108
+ }); });
109
+ it("disables previous button on first page", function () {
110
+ var getByRole = render(Pagination, {
111
+ props: { currentPage: 1, totalPages: 5, onPageChange: vi.fn() },
112
+ }).getByRole;
113
+ var prevButton = getByRole("button", { name: "<" });
114
+ expect(prevButton.disabled).toBe(true);
115
+ });
116
+ it("disables next button on last page", function () {
117
+ var getByRole = render(Pagination, {
118
+ props: { currentPage: 5, totalPages: 5, onPageChange: vi.fn() },
119
+ }).getByRole;
120
+ var nextButton = getByRole("button", { name: ">" });
121
+ expect(nextButton.disabled).toBe(true);
122
+ });
123
+ it("shows correct visible pages for many pages", function () {
124
+ var _a = render(Pagination, {
125
+ props: { currentPage: 5, totalPages: 10, onPageChange: vi.fn() },
126
+ }), getByText = _a.getByText, queryByText = _a.queryByText;
127
+ expect(getByText("4")).toBeTruthy();
128
+ expect(getByText("5")).toBeTruthy();
129
+ expect(getByText("6")).toBeTruthy();
130
+ expect(queryByText("1")).toBeNull();
131
+ expect(queryByText("10")).toBeNull();
132
+ });
133
+ it("shows all pages when total pages is less than max visible", function () {
134
+ var getByText = render(Pagination, {
135
+ props: { currentPage: 1, totalPages: 3, onPageChange: vi.fn() },
136
+ }).getByText;
137
+ expect(getByText("1")).toBeTruthy();
138
+ expect(getByText("2")).toBeTruthy();
139
+ expect(getByText("3")).toBeTruthy();
140
+ });
141
+ it("applies custom class", function () {
142
+ var container = render(Pagination, {
143
+ props: {
144
+ currentPage: 1,
145
+ totalPages: 3,
146
+ onPageChange: vi.fn(),
147
+ class: "custom-pagination",
148
+ },
149
+ }).container;
150
+ var wrapper = container.firstChild;
151
+ expect(wrapper.className).toContain("custom-pagination");
152
+ });
153
+ it("highlights current page with active class", function () {
154
+ var getByRole = render(Pagination, {
155
+ props: { currentPage: 2, totalPages: 5, onPageChange: vi.fn() },
156
+ }).getByRole;
157
+ var currentPageButton = getByRole("button", { name: "2" });
158
+ expect(currentPageButton.className).toContain("bg-[var(--color-bg-primary)]");
159
+ expect(currentPageButton.className).toContain("text-[var(--color-text-inverse,#fff)]");
160
+ });
161
+ it("sets aria-current for current page", function () {
162
+ var getByRole = render(Pagination, {
163
+ props: { currentPage: 2, totalPages: 5, onPageChange: vi.fn() },
164
+ }).getByRole;
165
+ var currentPageButton = getByRole("button", { name: "2" });
166
+ expect(currentPageButton.getAttribute("aria-current")).toBe("page");
167
+ });
168
+ });
@@ -0,0 +1 @@
1
+ import "./setupLangContext";