@idds/js 1.0.34

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js ADDED
@@ -0,0 +1,1213 @@
1
+ // src/js/components/stateful/button-group.js
2
+ function initButtonGroup(rootSelector = `.${PREFIX}-btn-group`) {
3
+ document.querySelectorAll(rootSelector).forEach((buttonGroup) => {
4
+ const buttons = buttonGroup.querySelectorAll(`.${PREFIX}-btn`);
5
+ buttons.forEach((button) => {
6
+ function updateState() {
7
+ const index = Array.from(buttons).indexOf(button);
8
+ buttons.forEach((button2, i) => {
9
+ button2.classList.remove(`${PREFIX}-btn--active`);
10
+ if (i === index) {
11
+ button2.classList.add(`${PREFIX}-btn--active`);
12
+ }
13
+ });
14
+ button.dispatchEvent(
15
+ new CustomEvent("button:change", {
16
+ detail: { activeIndex: index },
17
+ bubbles: true,
18
+ composed: true
19
+ })
20
+ );
21
+ }
22
+ button.addEventListener("click", updateState);
23
+ });
24
+ });
25
+ }
26
+
27
+ // src/js/components/stateful/tab.js
28
+ function initTab(rootSelector = `.${PREFIX}-tab`) {
29
+ document.querySelectorAll(rootSelector).forEach((tab) => {
30
+ const tabItem = tab.querySelectorAll(`.${PREFIX}-tab-item`);
31
+ tabItem.forEach((tabButton) => {
32
+ function updateState() {
33
+ const index = Array.from(tabItem).indexOf(tabButton);
34
+ tabItem.forEach((tabButton2, i) => {
35
+ tabButton2.classList.remove("active");
36
+ tabButton2.setAttribute("aria-selected", "false");
37
+ if (i === index) {
38
+ tabButton2.classList.add("active");
39
+ tabButton2.setAttribute("aria-selected", "true");
40
+ }
41
+ });
42
+ tab.dispatchEvent(
43
+ new CustomEvent("tab:change", {
44
+ detail: { activeIndex: index },
45
+ bubbles: true,
46
+ composed: true
47
+ })
48
+ );
49
+ }
50
+ tabButton.addEventListener("click", updateState);
51
+ });
52
+ });
53
+ }
54
+
55
+ // src/js/components/stateful/toggle.js
56
+ function initToggle(rootSelector = `.${PREFIX}-toggle`) {
57
+ document.querySelectorAll(rootSelector).forEach((toggle) => {
58
+ function updateState() {
59
+ const isActive = toggle.classList.toggle("active");
60
+ toggle.setAttribute("aria-pressed", isActive);
61
+ toggle.dispatchEvent(
62
+ new CustomEvent("toggle:change", {
63
+ detail: { active: isActive },
64
+ bubbles: true,
65
+ composed: true
66
+ })
67
+ );
68
+ }
69
+ toggle.addEventListener("click", updateState);
70
+ });
71
+ }
72
+
73
+ // src/js/components/stateless/accordion.js
74
+ function initAccordion(rootSelector = `.${PREFIX}-accordion`) {
75
+ document.querySelectorAll(rootSelector).forEach((accordion) => {
76
+ const behavior = accordion.dataset.behavior || "multiple";
77
+ const headers = accordion.querySelectorAll(`.${PREFIX}-accordion__header`);
78
+ headers.forEach((header) => {
79
+ header.addEventListener("click", () => {
80
+ const currentItem = header.closest(`.${PREFIX}-accordion__item`);
81
+ if (!currentItem) return;
82
+ const body = currentItem.querySelector(`.${PREFIX}-accordion__body`);
83
+ const isOpen = currentItem.classList.contains("show");
84
+ function openAccordionItem(item) {
85
+ const body2 = item.querySelector(`.${PREFIX}-accordion__body`);
86
+ item.classList.add("show");
87
+ if (body2) {
88
+ body2.style.maxHeight = `${body2.scrollHeight}px`;
89
+ }
90
+ }
91
+ function closeAccordionItem(item) {
92
+ const body2 = item.querySelector(`.${PREFIX}-accordion__body`);
93
+ item.classList.remove("show");
94
+ if (body2) {
95
+ body2.style.maxHeight = null;
96
+ }
97
+ }
98
+ if (behavior === "single") {
99
+ accordion.querySelectorAll(`.${PREFIX}-accordion__item`).forEach((item) => closeAccordionItem(item));
100
+ if (!isOpen) openAccordionItem(currentItem);
101
+ } else {
102
+ isOpen ? closeAccordionItem(currentItem) : openAccordionItem(currentItem);
103
+ }
104
+ });
105
+ });
106
+ });
107
+ }
108
+
109
+ // src/js/components/stateful/datepicker.js
110
+ function initDatepicker() {
111
+ document.querySelectorAll(`.${PREFIX}-datepicker`).forEach((datepicker) => {
112
+ let currentDate = /* @__PURE__ */ new Date();
113
+ let selectedDateTarget = null;
114
+ let selectedDate = null;
115
+ const MONTHS = [
116
+ "Januari",
117
+ "Februari",
118
+ "Maret",
119
+ "April",
120
+ "Mei",
121
+ "Juni",
122
+ "Juli",
123
+ "Agustus",
124
+ "September",
125
+ "Oktober",
126
+ "November",
127
+ "Desember"
128
+ ];
129
+ const DAYS = ["Min", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"];
130
+ const datepickerTrigger = datepicker.querySelector(
131
+ `.${PREFIX}-datepicker__trigger`
132
+ );
133
+ const datepickerPopover = datepicker.querySelector(
134
+ `.${PREFIX}-datepicker__popover`
135
+ );
136
+ const datepickerMonthTrigger = datepicker.querySelector(
137
+ `.${PREFIX}-datepicker__month-trigger`
138
+ );
139
+ const datepickerMonthPopover = datepicker.querySelector(
140
+ `.${PREFIX}-datepicker__month-popover`
141
+ );
142
+ const datepickerMonthItem = datepicker.querySelectorAll(
143
+ `.${PREFIX}-datepicker__month-item`
144
+ );
145
+ const datepickerYearTrigger = datepicker.querySelector(
146
+ `.${PREFIX}-datepicker__year-trigger`
147
+ );
148
+ const datepickerYearPopover = datepicker.querySelector(
149
+ `.${PREFIX}-datepicker__year-popover`
150
+ );
151
+ const datepickerYearPrevButton = datepicker.querySelector(
152
+ `.${PREFIX}-datepicker__year-nav-prev`
153
+ );
154
+ const datepickerYearCurrent = datepicker.querySelector(
155
+ `.${PREFIX}-datepicker__year-current`
156
+ );
157
+ const datepickerYearNextButton = datepicker.querySelector(
158
+ `.${PREFIX}-datepicker__year-nav-next`
159
+ );
160
+ const datepickerYearContent = datepicker.querySelector(
161
+ `.${PREFIX}-datepicker__year-content`
162
+ );
163
+ const datepickerYearItem = datepicker.querySelectorAll(
164
+ `.${PREFIX}-datepicker__year-item`
165
+ );
166
+ const datepickerContent = datepicker.querySelector(
167
+ `.${PREFIX}-datepicker__content`
168
+ );
169
+ const prevMonthButton = datepicker.querySelector(
170
+ `.${PREFIX}-datepicker__nav-prev`
171
+ );
172
+ const nextMonthButton = datepicker.querySelector(
173
+ `.${PREFIX}-datepicker__nav-next`
174
+ );
175
+ const datepickerSubmitButton = datepicker.querySelector(
176
+ `.${PREFIX}-datepicker__submit`
177
+ );
178
+ function renderYear(startYear, endYear) {
179
+ datepickerYearContent.innerHTML = "";
180
+ datepickerYearCurrent.textContent = `${startYear} - ${endYear}`;
181
+ for (let y = startYear; y <= endYear; y++) {
182
+ const yearEl = document.createElement("button");
183
+ yearEl.className = `${PREFIX}-datepicker__year-item`;
184
+ yearEl.textContent = y;
185
+ yearEl.dataset.year = y;
186
+ if (y === currentDate.getFullYear()) {
187
+ yearEl.classList.add("selected");
188
+ }
189
+ datepickerYearContent.appendChild(yearEl);
190
+ }
191
+ }
192
+ function renderCalendar(year, month) {
193
+ datepickerContent.innerHTML = "";
194
+ datepickerMonthTrigger.textContent = MONTHS[month].substring(0, 3);
195
+ datepickerYearTrigger.textContent = year;
196
+ DAYS.forEach((day) => {
197
+ const dayNameWrapper = document.createElement("div");
198
+ dayNameWrapper.className = `${PREFIX}-datepicker__dayname-wrapper`;
199
+ const dayNameEl = document.createElement("span");
200
+ dayNameEl.className = `${PREFIX}-datepicker__dayname`;
201
+ dayNameEl.textContent = day.substring(0, 3);
202
+ dayNameWrapper.appendChild(dayNameEl);
203
+ datepickerContent.appendChild(dayNameWrapper);
204
+ });
205
+ const firstDayOfMonth = new Date(year, month, 1).getDay();
206
+ const daysInMonth = new Date(year, month + 1, 0).getDate();
207
+ const daysInPrevMonth = new Date(year, month, 0).getDate();
208
+ for (let i = 0; i < firstDayOfMonth; i++) {
209
+ const dayEl = document.createElement("button");
210
+ dayEl.className = `${PREFIX}-datepicker__calendar-day outside-month`;
211
+ dayEl.textContent = daysInPrevMonth - firstDayOfMonth + 1 + i;
212
+ dayEl.disabled = true;
213
+ datepickerContent.appendChild(dayEl);
214
+ }
215
+ const today = /* @__PURE__ */ new Date();
216
+ for (let i = 1; i <= daysInMonth; i++) {
217
+ const dayEl = document.createElement("button");
218
+ dayEl.className = `${PREFIX}-datepicker__calendar-day`;
219
+ dayEl.textContent = i;
220
+ dayEl.dataset.date = new Date(year, month, i).toISOString();
221
+ if (year === today.getFullYear() && month === today.getMonth() && i === today.getDate()) {
222
+ const marker = document.createElement("span");
223
+ marker.className = `${PREFIX}-datepicker__today-marker`;
224
+ marker.textContent = "Hari ini";
225
+ dayEl.appendChild(marker);
226
+ dayEl.classList.add("today");
227
+ }
228
+ if (selectedDate && year === selectedDate.getFullYear() && month === selectedDate.getMonth() && i === selectedDate.getDate()) {
229
+ dayEl.classList.add("selected");
230
+ }
231
+ datepickerContent.appendChild(dayEl);
232
+ }
233
+ const totalCells = 42;
234
+ const cellsRendered = firstDayOfMonth + daysInMonth;
235
+ const remainingCells = totalCells - cellsRendered;
236
+ for (let i = 1; i <= remainingCells; i++) {
237
+ const dayEl = document.createElement("button");
238
+ dayEl.className = `${PREFIX}-datepicker__calendar-day outside-month`;
239
+ dayEl.textContent = i;
240
+ dayEl.disabled = true;
241
+ datepickerContent.appendChild(dayEl);
242
+ }
243
+ datepickerMonthPopover.innerHTML = "";
244
+ MONTHS.forEach((monthName, index) => {
245
+ const monthEl = document.createElement("button");
246
+ monthEl.className = `${PREFIX}-datepicker__month-item`;
247
+ monthEl.textContent = monthName.substring(0, 3);
248
+ monthEl.dataset.month = index;
249
+ if (index === month) {
250
+ monthEl.classList.add("selected");
251
+ }
252
+ datepickerMonthPopover.appendChild(monthEl);
253
+ });
254
+ datepickerYearContent.innerHTML = "";
255
+ const startYear = Math.floor(year / 10) * 10;
256
+ const endYear = startYear + 19;
257
+ datepickerYearCurrent.textContent = `${startYear} - ${endYear}`;
258
+ for (let y = startYear; y <= endYear; y++) {
259
+ const yearEl = document.createElement("button");
260
+ yearEl.className = `${PREFIX}-datepicker__year-item`;
261
+ yearEl.textContent = y;
262
+ yearEl.dataset.year = y;
263
+ if (y === year) {
264
+ yearEl.classList.add("selected");
265
+ }
266
+ datepickerYearContent.appendChild(yearEl);
267
+ }
268
+ }
269
+ function togglePopover() {
270
+ if (datepickerPopover.style.display === "none" || datepickerPopover.style.display === "") {
271
+ datepickerPopover.style.display = "block";
272
+ renderCalendar(currentDate.getFullYear(), currentDate.getMonth());
273
+ } else {
274
+ datepickerPopover.style.display = "none";
275
+ }
276
+ }
277
+ function toggleMonthPopover() {
278
+ if (datepickerMonthPopover.style.display === "none" || datepickerMonthPopover.style.display === "") {
279
+ datepickerMonthPopover.style.display = "grid";
280
+ } else {
281
+ datepickerMonthPopover.style.display = "none";
282
+ }
283
+ }
284
+ function toggleYearPopover() {
285
+ if (datepickerYearPopover.style.display === "none" || datepickerYearPopover.style.display === "") {
286
+ datepickerYearPopover.style.display = "block";
287
+ } else {
288
+ datepickerYearPopover.style.display = "none";
289
+ }
290
+ }
291
+ datepickerTrigger.addEventListener("click", (e) => {
292
+ e.stopPropagation();
293
+ togglePopover();
294
+ });
295
+ prevMonthButton.addEventListener("click", () => {
296
+ currentDate.setMonth(currentDate.getMonth() - 1);
297
+ renderCalendar(currentDate.getFullYear(), currentDate.getMonth());
298
+ });
299
+ nextMonthButton.addEventListener("click", () => {
300
+ currentDate.setMonth(currentDate.getMonth() + 1);
301
+ renderCalendar(currentDate.getFullYear(), currentDate.getMonth());
302
+ });
303
+ datepickerMonthTrigger.addEventListener("click", (e) => {
304
+ e.stopPropagation();
305
+ toggleMonthPopover();
306
+ });
307
+ datepickerYearTrigger.addEventListener("click", (e) => {
308
+ e.stopPropagation();
309
+ toggleYearPopover();
310
+ });
311
+ document.addEventListener("click", (e) => {
312
+ if (!datepickerPopover.contains(e.target) && e.target !== datepickerTrigger && !datepickerTrigger.contains(e.target)) {
313
+ datepickerPopover.style.display = "none";
314
+ }
315
+ });
316
+ document.addEventListener("click", (e) => {
317
+ if (!datepickerMonthPopover.contains(e.target) && e.target !== datepickerMonthTrigger && !datepickerMonthTrigger.contains(e.target)) {
318
+ datepickerMonthPopover.style.display = "none";
319
+ }
320
+ });
321
+ document.addEventListener("click", (e) => {
322
+ if (!datepickerYearPopover.contains(e.target) && e.target !== datepickerYearTrigger && !datepickerYearTrigger.contains(e.target)) {
323
+ datepickerYearPopover.style.display = "none";
324
+ }
325
+ });
326
+ datepickerMonthPopover.addEventListener("click", (e) => {
327
+ e.stopPropagation();
328
+ const target = e.target;
329
+ if (target.classList.contains(`${PREFIX}-datepicker__month-item`)) {
330
+ const monthIndex = parseInt(target.dataset.month);
331
+ currentDate.setMonth(monthIndex);
332
+ renderCalendar(currentDate.getFullYear(), currentDate.getMonth());
333
+ datepickerMonthPopover.style.display = "none";
334
+ }
335
+ });
336
+ datepickerYearPopover.addEventListener("click", (e) => {
337
+ e.stopPropagation();
338
+ const target = e.target;
339
+ if (target.classList.contains(`${PREFIX}-datepicker__year-nav-prev`)) {
340
+ const currentYearRange = datepickerYearCurrent.textContent.split(" - ").map((y) => parseInt(y));
341
+ const newStartYear = currentYearRange[0] - 20;
342
+ const newEndYear = currentYearRange[1] - 20;
343
+ renderYear(newStartYear, newEndYear);
344
+ } else if (target.classList.contains(`${PREFIX}-datepicker__year-nav-next`)) {
345
+ const currentYearRange = datepickerYearCurrent.textContent.split(" - ").map((y) => parseInt(y));
346
+ const newStartYear = currentYearRange[0] + 20;
347
+ const newEndYear = currentYearRange[1] + 20;
348
+ renderYear(newStartYear, newEndYear);
349
+ }
350
+ });
351
+ datepickerYearContent.addEventListener("click", (e) => {
352
+ e.stopPropagation();
353
+ const target = e.target;
354
+ if (target.classList.contains(`${PREFIX}-datepicker__year-item`)) {
355
+ const yearValue = parseInt(target.dataset.year);
356
+ currentDate.setFullYear(yearValue);
357
+ renderCalendar(currentDate.getFullYear(), currentDate.getMonth());
358
+ datepickerYearPopover.style.display = "none";
359
+ }
360
+ });
361
+ datepickerContent.addEventListener("click", (e) => {
362
+ const target = e.target;
363
+ if (target.classList.contains(`${PREFIX}-datepicker__calendar-day`) && !target.classList.contains("outside-month")) {
364
+ if (target.classList.contains("selected")) {
365
+ target.classList.remove("selected");
366
+ selectedDateTarget = null;
367
+ } else {
368
+ const selectedDateEl = datepickerContent.querySelector(
369
+ `.${PREFIX}-datepicker__calendar-day.selected`
370
+ );
371
+ selectedDateEl?.classList.remove("selected");
372
+ target.classList.add("selected");
373
+ selectedDateTarget = target;
374
+ }
375
+ }
376
+ });
377
+ datepickerSubmitButton.addEventListener("click", () => {
378
+ selectedDate = selectedDateTarget ? new Date(selectedDateTarget.dataset.date) : null;
379
+ currentDate = selectedDate ? new Date(selectedDate) : /* @__PURE__ */ new Date();
380
+ datepicker.dispatchEvent(
381
+ new CustomEvent("date:changed", { detail: { selectedDate } })
382
+ );
383
+ datepickerPopover.style.display = "none";
384
+ });
385
+ renderCalendar(currentDate.getFullYear(), currentDate.getMonth());
386
+ });
387
+ }
388
+ document.addEventListener("DOMContentLoaded", () => {
389
+ });
390
+
391
+ // src/js/components/stateless/modal.js
392
+ function initModal(rootSelector = `.${PREFIX}-modal`) {
393
+ document.querySelectorAll(rootSelector).forEach((modal) => {
394
+ const modalContent = modal.querySelector(`${rootSelector}__content`);
395
+ const modalTrigger = modal.querySelector(`${rootSelector}__trigger`);
396
+ const modalClose = modal.querySelector(`${rootSelector}__close`);
397
+ const modalOverlay = modal.querySelector(`${rootSelector}__overlay`);
398
+ modalTrigger.addEventListener("click", () => {
399
+ const modalTarget = modalTrigger.getAttribute("data-modal");
400
+ const modal2 = document.querySelector(
401
+ `.${PREFIX}-modal__content[data-modal="${modalTarget}"]`
402
+ );
403
+ document.body.style.overflow = "hidden";
404
+ modalContent.classList.add(`${PREFIX}-modal__content--show`);
405
+ modalOverlay.classList.add(`${PREFIX}-modal__overlay--show`);
406
+ });
407
+ modalClose.addEventListener("click", () => {
408
+ modalContent.classList.remove(`${PREFIX}-modal__content--show`);
409
+ modalOverlay.classList.remove(`${PREFIX}-modal__overlay--show`);
410
+ setTimeout(() => {
411
+ document.body.style.overflow = "";
412
+ }, 300);
413
+ });
414
+ modal.addEventListener("keydown", (event) => {
415
+ if (event.key === "Escape") {
416
+ modalContent.classList.remove(`${PREFIX}-modal__content--show`);
417
+ modalOverlay.classList.remove(`${PREFIX}-modal__overlay--show`);
418
+ setTimeout(() => {
419
+ document.body.style.overflow = "";
420
+ }, 300);
421
+ }
422
+ });
423
+ modalOverlay.addEventListener("click", () => {
424
+ modalContent.classList.remove(`${PREFIX}-modal__content--show`);
425
+ modalOverlay.classList.remove(`${PREFIX}-modal__overlay--show`);
426
+ setTimeout(() => {
427
+ document.body.style.overflow = "";
428
+ }, 300);
429
+ });
430
+ });
431
+ }
432
+
433
+ // src/js/components/stateful/dropdown.js
434
+ function initDropdown(rootSelector = `.${PREFIX}-dropdown`) {
435
+ document.querySelectorAll(rootSelector).forEach((dropdown) => {
436
+ const trigger = dropdown.querySelector(`.${PREFIX}-dropdown__trigger`);
437
+ const input = dropdown.querySelector(`.${PREFIX}-dropdown__input`);
438
+ const menu = dropdown.querySelector(`.${PREFIX}-dropdown__menu`);
439
+ const menuItems = menu.querySelectorAll("li[role='option']");
440
+ const menuId = menu.id;
441
+ let activeIndex = -1;
442
+ menuItems.forEach((item, index) => {
443
+ item.id = `${menuId}-item-${index}`;
444
+ });
445
+ const toggleMenu = (show) => {
446
+ const isCurrentlyShown = dropdown.classList.contains("show");
447
+ const isShown = show !== void 0 ? show : !isCurrentlyShown;
448
+ if (isShown === isCurrentlyShown) {
449
+ return;
450
+ }
451
+ dropdown.classList.toggle("show", isShown);
452
+ trigger.setAttribute("aria-expanded", isShown);
453
+ if (isShown) {
454
+ input.focus();
455
+ } else {
456
+ input.blur();
457
+ removeHighlight();
458
+ activeIndex = -1;
459
+ input.removeAttribute("aria-activedescendant");
460
+ }
461
+ };
462
+ const filterItems = () => {
463
+ const filterValue = input.value.toLowerCase();
464
+ let hasVisibleItems = false;
465
+ activeIndex = -1;
466
+ removeHighlight();
467
+ input.removeAttribute("aria-activedescendant");
468
+ const activeItem = menu.querySelector("li[role='option'].selected");
469
+ if (activeItem && input.value !== activeItem.textContent.trim()) {
470
+ activeItem.classList.remove("selected");
471
+ }
472
+ menuItems.forEach((item) => {
473
+ const itemText = item.textContent.toLowerCase();
474
+ const isMatch = itemText.includes(filterValue);
475
+ item.classList.toggle("hidden", !isMatch);
476
+ if (isMatch) hasVisibleItems = true;
477
+ });
478
+ if (!dropdown.classList.contains("show") && hasVisibleItems) {
479
+ toggleMenu(true);
480
+ }
481
+ };
482
+ const selectItem = (item) => {
483
+ const itemText = item.textContent.trim();
484
+ input.value = itemText;
485
+ menuItems.forEach((li) => {
486
+ li.classList.remove("selected");
487
+ });
488
+ if (item) {
489
+ item.classList.add("selected");
490
+ dropdown.dispatchEvent(
491
+ new CustomEvent("dropdown:changed", {
492
+ detail: { value: itemText }
493
+ })
494
+ );
495
+ }
496
+ toggleMenu(false);
497
+ };
498
+ const setHighlight = (index) => {
499
+ removeHighlight();
500
+ const visibleItems = menu.querySelectorAll(
501
+ "li[role='option']:not(.hidden)"
502
+ );
503
+ if (visibleItems.length === 0) return;
504
+ if (index < 0) index = 0;
505
+ else if (index >= visibleItems.length) index = visibleItems.length - 1;
506
+ const itemToHighlight = visibleItems[index];
507
+ if (itemToHighlight) {
508
+ itemToHighlight.classList.add("highlighted");
509
+ input.setAttribute("aria-activedescendant", itemToHighlight.id);
510
+ itemToHighlight.scrollIntoView({
511
+ behavior: "smooth",
512
+ block: "nearest"
513
+ });
514
+ activeIndex = index;
515
+ }
516
+ };
517
+ const removeHighlight = () => {
518
+ menuItems.forEach((item) => item.classList.remove("highlighted"));
519
+ };
520
+ trigger.addEventListener("click", () => {
521
+ toggleMenu();
522
+ });
523
+ input.addEventListener("input", filterItems);
524
+ menu.addEventListener("click", (e) => {
525
+ const option = e.target.closest("li[role='option']");
526
+ if (option) {
527
+ e.preventDefault();
528
+ selectItem(option);
529
+ }
530
+ });
531
+ document.addEventListener("click", (e) => {
532
+ if (!dropdown.contains(e.target)) {
533
+ toggleMenu(false);
534
+ }
535
+ });
536
+ input.addEventListener("keydown", (e) => {
537
+ const { key } = e;
538
+ const isMenuOpen = dropdown.classList.contains("show");
539
+ switch (key) {
540
+ case "ArrowDown":
541
+ e.preventDefault();
542
+ if (!isMenuOpen) {
543
+ toggleMenu(true);
544
+ }
545
+ setHighlight(activeIndex + 1);
546
+ break;
547
+ case "ArrowUp":
548
+ e.preventDefault();
549
+ if (isMenuOpen) {
550
+ setHighlight(activeIndex - 1);
551
+ }
552
+ break;
553
+ case "Enter":
554
+ e.preventDefault();
555
+ const firstVisible = menu.querySelector(
556
+ "li[role='option']:not(.hidden)"
557
+ );
558
+ const activeItem = menu.querySelector(".highlighted");
559
+ if (isMenuOpen && activeItem) {
560
+ selectItem(activeItem);
561
+ } else if (isMenuOpen && firstVisible) {
562
+ toggleMenu(false);
563
+ }
564
+ break;
565
+ case "Escape":
566
+ e.preventDefault();
567
+ toggleMenu(false);
568
+ break;
569
+ case "Tab":
570
+ toggleMenu(false);
571
+ break;
572
+ }
573
+ });
574
+ });
575
+ }
576
+
577
+ // src/js/components/stateless/banner.js
578
+ function initBanner(rootSelector = `.${PREFIX}-banner`) {
579
+ document.querySelectorAll(rootSelector).forEach((banner) => {
580
+ const mediaQuery = window.matchMedia("(max-width: 1279px)");
581
+ function updateElText(targetEl, mediaQuery2) {
582
+ targetEl.textContent = mediaQuery2.matches ? "Situs ini merupakan platform resmi pemerintah." : "Situs ini merupakan platform resmi pemerintah Indonesia yang dikelola oleh INA Digital.";
583
+ }
584
+ const contentEl = document.createElement("div");
585
+ contentEl.className = `${PREFIX}-banner__content`;
586
+ const iconEl = document.createElement("div");
587
+ iconEl.className = `${PREFIX}-banner__icon`;
588
+ const wrapperEl = document.createElement("div");
589
+ wrapperEl.className = `${PREFIX}-banner__wrapper`;
590
+ const headerEl = document.createElement("div");
591
+ headerEl.className = `${PREFIX}-banner__header`;
592
+ const headerWrapperEl = document.createElement("div");
593
+ headerWrapperEl.className = `${PREFIX}-banner__header-wrapper`;
594
+ const headerTitleEl = document.createElement("p");
595
+ headerTitleEl.className = `${PREFIX}-banner__title`;
596
+ headerTitleEl.textContent = "Situs ini merupakan platform resmi pemerintah. ";
597
+ updateElText(headerTitleEl, mediaQuery);
598
+ const identityEl = document.createElement("a");
599
+ identityEl.href = "#";
600
+ identityEl.className = `${PREFIX}-banner__identity`;
601
+ identityEl.textContent = "Lebih Lanjut";
602
+ identityEl.addEventListener("click", (e) => {
603
+ e.preventDefault();
604
+ banner.classList.toggle("open");
605
+ });
606
+ const chevronEl = document.createElement("button");
607
+ chevronEl.className = `${PREFIX}-banner__chevron`;
608
+ chevronEl.addEventListener("click", (e) => {
609
+ e.preventDefault();
610
+ banner.classList.toggle("open");
611
+ const isOpen = banner.classList.contains("open");
612
+ headerTitleEl.textContent = isOpen ? "Situs ini merupakan platform resmi pemerintah Indonesia yang dikelola oleh INA Digital." : "Situs ini merupakan platform resmi pemerintah. ";
613
+ });
614
+ headerWrapperEl.appendChild(headerTitleEl);
615
+ headerWrapperEl.appendChild(identityEl);
616
+ headerEl.appendChild(headerWrapperEl);
617
+ headerEl.appendChild(chevronEl);
618
+ const bodyEl = document.createElement("div");
619
+ bodyEl.className = `${PREFIX}-banner__body`;
620
+ const bodyTitleEl = document.createElement("p");
621
+ bodyTitleEl.className = `${PREFIX}-banner__title`;
622
+ bodyTitleEl.textContent = "INA Digital adalah inisiatif pemerintah Indonesia untuk membangun ekosistem layanan publik digital yang terintegrasi, aman, dan mudah digunakan oleh masyarakat.";
623
+ const descEl = document.createElement("p");
624
+ descEl.className = `${PREFIX}-banner__desc`;
625
+ descEl.textContent = "Pastikan untuk memperhatikan ikon kunci (\u{1F512}) dan alamat https:// sebagai penanda keamanan.";
626
+ bodyEl.appendChild(bodyTitleEl);
627
+ bodyEl.appendChild(descEl);
628
+ wrapperEl.appendChild(headerEl);
629
+ wrapperEl.appendChild(bodyEl);
630
+ contentEl.appendChild(iconEl);
631
+ contentEl.appendChild(wrapperEl);
632
+ banner.appendChild(contentEl);
633
+ mediaQuery.addEventListener("change", () => {
634
+ updateElText(headerTitleEl, mediaQuery);
635
+ });
636
+ });
637
+ }
638
+
639
+ // src/js/components/stateful/file-upload-base.js
640
+ function initFileUploadBase(rootSelector = `.${PREFIX}-file-base`) {
641
+ document.querySelectorAll(rootSelector).forEach((fileUploadBase) => {
642
+ const fileIconContainer = fileUploadBase.querySelector(
643
+ ".ina-ss-file-base__icon-container"
644
+ );
645
+ const fileTitle = fileUploadBase.querySelector(".ina-ss-file-base__title");
646
+ const fileDesc = fileUploadBase.querySelector(".ina-ss-file-base__desc");
647
+ const buttonUpload = fileUploadBase.querySelector(
648
+ ".ina-ss-file-base__trigger"
649
+ );
650
+ const inputFile = fileUploadBase.querySelector(".ina-ss-file-base__input");
651
+ buttonUpload.addEventListener("click", () => {
652
+ inputFile.click();
653
+ });
654
+ inputFile.addEventListener("change", () => {
655
+ handleFile(inputFile.files[0]);
656
+ });
657
+ fileUploadBase.addEventListener("dragover", (e) => {
658
+ e.preventDefault();
659
+ fileUploadBase.classList.add("dragover");
660
+ });
661
+ fileUploadBase.addEventListener("dragleave", () => {
662
+ fileUploadBase.classList.remove("dragover");
663
+ });
664
+ fileUploadBase.addEventListener("drop", (e) => {
665
+ e.preventDefault();
666
+ fileUploadBase.classList.remove("dragover");
667
+ const file = e.dataTransfer.files;
668
+ handleFile(file[0]);
669
+ });
670
+ function simulateUpload() {
671
+ const fileIcon = fileUploadBase.querySelector(".ina-ss-file-base__icon");
672
+ const loadingEl = document.createElement("div");
673
+ loadingEl.classList.add("ina-ss-loading__spinner");
674
+ fileIconContainer.replaceChild(loadingEl, fileIcon);
675
+ fileTitle.textContent = "Mengunggah...";
676
+ fileDesc.textContent = "";
677
+ buttonUpload.disabled = true;
678
+ }
679
+ function handleFile(inputFile2) {
680
+ simulateUpload();
681
+ const FILE_NAME = inputFile2.name;
682
+ const FILE_SIZE_IN_MB = inputFile2.size / (1024 * 1024);
683
+ const FILE_TYPE = inputFile2.type;
684
+ const IMAGE_TYPE = ["image/png", "image/jpg", "image/jpeg"];
685
+ setTimeout(() => {
686
+ fileIconContainer.innerHTML = "";
687
+ const defaultFileIcon = document.createElement("div");
688
+ defaultFileIcon.classList.add("ina-ss-file-base__icon");
689
+ fileIconContainer.appendChild(defaultFileIcon);
690
+ if (FILE_TYPE === "application/pdf") {
691
+ defaultFileIcon.style.backgroundImage = "url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2232%22%20height%3D%2232%22%20viewBox%3D%220%200%2032%2032%22%20fill%3D%22none%22%3E%3Cpath%20d%3D%22M10.1556%200.400421H21.434L30.8002%209.76566V27.834C30.8002%2029.8914%2029.0115%2031.5996%2026.7523%2031.5996H10.056C7.78789%2031.5995%206.00037%2029.8909%206.00037%2027.834V4.16605C6.00033%202.12004%207.87549%200.400437%2010.1556%200.400421Z%22%20fill%3D%22white%22%20stroke%3D%22%23E5E5E5%22%20stroke-width%3D%220.8%22%2F%3E%3Cpath%20d%3D%22M21.6205%206.528V0L31.2%209.6H24.8136C21.9398%209.6%2021.4874%207.552%2021.6205%206.528Z%22%20fill%3D%22%23E5E5E5%22%2F%3E%3Crect%20x%3D%220.799988%22%20y%3D%2215.2%22%20width%3D%2221.4%22%20height%3D%2212.2%22%20rx%3D%222.4%22%20fill%3D%22%23D92D20%22%2F%3E%3Cpath%20d%3D%22M4.89925%2023.8V18.5636H6.96516C7.36232%2018.5636%207.70067%2018.6395%207.98022%2018.7912C8.25977%2018.9412%208.47283%2019.15%208.61942%2019.4176C8.76772%2019.6835%208.84187%2019.9903%208.84187%2020.3381C8.84187%2020.6858%208.76687%2020.9926%208.61687%2021.2585C8.46687%2021.5244%208.24954%2021.7315%207.96488%2021.8798C7.68192%2022.0281%207.33931%2022.1023%206.93704%2022.1023H5.62028V21.215H6.75806C6.97113%2021.215%207.1467%2021.1784%207.28477%2021.1051C7.42454%2021.0301%207.52852%2020.927%207.5967%2020.7957C7.66658%2020.6628%207.70153%2020.5102%207.70153%2020.3381C7.70153%2020.1642%207.66658%2020.0125%207.5967%2019.8829C7.52852%2019.7517%207.42454%2019.6503%207.28477%2019.5787C7.14499%2019.5054%206.96772%2019.4687%206.75295%2019.4687H6.00636V23.8H4.89925ZM11.4172%2023.8H9.56097V18.5636H11.4326C11.9593%2018.5636%2012.4127%2018.6685%2012.7928%2018.8781C13.1729%2019.0861%2013.4652%2019.3852%2013.6698%2019.7756C13.876%2020.1659%2013.9792%2020.6329%2013.9792%2021.1767C13.9792%2021.7221%2013.876%2022.1909%2013.6698%2022.5829C13.4652%2022.975%2013.1712%2023.2758%2012.7877%2023.4855C12.4059%2023.6952%2011.949%2023.8%2011.4172%2023.8ZM10.6681%2022.8514H11.3712C11.6985%2022.8514%2011.9738%2022.7935%2012.1971%2022.6775C12.4221%2022.5599%2012.5908%2022.3784%2012.7033%2022.1329C12.8175%2021.8858%2012.8746%2021.567%2012.8746%2021.1767C12.8746%2020.7898%2012.8175%2020.4736%2012.7033%2020.2281C12.5908%2019.9827%2012.4229%2019.802%2012.1996%2019.6861C11.9763%2019.5702%2011.701%2019.5122%2011.3738%2019.5122H10.6681V22.8514ZM14.7993%2023.8V18.5636H18.2663V19.4764H15.9064V20.7241H18.0362V21.6369H15.9064V23.8H14.7993Z%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E')";
692
+ defaultFileIcon.style.width = "2rem";
693
+ defaultFileIcon.style.height = "2rem";
694
+ }
695
+ if (IMAGE_TYPE.includes(FILE_TYPE)) {
696
+ defaultFileIcon.style.backgroundImage = "url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2232%22%20height%3D%2232%22%20viewBox%3D%220%200%2032%2032%22%20fill%3D%22none%22%3E%3Cpath%20d%3D%22M10.1556%200.400452H21.434L30.8002%209.76569V27.834C30.8002%2029.8915%2029.0115%2031.5996%2026.7523%2031.5997H10.056C7.78789%2031.5996%206.00037%2029.891%206.00037%2027.834V4.16608C6.00033%202.12007%207.87549%200.400467%2010.1556%200.400452Z%22%20fill%3D%22white%22%20stroke%3D%22%23E5E5E5%22%20stroke-width%3D%220.8%22%2F%3E%3Cpath%20d%3D%22M21.6205%206.528V0L31.2%209.6H24.8136C21.9398%209.6%2021.4874%207.552%2021.6205%206.528Z%22%20fill%3D%22%23E5E5E5%22%2F%3E%3Crect%20x%3D%220.799988%22%20y%3D%2215.2%22%20width%3D%2221.4%22%20height%3D%2212.2%22%20rx%3D%222.4%22%20fill%3D%22%237F56D9%22%2F%3E%3Cpath%20d%3D%22M6.02042%2018.5636V23.8H4.91332V18.5636H6.02042ZM6.93128%2018.5636H8.29663L9.73867%2022.0818H9.80004L11.2421%2018.5636H12.6074V23.8H11.5336V20.3917H11.4901L10.135%2023.7744H9.40373L8.04861%2020.379H8.00515V23.8H6.93128V18.5636ZM16.9917%2020.2562C16.9559%2020.1318%2016.9056%2020.0219%2016.8409%2019.9264C16.7761%2019.8292%2016.6968%2019.7474%2016.6031%2019.681C16.511%2019.6128%2016.4054%2019.5608%2016.286%2019.525C16.1684%2019.4892%2016.038%2019.4713%2015.8949%2019.4713C15.6272%2019.4713%2015.392%2019.5378%2015.1892%2019.6707C14.988%2019.8037%2014.8312%2019.9971%2014.7187%2020.2511C14.6062%2020.5034%2014.55%2020.8119%2014.55%2021.1767C14.55%2021.5415%2014.6054%2021.8517%2014.7162%2022.1074C14.827%2022.3631%2014.9838%2022.5582%2015.1866%2022.6929C15.3895%2022.8258%2015.6289%2022.8923%2015.9051%2022.8923C16.1556%2022.8923%2016.3696%2022.848%2016.5468%2022.7594C16.7258%2022.669%2016.8622%2022.542%2016.9559%2022.3784C17.0514%2022.2148%2017.0991%2022.0213%2017.0991%2021.798L17.3241%2021.8312H15.9741V20.9977H18.1653V21.6574C18.1653%2022.1176%2018.0681%2022.5131%2017.8738%2022.8437C17.6795%2023.1727%2017.4119%2023.4267%2017.071%2023.6057C16.7301%2023.7829%2016.3397%2023.8716%2015.9%2023.8716C15.4091%2023.8716%2014.9778%2023.7633%2014.6062%2023.5469C14.2346%2023.3287%2013.9449%2023.0193%2013.7369%2022.6187C13.5306%2022.2165%2013.4275%2021.7392%2013.4275%2021.1869C13.4275%2020.7625%2013.4889%2020.3841%2013.6116%2020.0517C13.736%2019.7176%2013.9099%2019.4346%2014.1332%2019.2028C14.3565%2018.971%2014.6164%2018.7946%2014.913%2018.6736C15.2096%2018.5525%2015.5309%2018.492%2015.877%2018.492C16.1735%2018.492%2016.4497%2018.5355%2016.7054%2018.6224C16.961%2018.7077%2017.1877%2018.8287%2017.3855%2018.9855C17.5849%2019.1423%2017.7477%2019.329%2017.8738%2019.5454C18%2019.7602%2018.0809%2019.9971%2018.1167%2020.2562H16.9917Z%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E')";
697
+ defaultFileIcon.style.width = "2rem";
698
+ defaultFileIcon.style.height = "2rem";
699
+ }
700
+ fileTitle.textContent = FILE_NAME;
701
+ fileDesc.textContent = `Ukuran File: ${FILE_SIZE_IN_MB.toFixed(2)}MB`;
702
+ buttonUpload.classList.replace(
703
+ "ina-ss-btn--secondary",
704
+ "ina-ss-btn--link"
705
+ );
706
+ buttonUpload.style.textDecoration = "underline";
707
+ buttonUpload.textContent = "Ubah File";
708
+ buttonUpload.disabled = false;
709
+ fileUploadBase.dispatchEvent(
710
+ new CustomEvent("file:changed", { detail: { inputFile: inputFile2 } })
711
+ );
712
+ }, 1e3);
713
+ }
714
+ });
715
+ }
716
+
717
+ // src/js/components/stateful/file-upload-item.js
718
+ function initFileUploadItem(rootSelector = `.${PREFIX}-file-item`) {
719
+ document.querySelectorAll(rootSelector).forEach((fileUploadItem) => {
720
+ const fileIconContainer = fileUploadItem.querySelector(
721
+ ".ina-ss-file-item__icon-container"
722
+ );
723
+ const fileTitle = fileUploadItem.querySelector(".ina-ss-file-item__title");
724
+ const fileDesc = fileUploadItem.querySelector(".ina-ss-file-item__desc");
725
+ const inputFile = fileUploadItem.querySelector(".ina-ss-file-item__input");
726
+ fileUploadItem.addEventListener("click", () => {
727
+ inputFile.click();
728
+ });
729
+ inputFile.addEventListener("change", () => {
730
+ handleFile(inputFile.files[0]);
731
+ });
732
+ fileUploadItem.addEventListener("dragover", (e) => {
733
+ e.preventDefault();
734
+ fileUploadItem.classList.add("dragover");
735
+ });
736
+ fileUploadItem.addEventListener("dragleave", () => {
737
+ fileUploadItem.classList.remove("dragover");
738
+ });
739
+ fileUploadItem.addEventListener("drop", (e) => {
740
+ e.preventDefault();
741
+ fileUploadItem.classList.remove("dragover");
742
+ const file = e.dataTransfer.files;
743
+ handleFile(file[0]);
744
+ });
745
+ function simulateUpload() {
746
+ const fileIcon = fileUploadItem.querySelector(".ina-ss-file-item__icon");
747
+ const loadingEl = document.createElement("div");
748
+ loadingEl.classList.add("ina-ss-loading__spinner");
749
+ fileIconContainer.replaceChild(loadingEl, fileIcon);
750
+ }
751
+ function handleFile(inputFile2) {
752
+ simulateUpload();
753
+ const FILE_NAME = inputFile2.name;
754
+ const FILE_SIZE_IN_MB = inputFile2.size / (1024 * 1024);
755
+ const FILE_TYPE = inputFile2.type;
756
+ const IMAGE_TYPE = ["image/png", "image/jpg", "image/jpeg"];
757
+ setTimeout(() => {
758
+ fileIconContainer.innerHTML = "";
759
+ const defaultFileIcon = document.createElement("div");
760
+ defaultFileIcon.classList.add("ina-ss-file-item__icon");
761
+ fileIconContainer.appendChild(defaultFileIcon);
762
+ if (FILE_TYPE === "application/pdf") {
763
+ defaultFileIcon.style.backgroundImage = "url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2232%22%20height%3D%2232%22%20viewBox%3D%220%200%2032%2032%22%20fill%3D%22none%22%3E%3Cpath%20d%3D%22M10.1556%200.400421H21.434L30.8002%209.76566V27.834C30.8002%2029.8914%2029.0115%2031.5996%2026.7523%2031.5996H10.056C7.78789%2031.5995%206.00037%2029.8909%206.00037%2027.834V4.16605C6.00033%202.12004%207.87549%200.400437%2010.1556%200.400421Z%22%20fill%3D%22white%22%20stroke%3D%22%23E5E5E5%22%20stroke-width%3D%220.8%22%2F%3E%3Cpath%20d%3D%22M21.6205%206.528V0L31.2%209.6H24.8136C21.9398%209.6%2021.4874%207.552%2021.6205%206.528Z%22%20fill%3D%22%23E5E5E5%22%2F%3E%3Crect%20x%3D%220.799988%22%20y%3D%2215.2%22%20width%3D%2221.4%22%20height%3D%2212.2%22%20rx%3D%222.4%22%20fill%3D%22%23D92D20%22%2F%3E%3Cpath%20d%3D%22M4.89925%2023.8V18.5636H6.96516C7.36232%2018.5636%207.70067%2018.6395%207.98022%2018.7912C8.25977%2018.9412%208.47283%2019.15%208.61942%2019.4176C8.76772%2019.6835%208.84187%2019.9903%208.84187%2020.3381C8.84187%2020.6858%208.76687%2020.9926%208.61687%2021.2585C8.46687%2021.5244%208.24954%2021.7315%207.96488%2021.8798C7.68192%2022.0281%207.33931%2022.1023%206.93704%2022.1023H5.62028V21.215H6.75806C6.97113%2021.215%207.1467%2021.1784%207.28477%2021.1051C7.42454%2021.0301%207.52852%2020.927%207.5967%2020.7957C7.66658%2020.6628%207.70153%2020.5102%207.70153%2020.3381C7.70153%2020.1642%207.66658%2020.0125%207.5967%2019.8829C7.52852%2019.7517%207.42454%2019.6503%207.28477%2019.5787C7.14499%2019.5054%206.96772%2019.4687%206.75295%2019.4687H6.00636V23.8H4.89925ZM11.4172%2023.8H9.56097V18.5636H11.4326C11.9593%2018.5636%2012.4127%2018.6685%2012.7928%2018.8781C13.1729%2019.0861%2013.4652%2019.3852%2013.6698%2019.7756C13.876%2020.1659%2013.9792%2020.6329%2013.9792%2021.1767C13.9792%2021.7221%2013.876%2022.1909%2013.6698%2022.5829C13.4652%2022.975%2013.1712%2023.2758%2012.7877%2023.4855C12.4059%2023.6952%2011.949%2023.8%2011.4172%2023.8ZM10.6681%2022.8514H11.3712C11.6985%2022.8514%2011.9738%2022.7935%2012.1971%2022.6775C12.4221%2022.5599%2012.5908%2022.3784%2012.7033%2022.1329C12.8175%2021.8858%2012.8746%2021.567%2012.8746%2021.1767C12.8746%2020.7898%2012.8175%2020.4736%2012.7033%2020.2281C12.5908%2019.9827%2012.4229%2019.802%2012.1996%2019.6861C11.9763%2019.5702%2011.701%2019.5122%2011.3738%2019.5122H10.6681V22.8514ZM14.7993%2023.8V18.5636H18.2663V19.4764H15.9064V20.7241H18.0362V21.6369H15.9064V23.8H14.7993Z%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E')";
764
+ defaultFileIcon.style.width = "2rem";
765
+ defaultFileIcon.style.height = "2rem";
766
+ }
767
+ if (IMAGE_TYPE.includes(FILE_TYPE)) {
768
+ defaultFileIcon.style.backgroundImage = "url('data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%20width%3D%2232%22%20height%3D%2232%22%20viewBox%3D%220%200%2032%2032%22%20fill%3D%22none%22%3E%3Cpath%20d%3D%22M10.1556%200.400452H21.434L30.8002%209.76569V27.834C30.8002%2029.8915%2029.0115%2031.5996%2026.7523%2031.5997H10.056C7.78789%2031.5996%206.00037%2029.891%206.00037%2027.834V4.16608C6.00033%202.12007%207.87549%200.400467%2010.1556%200.400452Z%22%20fill%3D%22white%22%20stroke%3D%22%23E5E5E5%22%20stroke-width%3D%220.8%22%2F%3E%3Cpath%20d%3D%22M21.6205%206.528V0L31.2%209.6H24.8136C21.9398%209.6%2021.4874%207.552%2021.6205%206.528Z%22%20fill%3D%22%23E5E5E5%22%2F%3E%3Crect%20x%3D%220.799988%22%20y%3D%2215.2%22%20width%3D%2221.4%22%20height%3D%2212.2%22%20rx%3D%222.4%22%20fill%3D%22%237F56D9%22%2F%3E%3Cpath%20d%3D%22M6.02042%2018.5636V23.8H4.91332V18.5636H6.02042ZM6.93128%2018.5636H8.29663L9.73867%2022.0818H9.80004L11.2421%2018.5636H12.6074V23.8H11.5336V20.3917H11.4901L10.135%2023.7744H9.40373L8.04861%2020.379H8.00515V23.8H6.93128V18.5636ZM16.9917%2020.2562C16.9559%2020.1318%2016.9056%2020.0219%2016.8409%2019.9264C16.7761%2019.8292%2016.6968%2019.7474%2016.6031%2019.681C16.511%2019.6128%2016.4054%2019.5608%2016.286%2019.525C16.1684%2019.4892%2016.038%2019.4713%2015.8949%2019.4713C15.6272%2019.4713%2015.392%2019.5378%2015.1892%2019.6707C14.988%2019.8037%2014.8312%2019.9971%2014.7187%2020.2511C14.6062%2020.5034%2014.55%2020.8119%2014.55%2021.1767C14.55%2021.5415%2014.6054%2021.8517%2014.7162%2022.1074C14.827%2022.3631%2014.9838%2022.5582%2015.1866%2022.6929C15.3895%2022.8258%2015.6289%2022.8923%2015.9051%2022.8923C16.1556%2022.8923%2016.3696%2022.848%2016.5468%2022.7594C16.7258%2022.669%2016.8622%2022.542%2016.9559%2022.3784C17.0514%2022.2148%2017.0991%2022.0213%2017.0991%2021.798L17.3241%2021.8312H15.9741V20.9977H18.1653V21.6574C18.1653%2022.1176%2018.0681%2022.5131%2017.8738%2022.8437C17.6795%2023.1727%2017.4119%2023.4267%2017.071%2023.6057C16.7301%2023.7829%2016.3397%2023.8716%2015.9%2023.8716C15.4091%2023.8716%2014.9778%2023.7633%2014.6062%2023.5469C14.2346%2023.3287%2013.9449%2023.0193%2013.7369%2022.6187C13.5306%2022.2165%2013.4275%2021.7392%2013.4275%2021.1869C13.4275%2020.7625%2013.4889%2020.3841%2013.6116%2020.0517C13.736%2019.7176%2013.9099%2019.4346%2014.1332%2019.2028C14.3565%2018.971%2014.6164%2018.7946%2014.913%2018.6736C15.2096%2018.5525%2015.5309%2018.492%2015.877%2018.492C16.1735%2018.492%2016.4497%2018.5355%2016.7054%2018.6224C16.961%2018.7077%2017.1877%2018.8287%2017.3855%2018.9855C17.5849%2019.1423%2017.7477%2019.329%2017.8738%2019.5454C18%2019.7602%2018.0809%2019.9971%2018.1167%2020.2562H16.9917Z%22%20fill%3D%22white%22%2F%3E%3C%2Fsvg%3E')";
769
+ defaultFileIcon.style.width = "2rem";
770
+ defaultFileIcon.style.height = "2rem";
771
+ }
772
+ fileTitle.textContent = FILE_NAME;
773
+ fileDesc.textContent = `Ukuran File: ${FILE_SIZE_IN_MB.toFixed(2)}MB`;
774
+ fileUploadItem.dispatchEvent(
775
+ new CustomEvent("file:changed", { detail: { inputFile: inputFile2 } })
776
+ );
777
+ }, 1e3);
778
+ }
779
+ });
780
+ }
781
+
782
+ // src/js/components/stateful/range-datepicker.js
783
+ function initRangeDatepicker() {
784
+ document.querySelectorAll(".ina-ss-range-datepicker").forEach((rangeDatepicker) => {
785
+ let currentDate = /* @__PURE__ */ new Date();
786
+ let currentDateLeft = /* @__PURE__ */ new Date();
787
+ let currentDateRight = new Date(
788
+ currentDateLeft.getFullYear(),
789
+ currentDateLeft.getMonth() + 1,
790
+ currentDateLeft.getDate()
791
+ );
792
+ let selectedDateTarget = null;
793
+ let fromSelectedDate = null;
794
+ let toSelectedDate = null;
795
+ let selectedDate = null;
796
+ const MONTHS = [
797
+ "Januari",
798
+ "Februari",
799
+ "Maret",
800
+ "April",
801
+ "Mei",
802
+ "Juni",
803
+ "Juli",
804
+ "Agustus",
805
+ "September",
806
+ "Oktober",
807
+ "November",
808
+ "Desember"
809
+ ];
810
+ const DAYS = ["Min", "Sen", "Sel", "Rab", "Kam", "Jum", "Sab"];
811
+ const rangeDatepickerTrigger = rangeDatepicker.querySelector(
812
+ `.ina-ss-range-datepicker__trigger`
813
+ );
814
+ const rangeDatepickerPopover = rangeDatepicker.querySelector(
815
+ `.ina-ss-range-datepicker__popover`
816
+ );
817
+ const datePickerLeftDate = rangeDatepicker.querySelector(
818
+ `.ina-ss-range-datepicker__left-date`
819
+ );
820
+ const datePickerRightDate = rangeDatepicker.querySelector(
821
+ `.ina-ss-range-datepicker__right-date`
822
+ );
823
+ const datepickerMonthLeftTrigger = datePickerLeftDate.querySelector(
824
+ `.ina-ss-range-datepicker__month-trigger`
825
+ );
826
+ const datepickerMonthRightTrigger = datePickerRightDate.querySelector(
827
+ `.ina-ss-range-datepicker__month-trigger`
828
+ );
829
+ const datepickerLeftContent = datePickerLeftDate.querySelector(
830
+ `.ina-ss-range-datepicker__content`
831
+ );
832
+ const datepickerRightContent = datePickerRightDate.querySelector(
833
+ `.ina-ss-range-datepicker__content`
834
+ );
835
+ const prevMonthButtonLeft = datePickerLeftDate.querySelector(
836
+ `.ina-ss-range-datepicker__nav-prev`
837
+ );
838
+ const nextMonthButtonLeft = datePickerLeftDate.querySelector(
839
+ `.ina-ss-range-datepicker__nav-next`
840
+ );
841
+ const prevMonthButtonRight = datePickerRightDate.querySelector(
842
+ `.ina-ss-range-datepicker__nav-prev`
843
+ );
844
+ const nextMonthButtonRight = datePickerRightDate.querySelector(
845
+ `.ina-ss-range-datepicker__nav-next`
846
+ );
847
+ function renderCalendar(targetEl, year, month) {
848
+ const rangeDatepickerMonthTrigger = targetEl.querySelector(
849
+ `.ina-ss-range-datepicker__month-trigger`
850
+ );
851
+ const rangeDatepickerMonthPopover = targetEl.querySelector(
852
+ `.ina-ss-range-datepicker__month-popover`
853
+ );
854
+ const rangeDatepickerMonthItem = targetEl.querySelectorAll(
855
+ `.ina-ss-range-datepicker__month-item`
856
+ );
857
+ const rangeDatepickerYearTrigger = targetEl.querySelector(
858
+ `.ina-ss-range-datepicker__year-trigger`
859
+ );
860
+ const targetContentEl = targetEl.querySelector(
861
+ `.ina-ss-range-datepicker__content`
862
+ );
863
+ targetContentEl.innerHTML = "";
864
+ rangeDatepickerMonthTrigger.textContent = MONTHS[month].substring(0, 3);
865
+ rangeDatepickerYearTrigger.textContent = year;
866
+ DAYS.forEach((day) => {
867
+ const dayNameWrapper = document.createElement("div");
868
+ dayNameWrapper.className = `ina-ss-range-datepicker__dayname-wrapper`;
869
+ const dayNameEl = document.createElement("span");
870
+ dayNameEl.className = `ina-ss-range-datepicker__dayname`;
871
+ dayNameEl.textContent = day.substring(0, 3);
872
+ dayNameWrapper.appendChild(dayNameEl);
873
+ targetContentEl.appendChild(dayNameWrapper);
874
+ });
875
+ const firstDayOfMonth = new Date(year, month, 1).getDay();
876
+ const daysInMonth = new Date(year, month + 1, 0).getDate();
877
+ const daysInPrevMonth = new Date(year, month, 0).getDate();
878
+ for (let i = 0; i < firstDayOfMonth; i++) {
879
+ const dayEl = document.createElement("button");
880
+ dayEl.className = `ina-ss-range-datepicker__calendar-day outside-month`;
881
+ dayEl.textContent = daysInPrevMonth - firstDayOfMonth + 1 + i;
882
+ dayEl.disabled = true;
883
+ targetContentEl.appendChild(dayEl);
884
+ }
885
+ const today = /* @__PURE__ */ new Date();
886
+ for (let i = 1; i <= daysInMonth; i++) {
887
+ const dayEl = document.createElement("button");
888
+ dayEl.className = `ina-ss-range-datepicker__calendar-day`;
889
+ dayEl.textContent = i;
890
+ dayEl.dataset.date = new Date(year, month, i).toISOString();
891
+ if (fromSelectedDate && new Date(year, month, i).getTime() === fromSelectedDate?.getTime()) {
892
+ dayEl.classList.add("selected-from");
893
+ }
894
+ if (toSelectedDate && new Date(year, month, i).getTime() === toSelectedDate?.getTime()) {
895
+ dayEl.classList.add("selected-to");
896
+ }
897
+ if (toSelectedDate && new Date(year, month, i) === toSelectedDate) {
898
+ dayEl.classList.add("selected-to");
899
+ }
900
+ if (fromSelectedDate && toSelectedDate && new Date(year, month, i) > fromSelectedDate && new Date(year, month, i) < toSelectedDate) {
901
+ dayEl.classList.add("selected-range");
902
+ }
903
+ if (year === today.getFullYear() && month === today.getMonth() && i === today.getDate()) {
904
+ const marker = document.createElement("span");
905
+ marker.className = `ina-ss-range-datepicker__today-marker`;
906
+ marker.textContent = "Hari ini";
907
+ dayEl.appendChild(marker);
908
+ dayEl.classList.add("today");
909
+ }
910
+ if (selectedDate && year === selectedDate.getFullYear() && month === selectedDate.getMonth() && i === selectedDate.getDate()) {
911
+ dayEl.classList.add("selected");
912
+ }
913
+ targetContentEl.appendChild(dayEl);
914
+ }
915
+ const totalCells = 42;
916
+ const cellsRendered = firstDayOfMonth + daysInMonth;
917
+ const remainingCells = totalCells - cellsRendered;
918
+ for (let i = 1; i <= remainingCells; i++) {
919
+ const dayEl = document.createElement("button");
920
+ dayEl.className = `ina-ss-range-datepicker__calendar-day outside-month`;
921
+ dayEl.textContent = i;
922
+ dayEl.disabled = true;
923
+ targetContentEl.appendChild(dayEl);
924
+ }
925
+ }
926
+ function handleChangeDate(target) {
927
+ if (fromSelectedDate && toSelectedDate) {
928
+ if (target.classList.contains(
929
+ `ina-ss-range-datepicker__calendar-day`
930
+ ) && !target.classList.contains("outside-month")) {
931
+ const targetDate = new Date(target.dataset.date);
932
+ if (target.classList.contains("selected-from") || target.classList.contains("selected-to")) {
933
+ const fromSelectedDateLeftEl = datepickerLeftContent.querySelector(
934
+ `.ina-ss-range-datepicker__calendar-day.selected-from`
935
+ );
936
+ const fromSelectedDateRightEl = datepickerRightContent.querySelector(
937
+ `.ina-ss-range-datepicker__calendar-day.selected-from`
938
+ );
939
+ fromSelectedDateLeftEl?.classList.remove("selected-from");
940
+ fromSelectedDateRightEl?.classList.remove("selected-from");
941
+ const toSelectedDateLeftEl = datepickerLeftContent.querySelector(
942
+ `.ina-ss-range-datepicker__calendar-day.selected-to`
943
+ );
944
+ const toSelectedDateRightEl = datepickerRightContent.querySelector(
945
+ `.ina-ss-range-datepicker__calendar-day.selected-to`
946
+ );
947
+ toSelectedDateLeftEl?.classList.remove("selected-to");
948
+ toSelectedDateRightEl?.classList.remove("selected-to");
949
+ target.classList.add("selected-from");
950
+ target.classList.add("selected-to");
951
+ fromSelectedDate = targetDate;
952
+ toSelectedDate = targetDate;
953
+ }
954
+ if (targetDate < fromSelectedDate) {
955
+ const fromSelectedDateLeftEl = datepickerLeftContent.querySelector(
956
+ `.ina-ss-range-datepicker__calendar-day.selected-from`
957
+ );
958
+ const fromSelectedDateRightEl = datepickerRightContent.querySelector(
959
+ `.ina-ss-range-datepicker__calendar-day.selected-from`
960
+ );
961
+ fromSelectedDateLeftEl?.classList.remove("selected-from");
962
+ fromSelectedDateRightEl?.classList.remove("selected-from");
963
+ fromSelectedDate = targetDate;
964
+ target.classList.add("selected-from");
965
+ }
966
+ if (targetDate > toSelectedDate || targetDate > fromSelectedDate) {
967
+ const toSelectedDateLeftEl = datepickerLeftContent.querySelector(
968
+ `.ina-ss-range-datepicker__calendar-day.selected-to`
969
+ );
970
+ const toSelectedDateRightEl = datepickerRightContent.querySelector(
971
+ `.ina-ss-range-datepicker__calendar-day.selected-to`
972
+ );
973
+ toSelectedDateLeftEl?.classList.remove("selected-to");
974
+ toSelectedDateRightEl?.classList.remove("selected-to");
975
+ toSelectedDate = targetDate;
976
+ target.classList.add("selected-to");
977
+ }
978
+ const leftDays = datepickerLeftContent.querySelectorAll(
979
+ ".ina-ss-range-datepicker__calendar-day"
980
+ );
981
+ const rightDays = datepickerRightContent.querySelectorAll(
982
+ ".ina-ss-range-datepicker__calendar-day"
983
+ );
984
+ const leftDaysArray = Array.from(leftDays);
985
+ const rightDaysArray = Array.from(rightDays);
986
+ const leftFromIndex = leftDaysArray.findIndex(
987
+ (btn) => btn.classList.contains("selected-from")
988
+ );
989
+ const rightFromIndex = rightDaysArray.findIndex(
990
+ (btn) => btn.classList.contains("selected-from")
991
+ );
992
+ const leftToIndex = leftDaysArray.findIndex(
993
+ (btn) => btn.classList.contains("selected-to")
994
+ );
995
+ const rightToIndex = rightDaysArray.findIndex(
996
+ (btn) => btn.classList.contains("selected-to")
997
+ );
998
+ leftDaysArray.forEach(
999
+ (btn) => btn.classList.remove("selected-range")
1000
+ );
1001
+ rightDaysArray.forEach(
1002
+ (btn) => btn.classList.remove("selected-range")
1003
+ );
1004
+ if (leftFromIndex !== -1 && leftToIndex !== -1 && rightFromIndex === -1 && rightToIndex === -1) {
1005
+ for (let i = leftFromIndex + 1; i <= leftToIndex - 1; i++) {
1006
+ leftDaysArray[i].classList.add("selected-range");
1007
+ }
1008
+ }
1009
+ if (leftFromIndex !== -1 && rightToIndex !== -1) {
1010
+ for (let i = leftFromIndex + 1; i < leftDaysArray.length; i++) {
1011
+ leftDaysArray[i].classList.add("selected-range");
1012
+ }
1013
+ for (let i = 0; i < rightToIndex; i++) {
1014
+ rightDaysArray[i].classList.add("selected-range");
1015
+ }
1016
+ }
1017
+ if (leftFromIndex === -1 && leftToIndex === -1 && rightFromIndex !== -1 && rightToIndex !== -1) {
1018
+ for (let i = rightFromIndex + 1; i <= rightToIndex - 1; i++) {
1019
+ rightDaysArray[i].classList.add("selected-range");
1020
+ }
1021
+ }
1022
+ }
1023
+ } else {
1024
+ if (target.classList.contains(
1025
+ `ina-ss-range-datepicker__calendar-day`
1026
+ ) && !target.classList.contains("outside-month")) {
1027
+ if (target.classList.contains("selected-from") && target.classList.contains("selected-to")) {
1028
+ target.classList.remove("selected-from");
1029
+ target.classList.remove("selected-to");
1030
+ selectedDateTarget = null;
1031
+ } else {
1032
+ target.classList.add("selected-from");
1033
+ target.classList.add("selected-to");
1034
+ selectedDateTarget = target;
1035
+ }
1036
+ fromSelectedDate = selectedDateTarget ? new Date(selectedDateTarget.dataset.date) : null;
1037
+ toSelectedDate = selectedDateTarget ? new Date(selectedDateTarget.dataset.date) : null;
1038
+ }
1039
+ }
1040
+ rangeDatepicker.dispatchEvent(
1041
+ new CustomEvent("date:changed", {
1042
+ detail: {
1043
+ selectedDate: {
1044
+ from: fromSelectedDate,
1045
+ to: toSelectedDate
1046
+ }
1047
+ }
1048
+ })
1049
+ );
1050
+ }
1051
+ datepickerLeftContent.addEventListener("click", (e) => {
1052
+ const target = e.target;
1053
+ if (!target) return;
1054
+ handleChangeDate(target);
1055
+ });
1056
+ datepickerRightContent.addEventListener("click", (e) => {
1057
+ const target = e.target;
1058
+ if (!target) return;
1059
+ handleChangeDate(target);
1060
+ });
1061
+ function togglePopover() {
1062
+ if (rangeDatepickerPopover.style.display === "none" || rangeDatepickerPopover.style.display === "") {
1063
+ rangeDatepickerPopover.style.display = "flex";
1064
+ renderCalendar(
1065
+ datePickerLeftDate,
1066
+ currentDateLeft.getFullYear(),
1067
+ currentDateLeft.getMonth()
1068
+ );
1069
+ renderCalendar(
1070
+ datePickerRightDate,
1071
+ currentDateRight.getFullYear(),
1072
+ currentDateRight.getMonth()
1073
+ );
1074
+ } else {
1075
+ rangeDatepickerPopover.style.display = "none";
1076
+ }
1077
+ }
1078
+ function getMonthDifference(d1, d2) {
1079
+ let months;
1080
+ months = (d2.getFullYear() - d1.getFullYear()) * 12;
1081
+ months -= d1.getMonth();
1082
+ months += d2.getMonth();
1083
+ return months;
1084
+ }
1085
+ rangeDatepickerTrigger.addEventListener("click", (e) => {
1086
+ e.stopPropagation();
1087
+ togglePopover();
1088
+ });
1089
+ prevMonthButtonLeft.addEventListener("click", () => {
1090
+ currentDateLeft.setMonth(currentDateLeft.getMonth() - 1);
1091
+ renderCalendar(
1092
+ datePickerLeftDate,
1093
+ currentDateLeft.getFullYear(),
1094
+ currentDateLeft.getMonth()
1095
+ );
1096
+ });
1097
+ nextMonthButtonLeft.addEventListener("click", () => {
1098
+ const monthDiff = getMonthDifference(currentDateLeft, currentDateRight);
1099
+ currentDateLeft.setMonth(currentDateLeft.getMonth() + 1);
1100
+ renderCalendar(
1101
+ datePickerLeftDate,
1102
+ currentDateLeft.getFullYear(),
1103
+ currentDateLeft.getMonth()
1104
+ );
1105
+ if (monthDiff === 1) {
1106
+ currentDateRight.setMonth(currentDateRight.getMonth() + 1);
1107
+ renderCalendar(
1108
+ datePickerRightDate,
1109
+ currentDateRight.getFullYear(),
1110
+ currentDateRight.getMonth()
1111
+ );
1112
+ }
1113
+ });
1114
+ prevMonthButtonRight.addEventListener("click", () => {
1115
+ const monthDiff = getMonthDifference(currentDateLeft, currentDateRight);
1116
+ currentDateRight.setMonth(currentDateRight.getMonth() - 1);
1117
+ renderCalendar(
1118
+ datePickerRightDate,
1119
+ currentDateRight.getFullYear(),
1120
+ currentDateRight.getMonth()
1121
+ );
1122
+ if (monthDiff === 1) {
1123
+ currentDateLeft.setMonth(currentDateRight.getMonth() - 1);
1124
+ renderCalendar(
1125
+ datePickerLeftDate,
1126
+ currentDateLeft.getFullYear(),
1127
+ currentDateLeft.getMonth()
1128
+ );
1129
+ }
1130
+ });
1131
+ nextMonthButtonRight.addEventListener("click", () => {
1132
+ currentDateRight.setMonth(currentDateRight.getMonth() + 1);
1133
+ renderCalendar(
1134
+ datePickerRightDate,
1135
+ currentDateRight.getFullYear(),
1136
+ currentDateRight.getMonth()
1137
+ );
1138
+ });
1139
+ document.addEventListener("click", (e) => {
1140
+ if (!rangeDatepickerPopover.contains(e.target) && e.target !== rangeDatepickerTrigger && !rangeDatepickerTrigger.contains(e.target)) {
1141
+ rangeDatepickerPopover.style.display = "none";
1142
+ }
1143
+ });
1144
+ });
1145
+ }
1146
+
1147
+ // src/js/components/stateless/img-compare.js
1148
+ function initImgCompare(rootSelector = `.${PREFIX}-img-compare`) {
1149
+ document.querySelectorAll(rootSelector).forEach((imgCompare) => {
1150
+ const sliderEl = document.createElement("input");
1151
+ sliderEl.type = "range";
1152
+ sliderEl.min = "0";
1153
+ sliderEl.max = "100";
1154
+ sliderEl.value = "50";
1155
+ sliderEl.setAttribute("aria-label", "Percentage of the image to show");
1156
+ sliderEl.setAttribute("aria-valuenow", "50");
1157
+ sliderEl.setAttribute("aria-valuemin", "0");
1158
+ sliderEl.setAttribute("aria-valuemax", "100");
1159
+ sliderEl.classList.add("ina-ss-img__slider");
1160
+ sliderEl.addEventListener("input", () => {
1161
+ imgCompare.style.setProperty(
1162
+ `--${PREFIX}-position`,
1163
+ `${sliderEl.value}%`
1164
+ );
1165
+ });
1166
+ const sliderLineEl = document.createElement("div");
1167
+ sliderLineEl.classList.add("ina-ss-img__slider-line");
1168
+ const sliderButtonEl = document.createElement("button");
1169
+ sliderButtonEl.classList.add("ina-ss-img__slider-button");
1170
+ imgCompare.appendChild(sliderEl);
1171
+ imgCompare.appendChild(sliderLineEl);
1172
+ imgCompare.appendChild(sliderButtonEl);
1173
+ });
1174
+ }
1175
+
1176
+ // src/js/bundle.js
1177
+ if (typeof window !== void 0) {
1178
+ document.addEventListener("DOMContentLoaded", () => {
1179
+ initAccordion();
1180
+ initBanner();
1181
+ initButtonGroup();
1182
+ initDatepicker();
1183
+ initDropdown();
1184
+ initFileUploadBase();
1185
+ initFileUploadItem();
1186
+ initImgCompare();
1187
+ initModal();
1188
+ initRangeDatepicker();
1189
+ initTab();
1190
+ initToggle();
1191
+ });
1192
+ }
1193
+
1194
+ // src/js/index.js
1195
+ var PREFIX = "ina-ss";
1196
+ function initAll() {
1197
+ initAccordion();
1198
+ initBanner();
1199
+ initButtonGroup();
1200
+ initDatepicker();
1201
+ initDropdown();
1202
+ initFileUploadBase();
1203
+ initFileUploadItem();
1204
+ initImgCompare();
1205
+ initModal();
1206
+ initRangeDatepicker();
1207
+ initTab();
1208
+ initToggle();
1209
+ }
1210
+ export {
1211
+ PREFIX,
1212
+ initAll
1213
+ };