@graupl/graupl 1.0.0-alpha.15 → 1.0.0-alpha.16

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (167) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/build.js +7 -0
  3. package/dist/css/base/button.css +2 -0
  4. package/dist/css/base/button.css.map +1 -0
  5. package/dist/css/base/form.css.map +1 -0
  6. package/dist/css/base/link.css.map +1 -0
  7. package/dist/css/base/table.css.map +1 -0
  8. package/dist/css/base.css +2 -0
  9. package/dist/css/base.css.map +1 -0
  10. package/dist/css/component/accordion.css +2 -0
  11. package/dist/css/component/accordion.css.map +1 -0
  12. package/dist/css/component/alert.css +2 -0
  13. package/dist/css/component/alert.css.map +1 -0
  14. package/dist/css/component/card.css.map +1 -0
  15. package/dist/css/component/carousel.css +2 -0
  16. package/dist/css/component/carousel.css.map +1 -0
  17. package/dist/css/component/input-group.css.map +1 -0
  18. package/dist/css/component/menu.css.map +1 -0
  19. package/dist/css/component/navigation.css.map +1 -0
  20. package/dist/css/component.css +2 -0
  21. package/dist/css/component.css.map +1 -0
  22. package/dist/css/graupl.css +2 -0
  23. package/dist/css/graupl.css.map +1 -0
  24. package/dist/css/init.css.map +1 -0
  25. package/dist/css/layout/columns.css.map +1 -0
  26. package/dist/css/layout/container.css.map +1 -0
  27. package/dist/css/layout/flex-columns.css.map +1 -0
  28. package/dist/css/layout.css +2 -0
  29. package/dist/css/layout.css.map +1 -0
  30. package/dist/css/normalize.css.map +1 -0
  31. package/dist/css/state/focus.css +2 -0
  32. package/dist/css/state/focus.css.map +1 -0
  33. package/dist/css/state.css +2 -0
  34. package/dist/css/state.css.map +1 -0
  35. package/dist/css/theme/color.css.map +1 -0
  36. package/dist/css/theme/typography.css.map +1 -0
  37. package/dist/css/theme.css.map +1 -0
  38. package/dist/css/utilities/alignment.css.map +1 -0
  39. package/dist/css/utilities/color.css.map +1 -0
  40. package/dist/css/utilities/display.css.map +1 -0
  41. package/dist/css/utilities/flex.css.map +1 -0
  42. package/dist/css/utilities/height.css.map +1 -0
  43. package/dist/css/utilities/inset.css.map +1 -0
  44. package/dist/css/utilities/justification.css.map +1 -0
  45. package/dist/css/utilities/list.css.map +1 -0
  46. package/dist/css/utilities/order.css.map +1 -0
  47. package/dist/css/utilities/postion.css.map +1 -0
  48. package/dist/css/utilities/spacing.css.map +1 -0
  49. package/dist/css/utilities/typography.css.map +1 -0
  50. package/dist/css/utilities/visibility.css.map +1 -0
  51. package/dist/css/utilities/width.css.map +1 -0
  52. package/dist/css/utilities.css.map +1 -0
  53. package/dist/js/component/accordion.cjs.js +3 -0
  54. package/dist/js/component/accordion.esm.js +1289 -0
  55. package/dist/js/component/accordion.iife.js +3 -0
  56. package/dist/js/component/alert.cjs.js +3 -0
  57. package/dist/js/component/alert.esm.js +529 -0
  58. package/dist/js/component/alert.iife.js +3 -0
  59. package/dist/js/component/carousel.cjs.js +3 -0
  60. package/dist/js/component/carousel.esm.js +1110 -0
  61. package/dist/js/component/carousel.iife.js +3 -0
  62. package/dist/js/graupl.cjs.js +5 -0
  63. package/dist/js/graupl.esm.js +1462 -0
  64. package/dist/js/graupl.iife.js +5 -0
  65. package/index.html +56 -2
  66. package/index.js +12 -0
  67. package/package.json +26 -5
  68. package/scss/component/accordion.scss +3 -0
  69. package/src/js/accordion/Accordion.js +1163 -0
  70. package/src/js/accordion/AccordionItem.js +496 -0
  71. package/src/js/accordion/index.js +10 -0
  72. package/src/js/alert/Alert.js +71 -1
  73. package/src/js/alert/index.js +1 -11
  74. package/src/js/carousel/Carousel.js +67 -16
  75. package/src/js/carousel/index.js +1 -11
  76. package/src/js/eventHandlers.js +7 -0
  77. package/src/js/storage.js +106 -0
  78. package/src/scss/_defaults.scss +29 -0
  79. package/src/scss/base/button/_mixins.scss +64 -62
  80. package/src/scss/component/_index.scss +1 -0
  81. package/src/scss/component/accordion/_defaults.scss +40 -0
  82. package/src/scss/component/accordion/_index.scss +180 -0
  83. package/src/scss/component/accordion/_variables.scss +304 -0
  84. package/src/scss/component/carousel/_index.scss +6 -0
  85. package/src/scss/layout/columns/_index.scss +1 -1
  86. package/src/scss/layout/flex-columns/_index.scss +1 -1
  87. package/src/scss/state/focus/_index.scss +6 -6
  88. package/src/scss/state/focus/_mixins.scss +15 -0
  89. package/vite.config.js +57 -0
  90. package/dist/base/button.css +0 -2
  91. package/dist/base/button.css.map +0 -1
  92. package/dist/base/form.css.map +0 -1
  93. package/dist/base/link.css.map +0 -1
  94. package/dist/base/table.css.map +0 -1
  95. package/dist/base.css +0 -2
  96. package/dist/base.css.map +0 -1
  97. package/dist/component/alert.css +0 -2
  98. package/dist/component/alert.css.map +0 -1
  99. package/dist/component/card.css.map +0 -1
  100. package/dist/component/carousel.css +0 -2
  101. package/dist/component/carousel.css.map +0 -1
  102. package/dist/component/input-group.css.map +0 -1
  103. package/dist/component/menu.css.map +0 -1
  104. package/dist/component/navigation.css.map +0 -1
  105. package/dist/component.css +0 -2
  106. package/dist/component.css.map +0 -1
  107. package/dist/graupl.css +0 -2
  108. package/dist/graupl.css.map +0 -1
  109. package/dist/init.css.map +0 -1
  110. package/dist/layout/columns.css.map +0 -1
  111. package/dist/layout/container.css.map +0 -1
  112. package/dist/layout/flex-columns.css.map +0 -1
  113. package/dist/layout.css +0 -2
  114. package/dist/layout.css.map +0 -1
  115. package/dist/normalize.css.map +0 -1
  116. package/dist/state/focus.css +0 -2
  117. package/dist/state/focus.css.map +0 -1
  118. package/dist/state.css +0 -2
  119. package/dist/state.css.map +0 -1
  120. package/dist/theme/color.css.map +0 -1
  121. package/dist/theme/typography.css.map +0 -1
  122. package/dist/theme.css.map +0 -1
  123. package/dist/utilities/alignment.css.map +0 -1
  124. package/dist/utilities/color.css.map +0 -1
  125. package/dist/utilities/display.css.map +0 -1
  126. package/dist/utilities/flex.css.map +0 -1
  127. package/dist/utilities/height.css.map +0 -1
  128. package/dist/utilities/inset.css.map +0 -1
  129. package/dist/utilities/justification.css.map +0 -1
  130. package/dist/utilities/list.css.map +0 -1
  131. package/dist/utilities/order.css.map +0 -1
  132. package/dist/utilities/postion.css.map +0 -1
  133. package/dist/utilities/spacing.css.map +0 -1
  134. package/dist/utilities/typography.css.map +0 -1
  135. package/dist/utilities/visibility.css.map +0 -1
  136. package/dist/utilities/width.css.map +0 -1
  137. package/dist/utilities.css.map +0 -1
  138. /package/dist/{base → css/base}/form.css +0 -0
  139. /package/dist/{base → css/base}/link.css +0 -0
  140. /package/dist/{base → css/base}/table.css +0 -0
  141. /package/dist/{component → css/component}/card.css +0 -0
  142. /package/dist/{component → css/component}/input-group.css +0 -0
  143. /package/dist/{component → css/component}/menu.css +0 -0
  144. /package/dist/{component → css/component}/navigation.css +0 -0
  145. /package/dist/{init.css → css/init.css} +0 -0
  146. /package/dist/{layout → css/layout}/columns.css +0 -0
  147. /package/dist/{layout → css/layout}/container.css +0 -0
  148. /package/dist/{layout → css/layout}/flex-columns.css +0 -0
  149. /package/dist/{normalize.css → css/normalize.css} +0 -0
  150. /package/dist/{theme → css/theme}/color.css +0 -0
  151. /package/dist/{theme → css/theme}/typography.css +0 -0
  152. /package/dist/{theme.css → css/theme.css} +0 -0
  153. /package/dist/{utilities → css/utilities}/alignment.css +0 -0
  154. /package/dist/{utilities → css/utilities}/color.css +0 -0
  155. /package/dist/{utilities → css/utilities}/display.css +0 -0
  156. /package/dist/{utilities → css/utilities}/flex.css +0 -0
  157. /package/dist/{utilities → css/utilities}/height.css +0 -0
  158. /package/dist/{utilities → css/utilities}/inset.css +0 -0
  159. /package/dist/{utilities → css/utilities}/justification.css +0 -0
  160. /package/dist/{utilities → css/utilities}/list.css +0 -0
  161. /package/dist/{utilities → css/utilities}/order.css +0 -0
  162. /package/dist/{utilities → css/utilities}/postion.css +0 -0
  163. /package/dist/{utilities → css/utilities}/spacing.css +0 -0
  164. /package/dist/{utilities → css/utilities}/typography.css +0 -0
  165. /package/dist/{utilities → css/utilities}/visibility.css +0 -0
  166. /package/dist/{utilities → css/utilities}/width.css +0 -0
  167. /package/dist/{utilities.css → css/utilities.css} +0 -0
