@public-ui/components
Version:
Contains all web components that belong to KoliBri - The accessible HTML-Standard.
4 lines • 15.8 kB
JavaScript
/*!
* KoliBri - The accessible HTML-Standard
*/
import{_ as __rest}from"./tslib.es6.js";import{h,Fragment}from"@stencil/core/internal/client";import{c as clsx}from"./clsx.js";import{c as watchBoolean,h as watchString,p as parseJson,o as objectObjectHandler,w as watchValidator,I as isObject,j as isString,l as devHint,s as setState,t as a11yHint}from"./common.js";import{b as buildBadgeTextString,s as showExpertSlot}from"./reuse.js";import{t as translate}from"./i18n.js";import{i as isString$1,K as KolInternalUnderlinedBadgeTextFc}from"./InternalUnderlinedBadgeText.js";import{K as KolAlertFc}from"./Alert.js";import{a as KolTooltipWcTag}from"./component-names.js";import{v as validateAccessKey,a as validateAccessAndShortKey,b as validateShortKey,c as validateTabIndex}from"./access-and-short-key.js";import{v as validateDisabled}from"./disabled.js";import{v as validateHideLabel}from"./hide-label.js";import{a as validateLabelWithExpertSlot}from"./label.js";import{v as validateTooltipAlign}from"./tooltip-align.js";import{d as dispatchDomEvent,K as KolEvent}from"./events.js";import{A as AssociatedInputController}from"./associated.controller.js";import{a as isObjectLike,c as baseGetTag,i as isObject$1,r as root}from"./isObject.js";const validateAdjustHeight=(e,t)=>{watchBoolean(e,"_adjustHeight",t)},validateHideMsg=(e,t,n)=>{watchBoolean(e,"_hideMsg",t,n)},validateHint=(e,t)=>{watchString(e,"_hint",t)},validateMsg=(e,t)=>{objectObjectHandler(t,()=>{try{t=parseJson(t)}catch(e){}watchValidator(e,"_msg",e=>{if(void 0===e)return!0;if("string"==typeof e&&e.length>0)return!0;if(isObject(e)&&null!==e){const t=e._description;return isString(t,1)}return!1},new Set(["MsgPropType","string"]),t)})};function isMsgDefinedAndInputTouched(e,t){return Boolean(e)&&!0===t}function normalizeMsg(e){if("string"==typeof e)try{return parseJson(e)}catch(t){return{_description:e,_type:"error"}}return e&&"object"==typeof e&&!("_type"in e)?Object.assign(Object.assign({},e),{_type:"error"}):e}function getMsgType(e){var t;return"string"==typeof e?"error":null!==(t=null==e?void 0:e._type)&&void 0!==t?t:"error"}const validateTouched=(e,t)=>{watchBoolean(e,"_touched",t)},KolFormFieldCharacterLimitHintFc=({id:e,maxLength:t})=>h("span",{id:`${e}-character-limit-hint`,class:"visually-hidden"},translate("kol-character-limit-hint",{placeholders:{limit:String(t)}})),KolFormFieldCounterFc=({currentLength:e,currentLengthDebounced:t,maxLength:n,maxLengthBehavior:o,id:i})=>{let a,r;const s=["kol-form-field__counter"];if("hard"===o)a="number"==typeof n?translate("kol-character-counter-current-of-max",{placeholders:{current:String(e),max:String(n)}}):translate("kol-character-counter-current",{placeholders:{current:String(e)}}),r="number"==typeof n?translate("kol-character-counter-current-of-max-aria",{placeholders:{current:String(t),max:String(n)}}):translate("kol-character-counter-current",{placeholders:{current:String(t)}});else{if("number"!=typeof n)return null;{const o=n-e,i=o<0,l=n-t,d=l<0;a=i?translate("kol-character-limit-exceeded",{placeholders:{over:String(Math.abs(o))}}):translate("kol-character-limit-remaining",{placeholders:{remaining:String(o)}}),r=d?translate("kol-character-limit-exceeded",{placeholders:{over:String(Math.abs(l))}}):translate("kol-character-limit-remaining",{placeholders:{remaining:String(l)}}),i&&s.push("kol-form-field__counter--exceeded")}}return h(Fragment,null,h("span",{class:clsx(s),"aria-hidden":"true","data-testid":"input-counter"},a),h("span",{id:`${i}-counter`,"aria-live":"polite",class:"visually-hidden","data-testid":"input-counter-aria"},r))},KolFormFieldHintFc=e=>{var{id:t,class:n,hint:o,baseClassName:i="kol-form-field"}=e,a=__rest(e,["id","class","hint","baseClassName"]);return o?h("span",Object.assign({class:clsx(`${i}__hint`,n),id:`${t}-hint`},a),o):null};var symbolTag="[object Symbol]";function isSymbol(e){return"symbol"==typeof e||isObjectLike(e)&&baseGetTag(e)==symbolTag}var reWhitespace=/\s/;function trimmedEndIndex(e){for(var t=e.length;t--&&reWhitespace.test(e.charAt(t)););return t}var reTrimStart=/^\s+/;function baseTrim(e){return e?e.slice(0,trimmedEndIndex(e)+1).replace(reTrimStart,""):e}var NAN=NaN,reIsBadHex=/^[-+]0x[0-9a-f]+$/i,reIsBinary=/^0b[01]+$/i,reIsOctal=/^0o[0-7]+$/i,freeParseInt=parseInt;function toNumber(e){if("number"==typeof e)return e;if(isSymbol(e))return NAN;if(isObject$1(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=isObject$1(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=baseTrim(e);var n=reIsBinary.test(e);return n||reIsOctal.test(e)?freeParseInt(e.slice(2),n?2:8):reIsBadHex.test(e)?NAN:+e}var now=function(){return root.Date.now()},FUNC_ERROR_TEXT="Expected a function",nativeMax=Math.max,nativeMin=Math.min;function debounce(e,t,n){var o,i,a,r,s,l,d=0,c=!1,h=!1,u=!0;if("function"!=typeof e)throw new TypeError(FUNC_ERROR_TEXT);function m(t){var n=o,a=i;return o=i=void 0,d=t,r=e.apply(a,n)}function p(e){var n=e-l;return void 0===l||n>=t||n<0||h&&e-d>=a}function g(){var e=now();if(p(e))return b(e);s=setTimeout(g,function(e){var n=t-(e-l);return h?nativeMin(n,a-(e-d)):n}(e))}function b(e){return s=void 0,u&&o?m(e):(o=i=void 0,r)}function v(){var e=now(),n=p(e);if(o=arguments,i=this,l=e,n){if(void 0===s)return function(e){return d=e,s=setTimeout(g,t),c?m(e):r}(l);if(h)return clearTimeout(s),s=setTimeout(g,t),m(l)}return void 0===s&&(s=setTimeout(g,t)),r}return t=toNumber(t)||0,isObject$1(n)&&(c=!!n.leading,a=(h="maxWait"in n)?nativeMax(toNumber(n.maxWait)||0,t):a,u="trailing"in n?!!n.trailing:u),v.cancel=function(){void 0!==s&&clearTimeout(s),d=0,o=l=i=s=void 0},v.flush=function(){return void 0===s?r:b(now())},v}const LabelFc=({hasExpertSlot:e,accessKey:t,shortKey:n,label:o,showBadge:i=!0})=>{if(e)return h("slot",{name:"expert"});if(!o)return null;const a=isString$1(t)||isString$1(n);if(!i||!a)return h("span",null,o);const r=buildBadgeTextString(t,n);return h(Fragment,null,h(KolInternalUnderlinedBadgeTextFc,{badgeText:r,label:o})," ",h("kbd",{class:"badge-text-hint","aria-hidden":"true"},r))},KolFormFieldLabelFc=e=>{var{component:t="label",id:n,baseClassName:o="kol-form-field",class:i,accessKey:a,shortKey:r,label:s,hideLabel:l,hasExpertSlot:d,showBadge:c,readOnly:u}=e,m=__rest(e,["component","id","baseClassName","class","accessKey","shortKey","label","hideLabel","hasExpertSlot","showBadge","readOnly"]);const p=!d&&l,g=translate("kol-readonly");return h(t,Object.assign({},m,{class:clsx(`${o}__label`,i),id:p?void 0:`${n}-label`,hidden:p,htmlFor:n}),h("span",{class:clsx(`${o}__label-text`)},h(LabelFc,{hasExpertSlot:d,accessKey:a,shortKey:r,label:s,showBadge:c}),u?h("span",{class:clsx(`${o}__label__read-only`),"aria-hidden":"true"},"(",g,")"):null))},FormFieldMsgFc=e=>{var t,n,{alert:o,msg:i,id:a,class:r}=e,s=__rest(e,["alert","msg","id","class"]);const l=normalizeMsg(i);return h(KolAlertFc,Object.assign({id:`${a}-msg`,alert:null!==(t=null==l?void 0:l._alert)&&void 0!==t?t:o,hasCloser:!1,level:0,type:null!==(n=null==l?void 0:l._type)&&void 0!==n?n:"error",variant:"msg",class:clsx("kol-form-field__msg",r)},s),(null==l?void 0:l._description)||void 0)},FormFieldTooltipFc=({id:e,align:t,badgeText:n,label:o,class:i})=>h(KolTooltipWcTag,{"aria-hidden":"true",class:clsx("kol-form-field__tooltip",i),_badgeText:n,_align:t,_id:`${e}-label`,_label:o});function getModifierClassNameByMsgType(e){return(null==e?void 0:e.type)&&{default:"msg-type-default",info:"msg-type-info",success:"msg-type-success",warning:"msg-type-warning",error:"msg-type-error"}[null==e?void 0:e.type]||""}const InputContainer=(e,t)=>{var{class:n}=e,o=__rest(e,["class"]);return h("div",Object.assign({class:clsx("kol-form-field__input",n)},o),t)},KolFormFieldFc=(e,t)=>{const{component:n="div",renderNoLabel:o,renderNoTooltip:i,renderNoHint:a,anotherChildren:r,id:s,required:l,alert:d,disabled:c,class:u,msg:m,hideMsg:p,hideLabel:g,label:b,hint:v,accessKey:f,shortKey:_,tooltipAlign:y,counter:F,readOnly:x,touched:K,maxLength:L,ariaDescribedBy:T,formFieldLabelProps:j,formFieldHintProps:S,formFieldTooltipProps:C,formFieldMsgProps:B,formFieldInputProps:O}=e,M=__rest(e,["component","renderNoLabel","renderNoTooltip","renderNoHint","anotherChildren","id","required","alert","disabled","class","msg","hideMsg","hideLabel","label","hint","accessKey","shortKey","tooltipAlign","counter","readOnly","touched","maxLength","ariaDescribedBy","formFieldLabelProps","formFieldHintProps","formFieldTooltipProps","formFieldMsgProps","formFieldInputProps"]),I=!o,k=!a,H=!i,E=showExpertSlot(b),A=isMsgDefinedAndInputTouched(m,K),w=buildBadgeTextString(f,_),D=H&&!E&&g;let $={"kol-form-field--disabled":Boolean(c),"kol-form-field--required":Boolean(l),"kol-form-field--touched":Boolean(K),"kol-form-field--hide-label":Boolean(g),"kol-form-field--read-only":Boolean(x),"kol-form-field--hidden-msg":Boolean(p)};if(A){const e=getMsgType(m);$=Object.assign(Object.assign({},$),{[`kol-form-field--${e}`]:!0,[`kol-form-field--${getModifierClassNameByMsgType({type:e})}`]:!0})}return h(n,Object.assign({class:clsx("kol-form-field",$,u),"aria-describedby":T},M),I&&h(KolFormFieldLabelFc,Object.assign({},j||{},{id:s,hasExpertSlot:E,hideLabel:g,label:b,accessKey:f,shortKey:_,readOnly:x})),h(InputContainer,Object.assign({},O),t,D&&!0===g&&h(FormFieldTooltipFc,Object.assign({},C||{},{id:s,label:b,align:y,badgeText:w}))),F?h(KolFormFieldCounterFc,Object.assign({id:s},F)):null,L?h(KolFormFieldCharacterLimitHintFc,{id:s,maxLength:L}):null,A&&!p&&h(FormFieldMsgFc,Object.assign({},B||{},{id:s,alert:d,msg:m})),k&&h(KolFormFieldHintFc,Object.assign({},S||{},{id:s,hint:v})),r)};function getDefaultProps({ariaDescribedBy:e,hideLabel:t,label:n}){return{title:"",autoCapitalize:"off",autoCorrect:"off","aria-describedby":(null==e?void 0:e.length)?e.join(" "):void 0,"aria-label":t&&n?n:void 0}}const getRenderStates=e=>{const t=e._msg,n="string"==typeof t?t:null==t?void 0:t._description,o=getMsgType(t),i=Boolean(n&&n.length>0),a="error"===o&&i&&!0===e._touched,r="string"==typeof e._hint&&e._hint.length>0,s=[];return i&&!e._hideMsg&&s.push(`${e._id}-msg`),!0===r&&s.push(`${e._id}-hint`),e._hasCounter&&s.push(`${e._id}-counter`),!0===a&&s.push(`${e._id}-error`),{hasError:a,hasHint:r,ariaDescribedBy:s}};function getFormFieldProps(e){const t={id:e._id,disabled:e._disabled,msg:e._msg,hint:e._hint,label:e._label,hideLabel:e._hideLabel,hideMsg:e._hideMsg,touched:e._touched};return"_required"in e&&(t.required=e._required),"_readOnly"in e&&(t.readOnly=e._readOnly),"_accessKey"in e&&(t.accessKey=e._accessKey),"_shortKey"in e&&(t.shortKey=e._shortKey),"_maxLength"in e&&(t.maxLength=e._maxLength),"_currentLength"in e&&"number"==typeof e._currentLength&&"_currentLengthDebounced"in e&&"number"==typeof e._currentLengthDebounced&&"_hasCounter"in e&&!0===e._hasCounter&&(t.counter={currentLength:e._currentLength,currentLengthDebounced:e._currentLengthDebounced,maxLength:e._maxLength,maxLengthBehavior:e._maxLengthBehavior||"hard"}),t}const FormFieldStateWrapper=(e,t)=>{var{state:n}=e,o=__rest(e,["state"]);const{ariaDescribedBy:i}=getRenderStates(n),a=("fieldset"===o.component||"_options"in n&&"_orientation"in n)&&i.length>0?i.join(" "):void 0,r=getFormFieldProps(n);return h(KolFormFieldFc,Object.assign({},r,o,{ariaDescribedBy:a}),t)};class ControlledInputController extends AssociatedInputController{constructor(e,t,n){super(e,t,n),this.component=e}validateTouched(e){validateTouched(this.component,e)}componentWillLoad(){super.componentWillLoad(),this.validateTouched(this.component._touched)}}class InputController extends ControlledInputController{constructor(e,t,n){super(e,t,n),this.valueChangeListeners=[],this.onFacade={onBlur:this.onBlur.bind(this),onChange:this.onChange.bind(this),onClick:this.onClick.bind(this),onFocus:this.onFocus.bind(this),onInput:this.onInput.bind(this),onKeyDown:this.onKeyDown.bind(this)},this.updateCurrentLengthDebounced=debounce(e=>{setState(this.component,"_currentLengthDebounced",e)},500),this.component=e}validateAccessKey(e){validateAccessKey(this.component,e),validateAccessAndShortKey(e,this.component._shortKey)}validateAdjustHeight(e){validateAdjustHeight(this.component,e)}validateDisabled(e){validateDisabled(this.component,e)}validateTooltipAlign(e){validateTooltipAlign(this.component,e)}validateHideMsg(e){validateHideMsg(this.component,e,{hooks:{afterPatch:()=>{this.component.state._hideMsg&&a11yHint("Property _hideMsg for inputs: Only use when the error message is shown outside of the input component.")}}})}validateHideLabel(e){validateHideLabel(this.component,e,{hooks:{afterPatch:()=>{this.component.state._hideLabel&&a11yHint("Property hide-label for inputs: Only use for exceptions like search inputs that are clearly identifiable by their context.")}}})}validateHint(e){validateHint(this.component,e)}validateId(e){watchString(this.component,"_id",e,{minLength:1}),""!==e&&void 0!==e||devHint("A unique ID on the input fields is not strictly required, but it might be relevant for E2E tests.")}validateLabel(e){validateLabelWithExpertSlot(this.component,e,{required:!0})}validateMsg(e){validateMsg(this.component,e)}validateOn(e){"object"==typeof e&&setState(this.component,"_on",e)}validateShortKey(e){validateShortKey(this.component,e),validateAccessAndShortKey(this.component._accessKey,e)}validateSmartButton(e){objectObjectHandler(e,()=>{try{e=parseJson(e)}catch(e){}setState(this.component,"_smartButton",e)})}validateTabIndex(e){validateTabIndex(this.component,e)}componentWillLoad(){super.componentWillLoad(),this.validateAccessKey(this.component._accessKey),this.validateAdjustHeight(this.component._adjustHeight),this.validateMsg(this.component._msg),this.validateDisabled(this.component._disabled),this.validateHideMsg(this.component._hideMsg),this.validateHideLabel(this.component._hideLabel),this.validateHint(this.component._hint),this.validateId(this.component._id),this.validateLabel(this.component._label),this.validateShortKey(this.component._shortKey),this.validateSmartButton(this.component._smartButton),this.validateOn(this.component._on),this.validateTabIndex(this.component._tabIndex),validateAccessAndShortKey(this.component._accessKey,this.component._shortKey)}emitEvent(e,t){this.host&&dispatchDomEvent(this.host,e,t)}onBlur(e){var t;this.component._touched=!0,this.emitEvent(KolEvent.blur),"function"==typeof(null===(t=this.component._on)||void 0===t?void 0:t.onBlur)&&this.component._on.onBlur(e)}onChange(e,t){var n;void 0===t&&(t=e.target.value),this.emitEvent(KolEvent.change,t),"function"==typeof(null===(n=this.component._on)||void 0===n?void 0:n.onChange)&&this.component._on.onChange(e,t),this.valueChangeListeners.forEach(e=>e(t))}onInput(e,t=!0,n){var o;void 0===n&&(n=e.target.value),this.emitEvent(KolEvent.input,n),t&&this.setFormAssociatedValue(n),"function"==typeof(null===(o=this.component._on)||void 0===o?void 0:o.onInput)&&this.component._on.onInput(e,n)}onClick(e){var t;this.emitEvent(KolEvent.click),"function"==typeof(null===(t=this.component._on)||void 0===t?void 0:t.onClick)&&this.component._on.onClick(e)}onFocus(e){var t;this.emitEvent(KolEvent.focus),"function"==typeof(null===(t=this.component._on)||void 0===t?void 0:t.onFocus)&&this.component._on.onFocus(e)}onKeyDown(e){var t;this.emitEvent(KolEvent.keydown),"function"==typeof(null===(t=this.component._on)||void 0===t?void 0:t.onKeyDown)&&this.component._on.onKeyDown(e)}addValueChangeListener(e){this.valueChangeListeners.push(e)}hasSoftCharacterLimit(){return"number"==typeof this.component.state._maxLength&&"soft"===this.component.state._maxLengthBehavior}hasCounter(){return!0===this.component.state._hasCounter}}export{FormFieldStateWrapper as F,InputController as I,KolFormFieldLabelFc as K,getMsgType as a,FormFieldTooltipFc as b,KolFormFieldHintFc as c,getDefaultProps as d,getRenderStates as g,isMsgDefinedAndInputTouched as i};