main.vue 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. <script>
  2. export default {
  3. data() {
  4. return {
  5. history: [],
  6. state: {
  7. completes: 0,
  8. skips: 0
  9. }
  10. }
  11. },
  12. methods: {
  13. keydown(event) {
  14. if (event.code === 'Escape') this.skip()
  15. if (event.code === 'Backspace') this.undo()
  16. if (event.code === 'Space') this.complete()
  17. },
  18. newState(state) {
  19. this.history.push(this.state)
  20. this.state = {
  21. ...this.state,
  22. ...state
  23. }
  24. },
  25. complete() {
  26. this.newState({
  27. completes: this.state.completes + 1
  28. })
  29. },
  30. skip() {
  31. this.newState({
  32. skips: this.state.skips + 1
  33. })
  34. },
  35. undo() {
  36. this.state = this.history.pop() || this.state
  37. }
  38. }
  39. }
  40. </script>
  41. <template>
  42. <div @keydown="keydown" tabindex="0">
  43. <v-app>
  44. <v-content>
  45. <v-toolbar color="primary">
  46. <v-toolbar-side-icon />
  47. <v-toolbar-title>Twitch Rivals</v-toolbar-title>
  48. </v-toolbar>
  49. <v-container>
  50. <div class="score">
  51. <div class="skips-label">Skips <strong>({{state.skips}} / 15)</strong></div>
  52. <div class="skips">
  53. <div class="skip" v-for="(_, i) in Array(Math.max(15, state.skips)).fill()" :key="i" :class="{ used: i < state.skips, extra: i >= 15 }" />
  54. </div>
  55. <div class="completes-label">Completes <strong>({{state.completes}})</strong>:</div>
  56. <div class="completes">
  57. <div class="complete" v-for="(_, i) in Array(state.completes).fill()" :key="i" />
  58. </div>
  59. </div>
  60. </v-container>
  61. </v-content>
  62. </v-app>
  63. </div>
  64. </template>
  65. <style lang="less" scoped>
  66. .score {
  67. display: grid;
  68. margin: 10px;
  69. box-sizing: border-box;
  70. width: calc(100% - 20px);
  71. grid-template: 'skips-label skips' 'completes-label completes' / 100px auto;
  72. .skip, .complete {
  73. display: inline-block;
  74. width: 15px;
  75. margin: 2.5px;
  76. height: 15px;
  77. border-radius: 7.5px;
  78. }
  79. .skip {
  80. border: solid 1px darkmagenta;
  81. &.used {
  82. background-color: purple;
  83. }
  84. &.extra {
  85. background-color: red;
  86. }
  87. }
  88. .complete {
  89. border: solid 1px green;
  90. background-color: greenyellow;
  91. }
  92. }
  93. </style>