@kashi-ui/elements 0.25.0 → 1.0.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 (70) hide show
  1. package/README.md +11 -1
  2. package/dist/appointment.d.ts +40 -0
  3. package/dist/appointment.js +175 -0
  4. package/dist/base.d.ts +408 -0
  5. package/dist/base.js +31 -0
  6. package/dist/basic.d.ts +43 -0
  7. package/dist/basic.js +222 -0
  8. package/dist/calendar.js +21 -20
  9. package/dist/cdn/appointment-CrIZi8Bp.js +1 -0
  10. package/dist/cdn/base-DTQ50VdG.js +1 -0
  11. package/dist/cdn/basic-CrEW2RKF.js +1 -0
  12. package/dist/cdn/calendar-CYRrdGIf.js +16 -0
  13. package/dist/cdn/charts-D6KM26Vp.js +1 -0
  14. package/dist/cdn/combobox-6EFI2qqN.js +1 -0
  15. package/dist/cdn/controls-BwebEIlf.js +1 -0
  16. package/dist/cdn/display-DFuMkcj5.js +1 -0
  17. package/dist/cdn/fields-DhLIhHQ8.js +1 -0
  18. package/dist/cdn/forms-BHivKDdC.js +1 -0
  19. package/dist/cdn/holidays-DgbIAdlt.js +1 -0
  20. package/dist/cdn/inputs-R7nEHfbV.js +1 -0
  21. package/dist/cdn/kashi-elements.js +1 -1
  22. package/dist/cdn/map-H3xiZd8Y.js +12 -0
  23. package/dist/cdn/{menu-DhrqyLgy.js → menu-BAUSubXk.js} +1 -1
  24. package/dist/cdn/nav-NK-v48B5.js +1 -0
  25. package/dist/cdn/overlay-CBv8grz3.js +1 -0
  26. package/dist/cdn/pickers-BHzNt_X8.js +1 -0
  27. package/dist/cdn/table-Bt9WVLoo.js +1 -0
  28. package/dist/cdn/text-D4a_hlwL.js +1 -0
  29. package/dist/cdn/time-DJ3p1wvd.js +1 -0
  30. package/dist/cdn/words-BdADG_9U.js +1 -0
  31. package/dist/cdn.d.ts +1 -0
  32. package/dist/cdn.js +4 -0
  33. package/dist/charts.js +27 -24
  34. package/dist/combobox.d.ts +6 -5
  35. package/dist/combobox.js +29 -20
  36. package/dist/controls.js +15 -15
  37. package/dist/display.js +17 -14
  38. package/dist/fields.js +3 -3
  39. package/dist/forms.d.ts +3 -3
  40. package/dist/forms.js +54 -47
  41. package/dist/index.d.ts +12 -2
  42. package/dist/index.js +7 -1
  43. package/dist/inputs.d.ts +3 -3
  44. package/dist/inputs.js +31 -30
  45. package/dist/map.js +16 -13
  46. package/dist/nav.js +18 -16
  47. package/dist/overlay.js +5 -5
  48. package/dist/pickers.d.ts +1 -1
  49. package/dist/pickers.js +39 -38
  50. package/dist/table.js +7 -7
  51. package/dist/toast.js +3 -3
  52. package/package.json +4 -4
  53. package/dist/cdn/base-Cmq7zeIG.js +0 -1
  54. package/dist/cdn/calendar-Dm3fq2bs.js +0 -16
  55. package/dist/cdn/charts-DNOWi4sJ.js +0 -1
  56. package/dist/cdn/combobox-ZGrZ5okg.js +0 -1
  57. package/dist/cdn/controls-K-OZcjg4.js +0 -1
  58. package/dist/cdn/digits-DE1YGT94.js +0 -1
  59. package/dist/cdn/display-C975tS7j.js +0 -1
  60. package/dist/cdn/fields-BUTaSN8m.js +0 -1
  61. package/dist/cdn/forms-C-effPKn.js +0 -1
  62. package/dist/cdn/inputs-BjOddAM7.js +0 -1
  63. package/dist/cdn/jalali-BiM5Kfep.js +0 -1
  64. package/dist/cdn/map-BHuusa4t.js +0 -12
  65. package/dist/cdn/nav-D_w5BV_K.js +0 -1
  66. package/dist/cdn/overlay-DX9un2xm.js +0 -1
  67. package/dist/cdn/pickers-BFLpUruK.js +0 -1
  68. package/dist/cdn/table-DPQfDMs-.js +0 -1
  69. package/dist/cdn/text-D1U32D6K.js +0 -1
  70. package/dist/cdn/words-9OdzG7y6.js +0 -1
package/dist/pickers.js CHANGED
@@ -1,17 +1,17 @@
1
- import { JALALI_MONTHS, formatJalali, fromISODate, parseJalali, toFaDigits, toGregorian, toISODate, toJalali } from "@kashi-ui/persian";
2
- import { HTMLBase, ICONS, bool, define, emit, esc, fieldHTML, setMessages, uid } from "./base.js";
1
+ import { formatJalali, fromISODate, parseJalali, toFaDigits, toGregorian, toISODate, toJalali } from "@kashi-ui/persian";
2
+ import { bool, calendarNames, define, digitsOf, emit, esc, fieldHTML, HTMLBase, ICONS, lang, localeDigits, msg, num, setMessages, uid } from "./base.js";
3
3
  import "./calendar.js";
4
4
  const parseDate = (t) => (t ? (fromISODate(t.trim()) ?? parseJalali(t)) : null);
5
5
  const day = (d, add = 0) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + add);
6
6
  const same = (a, b) => (!a && !b) || (!!a && !!b && a.getTime() === b.getTime());
