@lekoala/date-picker 0.1.0

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 (104) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +236 -0
  3. package/custom-elements.json +366 -0
  4. package/dist/date-picker.css +344 -0
  5. package/dist/date-picker.js +2693 -0
  6. package/dist/date-picker.min.css +1 -0
  7. package/dist/date-picker.min.js +17 -0
  8. package/dist/date-picker.standalone.min.js +361 -0
  9. package/dist/types/calendar-model.d.ts +34 -0
  10. package/dist/types/calendar-model.d.ts.map +1 -0
  11. package/dist/types/date-calendar.d.ts +228 -0
  12. package/dist/types/date-calendar.d.ts.map +1 -0
  13. package/dist/types/date-field.d.ts +94 -0
  14. package/dist/types/date-field.d.ts.map +1 -0
  15. package/dist/types/date-picker.d.ts +258 -0
  16. package/dist/types/date-picker.d.ts.map +1 -0
  17. package/dist/types/date-range.d.ts +89 -0
  18. package/dist/types/date-range.d.ts.map +1 -0
  19. package/dist/types/date.d.ts +61 -0
  20. package/dist/types/date.d.ts.map +1 -0
  21. package/dist/types/define.d.ts +2 -0
  22. package/dist/types/define.d.ts.map +1 -0
  23. package/dist/types/index.d.ts +9 -0
  24. package/dist/types/index.d.ts.map +1 -0
  25. package/dist/types/intl.d.ts +33 -0
  26. package/dist/types/intl.d.ts.map +1 -0
  27. package/dist/types/locales/ar.d.ts +22 -0
  28. package/dist/types/locales/ar.d.ts.map +1 -0
  29. package/dist/types/locales/de.d.ts +22 -0
  30. package/dist/types/locales/de.d.ts.map +1 -0
  31. package/dist/types/locales/en.d.ts +22 -0
  32. package/dist/types/locales/en.d.ts.map +1 -0
  33. package/dist/types/locales/es.d.ts +22 -0
  34. package/dist/types/locales/es.d.ts.map +1 -0
  35. package/dist/types/locales/fr.d.ts +22 -0
  36. package/dist/types/locales/fr.d.ts.map +1 -0
  37. package/dist/types/locales/hi.d.ts +22 -0
  38. package/dist/types/locales/hi.d.ts.map +1 -0
  39. package/dist/types/locales/id.d.ts +22 -0
  40. package/dist/types/locales/id.d.ts.map +1 -0
  41. package/dist/types/locales/it.d.ts +22 -0
  42. package/dist/types/locales/it.d.ts.map +1 -0
  43. package/dist/types/locales/ja.d.ts +22 -0
  44. package/dist/types/locales/ja.d.ts.map +1 -0
  45. package/dist/types/locales/ko.d.ts +22 -0
  46. package/dist/types/locales/ko.d.ts.map +1 -0
  47. package/dist/types/locales/nl.d.ts +22 -0
  48. package/dist/types/locales/nl.d.ts.map +1 -0
  49. package/dist/types/locales/pl.d.ts +22 -0
  50. package/dist/types/locales/pl.d.ts.map +1 -0
  51. package/dist/types/locales/pt-BR.d.ts +22 -0
  52. package/dist/types/locales/pt-BR.d.ts.map +1 -0
  53. package/dist/types/locales/pt-PT.d.ts +22 -0
  54. package/dist/types/locales/pt-PT.d.ts.map +1 -0
  55. package/dist/types/locales/ru.d.ts +22 -0
  56. package/dist/types/locales/ru.d.ts.map +1 -0
  57. package/dist/types/locales/tr.d.ts +22 -0
  58. package/dist/types/locales/tr.d.ts.map +1 -0
  59. package/dist/types/locales/zh-CN.d.ts +22 -0
  60. package/dist/types/locales/zh-CN.d.ts.map +1 -0
  61. package/dist/types/messages.d.ts +43 -0
  62. package/dist/types/messages.d.ts.map +1 -0
  63. package/dist/types/source.d.ts +28 -0
  64. package/dist/types/source.d.ts.map +1 -0
  65. package/docs/ACCESSIBILITY.md +128 -0
  66. package/docs/API.md +289 -0
  67. package/docs/ARCHITECTURE.md +183 -0
  68. package/docs/AT-CHECKLIST.md +63 -0
  69. package/docs/CALENDAR-INTEGRATION.md +70 -0
  70. package/docs/DECISIONS.md +40 -0
  71. package/docs/MIGRATION-FLATPICKR.md +92 -0
  72. package/docs/ROADMAP.md +105 -0
  73. package/docs/TESTING.md +73 -0
  74. package/docs/USE_CASES.md +128 -0
  75. package/package.json +174 -0
  76. package/src/calendar-model.js +80 -0
  77. package/src/date-calendar.js +800 -0
  78. package/src/date-field.js +203 -0
  79. package/src/date-picker.css +344 -0
  80. package/src/date-picker.js +1140 -0
  81. package/src/date-range.js +172 -0
  82. package/src/date.js +203 -0
  83. package/src/define.js +9 -0
  84. package/src/index.js +15 -0
  85. package/src/intl.js +155 -0
  86. package/src/locales/ar.js +20 -0
  87. package/src/locales/de.js +20 -0
  88. package/src/locales/en.js +20 -0
  89. package/src/locales/es.js +20 -0
  90. package/src/locales/fr.js +20 -0
  91. package/src/locales/hi.js +20 -0
  92. package/src/locales/id.js +20 -0
  93. package/src/locales/it.js +20 -0
  94. package/src/locales/ja.js +20 -0
  95. package/src/locales/ko.js +20 -0
  96. package/src/locales/nl.js +20 -0
  97. package/src/locales/pl.js +20 -0
  98. package/src/locales/pt-BR.js +20 -0
  99. package/src/locales/pt-PT.js +20 -0
  100. package/src/locales/ru.js +20 -0
  101. package/src/locales/tr.js +20 -0
  102. package/src/locales/zh-CN.js +20 -0
  103. package/src/messages.js +31 -0
  104. package/src/source.js +50 -0
