Compare commits
	
		
			5 commits
		
	
	
		
			ec363eaefd
			...
			03c094214b
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 03c094214b | |||
| 148a4ece7f | |||
| 960edc13e7 | |||
| c86bdc383f | |||
| 5f3ac45fa3 | 
					 8 changed files with 692 additions and 58 deletions
				
			
		|  | @ -6,9 +6,10 @@ SCRP=$(shell chicken-install -repository) | ||||||
| CSC=CHICKEN_REPOSITORY_PATH=../eggs:$(SCRP) csc | CSC=CHICKEN_REPOSITORY_PATH=../eggs:$(SCRP) csc | ||||||
| 
 | 
 | ||||||
| BRMINV_SOURCES=brminv.scm frontend.import.scm command-line.import.scm	\
 | BRMINV_SOURCES=brminv.scm frontend.import.scm command-line.import.scm	\
 | ||||||
| 	util-proc.import.scm duck.import.scm texts.import.scm | 	util-proc.import.scm duck.import.scm texts.import.scm		\
 | ||||||
|  | 	api-servlets.import.scm | ||||||
| BRMINV_OBJS=brminv.o frontend.o command-line.o util-proc.o duck.o	\
 | BRMINV_OBJS=brminv.o frontend.o command-line.o util-proc.o duck.o	\
 | ||||||
| 	texts.o | 	texts.o api-servlets.o bar-db.o | ||||||
| 
 | 
 | ||||||
| %.o: %.scm | %.o: %.scm | ||||||
| 	$(CSC) -c -static $< | 	$(CSC) -c -static $< | ||||||
|  | @ -46,3 +47,13 @@ TEXTS-SOURCES=texts.scm | ||||||
| 
 | 
 | ||||||
| texts.o: texts.import.scm | texts.o: texts.import.scm | ||||||
| texts.import.scm: $(TEXTS-SOURCES) | texts.import.scm: $(TEXTS-SOURCES) | ||||||
|  | 
 | ||||||
|  | API-SERVLETS-SOURCES=api-servlets.scm bar-db.import.scm | ||||||
|  | 
 | ||||||
|  | api-servlets.o: api-servlets.import.scm | ||||||
|  | api-servlets.import.scm: $(API-SERVLETS-SOURCES) | ||||||
|  | 
 | ||||||
|  | BAR-DB-SOURCES=bar-db.scm | ||||||
|  | 
 | ||||||
|  | bar-db.o: bar-db.import.scm | ||||||
|  | bar-db.import.scm: $(BAR-DB-SOURCES) | ||||||
|  |  | ||||||
							
								
								
									
										90
									
								
								backend/api-servlets.scm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								backend/api-servlets.scm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,90 @@ | ||||||
|  | ;; | ||||||
|  | ;; api-servlets.scm | ||||||
|  | ;; | ||||||
|  | ;; All servlets in one place. | ||||||
|  | ;; | ||||||
|  | ;; ISC License | ||||||
|  | ;; | ||||||
|  | ;; Copyright 2023-2025 Brmlab, z.s. | ||||||
|  | ;; Dominik Pantůček <dominik.pantucek@trustica.cz> | ||||||
|  | ;; | ||||||
|  | ;; Permission to use, copy, modify, and/or distribute this software | ||||||
|  | ;; for any purpose with or without fee is hereby granted, provided | ||||||
|  | ;; that the above copyright notice and this permission notice appear | ||||||
|  | ;; in all copies. | ||||||
|  | ;;  | ||||||
|  | ;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL | ||||||
|  | ;; WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED | ||||||
|  | ;; WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE | ||||||
|  | ;; AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR | ||||||
|  | ;; CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS | ||||||
|  | ;; OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, | ||||||
|  | ;; NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | ||||||
|  | ;; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||||
|  | ;; | ||||||
|  | 
 | ||||||
|  | (declare (unit api-servlets)) | ||||||
|  | 
 | ||||||
