UNPKG

@visitscotland/component-library

Version:
1 lines 8.4 kB
"use strict";(self.webpackChunk_visitscotland_component_library=self.webpackChunk_visitscotland_component_library||[]).push([[9033],{59033:function(e,t,n){n.r(t),n.d(t,{default:function(){return E}});var i=n(20641),o=(n(96763),38);function u(e){return"function"==typeof e}function s(e,t){return e===t.keyCode}function r(e,t,n){return void 0!==e?e:n.length?n.indexOf(t):-1}function l(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function d(e,t,n,i,o){var u=i(t);if(!u||!u.hasAttribute("disabled"))return t;if(e>0){for(var s=t+1;s<n;s+=1)if(!i(s).hasAttribute("disabled"))return s}else for(var r=t-1;r>=0;r-=1)if(!i(r).hasAttribute("disabled"))return r;return o?e>0?d(1,0,n,i,!1):d(-1,n-1,n,i,!1):-1}var a={menuElement:function(){return document.querySelector("#"+this.computedMenuId)},computedMenuId:function(){return this.menuId||"v-"+this.idCounter+"-vue-combo-blocks-menu"},computedInputId:function(){return this.inputId||"v-"+this.idCounter+"-vue-combo-blocks-input"},computedLabelId:function(){return this.labelId||"v-"+this.idCounter+"-vue-combo-blocks-label"},selectedIndex:function(){return this.items.indexOf(this.selectedItem)}},c="InputKeyDownArrowDown",h="InputKeyDownArrowUp",p="InputKeyUpEscape",I="InputKeyUpEnter",m="InputChange",v="InputBlur",f="MenuMouseLeave",g="ItemMouseMove",b="ItemClick",M="FunctionOpenMenu",x="FunctionCloseMenu",y="FunctionSelectItem",S="FunctionSetInputValue",w="FunctionReset",V=Object.freeze({__proto__:null,ControlledPropUpdatedSelectedItem:"ControlledPropUpdatedSelectedItem",FunctionCloseMenu:x,FunctionOpenMenu:M,FunctionReset:w,FunctionSelectItem:y,FunctionSetInputValue:S,InputBlur:v,InputChange:m,InputKeyDownArrowDown:c,InputKeyDownArrowUp:h,InputKeyDownTab:"InputKeyDownTab",InputKeyUpEnter:I,InputKeyUpEscape:p,ItemClick:b,ItemMouseMove:g,MenuMouseLeave:f}),O={getInputProps:function(){return{value:this.inputValue||"","aria-activedescendant":this.hovered?this.getItemId(this.hoveredIndex):"","aria-autocomplete":"list","aria-controls":this.computedMenuId,"aria-labelledby":this.computedLabelId,id:this.computedInputId,autocomplete:"off"}},getInputEventListeners:function(e){void 0===e&&(e={});var t=e.blur,n=e.input,i=e.keydown,o=e.keyup;return{blur:u(t)?t:this.onInputBlur,input:u(n)?n:this.onInput,keydown:u(i)?i:this.onInputKeyDown,keyup:u(o)?o:this.onInputKeyUp}},onInputKeyDown:function(e){"Enter"===e.key&&this.isOpen?e.preventDefault():s(40,e)&&!this.isOpen?(this.setState({isOpen:!0},c),this.moveSelection(e)):this.moveSelection(e)},onInputKeyUp:function(e){if(this.isOpen)if(s(13,e)){if(this.hoveredIndex>=0){e.preventDefault();var t=this.getItemNodeFromIndex(this.hoveredIndex);if(t&&t.hasAttribute("disabled"))return;this.setState({inputValue:this.itemToString(this.hovered),selectedItem:this.hovered,hoveredIndex:-1,hovered:null,isOpen:!1},I)}}else s(27,e)&&this.setState({hoveredIndex:-1,hovered:null,isOpen:!1},p)},onInputBlur:function(){this.setState({isOpen:!1,inputValue:this.itemToString(this.selectedItem),hovered:null,hoveredIndex:-1},v)},onInput:function(e){var t=e.target?e.target.value:e;this.setState({inputValue:t,hovered:null,isOpen:!0},m)}},C={getItemEventListeners:function(e){var t=this;void 0===e&&(e={});var n=e.index,i=e.disabled,o=e.item;void 0===o&&(o=void 0);var s=e.mousemove,r=e.mousedown,l=e.click;return i?{}:{mousemove:u(s)?s:function(){return t.onItemMouseMove(n,o)},mousedown:u(r)?r:this.onItemMouseDown,click:u(l)?l:function(){return t.onItemClick(o)}}},onItemMouseMove:function(e,t){var n=r(e,t,this.items);this.hoveredIndex!==n&&this.setState({hoveredIndex:n,hovered:t},g)},onItemMouseDown:function(e){e.preventDefault()},onItemClick:function(e){this.setState({inputValue:this.itemToString(e),selectedItem:e,isOpen:!1,hoveredIndex:-1,hovered:null},b)},getItemProps:function(e){void 0===e&&(e={});var t=e.index,n=e.disabled,i=e.item;void 0===i&&(i=void 0);var o=r(t,i,this.items);return{id:this.getItemId(o),disabled:!!n||void 0,role:"option","aria-selected":this.hoveredIndex===o||this.selectedItem===i?"true":"false"}}},k={getMenuProps:function(){return{id:this.computedMenuId,role:"listbox","aria-labelledby":this.computedLabelId}},getMenuEventListeners:function(e){void 0===e&&(e={});var t=e.mouseleave,n=e.mousedown;return{mouseleave:u(t)?t:this.onMenuMouseLeave,mousedown:u(n)?n:this.onMenuMouseDown}},onMenuMouseLeave:function(){this.setState({hoveredIndex:-1,hovered:null},f)},onMenuMouseDown:function(e){e.preventDefault()}},L=Object.assign({},O,C,k,{getComboboxProps:function(){return{role:"combobox","aria-haspopup":"listbox","aria-owns":this.computedMenuId,"aria-expanded":this.isOpen?"true":"false"}},getLabelProps:function(){return{id:this.computedLabelId,for:this.computedInputId}},autocompleteText:function(e){this.setInputValue(this.itemToString(e))},reset:function(){this.setState({selectedItem:null,inputValue:""},w)},select:function(e){this.setState({inputValue:this.itemToString(e),selectedItem:e,isOpen:!1,hoveredIndex:-1,hovered:null},y)},setHoveredItem:function(e,t,n){e&&e!==this.hovered&&this.$emit("hover",e,n),this.hovered=e,this.hoveredIndex="number"==typeof t?t:-1},closeMenu:function(){this.setState({isOpen:!1,hoveredIndex:-1,hovered:null},x)},openMenu:function(){this.setState({isOpen:!0},M)},getItemNodeFromIndex:function(e){return this.menuElement.querySelector("#"+this.getItemId(e))},scrollItemIntoView:function(e){!function(e,t,n){var i=t.clientHeight,o=t.scrollTop,u=e.offsetHeight,s=e.offsetTop;if(s<o)t.scrollTop=0===n?0:s;else{var r=s+u;r>o+i&&(t.scrollTop=r-i)}}(this.getItemNodeFromIndex(e),this.menuElement,e)},moveSelection:function(e){var t=this,n=this.items.length;if(this.isOpen&&n){var i=s(40,e),u=s(o,e);if(i||u){e.preventDefault();var r=2*i-1,l=i?0:n-1,a=(i?this.hoveredIndex<n-1:this.hoveredIndex>0)?this.hoveredIndex+r:l,p=d(r,a,n,this.getItemNodeFromIndex,this.circular);if(!this.circular){if(u&&p>this.hoveredIndex)return;if(i&&p<this.hoveredIndex)return}var I=this.items[p];this.scrollIntoView&&this.$nextTick((function(){t.scrollItemIntoView(a)})),this.setState({hoveredIndex:p,hovered:I},i?c:h)}}},setInputValue:function(e){this.inputValue!==e&&this.setState({inputValue:e},S)}}),D=0,P=!!i.pM,E=(0,i.pM)({name:"vue-combo-blocks",emits:{select:null,"update:modelValue":null,"input-value-change":null,"is-open-change":null,"hovered-index-change":null,"state-change":null,change:null,"show-list":null,focus:null,hover:null},props:function(e){return Object.assign({},e?{modelValue:{default:null}}:{value:{default:null}},{items:{type:Array,required:!0},itemToString:{type:Function,default:function(e){return e?String(e):""}},stateReducer:{type:Function,default:function(e,t){return t.changes}},getItemId:{type:Function,default:function(e){return"v-"+this.idCounter+"-vue-combo-blocks-item-"+e}},menuId:{type:String,default:""},inputId:{type:String,default:""},labelId:{type:String,default:""},scrollIntoView:{type:Boolean,default:!0},circular:{type:Boolean,default:!0}})}(P),watch:{modelValue:function(e){void 0!==this.$props.modelValue&&(this.inputValue=this.itemToString(e),this.selectedItem=e)}},beforeCreate:function(){this.idCounter=D.toString(),D+=1},data:function(){return{hovered:null,isOpen:!1,hoveredIndex:-1,selectedItem:e=this.modelValue,inputValue:(0,this.itemToString)(e)};var e},computed:Object.assign({},a),methods:Object.assign({},{setState:function(e,t){var n=this.$data,i=this.stateReducer(n,{changes:e,type:t}),o=l(i,"selectedItem"),u=i.selectedItem!==n.selectedItem;o&&(this.$emit("select",i.selectedItem,t),u&&this.$emit("update:modelValue",i.selectedItem,t));var s={};for(var r in i)l(i,r)&&n[r]!==i[r]&&(s[r]=i[r],this[r]=s[r],"inputValue"===r?this.$emit("input-value-change",i[r],t):"isOpen"===r?this.$emit("is-open-change",i[r],t):"hoveredIndex"===r&&this.$emit("hovered-index-change",i[r],t));this.$emit("state-change",s,t)}},L),render:function(){return this.$slots.default({getInputProps:(e=this).getInputProps,getItemProps:e.getItemProps,getMenuProps:e.getMenuProps,getComboboxProps:e.getComboboxProps,getLabelProps:e.getLabelProps,getInputEventListeners:e.getInputEventListeners,getMenuEventListeners:e.getMenuEventListeners,getItemEventListeners:e.getItemEventListeners,isOpen:e.isOpen,selectedItem:e.selectedItem,hoveredIndex:e.hoveredIndex,inputValue:e.inputValue,reset:e.reset,select:e.select,setInputValue:e.setInputValue,openMenu:e.openMenu,closeMenu:e.closeMenu});var e}});E.stateChangeTypes=V}}]);