mirror of https://github.com/bra1n/townsquare.git
1 line
103 KiB
Plaintext
1 line
103 KiB
Plaintext
{"version":3,"sources":["webpack:///webpack/bootstrap","webpack:///./src/components/Modal.vue?1f08","webpack:///./src/components/TownSquare.vue?b88a","webpack:///./src/App.vue?8b09","webpack:///./src/components/TownSquare.vue?bbe9","webpack:///./src/components/Player.vue?1039","webpack:///./src/components/Token.vue?3be5","webpack:///src/components/Token.vue","webpack:///./src/components/Token.vue?ca97","webpack:///./src/components/Token.vue","webpack:///src/components/Player.vue","webpack:///./src/components/Player.vue?1369","webpack:///./src/components/Player.vue","webpack:///./src/components/Modal.vue?c402","webpack:///src/components/Modal.vue","webpack:///./src/components/Modal.vue?0f3c","webpack:///./src/components/Modal.vue","webpack:///src/components/TownSquare.vue","webpack:///./src/components/TownSquare.vue?335a","webpack:///./src/components/TownSquare.vue","webpack:///./src/components/TownInfo.vue?d015","webpack:///src/components/TownInfo.vue","webpack:///./src/components/TownInfo.vue?6260","webpack:///./src/components/TownInfo.vue","webpack:///./src/components/RoleSelectionModal.vue?45be","webpack:///src/components/RoleSelectionModal.vue","webpack:///./src/components/RoleSelectionModal.vue?415e","webpack:///./src/components/RoleSelectionModal.vue","webpack:///./src/components/Screenshot.vue?20b8","webpack:///src/components/Screenshot.vue","webpack:///./src/components/Screenshot.vue?82cf","webpack:///./src/components/Screenshot.vue","webpack:///src/App.vue","webpack:///./src/App.vue?b65f","webpack:///./src/App.vue","webpack:///./src/main.js","webpack:///./src/App.vue?6ee5","webpack:///./src/components/Player.vue?6d3c","webpack:///./src/components/RoleSelectionModal.vue?d998","webpack:///./src/components/Token.vue?a5ff","webpack:///./src/components/TownInfo.vue?ca37","webpack:///./src/components/Screenshot.vue?ec8d"],"names":["webpackJsonpCallback","data","moduleId","chunkId","chunkIds","moreModules","executeModules","i","resolves","length","Object","prototype","hasOwnProperty","call","installedChunks","push","modules","parentJsonpFunction","shift","deferredModules","apply","checkDeferredModules","result","deferredModule","fulfilled","j","depId","splice","__webpack_require__","s","installedModules","exports","module","l","m","c","d","name","getter","o","defineProperty","enumerable","get","r","Symbol","toStringTag","value","t","mode","__esModule","ns","create","key","bind","n","object","property","p","jsonpArray","window","oldJsonpFunction","slice","render","_vm","this","_h","$createElement","_c","_self","class","screenshot","isScreenshot","attrs","on","keyup","players","edition","isPublic","roles","zoom","takeScreenshot","directives","rawName","expression","staticClass","$event","isEditionModalOpen","_v","_l","id","setEdition","_s","isRoleModalOpen","ref","onScreenshot","success","isScreenshotSuccess","isControlOpen","togglePublic","Math","round","addPlayer","_e","randomizeSeatings","clearPlayers","clearRoles","showEditionModal","showRoleModal","staticRenderFns","public","style","player","index","openReminderModal","openRoleModal","removePlayer","$emit","stopPropagation","bluffs","role","availableReminders","selectedPlayer","closeModal","reminder","addReminder","availableRoles","team","setRole","dead","hasDied","hasVoted","traveler","toggleStatus","firstNight","firstNightReminder","otherNight","otherNightReminder","changeName","removeReminder","reminders","ability","props","type","required","methods","component","components","Token","Map","Boolean","Number","width","height","x","y","$refs","getBoundingClientRect","$set","prompt","indexOf","close","_t","Modal","Player","Array","fill","map","forEach","some","confirm","teams","alive","votes","townsfolk","outsider","minion","demon","String","computed","nontravelers","min","filter","game","nontravelerPlayers","teamRoles","selected","disabled","selectedRoles","assignRoles","selectRandomRoles","randomElement","arr","floor","random","isOpen","roleSelection","values","reduce","a","b","hasSelectedSetupRoles","setup","playerCount","max","composition","keys","available","sort","pop","mounted","watch","stream","canvas","video","active","alert","navigator","mediaDevices","getDisplayMedia","cursor","audio","err","srcObject","play","setTimeout","context","getContext","setAttribute","videoWidth","videoHeight","drawImage","toBlob","blob","item","ClipboardItem","clipboard","write","Screenshot","TownSquare","TownInfo","RoleSelectionModal","editions","getRolesByEdition","dimensions","capture","selectedEdition","find","includes","localeCompare","undefined","localStorage","JSON","parse","newPlayers","stringify","deep","newEdition","newIsPublic","add","config","productionTip","h","App","$mount"],"mappings":"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","file":"js/app.7b720de5.js","sourcesContent":[" \t// install a JSONP callback for chunk loading\n \tfunction webpackJsonpCallback(data) {\n \t\tvar chunkIds = data[0];\n \t\tvar moreModules = data[1];\n \t\tvar executeModules = data[2];\n\n \t\t// add \"moreModules\" to the modules object,\n \t\t// then flag all \"chunkIds\" as loaded and fire callback\n \t\tvar moduleId, chunkId, i = 0, resolves = [];\n \t\tfor(;i < chunkIds.length; i++) {\n \t\t\tchunkId = chunkIds[i];\n \t\t\tif(Object.prototype.hasOwnProperty.call(installedChunks, chunkId) && installedChunks[chunkId]) {\n \t\t\t\tresolves.push(installedChunks[chunkId][0]);\n \t\t\t}\n \t\t\tinstalledChunks[chunkId] = 0;\n \t\t}\n \t\tfor(moduleId in moreModules) {\n \t\t\tif(Object.prototype.hasOwnProperty.call(moreModules, moduleId)) {\n \t\t\t\tmodules[moduleId] = moreModules[moduleId];\n \t\t\t}\n \t\t}\n \t\tif(parentJsonpFunction) parentJsonpFunction(data);\n\n \t\twhile(resolves.length) {\n \t\t\tresolves.shift()();\n \t\t}\n\n \t\t// add entry modules from loaded chunk to deferred list\n \t\tdeferredModules.push.apply(deferredModules, executeModules || []);\n\n \t\t// run deferred modules when all chunks ready\n \t\treturn checkDeferredModules();\n \t};\n \tfunction checkDeferredModules() {\n \t\tvar result;\n \t\tfor(var i = 0; i < deferredModules.length; i++) {\n \t\t\tvar deferredModule = deferredModules[i];\n \t\t\tvar fulfilled = true;\n \t\t\tfor(var j = 1; j < deferredModule.length; j++) {\n \t\t\t\tvar depId = deferredModule[j];\n \t\t\t\tif(installedChunks[depId] !== 0) fulfilled = false;\n \t\t\t}\n \t\t\tif(fulfilled) {\n \t\t\t\tdeferredModules.splice(i--, 1);\n \t\t\t\tresult = __webpack_require__(__webpack_require__.s = deferredModule[0]);\n \t\t\t}\n \t\t}\n\n \t\treturn result;\n \t}\n\n \t// The module cache\n \tvar installedModules = {};\n\n \t// object to store loaded and loading chunks\n \t// undefined = chunk not loaded, null = chunk preloaded/prefetched\n \t// Promise = chunk loading, 0 = chunk loaded\n \tvar installedChunks = {\n \t\t\"app\": 0\n \t};\n\n \tvar deferredModules = [];\n\n \t// The require function\n \tfunction __webpack_require__(moduleId) {\n\n \t\t// Check if module is in cache\n \t\tif(installedModules[moduleId]) {\n \t\t\treturn installedModules[moduleId].exports;\n \t\t}\n \t\t// Create a new module (and put it into the cache)\n \t\tvar module = installedModules[moduleId] = {\n \t\t\ti: moduleId,\n \t\t\tl: false,\n \t\t\texports: {}\n \t\t};\n\n \t\t// Execute the module function\n \t\tmodules[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n \t\t// Flag the module as loaded\n \t\tmodule.l = true;\n\n \t\t// Return the exports of the module\n \t\treturn module.exports;\n \t}\n\n\n \t// expose the modules object (__webpack_modules__)\n \t__webpack_require__.m = modules;\n\n \t// expose the module cache\n \t__webpack_require__.c = installedModules;\n\n \t// define getter function for harmony exports\n \t__webpack_require__.d = function(exports, name, getter) {\n \t\tif(!__webpack_require__.o(exports, name)) {\n \t\t\tObject.defineProperty(exports, name, { enumerable: true, get: getter });\n \t\t}\n \t};\n\n \t// define __esModule on exports\n \t__webpack_require__.r = function(exports) {\n \t\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n \t\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n \t\t}\n \t\tObject.defineProperty(exports, '__esModule', { value: true });\n \t};\n\n \t// create a fake namespace object\n \t// mode & 1: value is a module id, require it\n \t// mode & 2: merge all properties of value into the ns\n \t// mode & 4: return value when already ns object\n \t// mode & 8|1: behave like require\n \t__webpack_require__.t = function(value, mode) {\n \t\tif(mode & 1) value = __webpack_require__(value);\n \t\tif(mode & 8) return value;\n \t\tif((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;\n \t\tvar ns = Object.create(null);\n \t\t__webpack_require__.r(ns);\n \t\tObject.defineProperty(ns, 'default', { enumerable: true, value: value });\n \t\tif(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));\n \t\treturn ns;\n \t};\n\n \t// getDefaultExport function for compatibility with non-harmony modules\n \t__webpack_require__.n = function(module) {\n \t\tvar getter = module && module.__esModule ?\n \t\t\tfunction getDefault() { return module['default']; } :\n \t\t\tfunction getModuleExports() { return module; };\n \t\t__webpack_require__.d(getter, 'a', getter);\n \t\treturn getter;\n \t};\n\n \t// Object.prototype.hasOwnProperty.call\n \t__webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };\n\n \t// __webpack_public_path__\n \t__webpack_require__.p = \"/townsquare/\";\n\n \tvar jsonpArray = window[\"webpackJsonp\"] = window[\"webpackJsonp\"] || [];\n \tvar oldJsonpFunction = jsonpArray.push.bind(jsonpArray);\n \tjsonpArray.push = webpackJsonpCallback;\n \tjsonpArray = jsonpArray.slice();\n \tfor(var i = 0; i < jsonpArray.length; i++) webpackJsonpCallback(jsonpArray[i]);\n \tvar parentJsonpFunction = oldJsonpFunction;\n\n\n \t// add entry module to deferred list\n \tdeferredModules.push([\"56d7\",\"chunk-vendors\"]);\n \t// run deferred modules when ready\n \treturn checkDeferredModules();\n","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Modal.vue?vue&type=style&index=0&lang=scss&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Modal.vue?vue&type=style&index=0&lang=scss&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownSquare.vue?vue&type=style&index=0&lang=scss&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownSquare.vue?vue&type=style&index=0&lang=scss&\"","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{class:{ screenshot: _vm.isScreenshot },attrs:{\"id\":\"app\",\"tabindex\":\"-1\"},on:{\"keyup\":_vm.keyup}},[_c('TownInfo',{attrs:{\"players\":_vm.players,\"edition\":_vm.edition}}),_c('TownSquare',{attrs:{\"is-public\":_vm.isPublic,\"players\":_vm.players,\"roles\":_vm.roles,\"zoom\":_vm.zoom},on:{\"screenshot\":_vm.takeScreenshot}}),_c('Modal',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isEditionModalOpen),expression:\"isEditionModalOpen\"}],staticClass:\"editions\",on:{\"close\":function($event){_vm.isEditionModalOpen = false}}},[_c('h3',[_vm._v(\"Select an edition:\")]),_c('ul',{staticClass:\"editions\"},_vm._l((_vm.editions),function(edition){return _c('li',{key:edition.id,staticClass:\"edition\",class:['edition-' + edition.id],on:{\"click\":function($event){return _vm.setEdition(edition.id)}}},[_vm._v(\" \"+_vm._s(edition.name)+\" \")])}),0)]),_c('RoleSelectionModal',{attrs:{\"players\":_vm.players,\"roles\":_vm.roles,\"is-open\":_vm.isRoleModalOpen},on:{\"close\":function($event){_vm.isRoleModalOpen = false}}}),_c('Screenshot',{ref:\"screenshot\",on:{\"success\":function($event){return _vm.onScreenshot(true)},\"error\":function($event){return _vm.onScreenshot(false)}}}),_c('div',{staticClass:\"controls\"},[_c('font-awesome-icon',{class:{ success: _vm.isScreenshotSuccess },attrs:{\"icon\":\"camera\"},on:{\"click\":function($event){return _vm.takeScreenshot()}}}),_c('font-awesome-icon',{attrs:{\"icon\":\"cog\"},on:{\"click\":function($event){_vm.isControlOpen = !_vm.isControlOpen}}}),(_vm.isControlOpen)?_c('ul',[_c('li',{on:{\"click\":_vm.togglePublic}},[_vm._v(\"Toggle \"),_c('em',[_vm._v(\"G\")]),_vm._v(\"rimoire\")]),_c('li',[_vm._v(\" Size \"),_c('font-awesome-icon',{attrs:{\"icon\":\"search-minus\"},on:{\"click\":function($event){_vm.zoom -= 0.1}}}),_vm._v(\" \"+_vm._s(Math.round(_vm.zoom * 100))+\"% \"),_c('font-awesome-icon',{attrs:{\"icon\":\"search-plus\"},on:{\"click\":function($event){_vm.zoom += 0.1}}})],1),(_vm.players.length < 20)?_c('li',{on:{\"click\":_vm.addPlayer}},[_c('em',[_vm._v(\"A\")]),_vm._v(\"dd Player \")]):_vm._e(),(_vm.players.length > 2)?_c('li',{on:{\"click\":_vm.randomizeSeatings}},[_c('em',[_vm._v(\"R\")]),_vm._v(\"andomize Seatings \")]):_vm._e(),(_vm.players.length)?_c('li',{on:{\"click\":_vm.clearPlayers}},[_vm._v(\" Clear Players \")]):_vm._e(),(_vm.players.length)?_c('li',{on:{\"click\":_vm.clearRoles}},[_vm._v(\" Clear Roles \")]):_vm._e(),(_vm.players.length > 4)?_c('li',{on:{\"click\":_vm.showEditionModal}},[_vm._v(\" Select Edition \")]):_vm._e(),(_vm.players.length > 4)?_c('li',{on:{\"click\":_vm.showRoleModal}},[_vm._v(\" Select Roles \")]):_vm._e()]):_vm._e()],1)],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"square\",class:{ public: _vm.isPublic },style:({ zoom: _vm.zoom }),attrs:{\"id\":\"townsquare\"}},[_c('ul',{staticClass:\"circle\",class:['size-' + _vm.players.length]},_vm._l((_vm.players),function(player,index){return _c('Player',{key:index,attrs:{\"player\":player,\"roles\":_vm.roles,\"is-public\":_vm.isPublic,\"zoom\":_vm.zoom},on:{\"add-reminder\":_vm.openReminderModal,\"set-role\":_vm.openRoleModal,\"remove-player\":_vm.removePlayer,\"screenshot\":function($event){return _vm.$emit('screenshot', $event)}}})}),1),(_vm.players.length > 6)?_c('div',{ref:\"bluffs\",staticClass:\"bluffs\"},[_c('h3',[_vm._v(\"Demon bluffs\")]),_c('font-awesome-icon',{attrs:{\"icon\":\"camera\"},on:{\"click\":function($event){$event.stopPropagation();return _vm.takeScreenshot($event)}}}),_c('ul',[_c('li',{on:{\"click\":function($event){return _vm.openRoleModal(_vm.bluffs[0])}}},[_c('Token',{attrs:{\"role\":_vm.bluffs[0].role}})],1),_c('li',{on:{\"click\":function($event){return _vm.openRoleModal(_vm.bluffs[1])}}},[_c('Token',{attrs:{\"role\":_vm.bluffs[1].role}})],1),_c('li',{on:{\"click\":function($event){return _vm.openRoleModal(_vm.bluffs[2])}}},[_c('Token',{attrs:{\"role\":_vm.bluffs[2].role}})],1)])],1):_vm._e(),_c('Modal',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.availableReminders.length && _vm.selectedPlayer),expression:\"availableReminders.length && selectedPlayer\"}],on:{\"close\":_vm.closeModal}},[_c('h3',[_vm._v(\"Choose a reminder token:\")]),_c('ul',{staticClass:\"reminders\"},_vm._l((_vm.availableReminders),function(reminder){return _c('li',{key:reminder.role + ' ' + reminder.name,staticClass:\"reminder\",class:[reminder.role],on:{\"click\":function($event){return _vm.addReminder(reminder)}}},[_vm._v(\" \"+_vm._s(reminder.name)+\" \")])}),0)]),_c('Modal',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.availableRoles.length && _vm.selectedPlayer),expression:\"availableRoles.length && selectedPlayer\"}],on:{\"close\":_vm.closeModal}},[_c('h3',[_vm._v(\"Choose a new role:\")]),_c('ul',{staticClass:\"tokens\"},_vm._l((_vm.availableRoles),function(role){return _c('li',{key:role.id,class:[role.team],on:{\"click\":function($event){return _vm.setRole(role)}}},[_c('Token',{attrs:{\"role\":role}})],1)}),0)])],1)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('li',[_c('div',{ref:\"player\",staticClass:\"player\",class:{\n dead: _vm.player.hasDied,\n 'no-vote': _vm.player.hasVoted,\n traveler: _vm.player.role && _vm.player.role.team === 'traveler'\n }},[_c('div',{staticClass:\"shroud\",on:{\"click\":function($event){return _vm.toggleStatus()}}}),_c('div',{staticClass:\"life\",on:{\"click\":function($event){return _vm.toggleStatus()}}}),(_vm.player.firstNight)?_c('div',{staticClass:\"night first\"},[_c('em',[_vm._v(_vm._s(_vm.player.firstNight)+\".\")]),_c('span',[_vm._v(_vm._s(_vm.player.role.firstNightReminder))])]):_vm._e(),(_vm.player.otherNight)?_c('div',{staticClass:\"night other\"},[_c('em',[_vm._v(_vm._s(_vm.player.otherNight)+\".\")]),_c('span',[_vm._v(_vm._s(_vm.player.role.otherNightReminder))])]):_vm._e(),_c('Token',{attrs:{\"role\":_vm.player.role},on:{\"set-role\":_vm.setRole}}),_c('div',{staticClass:\"name\",on:{\"click\":_vm.changeName}},[_c('span',{staticClass:\"screenshot\",on:{\"click\":function($event){$event.stopPropagation();return _vm.takeScreenshot($event)}}},[_c('font-awesome-icon',{attrs:{\"icon\":\"camera\"}})],1),_c('span',{staticClass:\"name\"},[_vm._v(\" \"+_vm._s(_vm.player.name)+\" \")]),_c('span',{staticClass:\"remove\",on:{\"click\":function($event){$event.stopPropagation();return _vm.$emit('remove-player', _vm.player)}}},[_c('font-awesome-icon',{attrs:{\"icon\":\"times-circle\"}})],1)])],1),(_vm.player.reminders)?_vm._l((_vm.player.reminders),function(reminder){return _c('div',{key:reminder.role + ' ' + reminder.name,staticClass:\"reminder\",class:[reminder.role],on:{\"click\":function($event){return _vm.removeReminder(reminder)}}},[_vm._v(\" \"+_vm._s(reminder.name)+\" \")])}):_vm._e(),_c('div',{staticClass:\"reminder add\",on:{\"click\":function($event){return _vm.$emit('add-reminder', _vm.player)}}})],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{staticClass:\"token\",class:[_vm.role.id],on:{\"click\":_vm.setRole}},[(_vm.role.firstNight)?_c('span',{staticClass:\"leaf-left\"}):_vm._e(),(_vm.role.otherNight)?_c('span',{staticClass:\"leaf-right\"}):_vm._e(),(_vm.role.reminders && _vm.role.reminders.length)?_c('span',{class:['leaf-top' + _vm.role.reminders.length]}):_vm._e(),(_vm.role.setup)?_c('span',{staticClass:\"leaf-orange\"}):_vm._e(),_c('div',{staticClass:\"name\"},[_vm._v(_vm._s(_vm.role.name))]),(_vm.role.ability)?_c('div',{staticClass:\"ability\"},[_vm._v(\" \"+_vm._s(_vm.role.ability)+\" \")]):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div class=\"token\" @click=\"setRole\" :class=\"[role.id]\">\n <span class=\"leaf-left\" v-if=\"role.firstNight\"></span>\n <span class=\"leaf-right\" v-if=\"role.otherNight\"></span>\n <span\n v-if=\"role.reminders && role.reminders.length\"\n v-bind:class=\"['leaf-top' + role.reminders.length]\"\n ></span>\n <span class=\"leaf-orange\" v-if=\"role.setup\"></span>\n <div class=\"name\">{{ role.name }}</div>\n <div class=\"ability\" v-if=\"role.ability\">\n {{ role.ability }}\n </div>\n </div>\n</template>\n\n<script>\nexport default {\n name: \"Token\",\n props: {\n role: {\n type: Object,\n required: true\n }\n },\n data() {\n return {};\n },\n methods: {\n setRole() {\n this.$emit(\"set-role\");\n }\n }\n};\n</script>\n\n<style scoped lang=\"scss\">\n.token {\n border-radius: 50%;\n height: 100%;\n width: 100%;\n background: url(\"../assets/token.png\") center center;\n background-size: 100%;\n text-align: center;\n border: 3px solid black;\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n cursor: pointer;\n display: flex;\n align-items: center;\n\n &:before {\n content: \" \";\n background-size: 100%;\n position: absolute;\n width: 100%;\n height: 100%;\n left: 0;\n top: 0;\n }\n\n span {\n position: absolute;\n width: 100%;\n height: 100%;\n background-size: 100%;\n left: 0;\n top: 0;\n pointer-events: none;\n\n &.leaf-left {\n background-image: url(\"../assets/leaf-left.png\");\n }\n\n &.leaf-orange {\n background-image: url(\"../assets/leaf-orange.png\");\n }\n\n &.leaf-right {\n background-image: url(\"../assets/leaf-right.png\");\n }\n\n &.leaf-top1 {\n background-image: url(\"../assets/leaf-top1.png\");\n }\n\n &.leaf-top2 {\n background-image: url(\"../assets/leaf-top2.png\");\n }\n\n &.leaf-top3 {\n background-image: url(\"../assets/leaf-top3.png\");\n }\n\n &.leaf-top4 {\n background-image: url(\"../assets/leaf-top4.png\");\n }\n\n &.leaf-top5 {\n background-image: url(\"../assets/leaf-top5.png\");\n }\n }\n\n .ability {\n display: flex;\n position: absolute;\n padding: 5px 10px;\n left: 120%;\n width: 250px;\n z-index: 25;\n font-size: 80%;\n background: rgba(0, 0, 0, 0.5);\n border-radius: 10px;\n border: 3px solid black;\n filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.5));\n text-align: left;\n justify-items: center;\n align-content: center;\n align-items: center;\n pointer-events: none;\n opacity: 0;\n transition: opacity 200ms ease-in-out;\n\n &:before {\n content: \" \";\n border: 10px solid transparent;\n width: 0;\n height: 0;\n border-right-color: black;\n position: absolute;\n margin-right: 2px;\n right: 100%;\n }\n\n #app.screenshot & {\n display: none;\n }\n }\n\n .name {\n color: black;\n font-weight: 600;\n text-shadow: -1px -1px 0 #fff, 1px -1px 0 #fff, -1px 1px 0 #fff,\n 1px 1px 0 #fff, 0 0 5px rgba(0, 0, 0, 0.75);\n font-family: \"Papyrus\", serif;\n position: absolute;\n top: 73%;\n width: 100%;\n line-height: 100%;\n }\n &:hover .ability {\n opacity: 1;\n }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Token.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Token.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Token.vue?vue&type=template&id=eb60a182&scoped=true&\"\nimport script from \"./Token.vue?vue&type=script&lang=js&\"\nexport * from \"./Token.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Token.vue?vue&type=style&index=0&id=eb60a182&scoped=true&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"eb60a182\",\n null\n \n)\n\nexport default component.exports","<template>\n <li>\n <div\n ref=\"player\"\n class=\"player\"\n :class=\"{\n dead: player.hasDied,\n 'no-vote': player.hasVoted,\n traveler: player.role && player.role.team === 'traveler'\n }\"\n >\n <div class=\"shroud\" @click=\"toggleStatus()\"></div>\n <div class=\"life\" @click=\"toggleStatus()\"></div>\n\n <div class=\"night first\" v-if=\"player.firstNight\">\n <em>{{ player.firstNight }}.</em>\n <span>{{ player.role.firstNightReminder }}</span>\n </div>\n <div class=\"night other\" v-if=\"player.otherNight\">\n <em>{{ player.otherNight }}.</em>\n <span>{{ player.role.otherNightReminder }}</span>\n </div>\n\n <Token :role=\"player.role\" @set-role=\"setRole\" />\n\n <div class=\"name\" @click=\"changeName\">\n <span class=\"screenshot\" @click.stop=\"takeScreenshot\">\n <font-awesome-icon icon=\"camera\" />\n </span>\n <span class=\"name\">\n {{ player.name }}\n </span>\n <span class=\"remove\" @click.stop=\"$emit('remove-player', player)\">\n <font-awesome-icon icon=\"times-circle\" />\n </span>\n </div>\n </div>\n <template v-if=\"player.reminders\">\n <div\n class=\"reminder\"\n v-bind:key=\"reminder.role + ' ' + reminder.name\"\n v-for=\"reminder in player.reminders\"\n v-bind:class=\"[reminder.role]\"\n @click=\"removeReminder(reminder)\"\n >\n {{ reminder.name }}\n </div>\n </template>\n <div class=\"reminder add\" @click=\"$emit('add-reminder', player)\"></div>\n </li>\n</template>\n\n<script>\nimport Token from \"./Token\";\n\nexport default {\n components: {\n Token\n },\n props: {\n player: {\n type: Object,\n required: true\n },\n roles: {\n type: Map,\n required: true\n },\n isPublic: {\n type: Boolean,\n required: true\n },\n zoom: {\n type: Number,\n required: true\n }\n },\n data() {\n return {};\n },\n methods: {\n takeScreenshot() {\n const { width, height, x, y } = this.$refs.player.getBoundingClientRect();\n this.$emit(\"screenshot\", {\n width: width * this.zoom,\n height: height * this.zoom,\n x: x * this.zoom,\n y: y * this.zoom\n });\n },\n toggleStatus() {\n if (this.isPublic) {\n if (!this.player.hasDied) {\n this.$set(this.player, \"hasDied\", true);\n } else if (this.player.hasVoted) {\n this.$set(this.player, \"hasVoted\", false);\n this.$set(this.player, \"hasDied\", false);\n } else {\n this.$set(this.player, \"hasVoted\", true);\n }\n } else {\n this.$set(this.player, \"hasDied\", !this.player.hasDied);\n }\n },\n setRole() {\n this.$emit(\"set-role\", this.player);\n },\n changeName() {\n const name = prompt(\"Player name\", this.player.name);\n this.player.name = name || this.player.name;\n },\n removeReminder(reminder) {\n this.player.reminders.splice(this.player.reminders.indexOf(reminder), 1);\n }\n }\n};\n</script>\n\n<style lang=\"scss\">\n@import \"../vars.scss\";\n\n/***** Player token *****/\n.circle .player {\n margin-bottom: 10px;\n padding-top: $token + 6px;\n\n .shroud {\n top: 0;\n left: 0;\n position: absolute;\n width: 100%;\n height: 2/3 * $token;\n cursor: pointer;\n transform: rotateX(0deg);\n transform-origin: top center;\n transition: transform 200ms ease-in-out;\n z-index: 2;\n filter: drop-shadow(0 0 5px rgba(0, 0, 0, 0.8));\n\n &:before {\n content: \" \";\n background: url(\"../assets/shroud.png\") center -10px no-repeat;\n background-size: auto 100%;\n position: absolute;\n margin-left: -2/6 * $token;\n width: 2/3 * $token;\n height: 2/3 * $token;\n left: 50%;\n top: -30px;\n opacity: 0;\n transform: perspective(400px) scale(1.5);\n transform-origin: top center;\n transition: all 200ms ease-in-out;\n pointer-events: none;\n }\n\n &:hover:before {\n opacity: 0.5;\n top: -10px;\n transform: scale(1);\n }\n }\n\n &.dead .shroud:before {\n opacity: 1;\n top: 0;\n transform: perspective(400px) scale(1);\n }\n}\n\n/****** Life token *******/\n.player {\n .life {\n border-radius: 50%;\n height: $token + 6px;\n width: $token + 6px;\n background: url(\"../assets/life.png\") center center;\n background-size: 100%;\n border: 3px solid black;\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n cursor: pointer;\n transition: transform 200ms ease-in-out;\n transform: perspective(400px) rotateY(180deg);\n backface-visibility: hidden;\n position: absolute;\n left: 50%;\n top: 0;\n margin-left: ($token + 6) / -2;\n }\n\n &.dead {\n &.no-vote .life:after {\n display: none;\n }\n\n .life {\n background-image: url(\"../assets/death.png\");\n\n &:after {\n content: \" \";\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n background: url(\"../assets/vote.png\") center center no-repeat;\n background-size: 50%;\n height: $token + 3px;\n pointer-events: none;\n }\n }\n }\n\n &.traveler .life {\n filter: grayscale(100%);\n }\n}\n\n#townsquare.public .player {\n .shroud {\n transform: perspective(400px) rotateX(90deg);\n pointer-events: none;\n }\n\n .life {\n transform: perspective(400px) rotateY(0deg);\n }\n}\n\n/***** Role token ******/\n.player .token {\n position: absolute;\n left: 0;\n top: 0;\n height: $token + 6px;\n width: $token + 6px;\n transition: transform 200ms ease-in-out;\n transform: perspective(400px) rotateY(0deg);\n backface-visibility: hidden;\n}\n\n#townsquare.public .circle .token {\n transform: perspective(400px) rotateY(-180deg);\n}\n\n/***** Player name *****/\n.player > .name {\n font-size: 120%;\n line-height: 120%;\n filter: drop-shadow(0 0 1px rgba(0, 0, 0, 1))\n drop-shadow(0 0 1px rgba(0, 0, 0, 1)) drop-shadow(0 0 1px rgba(0, 0, 0, 1));\n cursor: pointer;\n white-space: nowrap;\n width: 100%;\n display: flex;\n justify-content: center;\n\n span.screenshot,\n span.remove {\n display: none;\n margin: 0 5px;\n flex-shrink: 0;\n flex-grow: 0;\n #app.screenshot & {\n display: none;\n }\n }\n span.name {\n flex-shrink: 1;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n &:hover {\n color: red;\n span {\n display: block;\n color: white;\n &:hover {\n color: red;\n }\n }\n }\n}\n\n.player.dead > .name {\n opacity: 0.5;\n}\n\n/***** Ability text *****/\n#townsquare.public .ability {\n display: none;\n}\n.circle .player:hover .ability {\n opacity: 1;\n}\n\n/**** Night reminders ****/\n.player .night {\n position: absolute;\n top: 40%;\n width: 100%;\n z-index: 2;\n cursor: pointer;\n opacity: 1;\n transition: opacity 200ms;\n\n #townsquare.public & {\n opacity: 0;\n pointer-events: none;\n }\n\n &:hover ~ .token .ability {\n opacity: 0;\n }\n\n &.first em {\n left: -15px;\n background: linear-gradient(\n 180deg,\n rgba(0, 0, 0, 1) 0%,\n rgba(147, 0, 0, 1) 100%\n );\n }\n\n &.other em {\n right: -15px;\n background: linear-gradient(\n 180deg,\n rgba(0, 0, 0, 1) 0%,\n rgba(7, 0, 147, 1) 100%\n );\n }\n\n em {\n font-style: normal;\n position: absolute;\n width: 40px;\n height: 40px;\n text-align: center;\n line-height: 37px;\n top: -20px;\n border-radius: 50%;\n border: 3px solid black;\n filter: drop-shadow(0 0 6px rgba(0, 0, 0, 0.5));\n font-weight: bold;\n opacity: 1;\n transition: opacity 200ms;\n }\n\n #app.screenshot & {\n display: none;\n }\n}\n\n.player.dead .night em {\n opacity: 0;\n}\n\n/***** Reminder token *****/\n.circle .reminder {\n background: url(\"../assets/reminder.png\") center center;\n background-size: 100%;\n width: $token / 2;\n height: $token / 2;\n color: black;\n font-size: 45%;\n font-weight: bold;\n display: block;\n margin: 5px ($token / -4) 0;\n text-align: center;\n padding: ($token * 0.3 + 2px) 5px 0;\n border-radius: 50%;\n line-height: 90%;\n border: 3px solid black;\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n transition: all 200ms;\n cursor: pointer;\n\n &:before,\n &:after {\n content: \" \";\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-size: 100%;\n background-position: center 0;\n background-repeat: no-repeat;\n background-image: url(\"../assets/icons/plus.png\");\n transition: opacity 200ms;\n }\n\n &:after {\n background-image: url(\"../assets/icons/x.png\");\n opacity: 0;\n }\n\n &.add {\n opacity: 0;\n top: 30px;\n &:after {\n display: none;\n }\n }\n\n &:hover:before {\n opacity: 0;\n }\n &:hover:after {\n opacity: 1;\n }\n}\n.circle li:hover .reminder.add {\n opacity: 1;\n top: 0;\n}\n.circle li:hover .reminder.add:before {\n opacity: 1;\n}\n\n#townsquare.public .reminder {\n opacity: 0;\n pointer-events: none;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Player.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Player.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Player.vue?vue&type=template&id=a29444f2&\"\nimport script from \"./Player.vue?vue&type=script&lang=js&\"\nexport * from \"./Player.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Player.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('transition',{attrs:{\"name\":\"modal-fade\"}},[_c('div',{staticClass:\"modal-backdrop\",on:{\"click\":_vm.close}},[_c('div',{staticClass:\"modal\",attrs:{\"role\":\"dialog\",\"aria-labelledby\":\"modalTitle\",\"aria-describedby\":\"modalDescription\"},on:{\"click\":function($event){$event.stopPropagation();}}},[_c('font-awesome-icon',{staticClass:\"close\",attrs:{\"icon\":\"times-circle\"},on:{\"click\":_vm.close}}),_vm._t(\"default\")],2)])])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <transition name=\"modal-fade\">\n <div class=\"modal-backdrop\" @click=\"close\">\n <div\n class=\"modal\"\n role=\"dialog\"\n aria-labelledby=\"modalTitle\"\n aria-describedby=\"modalDescription\"\n @click.stop=\"\"\n >\n <font-awesome-icon @click=\"close\" class=\"close\" icon=\"times-circle\" />\n <slot></slot>\n </div>\n </div>\n </transition>\n</template>\n\n<script>\nexport default {\n methods: {\n close() {\n this.$emit(\"close\");\n }\n }\n};\n</script>\n\n<style lang=\"scss\">\n.modal-backdrop {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n background-color: rgba(0, 0, 0, 0.3);\n display: flex;\n justify-content: center;\n align-items: center;\n z-index: 100;\n}\n\n.modal {\n background: rgba(0, 0, 0, 0.8);\n padding: 10px 20px;\n border-radius: 10px;\n box-shadow: 2px 2px 20px 1px #000;\n display: flex;\n flex-direction: column;\n max-width: 60%;\n\n ul {\n list-style-type: none;\n margin: 0;\n padding: 0;\n display: flex;\n flex-wrap: wrap;\n align-content: center;\n align-items: center;\n justify-content: center;\n font-size: 75%;\n line-height: 100%;\n }\n > .close {\n position: absolute;\n right: 20px;\n top: 20px;\n cursor: pointer;\n z-index: 5;\n &:hover {\n color: red;\n }\n }\n}\n\n.modal-fade-enter,\n.modal-fade-leave-active {\n opacity: 0;\n}\n\n.modal-fade-enter-active,\n.modal-fade-leave-active {\n transition: opacity 0.2s ease;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Modal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Modal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Modal.vue?vue&type=template&id=6eaeb16a&\"\nimport script from \"./Modal.vue?vue&type=script&lang=js&\"\nexport * from \"./Modal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Modal.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","<template>\n <div\n id=\"townsquare\"\n class=\"square\"\n v-bind:class=\"{ public: isPublic }\"\n v-bind:style=\"{ zoom: zoom }\"\n >\n <ul class=\"circle\" v-bind:class=\"['size-' + players.length]\">\n <Player\n v-for=\"(player, index) in players\"\n :key=\"index\"\n :player=\"player\"\n :roles=\"roles\"\n :is-public=\"isPublic\"\n :zoom=\"zoom\"\n @add-reminder=\"openReminderModal\"\n @set-role=\"openRoleModal\"\n @remove-player=\"removePlayer\"\n @screenshot=\"$emit('screenshot', $event)\"\n ></Player>\n </ul>\n <div class=\"bluffs\" v-if=\"players.length > 6\" ref=\"bluffs\">\n <h3>Demon bluffs</h3>\n <font-awesome-icon icon=\"camera\" @click.stop=\"takeScreenshot\" />\n <ul>\n <li @click=\"openRoleModal(bluffs[0])\">\n <Token :role=\"bluffs[0].role\"></Token>\n </li>\n <li @click=\"openRoleModal(bluffs[1])\">\n <Token :role=\"bluffs[1].role\"></Token>\n </li>\n <li @click=\"openRoleModal(bluffs[2])\">\n <Token :role=\"bluffs[2].role\"></Token>\n </li>\n </ul>\n </div>\n\n <Modal\n v-show=\"availableReminders.length && selectedPlayer\"\n @close=\"closeModal\"\n >\n <h3>Choose a reminder token:</h3>\n <ul class=\"reminders\">\n <li\n v-for=\"reminder in availableReminders\"\n class=\"reminder\"\n v-bind:class=\"[reminder.role]\"\n v-bind:key=\"reminder.role + ' ' + reminder.name\"\n @click=\"addReminder(reminder)\"\n >\n {{ reminder.name }}\n </li>\n </ul>\n </Modal>\n <Modal v-show=\"availableRoles.length && selectedPlayer\" @close=\"closeModal\">\n <h3>Choose a new role:</h3>\n <ul class=\"tokens\">\n <li\n v-for=\"role in availableRoles\"\n v-bind:class=\"[role.team]\"\n v-bind:key=\"role.id\"\n @click=\"setRole(role)\"\n >\n <Token :role=\"role\" />\n </li>\n </ul>\n </Modal>\n </div>\n</template>\n\n<script>\nimport Player from \"./Player\";\nimport Modal from \"./Modal\";\nimport Token from \"./Token\";\n\nexport default {\n components: {\n Token,\n Modal,\n Player\n },\n props: {\n isPublic: {\n type: Boolean,\n required: true\n },\n players: {\n type: Array,\n required: true\n },\n roles: {\n type: Map,\n required: true\n },\n zoom: {\n type: Number,\n required: true\n }\n },\n data() {\n return {\n selectedPlayer: false,\n availableReminders: [],\n availableRoles: [],\n bluffs: Array(3)\n .fill({})\n .map(() => ({ role: {} }))\n };\n },\n methods: {\n takeScreenshot() {\n const { width, height, x, y } = this.$refs.bluffs.getBoundingClientRect();\n this.$emit(\"screenshot\", { width, height, x, y });\n },\n openReminderModal(player) {\n this.availableRoles = [];\n this.availableReminders = [];\n this.selectedPlayer = player;\n this.roles.forEach(role => {\n if (this.players.some(p => p.role.id === role.id)) {\n this.availableReminders = [\n ...this.availableReminders,\n ...role.reminders.map(name => ({ role: role.id, name }))\n ];\n }\n });\n this.availableReminders.push({ role: \"good\", name: \"Good\" });\n this.availableReminders.push({ role: \"evil\", name: \"Evil\" });\n },\n openRoleModal(player) {\n this.availableRoles = [];\n this.availableReminders = [];\n this.selectedPlayer = player;\n this.roles.forEach(role => {\n if (player.role && role.id !== player.role.id) {\n this.availableRoles.push(role);\n }\n });\n this.availableRoles.push({});\n },\n addReminder(reminder) {\n this.selectedPlayer.reminders.push(reminder);\n this.closeModal();\n },\n setRole(role) {\n this.selectedPlayer.role = role;\n this.closeModal();\n },\n closeModal() {\n this.selectedPlayer = false;\n },\n removePlayer(player) {\n if (confirm(`Do you really want to remove ${player.name}?`)) {\n this.players.splice(this.players.indexOf(player), 1);\n }\n }\n }\n};\n</script>\n\n<style lang=\"scss\">\n@import \"../vars.scss\";\n\n@each $img, $fontsize in $roles {\n .token.#{$img} {\n &:before {\n background-image: url(\"../assets/icons/#{$img}.png\");\n }\n .name {\n font-size: $fontsize;\n }\n }\n\n .reminder.#{$img}:before {\n background-image: url(\"../assets/icons/#{$img}.png\");\n }\n}\n\n.circle {\n padding: 0;\n width: 100%;\n height: 100%;\n list-style: none;\n margin: 0;\n\n li {\n position: absolute;\n top: 0;\n left: 50%;\n height: 50%;\n transform-origin: 0 100%;\n text-align: center;\n\n &:hover {\n z-index: 25 !important;\n }\n\n > * {\n margin-left: -78px;\n width: 156px;\n }\n }\n}\n\n@mixin on-circle($item-count) {\n $angle: (360 / $item-count);\n $rot: 0;\n\n @for $i from 1 through $item-count {\n &:nth-child(#{$i}) {\n transform: rotate($rot * 1deg);\n @if $i - 1 <= $item-count / 2 {\n z-index: $item-count - $i + 1;\n } @else {\n z-index: $i - 1;\n .ability,\n .night span {\n right: 120%;\n left: auto;\n &:before {\n border-right-color: transparent;\n border-left-color: black;\n right: auto;\n left: 100%;\n }\n }\n }\n > * {\n transform: rotate($rot * -1deg);\n }\n .life,\n .token,\n .shroud,\n .night {\n transition-delay: ($i - 1) * 50ms;\n }\n\n // move reminders closer to the sides of the circle\n $q: $item-count / 4;\n $x: $i - 1;\n @if $x < $q or ($x >= $item-count / 2 and $x < $q * 3) {\n .player {\n margin-bottom: -10px + 20px * (1 - ($x % $q / $q));\n }\n } @else {\n .player {\n margin-bottom: -10px + 20px * ($x % $q / $q);\n }\n }\n }\n $rot: $rot + $angle;\n }\n}\n\n@for $i from 1 through 20 {\n .circle.size-#{$i} li {\n @include on-circle($item-count: $i);\n }\n}\n\n#townsquare {\n width: 100%;\n height: 100%;\n border-radius: 50%;\n padding: 20px;\n}\n\n/***** Demon bluffs *******/\n.bluffs {\n position: absolute;\n bottom: 10px;\n left: 10px;\n background: rgba(0, 0, 0, 0.5);\n border-radius: 10px;\n border: 3px solid black;\n filter: drop-shadow(0 4px 6px rgba(0, 0, 0, 0.5));\n transform-origin: bottom left;\n transform: scale(1);\n opacity: 1;\n transition: all 200ms ease-in-out;\n\n #townsquare.public & {\n opacity: 0;\n transform: scale(0.1);\n }\n > svg {\n position: absolute;\n top: 10px;\n right: 10px;\n cursor: pointer;\n &:hover {\n color: red;\n }\n #app.screenshot & {\n display: none;\n }\n }\n h3 {\n margin-top: 5px;\n }\n li {\n width: 120px;\n height: 120px;\n margin: 0 5px;\n display: inline-block;\n font-size: 18px;\n }\n}\n/***** Role token modal ******/\nul.tokens li {\n border-radius: 50%;\n height: 120px;\n width: 120px;\n margin: 5px;\n transition: transform 500ms ease;\n\n &.townsfolk {\n box-shadow: 0 0 10px $townsfolk, 0 0 10px #004cff;\n }\n &.outsider {\n box-shadow: 0 0 10px $outsider, 0 0 10px $outsider;\n }\n &.minion {\n box-shadow: 0 0 10px $minion, 0 0 10px $minion;\n }\n &.demon {\n box-shadow: 0 0 10px $demon, 0 0 10px $demon;\n }\n &.traveler {\n box-shadow: 0 0 10px $traveler, 0 0 10px $traveler;\n }\n &:hover {\n transform: scale(1.2);\n z-index: 10;\n }\n}\n\n/***** Reminder token modal ******/\nul.reminders .reminder {\n background: url(\"../assets/reminder.png\") center center;\n background-size: 100%;\n width: 100px;\n height: 100px;\n color: black;\n font-size: 65%;\n font-weight: bold;\n display: block;\n margin: 5px;\n text-align: center;\n border-radius: 50%;\n border: 3px solid black;\n box-shadow: 0 0 10px rgba(0, 0, 0, 0.5);\n cursor: pointer;\n padding: 65px 9px 0;\n line-height: 100%;\n transition: transform 500ms ease;\n\n &:before {\n content: \" \";\n position: absolute;\n left: 0;\n top: 0;\n width: 100%;\n height: 100%;\n background-size: 100%;\n background-position: center 0;\n background-repeat: no-repeat;\n }\n\n &:hover {\n transform: scale(1.2);\n }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownSquare.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownSquare.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TownSquare.vue?vue&type=template&id=4c6b0b3a&\"\nimport script from \"./TownSquare.vue?vue&type=script&lang=js&\"\nexport * from \"./TownSquare.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TownSquare.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('ul',{staticClass:\"info\"},[_c('li',{staticClass:\"edition\",class:['edition-' + _vm.edition]}),(_vm.players.length - _vm.teams.traveler < 5)?_c('li',[_vm._v(\"Please add more players!\")]):_vm._e(),_c('li',[_vm._v(\" \"+_vm._s(_vm.players.length)+\" \"),_c('font-awesome-icon',{staticClass:\"players\",attrs:{\"icon\":\"users\"}}),_vm._v(\" \"+_vm._s(_vm.teams.alive)+\" \"),_c('font-awesome-icon',{staticClass:\"alive\",attrs:{\"icon\":\"heartbeat\"}}),_vm._v(\" \"+_vm._s(_vm.teams.votes)+\" \"),_c('font-awesome-icon',{staticClass:\"votes\",attrs:{\"icon\":\"vote-yea\"}})],1),(_vm.players.length - _vm.teams.traveler >= 5)?_c('li',[_vm._v(\" \"+_vm._s(_vm.teams.townsfolk)+\" \"),_c('font-awesome-icon',{staticClass:\"townsfolk\",attrs:{\"icon\":\"user-friends\"}}),_vm._v(\" \"+_vm._s(_vm.teams.outsider)+\" \"),_c('font-awesome-icon',{staticClass:\"outsider\",attrs:{\"icon\":_vm.teams.outsider > 1 ? 'user-friends' : 'user'}}),_vm._v(\" \"+_vm._s(_vm.teams.minion)+\" \"),_c('font-awesome-icon',{staticClass:\"minion\",attrs:{\"icon\":_vm.teams.minion > 1 ? 'user-friends' : 'user'}}),_vm._v(\" \"+_vm._s(_vm.teams.demon)+\" \"),_c('font-awesome-icon',{staticClass:\"demon\",attrs:{\"icon\":_vm.teams.demon > 1 ? 'user-friends' : 'user'}}),(_vm.teams.traveler)?[_vm._v(\" \"+_vm._s(_vm.teams.traveler)+\" \"),_c('font-awesome-icon',{staticClass:\"traveler\",attrs:{\"icon\":_vm.teams.traveler > 1 ? 'user-friends' : 'user'}})]:_vm._e()],2):_vm._e()])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <ul class=\"info\">\n <li class=\"edition\" v-bind:class=\"['edition-' + edition]\"></li>\n <li v-if=\"players.length - teams.traveler < 5\">Please add more players!</li>\n <li>\n {{ players.length }} <font-awesome-icon class=\"players\" icon=\"users\" />\n {{ teams.alive }} <font-awesome-icon class=\"alive\" icon=\"heartbeat\" />\n {{ teams.votes }} <font-awesome-icon class=\"votes\" icon=\"vote-yea\" />\n </li>\n <li v-if=\"players.length - teams.traveler >= 5\">\n {{ teams.townsfolk }}\n <font-awesome-icon class=\"townsfolk\" icon=\"user-friends\" />\n {{ teams.outsider }}\n <font-awesome-icon\n class=\"outsider\"\n v-bind:icon=\"teams.outsider > 1 ? 'user-friends' : 'user'\"\n />\n {{ teams.minion }}\n <font-awesome-icon\n class=\"minion\"\n v-bind:icon=\"teams.minion > 1 ? 'user-friends' : 'user'\"\n />\n {{ teams.demon }}\n <font-awesome-icon\n class=\"demon\"\n v-bind:icon=\"teams.demon > 1 ? 'user-friends' : 'user'\"\n />\n <template v-if=\"teams.traveler\">\n {{ teams.traveler }}\n <font-awesome-icon\n class=\"traveler\"\n v-bind:icon=\"teams.traveler > 1 ? 'user-friends' : 'user'\"\n />\n </template>\n </li>\n </ul>\n</template>\n\n<script>\nimport gameJSON from \"./../game\";\n\nexport default {\n props: {\n players: {\n type: Array,\n required: true\n },\n edition: {\n type: String,\n required: true\n }\n },\n computed: {\n teams: function() {\n const nontravelers = Math.min(\n this.players.filter(player => player.role.team !== \"traveler\").length,\n 15\n );\n const alive = this.players.filter(player => player.hasDied !== true)\n .length;\n return {\n ...gameJSON[nontravelers - 5],\n traveler: this.players.length - nontravelers,\n alive,\n votes:\n alive +\n this.players.filter(\n player => player.hasDied === true && player.hasVoted !== true\n ).length\n };\n }\n }\n};\n</script>\n\n<style lang=\"scss\">\n@import \"../vars.scss\";\n\n.info {\n position: absolute;\n display: flex;\n left: 50%;\n top: 50%;\n width: 20%;\n height: 20%;\n margin-left: -10%;\n margin-top: -5%;\n padding: 50px 0 0;\n align-items: center;\n align-content: center;\n justify-content: center;\n flex-wrap: wrap;\n background: url(\"../assets/demon-head.png\") center center no-repeat;\n background-size: auto 100%;\n\n li {\n display: block;\n white-space: nowrap;\n font-weight: bold;\n text-align: center;\n padding: 0 5px;\n width: 100%;\n filter: drop-shadow(0 0 2px rgba(0, 0, 0, 0.7));\n\n svg {\n margin-right: 10px;\n }\n\n .players {\n color: #00f700;\n }\n .alive {\n color: #ff4a50;\n }\n .votes {\n color: #1cfff2;\n }\n .townsfolk {\n color: $townsfolk;\n }\n .outsider {\n color: $outsider;\n }\n .minion {\n color: $minion;\n }\n .demon {\n color: $demon;\n }\n .traveler {\n color: $traveler;\n }\n }\n\n li.edition {\n width: 220px;\n height: 200px;\n background-position: 0 center;\n background-repeat: no-repeat;\n background-size: 100% auto;\n position: absolute;\n top: -50px;\n }\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownInfo.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownInfo.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./TownInfo.vue?vue&type=template&id=119fdbe0&\"\nimport script from \"./TownInfo.vue?vue&type=script&lang=js&\"\nexport * from \"./TownInfo.vue?vue&type=script&lang=js&\"\nimport style0 from \"./TownInfo.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('Modal',{directives:[{name:\"show\",rawName:\"v-show\",value:(_vm.isOpen),expression:\"isOpen\"}],staticClass:\"roles\",on:{\"close\":function($event){return _vm.close()}}},[_c('h3',[_vm._v(\"Select the roles for \"+_vm._s(_vm.nontravelerPlayers)+\" players:\")]),_vm._l((_vm.roleSelection),function(teamRoles,team){return _c('ul',{key:team,staticClass:\"tokens\"},[_c('li',{staticClass:\"count\",class:[team]},[_vm._v(\" \"+_vm._s(teamRoles.filter(function (role) { return role.selected; }).length)+\" / \"+_vm._s(_vm.game[_vm.nontravelerPlayers - 5][team])+\" \")]),_vm._l((teamRoles),function(role){return _c('li',{key:role.id,class:[role.team, role.selected ? 'selected' : ''],on:{\"click\":function($event){role.selected = !role.selected}}},[_c('Token',{attrs:{\"role\":role}})],1)})],2)}),(_vm.hasSelectedSetupRoles)?_c('div',{staticClass:\"warning\"},[_vm._v(\" Warning: there are roles selected that modify the game setup! The randomizer does not account for these roles. \")]):_vm._e(),_c('div',{staticClass:\"button-group\"},[_c('div',{staticClass:\"button\",class:{\n disabled: _vm.selectedRoles > _vm.nontravelerPlayers || !_vm.selectedRoles\n },on:{\"click\":_vm.assignRoles}},[_vm._v(\" Assign \"+_vm._s(_vm.selectedRoles)+\" roles randomly \")]),_c('div',{staticClass:\"button\",on:{\"click\":_vm.selectRandomRoles}},[_vm._v(\" Randomize roles \")])])],2)}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <Modal class=\"roles\" v-show=\"isOpen\" @close=\"close()\">\n <h3>Select the roles for {{ nontravelerPlayers }} players:</h3>\n <ul\n class=\"tokens\"\n v-for=\"(teamRoles, team) in roleSelection\"\n v-bind:key=\"team\"\n >\n <li class=\"count\" v-bind:class=\"[team]\">\n {{ teamRoles.filter(role => role.selected).length }} /\n {{ game[nontravelerPlayers - 5][team] }}\n </li>\n <li\n v-for=\"role in teamRoles\"\n v-bind:class=\"[role.team, role.selected ? 'selected' : '']\"\n v-bind:key=\"role.id\"\n @click=\"role.selected = !role.selected\"\n >\n <Token :role=\"role\" />\n </li>\n </ul>\n <div class=\"warning\" v-if=\"hasSelectedSetupRoles\">\n Warning: there are roles selected that modify the game setup! The\n randomizer does not account for these roles.\n </div>\n <div class=\"button-group\">\n <div\n class=\"button\"\n @click=\"assignRoles\"\n v-bind:class=\"{\n disabled: selectedRoles > nontravelerPlayers || !selectedRoles\n }\"\n >\n Assign {{ selectedRoles }} roles randomly\n </div>\n <div class=\"button\" @click=\"selectRandomRoles\">\n Randomize roles\n </div>\n </div>\n </Modal>\n</template>\n\n<script>\nimport Modal from \"./Modal\";\nimport gameJSON from \"./../game\";\nimport Token from \"./Token\";\n\nconst randomElement = arr => arr[Math.floor(Math.random() * arr.length)];\n\nexport default {\n components: {\n Token,\n Modal\n },\n props: {\n players: {\n type: Array,\n required: true\n },\n roles: {\n type: Map,\n required: true\n },\n isOpen: {\n type: Boolean,\n required: true\n }\n },\n data: function() {\n return {\n roleSelection: {},\n game: gameJSON\n };\n },\n computed: {\n nontravelerPlayers: function() {\n return Math.min(\n this.players.filter(({ role }) => role && role.team !== \"traveler\")\n .length,\n 15\n );\n },\n selectedRoles: function() {\n return Object.values(this.roleSelection)\n .map(roles => roles.filter(role => role.selected).length)\n .reduce((a, b) => a + b, 0);\n },\n hasSelectedSetupRoles: function() {\n return Object.values(this.roleSelection).some(roles =>\n roles.some(role => role.selected && role.setup)\n );\n }\n },\n methods: {\n close() {\n this.$emit(\"close\");\n },\n selectRandomRoles() {\n this.roleSelection = {};\n this.roles.forEach(role => {\n if (!this.roleSelection[role.team]) {\n this.$set(this.roleSelection, role.team, []);\n }\n this.roleSelection[role.team].push(role);\n this.$set(role, \"selected\", false);\n });\n delete this.roleSelection[\"traveler\"];\n const playerCount = Math.max(5, this.nontravelerPlayers);\n const composition = this.game[playerCount - 5];\n Object.keys(composition).forEach(team => {\n for (let x = 0; x < composition[team]; x++) {\n const available = this.roleSelection[team].filter(\n role => role.selected !== true\n );\n if (available.length) {\n randomElement(available).selected = true;\n }\n }\n });\n },\n assignRoles() {\n if (this.selectedRoles <= this.nontravelerPlayers && this.selectedRoles) {\n // generate list of selected roles and randomize it\n const roles = Object.values(this.roleSelection)\n .map(roles => roles.filter(role => role.selected))\n .reduce((a, b) => [...a, ...b], [])\n .map(a => [Math.random(), a])\n .sort((a, b) => a[0] - b[0])\n .map(a => a[1]);\n this.players.forEach(player => {\n if (player.role.team !== \"traveler\" && roles.length) {\n player.role = roles.pop();\n }\n });\n this.close();\n }\n }\n },\n mounted: function() {\n if (!Object.keys(this.roleSelection).length) {\n this.selectRandomRoles();\n }\n },\n watch: {\n roles() {\n this.selectRandomRoles();\n }\n }\n};\n</script>\n\n<style lang=\"scss\">\n@import \"../vars.scss\";\n\n.roles .modal ul.tokens {\n padding-left: 55px;\n li {\n opacity: 0.5;\n transition: all 250ms;\n &.selected {\n opacity: 1;\n }\n }\n .count {\n opacity: 1;\n position: absolute;\n left: 0;\n top: 40px;\n font-weight: bold;\n line-height: 50px;\n text-align: center;\n font-size: 100%;\n width: 50px;\n height: 50px;\n &.townsfolk {\n color: $townsfolk;\n }\n &.outsider {\n color: $outsider;\n }\n &.minion {\n color: $minion;\n }\n &.demon {\n color: $demon;\n }\n }\n}\n\n.roles .modal .warning {\n color: red;\n text-align: center;\n margin: auto;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RoleSelectionModal.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RoleSelectionModal.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./RoleSelectionModal.vue?vue&type=template&id=734de2cf&\"\nimport script from \"./RoleSelectionModal.vue?vue&type=script&lang=js&\"\nexport * from \"./RoleSelectionModal.vue?vue&type=script&lang=js&\"\nimport style0 from \"./RoleSelectionModal.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","var render = function () {var _vm=this;var _h=_vm.$createElement;var _c=_vm._self._c||_h;return _c('div',{attrs:{\"id\":\"screenshot\"}},[_c('video',{ref:\"video\",attrs:{\"autoplay\":\"\"}}),_c('canvas',{ref:\"canvas\"})])}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","<template>\n <div id=\"screenshot\">\n <video ref=\"video\" autoplay></video>\n <canvas ref=\"canvas\"></canvas>\n </div>\n</template>\n\n<script>\nexport default {\n data: function() {\n return {\n stream: null\n };\n },\n methods: {\n async capture({ x, y, width, height }) {\n const canvas = this.$refs.canvas;\n const video = this.$refs.video;\n // start capturing\n if (!this.stream || !this.stream.active) {\n alert(\n \"Please select to stream the current browser tab to get the appropriate screenshots\"\n );\n try {\n this.stream = await navigator.mediaDevices.getDisplayMedia({\n video: {\n // frameRate: 5,\n cursor: \"never\"\n },\n audio: false\n });\n } catch (err) {\n this.$emit(\"error\", err);\n }\n }\n // get screenshot\n if (this.stream && this.stream.active) {\n video.srcObject = this.stream;\n video.play();\n setTimeout(() => {\n const context = canvas.getContext(\"2d\");\n canvas.setAttribute(\"width\", width || video.videoWidth);\n canvas.setAttribute(\"height\", height || video.videoHeight);\n context.drawImage(\n video,\n x || 0,\n y || 0,\n width || video.videoWidth,\n height || video.videoHeight,\n 0,\n 0,\n width || video.videoWidth,\n height || video.videoHeight\n );\n canvas.toBlob(blob => {\n try {\n // eslint-disable-next-line no-undef\n const item = new ClipboardItem({ \"image/png\": blob });\n navigator.clipboard.write([item]);\n this.$emit(\"success\");\n } catch (err) {\n this.$emit(\"error\", err);\n }\n });\n }, 100);\n }\n }\n }\n};\n</script>\n\n<style scoped>\nvideo {\n width: 100%;\n height: 100%;\n display: none;\n}\ncanvas {\n width: 100%;\n height: 100%;\n display: none;\n}\n</style>\n","import mod from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Screenshot.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Screenshot.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./Screenshot.vue?vue&type=template&id=54d26403&scoped=true&\"\nimport script from \"./Screenshot.vue?vue&type=script&lang=js&\"\nexport * from \"./Screenshot.vue?vue&type=script&lang=js&\"\nimport style0 from \"./Screenshot.vue?vue&type=style&index=0&id=54d26403&scoped=true&lang=css&\"\n\n\n/* normalize component */\nimport normalizer from \"!../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n \"54d26403\",\n null\n \n)\n\nexport default component.exports","<template>\n <div\n id=\"app\"\n @keyup=\"keyup\"\n tabindex=\"-1\"\n v-bind:class=\"{ screenshot: isScreenshot }\"\n >\n <TownInfo :players=\"players\" :edition=\"edition\"></TownInfo>\n <TownSquare\n :is-public=\"isPublic\"\n :players=\"players\"\n :roles=\"roles\"\n :zoom=\"zoom\"\n @screenshot=\"takeScreenshot\"\n ></TownSquare>\n\n <Modal\n class=\"editions\"\n v-show=\"isEditionModalOpen\"\n @close=\"isEditionModalOpen = false\"\n >\n <h3>Select an edition:</h3>\n <ul class=\"editions\">\n <li\n v-for=\"edition in editions\"\n class=\"edition\"\n v-bind:class=\"['edition-' + edition.id]\"\n v-bind:key=\"edition.id\"\n @click=\"setEdition(edition.id)\"\n >\n {{ edition.name }}\n </li>\n </ul>\n </Modal>\n\n <RoleSelectionModal\n :players=\"players\"\n :roles=\"roles\"\n :is-open=\"isRoleModalOpen\"\n @close=\"isRoleModalOpen = false\"\n ></RoleSelectionModal>\n\n <Screenshot\n ref=\"screenshot\"\n @success=\"onScreenshot(true)\"\n @error=\"onScreenshot(false)\"\n ></Screenshot>\n\n <div class=\"controls\">\n <font-awesome-icon\n icon=\"camera\"\n @click=\"takeScreenshot()\"\n v-bind:class=\"{ success: isScreenshotSuccess }\"\n />\n <font-awesome-icon icon=\"cog\" @click=\"isControlOpen = !isControlOpen\" />\n <ul v-if=\"isControlOpen\">\n <li @click=\"togglePublic\">Toggle <em>G</em>rimoire</li>\n <li>\n Size\n <font-awesome-icon @click=\"zoom -= 0.1\" icon=\"search-minus\" />\n {{ Math.round(zoom * 100) }}%\n <font-awesome-icon @click=\"zoom += 0.1\" icon=\"search-plus\" />\n </li>\n <li @click=\"addPlayer\" v-if=\"players.length < 20\">\n <em>A</em>dd Player\n </li>\n <li @click=\"randomizeSeatings\" v-if=\"players.length > 2\">\n <em>R</em>andomize Seatings\n </li>\n <li @click=\"clearPlayers\" v-if=\"players.length\">\n Clear Players\n </li>\n <li @click=\"clearRoles\" v-if=\"players.length\">\n Clear Roles\n </li>\n <li @click=\"showEditionModal\" v-if=\"players.length > 4\">\n Select Edition\n </li>\n <li @click=\"showRoleModal\" v-if=\"players.length > 4\">\n Select Roles\n </li>\n </ul>\n </div>\n </div>\n</template>\n\n<script>\nimport TownSquare from \"./components/TownSquare\";\nimport TownInfo from \"./components/TownInfo\";\nimport Modal from \"./components/Modal\";\nimport RoleSelectionModal from \"./components/RoleSelectionModal\";\nimport rolesJSON from \"./roles\";\nimport editionJSON from \"./editions\";\nimport Screenshot from \"./components/Screenshot\";\n\nexport default {\n components: {\n Screenshot,\n TownSquare,\n TownInfo,\n Modal,\n RoleSelectionModal\n },\n data: function() {\n return {\n editions: editionJSON,\n isPublic: true,\n isControlOpen: false,\n isEditionModalOpen: false,\n isRoleModalOpen: false,\n isScreenshotSuccess: false,\n isScreenshot: false,\n players: [],\n roles: this.getRolesByEdition(),\n edition: \"tb\",\n zoom: 1\n };\n },\n methods: {\n takeScreenshot(dimensions = {}) {\n this.isControlOpen = false;\n this.isScreenshotSuccess = false;\n this.isScreenshot = true;\n this.$refs.screenshot.capture(dimensions);\n },\n onScreenshot(success = false) {\n this.isScreenshotSuccess = success;\n this.isScreenshot = false;\n },\n togglePublic() {\n this.isPublic = !this.isPublic;\n this.isControlOpen = false;\n },\n addPlayer() {\n const name = prompt(\"Player name\");\n if (name) {\n this.players.push({\n name,\n role: {},\n reminders: []\n });\n }\n },\n randomizeSeatings() {\n this.isPublic = false;\n this.isControlOpen = false;\n if (confirm(\"Are you sure you want to randomize seatings?\")) {\n this.players = this.players\n .map(a => [Math.random(), a])\n .sort((a, b) => a[0] - b[0])\n .map(a => a[1]);\n }\n },\n clearPlayers() {\n this.isControlOpen = false;\n if (confirm(\"Are you sure you want to remove all players?\")) {\n this.players = [];\n }\n },\n clearRoles() {\n this.isControlOpen = false;\n if (confirm(\"Are you sure you want to remove all player roles?\")) {\n this.players.forEach(player => {\n player.role = {};\n player.reminders = [];\n });\n }\n },\n getRolesByEdition(edition = \"tb\") {\n const selectedEdition = editionJSON.find(({ id }) => id === edition);\n return new Map(\n rolesJSON\n .filter(\n r => r.edition === edition || selectedEdition.roles.includes(r.id)\n )\n .sort((a, b) => b.team.localeCompare(a.team))\n .map(role => [role.id, role])\n );\n },\n showEditionModal() {\n this.isEditionModalOpen = true;\n this.isPublic = false;\n this.isControlOpen = false;\n },\n setEdition(edition) {\n this.edition = edition;\n this.isEditionModalOpen = false;\n },\n showRoleModal() {\n this.isRoleModalOpen = true;\n this.isPublic = false;\n this.isControlOpen = false;\n },\n keyup({ key }) {\n switch (key) {\n case \"g\":\n this.togglePublic();\n break;\n case \"a\":\n this.addPlayer();\n break;\n case \"r\":\n this.randomizeSeatings();\n break;\n }\n }\n },\n mounted() {\n if (localStorage.isPublic !== undefined) {\n this.isPublic = JSON.parse(localStorage.isPublic);\n }\n if (localStorage.edition) {\n this.edition = localStorage.edition;\n this.roles = this.getRolesByEdition(this.edition);\n }\n if (localStorage.players) {\n this.players = JSON.parse(localStorage.players).map(player => ({\n ...player,\n role: this.roles.get(player.role) || {}\n }));\n }\n },\n watch: {\n players: {\n handler(newPlayers) {\n const firstNight = [0];\n const otherNight = [0];\n newPlayers.forEach(({ role }) => {\n if (role.firstNight && !firstNight.includes(role.firstNight)) {\n firstNight.push(role.firstNight);\n }\n if (role.otherNight && !otherNight.includes(role.otherNight)) {\n otherNight.push(role.otherNight);\n }\n });\n firstNight.sort();\n otherNight.sort();\n newPlayers.forEach(player => {\n player.firstNight = Math.max(\n firstNight.indexOf(player.role.firstNight),\n 0\n );\n player.otherNight = Math.max(\n otherNight.indexOf(player.role.otherNight),\n 0\n );\n });\n localStorage.players = JSON.stringify(\n newPlayers.map(player => ({\n ...player,\n role: player.role.id || {}\n }))\n );\n },\n deep: true\n },\n edition(newEdition) {\n localStorage.edition = newEdition;\n this.roles = this.getRolesByEdition(newEdition);\n },\n isPublic(newIsPublic) {\n localStorage.isPublic = JSON.stringify(newIsPublic);\n }\n }\n};\n</script>\n\n<style lang=\"scss\">\n@import \"vars\";\n\n@font-face {\n font-family: \"Papyrus\";\n src: url(\"assets/fonts/papyrus.eot\"); /* IE9*/\n src: url(\"assets/fonts/papyrus.eot?#iefix\") format(\"embedded-opentype\"),\n /* IE6-IE8 */ url(\"assets/fonts/papyrus.woff2\") format(\"woff2\"),\n /* chrome firefox */ url(\"assets/fonts/papyrus.woff\") format(\"woff\"),\n /* chrome firefox */ url(\"assets/fonts/papyrus.ttf\") format(\"truetype\"),\n /* chrome firefox opera Safari, Android, iOS 4.2+*/\n url(\"assets/fonts/papyrus.svg#PapyrusW01\") format(\"svg\"); /* iOS 4.1- */\n}\n\nhtml,\nbody {\n font-size: 1.2em;\n line-height: 1.4;\n background: url(\"assets/background.jpg\") center center;\n background-size: cover;\n color: white;\n height: 100%;\n font-family: \"Roboto Condensed\", sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n padding: 0;\n margin: 0;\n overflow: hidden;\n}\n\n* {\n box-sizing: border-box;\n position: relative;\n}\n\nh1,\nh2,\nh3,\nh4,\nh5 {\n margin: 0;\n text-align: center;\n}\n\nul {\n list-style-type: none;\n margin: 0;\n padding: 0;\n}\n\n#app {\n height: 100%;\n}\n\n// success animation\n@keyframes greenToWhite {\n from {\n color: green;\n }\n to {\n color: white;\n }\n}\n\n// Controls\n.controls {\n position: absolute;\n right: 0;\n top: 0;\n text-align: right;\n padding: 10px;\n svg {\n cursor: pointer;\n margin-left: 10px;\n &.success {\n animation: greenToWhite 1s normal forwards;\n animation-iteration-count: 1;\n }\n }\n ul {\n display: flex;\n list-style-type: none;\n padding: 0;\n margin: 0;\n flex-direction: column;\n border-radius: 10px;\n overflow: hidden;\n box-shadow: 0 0 10px black;\n li {\n padding: 5px 10px;\n color: white;\n text-align: center;\n background: rgba(0, 0, 0, 0.7);\n margin-bottom: 1px;\n cursor: pointer;\n &:hover {\n background-color: red;\n }\n em {\n text-decoration: underline;\n font-style: normal;\n font-weight: bold;\n }\n }\n }\n}\n\n// Editions\n@each $img in $editions {\n .edition-#{$img} {\n background-image: url(\"./assets/edition-#{$img}.png\");\n }\n}\n\nul.editions .edition {\n text-align: center;\n padding-top: 100px;\n background-position: center center;\n background-size: 100% auto;\n background-repeat: no-repeat;\n width: 200px;\n margin: 5px;\n font-size: 120%;\n font-weight: bold;\n text-shadow: -1px -1px 0 #000, 1px -1px 0 #000, -1px 1px 0 #000,\n 1px 1px 0 #000, 0 0 5px rgba(0, 0, 0, 0.75);\n cursor: pointer;\n &:hover {\n color: red;\n }\n}\n\n// Buttons\n.button-group {\n display: flex;\n align-items: center;\n justify-content: center;\n align-content: center;\n .button {\n margin: 5px 0;\n border-radius: 0;\n &:first-child {\n border-top-left-radius: 15px;\n border-bottom-left-radius: 15px;\n }\n &:last-child {\n border-top-right-radius: 15px;\n border-bottom-right-radius: 15px;\n }\n }\n}\n.button {\n padding: 0;\n border: solid 0.125em transparent;\n border-radius: 15px;\n box-shadow: inset 0 1px 1px #9c9c9c, 0 0 10px #000;\n background: radial-gradient(\n at 0 -15%,\n rgba(#fff, 0.07) 70%,\n rgba(#fff, 0) 71%\n )\n 0 0/ 80% 90% no-repeat content-box,\n linear-gradient(#4e4e4e, #040404) content-box,\n linear-gradient(#292929, #010101) border-box;\n color: white;\n font-weight: bold;\n text-shadow: 1px 1px rgba(0, 0, 0, 0.5);\n line-height: 40px;\n margin: 5px auto;\n font-size: 1em;\n cursor: pointer;\n transition: all 200ms;\n &:hover {\n color: red;\n }\n &.disabled {\n color: gray;\n cursor: default;\n }\n &:before,\n &:after {\n content: \" \";\n display: inline-block;\n width: 10px;\n height: 10px;\n }\n}\n</style>\n","import mod from \"-!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"; export default mod; export * from \"-!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=script&lang=js&\"","import { render, staticRenderFns } from \"./App.vue?vue&type=template&id=2847fd82&\"\nimport script from \"./App.vue?vue&type=script&lang=js&\"\nexport * from \"./App.vue?vue&type=script&lang=js&\"\nimport style0 from \"./App.vue?vue&type=style&index=0&lang=scss&\"\n\n\n/* normalize component */\nimport normalizer from \"!../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n script,\n render,\n staticRenderFns,\n false,\n null,\n null,\n null\n \n)\n\nexport default component.exports","import Vue from \"vue\";\nimport App from \"./App\";\nimport { library } from \"@fortawesome/fontawesome-svg-core\";\nimport {\n faUsers,\n faHeartbeat,\n faVoteYea,\n faUserFriends,\n faUser,\n faTimesCircle,\n faCog,\n faSearchMinus,\n faSearchPlus,\n faCamera\n} from \"@fortawesome/free-solid-svg-icons\";\nimport { FontAwesomeIcon } from \"@fortawesome/vue-fontawesome\";\n\nlibrary.add(\n faUsers,\n faHeartbeat,\n faVoteYea,\n faUserFriends,\n faUser,\n faTimesCircle,\n faCog,\n faSearchMinus,\n faSearchPlus,\n faCamera\n);\n\nVue.component(\"font-awesome-icon\", FontAwesomeIcon);\n\nVue.config.productionTip = false;\n\nnew Vue({\n render: h => h(App)\n}).$mount(\"#app\");\n","import mod from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss&\"; export default mod; export * from \"-!../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../node_modules/cache-loader/dist/cjs.js??ref--0-0!../node_modules/vue-loader/lib/index.js??vue-loader-options!./App.vue?vue&type=style&index=0&lang=scss&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Player.vue?vue&type=style&index=0&lang=scss&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Player.vue?vue&type=style&index=0&lang=scss&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RoleSelectionModal.vue?vue&type=style&index=0&lang=scss&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./RoleSelectionModal.vue?vue&type=style&index=0&lang=scss&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Token.vue?vue&type=style&index=0&id=eb60a182&scoped=true&lang=scss&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Token.vue?vue&type=style&index=0&id=eb60a182&scoped=true&lang=scss&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownInfo.vue?vue&type=style&index=0&lang=scss&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--8-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--8-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--8-oneOf-1-2!../../node_modules/sass-loader/dist/cjs.js??ref--8-oneOf-1-3!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./TownInfo.vue?vue&type=style&index=0&lang=scss&\"","import mod from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Screenshot.vue?vue&type=style&index=0&id=54d26403&scoped=true&lang=css&\"; export default mod; export * from \"-!../../node_modules/mini-css-extract-plugin/dist/loader.js??ref--6-oneOf-1-0!../../node_modules/css-loader/dist/cjs.js??ref--6-oneOf-1-1!../../node_modules/vue-loader/lib/loaders/stylePostLoader.js!../../node_modules/postcss-loader/src/index.js??ref--6-oneOf-1-2!../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Screenshot.vue?vue&type=style&index=0&id=54d26403&scoped=true&lang=css&\""],"sourceRoot":""} |