svelte-comp 1.2.7 → 1.3.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (139) hide show
  1. package/README.md +12 -11
  2. package/dist/App.svelte +497 -2
  3. package/dist/app.css +2 -3
  4. package/dist/app.d.ts +10 -0
  5. package/dist/lang.d.ts +3 -3
  6. package/dist/lang.js +3 -3
  7. package/dist/lib/Accordion.svelte +14 -14
  8. package/dist/lib/Badge.svelte +44 -0
  9. package/dist/lib/Badge.svelte.d.ts +10 -0
  10. package/dist/lib/Button.svelte +23 -8
  11. package/dist/lib/Calendar.svelte +384 -377
  12. package/dist/lib/Card.svelte +6 -6
  13. package/dist/lib/Carousel.svelte +16 -16
  14. package/dist/lib/Carousel.svelte.d.ts +1 -1
  15. package/dist/lib/CheckBox.svelte +2 -2
  16. package/dist/lib/CodeView.svelte +6 -5
  17. package/dist/lib/ColorPicker.svelte +6 -6
  18. package/dist/lib/ContextMenu.svelte +328 -0
  19. package/dist/lib/ContextMenu.svelte.d.ts +14 -0
  20. package/dist/lib/DatePicker.svelte +161 -161
  21. package/dist/lib/Dialog.svelte +10 -10
  22. package/dist/lib/Field.svelte +1 -1
  23. package/dist/lib/FilePicker.svelte +127 -74
  24. package/dist/lib/FilePicker.svelte.d.ts +6 -3
  25. package/dist/lib/Hamburger.svelte +27 -21
  26. package/dist/lib/InstallPWA.svelte +94 -0
  27. package/dist/lib/InstallPWA.svelte.d.ts +8 -0
  28. package/dist/lib/Menu.svelte +18 -18
  29. package/dist/lib/NoticeBase.svelte +140 -0
  30. package/dist/lib/NoticeBase.svelte.d.ts +43 -0
  31. package/dist/lib/PrimaryColorSelect.svelte +6 -6
  32. package/dist/lib/ProgressCircle.svelte +7 -9
  33. package/dist/lib/ProgressCircle.svelte.d.ts +7 -9
  34. package/dist/lib/SearchInput.svelte +6 -6
  35. package/dist/lib/Select.svelte +2 -2
  36. package/dist/lib/Slider.svelte +1 -1
  37. package/dist/lib/Splitter.svelte +15 -6
  38. package/dist/lib/Switch.svelte +5 -4
  39. package/dist/lib/Tabs.svelte +6 -6
  40. package/dist/lib/ThemeToggle.svelte +1 -0
  41. package/dist/lib/TimePicker.svelte +103 -95
  42. package/dist/lib/TimePickerNew.svelte +634 -0
  43. package/dist/lib/TimePickerNew.svelte.d.ts +49 -0
  44. package/dist/lib/Toast.svelte +17 -120
  45. package/dist/lib/Tooltip.svelte +7 -7
  46. package/dist/lib/Topbar.svelte +112 -0
  47. package/dist/lib/Topbar.svelte.d.ts +44 -0
  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 +5 -0
  133. package/dist/lib/index.js +5 -0
  134. package/dist/lib/lang.d.ts +64 -0
  135. package/dist/lib/lang.js +64 -0
  136. package/dist/lib/types/index.d.ts +1 -0
  137. package/dist/styles.css +2 -0
  138. package/dist/utils/index.js +15 -4
  139. package/package.json +12 -12
@@ -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 {};