@dcrackel/hematournamentui 1.0.0

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 (43) hide show
  1. package/.storybook/main.js +17 -0
  2. package/.storybook/preview-head.html +1 -0
  3. package/.storybook/preview.js +17 -0
  4. package/HemaTournamentUI/.gitattributes +2 -0
  5. package/HemaTournamentUI/LICENSE +21 -0
  6. package/README.md +83 -0
  7. package/dist/my-library.es.js +723 -0
  8. package/dist/my-library.umd.js +1 -0
  9. package/index.html +12 -0
  10. package/package.json +42 -0
  11. package/postcss.config.js +6 -0
  12. package/src/assets/default-tournament.png +0 -0
  13. package/src/index.js +15 -0
  14. package/src/main.js +2 -0
  15. package/src/mocks/fileMock.js +1 -0
  16. package/src/mocks/tournamentMock.js +34 -0
  17. package/src/stories/Base/Button/BaseButton.stories.js +69 -0
  18. package/src/stories/Base/Button/BaseButton.vue +141 -0
  19. package/src/stories/Base/Input/BaseInput.stories.js +28 -0
  20. package/src/stories/Base/Input/BaseInput.vue +44 -0
  21. package/src/stories/Base/Tag/BaseTag.stories.js +29 -0
  22. package/src/stories/Base/Tag/BaseTag.vue +57 -0
  23. package/src/stories/Base/Text/BaseText.stories.js +77 -0
  24. package/src/stories/Base/Text/BaseText.vue +162 -0
  25. package/src/stories/Cards/TournamentCard/Detail/TournamentCardDetail.stories.js +33 -0
  26. package/src/stories/Cards/TournamentCard/Detail/TournamentCardDetail.vue +38 -0
  27. package/src/stories/Cards/TournamentCard/Header/TournamentCardHeader.stories.js +48 -0
  28. package/src/stories/Cards/TournamentCard/Header/TournamentCardHeader.vue +40 -0
  29. package/src/stories/Cards/TournamentCard/TournamentCard.stories.js +37 -0
  30. package/src/stories/Cards/TournamentCard/TournamentCard.vue +35 -0
  31. package/src/stories/Configure.mdx +320 -0
  32. package/src/stories/Containers/Grid/GridContainer.stories.js +27 -0
  33. package/src/stories/Containers/Grid/GridContainer.vue +36 -0
  34. package/src/stories/Filters/FilterAndSortBar/FilterAndSortBar.stories.js +36 -0
  35. package/src/stories/Filters/FilterAndSortBar/FilterAndSortBar.vue +39 -0
  36. package/src/stories/Menu/Admin/AdminLeftMenu.stories.js +23 -0
  37. package/src/stories/Menu/Admin/AdminLeftMenu.vue +57 -0
  38. package/src/stories/Menu/DropDown/DropDownMenu.stories.js +34 -0
  39. package/src/stories/Menu/DropDown/DropDownMenu.vue +49 -0
  40. package/tailwind/output.css +1047 -0
  41. package/tailwind/tailwind.css +4 -0
  42. package/tailwind.config.js +25 -0
  43. package/vite.config.js +20 -0