@@ -0,0 +1,5 @@
1
+ var Graupl=function(){"use strict";var R=Object.defineProperty;var U=(d,i,p)=>i in d?R(d,i,{enumerable:!0,configurable:!0,writable:!0,value:p}):d[i]=p;var a=(d,i,p)=>U(d,typeof i!="symbol"?i+"":i,p);function d(e,t){try{if(typeof t!="object"){const s=typeof t;throw new TypeError(`Elements given to isValidInstance() must be inside of an object. "${s}" given.`)}for(const s in t)if(!(t[s]instanceof e)){const r=typeof t[s];throw new TypeError(`${s} must be an instance of ${e.name}. "${r}" given.`)}return{status:!0,error:null}}catch(s){return{status:!1,error:s}}}function i(e,t){try{if(typeof t!="object"){const s=typeof t;throw new TypeError(`Values given to isValidType() must be inside of an object. "${s}" given.`)}for(const s in t){const r=typeof t[s];if(r!==e)throw new TypeError(`${s} must be a ${e}. "${r}" given.`)}return{status:!0,error:null}}catch(s){return{status:!1,error:s}}}function p(e){try{if(typeof e!="object"){const t=typeof e;throw new TypeError(`Values given to isQuerySelector() must be inside of an object. "${t}" given.`)}for(const t in e)try{if(e[t]===null)throw new Error;document.querySelector(e[t])}catch{throw new TypeError(`${t} must be a valid query selector. "${e[t]}" given.`)}return{status:!0,error:null}}catch(t){return{status:!1,error:t}}}function h(e){try{if(typeof e!="object"||Array.isArray(e)){const t=typeof e;throw new TypeError(`Values given to isValidClassList() must be inside of an object. "${t}" given.`)}for(const t in e){const s=typeof e[t];if(s!=="string")if(Array.isArray(e[t]))e[t].forEach(r=>{if(typeof r!="string")throw new TypeError(`${t} must be a string or an array of strings. An array containing non-strings given.`)});else throw new TypeError(`${t} must be a string or an array of strings. "${s}" given.`);else{const r={};r[t]=e[t],p(r)}}return{status:!0,error:null}}catch(t){return{status:!1,error:t}}}function w(e,t){if(i("string",{tagName:e}).status&&d(HTMLElement,t).status){const s=e.toLowerCase();let r=!0;for(const n in t)t[n].tagName.toLowerCase()!==s&&(r=!1);return r}else return!1}function u(e,t){e===""||e.length===0||(typeof e=="string"?t.classList.add(e):t.classList.add(...e))}function c(e,t){e===""||e.length===0||(typeof e=="string"?t.classList.remove(e):t.classList.remove(...e))}function m(e){try{const t=e.key||e.keyCode,s={Enter:t==="Enter"||t===13,Space:t===" "||t==="Spacebar"||t===32,Escape:t==="Escape"||t==="Esc"||t===27,ArrowUp:t==="ArrowUp"||t==="Up"||t===38,ArrowRight:t==="ArrowRight"||t==="Right"||t===39,ArrowDown:t==="ArrowDown"||t==="Down"||t===40,ArrowLeft:t==="ArrowLeft"||t==="Left"||t===37,Home:t==="Home"||t===36,End:t==="End"||t===35,Tab:t==="Tab"||t===9};return Object.keys(s).find(r=>s[r]===!0)||""}catch{return""}}function f(e){e.preventDefault(),e.stopPropagation()}function b(e=null){window.Graupl=window.Graupl||{},i("string",{type:e})&&(window.Graupl[e]=window.Graupl[e]||{})}function E(e=null){return i("string",{type:e})?window.Graupl[e]:window.Graupl}function T(e,t={}){i("string",{type:e})&&i("object",{data:t})&&(window.Graupl[e]=t)}function I(e){i("string",{type:e})&&(window.Graupl[e]={})}function k(e,t,s){i("string",{type:e,key:t})&&(window.Graupl[e][t]=s)}function v(e,t){return i("string",{type:e,key:t})?window.Graupl[e][t]:null}function A(e,t){i("string",{type:e,key:t})&&delete window.Graupl[e][t]}const y={initializeStorage:b,getStorage:E,setStorage:T,clearStorage:I,pushToStorage:k,getFromStorage:v,removeFromStorage:A};class x{constructor({alertElement:t,controllerElement:s=null,showClass:r="show",hideClass:n="hide",transitionClass:l="transitioning",transitionTimer:_=150,isHidden:C=!1,key:o=null,initialize:g=!1}){a(this,"_dom",{alert:null,controller:null});a(this,"_hidden",!1);a(this,"_showClass","");a(this,"_hideClass","");a(this,"_transitionClass","");a(this,"_transitionTimer",150);a(this,"_key","");a(this,"_errors",[]);a(this,"_showEvent",new CustomEvent("grauplAlertShow",{bubbles:!0,detail:{alert:this}}));a(this,"_hideEvent",new CustomEvent("grauplAlertHide",{bubbles:!0,detail:{alert:this}}));this._dom.alert=t,this._dom.controller=s,this._showClass=r||"",this._hideClass=n||"",this._transitionClass=l||"",this._transitionTimer=_,this._hidden=C,this._key=o||"",g&&this.initialize()}initialize(){try{if(!this._validate())throw new Error(`Graupl Alert: cannot initialize alert. The following errors have been found:
2
+ - ${this.errors.join(`
3
+ - `)}`);this._generateKey(),this._setIds(),this._handleClick(),this._handleKeydown(),this._handleKeyup(),y.initializeStorage("alerts"),y.pushToStorage("alerts",this.dom.alert.id,this)}catch(t){console.error(t)}}get dom(){return this._dom}get showClass(){return this._showClass}get hideClass(){return this._hideClass}get transitionClass(){return this._transitionClass}get transitionTimer(){return this._transitionTimer}get key(){return this._key}set showClass(t){h({showClass:t}),this._showClass!==t&&(this._showClass=t)}set hideClass(t){h({hideClass:t}),this._hideClass!==t&&(this._hideClass=t)}set transitionClass(t){h({transitionClass:t}),this._transitionClass!==t&&(this._transitionClass=t)}set transitionTimer(t){i("number",{transitionTimer:t}),this._transitionTimer!==t&&(this._transitionTimer=t)}set key(t){i("string",{value:t}),this._key!==t&&(this._key=t)}_validate(){let t=!0,s;if(this._dom.controller!==null?s=d(HTMLElement,{alertElement:this._dom.alert,controllerElement:this._dom.controller}):s=d(HTMLElement,{alertElement:this._dom.alert}),s.status||(this._errors.push(s.message),t=!1),this._showClass!==""){const l=h({showClass:this._showClass});l.status||(this._errors.push(l.message),t=!1)}if(this._hideClass!==""){const l=h({hideClass:this._hideClass});l.status||(this._errors.push(l.message),t=!1)}if(this._transitionClass!==""){const l=h({transitionClass:this._transitionClass});l.status||(this._errors.push(l.message),t=!1)}const r=i("number",{transitionTimer:this._transitionTimer});r.status||(this._errors.push(r.message),t=!1);const n=i("boolean",{isHidden:this._hidden});return n.status||(this._errors.push(n.message),t=!1),t}_generateKey(t=!1){(this.key===""||t)&&(this.key=Math.random().toString(36).replace(/[^a-z]+/g,"").substring(0,10))}_setIds(){this.dom.alert.id=this.dom.alert.id||`alert-${this.key}`,this.dom.controller.id=this.dom.controller.id||`alert-controller-${this.key}`}show(t=!0){this._hidden&&(this.transitionClass!==""?(u(this.transitionClass,this.dom.alert),requestAnimationFrame(()=>{this.hideClass!==""&&c(this.hideClass,this.dom.alert),requestAnimationFrame(()=>{this.showClass!==""&&u(this.showClass,this.dom.alert),requestAnimationFrame(()=>{c(this.transitionClass,this.dom.alert)})})})):(this.showClass!==""&&u(this.showClass,this.dom.alert),this.hideClass!==""&&c(this.hideClass,this.dom.alert)),this._hidden=!1,t&&this.dom.alert.dispatchEvent(this._hideEvent))}hide(t=!0){this._hidden||(this.transitionClass!==""?(u(this.transitionClass,this.dom.alert),requestAnimationFrame(()=>{this.showClass!==""&&c(this.showClass,this.dom.alert),requestAnimationFrame(()=>{this.transitionTimer>0?setTimeout(()=>{this.hideClass!==""&&u(this.hideClass,this.dom.alert),requestAnimationFrame(()=>{c(this.transitionClass,this.dom.alert)})},this.transitionTimer):(this.hideClass!==""&&u(this.hideClass,this.dom.alert),requestAnimationFrame(()=>{c(this.transitionClass,this.dom.alert)}))})})):(this.hideClass!==""&&u(this.hideClass,this.dom.alert),this.showClass!==""&&c(this.showClass,this.dom.alert)),this._hidden=!0,t&&this.dom.alert.dispatchEvent(this._hideEvent))}_handleClick(){this.dom.controller!==null&&this.dom.controller.addEventListener("pointerup",()=>this.hide())}_handleKeydown(){this.dom.controller!==null&&this.dom.controller.addEventListener("keydown",t=>{const s=m(t);(s==="Space"||s==="Enter")&&f(t)})}_handleKeyup(){this.dom.controller!==null&&this.dom.controller.addEventListener("keyup",t=>{const s=m(t);(s==="Space"||s==="Enter")&&this.hide()})}}class D{constructor({carouselElement:t,carouselItemSelector:s=".carousel-item",carouselItemContainerSelector:r=".carousel-item-container",carouselControlSelector:n=".carousel-control",carouselControlContainerSelector:l=".carousel-control-container",carouselTabSelector:_=".carousel-tab",carouselTabContainerSelector:C=".carousel-tab-container",autoplaySelector:o=".autoplay",nextSelector:g=".next",previousSelector:S=".previous",activeClass:L="active",previousClass:$="previous",nextClass:M="next",playClass:G="play",pauseClass:F="pause",autoplay:O=!0,transitionDelay:q=1e4,transitionDuration:j=500,playText:K="Play",pauseText:z="Pause",prefix:H="graupl-",key:P=null,initialize:V=!1}){a(this,"_dom",{carousel:null,carouselItems:[],carouselItemContainer:null,carouselControls:[],carouselControlContainer:null,carouselTabs:[],carouselTabContainer:null,autoplay:null,next:null,previous:null});a(this,"_selectors",{carouselItems:"",carouselItemContainer:"",carouselControls:"",carouselControlContainer:"",carouselTabs:"",carouselTabContainer:"",autoplay:"",next:"",previous:""});a(this,"_activeClass","active");a(this,"_previousClass","previous");a(this,"_nextClass","next");a(this,"_playClass","play");a(this,"_pauseClass","pause");a(this,"_currentItem",0);a(this,"_autoplay",!0);a(this,"_transitionDelay",1e4);a(this,"_transitionDuration",500);a(this,"_playText","Play");a(this,"_pauseText","Pause");a(this,"_currentAction","next");a(this,"_autoplayInterval",null);a(this,"_prefix","graupl-");a(this,"_key","");a(this,"_errors",[]);this._dom.carousel=t,this._selectors.carouselItems=s,this._selectors.carouselItemContainer=r,this._selectors.carouselControls=n,this._selectors.carouselControlContainer=l,this._selectors.carouselTabs=_,this._selectors.carouselTabContainer=C,this._selectors.autoplay=o,this._selectors.next=g,this._selectors.previous=S,this._activeClass=L||"",this._previousClass=$||"",this._nextClass=M||"",this._playClass=G||"",this._pauseClass=F||"",this._autoplay=O,this._transitionDelay=q,this._transitionDuration=j,this._playText=K||"",this._pauseText=z||"",this._prefix=H||"",this._key=P||"",V&&this.initialize()}initialize(){try{if(!this._validate())throw new Error(`Graupl Carousel: cannot initialize carousel. The following errors have been found:
4
+ - ${this.errors.join(`
5
+ - `)}`);this._generateKey(),this._setDOMElements(),this._setIds(),this._setAriaAttributes(),this.activateFirstItem(),this._handleAutoplay(),this._handleFocus(),this._handleClick(),this._handleHover(),this._handleKeydown(),this._handleKeyup(),this._setTransitionDuration(),y.initializeStorage("carousels"),y.pushToStorage("carousels",this.dom.carousel.id,this)}catch(t){console.error(t)}}get dom(){return this._dom}get selectors(){return this._selectors}get activeClass(){return this._activeClass}get previousClass(){return this._previousClass}get nextClass(){return this._nextClass}get playClass(){return this._playClass}get pauseClass(){return this._pauseClass}get currentItem(){return this._currentItem}get currentCarouselItem(){return this.dom.carouselItems[this.currentItem]}get currentCarouselTab(){return this.dom.carouselTabs[this.currentItem]}get autoplay(){return this._autoplay}get transitionDelay(){return this._transitionDelay}get transitionDuration(){return this._transitionDuration}get playText(){return this._playText}get pauseText(){return this._pauseText}get prefix(){return this._prefix}get key(){return this._key}get currentAction(){return this._currentAction}get errors(){return this._errors}set currentItem(t){if(i("number",{value:t}),t===this.currentItem)return;t<0?this._currentItem=0:t>=this.dom.carouselItems.length?this._currentItem=this.dom.carouselItems.length-1:this._currentItem=t,this._dom.carousel.querySelectorAll(this.selectors.carouselTab)&&this.dom.carouselItems.forEach((r,n)=>{r.setAttribute("aria-selected",n===this._currentItem)})}set autoplay(t){i("boolean",{value:t}),this._autoplay!==t&&(this._autoplay=t)}set activeClass(t){h({activeClass:t}),this._activeClass!==t&&(this._activeClass=t)}set previousClass(t){h({previousClass:t}),this._previousClass!==t&&(this._previousClass=t)}set nextClass(t){h({nextClass:t}),this._nextClass!==t&&(this._nextClass=t)}set playClass(t){h({playClass:t}),this._playClass!==t&&(this._playClass=t)}set pauseClass(t){h({pauseClass:t}),this._pauseClass!==t&&(this._pauseClass=t)}set transitionDelay(t){i("number",{value:t}),t!==this.transitionDelay&&t>=0&&(this._currentItem=t)}set transitionDuration(t){i("number",{value:t}),this._transitionDuration!==t&&t>=0&&(this._transitionDuration=t,this._setTransitionDuration())}set playText(t){i("string",{value:t}),this._playText!==t&&(this._playText=t)}set pauseText(t){i("string",{value:t}),this._pauseText!==t&&(this._pauseText=t)}set prefix(t){i("string",{value:t}),this._prefix!==t&&(this._prefix=t)}set key(t){i("string",{value:t}),this._key!==t&&(this._key=t)}_validate(){let t=!0;const s=d(HTMLElement,{carousel:this.dom.carousel});s||(this._errors.push(s.message),t=!1);const r=p({carouselItemsSelector:this._selectors.carouselItems,carouselItemContainerSelector:this._selectors.carouselItemContainer,carouselControlsSelector:this._selectors.carouselControls,carouselControlContainerSelector:this._selectors.carouselControlContainer,carouselTabsSelector:this._selectors.carouselTabs,carouselTabContainerSelector:this._selectors.carouselTabContainer,autoplaySelector:this._selectors.autoplay,nextSelector:this._selectors.next,previousSelector:this._selectors.previous});r||(this._errors.push(r.message),t=!1);const n=i("boolean",{autoplay:this.autoplay});n||(this._errors.push(n.message),t=!1);const l=i("number",{transitionDelay:this._transitionDelay});l||(this._errors.push(l.message),t=!1);const _=i("number",{transitionDuration:this._transitionDuration});if(_||(this._errors.push(_.message),t=!1),this._activeClass!==""){const o=h({activeClass:this._activeClass});o||(this._errors.push(o.message),t=!1)}if(this._previousClass!==""){const o=h({previousClass:this._previousClass});o||(this._errors.push(o.message),t=!1)}if(this._nextClass!==""){const o=h({nextClass:this._nextClass});o||(this._errors.push(o.message),t=!1)}if(this._playClass!==""){const o=h({playClass:this._playClass});o||(this._errors.push(o.message),t=!1)}if(this._pauseClass!==""){const o=h({pauseClass:this._pauseClass});o||(this._errors.push(o.message),t=!1)}if(this._playText!==""){const o=i("string",{playText:this._playText});o||(this._errors.push(o.message),t=!1)}if(this._pauseText!==""){const o=i("string",{pauseText:this._pauseText});o||(this._errors.push(o.message),t=!1)}const C=i("string",{prefix:this._prefix});return C||(this._errors.push(C.message),t=!1),t}_setDOMElementType(t,s=this.dom.carousel,r=!0){if(typeof this.selectors[t]=="string"){if(t==="carousel")throw new Error(`Graupl Carousel: "${t}" element cannot be set through _setDOMElementType.`);if(s!==this.dom.carousel&&d(HTMLElement,{base:s}),Array.isArray(this._dom[t])){const l=Array.from(s.querySelectorAll(this.selectors[t])).filter(_=>_.parentElement===s);r?this._dom[t]=l:this._dom[t]=[...this._dom[t],...l]}else{const n=s.querySelector(this.selectors[t]);if(n&&n.parentElement!==s)return;r&&(this._dom[t]=n)}}else throw new Error(`Graupl Carousel: "${t}" is not a valid element type within the carousel.`)}_resetDOMElementType(t){if(typeof this.selectors[t]=="string"){if(t==="carousel")throw new Error(`Graupl Carousel: "${t}" element cannot be reset through _resetDOMElementType.`);Array.isArray(this._dom[t])?this._dom[t]=[]:this._dom[t]=null}else throw new Error(`Graupl Carousel: "${t}" is not a valid element type within the carousel.`)}_setDOMElements(){this._setDOMElementType("carouselItemContainer"),this._setDOMElementType("carouselControlContainer"),this._setDOMElementType("carouselTabContainer"),this.dom.carouselItemContainer&&this._setDOMElementType("carouselItems",this.dom.carouselItemContainer),this.dom.carouselControlContainer&&(this._setDOMElementType("carouselControls",this.dom.carouselControlContainer),this._setDOMElementType("autoplay",this.dom.carouselControlContainer),this._setDOMElementType("next",this.dom.carouselControlContainer),this._setDOMElementType("previous",this.dom.carouselControlContainer)),this._dom.carouselTabContainer&&this._setDOMElementType("carouselTabs",this.dom.carouselTabContainer)}_generateKey(t=!1){(this.key===""||t)&&(this.key=Math.random().toString(36).replace(/[^a-z]+/g,"").substring(0,10))}_setIds(){this.dom.carousel.id=this.dom.carousel.id||`carousel-${this.key}`,this.dom.carouselItems.forEach((t,s)=>{t.id=t.id||`carousel-item-${this.key}-${s}`}),this.dom.carouselTabs.forEach((t,s)=>{t.id=t.id||`carousel-tab-${this.key}-${s}`})}_setAriaAttributes(){!w("section",{carousel:this.dom.carousel})&&!this.dom.carousel.getAttribute("role")!=="region"&&this.dom.carousel.setAttribute("role","group"),this._dom.carousel.setAttribute("aria-roledescription","carousel"),this.dom.carouselTabContainer&&this.dom.carouselTabContainer.setAttribute("role","tablist"),this.dom.carouselTabs.forEach((t,s)=>{w("button",{tab:t})||t.setAttribute("role","button"),t.setAttribute("aria-selected",s===0),t.setAttribute("aria-controls",this.dom.carouselItems[s].id)})}_setInterval(){this._clearInterval(),this._autoplayInterval=setInterval(()=>{this.activateNextItem()},this.transitionDelay)}_clearInterval(){clearInterval(this._autoplayInterval)}_handleAutoplay(){this.autoplay?(u(this.pauseClass,this.dom.autoplay),c(this.playClass,this.dom.autoplay),this.dom.autoplay.setAttribute("aria-label",this.pauseText),this.dom.carousel.setAttribute("aria-live","off"),this._setInterval()):(u(this.playClass,this.dom.autoplay),c(this.pauseClass,this.dom.autoplay),this.dom.autoplay.setAttribute("aria-label",this.playText),this.dom.carousel.setAttribute("aria-live","polite"),this._clearInterval())}_handleFocus(){this.dom.carousel.addEventListener("focusin",()=>{this.autoplay&&this._clearInterval()}),this.dom.carousel.addEventListener("focusout",()=>{this.autoplay&&this._setInterval()})}_handleClick(){this.dom.next.addEventListener("pointerup",()=>{this.activateNextItem()}),this.dom.previous.addEventListener("pointerup",()=>{this.activatePreviousItem()}),this.dom.autoplay.addEventListener("pointerup",()=>{this.toggleAutoplay()}),this.dom.carouselTabs.forEach((t,s)=>{t.addEventListener("pointerup",()=>{this.currentItem>s?this._currentAction="previous":this._currentAction="next",this.activateItem(s)})})}_handleHover(){this.dom.carousel.addEventListener("pointerover",()=>{this.autoplay&&this._clearInterval()}),this.dom.carousel.addEventListener("pointerleave",()=>{this.autoplay&&this._setInterval()})}_handleKeydown(){this.dom.carouselControls.forEach(t=>{t.addEventListener("keydown",s=>{switch(m(s)){case"Space":case"Enter":f(s);break}})}),this.dom.carouselTabs.forEach(t=>{t.addEventListener("keydown",s=>{switch(m(s)){case"Space":case"Enter":f(s);break}})})}_handleKeyup(){this.dom.next.addEventListener("keyup",t=>{switch(m(t)){case"Space":case"Enter":this.activateNextItem(),f(t);break}}),this.dom.previous.addEventListener("keyup",t=>{switch(m(t)){case"Space":case"Enter":this.activatePreviousItem(),f(t);break}}),this.dom.autoplay.addEventListener("keyup",t=>{switch(m(t)){case"Space":case"Enter":this.toggleAutoplay(),f(t);break}}),this.dom.carouselTabs.forEach((t,s)=>{t.addEventListener("keyup",r=>{switch(m(r)){case"Space":case"Enter":this.activateItem(s),f(r);break}})})}_setTransitionDuration(){this.dom.carousel.style.setProperty(`--${this.prefix}carousel-transition-duration`,`${this.transitionDuration}ms`)}activateCurrentItem(){u(this.activeClass,this.currentCarouselItem),this.currentCarouselTab&&(this.currentCarouselTab.setAttribute("aria-selected",!0),u(this.activeClass,this.currentCarouselTab))}deactivateCurrentItem(){c(this.activeClass,this.currentCarouselItem),this.currentCarouselTab&&(this.currentCarouselTab.setAttribute("aria-selected",!1),c(this.activeClass,this.currentCarouselTab))}activateItem(t){const s=this.currentItem;this.dom.carousel.dataset.grauplAction=this._currentAction,this.autoplay&&this._clearInterval(),u(this.previousClass,this.currentCarouselItem),u(this.nextClass,this.dom.carouselItems[t]),requestAnimationFrame(()=>{this.deactivateCurrentItem(),this.currentItem=t,this.activateCurrentItem(),requestAnimationFrame(()=>{setTimeout(()=>{c(this.previousClass,this.dom.carouselItems[s]),c(this.nextClass,this.currentCarouselItem)},this.transitionDuration)})}),this.autoplay&&this._setInterval()}activateFirstItem(){this.activateItem(0)}activateLastItem(){this.activateItem(this.dom.carouselItems.length-1)}activateNextItem(){this._currentAction="next",this.currentItem+1>=this.dom.carouselItems.length?this.activateFirstItem():this.activateItem(this.currentItem+1)}activatePreviousItem(){this._currentAction="previous",this.currentItem-1<0?this.activateLastItem():this.activateItem(this.currentItem-1)}toggleAutoplay(){this.autoplay=!this.autoplay,this._handleAutoplay()}}return{Alert:x,Carousel:D}}();
package/index.html CHANGED
@@ -5,7 +5,7 @@
5
5
  <meta charset="UTF-8">
