svelte-comp 1.3.3 → 1.3.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 (138) hide show
  1. package/LICENSE.md +21 -21
  2. package/README.md +101 -100
  3. package/dist/App.svelte +507 -507
  4. package/dist/Container.svelte +59 -59
  5. package/dist/app.css +234 -235
  6. package/dist/app.d.ts +10 -0
  7. package/dist/lib/Accordion.svelte +155 -155
  8. package/dist/lib/Badge.svelte +44 -44
  9. package/dist/lib/Button.svelte +185 -170
  10. package/dist/lib/Calendar.svelte +384 -384
  11. package/dist/lib/Card.svelte +103 -103
  12. package/dist/lib/Carousel.svelte +293 -293
  13. package/dist/lib/Carousel.svelte.d.ts +1 -1
  14. package/dist/lib/CheckBox.svelte +210 -210
  15. package/dist/lib/CodeView.svelte +308 -307
  16. package/dist/lib/ColorPicker.svelte +159 -159
  17. package/dist/lib/ContextMenu.svelte +328 -322
  18. package/dist/lib/DatePicker.svelte +246 -246
  19. package/dist/lib/Dialog.svelte +233 -233
  20. package/dist/lib/Field.svelte +299 -299
  21. package/dist/lib/FilePicker.svelte +295 -240
  22. package/dist/lib/FilePicker.svelte.d.ts +6 -1
  23. package/dist/lib/Form.svelte +438 -438
  24. package/dist/lib/Hamburger.svelte +217 -217
  25. package/dist/lib/InstallPWA.svelte +94 -94
  26. package/dist/lib/Menu.svelte +623 -623
  27. package/dist/lib/NoticeBase.svelte +140 -140
  28. package/dist/lib/PaginatedCard.svelte +73 -73
  29. package/dist/lib/Pagination.svelte +119 -119
  30. package/dist/lib/PrimaryColorSelect.svelte +111 -111
  31. package/dist/lib/ProgressBar.svelte +141 -141
  32. package/dist/lib/ProgressCircle.svelte +190 -190
  33. package/dist/lib/Radio.svelte +189 -189
  34. package/dist/lib/SearchInput.svelte +104 -104
  35. package/dist/lib/Select.svelte +524 -524
  36. package/dist/lib/Slider.svelte +253 -253
  37. package/dist/lib/Splitter.svelte +159 -150
  38. package/dist/lib/Switch.svelte +168 -167
  39. package/dist/lib/Table.svelte +299 -299
  40. package/dist/lib/Tabs.svelte +213 -213
  41. package/dist/lib/ThemeToggle.svelte +128 -127
  42. package/dist/lib/TimePicker.svelte +312 -312
  43. package/dist/lib/TimePickerNew.svelte +634 -0
  44. package/dist/lib/TimePickerNew.svelte.d.ts +49 -0
  45. package/dist/lib/Toast.svelte +123 -123
  46. package/dist/lib/Tooltip.svelte +110 -110
  47. package/dist/lib/Topbar.svelte +107 -107
  48. package/dist/lib/__tests__/Accordion.test.d.ts +1 -0
  49. package/dist/lib/__tests__/Accordion.test.js +171 -0
  50. package/dist/lib/__tests__/Badge.test.d.ts +1 -0
  51. package/dist/lib/__tests__/Badge.test.js +41 -0
  52. package/dist/lib/__tests__/Button.test.d.ts +1 -0
  53. package/dist/lib/__tests__/Button.test.js +269 -0
  54. package/dist/lib/__tests__/Calendar.test.d.ts +1 -0
  55. package/dist/lib/__tests__/Calendar.test.js +171 -0
  56. package/dist/lib/__tests__/Card.test.d.ts +1 -0
  57. package/dist/lib/__tests__/Card.test.js +148 -0
  58. package/dist/lib/__tests__/Carousel.test.d.ts +1 -0
  59. package/dist/lib/__tests__/Carousel.test.js +439 -0
  60. package/dist/lib/__tests__/CheckBox.test.d.ts +1 -0
  61. package/dist/lib/__tests__/CheckBox.test.js +152 -0
  62. package/dist/lib/__tests__/CodeView.test.d.ts +1 -0
  63. package/dist/lib/__tests__/CodeView.test.js +157 -0
  64. package/dist/lib/__tests__/ColorPicker.test.d.ts +1 -0
  65. package/dist/lib/__tests__/ColorPicker.test.js +93 -0
  66. package/dist/lib/__tests__/ContextMenu.test.d.ts +1 -0
  67. package/dist/lib/__tests__/ContextMenu.test.js +67 -0
  68. package/dist/lib/__tests__/DatePicker.test.d.ts +1 -0
  69. package/dist/lib/__tests__/DatePicker.test.js +108 -0
  70. package/dist/lib/__tests__/Dialog.test.d.ts +1 -0
  71. package/dist/lib/__tests__/Dialog.test.js +183 -0
  72. package/dist/lib/__tests__/Field.test.d.ts +1 -0
  73. package/dist/lib/__tests__/Field.test.js +190 -0
  74. package/dist/lib/__tests__/FilePicker.test.d.ts +1 -0
  75. package/dist/lib/__tests__/FilePicker.test.js +179 -0
  76. package/dist/lib/__tests__/Form.integration.test.d.ts +1 -0
  77. package/dist/lib/__tests__/Form.integration.test.js +158 -0
  78. package/dist/lib/__tests__/Form.test.d.ts +1 -0
  79. package/dist/lib/__tests__/Form.test.js +463 -0
  80. package/dist/lib/__tests__/Hamburger.test.d.ts +1 -0
  81. package/dist/lib/__tests__/Hamburger.test.js +161 -0
  82. package/dist/lib/__tests__/InstallPWA.test.d.ts +1 -0
  83. package/dist/lib/__tests__/InstallPWA.test.js +15 -0
  84. package/dist/lib/__tests__/Menu.test.d.ts +1 -0
  85. package/dist/lib/__tests__/Menu.test.js +285 -0
  86. package/dist/lib/__tests__/NoticeBase.test.d.ts +1 -0
  87. package/dist/lib/__tests__/NoticeBase.test.js +60 -0
  88. package/dist/lib/__tests__/PaginatedCard.test.d.ts +1 -0
  89. package/dist/lib/__tests__/PaginatedCard.test.js +89 -0
  90. package/dist/lib/__tests__/Pagination.test.d.ts +1 -0
  91. package/dist/lib/__tests__/Pagination.test.js +168 -0
  92. package/dist/lib/__tests__/PrimaryColorSelect.test.d.ts +1 -0
  93. package/dist/lib/__tests__/PrimaryColorSelect.test.js +92 -0
  94. package/dist/lib/__tests__/ProgressBar.test.d.ts +1 -0
  95. package/dist/lib/__tests__/ProgressBar.test.js +69 -0
  96. package/dist/lib/__tests__/ProgressCircle.test.d.ts +1 -0
  97. package/dist/lib/__tests__/ProgressCircle.test.js +71 -0
  98. package/dist/lib/__tests__/Radio.test.d.ts +1 -0
  99. package/dist/lib/__tests__/Radio.test.js +127 -0
  100. package/dist/lib/__tests__/SearchInput.test.d.ts +1 -0
  101. package/dist/lib/__tests__/SearchInput.test.js +80 -0
  102. package/dist/lib/__tests__/Select.test.d.ts +1 -0
  103. package/dist/lib/__tests__/Select.test.js +408 -0
  104. package/dist/lib/__tests__/Slider.test.d.ts +1 -0
  105. package/dist/lib/__tests__/Slider.test.js +213 -0
  106. package/dist/lib/__tests__/Splitter.test.d.ts +1 -0
  107. package/dist/lib/__tests__/Splitter.test.js +87 -0
  108. package/dist/lib/__tests__/Switch.test.d.ts +1 -0
  109. package/dist/lib/__tests__/Switch.test.js +97 -0
  110. package/dist/lib/__tests__/Table.test.d.ts +1 -0
  111. package/dist/lib/__tests__/Table.test.js +349 -0
  112. package/dist/lib/__tests__/Tabs.test.d.ts +1 -0
  113. package/dist/lib/__tests__/Tabs.test.js +262 -0
  114. package/dist/lib/__tests__/ThemeToggle.test.d.ts +1 -0
  115. package/dist/lib/__tests__/ThemeToggle.test.js +84 -0
  116. package/dist/lib/__tests__/TimePicker.test.d.ts +1 -0
  117. package/dist/lib/__tests__/TimePicker.test.js +146 -0
  118. package/dist/lib/__tests__/TimePickerNew.test.d.ts +1 -0
  119. package/dist/lib/__tests__/TimePickerNew.test.js +322 -0
  120. package/dist/lib/__tests__/Toast.test.d.ts +1 -0
  121. package/dist/lib/__tests__/Toast.test.js +135 -0
  122. package/dist/lib/__tests__/Tooltip.test.d.ts +1 -0
  123. package/dist/lib/__tests__/Tooltip.test.js +171 -0
  124. package/dist/lib/__tests__/Topbar.test.d.ts +1 -0
  125. package/dist/lib/__tests__/Topbar.test.js +25 -0
  126. package/dist/lib/__tests__/setupLangContext.d.ts +1 -0
  127. package/dist/lib/__tests__/setupLangContext.js +65 -0
  128. package/dist/lib/__tests__/storage.test.d.ts +1 -0
  129. package/dist/lib/__tests__/storage.test.js +124 -0
  130. package/dist/lib/__tests__/utils.test.d.ts +1 -0
  131. package/dist/lib/__tests__/utils.test.js +11 -0
  132. package/dist/lib/index.d.ts +1 -0
  133. package/dist/lib/index.js +1 -0
  134. package/dist/lib/lang.d.ts +4 -0
  135. package/dist/lib/lang.js +4 -0
  136. package/dist/styles.css +234 -232
  137. package/dist/utils/index.js +15 -4
  138. package/package.json +52 -52
@@ -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";