UNPKG

@esri/calcite-components

Version:

Web Components for Esri's Calcite Design System.

5 lines (4 loc) • 13.4 kB
/*! All material copyright ESRI, All Rights Reserved, unless otherwise specified. See https://github.com/Esri/calcite-design-system/blob/dev/LICENSE.md for details. v3.2.1 */ import{a as g,b as l,e as O,f as W,k as x,l as b,n as y,o as F,q as p}from"./UKPY76M7.js";import{k as d}from"./XDKVBD6O.js";import{h as P,i as A,j as E}from"./YSI7ZYDZ.js";import{a as u}from"./3FSOG4LN.js";import{a as v,b as f}from"./5RDOSP2E.js";import{i as w,k as I}from"./3ADX47DD.js";import"./NNVH7JUI.js";import{D as z,E as Y,F as r,R as S,c as D,d as s,h as $,q as C}from"./BJZTU5BQ.js";var L=D`:host{display:block}.header{display:flex;block-size:100%;align-items:center;justify-content:space-between}.chevron-container{display:flex;align-items:center}:host([scale=s]){block-size:24px;margin:var(--calcite-spacing-xs);margin-inline-start:var(--calcite-spacing-sm)}:host([scale=s]) .chevron-container,:host([scale=s]) .chevron{min-inline-size:24px;block-size:24px}:host([scale=m]){block-size:32px;margin:var(--calcite-spacing-sm);margin-inline-start:var(--calcite-spacing-sm-plus)}:host([scale=m]) .chevron-container,:host([scale=m]) .chevron{min-inline-size:32px;block-size:32px;--calcite-internal-action-padding-block: var(--calcite-spacing-xxs)}:host([scale=l]){block-size:44px;margin:var(--calcite-spacing-xs);margin-inline-start:var(--calcite-spacing-sm)}:host([scale=l]) .chevron-container,:host([scale=l]) .chevron{min-inline-size:44px;block-size:44px;--calcite-internal-action-padding-block: var(--calcite-spacing-sm-plus)}.chevron{box-sizing:content-box;display:flex;block-size:100%;inline-size:100%;flex-grow:0;cursor:pointer;align-items:center;justify-content:center;border-style:none;outline-color:transparent;transition-property:background-color,block-size,border-color,box-shadow,color,inset-block-end,inset-block-start,inset-inline-end,inset-inline-start,inset-size,opacity,outline-color,transform;transition-duration:var(--calcite-animation-timing);transition-timing-function:ease-in-out;--calcite-internal-action-padding-block: 0;--calcite-action-background-color: var(--calcite-date-picker-header-action-background-color);--calcite-action-background-color-hover: var(--calcite-date-picker-header-action-background-color-hover);--calcite-action-background-color-press: var(--calcite-date-picker-header-action-background-color-press);--calcite-action-text-color: var(--calcite-date-picker-header-action-text-color);--calcite-action-text-color-press: var(--calcite-date-picker-header-action-text-color-press)}.chevron:focus{outline:2px solid var(--calcite-color-focus, var(--calcite-ui-focus-color, var(--calcite-color-brand)));outline-offset:calc(-2px*(1 - (2*clamp(0,var(--calcite-offset-invert-focus),1))))}.chevron[aria-disabled=true]{pointer-events:none}.month-year-container{display:flex;block-size:100%;inline-size:100%;flex:1 1 auto;align-items:center;justify-content:flex-start;text-align:center;line-height:1;gap:var(--calcite-spacing-xxs)}.month-year-container.range-calendar{justify-content:center}.year-container{position:relative;display:flex;block-size:100%}.suffix{display:flex;align-items:center}.year,.suffix{margin-inline:var(--calcite-spacing-xxs);font-weight:var(--calcite-font-weight-medium);color:var(--calcite-date-picker-year-text-color, var(--calcite-color-text-1));font-size:var(--calcite-font-size-md);line-height:var(--calcite-font-line-height-fixed-lg)}.year{position:relative;display:inline-block;border-style:none;background-color:transparent;text-align:center;font-family:inherit;outline-color:transparent;inline-size:44px}.year:hover{transition-duration:.1s;transition-timing-function:cubic-bezier(.4,0,.2,1);transition-property:outline-color;outline:2px solid var(--calcite-color-border-2);outline-offset:-2px}.year:focus{outline:2px solid var(--calcite-color-focus, var(--calcite-ui-focus-color, var(--calcite-color-brand)));outline-offset:calc(-2px*(1 - (2*clamp(0,var(--calcite-offset-invert-focus),1))))}.month-select{--calcite-select-internal-border-width: 0;--calcite-select-internal-icon-border-inline-end-width: 0;--calcite-select-spacing-inline: var(--calcite-spacing-xxs);--calcite-select-font-size: var(--calcite-date-picker-month-select-font-size, var(--calcite-font-size-md));--calcite-select-text-color: var(--calcite-date-picker-month-select-text-color, var(--calcite-color-text-1));--calcite-select-icon-color: var(--calcite-date-picker-month-select-icon-color);--calcite-select-icon-color-hover: var(--calcite-date-picker-month-select-icon-color-hover);--calcite-internal-select-spacing-block: var(--calcite-spacing-xxs);--calcite-internal-select-icon-container-padding-inline: var(--calcite-spacing-xxs);--calcite-internal-select-line-height: var(--calcite-font-line-height-fixed-lg);--calcite-internal-select-font-weight: var(--calcite-font-weight-medium)}:host([scale=s]) .month-year-container .month-select{--calcite-select-spacing-inline: var(--calcite-spacing-base);--calcite-select-font-size: var(--calcite-date-picker-month-select-font-size, var(--calcite-font-size));--calcite-internal-select-spacing-block: var(--calcite-spacing-base);--calcite-internal-select-icon-container-padding-inline: var(--calcite-spacing-base);--calcite-internal-select-block-size: 24px;--calcite-internal-select-line-height: var(--calcite-font-line-height-fixed-base)}:host([scale=s]) .month-year-container .year{inline-size:40px}:host([scale=s]) .month-year-container .year,:host([scale=s]) .month-year-container .suffix{font-size:var(--calcite-font-size);line-height:var(--calcite-font-line-height-fixed-base)}:host([scale=l]) .month-year-container .month-select{--calcite-select-spacing-inline: var(--calcite-spacing-sm);--calcite-select-font-size: var(--calcite-date-picker-month-select-font-size, var(--calcite-font-size-lg));--calcite-internal-select-spacing-block: var(--calcite-spacing-sm);--calcite-internal-select-icon-container-padding-inline: var(--calcite-spacing-sm);--calcite-internal-select-block-size: 44px;--calcite-internal-select-line-height: var(--calcite-font-line-height-fixed-xl)}:host([scale=l]) .month-year-container .year{inline-size:48px}:host([scale=l]) .month-year-container .year,:host([scale=l]) .month-year-container .suffix{font-size:var(--calcite-font-size-lg);line-height:var(--calcite-font-line-height-fixed-xl)}:host([hidden]){display:none}[hidden]{display:none}`,o={header:"header",chevron:"chevron",chevronContainer:"chevron-container",monthYearContainer:"month-year-container",monthPicker:"month-select",rangeCalendar:"range-calendar",suffix:"suffix",yearContainer:"year-container"},R={chevronLeft:"chevron-left",chevronRight:"chevron-right"},K=16,k=class extends Y{constructor(){super(...arguments),this.monthPickerEl=v(),this.yearInputEl=v(),this.calciteInternalDatePickerMonthHeaderSelectChange=C({cancelable:!1})}static{this.properties={nextMonthDate:[16,{},{state:!0}],prevMonthDate:[16,{},{state:!0}],activeDate:[0,{},{attribute:!1}],headingLevel:[9,{},{type:Number}],localeData:[0,{},{attribute:!1}],max:[0,{},{attribute:!1}],messages:[0,{},{attribute:!1}],min:[0,{},{attribute:!1}],monthStyle:1,position:1,scale:[3,{},{reflect:!0}],selectedDate:[0,{},{attribute:!1}]}}static{this.styles=L}connectedCallback(){super.connectedCallback(),this.setNextPrevMonthDates()}load(){this.parentDatePickerEl=I(this.el,"calcite-date-picker")}willUpdate(e){this.hasUpdated&&(e.has("activeDate")||e.has("localeData"))&&this.setYearSelectMenuWidth(),this.hasUpdated&&e.has("scale")&&this.setYearSelectWidthOffset(),(e.has("min")||e.has("max")||e.has("activeDate"))&&this.setNextPrevMonthDates()}loaded(){this.setYearSelectWidthOffset()}setNextPrevMonthDates(){this.activeDate&&(this.nextMonthDate=l(y(this.activeDate),this.min,this.max),this.prevMonthDate=l(x(this.activeDate),this.min,this.max))}onYearKey(e){let t=this.parseCalendarYear(e.target.value);switch(e.key){case"ArrowDown":e.preventDefault(),this.setYear({localizedYear:t,offset:-1});break;case"ArrowUp":e.preventDefault(),this.setYear({localizedYear:t,offset:1});break}}formatCalendarYear(e){return d.localize(`${W(e,this.localeData)}`)}parseCalendarYear(e){return d.localize(`${O(Number(d.delocalize(e)),this.localeData)}`)}onYearChange(e){this.setYear({localizedYear:this.parseCalendarYear(e.target.value)})}onYearInput(e){this.setYear({localizedYear:this.parseCalendarYear(e.target.value),commit:!1})}prevMonthClick(e){this.handleArrowClick(e,this.prevMonthDate)}prevMonthKeydown(e){u(e.key)&&this.prevMonthClick(e)}nextMonthClick(e){this.handleArrowClick(e,this.nextMonthDate)}nextMonthKeydown(e){u(e.key)&&this.nextMonthClick(e)}async handleArrowClick(e,t){e.preventDefault(),await this.handlePenultimateValidMonth(e),this.calciteInternalDatePickerMonthHeaderSelectChange.emit(t)}handleMonthChange(e){let t=e.target,{abbreviated:a,wide:n}=this.localeData.months,i=(this.monthStyle==="wide"?n:a).indexOf(t.value),h=b(this.activeDate,i);g(h,this.min,this.max)||(h=l(h,this.min,this.max)),this.calciteInternalDatePickerMonthHeaderSelectChange.emit(h),this.setYearSelectMenuWidth()}getInRangeDate({localizedYear:e,offset:t=0}){let{min:a,max:n,activeDate:c}=this,i=Number(d.delocalize(e)),h=i.toString().length,m=isNaN(i)?!1:i+t,N=m&&(!a||a.getFullYear()<=m)&&(!n||n.getFullYear()>=m);if(m&&N&&h===e.length){let M=new Date(c);return M.setFullYear(m),l(M,a,n)}}setYear({localizedYear:e,commit:t=!0,offset:a=0}){let{yearInputEl:{value:n},activeDate:c}=this,i=this.getInRangeDate({localizedYear:e,offset:a});i&&this.calciteInternalDatePickerMonthHeaderSelectChange.emit(i),t&&(n.value=this.formatCalendarYear((i||c).getFullYear()))}setYearSelectWidthOffset(){this.yearSelectWidthOffset=K+3*parseInt(this.getYearSelectPadding()),this.setYearSelectMenuWidth()}setYearSelectMenuWidth(){let e=this.monthPickerEl.value;e&&requestAnimationFrame(()=>{let t=getComputedStyle(e),a=`${t.fontStyle} ${t.fontVariant} ${t.fontWeight} ${t.fontSize}/${t.lineHeight} ${t.fontFamily}`,c=this.localeData.months[this.monthStyle][this.activeDate.getMonth()],i=Math.ceil(w(c,a));e.style.width=`${i+this.yearSelectWidthOffset}px`})}isMonthInRange(e){let t=b(this.activeDate,e);return!this.min&&!this.max||g(t,this.min,this.max)?!0:p(t,this.max)||p(t,this.min)}async handlePenultimateValidMonth(e){let n=e.target.getAttribute("data-direction")==="left",c;if(n&&this.min){let i=l(x(this.activeDate),this.min,this.max);c=p(i,this.min)}else if(this.max){let i=l(y(this.activeDate),this.min,this.max);c=p(i,this.max)}if(c)if(this.position)this.yearInputEl.value.focus();else{let i=n?this.nextMonthAction:this.prevMonthAction;i.disabled=!1,await i.setFocus()}}getPx(e){let t=Number(e.replace(/[rem|px]/g,"")),a=16;return e.includes("rem")?`${t*a}px`:`${t}px`}getYearSelectPadding(){let e;switch(this.scale){case"l":e=E;break;case"s":e=P;break;default:e=A;break}return this.getPx(e)}render(){return s`<div class=${r(o.header)}>${this.renderContent()}</div>`}renderContent(){let{localeData:e,activeDate:t}=this;if(!t||!e)return null;if(this.parentDatePickerEl){let{numberingSystem:c,lang:i}=this.parentDatePickerEl;d.numberFormatOptions={useGrouping:!1,...c&&{numberingSystem:c},...i&&{locale:i}}}let a=F(e.unitOrder),n=a.indexOf("y")<a.indexOf("m");return s`${this.position&&s`<div class=${r({[o.chevronContainer]:!0})}>${this.position==="start"&&this.renderChevron("left")||""}</div>`||""}<div class=${r({[o.monthYearContainer]:!0,[o.rangeCalendar]:!!this.position})}>${this.renderMonthYearContainer(n)}</div>${!this.position&&s`<div class=${r({[o.chevronContainer]:!0})}>${this.renderChevron("left")}</div>`||""}<div class=${r({[o.chevronContainer]:!0})}>${this.position!=="start"&&this.renderChevron("right")||""}</div>`}renderMonthYearContainer(e){return e?[this.renderYearInput(),this.renderMonthPicker()]:[this.renderMonthPicker(),this.renderYearInput()]}renderMonthPicker(){let e=this.activeDate.getMonth(),t=this.localeData.months[this.monthStyle];return s`<calcite-select class=${r(o.monthPicker)} .label=${this.messages.monthMenu} @calciteSelectChange=${this.handleMonthChange} width=auto ${f(this.monthPickerEl)}>${t.map((a,n)=>s`<calcite-option .disabled=${!this.isMonthInRange(n)} .selected=${n===e} .value=${a}>${a}</calcite-option>`)}</calcite-select>`}renderYearInput(){let e=this.localeData.year?.suffix,t=this.formatCalendarYear(this.activeDate.getFullYear());return s`<span class=${r(o.yearContainer)}><input .ariaLabel=${this.messages.year} class=${r({year:!0})} inputmode=numeric maxlength=4 minlength=1 @change=${this.onYearChange} @input=${this.onYearInput} @keydown=${this.onYearKey} pattern=\\d* type=text .value=${z(t??"")} ${f(this.yearInputEl)}>${e&&s`<span class=${r(o.suffix)}>${e}</span>`||""}</span>`}renderChevron(e){let t=e==="right",a=p(t?this.nextMonthDate:this.prevMonthDate,this.activeDate)||!g(this.activeDate,this.min,this.max);return s`<calcite-action alignment=center .ariaDisabled=${a} .ariaLabel=${t?this.messages.nextMonth:this.messages.prevMonth} class=${r(o.chevron)} compact data-direction=${e??$} .disabled=${a} .icon=${t?R.chevronRight:R.chevronLeft} icon-flip-rtl @click=${t?this.nextMonthClick:this.prevMonthClick} @keydown=${t?this.nextMonthKeydown:this.prevMonthKeydown} role=button .scale=${this.scale==="l"?"l":"m"} .text=${t?this.messages.nextMonth:this.messages.prevMonth} ${f(n=>t?this.nextMonthAction=n:this.prevMonthAction=n)}></calcite-action>`}};S("calcite-date-picker-month-header",k);export{k as DatePickerMonthHeader};