6
6
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
7
7
  <title>Document</title>
8
- <link rel="stylesheet" href="dist/graupl.css">
8
+ <link rel="stylesheet" href="dist/css/graupl.css">
9
9
  </head>
10
10
 
11
11
  <body>
@@ -734,6 +734,60 @@
734
734
  </div>
735
735
  </div>
736
736
  </div>
737
+ <div class="py-10 full-width container">
738
+ <h2>Accordions</h2>
739
+ <div class="accordion">
740
+ <div class="accordion-item show">
741
+ <div class="accordion-item-header">
742
+ <h3 class="accordion-item-title">
743
+ <button aria-expanded="true" class="accordion-item-toggle">Accordion 1</button>
744
+ </h3>
745
+ </div>
746
+ <div class="accordion-item-content">
747
+ <div class="accordion-item-body">
748
+ <p>This is the body of the accordion that can expand/collapse based on the state.</p>
749
+ </div>
750
+ <div class="accordion-item-footer">
751
+ <p>This is the footer.</p>
752
+ </div>
753
+ </div>
754
+ </div>
755
+ <div class="accordion-item hide">
756
+ <div class="accordion-item-header">
757
+ <h3 class="accordion-item-title">
758
+ <button aria-expanded="false" class="accordion-item-toggle">Accordion 2</button>
759
+ </h3>
760
+ </div>
761
+ <div class="accordion-item-content">
762
+ <div class="accordion-item-body">
763
+ <p>This is the body of the accordion that can expand/collapse based on the state.</p>
764
+ <p>This one has some extra text in it to make it longer.</p>
765
+ </div>
766
+ <div class="accordion-item-footer">
767
+ <p>This is the footer.</p>
768
+ <p>There is more info in the footer too.</p>
769
+ </div>
770
+ </div>
771
+ </div>
772
+ <div class="accordion-item hide">
773
+ <div class="accordion-item-header">
774
+ <h3 class="accordion-item-title">
775
+ <button aria-expanded="false" class="accordion-item-toggle">Accordion 3</button>
776
+ </h3>
777
+ </div>
778
+ <div class="accordion-item-content">
779
+ <div class="accordion-item-body">
780
+ <p>This is the body of the accordion that can expand/collapse based on the state.</p>
781
+ <p>This one is even longer than the second one. Why? Because it needs to be. That's why.</p>
782
+ <p>It's also a bit more verbose than the other two.</p>
783
+ <p>But that's okay. It's just an example.</p>
784
+ </div>
785
+ <div class="accordion-item-footer">
786
+ <p>This is the footer.</p>
787
+ </div>
788
+ </div>
789
+ </div>
790
+ </div>
737
791
  <div class="full-width container min-h-full-screen align-content-center">
