diff --git a/components/auth-state.tsx b/components/auth-state.tsx index 9fb56df..3346c6b 100644 --- a/components/auth-state.tsx +++ b/components/auth-state.tsx @@ -1,13 +1,15 @@ import { useContext } from 'react'; import { StateContext } from '../pages/_app'; -export default function AuthState({ classes }: any) { - let { user, authState } = useContext(StateContext); +export default function AuthState({ classes, nextOverride = ``, hideOnUsersLoading = false }: any) { + let { user, authState, usersLoading } = useContext(StateContext); return ( - - {user != null ? ( - `Welcome, ${user?.name}` - ) : authState} - + hideOnUsersLoading == true && usersLoading ? <> : ( + + {user != null ? ( + `Welcome, ${user?.name}` + ) : (nextOverride != `` && authState == `Next`) ? nextOverride : authState} + + ) ) } \ No newline at end of file diff --git a/components/boards/board.tsx b/components/boards/board.tsx index 0a4d27d..b0d0dd5 100644 --- a/components/boards/board.tsx +++ b/components/boards/board.tsx @@ -69,13 +69,6 @@ export default function Board(props) { }) } - const onDragStart = (dragStartEvent) => { - if (dev()) { - setLoading(true); - setSystemStatus(`Rearranging...`); - } - } - const onShowSearchClick = (e?: any) => { setShowSearch(!showSearch); toast.info(`Board Search in Development`); @@ -85,7 +78,7 @@ export default function Board(props) { setBoard(prevBoard => { return { ...prevBoard, - expanded: !prevBoard.expanded + expanded: !prevBoard.expanded, } }); } @@ -159,13 +152,8 @@ export default function Board(props) { const onDragEnd = (dragEndEvent) => { const { destination, source, draggableId, type } = dragEndEvent; - if (!destination) { - return; - } - - if (destination.droppableId === source.droppableId && destination.index === source.index) { - return; - } + if (!destination) return; + if (destination.droppableId === source.droppableId && destination.index === source.index) return; if (dev()) { setLoading(false); @@ -275,11 +263,11 @@ export default function Board(props) { }, [board]) return ( - +
-
+

@@ -296,8 +284,8 @@ export default function Board(props) { defaultValue={board?.name ?? `Board`} onBlur={(e) => changeLabel(e, board, setBoard)} onKeyDown={(e) => forceFieldBlurOnPressEnter(e)} - style={{ width: board.titleWidth ? board.titleWidth : `75px` }} - className={`boardNameField changeLabel textOverflow ${board?.expanded ? `` : `stretch`}`} + style={{ width: board?.expanded ? (board.titleWidth ? board.titleWidth : `75px`) : `100%` }} + className={`boardNameField changeLabel textOverflow ${board?.expanded ? `expandedBoardChangeLabel` : `stretch collapsedBoardChangeLabel`}`} />

{board?.expanded && <> @@ -322,16 +310,16 @@ export default function Board(props) {
-

- {board?.columnOrder && board?.columnOrder?.length} {( - +

+ {board?.data?.columnIDs && board?.data?.columnIDs?.length} {( + Column(s) )}

-

- {board?.items && Object.values(board?.items).length} {( - +

+ {board?.data?.itemIDs && board?.data?.itemIDs?.length} {( + Items(s) )} @@ -344,9 +332,9 @@ export default function Board(props) {

{board?.expanded && <> -

- - Filters +

+ + Options

} @@ -377,7 +365,7 @@ export default function Board(props) {
-
toast.info(`Column Types are In Development`)} className={`typeIcon changeColumnTypeIcon hoverGlowButton ${showSearch ? `disabledIconBtn` : ``}`}> +
toast.info(`Column Types are In Development`)} className={`typeIcon changeColumnTypeIcon ${showSearch ? `disabledIconBtn` : ``}`}> {showSearch ? : `+`}
diff --git a/components/boards/boards.tsx b/components/boards/boards.tsx index 57141dd..75c1ce2 100644 --- a/components/boards/boards.tsx +++ b/components/boards/boards.tsx @@ -1,10 +1,13 @@ import Board from './board'; import { toast } from 'react-toastify'; -import { isValid } from '../../shared/constants'; -import { updateUserFields } from '../../firebase'; +import { Skeleton } from '@mui/material'; +import { createBoard } from '../../shared/database'; +import MultiSelector from '../selector/multi-selector'; import { useState, useEffect, useContext } from 'react'; +import { findHighestNumberInArrayByKey, generateArray } from '../../shared/constants'; +import { capWords, dev, replaceAll, StateContext } from '../../pages/_app'; import { Droppable, Draggable, DragDropContext } from 'react-beautiful-dnd'; -import { capWords, dev, formatDate, generateUniqueID, replaceAll, StateContext } from '../../pages/_app'; +import IVFSkeleton from '../loaders/skeleton/ivf_skeleton'; export enum ItemTypes { Item = `Item`, @@ -13,67 +16,93 @@ export enum ItemTypes { export enum BoardTypes { Table = `Table`, + Kanban = `Kanban`, TierList = `Tier List`, ToDoList = `To Do List`, Spreadsheet = `Spreadsheet`, - KanbanBoard = `Kanban Board`, - SelectBoardType = `Select Board Type`, } export default function Boards({ }) { let [updates, setUpdates] = useState(0); - const { user, rte, boards, setBoards, router, setLoading, setSystemStatus, IDs, setIDs, setRte } = useContext(StateContext); + let [searchingGrid, setSearchingGrid] = useState(false); + let [useSingleSelect, setUseSingleSelect] = useState(true); - const addNewBoard = (e) => { + let { + user, + authState, + setLoading, + IDs, setIDs, + getGridsBoards, + setSystemStatus, + rte, router, setRte, + boards, userBoards, setBoards, boardsLoading, + grids, gridsLoading, selectedGrids, setSelectedGrids, + } = useContext(StateContext); + + const createBoardComponent = () => ( +
+
+
+
+

+ Create Board {boards && boards?.length + 1} +

+
+
toast.info(`Board Types are In Development`)} className={`typeIcon changeBoardTypeIcon`}> + + +
+ addNewBoard(e)} title={`Add Board`} id={`addBoardForm`} className={`addBoardForm flex addListForm itemButtons addForm`} style={{ width: `100%`, flexDirection: `row` }}> +
+ +
+ + +
+
+
+
+
+ ) + + const updateSelectedGrids = (updatedSelectedGrids) => { + setSelectedGrids(updatedSelectedGrids); + let gridBoards = getGridsBoards(updatedSelectedGrids, userBoards); + setBoards(gridBoards); + } + + const addNewBoard = async (e) => { e.preventDefault(); + setLoading(true); let formFields = e.target.children[0].children; - // let boardType = formFields.selectBoardType.value; let boardName = capWords(formFields.createBoard.value); let titleWidth = `${(boardName.length * 8.5) + 80}px`; - let boardIDX = boards?.length + 1 ? boards?.length + 1 : 1; - let newBoardID = `board_${boardIDX}_${generateUniqueID(IDs)}`; + let boardLn = boards?.length; + let boardRank = await findHighestNumberInArrayByKey(boards, `rank`); + let boardIDX = boardRank > boardLn ? boardRank : boardLn; + let rank = boardIDX + 1; + setSystemStatus(`Creating Board ${boardName}.`); - let newColumn1ID = `column_1_${generateUniqueID(IDs)}`; - let newColumn2ID = `column_2_${generateUniqueID(IDs)}`; - - let newBoard = { - items: [], - titleWidth, - expanded: true, - id: newBoardID, - name: boardName, - ...(user != null && { - creator: { - id: user?.id, - uid: user?.uid, - name: user?.name, - email: user?.email, - } - }), - created: formatDate(new Date()), - updated: formatDate(new Date()), - columnOrder: [ - newColumn1ID, - newColumn2ID, - ], - columns: { - [newColumn1ID]: { - itemIds: [], - title: `Active`, - id: newColumn1ID, - }, - [newColumn2ID]: { - itemIds: [], - title: `Complete`, - id: newColumn2ID, - } - }, - } + + let newBoard = createBoard(rank, boardName, user, titleWidth); + + dev() && console.log(`New Board`, newBoard); + + // Add to Firestore Boards Here Later setBoards([newBoard, ...boards]); - setIDs([...IDs, newBoard.id, newColumn1ID, newColumn2ID]); + setIDs([...IDs, newBoard.id]); e.target.reset(); setTimeout(() => { @@ -83,135 +112,132 @@ export default function Boards({ }) { } const onDragEnd = (dragEndEvent) => { - dev() && console.log(`Boards Drag`, dragEndEvent); - const { destination, source, draggableId, type } = dragEndEvent; + const { destination, source } = dragEndEvent; - if (!destination) { - return; - } + if (!destination) return; + if (destination.droppableId === source.droppableId && destination.index === source.index) return; - if (destination.droppableId === source.droppableId && destination.index === source.index) { - return; - } + const updatedBoards = [...boards]; + const [reorderedBoard] = updatedBoards.splice(source.index, 1); + updatedBoards.splice(destination.index, 0, reorderedBoard); + + let updatedBoardsPositions = updatedBoards.map((brd, brdIndex) => ({ ...brd, position: brdIndex + 1 })); + setBoards(updatedBoardsPositions); - const newBoards = [...boards]; - const [reorderedBoard] = newBoards.splice(source.index, 1); - newBoards.splice(destination.index, 0, reorderedBoard); - setBoards(newBoards); + // dev() && console.log(`Boards Drag`, updatedBoardsPositions); }; useEffect(() => { setRte(replaceAll(router.route, `/`, `_`)); - - if (updates > 0) { - // let singleUpdate = updates % 2 !== 0; - // if (singleUpdate) { - let updatedBoards = boards; - - if (user != null) { - let boardsHaveCreator = boards.every(brd => isValid(brd?.creator)); - if (!boardsHaveCreator) { - updatedBoards = boards.map(brd => ({ - ...brd, - creator: { - id: user?.id, - uid: user?.uid, - name: user?.name, - email: user?.email, - }, - })) - } - updateUserFields(user?.id, { boards: updatedBoards }); - localStorage.setItem(`user`, JSON.stringify({ ...user, boards: updatedBoards })); - } else { - localStorage.setItem(`local_boards`, JSON.stringify(updatedBoards)); - } - - localStorage.setItem(`boards`, JSON.stringify(updatedBoards)); - // dev() && updatedBoards?.length > 0 && console.log(`Updated Boards`, { - // updates, - // updatedBoards, - // }); - // } - } setUpdates(updates + 1); return () => { setRte(replaceAll(router.route, `/`, `_`)); - }; - }, [boards, rte]); + } + }, [rte]); + + const getLoadingLabel = (lbl: string) => { + let nonFormAuthStates = [`Next`, `Back`, `Save`]; + return user != null ? `${lbl} Loading` : `${!nonFormAuthStates.includes(authState) ? authState : `Register`} to View ${lbl}`; + } return <> -
-
-
-
-

- Create Board {boards?.boards && boards?.boards?.length + 1} -

-
-
toast.info(`Board Types are In Development`)} className={`typeIcon changeBoardTypeIcon hoverGlowButton`}> - + -
-
addNewBoard(e)} title={`Add Board`} id={`addBoardForm`} className={`addBoardForm flex addListForm itemButtons addForm`} style={{ width: `100%`, flexDirection: `row` }}> -
- - {/* {devEnv &&
- -
} */} -
- -
-
-
+
+
1) ? `hasGridSelector ${useSingleSelect ? `withSingleSelect` : ``}` : ``}`} style={{ padding: 0, paddingBottom: 7 }}> +
+

+ {user != null ? user?.name + `s ` : ``}{selectedGrids.length == 1 ? selectedGrids[0]?.name : `Grids`} +

+
+
+ {gridsLoading ? <> : <> + + {searchingGrid ? ( + + ) : ( + + )} + } +
+
+ {gridsLoading ? ( + + ) : grids?.length > 1 && ( + updateSelectedGrids(val)} + options={grids.map(gr => ({ ...gr, id: gr?.ID, value: gr?.ID, label: gr?.name }))} + /> + )}
+ +
+ + {boardsLoading ? <> : createBoardComponent()} +
0 ? `hasBoards` : `noBoards`} ${boards && boards?.length == 1 ? `oneBoard` : ``}`}> - {boards && boards?.length > 0 ? ( - - {(provided, snapshot) => ( -
- {boards && boards?.length > 0 && boards?.map((bord, bordIndex) => { - if (bord.expanded == null || bord.expanded == undefined) bord.expanded = true; - return ( - - {(provided, snapshot) => ( -
- -
- )} -
- ) - })} - {provided.placeholder} -
- )} -
- ) : <> -
- No Boards Yet + {boardsLoading ? <> +
+ {generateArray(10, getLoadingLabel(`Boards`)).map((lbl, lblIndex) => ( + + ))}
- } + : ( + boards && boards?.length > 0 ? ( + + {(provided, snapshot) => ( +
+ {boards && boards?.length > 0 && boards?.map((bord, bordIndex) => { + if (bord.expanded == null || bord.expanded == undefined) bord.expanded = true; + return ( + + {(provided, snapshot) => ( +
+ +
+ )} +
+ ) + })} + {provided.placeholder} +
+ )} +
+ ) : <> +
+ 0 Boards +
+ + )}
+ + {/* {boardsLoading ? <> : createBoardComponent()} */} } \ No newline at end of file diff --git a/components/boards/column.tsx b/components/boards/column.tsx index 18116a5..f5cce12 100644 --- a/components/boards/column.tsx +++ b/components/boards/column.tsx @@ -213,7 +213,7 @@ export default function Column(props) { return ( {(provided, snapshot) => ( -
2 || !dev()) ? `multiCol` : ``} layoutCols_${props?.column?.layoutCols ? props?.column?.layoutCols : ``} ${snapshot.isDragging ? `dragging` : ``}`} {...provided.draggableProps} ref={provided.innerRef}> +
2 || !dev()) ? `multiCol` : ``} ${board?.columnOrder && board?.columnOrder?.length >= 4 ? `multiColExtended` : ``} layoutCols_${props?.column?.layoutCols ? props?.column?.layoutCols : ``} ${snapshot.isDragging ? `dragging` : ``}`} {...provided.draggableProps} ref={provided.innerRef}>
@@ -286,30 +286,30 @@ export default function Column(props) { {props.items.filter(itm => itemActiveFilters(itm)).map((item, itemIndex) => { if (!item.subtasks) item.subtasks = []; return ( - - {provided => ( -
-
manageItem(e, item, itemIndex, board, boards, setBoards)} {...provided.dragHandleProps} className={`itemRow flex row ${item?.complete ? `completed` : `incomplete`} ${item.subtasks.length > 0 ? `hasTasksRow` : `noTasksRow`}`}> - + + {provided => ( +
+
manageItem(e, item, itemIndex, board, boards, setBoards)} {...provided.dragHandleProps} className={`itemRow flex row ${item?.complete ? `completed` : `incomplete`} ${item.subtasks.length > 0 ? `hasTasksRow` : `noTasksRow`}`}> + +
+ {!hideAllTasks && item.subtasks && ( + + )}
- {!hideAllTasks && item.subtasks && ( - - )} -
- )} - + )} + )} )} {provided.placeholder} @@ -320,7 +320,7 @@ export default function Column(props) {
addNewItem(e)}>
{Object.values(ItemTypes).filter(type => type !== props?.column?.itemType).map((type, typeIndex) => ( -
changeItemType(e, type, props.column)} className={`typeIcon itemTypeIconRow menuTypeIcon hoverGlowButton`}> +
changeItemType(e, type, props.column)} className={`typeIcon itemTypeIconRow menuTypeIcon`}>
{getTypeIcon(type)}
@@ -330,7 +330,7 @@ export default function Column(props) {
))}
-
changeItemType(e)} className={`typeIcon changeItemTypeIcon hoverGlowButton`}> +
changeItemType(e)} className={`typeIcon changeItemTypeIcon`}> {getTypeIcon(props?.column?.itemType)}
@@ -340,7 +340,7 @@ export default function Column(props) { {/* {props?.column?.itemType == ItemTypes.Video && ( )} */} - itemActiveFilters(itm)).length + 1} defaultValue={props.items.filter(itm => itemActiveFilters(itm)).length + 1} type={`number`} min={1} /> + itemActiveFilters(itm)).length + 1} defaultValue={props.items.filter(itm => itemActiveFilters(itm)).length + 1} type={`number`} min={1} />
+ ); +} + +function DroppableContainer({ id, items }) { + const { setNodeRef } = useDroppable({ id }); + + return ( +
+ {items.map((item) => ( + + ))} +
+ ); +} + +export default function List() { + let { user } = useContext(StateContext); + + const [items, setItems] = useState([ + { id: 'item-1', name: 'Item 1' }, + { id: 'item-2', name: 'Item 2' }, + { id: 'item-3', name: 'Item 3' }, + ]); + + const handleDragEnd = (event) => { + const { active, over } = event; + if (active.id !== over.id) { + const activeIndex = items.findIndex(item => item.id === active.id); + const overIndex = items.findIndex(item => item.id === over.id); + + const newItems = [...items]; + const [movedItem] = newItems.splice(activeIndex, 1); + newItems.splice(overIndex, 0, movedItem); + + setItems(newItems); + } + }; + + return ( + + + + ); +} \ No newline at end of file diff --git a/components/footer.tsx b/components/footer.tsx index 40cd35e..3092d61 100644 --- a/components/footer.tsx +++ b/components/footer.tsx @@ -1,5 +1,9 @@ +import { useContext } from 'react'; +import { StateContext } from '../pages/_app'; + export default function Footer(props) { let { style } = props; + let { year } = useContext(StateContext); return (
@@ -8,7 +12,7 @@ export default function Footer(props) {
- Piratechs {new Date()?.getFullYear()} + Piratechs {year}
) diff --git a/components/form.tsx b/components/form.tsx index b193893..9388840 100644 --- a/components/form.tsx +++ b/components/form.tsx @@ -2,11 +2,13 @@ import { toast } from 'react-toastify'; import { User } from '../shared/models/User'; +import { createUser, seedUserData } from '../shared/database'; import { addUserToDatabase, auth } from '../firebase'; import { useContext, useEffect, useRef, useState } from 'react'; -import { formatDate, StateContext, showAlert } from '../pages/_app'; +import { findHighestNumberInArrayByKey, stringNoSpaces } from '../shared/constants'; +import { formatDate, StateContext, showAlert, dev } from '../pages/_app'; import { createUserWithEmailAndPassword, signInWithEmailAndPassword } from 'firebase/auth'; -import { findHighestNumberInArrayByKey, isValid, removeNullAndUndefinedProperties } from '../shared/constants'; +import IVFSkeleton from './loaders/skeleton/ivf_skeleton'; export const convertHexToRGB = (HexString?:any, returnObject?: any) => { let r = parseInt(HexString.slice(1, 3), 16), @@ -27,12 +29,12 @@ export const isShadeOfBlack = (HexString?:any) => { return (rgb?.r < darkColorBias) && (rgb?.g < darkColorBias) && (rgb?.b < darkColorBias); } -export const renderErrorMessage = (erMsg: string) => { +export const renderFirebaseAuthErrorMessage = (erMsg: string) => { let erMsgQuery = erMsg?.toLowerCase(); if (erMsgQuery.includes(`invalid-email`)) { return `Please use a valid email.`; } else if (erMsgQuery?.includes(`email-already-in-use`)) { - return `Email is already in use.`; + return `Existing Email, Switching to Sign In`; } else if (erMsgQuery?.includes(`weak-password`)) { return `Password should be at least 6 characters`; } else if (erMsgQuery?.includes(`wrong-password`) || erMsgQuery?.includes(`invalid-login-credentials`)) { @@ -45,10 +47,39 @@ export const renderErrorMessage = (erMsg: string) => { } export default function Form(props?: any) { + const formRef = useRef(null); const loadedRef = useRef(false); + const passwordRef = useRef(null); + const [loaded, setLoaded] = useState(false); + const { id, navForm, className, style } = props; - const { user, setUser, setBoards, updates, setUpdates, setContent, authState, setAuthState, emailField, setEmailField, users } = useContext(StateContext); + + const { + onSignOut, + setContent, + updates, setUpdates, + authState, setAuthState, + emailField, setEmailField, + user, setUser, usersLoading, users, onSetUser, + } = useContext(StateContext); + + const getAuthStateIcon = (authState) => { + let signoutIcon = `fas fa-sign-out-alt`; + let icon = signoutIcon; + // if (authState == `Next`) { + // icon = + // } + return icon; + } + + const submitFormProgrammatically = (e?: any, auth_state?) => { + e?.preventDefault(); + let form = formRef?.current; + if (form != null) { + authForm(e, form, auth_state); + } + } // const changeColor = (colorRangePickerEvent?: any) => { // let currentColor: any = colorRangePickerEvent.target.value; @@ -67,37 +98,39 @@ export default function Form(props?: any) { // } // } - const authForm = (e?: any) => { + const formButtonField = (label, className, auth_state, input) => <> + {usersLoading ? ( + + ) : ( +
formRef != null ? submitFormProgrammatically(e, auth_state) : undefined}> + + {input} +
+ )} + + + const authForm = (e?: any, frm?, value?) => { e.preventDefault(); - let form = e?.target; + let form = frm ? frm : e?.target; let formFields = form?.children; let clicked = e?.nativeEvent?.submitter; let email = formFields?.email?.value ?? `email`; + let clickedValue = value ? value : clicked?.value; let password = formFields?.password?.value ?? `pass`; const signInUser = (usr: User) => { localStorage.setItem(`user`, JSON.stringify(usr)); setAuthState(`Sign Out`); setUser(usr); - if (isValid(usr?.boards)) { - setBoards(usr?.boards); - } - } - - const onSignOut = () => { - setUser(null); - setAuthState(`Next`); - setEmailField(false); - setUpdates(updates + 1); - localStorage.removeItem(`user`); - let hasLocalBoards = localStorage.getItem(`local_boards`); - if (hasLocalBoards) { - let localBoards = JSON.parse(hasLocalBoards); - setBoards(localBoards); - } else { - setBoards([]); - } } const onSignIn = (email, password) => { @@ -107,6 +140,7 @@ export default function Form(props?: any) { if (existingUser != null) { signInUser(existingUser); toast.success(`Successfully Signed In`); + onSetUser(existingUser); } else { setEmailField(true); setAuthState(`Sign Up`); @@ -116,7 +150,7 @@ export default function Form(props?: any) { const errorCode = error.code; const errorMessage = error.message; if (errorMessage) { - toast.error(renderErrorMessage(errorMessage)); + toast.error(renderFirebaseAuthErrorMessage(errorMessage)); console.log(`Error Signing In`, { error, errorCode, @@ -141,26 +175,13 @@ export default function Form(props?: any) { } = userCredential?.user; let highestRank = await findHighestNumberInArrayByKey(users, `rank`); - let userData = { - uid, - name, - email, - phone, - avatar, - rank: highestRank + 1, - auth: { - token, - verified, - anonymous, - } - } - - let cleanedUser = removeNullAndUndefinedProperties(userData); - let newUser = new User(cleanedUser); + let rank = highestRank + 1; + + let newUser = createUser(uid, rank, email, name, phone, avatar, token, verified, anonymous); await addUserToDatabase(newUser).then(() => { toast.success(`Signed Up & In as: ${newUser?.name}`); - console.log(`New User`, newUser); + dev() && console.log(`New User`, newUser); signInUser(newUser); form.reset(); }); @@ -171,7 +192,10 @@ export default function Form(props?: any) { console.log(`Error Signing Up`, error); const errorMessage = error.message; if (errorMessage) { - toast.error(renderErrorMessage(errorMessage)); + toast.error(renderFirebaseAuthErrorMessage(errorMessage)); + if (errorMessage?.includes(`email-already-in-use`)) { + setAuthState(`Sign In`); + } } else { toast.error(`Error Signing Up`); } @@ -179,9 +203,9 @@ export default function Form(props?: any) { }); } - switch(clicked?.value) { + switch(clickedValue) { default: - console.log(`Clicked Value`, clicked?.value); + console.log(`Clicked Value`, clickedValue); break; case `Next`: let macthingEmails = users.filter((usr: any) => usr?.email.toLowerCase() == email.toLowerCase()); @@ -258,11 +282,19 @@ export default function Form(props?: any) { setLoaded(true); }, [user, users, authState]); + useEffect(() => { + if (emailField && passwordRef.current) { + passwordRef.current.focus(); + } + }, [emailField]); + return <> - + - {!user && } - {!user && emailField && } + {usersLoading ? <> : <> + {!user && } + {!user && emailField && } + } {(!navForm && user != null) ? <> {window?.location?.href?.includes(`profile`) ? <> @@ -276,9 +308,21 @@ export default function Form(props?: any) { : <>} : <>} - + {formButtonField( + `Users Loading`, + `usersSkeleton`, + user ? `Sign Out` : authState, + , + )} - {(authState == `Sign In` || authState == `Sign Up`) && } + {(authState == `Sign In` || authState == `Sign Up`) && ( + formButtonField( + `Users Loading`, + `usersSkeleton`, + `Back`, + + ) + )} diff --git a/components/loaders/skeleton/ivf_skeleton.tsx b/components/loaders/skeleton/ivf_skeleton.tsx new file mode 100644 index 0000000..07cc1e8 --- /dev/null +++ b/components/loaders/skeleton/ivf_skeleton.tsx @@ -0,0 +1,43 @@ +import { CircularProgress, LinearProgress, Skeleton } from '@mui/material'; + +export default function IVFSkeleton(props: any) { + + let { + style, + label, + children, + className, + width = `100%`, + labelSize = 14, + height = `100%`, + animation = `wave`, + showLoading = false, + labelColor = `white`, + // labelColor = `silver`, + skeletonContainerGap = 25, + skeletonContainerPadding = 0, + skeletonContainerWidth = `97%`, + } = props; + + return ( + +
+ {label ? ( +
+ {showLoading ? <> + + : <>} + + + {label} + + + {showLoading ? <> + + : <>} +
+ ) : children} +
+
+ ) +} \ No newline at end of file diff --git a/components/profile/profile.tsx b/components/profile/profile.tsx index 2aaed3d..5d82fe9 100644 --- a/components/profile/profile.tsx +++ b/components/profile/profile.tsx @@ -5,6 +5,7 @@ import { User } from '../../shared/models/User'; import { dev, StateContext } from '../../pages/_app'; import { stringMatch } from '../../shared/constants'; import { useContext, useEffect, useState } from 'react'; +import KanbanBoard from '../boards/kanban/kanban'; export default function Profile({ }) { let router = useRouter(); @@ -82,6 +83,7 @@ export default function Profile({ }) { : <>

Sign In to View your Profile

+ {/* */} } }
diff --git a/components/selector/_multiselector.scss b/components/selector/_multiselector.scss new file mode 100644 index 0000000..232df91 --- /dev/null +++ b/components/selector/_multiselector.scss @@ -0,0 +1,291 @@ +:root { + --selectorMainBG: white; + --selectorMainFont: black; + --selectorInverseFont: white; + --selectorMainIcon: var(--gameBlue); + --selectorHeight: var(--buttonSize); + --selectorInverseBG: var(--blackGlass); +} + +@mixin flexed { + width: 100%; + display: flex !important; + align-items: center !important; +} + +@mixin noBorderNoOutline { + border: none !important; + outline: none !important; +} + +@mixin setHeight($height: var(--selectorHeight)) { + height: $height !important; + min-height: $height !important; + max-height: $height !important; +} + +.selectorOptionLabel { + font-weight: 600; +} + +.gridsIcon { + color: var(--selectorMainIcon); +} + +.multiSelectedIconLabels { + display: flex; + align-items: center; +} + +.multiSelectOptionInputField { + width: 100%; + display: flex; +} + +.clearOptionIcon { + width: 0; + margin-left: -10px; + font-size: 0 !important; + transition: var(--transition); +} + +.listedOptionContainer { + width: 100%; + display: flex; + grid-gap: 10px; + align-items: center; + padding: 5px 0 5px 7px; + justify-content: flex-start; + .listedOptionIcon { + transition: var(--transition); + color: var(--selectorMainIcon); + } + .listedOptionLabel { + font-weight: 500; + } +} + +.selectedOptionsElement { + position: relative; + .multiSelectOptionInputField { + top: 0; + width: 100%; + position: absolute; + input { + opacity: 0; + } + } + .multiSelectorOptionsContainer { + width: 100% !important; + } + &.multiSelectedOptionsElement { + .multiSelectedOption { + &.isLast { + margin-right: 0 !important; + } + } + .multiSelectedOption { + &:hover { + .clearOptionIcon { + width: auto; + margin-left: 0; + font-size: 14px !important; + } + } + } + } + &.singleSelectedOptionsElement { + min-width: 120px; + .singleSelectedOptionsContainer { + width: 100%; + } + .multiSelectOption { + width: 92%; + } + .multiSelectedOption { + width: 100% !important; + padding: 0 3px 0 10px !important; + } + &:hover { + .multiSelectedOption, .multiSelectOptionInputField { + cursor: pointer; + box-shadow: 0 0 5px white; + } + } + } +} + +.multiSelectorComponent { + width: 100%; + font-size: 14px; + position: relative; + @include setHeight(); + color: var(--selectorInverseFont); + .multiSelector { + @include flexed; + @include setHeight(); + .multiSelectOptionContainer { + padding: 0 1px; + @include flexed; + flex-wrap: nowrap; + flex-direction: row; + @include setHeight(); + @include noBorderNoOutline; + background: var(--selectorInverseBG); + border-radius: var(--borderRadius) !important; + + &:hover { + border-color: #177ddc; + } + + &.focused { + border-color: #177ddc; + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + } + + .multiSelectOption { + @include setHeight(); + .multiSelectedOption { + margin: 0px; + display: flex; + column-gap: 10px; + overflow: hidden; + line-height: 29px; + width: max-content; + flex-direction: row; + align-items: center; + @include setHeight(); + padding: 0 15px 0 10px; + box-sizing: content-box; + @include noBorderNoOutline; + color: var(--selectorMainFont); + background: var(--selectorMainBG); + + &.isFirst { + margin-right: 3px; + &.gridsIconRow { + border-top-left-radius: var(--borderRadius); + border-bottom-left-radius: var(--borderRadius); + } + } + + &.isMiddle { + margin-right: 3px; + } + + .selectedOptionIcon { + color: var(--selectorMainIcon); + } + } + } + .gridsIconButon { + .multiSelectedOption { + padding: 0 10px; + } + } + .multiSelectOptionInput { + border: 0; + margin: 0; + outline: 0; + flex-grow: 1; + @include setHeight(); + width: 100% !important; + box-sizing: border-box; + background-color: unset; + padding: 4px 6px 4px 15px; + max-width: 100% !important; + color: var(--selectorInverseFont); + background: var(--selectorInverseBG); + &.hasOptionsInput { + margin-right: 3px; + } + &.noOptionsInput { + border-top-left-radius: var(--borderRadius); + border-bottom-left-radius: var(--borderRadius); + } + &::placeholder { + opacity: 0.5; + } + } + .clearAllTagsIcon { + display: flex; + padding: 0 16px; + font-weight: 600; + align-items: center; + @include setHeight(); + justify-content: center; + background: var(--selectorMainBG); + color: var(--selectorMainIcon) !important; + border-top-right-radius: var(--borderRadius); + border-bottom-right-radius: var(--borderRadius); + } + } + } + .multiSelectorOptionsContainer { + z-index: 1; + padding: 0; + width: 80%; + grid-gap: 3px; + display: flex; + overflow: auto; + margin: 42px 0 0; + list-style: none; + position: absolute; + flex-direction: column; + backdrop-filter: blur(5px); + background: rgba(0, 0, 0, 0.7); + border-radius: var(--borderRadius); + box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15); + .multiSelectorOption { + width: 100%; + padding: 1px 0 1px 5px; + backdrop-filter: blur(5px); + color: var(--selectorMainFont); + background: var(--selectorMainBG); + + &:hover { + color: var(--selectorMainBG); + background: var(--selectorMainFont); + } + + &.isFirst { + border-top-left-radius: var(--borderRadius); + border-top-right-radius: var(--borderRadius); + } + + &.isLast { + border-bottom-left-radius: var(--borderRadius); + border-bottom-right-radius: var(--borderRadius); + } + + &[aria-selected="true"] { + font-weight: 600; + color: white !important; + background: var(--gameBlue) !important; + + &:hover { + filter: brightness(1.15); + } + + svg { + color: #1890ff; + } + + .listedOptionIcon { + color: var(--selectorInverseBG); + } + } + } + } +} + +select { + &.customSelect { + appearance: none; + -moz-appearance: none; + -webkit-appearance: none; + &::-ms-expand { + display: none; + } + } +} \ No newline at end of file diff --git a/components/selector/multi-selector.tsx b/components/selector/multi-selector.tsx new file mode 100644 index 0000000..7c2e14c --- /dev/null +++ b/components/selector/multi-selector.tsx @@ -0,0 +1,243 @@ +import { useState } from 'react'; +import { styled } from '@mui/material/styles'; +import { autocompleteClasses } from '@mui/material/Autocomplete'; +import { AutocompleteGetTagProps, useAutocomplete } from '@mui/material'; +import { GridTypes, Types } from '../../shared/types/types'; +import { isValid } from '../../shared/constants'; + +const InputWrapper = styled(`div`)( + ({ theme }) => ` + width: 100%; + + border: 1px solid ${theme.palette.mode === 'dark' ? '#434343' : '#d9d9d9'}; + + display: flex; + + &:hover { + border-color: ${theme.palette.mode === 'dark' ? '#177ddc' : '#40a9ff'}; + } + + &.focused { + border-color: ${theme.palette.mode === 'dark' ? '#177ddc' : '#40a9ff'}; + box-shadow: 0 0 0 2px rgba(24, 144, 255, 0.2); + } +`, +); + +interface TagProps extends ReturnType { + option: any; + label: string; + className: string; + isMultiSelect: boolean; +} + +const getGridIconOption = (option) => { + let gridTypeIcon = `gridTypeIcon`; + if (option?.type) { + if (option?.type == Types.Grid) { + let lockIcon = `fas fa-lock`; + let userIcon = `fas fa-user-alt`; + let shareIcon = `fas fa-share-alt`; + // let historyIcon = `fas fa-history`; + let globeIcon = `fas fa-globe-americas`; + let folderOpenIcon = `fas fa-folder-open`; + // let hourglassicon = `fas fa-hourglass-half`; + if (option?.gridType == GridTypes.Personal) gridTypeIcon = userIcon; + if (option?.gridType == GridTypes.Public) gridTypeIcon = globeIcon; + if (option?.gridType == GridTypes.Private) gridTypeIcon = lockIcon; + if (option?.gridType == GridTypes.Shared) gridTypeIcon = shareIcon; + if (option?.gridType == GridTypes.Archived) gridTypeIcon = folderOpenIcon; + } + } + return gridTypeIcon; +} + +function Tag(props: TagProps) { + const { option, label, onDelete, className, isMultiSelect, ...other } = props; + return ( +
+ + + {label} + + {isMultiSelect && } +
+ ); +} + +const StyledTag = styled(Tag)( + ({ theme }) => ` + &:focus { + border-color: ${theme.palette.mode === 'dark' ? '#177ddc' : '#40a9ff'}; + background-color: ${theme.palette.mode === 'dark' ? '#003b57' : '#e6f7ff'}; + } + + & i { + cursor: pointer; + } + + & svg { + font-size: 12px; + cursor: pointer; + padding: 4px; + } +`, +); + +const Listbox = styled(`ul`)( + ({ theme }) => ` + & li { + width: 100%; + display: flex; + margin: 0 auto; + padding: 5px 12px; + flex-direction: row; + transition: var(--transition); + + width: 100% + + & span { + flex-grow: 1; + min-width: fit-content; + } + + & svg { + color: transparent; + } + } + + & li.${autocompleteClasses.focused} { + background-color: ${theme.palette.mode === 'dark' ? '#003b57' : '#e6f7ff'}; + cursor: pointer; + + & svg { + color: currentColor; + } + } +`, +); + +export default function MultiSelector(props) { + let { + id, + options, + onChange, + defaultValue, + single = false, + showClearAll = true, + inputDisabled = false, + hostClass = `multiSelectorContainer`, + placeholder = `Start Typing or Click Here`, + } = props; + const [activeOptions, setActiveOptions] = useState(defaultValue || []); + + const onChangeValue = (val) => { + if (single) val = isValid(val) && val?.length > 0 ? [val[val.length - 1]] : []; + if (single && val?.length == 0) return; + setActiveOptions(val); + onChange(val); + } + + const { + value, + focused, + getTagProps, + setAnchorEl, + getRootProps, + getInputProps, + getClearProps, + getOptionProps, + groupedOptions, + getListboxProps, + } = useAutocomplete({ + options, + multiple: true, + value: activeOptions, + id: `${id}_multiselector`, + getOptionLabel: (option) => option?.label, + onChange: (e, val: any) => onChangeValue(val), + isOptionEqualToValue: (option: any, value: any) => option?.id === value.id, + }); + + const getActiveOptions = (opts, arrayOfOptions) => { + let activeOpts = arrayOfOptions?.length > 0 ? arrayOfOptions.filter(opti => opts.map(opt => opt?.name).includes(opti?.name)) : []; + return activeOpts; + } + + const multiSelectorAutoComplete = () => { + return ( +
+ { e?.preventDefault(); e?.stopPropagation(); } }} + {...inputDisabled && { onInput: (e) => { e?.preventDefault(); e?.stopPropagation(); } }} + {...inputDisabled && { onChange: (e) => { e?.preventDefault(); e?.stopPropagation(); } }} + {...inputDisabled && { onKeyDown: (e) => { e?.preventDefault(); e?.stopPropagation(); } }} + className={`multiSelectOptionInput selectHookInput ${activeOptions.length < 3 ? `` : `hiddenClickable`} ${activeOptions.length == 0 ? `noOptionsInput` : `hasOptionsInput`}`} + /> + {groupedOptions.length > 0 ? ( + + {groupedOptions.map((option, index) => { + let isFirst = index == 0; + let isLast = index == groupedOptions.length - 1; + return ( +
  • +
    + + + {option?.label} + + {/* {index + 1} */} +
    +
  • + )} + )} +
    + ) : null} + {(showClearAll && activeOptions.length > 0) && ( +
    + +
    + )} +
    + ) + } + + return ( +
    +
    + +
    +
    +
    + + + Active Grid{single ? `` : `s`} + +
    +
    +
    + {single ? multiSelectorAutoComplete() : <>} +
    + {getActiveOptions(activeOptions, value).map((option: any, index: number) => ( +
    + +
    + ))} +
    +
    +
    + {single ? <> : multiSelectorAutoComplete()} +
    +
    +
    + ); +} \ No newline at end of file diff --git a/components/selector/selector.tsx b/components/selector/selector.tsx new file mode 100644 index 0000000..84bb707 --- /dev/null +++ b/components/selector/selector.tsx @@ -0,0 +1,30 @@ +export default function Selector(props) { + let { + id, + name, + title, + className, + defaultValue, + arrayOfOptions, + onChange = () => {}, + style = { paddingLeft: 15, paddingRight: 15, minHeight: 35, borderRadius: `var(--borderRadius)`, background: `var(--blackGlass)` }, + } = props; + + const onValueUpdates = (value) => onChange(value); + + return ( +
    + +
    + ) +} \ No newline at end of file diff --git a/components/title.tsx b/components/title.tsx index 0e5aca3..afd56e1 100644 --- a/components/title.tsx +++ b/components/title.tsx @@ -1,19 +1,28 @@ export default function Title(props) { + let { id, left, middle, itemID, item, right, className, buttonFunction } = props; return <> -
    +
    -

    {props.left}

    +

    + {left} +

    -

    {props.middle}

    +

    + {middle} +

    -

    {props.right}

    +

    + {right} +

    -
    diff --git a/firebase.ts b/firebase.ts index be55425..70a7fad 100644 --- a/firebase.ts +++ b/firebase.ts @@ -13,6 +13,7 @@ export enum Environments { export enum Tables { users = `users`, items = `items`, + lists = `lists`, tasks = `tasks`, grids = `grids`, counts = `counts`, @@ -43,10 +44,16 @@ const firebaseApp = initializeApp(firebaseConfig); export const db = getFirestore(firebaseApp); export const auth = getAuth(firebaseApp); +export const environment = Environments.production; export const isProduction = process.env.NODE_ENV == `production`; -export const environment = isProduction ? Environments.alpha : Environments.alpha; +// export const environment = isProduction ? Environments.alpha : Environments.beta; export const usersTable = environment + Tables.users; +export const gridsTable = environment + Tables.grids; +export const boardsTable = environment + Tables.boards; +export const listsTable = environment + Tables.lists; +export const itemsTable = environment + Tables.items; +export const tasksTable = environment + Tables.tasks; export const userConverter = { toFirestore: (usr: User) => { diff --git a/main.scss b/main.scss index f1ad6fa..a07932a 100644 --- a/main.scss +++ b/main.scss @@ -1,9 +1,14 @@ +@use './styles/mui'; @use './styles/toast'; @use './styles/image'; +@use './styles/grids'; @use './styles/utility'; @use './styles/columns'; @use './styles/contextmenu'; @use './styles/itemsoverwrite'; +@use './styles/finaloverwrite'; +@use './components/boards/kanban/kanban'; +@use './components/selector/multiselector'; /* Montserrat */ @import url("https://fonts.googleapis.com/css2?family=Montserrat:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,100;1,200;1,300;1,400;1,500;1,600;1,700;1,800;1,900&display=swap"); @@ -39,10 +44,12 @@ --lightNavAndFooterBG: var(--lightBG); --darkNavAndFooterBG: var(--piratechsBlue); --navAndFooterBG: var(--darkNavAndFooterBG); + --darkInputLightBG: rgba(249, 250, 251, .1); --bg: #010000; --posterH: 250px; --posterW: 165px; + --buttonSize: 35px; --steel: #7a7a7a; --react: #0fccce; --grass: #00b900; @@ -54,6 +61,7 @@ --secondary: #3c3c3c; --piratechs: #2b4261; --softBlack2: #636363; + --authFormFontSize: 14px; --piratechsDark: #10141d; --main: rgb(0, 216, 255); --nextraColor: var(--nextra); @@ -336,23 +344,17 @@ html[class~=dark] .dark\:nx-text-neutral-500, html[class~=dark] .dark\:nx-text-g padding: 0em; } -.authForm { - input { - border-radius: 8px !important; - } -} - .dark { .authForm { input { - background: rgba(249, 250, 251, .1) !important; + background: var(--darkInputLightBG) !important; } } } .boardsZeroState { width: 100%; - padding: 35px; + padding: var(--buttonSize); display: flex; font-size: 16px; color: silver; @@ -364,7 +366,7 @@ html[class~=dark] .dark\:nx-text-neutral-500, html[class~=dark] .dark\:nx-text-g } .addForm { - max-height: 35px; + max-height: var(--buttonSize); position: relative; border-radius: var(--borderRadius); .inputGroup { @@ -415,8 +417,8 @@ html[class~=dark] .dark\:nx-text-neutral-500, html[class~=dark] .dark\:nx-text-g } &.addBoardForm { input { - border-top-right-radius: 8px; - border-bottom-right-radius: 8px; + border-top-right-radius: var(--borderRadius); + border-bottom-right-radius: var(--borderRadius); } } &.addItemForm { @@ -447,10 +449,10 @@ html[class~=dark] .dark\:nx-text-neutral-500, html[class~=dark] .dark\:nx-text-g top: 0; left: 0; z-index: 1; - width: 35px; + width: var(--buttonSize); height: 100%; display: flex; - font-size: 35px; + font-size: var(--buttonSize); cursor: pointer; min-height: 33px; max-height: 33px; @@ -462,7 +464,7 @@ html[class~=dark] .dark\:nx-text-neutral-500, html[class~=dark] .dark\:nx-text-g border-top-left-radius: 4px; transition: var(--transition); border-bottom-left-radius: 4px; - &:not(.menuTypeIcon) { + &:not(.menuTypeIcon):not(.gridTypeIconButton) { position: absolute; } span { @@ -485,9 +487,9 @@ html[class~=dark] .dark\:nx-text-neutral-500, html[class~=dark] .dark\:nx-text-g } .formItems { - height: 35px; - min-height: 35px; - max-height: 35px; + height: var(--buttonSize); + min-height: var(--buttonSize); + max-height: var(--buttonSize); form { &.addListForm { &::before { @@ -914,6 +916,9 @@ section { max-height: 33px !important; padding: 10.5px 25px !important; background: var(--gameBlueSoft) !important; + &[name="authFormSubmit"] { + font-weight: 500; + } &:hover { color: black !important; background: white !important; @@ -943,25 +948,13 @@ section { ::-webkit-scrollbar { position: relative; - width: 4px !important; - background: black !important; + width: 1px !important; border-radius: var(--borderRadius); + background: var(--gameBlue) !important; } ::-webkit-scrollbar-thumb { - background: var(--gameBlue); - border-radius: var(--borderRadius); -} - -::-webkit-scrollbar { - position: relative; - width: 4px !important; - border-radius: var(--borderRadius); - background: var(--blackGlass) !important; -} - -::-webkit-scrollbar-thumb { - background: var(--softWhite); + background: var(--navAndFooterBG); border-radius: var(--borderRadius); } @@ -1000,7 +993,6 @@ form { } } input, textarea { - font-size: 12px; font-weight: 400; padding: 10px 15px; outline: none !important; @@ -1008,6 +1000,7 @@ form { font-family: "Montserrat"; max-height: 33px !important; transition: var(--transition); + font-size: var(--authFormFontSize); border-radius: var(--borderRadius); background: var(--blackGlass) !important; // box-shadow: 0 0 10px var(--gameBlueSoft),0 0 20px var(--gameBlueSoft); @@ -1482,7 +1475,7 @@ textarea { color: var(--gameBlue); right: 15px; top: 15px; - width: 35px; + width: var(--buttonSize); display: flex; justify-content: center; align-items: center; @@ -1557,22 +1550,18 @@ textarea { grid-gap: 1em; display: flex; flex-direction: row; - // flex-direction: column; .addListFormItemSection { padding: 0; max-width: 100%; .addListForm { - // display: grid; + grid-gap: 10px; overflow: hidden; - // display: flex; align-items: center; padding: 0 !important; width: 100% !important; - // flex-direction: row; max-width: 100% !important; - border-radius: var(--borderRadius) !important; - // grid-template-columns: 75% 25%; justify-content: space-between; + border-radius: var(--borderRadius) !important; .submit { border: 0 !important; &:hover { @@ -1583,6 +1572,10 @@ textarea { } } +.addListDiv { + width: 100%; +} + .lists { display: grid; margin: 0 auto; @@ -1619,10 +1612,7 @@ textarea { .list { position: relative; - width: 100% !important; padding: 10px !important; - min-width: 100% !important; - // max-height: 550px !important; border-radius: var(--borderRadius); background: var(--gameBlueSoft) !important; @@ -1705,7 +1695,7 @@ textarea { display: flex; grid-gap: 0px; font-size: 0.8em; - min-height: 35px; + min-height: var(--buttonSize); position: relative; align-items: center; padding: 0em !important; @@ -1743,7 +1733,7 @@ textarea { &:hover { .itemRow { - background: linear-gradient(90deg, var(--whiteGlass) 35px, var(--blackGlass) 35px); + background: linear-gradient(90deg, var(--whiteGlass) var(--buttonSize), var(--blackGlass) var(--buttonSize)); img { filter: invert(1); } @@ -1920,8 +1910,8 @@ textarea { } .subTaskElement { grid-gap: 0; - margin: 0 0 0 35px; - width: calc(100% - 35px); + margin: 0 0 0 var(--buttonSize); + width: calc(100% - var(--buttonSize)); background: transparent !important; box-shadow: inset 0px 0px 5px rgba(0, 0, 0, 0.2); @@ -1944,9 +1934,9 @@ textarea { border-bottom-right-radius: var(--borderRadius); } .subTaskItem { - background: linear-gradient(90deg, var(--whiteGlass) 35px, var(--blackGlass) 35px); + background: linear-gradient(90deg, var(--whiteGlass) var(--buttonSize), var(--blackGlass) var(--buttonSize)); &.complete { - background: linear-gradient(90deg, var(--blackGlass) 35px, var(--whiteGlass) 35px); + background: linear-gradient(90deg, var(--blackGlass) var(--buttonSize), var(--whiteGlass) var(--buttonSize)); .taskDate { color: var(--dark); } @@ -1964,7 +1954,7 @@ textarea { margin: 5px 15px 5px 0 !important; } &:hover { - background: linear-gradient(90deg, var(--blackGlass) 35px, var(--whiteGlass) 35px); + background: linear-gradient(90deg, var(--blackGlass) var(--buttonSize), var(--whiteGlass) var(--buttonSize)); .subtaskActions { input[type="checkbox"] { filter: invert(1); @@ -2245,7 +2235,7 @@ textarea { padding: 0; width: 100%; display: flex; - min-height: 35px; + min-height: var(--buttonSize); font-size: 0.75em; align-items: center; font-weight: 700 !important; @@ -2277,7 +2267,7 @@ textarea { } footer { - height: 40px; + height: 68px; display: flex; grid-gap: 10px; flex-wrap: wrap; @@ -2285,6 +2275,10 @@ footer { justify-content: space-between; background: var(--navAndFooterBG); + @media (max-width: 1369px) { + height: 58px; + } + .hoverLink { &::before { bottom: -5px; @@ -2439,7 +2433,7 @@ footer { .innerRow { padding: 0; .listOrder { - max-width: 35px !important; + max-width: var(--buttonSize) !important; min-width: max-content; padding: 9px 0; } @@ -2487,43 +2481,27 @@ footer { margin: -8px 0; max-height: 0px; pointer-events: none; - // animation: fadeOutThenRemove 0.24s ease-in-out; - // * { - // opacity: 0; - // max-height: 0px; - // pointer-events: none; - // } - } -} - -// @keyframes fadeOutThenRemove { -// 0% { -// display: flex; -// } -// 99% { -// opacity: 0.1; -// } -// 100% { -// opacity: 0; -// display: none; -// } -// } + } +} .board { width: 100%; display: flex; font-size: 1.05em; align-items: flex-start; - // &.clipColumns { - // .column { - // &.dragging { - // max-width: 1% !important; - // } - // } - // } &.overflowingBoard { &.moreBoard { overflow-x: scroll; + padding-bottom: 15px; + + &::-webkit-scrollbar { + height: 7px !important; + background: black !important; + } + + &::-webkit-scrollbar-thumb { + background: var(--gameBlueSoft); + } } *:not(.dragging) { @media (max-width: 1390px) and (min-width: 933px) { @@ -2537,15 +2515,17 @@ footer { &.dragging { max-width: 25px !important; } - // user-select: none; + --columnWidth: 32.35% !important; min-height: 455px; position: relative; align-items: center; padding: 10px !important; grid-gap: 10px !important; - min-width: 32.25% !important; justify-content: space-between; border-radius: var(--borderRadius); + width: var(--columnWidth) !important; + max-width: var(--columnWidth) !important; + min-width: var(--columnWidth) !important; background: var(--gameBlueSoft) !important; box-shadow: inset 0px 0px 5px rgba(0, 0, 0, 0.2); box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.1), 0px 0px 20px rgba(0, 0, 0, 0.05); @@ -2576,10 +2556,10 @@ footer { } } .listOrder { - width: 35px; + width: var(--buttonSize); padding: 9px 0; - min-width: 35px; - max-width: 35px; + min-width: var(--buttonSize); + max-width: var(--buttonSize); min-height: 33px !important; max-height: 33px !important; } @@ -2605,7 +2585,7 @@ footer { min-height: min-content; background: transparent !important; .itemRow { - background: linear-gradient(90deg, var(--whiteGlass) 35px, var(--blackGlass) 35px); + background: linear-gradient(90deg, var(--whiteGlass) var(--buttonSize), var(--blackGlass) var(--buttonSize)); } .itemDate { font-size: 9px; @@ -2644,7 +2624,7 @@ footer { &.hasTasksRow { border-bottom-right-radius: 0 !important; } - background: linear-gradient(90deg, var(--whiteGlass) 35px, var(--blackGlass) 35px) !important; + background: linear-gradient(90deg, var(--whiteGlass) var(--buttonSize), var(--blackGlass) var(--buttonSize)) !important; } .subtaskAddForm { display: none; @@ -2668,9 +2648,9 @@ footer { } } .itemOrder { - width: 35px; - min-width: 35px; - max-width: 35px; + width: var(--buttonSize); + min-width: var(--buttonSize); + max-width: var(--buttonSize); background: transparent; } .itemContents { @@ -2725,7 +2705,7 @@ footer { max-height: 33px !important; } &::before { - width: 35px; + width: var(--buttonSize); } } } @@ -2903,7 +2883,7 @@ footer { content: attr(data-index); position: absolute; height: 100%; - width: 35px; + width: var(--buttonSize); left: 0; top: 0; font-weight: 600; diff --git a/package-lock.json b/package-lock.json index 6ccdfb8..d901252 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,10 @@ "@dnd-kit/core": "^6.3.1", "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@mui/icons-material": "^6.4.4", + "@mui/material": "^6.4.4", "ag-grid-react": "^29.1.0", "antd": "^5.2.1", "firebase": "^9.23.0", @@ -104,12 +108,134 @@ "react": ">=16.9.0" } }, + "node_modules/@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/generator": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz", + "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.26.8", + "@babel/types": "^7.26.8", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", + "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.26.8" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, "node_modules/@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", + "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz", + "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.8", + "@babel/types": "^7.26.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz", + "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==", + "license": "MIT", "dependencies": { - "regenerator-runtime": "^0.13.11" + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.8", + "@babel/parser": "^7.26.8", + "@babel/template": "^7.26.8", + "@babel/types": "^7.26.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", + "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" }, "engines": { "node": ">=6.9.0" @@ -190,6 +316,77 @@ "react": ">=16.8.0" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "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.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin/node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin/node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache/node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, "node_modules/@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", @@ -210,11 +407,131 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", "optional": true }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/serialize/node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/serialize/node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/serialize/node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz", + "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/styled/node_modules/@emotion/is-prop-valid": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/styled/node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, "node_modules/@emotion/unitless": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, "node_modules/@firebase/analytics": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", @@ -883,6 +1200,54 @@ "react-dom": "^16 || ^17 || ^18" } }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "node_modules/@mdx-js/mdx": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.3.0.tgz", @@ -985,6 +1350,275 @@ "tslib": "^2.3.1" } }, + "node_modules/@mui/core-downloads-tracker": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.4.tgz", + "integrity": "sha512-r+J0EditrekkTtO2CnCBCOGpNaDYwJqz8lH4rj6o/anDcskZFJodBlG8aCJkS8DL/CF/9EHS+Gz53EbmYEnQbw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.4.tgz", + "integrity": "sha512-uF1chGaoFmYdRUomK6f8kgJfWosk9A3HXWiVD0vQm+2mE7f25eTQ1E8RRO11LXpnUBqu8Rbv/uGlpnjT/u1Ksg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^6.4.4", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.4.tgz", + "integrity": "sha512-ISVPrIsPQsxnwvS40C4u03AuNSPigFeS2+n1qpuEZ94hDsdMi19dQM2JcC9CHEhXecSIQjP1RTyY0mPiSpSrFQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/core-downloads-tracker": "^6.4.4", + "@mui/system": "^6.4.3", + "@mui/types": "^7.2.21", + "@mui/utils": "^6.4.3", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.0.0", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^6.4.3", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz", + "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==", + "license": "MIT" + }, + "node_modules/@mui/private-theming": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.4.3.tgz", + "integrity": "sha512-7x9HaNwDCeoERc4BoEWLieuzKzXu5ZrhRnEM6AUcRXUScQLvF1NFkTlP59+IJfTbEMgcGg1wWHApyoqcksrBpQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/utils": "^6.4.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.3.tgz", + "integrity": "sha512-OC402VfK+ra2+f12Gef8maY7Y9n7B6CZcoQ9u7mIkh/7PKwW/xH81xwX+yW+Ak1zBT3HYcVjh2X82k5cKMFGoQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.3.tgz", + "integrity": "sha512-Q0iDwnH3+xoxQ0pqVbt8hFdzhq1g2XzzR4Y5pVcICTNtoCLJmpJS3vI4y/OIM1FHFmpfmiEC2IRIq7YcZ8nsmg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/private-theming": "^6.4.3", + "@mui/styled-engine": "^6.4.3", + "@mui/types": "^7.2.21", + "@mui/utils": "^6.4.3", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/system/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/types": { + "version": "7.2.21", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.21.tgz", + "integrity": "sha512-6HstngiUxNqLU+/DPqlUJDIPbzUBxIVHb1MmXP0eTWDIROiCR2viugXpEif0PPe2mLqqakPzzRClWAnK+8UJww==", + "license": "MIT", + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.4.3.tgz", + "integrity": "sha512-jxHRHh3BqVXE9ABxDm+Tc3wlBooYz/4XPa0+4AI+iF38rV1/+btJmSUgG4shDtSWVs/I97aDn5jBCt6SF2Uq2A==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.26.0", + "@mui/types": "^7.2.21", + "@types/prop-types": "^15.7.14", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils/node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz", + "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==", + "license": "MIT" + }, "node_modules/@napi-rs/simple-git": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.8.tgz", @@ -1376,9 +2010,10 @@ } }, "node_modules/@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==", + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", "funding": { "type": "opencollective", "url": "https://opencollective.com/popperjs" @@ -1642,10 +2277,17 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==" }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, "node_modules/@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==", + "license": "MIT" }, "node_modules/@types/react": { "version": "18.0.27", @@ -1668,6 +2310,15 @@ "redux": "^4.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==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, "node_modules/@types/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", @@ -1872,6 +2523,21 @@ "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" }, + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, "node_modules/bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -1916,6 +2582,15 @@ "node": ">=8" } }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, "node_modules/caniuse-lite": { "version": "1.0.30001690", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", @@ -2110,6 +2785,12 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, "node_modules/copy-to-clipboard": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", @@ -2118,6 +2799,22 @@ "toggle-selection": "^1.0.6" } }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", @@ -2137,9 +2834,10 @@ } }, "node_modules/csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", + "license": "MIT" }, "node_modules/dayjs": { "version": "1.11.7", @@ -2205,12 +2903,31 @@ "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" }, + "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==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", "license": "MIT" }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2385,6 +3102,12 @@ "node": ">=8" } }, + "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==", + "license": "MIT" + }, "node_modules/firebase": { "version": "9.23.0", "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.23.0.tgz", @@ -2459,6 +3182,15 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2509,6 +3241,15 @@ "node": ">= 6" } }, + "node_modules/globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -2552,6 +3293,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/hast-util-from-parse5": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.1.tgz", @@ -2702,6 +3455,22 @@ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==" }, + "node_modules/import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/inline-style-parser": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", @@ -2734,6 +3503,12 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, "node_modules/is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -2767,6 +3542,21 @@ "node": ">=4" } }, + "node_modules/is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", @@ -2902,6 +3692,24 @@ "js-yaml": "bin/js-yaml.js" } }, + "node_modules/jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, "node_modules/json2mq": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", @@ -2946,6 +3754,12 @@ "node": ">=6" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, "node_modules/lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -4361,6 +5175,18 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, "node_modules/parse-entities": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", @@ -4376,8 +5202,26 @@ "is-hexadecimal": "^2.0.0" }, "funding": { - "type": "github", - "url": "https://github.com/sponsors/wooorm" + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/parse-numeric-range": { @@ -4414,6 +5258,21 @@ "node": ">=4" } }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", + "license": "MIT" + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/periscopic": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", @@ -5289,6 +6148,22 @@ "node": ">=6" } }, + "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==", + "license": "BSD-3-Clause", + "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/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -5314,9 +6189,10 @@ } }, "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", + "license": "MIT" }, "node_modules/rehype-katex": { "version": "6.0.2", @@ -5523,6 +6399,35 @@ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, + "node_modules/resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/sade": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", @@ -5816,9 +6721,10 @@ } }, "node_modules/stylis": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", - "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" }, "node_modules/supports-color": { "version": "4.5.0", @@ -5831,6 +6737,18 @@ "node": ">=4" } }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/swapy": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/swapy/-/swapy-1.0.5.tgz", @@ -6338,6 +7256,15 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", @@ -6446,12 +7373,94 @@ "throttle-debounce": "^5.0.0" } }, + "@babel/code-frame": { + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", + "requires": { + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + } + }, + "@babel/generator": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.8.tgz", + "integrity": "sha512-ef383X5++iZHWAXX0SXQR6ZyQhw/0KtTkrTz61WXRhFM6dhpHulO/RJz79L8S6ugZHJkOOkUrUdxgdF2YiPFnA==", + "requires": { + "@babel/parser": "^7.26.8", + "@babel/types": "^7.26.8", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^3.0.2" + } + }, + "@babel/helper-module-imports": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.25.9.tgz", + "integrity": "sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==", + "requires": { + "@babel/traverse": "^7.25.9", + "@babel/types": "^7.25.9" + } + }, + "@babel/helper-string-parser": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==" + }, + "@babel/helper-validator-identifier": { + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==" + }, + "@babel/parser": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.8.tgz", + "integrity": "sha512-TZIQ25pkSoaKEYYaHbbxkfL36GNsQ6iFiBbeuzAkLnXayKR1yP1zFe+NxuZWWsUyvt8icPU9CCq0sgWGXR1GEw==", + "requires": { + "@babel/types": "^7.26.8" + } + }, "@babel/runtime": { - "version": "7.20.13", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.20.13.tgz", - "integrity": "sha512-gt3PKXs0DBoL9xCvOIIZ2NEqAGZqHjAnmVbfQtB620V0uReIQutpel14KcneZuer7UioY8ALKZ7iocavvzTNFA==", + "version": "7.26.7", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.7.tgz", + "integrity": "sha512-AOPI3D+a8dXnja+iwsUqGRjr1BbZIe771sXdapOtYI531gSqpi92vXivKcq2asu/DFpdl1ceFAKZyRzK2PCVcQ==", + "requires": { + "regenerator-runtime": "^0.14.0" + } + }, + "@babel/template": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.26.8.tgz", + "integrity": "sha512-iNKaX3ZebKIsCvJ+0jd6embf+Aulaa3vNBqZ41kM7iTWjx5qzWKXGHiJUW3+nTpQ18SG11hdF8OAzKrpXkb96Q==", + "requires": { + "@babel/code-frame": "^7.26.2", + "@babel/parser": "^7.26.8", + "@babel/types": "^7.26.8" + } + }, + "@babel/traverse": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.8.tgz", + "integrity": "sha512-nic9tRkjYH0oB2dzr/JoGIm+4Q6SuYeLEiIiZDwBscRMYFJ+tMAz98fuel9ZnbXViA2I0HVSSRRK8DW5fjXStA==", "requires": { - "regenerator-runtime": "^0.13.11" + "@babel/code-frame": "^7.26.2", + "@babel/generator": "^7.26.8", + "@babel/parser": "^7.26.8", + "@babel/template": "^7.26.8", + "@babel/types": "^7.26.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + } + }, + "@babel/types": { + "version": "7.26.8", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.8.tgz", + "integrity": "sha512-eUuWapzEGWFEpHFxgEaBG8e3n6S8L3MSu0oda755rOfabWPnh0Our1AozNFVUxGFIhbKgd1ksprsoDGMinTOTA==", + "requires": { + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" } }, "@ctrl/tinycolor": { @@ -6503,6 +7512,65 @@ "tslib": "^2.0.0" } }, + "@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "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.2.0" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" + }, + "@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + }, + "escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + } + } + }, + "@emotion/cache": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "requires": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + }, + "dependencies": { + "@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + } + } + }, "@emotion/hash": { "version": "0.8.0", "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.8.0.tgz", @@ -6523,11 +7591,104 @@ "integrity": "sha512-Ja/Vfqe3HpuzRsG1oBtWTHk2PGZ7GR+2Vz5iYGelAw8dx32K0y7PjVuxK6z1nMpZOqAFsRUPCkK1YjJ56qJlgw==", "optional": true }, + "@emotion/react": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "requires": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + }, + "dependencies": { + "@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==" + }, + "@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + }, + "@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==" + } + } + }, + "@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==" + }, + "@emotion/styled": { + "version": "11.14.0", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.0.tgz", + "integrity": "sha512-XxfOnXFffatap2IyCeJyNov3kiDQWoR08gPUQxvbL7fxKryGBKUZUkG6Hz48DZwVrJSVh9sJboyV1Ds4OW6SgA==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "dependencies": { + "@emotion/is-prop-valid": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/@emotion/is-prop-valid/-/is-prop-valid-1.3.1.tgz", + "integrity": "sha512-/ACwoqx7XQi9knQs/G0qKvv5teDMhD7bXYns9N/wM8ah8iNb8jZ2uNO0YOgiq2o2poIvVtJS2YALasQuMSQ7Kw==", + "requires": { + "@emotion/memoize": "^0.9.0" + } + }, + "@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==" + } + } + }, "@emotion/unitless": { "version": "0.7.5", "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.7.5.tgz", "integrity": "sha512-OWORNpfjMsSSUBVrRBVGECkhWcULOAJz9ZW8uK9qgxD+87M7jHRcvh/A96XXNhXTLmKcoYSQtBEX7lHMO7YRwg==" }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==" + }, + "@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==" + }, "@firebase/analytics": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/@firebase/analytics/-/analytics-0.10.0.tgz", @@ -7041,6 +8202,40 @@ "client-only": "^0.0.1" } }, + "@jridgewell/gen-mapping": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", + "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", + "requires": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + } + }, + "@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==" + }, + "@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==" + }, + "@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", + "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==" + }, + "@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "requires": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, "@mdx-js/mdx": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/@mdx-js/mdx/-/mdx-2.3.0.tgz", @@ -7132,6 +8327,126 @@ "tslib": "^2.3.1" } }, + "@mui/core-downloads-tracker": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-6.4.4.tgz", + "integrity": "sha512-r+J0EditrekkTtO2CnCBCOGpNaDYwJqz8lH4rj6o/anDcskZFJodBlG8aCJkS8DL/CF/9EHS+Gz53EbmYEnQbw==" + }, + "@mui/icons-material": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/@mui/icons-material/-/icons-material-6.4.4.tgz", + "integrity": "sha512-uF1chGaoFmYdRUomK6f8kgJfWosk9A3HXWiVD0vQm+2mE7f25eTQ1E8RRO11LXpnUBqu8Rbv/uGlpnjT/u1Ksg==", + "requires": { + "@babel/runtime": "^7.26.0" + } + }, + "@mui/material": { + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-6.4.4.tgz", + "integrity": "sha512-ISVPrIsPQsxnwvS40C4u03AuNSPigFeS2+n1qpuEZ94hDsdMi19dQM2JcC9CHEhXecSIQjP1RTyY0mPiSpSrFQ==", + "requires": { + "@babel/runtime": "^7.26.0", + "@mui/core-downloads-tracker": "^6.4.4", + "@mui/system": "^6.4.3", + "@mui/types": "^7.2.21", + "@mui/utils": "^6.4.3", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1", + "react-is": "^19.0.0", + "react-transition-group": "^4.4.5" + }, + "dependencies": { + "clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" + }, + "react-is": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz", + "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==" + } + } + }, + "@mui/private-theming": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-6.4.3.tgz", + "integrity": "sha512-7x9HaNwDCeoERc4BoEWLieuzKzXu5ZrhRnEM6AUcRXUScQLvF1NFkTlP59+IJfTbEMgcGg1wWHApyoqcksrBpQ==", + "requires": { + "@babel/runtime": "^7.26.0", + "@mui/utils": "^6.4.3", + "prop-types": "^15.8.1" + } + }, + "@mui/styled-engine": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-6.4.3.tgz", + "integrity": "sha512-OC402VfK+ra2+f12Gef8maY7Y9n7B6CZcoQ9u7mIkh/7PKwW/xH81xwX+yW+Ak1zBT3HYcVjh2X82k5cKMFGoQ==", + "requires": { + "@babel/runtime": "^7.26.0", + "@emotion/cache": "^11.13.5", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + } + }, + "@mui/system": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-6.4.3.tgz", + "integrity": "sha512-Q0iDwnH3+xoxQ0pqVbt8hFdzhq1g2XzzR4Y5pVcICTNtoCLJmpJS3vI4y/OIM1FHFmpfmiEC2IRIq7YcZ8nsmg==", + "requires": { + "@babel/runtime": "^7.26.0", + "@mui/private-theming": "^6.4.3", + "@mui/styled-engine": "^6.4.3", + "@mui/types": "^7.2.21", + "@mui/utils": "^6.4.3", + "clsx": "^2.1.1", + "csstype": "^3.1.3", + "prop-types": "^15.8.1" + }, + "dependencies": { + "clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" + } + } + }, + "@mui/types": { + "version": "7.2.21", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.21.tgz", + "integrity": "sha512-6HstngiUxNqLU+/DPqlUJDIPbzUBxIVHb1MmXP0eTWDIROiCR2viugXpEif0PPe2mLqqakPzzRClWAnK+8UJww==", + "requires": {} + }, + "@mui/utils": { + "version": "6.4.3", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-6.4.3.tgz", + "integrity": "sha512-jxHRHh3BqVXE9ABxDm+Tc3wlBooYz/4XPa0+4AI+iF38rV1/+btJmSUgG4shDtSWVs/I97aDn5jBCt6SF2Uq2A==", + "requires": { + "@babel/runtime": "^7.26.0", + "@mui/types": "^7.2.21", + "@types/prop-types": "^15.7.14", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.0.0" + }, + "dependencies": { + "clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==" + }, + "react-is": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-19.0.0.tgz", + "integrity": "sha512-H91OHcwjZsbq3ClIDHMzBShc1rotbfACdWENsmEf0IFvZ3FgGPtdHMcsv45bQ1hAbgdfiA8SnxTKfDS+x/8m2g==" + } + } + }, "@napi-rs/simple-git": { "version": "0.1.8", "resolved": "https://registry.npmjs.org/@napi-rs/simple-git/-/simple-git-0.1.8.tgz", @@ -7300,9 +8615,9 @@ "optional": true }, "@popperjs/core": { - "version": "2.11.6", - "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.6.tgz", - "integrity": "sha512-50/17A98tWUfQ176raKiOGXuYpLyyVMkxxG6oylzL3BPOlA6ADGdK7EYunSa4I064xerltq9TGXs8HmOk5E+vw==" + "version": "2.11.8", + "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==" }, "@protobufjs/aspromise": { "version": "1.1.2", @@ -7523,10 +8838,15 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.10.tgz", "integrity": "sha512-juG3RWMBOqcOuXC643OAdSA525V44cVgGV6dUDuiFtss+8Fk5x1hI93Rsld43VeJVIeqlP9I7Fn9/qaVqoEAuQ==" }, + "@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, "@types/prop-types": { - "version": "15.7.5", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.5.tgz", - "integrity": "sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==" + "version": "15.7.14", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.14.tgz", + "integrity": "sha512-gNMvNH49DJ7OJYv+KAKn0Xp45p8PLl6zo2YnvDIbTd4J6MER2BmWN49TG7n9LvkyihINxeKW8+3bfS2yDC9dzQ==" }, "@types/react": { "version": "18.0.27", @@ -7549,6 +8869,12 @@ "redux": "^4.0.0" } }, + "@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/scheduler": { "version": "0.16.2", "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.2.tgz", @@ -7705,6 +9031,16 @@ "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==" }, + "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==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + } + }, "bail": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/bail/-/bail-2.0.2.tgz", @@ -7739,6 +9075,11 @@ "fill-range": "^7.0.1" } }, + "callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==" + }, "caniuse-lite": { "version": "1.0.30001690", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", @@ -7869,6 +9210,11 @@ "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", "dev": true }, + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, "copy-to-clipboard": { "version": "3.3.3", "resolved": "https://registry.npmjs.org/copy-to-clipboard/-/copy-to-clipboard-3.3.3.tgz", @@ -7877,6 +9223,18 @@ "toggle-selection": "^1.0.6" } }, + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", @@ -7896,9 +9254,9 @@ } }, "csstype": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.1.tgz", - "integrity": "sha512-DJR/VvkAvSZW9bTouZue2sSxDwdTN92uHjqeKVm+0dAqdfNykRzQ95tay8aXMBAAPpUiq4Qcug2L7neoRh2Egw==" + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", + "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, "dayjs": { "version": "1.11.7", @@ -7946,11 +9304,28 @@ "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==" }, + "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" + } + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, + "error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "requires": { + "is-arrayish": "^0.2.1" + } + }, "escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -8072,6 +9447,11 @@ "to-regex-range": "^5.0.1" } }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "firebase": { "version": "9.23.0", "resolved": "https://registry.npmjs.org/firebase/-/firebase-9.23.0.tgz", @@ -8132,6 +9512,11 @@ "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", "optional": true }, + "function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==" + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -8172,6 +9557,11 @@ "is-glob": "^4.0.1" } }, + "globals": { + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==" + }, "graceful-fs": { "version": "4.2.10", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", @@ -8203,6 +9593,14 @@ "type-fest": "^1.0.2" } }, + "hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "requires": { + "function-bind": "^1.1.2" + } + }, "hast-util-from-parse5": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/hast-util-from-parse5/-/hast-util-from-parse5-7.1.1.tgz", @@ -8323,6 +9721,15 @@ "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.2.4.tgz", "integrity": "sha512-WDxL3Hheb1JkRN3sQkyujNlL/xRjAo3rJtaU5xeufUauG66JdMr32bLj4gF+vWl84DIA3Zxw7tiAjneYzRRw+w==" }, + "import-fresh": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", + "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", + "requires": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + } + }, "inline-style-parser": { "version": "0.1.1", "resolved": "https://registry.npmjs.org/inline-style-parser/-/inline-style-parser-0.1.1.tgz", @@ -8347,6 +9754,11 @@ "is-decimal": "^2.0.0" } }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==" + }, "is-binary-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", @@ -8360,6 +9772,14 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" }, + "is-core-module": { + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.16.1.tgz", + "integrity": "sha512-UfoeMA6fIJ8wTYFEUjelnaGI67v6+N7qXJEvQuIGa99l4xsCruSYOVSQ0uPANn4dAzm8lkYPaKLrrijLq7x23w==", + "requires": { + "hasown": "^2.0.2" + } + }, "is-decimal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-decimal/-/is-decimal-2.0.1.tgz", @@ -8453,6 +9873,16 @@ "esprima": "^4.0.0" } }, + "jsesc": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", + "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==" + }, + "json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" + }, "json2mq": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/json2mq/-/json2mq-0.2.0.tgz", @@ -8484,6 +9914,11 @@ "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==" }, + "lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, "lodash.camelcase": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz", @@ -9401,6 +10836,14 @@ "yocto-queue": "^0.1.0" } }, + "parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "requires": { + "callsites": "^3.0.0" + } + }, "parse-entities": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/parse-entities/-/parse-entities-4.0.1.tgz", @@ -9416,6 +10859,17 @@ "is-hexadecimal": "^2.0.0" } }, + "parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "requires": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + } + }, "parse-numeric-range": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/parse-numeric-range/-/parse-numeric-range-1.3.0.tgz", @@ -9447,6 +10901,16 @@ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha512-fEHGKCSmUSDPv4uoj8AlD+joPlq3peND+HRYyxFz4KPw4z926S/b8rIuFs2FYJg3BwsxJf6A9/3eIdLaYC+9Dw==" }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==" + }, "periscopic": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", @@ -10048,6 +11512,17 @@ } } }, + "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" + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -10070,9 +11545,9 @@ } }, "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "rehype-katex": { "version": "6.0.2", @@ -10226,6 +11701,21 @@ "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==" }, + "resolve": { + "version": "1.22.10", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.10.tgz", + "integrity": "sha512-NPRy+/ncIMeDlTAsuqwKIiferiawhefFJtkNSW0qZJEqMEb+qBt/77B/jGeeek+F0uOeN05CDa6HXbbIgtVX4w==", + "requires": { + "is-core-module": "^2.16.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==" + }, "sade": { "version": "1.8.1", "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", @@ -10424,9 +11914,9 @@ } }, "stylis": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.1.3.tgz", - "integrity": "sha512-GP6WDNWf+o403jrEp9c5jibKavrtLW+/qYGhFxFrG8maXhwTBI7gLLhiBb0o7uFccWN+EOS9aMO6cGHWAO07OA==" + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" }, "supports-color": { "version": "4.5.0", @@ -10436,6 +11926,11 @@ "has-flag": "^2.0.0" } }, + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" + }, "swapy": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/swapy/-/swapy-1.0.5.tgz", @@ -10794,6 +12289,11 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==" }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, "yargs": { "version": "16.2.0", "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", diff --git a/package.json b/package.json index a5e60b1..5c6f90a 100644 --- a/package.json +++ b/package.json @@ -22,6 +22,10 @@ "@dnd-kit/core": "^6.3.1", "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.0", + "@mui/icons-material": "^6.4.4", + "@mui/material": "^6.4.4", "ag-grid-react": "^29.1.0", "antd": "^5.2.1", "firebase": "^9.23.0", diff --git a/pages/_app.js b/pages/_app.js index 4fdaca7..a967d12 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -4,12 +4,14 @@ import 'react-toastify/dist/ReactToastify.css'; import ReactDOM from 'react-dom/client'; import { User } from '../shared/models/User'; import { db, usersTable } from '../firebase'; -import { isValid } from '../shared/constants'; import { ToastContainer } from 'react-toastify'; +import { seedUserData as generateSeedUserData } from '../shared/database'; +import { GridTypes } from '../shared/types/types'; import { AnimatePresence, motion } from 'framer-motion'; import { collection, onSnapshot } from 'firebase/firestore'; import { createContext, useRef, useState, useEffect } from 'react'; import ContextMenu from '../components/context-menus/context-menu'; +import { combineArraysByKey, isValid } from '../shared/constants'; export const StateContext = createContext({}); @@ -376,11 +378,7 @@ export default function ProductIVF({ Component, pageProps, router }) { let [qotd, setQotd] = useState(``); let [width, setWidth] = useState(0); let [color, setColor] = useState(``); - let [lists, setLists] = useState([]); - let [items, setItems] = useState([]); - let [board, setBoard] = useState({}); let [dark, setDark] = useState(false); - let [boards, setBoards] = useState([]); let [updates, setUpdates] = useState(0); let [onMac, setOnMac] = useState(false); let [focus, setFocus] = useState(false); @@ -390,29 +388,115 @@ export default function ProductIVF({ Component, pageProps, router }) { let [loading, setLoading] = useState(true); let [highScore, setHighScore] = useState(0); let [platform, setPlatform] = useState(null); - let [selected, setSelected] = useState(null); let [anim, setAnimComplete] = useState(false); let [categories, setCategories] = useState([]); let [colorPref, setColorPref] = useState(null); - let [alertOpen, setAlertOpen] = useState(false); let [authState, setAuthState] = useState(`Next`); let [mobileMenu, setMobileMenu] = useState(false); let [emailField, setEmailField] = useState(false); let [systemStatus, setSystemStatus] = useState(``); + let [showLeaders, setShowLeaders] = useState(false); + let [content, setContent] = useState(`defaultContent`); + let [year, setYear] = useState(new Date().getFullYear()); + + let [user, setUser] = useState(null); + let [users, setUsers] = useState([]); + let [grids, setGrids] = useState([]); + let [lists, setLists] = useState([]); + let [items, setItems] = useState([]); + let [board, setBoard] = useState({}); + let [boards, setBoards] = useState([]); + let [selected, setSelected] = useState(null); + let [userBoards, setUserBoards] = useState([]); + let [alertOpen, setAlertOpen] = useState(false); let [rearranging, setRearranging] = useState(false); let [boardLoaded, setBoardLoaded] = useState(false); - let [showLeaders, setShowLeaders] = useState(false); + let [selectedGrids, setSelectedGrids] = useState([]); let [menuPosition, setMenuPosition] = useState(null); - let [content, setContent] = useState(`defaultContent`); + let [gridsLoading, setGridsLoading] = useState(true); + let [usersLoading, setUsersLoading] = useState(true); + let [boardsLoading, setBoardsLoading] = useState(true); let [tasksFiltered, setTasksFiltered] = useState(false); let [boardCategories, setBoardCategories] = useState([]); - let [year, setYear] = useState(new Date().getFullYear()); let [itemTypeMenuOpen, setItemTypeMenuOpen] = useState(false); let [completeFiltered, setCompleteFiltered] = useState(false); - let [users, setUsers] = useState([]); - let [user, setUser] = useState(null); - let [usersLoading, setUsersLoading] = useState(false); + const onSetUser = (usr) => { + seedUserData(usr); + } + + const getPageContainerClasses = () => { + let route = rte == `_` ? `root` : rte; + let pageName = isValid(page.toUpperCase()) ? page.toUpperCase() : `home_Page`; + let userClasses = `${user != null ? `signed_in` : `signed_out`} ${usersLoading ? `users_loading` : `users_loaded`}`; + let classes = `pageWrapContainer ${route} ${pageName} ${userClasses}`; + return classes; + } + + const resetGridsBoards = () => { + setBoards([]); + // setGrids([]); + setGridsLoading(true); + setBoardsLoading(true); + // setSelectedGrids([]); + } + + const signOutReset = (useLocal = false) => { + let hasLocalBoards = localStorage.getItem(`local_boards`); + if (useLocal && hasLocalBoards) { + let localBoards = JSON.parse(hasLocalBoards); + setBoards(localBoards); + } else { + resetGridsBoards(); + } + } + + const onSignOut = () => { + setUser(null); + setAuthState(`Next`); + setEmailField(false); + setUpdates(updates + 1); + localStorage.removeItem(`user`); + signOutReset(); + + } + + const getGridsBoards = (activeGrds, brds) => { + let gridsBoards = []; + let gridsBoardsIDs = activeGrds?.length > 0 ? activeGrds.map(grd => grd?.data?.boardIDs).flat() : []; + if (gridsBoardsIDs.length > 0) { + gridsBoardsIDs.forEach(gbID => { + let gBoard = brds.find(br => br?.ID == gbID); + if (gBoard) gridsBoards.push(gBoard); + }) + } + // console.log(`Get Grid Boards`, { + // brds, + // activeGrds, + // gridsBoards, + // }); + return gridsBoards; + } + + const seedUserData = (usr) => { + let { grids: grds, boards: brds } = generateSeedUserData(usr); + + setGrids(grds); + setUserBoards(brds); + + let privatePersonalGrid = grds.find(gr => gr.type == GridTypes.Personal); + let defaultSeletedGrid = privatePersonalGrid ? privatePersonalGrid : grds[0]; + defaultSeletedGrid = { ...defaultSeletedGrid, id: defaultSeletedGrid?.ID, value: defaultSeletedGrid?.ID, label: defaultSeletedGrid?.name }; + + let defaultSeletedGrids = [defaultSeletedGrid]; + let gridBoards = getGridsBoards(defaultSeletedGrids, brds); + + setSelectedGrids(defaultSeletedGrids); + setGridsLoading(false); + + setBoards(gridBoards); + setBoardsLoading(false); + } useEffect(() => { const usersDatabase = collection(db, usersTable); @@ -432,24 +516,17 @@ export default function ProductIVF({ Component, pageProps, router }) { if (thisUser) { setUser(thisUser); setAuthState(`Sign Out`); - // dev() && console.log(`User Still Signed In`, {thisUser, updates}); - if (isValid(thisUser?.boards)) { - setBoards(thisUser?.boards); - } + onSetUser(thisUser); } } } + setUsersLoading(false); dev() && console.log(`Users Update from Database`, usersFromDB); }, error => { console.log(`Error on Get Task(s) from Database`, error); - }, complete => { - setUsersLoading(false); - dev() && console.log(`User(s) Loaded`, complete); }) - // setUpdates(prevUpdates => prevUpdates + 1); - return () => { usersDatabaseRealtimeListener(); } @@ -501,13 +578,7 @@ export default function ProductIVF({ Component, pageProps, router }) { if (cachedBoards && cachedBoards?.length > 0) { setBoards(cachedBoards); } else { - let hasLocalBoards = localStorage.getItem(`local_boards`); - if (hasLocalBoards) { - let localBoards = JSON.parse(hasLocalBoards); - setBoards(localBoards); - } else { - setBoards([]); - } + signOutReset(); } let toc = document.querySelector(`.nextra-toc`); @@ -558,6 +629,7 @@ export default function ProductIVF({ Component, pageProps, router }) { onMac, router, rte, setRte, + year, setYear, page, setPage, width, setWidth, mobile, setMobile, @@ -583,9 +655,9 @@ export default function ProductIVF({ Component, pageProps, router }) { IDs, setIDs, qotd, setQotd, focus, setFocus, + loading, setLoading, content, setContent, updates, setUpdates, - loading, setLoading, anim, setAnimComplete, alertOpen, setAlertOpen, highScore, setHighScore, @@ -593,41 +665,55 @@ export default function ProductIVF({ Component, pageProps, router }) { showLeaders, setShowLeaders, systemStatus, setSystemStatus, - // Boards + // Functions + onSignOut, + onSetUser, + getGridsBoards, + + // Grids & Boards menuRef, + grids, setGrids, lists, setLists, items, setItems, board, setBoard, boards, setBoards, selected, setSelected, + userBoards, setUserBoards, categories, setCategories, boardLoaded, setBoardLoaded, + gridsLoading, setGridsLoading, menuPosition, setMenuPosition, + boardsLoading, setBoardsLoading, + selectedGrids, setSelectedGrids, tasksFiltered, setTasksFiltered, boardCategories, setBoardCategories, completeFiltered, setCompleteFiltered, itemTypeMenuOpen, setItemTypeMenuOpen, }}> - {(browser != `chrome` || onMac) ? - + {(browser != `chrome` || onMac) ? ( + + + + + + ) : ( +
    - - :
    - -
    } +
    + )}
    - -
    - -
    +
    + # Boards +
    \ No newline at end of file diff --git a/pages/projects/boards.mdx b/pages/projects/boards.mdx index 044c51d..ed3021d 100644 --- a/pages/projects/boards.mdx +++ b/pages/projects/boards.mdx @@ -1,11 +1,7 @@ import Boards from '../../components/boards/boards' -# Boards - -
    - -
    - -
    +
    + # Boards +
    \ No newline at end of file diff --git a/shared/ID.ts b/shared/ID.ts index 7b9b0e5..bfad69c 100644 --- a/shared/ID.ts +++ b/shared/ID.ts @@ -19,11 +19,13 @@ export const generateID = () => { export class ID { id: any; + ID: any; type: Types; position: number; date: Date | string; uuid: string | number | any; title: string | number | any; + id_Title: string | number | any; currentDateTimeStampNoSpaces: string; constructor(data: Partial) { Object.assign(this, data); @@ -36,11 +38,13 @@ export const getIDParts = () => { return { uuid, date }; } -export const genID = (type: Types = Types.Data, position = 1, name, injectedUID?): ID => { +export const genID = (type: Types = Types.Data, rank = 1, name, injectedUID?): ID => { let { uuid, date } = getIDParts(); uuid = injectedUID ? injectedUID : uuid; - let title = `${type} ${position} ${name}`; + let title = `${type} ${rank} ${name}`; + let idTitle = `${title} ${uuid}`; + let id_Title = stringNoSpaces(idTitle); let idString = `${title} ${stringNoSpaces(date)} ${uuid}`; let id = stringNoSpaces(idString); - return new ID({ id, date, uuid, title }) as ID; + return new ID({ id, date, uuid, title, id_Title }) as ID; } \ No newline at end of file diff --git a/shared/constants.ts b/shared/constants.ts index 2e09219..3f7a653 100644 --- a/shared/constants.ts +++ b/shared/constants.ts @@ -1,4 +1,5 @@ export const removeExtraSpacesFromString = (string: string) => string.trim().replace(/\s+/g, ` `); +export const generateArray = (length: number, itemData: any) => Array.from({ length }, () => itemData); export const stringMatch = (string: string, check: string): boolean => string?.toLowerCase()?.includes(check?.toLowerCase()); export const stringNoSpaces = (string: string) => string?.replaceAll(/[\s,:/]/g, `_`)?.replaceAll(/[\s,:/]/g, `-`).replaceAll(/-/g, `_`); diff --git a/shared/database.ts b/shared/database.ts index 90e81e6..01e3101 100644 --- a/shared/database.ts +++ b/shared/database.ts @@ -1 +1,177 @@ +import { User } from './models/User'; +import { Grid } from './models/Grid'; +import { Board } from './models/Board'; +import { capWords, dev } from '../pages/_app'; +import { GridTypes, Types } from './types/types'; +import { BoardTypes } from '../components/boards/boards'; +import { isValid, removeNullAndUndefinedProperties, stringNoSpaces } from './constants'; + +export const seedUserData = (user: User | any) => { + let board1 = createBoard(1, `Daily Tasks`, user, `140px`); + let board2 = createBoard(2, `Work`, user, `140px`); + let board3 = createBoard(3, `Shared`, user, `140px`); + let board4 = createBoard(4, `Archived`, user, `140px`); + + let grid1 = createGrid(1, GridTypes.Personal, user, GridTypes.Personal, [board1?.ID, board2?.ID] ); + let grid2 = createGrid(2, GridTypes.Shared, user, GridTypes.Shared, [board3?.ID] ); + let grid3 = createGrid(3, GridTypes.Archived, user, GridTypes.Archived, [board4?.ID] ); + let grid4 = createGrid(4, GridTypes.Private, user, GridTypes.Private, [] ); + let grid5 = createGrid(5, GridTypes.Public, user, GridTypes.Public, [] ); + + board1 = new Board({ ...board1, gridID: grid1?.ID }); + board2 = new Board({ ...board2, gridID: grid1?.ID }); + board3 = new Board({ ...board3, gridID: grid2?.ID }); + board4 = new Board({ ...board4, gridID: grid3?.ID }); + + let grids = [grid1, grid2, grid3, grid4, grid5]; + let boards = [board1, board2, board3, board4]; + + let seedUserData = { + grids, + boards, + user: { + ...user, + data: { + ...user.data, + gridIDs: grids.map(gr => gr?.ID), + boardIDs: boards.map(br => br?.ID), + } + }, + } + + dev() && console.log(`Seed User Data`, seedUserData); + + return seedUserData; +} + +export const createUser = ( + uid: string, + rank: number, + email: string, + name: string, + phone = undefined, + avatar = undefined, + token = ``, + verified = false, + anonymous = false, + active = true, + type = Types.User +) => { + + let user: User = new User({ + uid, + rank, + type, + email, + token, + phone, + avatar, + name: isValid(name) ? name : capWords(email.split(`@`)[0]), + options: { + active, + verified, + anonymous, + } + }) as User; + + let cleanedUser: any = removeNullAndUndefinedProperties(user); + + cleanedUser.ID = cleanedUser?.uuid; + user = new User({ ...cleanedUser, uuid: `${stringNoSpaces(cleanedUser?.title)}_${uid}` }); + + return user; +} + +export const createGrid = ( + rank: number, + name: string, + user: User, + gridType = GridTypes.Personal, + boardIDs = [`Daily Tasks`], + type = Types.Grid, +) => { + + let grid: Grid = new Grid({ + name, + type, + rank, + gridType, + + ...(user != null && { + owner: user?.email, + creator: user?.email, + ownerid: user?.id, + ownerID: user?.ID, + ownerUID: user?.uid, + creatorid: user?.id, + creatorID: user?.ID, + creatorUID: user?.uid, + }), + }) as Grid; + + if (user != null) { + let idTitle = user?.email + `_` + stringNoSpaces(grid?.title); + grid.ID = idTitle + `_` + grid?.uuid; + grid.id = idTitle + `_` + stringNoSpaces(grid?.meta?.created) + `_` + grid?.uuid; + } + + grid.data = { + ...grid.data, + boardIDs, + ...(user != null && { + users: [user?.email], + }), + }; + + return grid; +} + +export const createBoard = ( + rank: number, + name: string, + user: User | any, + titleWidth: string = `140px`, + gridID = ``, + boardType = BoardTypes.Kanban, + columnIDs = [`Active`, `Complete`], + type = Types.Board, +) => { + + let board: Board = new Board({ + name, + type, + rank, + gridID, + boardType, + titleWidth, + + ...(user != null && { + owner: user?.email, + creator: user?.email, + ownerid: user?.id, + ownerID: user?.ID, + ownerUID: user?.uid, + creatorid: user?.id, + creatorID: user?.ID, + creatorUID: user?.uid, + }), + }) as Board; + + if (user != null) { + let idTitle = user?.email + `_` + stringNoSpaces(board?.title); + board.ID = idTitle + `_` + board?.uuid; + board.id = idTitle + `_` + stringNoSpaces(board?.meta?.created) + `_` + board?.uuid; + } + + board.data = { + ...board?.data, + columnIDs, + ...(user != null && { + users: [user?.email], + }), + }; + + return board; +} + export const dbBoards = [{"created":"6:03 PM 5/27/2023","expanded":true,"name":"Example Draggable Board","columnOrder":["column_1_6_03_PM_5_27_2023_vua19vc5d","column_2_6_03_PM_5_27_2023_z6mtlms7c"],"columns":{"column_1_6_03_PM_5_27_2023_vua19vc5d":{"id":"column_1_6_03_PM_5_27_2023_vua19vc5d","title":"active","itemIds":["item_3_6_13_PM_5_27_2023_27vnmb2j2","item_3_6_15_PM_5_27_2023_lvza6sitz"],"itemType":"Item"},"column_2_6_03_PM_5_27_2023_z6mtlms7c":{"id":"column_2_6_03_PM_5_27_2023_z6mtlms7c","title":"complete","itemIds":["item_3_6_13_PM_5_27_2023_942tumtrc","item_1_6_08_PM_5_27_2023_s2egf8yu6","item_1_6_06_PM_5_27_2023_gqfn5z8cr"],"itemType":"Image"}},"id":"board_1_6_03_PM_5_27_2023_q1nmnvrpp","titleWidth":"207.5px","items":{"item_1_6_06_PM_5_27_2023_gqfn5z8cr":{"image":"","video":"","id":"item_1_6_06_PM_5_27_2023_gqfn5z8cr","subtasks":[{"id":"subtask_1_6_06_PM_5_27_2023_20jn2tf20","complete":true,"task":"Netflix","created":"6:06 PM 5/27/2023","updated":"6:08 PM 5/27/2023"},{"id":"subtask_4_6_06_PM_5_27_2023_fslx5f05w","complete":true,"task":"Car","created":"6:06 PM 5/27/2023","updated":"6:08 PM 5/27/2023"},{"id":"subtask_5_6_06_PM_5_27_2023_b7ji8l1se","complete":true,"task":"House","created":"6:06 PM 5/27/2023","updated":"6:08 PM 5/27/2023"}],"complete":true,"type":"Task","created":"6:06 PM 5/27/2023","content":"Pay Bills","updated":"6:08 PM 5/27/2023"},"item_1_6_08_PM_5_27_2023_s2egf8yu6":{"image":"","video":"","id":"item_1_6_08_PM_5_27_2023_s2egf8yu6","subtasks":[],"complete":true,"type":"Item","created":"6:08 PM 5/27/2023","content":"Testing New Board","updated":"6:08 PM 5/27/2023"},"item_3_6_13_PM_5_27_2023_942tumtrc":{"image":"","video":"","id":"item_3_6_13_PM_5_27_2023_942tumtrc","subtasks":[{"id":"subtask_1_6_13_PM_5_27_2023_w3ddkmv48","complete":false,"task":"Sub Task One","created":"6:13 PM 5/27/2023"},{"id":"subtask_2_6_17_PM_5_27_2023_3970zp8nd","complete":true,"task":"Completed Subtask","created":"6:17 PM 5/27/2023","updated":"6:17 PM 5/27/2023"}],"complete":false,"type":"Task","created":"6:13 PM 5/27/2023","content":"Create Subtasks","updated":"6:17 PM 5/27/2023"},"item_3_6_13_PM_5_27_2023_27vnmb2j2":{"image":"","video":"","id":"item_3_6_13_PM_5_27_2023_27vnmb2j2","subtasks":[],"complete":false,"type":"Item","created":"6:13 PM 5/27/2023","content":"Try Dragging Me","updated":"6:17 PM 5/27/2023"},"item_3_6_15_PM_5_27_2023_lvza6sitz":{"image":"https://user-images.githubusercontent.com/2182637/53614150-efbed780-3c2c-11e9-9204-a5d2e746faca.gif","video":"","id":"item_3_6_15_PM_5_27_2023_lvza6sitz","subtasks":[],"complete":false,"type":"Image","created":"6:15 PM 5/27/2023","content":"Or Add An Image","updated":"6:17 PM 5/27/2023"}},"updated":"6:17 PM 5/27/2023"},{"created":"6:09 PM 5/27/2023","expanded":false,"name":"Draggable Board 2","columnOrder":["column_1_6_09_PM_5_27_2023_zpcan4deb","list_3_6_10_PM_5_27_2023_wlcimzlua"],"columns":{"column_1_6_09_PM_5_27_2023_zpcan4deb":{"id":"column_1_6_09_PM_5_27_2023_zpcan4deb","title":"You Can Drag Columns","itemIds":["item_1_6_11_PM_5_27_2023_y2vtop14o","item_2_6_18_PM_5_27_2023_n458lp2jj","item_3_6_19_PM_5_27_2023_58qpoeyi0"],"itemType":"Item","updated":"6:10 PM 5/27/2023"},"list_3_6_10_PM_5_27_2023_wlcimzlua":{"id":"list_3_6_10_PM_5_27_2023_wlcimzlua","title":"And Make New Ones","itemIds":["item_2_6_14_PM_5_27_2023_wie8q2ts3","item_2_6_18_PM_5_27_2023_cl6xfeisp","item_3_6_19_PM_5_27_2023_jx025dtp9"],"itemType":"Item","updated":"6:15 PM 5/27/2023"}},"id":"board_2_6_09_PM_5_27_2023_op1nautzv","titleWidth":"258.5px","items":{"item_1_6_11_PM_5_27_2023_y2vtop14o":{"image":"","video":"","id":"item_1_6_11_PM_5_27_2023_y2vtop14o","subtasks":[],"complete":true,"type":"Item","created":"6:11 PM 5/27/2023","content":"You Can Have Completed Items In Any Column","updated":"6:14 PM 5/27/2023"},"item_2_6_14_PM_5_27_2023_wie8q2ts3":{"image":"","video":"","id":"item_2_6_14_PM_5_27_2023_wie8q2ts3","subtasks":[],"complete":false,"type":"Item","created":"6:14 PM 5/27/2023","content":"Click Me To Manage An Item Or To Rename","updated":"6:14 PM 5/27/2023"},"item_2_6_18_PM_5_27_2023_n458lp2jj":{"image":"","video":"","id":"item_2_6_18_PM_5_27_2023_n458lp2jj","subtasks":[],"complete":false,"type":"Item","created":"6:18 PM 5/27/2023","content":"You Can Manage Tasks Or Create Lists In Any Order You Prefer!"},"item_2_6_18_PM_5_27_2023_cl6xfeisp":{"image":"","video":"","id":"item_2_6_18_PM_5_27_2023_cl6xfeisp","subtasks":[],"complete":false,"type":"Image","created":"6:18 PM 5/27/2023","content":"You Can Click A Board To Expand That Board Or Focus On It"},"item_3_6_19_PM_5_27_2023_jx025dtp9":{"image":"","video":"","id":"item_3_6_19_PM_5_27_2023_jx025dtp9","subtasks":[],"complete":false,"type":"Item","created":"6:19 PM 5/27/2023","content":"Also You Can Click To Collapse A Board Entirely Until You Are Ready To Open It Back Up Again"},"item_3_6_19_PM_5_27_2023_58qpoeyi0":{"image":"","video":"","id":"item_3_6_19_PM_5_27_2023_58qpoeyi0","subtasks":[],"complete":false,"type":"Item","created":"6:19 PM 5/27/2023","content":"Create Rankings And Reorder Them With Dynamic Sorting Indexes"}},"updated":"6:19 PM 5/27/2023"}]; \ No newline at end of file diff --git a/shared/models/Board.ts b/shared/models/Board.ts new file mode 100644 index 0000000..f001147 --- /dev/null +++ b/shared/models/Board.ts @@ -0,0 +1,52 @@ +import { Data } from './Data'; +import { genID } from '../ID'; +import { Types } from '../types/types'; +import { BoardTypes } from '../../components/boards/boards'; +import { countPropertiesInObject, isValid } from '../constants'; + +export class Board extends Data { + ID: any; + owner: string; + gridID: string; + titleWidth: any; + creator: string; + ownerid: string; + ownerID: string; + ownerUID: string; + creatorid: string; + creatorID: string; + creatorUID: string; + type: Types = Types.Board; + boardType: BoardTypes = BoardTypes.Kanban; + + options = { + private: true, + expanded: true, + focused: false, + filterActive: false, + } + + data?: { [key: string]: string[] } = { + users: [], + itemIDs: [], + taskIDs: [], + columnIDs: [], + } + + constructor(data: Partial) { + super(data); + Object.assign(this, data); + + this.A = this.name; + + let ID = genID(this.type, this.rank, this.name); + let { id, date, title, uuid } = ID; + + if (!isValid(this.id)) this.id = id; + if (!isValid(this.uuid)) this.uuid = uuid; + if (!isValid(this.title)) this.title = title; + if (!isValid(this.meta.created)) this.meta.created = date; + if (!isValid(this.meta.updated)) this.meta.updated = date; + if (!isValid(this.properties)) this.properties = countPropertiesInObject(this) + 1; + } +} \ No newline at end of file diff --git a/shared/models/Data.ts b/shared/models/Data.ts new file mode 100644 index 0000000..95fc915 --- /dev/null +++ b/shared/models/Data.ts @@ -0,0 +1,37 @@ +import { genID } from '../ID'; +import { Types } from '../types/types'; +import { countPropertiesInObject, isValid } from '../constants'; + +export class Data { + A?: any; + + id!: string; + uid: string; + rank: number; + uuid?: string; + name!: string; + title?: string; + properties: number; + type: Types = Types.Data; + + meta = { + created: undefined, + updated: undefined, + } + + constructor(data: Partial) { + Object.assign(this, data); + + this.A = this.name; + + let ID = genID(this.type, this.rank, this.name, this.uid); + let { id, date, title, uuid } = ID; + + if (!isValid(this.id)) this.id = id; + if (!isValid(this.uuid)) this.uuid = uuid; + if (!isValid(this.title)) this.title = title; + if (!isValid(this.meta.created)) this.meta.created = date; + if (!isValid(this.meta.updated)) this.meta.updated = date; + if (!isValid(this.properties)) this.properties = countPropertiesInObject(this) + 1; + } +} \ No newline at end of file diff --git a/shared/models/Grid.ts b/shared/models/Grid.ts new file mode 100644 index 0000000..b75def8 --- /dev/null +++ b/shared/models/Grid.ts @@ -0,0 +1,45 @@ +import { Data } from './Data'; +import { genID } from '../ID'; +import { GridTypes, Types } from '../types/types'; +import { countPropertiesInObject, isValid } from '../constants'; + +export class Grid extends Data { + ID: any; + owner: string; + creator: string; + ownerid: string; + ownerID: string; + ownerUID: string; + creatorid: string; + creatorID: string; + creatorUID: string; + type: Types = Types.Grid; + gridType: GridTypes = GridTypes.Personal; + + options = { + active: false, + private: true, + } + + data?: { [key: string]: string[] } = { + users: [], + boardIDs: [], + } + + constructor(data: Partial) { + super(data); + Object.assign(this, data); + + this.A = this.name; + + let ID = genID(this.type, this.rank, this.name); + let { id, date, title, uuid } = ID; + + if (!isValid(this.id)) this.id = id; + if (!isValid(this.uuid)) this.uuid = uuid; + if (!isValid(this.title)) this.title = title; + if (!isValid(this.meta.created)) this.meta.created = date; + if (!isValid(this.meta.updated)) this.meta.updated = date; + if (!isValid(this.properties)) this.properties = countPropertiesInObject(this) + 1; + } +} \ No newline at end of file diff --git a/shared/models/User.ts b/shared/models/User.ts index 382dc10..4fb82cc 100644 --- a/shared/models/User.ts +++ b/shared/models/User.ts @@ -1,4 +1,5 @@ import { genID } from '../ID'; +import { Data } from './Data'; import { Types } from '../types/types'; import { capWords } from '../../pages/_app'; import { countPropertiesInObject, isValid } from '../constants'; @@ -47,59 +48,46 @@ export const ROLES = { Owner: new Role(7, Roles.Owner), } -export class User { - A?: any; - - id!: string; - uuid?: string; - uid: string = ``; - - title?: string; - password?: string; +export class User extends Data { + ID: any; + boards?: any[]; phone: any; avatar: any; - name!: string; - rank: number = 1; + password?: string; + token: string = ``; email: string = ``; - properties: number; + provider: Providers.Firebase; type: Types = Types.User; role = ROLES.Subscriber.name; - boards?: any[]; + options = { + active: true, + verified: false, + anonymous: false, + } - data = { - taskIDs: [], - itemIDs: [], - listIDs: [], - boardIDs: [], + data?: { [key: string]: string[] } = { gridIDs: [], friendIDs: [], - sharedIDs: [], - } - - meta = { - created: undefined, - updated: undefined, - provider: Providers.Firebase, - } - - auth = { - token: undefined, - verified: undefined, - anonymous: undefined, + selectedGridIDs: [], } constructor(data: Partial) { + super(data); Object.assign(this, data); + if (isValid(this.email) && !isValid(this.name)) this.name = capWords(this.email.split(`@`)[0]); + this.A = this.name; - let ID = genID(Types.User, this.rank, this.name, this.uid); - let { id, date, title, uuid } = ID; + + let ID = genID(this.type, this.rank, this.name, this.uid); + let { id, date, title, id_Title } = ID; + if (!isValid(this.id)) this.id = id; - if (!isValid(this.uuid)) this.uuid = uuid; if (!isValid(this.title)) this.title = title; + if (!isValid(this.uuid)) this.uuid = id_Title; if (!isValid(this.meta.created)) this.meta.created = date; if (!isValid(this.meta.updated)) this.meta.updated = date; if (!isValid(this.properties)) this.properties = countPropertiesInObject(this) + 1; diff --git a/shared/types/types.ts b/shared/types/types.ts index d4d9600..54b5138 100644 --- a/shared/types/types.ts +++ b/shared/types/types.ts @@ -10,4 +10,12 @@ export enum Types { Feature = `Feature`, Notification = `Notification`, +} + +export enum GridTypes { + Personal = `Personal`, + Shared = `Shared`, + Public = `Public`, + Private = `Private`, + Archived = `Archived`, } \ No newline at end of file diff --git a/styles/_columns.scss b/styles/_columns.scss index 957a4fb..5d9b02d 100644 --- a/styles/_columns.scss +++ b/styles/_columns.scss @@ -124,7 +124,7 @@ .boardTask { &.complete { color: black; - background: linear-gradient(90deg, var(--blackGlass) 35px, var(--whiteGlassInvert) 35px) !important; + background: linear-gradient(90deg, var(--blackGlass) var(--buttonSize), var(--whiteGlassInvert) var(--buttonSize)) !important; .itemButtons { input { &.task_check_box { @@ -222,6 +222,14 @@ } } +.board { + .column { + &.columns_1 { --columnWidth: 100% !important; } + &.columns_2 { --columnWidth: calc(98.5% / 2) !important; } + &.columns_3 { --columnWidth: calc(97% / 3) !important; } + } +} + .multiCol { .column2Layout { display: none; diff --git a/styles/_finaloverwrite.scss b/styles/_finaloverwrite.scss new file mode 100644 index 0000000..f10afb9 --- /dev/null +++ b/styles/_finaloverwrite.scss @@ -0,0 +1,45 @@ +@mixin hoverGlow { + height: 100%; + min-height: 33px; + max-height: 33px; + background: white; + color: var(--gameBlue); + width: var(--buttonSize); + font-weight: 400 !important; + transition: var(--transition); + font-size: var(--buttonSize) !important; + &:hover { + box-shadow: 0 0 10px white; + } +} + +input { + &.boardNameField { + margin-right: 0 !important; + margin-left: -3px !important; + } +} + +button { + &.hoverGlow { + @include hoverGlow; + } +} + +.hoverBright { + transition: var(--transition); + &:hover { + cursor: pointer; + box-shadow: 0 0 10px white; + } +} + +.pageWrapContainer { + &.signed_out { + &.users_loading { + .nav_Form { + width: 100%; + } + } + } +} \ No newline at end of file diff --git a/styles/_grids.scss b/styles/_grids.scss new file mode 100644 index 0000000..2a62ec0 --- /dev/null +++ b/styles/_grids.scss @@ -0,0 +1,150 @@ +:root { + --authFormButtonFontColor: white; + --authFormIconColor: var(--gameBlue); + --authFormButtonBG: var(--blackGlass); +} + +.gridsMultiSelectorContainer { + min-width: 215px; +} + +.gridsBoardsFieldsContainer { + display: flex; + grid-gap: 1px; + align-items: center; +} + +.formButtonsField { + display: flex; + line-height: 1; + grid-gap: 10px; + cursor: pointer; + font-weight: 600; + flex-direction: row; + border: 0 !important; + max-width: fit-content; + max-height: 35px !important; + transition: var(--transition); + padding: 10.5px 15px !important; + border-radius: var(--borderRadius); + background: var(--authFormButtonBG) !important; + color: var(--authFormButtonFontColor) !important; + &.Next_AuthState, &.Sign_Up_AuthState, &.Sign_In_AuthState { + i { + order: 1; + } + } + &.Back_AuthState, &.Sign_Out_AuthState { + i { + transform: rotateY(180deg); + } + } + i { + max-width: fit-content; + transition: var(--transition); + color: var(--authFormIconColor) !important; + font-size: calc(var(--authFormFontSize) + 2px); + } + input { + &[type=submit][type=submit][type=submit] { + padding: 0px 0 15px !important; + transition: var(--transition); + background: transparent !important; + &:hover { + color: white !important; + box-shadow: none !important; + background: transparent !important; + } + } + } + &:hover { + background: white !important; + box-shadow: 0 0 8px 0px black; + input { + &[type=submit][type=submit][type=submit] { + color: black !important; + } + } + } +} + +.gridRow { + gap: 10px; + width: 100%; + display: grid; + align-items: center; + grid-template-columns: auto 1fr; + .selectedOptionsContainer { + display: flex; + } + &.hasGridSelector { + grid-template-columns: auto auto 1fr; + &.withSingleSelect { + &:not(.gridsAreLoading) { + grid-template-columns: auto 1fr auto; + } + .multiSelectOptionInput { + cursor: pointer; + margin-right: 0 !important; + } + .selectedOptionsContainer { + .multiSelectedOption { + margin-right: 0 !important; + border-top-right-radius: var(--borderRadius) !important; + border-bottom-right-radius: var(--borderRadius) !important; + } + } + } + } + .middle { + text-align: center; + align-items: center; + grid-gap: 0 !important; + width: 100% !important; + max-width: unset !important; + justify-content: center !important; + h2 { + width: 100% !important; + max-width: unset !important; + } + } + .right { + text-align: center; + align-items: center; + width: 100% !important; + max-width: unset !important; + justify-content: flex-end !important; + h3 { + text-align: right; + width: 100% !important; + max-width: unset !important; + } + } +} + +.gridInputField { + width: 100%; + font-size: 14px; + min-height: var(--buttonSize); + padding-left: 15px; + max-width: unset !important; + background: var(--blackGlass); + border-radius: var(--borderRadius); + border-top-left-radius: 0px !important; + border-bottom-left-radius: 0px !important; + &::placeholder { + opacity: 0.65; + } +} + +.collapsedBoardDetailsRow { + .left { + max-width: unset !important; + .boardTitleField { + max-width: unset !important; + .collapsedBoardChangeLabel { + max-width: unset !important; + } + } + } +} \ No newline at end of file diff --git a/styles/_itemsoverwrite.scss b/styles/_itemsoverwrite.scss index cd893f7..8523440 100644 --- a/styles/_itemsoverwrite.scss +++ b/styles/_itemsoverwrite.scss @@ -6,16 +6,8 @@ --primary: var(--gameBlue) !important; --detailViewBG: rgba(21, 90, 130, 0.85); --primarySoft: var(--gameBlueSoft) !important; - --darkGradient: linear-gradient(90deg, var(--whiteGlass) 35px, var(--blackGlass) 35px) !important; - --lightGradient: linear-gradient(90deg, var(--blackGlass) 35px, var(--whiteGlass) 35px) !important; - - // Themes - // Green - // --gameBlue: #38cf38 !important; - // --gameBlueSoft: #087308 !important; - // Red - // --gameBlue: #ff0000 !important; - // --gameBlueSoft: #820000 !important; + --darkGradient: linear-gradient(90deg, var(--whiteGlass) var(--buttonSize), var(--blackGlass) var(--buttonSize)) !important; + --lightGradient: linear-gradient(90deg, var(--blackGlass) var(--buttonSize), var(--whiteGlass) var(--buttonSize)) !important; } .authFormBack { diff --git a/styles/_mui.scss b/styles/_mui.scss new file mode 100644 index 0000000..ba38048 --- /dev/null +++ b/styles/_mui.scss @@ -0,0 +1,151 @@ +:root { + --skeletonColor: var(--blackGlass); + --skeletonSweepBlue: rgba(55, 134, 172, 0.65); + --skeletonSweepDarkBlue: rgba(8, 33, 45, 0.65); + --skeletonSweepColor: var(--skeletonSweepDarkBlue); +} + +.IVF_skeleton { + width: 100%; + height: 100%; + border-radius: var(--borderRadius); + .IVF_skeleton_content { + z-index: 5; + width: 100%; + height: 100%; + display: flex; + position: relative; + visibility: visible; + align-items: center; + justify-content: center; + .IVF_skeleton_label_container { + display: grid; + margin: 0 auto; + align-items: center; + grid-template-columns: auto auto 1fr; + .IVF_skeleton_label { + font-weight: 500; + } + } + } +} + +.MuiSkeleton-root { + transform: none !important; + background: var(--skeletonColor); + &::after { + content: ""; + background: linear-gradient(321deg, transparent, var(--skeletonSweepColor), transparent); + } +} + +.MuiBox-root { + width: 100%; + max-width: 100% !important; +} + +.Mui-disabled { + color: rgba(255, 255, 255, 0.25) !important; +} + +.MuiStepConnector-line { + padding-left: 1em; + font-size: 0.45em; +} + +.MuiOutlinedInput-notchedOutline { + border-color: transparent !important; +} + +.MuiInput-root { + &::after { + border-bottom: 1px solid var(--gameBlueSoft) !important; + } + &:hover { + &:not(.Mui-disabled, .Mui-error) { + &::before { + border-bottom: 1px solid white !important; + } + } + } +} + +.MuiStepLabel-label { + color: white !important; + font-size: 0.65em !important; + font-family: 'Montserrat' !important; +} + +.MuiStepLabel-root { + flex-direction: row; + span { + width: max-content; + } +} + +.MuiPaper-root { + background: transparent !important; +} + +.MuiTypography-root { + color: white; + margin-bottom: 10px; + font-family: 'Montserrat' !important; +} + +.MuiButton-containedPrimary { + color: white !important; + background: var(--gameBlueSoft) !important; +} + +.MuiStepper-root { + .Mui-completed, .Mui-active { + :not(.MuiStepLabel-label):not(.MuiStepConnector-line) { + color: var(--gameBlueSoft) !important; + } + svg { + border-radius: 100% !important; + background: radial-gradient(white 0%, transparent 100%) !important; + } + } + .MuiButton-textPrimary { + font-weight: 600; + color: var(--gameBlueSoft) !important; + } + .MuiTextField-root { + label { + display: flex; + flex-direction: row; + color: white !important; + padding-left: 1em !important; + &:not(.Mui-focused) { + color: rgba(255,255,255,0.65) !important; + } + span { + width: max-content; + } + } + } +} + +.MuiFormLabel-asterisk { + color: var(--gameBlueSoft); +} + +.dark { + .MuiStepConnector-line { + color: #cfcfcf !important; + } +} + +.light { + .MuiStepConnector-line { + color: #8d8d8d !important; + } + .MuiTypography-root { + color: rgba(17, 24, 39, 1); + } + .MuiStepLabel-label, .MuiStepper-root .MuiTextField-root label, .MuiStepper-root .MuiTextField-root label:not(.Mui-focused) { + color: rgba(17, 24, 39, 1) !important; + } +} \ No newline at end of file diff --git a/styles/_toast.scss b/styles/_toast.scss index e6417c8..8489b48 100644 --- a/styles/_toast.scss +++ b/styles/_toast.scss @@ -1,5 +1,6 @@ .Toastify__toast-container { - --toastify-container-width: 500px; + --toastify-color-dark: var(--blackGlass); + --toastify-container-width: calc(auto + 20px); --toastify-toast-min-height: auto; .Toastify__toast { width: 100%; @@ -7,6 +8,7 @@ font-weight: 600; flex-direction: row; font-family: "Montserrat"; + backdrop-filter: blur(5px); .Toastify__close-button { display: none; } diff --git a/styles/_utility.scss b/styles/_utility.scss index 3c11fdf..8fe763b 100644 --- a/styles/_utility.scss +++ b/styles/_utility.scss @@ -1,8 +1,16 @@ +.hidden { display: none; } +.flexThis { display: flex; } +.rowThis { flex-direction: row; } + +@mixin setWidth($width) { + height: $width !important; + min-height: $width !important; + max-height: $width !important; +} + .stretch { --fullWidth: 100% !important; - width: var(--fullWidth) !important; - min-width: var(--fullWidth) !important; - max-width: var(--fullWidth) !important; + @include setWidth(var(--fullWidth)); &.boardIndexAndTitle { --fullWidth: 74% !important; } diff --git a/theme.config.tsx b/theme.config.tsx index 67278eb..93be088 100644 --- a/theme.config.tsx +++ b/theme.config.tsx @@ -17,8 +17,8 @@ const setToc = (e) => { const navForm = (headerForm = false) => { return ( -
    - +
    +