From c2cdb47cd5e2a727ee0be71f67348be1469ea170 Mon Sep 17 00:00:00 2001 From: Jungwoo Date: Tue, 21 Feb 2023 16:44:53 +0900 Subject: [PATCH 01/14] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EA=B2=8C?= =?UTF-8?q?=EC=9E=84=EC=9D=98=20UI=20=EA=BB=8D=EB=8D=B0=EA=B8=B0=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 96 +++++++++++++++- reset.css | 129 +++++++++++++++++++++ src/step2-index.js | 2 + style.css | 275 +++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 500 insertions(+), 2 deletions(-) create mode 100644 reset.css create mode 100644 style.css diff --git a/index.html b/index.html index e083bc1cbb..9746821880 100644 --- a/index.html +++ b/index.html @@ -5,12 +5,104 @@ 🎱 ν–‰μš΄μ˜ 둜또 Document + +
-

🎱 ν–‰μš΄μ˜ 둜또

+
+

🎱 ν–‰μš΄μ˜ 둜또

+
+
+
+

🎱 λ‚΄ 번호 당첨 확인 🎱

+
+ +
+ + +
+ [ERROR]: +
+
+
+
총 7개λ₯Ό κ΅¬λ§€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
+
+
+
🎟️
+ 12, 28, 22, 37, 19, 23 +
+
+
🎟️
+ 12, 28, 22, 37, 19, 23 +
+
+
🎟️
+ 12, 28, 22, 37, 19, 23 +
+
+
🎟️
+ 12, 28, 22, 37, 19, 23 +
+
+
🎟️
+ 12, 28, 22, 37, 19, 23 +
+
+
🎟️
+ 12, 28, 22, 37, 19, 23 +
+
+
🎟️
+ 12, 28, 22, 37, 19, 23 +
+
+
🎟️
+ 12, 28, 22, 37, 19, 23 +
+
+
🎟️
+ 12, 28, 22, 37, 19, 23 +
+
+
🎟️
+ 12, 28, 22, 37, 19, 23 +
+
+
+
+
μ§€λ‚œ μ£Ό λ‹Ήμ²¨λ²ˆν˜Έ 6κ°œμ™€ λ³΄λ„ˆμŠ€ 번호 1개λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.
+
+
+ +
+ + + + + + +
+
+
+ + + [ERROR]: +
+
+ +
+
+
+
+
+
+ +
+
- + + diff --git a/reset.css b/reset.css new file mode 100644 index 0000000000..a3f76817f3 --- /dev/null +++ b/reset.css @@ -0,0 +1,129 @@ +/* http://meyerweb.com/eric/tools/css/reset/ + v2.0 | 20110126 + License: none (public domain) +*/ + +html, +body, +div, +span, +applet, +object, +iframe, +h1, +h2, +h3, +h4, +h5, +h6, +p, +blockquote, +pre, +a, +abbr, +acronym, +address, +big, +cite, +code, +del, +dfn, +em, +img, +ins, +kbd, +q, +s, +samp, +small, +strike, +strong, +sub, +sup, +tt, +var, +b, +u, +i, +center, +dl, +dt, +dd, +ol, +ul, +li, +fieldset, +form, +label, +legend, +table, +caption, +tbody, +tfoot, +thead, +tr, +th, +td, +article, +aside, +canvas, +details, +embed, +figure, +figcaption, +footer, +header, +hgroup, +menu, +nav, +output, +ruby, +section, +summary, +time, +mark, +audio, +video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; +} +/* HTML5 display-role reset for older browsers */ +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +menu, +nav, +section { + display: block; +} +body { + line-height: 1; +} +ol, +ul { + list-style: none; +} +blockquote, +q { + quotes: none; +} +blockquote:before, +blockquote:after, +q:before, +q:after { + content: ''; + content: none; +} +table { + border-collapse: collapse; + border-spacing: 0; +} diff --git a/src/step2-index.js b/src/step2-index.js index f1527d9448..f3550062fb 100644 --- a/src/step2-index.js +++ b/src/step2-index.js @@ -2,3 +2,5 @@ * step 2의 μ‹œμž‘μ μ΄ λ˜λŠ” νŒŒμΌμž…λ‹ˆλ‹€. * λ…Έλ“œ ν™˜κ²½μ—μ„œ μ‚¬μš©ν•˜λŠ” readline 등을 뢈러올 경우 μ •μƒμ μœΌλ‘œ λΉŒλ“œν•  수 μ—†μŠ΅λ‹ˆλ‹€. */ + +const budgetForm = document.querySelector('.budget_form'); diff --git a/style.css b/style.css new file mode 100644 index 0000000000..86b5241f96 --- /dev/null +++ b/style.css @@ -0,0 +1,275 @@ +:root { + --lotto-primary: #4e5ba6; + --lotto-greyscale-1: #ffffff; + --lotto-greyscale-2: #fcfcfd; + --lotto-greyscale-3: #b4b4b4; + --lotto-greyscale-4: #8b8b8b; + --lotto-greyscale-5: #000000; +} + +#app { + height: 100vh; +} + +header { + height: 64px; + border-bottom: 1px solid rgba(78, 91, 166, 0.2); + background-color: var(--lotto-primary); +} + +header > h1 { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-size: 24px; + line-height: 36px; + color: var(--lotto-greyscale-1); + + padding: 14px 0 14px 130px; +} + +form { + position: relative; +} + +main { + height: 100%; + display: flex; + align-items: center; + justify-content: center; +} + +main > div { + position: relative; + height: 727px; + width: 414px; + padding: 0 16px; + + border: 1px solid rgba(0, 0, 0, 0.12); + border-radius: 4px; +} + +main h2 { + padding: 52px 16px 28px 16px; + text-align: center; + + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-size: 24px; + letter-spacing: 0.15px; + + color: var(--lotto-greyscale-5); +} + +.budget_form { + height: 64px; +} + +.budget_form > label { + display: block; + + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-size: 15px; + line-height: 24px; + + letter-spacing: 0.5px; + + color: var(--lotto-greyscale-5); +} + +.budget_form > div { + display: flex; + align-items: center; + justify-content: space-between; +} + +.budget_form input { + width: 310px; + height: 36px; + padding-left: 8px; + + border: 1px solid #b4b4b4; + border-radius: 4px; +} + +#step2 { + visibility: hidden; +} + +.buy_btn { + padding: 6px 6px 6px 8px; + background: #4e5ba6; + border-radius: 4px; + border: none; + width: 56px; + height: 36px; + + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-size: 14px; + + color: var(--lotto-greyscale-1); + cursor: pointer; +} + +.lottos_list { + margin-top: 28px; +} + +.lottos_list_box { + height: 300px; + margin-top: 8px; + overflow: scroll; +} + +.lotto { + display: flex; + align-items: center; + margin-bottom: 8px; + + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-size: 15px; + line-height: 24px; + + letter-spacing: 0.5px; + + color: var(--lotto-greyscale-5); +} + +.lottos_list_box > .lotto:not(:last-child) { + margin-bottom: 16px; +} + +.lotto > div { + font-size: 35px; + display: flex; + padding-top: 3px; + margin-right: 8px; +} + +.lotto_number_form label { + margin-bottom: 8px; +} + +.lotto_number_form > div { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-size: 15px; + margin-bottom: 20px; + + letter-spacing: 0.5px; + + color: var(--lotto-greyscale-5); +} + +.winning_numbers input:not(:last-child) { + margin-right: 8px; +} + +.bonus_number { + display: flex; + flex-direction: column; + align-items: flex-end; +} + +.arrange_inputs { + display: flex; + justify-content: space-between; +} + +.lotto_number_form { + position: absolute; + width: 414px; + bottom: 32px; +} + +.lotto_number_form input { + width: 34px; + height: 36px; + + border: 1px solid #b4b4b4; + border-radius: 4px; + text-align: center; +} + +.winning_numbers { + display: flex; + flex-direction: column; +} + +.bonus_number { + display: flex; + flex-direction: column; +} + +.result_btn { + padding: 6px 6px 6px 8px; + + width: 100%; + height: 36px; + padding-bottom: 32px; + border: none; + border-radius: 4px; + background: var(--lotto-primary); + + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-size: 14px; + line-height: 28px; + + letter-spacing: 1.25px; + text-transform: uppercase; + + color: var(--lotto-greyscale-1); +} + +footer { + height: 80px; +} + +footer > div { + height: 100%; + border-top: 1px solid rgba(78, 91, 166, 0.2); +} + +footer label { + display: flex; + justify-content: center; + align-items: center; + height: 100%; + + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-size: 14px; + letter-spacing: 1.25px; + + color: var(--lotto-primary); +} + +.error_message { + position: absolute; + display: inline-block; + height: 16px; + color: red; + font-weight: 600; + left: 0; +} + +.number_error { + bottom: 40px; + visibility: hidden; +} + +.budget_error { + top: 67px; + visibility: hidden; +} From 6bd3775f8782c62f49cbfd3c9f83a74b1d1bc2da Mon Sep 17 00:00:00 2001 From: Jungwoo Date: Wed, 22 Feb 2023 11:25:22 +0900 Subject: [PATCH 02/14] =?UTF-8?q?feat:=20=EB=A1=9C=EB=98=90=20=EA=B5=AC?= =?UTF-8?q?=EC=9E=85=20=EA=B8=88=EC=95=A1=EC=9D=84=20=EC=9E=85=EB=A0=A5?= =?UTF-8?q?=EB=B0=9B=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/step2-index.js | 30 ++++++++++++++++++++++++++---- 1 file changed, 26 insertions(+), 4 deletions(-) diff --git a/src/step2-index.js b/src/step2-index.js index f3550062fb..9c2e993042 100644 --- a/src/step2-index.js +++ b/src/step2-index.js @@ -1,6 +1,28 @@ -/** - * step 2의 μ‹œμž‘μ μ΄ λ˜λŠ” νŒŒμΌμž…λ‹ˆλ‹€. - * λ…Έλ“œ ν™˜κ²½μ—μ„œ μ‚¬μš©ν•˜λŠ” readline 등을 뢈러올 경우 μ •μƒμ μœΌλ‘œ λΉŒλ“œν•  수 μ—†μŠ΅λ‹ˆλ‹€. - */ +import '../reset.css'; +import '../style.css'; + +import validator from './domain/validator'; const budgetForm = document.querySelector('.budget_form'); +const budgetError = document.querySelector('.budget_error'); + +const step2 = document.querySelector('#step2'); + +const displayBudgetError = (message) => { + budgetError.innerText = message; + budgetError.style.visibility = 'visible'; +}; + +const onSubmitBudgetForm = (event) => { + event.preventDefault(); + const budget = event.target[0].value; + try { + validator.validateBudget(budget); + } catch ({ message }) { + return displayBudgetError(message); + } + budgetError.innerText = ''; + step2.style.visibility = 'visible'; +}; + +budgetForm.addEventListener('submit', onSubmitBudgetForm); From 1f0e29a3a1dd16e4e2f0f45d97a38649101cc610 Mon Sep 17 00:00:00 2001 From: Jungwoo Date: Wed, 22 Feb 2023 14:08:19 +0900 Subject: [PATCH 03/14] =?UTF-8?q?feat:=20=EA=B5=AC=EB=A7=A4=ED=95=9C=20?= =?UTF-8?q?=EB=A1=9C=EB=98=90=EB=A5=BC=20=EB=A0=8C=EB=8D=94=EB=A7=81?= =?UTF-8?q?=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 73 +- package-lock.json | 1440 +-------------------------------------- package.json | 8 +- src/domain/LottoGame.js | 1 + src/step2-index.js | 27 +- style.css | 12 +- 6 files changed, 71 insertions(+), 1490 deletions(-) diff --git a/index.html b/index.html index 9746821880..e8e6da2040 100644 --- a/index.html +++ b/index.html @@ -5,8 +5,6 @@ 🎱 ν–‰μš΄μ˜ 둜또 Document - - @@ -20,74 +18,33 @@

🎱 λ‚΄ 번호 당첨 확인 🎱

- +
- [ERROR]: +
-
-
총 7개λ₯Ό κ΅¬λ§€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.
-
-
-
🎟️
- 12, 28, 22, 37, 19, 23 -
-
-
🎟️
- 12, 28, 22, 37, 19, 23 -
-
-
🎟️
- 12, 28, 22, 37, 19, 23 -
-
-
🎟️
- 12, 28, 22, 37, 19, 23 -
-
-
🎟️
- 12, 28, 22, 37, 19, 23 -
-
-
🎟️
- 12, 28, 22, 37, 19, 23 -
-
-
🎟️
- 12, 28, 22, 37, 19, 23 -
-
-
🎟️
- 12, 28, 22, 37, 19, 23 -
-
-
🎟️
- 12, 28, 22, 37, 19, 23 -
-
-
🎟️
- 12, 28, 22, 37, 19, 23 -
-
+
+
+
μ§€λ‚œ μ£Ό λ‹Ήμ²¨λ²ˆν˜Έ 6κ°œμ™€ λ³΄λ„ˆμŠ€ 번호 1개λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.
-
+
- - - - - - + + + + + +
-
+
- + [ERROR]:
@@ -103,6 +60,6 @@

🎱 λ‚΄ 번호 당첨 확인 🎱

- + diff --git a/package-lock.json b/package-lock.json index 9331b2d5a7..3c71c05907 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2152,12 +2152,6 @@ "integrity": "sha512-qcUXuemtEu+E5wZSJHNxUXeCZhAfXKQ41D+duX+VYPde7xyEVZci+/oXKJL13tnRs9lR2pr4fod59GT6/X1/yQ==", "dev": true }, - "@types/json5": { - "version": "0.0.29", - "resolved": "https://registry.npmjs.org/@types/json5/-/json5-0.0.29.tgz", - "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", - "dev": true - }, "@types/mime": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", @@ -2579,124 +2573,12 @@ "sprintf-js": "~1.0.2" } }, - "aria-query": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.1.3.tgz", - "integrity": "sha512-R5iJ5lkuHybztUfuOAznmboyjWq8O6sqNqtK7CLOqdydi54VNbORp49mb14KbWgG1QD3JFO9hJdZ+y4KutfdOQ==", - "dev": true, - "requires": { - "deep-equal": "^2.0.5" - }, - "dependencies": { - "deep-equal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", - "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - } - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - } - } - }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, - "array-includes": { - "version": "3.1.6", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.6.tgz", - "integrity": "sha512-sgTbLvL6cNnw24FnbaDyjmvddQ2ML8arZsgaJhoABMoplz/4QRhtrYS+alr1BUM1Bwp6dhx8vVCBSLG+StwOFw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "is-string": "^1.0.7" - }, - "dependencies": { - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } - } - }, "array-union": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", @@ -2712,193 +2594,15 @@ "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", "dev": true }, - "array.prototype.flat": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flat/-/array.prototype.flat-1.3.1.tgz", - "integrity": "sha512-roTU0KWIOmJ4DRLmwKd19Otg0/mT3qPNt0Qb3GWW8iObuZXxrjB/pzn0R3hqpRSWg4HCwqx+0vwOnWnvlOyeIA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "dependencies": { - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } - } - }, - "array.prototype.flatmap": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/array.prototype.flatmap/-/array.prototype.flatmap-1.3.1.tgz", - "integrity": "sha512-8UGn9O1FDVvMNB0UlLv4voxRMze7+FpHyF5mSMRjWHUMlpoDViniy05870VlxhfgTnLbpuwTzvD76MTtWxB/mQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0" - }, - "dependencies": { - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } - } - }, - "array.prototype.tosorted": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array.prototype.tosorted/-/array.prototype.tosorted-1.1.1.tgz", - "integrity": "sha512-pZYPXPRl2PqWcsUs6LOMn+1f1532nEoPTYowBtqLwAW+W8vSVhkIGnmOX1t/UQjD6YGI0vcD2B1U7ZFGQH9jnQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "es-shim-unscopables": "^1.0.0", - "get-intrinsic": "^1.1.3" - }, - "dependencies": { - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } - } - }, - "ast-types-flow": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/ast-types-flow/-/ast-types-flow-0.0.7.tgz", - "integrity": "sha512-eBvWn1lvIApYMhzQMsu9ciLfkBY499mFZlNqG+/9WR7PVlroQw0vG30cOQQbaKz3sCEc44TAOu2ykzqXSNnwag==", - "dev": true - }, "async": { - "version": "2.6.3", - "resolved": "https://registry.npmjs.org/async/-/async-2.6.3.tgz", - "integrity": "sha512-zflvls11DCy+dQWzTW2dzuilv8Z5X/pjfmZOWba6TNIVDm+2UDaJmXSOXlasHKfNBs8oo3M0aT50fDEWfKZjXg==", + "version": "2.6.4", + "resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz", + "integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==", "dev": true, "requires": { "lodash": "^4.17.14" } }, - "available-typed-arrays": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.5.tgz", - "integrity": "sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==", - "dev": true - }, - "axe-core": { - "version": "4.6.3", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.6.3.tgz", - "integrity": "sha512-/BQzOX780JhsxDnPpH4ZiyrJAzcd8AfzFPkv+89veFSr1rcMjuq2JDCwypKaPeB6ljHp9KjXhPpjgCvQlWYuqg==", - "dev": true - }, - "axobject-query": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-3.1.1.tgz", - "integrity": "sha512-goKlv8DZrK9hUh975fnHzhNIO4jUnFCfv/dszV5VwUGDFjI6vQ2VwoyjYjYNEbBE8AH87TduWP5uyDR1D+Iteg==", - "dev": true, - "requires": { - "deep-equal": "^2.0.5" - }, - "dependencies": { - "deep-equal": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-2.2.0.tgz", - "integrity": "sha512-RdpzE0Hv4lhowpIUKKMJfeH6C1pXdtT1/it80ubgWqwI3qpuxUBpC1S4hnHg+zjnuOoDkzUtUCEEkG+XG5l3Mw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "es-get-iterator": "^1.1.2", - "get-intrinsic": "^1.1.3", - "is-arguments": "^1.1.1", - "is-array-buffer": "^3.0.1", - "is-date-object": "^1.0.5", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "isarray": "^2.0.5", - "object-is": "^1.1.5", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4", - "which-boxed-primitive": "^1.0.2", - "which-collection": "^1.0.1", - "which-typed-array": "^1.1.9" - } - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - } - } - }, "babel-jest": { "version": "29.4.2", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-29.4.2.tgz", @@ -3432,12 +3136,6 @@ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, - "confusing-browser-globals": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/confusing-browser-globals/-/confusing-browser-globals-1.0.11.tgz", - "integrity": "sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==", - "dev": true - }, "connect-history-api-fallback": { "version": "1.6.0", "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", @@ -3563,12 +3261,6 @@ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", "dev": true }, - "damerau-levenshtein": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/damerau-levenshtein/-/damerau-levenshtein-1.0.8.tgz", - "integrity": "sha512-sdQSFB7+llfUcQHUQO3+B8ERRj0Oa4w9POWMI/puGtuf7gFywGmkaLCElnudfTiKZV+NvHqL0ifzdrI8Ro7ESA==", - "dev": true - }, "debug": { "version": "4.3.3", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.3.tgz", @@ -3850,175 +3542,12 @@ "is-arrayish": "^0.2.1" } }, - "es-abstract": { - "version": "1.21.1", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.21.1.tgz", - "integrity": "sha512-QudMsPOz86xYz/1dG1OuGBKOELjCh99IIWHLzy5znUB6j8xG2yMA7bfTV86VSqKF+Y/H08vQPR+9jyXpuC6hfg==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "es-set-tostringtag": "^2.0.1", - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "function.prototype.name": "^1.1.5", - "get-intrinsic": "^1.1.3", - "get-symbol-description": "^1.0.0", - "globalthis": "^1.0.3", - "gopd": "^1.0.1", - "has": "^1.0.3", - "has-property-descriptors": "^1.0.0", - "has-proto": "^1.0.1", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.4", - "is-array-buffer": "^3.0.1", - "is-callable": "^1.2.7", - "is-negative-zero": "^2.0.2", - "is-regex": "^1.1.4", - "is-shared-array-buffer": "^1.0.2", - "is-string": "^1.0.7", - "is-typed-array": "^1.1.10", - "is-weakref": "^1.0.2", - "object-inspect": "^1.12.2", - "object-keys": "^1.1.1", - "object.assign": "^4.1.4", - "regexp.prototype.flags": "^1.4.3", - "safe-regex-test": "^1.0.0", - "string.prototype.trimend": "^1.0.6", - "string.prototype.trimstart": "^1.0.6", - "typed-array-length": "^1.0.4", - "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.9" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - } - } - }, - "es-get-iterator": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/es-get-iterator/-/es-get-iterator-1.1.3.tgz", - "integrity": "sha512-sPZmqHBe6JIiTfN5q2pEi//TwxmAFHwj/XEuYjTuse78i8KxaqMTTzxPoFKuzRpDpTJ+0NAbpfenkmH2rePtuw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "is-arguments": "^1.1.1", - "is-map": "^2.0.2", - "is-set": "^2.0.2", - "is-string": "^1.0.7", - "isarray": "^2.0.5", - "stop-iteration-iterator": "^1.0.0" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "dev": true - } - } - }, "es-module-lexer": { "version": "0.9.3", "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", "dev": true }, - "es-set-tostringtag": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.1.tgz", - "integrity": "sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3", - "has": "^1.0.3", - "has-tostringtag": "^1.0.0" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } - } - }, - "es-shim-unscopables": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-shim-unscopables/-/es-shim-unscopables-1.0.0.tgz", - "integrity": "sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, "escalade": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", @@ -4235,223 +3764,6 @@ } } }, - "eslint-config-airbnb": { - "version": "19.0.4", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb/-/eslint-config-airbnb-19.0.4.tgz", - "integrity": "sha512-T75QYQVQX57jiNgpF9r1KegMICE94VYwoFQyMGhrvc+lB8YF2E/M/PYDaQe1AJcWaEgqLE+ErXV1Og/+6Vyzew==", - "dev": true, - "requires": { - "eslint-config-airbnb-base": "^15.0.0", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5" - } - }, - "eslint-config-airbnb-base": { - "version": "15.0.0", - "resolved": "https://registry.npmjs.org/eslint-config-airbnb-base/-/eslint-config-airbnb-base-15.0.0.tgz", - "integrity": "sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==", - "dev": true, - "requires": { - "confusing-browser-globals": "^1.0.10", - "object.assign": "^4.1.2", - "object.entries": "^1.1.5", - "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-import-resolver-node": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.7.tgz", - "integrity": "sha512-gozW2blMLJCeFpBwugLTGyvVjNoeo1knonXAcatC6bjPBZitotxdWf7Gimr25N4c0AAOo4eOUfaG82IJPDpqCA==", - "dev": true, - "requires": { - "debug": "^3.2.7", - "is-core-module": "^2.11.0", - "resolve": "^1.22.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-module-utils": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.7.4.tgz", - "integrity": "sha512-j4GT+rqzCoRKHwURX7pddtIPGySnX9Si/cgMI5ztrcqOPtk5dDEeZ34CQVPphnqkJytlc97Vuk05Um2mJ3gEQA==", - "dev": true, - "requires": { - "debug": "^3.2.7" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "eslint-plugin-import": { - "version": "2.27.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.27.5.tgz", - "integrity": "sha512-LmEt3GVofgiGuiE+ORpnvP+kAm3h6MLZJ4Q5HCyHADofsb4VzXFsRiWj3c0OFiV+3DWFh0qg3v9gcPlfc3zRow==", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flat": "^1.3.1", - "array.prototype.flatmap": "^1.3.1", - "debug": "^3.2.7", - "doctrine": "^2.1.0", - "eslint-import-resolver-node": "^0.3.7", - "eslint-module-utils": "^2.7.4", - "has": "^1.0.3", - "is-core-module": "^2.11.0", - "is-glob": "^4.0.3", - "minimatch": "^3.1.2", - "object.values": "^1.1.6", - "resolve": "^1.22.1", - "semver": "^6.3.0", - "tsconfig-paths": "^3.14.1" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - }, - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-jsx-a11y": { - "version": "6.7.1", - "resolved": "https://registry.npmjs.org/eslint-plugin-jsx-a11y/-/eslint-plugin-jsx-a11y-6.7.1.tgz", - "integrity": "sha512-63Bog4iIethyo8smBklORknVjB0T2dwB8Mr/hIC+fBS0uyHdYYpzM/Ed+YC8VxTjlXHEWFOdmgwcDn1U2L9VCA==", - "dev": true, - "requires": { - "@babel/runtime": "^7.20.7", - "aria-query": "^5.1.3", - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "ast-types-flow": "^0.0.7", - "axe-core": "^4.6.2", - "axobject-query": "^3.1.1", - "damerau-levenshtein": "^1.0.8", - "emoji-regex": "^9.2.2", - "has": "^1.0.3", - "jsx-ast-utils": "^3.3.3", - "language-tags": "=1.0.5", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "semver": "^6.3.0" - }, - "dependencies": { - "emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "dev": true - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-react": { - "version": "7.32.2", - "resolved": "https://registry.npmjs.org/eslint-plugin-react/-/eslint-plugin-react-7.32.2.tgz", - "integrity": "sha512-t2fBMa+XzonrrNkyVirzKlvn5RXzzPwRHtMvLAtVZrt8oxgnTQaYbU6SXTOO1mwQgp1y5+toMSKInnzGr0Knqg==", - "dev": true, - "requires": { - "array-includes": "^3.1.6", - "array.prototype.flatmap": "^1.3.1", - "array.prototype.tosorted": "^1.1.1", - "doctrine": "^2.1.0", - "estraverse": "^5.3.0", - "jsx-ast-utils": "^2.4.1 || ^3.0.0", - "minimatch": "^3.1.2", - "object.entries": "^1.1.6", - "object.fromentries": "^2.0.6", - "object.hasown": "^1.1.2", - "object.values": "^1.1.6", - "prop-types": "^15.8.1", - "resolve": "^2.0.0-next.4", - "semver": "^6.3.0", - "string.prototype.matchall": "^4.0.8" - }, - "dependencies": { - "doctrine": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", - "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, - "resolve": { - "version": "2.0.0-next.4", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.4.tgz", - "integrity": "sha512-iMDbmAWtfU+MHpxt/I5iWI7cY6YVEZUQ3MBgPQ++XD1PELuJHIl82xBmObyP2KyQmkNB2dsqF7seoQQiAn5yDQ==", - "dev": true, - "requires": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } - } - }, - "eslint-plugin-react-hooks": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-4.6.0.tgz", - "integrity": "sha512-oFc7Itz9Qxh2x4gNHStv3BqJq54ExXmfC+a1NjAta66IAN87Wu0R/QArgIS9qKzX3dXKPI9H5crl9QchNMY9+g==", - "dev": true - }, "eslint-scope": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.1.1.tgz", @@ -4833,15 +4145,6 @@ "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==", "dev": true }, - "for-each": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.3.tgz", - "integrity": "sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==", - "dev": true, - "requires": { - "is-callable": "^1.1.3" - } - }, "forwarded": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", @@ -4885,24 +4188,6 @@ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, - "function.prototype.name": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/function.prototype.name/-/function.prototype.name-1.1.5.tgz", - "integrity": "sha512-uN7m/BzVKQnCUF/iW8jYea67v++2u7m5UgENbHRtdDVclOUP+FMPlCNdmk0h/ysGyo2tavMJEDqJAkJdRa1vMA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "es-abstract": "^1.19.0", - "functions-have-names": "^1.2.2" - } - }, - "functions-have-names": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/functions-have-names/-/functions-have-names-1.2.3.tgz", - "integrity": "sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==", - "dev": true - }, "gensync": { "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", @@ -4938,16 +4223,6 @@ "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", "dev": true }, - "get-symbol-description": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/get-symbol-description/-/get-symbol-description-1.0.0.tgz", - "integrity": "sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, "glob": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", @@ -4983,15 +4258,6 @@ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, - "globalthis": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/globalthis/-/globalthis-1.0.3.tgz", - "integrity": "sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3" - } - }, "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", @@ -5013,34 +4279,6 @@ } } }, - "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.3" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } - } - }, "graceful-fs": { "version": "4.2.9", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.9.tgz", @@ -5068,33 +4306,12 @@ "function-bind": "^1.1.1" } }, - "has-bigints": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-bigints/-/has-bigints-1.0.2.tgz", - "integrity": "sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==", - "dev": true - }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true }, - "has-property-descriptors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.0.tgz", - "integrity": "sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.1.1" - } - }, - "has-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.1.tgz", - "integrity": "sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==", - "dev": true - }, "has-symbols": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.2.tgz", @@ -5329,36 +4546,6 @@ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", "dev": true }, - "internal-slot": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.5.tgz", - "integrity": "sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==", - "dev": true, - "requires": { - "get-intrinsic": "^1.2.0", - "has": "^1.0.3", - "side-channel": "^1.0.4" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } - } - }, "interpret": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/interpret/-/interpret-3.1.1.tgz", @@ -5387,51 +4574,12 @@ "has-tostringtag": "^1.0.0" } }, - "is-array-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.1.tgz", - "integrity": "sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-typed-array": "^1.1.10" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } - } - }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, - "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", - "dev": true, - "requires": { - "has-bigints": "^1.0.1" - } - }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -5441,22 +4589,6 @@ "binary-extensions": "^2.0.0" } }, - "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" - } - }, - "is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "dev": true - }, "is-core-module": { "version": "2.11.0", "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", @@ -5502,23 +4634,11 @@ "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-map": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.2.tgz", - "integrity": "sha512-cOZFQQozTha1f4MxLFzlgKYPTyj26picdZTx82hbc/Xf4K/tZOOXSCkMvU4pKioRXGDLJRn0GM7Upe7kR721yg==", - "dev": true - }, - "is-negative-zero": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.2.tgz", - "integrity": "sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==", - "dev": true + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "requires": { + "is-extglob": "^2.1.1" + } }, "is-number": { "version": "7.0.0", @@ -5526,15 +4646,6 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -5584,83 +4695,12 @@ "has-tostringtag": "^1.0.0" } }, - "is-set": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.2.tgz", - "integrity": "sha512-+2cnTEZeY5z/iXGbLhPrOAaK/Mau5k5eXq9j14CpRTftq0pAJu2MwVRSZhyZWBzx3o6X795Lz6Bpb6R0GKf37g==", - "dev": true - }, - "is-shared-array-buffer": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.2.tgz", - "integrity": "sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, - "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", - "dev": true, - "requires": { - "has-tostringtag": "^1.0.0" - } - }, - "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", - "dev": true, - "requires": { - "has-symbols": "^1.0.2" - } - }, - "is-typed-array": { - "version": "1.1.10", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.10.tgz", - "integrity": "sha512-PJqgEHiWZvMpaFZ3uTc8kHPM4+4ADTlDniuQL7cU/UDA0Ql7F70yGfHph3cLNe+c9toaigv+DFzTJKhc2CtO6A==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0" - } - }, - "is-weakmap": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.1.tgz", - "integrity": "sha512-NSBR4kH5oVj1Uwvv970ruUkCV7O1mzgVFO4/rev2cLRda9Tm9HrL70ZPut4rOHgY0FNrUu9BCbXA2sdQ+x0chA==", - "dev": true - }, - "is-weakref": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", - "integrity": "sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2" - } - }, - "is-weakset": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.2.tgz", - "integrity": "sha512-t2yVvttHkQktwnNNmBQ98AhENLdPUTDTE21uPqAQ0ARwQfGeQKRVS0NNurH7bTf7RrvcVn1OOge45CnBeHCSmg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.1" - } - }, "is-wsl": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-2.2.0.tgz", @@ -7035,16 +6075,6 @@ "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", "dev": true }, - "jsx-ast-utils": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/jsx-ast-utils/-/jsx-ast-utils-3.3.3.tgz", - "integrity": "sha512-fYQHZTZ8jSfmWZ0iyzfwiU4WDX4HpHbMCZ3gPlWYiCl3BoeOTsqKBqnTVfH2rYT7eP5c3sVbeSPHnnJOaTrWiw==", - "dev": true, - "requires": { - "array-includes": "^3.1.5", - "object.assign": "^4.1.3" - } - }, "kind-of": { "version": "6.0.3", "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", @@ -7057,21 +6087,6 @@ "integrity": "sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==", "dev": true }, - "language-subtag-registry": { - "version": "0.3.22", - "resolved": "https://registry.npmjs.org/language-subtag-registry/-/language-subtag-registry-0.3.22.tgz", - "integrity": "sha512-tN0MCzyWnoz/4nHS6uxdlFWoUZT7ABptwKPQ52Ea7URk6vll88bWBVhodtnlfEuCcKWNGoc+uGbw1cwa9IKh/w==", - "dev": true - }, - "language-tags": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/language-tags/-/language-tags-1.0.5.tgz", - "integrity": "sha512-qJhlO9cGXi6hBGKoxEG/sKZDAHD5Hnu9Hs4WbOY3pCWXDhw0N8x1NenNzm2EnNLkLkk7J2SdxAkDSbb6ftT+UQ==", - "dev": true, - "requires": { - "language-subtag-registry": "~0.3.2" - } - }, "leven": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", @@ -7127,15 +6142,6 @@ "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", "dev": true }, - "loose-envify": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", - "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, - "requires": { - "js-tokens": "^3.0.0 || ^4.0.0" - } - }, "lower-case": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-2.0.2.tgz", @@ -7265,9 +6271,9 @@ } }, "minimist": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", - "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", "dev": true }, "mkdirp": { @@ -7336,9 +6342,9 @@ } }, "node-forge": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.2.1.tgz", - "integrity": "sha512-Fcvtbb+zBcZXbTTVwqGA5W+MKBj56UjVRevvchv5XrcyXbmNdesfZL37nlcWOfpgHhgmxApw3tQbTr4CqNmX4w==", + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", "dev": true }, "node-int64": { @@ -7383,12 +6389,6 @@ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", "dev": true }, - "object-inspect": { - "version": "1.12.3", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.3.tgz", - "integrity": "sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==", - "dev": true - }, "object-is": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/object-is/-/object-is-1.1.5.tgz", @@ -7405,127 +6405,6 @@ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, - "object.assign": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.4.tgz", - "integrity": "sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "has-symbols": "^1.0.3", - "object-keys": "^1.1.1" - }, - "dependencies": { - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } - } - }, - "object.entries": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.entries/-/object.entries-1.1.6.tgz", - "integrity": "sha512-leTPzo4Zvg3pmbQ3rDK69Rl8GQvIqMWubrkxONG9/ojtFE2rD9fjMKfSI5BxW3osRH1m6VdzmqK8oAY9aT4x5w==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "dependencies": { - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } - } - }, - "object.fromentries": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.6.tgz", - "integrity": "sha512-VciD13dswC4j1Xt5394WR4MzmAQmlgN72phd/riNp9vtD7tp4QQWJ0R4wvclXcafgcYK8veHRed2W6XeGBvcfg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "dependencies": { - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } - } - }, - "object.hasown": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/object.hasown/-/object.hasown-1.1.2.tgz", - "integrity": "sha512-B5UIT3J1W+WuWIU55h0mjlwaqxiE5vYENJXIXZ4VFe05pNYrkKuK0U/6aFcb0pKywYJh7IhfoqUfKVmrJJHZHw==", - "dev": true, - "requires": { - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "dependencies": { - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } - } - }, - "object.values": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.6.tgz", - "integrity": "sha512-FVVTkD1vENCsAcwNs9k6jea2uHC/X0+JcjG8YA60FN5CMaJmG95wT9jek/xX9nornqGRrBkKtzuAu2wuHpKqvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "dependencies": { - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } - } - }, "obuf": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", @@ -7908,25 +6787,6 @@ "sisteransi": "^1.0.5" } }, - "prop-types": { - "version": "15.8.1", - "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", - "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, - "requires": { - "loose-envify": "^1.4.0", - "object-assign": "^4.1.1", - "react-is": "^16.13.1" - }, - "dependencies": { - "react-is": { - "version": "16.13.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", - "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true - } - } - }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -8215,36 +7075,6 @@ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==", "dev": true }, - "safe-regex-test": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz", - "integrity": "sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "get-intrinsic": "^1.1.3", - "is-regex": "^1.1.4" - }, - "dependencies": { - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } - } - }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", @@ -8437,17 +7267,6 @@ "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "dev": true, - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, "signal-exit": { "version": "3.0.7", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", @@ -8555,15 +7374,6 @@ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=", "dev": true }, - "stop-iteration-iterator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/stop-iteration-iterator/-/stop-iteration-iterator-1.0.0.tgz", - "integrity": "sha512-iCGQj+0l0HOdZ2AEeBADlsRC+vsnDsZsbdSiH1yNSjcfKM7fdpCMfqAL/dwF5BLiw/XhRft/Wax6zQbhq2BcjQ==", - "dev": true, - "requires": { - "internal-slot": "^1.0.4" - } - }, "string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -8585,108 +7395,6 @@ "strip-ansi": "^6.0.1" } }, - "string.prototype.matchall": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/string.prototype.matchall/-/string.prototype.matchall-4.0.8.tgz", - "integrity": "sha512-6zOCOcJ+RJAQshcTvXPHoxoQGONa3e/Lqx90wUA+wEzX78sg5Bo+1tQo4N0pohS0erG9qtCqJDjNCQBjeWVxyg==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4", - "get-intrinsic": "^1.1.3", - "has-symbols": "^1.0.3", - "internal-slot": "^1.0.3", - "regexp.prototype.flags": "^1.4.3", - "side-channel": "^1.0.4" - }, - "dependencies": { - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - }, - "get-intrinsic": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.2.0.tgz", - "integrity": "sha512-L049y6nFOuom5wGyRc3/gdTLO94dySVKRACj1RmJZBQXlbTMhtNIgkWkUHq+jYmZvKf14EW1EoJnnjbmoHij0Q==", - "dev": true, - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - }, - "regexp.prototype.flags": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.4.3.tgz", - "integrity": "sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.3", - "functions-have-names": "^1.2.2" - } - } - } - }, - "string.prototype.trimend": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.6.tgz", - "integrity": "sha512-JySq+4mrPf9EsDBEDYMOb/lM7XQLulwg5R/m1r0PXEFqrV0qHvl58sdTilSXtKOflCsK2E8jxf+GKC0T07RWwQ==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "dependencies": { - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } - } - }, - "string.prototype.trimstart": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.6.tgz", - "integrity": "sha512-omqjMDaY92pbn5HOX7f9IccLA+U1tA9GvtU4JrodiXFfYB7jPzzHpRzpglLAjtUV6bB557zwClJezTqnAiYnQA==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "define-properties": "^1.1.4", - "es-abstract": "^1.20.4" - }, - "dependencies": { - "define-properties": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.2.0.tgz", - "integrity": "sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==", - "dev": true, - "requires": { - "has-property-descriptors": "^1.0.0", - "object-keys": "^1.1.1" - } - } - } - }, "string_decoder": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", @@ -8751,13 +7459,14 @@ "dev": true }, "terser": { - "version": "5.10.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.10.0.tgz", - "integrity": "sha512-AMmF99DMfEDiRJfxfY5jj5wNH/bYO09cniSqhfoyxc8sFoYIgkJy86G04UoZU5VjlpnplVu0K6Tx6E9b5+DlHA==", + "version": "5.16.4", + "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.4.tgz", + "integrity": "sha512-5yEGuZ3DZradbogeYQ1NaGz7rXVBDWujWlx1PT8efXO6Txn+eWbfKqB2bTDVmFXmePFkoLU6XI8UektMIEA0ug==", "dev": true, "requires": { + "@jridgewell/source-map": "^0.3.2", + "acorn": "^8.5.0", "commander": "^2.20.0", - "source-map": "~0.7.2", "source-map-support": "~0.5.20" }, "dependencies": { @@ -8766,12 +7475,6 @@ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", "dev": true - }, - "source-map": { - "version": "0.7.3", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz", - "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", - "dev": true } } }, @@ -8919,41 +7622,6 @@ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", "dev": true }, - "tsconfig-paths": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-3.14.1.tgz", - "integrity": "sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==", - "dev": true, - "requires": { - "@types/json5": "^0.0.29", - "json5": "^1.0.1", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "dependencies": { - "json5": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.2.tgz", - "integrity": "sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==", - "dev": true, - "requires": { - "minimist": "^1.2.0" - } - }, - "minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "dev": true - }, - "strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "dev": true - } - } - }, "tslib": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.3.1.tgz", @@ -8991,37 +7659,6 @@ "mime-types": "~2.1.24" } }, - "typed-array-length": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.4.tgz", - "integrity": "sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "is-typed-array": "^1.1.9" - } - }, - "unbox-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/unbox-primitive/-/unbox-primitive-1.0.2.tgz", - "integrity": "sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==", - "dev": true, - "requires": { - "call-bind": "^1.0.2", - "has-bigints": "^1.0.2", - "has-symbols": "^1.0.3", - "which-boxed-primitive": "^1.0.2" - }, - "dependencies": { - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", - "dev": true - } - } - }, "unicode-canonical-property-names-ecmascript": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz", @@ -9505,45 +8142,6 @@ "isexe": "^2.0.0" } }, - "which-boxed-primitive": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", - "dev": true, - "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" - } - }, - "which-collection": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.1.tgz", - "integrity": "sha512-W8xeTUwaln8i3K/cY1nGXzdnVZlidBcagyNFtBdD5kxnb4TvGKR7FfSIS3mYpwWS1QUCutfKz8IY8RjftB0+1A==", - "dev": true, - "requires": { - "is-map": "^2.0.1", - "is-set": "^2.0.1", - "is-weakmap": "^2.0.1", - "is-weakset": "^2.0.1" - } - }, - "which-typed-array": { - "version": "1.1.9", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.9.tgz", - "integrity": "sha512-w9c4xkx6mPidwp7180ckYWfMmvxpjlZuIudNtDf4N/tTAUB8VJbX25qZoAsrtGuYNnGw3pa0AXgbGKRB8/EceA==", - "dev": true, - "requires": { - "available-typed-arrays": "^1.0.5", - "call-bind": "^1.0.2", - "for-each": "^0.3.3", - "gopd": "^1.0.1", - "has-tostringtag": "^1.0.0", - "is-typed-array": "^1.1.10" - } - }, "wildcard": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", diff --git a/package.json b/package.json index 1aca1283bf..8fee24eb1e 100644 --- a/package.json +++ b/package.json @@ -14,16 +14,16 @@ "@babel/core": "^7.20.12", "@babel/preset-env": "^7.20.2", "@types/jest": "^29.2.5", - "jest": "^29.3.1", "babel-jest": "^29.3.1", "babel-loader": "^9.1.2", "clean-webpack-plugin": "^4.0.0", - "html-webpack-plugin": "^5.5.0", "css-loader": "^6.6.0", - "style-loader": "^3.3.1", "eslint": "^8.31.0", - "prettier": "^2.8.2", "esm": "^3.2.25", + "html-webpack-plugin": "^5.5.0", + "jest": "^29.3.1", + "prettier": "^2.8.4", + "style-loader": "^3.3.1", "webpack": "^5.75.0", "webpack-cli": "^5.0.1", "webpack-dev-server": "^4.7.4" diff --git a/src/domain/LottoGame.js b/src/domain/LottoGame.js index 2478423421..bced4cb8aa 100644 --- a/src/domain/LottoGame.js +++ b/src/domain/LottoGame.js @@ -17,6 +17,7 @@ class LottoGame { getBoughtLottos() { return this.#lottos; + // return JSON.parse(JSON.stringify(this.#lottos)); } getMatchedLottoCount(lotto, winningNumber) { diff --git a/src/step2-index.js b/src/step2-index.js index 9c2e993042..de63d27190 100644 --- a/src/step2-index.js +++ b/src/step2-index.js @@ -2,27 +2,52 @@ import '../reset.css'; import '../style.css'; import validator from './domain/validator'; +import LottoGame from './domain/LottoGame'; const budgetForm = document.querySelector('.budget_form'); const budgetError = document.querySelector('.budget_error'); const step2 = document.querySelector('#step2'); +const lottoCount = document.querySelector('.lotto_count'); +const lottoListBox = document.querySelector('.lotto_list_box'); + +const lottoNumberForm = document.querySelector('.lotto_number_form'); +const winningNumbers = document.querySelectorAll('.winning_number'); +const bonusNumber = document.querySelector('.bonus_number'); + +let lottoGame; + const displayBudgetError = (message) => { budgetError.innerText = message; budgetError.style.visibility = 'visible'; }; +const displayBoughtLottos = (lottos) => { + const lottoDivs = [...lottos].reduce((lottoDivs, lotto) => { + return (lottoDivs += ` +
+
🎟️
+ ${lotto.join(', ')} +
`); + }, ''); + lottoListBox.innerHTML = lottoDivs; +}; + const onSubmitBudgetForm = (event) => { event.preventDefault(); const budget = event.target[0].value; try { validator.validateBudget(budget); + budgetError.innerText = ''; } catch ({ message }) { return displayBudgetError(message); } - budgetError.innerText = ''; + + lottoCount.innerText = `총 ${budget / 1000}개λ₯Ό κ΅¬λ§€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.`; step2.style.visibility = 'visible'; + lottoGame = new LottoGame(budget); + displayBoughtLottos(lottoGame.getBoughtLottos()); }; budgetForm.addEventListener('submit', onSubmitBudgetForm); diff --git a/style.css b/style.css index 86b5241f96..4b4494c900 100644 --- a/style.css +++ b/style.css @@ -116,11 +116,11 @@ main h2 { cursor: pointer; } -.lottos_list { +.lotto_list { margin-top: 28px; } -.lottos_list_box { +.lotto_list_box { height: 300px; margin-top: 8px; overflow: scroll; @@ -142,7 +142,7 @@ main h2 { color: var(--lotto-greyscale-5); } -.lottos_list_box > .lotto:not(:last-child) { +.lotto_list_box > .lotto:not(:last-child) { margin-bottom: 16px; } @@ -169,11 +169,11 @@ main h2 { color: var(--lotto-greyscale-5); } -.winning_numbers input:not(:last-child) { +.winning_number:not(:last-child) { margin-right: 8px; } -.bonus_number { +.bonus_number_box { display: flex; flex-direction: column; align-items: flex-end; @@ -199,7 +199,7 @@ main h2 { text-align: center; } -.winning_numbers { +.winning_numbers_box { display: flex; flex-direction: column; } From a7ac679418778da2595ff5815b4879e88c70ad27 Mon Sep 17 00:00:00 2001 From: Jungwoo Date: Wed, 22 Feb 2023 14:14:35 +0900 Subject: [PATCH 04/14] =?UTF-8?q?feat:=20=EB=8B=B9=EC=B2=A8=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EC=99=80=20=EB=B3=B4=EB=84=88=EC=8A=A4=20=EB=B2=88?= =?UTF-8?q?=ED=98=B8=EB=A5=BC=20=EC=9E=85=EB=A0=A5=EB=B0=9B=EB=8A=94=20?= =?UTF-8?q?=EA=B8=B0=EB=8A=A5=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/step2-index.js | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/step2-index.js b/src/step2-index.js index de63d27190..89b75a4ef8 100644 --- a/src/step2-index.js +++ b/src/step2-index.js @@ -13,8 +13,8 @@ const lottoCount = document.querySelector('.lotto_count'); const lottoListBox = document.querySelector('.lotto_list_box'); const lottoNumberForm = document.querySelector('.lotto_number_form'); -const winningNumbers = document.querySelectorAll('.winning_number'); -const bonusNumber = document.querySelector('.bonus_number'); +const winningNumberInput = document.querySelectorAll('.winning_number'); +const bonusNumberInput = document.querySelector('.bonus_number'); let lottoGame; @@ -50,4 +50,11 @@ const onSubmitBudgetForm = (event) => { displayBoughtLottos(lottoGame.getBoughtLottos()); }; +const onSubmitLottoNumberForm = (event) => { + event.preventDefault(); + const winningNumbers = [...winningNumberInput].map((input) => input.value); + const bonusNumber = bonusNumberInput.value; +}; + budgetForm.addEventListener('submit', onSubmitBudgetForm); +lottoNumberForm.addEventListener('submit', onSubmitLottoNumberForm); From a2f7921fd1a8ddf171d22b4740610ab40034ba7e Mon Sep 17 00:00:00 2001 From: Jungwoo Date: Wed, 22 Feb 2023 16:51:50 +0900 Subject: [PATCH 05/14] =?UTF-8?q?feat:=20modal=20=EC=B0=BD=20UI=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 42 ++++++++++++- modal.css | 148 +++++++++++++++++++++++++++++++++++++++++++++ src/step2-index.js | 19 +++++- style.css | 13 ++-- 4 files changed, 213 insertions(+), 9 deletions(-) create mode 100644 modal.css diff --git a/index.html b/index.html index e8e6da2040..9046f29a86 100644 --- a/index.html +++ b/index.html @@ -58,8 +58,48 @@

🎱 λ‚΄ 번호 당첨 확인 🎱

+
- diff --git a/modal.css b/modal.css new file mode 100644 index 0000000000..d70c138d11 --- /dev/null +++ b/modal.css @@ -0,0 +1,148 @@ +#modal { + position: relative; + visibility: hidden; +} + +.modal_background { + position: fixed; + left: 0; + top: 0; + height: 100vh; + width: 100%; + background: rgba(0, 0, 0, 0.5); +} + +.modal_box { + position: fixed; + background: #ffffff; + border-radius: 4px; + + width: 350px; + height: 500px; + z-index: 10; + left: 50%; + top: 50%; + transform: translate(-175px, -250px); + + padding: 40px 16px 32px 16px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; +} + +.modal_title { + font-family: 'Roboto'; + font-style: normal; + font-weight: 600; + font-size: 20px; + + text-align: center; + letter-spacing: 0.15px; + + color: var(--lotto-greyscale-5); +} + +.winning_state { + width: 100%; + height: 245px; + border-top: 1px solid rgba(0, 0, 0, 0.12); + display: flex; + flex-direction: column; + justify-content: space-between; +} + +.winning_state_prop { + font-family: 'Roboto'; + font-style: normal; + font-weight: 600; + font-size: 15px; + + letter-spacing: 0.5px; + + /* lotto-greyscale-5 */ + + color: #000000; +} + +.winning_state > div { + display: flex; + align-items: center; + border-bottom: 1px solid rgba(0, 0, 0, 0.12); +} + +.winning_state_row { + flex: 1; + display: flex; + align-items: center; + border-bottom: 1px solid rgba(0, 0, 0, 0.12); +} + +.winning_state_row > div { + flex: 1; + text-align: center; +} + +.winning_state_col { + font-family: 'Roboto'; + font-style: normal; + font-weight: 400; + font-size: 15px; + letter-spacing: 0.5px; + + /* lotto-greyscale-5 */ + + color: #000000; +} + +.profit_rate { + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-size: 15px; + + text-align: center; + letter-spacing: 0.5px; + + /* lotto-greyscale-5 */ + + color: #000000; +} + +.retry_btn { + display: flex; + justify-content: center; + align-items: center; + border: none; + cursor: pointer; + + width: 100%; + height: 36px; + + /* lotto-primary */ + + background: #4e5ba6; + border-radius: 4px; + + font-family: 'Roboto'; + font-style: normal; + font-weight: 700; + font-size: 14px; + + letter-spacing: 1.25px; + text-transform: uppercase; + + /* lotto-greyscale-1 */ + + color: #ffffff; +} + +.modal_close { + position: absolute; + top: 16px; + right: 16px; + font-size: 20px; + width: 20px; + height: 20px; + cursor: pointer; +} diff --git a/src/step2-index.js b/src/step2-index.js index 89b75a4ef8..8cc57d3107 100644 --- a/src/step2-index.js +++ b/src/step2-index.js @@ -1,5 +1,6 @@ import '../reset.css'; import '../style.css'; +import '../modal.css'; import validator from './domain/validator'; import LottoGame from './domain/LottoGame'; @@ -15,6 +16,9 @@ const lottoListBox = document.querySelector('.lotto_list_box'); const lottoNumberForm = document.querySelector('.lotto_number_form'); const winningNumberInput = document.querySelectorAll('.winning_number'); const bonusNumberInput = document.querySelector('.bonus_number'); +const numberError = document.querySelector('.number_error'); + +const modal = document.querySelector('#modal'); let lottoGame; @@ -23,6 +27,11 @@ const displayBudgetError = (message) => { budgetError.style.visibility = 'visible'; }; +const displayNumberError = (message) => { + numberError.innerText = message; + numberError.style.visibility = 'visible'; +}; + const displayBoughtLottos = (lottos) => { const lottoDivs = [...lottos].reduce((lottoDivs, lotto) => { return (lottoDivs += ` @@ -52,8 +61,16 @@ const onSubmitBudgetForm = (event) => { const onSubmitLottoNumberForm = (event) => { event.preventDefault(); - const winningNumbers = [...winningNumberInput].map((input) => input.value); + const winningNumbers = [...winningNumberInput].map((input) => Number(input.value)); const bonusNumber = bonusNumberInput.value; + try { + validator.validateWinningNumber(winningNumbers.join(',')); + validator.validateBonusNumber(bonusNumber); + numberError.style.visibility = 'hidden'; + } catch ({ message }) { + return displayNumberError(message); + } + modal.style.visibility = 'visible'; }; budgetForm.addEventListener('submit', onSubmitBudgetForm); diff --git a/style.css b/style.css index 4b4494c900..93051c8d7a 100644 --- a/style.css +++ b/style.css @@ -7,6 +7,10 @@ --lotto-greyscale-5: #000000; } +* { + box-sizing: border-box; +} + #app { height: 100vh; } @@ -186,7 +190,7 @@ main h2 { .lotto_number_form { position: absolute; - width: 414px; + width: 382px; bottom: 32px; } @@ -210,11 +214,8 @@ main h2 { } .result_btn { - padding: 6px 6px 6px 8px; - width: 100%; height: 36px; - padding-bottom: 32px; border: none; border-radius: 4px; background: var(--lotto-primary); @@ -223,12 +224,10 @@ main h2 { font-style: normal; font-weight: 700; font-size: 14px; - line-height: 28px; - letter-spacing: 1.25px; - text-transform: uppercase; color: var(--lotto-greyscale-1); + cursor: pointer; } footer { From ca27f2d4fcc419290126914c38ac0c037be2591a Mon Sep 17 00:00:00 2001 From: Jungwoo Date: Wed, 22 Feb 2023 17:31:32 +0900 Subject: [PATCH 06/14] =?UTF-8?q?feat:=20=EB=AA=A8=EB=8B=AC=20=EC=B0=BD=20?= =?UTF-8?q?=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 26 +++++++++++++------------- src/step2-index.js | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+), 13 deletions(-) diff --git a/index.html b/index.html index 9046f29a86..a49915d0df 100644 --- a/index.html +++ b/index.html @@ -71,27 +71,27 @@

🎱 λ‚΄ 번호 당첨 확인 🎱

3개
5,000
-
n개
+
n개
-
3개
-
5,000
-
n개
+
4개
+
50,000
+
n개
-
3개
-
5,000
-
n개
+
5개
+
1,500,000
+
n개
-
3개
-
5,000
-
n개
+
5개+λ³΄λ„ˆμŠ€λ³Ό
+
30,000,000
+
n개
-
3개
-
5,000
-
n개
+
6개
+
2,000,000,000
+
n개
λ‹Ήμ‹ μ˜ 총 수읡λ₯ μ€ %μž…λ‹ˆλ‹€.
diff --git a/src/step2-index.js b/src/step2-index.js index 8cc57d3107..944a750f49 100644 --- a/src/step2-index.js +++ b/src/step2-index.js @@ -6,6 +6,7 @@ import validator from './domain/validator'; import LottoGame from './domain/LottoGame'; const budgetForm = document.querySelector('.budget_form'); +const budgetInput = document.querySelector('.budget_input'); const budgetError = document.querySelector('.budget_error'); const step2 = document.querySelector('#step2'); @@ -19,9 +20,24 @@ const bonusNumberInput = document.querySelector('.bonus_number'); const numberError = document.querySelector('.number_error'); const modal = document.querySelector('#modal'); +const winningCounts = document.querySelectorAll('.winning_count'); +const profitRateDiv = document.querySelector('.profit_rate'); +const modalCloseBtn = document.querySelector('.modal_close'); +const modalBackground = document.querySelector('.modal_background'); + +const retryBtn = document.querySelector('.retry_btn'); let lottoGame; +const displayModal = (winningNumbers, bonusNumber) => { + const winningStatus = [...lottoGame.getWinningStatus(winningNumbers, bonusNumber)].reverse(); + const profitRate = lottoGame.getProfitRate().toFixed(2); + [...winningCounts].forEach((winningCount, index) => { + winningCount.innerText = winningStatus[index]; + }); + profitRateDiv.innerText = `λ‹Ήμ‹ μ˜ 총 수읡λ₯ μ€ ${profitRate}%μž…λ‹ˆλ‹€.`; +}; + const displayBudgetError = (message) => { budgetError.innerText = message; budgetError.style.visibility = 'visible'; @@ -70,8 +86,33 @@ const onSubmitLottoNumberForm = (event) => { } catch ({ message }) { return displayNumberError(message); } + + displayModal(winningNumbers, bonusNumber); modal.style.visibility = 'visible'; }; +const onClickModalCloseBtn = () => { + modal.style.visibility = 'hidden'; +}; + +const onClickModalBackGround = () => { + modal.style.visibility = 'hidden'; +}; + +const onClickRetryBtn = () => { + budgetInput.value = ''; + modal.style.visibility = 'hidden'; + step2.style.visibility = 'hidden'; + [...winningNumberInput].forEach((input) => { + input.value = ''; + }); + bonusNumberInput.value = ''; +}; + budgetForm.addEventListener('submit', onSubmitBudgetForm); lottoNumberForm.addEventListener('submit', onSubmitLottoNumberForm); + +modalCloseBtn.addEventListener('click', onClickModalCloseBtn); +modalBackground.addEventListener('click', onClickModalBackGround); + +retryBtn.addEventListener('click', onClickRetryBtn); From 5e942f7f6af8ccdf6f01198621f452c591897768 Mon Sep 17 00:00:00 2001 From: Jungwoo Date: Thu, 23 Feb 2023 12:31:08 +0900 Subject: [PATCH 07/14] =?UTF-8?q?refactor:=20Dom=20style=EC=9D=98=20visibi?= =?UTF-8?q?lity=EB=A5=BC=20=EB=B3=80=ED=99=98=ED=95=98=EB=8A=94=20?= =?UTF-8?q?=EB=A1=9C=EC=A7=81=EC=9D=84=20=ED=95=A8=EC=88=98=EB=A1=9C=20?= =?UTF-8?q?=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 2 +- src/step2-index.js | 100 ++++++++++++++++++++++----------------------- 2 files changed, 50 insertions(+), 52 deletions(-) diff --git a/index.html b/index.html index a49915d0df..a7a07a36a3 100644 --- a/index.html +++ b/index.html @@ -96,7 +96,7 @@

🎱 λ‚΄ 번호 당첨 확인 🎱

λ‹Ήμ‹ μ˜ 총 수읡λ₯ μ€ %μž…λ‹ˆλ‹€.
- + diff --git a/src/step2-index.js b/src/step2-index.js index 944a750f49..9fdb196342 100644 --- a/src/step2-index.js +++ b/src/step2-index.js @@ -5,47 +5,54 @@ import '../modal.css'; import validator from './domain/validator'; import LottoGame from './domain/LottoGame'; -const budgetForm = document.querySelector('.budget_form'); -const budgetInput = document.querySelector('.budget_input'); -const budgetError = document.querySelector('.budget_error'); +const $budgetForm = document.querySelector('.budget_form'); +const $budgetInput = document.querySelector('.budget_input'); +const $budgetError = document.querySelector('.budget_error'); -const step2 = document.querySelector('#step2'); +const $step2 = document.querySelector('#step2'); -const lottoCount = document.querySelector('.lotto_count'); -const lottoListBox = document.querySelector('.lotto_list_box'); +const $lottoCount = document.querySelector('.lotto_count'); +const $lottoList = document.querySelector('.lotto_list_box'); -const lottoNumberForm = document.querySelector('.lotto_number_form'); -const winningNumberInput = document.querySelectorAll('.winning_number'); -const bonusNumberInput = document.querySelector('.bonus_number'); -const numberError = document.querySelector('.number_error'); +const $lottoNumberForm = document.querySelector('.lotto_number_form'); +const $winningNumberInput = document.querySelectorAll('.winning_number'); +const $bonusNumberInput = document.querySelector('.bonus_number'); +const $numberError = document.querySelector('.number_error'); -const modal = document.querySelector('#modal'); -const winningCounts = document.querySelectorAll('.winning_count'); -const profitRateDiv = document.querySelector('.profit_rate'); -const modalCloseBtn = document.querySelector('.modal_close'); -const modalBackground = document.querySelector('.modal_background'); +const $modal = document.querySelector('#modal'); +const $winningCounts = document.querySelectorAll('.winning_count'); +const $profitRate = document.querySelector('.profit_rate'); +const $modalCloseButton = document.querySelector('.modal_close'); +const $modalBackground = document.querySelector('.modal_background'); -const retryBtn = document.querySelector('.retry_btn'); +const $retryButton = document.querySelector('.retry_btn'); let lottoGame; +const convertVisibilityToHidden = (...doms) => { + return [...doms].forEach((dom) => (dom.style.visibility = 'hidden')); +}; +const convertVisibilityToVisible = (...doms) => { + return [...doms].forEach((dom) => (dom.style.visibility = 'visible')); +}; + const displayModal = (winningNumbers, bonusNumber) => { const winningStatus = [...lottoGame.getWinningStatus(winningNumbers, bonusNumber)].reverse(); const profitRate = lottoGame.getProfitRate().toFixed(2); - [...winningCounts].forEach((winningCount, index) => { + [...$winningCounts].forEach((winningCount, index) => { winningCount.innerText = winningStatus[index]; }); - profitRateDiv.innerText = `λ‹Ήμ‹ μ˜ 총 수읡λ₯ μ€ ${profitRate}%μž…λ‹ˆλ‹€.`; + $profitRate.innerText = `λ‹Ήμ‹ μ˜ 총 수읡λ₯ μ€ ${profitRate}%μž…λ‹ˆλ‹€.`; }; const displayBudgetError = (message) => { - budgetError.innerText = message; - budgetError.style.visibility = 'visible'; + $budgetError.innerText = message; + convertVisibilityToVisible($budgetError); }; -const displayNumberError = (message) => { - numberError.innerText = message; - numberError.style.visibility = 'visible'; +const displayLottoNumberError = (message) => { + $numberError.innerText = message; + convertVisibilityToVisible($numberError); }; const displayBoughtLottos = (lottos) => { @@ -56,7 +63,7 @@ const displayBoughtLottos = (lottos) => { ${lotto.join(', ')} `); }, ''); - lottoListBox.innerHTML = lottoDivs; + $lottoList.innerHTML = lottoDivs; }; const onSubmitBudgetForm = (event) => { @@ -64,55 +71,46 @@ const onSubmitBudgetForm = (event) => { const budget = event.target[0].value; try { validator.validateBudget(budget); - budgetError.innerText = ''; + $budgetError.innerText = ''; } catch ({ message }) { return displayBudgetError(message); } - lottoCount.innerText = `총 ${budget / 1000}개λ₯Ό κ΅¬λ§€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.`; - step2.style.visibility = 'visible'; + $lottoCount.innerText = `총 ${budget / 1000}개λ₯Ό κ΅¬λ§€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.`; + convertVisibilityToVisible($step2); lottoGame = new LottoGame(budget); displayBoughtLottos(lottoGame.getBoughtLottos()); }; const onSubmitLottoNumberForm = (event) => { event.preventDefault(); - const winningNumbers = [...winningNumberInput].map((input) => Number(input.value)); - const bonusNumber = bonusNumberInput.value; + const winningNumbers = [...$winningNumberInput].map((input) => Number(input.value)); + const bonusNumber = $bonusNumberInput.value; try { validator.validateWinningNumber(winningNumbers.join(',')); validator.validateBonusNumber(bonusNumber); - numberError.style.visibility = 'hidden'; + convertVisibilityToHidden($numberError); } catch ({ message }) { - return displayNumberError(message); + return displayLottoNumberError(message); } displayModal(winningNumbers, bonusNumber); - modal.style.visibility = 'visible'; -}; - -const onClickModalCloseBtn = () => { - modal.style.visibility = 'hidden'; -}; - -const onClickModalBackGround = () => { - modal.style.visibility = 'hidden'; + convertVisibilityToVisible($modal); }; -const onClickRetryBtn = () => { - budgetInput.value = ''; - modal.style.visibility = 'hidden'; - step2.style.visibility = 'hidden'; - [...winningNumberInput].forEach((input) => { +const onClickRetryButton = () => { + $budgetInput.value = ''; + convertVisibilityToHidden($modal, $step2); + [...$winningNumberInput].forEach((input) => { input.value = ''; }); - bonusNumberInput.value = ''; + $bonusNumberInput.value = ''; }; -budgetForm.addEventListener('submit', onSubmitBudgetForm); -lottoNumberForm.addEventListener('submit', onSubmitLottoNumberForm); +$budgetForm.addEventListener('submit', onSubmitBudgetForm); +$lottoNumberForm.addEventListener('submit', onSubmitLottoNumberForm); -modalCloseBtn.addEventListener('click', onClickModalCloseBtn); -modalBackground.addEventListener('click', onClickModalBackGround); +$modalCloseButton.addEventListener('click', () => convertVisibilityToHidden($modal)); +$modalBackground.addEventListener('click', () => convertVisibilityToHidden($modal)); -retryBtn.addEventListener('click', onClickRetryBtn); +$retryButton.addEventListener('click', onClickRetryButton); From 453add5aacdeb3ea7a2a8ef09e5f83601a01ec31 Mon Sep 17 00:00:00 2001 From: Jungwoo Date: Thu, 23 Feb 2023 15:48:02 +0900 Subject: [PATCH 08/14] =?UTF-8?q?refactor:=20Dom=EC=9D=84=20=EC=A1=B0?= =?UTF-8?q?=EC=9E=91=ED=95=98=EB=8A=94=20=EA=B8=B0=EB=8A=A5=EC=9D=84=20vie?= =?UTF-8?q?w=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/LottoController.js | 102 ----------------------------------------- src/step2-index.js | 102 +++++++++++++++++++---------------------- src/view/close.js | 7 --- src/view/input.js | 9 ---- src/view/output.js | 29 ------------ src/view/view.js | 44 +++++++++++++++--- 6 files changed, 84 insertions(+), 209 deletions(-) delete mode 100644 src/LottoController.js delete mode 100644 src/view/close.js delete mode 100644 src/view/input.js delete mode 100644 src/view/output.js diff --git a/src/LottoController.js b/src/LottoController.js deleted file mode 100644 index 5b72252d96..0000000000 --- a/src/LottoController.js +++ /dev/null @@ -1,102 +0,0 @@ -import LottoGame from './domain/LottoGame.js'; -import validator from './domain/validator.js'; - -import view from './view/view.js'; - -import { FORMATTING_TYPE, MESSAGE, COMMAND } from './constants/index.js'; - -class LottoController { - #lottoGame; - - #commandHandler = Object.freeze({ - [COMMAND.RETRY]: this.startGame.bind(this), - [COMMAND.EXIT]: this.#exitGame, - }); - - startGame() { - this.#inputBudget(); - } - - async #inputBudget() { - try { - const budget = await view.input(MESSAGE.ASK_BUDGET); - validator.validateBudget(budget); - this.#lottoGame = new LottoGame(budget); - this.#printBoughtLottos(); - } catch ({ message }) { - this.handleCaughtError(message, this.#inputBudget.bind(this)); - } - } - - #printBoughtLottos() { - const boughtLottos = this.#lottoGame.getBoughtLottos(); - view.output(boughtLottos, FORMATTING_TYPE.BOUGHT_LOTTOS); - - this.#inputLottoValues(); - } - - async #inputLottoValues() { - const winningNumber = await this.#inputWinningNumber(); - const bonusNumber = await this.#inputBonusNumber(); - - const winningNumberToNumberArray = winningNumber.split(',').map(Number); - - this.#printScoreBoard(winningNumberToNumberArray, Number(bonusNumber)); - } - - async #inputWinningNumber() { - try { - const winningNumber = await view.input(MESSAGE.ASK_WINNING_LOTTO); - validator.validateWinningNumber(winningNumber); - return winningNumber; - } catch ({ message }) { - return this.handleCaughtError(message, this.#inputWinningNumber.bind(this)); - } - } - - async #inputBonusNumber(winningNumber) { - try { - const bonusNumber = await view.input(MESSAGE.ASK_BONUS_NUMBER); - validator.validateBonusNumber(bonusNumber); - return bonusNumber; - } catch ({ message }) { - return this.handleCaughtError(message, this.#inputBonusNumber.bind(this, winningNumber)); - } - } - - #printScoreBoard(winningNumber, bonusNumber) { - const winningStatus = this.#lottoGame.getWinningStatus(winningNumber, bonusNumber); - view.output(winningStatus, FORMATTING_TYPE.WINNING_STATUS); - - this.#printProfitRate(); - } - - #printProfitRate() { - const profitRate = this.#lottoGame.getProfitRate(); - view.output(profitRate, FORMATTING_TYPE.PROFIT_RATE); - - this.#askRetry(); - } - - async #askRetry() { - try { - const retryCommand = await view.input(MESSAGE.ASK_RETRY); - validator.validateRetryCommand(retryCommand); - this.#commandHandler[retryCommand](); - } catch (message) { - console.log(message); - this.handleCaughtError(message, this.#askRetry.bind(this)); - } - } - - #exitGame() { - view.close(); - } - - handleCaughtError(message, callback) { - view.output(message); - return callback(); - } -} - -export default LottoController; diff --git a/src/step2-index.js b/src/step2-index.js index 9fdb196342..36cc140537 100644 --- a/src/step2-index.js +++ b/src/step2-index.js @@ -5,6 +5,8 @@ import '../modal.css'; import validator from './domain/validator'; import LottoGame from './domain/LottoGame'; +import view from './view/view'; + const $budgetForm = document.querySelector('.budget_form'); const $budgetInput = document.querySelector('.budget_input'); const $budgetError = document.querySelector('.budget_error'); @@ -15,7 +17,7 @@ const $lottoCount = document.querySelector('.lotto_count'); const $lottoList = document.querySelector('.lotto_list_box'); const $lottoNumberForm = document.querySelector('.lotto_number_form'); -const $winningNumberInput = document.querySelectorAll('.winning_number'); +const $winningNumberInputs = document.querySelectorAll('.winning_number'); const $bonusNumberInput = document.querySelector('.bonus_number'); const $numberError = document.querySelector('.number_error'); @@ -29,88 +31,78 @@ const $retryButton = document.querySelector('.retry_btn'); let lottoGame; -const convertVisibilityToHidden = (...doms) => { - return [...doms].forEach((dom) => (dom.style.visibility = 'hidden')); -}; -const convertVisibilityToVisible = (...doms) => { - return [...doms].forEach((dom) => (dom.style.visibility = 'visible')); -}; - -const displayModal = (winningNumbers, bonusNumber) => { - const winningStatus = [...lottoGame.getWinningStatus(winningNumbers, bonusNumber)].reverse(); - const profitRate = lottoGame.getProfitRate().toFixed(2); - [...$winningCounts].forEach((winningCount, index) => { - winningCount.innerText = winningStatus[index]; - }); - $profitRate.innerText = `λ‹Ήμ‹ μ˜ 총 수읡λ₯ μ€ ${profitRate}%μž…λ‹ˆλ‹€.`; -}; - -const displayBudgetError = (message) => { - $budgetError.innerText = message; - convertVisibilityToVisible($budgetError); -}; +const onSubmitBudgetForm = (event) => { + event.preventDefault(); -const displayLottoNumberError = (message) => { - $numberError.innerText = message; - convertVisibilityToVisible($numberError); -}; + const budget = event.target[0].value; -const displayBoughtLottos = (lottos) => { - const lottoDivs = [...lottos].reduce((lottoDivs, lotto) => { - return (lottoDivs += ` -
-
🎟️
- ${lotto.join(', ')} -
`); - }, ''); - $lottoList.innerHTML = lottoDivs; + handleBudget(budget); }; -const onSubmitBudgetForm = (event) => { - event.preventDefault(); - const budget = event.target[0].value; +const handleBudget = (budget) => { try { validator.validateBudget(budget); - $budgetError.innerText = ''; + view.initInputValue($budgetError); + lottoGame = new LottoGame(budget); } catch ({ message }) { - return displayBudgetError(message); + view.insertInnerText($budgetError, message); + return view.convertVisibilityToVisible($budgetError); } - $lottoCount.innerText = `총 ${budget / 1000}개λ₯Ό κ΅¬λ§€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.`; - convertVisibilityToVisible($step2); - lottoGame = new LottoGame(budget); - displayBoughtLottos(lottoGame.getBoughtLottos()); + renderStep2(budget); +}; + +const renderStep2 = (budget) => { + view.insertLottoCount($lottoCount, budget); + view.insertBoughtLottos($lottoList, lottoGame.getBoughtLottos()); + + view.convertVisibilityToVisible($step2); }; const onSubmitLottoNumberForm = (event) => { event.preventDefault(); - const winningNumbers = [...$winningNumberInput].map((input) => Number(input.value)); + + const winningNumbers = [...$winningNumberInputs].map((input) => Number(input.value)); const bonusNumber = $bonusNumberInput.value; + + handleLottoNumber(winningNumbers, bonusNumber); +}; + +const handleLottoNumber = (winningNumbers, bonusNumber) => { try { validator.validateWinningNumber(winningNumbers.join(',')); validator.validateBonusNumber(bonusNumber); - convertVisibilityToHidden($numberError); + view.convertVisibilityToHidden($numberError); } catch ({ message }) { - return displayLottoNumberError(message); + view.insertInnerText(message); + return view.convertVisibilityToVisible($numberError); } - displayModal(winningNumbers, bonusNumber); - convertVisibilityToVisible($modal); + renderModal(winningNumbers, bonusNumber); +}; + +const renderModal = (winningNumbers, bonusNumber) => { + const winningStatus = [...lottoGame.getWinningStatus(winningNumbers, bonusNumber)].reverse(); + const profitRate = lottoGame.getProfitRate().toFixed(2); + + view.insertWinningCounts($winningCounts, winningStatus); + view.insertProfitRate($profitRate, profitRate); + + view.convertVisibilityToVisible($modal); }; const onClickRetryButton = () => { - $budgetInput.value = ''; - convertVisibilityToHidden($modal, $step2); - [...$winningNumberInput].forEach((input) => { - input.value = ''; + view.initInputValue($budgetInput, $bonusNumberInput); + view.convertVisibilityToHidden($modal, $step2); + [...$winningNumberInputs].forEach((winningNumberInput) => { + view.initInputValue(winningNumberInput); }); - $bonusNumberInput.value = ''; }; $budgetForm.addEventListener('submit', onSubmitBudgetForm); $lottoNumberForm.addEventListener('submit', onSubmitLottoNumberForm); -$modalCloseButton.addEventListener('click', () => convertVisibilityToHidden($modal)); -$modalBackground.addEventListener('click', () => convertVisibilityToHidden($modal)); +$modalCloseButton.addEventListener('click', () => view.convertVisibilityToHidden($modal)); +$modalBackground.addEventListener('click', () => view.convertVisibilityToHidden($modal)); $retryButton.addEventListener('click', onClickRetryButton); diff --git a/src/view/close.js b/src/view/close.js deleted file mode 100644 index 2656f59e79..0000000000 --- a/src/view/close.js +++ /dev/null @@ -1,7 +0,0 @@ -import readlineInterface from '../util/readlineInterface.js'; - -const close = () => { - readlineInterface.close(); -}; - -export default close; diff --git a/src/view/input.js b/src/view/input.js deleted file mode 100644 index 5223686a9b..0000000000 --- a/src/view/input.js +++ /dev/null @@ -1,9 +0,0 @@ -import readlineInterface from '../util/readlineInterface.js'; - -const input = (message) => { - return new Promise((resolve) => { - readlineInterface.question(message, resolve); - }); -}; - -export default input; diff --git a/src/view/output.js b/src/view/output.js deleted file mode 100644 index eba24a8f4c..0000000000 --- a/src/view/output.js +++ /dev/null @@ -1,29 +0,0 @@ -import { FORMATTING_TYPE, GAME_VALUE, RANK } from '../constants/index.js'; - -const output = (data, formattingType = '') => { - if (formattingType === '') { - return console.log(data); - } - - if (formattingType === FORMATTING_TYPE.BOUGHT_LOTTOS) { - console.log(`${data.length}개λ₯Ό κ΅¬λ§€ν–ˆμŠ΅λ‹ˆλ‹€.`); - - return data.forEach((lotto) => console.log(`[${lotto.join(', ')}]`)); - } - - if (formattingType === FORMATTING_TYPE.WINNING_STATUS) { - console.log(`\n당첨 톡계\n${'-'.repeat(20)}`); - return console.log(`3개 일치 (${GAME_VALUE.PRIZE[4].toLocaleString()}원) - ${data[RANK.FIFTH]}개 -4개 일치 (${GAME_VALUE.PRIZE[3].toLocaleString()}원) - ${data[RANK.FOURTH]}개 -5개 일치 (${GAME_VALUE.PRIZE[2].toLocaleString()}원) - ${data[RANK.THIRD]}개 -5개 일치, λ³΄λ„ˆμŠ€ λ³Ό 일치 (${GAME_VALUE.PRIZE[1].toLocaleString()}원) - ${data[RANK.SECOND]}개 -6개 일치 (${GAME_VALUE.PRIZE[0].toLocaleString()}원) - ${data[RANK.FIRST]}개`); - } - - if (formattingType === FORMATTING_TYPE.PROFIT_RATE) { - const formattedRate = data.toLocaleString(); - return console.log(`총 수읡λ₯ μ€ ${formattedRate}%μž…λ‹ˆλ‹€.`); - } -}; - -export default output; diff --git a/src/view/view.js b/src/view/view.js index a8e23a9090..6b08d02a59 100644 --- a/src/view/view.js +++ b/src/view/view.js @@ -1,13 +1,43 @@ -import input from './input.js'; -import output from './output.js'; -import close from './close.js'; - const view = { - input, + convertVisibilityToHidden(...doms) { + [...doms].forEach((dom) => (dom.style.visibility = 'hidden')); + }, + + convertVisibilityToVisible(...doms) { + [...doms].forEach((dom) => (dom.style.visibility = 'visible')); + }, + + initInputValue(...doms) { + [...doms].forEach((dom) => (dom.value = '')); + }, + + insertInnerText(dom, message) { + dom.innerText = message; + }, + + insertBoughtLottos(dom, lottos) { + dom.innerHTML = [...lottos].reduce((HTML, lotto) => { + return (HTML += ` +
+
🎟️
+ ${lotto.join(', ')} +
`); + }, ''); + }, + + insertLottoCount(dom, budget) { + dom.innerText = `총 ${budget / 1000}개λ₯Ό κ΅¬λ§€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.`; + }, - output, + insertWinningCounts(dom, winningStatus) { + [...dom].forEach((winningCount, index) => { + winningCount.innerText = winningStatus[index]; + }); + }, - close, + insertProfitRate(dom, profitRate) { + dom.innerText = `λ‹Ήμ‹ μ˜ 총 수읡λ₯ μ€ ${profitRate}%μž…λ‹ˆλ‹€.`; + }, }; export default view; From d6e8a07579ff27df609165913efa0fa18c92609e Mon Sep 17 00:00:00 2001 From: Jungwoo Date: Thu, 23 Feb 2023 16:11:22 +0900 Subject: [PATCH 09/14] =?UTF-8?q?refactor:=20=EB=B3=80=EC=88=98=EB=AA=85?= =?UTF-8?q?=EC=9D=B4=20=EC=B6=95=EC=95=BD=EB=90=98=EC=A7=80=20=EC=95=8A?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- index.html | 8 +++---- modal.css | 57 ++++++++++++++++------------------------------ src/step2-index.js | 12 +++++----- src/view/view.js | 2 +- style.css | 32 +++++--------------------- 5 files changed, 37 insertions(+), 74 deletions(-) diff --git a/index.html b/index.html index a7a07a36a3..4c8821d132 100644 --- a/index.html +++ b/index.html @@ -19,11 +19,11 @@

🎱 λ‚΄ 번호 당첨 확인 🎱

- +
-
+
@@ -48,7 +48,7 @@

🎱 λ‚΄ 번호 당첨 확인 🎱

[ERROR]:
- +
@@ -95,7 +95,7 @@

🎱 λ‚΄ 번호 당첨 확인 🎱

λ‹Ήμ‹ μ˜ 총 수읡λ₯ μ€ %μž…λ‹ˆλ‹€.
- + diff --git a/modal.css b/modal.css index d70c138d11..e935473554 100644 --- a/modal.css +++ b/modal.css @@ -13,6 +13,12 @@ } .modal_box { + padding: 40px 16px 32px 16px; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-between; + position: fixed; background: #ffffff; border-radius: 4px; @@ -23,20 +29,11 @@ left: 50%; top: 50%; transform: translate(-175px, -250px); - - padding: 40px 16px 32px 16px; - display: flex; - flex-direction: column; - align-items: center; - justify-content: space-between; } .modal_title { - font-family: 'Roboto'; - font-style: normal; font-weight: 600; font-size: 20px; - text-align: center; letter-spacing: 0.15px; @@ -44,24 +41,19 @@ } .winning_state { - width: 100%; - height: 245px; - border-top: 1px solid rgba(0, 0, 0, 0.12); display: flex; flex-direction: column; justify-content: space-between; + width: 100%; + height: 245px; + border-top: 1px solid rgba(0, 0, 0, 0.12); } .winning_state_prop { - font-family: 'Roboto'; - font-style: normal; font-weight: 600; font-size: 15px; - letter-spacing: 0.5px; - /* lotto-greyscale-5 */ - color: #000000; } @@ -84,65 +76,56 @@ } .winning_state_col { - font-family: 'Roboto'; - font-style: normal; font-weight: 400; font-size: 15px; letter-spacing: 0.5px; - /* lotto-greyscale-5 */ - color: #000000; } .profit_rate { - font-family: 'Roboto'; - font-style: normal; font-weight: 700; font-size: 15px; - text-align: center; letter-spacing: 0.5px; - /* lotto-greyscale-5 */ - color: #000000; } -.retry_btn { +.retry_button { display: flex; justify-content: center; align-items: center; - border: none; - cursor: pointer; - width: 100%; height: 36px; - /* lotto-primary */ - + border: none; background: #4e5ba6; border-radius: 4px; - font-family: 'Roboto'; - font-style: normal; font-weight: 700; font-size: 14px; - letter-spacing: 1.25px; text-transform: uppercase; - /* lotto-greyscale-1 */ - color: #ffffff; + cursor: pointer; } .modal_close { position: absolute; top: 16px; right: 16px; + + display: flex; + justify-content: center; + align-items: center; + font-size: 20px; width: 20px; height: 20px; + + border: none; + background-color: #ffffff; cursor: pointer; } diff --git a/src/step2-index.js b/src/step2-index.js index 36cc140537..ce487506c4 100644 --- a/src/step2-index.js +++ b/src/step2-index.js @@ -11,7 +11,7 @@ const $budgetForm = document.querySelector('.budget_form'); const $budgetInput = document.querySelector('.budget_input'); const $budgetError = document.querySelector('.budget_error'); -const $step2 = document.querySelector('#step2'); +const $nextStepAfterBuyingLotto = document.querySelector('#next_step_buying_lotto'); const $lottoCount = document.querySelector('.lotto_count'); const $lottoList = document.querySelector('.lotto_list_box'); @@ -27,7 +27,7 @@ const $profitRate = document.querySelector('.profit_rate'); const $modalCloseButton = document.querySelector('.modal_close'); const $modalBackground = document.querySelector('.modal_background'); -const $retryButton = document.querySelector('.retry_btn'); +const $retryButton = document.querySelector('.retry_button'); let lottoGame; @@ -49,14 +49,14 @@ const handleBudget = (budget) => { return view.convertVisibilityToVisible($budgetError); } - renderStep2(budget); + renderNextStepAfterBuyingLotto(budget); }; -const renderStep2 = (budget) => { +const renderNextStepAfterBuyingLotto = (budget) => { view.insertLottoCount($lottoCount, budget); view.insertBoughtLottos($lottoList, lottoGame.getBoughtLottos()); - view.convertVisibilityToVisible($step2); + view.convertVisibilityToVisible($nextStepAfterBuyingLotto); }; const onSubmitLottoNumberForm = (event) => { @@ -93,7 +93,7 @@ const renderModal = (winningNumbers, bonusNumber) => { const onClickRetryButton = () => { view.initInputValue($budgetInput, $bonusNumberInput); - view.convertVisibilityToHidden($modal, $step2); + view.convertVisibilityToHidden($modal, $nextStepAfterBuyingLotto); [...$winningNumberInputs].forEach((winningNumberInput) => { view.initInputValue(winningNumberInput); }); diff --git a/src/view/view.js b/src/view/view.js index 6b08d02a59..536b64daa9 100644 --- a/src/view/view.js +++ b/src/view/view.js @@ -31,7 +31,7 @@ const view = { insertWinningCounts(dom, winningStatus) { [...dom].forEach((winningCount, index) => { - winningCount.innerText = winningStatus[index]; + winningCount.innerText = `${winningStatus[index]}개`; }); }, diff --git a/style.css b/style.css index 93051c8d7a..82dbd26709 100644 --- a/style.css +++ b/style.css @@ -13,6 +13,8 @@ #app { height: 100vh; + font-family: 'Roboto'; + font-style: normal; } header { @@ -22,11 +24,8 @@ header { } header > h1 { - font-family: 'Roboto'; - font-style: normal; font-weight: 700; font-size: 24px; - line-height: 36px; color: var(--lotto-greyscale-1); padding: 14px 0 14px 130px; @@ -57,8 +56,6 @@ main h2 { padding: 52px 16px 28px 16px; text-align: center; - font-family: 'Roboto'; - font-style: normal; font-weight: 700; font-size: 24px; letter-spacing: 0.15px; @@ -73,12 +70,8 @@ main h2 { .budget_form > label { display: block; - font-family: 'Roboto'; - font-style: normal; font-weight: 400; font-size: 15px; - line-height: 24px; - letter-spacing: 0.5px; color: var(--lotto-greyscale-5); @@ -99,11 +92,11 @@ main h2 { border-radius: 4px; } -#step2 { +#next_step_buying_lotto { visibility: hidden; } -.buy_btn { +.buy_button { padding: 6px 6px 6px 8px; background: #4e5ba6; border-radius: 4px; @@ -111,8 +104,6 @@ main h2 { width: 56px; height: 36px; - font-family: 'Roboto'; - font-style: normal; font-weight: 700; font-size: 14px; @@ -135,12 +126,8 @@ main h2 { align-items: center; margin-bottom: 8px; - font-family: 'Roboto'; - font-style: normal; font-weight: 400; font-size: 15px; - line-height: 24px; - letter-spacing: 0.5px; color: var(--lotto-greyscale-5); @@ -162,12 +149,9 @@ main h2 { } .lotto_number_form > div { - font-family: 'Roboto'; - font-style: normal; + margin-bottom: 20px; font-weight: 400; font-size: 15px; - margin-bottom: 20px; - letter-spacing: 0.5px; color: var(--lotto-greyscale-5); @@ -213,15 +197,13 @@ main h2 { flex-direction: column; } -.result_btn { +.result_button { width: 100%; height: 36px; border: none; border-radius: 4px; background: var(--lotto-primary); - font-family: 'Roboto'; - font-style: normal; font-weight: 700; font-size: 14px; letter-spacing: 1.25px; @@ -245,8 +227,6 @@ footer label { align-items: center; height: 100%; - font-family: 'Roboto'; - font-style: normal; font-weight: 700; font-size: 14px; letter-spacing: 1.25px; From b704257c226dcce8e3e69a742294244f84f0e5f0 Mon Sep 17 00:00:00 2001 From: Jungwoo Date: Thu, 23 Feb 2023 16:15:18 +0900 Subject: [PATCH 10/14] =?UTF-8?q?chor:=20css=20=ED=8C=8C=EC=9D=BC=EB=93=A4?= =?UTF-8?q?=EC=9D=84=20css=20=ED=8F=B4=EB=8D=94=EC=95=88=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EC=9D=B4=EB=8F=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- modal.css => css/modal.css | 0 reset.css => css/reset.css | 0 style.css => css/style.css | 0 src/step2-index.js | 6 +++--- 4 files changed, 3 insertions(+), 3 deletions(-) rename modal.css => css/modal.css (100%) rename reset.css => css/reset.css (100%) rename style.css => css/style.css (100%) diff --git a/modal.css b/css/modal.css similarity index 100% rename from modal.css rename to css/modal.css diff --git a/reset.css b/css/reset.css similarity index 100% rename from reset.css rename to css/reset.css diff --git a/style.css b/css/style.css similarity index 100% rename from style.css rename to css/style.css diff --git a/src/step2-index.js b/src/step2-index.js index ce487506c4..f9cb7cde0b 100644 --- a/src/step2-index.js +++ b/src/step2-index.js @@ -1,6 +1,6 @@ -import '../reset.css'; -import '../style.css'; -import '../modal.css'; +import '../css/reset.css'; +import '../css/style.css'; +import '../css/modal.css'; import validator from './domain/validator'; import LottoGame from './domain/LottoGame'; From a4d6e23d8d8b832adc672a3c3c8aafa1bbfa526e Mon Sep 17 00:00:00 2001 From: Jungwoo Date: Thu, 23 Feb 2023 17:04:11 +0900 Subject: [PATCH 11/14] =?UTF-8?q?refactor:=20view=ED=8C=8C=EC=9D=BC?= =?UTF-8?q?=EC=9D=B4=20=EC=96=B4=EB=96=A4=20Dom=EC=9D=84=20=EC=A1=B0?= =?UTF-8?q?=EC=9E=91=ED=95=98=EA=B3=A0=20=EC=9E=88=EB=8A=94=EC=A7=80=20?= =?UTF-8?q?=EB=A7=A4=EA=B0=9C=EB=B3=80=EC=88=98=EB=AA=85=EC=9C=BC=EB=A1=9C?= =?UTF-8?q?=20=EB=B6=84=EB=AA=85=ED=9E=88=20=ED=95=98=EB=8F=84=EB=A1=9D=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/step2-index.js | 5 +++-- src/view/view.js | 16 ++++++++-------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/step2-index.js b/src/step2-index.js index f9cb7cde0b..f8cbaae7f8 100644 --- a/src/step2-index.js +++ b/src/step2-index.js @@ -33,6 +33,7 @@ let lottoGame; const onSubmitBudgetForm = (event) => { event.preventDefault(); + view.insertInnerText($budgetError, ''); const budget = event.target[0].value; @@ -42,7 +43,6 @@ const onSubmitBudgetForm = (event) => { const handleBudget = (budget) => { try { validator.validateBudget(budget); - view.initInputValue($budgetError); lottoGame = new LottoGame(budget); } catch ({ message }) { view.insertInnerText($budgetError, message); @@ -61,6 +61,7 @@ const renderNextStepAfterBuyingLotto = (budget) => { const onSubmitLottoNumberForm = (event) => { event.preventDefault(); + view.insertInnerText($numberError, ''); const winningNumbers = [...$winningNumberInputs].map((input) => Number(input.value)); const bonusNumber = $bonusNumberInput.value; @@ -74,7 +75,7 @@ const handleLottoNumber = (winningNumbers, bonusNumber) => { validator.validateBonusNumber(bonusNumber); view.convertVisibilityToHidden($numberError); } catch ({ message }) { - view.insertInnerText(message); + view.insertInnerText($numberError, message); return view.convertVisibilityToVisible($numberError); } diff --git a/src/view/view.js b/src/view/view.js index 536b64daa9..5b1a6052dc 100644 --- a/src/view/view.js +++ b/src/view/view.js @@ -15,8 +15,8 @@ const view = { dom.innerText = message; }, - insertBoughtLottos(dom, lottos) { - dom.innerHTML = [...lottos].reduce((HTML, lotto) => { + insertBoughtLottos($lottoList, lottos) { + $lottoList.innerHTML = [...lottos].reduce((HTML, lotto) => { return (HTML += `
🎟️
@@ -25,18 +25,18 @@ const view = { }, ''); }, - insertLottoCount(dom, budget) { - dom.innerText = `총 ${budget / 1000}개λ₯Ό κ΅¬λ§€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.`; + insertLottoCount($lottoCount, budget) { + $lottoCount.innerText = `총 ${budget / 1000}개λ₯Ό κ΅¬λ§€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.`; }, - insertWinningCounts(dom, winningStatus) { - [...dom].forEach((winningCount, index) => { + insertWinningCounts($winningCounts, winningStatus) { + [...$winningCounts].forEach((winningCount, index) => { winningCount.innerText = `${winningStatus[index]}개`; }); }, - insertProfitRate(dom, profitRate) { - dom.innerText = `λ‹Ήμ‹ μ˜ 총 수읡λ₯ μ€ ${profitRate}%μž…λ‹ˆλ‹€.`; + insertProfitRate($profitRate, profitRate) { + $profitRate.innerText = `λ‹Ήμ‹ μ˜ 총 수읡λ₯ μ€ ${profitRate}%μž…λ‹ˆλ‹€.`; }, }; From 6573bd2b4706ce2add4c50d10c6c6d8ec120596d Mon Sep 17 00:00:00 2001 From: Jungwoo Date: Thu, 23 Feb 2023 17:05:28 +0900 Subject: [PATCH 12/14] =?UTF-8?q?chor:=20build=20=ED=99=98=EA=B2=BD=20?= =?UTF-8?q?=EA=B5=AC=EC=B6=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 1 - css/style.css | 4 +- dist/index.html | 1 + dist/step2-bundle.js | 2 + package-lock.json | 96 ++++++++++++++++++++++++++++++++++++++++++++ package.json | 7 +++- 6 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 dist/index.html create mode 100644 dist/step2-bundle.js diff --git a/.gitignore b/.gitignore index b947077876..c2658d7d1b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1 @@ node_modules/ -dist/ diff --git a/css/style.css b/css/style.css index 82dbd26709..4c625583c7 100644 --- a/css/style.css +++ b/css/style.css @@ -244,11 +244,11 @@ footer label { } .number_error { - bottom: 40px; + bottom: 38px; visibility: hidden; } .budget_error { - top: 67px; + top: 55px; visibility: hidden; } diff --git a/dist/index.html b/dist/index.html new file mode 100644 index 0000000000..43e989178f --- /dev/null +++ b/dist/index.html @@ -0,0 +1 @@ +🎱 ν–‰μš΄μ˜ 둜또Document

🎱 ν–‰μš΄μ˜ 둜또

🎱 λ‚΄ 번호 당첨 확인 🎱

μ§€λ‚œ μ£Ό λ‹Ήμ²¨λ²ˆν˜Έ 6κ°œμ™€ λ³΄λ„ˆμŠ€ 번호 1개λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.
[ERROR]:
\ No newline at end of file diff --git a/dist/step2-bundle.js b/dist/step2-bundle.js new file mode 100644 index 0000000000..d34db868e7 --- /dev/null +++ b/dist/step2-bundle.js @@ -0,0 +1,2 @@ +(()=>{"use strict";var n={639:(n,t,e)=>{e.d(t,{Z:()=>a});var o=e(537),r=e.n(o),i=e(645),A=e.n(i)()(r());A.push([n.id,"#modal {\n position: relative;\n visibility: hidden;\n}\n\n.modal_background {\n position: fixed;\n left: 0;\n top: 0;\n height: 100vh;\n width: 100%;\n background: rgba(0, 0, 0, 0.5);\n}\n\n.modal_box {\n padding: 40px 16px 32px 16px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n\n position: fixed;\n background: #ffffff;\n border-radius: 4px;\n\n width: 350px;\n height: 500px;\n z-index: 10;\n left: 50%;\n top: 50%;\n transform: translate(-175px, -250px);\n}\n\n.modal_title {\n font-weight: 600;\n font-size: 20px;\n text-align: center;\n letter-spacing: 0.15px;\n\n color: var(--lotto-greyscale-5);\n}\n\n.winning_state {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n width: 100%;\n height: 245px;\n border-top: 1px solid rgba(0, 0, 0, 0.12);\n}\n\n.winning_state_prop {\n font-weight: 600;\n font-size: 15px;\n letter-spacing: 0.5px;\n\n color: #000000;\n}\n\n.winning_state > div {\n display: flex;\n align-items: center;\n border-bottom: 1px solid rgba(0, 0, 0, 0.12);\n}\n\n.winning_state_row {\n flex: 1;\n display: flex;\n align-items: center;\n border-bottom: 1px solid rgba(0, 0, 0, 0.12);\n}\n\n.winning_state_row > div {\n flex: 1;\n text-align: center;\n}\n\n.winning_state_col {\n font-weight: 400;\n font-size: 15px;\n letter-spacing: 0.5px;\n\n color: #000000;\n}\n\n.profit_rate {\n font-weight: 700;\n font-size: 15px;\n text-align: center;\n letter-spacing: 0.5px;\n\n color: #000000;\n}\n\n.retry_button {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 36px;\n\n border: none;\n background: #4e5ba6;\n border-radius: 4px;\n\n font-weight: 700;\n font-size: 14px;\n letter-spacing: 1.25px;\n text-transform: uppercase;\n\n color: #ffffff;\n cursor: pointer;\n}\n\n.modal_close {\n position: absolute;\n top: 16px;\n right: 16px;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n font-size: 20px;\n width: 20px;\n height: 20px;\n\n border: none;\n background-color: #ffffff;\n cursor: pointer;\n}\n","",{version:3,sources:["webpack://./css/modal.css"],names:[],mappings:"AAAA;EACE,kBAAkB;EAClB,kBAAkB;AACpB;;AAEA;EACE,eAAe;EACf,OAAO;EACP,MAAM;EACN,aAAa;EACb,WAAW;EACX,8BAA8B;AAChC;;AAEA;EACE,4BAA4B;EAC5B,aAAa;EACb,sBAAsB;EACtB,mBAAmB;EACnB,8BAA8B;;EAE9B,eAAe;EACf,mBAAmB;EACnB,kBAAkB;;EAElB,YAAY;EACZ,aAAa;EACb,WAAW;EACX,SAAS;EACT,QAAQ;EACR,oCAAoC;AACtC;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,sBAAsB;;EAEtB,+BAA+B;AACjC;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,8BAA8B;EAC9B,WAAW;EACX,aAAa;EACb,yCAAyC;AAC3C;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,qBAAqB;;EAErB,cAAc;AAChB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,4CAA4C;AAC9C;;AAEA;EACE,OAAO;EACP,aAAa;EACb,mBAAmB;EACnB,4CAA4C;AAC9C;;AAEA;EACE,OAAO;EACP,kBAAkB;AACpB;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,qBAAqB;;EAErB,cAAc;AAChB;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,kBAAkB;EAClB,qBAAqB;;EAErB,cAAc;AAChB;;AAEA;EACE,aAAa;EACb,uBAAuB;EACvB,mBAAmB;EACnB,WAAW;EACX,YAAY;;EAEZ,YAAY;EACZ,mBAAmB;EACnB,kBAAkB;;EAElB,gBAAgB;EAChB,eAAe;EACf,sBAAsB;EACtB,yBAAyB;;EAEzB,cAAc;EACd,eAAe;AACjB;;AAEA;EACE,kBAAkB;EAClB,SAAS;EACT,WAAW;;EAEX,aAAa;EACb,uBAAuB;EACvB,mBAAmB;;EAEnB,eAAe;EACf,WAAW;EACX,YAAY;;EAEZ,YAAY;EACZ,yBAAyB;EACzB,eAAe;AACjB",sourcesContent:["#modal {\n position: relative;\n visibility: hidden;\n}\n\n.modal_background {\n position: fixed;\n left: 0;\n top: 0;\n height: 100vh;\n width: 100%;\n background: rgba(0, 0, 0, 0.5);\n}\n\n.modal_box {\n padding: 40px 16px 32px 16px;\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: space-between;\n\n position: fixed;\n background: #ffffff;\n border-radius: 4px;\n\n width: 350px;\n height: 500px;\n z-index: 10;\n left: 50%;\n top: 50%;\n transform: translate(-175px, -250px);\n}\n\n.modal_title {\n font-weight: 600;\n font-size: 20px;\n text-align: center;\n letter-spacing: 0.15px;\n\n color: var(--lotto-greyscale-5);\n}\n\n.winning_state {\n display: flex;\n flex-direction: column;\n justify-content: space-between;\n width: 100%;\n height: 245px;\n border-top: 1px solid rgba(0, 0, 0, 0.12);\n}\n\n.winning_state_prop {\n font-weight: 600;\n font-size: 15px;\n letter-spacing: 0.5px;\n\n color: #000000;\n}\n\n.winning_state > div {\n display: flex;\n align-items: center;\n border-bottom: 1px solid rgba(0, 0, 0, 0.12);\n}\n\n.winning_state_row {\n flex: 1;\n display: flex;\n align-items: center;\n border-bottom: 1px solid rgba(0, 0, 0, 0.12);\n}\n\n.winning_state_row > div {\n flex: 1;\n text-align: center;\n}\n\n.winning_state_col {\n font-weight: 400;\n font-size: 15px;\n letter-spacing: 0.5px;\n\n color: #000000;\n}\n\n.profit_rate {\n font-weight: 700;\n font-size: 15px;\n text-align: center;\n letter-spacing: 0.5px;\n\n color: #000000;\n}\n\n.retry_button {\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n height: 36px;\n\n border: none;\n background: #4e5ba6;\n border-radius: 4px;\n\n font-weight: 700;\n font-size: 14px;\n letter-spacing: 1.25px;\n text-transform: uppercase;\n\n color: #ffffff;\n cursor: pointer;\n}\n\n.modal_close {\n position: absolute;\n top: 16px;\n right: 16px;\n\n display: flex;\n justify-content: center;\n align-items: center;\n\n font-size: 20px;\n width: 20px;\n height: 20px;\n\n border: none;\n background-color: #ffffff;\n cursor: pointer;\n}\n"],sourceRoot:""}]);const a=A},991:(n,t,e)=>{e.d(t,{Z:()=>a});var o=e(537),r=e.n(o),i=e(645),A=e.n(i)()(r());A.push([n.id,"/* http://meyerweb.com/eric/tools/css/reset/ \n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml,\nbody,\ndiv,\nspan,\napplet,\nobject,\niframe,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nblockquote,\npre,\na,\nabbr,\nacronym,\naddress,\nbig,\ncite,\ncode,\ndel,\ndfn,\nem,\nimg,\nins,\nkbd,\nq,\ns,\nsamp,\nsmall,\nstrike,\nstrong,\nsub,\nsup,\ntt,\nvar,\nb,\nu,\ni,\ncenter,\ndl,\ndt,\ndd,\nol,\nul,\nli,\nfieldset,\nform,\nlabel,\nlegend,\ntable,\ncaption,\ntbody,\ntfoot,\nthead,\ntr,\nth,\ntd,\narticle,\naside,\ncanvas,\ndetails,\nembed,\nfigure,\nfigcaption,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\noutput,\nruby,\nsection,\nsummary,\ntime,\nmark,\naudio,\nvideo {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n/* HTML5 display-role reset for older browsers */\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\nsection {\n display: block;\n}\nbody {\n line-height: 1;\n}\nol,\nul {\n list-style: none;\n}\nblockquote,\nq {\n quotes: none;\n}\nblockquote:before,\nblockquote:after,\nq:before,\nq:after {\n content: '';\n content: none;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n","",{version:3,sources:["webpack://./css/reset.css"],names:[],mappings:"AAAA;;;CAGC;;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAiFE,SAAS;EACT,UAAU;EACV,SAAS;EACT,eAAe;EACf,aAAa;EACb,wBAAwB;AAC1B;AACA,gDAAgD;AAChD;;;;;;;;;;;EAWE,cAAc;AAChB;AACA;EACE,cAAc;AAChB;AACA;;EAEE,gBAAgB;AAClB;AACA;;EAEE,YAAY;AACd;AACA;;;;EAIE,WAAW;EACX,aAAa;AACf;AACA;EACE,yBAAyB;EACzB,iBAAiB;AACnB",sourcesContent:["/* http://meyerweb.com/eric/tools/css/reset/ \n v2.0 | 20110126\n License: none (public domain)\n*/\n\nhtml,\nbody,\ndiv,\nspan,\napplet,\nobject,\niframe,\nh1,\nh2,\nh3,\nh4,\nh5,\nh6,\np,\nblockquote,\npre,\na,\nabbr,\nacronym,\naddress,\nbig,\ncite,\ncode,\ndel,\ndfn,\nem,\nimg,\nins,\nkbd,\nq,\ns,\nsamp,\nsmall,\nstrike,\nstrong,\nsub,\nsup,\ntt,\nvar,\nb,\nu,\ni,\ncenter,\ndl,\ndt,\ndd,\nol,\nul,\nli,\nfieldset,\nform,\nlabel,\nlegend,\ntable,\ncaption,\ntbody,\ntfoot,\nthead,\ntr,\nth,\ntd,\narticle,\naside,\ncanvas,\ndetails,\nembed,\nfigure,\nfigcaption,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\noutput,\nruby,\nsection,\nsummary,\ntime,\nmark,\naudio,\nvideo {\n margin: 0;\n padding: 0;\n border: 0;\n font-size: 100%;\n font: inherit;\n vertical-align: baseline;\n}\n/* HTML5 display-role reset for older browsers */\narticle,\naside,\ndetails,\nfigcaption,\nfigure,\nfooter,\nheader,\nhgroup,\nmenu,\nnav,\nsection {\n display: block;\n}\nbody {\n line-height: 1;\n}\nol,\nul {\n list-style: none;\n}\nblockquote,\nq {\n quotes: none;\n}\nblockquote:before,\nblockquote:after,\nq:before,\nq:after {\n content: '';\n content: none;\n}\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n"],sourceRoot:""}]);const a=A},174:(n,t,e)=>{e.d(t,{Z:()=>a});var o=e(537),r=e.n(o),i=e(645),A=e.n(i)()(r());A.push([n.id,":root {\n --lotto-primary: #4e5ba6;\n --lotto-greyscale-1: #ffffff;\n --lotto-greyscale-2: #fcfcfd;\n --lotto-greyscale-3: #b4b4b4;\n --lotto-greyscale-4: #8b8b8b;\n --lotto-greyscale-5: #000000;\n}\n\n* {\n box-sizing: border-box;\n}\n\n#app {\n height: 100vh;\n font-family: 'Roboto';\n font-style: normal;\n}\n\nheader {\n height: 64px;\n border-bottom: 1px solid rgba(78, 91, 166, 0.2);\n background-color: var(--lotto-primary);\n}\n\nheader > h1 {\n font-weight: 700;\n font-size: 24px;\n color: var(--lotto-greyscale-1);\n\n padding: 14px 0 14px 130px;\n}\n\nform {\n position: relative;\n}\n\nmain {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\nmain > div {\n position: relative;\n height: 727px;\n width: 414px;\n padding: 0 16px;\n\n border: 1px solid rgba(0, 0, 0, 0.12);\n border-radius: 4px;\n}\n\nmain h2 {\n padding: 52px 16px 28px 16px;\n text-align: center;\n\n font-weight: 700;\n font-size: 24px;\n letter-spacing: 0.15px;\n\n color: var(--lotto-greyscale-5);\n}\n\n.budget_form {\n height: 64px;\n}\n\n.budget_form > label {\n display: block;\n\n font-weight: 400;\n font-size: 15px;\n letter-spacing: 0.5px;\n\n color: var(--lotto-greyscale-5);\n}\n\n.budget_form > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.budget_form input {\n width: 310px;\n height: 36px;\n padding-left: 8px;\n\n border: 1px solid #b4b4b4;\n border-radius: 4px;\n}\n\n#next_step_buying_lotto {\n visibility: hidden;\n}\n\n.buy_button {\n padding: 6px 6px 6px 8px;\n background: #4e5ba6;\n border-radius: 4px;\n border: none;\n width: 56px;\n height: 36px;\n\n font-weight: 700;\n font-size: 14px;\n\n color: var(--lotto-greyscale-1);\n cursor: pointer;\n}\n\n.lotto_list {\n margin-top: 28px;\n}\n\n.lotto_list_box {\n height: 300px;\n margin-top: 8px;\n overflow: scroll;\n}\n\n.lotto {\n display: flex;\n align-items: center;\n margin-bottom: 8px;\n\n font-weight: 400;\n font-size: 15px;\n letter-spacing: 0.5px;\n\n color: var(--lotto-greyscale-5);\n}\n\n.lotto_list_box > .lotto:not(:last-child) {\n margin-bottom: 16px;\n}\n\n.lotto > div {\n font-size: 35px;\n display: flex;\n padding-top: 3px;\n margin-right: 8px;\n}\n\n.lotto_number_form label {\n margin-bottom: 8px;\n}\n\n.lotto_number_form > div {\n margin-bottom: 20px;\n font-weight: 400;\n font-size: 15px;\n letter-spacing: 0.5px;\n\n color: var(--lotto-greyscale-5);\n}\n\n.winning_number:not(:last-child) {\n margin-right: 8px;\n}\n\n.bonus_number_box {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n}\n\n.arrange_inputs {\n display: flex;\n justify-content: space-between;\n}\n\n.lotto_number_form {\n position: absolute;\n width: 382px;\n bottom: 32px;\n}\n\n.lotto_number_form input {\n width: 34px;\n height: 36px;\n\n border: 1px solid #b4b4b4;\n border-radius: 4px;\n text-align: center;\n}\n\n.winning_numbers_box {\n display: flex;\n flex-direction: column;\n}\n\n.bonus_number {\n display: flex;\n flex-direction: column;\n}\n\n.result_button {\n width: 100%;\n height: 36px;\n border: none;\n border-radius: 4px;\n background: var(--lotto-primary);\n\n font-weight: 700;\n font-size: 14px;\n letter-spacing: 1.25px;\n\n color: var(--lotto-greyscale-1);\n cursor: pointer;\n}\n\nfooter {\n height: 80px;\n}\n\nfooter > div {\n height: 100%;\n border-top: 1px solid rgba(78, 91, 166, 0.2);\n}\n\nfooter label {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n\n font-weight: 700;\n font-size: 14px;\n letter-spacing: 1.25px;\n\n color: var(--lotto-primary);\n}\n\n.error_message {\n position: absolute;\n display: inline-block;\n height: 16px;\n color: red;\n font-weight: 600;\n left: 0;\n}\n\n.number_error {\n bottom: 38px;\n visibility: hidden;\n}\n\n.budget_error {\n top: 55px;\n visibility: hidden;\n}\n","",{version:3,sources:["webpack://./css/style.css"],names:[],mappings:"AAAA;EACE,wBAAwB;EACxB,4BAA4B;EAC5B,4BAA4B;EAC5B,4BAA4B;EAC5B,4BAA4B;EAC5B,4BAA4B;AAC9B;;AAEA;EACE,sBAAsB;AACxB;;AAEA;EACE,aAAa;EACb,qBAAqB;EACrB,kBAAkB;AACpB;;AAEA;EACE,YAAY;EACZ,+CAA+C;EAC/C,sCAAsC;AACxC;;AAEA;EACE,gBAAgB;EAChB,eAAe;EACf,+BAA+B;;EAE/B,0BAA0B;AAC5B;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,YAAY;EACZ,aAAa;EACb,mBAAmB;EACnB,uBAAuB;AACzB;;AAEA;EACE,kBAAkB;EAClB,aAAa;EACb,YAAY;EACZ,eAAe;;EAEf,qCAAqC;EACrC,kBAAkB;AACpB;;AAEA;EACE,4BAA4B;EAC5B,kBAAkB;;EAElB,gBAAgB;EAChB,eAAe;EACf,sBAAsB;;EAEtB,+BAA+B;AACjC;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,cAAc;;EAEd,gBAAgB;EAChB,eAAe;EACf,qBAAqB;;EAErB,+BAA+B;AACjC;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,8BAA8B;AAChC;;AAEA;EACE,YAAY;EACZ,YAAY;EACZ,iBAAiB;;EAEjB,yBAAyB;EACzB,kBAAkB;AACpB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,wBAAwB;EACxB,mBAAmB;EACnB,kBAAkB;EAClB,YAAY;EACZ,WAAW;EACX,YAAY;;EAEZ,gBAAgB;EAChB,eAAe;;EAEf,+BAA+B;EAC/B,eAAe;AACjB;;AAEA;EACE,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,eAAe;EACf,gBAAgB;AAClB;;AAEA;EACE,aAAa;EACb,mBAAmB;EACnB,kBAAkB;;EAElB,gBAAgB;EAChB,eAAe;EACf,qBAAqB;;EAErB,+BAA+B;AACjC;;AAEA;EACE,mBAAmB;AACrB;;AAEA;EACE,eAAe;EACf,aAAa;EACb,gBAAgB;EAChB,iBAAiB;AACnB;;AAEA;EACE,kBAAkB;AACpB;;AAEA;EACE,mBAAmB;EACnB,gBAAgB;EAChB,eAAe;EACf,qBAAqB;;EAErB,+BAA+B;AACjC;;AAEA;EACE,iBAAiB;AACnB;;AAEA;EACE,aAAa;EACb,sBAAsB;EACtB,qBAAqB;AACvB;;AAEA;EACE,aAAa;EACb,8BAA8B;AAChC;;AAEA;EACE,kBAAkB;EAClB,YAAY;EACZ,YAAY;AACd;;AAEA;EACE,WAAW;EACX,YAAY;;EAEZ,yBAAyB;EACzB,kBAAkB;EAClB,kBAAkB;AACpB;;AAEA;EACE,aAAa;EACb,sBAAsB;AACxB;;AAEA;EACE,aAAa;EACb,sBAAsB;AACxB;;AAEA;EACE,WAAW;EACX,YAAY;EACZ,YAAY;EACZ,kBAAkB;EAClB,gCAAgC;;EAEhC,gBAAgB;EAChB,eAAe;EACf,sBAAsB;;EAEtB,+BAA+B;EAC/B,eAAe;AACjB;;AAEA;EACE,YAAY;AACd;;AAEA;EACE,YAAY;EACZ,4CAA4C;AAC9C;;AAEA;EACE,aAAa;EACb,uBAAuB;EACvB,mBAAmB;EACnB,YAAY;;EAEZ,gBAAgB;EAChB,eAAe;EACf,sBAAsB;;EAEtB,2BAA2B;AAC7B;;AAEA;EACE,kBAAkB;EAClB,qBAAqB;EACrB,YAAY;EACZ,UAAU;EACV,gBAAgB;EAChB,OAAO;AACT;;AAEA;EACE,YAAY;EACZ,kBAAkB;AACpB;;AAEA;EACE,SAAS;EACT,kBAAkB;AACpB",sourcesContent:[":root {\n --lotto-primary: #4e5ba6;\n --lotto-greyscale-1: #ffffff;\n --lotto-greyscale-2: #fcfcfd;\n --lotto-greyscale-3: #b4b4b4;\n --lotto-greyscale-4: #8b8b8b;\n --lotto-greyscale-5: #000000;\n}\n\n* {\n box-sizing: border-box;\n}\n\n#app {\n height: 100vh;\n font-family: 'Roboto';\n font-style: normal;\n}\n\nheader {\n height: 64px;\n border-bottom: 1px solid rgba(78, 91, 166, 0.2);\n background-color: var(--lotto-primary);\n}\n\nheader > h1 {\n font-weight: 700;\n font-size: 24px;\n color: var(--lotto-greyscale-1);\n\n padding: 14px 0 14px 130px;\n}\n\nform {\n position: relative;\n}\n\nmain {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n\nmain > div {\n position: relative;\n height: 727px;\n width: 414px;\n padding: 0 16px;\n\n border: 1px solid rgba(0, 0, 0, 0.12);\n border-radius: 4px;\n}\n\nmain h2 {\n padding: 52px 16px 28px 16px;\n text-align: center;\n\n font-weight: 700;\n font-size: 24px;\n letter-spacing: 0.15px;\n\n color: var(--lotto-greyscale-5);\n}\n\n.budget_form {\n height: 64px;\n}\n\n.budget_form > label {\n display: block;\n\n font-weight: 400;\n font-size: 15px;\n letter-spacing: 0.5px;\n\n color: var(--lotto-greyscale-5);\n}\n\n.budget_form > div {\n display: flex;\n align-items: center;\n justify-content: space-between;\n}\n\n.budget_form input {\n width: 310px;\n height: 36px;\n padding-left: 8px;\n\n border: 1px solid #b4b4b4;\n border-radius: 4px;\n}\n\n#next_step_buying_lotto {\n visibility: hidden;\n}\n\n.buy_button {\n padding: 6px 6px 6px 8px;\n background: #4e5ba6;\n border-radius: 4px;\n border: none;\n width: 56px;\n height: 36px;\n\n font-weight: 700;\n font-size: 14px;\n\n color: var(--lotto-greyscale-1);\n cursor: pointer;\n}\n\n.lotto_list {\n margin-top: 28px;\n}\n\n.lotto_list_box {\n height: 300px;\n margin-top: 8px;\n overflow: scroll;\n}\n\n.lotto {\n display: flex;\n align-items: center;\n margin-bottom: 8px;\n\n font-weight: 400;\n font-size: 15px;\n letter-spacing: 0.5px;\n\n color: var(--lotto-greyscale-5);\n}\n\n.lotto_list_box > .lotto:not(:last-child) {\n margin-bottom: 16px;\n}\n\n.lotto > div {\n font-size: 35px;\n display: flex;\n padding-top: 3px;\n margin-right: 8px;\n}\n\n.lotto_number_form label {\n margin-bottom: 8px;\n}\n\n.lotto_number_form > div {\n margin-bottom: 20px;\n font-weight: 400;\n font-size: 15px;\n letter-spacing: 0.5px;\n\n color: var(--lotto-greyscale-5);\n}\n\n.winning_number:not(:last-child) {\n margin-right: 8px;\n}\n\n.bonus_number_box {\n display: flex;\n flex-direction: column;\n align-items: flex-end;\n}\n\n.arrange_inputs {\n display: flex;\n justify-content: space-between;\n}\n\n.lotto_number_form {\n position: absolute;\n width: 382px;\n bottom: 32px;\n}\n\n.lotto_number_form input {\n width: 34px;\n height: 36px;\n\n border: 1px solid #b4b4b4;\n border-radius: 4px;\n text-align: center;\n}\n\n.winning_numbers_box {\n display: flex;\n flex-direction: column;\n}\n\n.bonus_number {\n display: flex;\n flex-direction: column;\n}\n\n.result_button {\n width: 100%;\n height: 36px;\n border: none;\n border-radius: 4px;\n background: var(--lotto-primary);\n\n font-weight: 700;\n font-size: 14px;\n letter-spacing: 1.25px;\n\n color: var(--lotto-greyscale-1);\n cursor: pointer;\n}\n\nfooter {\n height: 80px;\n}\n\nfooter > div {\n height: 100%;\n border-top: 1px solid rgba(78, 91, 166, 0.2);\n}\n\nfooter label {\n display: flex;\n justify-content: center;\n align-items: center;\n height: 100%;\n\n font-weight: 700;\n font-size: 14px;\n letter-spacing: 1.25px;\n\n color: var(--lotto-primary);\n}\n\n.error_message {\n position: absolute;\n display: inline-block;\n height: 16px;\n color: red;\n font-weight: 600;\n left: 0;\n}\n\n.number_error {\n bottom: 38px;\n visibility: hidden;\n}\n\n.budget_error {\n top: 55px;\n visibility: hidden;\n}\n"],sourceRoot:""}]);const a=A},645:n=>{n.exports=function(n){var t=[];return t.toString=function(){return this.map((function(t){var e="",o=void 0!==t[5];return t[4]&&(e+="@supports (".concat(t[4],") {")),t[2]&&(e+="@media ".concat(t[2]," {")),o&&(e+="@layer".concat(t[5].length>0?" ".concat(t[5]):""," {")),e+=n(t),o&&(e+="}"),t[2]&&(e+="}"),t[4]&&(e+="}"),e})).join("")},t.i=function(n,e,o,r,i){"string"==typeof n&&(n=[[null,n,void 0]]);var A={};if(o)for(var a=0;a0?" ".concat(c[5]):""," {").concat(c[1],"}")),c[5]=i),e&&(c[2]?(c[1]="@media ".concat(c[2]," {").concat(c[1],"}"),c[2]=e):c[2]=e),r&&(c[4]?(c[1]="@supports (".concat(c[4],") {").concat(c[1],"}"),c[4]=r):c[4]="".concat(r)),t.push(c))}},t}},537:n=>{n.exports=function(n){var t=n[1],e=n[3];if(!e)return t;if("function"==typeof btoa){var o=btoa(unescape(encodeURIComponent(JSON.stringify(e)))),r="sourceMappingURL=data:application/json;charset=utf-8;base64,".concat(o),i="/*# ".concat(r," */"),A=e.sources.map((function(n){return"/*# sourceURL=".concat(e.sourceRoot||"").concat(n," */")}));return[t].concat(A).concat([i]).join("\n")}return[t].join("\n")}},379:n=>{var t=[];function e(n){for(var e=-1,o=0;o{var t={};n.exports=function(n,e){var o=function(n){if(void 0===t[n]){var e=document.querySelector(n);if(window.HTMLIFrameElement&&e instanceof window.HTMLIFrameElement)try{e=e.contentDocument.head}catch(n){e=null}t[n]=e}return t[n]}(n);if(!o)throw new Error("Couldn't find a style target. This probably means that the value for the 'insert' parameter is invalid.");o.appendChild(e)}},216:n=>{n.exports=function(n){var t=document.createElement("style");return n.setAttributes(t,n.attributes),n.insert(t,n.options),t}},565:(n,t,e)=>{n.exports=function(n){var t=e.nc;t&&n.setAttribute("nonce",t)}},795:n=>{n.exports=function(n){var t=n.insertStyleElement(n);return{update:function(e){!function(n,t,e){var o="";e.supports&&(o+="@supports (".concat(e.supports,") {")),e.media&&(o+="@media ".concat(e.media," {"));var r=void 0!==e.layer;r&&(o+="@layer".concat(e.layer.length>0?" ".concat(e.layer):""," {")),o+=e.css,r&&(o+="}"),e.media&&(o+="}"),e.supports&&(o+="}");var i=e.sourceMap;i&&"undefined"!=typeof btoa&&(o+="\n/*# sourceMappingURL=data:application/json;base64,".concat(btoa(unescape(encodeURIComponent(JSON.stringify(i))))," */")),t.styleTagTransform(o,n,t.options)}(t,n,e)},remove:function(){!function(n){if(null===n.parentNode)return!1;n.parentNode.removeChild(n)}(t)}}}},589:n=>{n.exports=function(n,t){if(t.styleSheet)t.styleSheet.cssText=n;else{for(;t.firstChild;)t.removeChild(t.firstChild);t.appendChild(document.createTextNode(n))}}}},t={};function e(o){var r=t[o];if(void 0!==r)return r.exports;var i=t[o]={id:o,exports:{}};return n[o](i,i.exports,e),i.exports}e.n=n=>{var t=n&&n.__esModule?()=>n.default:()=>n;return e.d(t,{a:t}),t},e.d=(n,t)=>{for(var o in t)e.o(t,o)&&!e.o(n,o)&&Object.defineProperty(n,o,{enumerable:!0,get:t[o]})},e.o=(n,t)=>Object.prototype.hasOwnProperty.call(n,t),e.nc=void 0,(()=>{var n=e(379),t=e.n(n),o=e(795),r=e.n(o),i=e(569),A=e.n(i),a=e(565),l=e.n(a),s=e(216),c=e.n(s),u=e(589),p=e.n(u),f=e(991),d={};d.styleTagTransform=p(),d.setAttributes=l(),d.insert=A().bind(null,"head"),d.domAPI=r(),d.insertStyleElement=c(),t()(f.Z,d),f.Z&&f.Z.locals&&f.Z.locals;var E=e(174),b={};b.styleTagTransform=p(),b.setAttributes=l(),b.insert=A().bind(null,"head"),b.domAPI=r(),b.insertStyleElement=c(),t()(E.Z,b),E.Z&&E.Z.locals&&E.Z.locals;var g=e(639),B={};B.styleTagTransform=p(),B.setAttributes=l(),B.insert=A().bind(null,"head"),B.domAPI=r(),B.insertStyleElement=c(),t()(g.Z,B),g.Z&&g.Z.locals&&g.Z.locals;var m=Object.freeze({LOTTO_PRICE:1e3,LOTTO_SIZE:6,MAX_LOTTO_NUMBER:45,PRIZE:[2e9,3e7,15e5,5e4,5e3]}),h=(Object.freeze({BOUGHT_LOTTOS:0,WINNING_STATUS:1,PROFIT_RATE:2}),Object.freeze({ASK_BUDGET:"> κ΅¬μž…κΈˆμ•‘μ„ μž…λ ₯ν•΄ μ£Όμ„Έμš”.",ASK_WINNING_LOTTO:"\n> 당첨 번호λ₯Ό μž…λ ₯ν•΄ μ£Όμ„Έμš”. ",ASK_BONUS_NUMBER:"\n> λ³΄λ„ˆμŠ€ 번호λ₯Ό μž…λ ₯ν•΄ μ£Όμ„Έμš”. ",ASK_RETRY:"\n> λ‹€μ‹œ μ‹œμž‘ν•˜μ‹œκ² μŠ΅λ‹ˆκΉŒ? (y/n) ",ERROR_DECIMAL:"[ERROR] κ΅¬μž… κΈˆμ•‘μ€ μ •μˆ˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.",ERROR_INVALID_LOTTO_FORMAT:"[ERROR] λ‘œλ˜λŠ” 콀마(,)둜 κ΅¬λΆ„λ˜λŠ” 6개의 1 이상 45 μ΄ν•˜μ˜ μ •μˆ˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.",ERROR_LOTTO_DUPLICATES:"[ERROR] 둜또 λ²ˆν˜ΈλŠ” μ€‘λ³΅λ˜λŠ” μˆ˜κ°€ μ—†μ–΄μ•Ό ν•©λ‹ˆλ‹€",ERROR_INVALID_BONUS_NUMBER:"[ERROR] λ³΄λ„ˆμŠ€ λ²ˆν˜ΈλŠ” 1이상 45μ΄ν•˜μ˜ μ •μˆ˜μ—¬μ•Ό ν•©λ‹ˆλ‹€",ERROR_INVALID_RETRY_COMMAND:"[ERROR] μž¬μ‹œμž‘ μ—¬λΆ€λŠ” y λ˜λŠ” n이어야 ν•©λ‹ˆλ‹€."})),C=Object.freeze({DECIMAL:/^[1-9]+\d*$/,WINNING_LOTTO_FORMAT:/^(([1-9]|[1-3]\d|4[0-5]),){5}([1-9]|[1-3]\d|4[0-5])$/,BONUS_NUMBER:/^([1-9]|[1-3]\d|4[0-5])$/}),y=Object.freeze({FIRST:1,SECOND:2,THIRD:3,FOURTH:4,FIFTH:5}),x=Object.freeze({RETRY:"y",EXIT:"n"});const v={validateBudget:function(n){this.validateDecimal(n),this.validateDivisibility(n,m.LOTTO_PRICE)},validateWinningNumber:function(n){this.validateLottoForm(n),this.validateDuplication(n)},validateDecimal:function(n){if(!C.DECIMAL.test(n))throw new Error(h.ERROR_DECIMAL)},validateDivisibility:function(n,t){if(!1!==Boolean(n%t))throw new Error("[ERROR] κ΅¬μž… κΈˆμ•‘μ€ ".concat(t,"원 λ‹¨μœ„μ—¬μ•Ό ν•©λ‹ˆλ‹€"))},validateLottoForm:function(n){if(!C.WINNING_LOTTO_FORMAT.test(n))throw new Error(h.ERROR_INVALID_LOTTO_FORMAT)},validateDuplication:function(n){var t=n.split(",");if(t.length!==new Set(t).size)throw new Error(h.ERROR_LOTTO_DUPLICATES)},validateBonusNumber:function(n){if(!C.BONUS_NUMBER.test(n))throw new Error(h.ERROR_INVALID_BONUS_NUMBER)},validateRetryCommand:function(n){if(x.RETRY!==n&&x.EXIT!==n)throw new Error(h.ERROR_INVALID_RETRY_COMMAND)}};var w=Object.freeze({INCREASING:"ASC",DECREASING:"DESC"});const _=function(n,t){var e=Array.from({length:n},(function(n,t){return t+1}));return e.sort((function(){return Math.random()-.5})),function(n){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:w.INCREASING,e=n.slice();return t===w.DECREASING?e.sort((function(n,t){return t-n})):e.sort((function(n,t){return n-t}))}(e.slice(0,t),w.INCREASING)};function k(n){return k="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(n){return typeof n}:function(n){return n&&"function"==typeof Symbol&&n.constructor===Symbol&&n!==Symbol.prototype?"symbol":typeof n},k(n)}function T(n,t){(null==t||t>n.length)&&(t=n.length);for(var e=0,o=new Array(t);en.length)&&(t=n.length);for(var e=0,o=new Array(t);e\n
🎟️
\n ".concat(t.join(", "),"\n
")}),"")},insertLottoCount:function(n,t){n.innerText="총 ".concat(t/1e3,"개λ₯Ό κ΅¬λ§€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.")},insertWinningCounts:function(n,t){G(n).forEach((function(n,e){n.innerText="".concat(t[e],"개")}))},insertProfitRate:function(n,t){n.innerText="λ‹Ήμ‹ μ˜ 총 수읡λ₯ μ€ ".concat(t,"%μž…λ‹ˆλ‹€.")}};const J=K;function Q(n){return function(n){if(Array.isArray(n))return nn(n)}(n)||function(n){if("undefined"!=typeof Symbol&&null!=n[Symbol.iterator]||null!=n["@@iterator"])return Array.from(n)}(n)||function(n,t){if(n){if("string"==typeof n)return nn(n,t);var e=Object.prototype.toString.call(n).slice(8,-1);return"Object"===e&&n.constructor&&(e=n.constructor.name),"Map"===e||"Set"===e?Array.from(n):"Arguments"===e||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(e)?nn(n,t):void 0}}(n)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function nn(n,t){(null==t||t>n.length)&&(t=n.length);for(var e=0,o=new Array(t);e Date: Sat, 25 Feb 2023 22:13:11 +0900 Subject: [PATCH 13/14] =?UTF-8?q?refactor(view):=20=EC=9D=B4=EB=AF=B8=20?= =?UTF-8?q?=EB=B0=B0=EC=97=B4=EC=9D=B8=20=EA=B2=83=EB=93=A4=EC=9D=84=20?= =?UTF-8?q?=ED=95=9C=EB=B2=88=20=EB=8D=94=20=EB=B0=B0=EC=97=B4=EB=A1=9C=20?= =?UTF-8?q?=EB=A7=8C=EB=93=A4=EC=96=B4=EC=A3=BC=EA=B3=A0=EC=9E=88=EB=8A=94?= =?UTF-8?q?=20=EC=A0=84=EA=B0=9C=20=EC=97=B0=EC=82=B0=EC=9E=90=20=EC=A0=9C?= =?UTF-8?q?=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/view/view.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/view/view.js b/src/view/view.js index 5b1a6052dc..b6fa364143 100644 --- a/src/view/view.js +++ b/src/view/view.js @@ -1,14 +1,14 @@ const view = { convertVisibilityToHidden(...doms) { - [...doms].forEach((dom) => (dom.style.visibility = 'hidden')); + doms.forEach((dom) => (dom.style.visibility = 'hidden')); }, convertVisibilityToVisible(...doms) { - [...doms].forEach((dom) => (dom.style.visibility = 'visible')); + doms.forEach((dom) => (dom.style.visibility = 'visible')); }, initInputValue(...doms) { - [...doms].forEach((dom) => (dom.value = '')); + doms.forEach((dom) => (dom.value = '')); }, insertInnerText(dom, message) { @@ -16,7 +16,7 @@ const view = { }, insertBoughtLottos($lottoList, lottos) { - $lottoList.innerHTML = [...lottos].reduce((HTML, lotto) => { + $lottoList.innerHTML = lottos.reduce((HTML, lotto) => { return (HTML += `
🎟️
From d7692073854e174ac6b5d7fe87549a8aa2d0f58e Mon Sep 17 00:00:00 2001 From: Jungwoo Date: Sun, 26 Feb 2023 22:32:55 +0900 Subject: [PATCH 14/14] =?UTF-8?q?refactor:=20view=EB=A5=BC=20=EC=97=86?= =?UTF-8?q?=EC=95=A0=EA=B3=A0=20=EC=97=B0=EA=B4=80=EB=90=9C=20dom=EB=81=BC?= =?UTF-8?q?=EB=A6=AC=20=ED=8C=8C=EC=9D=BC=EB=A1=9C=20=EB=B6=84=EB=A6=AC?= =?UTF-8?q?=ED=95=B4=EC=84=9C=20=EC=A1=B0=EC=9E=91=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- css/style.css | 2 - src/domHandler/error.js | 21 +++++++++ src/domHandler/input.js | 22 +++++++++ src/domHandler/lotto.js | 32 +++++++++++++ src/domHandler/modal.js | 27 +++++++++++ src/domHandler/utils.js | 35 ++++++++++++++ src/eventHandler.js | 81 ++++++++++++++++++++++++++++++++ src/step2-index.js | 101 ++++------------------------------------ src/view/view.js | 43 ----------------- 9 files changed, 228 insertions(+), 136 deletions(-) create mode 100644 src/domHandler/error.js create mode 100644 src/domHandler/input.js create mode 100644 src/domHandler/lotto.js create mode 100644 src/domHandler/modal.js create mode 100644 src/domHandler/utils.js create mode 100644 src/eventHandler.js delete mode 100644 src/view/view.js diff --git a/css/style.css b/css/style.css index 4c625583c7..f929ceaea8 100644 --- a/css/style.css +++ b/css/style.css @@ -245,10 +245,8 @@ footer label { .number_error { bottom: 38px; - visibility: hidden; } .budget_error { top: 55px; - visibility: hidden; } diff --git a/src/domHandler/error.js b/src/domHandler/error.js new file mode 100644 index 0000000000..df6a104d2c --- /dev/null +++ b/src/domHandler/error.js @@ -0,0 +1,21 @@ +import { convertVisibilityToHidden, convertVisibilityToVisible, overwriteInnerText } from './utils'; + +const $budgetError = document.querySelector('.budget_error'); +const $numberError = document.querySelector('.number_error'); + +const DOM_TYPE = { + budget: $budgetError, + number: $numberError, +}; + +const error = { + clearError(type) { + overwriteInnerText(DOM_TYPE[type], ''); + }, + + overwriteError(type, message) { + overwriteInnerText(DOM_TYPE[type], message); + }, +}; + +export default error; diff --git a/src/domHandler/input.js b/src/domHandler/input.js new file mode 100644 index 0000000000..d036c56f49 --- /dev/null +++ b/src/domHandler/input.js @@ -0,0 +1,22 @@ +const $budgetInput = document.querySelector('.budget_input'); + +const $winningNumberInputs = document.querySelectorAll('.winning_number'); +const $bonusNumberInput = document.querySelector('.bonus_number'); + +const input = { + getWinningNumberInputsValues() { + return [...$winningNumberInputs].map((input) => Number(input.value)); + }, + + getBonusNumberInputValue() { + return $bonusNumberInput.value; + }, + + initInputs() { + [$budgetInput, ...$winningNumberInputs, $bonusNumberInput].forEach( + (input) => (input.value = '') + ); + }, +}; + +export default input; diff --git a/src/domHandler/lotto.js b/src/domHandler/lotto.js new file mode 100644 index 0000000000..ecefc52101 --- /dev/null +++ b/src/domHandler/lotto.js @@ -0,0 +1,32 @@ +import { convertVisibilityToHidden, convertVisibilityToVisible } from './utils'; + +const $nextStepAfterBuyingLotto = document.querySelector('#next_step_buying_lotto'); + +const $lottoCount = document.querySelector('.lotto_count'); +const $lottoList = document.querySelector('.lotto_list_box'); + +const lotto = { + overwriteLottoCount(budget) { + $lottoCount.innerText = `총 ${budget / 1000}개λ₯Ό κ΅¬λ§€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.`; + }, + + overwriteBoughtLottos(lottos) { + $lottoList.innerHTML = lottos.reduce((HTML, lotto) => { + return (HTML += ` +
+
🎟️
+ ${lotto.join(', ')} +
`); + }, ''); + }, + + nextStepAfterBuyingLottoToVisible() { + convertVisibilityToVisible($nextStepAfterBuyingLotto); + }, + + nextStepAfterBuyingLottoToHidden() { + convertVisibilityToHidden($nextStepAfterBuyingLotto); + }, +}; + +export default lotto; diff --git a/src/domHandler/modal.js b/src/domHandler/modal.js new file mode 100644 index 0000000000..c0939dccdf --- /dev/null +++ b/src/domHandler/modal.js @@ -0,0 +1,27 @@ +import { convertVisibilityToHidden, convertVisibilityToVisible } from './utils'; + +const $modal = document.querySelector('#modal'); +const $winningCounts = document.querySelectorAll('.winning_count'); +const $profitRate = document.querySelector('.profit_rate'); + +const modal = { + toHidden() { + convertVisibilityToHidden($modal); + }, + + toVisible() { + convertVisibilityToVisible($modal); + }, + + overWriteWinningCounts(winningStatus) { + $winningCounts.forEach((winningCount, index) => { + winningCount.innerText = `${winningStatus[index]}개`; + }); + }, + + overwriteProfitRate(profitRate) { + $profitRate.innerText = `λ‹Ήμ‹ μ˜ 총 수읡λ₯ μ€ ${profitRate}%μž…λ‹ˆλ‹€.`; + }, +}; + +export default modal; diff --git a/src/domHandler/utils.js b/src/domHandler/utils.js new file mode 100644 index 0000000000..31eaa9ae42 --- /dev/null +++ b/src/domHandler/utils.js @@ -0,0 +1,35 @@ +export const convertVisibilityToHidden = (...doms) => { + doms.forEach((dom) => (dom.style.visibility = 'hidden')); +}; + +export const convertVisibilityToVisible = (...doms) => { + doms.forEach((dom) => (dom.style.visibility = 'visible')); +}; + +export const overwriteInnerText = (dom, message) => { + dom.innerText = message; +}; + +const overwriteBoughtLottos = ($lottoList, lottos) => { + $lottoList.innerHTML = lottos.reduce((HTML, lotto) => { + return (HTML += ` +
+
🎟️
+ ${lotto.join(', ')} +
`); + }, ''); +}; + +const overwriteLottoCount = ($lottoCount, budget) => { + $lottoCount.innerText = `총 ${budget / 1000}개λ₯Ό κ΅¬λ§€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.`; +}; + +const overwriteWinningCounts = ($winningCounts, winningStatus) => { + [...$winningCounts].forEach((winningCount, index) => { + winningCount.innerText = `${winningStatus[index]}개`; + }); +}; + +const overwriteProfitRate = ($profitRate, profitRate) => { + $profitRate.innerText = `λ‹Ήμ‹ μ˜ 총 수읡λ₯ μ€ ${profitRate}%μž…λ‹ˆλ‹€.`; +}; diff --git a/src/eventHandler.js b/src/eventHandler.js new file mode 100644 index 0000000000..7628c5584a --- /dev/null +++ b/src/eventHandler.js @@ -0,0 +1,81 @@ +import validator from './domain/validator'; +import LottoGame from './domain/LottoGame'; + +import error from './domHandler/error'; +import input from './domHandler/input'; +import modal from './domHandler/modal'; +import lotto from './domHandler/lotto'; + +let lottoGame; + +export const onSubmitBudgetForm = (event) => { + event.preventDefault(); + error.clearError('budget'); + + const budget = event.target[0].value; + + handleBudget(budget); +}; + +const handleBudget = (budget) => { + try { + validator.validateBudget(budget); + lottoGame = new LottoGame(budget); + } catch ({ message }) { + return error.overwriteError('budget', message); + } + + renderNextStepAfterBuyingLotto(budget); +}; + +const renderNextStepAfterBuyingLotto = (budget) => { + lotto.overwriteLottoCount(budget); + lotto.overwriteBoughtLottos(lottoGame.getBoughtLottos()); + + lotto.nextStepAfterBuyingLottoToVisible(); +}; + +export const onSubmitLottoNumberForm = (event) => { + event.preventDefault(); + error.clearError('number'); + + const winningNumbers = input.getWinningNumberInputsValues(); + const bonusNumber = input.getBonusNumberInputValue(); + + handleLottoNumber(winningNumbers, bonusNumber); +}; + +const handleLottoNumber = (winningNumbers, bonusNumber) => { + try { + validator.validateWinningNumber(winningNumbers.join(',')); + validator.validateBonusNumber(bonusNumber); + } catch ({ message }) { + return error.overwriteError('number', message); + } + + renderModal(winningNumbers, bonusNumber); +}; + +const renderModal = (winningNumbers, bonusNumber) => { + const winningStatus = lottoGame.getWinningStatus(winningNumbers, bonusNumber).reverse(); + const profitRate = lottoGame.getProfitRate().toFixed(2); + + modal.overWriteWinningCounts(winningStatus); + modal.overwriteProfitRate(profitRate); + + modal.toVisible(); +}; + +export const onClickModalCloseButton = () => { + modal.toHidden(); +}; + +export const onClickModalBackground = () => { + modal.toHidden(); +}; + +export const onClickRetryButton = () => { + modal.toHidden(); + lotto.nextStepAfterBuyingLottoToHidden(); + input.initInputs(); +}; diff --git a/src/step2-index.js b/src/step2-index.js index f8cbaae7f8..a92da525e6 100644 --- a/src/step2-index.js +++ b/src/step2-index.js @@ -2,108 +2,27 @@ import '../css/reset.css'; import '../css/style.css'; import '../css/modal.css'; -import validator from './domain/validator'; -import LottoGame from './domain/LottoGame'; - -import view from './view/view'; +import { + modalToHidden, + onClickModalBackground, + onClickModalCloseButton, + onClickRetryButton, + onSubmitBudgetForm, + onSubmitLottoNumberForm, +} from './eventHandler'; const $budgetForm = document.querySelector('.budget_form'); -const $budgetInput = document.querySelector('.budget_input'); -const $budgetError = document.querySelector('.budget_error'); - -const $nextStepAfterBuyingLotto = document.querySelector('#next_step_buying_lotto'); - -const $lottoCount = document.querySelector('.lotto_count'); -const $lottoList = document.querySelector('.lotto_list_box'); - const $lottoNumberForm = document.querySelector('.lotto_number_form'); -const $winningNumberInputs = document.querySelectorAll('.winning_number'); -const $bonusNumberInput = document.querySelector('.bonus_number'); -const $numberError = document.querySelector('.number_error'); -const $modal = document.querySelector('#modal'); -const $winningCounts = document.querySelectorAll('.winning_count'); -const $profitRate = document.querySelector('.profit_rate'); const $modalCloseButton = document.querySelector('.modal_close'); const $modalBackground = document.querySelector('.modal_background'); const $retryButton = document.querySelector('.retry_button'); -let lottoGame; - -const onSubmitBudgetForm = (event) => { - event.preventDefault(); - view.insertInnerText($budgetError, ''); - - const budget = event.target[0].value; - - handleBudget(budget); -}; - -const handleBudget = (budget) => { - try { - validator.validateBudget(budget); - lottoGame = new LottoGame(budget); - } catch ({ message }) { - view.insertInnerText($budgetError, message); - return view.convertVisibilityToVisible($budgetError); - } - - renderNextStepAfterBuyingLotto(budget); -}; - -const renderNextStepAfterBuyingLotto = (budget) => { - view.insertLottoCount($lottoCount, budget); - view.insertBoughtLottos($lottoList, lottoGame.getBoughtLottos()); - - view.convertVisibilityToVisible($nextStepAfterBuyingLotto); -}; - -const onSubmitLottoNumberForm = (event) => { - event.preventDefault(); - view.insertInnerText($numberError, ''); - - const winningNumbers = [...$winningNumberInputs].map((input) => Number(input.value)); - const bonusNumber = $bonusNumberInput.value; - - handleLottoNumber(winningNumbers, bonusNumber); -}; - -const handleLottoNumber = (winningNumbers, bonusNumber) => { - try { - validator.validateWinningNumber(winningNumbers.join(',')); - validator.validateBonusNumber(bonusNumber); - view.convertVisibilityToHidden($numberError); - } catch ({ message }) { - view.insertInnerText($numberError, message); - return view.convertVisibilityToVisible($numberError); - } - - renderModal(winningNumbers, bonusNumber); -}; - -const renderModal = (winningNumbers, bonusNumber) => { - const winningStatus = [...lottoGame.getWinningStatus(winningNumbers, bonusNumber)].reverse(); - const profitRate = lottoGame.getProfitRate().toFixed(2); - - view.insertWinningCounts($winningCounts, winningStatus); - view.insertProfitRate($profitRate, profitRate); - - view.convertVisibilityToVisible($modal); -}; - -const onClickRetryButton = () => { - view.initInputValue($budgetInput, $bonusNumberInput); - view.convertVisibilityToHidden($modal, $nextStepAfterBuyingLotto); - [...$winningNumberInputs].forEach((winningNumberInput) => { - view.initInputValue(winningNumberInput); - }); -}; - $budgetForm.addEventListener('submit', onSubmitBudgetForm); $lottoNumberForm.addEventListener('submit', onSubmitLottoNumberForm); -$modalCloseButton.addEventListener('click', () => view.convertVisibilityToHidden($modal)); -$modalBackground.addEventListener('click', () => view.convertVisibilityToHidden($modal)); +$modalCloseButton.addEventListener('click', onClickModalCloseButton); +$modalBackground.addEventListener('click', onClickModalBackground); $retryButton.addEventListener('click', onClickRetryButton); diff --git a/src/view/view.js b/src/view/view.js deleted file mode 100644 index b6fa364143..0000000000 --- a/src/view/view.js +++ /dev/null @@ -1,43 +0,0 @@ -const view = { - convertVisibilityToHidden(...doms) { - doms.forEach((dom) => (dom.style.visibility = 'hidden')); - }, - - convertVisibilityToVisible(...doms) { - doms.forEach((dom) => (dom.style.visibility = 'visible')); - }, - - initInputValue(...doms) { - doms.forEach((dom) => (dom.value = '')); - }, - - insertInnerText(dom, message) { - dom.innerText = message; - }, - - insertBoughtLottos($lottoList, lottos) { - $lottoList.innerHTML = lottos.reduce((HTML, lotto) => { - return (HTML += ` -
-
🎟️
- ${lotto.join(', ')} -
`); - }, ''); - }, - - insertLottoCount($lottoCount, budget) { - $lottoCount.innerText = `총 ${budget / 1000}개λ₯Ό κ΅¬λ§€ν•˜μ˜€μŠ΅λ‹ˆλ‹€.`; - }, - - insertWinningCounts($winningCounts, winningStatus) { - [...$winningCounts].forEach((winningCount, index) => { - winningCount.innerText = `${winningStatus[index]}개`; - }); - }, - - insertProfitRate($profitRate, profitRate) { - $profitRate.innerText = `λ‹Ήμ‹ μ˜ 총 수읡λ₯ μ€ ${profitRate}%μž…λ‹ˆλ‹€.`; - }, -}; - -export default view;