738
792
  <h2>Carousels</h2>
739
793
  <section class="carousel">
@@ -770,8 +824,8 @@
770
824
  </div>
771
825
  </main>
772
826
  <script src="https://cdn.jsdelivr.net/npm/accessible-menu/dist/disclosure-menu.iife.js"></script>
773
- <script src="src/js/navigation.js"></script>
774
827
  <script type="module" src="src/js/alert/index.js"></script>
828
+ <script type="module" src="src/js/accordion/index.js"></script>
775
829
  <script type="module" src="src/js/carousel/index.js"></script>
776
830
  <script>
777
831
  const preferredTheme = window.matchMedia('(prefers-color-scheme: dark)').matches ? 'dark' : 'light';
package/index.js ADDED
@@ -0,0 +1,12 @@
1
+ import Carousel from "./src/carousel/Carousel.js";
2
+ import Alert from "./src/alert/Alert.js";
3
+
4
+ const carousel = Carousel;
5
+ const alert = Alert;
6
+
7
+ export { carousel as Carousel };
8
+ export { alert as Alert };
9
+ export default {
10
+ Carousel,
11
+ Alert,
12
+ };
package/package.json CHANGED
@@ -1,17 +1,31 @@
1
1
  {
2
2
  "name": "@graupl/graupl",
3
- "version": "1.0.0-alpha.15",
3
+ "version": "1.0.0-alpha.16",
4
4
  "description": "A modular and modern CSS framework.",
5
5
  "type": "module",
6
6
  "exports": {
7
7
  ".": {
8
- "sass": "./scss/graupl.scss"
8
+ "sass": "./scss/graupl.scss",
9
+ "import": "./dist/js/graupl.es.js",
10
+ "require": "./dist/js/graupl.cjs.js"
9
11
  },
10
12
  "./*.scss": {
11
13
  "sass": "./scss/*.scss"
12
14
  },
13
15
  "./src/*.scss": {
14
16
  "sass": "./src/scss/*.scss"
17
+ },
18
+ "./accordion": {
19
+ "import": "./dist/js/component/accordion.es.js",
20
+ "require": "./dist/js/component/accordion.cjs.js"
21
+ },
22
+ "./alert": {
23
+ "import": "./dist/js/component/alert.es.js",
24
+ "require": "./dist/js/component/alert.cjs.js"
25
+ },
26
+ "./carousel": {
27
+ "import": "./dist/js/component/carousel.es.js",
28
+ "require": "./dist/carousel.cjs.js"
15
29
  }
16
30
  },
17
31
  "scripts": {
@@ -21,9 +35,14 @@
21
35
  "prettier": "prettier '**/*.{js,mjs,cjs,scss,sass}'",
22
36
  "stylelint": "stylelint '**/*.scss' --allow-empty-input",
23
37
  "lint": "npm run eslint -- --fix && npm run stylelint -- --fix && npm run prettier -- --write",
24
- "sass": "rm -rf dist && sass scss:dist",
25
- "postcss": "postcss 'dist/**/*.css' --replace",
26
- "build": "npm run sass && npm run postcss",
38
+ "sass": "rm -rf dist/css/* && sass scss:dist/css",
39
+ "postcss": "postcss 'dist/css/**/*.css' --replace",
40
+ "build": "npm-run-all build:*",
41
+ "build:css": "npm run sass && npm run postcss",
42
+ "build:js": "BUILD_TYPE=default vite build",
43
+ "build:accordion": "BUILD_TYPE=Accordion vite build",
44
+ "build:alert": "BUILD_TYPE=Alert vite build",
45
+ "build:carousel": "BUILD_TYPE=Carousel vite build",
27
46
  "postbuild": "npm run docs:build",
28
47
  "release": "git add dist/. && standard-version -a",
29
48
  "prerelease": "npm run lint && npm run build",
@@ -46,6 +65,7 @@
46
65
  "@commitlint/config-conventional": "^19.1.0",
47
66
  "@eslint/js": "^9.0.0",
48
67
  "autoprefixer": "^10.4.19",
68
+ "chokidar-cli": "^3.0.0",
49
69
  "commitizen": "^4.3.0",
50
70
  "cssnano": "^7.0.1",
51
71
  "cz-conventional-changelog": "^3.3.0",
@@ -56,6 +76,7 @@
56
76
  "husky": "^9.0.11",
57
77
  "lint-staged": "^15.2.2",
58
78
  "normalize.css": "^8.0.1",
79
+ "npm-run-all": "^4.1.5",
59
80
  "postcss": "^8.4.38",
60
81
  "postcss-cli": "^11.0.0",
61
82
  "postcss-discard-comments": "^7.0.0",
@@ -0,0 +1,3 @@
1
+ // @graupl/graupl accordion component.
2
+
3
+ @forward "../../src/scss/component/accordion";