diff --git a/.gitignore b/.gitignore index b2d6de3..181d42a 100644 --- a/.gitignore +++ b/.gitignore @@ -18,3 +18,6 @@ npm-debug.log* yarn-debug.log* yarn-error.log* + +# Custom +/.vscode \ No newline at end of file diff --git a/.prettierrc b/.prettierrc new file mode 100644 index 0000000..9b152f7 --- /dev/null +++ b/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": false, + "trailingComma": "all" +} diff --git a/docs/projects.md b/docs/projects.md index a26b92f..6320148 100644 --- a/docs/projects.md +++ b/docs/projects.md @@ -4,4 +4,4 @@ import DocCardList from '@theme/DocCardList'; SPARCS에서 진행하는 프로젝트입니다. - + diff --git a/docs/projects/ara.md b/docs/projects/ara.md index 5ad2070..0e6264b 100644 --- a/docs/projects/ara.md +++ b/docs/projects/ara.md @@ -1,62 +1,66 @@ -# Ara +import ProjectLogo from '@site/src/components/ProjectLogo'; - - - +# Ara -Ara, KAIST's official community service + -## History +## 역사 -Ara는 SPARCS가 창립된 해인 1991년부터 **_SPARCS BBS_** 라는 이름으로 사용된 서비스입니다. 당시 Ara는 Eagle -BBS(Bulletin Board System) 기반으로 개발되었으며 대한민국에서 두 번째로 인터넷에 연결된 BBS 서비스입니다. 현존하는 -BBS 서비스 중 가장 오래되었습니다. +**_Ara_**는 SPARCS가 창립된 해인 1991년부터 **_SPARCS BBS_** 라는 이름으로 사용된 서비스입니다. 당시 Ara는 Eagle +BBS(Bulletin Board System) 기반으로 개발되었으며 대한민국에서 두 번째로 인터넷에 연결된 BBS 서비스입니다. 이는 현존하는 +BBS 서비스 중 가장 오래된 서비스입니다. -1998년, newsgroup을 연동하고자 한 NNTP(Network News Transfer Protocol) 기반의 **_NeoAra_** -가 론칭되었습니다. KAIST 구성원뿐만 아니라 KAIST 주변의 국내 인터넷 사용자 모두를 위한 newsgroup의 역할을 하고자 하였습니다. +1998년 공개된 **_NeoAra_**는 newsgroup을 연동하기 위한 NNTP(Network News Transfer Protocol) 기반으로 개발되었습니다. 이를 통해 KAIST 구성원뿐만 아니라 KAIST 주변의 국내 인터넷 사용자 모두를 위한 newsgroup의 역할을 하고자 하였습니다. -2006년에 론칭된 **_NeoAra & WebAra_** 부터 웹과의 연동이 가능해졌습니다. 덕분에 Telnet과 NNTP에 더해 Web으로도 -Ara를 이용할 수 있게 되었습니다. 또한 파일 첨부 기능이 추가되었습니다. +2006년 공개된 **_NeoAra & WebAra_** 이후부터 웹과 연동할 수 있었습니다. 이를 통해 Telnet, NNTP 뿐만 아니라 Web으로도 +Ara를 이용할 수 있게 되었으며 파일 첨부 기능이 추가되었습니다. NeoAra & WebAra의 유지 보수가 어려워짐에 따라 이종 언어가 자유로이 쓰일 수 있는 확장 구조의 **_Arara 1세대_** 가 개발되었습니다. Python을 기반으로 백엔드는 SQLAlchemy, 미들웨어는 Thrift RPC, 프론트엔드는 Django Template Engine을 사용하였습니다. -Arara 1세대를 리뉴얼한 **_Arara 2세대_** 는 2010년부터 2020년 10월까지 가장 오래 이용된 Ara입니다. 리뉴얼 당시 +Arara 1세대를 재단장한 **_Arara 2세대_** 는 2010년부터 2020년 10월까지 가장 오래 이용된 Ara입니다. 재단장 당시 동시 접속자 수 200명, 하루 평균 접속자 수 7,000명으로 KAIST 공식 커뮤니티로서의 위상을 확인할 수 있었습니다. 기존 엔진의 디자인을 새롭게 하고 XpressEngine 기반의 Ara를 개발하려는 노력이 있었습니다. RSS(Really Simple Syndication) 등 사용자의 편의를 위한 기능이 구현되었습니다. -Ara를 모바일로 이용하는 사용자가 증가함에 따라 디자인과 엔진 성능을 개선하고자 한 **_Mobile Ara_** 가 개발되었습니다. +Ara를 모바일로 이용하는 사용자가 증가함에 따라 디자인과 엔진 성능을 개선하고자 **_Mobile Ara_** 가 개발되었습니다. SPARCS 내 Git 사용 정착에 기여한 **_Arari_**, 서울에서 소규모로 진행된 Ara 리뉴얼 프로젝트인 **_Ara2_** 개발이 -진행되었지만 론칭되지는 못하였습니다. +진행되었지만 정식으로 공개되지 못하였습니다. **_Ara Plus_** 는 Ara 활성화를 위해 커뮤니티 활동을 즐길 수 있는 풍부한 기능들을 새로운 디자인으로 제공하고자 한 프로젝트입니다. -특정 주제에 대해 채팅을 할 수 있는 "불판", 동아리나 자치단체, 소모임을 위한 "그룹 게시판", 익명 게시물, 포인트 제도 등의 기능들이 -개발되었으나 론칭되지 못하였습니다. - -2020년 11월에 론칭된 **_NewAra_** 는 10년간 이용되어 온 Arara를 리뉴얼한 프로젝트입니다. "가장 정확한 정보를 가장 -신속하게"라는 슬로건을 걸고 KAIST 포탈 공지를 모아 볼 수 있는 게시판 추가 및 elasticsearch 도입을 통한 발전된 검색 기능을 -제공하였습니다. Ara의 아이덴티티가 잘 드러나도록 디자인을 개선하였습니다. 단순 커뮤니티의 기능뿐만 아니라 학교, 단체 공지사항을 빠르게 확인할 수 있는 공간의 역할도 함께 하고 있습니다. +특정 주제에 대해 채팅할 수 있는 '불판', 동아리나 자치단체, 소모임을 위한 '그룹 게시판', 익명 게시물, 포인트 제도 등의 기능이 +개발되었으나 정식으로 출시되지 못하였습니다. +2020년 11월에 출시된 **_NewAra_** 는 10년간 이용되어 온 Arara를 재단장한 프로젝트입니다. '가장 정확한 정보를 가장 +신속하게'라는 슬로건을 걸고 KAIST 포탈 공지를 모아볼 수 있는 게시판 추가 및 Elasticsearch 도입을 통한 발전된 검색 기능을 +제공하였습니다. Ara의 아이덴티티가 잘 드러나도록 디자인을 개선하였습니다. -## Development +## 협업 -### Collaboration - -- 매주 1회 정기 모임과 1회 공동 코딩을 진행하고 있습니다. +- 매주 한 번의 정기 모임와 한 번의 공동 코딩을 진행하고 있습니다. +- Slack을 통해 소통하며 GitHub과 연동하여 commit이나 PR 등에 대한 알람을 받습니다. - Notion을 이용하여 개발 과정을 기록하고 정기 모임의 회의록을 작성합니다. 칸반을 이용하여 태스크를 분배합니다. -- Slack을 통해 소통합니다. GitHub과 연동하여 commit이나 PR 등에 대한 알람을 받습니다. -### GitHub Repository +### 사용하는 기술 + +- [Vue](https://vuejs.org/) +- [Django](https://www.djangoproject.com/) +- [MySQL](https://www.mysql.com/) +- [Redis](https://redis.io/) +- [Elasticsearch](https://www.elastic.co/) -Ara는 다음 세 개의 GitHub public repository에서 개발을 진행하고 있습니다. +### GitHub 저장소 -- **Web**: -- **API**: -- **App**: +- **Web**: https://github.com/sparcs-kaist/new-ara-web +- **API**: https://github.com/sparcs-kaist/new-ara-api +- **App**: https://github.com/sparcs-kaist/new-ara-app -## Contact +## 문의 - +[new-ara@sparcs.org](mailto:new-ara@sparcs.org) diff --git a/docs/projects/biseo.md b/docs/projects/biseo.md index a966ace..c15420d 100644 --- a/docs/projects/biseo.md +++ b/docs/projects/biseo.md @@ -1,59 +1,46 @@ -# Biseo - -
- -## 총회 서비스 - -Biseo - 총회 서비스 +import ProjectLogo from '@site/src/components/ProjectLogo'; -### 스팍스 총회를 비서가 책임집니다 - -
- -
+# Biseo -## What is Biseo? + -비서는 스팍스 총회 진행을 돕는 서비스입니다. 주요 기능으로는 **투표, 채팅** 기능이 있습니다. +## 역사 -
-Biseo Main Page +### 필요성 -[Main Page] +SPARCS 종강총회 대부분의 시간은 정회원 승급 투표에 할애됩니다. 사전에 만든 구글 설문지의 링크를 공유하여 진행한 투표 과정에는 여러 불편함이 있었습니다. -Biseo Admin Page +우선 20개에서 30개에 달하는 설문지를 임원진이 손수 직접 만들어야 한다는 번거로움이 존재합니다. 또한 투표를 한 사람이 아닌 하지 않은 사람을 보여주는 기능의 부재로 인해 미투표자에 대한 독촉이 늦어져 투표가 지연되는 경우가 많았습니다. 마지막으로 채팅을 전담하는 카카오톡과 투표를 전담하는 구글 설문지, 통합되지 않고 분리된 두 플랫폼 사이를 번갈아가며 이동함에 따른 피로감이 존재했습니다. -[Admin Page] +### 해결책 -
+이렇게 Biseo는 SPARCS의 원활한 총회 진행을 돕기 위해 시작된 서비스입니다. -## Why Biseo? +Biseo의 주요 기능은 총 3가지입니다. 첫째, 투표 이전에는 SPARCS에 최적화된 투표 양식을 통한 **_안건 간편 생성 기능_**을 통해 적은 입력으로도 모든 투표 안건을 빠르게 생성할 수 있도록 돕습니다. 둘째, 투표 도중 다른 서비스로 이동하지 않아도 되어 구성원의 피로도를 낮춥니다. 이는 Biseo 내부에 의견 공유를 위한 **_실시간 채팅 기능_**과 의견 표출을 위한 **익명 투표 기능**이 모두 갖춰져 있기 때문입니다. 셋째, 투표 도중과 이후에는 관리자가 투표하지 않은 사람을 파악할 수 있습니다. 관리자는 필요 시 **_투표 독촉 기능_**을 통해 투표를 독촉하여 더 빠른 의견 수렴을 꾀할 수 있습니다. -스팍스 총회에서는 정회원 승급 투표가 총회 시간의 대부분을 차지합니다. 기존에는 구글 설문지를 만들어서 링크를 공유하여 투표를 진행했지만 여러 불편함과 문제점이 있었습니다. +Biseo는 주기적인 피드백을 기반으로 한 자유롭고 다양한 도전을 통해 꾸준히 성장하고 있습니다. 처음에는 단순한 채팅에서 시작했지만, 프로젝트 구성원의 자유로운 시도로 투표, 공유, 재적 인원 관리 기능 등이 추가되며 나날이 SPARCS에 적합한 형태로 탈바꿈하고 있습니다. 최근에는 기존 Biseo의 고질적인 문제를 해결하기 위해 새로운 디자인과 시스템을 기반으로 한 Biseo v2.0을 준비하고 있습니다. -### 기존 방식의 문제점 +![Biseo Main](/projects/biseo-main.png) -1. 설문지를 한땀 한땀 만들어야 하는 번거로움 - - 20~30개의 설문지를 임원진이 만들어야 합니다. -2. 실시간 투표 현황 파악의 어려움 - - 설문지는 누가 어떤 투표를 했는지 보여는 주지만 **누가 투표를 하지 않은 지**는 명백하게 보여주지 않습니다. - - 따라서 투표하지 않은 사람을 지목할 수 없어서 투표가 지연됩니다. -3. 채팅은 카카오톡으로, 투표는 구글 설문지로... 통합되지 않은 플랫폼 - - 플랫폼을 번갈아가며 이동해야하는 피로감이 있습니다. +![Biseo Admin](/projects/biseo-admin.png) -### Solution +## 협업 -1. 투표를 쉽고 간편하게 생성 - - 비서는 스팍스 총회에 적합한 투표 양식을 제공하고, **간편 생성** 기능을 제공하여 적은 입력으로 많은 투표 안건들을 생성할 수 있습니다. -2. 실시간으로 투표 현황 파악 - - 투표하지 않은 사람들을 파악하고 투표 권유를 할 수 있습니다. -3. 채팅과 투표의 통합 - - 하나의 웹 사이트에서 두 가지 기능을 제공하여 다른 플랫폼으로 번갈아가며 이동할 필요가 없습니다. +Biseo에서는 특정한 인원이 특정한 개발의 영역을 도맡는 방식을 사용하지 않습니다. 대신 모든 인원이 필요한 모든 곳에 자유롭게 기여할 수 있는 방식으로 개발을 이어나가고 있습니다. 따라서 모든 사람들이 Front-End를 개발하기도 하며, 동시에 Back-End를 개발하기도 합니다 이를 통해 Biseo는 유연하게 기능을 확장하고자 하며 동시에 폭넓게 개발 역량을 기르기 위한 유연한 형태의 서비스로 받아들여지고 있습니다. -### Link +### 사용하는 기술 -[https://biseo.sparcs.org](https://biseo.sparcs.org) (22.11.01부터 교내 방화벽 정책으로 교외 접근은 불가합니다.) +- **Front-End**: React, TypeScript, JavaScript +- **Back-End**: TypeScript, JavaScript, Express +- **Database**: MongoDB, Redis +- **Database for v2.0** : MySQL, Redis -[https://github.com/sparcs-kaist/biseo-frontend](https://github.com/sparcs-kaist/biseo-frontend) +### Github 저장소 -[https://github.com/sparcs-kaist/biseo-backend](https://github.com/sparcs-kaist/biseo-backend) +- **Front-End**: https://github.com/sparcs-kaist/biseo-frontend +- **Back-End**: https://github.com/sparcs-kaist/biseo-backend +- **Front-End & Back-End for v2.0**: https://github.com/sparcs-kaist/biseo diff --git a/docs/projects/geoul.md b/docs/projects/geoul.md index 2623b52..d3b0915 100644 --- a/docs/projects/geoul.md +++ b/docs/projects/geoul.md @@ -1,3 +1,11 @@ +import ProjectLogo from '@site/src/components/ProjectLogo'; + # Geoul + + 거울은 KAIST FTP라고도 불리는 오픈소스 미러링 서비스로, 전세계에 퍼져 있는 최신버전의 오픈소스 소프트웨어들을 대한민국을 포함한 아시아 국가들에게 공급합니다. 기존의 먼 곳에 위치해 있는 외국 서버들로부터 직접 다운로드 받을 필요없이, 가까운 위치의 서버에서 다운로드 받을 수 있다는 큰 장점이 있습니다. 현재 거울은 엄청난 서비스 접속량을 자랑하며 아시아 지역의 주요 미러링 서비스 중 하나로 자리하고 있습니다. diff --git a/docs/projects/otl.md b/docs/projects/otl.md index dceaad1..edb1528 100644 --- a/docs/projects/otl.md +++ b/docs/projects/otl.md @@ -1,3 +1,48 @@ +import ProjectLogo from '@site/src/components/ProjectLogo'; + # OTL -OTL은 매 학기 개설되는 KAIST의 대부분의 과목들에 대한 정보를 쉽게 검색할 수 있게 도와줍니다. 과목들을 개인 시간표에 추가할 수 있으며 여러 개의 시간표를 한 번에 관리할 수 있습니다. 뿐만 아니라, 해당 과목에 대한 실라버스 및 해당 과목을 수강한 여러 학우들의 수강 후기를 볼 수 있어 수강 신청에 있어 많은 편의를 제공합니다. 시험을 망칠 게 뻔하니 미리 와서 다음 학기를 준비하세요. + + +## 역사 + +**_OTL_**은 과거 존재했던 강의 평가 사이트인 **_LKIN_**을 바탕으로 2009년 처음 개발되었습니다. 2009년 당시 서비스의 주된 목적은 학생들이 강의 및 교수자에 대한 평가를 공유할 수 있도록 하는 것이었습니다. 이는 KAIST에서 공식적으로 진행하는 강의 평가는 학생들에게 공개되지 않는다는 점에서 착안하였습니다. 이에 더하여, 학생들이 모의 시간표를 자유롭게 구성할 수 있도록 하는 돕는 '모의 시간표' 기능이 제공되었습니다. 학생들은 매 학기 개설되는 과목들의 강의 시간, syllabus 등을 한눈에 확인하고 미리 시간표를 구성해 볼 수 있습니다. + +OTL은 매 학기 4,000여 명이 넘는 KAIST 학우들이 사용하는 서비스로, 그간 크고 작은 변화를 거치며 꾸준히 발전해 왔습니다. 하지만 시간이 지남에 따라 프레임워크의 노후화, 신기술의 개발, 환경의 변화, 기능 추가의 한계 등으로 인해 재설계가 필요하게 되었습니다. 이에 따라 2015년에 **_OTL Plus_**라는 이름의 프로젝트가 시작되었습니다. + +기존 OTL을 종료하고 2016년에 배포된 OTL Plus는 다음의 개선점을 가지고 있습니다. 과목사전의 후기 작성이 더욱 편리해졌으며, 검색 기능이 강화되었습니다. 또한 과목 후기에 '좋아요'를 남길 수 있게 되었습니다. 모의시간표에는 장바구니, 후기 미리보기, 시간표 복사 등 다양한 기능들이 추가되었습니다. 전체적으로 개선된 UI가 적용되었고, 이에 따라 과목사전과 모의시간표 간의 연계가 강화되었습니다. OTL Plus는 현재 과거와 같이 **_OTL_**로 이름을 통합하여 서비스되고 있습니다. 이는 KAIST 학우들의 혼란을 방지하기 위함입니다. + +2020년에는 모바일로 OTL에 접근하는 학생들이 증가하고 있는 시대 상황을 반영하여 **_OTL App_** 프로젝트가 새로이 시작되었습니다. 기존에 모바일용 웹 페이지가 제공되고 있었으나, 이것만으로는 부족하다는 판단하에 학생들의 편이성을 증진하기 위한 방법을 모색한 결과입니다. OTL App 프로젝트는 현재도 활발히 진행 중이며, 2023년 가을 이전 배포를 목표로 하고 있습니다. + +2023년에는 NestJS 프레임워크 기반 백엔드로의 이전 준비를 시작하였습니다. OTL 서비스가 오래 지속되면서 과거 Django2.1로 작성된 코드를 이용해 기능을 개발하거나 버그를 수정하는 속도가 비교적 더뎌지는 문제가 발생하였습니다. 그렇기 때문에 이러한 문제 상황을 근본적으로 해결하고자 최신 프레임워크의 도입을 결정하였고, 향후 1년의 기간이 소요될 것으로 예상됩니다. + +## 협업 + +- Web TF, App TF로 나뉘어 매주 1회 정기 모임을 진행하고 있습니다. 필요한 경우 공동 코딩을 추가로 진행합니다. +- Slack을 통해 소통합니다. + - 과거에는 **#otl**을 주로 사용하였으나, 현재는 새로 개설한 **#otl-plus**을 주요한 소통창구로 사용하고 있습니다. + - 앱 개발 관련 대화는 **#otl-app**에서 많이 나누고 있습니다. + - **#otl-notify**과 **#otl-app-notify**에서 Notion과 GitHub Webhook을 추가하여 사용하고 있습니다. +- Notion을 이용해 디자인 문서, 기능 제안, 회의록 등의 자료를 정리하여 보관하고 있습니다. + +![OTL Notion](/projects/otl-notion.png) + +### 사용하는 기술 + +- **Web**: UI 프레임워크는 React, 전역 상태관리 라이브러리는 Redux를 사용하고 있습니다. JavaScript를 통한 PropTypes로 작성되었으나 TypeScript 및 React Functional Component로 다시 작성하고 있습니다. +- **App**: Flutter로 제작하였습니다. +- **Server**: Django 2.1로 제작되었으나 TypeScript 기반의 NestJS 프레임워크로 이전하고 있습니다. + +### GitHub 저장소 + +- **Web**: https://github.com/sparcs-kaist/otlplus +- **App**: https://github.com/sparcs-kaist/otl-app +- **Server Migration:** https://github.com/sparcs-kaist/otl-nest + +## 문의 + +[otlplus@sparcs.org](mailto:otlplus@sparcs.org) diff --git a/docs/projects/sso.md b/docs/projects/sso.md index 85cbea7..560e00a 100644 --- a/docs/projects/sso.md +++ b/docs/projects/sso.md @@ -1,3 +1,11 @@ +import ProjectLogo from '@site/src/components/ProjectLogo'; + # SSO + + SPARCS 서비스 로그인을 하나의 계정으로 할 수 있도록 해주는 Single Sign On 서비스입니다. KAIST Portal 연동을 통해 KAIST 구성원임을 인증하고 실명, 생일, 학번 등 개인 정보를 저장하여 SPARCS 서비스에 제공합니다. diff --git a/docs/projects/taxi.md b/docs/projects/taxi.md index efc4056..40cde04 100644 --- a/docs/projects/taxi.md +++ b/docs/projects/taxi.md @@ -1,34 +1,72 @@ +import ProjectLogo from '@site/src/components/ProjectLogo'; + # Taxi - - Taxi @ SPARCS - + + +## 역사 + +2011 카이스트 뉴스와 2018 카카오모빌리티 리포트에서 소개될 정도로 카이스트는 많은 사람들이 택시를 승차하는 장소입니다. 이에 따라 같은 시각에 같은 목적지를 향하는 사람을 모아 동승하여 택시비를 절감하고 싶어하는 학우들이 많습니다. 그러나 게시판 형태의 기존 커뮤니티나 SNS를 이용해 택시 동승자를 모집하는 것은 UI/UX 상의 한계가 존재합니다. 이러한 불편함이 [Ara](./ara.md)와 같은 커뮤니티 등에서 표출되며 택시 동승 모집만을 위한 새로운 서비스의 필요성이 제기되었습니다. + +이를 계기로 시작된 Taxi는 카이스트 구성원간 택시 동승자 모집 서비스입니다. 기계동 택시승강장, 대전역, 버스터미널 등의 출발/도착지나 출발 시간을 기반으로 택시 동승자를 찾을 수 있습니다. 동승 이전에는 채팅 기능을 통해 세부적인 장소와 시간을 조율하도록 돕고, 동승 이후에는 간편하게 정산 현황을 확인하도록 돕습니다. + +Taxi는 2021년 봄학기에 Toy Project로 개발이 시작되었습니다. 이듬해 가을인 2022년 가을학기에 **Taxi Beta**를 출시하여 일부 KAIST 학우들에게 홍보를 진행하여 의견을 수렴하였습니다. 2022년 가을학기에 **Taxi** 정식 서비스를 출시하여 홍보하였습니다. + +### 향후 계획 + +- 카이스트 학우들의 택시 동승 문화를 선도하는 서비스 +- 동승부터 정산까지 한 앱에서 모두 해결하도록 도와주는 서비스 +- KAIST 학우들이 편하게 접할 수 있는 SPARCS 서비스 + +### 발표 자료 -## 서비스 소개 +- [2021년 가을학기 SPARCS Homecoming](https://s3.ap-northeast-2.amazonaws.com/sparcs.home/stitch_1637422019377.pdf) / 이채영-stitch +- [2022년 봄학기 SPARCS 임시총회](https://s3.ap-northeast-2.amazonaws.com/sparcs.home/suwon_1660753366898.pdf) / 김건-suwon +- [2022년 봄학기 Taxi Intern Project](https://s3.ap-northeast-2.amazonaws.com/sparcs.home/andy_1659942777418.pptx) / 예상우-andy +- [2022년 가을학기 SPARCS 개강총회](https://s3.ap-northeast-2.amazonaws.com/sparcs.home/suwon_1682521842595.pdf) / 김건-suwon +- [2022년 가을학기 SPARCS Homecoming](https://s3.ap-northeast-2.amazonaws.com/sparcs.home/agent%2C+andy%2C+macintosh_1682521983214.pdf) / 예상우-andy, 최지헌-agent, 정상-macintosh +- [2022년 가을학기 SPARCS 종강총회](https://s3.ap-northeast-2.amazonaws.com/sparcs.home/suwon_1682522169035.pdf) / 김건-suwon +- [2022년 가을학기 Taxi Intern Project](https://s3.ap-northeast-2.amazonaws.com/sparcs.home/won_1682522258809.pptx) / 최동원-won -카이스트 구성원들간의 택시 동승 인원 모집 서비스 입니다. 출발/도착지나 출발 시간 등을 설정하여 방을 개설할 수 있고 검색을 통해 다른 사람들이 새설한 방을 찾아 참가할 수 있습니다. 방에 참가한 사람들과 채팅을 통해 장소 및 시간을 조율하고 정산 현황을 공유할 수도 있습니다. +## 협업 -## Development +- 매주 화요일 오후 9시 ~ 12시에 회의 및 공동 코딩을 진행합니다. +- 대면 회의는 교양분관 SPARCS 동방에서, 비대면 회의는 Discord에서 진행됩니다. +- Slack을 통해 공지, 질문, 아이디어 제안, Github Bot, 자동배포 봇, Notion Bot 등을 관리합니니다. +- Notion으로 Coding Rules와 Coding Conventions를 지정하고, 매주 회의록을 작성합니다. +- [Figma](https://www.figma.com/file/7Y8jsGFupTqruFu636r0Mz/SPARCS-Taxi-Design)로 디자인 작업을 합니다. -### Collaboration +### 개발 과정 - - 매 주 화요일 오후 9시 ~ 12시에 회의 및 공동 코딩을 진행합니다. - - 대면 회의는 교양분관 SPARCS 동방에서 진행되며, 비대면 회의는 디스코드에서 진행됩니다. - - 협업을 위해 Notion, Github, Slack, Discord, Figma를 사용하고 있습니다. +1. 회의에서 제시된 아이디어 및 발견된 버그의 문제 해결을 논의합니다. +2. 기획 후 Figma로 디자인합니다. +3. 하나의 작업은 여러 Task로 분할될 수 있고, 각 Task들을 팀원들과 분할합니다. + - 새로운 Task가 생기면 Template(Issue, bug-report 등)에 맞게 Github Issue를 생성합니다. +4. Github Pull Request 로 작업 내용을 공유합니다. + - Template에 맞게 작업한 내용을 설명하여 공유합니다. +5. Code Review를 통한 팀원들의 피드백을 받습니다. + - 2개 이상의 approve가 있어야, Merge가 가능합니다. +6. Github Action으로 Unit & E2E 테스트로 코드를 검증합니다. +7. 개발용 서비스에 자동 배포 후, 실제 서비스에서 발생할 수 있는 문제를 사전에 확인해 봅니다. +8. 실제 서비스에 자동 배포합니다. -### Technology Stacks +### 사용하는 기술 - - **Front** : React (TypeScript) - - **Back** : Node.js Express + Mongo DB + Redis - - **App** : Flutter +- **Web**: React +- **App**: Flutter +- **Server**: Express, MongoDB, Redis -### GitHub Repository +### GitHub 저장소 - - **Front** : - - **Back** : - - **App** : - - **Docker** : +- **Web**: https://github.com/sparcs-kaist/taxi-front +- **App**: https://github.com/sparcs-kaist/taxi-app +- **Server**: https://github.com/sparcs-kaist/taxi-back -## Contact +## 문의 - +- [Taxi 마이페이지](https://taxi.sparcs.org/mypage) 하단에 위치한 **채널톡 문의하기** +- [taxi@sparcs.org](mailto:taxi@sparcs.org) diff --git a/docs/projects/zabo.md b/docs/projects/zabo.md index 27d486a..197bc19 100644 --- a/docs/projects/zabo.md +++ b/docs/projects/zabo.md @@ -1,3 +1,55 @@ +import ProjectLogo from '@site/src/components/ProjectLogo'; + # Zabo -동아리를 비롯한 각종 단체들의 리크루팅, 공연 포스터를 온라인으로 게시할 수 있는 서비스입니다. 학우들은 관심있는 단체의 행사를 보다 쉽게 검색할 수 있고, 단체들은 경쟁없이 편하게 홍보를 할 수 있습니다. + + +## 역사 + +Zabo는 매 학기 초 수많은 동아리와 단체들이 부착하는 포스터를 한 곳에 정리하고, 관심 있는 사람들이 이를 웹에서 쉽게 확인할 수 있도록 하는 서비스입니다. 학기 초마다 많은 동아리와 교내 단체가 홍보를 위해 학교 곳곳에 포스터를 부착하고 있습니다. 이런 포스터를 사용자가 쉽게 모아볼 수 있는 서비스의 필요성은 항상 제기되어 왔고, 이러한 필요에 따라 Zabo는 총 4번이나 새롭게 개발되었습니다. + +### Zabo의 시작 (2014~2016) + +2015년 2월 21일, 2년간의 개발 끝에 Zabo가 처음으로 출시되었습니다. 서비스 초기에 사용자 수를 확보하기 위해 서비스 운영진이 동아리와 교내 단체의 포스터를 직접 업로드하는 노력을 기울였다는 기록이 남아 있습니다. + +### 새로운 Zabo의 등장 (2017~2018) + +2017년도 봄학기가 되자 기존 Zabo를 유지보수할 개발 인력이 충분하지 않게 되었고, 이를 부활시키고자 Vue.js와 Django에 기반한 새로운 Zabo의 개발이 시작되었습니다. 2018년 초에 시작된 개발은 11월까지 1년 가까이 진행되었으나, 그해 겨울방학 때부터 시작된 PM의 부재로 인해 새로운 Zabo는 세상의 빛을 볼 수 없었습니다. + +### 다시, 새롭게, 가보자 (2019~) + +Zabo는 2020년 봄 출시한 이후 교내 각 동아리의 선발 공고 및 행사 홍보용 플랫폼으로 활발하게 사용되어 왔습니다. + +지난 2020년 가을학기 이후 프로젝트 활동 인원이 없어져 동아리 차원에서 기본적인 사용자 지원만 제공해왔습니다. 그러나 2022년 여름학기 이후 Zabo에 열정적인 회원들이 모이게 되며 사용자 확충, 추가적인 기능 개발, 그리고 교내 학생지원팀과의 협업을 통해 서비스를 재활성화하고자 노력하고 있습니다. + +## 협업 + +- 매주 주말에 동아리방에서 진행되는 대면 회의, 그리고 화상 회의로 진행되는 비대면 공동코딩을 진행합니다. +- Slack을 통해 소통합니다. + - **#zabo-main**을 통해 매 학기 프로젝트 운영과 개발에 관한 논의사항을 공유하고 있습니다. + - **#zabo-admin**에서 신규 그룹 신청 허가 여부를 논의하고 있습니다. +- Figma를 이용해 디자인 관련 협업을 진행하고 있습니다. +- 중/단기적인 개발 태스크를 관리하기 위한 칸반으로써 [GitHub Project](https://github.com/orgs/sparcs-kaist/projects/6)을 사용하고 있습니다. + - SPARCS 회원에게만 공개된 상태입니다. +- Notion를 이용해 회의록과 프로젝트 개발 관련 문서를 정리하고 있습니다. + +![Zabo Notion](/projects/zabo-notion.png) + +### 사용하는 기술 + +- **Front-End**: UI 프레임워크로 React.js, 전역 상태관리 라이브러리로 Redux를 사용하고 있습니다. 최근 전역 상태와 컴포넌트 속성에 대한 TypeScript 전환 작업을 완료하였습니다. +- **Back-End**: 백엔드 프레임워크로 Express.js를 사용하고 있고, 데이터베이스로 MongoDB를 Mongoose ODM과 같이 사용하고 있습니다. + +### GitHub 저장소 + +- **Front-End**: https://github.com/sparcs-kaist/zabo-front-reactjs +- **Back-End**: https://github.com/sparcs-kaist/zabo-server-nodejs + +# 문의 + +- [Zabo](https://zabo.kaist.ac.kr) 좌측 하단에 위치한 채널톡 +- [zabo@sparcs.org](mailto:zabo@sparcs.org) diff --git a/docs/rules.md b/docs/rules.md index 2858e38..a806f99 100644 --- a/docs/rules.md +++ b/docs/rules.md @@ -8,4 +8,4 @@ SPARCS의 안정적인 운영을 위한 규칙으로 다음과 같이 이루어 - [디자인팀 세칙](/rules/design/) -- [징계위원회 세칙](/rules/disciplinary/)- [징계위원회 세칙](/rules/disciplinary/) +- [징계위원회 세칙](/rules/disciplinary/) diff --git a/docs/rules/disciplinary/index.md b/docs/rules/disciplinary/index.md index 1b93144..19119dc 100644 --- a/docs/rules/disciplinary/index.md +++ b/docs/rules/disciplinary/index.md @@ -24,11 +24,11 @@ sidebar_position: 4 ### 제3조 (징계위원회의 구성) 1. 징계위원회는 위원장 1인과 위원 4인으로써 구성한다. -2. 위원장에는 회장이 되고 위원은 정회원 중에서 임원진 2인 이상을 포함하여 위원장이 지명한다. +2. 위원장에는 회장이 되고 위원은 정회원 중에서 임원진 2인 이상을 포함하여 위원장이 지명한다. ### 제4조 (징계의결의 요구) -1. 임원진 및 PM은 회원이 회칙 제12조 2항의 각호에 해당하는 사유가 있다고 인정할 때에는 지체없이 당해징계위원회에 징계의결을 요구하여야 한다. +1. 임원진 및 PM은 회원이 회칙 제12조 2항의 각호에 해당하는 사유가 있다고 인정할 때에는 지체없이 당해징계위원회에 징계의결을 요구하여야 한다. 2. 임원진 및 PM이 아닌 회원은 총회의 결의에 의하여 징계의결을 요구할 수 있다. 3. 전항의 징계의결 요구는 징계사유에 대한 충분한 조사를 행한 후에 별지 제1호 서식에 의하여 이를 한다. 4. 징계위원회는 징계요구서를 징계혐의자에게 송달하여야 한다. diff --git a/package-lock.json b/package-lock.json index d3616eb..eceeca7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -11,6 +11,7 @@ "@docusaurus/core": "^2.4.0", "@docusaurus/preset-classic": "^2.4.0", "@mdx-js/react": "^1.6.22", + "@mui/icons-material": "^5.11.16", "clsx": "^1.2.1", "prism-react-renderer": "^1.3.5", "react": "^17.0.2", @@ -19,6 +20,7 @@ "devDependencies": { "@docusaurus/module-type-aliases": "^2.4.0", "@tsconfig/docusaurus": "^1.0.7", + "prettier": "^2.8.8", "typescript": "^5.0.2" } }, @@ -2617,6 +2619,176 @@ "node": ">=16.14" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.10.8", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.8.tgz", + "integrity": "sha512-gxNky50AJL3AlkbjvTARiwAqei6/tNUxDZPSKd+3jqWVM3AmdVTTdpjHorR/an/M0VJqdsuq5oGcFH+rjtyujQ==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.4" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==", + "optional": true, + "peer": true + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "optional": true, + "peer": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.10.8", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.8.tgz", + "integrity": "sha512-5fyqGHi51LU95o7qQ/vD1jyvC4uCY5GcBT+UgP4LHdpO9jPDlXqhrRr9/wCKmfoAvh5G/F7aOh4MwQa+8uEqhA==", + "peer": true, + "dependencies": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.4" + } + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", + "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "peer": true, + "dependencies": { + "@emotion/memoize": "^0.8.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==", + "peer": true + }, + "node_modules/@emotion/react": { + "version": "11.10.8", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.8.tgz", + "integrity": "sha512-ZfGfiABtJ1P1OXqOBsW08EgCDp5fK6C5I8hUJauc/VcJBGSzqAirMnFslhFWnZJ/w5HxPI36XbvMV0l4KZHl+w==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.8", + "@emotion/cache": "^11.10.8", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "optional": true, + "peer": true, + "dependencies": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/serialize/node_modules/@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==", + "optional": true, + "peer": true + }, + "node_modules/@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==", + "peer": true + }, + "node_modules/@emotion/styled": { + "version": "11.10.8", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.8.tgz", + "integrity": "sha512-gow0lF4Uw/QEdX2REMhI8v6wLOabPKJ+4HKNF0xdJ2DJdznN6fxaXpQOx6sNkyBhSUL558Rmcu1Lq/MYlVo4vw==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.8", + "@emotion/is-prop-valid": "^1.2.0", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==", + "optional": true, + "peer": true + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "optional": true, + "peer": true, + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==", + "peer": true + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==", + "peer": true + }, "node_modules/@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -2824,6 +2996,273 @@ "url": "https://opencollective.com/unified" } }, + "node_modules/@mui/base": { + "version": "5.0.0-alpha.127", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.127.tgz", + "integrity": "sha512-FoRQd0IOH9MnfyL5yXssyQRnC4vXI+1bwkU1idr+wNkP1ZfxE+JsThHcfl1dy5azLssVUGTtQFD9edQLdbyJog==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0", + "@emotion/is-prop-valid": "^1.2.0", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.12.0", + "@popperjs/core": "^2.11.7", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/base/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "peer": true + }, + "node_modules/@mui/core-downloads-tracker": { + "version": "5.12.2", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.12.2.tgz", + "integrity": "sha512-Qn7dy8tql6T0hY6gTFPkpWlnqVVFGu5Z6QzEzUSzzmLZpfAx4kf8sFz0PHiB7gU5yrqcZF9picMx1shpRY/rXw==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + } + }, + "node_modules/@mui/icons-material": { + "version": "5.11.16", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.16.tgz", + "integrity": "sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A==", + "dependencies": { + "@babel/runtime": "^7.21.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@mui/material": "^5.0.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "5.12.2", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.12.2.tgz", + "integrity": "sha512-XOVy6fVC0rI2dEwDq/1s4Te2hewTUe6lznzeVnruyATGkdmM06WnHqkZOoLVIWo9hWwAxpcgTDcAIVpFtt1nrw==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/base": "5.0.0-alpha.127", + "@mui/core-downloads-tracker": "^5.12.2", + "@mui/system": "^5.12.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.12.0", + "@types/react-transition-group": "^4.4.5", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0", + "react-dom": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "peer": true + }, + "node_modules/@mui/private-theming": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.12.0.tgz", + "integrity": "sha512-w5dwMen1CUm1puAtubqxY9BIzrBxbOThsg2iWMvRJmWyJAPdf3Z583fPXpqeA2lhTW79uH2jajk5Ka4FuGlTPg==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/utils": "^5.12.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.12.0.tgz", + "integrity": "sha512-frh8L7CRnvD0RDmIqEv6jFeKQUIXqW90BaZ6OrxJ2j4kIsiVLu29Gss4SbBvvrWwwatR72sBmC3w1aG4fjp9mQ==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.10.7", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.12.1.tgz", + "integrity": "sha512-Po+sicdV3bbRYXdU29XZaHPZrW7HUYUqU1qCu77GCCEMbahC756YpeyefdIYuPMUg0OdO3gKIUfDISBrkjJL+w==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0", + "@mui/private-theming": "^5.12.0", + "@mui/styled-engine": "^5.12.0", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.12.0", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0", + "react": "^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "peer": true, + "peerDependencies": { + "@types/react": "*" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.12.0.tgz", + "integrity": "sha512-RmQwgzF72p7Yr4+AAUO6j1v2uzt6wr7SWXn68KBsnfVpdOHyclCzH2lr/Xu6YOw9su4JRtdAIYfJFXsS6Cjkmw==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.21.0", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^16.7.1 || ^17.0.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0" + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "peer": true + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -2861,6 +3300,16 @@ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" }, + "node_modules/@popperjs/core": { + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", + "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==", + "peer": true, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -3432,15 +3881,24 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "node_modules/@types/react": { - "version": "18.0.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.15.tgz", - "integrity": "sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow==", + "version": "17.0.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", + "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", "dependencies": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, + "node_modules/@types/react-is": { + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.4.tgz", + "integrity": "sha512-FLzd0K9pnaEvKz4D1vYxK9JmgQPiGk1lu23o1kqGsLeT0iPbRSF7b76+S5T9fD8aRa0B8bY7I/3DebEj+1ysBA==", + "peer": true, + "dependencies": { + "@types/react": "^17" + } + }, "node_modules/@types/react-router": { "version": "5.1.18", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz", @@ -3470,6 +3928,15 @@ "@types/react-router": "*" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "peer": true, + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", @@ -4047,6 +4514,22 @@ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.4.tgz", "integrity": "sha512-O4KCvQA6lLiMU9l2eawBPMf1xPP8xPfB3iEQw150hOVTqj/rfXz0ThTb4HEzqQfs2Bmo5Ay8BzxfzVtBrr9dVg==" }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "optional": true, + "peer": true, + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", @@ -5274,9 +5757,9 @@ } }, "node_modules/csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "node_modules/debug": { "version": "4.3.4", @@ -5508,6 +5991,16 @@ "utila": "~0.4" } }, + "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==", + "peer": true, + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -6163,6 +6656,13 @@ "url": "https://github.com/avajs/find-cache-dir?sponsor=1" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "optional": true, + "peer": true + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -9176,6 +9676,21 @@ "node": ">=4" } }, + "node_modules/prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true, + "bin": { + "prettier": "bin-prettier.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, "node_modules/pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -9686,6 +10201,22 @@ "react": "^16.8.0 || ^17.0.0 || ^18.0.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==", + "peer": true, + "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/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -10947,6 +11478,12 @@ "postcss": "^8.2.15" } }, + "node_modules/stylis": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.4.tgz", + "integrity": "sha512-USf5pszRYwuE6hg9by0OkKChkQYEXfkeTtm0xKw+jqQhwyjCVLdYyMBK7R+n7dhzsblAWJnGxju4vxq5eH20GQ==", + "peer": true + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", @@ -14352,6 +14889,158 @@ "tslib": "^2.4.0" } }, + "@emotion/babel-plugin": { + "version": "11.10.8", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.10.8.tgz", + "integrity": "sha512-gxNky50AJL3AlkbjvTARiwAqei6/tNUxDZPSKd+3jqWVM3AmdVTTdpjHorR/an/M0VJqdsuq5oGcFH+rjtyujQ==", + "optional": true, + "peer": true, + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/serialize": "^1.1.1", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.1.4" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==", + "optional": true, + "peer": true + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "optional": true, + "peer": true + } + } + }, + "@emotion/cache": { + "version": "11.10.8", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.10.8.tgz", + "integrity": "sha512-5fyqGHi51LU95o7qQ/vD1jyvC4uCY5GcBT+UgP4LHdpO9jPDlXqhrRr9/wCKmfoAvh5G/F7aOh4MwQa+8uEqhA==", + "peer": true, + "requires": { + "@emotion/memoize": "^0.8.0", + "@emotion/sheet": "^1.2.1", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "stylis": "4.1.4" + } + }, + "@emotion/is-prop-valid": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.2.0.tgz", + "integrity": "sha512-3aDpDprjM0AwaxGE09bOPkNxHpBd+kA6jty3RnaEXdweX1DF1U3VQpPYb0g1IStAuK7SVQ1cy+bNBBKp4W3Fjg==", + "peer": true, + "requires": { + "@emotion/memoize": "^0.8.0" + } + }, + "@emotion/memoize": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.0.tgz", + "integrity": "sha512-G/YwXTkv7Den9mXDO7AhLWkE3q+I92B+VqAE+dYG4NGPaHZGvt3G8Q0p9vmE+sq7rTGphUbAvmQ9YpbfMQGGlA==", + "peer": true + }, + "@emotion/react": { + "version": "11.10.8", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.10.8.tgz", + "integrity": "sha512-ZfGfiABtJ1P1OXqOBsW08EgCDp5fK6C5I8hUJauc/VcJBGSzqAirMnFslhFWnZJ/w5HxPI36XbvMV0l4KZHl+w==", + "optional": true, + "peer": true, + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.8", + "@emotion/cache": "^11.10.8", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0", + "@emotion/weak-memoize": "^0.3.0", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.1.tgz", + "integrity": "sha512-Zl/0LFggN7+L1liljxXdsVSVlg6E/Z/olVWpfxUTxOAmi8NU7YoeWeLfi1RmnB2TATHoaWwIBRoL+FvAJiTUQA==", + "optional": true, + "peer": true, + "requires": { + "@emotion/hash": "^0.9.0", + "@emotion/memoize": "^0.8.0", + "@emotion/unitless": "^0.8.0", + "@emotion/utils": "^1.2.0", + "csstype": "^3.0.2" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.0.tgz", + "integrity": "sha512-14FtKiHhy2QoPIzdTcvh//8OyBlknNs2nXRwIhG904opCby3l+9Xaf/wuPvICBF0rc1ZCNBd3nKe9cd2mecVkQ==", + "optional": true, + "peer": true + } + } + }, + "@emotion/sheet": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.1.tgz", + "integrity": "sha512-zxRBwl93sHMsOj4zs+OslQKg/uhF38MB+OMKoCrVuS0nyTkqnau+BM3WGEoOptg9Oz45T/aIGs1qbVAsEFo3nA==", + "peer": true + }, + "@emotion/styled": { + "version": "11.10.8", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.10.8.tgz", + "integrity": "sha512-gow0lF4Uw/QEdX2REMhI8v6wLOabPKJ+4HKNF0xdJ2DJdznN6fxaXpQOx6sNkyBhSUL558Rmcu1Lq/MYlVo4vw==", + "optional": true, + "peer": true, + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.10.8", + "@emotion/is-prop-valid": "^1.2.0", + "@emotion/serialize": "^1.1.1", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.0", + "@emotion/utils": "^1.2.0" + } + }, + "@emotion/unitless": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.0.tgz", + "integrity": "sha512-VINS5vEYAscRl2ZUDiT3uMPlrFQupiKgHz5AA4bCH1miKBg4qtwkim1qPmJj/4WG6TreYMY111rEFsjupcOKHw==", + "optional": true, + "peer": true + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.0.tgz", + "integrity": "sha512-1eEgUGmkaljiBnRMTdksDV1W4kUnmwgp7X9G8B++9GYwl1lUdqSndSriIrTJ0N7LQaoauY9JJ2yhiOYK5+NI4A==", + "optional": true, + "peer": true, + "requires": {} + }, + "@emotion/utils": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.0.tgz", + "integrity": "sha512-sn3WH53Kzpw8oQ5mgMmIzzyAaH2ZqFEbozVVBSYp538E06OSE6ytOp7pRAjNQR+Q/orwqdQYJSe2m3hCOeznkw==", + "peer": true + }, + "@emotion/weak-memoize": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.0.tgz", + "integrity": "sha512-AHPmaAx+RYfZz0eYu6Gviiagpmiyw98ySSlQvCUhVGDRtDFe4DBS0x1bSjdF3gqUDYOczB+yYvBTtEylYSdRhg==", + "peer": true + }, "@hapi/hoek": { "version": "9.3.0", "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", @@ -14517,6 +15206,139 @@ "resolved": "https://registry.npmjs.org/@mdx-js/util/-/util-1.6.22.tgz", "integrity": "sha512-H1rQc1ZOHANWBvPcW+JpGwr+juXSxM8Q8YCkm3GhZd8REu1fHR3z99CErO1p9pkcfcxZnMdIZdIsXkOHY0NilA==" }, + "@mui/base": { + "version": "5.0.0-alpha.127", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-alpha.127.tgz", + "integrity": "sha512-FoRQd0IOH9MnfyL5yXssyQRnC4vXI+1bwkU1idr+wNkP1ZfxE+JsThHcfl1dy5azLssVUGTtQFD9edQLdbyJog==", + "peer": true, + "requires": { + "@babel/runtime": "^7.21.0", + "@emotion/is-prop-valid": "^1.2.0", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.12.0", + "@popperjs/core": "^2.11.7", + "clsx": "^1.2.1", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "peer": true + } + } + }, + "@mui/core-downloads-tracker": { + "version": "5.12.2", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.12.2.tgz", + "integrity": "sha512-Qn7dy8tql6T0hY6gTFPkpWlnqVVFGu5Z6QzEzUSzzmLZpfAx4kf8sFz0PHiB7gU5yrqcZF9picMx1shpRY/rXw==", + "peer": true + }, + "@mui/icons-material": { + "version": "5.11.16", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-5.11.16.tgz", + "integrity": "sha512-oKkx9z9Kwg40NtcIajF9uOXhxiyTZrrm9nmIJ4UjkU2IdHpd4QVLbCc/5hZN/y0C6qzi2Zlxyr9TGddQx2vx2A==", + "requires": { + "@babel/runtime": "^7.21.0" + } + }, + "@mui/material": { + "version": "5.12.2", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.12.2.tgz", + "integrity": "sha512-XOVy6fVC0rI2dEwDq/1s4Te2hewTUe6lznzeVnruyATGkdmM06WnHqkZOoLVIWo9hWwAxpcgTDcAIVpFtt1nrw==", + "peer": true, + "requires": { + "@babel/runtime": "^7.21.0", + "@mui/base": "5.0.0-alpha.127", + "@mui/core-downloads-tracker": "^5.12.2", + "@mui/system": "^5.12.1", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.12.0", + "@types/react-transition-group": "^4.4.5", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1", + "react-is": "^18.2.0", + "react-transition-group": "^4.4.5" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "peer": true + } + } + }, + "@mui/private-theming": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.12.0.tgz", + "integrity": "sha512-w5dwMen1CUm1puAtubqxY9BIzrBxbOThsg2iWMvRJmWyJAPdf3Z583fPXpqeA2lhTW79uH2jajk5Ka4FuGlTPg==", + "peer": true, + "requires": { + "@babel/runtime": "^7.21.0", + "@mui/utils": "^5.12.0", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.12.0.tgz", + "integrity": "sha512-frh8L7CRnvD0RDmIqEv6jFeKQUIXqW90BaZ6OrxJ2j4kIsiVLu29Gss4SbBvvrWwwatR72sBmC3w1aG4fjp9mQ==", + "peer": true, + "requires": { + "@babel/runtime": "^7.21.0", + "@emotion/cache": "^11.10.7", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "5.12.1", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.12.1.tgz", + "integrity": "sha512-Po+sicdV3bbRYXdU29XZaHPZrW7HUYUqU1qCu77GCCEMbahC756YpeyefdIYuPMUg0OdO3gKIUfDISBrkjJL+w==", + "peer": true, + "requires": { + "@babel/runtime": "^7.21.0", + "@mui/private-theming": "^5.12.0", + "@mui/styled-engine": "^5.12.0", + "@mui/types": "^7.2.4", + "@mui/utils": "^5.12.0", + "clsx": "^1.2.1", + "csstype": "^3.1.2", + "prop-types": "^15.8.1" + } + }, + "@mui/types": { + "version": "7.2.4", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.4.tgz", + "integrity": "sha512-LBcwa8rN84bKF+f5sDyku42w1NTxaPgPyYKODsh01U1fVstTClbUoSA96oyRBnSNyEiAVjKm6Gwx9vjR+xyqHA==", + "peer": true, + "requires": {} + }, + "@mui/utils": { + "version": "5.12.0", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.12.0.tgz", + "integrity": "sha512-RmQwgzF72p7Yr4+AAUO6j1v2uzt6wr7SWXn68KBsnfVpdOHyclCzH2lr/Xu6YOw9su4JRtdAIYfJFXsS6Cjkmw==", + "peer": true, + "requires": { + "@babel/runtime": "^7.21.0", + "@types/prop-types": "^15.7.5", + "@types/react-is": "^16.7.1 || ^17.0.0", + "prop-types": "^15.8.1", + "react-is": "^18.2.0" + }, + "dependencies": { + "react-is": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.2.0.tgz", + "integrity": "sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==", + "peer": true + } + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -14545,6 +15367,12 @@ "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.21.tgz", "integrity": "sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==" }, + "@popperjs/core": { + "version": "2.11.7", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz", + "integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==", + "peer": true + }, "@sideway/address": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/@sideway/address/-/address-4.1.4.tgz", @@ -14957,15 +15785,24 @@ "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==" }, "@types/react": { - "version": "18.0.15", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.0.15.tgz", - "integrity": "sha512-iz3BtLuIYH1uWdsv6wXYdhozhqj20oD4/Hk2DNXIn1kFsmp9x8d9QB6FnPhfkbhd2PgEONt9Q1x/ebkwjfFLow==", + "version": "17.0.58", + "resolved": "https://registry.npmjs.org/@types/react/-/react-17.0.58.tgz", + "integrity": "sha512-c1GzVY97P0fGxwGxhYq989j4XwlcHQoto6wQISOC2v6wm3h0PORRWJFHlkRjfGsiG3y1609WdQ+J+tKxvrEd6A==", "requires": { "@types/prop-types": "*", "@types/scheduler": "*", "csstype": "^3.0.2" } }, + "@types/react-is": { + "version": "17.0.4", + "resolved": "https://registry.npmjs.org/@types/react-is/-/react-is-17.0.4.tgz", + "integrity": "sha512-FLzd0K9pnaEvKz4D1vYxK9JmgQPiGk1lu23o1kqGsLeT0iPbRSF7b76+S5T9fD8aRa0B8bY7I/3DebEj+1ysBA==", + "peer": true, + "requires": { + "@types/react": "^17" + } + }, "@types/react-router": { "version": "5.1.18", "resolved": "https://registry.npmjs.org/@types/react-router/-/react-router-5.1.18.tgz", @@ -14995,6 +15832,15 @@ "@types/react-router": "*" } }, + "@types/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-juKD/eiSM3/xZYzjuzH6ZwpP+/lejltmiS3QEzV/vmb/Q8+HfDmxu+Baga8UEMGBqV88Nbg4l2hY/K2DkyaLLA==", + "peer": true, + "requires": { + "@types/react": "*" + } + }, "@types/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/@types/retry/-/retry-0.12.0.tgz", @@ -15471,6 +16317,18 @@ } } }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "optional": true, + "peer": true, + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, "babel-plugin-polyfill-corejs2": { "version": "0.3.3", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.3.3.tgz", @@ -16336,9 +17194,9 @@ } }, "csstype": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.0.tgz", - "integrity": "sha512-uX1KG+x9h5hIJsaKR9xHUeUraxf8IODOwq9JLNPq6BwB04a/xgpq3rcx47l5BZu5zBPlgD342tdke3Hom/nJRA==" + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.2.tgz", + "integrity": "sha512-I7K1Uu0MBPzaFKg4nI5Q7Vs2t+3gWWW648spaF+Rg7pI9ds18Ugn+lvg4SHczUdKlHI5LWBXyqfS8+DufyBsgQ==" }, "debug": { "version": "4.3.4", @@ -16508,6 +17366,16 @@ "utila": "~0.4" } }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "peer": true, + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -17004,6 +17872,13 @@ "pkg-dir": "^4.1.0" } }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "optional": true, + "peer": true + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -19073,6 +19948,12 @@ "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-2.0.0.tgz", "integrity": "sha512-ravE6m9Atw9Z/jjttRUZ+clIXogdghyZAuWJ3qEzjT+jI/dL1ifAqhZeC5VHzQp1MSt1+jxKkFNemj/iO7tVUA==" }, + "prettier": { + "version": "2.8.8", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.8.tgz", + "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", + "dev": true + }, "pretty-error": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/pretty-error/-/pretty-error-4.0.0.tgz", @@ -19461,6 +20342,18 @@ "use-latest": "^1.2.1" } }, + "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==", + "peer": true, + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -20420,6 +21313,12 @@ "postcss-selector-parser": "^6.0.4" } }, + "stylis": { + "version": "4.1.4", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.4.tgz", + "integrity": "sha512-USf5pszRYwuE6hg9by0OkKChkQYEXfkeTtm0xKw+jqQhwyjCVLdYyMBK7R+n7dhzsblAWJnGxju4vxq5eH20GQ==", + "peer": true + }, "supports-color": { "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", diff --git a/package.json b/package.json index 2b92dcd..92c1e6b 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "@docusaurus/core": "^2.4.0", "@docusaurus/preset-classic": "^2.4.0", "@mdx-js/react": "^1.6.22", + "@mui/icons-material": "^5.11.16", "clsx": "^1.2.1", "prism-react-renderer": "^1.3.5", "react": "^17.0.2", @@ -26,6 +27,7 @@ "devDependencies": { "@docusaurus/module-type-aliases": "^2.4.0", "@tsconfig/docusaurus": "^1.0.7", + "prettier": "^2.8.8", "typescript": "^5.0.2" }, "browserslist": { diff --git a/sidebars.js b/sidebars.js index 319bb62..14b1f32 100644 --- a/sidebars.js +++ b/sidebars.js @@ -46,7 +46,7 @@ const sidebars = { }, { type: "category", - label: "회칙", + label: "규칙", link: { type: "doc", id: "rules", diff --git a/src/components/ProjectLogo/index.tsx b/src/components/ProjectLogo/index.tsx new file mode 100644 index 0000000..706ab4f --- /dev/null +++ b/src/components/ProjectLogo/index.tsx @@ -0,0 +1,35 @@ +import LinkIcon from "@mui/icons-material/Link"; +import React from "react"; +import styles from "./styles.module.css"; + +type ProjectLogoProps = { + name: string; + url: string; + catchphrase: string; +}; + +export default function ProjectLogo({ + name, + url, + catchphrase, +}: ProjectLogoProps): JSX.Element { + const ext = name === "Biseo" ? `png` : `svg`; + const logoUrl = `/projects/logo/${name.toLowerCase()}-logo.${ext}`; + return ( +
+
+ {`${name} +

{catchphrase}

+ + + {url} + +
+
+ ); +} diff --git a/src/components/ProjectLogo/styles.module.css b/src/components/ProjectLogo/styles.module.css new file mode 100644 index 0000000..3b72e73 --- /dev/null +++ b/src/components/ProjectLogo/styles.module.css @@ -0,0 +1,54 @@ +.section { + text-align: center; +} + +.logo { + margin-top: 20px; + height: 80px; +} + +.catchphrase { + color: gray; + font-style: italic; + padding-bottom: 20px; +} + +.container { + position: relative; +} + +.overlay { + position: absolute; + display: flex; + justify-content: center; + align-items: center; + bottom: 0; + width: 100%; + height: 100%; + transition: 0.3s ease; + background-color: transparent; + text-align: center; + border-radius: 25px; + z-index: 10; + background-color: rgba(138, 138, 138, 0.3); + opacity: 0; + font-size: 20px !important; + font-weight: bold; + color: white !important; + line-height: 40px; + text-align: center; + gap: 5px; + text-decoration: none !important; +} + +.icon { + transition: 0.5s ease; + color: white; + font-size: 40px !important; +} + +/* When you mouse over the container, fade in the overlay title */ +.container:hover .overlay { + backdrop-filter: blur(5px); + opacity: 1; +} diff --git a/src/css/custom.css b/src/css/custom.css index 851a52b..c774a29 100644 --- a/src/css/custom.css +++ b/src/css/custom.css @@ -18,7 +18,7 @@ } /* For readability concerns, you should choose a lighter palette in dark mode. */ -[data-theme='dark'] { +[data-theme="dark"] { --ifm-color-primary: #eba12a; --ifm-color-primary-dark: #bc780c; --ifm-color-primary-darker: #ad7214; @@ -55,3 +55,11 @@ --docusaurus-highlighted-code-line-bg: rgba(0, 0, 0, 0.3); } */ + +.DocCardList--no-description .card h2 { + margin-bottom: 0; +} + +.DocCardList--no-description .card p { + display: none; +} diff --git a/static/projects/ServiceHome.svg b/static/projects/ServiceHome.svg deleted file mode 100644 index 23562af..0000000 --- a/static/projects/ServiceHome.svg +++ /dev/null @@ -1 +0,0 @@ -Projects-Home \ No newline at end of file diff --git a/static/projects/ServiceKono.svg b/static/projects/ServiceKono.svg deleted file mode 100644 index 5122c8b..0000000 --- a/static/projects/ServiceKono.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/static/projects/ServiceNewAra.svg b/static/projects/ServiceNewAra.svg deleted file mode 100644 index df4cca0..0000000 --- a/static/projects/ServiceNewAra.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/static/projects/ServiceStatus.svg b/static/projects/ServiceStatus.svg deleted file mode 100644 index 44ede9f..0000000 --- a/static/projects/ServiceStatus.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/static/projects/ara/logo.svg b/static/projects/ara/logo.svg deleted file mode 100644 index 4ead4ae..0000000 --- a/static/projects/ara/logo.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/static/projects/biseo/admin.png b/static/projects/biseo-admin.png similarity index 100% rename from static/projects/biseo/admin.png rename to static/projects/biseo-admin.png diff --git a/static/projects/biseo/main.png b/static/projects/biseo-main.png similarity index 100% rename from static/projects/biseo/main.png rename to static/projects/biseo-main.png diff --git a/static/projects/logo/ara-logo.svg b/static/projects/logo/ara-logo.svg new file mode 100755 index 0000000..7f1c990 --- /dev/null +++ b/static/projects/logo/ara-logo.svg @@ -0,0 +1 @@ +Services-Ara \ No newline at end of file diff --git a/static/projects/biseo/logo.png b/static/projects/logo/biseo-logo.png similarity index 100% rename from static/projects/biseo/logo.png rename to static/projects/logo/biseo-logo.png diff --git a/static/projects/ServiceGeoul.svg b/static/projects/logo/geoul-logo.svg similarity index 100% rename from static/projects/ServiceGeoul.svg rename to static/projects/logo/geoul-logo.svg diff --git a/static/projects/ServiceOTL.svg b/static/projects/logo/otl-logo.svg similarity index 100% rename from static/projects/ServiceOTL.svg rename to static/projects/logo/otl-logo.svg diff --git a/static/projects/ServiceSSO.svg b/static/projects/logo/sso-logo.svg similarity index 100% rename from static/projects/ServiceSSO.svg rename to static/projects/logo/sso-logo.svg diff --git a/static/projects/ServiceTaxi.svg b/static/projects/logo/taxi-logo.svg similarity index 100% rename from static/projects/ServiceTaxi.svg rename to static/projects/logo/taxi-logo.svg diff --git a/static/projects/ServiceZabo.svg b/static/projects/logo/zabo-logo.svg similarity index 100% rename from static/projects/ServiceZabo.svg rename to static/projects/logo/zabo-logo.svg diff --git a/static/projects/otl-notion.png b/static/projects/otl-notion.png new file mode 100644 index 0000000..f87d304 Binary files /dev/null and b/static/projects/otl-notion.png differ diff --git a/static/projects/zabo-notion.png b/static/projects/zabo-notion.png new file mode 100644 index 0000000..539e9e6 Binary files /dev/null and b/static/projects/zabo-notion.png differ