@kashi-ui/elements 0.0.0-stage → 0.25.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 +45 -2
- package/dist/base.d.ts +47 -0
- package/dist/base.js +148 -0
- package/dist/calendar.d.ts +86 -0
- package/dist/calendar.js +439 -0
- package/dist/cdn/base-Cmq7zeIG.js +1 -0
- package/dist/cdn/calendar-Dm3fq2bs.js +16 -0
- package/dist/cdn/charts-DNOWi4sJ.js +1 -0
- package/dist/cdn/combobox-ZGrZ5okg.js +1 -0
- package/dist/cdn/controls-K-OZcjg4.js +1 -0
- package/dist/cdn/digits-DE1YGT94.js +1 -0
- package/dist/cdn/display-C975tS7j.js +1 -0
- package/dist/cdn/dist-D670Gw0K.js +1 -0
- package/dist/cdn/fields-BUTaSN8m.js +1 -0
- package/dist/cdn/forms-C-effPKn.js +1 -0
- package/dist/cdn/inputs-BjOddAM7.js +1 -0
- package/dist/cdn/jalali-BiM5Kfep.js +1 -0
- package/dist/cdn/kashi-elements.js +1 -0
- package/dist/cdn/map-BHuusa4t.js +12 -0
- package/dist/cdn/menu-DhrqyLgy.js +1 -0
- package/dist/cdn/nav-D_w5BV_K.js +1 -0
- package/dist/cdn/overlay-DX9un2xm.js +1 -0
- package/dist/cdn/pickers-BFLpUruK.js +1 -0
- package/dist/cdn/table-DPQfDMs-.js +1 -0
- package/dist/cdn/text-D1U32D6K.js +1 -0
- package/dist/cdn/words-9OdzG7y6.js +1 -0
- package/dist/cdn.d.ts +3 -0
- package/dist/cdn.js +44 -0
- package/dist/charts.d.ts +106 -0
- package/dist/charts.js +436 -0
- package/dist/combobox.d.ts +106 -0
- package/dist/combobox.js +439 -0
- package/dist/controls.d.ts +82 -0
- package/dist/controls.js +425 -0
- package/dist/display.d.ts +41 -0
- package/dist/display.js +144 -0
- package/dist/fields.d.ts +24 -0
- package/dist/fields.js +103 -0
- package/dist/forms.d.ts +186 -0
- package/dist/forms.js +902 -0
- package/dist/index.d.ts +86 -0
- package/dist/index.js +32 -0
- package/dist/inputs.d.ts +107 -0
- package/dist/inputs.js +371 -0
- package/dist/iranMapData.d.ts +6 -0
- package/dist/iranMapData.js +37 -0
- package/dist/map.d.ts +64 -0
- package/dist/map.js +416 -0
- package/dist/menu.d.ts +45 -0
- package/dist/menu.js +281 -0
- package/dist/nav.d.ts +163 -0
- package/dist/nav.js +918 -0
- package/dist/overlay.d.ts +79 -0
- package/dist/overlay.js +420 -0
- package/dist/pickers.d.ts +108 -0
- package/dist/pickers.js +655 -0
- package/dist/table.d.ts +53 -0
- package/dist/table.js +267 -0
- package/dist/toast.d.ts +45 -0
- package/dist/toast.js +141 -0
- package/package.json +63 -4
package/dist/calendar.js
ADDED
|
@@ -0,0 +1,439 @@
|
|
|
1
|
+
import { JALALI_MONTHS, WEEKDAYS, WEEKDAYS_SHORT, formatJalali, fromISODate, getIranHoliday, jalaliMonthLength, jalaliWeekday, parseJalali, toFaDigits, toGregorian, toISODate, toJalali, } from "@kashi-ui/persian";
|
|
2
|
+
import { HTMLBase, ICONS, bool, define, emit, esc, fieldHTML, setMessages, syncHidden, uid } from "./base.js";
|
|
3
|
+
const sameDay = (a, b) => !!a && !!b && a.getFullYear() === b.getFullYear() && a.getMonth() === b.getMonth() && a.getDate() === b.getDate();
|
|
4
|
+
const startOfDay = (d) => new Date(d.getFullYear(), d.getMonth(), d.getDate());
|
|
5
|
+
const addDays = (d, n) => new Date(d.getFullYear(), d.getMonth(), d.getDate() + n);
|
|
6
|
+
const dayKey = (d) => `${d.getFullYear()}-${d.getMonth() + 1}-${d.getDate()}`;
|
|
7
|
+
/** چند ماه شمسی جلو یا عقب؛ روز در ماههای کوتاهتر به آخر ماه میچسبد */
|
|
8
|
+
function addJalaliMonths(d, n) {
|
|
9
|
+
const { jy, jm, jd } = toJalali(d);
|
|
10
|
+
const total = jy * 12 + (jm - 1) + n;
|
|
11
|
+
const ny = Math.floor(total / 12);
|
|
12
|
+
const nm = total - ny * 12 + 1;
|
|
13
|
+
return toGregorian(ny, nm, Math.min(jd, jalaliMonthLength(ny, nm)));
|
|
14
|
+
}
|
|
15
|
+
/** تاریخ میلادی YYYY-MM-DD یا شمسی ۱۴۰۳/۰۵/۱۲ */
|
|
16
|
+
const parseDate = (text) => (text ? (fromISODate(text.trim()) ?? parseJalali(text)) : null);
|
|
17
|
+
/**
|
|
18
|
+
* تقویم شمسی با الگوی grid در WAI-ARIA: پیمایش با فلشها (در RTL فلش چپ یعنی روز بعد)،
|
|
19
|
+
* PageUp/PageDown برای ماه و با Shift برای سال، Home/End برای ابتدا و انتهای هفته.
|
|
20
|
+
*/
|
|
21
|
+
export class KashiCalendar extends HTMLBase {
|
|
22
|
+
constructor() {
|
|
23
|
+
super(...arguments);
|
|
24
|
+
/** حالت بازه: روزهای بین start و end برجسته میشوند؛ با start بدون end، hover پیشنمایش میدهد */
|
|
25
|
+
this.rangeValue = null;
|
|
26
|
+
this.hover = null;
|
|
27
|
+
this.selected = null;
|
|
28
|
+
this.valueSet = false;
|
|
29
|
+
this.focused = startOfDay(new Date());
|
|
30
|
+
this.refocus = false;
|
|
31
|
+
this.rendered = false;
|
|
32
|
+
this.key = uid("kashi-cal");
|
|
33
|
+
this.onClick = (e) => {
|
|
34
|
+
const btn = e.target.closest("button");
|
|
35
|
+
if (!btn || !this.contains(btn))
|
|
36
|
+
return;
|
|
37
|
+
const nav = btn.dataset.nav;
|
|
38
|
+
if (nav)
|
|
39
|
+
this.go(addJalaliMonths(this.focused, nav === "prev" ? -1 : 1), false);
|
|
40
|
+
else if (btn.dataset.today !== undefined) {
|
|
41
|
+
const t = new Date();
|
|
42
|
+
this.pick(new Date(t.getFullYear(), t.getMonth(), t.getDate()));
|
|
43
|
+
}
|
|
44
|
+
else if (btn.dataset.day) {
|
|
45
|
+
const [y, m, d] = btn.dataset.day.split("-").map(Number);
|
|
46
|
+
this.pick(new Date(y, m - 1, d));
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
this.onSelect = (e) => {
|
|
50
|
+
const sel = e.target;
|
|
51
|
+
if (!sel.matches?.(".k-calendar__select"))
|
|
52
|
+
return;
|
|
53
|
+
e.stopPropagation();
|
|
54
|
+
const { jy, jm, jd } = toJalali(this.focused);
|
|
55
|
+
const ny = sel.dataset.part === "year" ? Number(sel.value) : jy;
|
|
56
|
+
const nm = sel.dataset.part === "month" ? Number(sel.value) : jm;
|
|
57
|
+
this.go(toGregorian(ny, nm, Math.min(jd, jalaliMonthLength(ny, nm))), false);
|
|
58
|
+
this.querySelector(`.k-calendar__select[data-part="${sel.dataset.part}"]`)?.focus();
|
|
59
|
+
};
|
|
60
|
+
this.onKey = (e) => {
|
|
61
|
+
const btn = e.target;
|
|
62
|
+
if (!btn.classList?.contains("k-calendar__day"))
|
|
63
|
+
return;
|
|
64
|
+
const rtl = getComputedStyle(this).direction === "rtl";
|
|
65
|
+
const f = this.focused;
|
|
66
|
+
const wd = jalaliWeekday(f);
|
|
67
|
+
const moves = {
|
|
68
|
+
ArrowLeft: () => addDays(f, rtl ? 1 : -1),
|
|
69
|
+
ArrowRight: () => addDays(f, rtl ? -1 : 1),
|
|
70
|
+
ArrowUp: () => addDays(f, -7),
|
|
71
|
+
ArrowDown: () => addDays(f, 7),
|
|
72
|
+
Home: () => addDays(f, -wd),
|
|
73
|
+
End: () => addDays(f, 6 - wd),
|
|
74
|
+
PageUp: () => addJalaliMonths(f, e.shiftKey ? -12 : -1),
|
|
75
|
+
PageDown: () => addJalaliMonths(f, e.shiftKey ? 12 : 1),
|
|
76
|
+
};
|
|
77
|
+
if (!moves[e.key])
|
|
78
|
+
return;
|
|
79
|
+
e.preventDefault();
|
|
80
|
+
this.go(moves[e.key]());
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
get range() {
|
|
84
|
+
return this.rangeValue;
|
|
85
|
+
}
|
|
86
|
+
set range(r) {
|
|
87
|
+
this.rangeValue = r;
|
|
88
|
+
if (r?.start)
|
|
89
|
+
this.focused = this.clamp(startOfDay(r.start));
|
|
90
|
+
if (this.rendered)
|
|
91
|
+
this.render();
|
|
92
|
+
}
|
|
93
|
+
connectedCallback() {
|
|
94
|
+
if (!this.rendered) {
|
|
95
|
+
if (!this.valueSet)
|
|
96
|
+
this.selected = parseDate(this.getAttribute("value"));
|
|
97
|
+
this.focused = this.clamp(startOfDay(this.selected ?? new Date()));
|
|
98
|
+
this.addEventListener("click", this.onClick);
|
|
99
|
+
this.addEventListener("keydown", this.onKey);
|
|
100
|
+
this.addEventListener("change", this.onSelect);
|
|
101
|
+
// پیشنمایش بازه با hover یا فوکوس روی روز
|
|
102
|
+
const preview = (e) => {
|
|
103
|
+
const day = e.target.closest?.(".k-calendar__day")?.dataset.day;
|
|
104
|
+
if (!this.rangeValue?.start || this.rangeValue.end || !day)
|
|
105
|
+
return;
|
|
106
|
+
const [y, m, d] = day.split("-").map(Number);
|
|
107
|
+
this.hover = new Date(y, m - 1, d);
|
|
108
|
+
this.paintRange();
|
|
109
|
+
};
|
|
110
|
+
this.addEventListener("pointerover", preview);
|
|
111
|
+
this.addEventListener("focusin", preview);
|
|
112
|
+
}
|
|
113
|
+
this.rendered = true;
|
|
114
|
+
this.render();
|
|
115
|
+
}
|
|
116
|
+
attributeChangedCallback(name, old, next) {
|
|
117
|
+
if (!this.rendered || old === next)
|
|
118
|
+
return;
|
|
119
|
+
if (name === "value") {
|
|
120
|
+
this.selected = parseDate(next);
|
|
121
|
+
if (this.selected)
|
|
122
|
+
this.focused = startOfDay(this.selected);
|
|
123
|
+
}
|
|
124
|
+
this.render();
|
|
125
|
+
}
|
|
126
|
+
/** تاریخ انتخابشده به شکل YYYY-MM-DD میلادی */
|
|
127
|
+
get value() {
|
|
128
|
+
return this.selected ? toISODate(this.selected) : "";
|
|
129
|
+
}
|
|
130
|
+
set value(v) {
|
|
131
|
+
this.valueSet = true;
|
|
132
|
+
this.selected = parseDate(v ?? "");
|
|
133
|
+
if (this.selected)
|
|
134
|
+
this.focused = startOfDay(this.selected);
|
|
135
|
+
if (this.rendered)
|
|
136
|
+
this.render();
|
|
137
|
+
}
|
|
138
|
+
get date() {
|
|
139
|
+
return this.selected;
|
|
140
|
+
}
|
|
141
|
+
set date(d) {
|
|
142
|
+
this.value = d ? toISODate(d) : "";
|
|
143
|
+
}
|
|
144
|
+
/** فوکوس روی روز انتخابشده یا امروز */
|
|
145
|
+
focus() {
|
|
146
|
+
this.querySelector('.k-calendar__day[tabindex="0"]')?.focus();
|
|
147
|
+
}
|
|
148
|
+
get min() {
|
|
149
|
+
return parseDate(this.getAttribute("min"));
|
|
150
|
+
}
|
|
151
|
+
get max() {
|
|
152
|
+
return parseDate(this.getAttribute("max"));
|
|
153
|
+
}
|
|
154
|
+
clamp(d) {
|
|
155
|
+
const min = this.min, max = this.max;
|
|
156
|
+
if (min && d < min)
|
|
157
|
+
return startOfDay(min);
|
|
158
|
+
if (max && d > max)
|
|
159
|
+
return startOfDay(max);
|
|
160
|
+
return d;
|
|
161
|
+
}
|
|
162
|
+
disabled(d) {
|
|
163
|
+
const min = this.min, max = this.max;
|
|
164
|
+
return (!!min && d < min) || (!!max && d > max) || !!this.isDateDisabled?.(d);
|
|
165
|
+
}
|
|
166
|
+
holiday(d) {
|
|
167
|
+
if (this.holidayOf)
|
|
168
|
+
return this.holidayOf(d) || null;
|
|
169
|
+
return bool(this, "holidays") ? getIranHoliday(d) : null;
|
|
170
|
+
}
|
|
171
|
+
go(d, focus = true) {
|
|
172
|
+
this.focused = this.clamp(d);
|
|
173
|
+
this.refocus = focus;
|
|
174
|
+
this.render();
|
|
175
|
+
}
|
|
176
|
+
pick(d) {
|
|
177
|
+
if (this.disabled(d))
|
|
178
|
+
return;
|
|
179
|
+
this.selected = d;
|
|
180
|
+
this.focused = d;
|
|
181
|
+
this.refocus = true;
|
|
182
|
+
this.render();
|
|
183
|
+
syncHidden(this, this.getAttribute("name"), this.value);
|
|
184
|
+
emit(this, "kashi-change", { value: this.value, date: d });
|
|
185
|
+
}
|
|
186
|
+
/** برجسته کردن روزهای بازه، بدون ساختن دوبارهٔ جدول تا فوکوس سر جایش بماند */
|
|
187
|
+
paintRange() {
|
|
188
|
+
const r = this.rangeValue;
|
|
189
|
+
if (!r)
|
|
190
|
+
return;
|
|
191
|
+
const rs = r.start ? startOfDay(r.start) : null;
|
|
192
|
+
const re = r.end ? startOfDay(r.end) : null;
|
|
193
|
+
const previewEnd = rs && !re && this.hover ? this.hover : null;
|
|
194
|
+
const [lo, hi] = rs && (re || previewEnd) ? [rs, (re ?? previewEnd)].sort((a, b) => +a - +b) : [rs, rs];
|
|
195
|
+
this.querySelectorAll("td[data-date]").forEach((td) => {
|
|
196
|
+
const [y, m, dd] = td.dataset.date.split("-").map(Number);
|
|
197
|
+
const d = new Date(y, m - 1, dd);
|
|
198
|
+
const inRange = !!lo && !!hi && d >= lo && d <= hi;
|
|
199
|
+
td.setAttribute("aria-selected", String(inRange));
|
|
200
|
+
td.toggleAttribute("data-in-range", inRange && !!re);
|
|
201
|
+
td.toggleAttribute("data-preview", inRange && !re);
|
|
202
|
+
td.toggleAttribute("data-range-start", !!lo && sameDay(d, lo));
|
|
203
|
+
td.toggleAttribute("data-range-end", !!hi && sameDay(d, hi));
|
|
204
|
+
});
|
|
205
|
+
}
|
|
206
|
+
render() {
|
|
207
|
+
const digits = this.getAttribute("digits") === "latin" ? "latin" : "fa";
|
|
208
|
+
const n = (v) => (digits === "fa" ? toFaDigits(v) : String(v));
|
|
209
|
+
const today = startOfDay(new Date());
|
|
210
|
+
const { jy, jm } = toJalali(this.focused);
|
|
211
|
+
const monthStart = toGregorian(jy, jm, 1);
|
|
212
|
+
const length = jalaliMonthLength(jy, jm);
|
|
213
|
+
const cells = [...Array(jalaliWeekday(monthStart)).fill(null), ...Array.from({ length }, (_, i) => addDays(monthStart, i))];
|
|
214
|
+
while (cells.length % 7)
|
|
215
|
+
cells.push(null);
|
|
216
|
+
const min = this.min, max = this.max;
|
|
217
|
+
const from = min ? toJalali(min).jy : toJalali(today).jy - 100;
|
|
218
|
+
const to = max ? toJalali(max).jy : toJalali(today).jy + 20;
|
|
219
|
+
const years = Array.from({ length: Math.max(0, to - from + 1) }, (_, i) => from + i);
|
|
220
|
+
if (!years.includes(jy))
|
|
221
|
+
years.push(jy);
|
|
222
|
+
years.sort((a, b) => a - b);
|
|
223
|
+
const prevOff = !!min && monthStart <= startOfDay(min);
|
|
224
|
+
const nextOff = !!max && toGregorian(jy, jm, length) >= startOfDay(max);
|
|
225
|
+
const rows = [];
|
|
226
|
+
for (let w = 0; w < cells.length; w += 7) {
|
|
227
|
+
rows.push(`<tr>${cells.slice(w, w + 7).map((d) => {
|
|
228
|
+
if (!d)
|
|
229
|
+
return '<td role="gridcell"></td>';
|
|
230
|
+
const h = this.holiday(d);
|
|
231
|
+
const label = formatJalali(d, { style: "full", digits }) + (h ? `، تعطیل${h === "جمعه" ? "" : `: ${h}`}` : "");
|
|
232
|
+
return `<td role="gridcell" data-date="${dayKey(d)}" aria-selected="${sameDay(d, this.selected)}"><button type="button" class="k-calendar__day" data-day="${dayKey(d)}" tabindex="${sameDay(d, this.focused) ? 0 : -1}" aria-label="${esc(label)}"${h && h !== "جمعه" ? ` title="${esc(h)}"` : ""}${h ? ' data-holiday=""' : ""}${sameDay(d, today) ? ' aria-current="date"' : ""}${this.disabled(d) ? ' aria-disabled="true"' : ""}>${n(toJalali(d).jd)}</button></td>`;
|
|
233
|
+
}).join("")}</tr>`);
|
|
234
|
+
}
|
|
235
|
+
const todayLabel = this.getAttribute("today-label");
|
|
236
|
+
this.innerHTML = `<div class="k-calendar" role="group" aria-label="${esc(this.getAttribute("label") ?? "تقویم")}">
|
|
237
|
+
<div class="k-calendar__header">
|
|
238
|
+
<button type="button" class="k-btn k-btn--tertiary k-btn--icon k-btn--sm" data-nav="prev" aria-label="ماه قبل"${prevOff ? " disabled" : ""}>${ICONS.prev}</button>
|
|
239
|
+
<div class="k-calendar__selects">
|
|
240
|
+
<select class="k-calendar__select" data-part="month" aria-label="ماه">${JALALI_MONTHS.map((m, i) => `<option value="${i + 1}"${i + 1 === jm ? " selected" : ""}>${m}</option>`).join("")}</select>
|
|
241
|
+
<select class="k-calendar__select" data-part="year" aria-label="سال">${years.map((y) => `<option value="${y}"${y === jy ? " selected" : ""}>${n(y)}</option>`).join("")}</select>
|
|
242
|
+
</div>
|
|
243
|
+
<button type="button" class="k-btn k-btn--tertiary k-btn--icon k-btn--sm" data-nav="next" aria-label="ماه بعد"${nextOff ? " disabled" : ""}>${ICONS.next}</button>
|
|
244
|
+
</div>
|
|
245
|
+
<h2 class="k-sr-only" id="${this.key}-title" aria-live="polite">${JALALI_MONTHS[jm - 1]} ${n(jy)}</h2>
|
|
246
|
+
<table class="k-calendar__grid" role="grid" aria-labelledby="${this.key}-title">
|
|
247
|
+
<thead><tr>${WEEKDAYS_SHORT.map((s, i) => `<th scope="col" abbr="${WEEKDAYS[i]}">${s}</th>`).join("")}</tr></thead>
|
|
248
|
+
<tbody>${rows.join("")}</tbody>
|
|
249
|
+
</table>
|
|
250
|
+
${todayLabel ? `<div class="k-calendar__footer"><button type="button" class="k-btn k-btn--link" data-today>${esc(todayLabel)}</button></div>` : ""}
|
|
251
|
+
</div>`;
|
|
252
|
+
syncHidden(this, this.getAttribute("name"), this.value);
|
|
253
|
+
this.paintRange();
|
|
254
|
+
if (this.refocus) {
|
|
255
|
+
this.refocus = false;
|
|
256
|
+
this.querySelector(`[data-day="${dayKey(this.focused)}"]`)?.focus();
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
KashiCalendar.observedAttributes = ["value", "min", "max", "digits", "holidays", "label", "today-label", "name"];
|
|
261
|
+
/**
|
|
262
|
+
* انتخاب تاریخ شمسی: تایپ مستقیم (۱۴۰۳/۰۵/۱۲) یا انتخاب از تقویم.
|
|
263
|
+
* با name، تاریخ میلادی به شکل YYYY-MM-DD در فرم ارسال میشود.
|
|
264
|
+
*/
|
|
265
|
+
export class KashiDatePicker extends HTMLBase {
|
|
266
|
+
constructor() {
|
|
267
|
+
super(...arguments);
|
|
268
|
+
this.selected = null;
|
|
269
|
+
this.valueSet = false;
|
|
270
|
+
this.invalid = false;
|
|
271
|
+
this.rendered = false;
|
|
272
|
+
this.key = uid("kashi-date");
|
|
273
|
+
this.pop = null;
|
|
274
|
+
this.onOutside = (e) => {
|
|
275
|
+
if (!this.contains(e.target))
|
|
276
|
+
this.close(false);
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
connectedCallback() {
|
|
280
|
+
if (!this.rendered && !this.valueSet)
|
|
281
|
+
this.selected = parseDate(this.getAttribute("value"));
|
|
282
|
+
this.render();
|
|
283
|
+
}
|
|
284
|
+
disconnectedCallback() {
|
|
285
|
+
this.close(false);
|
|
286
|
+
}
|
|
287
|
+
attributeChangedCallback(name, old, next) {
|
|
288
|
+
if (!this.rendered || old === next)
|
|
289
|
+
return;
|
|
290
|
+
if (name === "value") {
|
|
291
|
+
this.selected = parseDate(next);
|
|
292
|
+
this.invalid = false;
|
|
293
|
+
this.paint();
|
|
294
|
+
}
|
|
295
|
+
else
|
|
296
|
+
this.render();
|
|
297
|
+
}
|
|
298
|
+
get value() {
|
|
299
|
+
return this.selected ? toISODate(this.selected) : "";
|
|
300
|
+
}
|
|
301
|
+
set value(v) {
|
|
302
|
+
this.valueSet = true;
|
|
303
|
+
this.selected = parseDate(v ?? "");
|
|
304
|
+
this.invalid = false;
|
|
305
|
+
if (this.rendered)
|
|
306
|
+
this.paint();
|
|
307
|
+
}
|
|
308
|
+
get date() {
|
|
309
|
+
return this.selected;
|
|
310
|
+
}
|
|
311
|
+
set date(d) {
|
|
312
|
+
this.value = d ? toISODate(d) : "";
|
|
313
|
+
}
|
|
314
|
+
focus(options) {
|
|
315
|
+
this.input?.focus(options);
|
|
316
|
+
}
|
|
317
|
+
get digits() {
|
|
318
|
+
return this.getAttribute("digits") === "latin" ? "latin" : "fa";
|
|
319
|
+
}
|
|
320
|
+
fmt(d) {
|
|
321
|
+
return d ? formatJalali(d, { digits: this.digits }) : "";
|
|
322
|
+
}
|
|
323
|
+
render() {
|
|
324
|
+
const id = this.key;
|
|
325
|
+
const ariaLabel = this.getAttribute("aria-label");
|
|
326
|
+
const label = this.hasAttribute("label") ? this.getAttribute("label") : ariaLabel ? null : "تاریخ";
|
|
327
|
+
const required = this.hasAttribute("required");
|
|
328
|
+
const disabled = this.hasAttribute("disabled");
|
|
329
|
+
const placeholder = this.getAttribute("placeholder") ?? (this.digits === "fa" ? "۱۴۰۳/۰۱/۰۱" : "1403/01/01");
|
|
330
|
+
this.close(false);
|
|
331
|
+
this.querySelector(":scope > .k-datepicker")?.remove();
|
|
332
|
+
const control = `<div class="k-input"${disabled ? ' data-state="disabled"' : ""}><input id="${id}" class="k-input__control" type="text" dir="ltr" autocomplete="off" placeholder="${esc(placeholder)}"${required ? " required" : ""}${disabled ? " disabled" : ""}${!label && ariaLabel ? ` aria-label="${esc(ariaLabel)}"` : ""}><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"${disabled ? " disabled" : ""}>${ICONS.calendar}</button></span></div>`;
|
|
333
|
+
this.insertAdjacentHTML("afterbegin", `<div class="k-datepicker">${fieldHTML({ id, label, required, control })}</div>`);
|
|
334
|
+
this.input = this.querySelector("input.k-input__control");
|
|
335
|
+
this.toggle = this.querySelector(".k-datepicker__toggle");
|
|
336
|
+
this.input.addEventListener("blur", () => this.commitText());
|
|
337
|
+
this.input.addEventListener("keydown", (e) => {
|
|
338
|
+
if (e.key === "Enter")
|
|
339
|
+
this.commitText();
|
|
340
|
+
});
|
|
341
|
+
this.toggle.addEventListener("click", () => (this.pop ? this.close() : this.open()));
|
|
342
|
+
this.rendered = true;
|
|
343
|
+
this.paint();
|
|
344
|
+
}
|
|
345
|
+
paint() {
|
|
346
|
+
const text = this.fmt(this.selected);
|
|
347
|
+
if (!this.invalid && this.input.value !== text)
|
|
348
|
+
this.input.value = text;
|
|
349
|
+
const open = this.getAttribute("open-label") ?? "انتخاب تاریخ از تقویم";
|
|
350
|
+
this.toggle.setAttribute("aria-label", this.selected ? `${open}، ${formatJalali(this.selected, { style: "full", digits: this.digits })}` : open);
|
|
351
|
+
const message = this.getAttribute("invalid-message") ?? "این تاریخ معتبر نیست؛ آن را به شکل ۱۴۰۳/۰۵/۱۲ وارد کنید.";
|
|
352
|
+
this.input.setCustomValidity(this.invalid ? message : "");
|
|
353
|
+
setMessages(this.querySelector(".k-field"), this.input, this.key, this.getAttribute("error") || (this.invalid ? message : null), this.getAttribute("hint"));
|
|
354
|
+
syncHidden(this, this.getAttribute("name"), this.value);
|
|
355
|
+
}
|
|
356
|
+
commitText() {
|
|
357
|
+
const t = this.input.value.trim();
|
|
358
|
+
if (!t)
|
|
359
|
+
return this.commit(null);
|
|
360
|
+
const d = parseJalali(t);
|
|
361
|
+
const min = parseDate(this.getAttribute("min")), max = parseDate(this.getAttribute("max"));
|
|
362
|
+
if (d && !(min && d < min) && !(max && d > max) && !this.isDateDisabled?.(d))
|
|
363
|
+
this.commit(d);
|
|
364
|
+
else {
|
|
365
|
+
this.invalid = true;
|
|
366
|
+
this.paint();
|
|
367
|
+
}
|
|
368
|
+
}
|
|
369
|
+
commit(d) {
|
|
370
|
+
const changed = !sameDay(d, this.selected) || (d === null) !== (this.selected === null);
|
|
371
|
+
this.selected = d;
|
|
372
|
+
this.invalid = false;
|
|
373
|
+
this.input.value = this.fmt(d);
|
|
374
|
+
this.paint();
|
|
375
|
+
if (changed)
|
|
376
|
+
emit(this, "kashi-change", { value: this.value, date: d });
|
|
377
|
+
}
|
|
378
|
+
/** باز کردن تقویم */
|
|
379
|
+
open() {
|
|
380
|
+
if (this.pop || this.hasAttribute("disabled"))
|
|
381
|
+
return;
|
|
382
|
+
const wrap = this.querySelector(".k-datepicker");
|
|
383
|
+
const box = this.querySelector(".k-input");
|
|
384
|
+
const pop = document.createElement("div");
|
|
385
|
+
pop.className = "k-datepicker__popover";
|
|
386
|
+
pop.id = `${this.key}-calendar`;
|
|
387
|
+
pop.setAttribute("role", "dialog");
|
|
388
|
+
pop.setAttribute("aria-label", this.getAttribute("open-label") ?? "انتخاب تاریخ از تقویم");
|
|
389
|
+
pop.style.insetBlockStart = `${box.offsetTop + box.offsetHeight + 6}px`;
|
|
390
|
+
const cal = document.createElement("kashi-calendar");
|
|
391
|
+
for (const a of ["min", "max", "digits", "holidays"]) {
|
|
392
|
+
const v = this.getAttribute(a);
|
|
393
|
+
if (v !== null)
|
|
394
|
+
cal.setAttribute(a, v);
|
|
395
|
+
}
|
|
396
|
+
if (this.selected)
|
|
397
|
+
cal.setAttribute("value", toISODate(this.selected));
|
|
398
|
+
cal.setAttribute("today-label", this.getAttribute("today-label") ?? "امروز");
|
|
399
|
+
cal.isDateDisabled = this.isDateDisabled;
|
|
400
|
+
cal.addEventListener("kashi-change", (e) => {
|
|
401
|
+
e.stopPropagation();
|
|
402
|
+
this.commit(e.detail.date);
|
|
403
|
+
this.close();
|
|
404
|
+
});
|
|
405
|
+
pop.addEventListener("keydown", (e) => {
|
|
406
|
+
if (e.key === "Escape") {
|
|
407
|
+
e.stopPropagation();
|
|
408
|
+
this.close();
|
|
409
|
+
}
|
|
410
|
+
});
|
|
411
|
+
pop.addEventListener("focusout", (e) => {
|
|
412
|
+
const next = e.relatedTarget;
|
|
413
|
+
if (next && !this.contains(next))
|
|
414
|
+
this.close(false);
|
|
415
|
+
});
|
|
416
|
+
pop.append(cal);
|
|
417
|
+
wrap.append(pop);
|
|
418
|
+
this.pop = pop;
|
|
419
|
+
this.toggle.setAttribute("aria-expanded", "true");
|
|
420
|
+
this.toggle.setAttribute("aria-controls", pop.id);
|
|
421
|
+
document.addEventListener("pointerdown", this.onOutside);
|
|
422
|
+
cal.focus();
|
|
423
|
+
}
|
|
424
|
+
/** بستن تقویم؛ فوکوس به دکمهٔ تقویم برمیگردد */
|
|
425
|
+
close(returnFocus = true) {
|
|
426
|
+
if (!this.pop)
|
|
427
|
+
return;
|
|
428
|
+
this.pop.remove();
|
|
429
|
+
this.pop = null;
|
|
430
|
+
document.removeEventListener("pointerdown", this.onOutside);
|
|
431
|
+
this.toggle.setAttribute("aria-expanded", "false");
|
|
432
|
+
this.toggle.removeAttribute("aria-controls");
|
|
433
|
+
if (returnFocus)
|
|
434
|
+
this.toggle.focus();
|
|
435
|
+
}
|
|
436
|
+
}
|
|
437
|
+
KashiDatePicker.observedAttributes = ["label", "hint", "error", "required", "disabled", "value", "min", "max", "digits", "holidays", "name", "placeholder", "invalid-message", "aria-label"];
|
|
438
|
+
define("kashi-calendar", KashiCalendar, "block");
|
|
439
|
+
define("kashi-date-picker", KashiDatePicker, "block");
|
|
@@ -0,0 +1 @@
|
|
|
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};
|
|
@@ -0,0 +1,16 @@
|
|
|
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};
|
|
@@ -0,0 +1 @@
|
|
|
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};
|
|
@@ -0,0 +1 @@
|
|
|
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};
|