@@ -0,0 +1,20 @@
1
+ export default {
2
+ chooseDate: "Pilih tanggal",
3
+ changeDate: "Ubah tanggal",
4
+ previousMonth: "Bulan sebelumnya",
5
+ nextMonth: "Bulan berikutnya",
6
+ month: "Bulan",
7
+ year: "Tahun",
8
+ calendar: "Pilih tanggal",
9
+ unavailable: "Tidak tersedia",
10
+ invalidDate: "Masukkan tanggal yang valid",
11
+ unavailableDate: "Tanggal ini tidak tersedia",
12
+ formatHint: "Format",
13
+ week: "Minggu",
14
+ rangeStart: "Awal rentang",
15
+ rangeInRange: "Dalam rentang",
16
+ rangeEnd: "Akhir rentang",
17
+ rangeSingle: "Rentang satu hari",
18
+ rangeOrderStart: "Mulai harus sebelum atau sama dengan akhir",
19
+ rangeOrderEnd: "Akhir harus sesudah atau sama dengan mulai",
20
+ };
@@ -0,0 +1,20 @@
1
+ export default {
2
+ chooseDate: "Scegli data",
3
+ changeDate: "Modifica data",
4
+ previousMonth: "Mese precedente",
5
+ nextMonth: "Mese successivo",
6
+ month: "Mese",
7
+ year: "Anno",
8
+ calendar: "Scegli una data",
9
+ unavailable: "Non disponibile",
10
+ invalidDate: "Inserisci una data valida",
11
+ unavailableDate: "Questa data non è disponibile",
12
+ formatHint: "Formato",
13
+ week: "Settimana",
14
+ rangeStart: "Inizio intervallo",
15
+ rangeInRange: "Nell'intervallo",
16
+ rangeEnd: "Fine intervallo",
17
+ rangeSingle: "Intervallo di un giorno",
18
+ rangeOrderStart: "L’inizio deve essere prima o uguale alla fine",
19
+ rangeOrderEnd: "La fine deve essere dopo o uguale all’inizio",
20
+ };
@@ -0,0 +1,20 @@
1
+ export default {
2
+ chooseDate: "日付を選択",
3
+ changeDate: "日付を変更",
4
+ previousMonth: "前の月",
5
+ nextMonth: "次の月",
6
+ month: "月",
7
+ year: "年",
8
+ calendar: "日付を選択",
9
+ unavailable: "利用できません",
10
+ invalidDate: "有効な日付を入力してください",
11
+ unavailableDate: "この日付は利用できません",
12
+ formatHint: "形式",
13
+ week: "週",
14
+ rangeStart: "範囲の開始",
15
+ rangeInRange: "範囲内",
16
+ rangeEnd: "範囲の終了",
17
+ rangeSingle: "1日の範囲",
18
+ rangeOrderStart: "開始は終了以前である必要があります",
19
+ rangeOrderEnd: "終了は開始以降である必要があります",
20
+ };
@@ -0,0 +1,20 @@
1
+ export default {
2
+ chooseDate: "날짜 선택",
3
+ changeDate: "날짜 변경",
4
+ previousMonth: "이전 달",
5
+ nextMonth: "다음 달",
6
+ month: "월",
7
+ year: "년",
8
+ calendar: "날짜 선택",
9
+ unavailable: "사용할 수 없음",
10
+ invalidDate: "유효한 날짜를 입력하세요",
11
+ unavailableDate: "이 날짜는 사용할 수 없습니다",
12
+ formatHint: "형식",
13
+ week: "주",
14
+ rangeStart: "범위 시작",
15
+ rangeInRange: "범위 내",
16
+ rangeEnd: "범위 끝",
17
+ rangeSingle: "하루 범위",
18
+ rangeOrderStart: "시작은 종료와 같거나 이전이어야 합니다",
19
+ rangeOrderEnd: "종료는 시작과 같거나 이후이어야 합니다",
20
+ };
@@ -0,0 +1,20 @@
1
+ export default {
2
+ chooseDate: "Datum kiezen",
3
+ changeDate: "Datum wijzigen",
4
+ previousMonth: "Vorige maand",
5
+ nextMonth: "Volgende maand",
6
+ month: "Maand",
7
+ year: "Jaar",
8
+ calendar: "Kies een datum",
9
+ unavailable: "Niet beschikbaar",
10
+ invalidDate: "Voer een geldige datum in",
11
+ unavailableDate: "Deze datum is niet beschikbaar",
12
+ formatHint: "Formaat",
13
+ week: "Week",
14
+ rangeStart: "Begin van bereik",
15
+ rangeInRange: "Binnen bereik",
16
+ rangeEnd: "Einde van bereik",
17
+ rangeSingle: "Bereik van één dag",
18
+ rangeOrderStart: "Begin moet voor of op einde liggen",
19
+ rangeOrderEnd: "Einde moet na of op begin liggen",
20
+ };
@@ -0,0 +1,20 @@
1
+ export default {
2
+ chooseDate: "Wybierz datę",
3
+ changeDate: "Zmień datę",
4
+ previousMonth: "Poprzedni miesiąc",
5
+ nextMonth: "Następny miesiąc",
6
+ month: "Miesiąc",
7
+ year: "Rok",
8
+ calendar: "Wybierz datę",
9
+ unavailable: "Niedostępne",
10
+ invalidDate: "Wprowadź prawidłową datę",
11
+ unavailableDate: "Ta data jest niedostępna",
12
+ formatHint: "Format",
13
+ week: "Tydzień",
14
+ rangeStart: "Początek zakresu",
15
+ rangeInRange: "W zakresie",
16
+ rangeEnd: "Koniec zakresu",
17
+ rangeSingle: "Zakres jednodniowy",
18
+ rangeOrderStart: "Początek musi być przed lub równy końcowi",
19
+ rangeOrderEnd: "Koniec musi być po lub równy początkowi",
20
+ };
@@ -0,0 +1,20 @@
1
+ export default {
2
+ chooseDate: "Escolher data",
3
+ changeDate: "Alterar data",
4
+ previousMonth: "Mês anterior",
5
+ nextMonth: "Próximo mês",
6
+ month: "Mês",
7
+ year: "Ano",
8
+ calendar: "Escolha uma data",
9
+ unavailable: "Indisponível",
10
+ invalidDate: "Informe uma data válida",
11
+ unavailableDate: "Esta data não está disponível",
12
+ formatHint: "Formato",
13
+ week: "Semana",
14
+ rangeStart: "Início do intervalo",
15
+ rangeInRange: "Dentro do intervalo",
16
+ rangeEnd: "Fim do intervalo",
17
+ rangeSingle: "Intervalo de um dia",
18
+ rangeOrderStart: "O início deve ser antes ou igual ao fim",
19
+ rangeOrderEnd: "O fim deve ser depois ou igual ao início",
20
+ };
@@ -0,0 +1,20 @@
1
+ export default {
2
+ chooseDate: "Escolher data",
3
+ changeDate: "Alterar data",
4
+ previousMonth: "Mês anterior",
5
+ nextMonth: "Mês seguinte",
6
+ month: "Mês",
7
+ year: "Ano",
8
+ calendar: "Escolha uma data",
9
+ unavailable: "Indisponível",
10
+ invalidDate: "Introduza uma data válida",
11
+ unavailableDate: "Esta data não está disponível",
12
+ formatHint: "Formato",
13
+ week: "Semana",
14
+ rangeStart: "Início do intervalo",
15
+ rangeInRange: "Dentro do intervalo",
16
+ rangeEnd: "Fim do intervalo",
17
+ rangeSingle: "Intervalo de um dia",
18
+ rangeOrderStart: "O início deve ser antes ou igual ao fim",
19
+ rangeOrderEnd: "O fim deve ser depois ou igual ao início",
20
+ };
@@ -0,0 +1,20 @@
1
+ export default {
2
+ chooseDate: "Выберите дату",
3
+ changeDate: "Изменить дату",
4
+ previousMonth: "Предыдущий месяц",
5
+ nextMonth: "Следующий месяц",
6
+ month: "Месяц",
7
+ year: "Год",
8
+ calendar: "Выберите дату",
9
+ unavailable: "Недоступно",
10
+ invalidDate: "Введите корректную дату",
11
+ unavailableDate: "Эта дата недоступна",
12
+ formatHint: "Формат",
13
+ week: "Неделя",
14
+ rangeStart: "Начало диапазона",
15
+ rangeInRange: "Внутри диапазона",
16
+ rangeEnd: "Конец диапазона",
17
+ rangeSingle: "Однодневный диапазон",
18
+ rangeOrderStart: "Начало должно быть раньше или равно концу",
19
+ rangeOrderEnd: "Конец должен быть позже или равен началу",
20
+ };
@@ -0,0 +1,20 @@
1
+ export default {
2
+ chooseDate: "Tarih seç",
3
+ changeDate: "Tarihi değiştir",
4
+ previousMonth: "Önceki ay",
5
+ nextMonth: "Sonraki ay",
6
+ month: "Ay",
7
+ year: "Yıl",
8
+ calendar: "Bir tarih seç",
9
+ unavailable: "Uygun değil",
10
+ invalidDate: "Geçerli bir tarih girin",
11
+ unavailableDate: "Bu tarih uygun değil",
12
+ formatHint: "Biçim",
13
+ week: "Hafta",
14
+ rangeStart: "Aralık başlangıcı",
15
+ rangeInRange: "Aralık içinde",
16
+ rangeEnd: "Aralık sonu",
17
+ rangeSingle: "Tek günlük aralık",
18
+ rangeOrderStart: "Başlangıç, bitişten önce veya eşit olmalı",
19
+ rangeOrderEnd: "Bitiş, başlangıçtan sonra veya eşit olmalı",
20
+ };
@@ -0,0 +1,20 @@
1
+ export default {
2
+ chooseDate: "选择日期",
3
+ changeDate: "更改日期",
4
+ previousMonth: "上个月",
5
+ nextMonth: "下个月",
6
+ month: "月",
7
+ year: "年",
8
+ calendar: "选择日期",
9
+ unavailable: "不可用",
10
+ invalidDate: "请输入有效日期",
11
+ unavailableDate: "此日期不可用",
12
+ formatHint: "格式",
13
+ week: "周",
14
+ rangeStart: "范围开始",
15
+ rangeInRange: "范围内",
16
+ rangeEnd: "范围结束",
17
+ rangeSingle: "一天的区间",
18
+ rangeOrderStart: "开始日期必须早于或等于结束日期",
19
+ rangeOrderEnd: "结束日期必须晚于或等于开始日期",
20
+ };
@@ -0,0 +1,31 @@
1
+ export const DEFAULT_MESSAGES = {
2
+ chooseDate: "Choose date",
3
+ changeDate: "Change date",
4
+ previousMonth: "Previous month",
5
+ nextMonth: "Next month",
6
+ month: "Month",
7
+ year: "Year",
8
+ calendar: "Choose a date",
9
+ unavailable: "Unavailable",
10
+ invalidDate: "Enter a valid date",
11
+ unavailableDate: "This date is unavailable",
12
+ formatHint: "Format",
13
+ week: "Week",
14
+ rangeStart: "Range start",
15
+ rangeInRange: "Inside range",
16
+ rangeEnd: "Range end",
17
+ rangeSingle: "Range of one day",
18
+ rangeOrderStart: "Start must be on or before end",
19
+ rangeOrderEnd: "End must be on or after start",
20
+ };
21
+
22
+ let defaults = { ...DEFAULT_MESSAGES };
23
+
24
+ export function getDefaultMessages() {
25
+ return { ...defaults };
26
+ }
27
+
28
+ /** @param {Partial<typeof DEFAULT_MESSAGES>} messages */
29
+ export function setDefaultMessages(messages) {
30
+ defaults = { ...defaults, ...messages };
31
+ }
package/src/source.js ADDED
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Normalize source payloads to a Map keyed by canonical date.
3
+ * Accepted shapes: { dates: {...} }, { "YYYY-MM-DD": {...} }, or [{date,...}].
4
+ * @param {unknown} payload
5
+ * @returns {Map<string, Record<string, unknown>>}
6
+ */
7
+ export function normalizeDateStates(payload) {
8
+ const raw =
9
+ payload && typeof payload === "object" && !Array.isArray(payload) && "dates" in payload
10
+ ? /** @type {{dates:unknown}} */ (payload).dates
11
+ : payload;
12
+ const map = new Map();
13
+ if (Array.isArray(raw)) {
14
+ for (const item of raw) {
15
+ if (!item || typeof item !== "object" || !("date" in item)) continue;
16
+ const { date, ...state } = /** @type {{date:string} & Record<string, unknown>} */ (item);
17
+ map.set(String(date), state);
18
+ }
19
+ return map;
20
+ }
21
+ if (raw && typeof raw === "object") {
22
+ for (const [date, state] of Object.entries(raw)) {
23
+ map.set(date, state && typeof state === "object" ? /** @type {Record<string, unknown>} */ (state) : {});
24
+ }
25
+ }
26
+ return map;
27
+ }
28
+
29
+ /**
30
+ * Small fetch adapter for legacy/configUrl-like endpoints.
31
+ * @param {string | URL} url
32
+ * @param {{map?:(payload:unknown)=>unknown, params?:(range:{start:string,end:string})=>Record<string,string>}} [options]
33
+ */
34
+ export function createFetchSource(url, options = {}) {
35
+ return {
36
+ /** @param {{start:string,end:string}} range @param {{signal?:AbortSignal}} [context] */
37
+ async load(range, context = {}) {
38
+ const target = new URL(
39
+ String(url),
40
+ typeof document !== "undefined" ? document.baseURI : "http://localhost/",
41
+ );
42
+ const params = options.params ? options.params(range) : range;
43
+ for (const [key, value] of Object.entries(params)) target.searchParams.set(key, String(value));
44
+ const response = await fetch(target, { signal: context.signal });
45
+ if (!response.ok) throw new Error(`Date source failed with HTTP ${response.status}`);
46
+ const payload = await response.json();
47
+ return options.map ? options.map(payload) : payload;
48
+ },
49
+ };
50
+ }