|  | (module | ||||||
|  |     api-servlets | ||||||
|  |     ( | ||||||
|  |      api-dispatch | ||||||
|  |      ) | ||||||
|  | 
 | ||||||
|  |   (import scheme | ||||||
|  | 	  spiffy | ||||||
|  | 	  (chicken format)) | ||||||
|  | 
 | ||||||
|  |   (define-syntax try-match-lambda1 | ||||||
|  |     (syntax-rules () | ||||||
|  |       ((_ pp plst ((arg ->conv) . args) body) | ||||||
|  |        (let ((as (->conv pp))) | ||||||
|  | 	 (cond (as | ||||||
|  | 		(let ((arg as)) | ||||||
|  | 		  (try-match-lambda0 plst args body))) | ||||||
|  | 	       (else | ||||||
|  | 		#f)))) | ||||||
|  |       ((_ pp plst (lit . args) body) | ||||||
|  |        (if (equal? pp lit) | ||||||
|  | 	   (try-match-lambda0 plst args body) | ||||||
|  | 	   #f)))) | ||||||
|  | 
 | ||||||
|  |   (define-syntax try-match-lambda0 | ||||||
|  |     (syntax-rules () | ||||||
|  |       ((_ plst () (expr ...)) | ||||||
|  |        (let () | ||||||
|  | 	 expr ... | ||||||
|  | 	 #t)) | ||||||
|  |       ((_ plst (arg . args) body) | ||||||
|  |        (cond ((null? plst) | ||||||
|  | 	      #f) | ||||||
|  | 	     (else | ||||||
|  | 	      (let ((pp (car plst))) | ||||||
|  | 		(try-match-lambda1 pp (cdr plst) (arg . args) body))))))) | ||||||
|  | 
 | ||||||
|  |   (define-syntax try-match-lambda | ||||||
|  |     (syntax-rules () | ||||||
|  |       ((_ args . body) | ||||||
|  |        (lambda (plst) | ||||||
|  | 	 (try-match-lambda0 plst args body))))) | ||||||
|  | 
 | ||||||
|  |   (define-syntax define-try-match | ||||||
|  |     (syntax-rules () | ||||||
|  |       ((_ (name . args) . body) | ||||||
|  |        (define name (try-match-lambda args . body))))) | ||||||
|  | 
 | ||||||
|  |   (define-try-match (account-barcode-info "barcode" (barcode string->number)) | ||||||
|  |     (send-response #:body (format "API call [barcode] ~A" barcode))) | ||||||
|  | 
 | ||||||
|  |   (define api-servlets | ||||||
|  |     (list account-barcode-info)) | ||||||
|  | 
 | ||||||
|  |   (define (api-dispatch plst) | ||||||
|  |     (let loop ((as api-servlets)) | ||||||
|  |       (if (null? as) | ||||||
|  | 	  #f | ||||||
|  | 	  (if ((car as) plst) | ||||||
|  | 	      #t | ||||||
|  | 	      (loop (cdr as)))))) | ||||||
|  | 
 | ||||||
|  |   ) | ||||||
							
								
								
									
										48
									
								
								backend/bar-db.scm
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								backend/bar-db.scm
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,48 @@ | ||||||
|  | ;; | ||||||
|  | ;; bar-db.scm | ||||||
|  | ;; | ||||||
|  | ;; Bar database queries. | ||||||
|  | ;; | ||||||
|  | ;; ISC License | ||||||
|  | ;; | ||||||
|  | ;; Copyright 2023-2025 Brmlab, z.s. | ||||||
|  | ;; Dominik Pantůček <dominik.pantucek@trustica.cz> | ||||||
|  | ;; | ||||||
|  | ;; Permission to use, copy, modify, and/or distribute this software | ||||||
|  | ;; for any purpose with or without fee is hereby granted, provided | ||||||
|  | ;; that the above copyright notice and this permission notice appear | ||||||
|  | ;; in all copies. | ||||||
|  | ;;  | ||||||
|  | ;; THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL | ||||||
|  | ;; WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED | ||||||
|  | ;; WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE | ||||||
|  | ;; AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR | ||||||
|  | ;; CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS | ||||||
|  | ;; OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, | ||||||
|  | ;; NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN | ||||||
|  | ;; CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||||||
|  | ;; | ||||||
|  | 
 | ||||||
|  | (declare (unit bar-db)) | ||||||
|  | 
 | ||||||
|  | (module | ||||||
|  |     bar-db | ||||||
|  |     ( | ||||||
|  |      bar-db-init! | ||||||
|  |      ) | ||||||
|  | 
 | ||||||
|  |   (import scheme | ||||||
|  | 	  (chicken base) | ||||||
|  | 	  postgresql) | ||||||
|  | 
 | ||||||
|  |   (define bar-db-conn (make-parameter #f)) | ||||||
|  | 
 | ||||||
|  |   (define (bar-db-init! name host user pass) | ||||||
|  |     (bar-db-conn | ||||||
|  |      (connect | ||||||
|  |       `((dbname . ,name) | ||||||
|  | 	(host . ,host) | ||||||
|  | 	(user . ,user) | ||||||
|  | 	(password . ,pass))))) | ||||||
|  | 
 | ||||||
|  |   ) | ||||||
|  | @ -32,7 +32,8 @@ | ||||||
| 	intarweb | 	intarweb | ||||||
| 	uri-common | 	uri-common | ||||||
| 	(chicken string) | 	(chicken string) | ||||||
| 	postgresql) | 	api-servlets | ||||||
|  | 	bar-db) | ||||||
| 
 | 
 | ||||||
| (define -port- (make-parameter #f)) | (define -port- (make-parameter #f)) | ||||||
| (define -certificate- (make-parameter #f)) | (define -certificate- (make-parameter #f)) | ||||||
|  | @ -100,20 +101,13 @@ | ||||||
| (when (and (-user-) (-group-)) | (when (and (-user-) (-group-)) | ||||||
|   (switch-user/group (-user-) (-group-))) |   (switch-user/group (-user-) (-group-))) | ||||||
| 
 | 
 | ||||||
| (define dbconn | (bar-db-init! (-db-name-) (-db-host-) (-db-user-) (-db-pass-)) | ||||||
|   (connect |  | ||||||
|    `((dbname . ,(-db-name-)) |  | ||||||
|      (host . ,(-db-host-)) |  | ||||||
|      (user . ,(-db-user-)) |  | ||||||
|      (password . ,(-db-pass-))))) |  | ||||||
| (print dbconn) |  | ||||||
| 
 | 
 | ||||||
| (define (handle-api-calls) | (define (handle-api-calls) | ||||||
|   (define plst (cdr (uri-path (request-uri (current-request))))) |   (define plst (cdr (uri-path (request-uri (current-request))))) | ||||||
|   (cond ((and (not (null? plst)) |   (cond ((and (not (null? plst)) | ||||||
| 	      (equal? (car plst) "api")) | 	      (equal? (car plst) "api")) | ||||||
| 	 (send-response #:body "API call") | 	 (api-dispatch (cdr plst))) | ||||||
| 	 #t) |  | ||||||
| 	(else | 	(else | ||||||
| 	 #f))) | 	 #f))) | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
							
								
								
									
										506
									
								
								frontend/package-lock.json
									
										
									
										generated
									
									
									
								
							
							
						
						
									
										506
									
								
								frontend/package-lock.json
									
										
									
										generated
									
									
									
								
							|  | @ -8,8 +8,10 @@ | ||||||
|       "name": "frontend", |       "name": "frontend", | ||||||
|       "version": "0.0.0", |       "version": "0.0.0", | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|  |         "bootstrap": "^5.3.5", | ||||||
|         "qr-scanner": "^1.4.2", |         "qr-scanner": "^1.4.2", | ||||||
|         "react": "^19.0.0", |         "react": "^19.0.0", | ||||||
|  |         "react-bootstrap": "^2.10.9", | ||||||
|         "react-dom": "^19.0.0", |         "react-dom": "^19.0.0", | ||||||
|         "react-hot-toast": "^2.5.2", |         "react-hot-toast": "^2.5.2", | ||||||
|         "react-qr-barcode-scanner": "^2.0.0" |         "react-qr-barcode-scanner": "^2.0.0" | ||||||
|  | @ -248,6 +250,17 @@ | ||||||
|         "@babel/core": "^7.0.0-0" |         "@babel/core": "^7.0.0-0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/@babel/runtime": { | ||||||
|  |       "version": "7.27.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", | ||||||
|  |       "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "regenerator-runtime": "^0.14.0" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=6.9.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/@babel/template": { |     "node_modules/@babel/template": { | ||||||
|       "version": "7.27.0", |       "version": "7.27.0", | ||||||
|       "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", |       "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", | ||||||
|  | @ -951,6 +964,79 @@ | ||||||
|         "@jridgewell/sourcemap-codec": "^1.4.14" |         "@jridgewell/sourcemap-codec": "^1.4.14" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/@popperjs/core": { | ||||||
|  |       "version": "2.11.8", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", | ||||||
|  |       "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", | ||||||
|  |       "funding": { | ||||||
|  |         "type": "opencollective", | ||||||
|  |         "url": "https://opencollective.com/popperjs" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@react-aria/ssr": { | ||||||
|  |       "version": "3.9.7", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.7.tgz", | ||||||
|  |       "integrity": "sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@swc/helpers": "^0.5.0" | ||||||
|  |       }, | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">= 12" | ||||||
|  |       }, | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0 || ^19.0.0-rc.1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@restart/hooks": { | ||||||
|  |       "version": "0.4.16", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", | ||||||
|  |       "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "dequal": "^2.0.3" | ||||||
|  |       }, | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "react": ">=16.8.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@restart/ui": { | ||||||
|  |       "version": "1.9.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.9.4.tgz", | ||||||
|  |       "integrity": "sha512-N4C7haUc3vn4LTwVUPlkJN8Ach/+yIMvRuTVIhjilNHqegY60SGLrzud6errOMNJwSnmYFnt1J0H/k8FE3A4KA==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.26.0", | ||||||
|  |         "@popperjs/core": "^2.11.8", | ||||||
|  |         "@react-aria/ssr": "^3.5.0", | ||||||
|  |         "@restart/hooks": "^0.5.0", | ||||||
|  |         "@types/warning": "^3.0.3", | ||||||
|  |         "dequal": "^2.0.3", | ||||||
|  |         "dom-helpers": "^5.2.0", | ||||||
|  |         "uncontrollable": "^8.0.4", | ||||||
|  |         "warning": "^4.0.3" | ||||||
|  |       }, | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "react": ">=16.14.0", | ||||||
|  |         "react-dom": ">=16.14.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@restart/ui/node_modules/@restart/hooks": { | ||||||
|  |       "version": "0.5.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.5.1.tgz", | ||||||
|  |       "integrity": "sha512-EMoH04NHS1pbn07iLTjIjgttuqb7qu4+/EyhAx27MHpoENcB2ZdSsLTNxmKD+WEPnZigo62Qc8zjGnNxoSE/5Q==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "dequal": "^2.0.3" | ||||||
|  |       }, | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "react": ">=16.8.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@restart/ui/node_modules/uncontrollable": { | ||||||
|  |       "version": "8.0.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", | ||||||
|  |       "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "react": ">=16.14.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/@rollup/rollup-android-arm-eabi": { |     "node_modules/@rollup/rollup-android-arm-eabi": { | ||||||
|       "version": "4.38.0", |       "version": "4.38.0", | ||||||
|       "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz", |       "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz", | ||||||
|  | @ -1211,6 +1297,14 @@ | ||||||
|         "win32" |         "win32" | ||||||
|       ] |       ] | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/@swc/helpers": { | ||||||
|  |       "version": "0.5.15", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", | ||||||
|  |       "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "tslib": "^2.8.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/@types/babel__core": { |     "node_modules/@types/babel__core": { | ||||||
|       "version": "7.20.5", |       "version": "7.20.5", | ||||||
|       "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", |       "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", | ||||||
|  | @ -1278,7 +1372,6 @@ | ||||||
|       "version": "19.0.12", |       "version": "19.0.12", | ||||||
|       "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.12.tgz", |       "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.12.tgz", | ||||||
|       "integrity": "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==", |       "integrity": "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==", | ||||||
|       "dev": true, |  | ||||||
|       "dependencies": { |       "dependencies": { | ||||||
|         "csstype": "^3.0.2" |         "csstype": "^3.0.2" | ||||||
|       } |       } | ||||||
|  | @ -1292,6 +1385,19 @@ | ||||||
|         "@types/react": "^19.0.0" |         "@types/react": "^19.0.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/@types/react-transition-group": { | ||||||
|  |       "version": "4.4.12", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", | ||||||
|  |       "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "@types/react": "*" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/@types/warning": { | ||||||
|  |       "version": "3.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", | ||||||
|  |       "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" | ||||||
|  |     }, | ||||||
|     "node_modules/@vitejs/plugin-react": { |     "node_modules/@vitejs/plugin-react": { | ||||||
|       "version": "4.3.4", |       "version": "4.3.4", | ||||||
|       "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", |       "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", | ||||||
|  | @ -1395,6 +1501,24 @@ | ||||||
|       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", |       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/bootstrap": { | ||||||
|  |       "version": "5.3.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.5.tgz", | ||||||
|  |       "integrity": "sha512-ct1CHKtiobRimyGzmsSldEtM03E8fcEX4Tb3dGXz1V8faRwM50+vfHwTzOxB3IlKO7m+9vTH3s/3C6T2EAPeTA==", | ||||||
|  |       "funding": [ | ||||||
|  |         { | ||||||
|  |           "type": "github", | ||||||
|  |           "url": "https://github.com/sponsors/twbs" | ||||||
|  |         }, | ||||||
|  |         { | ||||||
|  |           "type": "opencollective", | ||||||
|  |           "url": "https://opencollective.com/bootstrap" | ||||||
|  |         } | ||||||
|  |       ], | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "@popperjs/core": "^2.11.8" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/brace-expansion": { |     "node_modules/brace-expansion": { | ||||||
|       "version": "1.1.11", |       "version": "1.1.11", | ||||||
|       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", |       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", | ||||||
|  | @ -1482,6 +1606,11 @@ | ||||||
|         "url": "https://github.com/chalk/chalk?sponsor=1" |         "url": "https://github.com/chalk/chalk?sponsor=1" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/classnames": { | ||||||
|  |       "version": "2.5.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", | ||||||
|  |       "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" | ||||||
|  |     }, | ||||||
|     "node_modules/color-convert": { |     "node_modules/color-convert": { | ||||||
|       "version": "2.0.1", |       "version": "2.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", |       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", | ||||||
|  | @ -1554,6 +1683,23 @@ | ||||||
|       "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", |       "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/dequal": { | ||||||
|  |       "version": "2.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", | ||||||
|  |       "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=6" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/dom-helpers": { | ||||||
|  |       "version": "5.2.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", | ||||||
|  |       "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.8.7", | ||||||
|  |         "csstype": "^3.0.2" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/electron-to-chromium": { |     "node_modules/electron-to-chromium": { | ||||||
|       "version": "1.5.128", |       "version": "1.5.128", | ||||||
|       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz", |       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz", | ||||||
|  | @ -1952,6 +2098,14 @@ | ||||||
|         "node": ">=0.8.19" |         "node": ">=0.8.19" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/invariant": { | ||||||
|  |       "version": "2.2.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", | ||||||
|  |       "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "loose-envify": "^1.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/is-extglob": { |     "node_modules/is-extglob": { | ||||||
|       "version": "2.1.1", |       "version": "2.1.1", | ||||||
|       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", |       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", | ||||||
|  | @ -1982,8 +2136,7 @@ | ||||||
|     "node_modules/js-tokens": { |     "node_modules/js-tokens": { | ||||||
|       "version": "4.0.0", |       "version": "4.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", |       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", | ||||||
|       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", |       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" | ||||||
|       "dev": true |  | ||||||
|     }, |     }, | ||||||
|     "node_modules/js-yaml": { |     "node_modules/js-yaml": { | ||||||
|       "version": "4.1.0", |       "version": "4.1.0", | ||||||
|  | @ -2082,6 +2235,17 @@ | ||||||
|       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", |       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/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==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "js-tokens": "^3.0.0 || ^4.0.0" | ||||||
|  |       }, | ||||||
|  |       "bin": { | ||||||
|  |         "loose-envify": "cli.js" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/lru-cache": { |     "node_modules/lru-cache": { | ||||||
|       "version": "5.1.1", |       "version": "5.1.1", | ||||||
|       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", |       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", | ||||||
|  | @ -2139,6 +2303,14 @@ | ||||||
|       "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", |       "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/object-assign": { | ||||||
|  |       "version": "4.1.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", | ||||||
|  |       "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", | ||||||
|  |       "engines": { | ||||||
|  |         "node": ">=0.10.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/optionator": { |     "node_modules/optionator": { | ||||||
|       "version": "0.9.4", |       "version": "0.9.4", | ||||||
|       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", |       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", | ||||||
|  | @ -2259,6 +2431,28 @@ | ||||||
|         "node": ">= 0.8.0" |         "node": ">= 0.8.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/prop-types": { | ||||||
|  |       "version": "15.8.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", | ||||||
|  |       "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "loose-envify": "^1.4.0", | ||||||
|  |         "object-assign": "^4.1.1", | ||||||
|  |         "react-is": "^16.13.1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "node_modules/prop-types-extra": { | ||||||
|  |       "version": "1.1.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", | ||||||
|  |       "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "react-is": "^16.3.2", | ||||||
|  |         "warning": "^4.0.0" | ||||||
|  |       }, | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "react": ">=0.14.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/punycode": { |     "node_modules/punycode": { | ||||||
|       "version": "2.3.1", |       "version": "2.3.1", | ||||||
|       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", |       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", | ||||||
|  | @ -2284,6 +2478,36 @@ | ||||||
|         "node": ">=0.10.0" |         "node": ">=0.10.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/react-bootstrap": { | ||||||
|  |       "version": "2.10.9", | ||||||
|  |       "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.9.tgz", | ||||||
|  |       "integrity": "sha512-TJUCuHcxdgYpOqeWmRApM/Dy0+hVsxNRFvq2aRFQuxhNi/+ivOxC5OdWIeHS3agxvzJ4Ev4nDw2ZdBl9ymd/JQ==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.24.7", | ||||||
|  |         "@restart/hooks": "^0.4.9", | ||||||
|  |         "@restart/ui": "^1.9.4", | ||||||
|  |         "@types/prop-types": "^15.7.12", | ||||||
|  |         "@types/react-transition-group": "^4.4.6", | ||||||
|  |         "classnames": "^2.3.2", | ||||||
|  |         "dom-helpers": "^5.2.1", | ||||||
|  |         "invariant": "^2.2.4", | ||||||
|  |         "prop-types": "^15.8.1", | ||||||
|  |         "prop-types-extra": "^1.1.0", | ||||||
|  |         "react-transition-group": "^4.4.5", | ||||||
|  |         "uncontrollable": "^7.2.1", | ||||||
|  |         "warning": "^4.0.3" | ||||||
|  |       }, | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "@types/react": ">=16.14.8", | ||||||
|  |         "react": ">=16.14.0", | ||||||
|  |         "react-dom": ">=16.14.0" | ||||||
|  |       }, | ||||||
|  |       "peerDependenciesMeta": { | ||||||
|  |         "@types/react": { | ||||||
|  |           "optional": true | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/react-dom": { |     "node_modules/react-dom": { | ||||||
|       "version": "19.1.0", |       "version": "19.1.0", | ||||||
|       "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", |       "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", | ||||||
|  | @ -2311,6 +2535,16 @@ | ||||||
|         "react-dom": ">=16" |         "react-dom": ">=16" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/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==" | ||||||
|  |     }, | ||||||
|  |     "node_modules/react-lifecycles-compat": { | ||||||
|  |       "version": "3.0.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", | ||||||
|  |       "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" | ||||||
|  |     }, | ||||||
|     "node_modules/react-qr-barcode-scanner": { |     "node_modules/react-qr-barcode-scanner": { | ||||||
|       "version": "2.0.0", |       "version": "2.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/react-qr-barcode-scanner/-/react-qr-barcode-scanner-2.0.0.tgz", |       "resolved": "https://registry.npmjs.org/react-qr-barcode-scanner/-/react-qr-barcode-scanner-2.0.0.tgz", | ||||||
|  | @ -2343,6 +2577,21 @@ | ||||||
|         "node": ">=0.10.0" |         "node": ">=0.10.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/react-transition-group": { | ||||||
|  |       "version": "4.4.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", | ||||||
|  |       "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.5.5", | ||||||
|  |         "dom-helpers": "^5.0.1", | ||||||
|  |         "loose-envify": "^1.4.0", | ||||||
|  |         "prop-types": "^15.6.2" | ||||||
|  |       }, | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "react": ">=16.6.0", | ||||||
|  |         "react-dom": ">=16.6.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/react-webcam": { |     "node_modules/react-webcam": { | ||||||
|       "version": "7.2.0", |       "version": "7.2.0", | ||||||
|       "resolved": "https://registry.npmjs.org/react-webcam/-/react-webcam-7.2.0.tgz", |       "resolved": "https://registry.npmjs.org/react-webcam/-/react-webcam-7.2.0.tgz", | ||||||
|  | @ -2352,6 +2601,11 @@ | ||||||
|         "react-dom": ">=16.2.0" |         "react-dom": ">=16.2.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/regenerator-runtime": { | ||||||
|  |       "version": "0.14.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", | ||||||
|  |       "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" | ||||||
|  |     }, | ||||||
|     "node_modules/resolve-from": { |     "node_modules/resolve-from": { | ||||||
|       "version": "4.0.0", |       "version": "4.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", |       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", | ||||||
|  | @ -2476,6 +2730,11 @@ | ||||||
|         "node": ">=14.0.0" |         "node": ">=14.0.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/tslib": { | ||||||
|  |       "version": "2.8.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", | ||||||
|  |       "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" | ||||||
|  |     }, | ||||||
|     "node_modules/type-check": { |     "node_modules/type-check": { | ||||||
|       "version": "0.4.0", |       "version": "0.4.0", | ||||||
|       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", |       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", | ||||||
|  | @ -2488,6 +2747,20 @@ | ||||||
|         "node": ">= 0.8.0" |         "node": ">= 0.8.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/uncontrollable": { | ||||||
|  |       "version": "7.2.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", | ||||||
|  |       "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "@babel/runtime": "^7.6.3", | ||||||
|  |         "@types/react": ">=16.9.11", | ||||||
|  |         "invariant": "^2.2.4", | ||||||
|  |         "react-lifecycles-compat": "^3.0.4" | ||||||
|  |       }, | ||||||
|  |       "peerDependencies": { | ||||||
|  |         "react": ">=15.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/update-browserslist-db": { |     "node_modules/update-browserslist-db": { | ||||||
|       "version": "1.1.3", |       "version": "1.1.3", | ||||||
|       "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", |       "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", | ||||||
|  | @ -2598,6 +2871,14 @@ | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "node_modules/warning": { | ||||||
|  |       "version": "4.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", | ||||||
|  |       "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", | ||||||
|  |       "dependencies": { | ||||||
|  |         "loose-envify": "^1.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "node_modules/which": { |     "node_modules/which": { | ||||||
|       "version": "2.0.2", |       "version": "2.0.2", | ||||||
|       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", |       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", | ||||||
|  | @ -2800,6 +3081,14 @@ | ||||||
|         "@babel/helper-plugin-utils": "^7.25.9" |         "@babel/helper-plugin-utils": "^7.25.9" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "@babel/runtime": { | ||||||
|  |       "version": "7.27.0", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.27.0.tgz", | ||||||
|  |       "integrity": "sha512-VtPOkrdPHZsKc/clNqyi9WUA8TINkZ4cGk63UUE3u4pmB2k+ZMQRDuIOagv8UVd6j7k0T3+RRIb7beKTebNbcw==", | ||||||
|  |       "requires": { | ||||||
|  |         "regenerator-runtime": "^0.14.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "@babel/template": { |     "@babel/template": { | ||||||
|       "version": "7.27.0", |       "version": "7.27.0", | ||||||
|       "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", |       "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.0.tgz", | ||||||
|  | @ -3190,6 +3479,59 @@ | ||||||
|         "@jridgewell/sourcemap-codec": "^1.4.14" |         "@jridgewell/sourcemap-codec": "^1.4.14" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "@popperjs/core": { | ||||||
|  |       "version": "2.11.8", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", | ||||||
|  |       "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" | ||||||
|  |     }, | ||||||
|  |     "@react-aria/ssr": { | ||||||
|  |       "version": "3.9.7", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.9.7.tgz", | ||||||
|  |       "integrity": "sha512-GQygZaGlmYjmYM+tiNBA5C6acmiDWF52Nqd40bBp0Znk4M4hP+LTmI0lpI1BuKMw45T8RIhrAsICIfKwZvi2Gg==", | ||||||
|  |       "requires": { | ||||||
|  |         "@swc/helpers": "^0.5.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "@restart/hooks": { | ||||||
|  |       "version": "0.4.16", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.16.tgz", | ||||||
|  |       "integrity": "sha512-f7aCv7c+nU/3mF7NWLtVVr0Ra80RqsO89hO72r+Y/nvQr5+q0UFGkocElTH6MJApvReVh6JHUFYn2cw1WdHF3w==", | ||||||
|  |       "requires": { | ||||||
|  |         "dequal": "^2.0.3" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "@restart/ui": { | ||||||
|  |       "version": "1.9.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.9.4.tgz", | ||||||
|  |       "integrity": "sha512-N4C7haUc3vn4LTwVUPlkJN8Ach/+yIMvRuTVIhjilNHqegY60SGLrzud6errOMNJwSnmYFnt1J0H/k8FE3A4KA==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.26.0", | ||||||
|  |         "@popperjs/core": "^2.11.8", | ||||||
|  |         "@react-aria/ssr": "^3.5.0", | ||||||
|  |         "@restart/hooks": "^0.5.0", | ||||||
|  |         "@types/warning": "^3.0.3", | ||||||
|  |         "dequal": "^2.0.3", | ||||||
|  |         "dom-helpers": "^5.2.0", | ||||||
|  |         "uncontrollable": "^8.0.4", | ||||||
|  |         "warning": "^4.0.3" | ||||||
|  |       }, | ||||||
|  |       "dependencies": { | ||||||
|  |         "@restart/hooks": { | ||||||
|  |           "version": "0.5.1", | ||||||
|  |           "resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.5.1.tgz", | ||||||
|  |           "integrity": "sha512-EMoH04NHS1pbn07iLTjIjgttuqb7qu4+/EyhAx27MHpoENcB2ZdSsLTNxmKD+WEPnZigo62Qc8zjGnNxoSE/5Q==", | ||||||
|  |           "requires": { | ||||||
|  |             "dequal": "^2.0.3" | ||||||
|  |           } | ||||||
|  |         }, | ||||||
|  |         "uncontrollable": { | ||||||
|  |           "version": "8.0.4", | ||||||
|  |           "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.4.tgz", | ||||||
|  |           "integrity": "sha512-ulRWYWHvscPFc0QQXvyJjY6LIXU56f0h8pQFvhxiKk5V1fcI8gp9Ht9leVAhrVjzqMw0BgjspBINx9r6oyJUvQ==", | ||||||
|  |           "requires": {} | ||||||
|  |         } | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "@rollup/rollup-android-arm-eabi": { |     "@rollup/rollup-android-arm-eabi": { | ||||||
|       "version": "4.38.0", |       "version": "4.38.0", | ||||||
|       "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz", |       "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.38.0.tgz", | ||||||
|  | @ -3330,6 +3672,14 @@ | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "optional": true |       "optional": true | ||||||
|     }, |     }, | ||||||
|  |     "@swc/helpers": { | ||||||
|  |       "version": "0.5.15", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.15.tgz", | ||||||
|  |       "integrity": "sha512-JQ5TuMi45Owi4/BIMAJBoSQoOJu12oOk/gADqlcUL9JEdHB8vyjUSsxqeNXnmXHjYKMi2WcYtezGEEhqUI/E2g==", | ||||||
|  |       "requires": { | ||||||
|  |         "tslib": "^2.8.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "@types/babel__core": { |     "@types/babel__core": { | ||||||
|       "version": "7.20.5", |       "version": "7.20.5", | ||||||
|       "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", |       "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", | ||||||
|  | @ -3397,7 +3747,6 @@ | ||||||
|       "version": "19.0.12", |       "version": "19.0.12", | ||||||
|       "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.12.tgz", |       "resolved": "https://registry.npmjs.org/@types/react/-/react-19.0.12.tgz", | ||||||
|       "integrity": "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==", |       "integrity": "sha512-V6Ar115dBDrjbtXSrS+/Oruobc+qVbbUxDFC1RSbRqLt5SYvxxyIDrSC85RWml54g+jfNeEMZhEj7wW07ONQhA==", | ||||||
|       "dev": true, |  | ||||||
|       "requires": { |       "requires": { | ||||||
|         "csstype": "^3.0.2" |         "csstype": "^3.0.2" | ||||||
|       } |       } | ||||||
|  | @ -3409,6 +3758,17 @@ | ||||||
|       "dev": true, |       "dev": true, | ||||||
|       "requires": {} |       "requires": {} | ||||||
|     }, |     }, | ||||||
|  |     "@types/react-transition-group": { | ||||||
|  |       "version": "4.4.12", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", | ||||||
|  |       "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", | ||||||
|  |       "requires": {} | ||||||
|  |     }, | ||||||
|  |     "@types/warning": { | ||||||
|  |       "version": "3.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.3.tgz", | ||||||
|  |       "integrity": "sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==" | ||||||
|  |     }, | ||||||
|     "@vitejs/plugin-react": { |     "@vitejs/plugin-react": { | ||||||
|       "version": "4.3.4", |       "version": "4.3.4", | ||||||
|       "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", |       "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.3.4.tgz", | ||||||
|  | @ -3483,6 +3843,12 @@ | ||||||
|       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", |       "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "bootstrap": { | ||||||
|  |       "version": "5.3.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.3.5.tgz", | ||||||
|  |       "integrity": "sha512-ct1CHKtiobRimyGzmsSldEtM03E8fcEX4Tb3dGXz1V8faRwM50+vfHwTzOxB3IlKO7m+9vTH3s/3C6T2EAPeTA==", | ||||||
|  |       "requires": {} | ||||||
|  |     }, | ||||||
|     "brace-expansion": { |     "brace-expansion": { | ||||||
|       "version": "1.1.11", |       "version": "1.1.11", | ||||||
|       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", |       "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", | ||||||
|  | @ -3527,6 +3893,11 @@ | ||||||
|         "supports-color": "^7.1.0" |         "supports-color": "^7.1.0" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "classnames": { | ||||||
|  |       "version": "2.5.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.5.1.tgz", | ||||||
|  |       "integrity": "sha512-saHYOzhIQs6wy2sVxTM6bUDsQO4F50V9RQ22qBpEdCW+I+/Wmke2HOl6lS6dTpdxVhb88/I6+Hs+438c3lfUow==" | ||||||
|  |     }, | ||||||
|     "color-convert": { |     "color-convert": { | ||||||
|       "version": "2.0.1", |       "version": "2.0.1", | ||||||
|       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", |       "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", | ||||||
|  | @ -3585,6 +3956,20 @@ | ||||||
|       "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", |       "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "dequal": { | ||||||
|  |       "version": "2.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", | ||||||
|  |       "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==" | ||||||
|  |     }, | ||||||
|  |     "dom-helpers": { | ||||||
|  |       "version": "5.2.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", | ||||||
|  |       "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.8.7", | ||||||
|  |         "csstype": "^3.0.2" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "electron-to-chromium": { |     "electron-to-chromium": { | ||||||
|       "version": "1.5.128", |       "version": "1.5.128", | ||||||
|       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz", |       "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.128.tgz", | ||||||
|  | @ -3865,6 +4250,14 @@ | ||||||
|       "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", |       "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "invariant": { | ||||||
|  |       "version": "2.2.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", | ||||||
|  |       "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", | ||||||
|  |       "requires": { | ||||||
|  |         "loose-envify": "^1.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "is-extglob": { |     "is-extglob": { | ||||||
|       "version": "2.1.1", |       "version": "2.1.1", | ||||||
|       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", |       "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", | ||||||
|  | @ -3889,8 +4282,7 @@ | ||||||
|     "js-tokens": { |     "js-tokens": { | ||||||
|       "version": "4.0.0", |       "version": "4.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", |       "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", | ||||||
|       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", |       "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" | ||||||
|       "dev": true |  | ||||||
|     }, |     }, | ||||||
|     "js-yaml": { |     "js-yaml": { | ||||||
|       "version": "4.1.0", |       "version": "4.1.0", | ||||||
|  | @ -3965,6 +4357,14 @@ | ||||||
|       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", |       "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", | ||||||
|       "dev": true |       "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==", | ||||||
|  |       "requires": { | ||||||
|  |         "js-tokens": "^3.0.0 || ^4.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "lru-cache": { |     "lru-cache": { | ||||||
|       "version": "5.1.1", |       "version": "5.1.1", | ||||||
|       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", |       "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", | ||||||
|  | @ -4007,6 +4407,11 @@ | ||||||
|       "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", |       "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "object-assign": { | ||||||
|  |       "version": "4.1.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", | ||||||
|  |       "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" | ||||||
|  |     }, | ||||||
|     "optionator": { |     "optionator": { | ||||||
|       "version": "0.9.4", |       "version": "0.9.4", | ||||||
|       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", |       "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", | ||||||
|  | @ -4083,6 +4488,25 @@ | ||||||
|       "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", |       "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "prop-types": { | ||||||
|  |       "version": "15.8.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", | ||||||
|  |       "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", | ||||||
|  |       "requires": { | ||||||
|  |         "loose-envify": "^1.4.0", | ||||||
|  |         "object-assign": "^4.1.1", | ||||||
|  |         "react-is": "^16.13.1" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|  |     "prop-types-extra": { | ||||||
|  |       "version": "1.1.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz", | ||||||
|  |       "integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==", | ||||||
|  |       "requires": { | ||||||
|  |         "react-is": "^16.3.2", | ||||||
|  |         "warning": "^4.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "punycode": { |     "punycode": { | ||||||
|       "version": "2.3.1", |       "version": "2.3.1", | ||||||
|       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", |       "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", | ||||||
|  | @ -4102,6 +4526,26 @@ | ||||||
|       "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", |       "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", | ||||||
|       "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==" |       "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==" | ||||||
|     }, |     }, | ||||||
|  |     "react-bootstrap": { | ||||||
|  |       "version": "2.10.9", | ||||||
|  |       "resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.10.9.tgz", | ||||||
|  |       "integrity": "sha512-TJUCuHcxdgYpOqeWmRApM/Dy0+hVsxNRFvq2aRFQuxhNi/+ivOxC5OdWIeHS3agxvzJ4Ev4nDw2ZdBl9ymd/JQ==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.24.7", | ||||||
|  |         "@restart/hooks": "^0.4.9", | ||||||
|  |         "@restart/ui": "^1.9.4", | ||||||
|  |         "@types/prop-types": "^15.7.12", | ||||||
|  |         "@types/react-transition-group": "^4.4.6", | ||||||
|  |         "classnames": "^2.3.2", | ||||||
|  |         "dom-helpers": "^5.2.1", | ||||||
|  |         "invariant": "^2.2.4", | ||||||
|  |         "prop-types": "^15.8.1", | ||||||
|  |         "prop-types-extra": "^1.1.0", | ||||||
|  |         "react-transition-group": "^4.4.5", | ||||||
|  |         "uncontrollable": "^7.2.1", | ||||||
|  |         "warning": "^4.0.3" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "react-dom": { |     "react-dom": { | ||||||
|       "version": "19.1.0", |       "version": "19.1.0", | ||||||
|       "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", |       "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", | ||||||
|  | @ -4119,6 +4563,16 @@ | ||||||
|         "goober": "^2.1.16" |         "goober": "^2.1.16" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "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==" | ||||||
|  |     }, | ||||||
|  |     "react-lifecycles-compat": { | ||||||
|  |       "version": "3.0.4", | ||||||
|  |       "resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz", | ||||||
|  |       "integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==" | ||||||
|  |     }, | ||||||
|     "react-qr-barcode-scanner": { |     "react-qr-barcode-scanner": { | ||||||
|       "version": "2.0.0", |       "version": "2.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/react-qr-barcode-scanner/-/react-qr-barcode-scanner-2.0.0.tgz", |       "resolved": "https://registry.npmjs.org/react-qr-barcode-scanner/-/react-qr-barcode-scanner-2.0.0.tgz", | ||||||
|  | @ -4146,12 +4600,28 @@ | ||||||
|       "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", |       "integrity": "sha512-jCvmsr+1IUSMUyzOkRcvnVbX3ZYC6g9TDrDbFuFmRDq7PD4yaGbLKNQL6k2jnArV8hjYxh7hVhAZB6s9HDGpZA==", | ||||||
|       "dev": true |       "dev": true | ||||||
|     }, |     }, | ||||||
|  |     "react-transition-group": { | ||||||
|  |       "version": "4.4.5", | ||||||
|  |       "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", | ||||||
|  |       "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.5.5", | ||||||
|  |         "dom-helpers": "^5.0.1", | ||||||
|  |         "loose-envify": "^1.4.0", | ||||||
|  |         "prop-types": "^15.6.2" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "react-webcam": { |     "react-webcam": { | ||||||
|       "version": "7.2.0", |       "version": "7.2.0", | ||||||
|       "resolved": "https://registry.npmjs.org/react-webcam/-/react-webcam-7.2.0.tgz", |       "resolved": "https://registry.npmjs.org/react-webcam/-/react-webcam-7.2.0.tgz", | ||||||
|       "integrity": "sha512-xkrzYPqa1ag2DP+2Q/kLKBmCIfEx49bVdgCCCcZf88oF+0NPEbkwYk3/s/C7Zy0mhM8k+hpdNkBLzxg8H0aWcg==", |       "integrity": "sha512-xkrzYPqa1ag2DP+2Q/kLKBmCIfEx49bVdgCCCcZf88oF+0NPEbkwYk3/s/C7Zy0mhM8k+hpdNkBLzxg8H0aWcg==", | ||||||
|       "requires": {} |       "requires": {} | ||||||
|     }, |     }, | ||||||
|  |     "regenerator-runtime": { | ||||||
|  |       "version": "0.14.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", | ||||||
|  |       "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" | ||||||
|  |     }, | ||||||
|     "resolve-from": { |     "resolve-from": { | ||||||
|       "version": "4.0.0", |       "version": "4.0.0", | ||||||
|       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", |       "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", | ||||||
|  | @ -4240,6 +4710,11 @@ | ||||||
|       "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", |       "resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.3.1.tgz", | ||||||
|       "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==" |       "integrity": "sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==" | ||||||
|     }, |     }, | ||||||
|  |     "tslib": { | ||||||
|  |       "version": "2.8.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", | ||||||
|  |       "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==" | ||||||
|  |     }, | ||||||
|     "type-check": { |     "type-check": { | ||||||
|       "version": "0.4.0", |       "version": "0.4.0", | ||||||
|       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", |       "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", | ||||||
|  | @ -4249,6 +4724,17 @@ | ||||||
|         "prelude-ls": "^1.2.1" |         "prelude-ls": "^1.2.1" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "uncontrollable": { | ||||||
|  |       "version": "7.2.1", | ||||||
|  |       "resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz", | ||||||
|  |       "integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==", | ||||||
|  |       "requires": { | ||||||
|  |         "@babel/runtime": "^7.6.3", | ||||||
|  |         "@types/react": ">=16.9.11", | ||||||
|  |         "invariant": "^2.2.4", | ||||||
|  |         "react-lifecycles-compat": "^3.0.4" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "update-browserslist-db": { |     "update-browserslist-db": { | ||||||
|       "version": "1.1.3", |       "version": "1.1.3", | ||||||
|       "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", |       "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", | ||||||
|  | @ -4280,6 +4766,14 @@ | ||||||
|         "rollup": "^4.30.1" |         "rollup": "^4.30.1" | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  |     "warning": { | ||||||
|  |       "version": "4.0.3", | ||||||
|  |       "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", | ||||||
|  |       "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", | ||||||
|  |       "requires": { | ||||||
|  |         "loose-envify": "^1.0.0" | ||||||
|  |       } | ||||||
|  |     }, | ||||||
|     "which": { |     "which": { | ||||||
|       "version": "2.0.2", |       "version": "2.0.2", | ||||||
|       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", |       "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", | ||||||
|  |  | ||||||
|  | @ -10,8 +10,10 @@ | ||||||
|     "preview": "vite preview" |     "preview": "vite preview" | ||||||
|   }, |   }, | ||||||
|   "dependencies": { |   "dependencies": { | ||||||
|  |     "bootstrap": "^5.3.5", | ||||||
|     "qr-scanner": "^1.4.2", |     "qr-scanner": "^1.4.2", | ||||||
|     "react": "^19.0.0", |     "react": "^19.0.0", | ||||||
|  |     "react-bootstrap": "^2.10.9", | ||||||
|     "react-dom": "^19.0.0", |     "react-dom": "^19.0.0", | ||||||
|     "react-hot-toast": "^2.5.2", |     "react-hot-toast": "^2.5.2", | ||||||
|     "react-qr-barcode-scanner": "^2.0.0" |     "react-qr-barcode-scanner": "^2.0.0" | ||||||
|  |  | ||||||
|  | @ -1,36 +1,8 @@ | ||||||
| #root { | .App { | ||||||
|   max-width: 1280px; |   background-color: var(--background-color); | ||||||
|   margin: 0 auto; |   color: var(--primary-text-color) !important; | ||||||
|   padding: 2rem; |   min-height: 100vh; | ||||||
|   text-align: center; |   width: 100%; | ||||||
| } |  | ||||||
| 
 |  | ||||||
| .logo { |  | ||||||
|   height: 6em; |  | ||||||
|   padding: 1.5em; |  | ||||||
|   will-change: filter; |  | ||||||
|   transition: filter 300ms; |  | ||||||
| } |  | ||||||
| .logo:hover { |  | ||||||
|   filter: drop-shadow(0 0 2em #646cffaa); |  | ||||||
| } |  | ||||||
| .logo.react:hover { |  | ||||||
|   filter: drop-shadow(0 0 2em #61dafbaa); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @keyframes logo-spin { |  | ||||||
|   from { |  | ||||||
|     transform: rotate(0deg); |  | ||||||
|   } |  | ||||||
|   to { |  | ||||||
|     transform: rotate(360deg); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| @media (prefers-reduced-motion: no-preference) { |  | ||||||
|   a:nth-of-type(2) .logo { |  | ||||||
|     animation: logo-spin infinite 20s linear; |  | ||||||
|   } |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| .card { | .card { | ||||||
|  |  | ||||||
|  | @ -1,9 +1,11 @@ | ||||||
| import { useState } from 'react'; | import { useState } from 'react'; | ||||||
| import BarcodeScannerComponent from 'react-qr-barcode-scanner'; | import BarcodeScannerComponent from 'react-qr-barcode-scanner'; | ||||||
| import toast, { Toaster } from 'react-hot-toast'; | import toast, { Toaster } from 'react-hot-toast'; | ||||||
|  | import { Container, Row, Col } from 'react-bootstrap'; | ||||||
| 
 | 
 | ||||||
| // Styles | // Styles | ||||||
| import './App.css'; | import './App.css'; | ||||||
|  | import 'bootstrap/dist/css/bootstrap.min.css'; | ||||||
| 
 | 
 | ||||||
| function App() { | function App() { | ||||||
|   // State to store the latest scanned data |   // State to store the latest scanned data | ||||||
|  | @ -31,26 +33,45 @@ function App() { | ||||||
|   }; |   }; | ||||||
| 
 | 
 | ||||||
|     return ( |     return ( | ||||||
| 	<div className="box"> | 	<Container> | ||||||
|  | 	    <Row> | ||||||
|  | 		<Col> | ||||||
| 	    {/* Notification toaster for displaying scan success messages */} | 	    {/* Notification toaster for displaying scan success messages */} | ||||||
| 	    <Toaster position="top-right" reverseOrder={false} /> | 		    <Toaster position="top-right" reverseOrder={false} /> | ||||||
|  | 		</Col> | ||||||
|  | 	    </Row> | ||||||
|  | 	    <Row> | ||||||
|  | 		<Col> | ||||||
| 
 | 
 | ||||||
| 	    {/* Scanner title */} | 	    {/* Scanner title */} | ||||||
| 	    <div className="title">BrmInv</div> | 		    <div className="title">BrmInv</div> | ||||||
|  | 		</Col> | ||||||
|  | 	    </Row> | ||||||
|  | 
 | ||||||
|  | 	    <Row> | ||||||
|  | 		<Col> | ||||||
| 
 | 
 | ||||||
| 	    {/* Barcode scanner component */} | 	    {/* Barcode scanner component */} | ||||||
| 	    <div className="scan" style={{border: '1px solid black'}}> | 	    <div className="scan" style={{border: '1px solid black'}}> | ||||||
| 		<BarcodeScannerComponent | 		<BarcodeScannerComponent | ||||||
| 		    width={500} | 		    width={"100%"} | ||||||
| 		    height={500} | 		    height={"auto"} | ||||||
| 		    onUpdate={handleScan} | 		    onUpdate={handleScan} | ||||||
| 		    delay={1500} // 1.5 seconds delay between scans | 		    delay={1500} // 1.5 seconds delay between scans | ||||||
| 		/> | 		/> | ||||||
| 	    </div> | 	    </div> | ||||||
|  | 		</Col> | ||||||
|  | 	    </Row> | ||||||
| 
 | 
 | ||||||
|  | 	    <Row> | ||||||
|  | 		<Col> | ||||||
| 	    {/* Display the current scanned data */} | 	    {/* Display the current scanned data */} | ||||||
| 	    <p>Scanned Data: {currentData}</p> | 		    <p>Scanned Data: {currentData}</p> | ||||||
|  | 		</Col> | ||||||
|  | 	    </Row> | ||||||
| 
 | 
 | ||||||
|  | 	    <Row> | ||||||
|  | 		<Col> | ||||||
| 	    {/* Table to display scan history */} | 	    {/* Table to display scan history */} | ||||||
| 	    <h2>Scan History</h2> | 	    <h2>Scan History</h2> | ||||||
| 	    <table> | 	    <table> | ||||||
|  | @ -69,7 +90,9 @@ function App() { | ||||||
| 		    ))} | 		    ))} | ||||||
| 		</tbody> | 		</tbody> | ||||||
| 	    </table> | 	    </table> | ||||||
| 	</div> | 		</Col> | ||||||
|  | 	    </Row> | ||||||
|  | 	    </Container> | ||||||
| 		); | 		); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue