@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.
- package/README.md +11 -1
- package/dist/appointment.d.ts +40 -0
- package/dist/appointment.js +175 -0
- package/dist/base.d.ts +408 -0
- package/dist/base.js +31 -0
- package/dist/basic.d.ts +43 -0
- package/dist/basic.js +222 -0
- package/dist/calendar.js +21 -20
- package/dist/cdn/appointment-CrIZi8Bp.js +1 -0
- package/dist/cdn/base-DTQ50VdG.js +1 -0
- package/dist/cdn/basic-CrEW2RKF.js +1 -0
- package/dist/cdn/calendar-CYRrdGIf.js +16 -0
- package/dist/cdn/charts-D6KM26Vp.js +1 -0
- package/dist/cdn/combobox-6EFI2qqN.js +1 -0
- package/dist/cdn/controls-BwebEIlf.js +1 -0
- package/dist/cdn/display-DFuMkcj5.js +1 -0
- package/dist/cdn/fields-DhLIhHQ8.js +1 -0
- package/dist/cdn/forms-BHivKDdC.js +1 -0
- package/dist/cdn/holidays-DgbIAdlt.js +1 -0
- package/dist/cdn/inputs-R7nEHfbV.js +1 -0
- package/dist/cdn/kashi-elements.js +1 -1
- package/dist/cdn/map-H3xiZd8Y.js +12 -0
- package/dist/cdn/{menu-DhrqyLgy.js → menu-BAUSubXk.js} +1 -1
- package/dist/cdn/nav-NK-v48B5.js +1 -0
- package/dist/cdn/overlay-CBv8grz3.js +1 -0
- package/dist/cdn/pickers-BHzNt_X8.js +1 -0
- package/dist/cdn/table-Bt9WVLoo.js +1 -0
- package/dist/cdn/text-D4a_hlwL.js +1 -0
- package/dist/cdn/time-DJ3p1wvd.js +1 -0
- package/dist/cdn/words-BdADG_9U.js +1 -0
- package/dist/cdn.d.ts +1 -0
- package/dist/cdn.js +4 -0
- package/dist/charts.js +27 -24
- package/dist/combobox.d.ts +6 -5
- package/dist/combobox.js +29 -20
- package/dist/controls.js +15 -15
- package/dist/display.js +17 -14
- package/dist/fields.js +3 -3
- package/dist/forms.d.ts +3 -3
- package/dist/forms.js +54 -47
- package/dist/index.d.ts +12 -2
- package/dist/index.js +7 -1
- package/dist/inputs.d.ts +3 -3
- package/dist/inputs.js +31 -30
- package/dist/map.js +16 -13
- package/dist/nav.js +18 -16
- package/dist/overlay.js +5 -5
- package/dist/pickers.d.ts +1 -1
- package/dist/pickers.js +39 -38
- package/dist/table.js +7 -7
- package/dist/toast.js +3 -3
- package/package.json +4 -4
- package/dist/cdn/base-Cmq7zeIG.js +0 -1
- package/dist/cdn/calendar-Dm3fq2bs.js +0 -16
- package/dist/cdn/charts-DNOWi4sJ.js +0 -1
- package/dist/cdn/combobox-ZGrZ5okg.js +0 -1
- package/dist/cdn/controls-K-OZcjg4.js +0 -1
- package/dist/cdn/digits-DE1YGT94.js +0 -1
- package/dist/cdn/display-C975tS7j.js +0 -1
- package/dist/cdn/fields-BUTaSN8m.js +0 -1
- package/dist/cdn/forms-C-effPKn.js +0 -1
- package/dist/cdn/inputs-BjOddAM7.js +0 -1
- package/dist/cdn/jalali-BiM5Kfep.js +0 -1
- package/dist/cdn/map-BHuusa4t.js +0 -12
- package/dist/cdn/nav-D_w5BV_K.js +0 -1
- package/dist/cdn/overlay-DX9un2xm.js +0 -1
- package/dist/cdn/pickers-BFLpUruK.js +0 -1
- package/dist/cdn/table-DPQfDMs-.js +0 -1
- package/dist/cdn/text-D1U32D6K.js +0 -1
- package/dist/cdn/words-9OdzG7y6.js +0 -1
package/dist/pickers.js
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
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
|
-
[
|
|
9
|
-
[
|
|
10
|
-
[
|
|
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
|
-
[
|
|
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
|
|
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)}
|
|
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") ??
|
|
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="
|
|
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
|
|
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") ??
|
|
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") ??
|
|
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(
|
|
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 =
|
|
366
|
+
error = msg().fileUpload.tooBig(formatBytes(maxSize));
|
|
367
367
|
else if (maxFiles && kept + i >= maxFiles)
|
|
368
|
-
error =
|
|
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 ?
|
|
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="
|
|
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
|
|
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="
|
|
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") ??
|
|
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 =
|
|
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 ?
|
|
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="
|
|
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) =>
|
|
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",
|
|
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",
|
|
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
|
|
2
|
-
import {
|
|
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 ?
|
|
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="
|
|
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 =
|
|
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"
|
|
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,
|
|
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") ??
|
|
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.
|
|
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.
|
|
31
|
-
"@kashi-ui/persian": "^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.
|
|
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={"&":`&`,"<":`<`,">":`>`,'"':`"`,"'":`'`},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};
|