@kashi-ui/elements 0.24.0 → 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.
@@ -0,0 +1 @@
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}from"./base-Cmq7zeIG.js";import{i as l}from"./digits-DE1YGT94.js";import{a as u,c as d,d as f,i as p,l as m,t as h,u as g}from"./jalali-BiM5Kfep.js";import"./calendar-Dm3fq2bs.js";const _=e=>e?u(e.trim())??d(e):null,v=(e,t=0)=>new Date(e.getFullYear(),e.getMonth(),e.getDate()+t),y=(e,t)=>!e&&!t||!!e&&!!t&&e.getTime()===t.getTime(),b=[[`۷ روز اخیر`,e=>({start:v(e,-6),end:e})],[`۳۰ روز اخیر`,e=>({start:v(e,-29),end:e})],[`این ماه`,e=>{let{jy:t,jm:n}=f(e);return{start:m(t,n,1),end:e}}],[`ماه قبل`,e=>{let{jy:t,jm:n}=f(e),[r,i]=n===1?[t-1,12]:[t,n-1];return{start:m(r,i,1),end:v(m(t,n,1),-1)}}]];var x=class extends c{constructor(){super(...arguments),this.current={start:null,end:null},this.draft={start:null,end:null},this.valueSet=!1,this.rendered=!1,this.key=n(`kashi-range`),this.pop=null,this.onOutside=e=>{this.contains(e.target)||this.close(!1)}}connectedCallback(){!this.rendered&&!this.valueSet&&(this.current={start:_(this.getAttribute(`start`)),end:_(this.getAttribute(`end`))}),this.render()}disconnectedCallback(){this.close(!1)}attributeChangedCallback(e,t,n){this.rendered&&t!==n&&((e===`start`||e===`end`)&&(this.current={...this.current,[e]:_(n)}),this.render())}get value(){return{...this.current}}set value(e){this.valueSet=!0,this.current={start:e?.start??null,end:e?.end??null},this.rendered&&this.render()}fmt(e){return p(e,{digits:this.getAttribute(`digits`)===`latin`?`latin`:`fa`})}text(e){return e.start&&e.end?`${this.fmt(e.start)} تا ${this.fmt(e.end)}`:null}render(){this.close(!1);let e=this.key,n=this.getAttribute(`label`)??`بازهٔ تاریخ`,r=this.text(this.current),o=`<div class="k-datepicker k-daterange"><div class="k-select"><button id="${e}" type="button" class="k-select__control k-daterange__trigger" aria-haspopup="dialog" aria-expanded="false"${r?``:` data-placeholder=""`}${this.hasAttribute(`disabled`)?` disabled`:``}>${a.calendar}<span>${s(r??this.getAttribute(`placeholder`)??`انتخاب بازهٔ تاریخ`)}</span></button></div></div>`;this.querySelector(`:scope > .k-field`)?.remove(),this.insertAdjacentHTML(`afterbegin`,t({id:e,label:n,control:o})),this.trigger=this.querySelector(`.k-daterange__trigger`),this.trigger.addEventListener(`click`,()=>this.pop?this.close():this.open()),this.rendered=!0,i(this.querySelector(`:scope > .k-field`),this.trigger,e,this.getAttribute(`error`),this.getAttribute(`hint`));let c=this.getAttribute(`name`);if(this.querySelectorAll(`:scope > input[type=hidden]`).forEach(e=>e.remove()),c)for(let[e,t]of[[`start`,this.current.start],[`end`,this.current.end]])this.insertAdjacentHTML(`beforeend`,`<input type="hidden" name="${s(`${c}_${e}`)}" value="${t?g(t):``}">`)}open(){if(this.pop||this.hasAttribute(`disabled`))return;this.draft={...this.current};let e=this.querySelector(`.k-daterange`),t=document.createElement(`div`);t.id=`${this.key}-popover`,t.className=`k-datepicker__popover k-daterange__popover`,t.setAttribute(`role`,`dialog`),t.setAttribute(`aria-label`,this.getAttribute(`label`)??`انتخاب بازهٔ تاریخ`);let n=this.getAttribute(`presets`)===`false`?[]:b;t.innerHTML=`${n.length?`<ul class="k-daterange__presets" role="list" aria-label="میان‌برها">${n.map(([e],t)=>`<li><button type="button" class="k-daterange__preset" data-preset="${t}" aria-pressed="false">${e}</button></li>`).join(``)}</ul>`:``}<div class="k-daterange__main"><div class="k-daterange__footer"><span class="k-daterange__summary" aria-live="polite"></span><button type="button" class="k-btn k-btn--secondary k-btn--sm" data-cancel>انصراف</button><button type="button" class="k-btn k-btn--primary k-btn--sm" data-apply>تأیید</button></div></div>`;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)}r.range=this.draft,t.querySelector(`.k-daterange__main`).prepend(r),r.addEventListener(`kashi-change`,e=>{e.stopPropagation();let t=e.detail.date,n=this.draft;this.draft=!n.start||n.end?{start:t,end:null}:t<n.start?{start:t,end:n.start}:{start:n.start,end:t},r.range=this.draft,this.paintDraft()}),t.addEventListener(`click`,e=>{let t=e.target,i=t.closest(`[data-preset]`);if(i)this.draft=n[Number(i.dataset.preset)][1](v(/* @__PURE__ */ new Date)),r.range=this.draft,this.paintDraft();else if(t.closest(`[data-cancel]`))this.close();else if(t.closest(`[data-apply]`)&&this.draft.start&&this.draft.end){let e=!y(this.draft.start,this.current.start)||!y(this.draft.end,this.current.end);this.current={...this.draft},this.close(),this.render(),this.trigger.focus(),e&&o(this,`kashi-change`,{start:this.current.start,end:this.current.end,value:{start:g(this.current.start),end:g(this.current.end)}})}}),t.addEventListener(`keydown`,e=>{e.key===`Escape`&&(e.stopPropagation(),this.close())}),e.append(t),this.pop=t,this.trigger.setAttribute(`aria-expanded`,`true`),this.trigger.setAttribute(`aria-controls`,t.id),document.addEventListener(`pointerdown`,this.onOutside),this.paintDraft(),r.focus()}paintDraft(){let e=this.pop,t=this.draft;e.querySelector(`.k-daterange__summary`).textContent=this.text(t)??(t.start?`حالا تاریخ پایان را انتخاب کنید.`:``),e.querySelector(`[data-apply]`).disabled=!t.start||!t.end;let n=v(/* @__PURE__ */ new Date);e.querySelectorAll(`[data-preset]`).forEach((e,r)=>{let i=b[r][1](n);e.setAttribute(`aria-pressed`,String(y(t.start,i.start)&&y(t.end,i.end)))})}close(e=!0){this.pop&&(this.pop.remove(),this.pop=null,document.removeEventListener(`pointerdown`,this.onOutside),this.trigger.setAttribute(`aria-expanded`,`false`),this.trigger.removeAttribute(`aria-controls`),e&&this.trigger.focus())}};x.observedAttributes=[`label`,`hint`,`error`,`start`,`end`,`min`,`max`,`holidays`,`digits`,`name`,`disabled`,`presets`,`placeholder`];const S=e=>`<svg viewBox="0 0 20 20" fill="none" stroke="currentColor" stroke-width="1.7" stroke-linecap="round" stroke-linejoin="round" aria-hidden="true" data-k-mirror=""><path d="${e?`m8 5 5 5-5 5`:`m12 5-5 5 5 5`}"/></svg>`;var C=class extends c{constructor(){super(...arguments),this.selected=null,this.year=f(/* @__PURE__ */ new Date).jy,this.focusMonth=1,this.valueSet=!1,this.rendered=!1}connectedCallback(){if(!this.rendered){this.valueSet||(this.selected=this.parse(this.getAttribute(`value`)));let e=f(/* @__PURE__ */ new Date);this.year=this.selected?.year??e.jy,this.focusMonth=this.selected?.month??(this.year===e.jy?e.jm:1)}this.render()}attributeChangedCallback(e,t,n){this.rendered&&t!==n&&(e===`value`?this.value=n??``:this.render())}parse(e){let t=(e??``).trim().match(/^(\d{4})[-/](\d{1,2})$/);return t?{year:Number(t[1]),month:Number(t[2])}:null}get value(){return this.selected?`${this.selected.year}-${String(this.selected.month).padStart(2,`0`)}`:``}set value(e){this.valueSet=!0,this.selected=this.parse(e),this.selected&&([this.year,this.focusMonth]=[this.selected.year,this.selected.month]),this.rendered&&this.render()}out(e,t){let n=e*12+t,r=this.parse(this.getAttribute(`min`)),i=this.parse(this.getAttribute(`max`));return!!r&&n<r.year*12+r.month||!!i&&n>i.year*12+i.month}render(e=!1){let t=e=>this.getAttribute(`digits`)===`latin`?String(e):l(String(e)),n=f(/* @__PURE__ */ new Date),r=this.parse(this.getAttribute(`min`)),i=this.parse(this.getAttribute(`max`)),a=this.year;this.innerHTML=`<div class="k-monthpicker" role="group" aria-label="${s(this.getAttribute(`label`)??`انتخاب ماه`)}"><div class="k-monthpicker__header"><button type="button" class="k-btn k-btn--tertiary k-btn--icon k-btn--sm" data-year="-1" aria-label="سال قبل"${r&&a<=r.year?` disabled`:``}>${S(!1)}</button><span class="k-monthpicker__year" aria-live="polite">${t(a)}</span><button type="button" class="k-btn k-btn--tertiary k-btn--icon k-btn--sm" data-year="1" aria-label="سال بعد"${i&&a>=i.year?` disabled`:``}>${S(!0)}</button></div><div class="k-monthpicker__grid">${h.map((e,r)=>`<button type="button" data-month="${r+1}" class="k-monthpicker__month" tabindex="${this.focusMonth===r+1?0:-1}" aria-pressed="${this.selected?.year===a&&this.selected.month===r+1}" aria-label="${e} ${t(a)}"${n.jy===a&&n.jm===r+1?` aria-current="date"`:``}${this.out(a,r+1)?` disabled`:``}>${e}</button>`).join(``)}</div></div>`;let c=this.getAttribute(`name`);c&&this.insertAdjacentHTML(`beforeend`,`<input type="hidden" name="${s(c)}" value="${this.value}">`),this.rendered=!0,this.querySelectorAll(`[data-year]`).forEach(e=>e.addEventListener(`click`,()=>{this.year+=Number(e.dataset.year),this.render()}));let u=this.querySelector(`.k-monthpicker__grid`);u.addEventListener(`click`,e=>{let t=e.target.closest(`[data-month]`);t&&!t.disabled&&(this.selected={year:this.year,month:Number(t.dataset.month)},this.focusMonth=this.selected.month,this.render(!0),o(this,`kashi-change`,{value:this.value,year:this.selected.year,month:this.selected.month}))}),u.addEventListener(`keydown`,e=>{let t=getComputedStyle(u).direction===`rtl`,n={ArrowRight:t?-1:1,ArrowLeft:t?1:-1,ArrowDown:3,ArrowUp:-3,PageUp:-12,PageDown:12},r=this.year*12+this.focusMonth-1;if(e.key in n)r+=n[e.key];else if(e.key===`Home`)r=this.year*12;else if(e.key===`End`)r=this.year*12+11;else return;e.preventDefault(),this.year=Math.floor(r/12),this.focusMonth=r%12+1,this.render(!0)}),e&&this.querySelector(`[data-month="${this.focusMonth}"]`)?.focus()}};C.observedAttributes=[`value`,`min`,`max`,`digits`,`label`,`name`];function w(e){let t=[`بایت`,`کیلوبایت`,`مگابایت`,`گیگابایت`],n=e,r=0;for(;n>=1024&&r<t.length-1;)n/=1024,r++;let i=r===0?String(n):n.toFixed(+(n<10)).replace(/\.0$/,``);return`${l(i).replace(`.`,`٫`)} ${t[r]}`}var T=class extends c{constructor(){super(...arguments),this.items=[],this.rendered=!1,this.key=n(`kashi-upload`)}connectedCallback(){this.rendered||this.render()}attributeChangedCallback(e,t,n){this.rendered&&t!==n&&this.render()}get files(){return this.items.filter(e=>e.status!==`error`).map(e=>e.file)}get multiple(){return r(this,`multiple`,!0)}render(){let e=this.key,t=this.getAttribute(`hint`),n=this.hasAttribute(`disabled`),r=this.getAttribute(`name`),i=this.getAttribute(`accept`);this.innerHTML=`<div class="k-dropzone"${n?` data-disabled=""`:``}><span class="k-dropzone__icon" aria-hidden="true"><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></span><p class="k-dropzone__title" style="margin: 0"><button type="button" class="k-dropzone__browse"${n?` disabled`:``}${t?` aria-describedby="${e}-hint"`:``}>${s(this.getAttribute(`label`)??`انتخاب فایل`)}</button> <span>یا فایل را اینجا رها کنید</span></p>${t?`<p class="k-dropzone__hint" id="${e}-hint" style="margin: 0">${s(t)}</p>`:``}<input type="file" tabindex="-1" aria-hidden="true"${i?` accept="${s(i)}"`:``}${this.multiple?` multiple`:``}${r?` name="${s(r)}"`:``}></div><ul class="k-file-list" role="list" hidden></ul><span class="k-sr-only" aria-live="polite"></span>`,this.rendered=!0,this.input=this.querySelector(`input[type=file]`);let a=this.querySelector(`.k-dropzone`);this.querySelector(`.k-dropzone__browse`).addEventListener(`click`,()=>this.input.click()),this.input.addEventListener(`change`,()=>{this.input.files?.length&&this.add([...this.input.files])}),a.addEventListener(`dragover`,e=>{e.preventDefault(),n||a.setAttribute(`data-dragging`,``)}),a.addEventListener(`dragleave`,e=>{a.contains(e.relatedTarget)||a.removeAttribute(`data-dragging`)}),a.addEventListener(`drop`,e=>{e.preventDefault(),a.removeAttribute(`data-dragging`),!n&&e.dataTransfer?.files.length&&this.add([...e.dataTransfer.files])}),this.querySelector(`.k-file-list`).addEventListener(`click`,e=>{let t=e.target.closest(`[data-remove]`);if(!t)return;let n=this.items.find(e=>e.id===t.dataset.remove);this.items=this.items.filter(e=>e.id!==t.dataset.remove),this.announce(`${n?.file.name??``} حذف شد`),this.changed()}),this.paint()}accepts(e){let t=this.getAttribute(`accept`);return!t||t.split(`,`).map(e=>e.trim().toLowerCase()).some(t=>t.startsWith(`.`)?e.name.toLowerCase().endsWith(t):t.endsWith(`/*`)?e.type.startsWith(t.slice(0,-1)):e.type===t)}add(e){let t=this.multiple?e:e.slice(0,1),r=Number(this.getAttribute(`max-size`))||0,i=Number(this.getAttribute(`max-files`))||0,a=this.multiple?this.items.filter(e=>e.status!==`error`).length:0,o=t.map((e,t)=>{let o;this.accepts(e)?r&&e.size>r?o=`حجم فایل بیشتر از ${w(r)} است.`:i&&a+t>=i&&(o=`حداکثر ${l(i)} فایل.`):o=`این نوع فایل پذیرفته نیست.`;let s=!o&&!!this.uploader;return{id:n(`f`),file:e,status:o?`error`:s?`uploading`:`done`,progress:o||s?0:100,error:o}});this.items=this.multiple?[...this.items,...o]:o,this.announce(o.map(e=>`${e.file.name}: ${e.error??(this.uploader?`در حال بارگذاری`:`بارگذاری شد`)}`).join(`، `)),this.changed();for(let e of o)e.status===`uploading`&&this.uploader&&this.uploader(e.file,t=>{e.progress=t,this.paint()}).then(()=>{e.status=`done`,e.progress=100,this.announce(`${e.file.name}: بارگذاری شد`),this.changed()},t=>{e.status=`error`,e.error=t instanceof Error?t.message:`خطا در بارگذاری`,this.announce(`${e.file.name}: ${e.error}`),this.changed()})}announce(e){this.querySelector(`:scope > .k-sr-only`).textContent=e}changed(){try{let e=new DataTransfer;for(let t of this.files)e.items.add(t);this.input.files=e.files}catch{}this.paint(),o(this,`kashi-change`,{files:this.files})}paint(){let e=this.querySelector(`.k-file-list`);e.hidden=!this.items.length;let t=e=>(e.split(`.`).pop()??``).slice(0,4).toUpperCase();e.innerHTML=this.items.map(e=>`<li class="k-file" data-status="${e.status}"><span class="k-file__icon" aria-hidden="true">${s(t(e.file.name))}</span><span class="k-file__name" title="${s(e.file.name)}">${s(e.file.name)}</span><button type="button" class="k-btn k-btn--tertiary k-btn--icon k-btn--sm k-file__remove" data-remove="${e.id}" aria-label="حذف ${s(e.file.name)}"><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></button><span class="k-file__meta">${s(e.error??`${w(e.file.size)}${e.status===`uploading`?` · ${l(Math.round(e.progress))}٪`:e.status===`done`?` · بارگذاری شد`:``}`)}</span>${e.status===`uploading`?`<div role="progressbar" aria-valuemin="0" aria-valuemax="100" aria-valuenow="${Math.round(e.progress)}" aria-label="در حال بارگذاری ${s(e.file.name)}" class="k-progress k-progress--sm"><div class="k-progress__bar" style="--k-value: ${e.progress}%"></div></div>`:``}</li>`).join(``)}};T.observedAttributes=[`accept`,`multiple`,`max-size`,`max-files`,`hint`,`name`,`disabled`,`label`];const E=/^#?([0-9a-f]{3}|[0-9a-f]{6})$/i,D=e=>{let t=e.trim().match(E);return t?`#${(t[1].length===3?[...t[1]].map(e=>e+e).join(``):t[1]).toLowerCase()}`:null},O=e=>[1,3,5].map(t=>parseInt(e.slice(t,t+2),16)),k=(e,t,n)=>`#${[e,t,n].map(e=>Math.round(Math.min(255,Math.max(0,e))).toString(16).padStart(2,`0`)).join(``)}`,A=e=>{let[t,n,r]=O(e).map(e=>e/255).map(e=>e<=.03928?e/12.92:((e+.055)/1.055)**2.4);return .2126*t+.7152*n+.0722*r},j=(e,t)=>{let[n,r]=[A(D(e)??e),A(D(t)??t)].sort((e,t)=>t-e);return(n+.05)/(r+.05)};function M(e){let[t,n,r]=O(e).map(e=>e/255),i=Math.max(t,n,r),a=i-Math.min(t,n,r),o=0;return a&&(o=i===t?(n-r)/a%6:i===n?(r-t)/a+2:(t-n)/a+4),{h:(o*60+360)%360,s:i?a/i:0,v:i}}function N({h:e,s:t,v:n}){let r=r=>{let i=(r+e/60)%6;return(n-n*t*Math.max(0,Math.min(i,4-i,1)))*255};return k(r(5),r(3),r(1))}const P=[[`فیروزه‌ای`,`#0b8077`],[`لاجوردی`,`#2740ed`],[`بنفش`,`#7c3aed`],[`اناری`,`#e51d2a`],[`زعفرانی`,`#dd5e02`],[`پسته‌ای`,`#518b25`],[`شب`,`#2a2f3d`]];var F=class extends c{constructor(){super(...arguments),this.current=`#0b8077`,this.hsv=M(`#0b8077`),this.valueSet=!1,this.rendered=!1,this.key=n(`kashi-color`),this.panel=null,this.onOutside=e=>{this.querySelector(`.k-color__anchor`)?.contains(e.target)||this.closePanel(!1)}}connectedCallback(){!this.rendered&&!this.valueSet&&this.setColor(D(this.getAttribute(`value`)??``)??`#0b8077`,!1),this.render()}disconnectedCallback(){document.removeEventListener(`pointerdown`,this.onOutside)}attributeChangedCallback(e,t,n){this.rendered&&t!==n&&(e===`value`?this.value=n??``:this.render())}get value(){return this.current}set value(e){this.valueSet=!0;let t=D(e??``);t&&this.setColor(t,!1),this.rendered&&this.paint()}setColor(e,t){if(this.current=e,!t){let t=M(e);this.hsv=t.s===0?{...t,h:this.hsv.h}:t}}swatches(){let e=this.getAttribute(`swatches`);return e===null?P:e.split(`,`).map(e=>e.trim().split(/\s+/)).filter(([e])=>D(e)).map(([e,...t])=>[t.join(` `)||e,D(e)])}render(){let e=this.key,n=this.swatches(),r=`<div class="k-color">${n.length?`<div class="k-color__swatches" role="radiogroup" aria-label="رنگ‌های پیشنهادی">${n.map(([t,n])=>`<label class="k-color__swatch" style="--_sw: ${n}; --_ink: ${j(n,`#ffffff`)>=3?`#fff`:`#000`}" title="${s(t)}"><input type="radio" class="k-sr-only" name="${e}-sw" value="${n}" aria-label="${s(t)}"><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></label>`).join(``)}</div>`:``}<div class="k-color__row"><span class="k-color__anchor"><button type="button" class="k-color__preview" aria-label="انتخاب رنگ دلخواه" aria-haspopup="dialog" aria-expanded="false"></button></span><div class="k-input"><input id="${e}-hex" class="k-input__control" dir="ltr" spellcheck="false" autocomplete="off"></div></div>${this.getAttribute(`show-contrast`)===`false`?``:`<p class="k-color__contrast" aria-live="polite"><span class="k-color__sample">متن نمونه</span><span></span></p>`}</div>`;this.querySelector(`:scope > .k-field`)?.remove(),this.insertAdjacentHTML(`afterbegin`,t({id:`${e}-hex`,label:this.getAttribute(`label`)??`رنگ`,control:r})),this.rendered=!0,this.querySelector(`.k-color__swatches`)?.addEventListener(`change`,e=>this.pick(e.target.value));let i=this.querySelector(`#${e}-hex`);i.addEventListener(`input`,()=>{let e=D(i.value);this.paintMessages(!e),e&&this.pick(e,!1)}),i.addEventListener(`blur`,()=>{D(i.value)&&(i.value=this.current)}),this.querySelector(`.k-color__preview`).addEventListener(`click`,()=>this.panel?this.closePanel():this.openPanel()),this.paint()}pick(e,t=!0,n=!1){let r=e!==this.current;this.setColor(e,n),this.paint(t),r&&o(this,`kashi-change`,{value:e})}paint(e=!0){let t=this.current,n=j(t,`#ffffff`),r=j(t,`#000000`),i=n>=r?`#ffffff`:`#000000`,a=this.querySelector(`.k-color`);a.style.setProperty(`--_sw`,t),a.style.setProperty(`--_ink`,i),this.querySelectorAll(`.k-color__swatch input`).forEach(e=>e.checked=e.value===t);let o=this.querySelector(`#${this.key}-hex`);e&&(o.value=t);let c=Math.max(n,r),u=this.querySelector(`.k-color__contrast span:last-child`);u&&(u.textContent=`کنتراست با متن ${i===`#ffffff`?`سفید`:`مشکی`}: ${l((Math.round(c*10)/10).toFixed(1)).replace(`.`,`٫`)} به ۱ ${c>=4.5?`(AA)`:`(کمتر از AA)`}`);let d=this.getAttribute(`name`);this.querySelectorAll(`:scope > input[type=hidden]`).forEach(e=>e.remove()),d&&this.insertAdjacentHTML(`beforeend`,`<input type="hidden" name="${s(d)}" value="${t}">`),this.panel&&this.paintPanel(),this.paintMessages(!1)}paintMessages(e){let t=this.querySelector(`#${this.key}-hex`);i(this.querySelector(`:scope > .k-field`),t,`${this.key}-hex`,e?`کد رنگ معتبر نیست؛ مثل ‎#0fa89b‎ وارد کنید.`:null,this.getAttribute(`hint`))}openPanel(){let e=this.querySelector(`.k-color__anchor`),t=document.createElement(`div`);t.className=`k-color__panel`,t.setAttribute(`role`,`dialog`),t.setAttribute(`aria-label`,`انتخاب رنگ دلخواه`),t.innerHTML=`<div class="k-color__area" role="slider" tabindex="0" aria-label="اشباع و روشنایی"><span class="k-color__thumb"></span></div><div class="k-color__tools"><span class="k-color__current" aria-hidden="true"></span><input type="range" class="k-color__hue" min="0" max="359" aria-label="رنگ‌مایه"></div><div class="k-color__codes" dir="ltr">${[`R`,`G`,`B`].map((e,t)=>`<label class="k-color__code"><input class="k-color__num" inputmode="numeric" data-ch="${t}" aria-label="${[`قرمز`,`سبز`,`آبی`][t]}"><span aria-hidden="true">${e}</span></label>`).join(``)}</div>`,e.append(t),this.panel=t;let n=t.querySelector(`.k-color__area`),r=e=>{this.hsv=e,this.pick(N(e),!0,!0)},i=e=>{let t=n.getBoundingClientRect();r({...this.hsv,s:Math.min(1,Math.max(0,(e.clientX-t.left)/t.width)),v:1-Math.min(1,Math.max(0,(e.clientY-t.top)/t.height))})};n.addEventListener(`pointerdown`,e=>{n.setPointerCapture?.(e.pointerId),i(e)}),n.addEventListener(`pointermove`,e=>e.buttons===1&&i(e)),n.addEventListener(`keydown`,e=>{let t=e.shiftKey?.1:.01,n=this.hsv,i={ArrowLeft:{s:Math.max(0,n.s-t)},ArrowRight:{s:Math.min(1,n.s+t)},ArrowUp:{v:Math.min(1,n.v+t)},ArrowDown:{v:Math.max(0,n.v-t)}};i[e.key]&&(e.preventDefault(),r({...n,...i[e.key]}))}),t.querySelector(`.k-color__hue`).addEventListener(`input`,e=>r({...this.hsv,h:Number(e.target.value)})),t.querySelectorAll(`.k-color__num`).forEach(e=>e.addEventListener(`input`,()=>{let t=O(this.current);t[Number(e.dataset.ch)]=Math.min(255,Math.max(0,Number(e.value.replace(/\D/g,``))||0)),this.pick(k(...t))})),t.addEventListener(`keydown`,e=>{e.key===`Escape`&&(e.stopPropagation(),this.closePanel())}),this.querySelector(`.k-color__preview`).setAttribute(`aria-expanded`,`true`),document.addEventListener(`pointerdown`,this.onOutside),this.paintPanel(),n.focus({preventScroll:!0})}paintPanel(){let e=this.panel,{h:t,s:n,v:r}=this.hsv,i=e=>`${l(Math.round(e*100))}٪`,a=e.querySelector(`.k-color__area`);a.style.setProperty(`--_hue`,`hsl(${t} 100% 50%)`),a.setAttribute(`aria-valuenow`,String(Math.round(n*100))),a.setAttribute(`aria-valuetext`,`اشباع ${i(n)}، روشنایی ${i(r)}`);let o=e.querySelector(`.k-color__thumb`);o.style.left=`${n*100}%`,o.style.top=`${(1-r)*100}%`;let s=e.querySelector(`.k-color__hue`);s.value=String(Math.round(t)),s.setAttribute(`aria-valuetext`,`${l(Math.round(t))} درجه`);let c=O(this.current);e.querySelectorAll(`.k-color__num`).forEach((e,t)=>{document.activeElement!==e&&(e.value=String(c[t]))})}closePanel(e=!0){if(!this.panel)return;this.panel.remove(),this.panel=null,document.removeEventListener(`pointerdown`,this.onOutside);let t=this.querySelector(`.k-color__preview`);t.setAttribute(`aria-expanded`,`false`),e&&t.focus()}};F.observedAttributes=[`label`,`hint`,`value`,`name`,`swatches`,`show-contrast`],e(`kashi-date-range-picker`,x,`block`),e(`kashi-month-picker`,C,`block`),e(`kashi-file-upload`,T,`block`),e(`kashi-color-picker`,F,`block`);export{F as KashiColorPicker,x as KashiDateRangePicker,T as KashiFileUpload,C as KashiMonthPicker,j as contrastRatio,w as formatBytes};
@@ -0,0 +1 @@
1
+ import{a as e,d as t,i as n,o as r,r as i,s as a,t as o}from"./base-Cmq7zeIG.js";import{i as s}from"./digits-DE1YGT94.js";import{n as c}from"./text-D1U32D6K.js";import{cellNumber as l}from"./controls-K-OZcjg4.js";const u=e=>c(e,{digits:`latin`}).toLowerCase();var d=class extends o{constructor(){super(...arguments),this.cols=null,this.data=null,this.table=null,this.sort=null,this.query=``,this.key=t(`kashi-table`),this.getRowId=e=>String(e.id??``)}connectedCallback(){i(()=>this.isConnected&&this.setup())}attributeChangedCallback(e,t,n){this.table&&t!==n&&this.setup()}get columns(){return this.cols??[]}set columns(e){this.cols=e,this.isConnected&&this.data&&this.setup()}get rows(){return this.data??[]}set rows(e){this.data=e,this.isConnected&&this.cols&&this.setup()}get selected(){return[...this.querySelectorAll(`tbody tr[aria-selected="true"]`)].map(e=>e.dataset.id??``)}setup(){this.cols&&this.data&&this.buildFromData();let e=this.querySelector(`:scope table`);if(!e)return;let t=e.closest(`.k-table-wrap`)??this.wrap(e);t.className=`k-table-wrap${n(this,`sticky-header`)?` k-table-wrap--sticky`:``}`,e.classList.add(`k-table`),e.classList.toggle(`k-table--compact`,n(this,`compact`)),e.classList.toggle(`k-table--striped`,n(this,`striped`));let r=e.querySelector(`caption`);r&&(r.id||=`${this.key}-caption`,t.setAttribute(`aria-labelledby`,r.id)),this.table=e,this.decorateHeader(),this.decorateRows(),this.searchBox(),this.apply()}wrap(e){let t=document.createElement(`div`);return t.setAttribute(`role`,`region`),t.tabIndex=0,e.before(t),t.append(e),t}buildFromData(){let e=this.cols,t=this.getAttribute(`caption`)??``,n=(e,t)=>e.format?e.format(t[e.key],t):String(t[e.key]??``),r=`<table>${t?`<caption><span class="k-table__caption-title">${a(t)}</span></caption>`:``}<thead><tr>${e.map(e=>`<th scope="col"${e.sortable?` data-sort`:``}${e.numeric?` data-numeric`:``}>${a(e.header)}</th>`).join(``)}</tr></thead><tbody>${this.data.map(t=>`<tr data-id="${a(this.getRowId(t))}">${e.map(e=>`<td>${a(n(e,t))}</td>`).join(``)}</tr>`).join(``)}</tbody></table>`;this.querySelector(`:scope > .k-table-wrap, :scope > table`)?.remove(),this.insertAdjacentHTML(`beforeend`,r)}decorateHeader(){this.table;let e=this.headCells();e.forEach((e,t)=>{if(e.classList.contains(`k-table__check`)||(e.scope||=`col`,e.hasAttribute(`data-numeric`)&&e.classList.add(`k-table__num`),!e.hasAttribute(`data-sort`)||e.querySelector(`.k-table__sort`)))return;e.setAttribute(`aria-sort`,`none`);let n=document.createElement(`button`);n.type=`button`,n.className=`k-table__sort`,n.append(...e.childNodes),e.append(n);let i=this.dataIndex(t);n.addEventListener(`click`,()=>{this.sort=this.sort?.index===i&&this.sort.dir===`ascending`?{index:i,dir:`descending`}:{index:i,dir:`ascending`},this.apply(),r(this,`kashi-sort`,{column:i,direction:this.sort.dir})})});let t=e.map(e=>e.hasAttribute(`data-numeric`));for(let e of this.bodyRows())[...e.children].forEach((e,n)=>t[n]&&e.classList.add(`k-table__num`));let i=n(this,`selectable`),a=this.headRow(),o=a?.querySelector(`.k-table__check`);if(i&&a&&!o){let e=document.createElement(`th`);e.scope=`col`,e.className=`k-table__check`,e.innerHTML=`<input type="checkbox" class="k-checkbox" aria-label="انتخاب همهٔ ردیف‌ها">`,a.prepend(e),e.querySelector(`input`).addEventListener(`change`,e=>{let t=e.target.checked;this.visibleRows().forEach(e=>this.setRow(e,t)),this.selectionChanged()})}else!i&&o&&o.remove()}headRow(){return this.table.querySelector(`:scope > thead > tr`)}headCells(){return[...this.headRow()?.children??[]]}bodyRows(){return[...this.table.querySelectorAll(`:scope > tbody > tr`)]}dataIndex(e){return this.headRow()?.querySelector(`.k-table__check`)?e-1:e}offset(){return+!!this.headRow()?.querySelector(`.k-table__check`)}decorateRows(){let e=n(this,`selectable`);this.bodyRows().forEach((t,n)=>{var r,i;(r=t.dataset).id||(r.id=String(n+1)),(i=t.dataset).order||(i.order=String(n));let o=t.querySelector(`.k-table__check`);if(e&&!o){let e=document.createElement(`td`);e.className=`k-table__check`;let n=t.children[0]?.textContent?.trim();e.innerHTML=`<input type="checkbox" class="k-checkbox" aria-label="${a(n?`انتخاب ${n}`:`انتخاب ردیف`)}">`,t.prepend(e),t.setAttribute(`aria-selected`,`false`),e.querySelector(`input`).addEventListener(`change`,e=>{this.setRow(t,e.target.checked),this.selectionChanged()})}else!e&&o&&(o.remove(),t.removeAttribute(`aria-selected`))}),this.selectionChanged(!1)}setRow(e,t){e.setAttribute(`aria-selected`,String(t));let n=e.querySelector(`.k-table__check input`);n&&(n.checked=t)}selectionChanged(e=!0){let t=this.headRow()?.querySelector(`.k-table__check input`),n=this.visibleRows(),i=n.filter(e=>e.getAttribute(`aria-selected`)===`true`).length;t&&(t.checked=n.length>0&&i===n.length,t.indeterminate=i>0&&i<n.length);let o=this.getAttribute(`name`);if(this.querySelectorAll(`:scope > input[type=hidden]`).forEach(e=>e.remove()),o)for(let e of this.selected)this.insertAdjacentHTML(`beforeend`,`<input type="hidden" name="${a(o)}" value="${a(e)}">`);e&&r(this,`kashi-change`,{selected:this.selected})}visibleRows(){return this.bodyRows().filter(e=>!e.hidden&&!e.classList.contains(`k-table__empty`))}searchBox(){let e=this.querySelector(`:scope > .k-table-search`);if(!n(this,`searchable`))return e?.remove();if(e)return;let t=`${this.key}-search`,r=document.createElement(`div`);r.className=`k-table-search k-field`,r.style.marginBlockEnd=`var(--k-space-3)`,r.innerHTML=`<div class="k-input k-input--sm"><input id="${t}" class="k-input__control" type="search" placeholder="جستجو در جدول" aria-label="جستجو در جدول"></div><span class="k-sr-only" aria-live="polite"></span>`,this.prepend(r);let i=r.querySelector(`input`);i.addEventListener(`input`,()=>{this.query=i.value,this.apply(),r.querySelector(`.k-sr-only`).textContent=`${s(this.visibleRows().length)} ردیف`})}apply(){let e=this.table.querySelector(`:scope > tbody`);if(!e)return;let t=this.offset(),n=this.bodyRows().filter(e=>!e.classList.contains(`k-table__empty`)),r=this.headCells();r.forEach((e,n)=>{e.hasAttribute(`aria-sort`)&&e.setAttribute(`aria-sort`,this.sort&&this.sort.index===n-t?this.sort.dir:`none`)});let i=n.sort((e,t)=>Number(e.dataset.order)-Number(t.dataset.order));if(this.sort){let{index:e,dir:n}=this.sort,a=r[e+t]?.hasAttribute(`data-numeric`),o=n=>{let r=n.children[e+t],i=r?.dataset.value??r?.textContent?.trim()??``;return a?l(i):i},s=n===`ascending`?1:-1;i=[...i].sort((e,t)=>{let n=o(e),r=o(t);return(typeof n==`number`&&typeof r==`number`?n-r:String(n).localeCompare(String(r),`fa`))*s})}let a=u(this.query.trim());for(let t of i)t.hidden=!!a&&!u(t.textContent??``).includes(a),e.append(t);if(e.querySelector(`.k-table__empty`)?.remove(),a&&!this.visibleRows().length){let t=r.length;e.insertAdjacentHTML(`beforeend`,`<tr class="k-table__empty"><td colspan="${t}"><p style="padding: 2rem; margin: 0; text-align: center">نتیجه‌ای پیدا نشد.</p></td></tr>`)}this.selectionChanged(!1)}};d.observedAttributes=[`selectable`,`searchable`,`compact`,`striped`,`sticky-header`,`caption`,`name`],e(`kashi-data-table`,d,`block`);export{d as KashiDataTable};
@@ -0,0 +1 @@
1
+ import{i as e,r as t}from"./digits-DE1YGT94.js";function n(n,{digits:r}={}){let i=n.replace(/[يى]/g,`ی`).replace(/ك/g,`ک`).replace(/ة/g,`ه`).replace(/[ً-ٰٟ]/g,``).replace(/ـ/g,``).replace(/‌{2,}/g,`‌`).replace(/ *‌ */g,`‌`).replace(/[ \t]{2,}/g,` `).trim();return r===`fa`&&(i=e(t(i))),r===`latin`&&(i=t(i)),i}function r(t,{digits:n=!0}={}){let r={arabic:0,zwnj:0,punctuation:0,digits:0,spacing:0},i=(e,t,n,i)=>e.replace(t,(...e)=>(r[i]++,typeof n==`string`?n.replace(/\$(\d)/g,(t,n)=>e[Number(n)]??``):n(...e))),a=`[\\u0621-\\u063A\\u0641-\\u064A\\u067E\\u0686\\u0698\\u06A9\\u06AF\\u06CC]`,o=t;o=i(o,/[يى]/g,`ی`,`arabic`),o=i(o,/ك/g,`ک`,`arabic`),o=i(o,RegExp(`(^|[\\s(«])(ن?می) (?=${a})`,`g`),`$1$2‌`,`zwnj`),o=i(o,RegExp(`(${a}) (ها|های|هایی|هایم|هایت|هایش|تر|ترین)(?=$|[\\s.،؛؟!»)])`,`g`),`$1‌$2`,`zwnj`),o=i(o,RegExp(`(${a}\\s*),(?=\\s)`,`g`),`$1،`,`punctuation`),o=i(o,RegExp(`(${a}\\s*)\\?`,`g`),`$1؟`,`punctuation`),o=i(o,RegExp(`(${a}\\s*);`,`g`),`$1؛`,`punctuation`),o=i(o,/ +([،؛؟!.:])(?=\s|$)/g,`$1`,`spacing`),o=i(o,/ {2,}/g,` `,`spacing`),n&&(o=i(o,RegExp(`(${a}[\\s\\u200c]*)(\\d+)|(\\d+)(?=[\\s\\u200c]*${a})`,`g`),(t,n,r,i)=>n?n+e(r):e(i),`digits`));let s=Object.values(r).reduce((e,t)=>e+t,0);return{text:o,fixes:r,count:s}}export{n,r as t};
@@ -0,0 +1 @@
1
+ const e=[``,`یک`,`دو`,`سه`,`چهار`,`پنج`,`شش`,`هفت`,`هشت`,`نه`],t=[`ده`,`یازده`,`دوازده`,`سیزده`,`چهارده`,`پانزده`,`شانزده`,`هفده`,`هجده`,`نوزده`],n=[``,``,`بیست`,`سی`,`چهل`,`پنجاه`,`شصت`,`هفتاد`,`هشتاد`,`نود`],r=[``,`صد`,`دویست`,`سیصد`,`چهارصد`,`پانصد`,`ششصد`,`هفتصد`,`هشتصد`,`نهصد`],i=[``,`هزار`,`میلیون`,`میلیارد`,`تریلیون`];function a(i){let a=[],o=Math.floor(i/100),s=i%100;return o&&a.push(r[o]),s>=10&&s<20?a.push(t[s-10]):(s>=20&&a.push(n[Math.floor(s/10)]),s%10&&a.push(e[s%10])),a.join(` و `)}function o(e){let t=typeof e==`bigint`?e:BigInt(Math.trunc(e));if(t===0n)return`صفر`;let n=t<0n;if(n&&(t=-t),t>=10n**15n)throw RangeError(`عدد بزرگ‌تر از حد پشتیبانی‌شده است`);let r=[];for(let e=0;t>0n;e++,t/=1000n){let n=Number(t%1000n);if(!n)continue;let o=e===1&&n===1?``:a(n);r.unshift([o,i[e]].filter(Boolean).join(` `))}return(n?`منفی `:``)+r.join(` و `)}export{o as t};
package/dist/cdn.d.ts ADDED
@@ -0,0 +1,3 @@
1
+ export { toast } from "./toast.js";
2
+ /** همهٔ عنصرها را همین حالا بارگذاری می‌کند؛ مثلاً پیش از ساختن عنصرها با JavaScript */
3
+ export declare function loadAll(): Promise<unknown[]>;
package/dist/cdn.js ADDED
@@ -0,0 +1,44 @@
1
+ // نسخهٔ CDN با بارگذاری تنبل: هر بخش فقط وقتی یکی از تگ‌هایش در صفحه پیدا شود دانلود می‌شود.
2
+ // صفحه‌ای که فقط فیلد کد ملی دارد، نقشه و نمودارها را دانلود نمی‌کند.
3
+ export { toast } from "./toast.js";
4
+ const MODULES = [
5
+ [["kashi-national-id", "kashi-legal-id", "kashi-mobile", "kashi-landline", "kashi-card-number", "kashi-iban", "kashi-postal-code", "kashi-price"], () => import("./inputs.js")],
6
+ [["kashi-otp"], () => import("./fields.js")],
7
+ [["kashi-combobox", "kashi-province-select", "kashi-city-select"], () => import("./combobox.js")],
8
+ [["kashi-iran-map", "kashi-address-form"], () => import("./map.js")],
9
+ [["kashi-calendar", "kashi-date-picker"], () => import("./calendar.js")],
10
+ [["kashi-money", "kashi-date", "kashi-relative-time", "kashi-countdown"], () => import("./display.js")],
11
+ [["kashi-dialog", "kashi-tabs", "kashi-tooltip", "kashi-copy-button"], () => import("./overlay.js")],
12
+ [["kashi-dropdown-menu", "kashi-popover"], () => import("./menu.js")],
13
+ [["kashi-tag-input", "kashi-number-input", "kashi-rating", "kashi-pagination"], () => import("./controls.js")],
14
+ [["kashi-data-table"], () => import("./table.js")],
15
+ [["kashi-multi-select", "kashi-slider", "kashi-chip-group", "kashi-password-strength", "kashi-persian-textarea", "kashi-keyboard-fix", "kashi-time-input", "kashi-plate-input", "kashi-inline-edit"], () => import("./forms.js")],
16
+ [["kashi-date-range-picker", "kashi-month-picker", "kashi-file-upload", "kashi-color-picker"], () => import("./pickers.js")],
17
+ [["kashi-bar-chart", "kashi-line-chart", "kashi-pie-chart", "kashi-bar-list", "kashi-proportion-bar", "kashi-sparkline", "kashi-activity-heatmap"], () => import("./charts.js")],
18
+ [["kashi-command-palette", "kashi-context-menu", "kashi-carousel", "kashi-tree-view", "kashi-tour", "kashi-splitter", "kashi-side-nav"], () => import("./nav.js")],
19
+ ];
20
+ const pending = new Set(MODULES);
21
+ /** بخش‌هایی را که تگشان در صفحه است بارگذاری می‌کند */
22
+ function scan() {
23
+ for (const entry of pending) {
24
+ if (!document.querySelector(entry[0].join(",")))
25
+ continue;
26
+ pending.delete(entry);
27
+ entry[1]().catch((e) => console.error("[kashi] بارگذاری نشد:", e));
28
+ }
29
+ if (!pending.size)
30
+ observer?.disconnect();
31
+ }
32
+ /** همهٔ عنصرها را همین حالا بارگذاری می‌کند؛ مثلاً پیش از ساختن عنصرها با JavaScript */
33
+ export function loadAll() {
34
+ const all = [...pending].map(([, load]) => load());
35
+ pending.clear();
36
+ observer?.disconnect();
37
+ return Promise.all(all);
38
+ }
39
+ let observer = null;
40
+ if (typeof document !== "undefined") {
41
+ scan();
42
+ observer = new MutationObserver(scan);
43
+ observer.observe(document.documentElement, { childList: true, subtree: true });
44
+ }
@@ -0,0 +1,106 @@
1
+ import { HTMLBase } from "./base.js";
2
+ type Series = {
3
+ name: string;
4
+ values: number[];
5
+ };
6
+ type Point = {
7
+ label: string;
8
+ value: number;
9
+ href?: string;
10
+ };
11
+ type Row = {
12
+ name?: string;
13
+ value: string;
14
+ color?: string;
15
+ };
16
+ /** پایهٔ نمودارها: داده از ویژگی‌های JSON یا JavaScript، با هر تغییر دوباره رسم می‌شود */
17
+ declare abstract class Chart extends HTMLBase {
18
+ protected key: string;
19
+ private fmt?;
20
+ protected props: Record<string, unknown>;
21
+ protected abstract draw(): void;
22
+ connectedCallback(): void;
23
+ attributeChangedCallback(): void;
24
+ /** قالب عدد در راهنما و برچسب‌ها */
25
+ get format(): (n: number) => string;
26
+ set format(f: (n: number) => string);
27
+ /** مقدار داده‌شده با JavaScript، وگرنه ویژگی JSON */
28
+ protected read<T>(name: string, fallback: T): T;
29
+ protected write(name: string, v: unknown): void;
30
+ /** عنوان نمودار با ویژگی label (نه title، که راهنمای پیش‌فرض مرورگر را روی کل نمودار نشان می‌دهد) */
31
+ protected get heading(): string;
32
+ /** راهنمای شناور داخل box در نقطهٔ (x, y)؛ داخل ظرف می‌ماند */
33
+ protected tip(box: HTMLElement, x: number | null, y?: number, title?: string, rows?: Row[]): void;
34
+ /** موقعیت بالای یک عنصر نسبت به ظرف */
35
+ protected at(el: Element, box: Element): {
36
+ x: number;
37
+ y: number;
38
+ };
39
+ }
40
+ /** نمودار ستونی: data='[{"label":"…","value":…}]'، یا انباشته با labels و series (تا چهار سری) */
41
+ export declare class KashiBarChart extends Chart {
42
+ static observedAttributes: string[];
43
+ get data(): Point[];
44
+ set data(v: Point[]);
45
+ get series(): Series[];
46
+ set series(v: Series[]);
47
+ get labels(): string[];
48
+ set labels(v: string[]);
49
+ protected draw(): void;
50
+ }
51
+ /** میله‌های افقی برای رتبه‌بندی: data='[{"label":"…","value":…,"href":"…"}]' */
52
+ export declare class KashiBarList extends Chart {
53
+ static observedAttributes: string[];
54
+ get data(): Point[];
55
+ set data(v: Point[]);
56
+ protected draw(): void;
57
+ }
58
+ /** سهم هر بخش از کل در یک میلهٔ افقی (تا چهار بخش): data='[{"label":"…","value":…}]' */
59
+ export declare class KashiProportionBar extends Chart {
60
+ static observedAttributes: string[];
61
+ get data(): Point[];
62
+ set data(v: Point[]);
63
+ protected draw(): void;
64
+ }
65
+ /** نمودار دایره‌ای یا دونات تا پنج بخش (بقیه در «سایر»): data='[{"label":"…","value":…}]'، variant="pie" */
66
+ export declare class KashiPieChart extends Chart {
67
+ static observedAttributes: string[];
68
+ get data(): Point[];
69
+ set data(v: Point[]);
70
+ protected draw(): void;
71
+ }
72
+ /** خط روند کوچک برای کارت آمار و جدول: values="12, 18, 15, 22" */
73
+ export declare class KashiSparkline extends Chart {
74
+ static observedAttributes: string[];
75
+ get values(): number[];
76
+ set values(v: number[]);
77
+ protected draw(): void;
78
+ }
79
+ /**
80
+ * نمودار خطی تا چهار سری: labels='["فروردین", …]' و series='[{"name":"…","values":[…]}]'.
81
+ * راهنمای عمودی با موس و ←→ روی کیبورد؛ محور زمان در RTL از راست شروع می‌شود.
82
+ */
83
+ export declare class KashiLineChart extends Chart {
84
+ static observedAttributes: string[];
85
+ private ro;
86
+ private active;
87
+ get labels(): string[];
88
+ set labels(v: string[]);
89
+ get series(): Series[];
90
+ set series(v: Series[]);
91
+ connectedCallback(): void;
92
+ disconnectedCallback(): void;
93
+ protected draw(): void;
94
+ private geometry;
95
+ private paintSvg;
96
+ private pick;
97
+ private setActive;
98
+ }
99
+ /** نقشهٔ فعالیت سالانه با ماه‌های شمسی: data='{"2026-03-21": 3, …}'، year="1405"، unit="فعالیت" */
100
+ export declare class KashiActivityHeatmap extends Chart {
101
+ static observedAttributes: string[];
102
+ get data(): Record<string, number>;
103
+ set data(v: Record<string, number>);
104
+ protected draw(): void;
105
+ }
106
+ export {};