7
7
  const PRESETS = [
8
- ["۷ روز اخیر", (t) => ({ start: day(t, -6), end: t })],
9
- ["۳۰ روز اخیر", (t) => ({ start: day(t, -29), end: t })],
10
- ["این ماه", (t) => {
8
+ [(m, n) => m.last7(n(7)), (t) => ({ start: day(t, -6), end: t })],
9
+ [(m, n) => m.last30(n(30)), (t) => ({ start: day(t, -29), end: t })],
10
+ [(m) => m.thisMonth, (t) => {
11
11
  const { jy, jm } = toJalali(t);
12
12
  return { start: toGregorian(jy, jm, 1), end: t };
13
13
  }],
14
- ["ماه قبل", (t) => {
14
+ [(m) => m.lastMonth, (t) => {
15
15
  const { jy, jm } = toJalali(t);
16
16
  const [py, pm] = jm === 1 ? [jy - 1, 12] : [jy, jm - 1];
17
17
  return { start: toGregorian(py, pm, 1), end: day(toGregorian(jy, jm, 1), -1) };
@@ -61,17 +61,17 @@ export class KashiDateRangePicker extends HTMLBase {
61
61
  this.render();
62
62
  }
63
63
  fmt(d) {
64
- return formatJalali(d, { digits: this.getAttribute("digits") === "latin" ? "latin" : "fa" });
64
+ return formatJalali(d, { digits: digitsOf(this), locale: lang() });
65
65
  }
66
66
  text(r) {
67
- return r.start && r.end ? `${this.fmt(r.start)} تا ${this.fmt(r.end)}` : null;
67
+ return r.start && r.end ? `${this.fmt(r.start)}${msg().common.range}${this.fmt(r.end)}` : null;
68
68
  }
69
69
  render() {
70
70
  this.close(false);
71
71
  const id = this.key;
72
- const label = this.getAttribute("label") ?? "بازهٔ تاریخ";
72
+ const label = this.getAttribute("label") ?? msg().dateRange.label;
73
73
  const text = this.text(this.current);
74
- const control = `<div class="k-datepicker k-daterange"><div class="k-select"><button id="${id}" type="button" class="k-select__control k-daterange__trigger" aria-haspopup="dialog" aria-expanded="false"${text ? "" : ' data-placeholder=""'}${this.hasAttribute("disabled") ? " disabled" : ""}>${ICONS.calendar}<span>${esc(text ?? this.getAttribute("placeholder") ?? "انتخاب بازهٔ تاریخ")}</span></button></div></div>`;
74
+ const control = `<div class="k-datepicker k-daterange"><div class="k-select"><button id="${id}" type="button" class="k-select__control k-daterange__trigger" aria-haspopup="dialog" aria-expanded="false"${text ? "" : ' data-placeholder=""'}${this.hasAttribute("disabled") ? " disabled" : ""}>${ICONS.calendar}<span>${esc(text ?? this.getAttribute("placeholder") ?? msg().dateRange.placeholder)}</span></button></div></div>`;
75
75
  this.querySelector(":scope > .k-field")?.remove();
76
76
  this.insertAdjacentHTML("afterbegin", fieldHTML({ id, label, control }));
77
77
  this.trigger = this.querySelector(".k-daterange__trigger");
@@ -94,9 +94,9 @@ export class KashiDateRangePicker extends HTMLBase {
94
94
  pop.id = `${this.key}-popover`;
95
95
  pop.className = "k-datepicker__popover k-daterange__popover";
96
96
  pop.setAttribute("role", "dialog");
97
- pop.setAttribute("aria-label", this.getAttribute("label") ?? "انتخاب بازهٔ تاریخ");
97
+ pop.setAttribute("aria-label", this.getAttribute("label") ?? msg().dateRange.placeholder);
98
98
  const presets = this.getAttribute("presets") === "false" ? [] : PRESETS;
99
- pop.innerHTML = `${presets.length ? `<ul class="k-daterange__presets" role="list" aria-label="میان‌برها">${presets.map(([l], i) => `<li><button type="button" class="k-daterange__preset" data-preset="${i}" aria-pressed="false">${l}</button></li>`).join("")}</ul>` : ""}<div class="k-daterange__main"><div class="k-daterange__footer"><span class="k-daterange__summary" aria-live="polite"></span><button type="button" class="k-btn k-btn--secondary k-btn--sm" data-cancel>انصراف</button><button type="button" class="k-btn k-btn--primary k-btn--sm" data-apply>تأیید</button></div></div>`;
99
+ pop.innerHTML = `${presets.length ? `<ul class="k-daterange__presets" role="list" aria-label="${esc(msg().dateRange.presets)}">${presets.map(([l], i) => `<li><button type="button" class="k-daterange__preset" data-preset="${i}" aria-pressed="false">${esc(l(msg().dateRange, (v) => num(this, v)))}</button></li>`).join("")}</ul>` : ""}<div class="k-daterange__main"><div class="k-daterange__footer"><span class="k-daterange__summary" aria-live="polite"></span><button type="button" class="k-btn k-btn--secondary k-btn--sm" data-cancel>${esc(msg().common.cancel)}</button><button type="button" class="k-btn k-btn--primary k-btn--sm" data-apply>${esc(msg().common.confirm)}</button></div></div>`;
100
100
  const cal = document.createElement("kashi-calendar");
101
101
  for (const a of ["min", "max", "digits", "holidays"]) {
102
102
  const v = this.getAttribute(a);
@@ -150,7 +150,7 @@ export class KashiDateRangePicker extends HTMLBase {
150
150
  paintDraft() {
151
151
  const pop = this.pop;
152
152
  const r = this.draft;
153
- pop.querySelector(".k-daterange__summary").textContent = this.text(r) ?? (r.start ? "حالا تاریخ پایان را انتخاب کنید." : "");
153
+ pop.querySelector(".k-daterange__summary").textContent = this.text(r) ?? (r.start ? msg().dateRange.pickEnd : "");
154
154
  pop.querySelector("[data-apply]").disabled = !r.start || !r.end;
155
155
  const today = day(new Date());
156
156
  pop.querySelectorAll("[data-preset]").forEach((b, i) => {
@@ -222,11 +222,11 @@ export class KashiMonthPicker extends HTMLBase {
222
222
  return (!!min && k < min.year * 12 + min.month) || (!!max && k > max.year * 12 + max.month);
223
223
  }
224
224
  render(focus = false) {
225
- const f = (n) => (this.getAttribute("digits") === "latin" ? String(n) : toFaDigits(String(n)));
225
+ const f = (n) => (digitsOf(this) === "latin" ? String(n) : toFaDigits(String(n)));
226
226
  const t = toJalali(new Date());
227
227
  const min = this.parse(this.getAttribute("min")), max = this.parse(this.getAttribute("max"));
228
228
  const y = this.year;
229
- this.innerHTML = `<div class="k-monthpicker" role="group" aria-label="${esc(this.getAttribute("label") ?? "انتخاب ماه")}"><div class="k-monthpicker__header"><button type="button" class="k-btn k-btn--tertiary k-btn--icon k-btn--sm" data-year="-1" aria-label="سال قبل"${min && y <= min.year ? " disabled" : ""}>${ARROW(false)}</button><span class="k-monthpicker__year" aria-live="polite">${f(y)}</span><button type="button" class="k-btn k-btn--tertiary k-btn--icon k-btn--sm" data-year="1" aria-label="سال بعد"${max && y >= max.year ? " disabled" : ""}>${ARROW(true)}</button></div><div class="k-monthpicker__grid">${JALALI_MONTHS.map((name, i) => `<button type="button" data-month="${i + 1}" class="k-monthpicker__month" tabindex="${this.focusMonth === i + 1 ? 0 : -1}" aria-pressed="${this.selected?.year === y && this.selected.month === i + 1}" aria-label="${name} ${f(y)}"${t.jy === y && t.jm === i + 1 ? ' aria-current="date"' : ""}${this.out(y, i + 1) ? " disabled" : ""}>${name}</button>`).join("")}</div></div>`;
229
+ this.innerHTML = `<div class="k-monthpicker" role="group" aria-label="${esc(this.getAttribute("label") ?? msg().monthPicker.label)}"><div class="k-monthpicker__header"><button type="button" class="k-btn k-btn--tertiary k-btn--icon k-btn--sm" data-year="-1" aria-label="${esc(msg().monthPicker.prevYear)}"${min && y <= min.year ? " disabled" : ""}>${ARROW(false)}</button><span class="k-monthpicker__year" aria-live="polite">${f(y)}</span><button type="button" class="k-btn k-btn--tertiary k-btn--icon k-btn--sm" data-year="1" aria-label="${esc(msg().monthPicker.nextYear)}"${max && y >= max.year ? " disabled" : ""}>${ARROW(true)}</button></div><div class="k-monthpicker__grid">${calendarNames().months.map((name, i) => `<button type="button" data-month="${i + 1}" class="k-monthpicker__month" tabindex="${this.focusMonth === i + 1 ? 0 : -1}" aria-pressed="${this.selected?.year === y && this.selected.month === i + 1}" aria-label="${name} ${f(y)}"${t.jy === y && t.jm === i + 1 ? ' aria-current="date"' : ""}${this.out(y, i + 1) ? " disabled" : ""}>${name}</button>`).join("")}</div></div>`;
230
230
  const name = this.getAttribute("name");
231
231
  if (name)
232
232
  this.insertAdjacentHTML("beforeend", `<input type="hidden" name="${esc(name)}" value="${this.value}">`);
@@ -267,16 +267,16 @@ export class KashiMonthPicker extends HTMLBase {
267
267
  }
268
268
  }
269
269
  KashiMonthPicker.observedAttributes = ["value", "min", "max", "digits", "label", "name"];
270
- /** حجم فایل به فارسی: «۱٫۲ مگابایت» */
270
+ /** حجم فایل به زبان فعلی: «۱٫۲ مگابایت» یا «1.2 MB» */
271
271
  export function formatBytes(bytes) {
272
- const units = ["بایت", "کیلوبایت", "مگابایت", "گیگابایت"];
272
+ const units = msg().fileUpload.units;
273
273
  let v = bytes, i = 0;
274
274
  while (v >= 1024 && i < units.length - 1) {
275
275
  v /= 1024;
276
276
  i++;
277
277
  }
278
278
  const n = i === 0 ? String(v) : v.toFixed(v < 10 ? 1 : 0).replace(/\.0$/, "");
279
- return `${toFaDigits(n).replace(".", "٫")} ${units[i]}`;
279
+ return `${localeDigits() === "fa" ? toFaDigits(n).replace(".", "٫") : n} ${units[i]}`;
280
280
  }
281
281
  const UPLOAD = '<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M10 13V3.5m-4 4 4-4 4 4M4 13v2.5A1.5 1.5 0 0 0 5.5 17h9a1.5 1.5 0 0 0 1.5-1.5V13"/></svg>';
282
282
  const TRASH = '<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="M3.5 5.5h13M8 5.5V4h4v1.5M5 5.5l.8 10.2a1.5 1.5 0 0 0 1.5 1.3h5.4a1.5 1.5 0 0 0 1.5-1.3L15 5.5"/></svg>';
@@ -312,7 +312,7 @@ export class KashiFileUpload extends HTMLBase {
312
312
  const off = this.hasAttribute("disabled");
313
313
  const name = this.getAttribute("name");
314
314
  const accept = this.getAttribute("accept");
315
- this.innerHTML = `<div class="k-dropzone"${off ? ' data-disabled=""' : ""}><span class="k-dropzone__icon" aria-hidden="true">${UPLOAD}</span><p class="k-dropzone__title" style="margin: 0"><button type="button" class="k-dropzone__browse"${off ? " disabled" : ""}${hint ? ` aria-describedby="${k}-hint"` : ""}>${esc(this.getAttribute("label") ?? "انتخاب فایل")}</button> <span>یا فایل را اینجا رها کنید</span></p>${hint ? `<p class="k-dropzone__hint" id="${k}-hint" style="margin: 0">${esc(hint)}</p>` : ""}<input type="file" tabindex="-1" aria-hidden="true"${accept ? ` accept="${esc(accept)}"` : ""}${this.multiple ? " multiple" : ""}${name ? ` name="${esc(name)}"` : ""}></div><ul class="k-file-list" role="list" hidden></ul><span class="k-sr-only" aria-live="polite"></span>`;
315
+ this.innerHTML = `<div class="k-dropzone"${off ? ' data-disabled=""' : ""}><span class="k-dropzone__icon" aria-hidden="true">${UPLOAD}</span><p class="k-dropzone__title" style="margin: 0"><button type="button" class="k-dropzone__browse"${off ? " disabled" : ""}${hint ? ` aria-describedby="${k}-hint"` : ""}>${esc(this.getAttribute("label") ?? msg().fileUpload.browse)}</button> <span>${esc(msg().fileUpload.drop)}</span></p>${hint ? `<p class="k-dropzone__hint" id="${k}-hint" style="margin: 0">${esc(hint)}</p>` : ""}<input type="file" tabindex="-1" aria-hidden="true"${accept ? ` accept="${esc(accept)}"` : ""}${this.multiple ? " multiple" : ""}${name ? ` name="${esc(name)}"` : ""}></div><ul class="k-file-list" role="list" hidden></ul><span class="k-sr-only" aria-live="polite"></span>`;
316
316
  this.rendered = true;
317
317
  this.input = this.querySelector("input[type=file]");
318
318
  const zone = this.querySelector(".k-dropzone");
@@ -342,7 +342,7 @@ export class KashiFileUpload extends HTMLBase {
342
342
  return;
343
343
  const it = this.items.find((x) => x.id === b.dataset.remove);
344
344
  this.items = this.items.filter((x) => x.id !== b.dataset.remove);
345
- this.announce(`${it?.file.name ?? ""} حذف شد`);
345
+ this.announce(msg().common.removed(it?.file.name ?? ""));
346
346
  this.changed();
347
347
  });
348
348
  this.paint();
@@ -361,16 +361,16 @@ export class KashiFileUpload extends HTMLBase {
361
361
  const added = list.map((file, i) => {
362
362
  let error;
363
363
  if (!this.accepts(file))
364
- error = "این نوع فایل پذیرفته نیست.";
364
+ error = msg().fileUpload.wrongType;
365
365
  else if (maxSize && file.size > maxSize)
366
- error = `حجم فایل بیشتر از ${formatBytes(maxSize)} است.`;
366
+ error = msg().fileUpload.tooBig(formatBytes(maxSize));
367
367
  else if (maxFiles && kept + i >= maxFiles)
368
- error = `حداکثر ${toFaDigits(maxFiles)} فایل.`;
368
+ error = msg().fileUpload.tooMany(num(this, maxFiles));
369
369
  const up = !error && !!this.uploader;
370
370
  return { id: uid("f"), file, status: error ? "error" : up ? "uploading" : "done", progress: error ? 0 : up ? 0 : 100, error };
371
371
  });
372
372
  this.items = this.multiple ? [...this.items, ...added] : added;
373
- this.announce(added.map((a) => `${a.file.name}: ${a.error ?? (this.uploader ? "در حال بارگذاری" : "بارگذاری شد")}`).join("، "));
373
+ this.announce(added.map((a) => `${a.file.name}: ${a.error ?? (this.uploader ? msg().fileUpload.uploading : msg().fileUpload.done)}`).join(msg().common.list));
374
374
  this.changed();
375
375
  for (const it of added) {
376
376
  if (it.status !== "uploading" || !this.uploader)
@@ -381,11 +381,11 @@ export class KashiFileUpload extends HTMLBase {
381
381
  }).then(() => {
382
382
  it.status = "done";
383
383
  it.progress = 100;
384
- this.announce(`${it.file.name}: بارگذاری شد`);
384
+ this.announce(`${it.file.name}: ${msg().fileUpload.done}`);
385
385
  this.changed();
386
386
  }, (e) => {
387
387
  it.status = "error";
388
- it.error = e instanceof Error ? e.message : "خطا در بارگذاری";
388
+ it.error = e instanceof Error ? e.message : msg().fileUpload.error;
389
389
  this.announce(`${it.file.name}: ${it.error}`);
390
390
  this.changed();
391
391
  });
@@ -410,7 +410,7 @@ export class KashiFileUpload extends HTMLBase {
410
410
  const list = this.querySelector(".k-file-list");
411
411
  list.hidden = !this.items.length;
412
412
  const ext = (n) => (n.split(".").pop() ?? "").slice(0, 4).toUpperCase();
413
- list.innerHTML = this.items.map((it) => `<li class="k-file" data-status="${it.status}"><span class="k-file__icon" aria-hidden="true">${esc(ext(it.file.name))}</span><span class="k-file__name" title="${esc(it.file.name)}">${esc(it.file.name)}</span><button type="button" class="k-btn k-btn--tertiary k-btn--icon k-btn--sm k-file__remove" data-remove="${it.id}" aria-label="حذف ${esc(it.file.name)}">${TRASH}</button><span class="k-file__meta">${esc(it.error ?? `${formatBytes(it.file.size)}${it.status === "uploading" ? ` · ${toFaDigits(Math.round(it.progress))}٪` : it.status === "done" ? " · بارگذاری شد" : ""}`)}</span>${it.status === "uploading" ? `<div role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="${Math.round(it.progress)}" aria-label="در حال بارگذاری ${esc(it.file.name)}" class="k-progress k-progress--sm"><div class="k-progress__bar" style="--k-value: ${it.progress}%"></div></div>` : ""}</li>`).join("");
413
+ list.innerHTML = this.items.map((it) => `<li class="k-file" data-status="${it.status}"><span class="k-file__icon" aria-hidden="true">${esc(ext(it.file.name))}</span><span class="k-file__name" title="${esc(it.file.name)}">${esc(it.file.name)}</span><button type="button" class="k-btn k-btn--tertiary k-btn--icon k-btn--sm k-file__remove" data-remove="${it.id}" aria-label="${esc(msg().common.remove(it.file.name))}">${TRASH}</button><span class="k-file__meta">${esc(it.error ?? `${formatBytes(it.file.size)}${it.status === "uploading" ? ` · ${msg().common.percent(num(this, Math.round(it.progress)))}` : it.status === "done" ? ` · ${msg().fileUpload.done}` : ""}`)}</span>${it.status === "uploading" ? `<div role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="${Math.round(it.progress)}" aria-label="${esc(msg().fileUpload.uploadingFile(it.file.name))}" class="k-progress k-progress--sm"><div class="k-progress__bar" style="--k-value: ${it.progress}%"></div></div>` : ""}</li>`).join("");
414
414
  }
415
415
  }
416
416
  KashiFileUpload.observedAttributes = ["accept", "multiple", "max-size", "max-files", "hint", "name", "disabled", "label"];
@@ -447,7 +447,8 @@ function hsvToHex({ h, s, v }) {
447
447
  };
448
448
  return toHex(f(5), f(3), f(1));
449
449
  }
450
- const SWATCHES = [["فیروزه‌ای", "#0b8077"], ["لاجوردی", "#2740ed"], ["بنفش", "#7c3aed"], ["اناری", "#e51d2a"], ["زعفرانی", "#dd5e02"], ["پسته‌ای", "#518b25"], ["شب", "#2a2f3d"]];
450
+ const SWATCH_KEYS = [["firoozeh", "#0b8077"], ["lajvard", "#2740ed"], ["violet", "#7c3aed"], ["anar", "#e51d2a"], ["zafaran", "#dd5e02"], ["peste", "#518b25"], ["shab", "#2a2f3d"]];
451
+ const SWATCHES = () => SWATCH_KEYS.map(([k, hex]) => [msg().colorPicker.names[k], hex]);
451
452
  const SW_CHECK = '<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="2.2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m5 10.5 3.2 3L15 7"/></svg>';
452
453
  /**
453
454
  * انتخاب رنگ: رنگ‌های پیشنهادی، پنل اشباع و رنگ‌مایه، کد HEX و RGB، و کنتراست با متن سفید یا مشکی.
@@ -505,15 +506,15 @@ export class KashiColorPicker extends HTMLBase {
505
506
  swatches() {
506
507
  const attr = this.getAttribute("swatches");
507
508
  if (attr === null)
508
- return SWATCHES;
509
+ return SWATCHES();
509
510
  return attr.split(",").map((s) => s.trim().split(/\s+/)).filter(([h]) => norm(h)).map(([h, ...n]) => [n.join(" ") || h, norm(h)]);
510
511
  }
511
512
  render() {
512
513
  const k = this.key;
513
514
  const sw = this.swatches();
514
- const control = `<div class="k-color">${sw.length ? `<div class="k-color__swatches" role="radiogroup" aria-label="رنگ‌های پیشنهادی">${sw.map(([n, h]) => `<label class="k-color__swatch" style="--_sw: ${h}; --_ink: ${contrastRatio(h, "#ffffff") >= 3 ? "#fff" : "#000"}" title="${esc(n)}"><input type="radio" class="k-sr-only" name="${k}-sw" value="${h}" aria-label="${esc(n)}">${SW_CHECK}</label>`).join("")}</div>` : ""}<div class="k-color__row"><span class="k-color__anchor"><button type="button" class="k-color__preview" aria-label="انتخاب رنگ دلخواه" aria-haspopup="dialog" aria-expanded="false"></button></span><div class="k-input"><input id="${k}-hex" class="k-input__control" dir="ltr" spellcheck="false" autocomplete="off"></div></div>${this.getAttribute("show-contrast") === "false" ? "" : '<p class="k-color__contrast" aria-live="polite"><span class="k-color__sample">متن نمونه</span><span></span></p>'}</div>`;
515
+ const control = `<div class="k-color">${sw.length ? `<div class="k-color__swatches" role="radiogroup" aria-label="${esc(msg().colorPicker.swatches)}">${sw.map(([n, h]) => `<label class="k-color__swatch" style="--_sw: ${h}; --_ink: ${contrastRatio(h, "#ffffff") >= 3 ? "#fff" : "#000"}" title="${esc(n)}"><input type="radio" class="k-sr-only" name="${k}-sw" value="${h}" aria-label="${esc(n)}">${SW_CHECK}</label>`).join("")}</div>` : ""}<div class="k-color__row"><span class="k-color__anchor"><button type="button" class="k-color__preview" aria-label="${esc(msg().colorPicker.custom)}" aria-haspopup="dialog" aria-expanded="false"></button></span><div class="k-input"><input id="${k}-hex" class="k-input__control" dir="ltr" spellcheck="false" autocomplete="off"></div></div>${this.getAttribute("show-contrast") === "false" ? "" : '<p class="k-color__contrast" aria-live="polite"><span class="k-color__sample">${esc(msg().colorPicker.sample)}</span><span></span></p>'}</div>`;
515
516
  this.querySelector(":scope > .k-field")?.remove();
516
- this.insertAdjacentHTML("afterbegin", fieldHTML({ id: `${k}-hex`, label: this.getAttribute("label") ?? "رنگ", control }));
517
+ this.insertAdjacentHTML("afterbegin", fieldHTML({ id: `${k}-hex`, label: this.getAttribute("label") ?? msg().colorPicker.label, control }));
517
518
  this.rendered = true;
518
519
  this.querySelector(".k-color__swatches")?.addEventListener("change", (e) => this.pick(e.target.value));
519
520
  const hex = this.querySelector(`#${k}-hex`);
@@ -551,7 +552,7 @@ export class KashiColorPicker extends HTMLBase {
551
552
  const best = Math.max(white, black);
552
553
  const out = this.querySelector(".k-color__contrast span:last-child");
553
554
  if (out)
554
- out.textContent = `کنتراست با متن ${ink === "#ffffff" ? "سفید" : "مشکی"}: ${toFaDigits((Math.round(best * 10) / 10).toFixed(1)).replace(".", "٫")} به ۱ ${best >= 4.5 ? "(AA)" : "(کمتر از AA)"}`;
555
+ out.textContent = msg().colorPicker.contrast(ink === "#ffffff" ? "white" : "black", num(this, (Math.round(best * 10) / 10).toFixed(1)).replace(".", msg().common.decimal), best >= 4.5);
555
556
  const name = this.getAttribute("name");
556
557
  this.querySelectorAll(":scope > input[type=hidden]").forEach((el) => el.remove());
557
558
  if (name)
@@ -562,15 +563,15 @@ export class KashiColorPicker extends HTMLBase {
562
563
  }
563
564
  paintMessages(invalid) {
564
565
  const hex = this.querySelector(`#${this.key}-hex`);
565
- setMessages(this.querySelector(":scope > .k-field"), hex, `${this.key}-hex`, invalid ? "کد رنگ معتبر نیست؛ مثل ‎#0fa89b‎ وارد کنید." : null, this.getAttribute("hint"));
566
+ setMessages(this.querySelector(":scope > .k-field"), hex, `${this.key}-hex`, invalid ? msg().colorPicker.invalid : null, this.getAttribute("hint"));
566
567
  }
567
568
  openPanel() {
568
569
  const anchor = this.querySelector(".k-color__anchor");
569
570
  const p = document.createElement("div");
570
571
  p.className = "k-color__panel";
571
572
  p.setAttribute("role", "dialog");
572
- p.setAttribute("aria-label", "انتخاب رنگ دلخواه");
573
- p.innerHTML = `<div class="k-color__area" role="slider" tabindex="0" aria-label="اشباع و روشنایی"><span class="k-color__thumb"></span></div><div class="k-color__tools"><span class="k-color__current" aria-hidden="true"></span><input type="range" class="k-color__hue" min="0" max="359" aria-label="رنگ‌مایه"></div><div class="k-color__codes" dir="ltr">${["R", "G", "B"].map((ch, i) => `<label class="k-color__code"><input class="k-color__num" inputmode="numeric" data-ch="${i}" aria-label="${["قرمز", "سبز", "آبی"][i]}"><span aria-hidden="true">${ch}</span></label>`).join("")}</div>`;
573
+ p.setAttribute("aria-label", msg().colorPicker.custom);
574
+ p.innerHTML = `<div class="k-color__area" role="slider" tabindex="0" aria-label="${esc(msg().colorPicker.area)}"><span class="k-color__thumb"></span></div><div class="k-color__tools"><span class="k-color__current" aria-hidden="true"></span><input type="range" class="k-color__hue" min="0" max="359" aria-label="${esc(msg().colorPicker.hue)}"></div><div class="k-color__codes" dir="ltr">${["R", "G", "B"].map((ch, i) => `<label class="k-color__code"><input class="k-color__num" inputmode="numeric" data-ch="${i}" aria-label="${esc([msg().colorPicker.red, msg().colorPicker.green, msg().colorPicker.blue][i])}"><span aria-hidden="true">${ch}</span></label>`).join("")}</div>`;
574
575
  anchor.append(p);
575
576
  this.panel = p;
576
577
  const area = p.querySelector(".k-color__area");
@@ -619,17 +620,17 @@ export class KashiColorPicker extends HTMLBase {
619
620
  paintPanel() {
620
621
  const p = this.panel;
621
622
  const { h, s, v } = this.hsv;
622
- const pct = (n) => `${toFaDigits(Math.round(n * 100))}٪`;
623
+ const pct = (n) => msg().common.percent(num(this, Math.round(n * 100)));
623
624
  const area = p.querySelector(".k-color__area");
624
625
  area.style.setProperty("--_hue", `hsl(${h} 100% 50%)`);
625
626
  area.setAttribute("aria-valuenow", String(Math.round(s * 100)));
626
- area.setAttribute("aria-valuetext", `اشباع ${pct(s)}، روشنایی ${pct(v)}`);
627
+ area.setAttribute("aria-valuetext", msg().colorPicker.areaValue(pct(s), pct(v)));
627
628
  const thumb = p.querySelector(".k-color__thumb");
628
629
  thumb.style.left = `${s * 100}%`;
629
630
  thumb.style.top = `${(1 - v) * 100}%`;
630
631
  const hue = p.querySelector(".k-color__hue");
631
632
  hue.value = String(Math.round(h));
632
- hue.setAttribute("aria-valuetext", `${toFaDigits(Math.round(h))} درجه`);
633
+ hue.setAttribute("aria-valuetext", msg().colorPicker.degrees(num(this, Math.round(h))));
633
634
  const rgb = rgbOf(this.current);
634
635
  p.querySelectorAll(".k-color__num").forEach((el, i) => {
635
636
  if (document.activeElement !== el)
package/dist/table.js CHANGED
@@ -1,5 +1,5 @@
1
- import { normalizePersian, toFaDigits } from "@kashi-ui/persian";
2
- import { HTMLBase, afterParse, bool, define, emit, esc, uid } from "./base.js";
1
+ import { normalizePersian } from "@kashi-ui/persian";
2
+ import { afterParse, bool, define, emit, esc, HTMLBase, msg, num, uid } from "./base.js";
3
3
  import { cellNumber } from "./controls.js";
4
4
  const search = (s) => normalizePersian(s, { digits: "latin" }).toLowerCase();
5
5
  /**
@@ -123,7 +123,7 @@ export class KashiDataTable extends HTMLBase {
123
123
  const th = document.createElement("th");
124
124
  th.scope = "col";
125
125
  th.className = "k-table__check";
126
- th.innerHTML = '<input type="checkbox" class="k-checkbox" aria-label="انتخاب همهٔ ردیف‌ها">';
126
+ th.innerHTML = '<input type="checkbox" class="k-checkbox" aria-label="${esc(msg().table.selectAll)}">';
127
127
  head.prepend(th);
128
128
  th.querySelector("input").addEventListener("change", (e) => {
129
129
  const on = e.target.checked;
@@ -162,7 +162,7 @@ export class KashiDataTable extends HTMLBase {
162
162
  const td = document.createElement("td");
163
163
  td.className = "k-table__check";
164
164
  const label = tr.children[0]?.textContent?.trim();
165
- td.innerHTML = `<input type="checkbox" class="k-checkbox" aria-label="${esc(label ? `انتخاب ${label}` : "انتخاب ردیف")}">`;
165
+ td.innerHTML = `<input type="checkbox" class="k-checkbox" aria-label="${esc(label ? msg().table.selectNamed(label) : msg().table.selectRow)}">`;
166
166
  tr.prepend(td);
167
167
  tr.setAttribute("aria-selected", "false");
168
168
  td.querySelector("input").addEventListener("change", (e) => {
@@ -212,13 +212,13 @@ export class KashiDataTable extends HTMLBase {
212
212
  const box = document.createElement("div");
213
213
  box.className = "k-table-search k-field";
214
214
  box.style.marginBlockEnd = "var(--k-space-3)";
215
- box.innerHTML = `<div class="k-input k-input--sm"><input id="${id}" class="k-input__control" type="search" placeholder="جستجو در جدول" aria-label="جستجو در جدول"></div><span class="k-sr-only" aria-live="polite"></span>`;
215
+ box.innerHTML = `<div class="k-input k-input--sm"><input id="${id}" class="k-input__control" type="search" placeholder="${esc(msg().table.search)}" aria-label="${esc(msg().table.search)}"></div><span class="k-sr-only" aria-live="polite"></span>`;
216
216
  this.prepend(box);
217
217
  const input = box.querySelector("input");
218
218
  input.addEventListener("input", () => {
219
219
  this.query = input.value;
220
220
  this.apply();
221
- box.querySelector(".k-sr-only").textContent = `${toFaDigits(this.visibleRows().length)} ردیف`;
221
+ box.querySelector(".k-sr-only").textContent = msg().table.rows(num(this, this.visibleRows().length));
222
222
  });
223
223
  }
224
224
  /** مرتب‌سازی و جستجو را روی ردیف‌ها اعمال می‌کند */
@@ -258,7 +258,7 @@ export class KashiDataTable extends HTMLBase {
258
258
  body.querySelector(".k-table__empty")?.remove();
259
259
  if (q && !this.visibleRows().length) {
260
260
  const cols = ths.length;
261
- body.insertAdjacentHTML("beforeend", `<tr class="k-table__empty"><td colspan="${cols}"><p style="padding: 2rem; margin: 0; text-align: center">نتیجه‌ای پیدا نشد.</p></td></tr>`);
261
+ body.insertAdjacentHTML("beforeend", `<tr class="k-table__empty"><td colspan="${cols}"><p style="padding: 2rem; margin: 0; text-align: center">${esc(msg().common.noResults)}</p></td></tr>`);
262
262
  }
263
263
  this.selectionChanged(false);
264
264
  }
package/dist/toast.js CHANGED
@@ -1,4 +1,4 @@
1
- import { HTMLBase, ICONS, define, esc } from "./base.js";
1
+ import { define, esc, HTMLBase, ICONS, msg } from "./base.js";
2
2
  let nextId = 1;
3
3
  /** نزدیک‌ترین محل نمایش اعلان‌ها؛ اگر در صفحه نباشد یکی ساخته می‌شود */
4
4
  function toaster() {
@@ -53,13 +53,13 @@ export class KashiToaster extends HTMLBase {
53
53
  const place = this.getAttribute("placement") ?? "bottom-end";
54
54
  this.list.className = `k-toaster k-toaster--${place}`;
55
55
  this.list.dataset.placement = place;
56
- this.querySelector("section").setAttribute("aria-label", this.getAttribute("label") ?? "اعلان‌ها");
56
+ this.querySelector("section").setAttribute("aria-label", this.getAttribute("label") ?? msg().toast.region);
57
57
  }
58
58
  upsert(item) {
59
59
  if (!this.list)
60
60
  this.connectedCallback();
61
61
  const old = [...this.list.children].find((li) => li.toastId === item.id);
62
- const li = render(item, this.getAttribute("close-label") ?? "بستن اعلان", () => this.dismiss(item.id));
62
+ const li = render(item, this.getAttribute("close-label") ?? msg().toast.close, () => this.dismiss(item.id));
63
63
  if (old) {
64
64
  old.stop?.();
65
65
  old.replaceWith(li);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kashi-ui/elements",
3
- "version": "0.25.0",
3
+ "version": "1.0.0",
4
4
  "description": "وب کامپوننت‌های کاشی: فیلدهای فارسی، تقویم شمسی و کامپوننت‌های تعاملی بدون React؛ برای HTML، Vue، Svelte، Angular و وردپرس",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
@@ -27,11 +27,11 @@
27
27
  "test": "node --test test/*.test.mjs"
28
28
  },
29
29
  "dependencies": {
30
- "@kashi-ui/bank-logos": "^0.25.0",
31
- "@kashi-ui/persian": "^0.25.0"
30
+ "@kashi-ui/bank-logos": "^1.0.0",
31
+ "@kashi-ui/persian": "^1.0.0"
32
32
  },
33
33
  "peerDependencies": {
34
- "@kashi-ui/css": "^0.25.0"
34
+ "@kashi-ui/css": "^1.0.0"
35
35
  },
36
36
  "devDependencies": {
37
37
  "happy-dom": "^21.0.4",
@@ -1 +0,0 @@
1
- const e=typeof HTMLElement>`u`?class{}:HTMLElement,t=[],n=[];let r=null;function i(e,i,o=`inline`){if(typeof customElements>`u`||customElements.get(e)||(o===`block`&&t.push(e),o===`contents`&&n.push(e),a(i),customElements.define(e,i),typeof document>`u`))return;r||(r=document.createElement(`style`),r.dataset.kashiElements=``,document.head.prepend(r));let s=[t.length&&`:where(${t.join(`,`)}) { display: block; }`,n.length&&`:where(${n.join(`,`)}) { display: contents; }`].filter(Boolean);r.textContent=`@layer kashi.elements { ${s.join(` `)} }`}function a(t){let n=/* @__PURE__ */ new Set;for(let r=t.prototype;r&&r!==e.prototype;r=Object.getPrototypeOf(r))for(let[e,t]of Object.entries(Object.getOwnPropertyDescriptors(r)))t.set&&n.add(e);let r=t.prototype.connectedCallback;t.prototype.connectedCallback=function(){for(let e of n){if(!Object.prototype.hasOwnProperty.call(this,e))continue;let t=this[e];delete this[e],this[e]=t}r?.call(this)}}function o(e){typeof document<`u`&&document.readyState===`loading`?document.addEventListener(`DOMContentLoaded`,e,{once:!0}):e()}let s=0;const c=e=>`${e}-${(++s).toString(36)}`,l={"&":`&amp;`,"<":`&lt;`,">":`&gt;`,'"':`&quot;`,"'":`&#39;`},u=e=>String(e??``).replace(/[&<>"']/g,e=>l[e]),d=(e,t,n=!1)=>{let r=e.getAttribute(t);return r===null?n:r!==`false`};function f(e,t,n){e.dispatchEvent(new CustomEvent(t,{detail:n,bubbles:!0,composed:!0}))}const p=(e,t=1.7,n=!1)=>`<svg${n?` data-k-mirror=""`:``} viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="${t}" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true">${e}</svg>`,m={close:p(`<path d="m5 5 10 10M15 5 5 15"/>`),info:p(`<circle cx="10" cy="10" r="7.5"/><path d="M10 13.5V9.5M10 6.5h.01"/>`),success:p(`<circle cx="10" cy="10" r="7.5"/><path d="m6.75 10 2.25 2.25 4.25-4.5"/>`),warning:p(`<path d="M8.6 3.4 2.4 14a1.6 1.6 0 0 0 1.4 2.4h12.4a1.6 1.6 0 0 0 1.4-2.4L11.4 3.4a1.6 1.6 0 0 0-2.8 0Z"/><path d="M10 7.5v3.25M10 13.5h.01"/>`),error:p(`<circle cx="10" cy="10" r="7.5"/><path d="M10 6.5v4M10 13.5h.01"/>`),copy:p(`<rect x="7" y="7" width="10" height="10" rx="2"/><path d="M13 7V5a2 2 0 0 0-2-2H5a2 2 0 0 0-2 2v6a2 2 0 0 0 2 2h2"/>`),check:p(`<path d="m5 10.5 3.2 3L15 7"/>`,2),calendar:p(`<rect x="3" y="4.5" width="14" height="12.5" rx="2"/><path d="M3 8.5h14M7 3v3M13 3v3"/>`),prev:p(`<path d="m12 5-5 5 5 5"/>`,1.7,!0),next:p(`<path d="m8 5 5 5-5 5"/>`,1.7,!0)};function h({id:e,label:t,required:n,optional:r,control:i}){return`<div class="k-field">${t?`<div class="k-field__label-row"><label class="k-label" for="${e}">${u(t)}${n?`<span class="k-label__required" aria-hidden="true">*</span>`:``}${r?`<span class="k-label__optional">${u(r)}</span>`:``}</label></div>`:``}${i}</div>`}function g(e,t,n,r,i,a){if(e.querySelector(`:scope > .k-field__hint-row`)?.remove(),r?e.setAttribute(`data-invalid`,``):e.removeAttribute(`data-invalid`),r||i){let t=document.createElement(`div`);t.className=`k-field__hint-row`,t.innerHTML=`<div class="k-field__hints">${r?`<p class="k-hint k-hint--error" id="${n}-error">${u(r)}</p>`:``}${i?`<p class="k-hint" id="${n}-hint">${u(i)}</p>`:``}</div>`,e.append(t)}let o=[a,r?`${n}-error`:null,i?`${n}-hint`:null].filter(Boolean).join(` `);o?t.setAttribute(`aria-describedby`,o):t.removeAttribute(`aria-describedby`),r?t.setAttribute(`aria-invalid`,`true`):t.removeAttribute(`aria-invalid`);let s=t.closest(`.k-input, .k-select, .k-otp`);s?.classList.contains(`k-input`)&&(r?s.setAttribute(`data-state`,`invalid`):s.getAttribute(`data-state`)===`invalid`&&s.removeAttribute(`data-state`))}function _(e,t,n){let r=e.querySelector(`:scope > input[type=hidden][data-kashi-value]`);t?(r||(r=document.createElement(`input`),r.type=`hidden`,r.dataset.kashiValue=``,e.append(r)),r.name=t,r.value=n):r?.remove()}export{i as a,h as c,c as d,d as i,g as l,m as n,f as o,o as r,u as s,e as t,_ as u};
@@ -1,16 +0,0 @@
1
- import{a as e,c as t,d as n,i as r,l as i,n as a,o,s,t as c,u as l}from"./base-Cmq7zeIG.js";import{i as u}from"./digits-DE1YGT94.js";import{a as d,c as f,d as p,i as m,l as h,n as g,o as _,r as v,s as y,t as b,u as x}from"./jalali-BiM5Kfep.js";const S={"1-1":`عید نوروز`,"1-2":`عید نوروز`,"1-3":`عید نوروز`,"1-4":`عید نوروز`,"1-12":`روز جمهوری اسلامی`,"1-13":`روز طبیعت`,"3-14":`رحلت امام خمینی`,"3-15":`قیام ۱۵ خرداد`,"11-22":`پیروزی انقلاب اسلامی`,"12-29":`ملی شدن صنعت نفت`};function C(e,{extra:t={},friday:n=!0}={}){let{jm:r,jd:i}=p(e);return t[`${e.getFullYear()}-${String(e.getMonth()+1).padStart(2,`0`)}-${String(e.getDate()).padStart(2,`0`)}`]??t[`${r}-${i}`]??S[`${r}-${i}`]??(n&&e.getDay()===5?`جمعه`:null)}const w=(e,t)=>!!e&&!!t&&e.getFullYear()===t.getFullYear()&&e.getMonth()===t.getMonth()&&e.getDate()===t.getDate(),T=e=>new Date(e.getFullYear(),e.getMonth(),e.getDate()),E=(e,t)=>new Date(e.getFullYear(),e.getMonth(),e.getDate()+t),D=e=>`${e.getFullYear()}-${e.getMonth()+1}-${e.getDate()}`;function O(e,t){let{jy:n,jm:r,jd:i}=p(e),a=n*12+(r-1)+t,o=Math.floor(a/12),s=a-o*12+1;return h(o,s,Math.min(i,_(o,s)))}const k=e=>e?d(e.trim())??f(e):null;var A=class extends c{constructor(){super(...arguments),this.rangeValue=null,this.hover=null,this.selected=null,this.valueSet=!1,this.focused=T(/* @__PURE__ */ new Date),this.refocus=!1,this.rendered=!1,this.key=n(`kashi-cal`),this.onClick=e=>{let t=e.target.closest(`button`);if(!t||!this.contains(t))return;let n=t.dataset.nav;if(n)this.go(O(this.focused,n===`prev`?-1:1),!1);else if(t.dataset.today!==void 0){let e=/* @__PURE__ */ new Date;this.pick(new Date(e.getFullYear(),e.getMonth(),e.getDate()))}else if(t.dataset.day){let[e,n,r]=t.dataset.day.split(`-`).map(Number);this.pick(new Date(e,n-1,r))}},this.onSelect=e=>{let t=e.target;if(!t.matches?.(`.k-calendar__select`))return;e.stopPropagation();let{jy:n,jm:r,jd:i}=p(this.focused),a=t.dataset.part===`year`?Number(t.value):n,o=t.dataset.part===`month`?Number(t.value):r;this.go(h(a,o,Math.min(i,_(a,o))),!1),this.querySelector(`.k-calendar__select[data-part="${t.dataset.part}"]`)?.focus()},this.onKey=e=>{if(!e.target.classList?.contains(`k-calendar__day`))return;let t=getComputedStyle(this).direction===`rtl`,n=this.focused,r=y(n),i={ArrowLeft:()=>E(n,t?1:-1),ArrowRight:()=>E(n,t?-1:1),ArrowUp:()=>E(n,-7),ArrowDown:()=>E(n,7),Home:()=>E(n,-r),End:()=>E(n,6-r),PageUp:()=>O(n,e.shiftKey?-12:-1),PageDown:()=>O(n,e.shiftKey?12:1)};i[e.key]&&(e.preventDefault(),this.go(i[e.key]()))}}get range(){return this.rangeValue}set range(e){this.rangeValue=e,e?.start&&(this.focused=this.clamp(T(e.start))),this.rendered&&this.render()}connectedCallback(){if(!this.rendered){this.valueSet||(this.selected=k(this.getAttribute(`value`))),this.focused=this.clamp(T(this.selected??/* @__PURE__ */ new Date)),this.addEventListener(`click`,this.onClick),this.addEventListener(`keydown`,this.onKey),this.addEventListener(`change`,this.onSelect);let e=e=>{let t=e.target.closest?.(`.k-calendar__day`)?.dataset.day;if(!this.rangeValue?.start||this.rangeValue.end||!t)return;let[n,r,i]=t.split(`-`).map(Number);this.hover=new Date(n,r-1,i),this.paintRange()};this.addEventListener(`pointerover`,e),this.addEventListener(`focusin`,e)}this.rendered=!0,this.render()}attributeChangedCallback(e,t,n){this.rendered&&t!==n&&(e===`value`&&(this.selected=k(n),this.selected&&(this.focused=T(this.selected))),this.render())}get value(){return this.selected?x(this.selected):``}set value(e){this.valueSet=!0,this.selected=k(e??``),this.selected&&(this.focused=T(this.selected)),this.rendered&&this.render()}get date(){return this.selected}set date(e){this.value=e?x(e):``}focus(){this.querySelector(`.k-calendar__day[tabindex="0"]`)?.focus()}get min(){return k(this.getAttribute(`min`))}get max(){return k(this.getAttribute(`max`))}clamp(e){let t=this.min,n=this.max;return t&&e<t?T(t):n&&e>n?T(n):e}disabled(e){let t=this.min,n=this.max;return!!t&&e<t||!!n&&e>n||!!this.isDateDisabled?.(e)}holiday(e){return this.holidayOf?this.holidayOf(e)||null:r(this,`holidays`)?C(e):null}go(e,t=!0){this.focused=this.clamp(e),this.refocus=t,this.render()}pick(e){this.disabled(e)||(this.selected=e,this.focused=e,this.refocus=!0,this.render(),l(this,this.getAttribute(`name`),this.value),o(this,`kashi-change`,{value:this.value,date:e}))}paintRange(){let e=this.rangeValue;if(!e)return;let t=e.start?T(e.start):null,n=e.end?T(e.end):null,r=t&&!n&&this.hover?this.hover:null,[i,a]=t&&(n||r)?[t,n??r].sort((e,t)=>+e-t):[t,t];this.querySelectorAll(`td[data-date]`).forEach(e=>{let[t,r,o]=e.dataset.date.split(`-`).map(Number),s=new Date(t,r-1,o),c=!!i&&!!a&&s>=i&&s<=a;e.setAttribute(`aria-selected`,String(c)),e.toggleAttribute(`data-in-range`,c&&!!n),e.toggleAttribute(`data-preview`,c&&!n),e.toggleAttribute(`data-range-start`,!!i&&w(s,i)),e.toggleAttribute(`data-range-end`,!!a&&w(s,a))})}render(){let e=this.getAttribute(`digits`)===`latin`?`latin`:`fa`,t=t=>e===`fa`?u(t):String(t),n=T(/* @__PURE__ */ new Date),{jy:r,jm:i}=p(this.focused),o=h(r,i,1),c=_(r,i),d=[...Array(y(o)).fill(null),...Array.from({length:c},(e,t)=>E(o,t))];for(;d.length%7;)d.push(null);let f=this.min,x=this.max,S=f?p(f).jy:p(n).jy-100,C=x?p(x).jy:p(n).jy+20,O=Array.from({length:Math.max(0,C-S+1)},(e,t)=>S+t);O.includes(r)||O.push(r),O.sort((e,t)=>e-t);let k=!!f&&o<=T(f),A=!!x&&h(r,i,c)>=T(x),j=[];for(let r=0;r<d.length;r+=7)j.push(`<tr>${d.slice(r,r+7).map(r=>{if(!r)return`<td role="gridcell"></td>`;let i=this.holiday(r),a=m(r,{style:`full`,digits:e})+(i?`، تعطیل${i===`جمعه`?``:`: ${i}`}`:``);return`<td role="gridcell" data-date="${D(r)}" aria-selected="${w(r,this.selected)}"><button type="button" class="k-calendar__day" data-day="${D(r)}" tabindex="${w(r,this.focused)?0:-1}" aria-label="${s(a)}"${i&&i!==`جمعه`?` title="${s(i)}"`:``}${i?` data-holiday=""`:``}${w(r,n)?` aria-current="date"`:``}${this.disabled(r)?` aria-disabled="true"`:``}>${t(p(r).jd)}</button></td>`}).join(``)}</tr>`);let M=this.getAttribute(`today-label`);this.innerHTML=`<div class="k-calendar" role="group" aria-label="${s(this.getAttribute(`label`)??`تقویم`)}">
2
- <div class="k-calendar__header">
3
- <button type="button" class="k-btn k-btn--tertiary k-btn--icon k-btn--sm" data-nav="prev" aria-label="ماه قبل"${k?` disabled`:``}>${a.prev}</button>
4
- <div class="k-calendar__selects">
5
- <select class="k-calendar__select" data-part="month" aria-label="ماه">${b.map((e,t)=>`<option value="${t+1}"${t+1===i?` selected`:``}>${e}</option>`).join(``)}</select>
6
- <select class="k-calendar__select" data-part="year" aria-label="سال">${O.map(e=>`<option value="${e}"${e===r?` selected`:``}>${t(e)}</option>`).join(``)}</select>
7
- </div>
8
- <button type="button" class="k-btn k-btn--tertiary k-btn--icon k-btn--sm" data-nav="next" aria-label="ماه بعد"${A?` disabled`:``}>${a.next}</button>
9
- </div>
10
- <h2 class="k-sr-only" id="${this.key}-title" aria-live="polite">${b[i-1]} ${t(r)}</h2>
11
- <table class="k-calendar__grid" role="grid" aria-labelledby="${this.key}-title">
12
- <thead><tr>${v.map((e,t)=>`<th scope="col" abbr="${g[t]}">${e}</th>`).join(``)}</tr></thead>
13
- <tbody>${j.join(``)}</tbody>
14
- </table>
15
- ${M?`<div class="k-calendar__footer"><button type="button" class="k-btn k-btn--link" data-today>${s(M)}</button></div>`:``}
16
- </div>`,l(this,this.getAttribute(`name`),this.value),this.paintRange(),this.refocus&&(this.refocus=!1,this.querySelector(`[data-day="${D(this.focused)}"]`)?.focus())}};A.observedAttributes=[`value`,`min`,`max`,`digits`,`holidays`,`label`,`today-label`,`name`];var j=class extends c{constructor(){super(...arguments),this.selected=null,this.valueSet=!1,this.invalid=!1,this.rendered=!1,this.key=n(`kashi-date`),this.pop=null,this.onOutside=e=>{this.contains(e.target)||this.close(!1)}}connectedCallback(){!this.rendered&&!this.valueSet&&(this.selected=k(this.getAttribute(`value`))),this.render()}disconnectedCallback(){this.close(!1)}attributeChangedCallback(e,t,n){this.rendered&&t!==n&&(e===`value`?(this.selected=k(n),this.invalid=!1,this.paint()):this.render())}get value(){return this.selected?x(this.selected):``}set value(e){this.valueSet=!0,this.selected=k(e??``),this.invalid=!1,this.rendered&&this.paint()}get date(){return this.selected}set date(e){this.value=e?x(e):``}focus(e){this.input?.focus(e)}get digits(){return this.getAttribute(`digits`)===`latin`?`latin`:`fa`}fmt(e){return e?m(e,{digits:this.digits}):``}render(){let e=this.key,n=this.getAttribute(`aria-label`),r=this.hasAttribute(`label`)?this.getAttribute(`label`):n?null:`تاریخ`,i=this.hasAttribute(`required`),o=this.hasAttribute(`disabled`),c=this.getAttribute(`placeholder`)??(this.digits===`fa`?`۱۴۰۳/۰۱/۰۱`:`1403/01/01`);this.close(!1),this.querySelector(`:scope > .k-datepicker`)?.remove();let l=`<div class="k-input"${o?` data-state="disabled"`:``}><input id="${e}" class="k-input__control" type="text" dir="ltr" autocomplete="off" placeholder="${s(c)}"${i?` required`:``}${o?` disabled`:``}${!r&&n?` aria-label="${s(n)}"`:``}><span class="k-input__addon"><button type="button" class="k-btn k-btn--tertiary k-btn--icon k-btn--sm k-datepicker__toggle" aria-haspopup="dialog" aria-expanded="false"${o?` disabled`:``}>${a.calendar}</button></span></div>`;this.insertAdjacentHTML(`afterbegin`,`<div class="k-datepicker">${t({id:e,label:r,required:i,control:l})}</div>`),this.input=this.querySelector(`input.k-input__control`),this.toggle=this.querySelector(`.k-datepicker__toggle`),this.input.addEventListener(`blur`,()=>this.commitText()),this.input.addEventListener(`keydown`,e=>{e.key===`Enter`&&this.commitText()}),this.toggle.addEventListener(`click`,()=>this.pop?this.close():this.open()),this.rendered=!0,this.paint()}paint(){let e=this.fmt(this.selected);!this.invalid&&this.input.value!==e&&(this.input.value=e);let t=this.getAttribute(`open-label`)??`انتخاب تاریخ از تقویم`;this.toggle.setAttribute(`aria-label`,this.selected?`${t}، ${m(this.selected,{style:`full`,digits:this.digits})}`:t);let n=this.getAttribute(`invalid-message`)??`این تاریخ معتبر نیست؛ آن را به شکل ۱۴۰۳/۰۵/۱۲ وارد کنید.`;this.input.setCustomValidity(this.invalid?n:``),i(this.querySelector(`.k-field`),this.input,this.key,this.getAttribute(`error`)||(this.invalid?n:null),this.getAttribute(`hint`)),l(this,this.getAttribute(`name`),this.value)}commitText(){let e=this.input.value.trim();if(!e)return this.commit(null);let t=f(e),n=k(this.getAttribute(`min`)),r=k(this.getAttribute(`max`));t&&!(n&&t<n)&&!(r&&t>r)&&!this.isDateDisabled?.(t)?this.commit(t):(this.invalid=!0,this.paint())}commit(e){let t=!w(e,this.selected)||e===null!=(this.selected===null);this.selected=e,this.invalid=!1,this.input.value=this.fmt(e),this.paint(),t&&o(this,`kashi-change`,{value:this.value,date:e})}open(){if(this.pop||this.hasAttribute(`disabled`))return;let e=this.querySelector(`.k-datepicker`),t=this.querySelector(`.k-input`),n=document.createElement(`div`);n.className=`k-datepicker__popover`,n.id=`${this.key}-calendar`,n.setAttribute(`role`,`dialog`),n.setAttribute(`aria-label`,this.getAttribute(`open-label`)??`انتخاب تاریخ از تقویم`),n.style.insetBlockStart=`${t.offsetTop+t.offsetHeight+6}px`;let r=document.createElement(`kashi-calendar`);for(let e of[`min`,`max`,`digits`,`holidays`]){let t=this.getAttribute(e);t!==null&&r.setAttribute(e,t)}this.selected&&r.setAttribute(`value`,x(this.selected)),r.setAttribute(`today-label`,this.getAttribute(`today-label`)??`امروز`),r.isDateDisabled=this.isDateDisabled,r.addEventListener(`kashi-change`,e=>{e.stopPropagation(),this.commit(e.detail.date),this.close()}),n.addEventListener(`keydown`,e=>{e.key===`Escape`&&(e.stopPropagation(),this.close())}),n.addEventListener(`focusout`,e=>{let t=e.relatedTarget;t&&!this.contains(t)&&this.close(!1)}),n.append(r),e.append(n),this.pop=n,this.toggle.setAttribute(`aria-expanded`,`true`),this.toggle.setAttribute(`aria-controls`,n.id),document.addEventListener(`pointerdown`,this.onOutside),r.focus()}close(e=!0){this.pop&&(this.pop.remove(),this.pop=null,document.removeEventListener(`pointerdown`,this.onOutside),this.toggle.setAttribute(`aria-expanded`,`false`),this.toggle.removeAttribute(`aria-controls`),e&&this.toggle.focus())}};j.observedAttributes=[`label`,`hint`,`error`,`required`,`disabled`,`value`,`min`,`max`,`digits`,`holidays`,`name`,`placeholder`,`invalid-message`,`aria-label`],e(`kashi-calendar`,A,`block`),e(`kashi-date-picker`,j,`block`);export{A as KashiCalendar,j as KashiDatePicker};
@@ -1 +0,0 @@
1
- import{a as e,d as t,s as n,t as r}from"./base-Cmq7zeIG.js";import{t as i}from"./digits-DE1YGT94.js";import{d as a,i as o,l as s,o as c,t as l,u}from"./jalali-BiM5Kfep.js";const d=e=>{let t=Math.abs(e),n=(e,t)=>`${i(Math.round(e*10)/10).replace(`.`,`٫`)}${t}`;return t>=1e9?n(e/1e9,` میلیارد`):t>=1e6?n(e/1e6,` م`):t>=1e3?n(e/1e3,` هزار`):i(e)};function f(e,t=4){if(e<=0)return[0];let n=e/t,r=10**Math.floor(Math.log10(n)),i=[1,2,2.5,5,10].map(e=>e*r).find(e=>e>=n);return Array.from({length:Math.ceil(e/i)+1},(e,t)=>t*i)}const p=(e,t)=>`${i(Math.round(e/(t||1)*1e3)/10).replace(`.`,`٫`)}٪`,m=e=>`var(--k-chart-${e+1})`,h=(e,t)=>{if(!e)return t;try{return JSON.parse(e)}catch{return t}};var g=class extends r{constructor(){super(...arguments),this.key=t(`kashi-chart`),this.props={}}connectedCallback(){this.draw()}attributeChangedCallback(){this.isConnected&&this.draw()}get format(){let e=this.getAttribute(`unit`);return this.fmt??(t=>`${i(Math.round(t))}${e?` ${e}`:``}`)}set format(e){this.fmt=e,this.isConnected&&this.draw()}read(e,t){return this.props[e]??h(this.getAttribute(e),t)}write(e,t){this.props[e]=t,this.isConnected&&this.draw()}get heading(){return this.getAttribute(`label`)??``}tip(e,t,r=0,i,a=[]){let o=e.querySelector(`:scope > .k-chart__tip`);if(t===null){o?.remove();return}o||(o=document.createElement(`div`),o.className=`k-chart__tip`,o.setAttribute(`aria-hidden`,`true`),e.append(o));let s=e.clientWidth;o.style.left=`${s?Math.min(Math.max(t,80),s-80):t}px`,o.style.top=`${r}px`,o.innerHTML=`${i?`<span class="k-chart__tip-title">${n(i)}</span>`:``}${a.map(e=>`<span class="k-chart__tip-row"${e.color?` style="--_c: ${e.color}"`:``}>${e.name===void 0?``:`<span>${e.color?`<i></i>`:``}${n(e.name)}</span>`}<strong>${n(e.value)}</strong></span>`).join(``)}`}at(e,t){let n=t.getBoundingClientRect(),r=e.getBoundingClientRect();return{x:r.left+r.width/2-n.left,y:r.top-n.top}}},_=class extends g{get data(){return this.read(`data`,[])}set data(e){this.write(`data`,e)}get series(){return this.read(`series`,[])}set series(e){this.write(`series`,e)}get labels(){return this.read(`labels`,[])}set labels(e){this.write(`labels`,e)}draw(){let e=this.format,t=this.series.length?this.series.slice(0,4):null,r=this.data,i=t?this.labels:r.map(e=>e.label),a=i.map((e,n)=>t?t.reduce((e,t)=>e+(t.values[n]??0),0):r[n].value),o=Math.max(0,...a),s=f(o),c=s.at(-1)||1,l=a.indexOf(o),u=this.getAttribute(`label-max`)!==`false`,p=n=>t?`${i[n]}: ${t.map(t=>`${t.name} ${e(t.values[n]??0)}`).join(`، `)}، جمع ${e(a[n])}`:`${i[n]}: ${e(a[n])}`,h=this.getAttribute(`height`);this.innerHTML=`<figure class="k-chart k-chart--bar" aria-labelledby="${this.key}-t" style="margin: 0${h?`; --k-chart-height: ${n(h)}`:``}"><figcaption class="k-chart__head"><p class="k-chart__title" id="${this.key}-t">${n(this.heading)}</p>${t&&t.length>1?`<ul class="k-chart__legend" aria-hidden="true">${t.map((e,t)=>`<li style="--_c: ${m(t)}"><span class="k-chart__key k-chart__key--box"></span>${n(e.name)}</li>`).join(``)}</ul>`:``}</figcaption><div class="k-chart__plot"><div class="k-bars__grid" aria-hidden="true">${s.map(e=>`<span data-v="${n(d(e))}"></span>`).join(``)}</div><div class="k-bars" role="list" aria-label="${n(this.heading)}">${i.map((r,i)=>`<div class="k-bars__col" role="listitem" tabindex="0" data-i="${i}" aria-label="${n(p(i))}" style="--_d: ${i*40}ms">${u&&i===l?`<span class="k-bars__value" aria-hidden="true">${n(e(a[i]))}</span>`:``}${t?`<span class="k-bars__stack" style="block-size: ${a[i]/c*100}%" aria-hidden="true">${t.map((e,t)=>`<span class="k-bars__seg" style="--_c: ${m(t)}; flex-grow: ${e.values[i]??0}"></span>`).join(``)}</span>`:`<span class="k-bars__bar" style="block-size: ${a[i]/c*100}%" aria-hidden="true"></span>`}<span class="k-bars__label" aria-hidden="true">${n(r)}</span></div>`).join(``)}</div></div></figure>`;let g=this.querySelector(`.k-chart__plot`),_=n=>{let r=Number(n.dataset.i);g.querySelector(`[data-active]`)?.removeAttribute(`data-active`),n.setAttribute(`data-active`,``);let o=this.at(n.querySelector(`.k-bars__bar, .k-bars__stack`)??n,g);this.tip(g,o.x,o.y,i[r],t?[...t.map((t,n)=>({name:t.name,value:e(t.values[r]??0),color:m(n)})),{name:`جمع`,value:e(a[r])}]:[{value:e(a[r])}])},v=()=>{g.querySelector(`[data-active]`)?.removeAttribute(`data-active`),this.tip(g,null)};g.querySelectorAll(`.k-bars__col`).forEach(e=>{e.addEventListener(`pointerenter`,()=>_(e)),e.addEventListener(`focus`,()=>_(e)),e.addEventListener(`pointerleave`,v),e.addEventListener(`blur`,v)})}};_.observedAttributes=[`label`,`data`,`labels`,`series`,`unit`,`label-max`,`height`];var v=class extends g{get data(){return this.read(`data`,[])}set data(e){this.write(`data`,e)}draw(){let e=this.format,t=this.data,r=Math.max(1,...t.map(e=>e.value)),i=t.reduce((e,t)=>e+t.value,0);this.innerHTML=`<figure class="k-chart" aria-labelledby="${this.key}-t" style="margin: 0"><figcaption class="k-chart__head"><p class="k-chart__title" id="${this.key}-t">${n(this.heading)}</p></figcaption><ol class="k-barlist" style="position: relative">${t.map((t,a)=>`<li class="k-barlist__row" data-i="${a}" style="--_d: ${a*60}ms"><span class="k-barlist__track"><span class="k-barlist__fill" style="inline-size: ${t.value/r*100}%" aria-hidden="true"></span>${t.href?`<a class="k-barlist__label" href="${n(t.href)}">${n(t.label)}</a>`:`<span class="k-barlist__label">${n(t.label)}</span>`}</span><span class="k-barlist__value">${n(e(t.value))} <span class="k-barlist__share">${p(t.value,i)}</span></span></li>`).join(``)}</ol></figure>`;let a=this.querySelector(`.k-barlist`);a.querySelectorAll(`.k-barlist__row`).forEach(n=>{n.addEventListener(`pointerenter`,()=>{let r=t[Number(n.dataset.i)];n.setAttribute(`data-active`,``);let o=this.at(n.querySelector(`.k-barlist__fill`),a);this.tip(a,o.x,o.y,r.label,[{name:`مقدار`,value:e(r.value)},{name:`سهم از کل`,value:p(r.value,i)}])}),n.addEventListener(`pointerleave`,()=>{n.removeAttribute(`data-active`),this.tip(a,null)})})}};v.observedAttributes=[`label`,`data`,`unit`];var y=class extends g{get data(){return this.read(`data`,[])}set data(e){this.write(`data`,e)}draw(){let e=this.format,t=this.data.slice(0,4),r=t.reduce((e,t)=>e+t.value,0),i=this.getAttribute(`percent`)!==`false`;this.innerHTML=`<figure class="k-chart" aria-labelledby="${this.key}-t" style="margin: 0"><figcaption class="k-chart__head"><p class="k-chart__title" id="${this.key}-t">${n(this.heading)}</p></figcaption><div class="k-proportion__wrap"><div class="k-proportion" aria-hidden="true">${t.map((e,t)=>`<span class="k-proportion__seg" data-i="${t}" style="--_c: ${m(t)}; flex-grow: ${e.value}"></span>`).join(``)}</div></div><ul class="k-proportion__legend">${t.map((t,a)=>`<li data-i="${a}" style="--_c: ${m(a)}"><span class="k-chart__key k-chart__key--box" aria-hidden="true"></span><span>${n(t.label)}</span><strong>${n(i?p(t.value,r):e(t.value))}</strong>${i?`<span class="k-proportion__abs">${n(e(t.value))}</span>`:``}</li>`).join(``)}</ul></figure>`;let a=this.querySelector(`.k-proportion__wrap`),o=e=>this.querySelectorAll(`[data-i]`).forEach(t=>t.toggleAttribute(`data-active`,Number(t.dataset.i)===e));a.querySelectorAll(`.k-proportion__seg`).forEach(n=>{n.addEventListener(`pointerenter`,()=>{let i=Number(n.dataset.i);o(i);let s=this.at(n,a);this.tip(a,s.x,s.y,void 0,[{name:t[i].label,value:p(t[i].value,r),color:m(i)},{name:`تعداد`,value:e(t[i].value)}])}),n.addEventListener(`pointerleave`,()=>{o(null),this.tip(a,null)})})}};y.observedAttributes=[`label`,`data`,`unit`,`percent`];var b=class extends g{get data(){return this.read(`data`,[])}set data(e){this.write(`data`,e)}draw(){let e=this.format,t=[...this.data].sort((e,t)=>t.value-e.value),r=t.length>5?[...t.slice(0,4),{label:`سایر`,value:t.slice(4).reduce((e,t)=>e+t.value,0)}]:t,i=r.reduce((e,t)=>e+t.value,0)||1,a=e=>e<4?m(e):`var(--k-text-quaternary)`,o=this.getAttribute(`variant`)!==`pie`,s=Number(this.getAttribute(`size`))||176,c=this.getAttribute(`total-label`)??`جمع`,l=o?40:25,u=o?16:50,d=2*Math.PI*l,f=r.length>1?o?1.6:.8:0,h=0,g=r.map(e=>{let t=e.value/i*d,n={start:h,len:t};return h+=t,n});this.innerHTML=`<figure class="k-chart k-pie" aria-labelledby="${this.key}-t" style="margin: 0"><figcaption class="k-chart__head"><p class="k-chart__title" id="${this.key}-t">${n(this.heading)}</p></figcaption><div class="k-pie__body"><div class="k-pie__plot" style="inline-size: ${s}px; block-size: ${s}px"><svg viewBox="0 0 100 100" class="k-pie__svg" aria-hidden="true">${o?`<circle cx="50" cy="50" r="${l}" fill="none" stroke="var(--k-bg-tertiary)" stroke-width="${u}"></circle>`:``}${r.map((e,t)=>`<circle class="k-pie__slice" data-i="${t}" cx="50" cy="50" r="${l}" fill="none" stroke="${a(t)}" stroke-width="${u}" stroke-dasharray="${Math.max(0,g[t].len-f)} ${d}" stroke-dashoffset="${-g[t].start}" transform="rotate(-90 50 50)" style="--_d: ${t*80}ms"></circle>`).join(``)}</svg>${o?`<div class="k-pie__center" aria-hidden="true"><strong>${n(e(i))}</strong><span>${n(c)}</span></div>`:``}</div><ul class="k-pie__legend">${r.map((t,r)=>`<li data-i="${r}" style="--_c: ${a(r)}"><span class="k-chart__key k-chart__key--box" aria-hidden="true"></span><span class="k-pie__name">${n(t.label)}</span><strong>${p(t.value,i)}</strong><span class="k-pie__abs">${n(e(t.value))}</span></li>`).join(``)}</ul></div></figure>`;let _=this.querySelector(`.k-pie__plot`),v=this.querySelector(`.k-pie__center`),y=e=>{let t=(g[e].start+g[e].len/2)/d*2*Math.PI-Math.PI/2,n=o?l:l*1.3;return{x:(50+n*Math.cos(t))/100*s,y:(50+n*Math.sin(t))/100*s-8}},b=t=>{this.querySelectorAll(`[data-i]`).forEach(e=>e.toggleAttribute(`data-active`,Number(e.dataset.i)===t)),v&&(v.innerHTML=t===null?`<strong>${n(e(i))}</strong><span>${n(c)}</span>`:`<strong>${p(r[t].value,i)}</strong><span>${n(r[t].label)}</span>`),o||(t===null?this.tip(_,null):this.tip(_,y(t).x,y(t).y,void 0,[{name:r[t].label,value:p(r[t].value,i),color:a(t)},{name:`تعداد`,value:e(r[t].value)}]))};this.querySelectorAll(`.k-pie__slice, .k-pie__legend li`).forEach(e=>e.addEventListener(`pointerenter`,()=>b(Number(e.dataset.i)))),_.addEventListener(`pointerleave`,()=>b(null)),this.querySelector(`.k-pie__legend`).addEventListener(`pointerleave`,()=>b(null))}};b.observedAttributes=[`label`,`data`,`unit`,`variant`,`total-label`,`size`];var x=class extends g{get values(){return this.props.values??(this.getAttribute(`values`)??``).split(/[,،\s]+/).filter(Boolean).map(Number).filter(e=>!Number.isNaN(e))}set values(e){this.write(`values`,e)}draw(){let e=this.values;if(!e.length){this.innerHTML=``;return}let t=Math.max(...e),r=Math.min(...e),i=Math.max(t-r,Math.abs(t)*.25)||1,a=(t+r)/2-i/2,o=e.map((t,n)=>`${n?`L`:`M`}${n/Math.max(1,e.length-1)*100},${28-(t-a)/i*24}`).join(` `),s=this.getAttribute(`tone`)??`brand`,c=s===`neutral`?`var(--k-text-tertiary)`:s===`brand`?`var(--k-text-brand)`:`var(--k-text-${s})`,l=this.getAttribute(`label`);this.innerHTML=`<svg class="k-sparkline" viewBox="0 0 100 30" preserveAspectRatio="none"${l?` role="img" aria-label="${n(l)}"`:` aria-hidden="true"`} style="color: ${c}">${this.getAttribute(`area`)===`false`?``:`<path d="${o} L100,30 L0,30 Z" fill="currentColor" opacity="0.1"></path>`}<path d="${o}" fill="none" stroke="currentColor" stroke-width="2" vector-effect="non-scaling-stroke" stroke-linejoin="round" stroke-linecap="round"></path></svg>`}};x.observedAttributes=[`values`,`tone`,`area`,`label`];var S=class extends g{constructor(){super(...arguments),this.ro=null,this.active=null}get labels(){return this.read(`labels`,[])}set labels(e){this.write(`labels`,e)}get series(){return this.read(`series`,[])}set series(e){this.write(`series`,e)}connectedCallback(){if(super.connectedCallback(),typeof ResizeObserver<`u`&&!this.ro){let e=0;this.ro=new ResizeObserver(()=>{let t=this.clientWidth;t&&t!==e&&(e=t,this.paintSvg())}),this.ro.observe(this)}}disconnectedCallback(){this.ro?.disconnect(),this.ro=null}draw(){let e=this.series.slice(0,4),t=this.format,r=this.labels,i=this.getAttribute(`height`);this.innerHTML=`<figure class="k-chart" aria-labelledby="${this.key}-t" style="margin: 0${i?`; --k-chart-height: ${n(i)}`:``}"><figcaption class="k-chart__head"><p class="k-chart__title" id="${this.key}-t">${n(this.heading)}</p>${e.length>1?`<ul class="k-chart__legend" aria-hidden="true">${e.map((e,t)=>`<li style="--_c: ${m(t)}"><span class="k-chart__key"></span>${n(e.name)}</li>`).join(``)}</ul>`:``}</figcaption><div class="k-chart__plot" tabindex="0" role="img" aria-label="${n(`${this.heading}. با کلیدهای جهت بین نقطه‌ها حرکت کنید.`)}" aria-describedby="${this.key}-live"><svg class="k-chart__svg" aria-hidden="true" direction="ltr"></svg></div><span class="k-sr-only" aria-live="polite" id="${this.key}-live"></span><table class="k-sr-only"><caption>${n(this.heading)}</caption><thead><tr><th scope="col">دوره</th>${e.map(e=>`<th scope="col">${n(e.name)}</th>`).join(``)}</tr></thead><tbody>${r.map((r,i)=>`<tr><th scope="row">${n(r)}</th>${e.map(e=>`<td>${n(t(e.values[i]))}</td>`).join(``)}</tr>`).join(``)}</tbody></table></figure>`;let a=this.querySelector(`.k-chart__plot`);a.addEventListener(`pointermove`,e=>this.pick(e.clientX)),a.addEventListener(`pointerleave`,()=>this.setActive(null)),a.addEventListener(`blur`,()=>this.setActive(null)),a.addEventListener(`keydown`,e=>{let t=getComputedStyle(a).direction===`rtl`,n=r.length,i={ArrowLeft:t?1:-1,ArrowRight:t?-1:1}[e.key];i?(e.preventDefault(),this.setActive(Math.min(n-1,Math.max(0,(this.active??(i>0?-1:n))+i)))):e.key===`Home`?this.setActive(0):e.key===`End`?this.setActive(n-1):e.key===`Escape`&&this.setActive(null)}),this.active=null,this.paintSvg()}geometry(){let e=this.querySelector(`.k-chart__plot`),t=this.series.slice(0,4),n=this.labels,r=e.clientWidth||600,i=e.clientHeight||220,a=getComputedStyle(e).direction===`rtl`,o={top:12,bottom:24,start:52,end:t.length>1?64:16},s=f(Math.max(0,...t.flatMap(e=>e.values))),c=s.at(-1)||1,l=Math.max(1,r-o.start-o.end),u=Math.max(1,i-o.top-o.bottom);return{plot:e,shown:t,labels:n,w:r,h:i,rtl:a,pad:o,ticks:s,innerW:l,innerH:u,x:e=>{let t=n.length>1?e/(n.length-1):.5;return a?r-o.start-t*l:o.start+t*l},y:e=>o.top+u-e/c*u}}paintSvg(){if(!this.querySelector(`.k-chart__plot`))return;let{plot:e,shown:t,labels:r,w:i,h:a,rtl:o,pad:s,ticks:c,innerW:l,innerH:u,x:f,y:p}=this.geometry(),h=e.querySelector(`svg`),g=o?i-s.start+8:s.start-8,_=o?`start`:`end`,v=r.length-1,y=t.map((e,t)=>({i:t,y:p(e.values[v])})).sort((e,t)=>e.y-t.y);for(let e=1;e<y.length;e++)y[e].y-y[e-1].y<14&&(y[e].y=y[e-1].y+14);let b=Object.fromEntries(y.map(e=>[e.i,e.y])),x=Math.max(1,Math.ceil(r.length/Math.max(2,Math.floor(l/64)))),S=`${this.key}-fade`,C=this.active;h.innerHTML=`<g class="k-chart__grid">${c.map(e=>`<line x1="${s.start}" x2="${i-s.end}" y1="${p(e)}" y2="${p(e)}"${o?` transform="translate(${s.end-s.start} 0)"`:``}></line>`).join(``)}</g>${c.map(e=>`<text class="k-chart__tick" x="${g}" y="${p(e)+4}" text-anchor="${_}">${n(d(e))}</text>`).join(``)}${r.map((e,t)=>t%x===0||t===v?`<text class="k-chart__tick" x="${f(t)}" y="${a-6}" text-anchor="middle">${n(e)}</text>`:``).join(``)}<defs><linearGradient id="${S}" x1="0" y1="0" x2="0" y2="1"><stop offset="0" style="stop-color: var(--k-chart-1); stop-opacity: 0.28"></stop><stop offset="1" style="stop-color: var(--k-chart-1); stop-opacity: 0"></stop></linearGradient></defs>${t.length===1&&this.getAttribute(`area`)!==`false`?`<path class="k-chart__area" fill="url(#${S})" d="M${f(0)},${p(0)} ${t[0].values.map((e,t)=>`L${f(t)},${p(e)}`).join(` `)} L${f(v)},${p(0)} Z"></path>`:``}${C===null?``:`<line class="k-chart__cross" x1="${f(C)}" x2="${f(C)}" y1="${s.top}" y2="${s.top+u}"></line>`}${t.map((e,r)=>`<g style="--_c: ${m(r)}"><path class="k-chart__line" pathLength="1" d="${e.values.map((e,t)=>`${t?`L`:`M`}${f(t)},${p(e)}`).join(` `)}"></path><circle class="k-chart__dot" cx="${f(e.values.length-1)}" cy="${p(e.values.at(-1)??0)}" r="4"></circle>${t.length>1?`<text class="k-chart__end" x="${f(v)+(o?-8:8)}" y="${b[r]+4}" text-anchor="${o?`end`:`start`}">${n(e.name)}</text>`:``}${C===null?``:`<circle class="k-chart__dot" cx="${f(C)}" cy="${p(e.values[C])}" r="4.5"></circle>`}</g>`).join(``)}`;let w=this.format;C===null?this.tip(e,null):this.tip(e,f(C),Math.min(...t.map(e=>p(e.values[C])))-6,r[C],t.map((e,t)=>({name:e.name,value:w(e.values[C]),color:m(t)}))),this.querySelector(`#${this.key}-live`).textContent=C===null?``:`${r[C]}: ${t.map(e=>`${e.name} ${w(e.values[C])}`).join(`، `)}`}pick(e){let{plot:t,labels:n,x:r}=this.geometry(),i=e-t.getBoundingClientRect().left,a=0;n.forEach((e,t)=>{Math.abs(r(t)-i)<Math.abs(r(a)-i)&&(a=t)}),a!==this.active&&this.setActive(a)}setActive(e){this.active=e,this.paintSvg()}};S.observedAttributes=[`label`,`labels`,`series`,`unit`,`area`,`height`];const C=[`ش`,``,`د`,``,`چ`,``,`ج`];var w=class extends g{get data(){return this.read(`data`,{})}set data(e){this.write(`data`,e)}draw(){let e=this.data,t=Number(this.getAttribute(`year`))||a(/* @__PURE__ */ new Date).jy,r=this.getAttribute(`unit`)??`فعالیت`,d=[];for(let n=1;n<=12;n++)for(let r=1;r<=c(t,n);r++){let i=s(t,n,r);d.push({date:i,value:e[u(i)]??0})}let f=Math.max(0,...d.map(e=>e.value)),p=e=>e<=0||f===0?0:Math.max(1,Math.ceil(e/f*4)),m=(d[0].date.getDay()+1)%7,h=e=>Math.floor((e+m)/7),g=l.map((e,t)=>({name:e,col:h(d.findIndex(e=>a(e.date).jm===t+1))})),_=d.reduce((e,t)=>e+t.value,0),v=l.map((e,t)=>({name:e,sum:d.filter(e=>a(e.date).jm===t+1).reduce((e,t)=>e+t.value,0)})),y=i(t).replace(/٬/g,``),b=this.getAttribute(`label`)??`${r} در سال ${y}`;this.innerHTML=`<figure class="k-heatmap" style="margin: 0"><div class="k-heatmap__scroll"><div role="img" aria-label="${n(`${b}: ${i(_)} ${r}`)}"><div class="k-heatmap__months" aria-hidden="true">${g.map(e=>`<span style="grid-column: ${e.col+1}">${e.name}</span>`).join(``)}</div><div class="k-heatmap__body" aria-hidden="true"><div class="k-heatmap__days">${C.map(e=>`<span>${e}</span>`).join(``)}</div><div class="k-heatmap__grid">${`<span class="k-heatmap__cell" data-empty=""></span>`.repeat(m)}${d.map((e,t)=>`<span class="k-heatmap__cell" data-l="${p(e.value)}" data-i="${t}"></span>`).join(``)}</div></div></div></div><figcaption class="k-heatmap__foot"><span>${i(_)} ${n(r)} در ${y}</span><span class="k-heatmap__scale" aria-hidden="true">کمتر ${[0,1,2,3,4].map(e=>`<span class="k-heatmap__cell" data-l="${e}"></span>`).join(``)} بیشتر</span></figcaption><table class="k-sr-only"><caption>${n(b)}، به تفکیک ماه</caption><tbody>${v.map(e=>`<tr><th scope="row">${e.name}</th><td>${i(e.sum)}</td></tr>`).join(``)}</tbody></table></figure>`;let x=this.querySelector(`figure`);this.querySelector(`.k-heatmap__grid`).addEventListener(`pointerover`,e=>{let t=e.target.closest(`[data-i]`);if(x.querySelector(`.k-heatmap__cell[data-active]`)?.removeAttribute(`data-active`),!t)return this.tip(x,null);t.setAttribute(`data-active`,``);let n=this.at(t,x),a=d[Number(t.dataset.i)];this.tip(x,n.x,n.y-2,o(a.date,{style:`full`}),[{value:`${i(a.value)} ${r}`}])}),x.addEventListener(`pointerleave`,()=>this.tip(x,null))}};w.observedAttributes=[`data`,`year`,`unit`,`label`],e(`kashi-bar-chart`,_,`block`),e(`kashi-line-chart`,S,`block`),e(`kashi-pie-chart`,b,`block`),e(`kashi-bar-list`,v,`block`),e(`kashi-proportion-bar`,y,`block`),e(`kashi-sparkline`,x),e(`kashi-activity-heatmap`,w,`block`);export{w as KashiActivityHeatmap,_ as KashiBarChart,v as KashiBarList,S as KashiLineChart,b as KashiPieChart,y as KashiProportionBar,x as KashiSparkline};
@@ -1 +0,0 @@
1
- import{a as e,c as t,d as n,l as r,o as i,r as a,s as o,t as s,u as c}from"./base-Cmq7zeIG.js";import{i as l}from"./digits-DE1YGT94.js";import{n as u}from"./text-D1U32D6K.js";const d=[{name:`آذربایجان شرقی`,capital:`تبریز`,areaCode:`41`},{name:`آذربایجان غربی`,capital:`ارومیه`,areaCode:`44`},{name:`اردبیل`,capital:`اردبیل`,areaCode:`45`},{name:`اصفهان`,capital:`اصفهان`,areaCode:`31`},{name:`البرز`,capital:`کرج`,areaCode:`26`},{name:`ایلام`,capital:`ایلام`,areaCode:`84`},{name:`بوشهر`,capital:`بوشهر`,areaCode:`77`},{name:`تهران`,capital:`تهران`,areaCode:`21`},{name:`چهارمحال و بختیاری`,capital:`شهرکرد`,areaCode:`38`},{name:`خراسان جنوبی`,capital:`بیرجند`,areaCode:`56`},{name:`خراسان رضوی`,capital:`مشهد`,areaCode:`51`},{name:`خراسان شمالی`,capital:`بجنورد`,areaCode:`58`},{name:`خوزستان`,capital:`اهواز`,areaCode:`61`},{name:`زنجان`,capital:`زنجان`,areaCode:`24`},{name:`سمنان`,capital:`سمنان`,areaCode:`23`},{name:`سیستان و بلوچستان`,capital:`زاهدان`,areaCode:`54`},{name:`فارس`,capital:`شیراز`,areaCode:`71`},{name:`قزوین`,capital:`قزوین`,areaCode:`28`},{name:`قم`,capital:`قم`,areaCode:`25`},{name:`کردستان`,capital:`سنندج`,areaCode:`87`},{name:`کرمان`,capital:`کرمان`,areaCode:`34`},{name:`کرمانشاه`,capital:`کرمانشاه`,areaCode:`83`},{name:`کهگیلویه و بویراحمد`,capital:`یاسوج`,areaCode:`74`},{name:`گلستان`,capital:`گرگان`,areaCode:`17`},{name:`گیلان`,capital:`رشت`,areaCode:`13`},{name:`لرستان`,capital:`خرم‌آباد`,areaCode:`66`},{name:`مازندران`,capital:`ساری`,areaCode:`11`},{name:`مرکزی`,capital:`اراک`,areaCode:`86`},{name:`هرمزگان`,capital:`بندرعباس`,areaCode:`76`},{name:`همدان`,capital:`همدان`,areaCode:`81`},{name:`یزد`,capital:`یزد`,areaCode:`35`}],f={"آذربایجان شرقی":/* @__PURE__ */ `آبشاحمد.آچاچی.آذرشهر.آقکند.اسکو.اهر.ایلخچی.باسمنج.بخشایش.بستان‌آباد.بناب.بناب مرند.تبریز.ترک.ترکمانچای.تسوج.تیکمهداش.تیمورلو.جلفا.جوانقلعه.خاروانا.خامنه.خداجو.خسروشاه.خمارلو.خواجه.دریان.دوزدوزان.زرنق.زنوز.سراب.سردرود.سهند.سیس.سیهرود.شبستر.شربیان.شرفخانه.شندآباد.شهریار.صوفیان.عجبشیر.قرهآغاج.کشکسرای.کلوانق.کلیبر.کوزهکنان.گوگان.لیلان.مبارک آباد.مراغه.مرند.ملکان.ملککیان.ممقان.مهربان.میانه.نظرکهریزی.وایقان.ورزقان.هادی‌شهر.هریس.هشترود.هوراند.یامچی`.split(`.`),"آذربایجان غربی":/* @__PURE__ */ `آواجیق.ارومیه.اشنویه.ایواوغلی.باروق.بازرگان.بوکان.پلدشت.پیرانشهر.تازه‌شهر.تکاب.چهاربرج.خلیفان.خوی.دیزج دیز.ربط.زرآباد.سردشت.سرو.سلماس.سیلوانه.سیمینه.سیهچشمه.شاهیندژ.شوط.فیرورق.قرهضیاءالدین.قطور.قوشچی.کشاورز.گردکشانه.ماکو.محمدیار.محمودآباد.مرگنلر.مهاباد.میاندوآب.میرآباد.نازک علیا.نالوس.نقده.نوشینشهر`.split(`.`),اردبیل:[`آبیبیگلو`,`اردبیل`,`اسلام‌آباد قدیم`,`اصلاندوز`,`انگوت`,`بیلهسوار`,`پارس‌آباد`,`جعفرآباد`,`خلخال`,`رضی`,`سرعین`,`عنبران`,`قصابه`,`کلور`,`کوراییم`,`گرمی`,`گیوی`,`لاهرود`,`مرادلو`,`مشگینشهر`,`نمین`,`نیر`,`هشجین`,`هیر`],اصفهان:/* @__PURE__ */ `آران و بیدگل.ابریشم.ابوزیدآباد.اردستان.اژیه.اشترجان.اصغرآباد.اصفهان.افوس.انارک.بادرود.باغ بهادران.باغشاد.بافران.برزک.برفانبار.بوئین و میاندشت.بهارانشهر.بهارستان.پیربکران.تودشک.تیران.جندق.جوزدان.جوشقان قالی.جوشقان و کامو.چادگان.چرمهین.چمگردان.حبیب آباد برخوار.حسن‌آباد.حنا.خالدآباد.خمینی‌شهر.خوانسار.خور.خوراسگان.خورزوق.داران.دامنه.درچهپیاز.دستگرد.دولت‌آباد.دهاقان.دهق.دیزیچه.رزوه.رضوانشهر.زازران.زایندهرود.زرینشهر.زواره.زیار.زیباشهر.سده لنجان.سفیدشهر.سگزی.سمیرم.سین.شاپورآباد.شاهینشهر.شهر جدید مجلسی.شهرضا.طالخونچه.طرق.عسگران.علویجه.فرخی.فریدونشهر.فلاورجان.فولادشهر.قمصر.قهجاورستان.قهدریجان.کاشان.کرکوند.کلیشاد و سودرجان.کمشجه.کمه.کوشک.کوهپایه.کهریزسنگ.گرگاب.گز.گلپایگان.گلدشت.گلشن.گلشهر.گوگد.لای بید.مبارکه.محمدآباد.مشکات.منظریه.مهاباد.میمه.نائین.نجف‌آباد.نصرآباد.نطنز.نوش‌آباد.نیاسر.نیک‌آباد.ورزنه.ورنامخواست.وزوان.ونک.هرند.یزدانشهر نجف آباد`.split(`.`),البرز:[`آسارا`,`اشتهارد`,`تنکمان`,`چهارباغ`,`طالقان`,`فردیس`,`کرج`,`کمالشهر`,`کوهسار`,`گرمدره`,`گلسار`,`ماهدشت`,`محمدشهر`,`مشکیندشت`,`مهستان`,`نظرآباد`],ایلام:/* @__PURE__ */ `آبدانان.آسمان‌آباد.ارکواز.ایلام.ایوان.بدره.بلاوه تره سفلی.پهله.توحید.جعفرآباد.چشمه شیرین.چوار.دره‌شهر.دلگشا.دهلران.زرنه.سرابباغ.سرابله.شباب.صالح‌آباد.لومار.ماژین.مورموری.موسیان.مهر.مهران.میمه`.split(`.`),بوشهر:/* @__PURE__ */ `آباد.آبپخش.آبدان.امام حسن.انارستان.اهرم.بادوله.برازجان.بردخون.بردستان.بندر دیر.بندر دیلم.بندر ریگ.بندر سیراف.بندر کنگان.بندر گناوه.بندو.بنک.بوشکان.بوشهر.تنگ ارم.جم.چغادک.خارگ.خورموج.دالکی.دلوار.دوراهک.ریز.سعدآباد.شبانکاره.شنبه.عالی‌شهر.عسلویه.کاکی.کلمه.نخل تقی.وحدتیه`.split(`.`),تهران:/* @__PURE__ */ `آبسرد.آبعلی.احمدآباد مستوفی.ارجمند.اسلامشهر.اندیشه.باغستان.باقرشهر.بومهن.پاکدشت.پردیس.پرند.پیشوا.تهران.جلیل‌آباد.جوادآباد.چهاردانگه.حسن‌آباد.خاورشهر.دماوند.رباطکریم.رودهن.شاهدشهر.شریف‌آباد.شمشک.شهر ری.شهریار.صالحیه.صباشهر.صفادشت.فردوسیه.فرون‌آباد.فشم.فیروزکوه.قدس.قرچک.کرشته.کهریزک.کیلان.گلستان.لواسان.ملارد.نسیم‌شهر.نصیرشهر.وحیدیه.ورامین`.split(`.`),"چهارمحال و بختیاری":/* @__PURE__ */ `آلونی.اردل.باباحیدر.بروجن.بلداجی.بن.پردنجان.تلورد.جونقان.چالشتر.چلگرد.چلیچه.دستنا.دشتک.سامان.سرخون.سردشت.سفیددشت.سودجان.سورشجان.شلمزار.شهرکرد.صمصامی.طاقانک.فارسان.فرادنبه.فرخشهر.کاج.کیان.گندمان.گوجان.گهرو.لردگان.مالخلیفه.منج نسا.ناغان.نافچ.وردنجان.هارونی.هرچگان.هفشجان.یانچشمه`.split(`.`),"خراسان جنوبی":/* @__PURE__ */ `آرینشهر.آیسک.ارسک.اسدیه.اسفدن.اسلامیه.باغستان علیا.بشرویه.بیرجند.حاجی‌آباد.خضری دشتبیاض.خوسف.درح.دیهوک.زهان.سرایان.سربیشه.سهقلعه.شوسف.طبس.طبس مسینا.عشق‌آباد.فردوس.قائن.قهستان.گزیک.محمدشهر.مود.نهبندان.نیمبلوک`.split(`.`),"خراسان رضوی":/* @__PURE__ */ `احمدآباد.انابد.باجگیران.باخرز.بار.بایگ.بجستان.بردسکن.بیدخت.بینالود.تایباد.تربت جام.تربت حیدریه.جغتای.جنگل.چاپشلو.چکنه.چناران.خرو.خلیل‌آباد.خواف.داورزن.دررود.درگز.دولت‌آباد.رادکان.رباط سنگ.رشتخوار.رضویه.رودآب.ریوش.سبزوار.سرخس.سفیدسنگ.سلامی.سلطان‌آباد.سنگان.سیدآباد.شادمهر.شاندیز.ششتمد.شهرآباد.شهرزو.شهرکهنه.صالح‌آباد.طرقبه.عشق‌آباد.فرگ قلعه.فرهادگرد.فریمان.فیروزه.فیض‌آباد.قاسم‌آباد.قدمگاه.قلندرآباد.قوچان.کاخک.کاریز.کاشمر.کدکن.کلات.کندر.گلبهار.گلمکان.گناباد.لطف‌آباد.مزداوند.مشهد.مشهد ریزه.ملک‌آباد.نسر.نشتیفان.نصرآباد.نقاب.نوخندان.نیشابور.نیلشهر.همت‌آباد.یونسی`.split(`.`),"خراسان شمالی":[`آشخانه`,`آوا`,`اسفراین`,`ایور`,`بجنورد`,`پیشقلعه`,`تیتکانلو`,`جاجرم`,`چنارانشهر`,`حصار گرمخان`,`درق`,`راز`,`زیارت`,`سنخواست`,`شوقان`,`شیروان`,`صفی‌آباد`,`فاروج`,`فیروزه`,`قاضی`,`گرمه`,`لوجلی`],خوزستان:/* @__PURE__ */ `آبادان.آبژدان.آغاجاری.ابوحمیظه.اروندکنار.الوان.الهایی.امیدیه.اندیمشک.اهواز.ایذه.باغملک.بستان.بندر امام خمینی.بندر ماهشهر.بهبهان.بیدروبهمرکزی.ترکالکی.تشان.جایزان.جنتمکان.چغامیش.چم گلک.چمران.چویبده.حر ریاحی.حسینیه.حمیدیه.خرمشهر.دارخوین.دزآب.دزفول.دهدز.رامشیر.رامهرمز.رفیع.زهره.سالند.سردشت.سماله.سوسنگرد.سیاهمنصور.شادگان.شمس‌آباد.شوش.شوشتر.شهرک حمزه.شیبان.صالح شهر.صفی‌آباد.صیدون.فتح‌المبین.قلعه خواجه.قلعهتل.کوت سیدنعیم طالقانی.کوت عبدالله.گتوند.گوریه.لالی.مسجدسلیمان.مشراگه.مقاومت.ملاثانی.منصوریه.میانرود.میانکوه.میداود.مینوشهر.ویس.هفتکل.هندیجان.هویزه`.split(`.`),زنجان:[`آببر`,`ابهر`,`ارمغانخانه`,`چورزق`,`حلب`,`خرمدره`,`دندی`,`زرین‌آباد`,`زرینرود`,`زنجان`,`سجاس`,`سلطانیه`,`سهرورد`,`صایینقلعه`,`قیدار`,`کرسف`,`گرماب`,`ماهنشان`,`نیکپی`,`هیدج`],سمنان:[`آرادان`,`امیریه`,`ایوانکی`,`بسطام`,`بیارجمند`,`دامغان`,`درجزین`,`دیباج`,`رودیان`,`سرخه`,`سمنان`,`شاهرود`,`شهمیرزاد`,`کلاته خیج`,`کلاته رودبار`,`کهن‌آباد`,`گرمسار`,`مجن`,`مهدی‌شهر`,`میامی`],"سیستان و بلوچستان":/* @__PURE__ */ `آسپیچ محمدی.ادیمی.اسپکه.ایرانشهر.بریس.بزمان.بمپور.بنت.بنجار.پیشین.جالق.چابهار.خاش.دوستمحمد.راسک.رامشار.زابل.زاهدان.زرآباد.زهک.سراوان.سرباز.سوران.سیب.سیرکان.شهرک علیاکبر.فنوج.قصرقند.کنارک.گشت.گلمورتی.محمدآباد.مهرستان.میرجاوه.نصرت‌آباد.نگور.نوک‌آباد.نیکشهر.هیدوچ`.split(`.`),فارس:/* @__PURE__ */ `آباده.آباده طشک.ارد.اردکان.ارسنجان.استهبان.اسیر.اشکنان.افزر.اقلید.اوز.اهل.ایج.ایزدخواست.باب انار.بابامنیر.بایگان.بنارویه.بوانات.بهمن.بیرم.بیضا.جنتشهر.جویم.جهرم.حاجی‌آباد.حسامی.حسن‌آباد.خانه زنیان.خانیمن.خاوران.خرامه.خشت.خنج.خور.خوزی.خومهزار.داراب.داریان.دبیران.دژکرد.دوبرجی.دوزه.دهرم.رامجرد.رونیز.زاهدشهر.زرقان.سده.سروستان.سعادتشهر.سلطانشهر.سورمق.سیدان.ششده.شهر جدید صدرا.شهرپیر.شهرک امام.شیراز.صغاد.صفاشهر.علامرودشت.عمادشهر.فاروق.فتح آباد.فدامی.فراشبند.فسا.فیروزآباد.فیشور.قائمیه.قادرآباد.قرهبلاغ.قطب‌آباد.قطرویه.قیر.کازرون.کامفیروز.کرهای.کنارتخته.کوار.کوپن.کوهنجان.گراش.گلهدار.گویم.لار.لامرد.لپوئی.لطیفی.مادرسلیمان.مرودشت.مزایجان.مشکان.مصیری.مهر.میانشهر.میمند.نوبندگان.نوجین.نودان.نورآباد.نیریز.والاشهر.وراوی.هماشهر`.split(`.`),قزوین:[`آبگرم`,`آبیک`,`آوج`,`ارداق`,`اسفرورین`,`اقبالیه`,`الوند`,`بوئینزهرا`,`بیدستان`,`تاکستان`,`خاکعلی`,`خرمدشت`,`دانسفهان`,`رازمیان`,`سگزآباد`,`سیردان`,`شال`,`ضیاءآباد`,`قزوین`,`کوهین`,`محمدیه`,`محمودآباد نمونه`,`معلمکلایه`,`نرجه`],قم:[`جعفریه`,`دستجرد`,`سلفچگان`,`قاهان`,`قم`,`قنوات`,`کهک`],کردستان:/* @__PURE__ */ `آرمرده.اورامان.بابارشانی.بانه.برده رشه.بلبان‌آباد.بویین سفلی.بیجار.پیرتاج.توپآغاج.چناره.حسن‌آباد یاسوکند.دزج.دلبران.دهگلان.دیواندره.زرینه.سروآباد.سریش‌آباد.سقز.سنندج.شویشه.صاحب.قروه.کامیاران.کانیدینار.کانیسور.مریوان.موچش`.split(`.`),کرمان:/* @__PURE__ */ `اختیارآباد.ارزوئیه.امینشهر.انار.اندوهجرد.باغین.بافت.بردسیر.بروات.بزنجان.بلورد.بلوک.بم.بهرمان.پاریز.جبالبارز.جوپار.جوزم.جیرفت.چترود.خاتون‌آباد.خانوک.خرسند.خواجو شهر.درب بهشت.دشتکار.دوساری.دهج.دهستان بزنجان.رابر.راور.راین.رفسنجان.ریحانشهر.زرند.زنگی‌آباد.زهکلوت.زیدآباد.سیرجان.سیریز.شهداد.شهربابک.صفائیه.عنبرآباد.فاریاب.فهرج.قلعهگنج.کاظم‌آباد.کرمان.کشکوئیه.کوهبنان.کهنوج.کیانشهر.گلباف.گلزار.لاله زار.ماهان.محمدآباد.محمدآباد گنبکی.محی‌آباد.مردهک.مس سرچشمه.منوجان.نجفشهر.نرماشیر.نظامشهر.نگار.نودژ.هجدک.هماشهر.هنزا.یزدانشهر`.split(`.`),کرمانشاه:/* @__PURE__ */ `ازگله.اسلام‌آباد غرب.بانهوره.باینگان.بیستون.پاوه.تازه‌آباد.جوانرود.حمیل.روانسر.ریژاو.سرپل ذهاب.سرمست.سطر.سنقر.سومار.شروینه.صحنه.قصر شیرین.قلعه.کرمانشاه.کرند غرب.کنگاور.کوزران.گودین.گهواره.گیلانغرب.ماهیدشت.میانراهان.نودشه.نوسود.هرسین.هلشی`.split(`.`),"کهگیلویه و بویراحمد":[`باشت`,`پاتاوه`,`چرام`,`چیتاب`,`دوگنبدان`,`دهدشت`,`دیشموک`,`سوق`,`سیسخت`,`قلعه رئیسی`,`گراب سفلی`,`لنده`,`لیکک`,`مادوان علیا`,`مارگون`,`محله چینیها`,`یاسوج`],گلستان:/* @__PURE__ */ `آزادشهر.آققلا.انبارآلوم.اینچهبرون.بندر ترکمن.بندر گز.تاتار علیا.خانببین.دلند.رامیان.سرخنکلاته.سنگدوین.سیمینشهر.علی‌آباد کتول.فاضل‌آباد.فراغی.قرق.کردکوی.کلاله.گالیکش.گرگان.گمیشان.گنبد کاووس.مراوهتپه.مزرعه.مینودشت.نگینشهر.نوده خاندوز.نوکنده`.split(`.`),گیلان:/* @__PURE__ */ `آستارا.آستانه اشرفیه.احمدسرگوراب.اسالم.اطاقور.املش.بازارجمعه.برهسر.بندر انزلی.بندر کیاشهر.پرهسر.توتکابن.جیرنده.چابکسر.چاف و چمخاله.چوبر.حویق.خشکبیجار.خمام.دیلمان.رانکوه.رحیم‌آباد.رستم‌آباد.رشت.رضوانشهر.رودبار.رودبنه.رودسر.سنگر.سیاهکل.شفت.شلمان.صومعهسرا.فومن.کلاچای.کوچصفهان.کومله.گوراب زرمیخ.لاهیجان.لشت نشا.لنگرود.لوشان.لولمان.لوندویل.لیسار.ماسال.ماسوله.ماکلوان.مرجغل.منجیل.واجارگاه.هشتپر`.split(`.`),لرستان:[`ازنا`,`اشترینان`,`الشتر`,`الیگودرز`,`بروجرد`,`بیرانشهر`,`پل دختر`,`چالانچولان`,`چقابل`,`خرم‌آباد`,`درب گنبد`,`دورود`,`زاغه`,`سپیددشت`,`سرابدوره`,`شول‌آباد`,`فیروزآباد`,`کونانی`,`کوهدشت`,`گراب لکستان`,`معمولان`,`مومن‌آباد`,`نورآباد`,`ویسیان`,`هفتچشمه`],مازندران:/* @__PURE__ */ `آلاشت.آمل.ارطه.اکند.امامزاده عبدالله.امیرکلا.ایزدشهر.بابل.بابلسر.بلده.بهشهر.بهنمیر.پایین هولار.پل سفید.پول.تنکابن.جویبار.چالوس.چمستان.خرم‌آباد.خلیلشهر.خوشرودپی.دابودشت.رامسر.رستمکلا.رویان.رینه.زرگرمحله.زیرآب.ساری.سرخرود.سلمانشهر.سورک.شیرگاه.شیرود.طبقده.عباس‌آباد.فرح‌آباد.فریدونکنار.فریم.قائمشهر.کتالم و ساداتشهر.کجور.کلارآباد.کلاردشت.کلهبست.کوهیخیل.کیاسر.کیاکلا.گتاب.گزنک.گلوگاه.محمودآباد.مرزن‌آباد.مرزیکلا.نشتارود.نکا.نمکآبرود.نور.نوشهر.هچیرود`.split(`.`),مرکزی:/* @__PURE__ */ `آستانه.آشتیان.آوه.اراک.پرندک.تفرش.توره.جاورسیان.خشکرود.خمین.خنجین.خنداب.داوودآباد.دلیجان.رازقان.زاویه.ساروق.ساوه.سنجان.شازند.شهباز.شهر جدید امیرکبیر.غرق‌آباد.فرمهین.قورچیباشی.کارچان.کرهرود.کمیجان.مأمونیه.محلات.مهاجران.میلاجرد.نراق.نوبران.نیمور.هندودر`.split(`.`),هرمزگان:/* @__PURE__ */ `ابوموسی.بستک.بندر چارک.بندر خمیر.بندر کنگ.بندر لافت.بندر لنگه.بندرعباس.بیکا.پارسیان.تازیان پایین.تخت.تنب بزرگ.تیرور.جاسک.جناح.حاجی‌آباد.درگهان.دشتی.دهبارز.رویدر.زیارتعلی.سردشت.سرگز احمدی.سندرک.سوزا.سیریک.طبل.فارغان.فین.قشم.قلعه قاضی.کوخردهرنگ.کوهستک.کوهیج.کیش.گروک.گوهران.لمزان.میناب.هرمز.هشتبندی`.split(`.`),همدان:/* @__PURE__ */ `آجین.ازندریان.اسدآباد.برزول.بهار.تویسرکان.جورقان.جوکار.داقداق‌آباد.دمق.دهستان سلگی.رزن.زنگنه.سامن.سرکان.شیرینسو.صالح‌آباد.فامنین.فرسفج.فیروزان.قروه درجزین.قهاوند.کبودرآهنگ.گلتپه.گیان.لالجین.مریانج.ملایر.مهاجران.نهاوند.همدان`.split(`.`),یزد:[`ابرکوه`,`احمدآباد`,`اردکان`,`اشکذر`,`بافق`,`بخ`,`بفروییه`,`بهاباد`,`تفت`,`حمیدیا`,`خضرآباد`,`رضوانشهر`,`زارچ`,`شاهدیه`,`عقدا`,`مروست`,`مهردشت`,`مهریز`,`میبد`,`ندوشن`,`نیر`,`هرات`,`یزد`]};function p(e){return e&&f[e]||[]}const m={province:null,city:null,street:``,plaque:``,unit:``,postalCode:``},h=e=>u(e,{digits:`latin`}).toLowerCase();var g=class extends s{constructor(){super(...arguments),this.selected=null,this.query=``,this.list=null,this.filtered=[],this.typing=!1,this.isOpen=!1,this.active=-1,this.rendered=!1,this.valueSet=!1,this.key=n(`kashi-combo`),this.defaultLabel=null,this.defaultPlaceholder=``,this.onOutside=e=>{this.contains(e.target)||this.close()}}connectedCallback(){a(()=>{if(this.isConnected){if(!this.rendered){if(this.list===null&&(this.list=this.readOptions()),Object.prototype.hasOwnProperty.call(this,`value`)){let e=this.value;delete this.value,this.value=e??``}else if(!this.valueSet){let e=this.getAttribute(`value`);this.selected=e?this.find(e):null,this.query=this.selected?.label??``}}this.render()}})}disconnectedCallback(){document.removeEventListener(`pointerdown`,this.onOutside)}attributeChangedCallback(e,t,n){this.rendered&&t!==n&&(e===`value`?this.value=n??``:this.render())}get options(){return this.list??[]}set options(e){this.list=[...e],this.selected&&=this.find(this.selected.value),this.rendered&&this.sync()}get value(){return this.selected?.value??``}set value(e){this.valueSet=!0,this.selected=e?this.find(e):null,this.query=this.selected?.label??``,this.typing=!1,this.rendered&&this.sync()}get selectedOption(){return this.selected}focus(e){this.input?.focus(e)}readOptions(){let e=[];for(let t of[...this.querySelectorAll(`:scope > option, :scope > optgroup > option`)]){let n=t.parentElement?.tagName===`OPTGROUP`?t.parentElement.getAttribute(`label`)??void 0:void 0;e.push({value:t.value,label:t.textContent?.trim()??t.value,description:t.dataset.description,keywords:t.dataset.keywords?.split(/[,،]\s*/),disabled:t.disabled,group:n})}for(let e of[...this.querySelectorAll(`:scope > option, :scope > optgroup`)])e.remove();return e}source(e){return this.options}accepts(e,t){let n=h(t.trim());return!n||[e.label,e.description??``,...e.keywords??[]].some(e=>h(e).includes(n))}find(e){return this.source(``).find(t=>t.value===e)??null}detail(){return{value:this.value,option:this.selected}}render(){let e=this.key,n=this.getAttribute(`aria-label`),r=this.hasAttribute(`label`)?this.getAttribute(`label`):n?null:this.defaultLabel,a=this.hasAttribute(`required`),s=this.hasAttribute(`disabled`),c=`${e}-list`,l=`<div class="k-combobox"><div class="k-input"${s?` data-state="disabled"`:``}><input id="${e}" class="k-input__control" type="text" role="combobox" aria-autocomplete="list" aria-expanded="false" aria-controls="${c}" autocomplete="off" placeholder="${o(this.getAttribute(`placeholder`)??this.defaultPlaceholder)}"${a?` required`:``}${s?` disabled`:``}${!r&&n?` aria-label="${o(n)}"`:``}><button type="button" tabindex="-1" class="k-input__action k-combobox__toggle" aria-label="نمایش گزینه‌ها"${s?` disabled`:``}><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m6 8 4 4 4-4"/></svg></button></div><ul id="${c}" role="listbox" class="k-listbox" hidden style="inset-block-start: calc(100% + 6px)"${r?` aria-label="${o(r)}"`:` aria-labelledby="${e}"`}></ul><span class="k-sr-only" aria-live="polite"></span></div>`;this.querySelector(`:scope > .k-field`)?.remove(),this.insertAdjacentHTML(`afterbegin`,t({id:e,label:r,required:a,control:l})),this.input=this.querySelector(`input.k-input__control`),this.listbox=this.querySelector(`.k-listbox`),this.live=this.querySelector(`.k-combobox > .k-sr-only`),this.isOpen=!1,this.input.addEventListener(`input`,()=>{this.query=this.input.value,this.typing=!0,this.active=-1,this.open(!1),i(this,`kashi-input`,{query:this.query})}),this.input.addEventListener(`keydown`,e=>this.onKey(e)),this.input.addEventListener(`click`,()=>!this.isOpen&&this.open()),this.input.addEventListener(`blur`,e=>{this.contains(e.relatedTarget)||this.close()}),this.querySelector(`.k-combobox__toggle`).addEventListener(`click`,()=>{this.isOpen?this.close():(this.typing=!1,this.open(),this.input.focus())}),this.listbox.addEventListener(`pointerdown`,e=>e.preventDefault()),this.listbox.addEventListener(`click`,e=>{let t=e.target.closest(`[role="option"]`);t&&t.getAttribute(`aria-disabled`)!==`true`&&this.commit(this.filtered[Number(t.dataset.i)])}),this.listbox.addEventListener(`pointermove`,e=>{let t=e.target.closest(`[role="option"]`);t&&t.getAttribute(`aria-disabled`)!==`true`&&Number(t.dataset.i)!==this.active&&this.setActive(Number(t.dataset.i))}),this.rendered=!0,this.sync()}sync(){!this.typing&&this.input.value!==this.query&&(this.input.value=this.query),r(this.querySelector(`:scope > .k-field`),this.input,this.key,this.getAttribute(`error`),this.getAttribute(`hint`)),this.syncHidden(),this.isOpen&&this.renderList()}syncHidden(){c(this,this.getAttribute(`name`),this.value)}enabled(){return this.filtered.map((e,t)=>e.disabled?-1:t).filter(e=>e>=0)}open(e=!0,t=`selected`){if(!this.hasAttribute(`disabled`)){if(this.isOpen=!0,this.input.setAttribute(`aria-expanded`,`true`),this.listbox.hidden=!1,this.toggleAttribute(`data-open`,!0),this.querySelector(`.k-combobox`).setAttribute(`data-open`,``),this.filter(),e){let e=this.enabled(),n=this.filtered.findIndex(e=>e.value===this.selected?.value);this.active=t===`last`?e.at(-1)??-1:t===`first`||n<0?e[0]??-1:n}this.renderList(),document.addEventListener(`pointerdown`,this.onOutside)}}close(){this.rendered&&(this.isOpen=!1,this.input.setAttribute(`aria-expanded`,`false`),this.input.removeAttribute(`aria-activedescendant`),this.listbox.hidden=!0,this.querySelector(`.k-combobox`).removeAttribute(`data-open`),this.live.textContent=``,document.removeEventListener(`pointerdown`,this.onOutside),this.typing&&(this.typing=!1,this.query=this.selected?.label??``,this.input.value=this.query))}filter(){let e=this.source(this.typing?this.query:``);this.filtered=this.typing?e.filter(e=>this.accepts(e,this.query)):e}renderList(){let e=this.typing?h(this.query.trim()):``,t=t=>{let n=e?h(t).indexOf(e):-1;return n<0?o(t):`${o(t.slice(0,n))}<mark>${o(t.slice(n,n+e.length))}</mark>${o(t.slice(n+e.length))}`},n=`${this.key}-list`,r,i=this.filtered.slice(0,300).map((e,i)=>{let a=e.group&&e.group!==r?`<li role="presentation" class="k-listbox__group">${o(e.group)}</li>`:``;r=e.group;let s=e.value===this.selected?.value;return`${a}<li id="${n}-${i}" data-i="${i}" role="option" aria-selected="${s}"${e.disabled?` aria-disabled="true"`:``}${i===this.active?` data-active`:``} class="k-option"><span class="k-option__body"><span>${t(e.label)}</span>${e.description?`<span class="k-option__desc">${o(e.description)}</span>`:``}</span>${s?`<span class="k-option__check"><svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true"><path d="m5 10.5 3.2 3L15 7"/></svg></span>`:``}</li>`});this.filtered.length||i.push(`<li class="k-listbox__empty" role="presentation">${o(this.getAttribute(`empty-message`)??`نتیجه‌ای پیدا نشد.`)}</li>`),this.filtered.length>300&&i.push(`<li class="k-listbox__empty" role="presentation">${l(this.filtered.length-300)} گزینهٔ دیگر؛ برای پیدا کردن تایپ کنید.</li>`),this.listbox.innerHTML=i.join(``),this.live.textContent=this.typing?`${l(this.filtered.length)} نتیجه`:``,this.setActive(this.active)}setActive(e){this.active=e,this.listbox.querySelector(`[data-active]`)?.removeAttribute(`data-active`);let t=e>=0?this.listbox.querySelector(`[data-i="${e}"]`):null;t?(t.setAttribute(`data-active`,``),t.scrollIntoView?.({block:`nearest`}),this.input.setAttribute(`aria-activedescendant`,t.id)):this.input.removeAttribute(`aria-activedescendant`)}move(e){let t=this.enabled().filter(e=>e<300);if(!t.length)return;let n=t.indexOf(this.active);this.setActive(t[(n+e+t.length)%t.length])}onKey(e){if(e.key===`ArrowDown`)e.preventDefault(),this.isOpen?this.move(1):this.open(!0,e.altKey?`selected`:`first`);else if(e.key===`ArrowUp`)e.preventDefault(),this.isOpen?this.move(-1):this.open(!0,`last`);else if(e.key===`Enter`&&this.isOpen&&this.active>=0)e.preventDefault(),this.commit(this.filtered[this.active]);else if(e.key===`Escape`)this.isOpen?(e.preventDefault(),this.close()):this.input.value&&(e.preventDefault(),this.commit(null));else if((e.key===`Home`||e.key===`End`)&&this.isOpen){e.preventDefault();let t=this.enabled();this.setActive((e.key===`Home`?t[0]:t.at(-1))??-1)}}commit(e){let t=(e?.value??null)!==(this.selected?.value??null);this.selected=e,this.query=e?.label??``,this.typing=!1,this.input.value=this.query,this.close(),this.sync(),t&&i(this,`kashi-change`,this.detail())}};g.observedAttributes=[`label`,`hint`,`error`,`placeholder`,`required`,`disabled`,`name`,`value`,`empty-message`,`aria-label`];var _=class extends g{constructor(){super(...arguments),this.defaultLabel=`استان`,this.defaultPlaceholder=`جستجوی استان یا شهر`}source(){let e=this.getAttribute(`show-capital`)!==`false`;return d.map(t=>({value:t.name,label:t.name,description:e?`مرکز: ${t.capital}`:void 0,keywords:[t.capital]}))}detail(){return{value:this.value,province:d.find(e=>e.name===this.value)??null}}};_.observedAttributes=[...g.observedAttributes,`show-capital`];const v=e=>h(e).replace(/[\s‌]/g,``);var y=class extends g{constructor(){super(...arguments),this.defaultLabel=`شهر`,this.custom=null}get province(){return this.getAttribute(`province`)||null}set province(e){e?this.setAttribute(`province`,e):this.removeAttribute(`province`)}get value(){return this.selected?this.selected.value.split(`|`)[1]:``}set value(e){this.valueSet=!0,this.custom=null;let t=this.source(``),n=this.province,r=e?t.find(t=>t.label===e&&(!n||t.value.startsWith(`${n}|`)))??null:null;e&&!r&&(this.custom=e,r={value:`custom|${e}`,label:e,description:`خارج از فهرست`}),this.selected=r,this.query=r?.label??``,this.isConnected&&this.querySelector(`.k-combobox`)&&this.sync()}find(e){return this.value=e,this.selected}attributeChangedCallback(e,t,n){if(e!==`province`)return super.attributeChangedCallback(e,t,n);if(t!==n){if(this.selected){let e=this.value;!n||!p(n).includes(e)?(this.selected=null,this.query=``,this.custom=null):this.selected={value:`${n}|${e}`,label:e}}this.querySelector(`.k-combobox`)&&(this.input.placeholder=this.getAttribute(`placeholder`)??this.placeholderText(),this.input.value=this.query,this.sync())}}connectedCallback(){this.defaultPlaceholder=this.placeholderText(),super.connectedCallback()}placeholderText(){return this.province?`جستجوی شهر`:`نام شهر، مثلاً کاشان`}source(e){let t=this.province,n=t?p(t).map(e=>({value:`${t}|${e}`,label:e})):Object.entries(f).flatMap(([e,t])=>t.map(t=>({value:`${e}|${t}`,label:t,description:e})));this.custom&&n.unshift({value:`custom|${this.custom}`,label:this.custom,description:`خارج از فهرست`});let r=e.trim();return this.getAttribute(`allow-custom`)!==`false`&&r&&r!==this.custom&&!n.some(e=>v(e.label)===v(r))&&n.push({value:`custom|${r}`,label:r,description:`شهر دیگر؛ همین نام ثبت شود`}),n}accepts(e,t){return e.value.startsWith(`custom|`)||[e.label,e.description??``].some(e=>v(e).includes(v(t)))}commit(e){this.custom=e?.value.startsWith(`custom|`)?e.label:null,super.commit(e)}detail(){let[e]=this.selected?this.selected.value.split(`|`):[null];return{value:this.value,province:e===`custom`?null:e}}};y.observedAttributes=[...g.observedAttributes,`province`,`allow-custom`],e(`kashi-combobox`,g,`block`),e(`kashi-province-select`,_,`block`),e(`kashi-city-select`,y,`block`);export{y as KashiCitySelect,g as KashiCombobox,_ as KashiProvinceSelect,p as n,d as r,h as searchText,m as t};