@esri/calcite-components
Version:
Web Components for Esri's Calcite Design System.
3 lines (2 loc) • 13.7 kB
JavaScript
/* COPYRIGHT Esri - https://js.arcgis.com/5.1/LICENSE.txt */
import{a as T}from"./2ZJL6VLF.js";import{c as q,d as H,e as O}from"./UIUDRBYG.js";import{a as S}from"./IJ3XVWSG.js";import{a as v}from"./YSDXNIIL.js";import{a as L}from"./D7Q3AXKP.js";import"./RH6ZIP65.js";import{e as z}from"./YJF4NBEX.js";import"./TQRVWHPS.js";import{i as A,j as b}from"./KDWR7M23.js";import"./OAOQ5BXS.js";import{E as B,F as R,G as F,H as p,S as E,g as w,h as m,l as C,p as f}from"./C4ZX7VYR.js";var g="hidden-form-input";function y(i){return"checked"in i}var k=new WeakMap,I=new WeakSet;function P(i,e){if(b(e.parentElement,"[form]"))return!0;let t="calciteInternalFormComponentRegister",o=!1;return i.addEventListener(t,r=>{o=r.composedPath().some(n=>I.has(n)),r.stopPropagation()},{once:!0}),e.dispatchEvent(new CustomEvent(t,{bubbles:!0,composed:!0})),o}function V(i){return i.nodeName==="CALCITE-RADIO-BUTTON"?b(i,"calcite-radio-button-group"):i}function W(i){let{el:e,value:a}=i,t=K(i);if(!t||P(t,e))return;i.formEl=t,i.defaultValue=a,y(i)&&(i.defaultChecked=i.checked);let o=j.bind(i);t.addEventListener("reset",o),k.set(i.el,o),I.add(e)}function K(i){let{el:e,form:a}=i;return a?A(e,{id:a}):b(e,"form")}function j(){if("status"in this&&(this.status="idle"),"validationIcon"in this&&(this.validationIcon=!1),"validationMessage"in this&&(this.validationMessage=""),y(this)){this.checked=this.defaultChecked;return}this.value=this.defaultValue,this.onFormReset?.()}function J(i){let{el:e,formEl:a}=i;if(!a)return;let t=k.get(e);a.removeEventListener("reset",t),k.delete(e),i.formEl=null,I.delete(e)}var Q="calciteInternalHiddenInputInput",G=i=>{i.target.dispatchEvent(new CustomEvent(Q,{bubbles:!0}))},N=i=>i.removeEventListener("input",G);function X(i){let{el:e,formEl:a,name:t,value:o}=i,{ownerDocument:r}=e;if(!1)return;let n=e.querySelectorAll(`input[slot="${g}"]`);if(!a||!t){n.forEach(s=>{N(s),s.remove()});return}let d=Array.isArray(o)?o:[o],l=[],h=new Set;n.forEach(s=>{let c=d.find(U=>U==s.value);c!=null?(h.add(c),D(i,s,c)):l.push(s)});let u;d.forEach(s=>{if(h.has(s))return;let c=l.pop();c||(c=r.createElement("input"),c.ariaHidden="true",c.slot=g),u||(u=r.createDocumentFragment()),u.append(c),c.addEventListener("input",G),D(i,c,s)}),u&&e.append(u),l.forEach(s=>{N(s),s.remove()})}function D(i,e,a){let{defaultValue:t,disabled:o,form:r,name:n,required:d}=i;e.defaultValue=t,e.disabled=o,e.name=n,e.required=d,e.tabIndex=-1,r?e.setAttribute("form",r):e.removeAttribute("form"),y(i)?(e.checked=i.checked,e.defaultChecked=i.defaultChecked,e.value=i.checked?a||"on":""):e.value=a||"",i.syncHiddenFormInput?.(e);let l=V(i.el);if(l&&"validity"in l)for(let h in{...e?.validity})l.validity[h]=e.validity[h]}var Y=({component:i})=>(X(i),m`<slot name=${g}></slot>`),$={container:"container",radio:"radio"},Z=w`:host([disabled]){cursor:default;-webkit-user-select:none;user-select:none;opacity:var(--calcite-opacity-disabled)}:host([disabled]) *,:host([disabled]) ::slotted(*){pointer-events:none}:host{display:block;cursor:pointer}:host .container{position:relative;outline:2px solid transparent;outline-offset:2px;display:flex}:host .radio{cursor:pointer;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;border-radius:var(--calcite-radio-button-corner-radius, var(--calcite-corner-radius-pill));background-color:var(--calcite-radio-button-background-color, var(--calcite-color-foreground-1));box-shadow:inset 0 0 0 var(--calcite-border-width-sm) var(--calcite-radio-button-border-color, var(--calcite-color-border-input))}:host([hovered]) .radio,:host(:not([checked])[focused]:not([disabled])) .radio{box-shadow:inset 0 0 0 var(--calcite-border-width-md) var(--calcite-radio-button-border-color, var(--calcite-color-brand-hover))}:host([hovered]) .radio:active,:host(:not([checked])[focused]:not([disabled])) .radio:active{box-shadow:inset 0 0 0 var(--calcite-border-width-md) var(--calcite-color-brand-press)}:host([focused]) .radio{outline:var(--calcite-border-width-md) solid var(--calcite-color-focus, var(--calcite-ui-focus-color, var(--calcite-color-brand)));outline-offset:calc(var(--calcite-spacing-base) * calc(1 - (2*clamp(0,var(--calcite-offset-invert-focus),1))))}:host([disabled]) .radio{cursor:default;opacity:var(--calcite-opacity-disabled)}:host([disabled]) ::slotted([calcite-hydrated][disabled]),:host([disabled]) [calcite-hydrated][disabled]{opacity:1}.interaction-container{display:contents}:host([hovered][disabled]) .radio{box-shadow:inset 0 0 0 var(--calcite-border-width-sm) var(--calcite-radio-button-border-color, var(--calcite-color-border-input))}:host([scale=s]){--calcite-internal-radio-size: var(--calcite-radio-button-size, var(--calcite-size-fixed-md))}:host([scale=m]){--calcite-internal-radio-size: var(--calcite-radio-button-size, var(--calcite-size-fixed-md-plus))}:host([scale=l]){--calcite-internal-radio-size: var(--calcite-radio-button-size, var(--calcite-size-fixed-lg))}.radio{block-size:var(--calcite-internal-radio-size);inline-size:var(--calcite-internal-radio-size);size:var(--calcite-internal-radio-size)}:host([scale=s][checked]) .radio,:host([hovered][scale=s][checked][disabled]) .radio{box-shadow:inset 0 0 0 var(--calcite-border-width-lg) var(--calcite-radio-button-border-color, var(--calcite-color-brand))}:host([scale=s][focused][checked]:not([disabled])) .radio{box-shadow:inset 0 0 0 var(--calcite-border-width-lg) var(--calcite-radio-button-border-color, var(--calcite-color-brand)),0 0 0 2px var(--calcite-radio-button-background-color, var(--calcite-color-foreground-1))}:host([scale=m][checked]) .radio,:host([hovered][scale=m][checked][disabled]) .radio{box-shadow:inset 0 0 0 5px var(--calcite-radio-button-border-color, var(--calcite-color-brand))}:host([scale=m][focused][checked]:not([disabled])) .radio{box-shadow:inset 0 0 0 5px var(--calcite-radio-button-border-color, var(--calcite-color-brand)),0 0 0 2px var(--calcite-radio-button-background-color, var(--calcite-color-foreground-1))}:host([scale=l][checked]) .radio,:host([hovered][scale=l][checked][disabled]) .radio{box-shadow:inset 0 0 0 6px var(--calcite-radio-button-border-color, var(--calcite-color-brand))}:host([scale=l][focused][checked]:not([disabled])) .radio{box-shadow:inset 0 0 0 6px var(--calcite-radio-button-border-color, var(--calcite-color-brand)),0 0 0 2px var(--calcite-radio-button-background-color, var(--calcite-color-foreground-1))}{:host([checked]) .radio:after,:host([checked][disabled]) .radio:after{content:"";inline-size:var(--calcite-internal-radio-size);block-size:var(--calcite-internal-radio-size);background-color:CanvasText;display:block}}.internal-label-alignment--center{align-items:center}.internal-label-alignment--end{align-items:end}.internal-label--container{display:flex;justify-content:space-between;color:var(--calcite-color-text-1)}.internal-label-required--indicator{font-weight:var(--calcite-font-weight-medium);color:var(--calcite-color-status-danger);padding-inline:var(--calcite-spacing-base)}.internal-label-required--indicator:hover{cursor:help}.internal-label--text{line-height:1}:host([scale=s]) .internal-label-spacing--bottom{margin-block-end:var(--calcite-spacing-xxs)}:host([scale=s]) .internal-label-spacing-inline--end{margin-inline-end:var(--calcite-spacing-sm)}:host([scale=s]) .internal-label-spacing-inline--start{margin-inline-start:var(--calcite-spacing-sm)}:host([scale=s]) .internal-label--text{font-size:var(--calcite-font-size--2)}:host([scale=m]) .internal-label-spacing--bottom{margin-block-end:var(--calcite-spacing-sm)}:host([scale=m]) .internal-label-spacing-inline--end{margin-inline-end:var(--calcite-spacing-sm)}:host([scale=m]) .internal-label-spacing-inline--start{margin-inline-start:var(--calcite-spacing-sm)}:host([scale=m]) .internal-label--text{font-size:var(--calcite-font-size--1)}:host([scale=l]) .internal-label-spacing--bottom{margin-block-end:var(--calcite-spacing-sm)}:host([scale=l]) .internal-label-spacing-inline--end{margin-inline-end:var(--calcite-spacing-md)}:host([scale=l]) .internal-label-spacing-inline--start{margin-inline-start:var(--calcite-spacing-md)}:host([scale=l]) .internal-label--text{font-size:var(--calcite-font-size-0)}::slotted(input[slot=hidden-form-input]){margin:0!important;opacity:0!important;outline:none!important;padding:0!important;position:absolute!important;inset:0!important;transform:none!important;-webkit-appearance:none!important;z-index:-1!important}:host([hidden]){display:none}[hidden]{display:none}`,x=class extends F{constructor(){super(),this.containerRef=B(),this.direction=z(),this.focusSetter=L()(this),this.interactiveContainer=S(this),this.checked=!1,this.disabled=!1,this.focused=!1,this.hovered=!1,this.required=!1,this.scale="m",this.calciteInternalRadioButtonBlur=f({cancelable:!1}),this.calciteInternalRadioButtonCheckedChange=f({cancelable:!1}),this.calciteInternalRadioButtonFocus=f({cancelable:!1}),this.calciteRadioButtonChange=f({cancelable:!1}),this.listen("pointerenter",this.pointerEnterHandler),this.listen("pointerleave",this.pointerLeaveHandler),this.listen("click",this.clickHandler),this.listen("keydown",this.handleKeyDown)}static{this.properties={checked:[7,{},{reflect:!0,type:Boolean}],disabled:[7,{},{reflect:!0,type:Boolean}],focused:[7,{},{reflect:!0,type:Boolean}],form:[3,{},{reflect:!0}],hovered:[7,{},{reflect:!0,type:Boolean}],label:1,labelText:1,name:[3,{},{reflect:!0}],required:[7,{},{reflect:!0,type:Boolean}],scale:[3,{},{reflect:!0}],value:1}}static{this.styles=Z}async emitCheckedChange(){this.calciteInternalRadioButtonCheckedChange.emit()}async setFocus(e){return this.focusSetter(()=>this.containerRef.value,e)}connectedCallback(){this.rootNode=this.el.getRootNode(),this.name&&this.checkLastRadioButton(),q(this),W(this),this.updateTabIndexOfOtherRadioButtonsInGroup(),super.connectedCallback()}willUpdate(e){this.hasUpdated&&e.has("checked")&&this.checkedChanged(this.checked),e.has("disabled")&&(this.hasUpdated||this.disabled!==!1)&&this.updateTabIndexOfOtherRadioButtonsInGroup(),e.has("name")&&this.checkLastRadioButton()}loaded(){this.focused&&!this.disabled&&this.setFocus()}disconnectedCallback(){super.disconnectedCallback(),H(this),J(this),this.updateTabIndexOfOtherRadioButtonsInGroup()}checkedChanged(e){e&&this.uncheckOtherRadioButtonsInGroup(),this.calciteInternalRadioButtonCheckedChange.emit()}syncHiddenFormInput(e){e.type="radio"}selectItem(e,a){e[a].click()}queryButtons(){return Array.from(this.rootNode.querySelectorAll("calcite-radio-button:not([hidden])")).filter(e=>e.name===this.name)}isFocusable(){let e=this.queryButtons(),a=e.find(o=>!o.disabled),t=e.find(o=>o.checked);return a===this.el&&!t}check(){this.disabled||(this.focused=!0,this.setFocus(),!this.checked&&(this.uncheckAllRadioButtonsInGroup(),this.checked=!0,this.calciteRadioButtonChange.emit()))}clickHandler(){this.disabled||this.check()}onLabelClick(e){if(this.disabled||this.el.hidden)return;let a=e.currentTarget,t=a.for?this.rootNode.querySelector(`calcite-radio-button[id="${a.for}"]`):a.querySelector(`calcite-radio-button[name="${this.name}"]`);t&&(t.focused=!0,this.setFocus(),!t.checked&&(this.uncheckOtherRadioButtonsInGroup(),t.checked=!0,this.calciteRadioButtonChange.emit()))}checkLastRadioButton(){let a=this.queryButtons().filter(t=>t.checked);if(a?.length>1){let t=a[a.length-1];a.filter(o=>o!==t).forEach(o=>{o.checked=!1,o.emitCheckedChange()})}}uncheckAllRadioButtonsInGroup(){this.queryButtons().forEach(a=>{a.checked&&(a.checked=!1,a.focused=!1)})}uncheckOtherRadioButtonsInGroup(){this.queryButtons().filter(t=>t!==this.el).forEach(t=>{t.checked&&(t.checked=!1,t.focused=!1)})}updateTabIndexOfOtherRadioButtonsInGroup(){this.queryButtons().filter(t=>t!==this.el&&!t.disabled).forEach(t=>{t.manager?.component.requestUpdate()})}getTabIndex(){if(!this.disabled)return this.checked||this.isFocusable()?0:-1}pointerEnterHandler(){this.disabled||(this.hovered=!0)}pointerLeaveHandler(){this.disabled||(this.hovered=!1)}handleKeyDown(e){let a=["ArrowLeft","ArrowUp","ArrowRight","ArrowDown"," "],{key:t}=e;if(a.indexOf(t)===-1)return;if(t===" "){this.check(),e.preventDefault();return}let o=t;this.direction==="rtl"&&(t==="ArrowRight"&&(o="ArrowLeft"),t==="ArrowLeft"&&(o="ArrowRight"));let r=Array.from(this.rootNode.querySelectorAll("calcite-radio-button:not([hidden])")).filter(d=>d.name===this.name),n=0;switch(r.some((d,l)=>{if(d.checked)return n=l,!0}),o){case"ArrowLeft":case"ArrowUp":e.preventDefault(),this.selectItem(r,this.getNextNonDisabledIndex(r,n,"left"));return;case"ArrowRight":case"ArrowDown":e.preventDefault(),this.selectItem(r,this.getNextNonDisabledIndex(r,n,"right"));return;default:return}}getNextNonDisabledIndex(e,a,t){let o=e.length,r=t==="left"?-1:1,n=v(a+r,o);for(;e[n].disabled;)n=v(n+r,o);return n}onContainerBlur(){this.focused=!1,this.calciteInternalRadioButtonBlur.emit()}onContainerFocus(){this.disabled||(this.focused=!0,this.calciteInternalRadioButtonFocus.emit())}render(){let e=this.getTabIndex();return this.interactiveContainer({disabled:this.disabled,children:m`<div .ariaChecked=${this.checked} .ariaLabel=${O(this)} class=${p($.container)} =${this.onContainerBlur} =${this.onContainerFocus} role=radio tabindex=${e??C} ${R(this.containerRef)}><div class=${p($.radio)}></div>${this.labelText&&T({labelText:this.labelText,spacingInlineStart:!0})||""}</div>${Y({component:this})}`})}};E("calcite-radio-button",x);export{x as RadioButton};