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,408 @@
1
+ var __assign = (this && this.__assign) || function () {
2
+ __assign = Object.assign || function(t) {
3
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
4
+ s = arguments[i];
5
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
6
+ t[p] = s[p];
7
+ }
8
+ return t;
9
+ };
10
+ return __assign.apply(this, arguments);
11
+ };
12
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
13
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
14
+ return new (P || (P = Promise))(function (resolve, reject) {
15
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
16
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
17
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
18
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
19
+ });
20
+ };
21
+ var __generator = (this && this.__generator) || function (thisArg, body) {
22
+ 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);
23
+ return g.next = verb(0), g["throw"] = verb(1), g["return"] = verb(2), typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
24
+ function verb(n) { return function (v) { return step([n, v]); }; }
25
+ function step(op) {
26
+ if (f) throw new TypeError("Generator is already executing.");
27
+ while (g && (g = 0, op[0] && (_ = 0)), _) try {
28
+ 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;
29
+ if (y = 0, t) op = [op[0] & 2, t.value];
30
+ switch (op[0]) {
31
+ case 0: case 1: t = op; break;
32
+ case 4: _.label++; return { value: op[1], done: false };
33
+ case 5: _.label++; y = op[1]; op = [0]; continue;
34
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
35
+ default:
36
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
37
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
38
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
39
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
40
+ if (t[2]) _.ops.pop();
41
+ _.trys.pop(); continue;
42
+ }
43
+ op = body.call(thisArg, _);
44
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
45
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
46
+ }
47
+ };
48
+ // $lib/__tests__/Select.test.ts
49
+ import { render, fireEvent } from "@testing-library/svelte";
50
+ import { describe, it, expect, vi } from "vitest";
51
+ import Select from "../Select.svelte";
52
+ var baseOptions = [
53
+ { label: "One", value: "1" },
54
+ { label: "Two", value: "2" },
55
+ { label: "Disabled Option", value: "3", disabled: true },
56
+ ];
57
+ var renderSelect = function (props) {
58
+ if (props === void 0) { props = {}; }
59
+ return render(Select, {
60
+ props: __assign({ label: "Choose something", placeholder: "Pick a value", options: baseOptions }, props),
61
+ });
62
+ };
63
+ describe("Select (combobox)", function () {
64
+ it("renders label and placeholder text", function () {
65
+ var _a = renderSelect(), getByText = _a.getByText, getByRole = _a.getByRole;
66
+ expect(getByText("Choose something")).toBeTruthy();
67
+ expect(getByRole("combobox").textContent).toContain("Pick a value");
68
+ });
69
+ it("opens listbox and shows options on click", function () { return __awaiter(void 0, void 0, void 0, function () {
70
+ var _a, getByRole, getAllByRole, trigger, listbox;
71
+ return __generator(this, function (_b) {
72
+ switch (_b.label) {
73
+ case 0:
74
+ _a = renderSelect(), getByRole = _a.getByRole, getAllByRole = _a.getAllByRole;
75
+ trigger = getByRole("combobox");
76
+ return [4 /*yield*/, fireEvent.click(trigger)];
77
+ case 1:
78
+ _b.sent();
79
+ listbox = getByRole("listbox");
80
+ expect(listbox).toBeTruthy();
81
+ expect(getAllByRole("option")).toHaveLength(baseOptions.length);
82
+ expect(trigger.getAttribute("aria-expanded")).toBe("true");
83
+ return [2 /*return*/];
84
+ }
85
+ });
86
+ }); });
87
+ it("opens listbox via keyboard (Space and Enter)", function () { return __awaiter(void 0, void 0, void 0, function () {
88
+ var getByRole, trigger;
89
+ return __generator(this, function (_a) {
90
+ switch (_a.label) {
91
+ case 0:
92
+ getByRole = renderSelect({ id: "kb-open" }).getByRole;
93
+ trigger = getByRole("combobox");
94
+ return [4 /*yield*/, fireEvent.keyDown(trigger, { key: " " })];
95
+ case 1:
96
+ _a.sent();
97
+ expect(getByRole("listbox")).toBeTruthy();
98
+ expect(trigger.getAttribute("aria-expanded")).toBe("true");
99
+ return [4 /*yield*/, fireEvent.keyDown(getByRole("listbox"), { key: "Escape" })];
100
+ case 2:
101
+ _a.sent();
102
+ expect(trigger.getAttribute("aria-expanded")).toBe("false");
103
+ return [4 /*yield*/, fireEvent.keyDown(trigger, { key: "Enter" })];
104
+ case 3:
105
+ _a.sent();
106
+ expect(getByRole("listbox")).toBeTruthy();
107
+ expect(trigger.getAttribute("aria-expanded")).toBe("true");
108
+ return [2 /*return*/];
109
+ }
110
+ });
111
+ }); });
112
+ it("updates value, hidden input and calls onChange when selecting an option", function () { return __awaiter(void 0, void 0, void 0, function () {
113
+ var handle, _a, getByRole, container, listbox, optionButtons, second, hidden;
114
+ return __generator(this, function (_b) {
115
+ switch (_b.label) {
116
+ case 0:
117
+ handle = vi.fn();
118
+ _a = renderSelect({ onChange: handle }), getByRole = _a.getByRole, container = _a.container;
119
+ return [4 /*yield*/, fireEvent.click(getByRole("combobox"))];
120
+ case 1:
121
+ _b.sent();
122
+ listbox = getByRole("listbox");
123
+ optionButtons = Array.from(listbox.querySelectorAll("button"));
124
+ second = optionButtons.find(function (btn) { var _a; return (_a = btn.textContent) === null || _a === void 0 ? void 0 : _a.includes("Two"); });
125
+ expect(second).toBeTruthy();
126
+ return [4 /*yield*/, fireEvent.click(second)];
127
+ case 2:
128
+ _b.sent();
129
+ expect(handle).toHaveBeenCalledWith("2");
130
+ expect(getByRole("combobox").textContent).toContain("Two");
131
+ hidden = container.querySelector('input[type="hidden"]');
132
+ expect(hidden === null || hidden === void 0 ? void 0 : hidden.value).toBe("2");
133
+ expect(container.querySelector('[role="listbox"]')).toBeNull();
134
+ return [2 /*return*/];
135
+ }
136
+ });
137
+ }); });
138
+ it("ignores clicks on disabled option", function () { return __awaiter(void 0, void 0, void 0, function () {
139
+ var handle, getByRole, listbox, disabled;
140
+ return __generator(this, function (_a) {
141
+ switch (_a.label) {
142
+ case 0:
143
+ handle = vi.fn();
144
+ getByRole = renderSelect({ onChange: handle }).getByRole;
145
+ return [4 /*yield*/, fireEvent.click(getByRole("combobox"))];
146
+ case 1:
147
+ _a.sent();
148
+ listbox = getByRole("listbox");
149
+ disabled = Array.from(listbox.querySelectorAll("button")).find(function (btn) { var _a; return (_a = btn.textContent) === null || _a === void 0 ? void 0 : _a.includes("Disabled"); });
150
+ expect(disabled === null || disabled === void 0 ? void 0 : disabled.getAttribute("disabled")).not.toBeNull();
151
+ return [4 /*yield*/, fireEvent.click(disabled)];
152
+ case 2:
153
+ _a.sent();
154
+ expect(handle).not.toHaveBeenCalled();
155
+ return [2 /*return*/];
156
+ }
157
+ });
158
+ }); });
159
+ it("shows selected label when value prop is set and syncs hidden input", function () {
160
+ var _a = renderSelect({ value: "2" }), getByRole = _a.getByRole, container = _a.container;
161
+ var trigger = getByRole("combobox");
162
+ expect(trigger.textContent).toContain("Two");
163
+ var hidden = container.querySelector('input[type="hidden"]');
164
+ expect(hidden === null || hidden === void 0 ? void 0 : hidden.value).toBe("2");
165
+ });
166
+ it("updates displayed value when value prop changes externally", function () { return __awaiter(void 0, void 0, void 0, function () {
167
+ var _a, getByRole, rerender, trigger;
168
+ return __generator(this, function (_b) {
169
+ switch (_b.label) {
170
+ case 0:
171
+ _a = renderSelect({ value: "1" }), getByRole = _a.getByRole, rerender = _a.rerender;
172
+ trigger = getByRole("combobox");
173
+ expect(trigger.textContent).toContain("One");
174
+ return [4 /*yield*/, rerender({ value: "2" })];
175
+ case 1:
176
+ _b.sent();
177
+ expect(trigger.textContent).toContain("Two");
178
+ return [2 /*return*/];
179
+ }
180
+ });
181
+ }); });
182
+ it("forwards describedBy/invalid/required props and renders help", function () {
183
+ var _a = renderSelect({
184
+ describedBy: "helper-id",
185
+ help: "Helper text",
186
+ invalid: true,
187
+ required: true,
188
+ }), getByRole = _a.getByRole, getByText = _a.getByText;
189
+ var trigger = getByRole("combobox");
190
+ expect(trigger.getAttribute("aria-describedby")).toBe("helper-id");
191
+ expect(trigger.getAttribute("aria-invalid")).toBe("true");
192
+ expect(trigger.getAttribute("aria-required")).toBe("true");
193
+ var help = getByText("Helper text");
194
+ expect(help.id).toBe("helper-id");
195
+ });
196
+ it("does not open when disabled prop is true", function () { return __awaiter(void 0, void 0, void 0, function () {
197
+ var _a, getByRole, queryByRole, trigger;
198
+ return __generator(this, function (_b) {
199
+ switch (_b.label) {
200
+ case 0:
201
+ _a = renderSelect({ disabled: true }), getByRole = _a.getByRole, queryByRole = _a.queryByRole;
202
+ trigger = getByRole("combobox");
203
+ return [4 /*yield*/, fireEvent.click(trigger)];
204
+ case 1:
205
+ _b.sent();
206
+ expect(queryByRole("listbox")).toBeNull();
207
+ return [4 /*yield*/, fireEvent.keyDown(trigger, { key: "ArrowDown" })];
208
+ case 2:
209
+ _b.sent();
210
+ expect(queryByRole("listbox")).toBeNull();
211
+ return [2 /*return*/];
212
+ }
213
+ });
214
+ }); });
215
+ it("closes when clicking overlay backdrop", function () { return __awaiter(void 0, void 0, void 0, function () {
216
+ var _a, getByRole, queryByRole, container, trigger, overlay;
217
+ return __generator(this, function (_b) {
218
+ switch (_b.label) {
219
+ case 0:
220
+ _a = renderSelect(), getByRole = _a.getByRole, queryByRole = _a.queryByRole, container = _a.container;
221
+ trigger = getByRole("combobox");
222
+ return [4 /*yield*/, fireEvent.click(trigger)];
223
+ case 1:
224
+ _b.sent();
225
+ overlay = container.querySelector('[role="presentation"]');
226
+ expect(overlay).toBeTruthy();
227
+ return [4 /*yield*/, fireEvent.click(overlay)];
228
+ case 2:
229
+ _b.sent();
230
+ expect(queryByRole("listbox")).toBeNull();
231
+ expect(trigger.getAttribute("aria-expanded")).toBe("false");
232
+ return [2 /*return*/];
233
+ }
234
+ });
235
+ }); });
236
+ it("supports ArrowDown/ArrowUp from trigger and sets aria-activedescendant", function () { return __awaiter(void 0, void 0, void 0, function () {
237
+ var getByRole, trigger, listbox;
238
+ return __generator(this, function (_a) {
239
+ switch (_a.label) {
240
+ case 0:
241
+ getByRole = renderSelect({ id: "custom-select" }).getByRole;
242
+ trigger = getByRole("combobox");
243
+ return [4 /*yield*/, fireEvent.keyDown(trigger, { key: "ArrowDown" })];
244
+ case 1:
245
+ _a.sent();
246
+ listbox = getByRole("listbox");
247
+ expect(trigger.getAttribute("aria-expanded")).toBe("true");
248
+ expect(listbox.getAttribute("aria-activedescendant")).toBe("custom-select-opt-0");
249
+ return [4 /*yield*/, fireEvent.keyDown(listbox, { key: "ArrowDown" })];
250
+ case 2:
251
+ _a.sent();
252
+ expect(listbox.getAttribute("aria-activedescendant")).toBe("custom-select-opt-1");
253
+ return [4 /*yield*/, fireEvent.keyDown(listbox, { key: "ArrowUp" })];
254
+ case 3:
255
+ _a.sent();
256
+ expect(listbox.getAttribute("aria-activedescendant")).toBe("custom-select-opt-0");
257
+ return [2 /*return*/];
258
+ }
259
+ });
260
+ }); });
261
+ it("skips disabled options when navigating with arrows", function () { return __awaiter(void 0, void 0, void 0, function () {
262
+ var options, getByRole, trigger, listbox;
263
+ return __generator(this, function (_a) {
264
+ switch (_a.label) {
265
+ case 0:
266
+ options = [
267
+ { label: "First", value: "1" },
268
+ { label: "Cannot pick", value: "2", disabled: true },
269
+ { label: "Second", value: "3" },
270
+ ];
271
+ getByRole = renderSelect({ id: "nav-select", options: options }).getByRole;
272
+ trigger = getByRole("combobox");
273
+ return [4 /*yield*/, fireEvent.click(trigger)];
274
+ case 1:
275
+ _a.sent();
276
+ listbox = getByRole("listbox");
277
+ return [4 /*yield*/, fireEvent.keyDown(listbox, { key: "ArrowDown" })];
278
+ case 2:
279
+ _a.sent();
280
+ return [4 /*yield*/, fireEvent.keyDown(listbox, { key: "ArrowDown" })];
281
+ case 3:
282
+ _a.sent();
283
+ expect(listbox.getAttribute("aria-activedescendant")).toBe("nav-select-opt-2");
284
+ return [2 /*return*/];
285
+ }
286
+ });
287
+ }); });
288
+ it("supports Home/End navigation to first/last enabled option", function () { return __awaiter(void 0, void 0, void 0, function () {
289
+ var options, getByRole, trigger, listbox;
290
+ return __generator(this, function (_a) {
291
+ switch (_a.label) {
292
+ case 0:
293
+ options = [
294
+ { label: "Disabled first", value: "0", disabled: true },
295
+ { label: "A", value: "1" },
296
+ { label: "B", value: "2" },
297
+ { label: "Disabled last", value: "3", disabled: true },
298
+ ];
299
+ getByRole = renderSelect({ id: "home-end", options: options }).getByRole;
300
+ trigger = getByRole("combobox");
301
+ return [4 /*yield*/, fireEvent.click(trigger)];
302
+ case 1:
303
+ _a.sent();
304
+ listbox = getByRole("listbox");
305
+ return [4 /*yield*/, fireEvent.keyDown(listbox, { key: "End" })];
306
+ case 2:
307
+ _a.sent();
308
+ expect(listbox.getAttribute("aria-activedescendant")).toBe("home-end-opt-2");
309
+ return [4 /*yield*/, fireEvent.keyDown(listbox, { key: "Home" })];
310
+ case 3:
311
+ _a.sent();
312
+ expect(listbox.getAttribute("aria-activedescendant")).toBe("home-end-opt-1");
313
+ return [2 /*return*/];
314
+ }
315
+ });
316
+ }); });
317
+ it("selects highlighted option via Space or Enter and closes listbox", function () { return __awaiter(void 0, void 0, void 0, function () {
318
+ var handle, getByRole, listbox, listbox2;
319
+ return __generator(this, function (_a) {
320
+ switch (_a.label) {
321
+ case 0:
322
+ handle = vi.fn();
323
+ getByRole = renderSelect({ onChange: handle }).getByRole;
324
+ return [4 /*yield*/, fireEvent.click(getByRole("combobox"))];
325
+ case 1:
326
+ _a.sent();
327
+ listbox = getByRole("listbox");
328
+ return [4 /*yield*/, fireEvent.keyDown(listbox, { key: "ArrowDown" })];
329
+ case 2:
330
+ _a.sent();
331
+ return [4 /*yield*/, fireEvent.keyDown(listbox, { key: " " })];
332
+ case 3:
333
+ _a.sent();
334
+ expect(getByRole("combobox").textContent).toContain("One");
335
+ expect(handle).toHaveBeenCalledWith("1");
336
+ expect(function () { return getByRole("listbox"); }).toThrow();
337
+ return [4 /*yield*/, fireEvent.click(getByRole("combobox"))];
338
+ case 4:
339
+ _a.sent();
340
+ listbox2 = getByRole("listbox");
341
+ return [4 /*yield*/, fireEvent.keyDown(listbox2, { key: "ArrowDown" })];
342
+ case 5:
343
+ _a.sent();
344
+ return [4 /*yield*/, fireEvent.keyDown(listbox2, { key: "Enter" })];
345
+ case 6:
346
+ _a.sent();
347
+ expect(getByRole("combobox").textContent).toContain("One");
348
+ return [2 /*return*/];
349
+ }
350
+ });
351
+ }); });
352
+ it("respects initial open prop and renders listbox immediately", function () {
353
+ var getByRole = renderSelect({ open: true }).getByRole;
354
+ expect(getByRole("listbox")).toBeTruthy();
355
+ expect(getByRole("combobox").getAttribute("aria-expanded")).toBe("true");
356
+ });
357
+ it("keeps Tab handling inside listbox without throwing", function () { return __awaiter(void 0, void 0, void 0, function () {
358
+ var getByRole, trigger, listbox, event, prevent;
359
+ return __generator(this, function (_a) {
360
+ switch (_a.label) {
361
+ case 0:
362
+ getByRole = renderSelect().getByRole;
363
+ trigger = getByRole("combobox");
364
+ return [4 /*yield*/, fireEvent.click(trigger)];
365
+ case 1:
366
+ _a.sent();
367
+ listbox = getByRole("listbox");
368
+ return [4 /*yield*/, Promise.resolve()];
369
+ case 2:
370
+ _a.sent();
371
+ return [4 /*yield*/, fireEvent.keyDown(listbox, { key: "End" })];
372
+ case 3:
373
+ _a.sent();
374
+ event = new KeyboardEvent("keydown", {
375
+ key: "Tab",
376
+ bubbles: true,
377
+ cancelable: true,
378
+ });
379
+ prevent = vi.fn();
380
+ event.preventDefault = prevent;
381
+ listbox.dispatchEvent(event);
382
+ expect(prevent).toHaveBeenCalled();
383
+ return [2 /*return*/];
384
+ }
385
+ });
386
+ }); });
387
+ it("applies size and variant classes to trigger", function () {
388
+ var getByRole = renderSelect({ sz: "lg", variant: "filled" }).getByRole;
389
+ var trigger = getByRole("combobox");
390
+ expect(trigger.className).toContain("h-9");
391
+ expect(trigger.className).toContain("bg-[var(--color-bg-muted)]");
392
+ });
393
+ it("handles empty options array without crashing", function () { return __awaiter(void 0, void 0, void 0, function () {
394
+ var _a, getByRole, queryAllByRole, trigger;
395
+ return __generator(this, function (_b) {
396
+ switch (_b.label) {
397
+ case 0:
398
+ _a = renderSelect({ options: [] }), getByRole = _a.getByRole, queryAllByRole = _a.queryAllByRole;
399
+ trigger = getByRole("combobox");
400
+ return [4 /*yield*/, fireEvent.click(trigger)];
401
+ case 1:
402
+ _b.sent();
403
+ expect(queryAllByRole("option")).toHaveLength(0);
404
+ return [2 /*return*/];
405
+ }
406
+ });
407
+ }); });
408
+ });
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,213 @@
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__/Slider.test.ts
38
+ import { render, fireEvent } from "@testing-library/svelte";
39
+ import { describe, it, expect, vi } from "vitest";
40
+ import Slider from "../Slider.svelte";
41
+ describe("Slider", function () {
42
+ it("renders with default props", function () {
43
+ var container = render(Slider).container;
44
+ var slider = container.querySelector('input[type="range"]');
45
+ expect(slider).toBeDefined();
46
+ expect(slider.value).toBe("0");
47
+ expect(slider.min).toBe("0");
48
+ expect(slider.max).toBe("100");
49
+ expect(slider.step).toBe("1");
50
+ });
51
+ it("respects custom value, min, max and step", function () {
52
+ var container = render(Slider, {
53
+ props: {
54
+ value: 50,
55
+ min: 0,
56
+ max: 200,
57
+ step: 10,
58
+ },
59
+ }).container;
60
+ var slider = container.querySelector('input[type="range"]');
61
+ expect(slider.value).toBe("50");
62
+ expect(slider.min).toBe("0");
63
+ expect(slider.max).toBe("200");
64
+ expect(slider.step).toBe("10");
65
+ });
66
+ it("updates value on input", function () { return __awaiter(void 0, void 0, void 0, function () {
67
+ var mockOnInput, container, slider;
68
+ return __generator(this, function (_a) {
69
+ switch (_a.label) {
70
+ case 0:
71
+ mockOnInput = vi.fn();
72
+ container = render(Slider, {
73
+ props: { onInput: mockOnInput },
74
+ }).container;
75
+ slider = container.querySelector('input[type="range"]');
76
+ slider.value = "75";
77
+ return [4 /*yield*/, fireEvent.input(slider)];
78
+ case 1:
79
+ _a.sent();
80
+ expect(mockOnInput).toHaveBeenCalledWith(75);
81
+ return [2 /*return*/];
82
+ }
83
+ });
84
+ }); });
85
+ it("snaps to step values", function () { return __awaiter(void 0, void 0, void 0, function () {
86
+ var mockOnInput, container, slider;
87
+ return __generator(this, function (_a) {
88
+ switch (_a.label) {
89
+ case 0:
90
+ mockOnInput = vi.fn();
91
+ container = render(Slider, {
92
+ props: {
93
+ value: 0,
94
+ min: 0,
95
+ max: 100,
96
+ step: 10,
97
+ onInput: mockOnInput,
98
+ },
99
+ }).container;
100
+ slider = container.querySelector('input[type="range"]');
101
+ slider.value = "47";
102
+ return [4 /*yield*/, fireEvent.input(slider)];
103
+ case 1:
104
+ _a.sent();
105
+ expect(mockOnInput).toHaveBeenCalledWith(50);
106
+ return [2 /*return*/];
107
+ }
108
+ });
109
+ }); });
110
+ it("handles disabled state", function () {
111
+ var container = render(Slider, {
112
+ props: { disabled: true },
113
+ }).container;
114
+ var slider = container.querySelector('input[type="range"]');
115
+ var wrapper = container.querySelector("div");
116
+ expect(slider.disabled).toBe(true);
117
+ expect(wrapper === null || wrapper === void 0 ? void 0 : wrapper.className).toContain("cursor-not-allowed");
118
+ expect(wrapper === null || wrapper === void 0 ? void 0 : wrapper.className).toContain("opacity-[var(--opacity-disabled)]");
119
+ });
120
+ it("shows value when showValue is true", function () {
121
+ var getByText = render(Slider, {
122
+ props: { showValue: true, value: 42 },
123
+ }).getByText;
124
+ expect(getByText("42")).toBeTruthy();
125
+ });
126
+ it("applies correct size classes", function () {
127
+ var container = render(Slider, {
128
+ props: { sz: "xl" },
129
+ }).container;
130
+ var track = container.querySelector(".absolute.top-1\\/2.-translate-y-1\\/2.w-full");
131
+ expect(track === null || track === void 0 ? void 0 : track.className).toContain("h-[8px]");
132
+ var input = container.querySelector('input[type="range"]');
133
+ expect(input === null || input === void 0 ? void 0 : input.className).toContain("[&::-webkit-slider-thumb]:w-7");
134
+ expect(input === null || input === void 0 ? void 0 : input.className).toContain("[&::-webkit-slider-thumb]:h-7");
135
+ });
136
+ it("applies correct variant classes", function () {
137
+ var container = render(Slider, {
138
+ props: { variant: "neutral" },
139
+ }).container;
140
+ var wrapper = container.querySelector("div");
141
+ expect(wrapper === null || wrapper === void 0 ? void 0 : wrapper.innerHTML).toContain("bg-[var(--color-bg-secondary)]");
142
+ });
143
+ it("handles keyboard navigation", function () { return __awaiter(void 0, void 0, void 0, function () {
144
+ var mockOnInput, container, slider, container2, slider2, container3, slider3, container4, slider4;
145
+ return __generator(this, function (_a) {
146
+ switch (_a.label) {
147
+ case 0:
148
+ mockOnInput = vi.fn();
149
+ container = render(Slider, {
150
+ props: { value: 50, onInput: mockOnInput },
151
+ }).container;
152
+ slider = container.querySelector('input[type="range"]');
153
+ return [4 /*yield*/, fireEvent.keyDown(slider, { key: "ArrowRight" })];
154
+ case 1:
155
+ _a.sent();
156
+ expect(mockOnInput).toHaveBeenCalledWith(51);
157
+ mockOnInput.mockClear();
158
+ container2 = render(Slider, {
159
+ props: { value: 50, onInput: mockOnInput },
160
+ }).container;
161
+ slider2 = container2.querySelector('input[type="range"]');
162
+ return [4 /*yield*/, fireEvent.keyDown(slider2, { key: "ArrowLeft" })];
163
+ case 2:
164
+ _a.sent();
165
+ expect(mockOnInput).toHaveBeenCalledWith(49);
166
+ mockOnInput.mockClear();
167
+ container3 = render(Slider, {
168
+ props: { value: 50, onInput: mockOnInput },
169
+ }).container;
170
+ slider3 = container3.querySelector('input[type="range"]');
171
+ return [4 /*yield*/, fireEvent.keyDown(slider3, { key: "Home" })];
172
+ case 3:
173
+ _a.sent();
174
+ expect(mockOnInput).toHaveBeenCalledWith(0);
175
+ mockOnInput.mockClear();
176
+ container4 = render(Slider, {
177
+ props: { value: 50, onInput: mockOnInput },
178
+ }).container;
179
+ slider4 = container4.querySelector('input[type="range"]');
180
+ return [4 /*yield*/, fireEvent.keyDown(slider4, { key: "End" })];
181
+ case 4:
182
+ _a.sent();
183
+ expect(mockOnInput).toHaveBeenCalledWith(100);
184
+ return [2 /*return*/];
185
+ }
186
+ });
187
+ }); });
188
+ it("does not respond to track click when disabled", function () { return __awaiter(void 0, void 0, void 0, function () {
189
+ var mockOnInput, container, wrapper;
190
+ return __generator(this, function (_a) {
191
+ switch (_a.label) {
192
+ case 0:
193
+ mockOnInput = vi.fn();
194
+ container = render(Slider, {
195
+ props: { disabled: true, onInput: mockOnInput },
196
+ }).container;
197
+ wrapper = container.querySelector("div");
198
+ return [4 /*yield*/, fireEvent.click(wrapper)];
199
+ case 1:
200
+ _a.sent();
201
+ expect(mockOnInput).not.toHaveBeenCalled();
202
+ return [2 /*return*/];
203
+ }
204
+ });
205
+ }); });
206
+ it("accepts external class", function () {
207
+ var container = render(Slider, {
208
+ props: { class: "custom-slider-class" },
209
+ }).container;
210
+ var wrapper = container.querySelector("div");
211
+ expect(wrapper === null || wrapper === void 0 ? void 0 : wrapper.className).toContain("custom-slider-class");
212
+ });
213
+ });
@@ -0,0 +1 @@
1
+ export {};