@@ -0,0 +1 @@
1
+ (function(c,e){typeof exports=="object"&&typeof module<"u"?e(exports,require("vue")):typeof define=="function"&&define.amd?define(["exports","vue"],e):(c=typeof globalThis<"u"?globalThis:c||self,e(c.MyLibrary={},c.Vue))})(this,function(c,e){"use strict";const d=(r,t)=>{const n=r.__vccOpts||r;for(const[l,i]of t)n[l]=i;return n},k={name:"BaseInput",props:{placeholder:{type:String,default:""},value:{type:String,default:""}},data(){return{internalValue:this.value,timeout:null}},watch:{value(r){this.internalValue=r}},methods:{onInput(){clearTimeout(this.timeout),this.timeout=setTimeout(()=>{this.$emit("update:value",this.internalValue)},300)}}},b=["placeholder"];function f(r,t,n,l,i,s){return e.withDirectives((e.openBlock(),e.createElementBlock("input",{class:"appearance-none focus:outline-none w-full",placeholder:n.placeholder,"onUpdate:modelValue":t[0]||(t[0]=a=>i.internalValue=a),onInput:t[1]||(t[1]=(...a)=>s.onInput&&s.onInput(...a))},null,40,b)),[[e.vModelText,i.internalValue]])}const g=d(k,[["render",f]]),C={name:"BaseText",props:{text:{type:String,required:!0},weight:{type:String,default:"normal",validator:function(r){return["light","normal","medium","semi-bold","bold","extra-bold"].indexOf(r)!==-1}},size:{type:String,default:"small",validator:function(r){return["xs","small","medium","large","xl","2xl","3xl"].indexOf(r)!==-1}},color:{type:String,default:"primary",validator:function(r){return["neutral","quaternary","tertiary","secondary","primary","bright"].indexOf(r)!==-1}},hoverColor:{type:String,default:"none",validator:function(r){return["primary","secondary","tertiary","quaternary","neutral","bright","none"].indexOf(r)!==-1}}},setup(r){return r=e.reactive(r),{classes:e.computed(()=>{let t="inline-block font-sans";switch(r.color){case"neutral":t+=" text-neutral";break;case"tertiary":t+=" text-tertiary";break;case"secondary":t+=" text-secondary";break;case"quaternary":t+=" text-quaternary";break;case"primary":t+=" text-primary";break;case"bright":t+=" text-bright";break}switch(r.hoverColor){case"neutral":t+=" hover:text-neutral";break;case"tertiary":t+=" hover:text-tertiary";break;case"secondary":t+=" hover:text-secondary";break;case"quaternary":t+=" hover:text-quaternary";break;case"primary":t+=" hover:text-primary";break;case"bright":t+=" hover:text-bright";break;case"none":t+="";break}switch(r.weight){case"light":t+=" font-light";break;case"normal":t+=" font-normal";break;case"medium":t+=" font-medium";break;case"semi-bold":t+=" font-semibold";break;case"bold":t+=" font-bold";break;case"extra-bold":t+=" font-extrabold";break;default:t+=" font-normal";break}switch(r.size){case"xs":t+=" text-xs";break;case"small":t+=" text-sm";break;case"medium":t+=" text-md";break;case"large":t+=" text-lg";break;case"xl":t+=" text-xl";break;case"2xl":t+=" text-2xl";break;case"3xl":t+=" text-3xl";break;default:t+=" text-sm";break}return t})}}};function w(r,t,n,l,i,s){return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(l.classes)},e.toDisplayString(n.text),3)}const m=d(C,[["render",w]]),_={name:"base-button",components:{DefaultText:m},props:{label:{type:String,required:!0},iconClass:{type:String,default:null},size:{type:String,validator:function(r){return["xs","small","medium","large","xl"].indexOf(r)!==-1}},type:{type:String,default:"primary",validator:function(r){return["primary","secondary","tertiary","bright","admin","adminSecondary"].indexOf(r)!==-1}}},emits:["click"],setup(r,{emit:t}){return r=e.reactive(r),{textColor:e.computed(()=>{switch(r.type){case"primary":return"text-primary";case"secondary":return"text-secondary";case"tertiary":return"text-tertiary";case"bright":return"text-bright";case"admin":return"text-neutral";case"adminSecondary":return"text-secondary";default:return"text-primary"}}),hoverClass:e.computed(()=>{switch(r.type){case"admin":return"hover:text-secondary";case"adminSecondary":return"hover:text-tertiary";default:return""}}),hoverColor:e.computed(()=>{switch(r.type){case"admin":return"text-secondary";case"adminSecondary":return"text-tertiary";default:return null}}),classes:e.computed(()=>{let n="py-2 px-2.5 mx-2 inline-flex ";switch(r.type){case"primary":n+=" items-center gap-2.5 rounded-md text-center shadow border border-skeleton justify-center bg-neutral hover:bg-tertiary";break;case"secondary":n+=" items-center gap-2.5 rounded-md text-center shadow bg-secondary justify-center hover:bg-primary text-neutral";break;case"tertiary":n+=" items-center gap-2.5 rounded-md text-center justify-center bg-tertiary hover:bg-primary text-primary";break;case"bright":n+=" items-center gap-2.5 rounded-md text-center justify-center bg-bright hover:bg-primary text-neutral";break;case"admin":n+=" items-center rounded-md gap-2.5 text-center bg-primary hover:bg-primary my-1 text-neutral hover:bg-primaryHighlight";break;case"adminSecondary":n+=" items-center gap-2.5 text-center my-1 border-b border-secondary hover:border-b hover:border-neutral w-11/12 text-neutral";break}switch(r.size){case"xs":n+=" text-xs";break;case"small":n+=" text-sm";break;case"medium":n+=" text-md";break;case"large":n+=" text-lg";break;case"xl":n+=" text-xl";break;default:n+="";break}return n}),onClick(){console.log("Click!"),t("click")}}}};function E(r,t,n,l,i,s){const a=e.resolveComponent("DefaultText");return e.openBlock(),e.createElementBlock("button",{class:e.normalizeClass(l.classes),type:"button",onClick:t[0]||(t[0]=(...o)=>l.onClick&&l.onClick(...o))},[n.iconClass?(e.openBlock(),e.createElementBlock("i",{key:0,class:e.normalizeClass([n.iconClass,"mr-2 hover:text-highlightedClass"])},null,2)):e.createCommentVNode("",!0),e.createVNode(a,{color:l.textColor,size:n.size,text:n.label,weight:"normal"},null,8,["color","size","text"])],2)}const A=d(_,[["render",E]]),Q={name:"base-tag",props:{label:{type:String,required:!0},backgroundColor:{type:String,validator:function(r){return["primary","secondary","tertiary","neutral","bright"].indexOf(r)!==-1}}},setup(r){return r=e.reactive(r),{classes:e.computed(()=>{let t="cursor-pointer inline-block py-1 px-3 my-2 ml-3 text-xs font-normal rounded-full text-neutral";switch(r.backgroundColor){case"primary":t+=" bg-primary";break;case"secondary":t+=" bg-secondary";break;case"tertiary":t+=" bg-tertiary";break;case"neutral":t+=" bg-neutral";break;case"bright":t+=" bg-bright";break;default:t+=" bg-primary";break}return t})}}};function I(r,t,n,l,i,s){return e.openBlock(),e.createElementBlock("div",{class:e.normalizeClass(l.classes)},e.toDisplayString(n.label),3)}const B=d(Q,[["render",I]]),y="data:image/png;base64,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",D={name:"tournament-card-header",components:{BaseTag:B},props:{artwork:{type:String,required:!0,default:y},tags:{type:Array,default:()=>[]}},computed:{backgroundStyle(){return`background-image: url('${this.artwork||y}');`}}},V={class:"rounded-t-xl w-full"},Y={class:"flex flex-row"};function M(r,t,n,l,i,s){const a=e.resolveComponent("BaseTag");return e.openBlock(),e.createElementBlock("div",V,[e.createElementVNode("div",{style:e.normalizeStyle(s.backgroundStyle),class:"h-36 w-full flex flex-col justify-end rounded-t-xl bg-cover bg-no-repeat bg-center"},[e.createElementVNode("div",Y,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.tags,o=>(e.openBlock(),e.createBlock(a,{key:o,label:o},null,8,["label"]))),128))])],4)])}const u=d(D,[["render",M]]),G={name:"tournament-card-details",components:{BaseButton:A,BaseText:m},props:{detail:{type:Object,required:!0,default:()=>({name:"",date:"",closes:"",location:""})}}},S={class:"flex flex-col w-full pt-4 pb-3 px-3"},q={class:"mt-4 flex flex-col"},U={class:"flex flex-row w-full justify-end"};function N(r,t,n,l,i,s){const a=e.resolveComponent("BaseText"),o=e.resolveComponent("BaseButton");return e.openBlock(),e.createElementBlock("div",S,[e.createVNode(a,{text:n.detail.name,color:"textPrimary",size:"xl",weight:"semi-bold"},null,8,["text"]),e.createVNode(a,{text:n.detail.location,color:"textPrimary",size:"small",weight:"normal"},null,8,["text"]),e.createElementVNode("div",q,[e.createVNode(a,{text:`${n.detail.date}`,color:"textPrimary",size:"small",weight:"light"},null,8,["text"]),e.createVNode(a,{text:`${n.detail.closes}`,color:"textPrimary",size:"small",weight:"light"},null,8,["text"])]),e.createElementVNode("div",U,[e.createVNode(o,{label:"Edit",class:"mt-2",primary:""})])])}const p=d(G,[["render",N]]),$={name:"TournamentCard",components:{TournamentHeader:u,TournamentDetail:p},props:{detail:{type:Object,required:!0,default:()=>({artwork:"",tags:[],name:"",description:"",date:"",closes:"",location:""})}}},T={class:"rounded-xl w-72 shadow"};function W(r,t,n,l,i,s){const a=e.resolveComponent("TournamentHeader"),o=e.resolveComponent("TournamentDetail");return e.openBlock(),e.createElementBlock("div",T,[e.createVNode(a,{artwork:n.detail.artwork,tags:n.detail.tags},null,8,["artwork","tags"]),e.createVNode(o,{detail:n.detail},null,8,["detail"])])}const x=d($,[["render",W]]),K={name:"GridContainer",components:{BaseText:m,TournamentCard:x},props:{items:{type:Array,default:()=>[]},component:{type:String,required:!0}}},H={class:"border border-cloudy rounded-lg p-9 bg-white"},P={class:"w-full text-center mb-9"},J={class:"grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 2xl:grid-cols-4 gap-6 w-full"};function j(r,t,n,l,i,s){const a=e.resolveComponent("BaseText");return e.openBlock(),e.createElementBlock("div",H,[e.createElementVNode("h1",P,[e.createVNode(a,{color:"primary",size:"2xl",text:"Upcoming Tournaments",weight:"normal"})]),e.createElementVNode("div",J,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.items,o=>(e.openBlock(),e.createElementBlock("div",{key:o.id},[(e.openBlock(),e.createBlock(e.resolveDynamicComponent(n.component),{detail:o},null,8,["detail"]))]))),128))])])}const z=d(K,[["render",j]]),F={name:"DropDownMenu",components:{BaseText:m},props:{label:{type:String},items:{type:Array},selectedItem:null},data:()=>({isDropDownOpen:!1}),methods:{handleClick(r){this.isDropDownOpen=!1,console.log(`menu item clicked ${r}`)},handleDropDown(){this.isDropDownOpen=!this.isDropDownOpen}}},L={class:"flex flex-row"},O={class:"mr-2 pt-1"},Z=e.createElementVNode("i",{class:"fa-solid fa-chevron-down text-xs"},null,-1),R={key:0,class:"flex flex-col w-32 shadow mt-2 z-10 rounded-xl py-1 absolute"},X=["onClick"];function v(r,t,n,l,i,s){const a=e.resolveComponent("BaseText");return e.openBlock(),e.createElementBlock("div",L,[e.createElementVNode("span",O,[e.createVNode(a,{text:n.label,color:"quaternary",size:"small",weight:"normal"},null,8,["text"])]),e.createElementVNode("span",null,[e.createElementVNode("div",{class:"z-10 rounded-lg shadow px-2 py-2 w-32 flex flex-row justify-between",onClick:t[0]||(t[0]=o=>s.handleDropDown())},[e.createVNode(a,{text:n.selectedItem.text,color:"secondary",size:"xs",weight:"normal"},null,8,["text"]),Z]),r.isDropDownOpen?(e.openBlock(),e.createElementBlock("div",R,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.items,o=>(e.openBlock(),e.createElementBlock("a",{key:o.id,onClick:Be=>s.handleClick(o),class:"hover:bg-dropdownSelect py-1 px-2 border-b border-dropdownSelect last:border-0"},[e.createVNode(a,{text:o.text,color:"primary",size:"xs",weight:"normal"},null,8,["text"])],8,X))),128))])):e.createCommentVNode("",!0)])])}const h=d(F,[["render",v]]),ee={name:"FilterAndSortBar",components:{DropDownMenu:h,BaseInput:g},props:{label:{type:String},items:{type:Array,default:()=>[]},selectedItem:null},methods:{handleButtonClick(r){this.$emit("button-click",r)}}},te={class:"flex flex-row w-full justify-between"},re={class:"rounded-lg shadow px-2 py-1 w-1/2 flex flex-row mt-0.5"},ne=e.createElementVNode("i",{class:"fa-solid fa-magnifying-glass text-primaryHighlight w-6 mt-1"},null,-1);function ae(r,t,n,l,i,s){const a=e.resolveComponent("BaseInput"),o=e.resolveComponent("DropDownMenu");return e.openBlock(),e.createElementBlock("section",te,[e.createElementVNode("div",re,[ne,e.createVNode(a,{placeholder:"Search on Name, Location, or Date",class:"text-quaternary"})]),e.createElementVNode("div",null,[e.createVNode(o,{label:n.label,items:n.items,selectedItem:n.selectedItem},null,8,["label","items","selectedItem"])])])}const oe=d(ee,[["render",ae]]),le={name:"AdminLeftMenu",components:{BaseButton:A},props:{buttons:{type:Array,default:()=>[]}},methods:{handleButtonClick(r){this.$emit("button-click",r)}}},se={class:"bg-backgroundSecondary w-64 h-screen flex flex-col justify-between bg-secondary"},ce=e.createElementVNode("section",{class:"h-28 border-b-2 border-borderPrimary"},[e.createElementVNode("div",{class:"flex flex-col justify-center h-28"},[e.createElementVNode("div",{class:"ml-8"},[e.createElementVNode("img",{class:"w-32",src:"https://ferrotas.com/assets/ferrotas-white-small-720502db.png"})])])],-1),ie={class:"flex flex-col p-2 h-full"},de={class:"flex flex-col justify-end p-2 h-full"},me={class:"border-t-2 border-borderPrimary pt-2"};function Ae(r,t,n,l,i,s){const a=e.resolveComponent("BaseButton");return e.openBlock(),e.createElementBlock("div",se,[ce,e.createElementVNode("section",ie,[(e.openBlock(!0),e.createElementBlock(e.Fragment,null,e.renderList(n.buttons,o=>(e.openBlock(),e.createBlock(a,{label:o.label,iconClass:"fa-solid fa-trophy text-white",type:"admin",hover:"admin",onClick:Be=>s.handleButtonClick(o)},null,8,["label","onClick"]))),256))]),e.createElementVNode("section",de,[e.createElementVNode("div",me,[e.createVNode(a,{iconClass:"fa-solid fa-circle-user text-textSecondary",label:"Account",type:"adminSecondary",onClick:t[0]||(t[0]=o=>s.handleButtonClick(r.button))}),e.createVNode(a,{iconClass:"fa-solid fa-right-to-bracket fa-rotate-180 text-textSecondary",label:"Log Out",type:"adminSecondary",onClick:t[1]||(t[1]=o=>s.handleButtonClick(r.button))})])])])}const ge=d(le,[["render",Ae]]);c.AdminLeftMenu=ge,c.BaseButton=A,c.BaseInput=g,c.BaseTag=B,c.BaseText=m,c.DropDownMenu=h,c.FilterAndSortBar=oe,c.GridContainer=z,c.TournamentCard=x,c.TournamentCardDetails=p,c.TournamentCardHeader=u,Object.defineProperty(c,Symbol.toStringTag,{value:"Module"})});
package/index.html ADDED
@@ -0,0 +1,12 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>StoryBookLib</title>
7
+ </head>
8
+ <body>
9
+ <div id="app"></div>
10
+ <script type="module" src="/src/main.js"></script>
11
+ </body>
12
+ </html>
package/package.json ADDED
@@ -0,0 +1,42 @@
1
+ {
2
+ "name": "@dcrackel/hematournamentui",
3
+ "private": false,
4
+ "version": "1.0.0",
5
+ "type": "module",
6
+ "main": "dist/my-library.umd.js",
7
+ "module": "dist/my-library.es.js",
8
+ "scripts": {
9
+ "dev": "vite",
10
+ "build": "vite build",
11
+ "preview": "vite preview",
12
+ "build-storybook": "npm run build:tailwind && storybook build",
13
+ "build:tailwind": "tailwindcss build ./tailwind/tailwind.css -o ./tailwind/output.css",
14
+ "storybook": "concurrently \"npm run watch:tailwind\" \"npm run watch:storybook\"",
15
+ "watch:storybook": "storybook dev -p 6006",
16
+ "watch:tailwind": "tailwindcss build ./tailwind/tailwind.css -o ./tailwind/output.css --watch"
17
+ },
18
+ "dependencies": {
19
+ "concurrently": "^8.2.1",
20
+ "font-awesome": "^4.7.0",
21
+ "vue": "^3.3.4"
22
+ },
23
+ "devDependencies": {
24
+ "@storybook/addon-docs": "^7.4.5",
25
+ "@storybook/addon-essentials": "^7.4.5",
26
+ "@storybook/addon-interactions": "^7.4.5",
27
+ "@storybook/addon-links": "^7.4.5",
28
+ "@storybook/blocks": "^7.4.5",
29
+ "@storybook/testing-library": "^0.2.1",
30
+ "@storybook/vue3": "^7.4.5",
31
+ "@storybook/vue3-vite": "^7.4.5",
32
+ "@vitejs/plugin-vue": "^4.2.3",
33
+ "autoprefixer": "^10.4.16",
34
+ "postcss": "^8.4.30",
35
+ "postcss-cli": "^10.1.0",
36
+ "react": "^18.2.0",
37
+ "react-dom": "^18.2.0",
38
+ "storybook": "^7.4.5",
39
+ "tailwindcss": "^3.3.3",
40
+ "vite": "^4.4.5"
41
+ }
42
+ }
@@ -0,0 +1,6 @@
1
+ export default {
2
+ plugins: {
3
+ tailwindcss: {},
4
+ autoprefixer: {},
5
+ },
6
+ }
package/src/index.js ADDED
@@ -0,0 +1,15 @@
1
+ export { default as BaseInput } from './stories/Base/Input/BaseInput.vue';
2
+ export { default as BaseButton } from './stories/Base/Button/BaseButton.vue';
3
+ export { default as BaseTag } from './stories/Base/Tag/BaseTag.vue';
4
+ export { default as BaseText } from './stories/Base/Text/BaseText.vue';
5
+
6
+ export { default as TournamentCard } from './stories/Cards/TournamentCard/TournamentCard.vue';
7
+ export { default as TournamentCardDetails } from './stories/Cards/TournamentCard/Detail/TournamentCardDetail.vue';
8
+ export { default as TournamentCardHeader } from './stories/Cards/TournamentCard/Header/TournamentCardHeader.vue';
9
+
10
+ export { default as GridContainer } from './stories/Containers/Grid/GridContainer.vue';
11
+
12
+ export { default as FilterAndSortBar } from './stories/Filters/FilterAndSortBar/FilterAndSortBar.vue';
13
+ export { default as AdminLeftMenu } from './stories/Menu/Admin/AdminLeftMenu.vue';
14
+ export { default as DropDownMenu } from './stories/Menu/DropDown/DropDownMenu.vue';
15
+
package/src/main.js ADDED
@@ -0,0 +1,2 @@
1
+ import '../tailwind/output.css'
2
+
@@ -0,0 +1 @@
1
+ module.exports = 'test-file-stub';
@@ -0,0 +1,34 @@
1
+ const mockTournaments = [
2
+ {
3
+ id: 1,
4
+ artwork: 'https://node.ferrotas.com:5000/uploads/t-450.png',
5
+ tags: ['Tag1', 'Tag2'],
6
+ name: 'Summer Slam 2023',
7
+ description: 'Join us for the hottest tournament this summer!',
8
+ date: '15 June 2023',
9
+ closes: 'Status Line',
10
+ location: 'Beachside Arena, Miami, FL'
11
+ },
12
+ {
13
+ id: 2,
14
+ artwork: 'https://node.ferrotas.com:5000/uploads/t-196.png',
15
+ tags: ['Tag3', 'Tag4', 'Tag5'],
16
+ name: 'Winter Showdown 2023',
17
+ description: 'Cold weather, hot competition!',
18
+ date: '10 December 2023',
19
+ closes: 'Registration Closes 1 December 2023',
20
+ location: 'Snowy Mountain Stadium, Denver, CO'
21
+ },
22
+ {
23
+ id: 3,
24
+ artwork: 'https://usahema.org/img/tournaments/usahema-tournament-45.jpg',
25
+ tags: ['Tag6'],
26
+ name: 'Autumn Cup 2023',
27
+ description: 'Celebrate fall with intense matches!',
28
+ date: '20 October 2023',
29
+ closes: 'Registration Closes 18th October 2023',
30
+ location: 'Forest Field, Portland, OR'
31
+ }
32
+ ];
33
+
34
+ export default mockTournaments;
@@ -0,0 +1,69 @@
1
+ import BaseButton from './BaseButton.vue';
2
+
3
+ export default {
4
+ title: 'Base/BaseButton',
5
+ component: BaseButton,
6
+ tags: ['autodocs'],
7
+ argTypes: {
8
+ onClick: {},
9
+ size: {
10
+ control: {
11
+ type: 'select'
12
+ },
13
+ options: ['small', 'medium', 'large']
14
+ },
15
+ iconClass: {
16
+ control: {
17
+ type: 'text'
18
+ },
19
+ defaultValue: ''
20
+ },
21
+ type: {
22
+ control: {
23
+ type: 'select'
24
+ },
25
+ options: ['primary', 'secondary', 'tertiary', 'bright', 'admin']
26
+ }
27
+ }
28
+ };
29
+ export const Primary = {
30
+ args: {
31
+ type: 'primary',
32
+ label: 'Button'
33
+ }
34
+ };
35
+ export const PrimaryButtonWithIcon = {
36
+ args: {
37
+ type: 'primary',
38
+ label: 'Button',
39
+ iconClass: 'fas fa-check'
40
+ }
41
+ };
42
+ export const Secondary = {
43
+ args: {
44
+ label: 'Button'
45
+ }
46
+ };
47
+ export const HighlightedButton = {
48
+ args: {
49
+ type: 'bright',
50
+ size: 'large',
51
+ label: 'Button'
52
+ }
53
+ };
54
+ export const SmallTertiary = {
55
+ args: {
56
+ type: 'tertiary',
57
+ size: 'small',
58
+ label: 'Button'
59
+ }
60
+ };
61
+
62
+ export const AdminMunuButton = {
63
+ args: {
64
+ type: 'admin',
65
+ size: 'small',
66
+ label: 'Admin Button',
67
+ hoverColor: 'highlightPrimary'
68
+ }
69
+ };
@@ -0,0 +1,141 @@
1
+ <template>
2
+ <button :class="classes" type="button" @click="onClick">
3
+ <i v-if="iconClass" :class="iconClass" class="mr-2 hover:text-highlightedClass"></i>
4
+ <DefaultText :color="textColor" :size="size" :text="label" weight="normal" />
5
+ </button>
6
+ </template>
7
+
8
+ <script>
9
+ import { computed, reactive } from 'vue';
10
+ import DefaultText from '../Text/BaseText.vue';
11
+
12
+ export default {
13
+ name: 'base-button',
14
+ components: { DefaultText },
15
+ props: {
16
+ label: {
17
+ type: String,
18
+ required: true
19
+ },
20
+ iconClass: {
21
+ type: String,
22
+ default: null
23
+ },
24
+ size: {
25
+ type: String,
26
+ validator: function (value) {
27
+ return ['xs', 'small', 'medium', 'large', 'xl'].indexOf(value) !== -1;
28
+ }
29
+ },
30
+ type: {
31
+ type: String,
32
+ default: 'primary',
33
+ validator: function (value) {
34
+ return ['primary', 'secondary', 'tertiary', 'bright', 'admin', 'adminSecondary'].indexOf(value) !== -1;
35
+ }
36
+ }
37
+ },
38
+ emits: ['click'],
39
+
40
+ setup(props, { emit }) {
41
+ props = reactive(props);
42
+ return {
43
+ textColor: computed(() => {
44
+ switch (props.type) {
45
+ case 'primary':
46
+ return 'text-primary';
47
+ case 'secondary':
48
+ return 'text-secondary';
49
+ case 'tertiary':
50
+ return 'text-tertiary';
51
+ case 'bright':
52
+ return 'text-bright';
53
+ case 'admin':
54
+ return 'text-neutral';
55
+ case 'adminSecondary':
56
+ return 'text-secondary';
57
+ default:
58
+ return 'text-primary';
59
+ }
60
+ }),
61
+ hoverClass: computed(() => {
62
+ switch (props.type) {
63
+ case 'admin':
64
+ return 'hover:text-secondary';
65
+ case 'adminSecondary':
66
+ return 'hover:text-tertiary';
67
+ default:
68
+ return '';
69
+ }
70
+ }),
71
+ hoverColor: computed(() => {
72
+ switch (props.type) {
73
+ case 'admin':
74
+ return 'text-secondary';
75
+ case 'adminSecondary':
76
+ return 'text-tertiary';
77
+ default:
78
+ return null;
79
+ }
80
+ }),
81
+ classes: computed(() => {
82
+ let baseClasses = 'py-2 px-2.5 mx-2 inline-flex ';
83
+
84
+ switch (props.type) {
85
+ case 'primary':
86
+ baseClasses +=
87
+ ' items-center gap-2.5 rounded-md text-center shadow border border-skeleton justify-center bg-neutral hover:bg-tertiary';
88
+ break;
89
+ case 'secondary':
90
+ baseClasses +=
91
+ ' items-center gap-2.5 rounded-md text-center shadow bg-secondary justify-center hover:bg-primary text-neutral';
92
+ break;
93
+ case 'tertiary':
94
+ baseClasses +=
95
+ ' items-center gap-2.5 rounded-md text-center justify-center bg-tertiary hover:bg-primary text-primary';
96
+ break;
97
+ case 'bright':
98
+ baseClasses +=
99
+ ' items-center gap-2.5 rounded-md text-center justify-center bg-bright hover:bg-primary text-neutral';
100
+ break;
101
+ case 'admin':
102
+ baseClasses +=
103
+ ' items-center rounded-md gap-2.5 text-center bg-primary hover:bg-primary my-1 text-neutral hover:bg-primaryHighlight';
104
+ break;
105
+ case 'adminSecondary':
106
+ baseClasses +=
107
+ ' items-center gap-2.5 text-center my-1 border-b border-secondary hover:border-b hover:border-neutral w-11/12 text-neutral';
108
+ break;
109
+ }
110
+
111
+ switch (props.size) {
112
+ case 'xs':
113
+ baseClasses += ' text-xs';
114
+ break;
115
+ case 'small':
116
+ baseClasses += ' text-sm';
117
+ break;
118
+ case 'medium':
119
+ baseClasses += ' text-md';
120
+ break;
121
+ case 'large':
122
+ baseClasses += ' text-lg';
123
+ break;
124
+ case 'xl':
125
+ baseClasses += ' text-xl';
126
+ break;
127
+ default:
128
+ baseClasses += '';
129
+ break;
130
+ }
131
+
132
+ return baseClasses;
133
+ }),
134
+ onClick() {
135
+ console.log('Click!');
136
+ emit('click');
137
+ }
138
+ };
139
+ }
140
+ };
141
+ </script>
@@ -0,0 +1,28 @@
1
+ import BaseInput from './BaseInput.vue';
2
+
3
+ export default {
4
+ title: 'Base/Input',
5
+ component: BaseInput,
6
+ tags: ['autodocs'],
7
+ argTypes: {
8
+ placeholder: { control: 'text' },
9
+ value: { control: 'text' }
10
+ }
11
+ };
12
+
13
+ const Template = args => ({
14
+ components: { BaseInput },
15
+ props: Object.keys(args),
16
+ methods: {
17
+ onValueUpdate(newValue) {
18
+ console.log('Value updated:', newValue);
19
+ }
20
+ }
21
+ });
22
+
23
+ export const Default = {
24
+ args: {
25
+ placeholder: 'Enter text...',
26
+ value: ''
27
+ }
28
+ };
@@ -0,0 +1,44 @@
1
+ <template>
2
+ <input
3
+ class="appearance-none focus:outline-none w-full"
4
+ :placeholder="placeholder"
5
+ v-model="internalValue"
6
+ @input="onInput"
7
+ />
8
+ </template>
9
+
10
+ <script>
11
+ export default {
12
+ name: 'BaseInput',
13
+ props: {
14
+ placeholder: {
15
+ type: String,
16
+ default: ''
17
+ },
18
+ value: {
19
+ type: String,
20
+ default: ''
21
+ }
22
+ },
23
+ data() {
24
+ return {
25
+ internalValue: this.value,
26
+ timeout: null
27
+ };
28
+ },
29
+
30
+ watch: {
31
+ value(newValue) {
32
+ this.internalValue = newValue;
33
+ }
34
+ },
35
+ methods: {
36
+ onInput() {
37
+ clearTimeout(this.timeout);
38
+ this.timeout = setTimeout(() => {
39
+ this.$emit('update:value', this.internalValue);
40
+ }, 300);
41
+ }
42
+ }
43
+ };
44
+ </script>
@@ -0,0 +1,29 @@
1
+ import BaseTag from './BaseTag.vue';
2
+
3
+ export default {
4
+ title: 'Base/BaseTag',
5
+ component: BaseTag,
6
+ tags: ['autodocs'],
7
+ argTypes: {
8
+ label: {
9
+ control: {
10
+ type: 'text',
11
+ defaultValue: 'Default Label'
12
+ }
13
+ },
14
+ backgroundColor: {
15
+ control: {
16
+ type: 'select'
17
+ },
18
+ options: ['primary', 'secondary', 'tertiary', 'neutral', 'bright'],
19
+ defaultValue: 'primary'
20
+ }
21
+ }
22
+ };
23
+
24
+ export const Basic = {
25
+ args: {
26
+ label: 'default tag',
27
+ backgroundColor: 'primary'
28
+ }
29
+ };
@@ -0,0 +1,57 @@
1
+ <template>
2
+ <div :class="classes">{{ label }}</div>
3
+ </template>
4
+
5
+ <script>
6
+ import { computed, reactive } from 'vue';
7
+
8
+ export default {
9
+ name: 'base-tag',
10
+
11
+ props: {
12
+ label: {
13
+ type: String,
14
+ required: true
15
+ },
16
+ backgroundColor: {
17
+ type: String,
18
+ validator: function (value) {
19
+ return ['primary', 'secondary', 'tertiary', 'neutral', 'bright'].indexOf(value) !== -1;
20
+ }
21
+ }
22
+ },
23
+
24
+ setup(props) {
25
+ props = reactive(props);
26
+
27
+ return {
28
+ classes: computed(() => {
29
+ let baseClasses = 'cursor-pointer inline-block py-1 px-3 my-2 ml-3 text-xs font-normal rounded-full text-neutral';
30
+
31
+ switch (props.backgroundColor) {
32
+ case 'primary':
33
+ baseClasses += ' bg-primary';
34
+ break;
35
+ case 'secondary':
36
+ baseClasses += ' bg-secondary';
37
+ break;
38
+ case 'tertiary':
39
+ baseClasses += ' bg-tertiary';
40
+ break;
41
+ case 'neutral':
42
+ baseClasses += ' bg-neutral';
43
+ break;
44
+ case 'bright':
45
+ baseClasses += ' bg-bright';
46
+ break;
47
+ default:
48
+ baseClasses += ' bg-primary';
49
+ break;
50
+ }
51
+
52
+ return baseClasses;
53
+ })
54
+ };
55
+ }
56
+ };
57
+ </script>
@@ -0,0 +1,77 @@
1
+ import BaseText from './BaseText.vue';
2
+ export default {
3
+ title: 'Base/BaseText',
4
+ component: BaseText,
5
+ tags: ['autodocs'],
6
+ argTypes: {
7
+ text: {
8
+ control: {
9
+ type: 'text',
10
+ defaultValue: 'Default Text'
11
+ }
12
+ },
13
+ size: {
14
+ control: {
15
+ type: 'select'
16
+ },
17
+ options: ['xs', 'small', 'medium', 'large', 'xl', '2xl', '3xl'],
18
+ defaultValue: 'medium'
19
+ },
20
+ weight: {
21
+ control: {
22
+ type: 'select'
23
+ },
24
+ options: ['light', 'normal', 'medium', 'semi-bold', 'bold', 'extra-bold'],
25
+ defaultValue: 'normal'
26
+ },
27
+ color: {
28
+ control: {
29
+ type: 'select'
30
+ },
31
+ options: ['neutral', 'quaternary', 'tertiary', 'secondary', 'primary', 'bright'],
32
+ defaultValue: 'primary'
33
+ },
34
+ hoverColor: {
35
+ control: {
36
+ type: 'select'
37
+ },
38
+ options: [
39
+ 'primary',
40
+ 'quaternary',
41
+ 'secondary',
42
+ 'tertiary',
43
+ 'neutral',
44
+ 'bright',
45
+ 'none'
46
+ ],
47
+ defaultValue: 'none'
48
+ }
49
+ }
50
+ };
51
+
52
+ export const Large = {
53
+ args: {
54
+ size: 'large',
55
+ text: 'Large Text'
56
+ }
57
+ };
58
+
59
+ export const Medium = {
60
+ args: {
61
+ size: 'medium',
62
+ text: 'Medium Text'
63
+ }
64
+ };
65
+ export const Small = {
66
+ args: {
67
+ size: 'small',
68
+ text: 'Small Text'
69
+ }
70
+ };
71
+
72
+ export const TextWithHover = {
73
+ args: {
74
+ ...Large.args,
75
+ hoverColor: 'bright'
76
+ }
77
+ };