UNPKG

@esri/calcite-components

Version:

Web Components for Esri's Calcite Design System.

5 lines (4 loc) 10.1 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 p}from"./GUAVDCKP.js";import{k as b}from"./XDKVBD6O.js";import"./YSI7ZYDZ.js";import{a as d}from"./YXZ62PQO.js";import"./3FSOG4LN.js";import{a as E}from"./M7EAHGE3.js";import{d as L}from"./CKRTMNFR.js";import{a as u,d as X}from"./HPN2C7M6.js";import"./JOSABGK6.js";import{E as P,F as r,R as w,c as C,d as h,h as I,q as y}from"./BJZTU5BQ.js";var s={list:"list",listItem:"list-item",hiddenItem:"hidden-item",page:"page",selected:"selected",chevron:"chevron",disabled:"disabled",ellipsis:"ellipsis"},f={next:"chevron-right",previous:"chevron-left",first:"chevron-start",last:"chevron-end"},O=C`:host{display:flex;writing-mode:horizontal-tb}.list{margin:0;display:flex;list-style-type:none;padding:0;column-gap:var(--calcite-spacing-base)}.list-item{margin:0;display:flex;padding:0}.hidden-item{display:none}:host([scale=s]) .chevron,:host([scale=s]) .page,:host([scale=s]) .ellipsis{block-size:1.5rem;padding-inline:.25rem;font-size:var(--calcite-font-size--2);line-height:1rem;min-inline-size:1.5rem}:host([scale=m]) .chevron,:host([scale=m]) .page,:host([scale=m]) .ellipsis{block-size:2rem;padding-inline:.5rem;font-size:var(--calcite-font-size--1);line-height:1rem;min-inline-size:2rem}:host([scale=l]) .chevron,:host([scale=l]) .page,:host([scale=l]) .ellipsis{block-size:2.75rem;font-size:var(--calcite-font-size-0);line-height:1.25rem;min-inline-size:2.75rem}:host([scale=l]) .chevron{padding-inline:.625rem}:host([scale=l]) .page,:host([scale=l]) .ellipsis{padding-inline:.75rem}:host button{outline-color:transparent}:host button: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,.page,.ellipsis{margin:0;box-sizing:border-box;display:flex;align-items:center;justify-content:center;border-style:none;--tw-border-opacity: 0;background-color:transparent;padding:0;vertical-align:baseline;font-family:inherit;font-size:var(--calcite-font-size-0);line-height:1.25rem;color:var(--calcite-pagination-color, var(--calcite-color-text-3))}.chevron,.page{cursor:pointer;border-block:2px solid transparent}.chevron:hover,.page:hover{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;color:var(--calcite-pagination-color-hover, var(--calcite-color-text-1))}.chevron:active,.page:active{color:var(--calcite-pagination-color-hover, var(--calcite-color-text-1))}.page:hover{border-block-end-color:var(--calcite-pagination-color-border-hover, var(--calcite-color-border-2))}.page:active{background-color:var(--calcite-pagination-background-color, var(--calcite-color-foreground-3))}.page.selected{font-weight:var(--calcite-font-weight-medium);color:var(--calcite-pagination-color-hover, var(--calcite-color-text-1));border-block-end-color:var(--calcite-pagination-color-border-active, var(--calcite-color-brand))}.page.selected:focus{border-block-end-width:var(--calcite-spacing-xxs);padding-block-start:var(--calcite-spacing-base)}.chevron:hover{background-color:var(--calcite-pagination-icon-color-background-hover, var(--calcite-color-foreground-2))}.chevron:active{background-color:var(--calcite-pagination-background-color, var(--calcite-color-foreground-3))}.chevron.disabled{pointer-events:none;background-color:transparent}.chevron.disabled>calcite-icon{opacity:var(--calcite-opacity-disabled)}:host([hidden]){display:none}[hidden]{display:none}`,x=2,U=2,m={large:11,medium:9,small:7,xsmall:5,xxsmall:1},S=class extends P{constructor(){super(...arguments),this.resizeHandler=({contentRect:{width:t}})=>this.setMaxItemsToBreakpoint(t),this.resizeObserver=E("resize",t=>t.forEach(this.resizeHandler)),this.messages=L(),this.maxItems=m.xxsmall,this.groupSeparator=!1,this.pageSize=20,this.scale="m",this.startItem=1,this.totalItems=0,this.calcitePaginationChange=y({cancelable:!1})}static{this.properties={isXXSmall:[16,{},{state:!0}],lastStartItem:[16,{},{state:!0}],maxItems:[16,{},{state:!0}],totalPages:[16,{},{state:!0}],groupSeparator:[7,{},{reflect:!0,type:Boolean}],messageOverrides:[0,{},{attribute:!1}],numberingSystem:1,pageSize:[11,{},{reflect:!0,type:Number}],scale:[3,{},{reflect:!0}],startItem:[11,{},{reflect:!0,type:Number}],totalItems:[11,{},{reflect:!0,type:Number}]}}static{this.shadowRootOptions={mode:"open",delegatesFocus:!0}}static{this.styles=O}async goTo(t){switch(t){case"start":this.startItem=1;break;case"end":this.startItem=this.lastStartItem;break;default:t>=Math.ceil(this.totalPages)?this.startItem=this.lastStartItem:t<=0?this.startItem=1:this.startItem=(t-1)*this.pageSize+1}}async nextPage(){this.startItem=Math.min(this.lastStartItem,this.startItem+this.pageSize)}async previousPage(){this.startItem=Math.max(1,this.startItem-this.pageSize)}async setFocus(){await X(this),this.el.focus()}connectedCallback(){super.connectedCallback(),this.resizeObserver?.observe(this.el)}async load(){this.handleTotalPages(),this.handleLastStartItemChange(),this.handleIsXXSmall()}willUpdate(t){(t.has("totalItems")&&(this.hasUpdated||this.totalItems!==0)||t.has("pageSize")&&(this.hasUpdated||this.pageSize!==20))&&this.handleTotalPages(),(t.has("totalItems")&&(this.hasUpdated||this.totalItems!==0)||t.has("pageSize")&&(this.hasUpdated||this.pageSize!==20)||t.has("totalPages"))&&this.handleLastStartItemChange(),t.has("maxItems")&&(this.hasUpdated||this.maxItems!==m.xxsmall)&&this.handleIsXXSmall(),t.has("messages")&&this.effectiveLocaleChange()}loaded(){this.setMaxItemsToBreakpoint(this.el.clientWidth)}disconnectedCallback(){super.disconnectedCallback(),this.resizeObserver?.disconnect()}handleTotalPages(){this.pageSize<1&&(this.pageSize=1),this.totalPages=this.totalItems/this.pageSize}effectiveLocaleChange(){b.numberFormatOptions={locale:this.messages._lang,numberingSystem:this.numberingSystem,useGrouping:this.groupSeparator}}handleLastStartItemChange(){let{totalItems:t,pageSize:e,totalPages:i}=this;this.lastStartItem=(t%e===0?t-e:Math.floor(i)*e)+1}handleIsXXSmall(){this.isXXSmall=this.maxItems===m.xxsmall}setMaxItemsToBreakpoint(t){if(!(!p||!t)){if(t>=p.width.medium){this.maxItems=m.large;return}if(t>=p.width.small){this.maxItems=m.medium;return}if(t>=p.width.xsmall){this.maxItems=m.small;return}if(t>=p.width.xxsmall){this.maxItems=m.xsmall;return}this.maxItems=m.xxsmall}}firstClicked(){this.startItem=1,this.emitUpdate()}lastClicked(){this.startItem=this.lastStartItem,this.emitUpdate()}async previousClicked(){await this.previousPage(),this.emitUpdate()}async nextClicked(){await this.nextPage(),this.emitUpdate()}showStartEllipsis(){return this.totalPages>this.maxItems&&Math.floor(this.startItem/this.pageSize)>this.maxItems-x-U}showEndEllipsis(){return this.totalPages>this.maxItems&&(this.totalItems-this.startItem)/this.pageSize>this.maxItems-x-(U-1)}emitUpdate(){this.calcitePaginationChange.emit()}handlePageClick(t){let e=t.target;this.startItem=parseInt(e.value),this.emitUpdate()}renderEllipsis(t){return d(t,h`<span class=${r(s.ellipsis)} data-test-ellipsis=${t??I}>&hellip;</span>`)}renderItems(){let{totalItems:t,pageSize:e,startItem:i,maxItems:a,totalPages:l,lastStartItem:v,isXXSmall:M}=this,o=[];if(M)return o.push(this.renderPage(i)),o;let F=t>e,k=this.showStartEllipsis(),z=this.showEndEllipsis();F&&o.push(this.renderPage(1)),k&&o.push(this.renderEllipsis("start"));let n=a-x-(z?1:0)-(k?1:0),g,c;l-1<=n?(c=1+e,g=v-e):i/e<n?(c=1+e,g=1+n*e):i+n*e>=t?(c=v-n*e,g=v-e):(c=i-e*((n-1)/2),g=i+e*((n-1)/2));for(let $=0;$<n&&c<=g;$++)o.push(this.renderPage(c)),c=c+e;return z&&o.push(this.renderEllipsis("end")),o.push(this.renderPage(v)),o}renderPage(t){let{pageSize:e}=this,i=Math.floor(t/e)+(e===1?0:1);b.numberFormatOptions={locale:this.messages._lang,numberingSystem:this.numberingSystem,useGrouping:this.groupSeparator};let a=b.localize(i.toString()),l=t===this.startItem;return h`<li class=${r(s.listItem)}><button .ariaCurrent=${l?"page":"false"} class=${r({[s.page]:!0,[s.selected]:l})} @click=${this.handlePageClick} value=${t??I}>${a}</button></li>`}renderPreviousChevron(){let{pageSize:t,startItem:e,messages:i}=this,a=t===1?e<=t:e<t;return d("previous",h`<button .ariaLabel=${i.previous} class=${r({[s.chevron]:!0,[s.disabled]:a})} data-test-chevron=previous .disabled=${a} @click=${this.previousClicked}><calcite-icon flip-rtl .icon=${f.previous} .scale=${u(this.scale)}></calcite-icon></button>`)}renderNextChevron(){let{totalItems:t,pageSize:e,startItem:i,messages:a}=this,l=i+e>t;return d("next-button",h`<button .ariaLabel=${a.next} class=${r({[s.chevron]:!0,[s.disabled]:l})} data-test-chevron=next .disabled=${l} @click=${this.nextClicked}><calcite-icon flip-rtl .icon=${f.next} .scale=${u(this.scale)}></calcite-icon></button>`)}renderFirstChevron(){let{messages:t,startItem:e,isXXSmall:i}=this,a=e===1;return i?d("first-button",h`<button .ariaLabel=${t.first} class=${r({[s.chevron]:!0,[s.disabled]:a})} .disabled=${a} @click=${this.firstClicked}><calcite-icon flip-rtl .icon=${f.first} .scale=${u(this.scale)}></calcite-icon></button>`):null}renderLastChevron(){let{messages:t,startItem:e,isXXSmall:i,lastStartItem:a}=this,l=e===a;return i?d("last-button",h`<button .ariaLabel=${t.last} class=${r({[s.chevron]:!0,[s.disabled]:l})} .disabled=${l} @click=${this.lastClicked}><calcite-icon flip-rtl .icon=${f.last} .scale=${u(this.scale)}></calcite-icon></button>`):null}render(){let t=this.renderFirstChevron(),e=this.renderLastChevron();return h`<ul class=${r(s.list)}><li class=${r({[s.listItem]:!0,[s.hiddenItem]:!t})}>${t}</li><li class=${r(s.listItem)}>${this.renderPreviousChevron()}</li>${this.renderItems()}<li class=${r(s.listItem)}>${this.renderNextChevron()}</li><li class=${r({[s.listItem]:!0,[s.hiddenItem]:!e})}>${e}</li></ul>`}};w("calcite-pagination",S);export{S as Pagination};