@rpg-engine/long-bow 0.2.78 → 0.2.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/long-bow.cjs.development.js +14196 -8416
- package/dist/long-bow.cjs.development.js.map +1 -1
- package/dist/long-bow.cjs.production.min.js +1 -1
- package/dist/long-bow.cjs.production.min.js.map +1 -1
- package/dist/long-bow.esm.js +14196 -8416
- package/dist/long-bow.esm.js.map +1 -1
- package/dist/mocks/equipmentSet.mocks.d.ts +15 -2
- package/package.json +2 -2
- package/src/components/CraftBook/MockItems.ts +28 -28
- package/src/components/Item/Inventory/ItemSlot.tsx +19 -3
- package/src/components/shared/SpriteFromAtlas.tsx +17 -20
- package/src/mocks/atlas/items/items.json +6086 -314
- package/src/mocks/atlas/items/items.png +0 -0
- package/src/mocks/equipmentSet.mocks.ts +38 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"long-bow.cjs.production.min.js","sources":["../src/constants/uiFonts.ts","../src/components/Button.tsx","../src/components/RPGUIContainer.tsx","../src/components/Item/Inventory/ErrorBoundary.tsx","../src/components/shared/SpriteFromAtlas.tsx","../src/components/Arrow/SelectArrow.tsx","../src/components/shared/Ellipsis.tsx","../src/components/PropertySelect/PropertySelect.tsx","../src/components/Character/CharacterSelection.tsx","../src/components/Input.tsx","../src/components/shared/Column.tsx","../src/components/Chat/Chat.tsx","../src/constants/uiColors.ts","../src/hooks/useOutsideAlerter.ts","../src/components/NPCDialog/NPCDialog.tsx","../src/components/DraggableContainer.tsx","../src/components/Dropdown.tsx","../src/components/CraftBook/CraftBook.tsx","../src/components/DropdownSelectorContainer.tsx","../src/components/RelativeListMenu.tsx","../src/components/Item/Cards/ItemTooltip.tsx","../src/components/Item/Inventory/itemContainerHelper.ts","../src/components/Item/Inventory/ItemSlot.tsx","../src/components/Equipment/EquipmentSet.tsx","../src/constants/uiDevices.ts","../src/components/typography/DynamicText.tsx","../src/components/NPCDialog/NPCDialogText.tsx","../src/libs/StringHelpers.ts","../src/hooks/useEventListener.ts","../src/components/NPCDialog/QuestionDialog/QuestionDialog.tsx","../src/components/NPCDialog/NPCMultiDialog.tsx","../src/components/RangeSlider.tsx","../src/components/HistoryDialog.tsx","../src/components/Abstractions/SlotsContainer.tsx","../src/components/Item/Inventory/ItemContainer.tsx","../src/components/ListMenu.tsx","../src/components/ProgressBar.tsx","../src/components/QuestInfo/QuestInfo.tsx","../src/components/QuestList.tsx","../src/components/RPGUIRoot.tsx","../src/components/SimpleProgressBar.tsx","../src/components/SkillProgressBar.tsx","../src/components/SkillsContainer.tsx","../src/components/TimeWidget/DayNightPeriod/DayNightPeriod.tsx","../src/components/TimeWidget/TimeWidget.tsx","../src/components/TradingMenu/TradingItemRow.tsx","../src/components/TradingMenu/TradingMenu.tsx","../src/components/Truncate.tsx","../src/components/itemSelector/ItemSelector.tsx","../src/components/CheckButton.tsx","../src/components/RadioButton.tsx","../src/components/TextArea.tsx"],"sourcesContent":["export const uiFonts = {\n size: {\n xxsmall: '8px',\n xsmall: '9px',\n small: '12px',\n medium: '14px',\n large: '16px',\n xLarge: '18px',\n xxLarge: '20px',\n xxxLarge: '24px',\n },\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { uiFonts } from '../constants/uiFonts';\n\nexport enum ButtonTypes {\n RPGUIButton = 'rpgui-button',\n RPGUIGoldButton = 'rpgui-button golden',\n}\n\nexport interface IButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n disabled?: boolean;\n children: React.ReactNode;\n buttonType: ButtonTypes;\n onClick?: (e: any) => void;\n}\n\nexport const Button = ({\n disabled = false,\n children,\n buttonType,\n onClick,\n ...props\n}: IButtonProps) => {\n return (\n <ButtonContainer\n className={`${buttonType}`}\n disabled={disabled}\n {...props}\n onTouchStart={onClick}\n onClick={onClick}\n >\n <p>{children}</p>\n </ButtonContainer>\n );\n};\n\nconst ButtonContainer = styled.button`\n height: 45px;\n font-size: ${uiFonts.size.small};\n`;\n","import React from 'react';\nimport styled from 'styled-components';\n\nexport enum RPGUIContainerTypes {\n Framed = 'framed',\n FramedGold = 'framed-golden',\n FramedGold2 = 'framed-golden-2',\n FramedGrey = 'framed-grey',\n}\nexport interface IRPGUIContainerProps {\n type: RPGUIContainerTypes;\n children: React.ReactNode;\n width?: string;\n height?: string;\n className?: string;\n}\n\nexport const RPGUIContainer: React.FC<IRPGUIContainerProps> = ({\n children,\n type,\n width = '50%',\n height,\n className,\n}) => {\n return (\n <Container\n width={width}\n height={height || 'auto'}\n className={`rpgui-container ${type} ${className}`}\n >\n {children}\n </Container>\n );\n};\n\ninterface IContainerProps {\n width: string;\n height: string;\n}\n\nconst Container = styled.div<IContainerProps>`\n height: ${props => props.height};\n width: ${({ width }) => width};\n display: flex;\n flex-wrap: wrap;\n image-rendering: pixelated;\n`;\n","import React, { Component, ErrorInfo, ReactNode } from 'react';\nimport atlasJSON from '../../../mocks/atlas/items/items.json';\nimport atlasIMG from '../../../mocks/atlas/items/items.png';\nimport { SpriteFromAtlas } from '../../shared/SpriteFromAtlas';\n\ninterface Props {\n children?: ReactNode;\n}\n\ninterface State {\n hasError: boolean;\n}\n\nexport class ErrorBoundary extends Component<Props, State> {\n public state: State = {\n hasError: false,\n };\n\n public static getDerivedStateFromError(_: Error): State {\n // Update state so the next render will show the fallback UI.\n return { hasError: true };\n }\n\n public componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n public render() {\n if (this.state.hasError) {\n return (\n <SpriteFromAtlas\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={'others/no-image.png'}\n imgScale={3}\n />\n );\n }\n\n return this.props.children;\n }\n}\n","import { GRID_HEIGHT, GRID_WIDTH } from '@rpg-engine/shared';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { ErrorBoundary } from '../Item/Inventory/ErrorBoundary';\n\ninterface IProps {\n atlasJSON: any;\n atlasIMG: any;\n spriteKey: string;\n width?: number;\n height?: number;\n grayScale?: boolean;\n opacity?: number;\n onClick?: () => void;\n containerStyle?: any;\n imgStyle?: any;\n imgScale?: number;\n}\n\nexport const SpriteFromAtlas: React.FC<IProps> = ({\n atlasJSON,\n atlasIMG,\n spriteKey,\n width = GRID_WIDTH,\n height = GRID_HEIGHT,\n imgScale = 2,\n imgStyle,\n onClick,\n containerStyle,\n grayScale = false,\n opacity = 1,\n}) => {\n //! If an item is not showing, remember that you MUST run yarn atlas:copy everytime you add a new item to the atlas (it will sync our public folder atlas with src/atlas).\n //!Due to React's limitations, we cannot import it from the public folder directly!\n\n const spriteData =\n atlasJSON.frames[spriteKey] || atlasJSON.frames['others/no-image.png'];\n\n if (!spriteData) throw new Error(`Sprite ${spriteKey} not found in atlas!`);\n\n return (\n <ErrorBoundary>\n <Container\n width={width}\n height={height}\n hasHover={grayScale}\n onClick={onClick}\n style={containerStyle}\n >\n <ImgSprite\n className=\"sprite-from-atlas-img\"\n atlasIMG={atlasIMG}\n frame={spriteData.frame}\n scale={imgScale}\n grayScale={grayScale}\n opacity={opacity}\n style={imgStyle}\n />\n </Container>\n </ErrorBoundary>\n );\n};\n\ninterface IImgSpriteProps {\n atlasIMG: any;\n frame: {\n x: number;\n y: number;\n w: number;\n h: number;\n };\n scale: number;\n grayScale: boolean;\n opacity: number;\n}\n\ninterface IContainerProps {\n width: number;\n height: number;\n hasHover: boolean;\n}\n\nconst Container = styled.div`\n width: ${(props: IContainerProps) => props.width}px;\n height: ${(props: IContainerProps) => props.height}px;\n ${(props: IContainerProps) =>\n !props.hasHover\n ? `&:hover {\n filter: sepia(100%) saturate(300%) brightness(70%) hue-rotate(180deg);\n }`\n : ``}\n`;\n\nconst ImgSprite = styled.div<IImgSpriteProps>`\n width: ${props => props.frame.w}px;\n height: ${props => props.frame.h}px;\n background-image: url(${props => props.atlasIMG});\n background-position: -${props => props.frame.x}px -${props => props.frame.y}px;\n transform: scale(${props => props.scale});\n position: relative;\n top: 8px;\n left: 8px;\n filter: ${props => (props.grayScale ? 'grayscale(100%)' : 'none')};\n opacity: ${props => props.opacity};\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport LeftArrowClickIcon from './img/arrow01-left-clicked.png';\nimport LeftArrowIcon from './img/arrow01-left.png';\nimport RightArrowClickIcon from './img/arrow01-right-clicked.png';\nimport RightArrowIcon from './img/arrow01-right.png';\n\nexport interface ArrowBarProps extends React.HTMLAttributes<HTMLDivElement> {\n direction: 'right' | 'left';\n onClick: () => void;\n size?: number;\n}\n\nexport const SelectArrow: React.FC<ArrowBarProps> = ({\n direction = 'left',\n size,\n onClick,\n ...props\n}) => {\n return (\n <>\n {direction === 'left' ? (\n <LeftArrow size={size} onClick={() => onClick()} {...props}></LeftArrow>\n ) : (\n <RightArrow\n size={size}\n onClick={() => onClick()}\n {...props}\n ></RightArrow>\n )}\n </>\n );\n};\n\ninterface IArrowProps {\n size?: number;\n}\n\nconst LeftArrow = styled.span<IArrowProps>`\n background-image: url(${LeftArrowIcon});\n background-size: 100% 100%;\n left: 0;\n position: absolute;\n width: ${props => props.size || 40}px;\n height: ${props => props.size || 42}px;\n :active {\n background-image: url(${LeftArrowClickIcon});\n }\n z-index: 2;\n`;\n\nconst RightArrow = styled.span<IArrowProps>`\n background-image: url(${RightArrowIcon});\n right: 0;\n position: absolute;\n width: ${props => props.size || 40}px;\n height: ${props => props.size || 42}px;\n background-size: 100% 100%;\n :active {\n background-image: url(${RightArrowClickIcon});\n }\n z-index: 2;\n`;\n\nexport default SelectArrow;\n","import React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n children: React.ReactNode;\n maxLines: 1 | 2 | 3;\n maxWidth: string;\n fontSize?: string;\n center?: boolean;\n}\n\nexport const Ellipsis = ({\n children,\n maxLines,\n maxWidth,\n fontSize,\n center,\n}: IProps) => {\n return (\n <Container maxWidth={maxWidth} fontSize={fontSize} center={center}>\n <div className={`ellipsis-${maxLines}-lines`}>{children}</div>\n </Container>\n );\n};\n\ninterface IContainerProps {\n maxWidth?: string;\n fontSize?: string;\n center?: boolean;\n}\n\nconst Container = styled.div<IContainerProps>`\n .ellipsis-1-lines {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n max-width: ${props => props.maxWidth};\n\n ${props => props.center && `margin: 0 auto;`}\n }\n .ellipsis-2-lines {\n display: -webkit-box;\n max-width: ${props => props.maxWidth}px;\n\n height: 25px;\n margin: 0 auto;\n line-height: 1;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n .ellipsis-3-lines {\n display: -webkit-box;\n max-width: ${props => props.maxWidth}px;\n\n height: 43px;\n margin: 0 auto;\n line-height: 1;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { uiFonts } from '../../constants/uiFonts';\nimport SelectArrow from '../Arrow/SelectArrow';\nimport { Ellipsis } from '../shared/Ellipsis';\n\nexport interface IPropertySelectProps {\n availableProperties: Array<IPropertiesProps>;\n selectedProperty?: IPropertiesProps;\n children?: React.ReactNode;\n onChange: (selectedProperty: IPropertiesProps) => void;\n}\n\nexport interface IPropertiesProps {\n id: string;\n name: string;\n}\n\nexport const PropertySelect: React.FC<IPropertySelectProps> = ({\n availableProperties,\n onChange,\n}) => {\n const [currentIndex, setCurrentIndex] = useState(0);\n const propertiesLength = availableProperties.length - 1;\n\n const onLeftClick = () => {\n if (currentIndex === 0) setCurrentIndex(propertiesLength);\n else setCurrentIndex(index => index - 1);\n };\n const onRightClick = () => {\n if (currentIndex === propertiesLength) setCurrentIndex(0);\n else setCurrentIndex(index => index + 1);\n };\n\n useEffect(() => {\n onChange(availableProperties[currentIndex]);\n }, [currentIndex]);\n\n useEffect(() => {\n setCurrentIndex(0);\n }, [JSON.stringify(availableProperties)]);\n\n const getCurrentSelectionName = () => {\n const item = availableProperties[currentIndex];\n if (item) {\n return item.name;\n }\n return '';\n };\n\n return (\n <Container>\n <TextOverlay>\n <p>\n <Item>\n <Ellipsis maxLines={1} maxWidth=\"60%\" center>\n {getCurrentSelectionName()}\n </Ellipsis>\n </Item>\n </p>\n </TextOverlay>\n <div className=\"rpgui-progress-track\"></div>\n\n <SelectArrow\n direction=\"left\"\n onClick={onLeftClick}\n onTouchStart={onLeftClick}\n ></SelectArrow>\n <SelectArrow\n direction=\"right\"\n onClick={onRightClick}\n onTouchStart={onRightClick}\n ></SelectArrow>\n </Container>\n );\n};\n\nconst Item = styled.span`\n font-size: 1rem;\n color: white;\n text-align: center;\n z-index: 1;\n position: absolute;\n top: 12px;\n width: 100%;\n\n p {\n margin: 0 auto;\n font-size: ${uiFonts.size.small};\n }\n`;\n\nconst TextOverlay = styled.div`\n width: 100%;\n position: relative;\n`;\n\ninterface IContainerProps {\n percentageWidth?: number;\n minWidth?: number;\n style?: Record<string, any>;\n}\n\nconst Container = styled.div<IContainerProps>`\n position: relative;\n display: flex;\n flex-direction: column;\n justify-content: start;\n align-items: flex-start;\n min-width: 100px;\n width: 40%;\n`;\n\nexport default PropertySelect;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\nimport { SpriteFromAtlas } from '../shared/SpriteFromAtlas';\n\nimport entitiesJSON from '../../mocks/atlas/entities/entities.json';\nimport entitiesIMG from '../../mocks/atlas/entities/entities.png';\nimport { ErrorBoundary } from '../Item/Inventory/ErrorBoundary';\nimport PropertySelect, {\n IPropertiesProps,\n} from '../PropertySelect/PropertySelect';\n\nexport interface ICharacterProps {\n name: string;\n textureKey: string;\n}\n\nexport interface ICharacterSelectionProps {\n availableCharacters: ICharacterProps[];\n onChange: (textureKey: string) => void;\n}\n\nexport const CharacterSelection: React.FC<ICharacterSelectionProps> = ({\n availableCharacters,\n onChange,\n}) => {\n const propertySelectValues = availableCharacters.map(item => {\n return {\n id: item.textureKey,\n name: item.name,\n };\n });\n\n const [selectedValue, setSelectedValue] = useState<IPropertiesProps>();\n const [selectedSpriteKey, setSelectedSpriteKey] = useState('');\n\n const onSelectedValueChange = () => {\n const textureKey = selectedValue ? selectedValue.id : '';\n const spriteKey = textureKey ? textureKey + '/down/standing/0.png' : '';\n\n if (spriteKey === selectedSpriteKey) {\n return;\n }\n\n setSelectedSpriteKey(spriteKey);\n onChange(textureKey);\n };\n\n useEffect(() => {\n onSelectedValueChange();\n }, [selectedValue]);\n\n useEffect(() => {\n setSelectedValue(propertySelectValues[0]);\n }, [availableCharacters]);\n\n return (\n <Container>\n {selectedSpriteKey && (\n <ErrorBoundary>\n <SpriteFromAtlas\n spriteKey={selectedSpriteKey}\n atlasIMG={entitiesIMG}\n atlasJSON={entitiesJSON}\n imgScale={4}\n height={80}\n width={64}\n containerStyle={{\n display: 'flex',\n alignItems: 'center',\n paddingBottom: '15px',\n }}\n imgStyle={{\n left: '22px',\n }}\n />\n </ErrorBoundary>\n )}\n <PropertySelect\n availableProperties={propertySelectValues}\n onChange={value => {\n setSelectedValue(value);\n }}\n />\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n image-rendering: pixelated;\n`;\n\nexport default CharacterSelection;\n","import React from 'react';\n\nexport interface IInputProps\n extends React.DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n > {}\n\nexport const Input: React.FC<IInputProps> = ({ ...props }) => {\n return <input {...props} />;\n};\n","import styled from 'styled-components';\n\ninterface IColumn {\n flex?: number;\n alignItems?: string;\n justifyContent?: string;\n flexWrap?: string;\n}\n\nexport const Column = styled.div<IColumn>`\n flex: ${props => props.flex || 'auto'};\n display: flex;\n flex-wrap: ${props => props.flexWrap || 'nowrap'};\n align-items: ${props => props.alignItems || 'flex-start'};\n justify-content: ${props => props.justifyContent || 'flex-start'};\n`;\n","import { IChatMessage } from '@rpg-engine/shared';\nimport dayjs from 'dayjs';\nimport React, { useEffect, useState } from 'react';\nimport { ErrorBoundary } from 'react-error-boundary';\nimport styled from 'styled-components';\nimport { uiColors } from '../../constants/uiColors';\nimport { uiFonts } from '../../constants/uiFonts';\nimport { Button, ButtonTypes } from '../Button';\nimport { Input } from '../Input';\nimport { RPGUIContainer, RPGUIContainerTypes } from '../RPGUIContainer';\nimport { Column } from '../shared/Column';\n\ninterface IEmitter {\n _id: string;\n name: string;\n}\nexport interface IChatProps {\n chatMessages: IChatMessage[];\n onSendChatMessage: (message: string) => void;\n onCloseButton: () => void;\n onFocus?: () => void;\n onBlur?: () => void;\n opacity?: number;\n width?: string;\n height?: string;\n}\n\nexport const Chat: React.FC<IChatProps> = ({\n chatMessages,\n onSendChatMessage,\n opacity = 1,\n width = '100%',\n height = '250px',\n onCloseButton,\n onFocus,\n onBlur,\n}) => {\n const [message, setMessage] = useState('');\n\n useEffect(() => {\n scrollChatToBottom();\n }, []);\n\n useEffect(() => {\n scrollChatToBottom();\n }, [chatMessages]);\n\n const scrollChatToBottom = () => {\n const scrollingElement = document.querySelector('.chat-body');\n if (scrollingElement) {\n scrollingElement.scrollTop = scrollingElement.scrollHeight;\n }\n };\n\n const handleSubmit = (event: React.SyntheticEvent<HTMLFormElement>) => {\n event.preventDefault();\n onSendChatMessage(message);\n setMessage('');\n };\n const getInputValue = (value: string) => {\n setMessage(value);\n };\n\n const onRenderMessageLines = (\n emitter: IEmitter,\n createdAt: string | undefined,\n message: string\n ) => {\n return `${dayjs(createdAt || new Date()).format('HH:mm')} ${\n emitter?.name ? `${emitter.name}: ` : 'Unknown: '\n } ${message}`;\n };\n\n const onRenderChatMessages = (chatMessages: IChatMessage[]) => {\n return chatMessages?.length ? (\n chatMessages?.map(({ _id, createdAt, emitter, message }, index) => (\n <MessageText key={`${_id}_${index}`}>\n {onRenderMessageLines(emitter, createdAt, message)}\n </MessageText>\n ))\n ) : (\n <MessageText>No messages available.</MessageText>\n );\n };\n\n return (\n <Container>\n <CustomContainer\n type={RPGUIContainerTypes.FramedGrey}\n width={width}\n height={height}\n className=\"chat-container\"\n opacity={opacity}\n >\n <ErrorBoundary fallback={<p>Oops! Your chat has crashed.</p>}>\n {onCloseButton && (\n <CloseButton onClick={onCloseButton} onTouchStart={onCloseButton}>\n X\n </CloseButton>\n )}\n <RPGUIContainer\n type={RPGUIContainerTypes.FramedGrey}\n width={'100%'}\n height={'80%'}\n className=\"chat-body dark-background\"\n >\n {onRenderChatMessages(chatMessages)}\n </RPGUIContainer>\n\n <Form onSubmit={handleSubmit}>\n <Column flex={70}>\n <CustomInput\n value={message}\n id=\"inputMessage\"\n onChange={e => getInputValue(e.target.value)}\n height={20}\n className=\"chat-input dark-background\"\n type=\"text\"\n autoComplete=\"off\"\n onFocus={onFocus}\n onBlur={onBlur}\n />\n </Column>\n <Column justifyContent=\"flex-end\">\n <Button\n buttonType={ButtonTypes.RPGUIButton}\n id=\"chat-send-button\"\n >\n Send\n </Button>\n </Column>\n </Form>\n </ErrorBoundary>\n </CustomContainer>\n </Container>\n );\n};\n\nconst Container = styled.div`\n position: relative;\n`;\n\nconst CloseButton = styled.div`\n position: absolute;\n top: 2px;\n right: 0px;\n color: white;\n z-index: 22;\n font-size: 0.7rem;\n`;\n\nconst CustomInput = styled(Input)`\n height: 30px;\n width: 100%;\n\n .rpgui-content .input {\n min-height: 39px;\n }\n`;\n\ninterface ICustomContainerProps {\n opacity: number;\n}\n\nconst CustomContainer = styled(RPGUIContainer)`\n display: block;\n\n opacity: ${(props: ICustomContainerProps) => props.opacity};\n\n &:hover {\n opacity: 1;\n }\n\n .dark-background {\n background-color: ${uiColors.darkGray} !important;\n }\n\n .chat-body {\n &.rpgui-container.framed-grey {\n background: unset;\n }\n max-height: 170px;\n overflow-y: auto;\n }\n`;\n\nconst Form = styled.form`\n display: flex;\n width: 100%;\n justify-content: center;\n align-items: center;\n`;\n\nconst MessageText = styled.p`\n display: block !important;\n width: 100%;\n font-size: ${uiFonts.size.xsmall} !important;\n overflow-y: auto;\n margin: 0;\n`;\n","export const uiColors = {\n lightGray: '#757161',\n gray: '#4E4A4E',\n darkGray: '#3e3e3e',\n darkYellow: '#FFC857',\n yellow: '#FFFF00',\n orange: '#D27D2C',\n cardinal: '#C5283D',\n red: '#D04648',\n darkRed: '#442434',\n raisinBlack: '#191923',\n navyBlue: '#0E79B2',\n purple: '#6833A3',\n darkPurple: '#522761',\n blue: '#597DCE',\n darkBlue: '#30346D',\n brown: '#854C30',\n lightGreen: '#6DAA2C',\n brownGreen: '#346524',\n};\n","import { useEffect } from 'react';\n\nexport function useOutsideClick(ref: any, id: string) {\n useEffect(() => {\n /**\n * Alert if clicked on outside of element\n */\n function handleClickOutside(event: any) {\n if (ref.current && !ref.current.contains(event.target)) {\n const event = new CustomEvent('clickOutside', {\n detail: {\n id,\n },\n });\n document.dispatchEvent(event);\n }\n }\n // Bind the event listener\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n // Unbind the event listener on clean up\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [ref]);\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport { RPGUIContainer, RPGUIContainerTypes } from '../RPGUIContainer';\nimport { NPCDialogText } from './NPCDialogText';\nimport {\n IQuestionDialog,\n IQuestionDialogAnswer,\n QuestionDialog,\n} from './QuestionDialog/QuestionDialog';\nimport aliceDefaultThumbnail from './img/npcDialog/npcThumbnails/alice.png';\n\nexport enum NPCDialogType {\n TextOnly = 'TextOnly',\n TextAndThumbnail = 'TextAndThumbnail',\n}\n\nexport interface INPCDialogProps {\n text?: string;\n type: NPCDialogType;\n imagePath?: string;\n onClose?: () => void;\n isQuestionDialog?: boolean;\n answers?: IQuestionDialogAnswer[];\n questions?: IQuestionDialog[];\n}\n\nexport const NPCDialog: React.FC<INPCDialogProps> = ({\n text,\n type,\n onClose,\n imagePath,\n isQuestionDialog = false,\n questions,\n answers,\n}) => {\n return (\n <RPGUIContainer\n type={RPGUIContainerTypes.FramedGold}\n width={isQuestionDialog ? '600px' : '80%'}\n height={'180px'}\n >\n {isQuestionDialog && questions && answers ? (\n <>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <QuestionDialog\n questions={questions}\n answers={answers}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </>\n ) : (\n <>\n <Container>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <NPCDialogText\n type={type}\n text={text || 'No text provided.'}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </Container>\n </>\n )}\n </RPGUIContainer>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n position: relative;\n`;\n\ninterface ITextContainerProps {\n flex: string;\n}\n\nconst TextContainer = styled.div<ITextContainerProps>`\n flex: ${({ flex }) => flex} 0 0;\n width: 355px;\n`;\n\nconst ThumbnailContainer = styled.div`\n flex: 30% 0 0;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst NPCThumbnail = styled.img`\n image-rendering: pixelated;\n height: 128px;\n width: 128px;\n`;\n","import React, { useEffect, useRef } from 'react';\nimport Draggable, { DraggableData } from 'react-draggable';\nimport styled from 'styled-components';\nimport { uiFonts } from '../constants/uiFonts';\nimport { useOutsideClick } from '../hooks/useOutsideAlerter';\nimport { IPosition } from '../types/eventTypes';\nimport { RPGUIContainerTypes } from './RPGUIContainer';\n\nexport interface IDraggableContainerProps {\n children: React.ReactNode;\n width?: string;\n height?: string;\n className?: string;\n type?: RPGUIContainerTypes;\n title?: string;\n imgSrc?: string;\n imgWidth?: string;\n onCloseButton?: () => void;\n cancelDrag?: string;\n onPositionChange?: (position: IPosition) => void;\n onOutsideClick?: () => void;\n}\n\nexport const DraggableContainer: React.FC<IDraggableContainerProps> = ({\n children,\n width = '50%',\n height,\n className,\n type = RPGUIContainerTypes.FramedGold,\n onCloseButton,\n title,\n imgSrc,\n imgWidth = '20px',\n cancelDrag,\n onPositionChange,\n onOutsideClick,\n}) => {\n const draggableRef = useRef(null);\n\n useOutsideClick(draggableRef, 'item-container');\n\n useEffect(() => {\n document.addEventListener('clickOutside', event => {\n const e = event as CustomEvent;\n\n if (e.detail.id === 'item-container') {\n if (onOutsideClick) {\n onOutsideClick();\n }\n }\n });\n\n return () => {\n document.removeEventListener('clickOutside', _e => {});\n };\n }, []);\n\n return (\n <Draggable\n cancel={`.container-close,${cancelDrag}`}\n onDrag={(_e, data: DraggableData) => {\n if (onPositionChange) {\n onPositionChange({\n x: data.x,\n y: data.y,\n });\n }\n }}\n >\n <Container\n ref={draggableRef}\n width={width}\n height={height || 'auto'}\n className={`rpgui-container ${type} ${className}`}\n >\n {title && (\n <TitleContainer className=\"drag-handler\">\n <Title>\n {imgSrc && <Icon src={imgSrc} width={imgWidth} />}\n {title}\n </Title>\n </TitleContainer>\n )}\n {onCloseButton && (\n <CloseButton\n className=\"container-close\"\n onClick={onCloseButton}\n onTouchStart={onCloseButton}\n >\n X\n </CloseButton>\n )}\n\n {children}\n </Container>\n </Draggable>\n );\n};\n\ninterface IContainerProps {\n width: string;\n height: string;\n}\n\nconst Container = styled.div<IContainerProps>`\n height: ${props => props.height};\n width: ${({ width }) => width};\n display: flex;\n flex-wrap: wrap;\n image-rendering: pixelated;\n\n &.rpgui-container {\n padding-top: 1.5rem;\n }\n`;\n\nconst CloseButton = styled.div`\n position: absolute;\n top: 3px;\n right: 0px;\n color: white;\n z-index: 22;\n font-size: 0.8rem;\n`;\n\nconst TitleContainer = styled.div`\n width: 100%;\n height: 100%;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n`;\n\nconst Title = styled.h1`\n color: white;\n z-index: 22;\n font-size: ${uiFonts.size.large};\n`;\n\ninterface ICustomIconProps {\n width: string;\n}\n\nconst Icon = styled.img`\n color: white;\n z-index: 22;\n font-size: ${uiFonts.size.xsmall};\n width: ${(props: ICustomIconProps) => props.width};\n margin-right: 0.5rem;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport interface IOptionsProps {\n id: number;\n value: string;\n option: string;\n}\n\nexport interface IDropdownProps {\n options: IOptionsProps[];\n width?: string;\n onChange: (value: string) => void;\n}\n\nexport const Dropdown: React.FC<IDropdownProps> = ({\n options,\n width,\n onChange,\n}) => {\n const dropdownId = uuidv4();\n\n const [selectedValue, setSelectedValue] = useState<string>('');\n const [selectedOption, setSelectedOption] = useState<string>('');\n const [opened, setOpened] = useState<boolean>(false);\n\n useEffect(() => {\n const firstOption = options[0];\n\n if (firstOption && !selectedValue) {\n setSelectedValue(firstOption.value);\n setSelectedOption(firstOption.option);\n }\n }, [options]);\n\n useEffect(() => {\n if (selectedValue) {\n onChange(selectedValue);\n }\n }, [selectedValue]);\n\n return (\n <Container onMouseLeave={() => setOpened(false)} width={width}>\n <DropdownSelect\n id={`dropdown-${dropdownId}`}\n className=\"rpgui-dropdown-imp rpgui-dropdown-imp-header\"\n onClick={() => setOpened(prev => !prev)}\n >\n <label>▼</label> {selectedOption}\n </DropdownSelect>\n\n <DropdownOptions className=\"rpgui-dropdown-imp\" opened={opened}>\n {options.map(option => {\n return (\n <li\n key={option.id}\n onClick={() => {\n setSelectedValue(option.value);\n setSelectedOption(option.option);\n setOpened(false);\n }}\n >\n {option.option}\n </li>\n );\n })}\n </DropdownOptions>\n </Container>\n );\n};\n\nconst Container = styled.div<{ width: string | undefined }>`\n position: relative;\n width: ${props => props.width || '100%'};\n`;\n\nconst DropdownSelect = styled.p`\n width: 100%;\n box-sizing: border-box;\n`;\n\nconst DropdownOptions = styled.ul<{\n opened: boolean;\n}>`\n position: absolute;\n width: 100%;\n display: ${props => (props.opened ? 'block' : 'none')};\n box-sizing: border-box;\n`;\n","import { ICraftableItem, ItemSubType } from '@rpg-engine/shared';\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Button, ButtonTypes } from '../Button';\nimport { DraggableContainer } from '../DraggableContainer';\nimport { Dropdown, IOptionsProps } from '../Dropdown';\nimport { RPGUIContainerTypes } from '../RPGUIContainer';\nimport { SpriteFromAtlas } from '../shared/SpriteFromAtlas';\n\nexport interface IItemCraftSelectorProps {\n atlasJSON: any;\n atlasIMG: any;\n onClose: () => void;\n onSelect: (value: string) => void;\n onCraftItem: (value: string | undefined) => void;\n craftablesItems: ICraftableItem[];\n}\n\nexport interface ShowMessage {\n show: boolean;\n index: number;\n}\n\nexport const CraftBook: React.FC<IItemCraftSelectorProps> = ({\n atlasIMG,\n atlasJSON,\n onClose,\n onSelect,\n onCraftItem,\n craftablesItems,\n}) => {\n let optionsId: number = 0;\n const [isShown, setIsShown] = useState<ShowMessage>({\n show: false,\n index: 200,\n });\n const [craftItem, setCraftItem] = useState<string>();\n\n const getDropdownOptions = () => {\n const options: IOptionsProps[] = [];\n\n Object.keys(ItemSubType).forEach(key => {\n options.push({\n id: optionsId,\n value: key,\n option: key,\n });\n optionsId += 1;\n });\n\n return options;\n };\n\n const modifyString = (str: string) => {\n // Split the string by \"/\" and \".\"\n let parts = str.split('/');\n let fileName = parts[parts.length - 1];\n parts = fileName.split('.');\n let name = parts[0];\n\n // Replace all occurrences of \"-\" with \" \"\n name = name.replace(/-/g, ' ');\n\n // Uppercase the first word\n let words = name.split(' ');\n let firstWord = words[0].slice(0, 1).toUpperCase() + words[0].slice(1);\n let modifiedWords = [firstWord].concat(words.slice(1));\n name = modifiedWords.join(' ');\n\n return name;\n };\n\n const handleClick = () => {\n let element = document.querySelector(\n `input[name='test']:checked`\n ) as HTMLInputElement;\n const elementValue = element.value;\n setCraftItem(elementValue);\n };\n\n return (\n <DraggableContainer\n type={RPGUIContainerTypes.Framed}\n width=\"500px\"\n cancelDrag=\".equipment-container-body .arrow-selector\"\n onCloseButton={() => {\n if (onClose) {\n onClose();\n }\n }}\n >\n <div style={{ width: '100%' }}>\n <Title>{'Craftbook'}</Title>\n <Subtitle>{'Select an item to craft'}</Subtitle>\n <hr className=\"golden\" />\n </div>\n <Dropdown\n options={getDropdownOptions()}\n onChange={value => onSelect(value)}\n />\n <RadioInputScroller>\n {craftablesItems?.map((option, index) => (\n <RadioOptionsWrapper key={index}>\n <SpriteAtlasWrapper>\n <SpriteFromAtlas\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={option.texturePath}\n imgScale={3}\n grayScale={!option.canCraft}\n />\n </SpriteAtlasWrapper>\n <div>\n <input\n className=\"rpgui-radio\"\n type=\"radio\"\n value={option.name}\n name=\"test\"\n disabled={!option.canCraft}\n />\n <label\n onClick={handleClick}\n style={{ display: 'flex', alignItems: 'center' }}\n onMouseEnter={() => setIsShown({ show: true, index: index })}\n onMouseLeave={() => setIsShown({ show: false, index: index })}\n >\n {modifyString(option.name)}\n </label>\n\n {isShown &&\n isShown.index === index &&\n option.ingredients.map((option, index) => (\n <Recipes key={index}>\n <SpriteFromAtlas\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={option.texturePath}\n imgScale={1}\n />\n <StyledItem>\n {modifyString(option.key)} ({option.qty}x)\n </StyledItem>\n </Recipes>\n ))}\n </div>\n </RadioOptionsWrapper>\n ))}\n </RadioInputScroller>\n <ButtonWrapper>\n <Button buttonType={ButtonTypes.RPGUIButton} onClick={onClose}>\n Cancel\n </Button>\n <Button\n buttonType={ButtonTypes.RPGUIButton}\n onClick={() => onCraftItem(craftItem)}\n >\n Craft\n </Button>\n </ButtonWrapper>\n </DraggableContainer>\n );\n};\n\nconst StyledItem = styled.div`\n margin-left: 10px;\n`;\n\nconst Recipes = styled.div`\n font-size: 0.6rem;\n color: yellow !important;\n margin-bottom: 3px;\n display: flex;\n align-items: center;\n\n .sprite-from-atlas-img {\n top: 0px;\n left: 0px;\n }\n`;\n\nconst Title = styled.h1`\n font-size: 0.6rem;\n color: yellow !important;\n`;\nconst Subtitle = styled.h1`\n font-size: 0.4rem;\n color: yellow !important;\n`;\n\nconst RadioInputScroller = styled.div`\n padding-left: 15px;\n padding-top: 10px;\n width: 100%;\n margin-top: 1rem;\n align-items: center;\n margin-left: 20px;\n align-items: flex-start;\n overflow-y: scroll;\n height: 360px;\n`;\n\nconst SpriteAtlasWrapper = styled.div`\n margin-right: 40px;\n`;\n\nconst RadioOptionsWrapper = styled.div`\n display: flex;\n align-items: stretch;\n margin-bottom: 40px;\n`;\n\nconst ButtonWrapper = styled.div`\n display: flex;\n justify-content: space-around;\n padding-top: 20px;\n width: 100%;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { uiFonts } from '../constants/uiFonts';\nimport { Dropdown } from './Dropdown';\n\ninterface IDropdownSelectorOption {\n id: string;\n name: string;\n}\n\nexport interface IDropdownSelectorContainer {\n onChange: (id: string) => void;\n options: IDropdownSelectorOption[];\n details?: string;\n title: string;\n}\n\nexport const DropdownSelectorContainer: React.FC<IDropdownSelectorContainer> = ({\n title,\n onChange,\n options,\n details,\n}) => {\n return (\n <div>\n <p>{title}</p>\n <Dropdown\n options={options.map((option, index) => ({\n option: option.name,\n value: option.id,\n id: index,\n }))}\n onChange={onChange}\n />\n <Details>{details}</Details>\n </div>\n );\n};\n\nconst Details = styled.p`\n font-size: ${uiFonts.size.xsmall} !important;\n`;\n","import React, { useEffect, useRef } from 'react';\nimport styled from 'styled-components';\nimport { useOutsideClick } from '../hooks/useOutsideAlerter';\n\ninterface IListMenuOption {\n id: string;\n text: string;\n}\n\nexport interface IRelativeMenuProps {\n options: IListMenuOption[];\n onSelected: (selectedOptionId: string) => void;\n fontSize?: number;\n onOutsideClick?: () => void;\n}\n\nexport const RelativeListMenu: React.FC<IRelativeMenuProps> = ({\n options,\n onSelected,\n onOutsideClick,\n fontSize = 0.8,\n}) => {\n const ref = useRef(null);\n\n useOutsideClick(ref, 'relative-context-menu');\n\n useEffect(() => {\n document.addEventListener('clickOutside', event => {\n const e = event as CustomEvent;\n\n if (e.detail.id === 'relative-context-menu') {\n if (onOutsideClick) {\n onOutsideClick();\n }\n }\n });\n\n return () => {\n document.removeEventListener('clickOutside', _e => {});\n };\n }, []);\n\n return (\n <Container fontSize={fontSize} ref={ref}>\n <ul className=\"rpgui-list-imp\" style={{ overflow: 'hidden' }}>\n {options.map((params, index) => (\n <ListElement\n key={params?.id || index}\n onClick={() => {\n onSelected(params?.id);\n }}\n >\n {params?.text || 'No text'}\n </ListElement>\n ))}\n </ul>\n </Container>\n );\n};\n\ninterface IContainerProps {\n fontSize?: number;\n}\n\nconst Container = styled.div<IContainerProps>`\n position: absolute;\n top: 1rem;\n left: 4rem;\n\n display: flex;\n flex-direction: column;\n width: max-content;\n justify-content: start;\n align-items: flex-start;\n\n li {\n font-size: ${props => props.fontSize}em;\n }\n`;\n\nconst ListElement = styled.li`\n margin-right: 0.5rem;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { uiFonts } from '../../../constants/uiFonts';\n\ninterface IProps {\n label: string;\n}\n\nexport const ItemTooltip: React.FC<IProps> = ({ label }) => {\n return (\n <Container>\n <div>{label}</div>\n </Container>\n );\n};\n\nconst Container = styled.div`\n z-index: 2;\n position: absolute;\n top: 1rem;\n left: 4rem;\n\n font-size: ${uiFonts.size.xxsmall};\n color: white;\n background-color: black;\n border-radius: 5px;\n padding: 0.5rem;\n min-width: 20px;\n width: 100%;\n text-align: center;\n\n opacity: 0.75;\n`;\n","import {\n ActionsForEquipmentSet,\n ActionsForInventory,\n ActionsForLoot,\n ActionsForMapContainer,\n IItem,\n ItemContainerType,\n ItemSocketEventsDisplayLabels,\n ItemType,\n} from '@rpg-engine/shared';\n\nexport interface IContextMenuItem {\n id: string;\n text: string;\n}\n\nconst generateContextMenuListOptions = (actionsByTypeList: any) => {\n const contextMenu: IContextMenuItem[] = actionsByTypeList.map(\n (action: string) => {\n return { id: action, text: ItemSocketEventsDisplayLabels[action] };\n }\n );\n return contextMenu;\n};\n\nexport const generateContextMenu = (\n item: IItem,\n itemContainerType: ItemContainerType | null\n) => {\n let contextActionMenu: IContextMenuItem[] = [];\n\n if (itemContainerType === ItemContainerType.Inventory) {\n switch (item.type) {\n case ItemType.Weapon:\n case ItemType.Armor:\n case ItemType.Accessory:\n case ItemType.Jewelry:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForInventory.Equipment\n );\n break;\n case ItemType.Container:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForInventory.Container\n );\n break;\n case ItemType.Consumable:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForInventory.Consumable\n );\n break;\n case ItemType.CraftingResource:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForInventory.CraftingResource\n );\n break;\n case ItemType.Tool:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForInventory.Tool\n );\n break;\n\n default:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForInventory.Other\n );\n break;\n }\n }\n if (itemContainerType === ItemContainerType.Equipment) {\n switch (item.type) {\n case ItemType.Container:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForEquipmentSet.Container\n );\n\n break;\n default:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForEquipmentSet.Equipment\n );\n }\n }\n if (itemContainerType === ItemContainerType.Loot) {\n switch (item.type) {\n case ItemType.Weapon:\n case ItemType.Armor:\n case ItemType.Accessory:\n case ItemType.Jewelry:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForLoot.Equipment\n );\n break;\n case ItemType.Consumable:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForLoot.Consumable\n );\n break;\n case ItemType.CraftingResource:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForLoot.CraftingResource\n );\n break;\n case ItemType.Tool:\n contextActionMenu = generateContextMenuListOptions(ActionsForLoot.Tool);\n break;\n default:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForLoot.Other\n );\n break;\n }\n }\n if (itemContainerType === ItemContainerType.MapContainer) {\n switch (item.type) {\n case ItemType.Weapon:\n case ItemType.Armor:\n case ItemType.Accessory:\n case ItemType.Jewelry:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForMapContainer.Equipment\n );\n break;\n case ItemType.Consumable:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForMapContainer.Consumable\n );\n break;\n case ItemType.CraftingResource:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForMapContainer.CraftingResource\n );\n break;\n case ItemType.Tool:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForMapContainer.Tool\n );\n break;\n default:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForMapContainer.Other\n );\n break;\n }\n\n const contextActionMenuDontHaveUseWith = !contextActionMenu.find(action =>\n action.text.toLowerCase().includes('use with')\n );\n\n if (item.hasUseWith && contextActionMenuDontHaveUseWith) {\n contextActionMenu.push({ id: 'use-with', text: 'Use with...' });\n }\n }\n\n return contextActionMenu;\n};\n","import {\n getItemTextureKeyPath,\n IItem,\n IItemContainer,\n ItemContainerType,\n ItemSlotType,\n ItemType,\n} from '@rpg-engine/shared';\n\nimport { observer } from 'mobx-react-lite';\nimport React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { v4 as uuidv4 } from 'uuid';\nimport { uiFonts } from '../../../constants/uiFonts';\nimport { RelativeListMenu } from '../../RelativeListMenu';\nimport { Ellipsis } from '../../shared/Ellipsis';\nimport { SpriteFromAtlas } from '../../shared/SpriteFromAtlas';\nimport { ItemTooltip } from '../Cards/ItemTooltip';\nimport { ErrorBoundary } from './ErrorBoundary';\nimport { generateContextMenu, IContextMenuItem } from './itemContainerHelper';\n\nconst EquipmentSlotSpriteByType: any = {\n Neck: 'accessories/corruption-necklace.png',\n LeftHand: 'swords/broad-sword.png',\n Ring: 'rings/iron-ring.png',\n Head: 'helmets/viking-helmet.png',\n Torso: 'armors/iron-armor.png',\n Legs: 'legs/studded-legs.png',\n Feet: 'boots/iron-boots.png',\n Inventory: 'containers/bag.png',\n RightHand: 'shields/plate-shield.png',\n Accessory: 'ranged-weapons/arrow.png',\n};\n\ninterface IProps {\n slotIndex: number;\n item: IItem | null;\n itemContainer?: IItemContainer | null;\n itemContainerType: ItemContainerType | null;\n slotSpriteMask?: ItemSlotType | null;\n onSelected: (selectedOption: string, item: IItem) => void;\n onMouseOver: (\n event: any,\n slotIndex: number,\n item: IItem | null,\n x: number,\n y: number\n ) => void;\n onMouseOut?: () => void;\n onClick: (\n ItemType: ItemType,\n itemContainerType: ItemContainerType | null,\n item: IItem\n ) => void;\n atlasJSON: any;\n atlasIMG: any;\n isContextMenuDisabled?: boolean;\n}\n\nexport const ItemSlot: React.FC<IProps> = observer(\n ({\n slotIndex,\n item,\n itemContainerType: containerType,\n slotSpriteMask,\n onMouseOver,\n onMouseOut,\n onClick,\n onSelected,\n atlasJSON,\n atlasIMG,\n isContextMenuDisabled = false,\n }) => {\n const [isTooltipVisible, setTooltipVisible] = useState(false);\n\n const [isContextMenuVisible, setIsContextMenuVisible] = useState(false);\n\n const [contextActions, setContextActions] = useState<IContextMenuItem[]>(\n []\n );\n\n useEffect(() => {\n if (item) {\n setContextActions(generateContextMenu(item, containerType));\n }\n }, [item]);\n\n const getStackInfo = (itemId: string, stackQty: number) => {\n // if (itemToRender?.isStackable && itemToRender?.stackQty) {\n\n const isFractionalStackQty = stackQty % 1 !== 0;\n const isLargerThan999 = stackQty > 999;\n\n if (stackQty > 1) {\n return (\n <ItemQtyContainer key={`qty-${itemId}`}>\n <Ellipsis maxLines={1} maxWidth=\"48px\">\n <ItemQty\n className={\n isFractionalStackQty || isLargerThan999 ? 'small' : 'regular'\n }\n >\n {' '}\n {stackQty}{' '}\n </ItemQty>\n </Ellipsis>\n </ItemQtyContainer>\n );\n }\n return undefined;\n };\n\n const renderItem = (itemToRender: IItem | null) => {\n const element = [];\n if (itemToRender?.texturePath) {\n element.push(\n <ErrorBoundary key={itemToRender._id}>\n <SpriteFromAtlas\n key={itemToRender._id}\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={getItemTextureKeyPath(itemToRender, atlasJSON)}\n imgScale={3}\n />\n </ErrorBoundary>\n );\n }\n const stackInfo = getStackInfo(\n itemToRender?._id ?? '',\n itemToRender?.stackQty ?? 0\n );\n if (stackInfo) {\n element.push(stackInfo);\n }\n\n return element;\n };\n\n const renderEquipment = (itemToRender: IItem | null) => {\n if (\n itemToRender?.texturePath &&\n itemToRender.allowedEquipSlotType?.includes(slotSpriteMask!)\n ) {\n const element = [];\n element.push(\n <ErrorBoundary key={itemToRender._id}>\n <SpriteFromAtlas\n key={itemToRender._id}\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={getItemTextureKeyPath(itemToRender, atlasJSON)}\n imgScale={3}\n />\n </ErrorBoundary>\n );\n const stackInfo = getStackInfo(\n itemToRender?._id ?? '',\n itemToRender?.stackQty ?? 0\n );\n if (stackInfo) {\n element.push(stackInfo);\n }\n return element;\n } else {\n return (\n <ErrorBoundary key={uuidv4()}>\n <SpriteFromAtlas\n key={uuidv4()}\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={EquipmentSlotSpriteByType[slotSpriteMask!]}\n imgScale={3}\n grayScale={true}\n opacity={0.4}\n />\n </ErrorBoundary>\n );\n }\n };\n\n const onRenderSlot = (itemToRender: IItem | null) => {\n switch (containerType) {\n case ItemContainerType.Equipment:\n return renderEquipment(itemToRender);\n case ItemContainerType.Inventory:\n return renderItem(itemToRender);\n default:\n return renderItem(itemToRender);\n }\n };\n\n return (\n <Container\n className=\"rpgui-icon empty-slot\"\n onMouseOver={event =>\n onMouseOver(event, slotIndex, item, event.clientX, event.clientY)\n }\n onMouseOut={() => {\n if (onMouseOut) onMouseOut();\n }}\n onMouseEnter={() => setTooltipVisible(true)}\n onMouseLeave={() => setTooltipVisible(false)}\n onClick={() => {\n setTooltipVisible(false);\n\n if (item) {\n if (!isContextMenuDisabled) {\n setIsContextMenuVisible(!isContextMenuVisible);\n }\n\n onClick(item.type, containerType, item);\n }\n }}\n >\n {!isContextMenuDisabled && isContextMenuVisible && contextActions && (\n <RelativeListMenu\n options={contextActions}\n onSelected={(optionId: string) => {\n setIsContextMenuVisible(false);\n if (item) {\n onSelected(optionId, item);\n }\n }}\n onOutsideClick={() => {\n setIsContextMenuVisible(false);\n }}\n />\n )}\n\n {isTooltipVisible && item && <ItemTooltip label={item.name} />}\n\n {onRenderSlot(item)}\n </Container>\n );\n }\n);\n\nconst Container = styled.div`\n margin: 0.1rem;\n .sprite-from-atlas-img {\n position: relative;\n top: 1.5rem;\n left: 1.5rem;\n }\n position: relative;\n`;\n\nconst ItemQtyContainer = styled.div`\n position: relative;\n width: 85%;\n height: 16px;\n top: 25px;\n left: 2px;\n\n display: flex;\n justify-content: flex-end;\n`;\n\nconst ItemQty = styled.span`\n &.regular {\n font-size: ${uiFonts.size.small};\n }\n &.small {\n font-size: ${uiFonts.size.xsmall};\n }\n`;\n","import {\n IEquipmentSet,\n IItem,\n IItemContainer,\n ItemContainerType,\n ItemSlotType,\n ItemType,\n} from '@rpg-engine/shared';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { DraggableContainer } from '../DraggableContainer';\nimport { ItemSlot } from '../Item/Inventory/ItemSlot';\nimport { RPGUIContainerTypes } from '../RPGUIContainer';\n\nexport interface IEquipmentSetProps {\n equipmentSet: IEquipmentSet;\n onClose?: () => void;\n onItemClick?: (\n ItemType: ItemType,\n item: IItem,\n itemContainerType: ItemContainerType | null\n ) => void;\n onMouseOver?: (e: any, slotIndex: number, item: IItem | null) => void;\n onSelected?: (optionId: string) => void;\n initialPosition?: { x: number; y: number };\n type: ItemContainerType | null;\n atlasIMG: any;\n atlasJSON: any;\n}\n\nexport const EquipmentSet: React.FC<IEquipmentSetProps> = ({\n equipmentSet,\n onClose,\n onMouseOver,\n onSelected,\n onItemClick,\n atlasIMG,\n atlasJSON,\n}) => {\n const {\n neck,\n leftHand,\n ring,\n head,\n armor,\n legs,\n boot,\n inventory,\n rightHand,\n accessory,\n } = equipmentSet;\n\n const equipmentData = [\n neck,\n leftHand,\n ring,\n head,\n armor,\n legs,\n boot,\n inventory,\n rightHand,\n accessory,\n ];\n\n const equipmentMaskSlots = [\n ItemSlotType.Neck,\n ItemSlotType.LeftHand,\n ItemSlotType.Ring,\n ItemSlotType.Head,\n ItemSlotType.Torso,\n ItemSlotType.Legs,\n ItemSlotType.Feet,\n ItemSlotType.Inventory,\n ItemSlotType.RightHand,\n ItemSlotType.Accessory,\n ];\n\n const onRenderEquipmentSlotRange = (start: number, end: number) => {\n const equipmentRange = equipmentData.slice(start, end);\n const slotMaksRange = equipmentMaskSlots.slice(start, end);\n\n return equipmentRange.map((data, i) => {\n const item = data as IItem;\n const itemContainer =\n (item && (item.itemContainer as IItemContainer)) ?? null;\n\n return (\n <ItemSlot\n key={i}\n slotIndex={i}\n item={item}\n itemContainer={itemContainer}\n itemContainerType={ItemContainerType.Equipment}\n slotSpriteMask={slotMaksRange[i]}\n onMouseOver={(event, slotIndex, item) => {\n if (onMouseOver) onMouseOver(event, slotIndex, item);\n }}\n onClick={(itemType, ContainerType) => {\n if (onItemClick) onItemClick(itemType, item, ContainerType);\n }}\n onSelected={(optionId: string) => {\n if (onSelected) onSelected(optionId);\n }}\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n />\n );\n });\n };\n\n return (\n <DraggableContainer\n title={'Equipments'}\n type={RPGUIContainerTypes.Framed}\n onCloseButton={() => {\n if (onClose) onClose();\n }}\n width=\"330px\"\n cancelDrag=\".equipment-container-body\"\n >\n <EquipmentSetContainer className=\"equipment-container-body\">\n <EquipmentColumn>{onRenderEquipmentSlotRange(0, 3)}</EquipmentColumn>\n <EquipmentColumn>{onRenderEquipmentSlotRange(3, 7)}</EquipmentColumn>\n <EquipmentColumn>{onRenderEquipmentSlotRange(7, 10)}</EquipmentColumn>\n </EquipmentSetContainer>\n </DraggableContainer>\n );\n};\n\nconst EquipmentSetContainer = styled.div`\n width: inherit;\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n flex-direction: row;\n`;\n\nconst EquipmentColumn = styled.div`\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n flex-direction: column;\n`;\n","import isMobile from 'is-mobile';\n\nexport const IS_MOBILE_OR_TABLET = isMobile({\n tablet: true,\n});\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n text: string;\n onFinish?: () => void;\n onStart?: () => void;\n}\n\nexport const DynamicText: React.FC<IProps> = ({ text, onFinish, onStart }) => {\n const [textState, setTextState] = useState<string>('');\n\n useEffect(() => {\n let i = 0;\n const interval = setInterval(() => {\n // on every interval, show one more character\n\n if (i === 0) {\n if (onStart) {\n onStart();\n }\n }\n\n if (i < text.length) {\n setTextState(text.substring(0, i + 1));\n i++;\n } else {\n clearInterval(interval);\n if (onFinish) {\n onFinish();\n }\n }\n }, 50);\n\n return () => {\n clearInterval(interval);\n };\n }, [text]);\n\n return <TextContainer>{textState}</TextContainer>;\n};\n\nconst TextContainer = styled.p`\n font-size: 0.7rem !important;\n color: white;\n text-shadow: 1px 1px 0px #000000;\n letter-spacing: 1.2px;\n word-break: normal;\n`;\n","import React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { NPCDialogType } from '../..';\nimport { IS_MOBILE_OR_TABLET } from '../../constants/uiDevices';\nimport { chunkString } from '../../libs/StringHelpers';\nimport { DynamicText } from '../typography/DynamicText';\nimport pressButtonGif from './img/press-button.gif';\nimport pressSpaceGif from './img/space.gif';\n\ninterface IProps {\n text: string;\n onClose: () => void;\n onEndStep?: () => void;\n onStartStep?: () => void;\n type?: NPCDialogType;\n}\n\nexport const NPCDialogText: React.FC<IProps> = ({\n text,\n onClose,\n onEndStep,\n onStartStep,\n type,\n}) => {\n const windowSize = useRef([window.innerWidth, window.innerHeight]);\n function maxCharacters(width: number) {\n // Set the font size to 16 pixels\n var fontSize = 11.2;\n\n // Calculate the number of characters that can fit in one line\n var charactersPerLine = Math.floor(width / 2 / fontSize);\n\n // Calculate the number of lines that can fit in the div\n var linesPerDiv = Math.floor(180 / fontSize);\n\n // Calculate the maximum number of characters that can fit in the div\n var maxCharacters = charactersPerLine * linesPerDiv;\n\n // Return the maximum number of characters\n return Math.round(maxCharacters / 5);\n }\n\n const textChunks = chunkString(text, maxCharacters(windowSize.current[0]));\n\n const [chunkIndex, setChunkIndex] = useState<number>(0);\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n goToNextStep();\n }\n };\n\n const goToNextStep = () => {\n const hasNextChunk = textChunks?.[chunkIndex + 1] || false;\n\n if (hasNextChunk) {\n setChunkIndex(prev => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [chunkIndex]);\n\n const [showGoNextIndicator, setShowGoNextIndicator] = useState<boolean>(\n false\n );\n\n return (\n <Container>\n <DynamicText\n text={textChunks?.[chunkIndex] || ''}\n onFinish={() => {\n setShowGoNextIndicator(true);\n\n onEndStep && onEndStep();\n }}\n onStart={() => {\n setShowGoNextIndicator(false);\n\n onStartStep && onStartStep();\n }}\n />\n {showGoNextIndicator && (\n <PressSpaceIndicator\n right={type === NPCDialogType.TextOnly ? '1rem' : '10.5rem'}\n src={IS_MOBILE_OR_TABLET ? pressButtonGif : pressSpaceGif}\n onClick={() => {\n goToNextStep();\n }}\n />\n )}\n </Container>\n );\n};\n\nconst Container = styled.div``;\n\ninterface IPressSpaceIndicatorProps {\n right: string;\n}\n\nconst PressSpaceIndicator = styled.img<IPressSpaceIndicatorProps>`\n position: absolute;\n right: ${({ right }) => right};\n bottom: 1rem;\n height: 20.7px;\n image-rendering: -webkit-optimize-contrast;\n`;\n","export const chunkString = (str: string, length: number) => {\n return str.match(new RegExp('.{1,' + length + '}', 'g'));\n};\n","import React from 'react';\n\n//@ts-ignore\nexport const useEventListener = (type, handler, el = window) => {\n const savedHandler = React.useRef();\n\n React.useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n React.useEffect(() => {\n //@ts-ignore\n const listener = e => savedHandler.current(e);\n\n el.addEventListener(type, listener);\n\n return () => {\n el.removeEventListener(type, listener);\n };\n }, [type, el]);\n};\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { useEventListener } from '../../../hooks/useEventListener';\nimport { DynamicText } from '../../typography/DynamicText';\n\nexport interface IQuestionDialogAnswer {\n id: number;\n text: string;\n nextQuestionId?: number;\n}\n\nexport interface IQuestionDialog {\n id: number;\n text: string;\n answerIds?: number[];\n}\n\nexport interface IProps {\n questions: IQuestionDialog[];\n answers: IQuestionDialogAnswer[];\n onClose: () => void;\n}\n\nexport const QuestionDialog: React.FC<IProps> = ({\n questions,\n answers,\n onClose,\n}) => {\n const [currentQuestion, setCurrentQuestion] = useState(questions[0]);\n\n const [canShowAnswers, setCanShowAnswers] = useState<boolean>(false);\n\n const onGetFirstAnswer = () => {\n if (!currentQuestion.answerIds || currentQuestion.answerIds.length === 0) {\n return null;\n }\n\n const firstAnswerId = currentQuestion.answerIds![0];\n\n return answers.find(answer => answer.id === firstAnswerId);\n };\n\n const [\n currentAnswer,\n setCurrentAnswer,\n ] = useState<IQuestionDialogAnswer | null>(onGetFirstAnswer()!);\n\n useEffect(() => {\n setCurrentAnswer(onGetFirstAnswer()!);\n }, [currentQuestion]);\n\n const onGetAnswers = (answerIds: number[]) => {\n return answerIds.map((answerId: number) =>\n answers.find(answer => answer.id === answerId)\n );\n };\n\n const onKeyPress = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n // select next answer, if any.\n // if no next answer, select first answer\n // const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n // (answer) => answer?.id === currentAnswer!.id + 1\n // );\n\n const nextAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex(answer => answer?.id === currentAnswer!.id + 1);\n\n const nextAnswerID = currentQuestion.answerIds![nextAnswerIndex];\n\n const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n answer => answer?.id === nextAnswerID\n );\n\n setCurrentAnswer(nextAnswer || onGetFirstAnswer()!);\n\n break;\n case 'ArrowUp':\n // select previous answer, if any.\n // if no previous answer, select last answer\n\n const previousAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex(answer => answer?.id === currentAnswer!.id - 1);\n\n const previousAnswerID =\n currentQuestion.answerIds &&\n currentQuestion.answerIds[previousAnswerIndex];\n\n const previousAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n answer => answer?.id === previousAnswerID\n );\n\n if (previousAnswer) {\n setCurrentAnswer(previousAnswer);\n } else {\n setCurrentAnswer(onGetAnswers(currentQuestion.answerIds!).pop()!);\n }\n\n break;\n case 'Enter':\n setCanShowAnswers(false);\n\n if (!currentAnswer?.nextQuestionId) {\n onClose();\n return;\n } else {\n setCurrentQuestion(\n questions.find(\n question => question.id === currentAnswer!.nextQuestionId\n )!\n );\n }\n\n break;\n }\n };\n useEventListener('keydown', onKeyPress);\n\n const onAnswerClick = (answer: IQuestionDialogAnswer) => {\n setCanShowAnswers(false);\n if (answer.nextQuestionId) {\n // if there is a next question, go to it\n setCurrentQuestion(\n questions.find(question => question.id === answer.nextQuestionId)!\n );\n } else {\n // else, finish dialog!\n onClose();\n }\n };\n\n const onRenderCurrentAnswers = () => {\n const answerIds = currentQuestion.answerIds;\n if (!answerIds) {\n return null;\n }\n\n const answers = onGetAnswers(answerIds);\n\n if (!answers) {\n return null;\n }\n\n return answers.map(answer => {\n const isSelected = currentAnswer?.id === answer?.id;\n const selectedColor = isSelected ? 'yellow' : 'white';\n\n if (answer) {\n return (\n <AnswerRow key={`answer_${answer.id}`}>\n <AnswerSelectedIcon color={selectedColor}>\n {isSelected ? 'X' : null}\n </AnswerSelectedIcon>\n\n <Answer\n key={answer.id}\n onClick={() => onAnswerClick(answer)}\n color={selectedColor}\n >\n {answer.text}\n </Answer>\n </AnswerRow>\n );\n }\n\n return null;\n });\n };\n\n return (\n <Container>\n <QuestionContainer>\n <DynamicText\n text={currentQuestion.text}\n onStart={() => setCanShowAnswers(false)}\n onFinish={() => setCanShowAnswers(true)}\n />\n </QuestionContainer>\n\n {canShowAnswers && (\n <AnswersContainer>{onRenderCurrentAnswers()}</AnswersContainer>\n )}\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n word-break: break-all;\n box-sizing: border-box;\n justify-content: flex-start;\n align-items: flex-start;\n flex-wrap: wrap;\n`;\n\nconst QuestionContainer = styled.div`\n flex: 100%;\n width: 100%;\n`;\n\nconst AnswersContainer = styled.div`\n flex: 100%;\n`;\n\ninterface IAnswerProps {\n color: string;\n}\n\nconst Answer = styled.p<IAnswerProps>`\n flex: auto;\n color: ${props => props.color} !important;\n font-size: 0.65rem !important;\n background: inherit;\n border: none;\n`;\n\nconst AnswerSelectedIcon = styled.span<IAnswerProps>`\n flex: 5% 0 0;\n color: ${props => props.color} !important;\n`;\n\nconst AnswerRow = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n margin-bottom: 0.5rem;\n height: 22px;\n p {\n line-height: unset;\n margin-top: 0;\n margin-bottom: 0rem;\n }\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { RPGUIContainer, RPGUIContainerTypes } from '../RPGUIContainer';\nimport aliceDefaultThumbnail from './img/npcDialog/npcThumbnails/alice.png';\nimport pressSpaceGif from './img/space.gif';\nimport { NPCDialogText } from './NPCDialogText';\n\nexport enum ImgSide {\n right = 'right',\n left = 'left',\n}\n\nexport interface NPCMultiDialogType {\n text: string;\n imagePath?: string;\n imageSide: ImgSide;\n}\n\nexport interface INPCMultiDialogProps {\n onClose: () => void;\n textAndTypeArray: NPCMultiDialogType[];\n}\n\nexport const NPCMultiDialog: React.FC<INPCMultiDialogProps> = ({\n onClose,\n textAndTypeArray,\n}) => {\n const [showGoNextIndicator, setShowGoNextIndicator] = useState<boolean>(\n false\n );\n const [slide, setSlide] = useState<number>(0);\n\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n if (slide < textAndTypeArray?.length - 1) {\n setSlide(prev => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [slide]);\n\n return (\n <RPGUIContainer\n type={RPGUIContainerTypes.FramedGold}\n width={'50%'}\n height={'180px'}\n >\n <>\n <Container>\n {textAndTypeArray[slide]?.imageSide === 'right' && (\n <>\n <TextContainer flex={'70%'}>\n <NPCDialogText\n onStartStep={() => setShowGoNextIndicator(false)}\n onEndStep={() => setShowGoNextIndicator(true)}\n text={textAndTypeArray[slide].text || 'No text provided.'}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n <ThumbnailContainer>\n <NPCThumbnail\n src={\n textAndTypeArray[slide].imagePath || aliceDefaultThumbnail\n }\n />\n </ThumbnailContainer>\n {showGoNextIndicator && (\n <PressSpaceIndicator right={'10.5rem'} src={pressSpaceGif} />\n )}\n </>\n )}\n {textAndTypeArray[slide].imageSide === 'left' && (\n <>\n <ThumbnailContainer>\n <NPCThumbnail\n src={\n textAndTypeArray[slide].imagePath || aliceDefaultThumbnail\n }\n />\n </ThumbnailContainer>\n <TextContainer flex={'70%'}>\n <NPCDialogText\n onStartStep={() => setShowGoNextIndicator(false)}\n onEndStep={() => setShowGoNextIndicator(true)}\n text={textAndTypeArray[slide].text || 'No text provided.'}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {showGoNextIndicator && (\n <PressSpaceIndicator right={'1rem'} src={pressSpaceGif} />\n )}\n </>\n )}\n </Container>\n )\n </>\n </RPGUIContainer>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n position: relative;\n`;\n\ninterface ITextContainerProps {\n flex: string;\n}\n\nconst TextContainer = styled.div<ITextContainerProps>`\n flex: ${({ flex }) => flex} 0 0;\n width: 355px;\n`;\n\nconst ThumbnailContainer = styled.div`\n flex: 30% 0 0;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst NPCThumbnail = styled.img`\n image-rendering: pixelated;\n height: 128px;\n width: 128px;\n`;\n\ninterface IPressSpaceIndicatorProps {\n right: string;\n}\n\nconst PressSpaceIndicator = styled.img<IPressSpaceIndicatorProps>`\n position: absolute;\n right: ${({ right }) => right};\n bottom: 1rem;\n height: 20.7px;\n image-rendering: -webkit-optimize-contrast;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { v4 as uuidv4 } from 'uuid';\nimport { _RPGUI } from './RPGUIRoot';\n\nexport enum RangeSliderType {\n Slider = 'rpgui-slider',\n GoldSlider = 'rpgui-slider golden',\n}\n\nexport interface IRangeSliderProps {\n type: RangeSliderType;\n valueMin: number;\n valueMax: number;\n width: string;\n onChange: (value: number) => void;\n}\n\nexport const RangeSlider: React.FC<IRangeSliderProps> = ({\n type,\n valueMin,\n valueMax,\n width,\n onChange,\n}) => {\n const sliderId = uuidv4();\n\n const onHandleMouseUp = () => {\n const rpguiSlider = document.getElementById(`rpgui-slider-${sliderId}`);\n const value = _RPGUI.get_value(rpguiSlider);\n\n onChange(Number(value));\n };\n\n return (\n <div onMouseUp={onHandleMouseUp}>\n <Input\n className={\n type === RangeSliderType.Slider\n ? RangeSliderType.Slider\n : RangeSliderType.GoldSlider\n }\n type=\"range\"\n style={{ width: width }}\n min={valueMin}\n max={valueMax}\n id={`rpgui-slider-${sliderId}`}\n />\n </div>\n );\n};\n\nconst Input = styled.input`\n opacity: 0;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { NPCDialog, NPCDialogType } from './NPCDialog/NPCDialog';\nimport { NPCMultiDialog, NPCMultiDialogType } from './NPCDialog/NPCMultiDialog';\nimport {\n IQuestionDialog,\n IQuestionDialogAnswer,\n QuestionDialog,\n} from './NPCDialog/QuestionDialog/QuestionDialog';\n\nexport interface IHistoryDialogProps {\n backgroundImgPath: string[];\n fullCoverBackground: boolean;\n questions?: IQuestionDialog[];\n answers?: IQuestionDialogAnswer[];\n text?: string;\n imagePath?: string;\n textAndTypeArray?: NPCMultiDialogType[];\n onClose: () => void;\n}\n\nexport const HistoryDialog: React.FC<IHistoryDialogProps> = ({\n backgroundImgPath,\n fullCoverBackground,\n questions,\n answers,\n text,\n imagePath,\n textAndTypeArray,\n onClose,\n}) => {\n const [img, setImage] = useState<number>(0);\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n if (img < backgroundImgPath?.length - 1) {\n setImage(prev => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [backgroundImgPath]);\n return (\n <BackgroundContainer\n imgPath={backgroundImgPath[img]}\n fullImg={fullCoverBackground}\n >\n <DialogContainer>\n {textAndTypeArray ? (\n <NPCMultiDialog\n textAndTypeArray={textAndTypeArray}\n onClose={onClose}\n />\n ) : questions && answers ? (\n <QuestionDialog\n questions={questions}\n answers={answers}\n onClose={onClose}\n />\n ) : text && imagePath ? (\n <NPCDialog\n text={text}\n imagePath={imagePath}\n onClose={onClose}\n type={NPCDialogType.TextAndThumbnail}\n />\n ) : (\n <NPCDialog\n text={text}\n onClose={onClose}\n type={NPCDialogType.TextOnly}\n />\n )}\n </DialogContainer>\n </BackgroundContainer>\n );\n};\n\ninterface IImgContainerProps {\n imgPath: string;\n fullImg: boolean;\n}\n\nconst BackgroundContainer = styled.div<IImgContainerProps>`\n width: 100%;\n height: 100%;\n background-image: url(${props => props.imgPath});\n background-size: ${props => (props.imgPath ? 'cover' : 'auto')};\n display: flex;\n justify-content: space-evenly;\n align-items: center;\n`;\n\nconst DialogContainer = styled.div`\n display: flex;\n justify-content: center;\n padding-top: 200px;\n`;\n","import React from 'react';\nimport { IPosition } from '../../types/eventTypes';\nimport { DraggableContainer } from '../DraggableContainer';\nimport { RPGUIContainerTypes } from '../RPGUIContainer';\n\ninterface IProps {\n children: React.ReactNode;\n title: string;\n onClose?: () => void;\n onPositionChange?: (position: IPosition) => void;\n onOutsideClick?: () => void;\n}\n\nexport const SlotsContainer: React.FC<IProps> = ({\n children,\n title,\n onClose,\n onPositionChange,\n onOutsideClick,\n}) => {\n return (\n <DraggableContainer\n title={title}\n type={RPGUIContainerTypes.Framed}\n onCloseButton={() => {\n if (onClose) {\n onClose();\n }\n }}\n width=\"330px\"\n cancelDrag=\".item-container-body\"\n onPositionChange={({ x, y }) => {\n if (onPositionChange) {\n onPositionChange({ x, y });\n }\n }}\n onOutsideClick={onOutsideClick}\n >\n {children}\n </DraggableContainer>\n );\n};\n","import { IItem, IItemContainer, ItemContainerType } from '@rpg-engine/shared';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { SlotsContainer } from '../../Abstractions/SlotsContainer';\n\nimport { ItemSlot } from './ItemSlot';\n\nexport interface IItemContainerProps {\n itemContainer: IItemContainer;\n onClose?: () => void;\n onItemClick?: (\n item: IItem,\n ItemType: IItem['type'],\n itemContainerType: ItemContainerType | null\n ) => void;\n onMouseOver?: (e: any, slotIndex: number, item: IItem | null) => void;\n onSelected?: (optionId: string, item: IItem) => void;\n type: ItemContainerType;\n atlasJSON: any;\n atlasIMG: any;\n disableContextMenu?: boolean;\n}\n\nexport const ItemContainer: React.FC<IItemContainerProps> = ({\n itemContainer,\n onClose,\n onMouseOver,\n onSelected,\n onItemClick,\n type,\n atlasJSON,\n atlasIMG,\n disableContextMenu = false,\n}) => {\n const onRenderSlots = () => {\n const slots = [];\n\n for (let i = 0; i < itemContainer.slotQty; i++) {\n slots.push(\n <ItemSlot\n isContextMenuDisabled={disableContextMenu}\n key={i}\n slotIndex={i}\n item={itemContainer.slots?.[i] || null}\n itemContainerType={type}\n onMouseOver={(event, slotIndex, item) => {\n if (onMouseOver) onMouseOver(event, slotIndex, item);\n }}\n onClick={(ItemType, ContainerType, item) => {\n if (onItemClick) onItemClick(item, ItemType, ContainerType);\n }}\n onSelected={(optionId: string, item: IItem) => {\n if (onSelected) onSelected(optionId, item);\n }}\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n />\n );\n }\n return slots;\n };\n\n return (\n <SlotsContainer title={itemContainer.name || 'Container'} onClose={onClose}>\n <ItemsContainer className=\"item-container-body\">\n {onRenderSlots()}\n </ItemsContainer>\n </SlotsContainer>\n );\n};\n\nconst ItemsContainer = styled.div`\n max-width: 280px;\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { uiFonts } from '../constants/uiFonts';\n\ninterface IListMenuOption {\n id: string;\n text: string;\n}\n\nexport interface IListMenuProps {\n x: number;\n y: number;\n options: IListMenuOption[];\n onSelected: (selectedOptionId: string) => void;\n}\n\nexport const ListMenu: React.FC<IListMenuProps> = ({\n options,\n onSelected,\n x,\n y,\n}) => {\n return (\n <Container x={x} y={y}>\n <ul className=\"rpgui-list-imp\" style={{ overflow: 'hidden' }}>\n {options.map((params, index) => (\n <ListElement\n key={params?.id || index}\n onClick={() => {\n onSelected(params?.id);\n }}\n >\n {params?.text || 'No text'}\n </ListElement>\n ))}\n </ul>\n </Container>\n );\n};\n\ninterface IContainerProps {\n x?: number;\n y?: number;\n}\n\nconst Container = styled.div<IContainerProps>`\n display: flex;\n flex-direction: column;\n width: 100%;\n justify-content: start;\n align-items: flex-start;\n position: absolute;\n top: ${props => props.y || 0}px;\n left: ${props => props.x || 0}px;\n\n li {\n font-size: ${uiFonts.size.xsmall};\n }\n`;\n\nconst ListElement = styled.li`\n margin-right: 0.5rem;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { uiFonts } from '../constants/uiFonts';\n\nexport interface IBarProps {\n max: number;\n value: number;\n color: 'red' | 'blue' | 'green';\n style?: Record<string, any>;\n displayText?: boolean;\n percentageWidth?: number;\n minWidth?: number;\n}\n\nexport const ProgressBar: React.FC<IBarProps> = ({\n max,\n value,\n color,\n displayText = true,\n percentageWidth = 40,\n minWidth = 100,\n style,\n}) => {\n const calculatePercentageValue = function(max: number, value: number) {\n if (value > max) {\n value = max;\n }\n return (value * 100) / max;\n };\n\n return (\n <Container\n className=\"rpgui-progress\"\n data-value={calculatePercentageValue(max, value) / 100}\n data-rpguitype=\"progress\"\n percentageWidth={percentageWidth}\n minWidth={minWidth}\n style={style}\n >\n {displayText && (\n <TextOverlay>\n <ProgressBarText>\n {value}/{max}\n </ProgressBarText>\n </TextOverlay>\n )}\n <div className=\" rpgui-progress-track\">\n <div\n className={`rpgui-progress-fill ${color} `}\n style={{\n left: '0px',\n width: calculatePercentageValue(max, value) + '%',\n }}\n ></div>\n </div>\n <div className=\" rpgui-progress-left-edge\"></div>\n <div className=\" rpgui-progress-right-edge\"></div>\n </Container>\n );\n};\n\nconst ProgressBarText = styled.span`\n font-size: ${uiFonts.size.small} !important;\n color: white;\n text-align: center;\n z-index: 1;\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n top: 12px;\n`;\n\nconst TextOverlay = styled.div`\n width: 100%;\n position: relative;\n`;\n\ninterface IContainerProps {\n percentageWidth?: number;\n minWidth?: number;\n style?: Record<string, any>;\n}\n\nconst Container = styled.div<IContainerProps>`\n display: flex;\n flex-direction: column;\n min-width: ${props => props.minWidth}px;\n width: ${props => props.percentageWidth}%;\n justify-content: start;\n align-items: flex-start;\n ${props => props.style}\n`;\n","import { IQuest } from '@rpg-engine/shared';\nimport React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { uiColors } from '../../constants/uiColors';\nimport { uiFonts } from '../../constants/uiFonts';\nimport SelectArrow from '../Arrow/SelectArrow';\nimport { Button, ButtonTypes } from '../Button';\nimport { DraggableContainer } from '../DraggableContainer';\n\nimport { RPGUIContainerTypes } from '../RPGUIContainer';\nimport { Column } from '../shared/Column';\nimport thumbnailDefault from './img/default.png';\n\nexport interface IQuestsButtonProps {\n disabled: boolean;\n title: string;\n onClick: (questId: string, npcId: string) => void;\n}\n\nexport interface IQuestInfoProps {\n onClose?: () => void;\n buttons?: IQuestsButtonProps[];\n quests: IQuest[];\n onChangeQuest: (currentQuestIndex: number, currentQuestId: string) => void;\n}\n\nexport const QuestInfo: React.FC<IQuestInfoProps> = ({\n quests,\n onClose,\n buttons,\n onChangeQuest,\n}) => {\n const [currentIndex, setCurrentIndex] = useState(0);\n const questsLength = quests.length - 1;\n\n useEffect(() => {\n if (onChangeQuest) {\n onChangeQuest(currentIndex, quests[currentIndex]._id);\n }\n }, [currentIndex]);\n\n const onLeftClick = () => {\n if (currentIndex === 0) setCurrentIndex(questsLength);\n else setCurrentIndex(index => index - 1);\n };\n const onRightClick = () => {\n if (currentIndex === questsLength) setCurrentIndex(0);\n else setCurrentIndex(index => index + 1);\n };\n\n return (\n <QuestDraggableContainer\n type={RPGUIContainerTypes.Framed}\n onCloseButton={() => {\n if (onClose) onClose();\n }}\n width=\"730px\"\n cancelDrag=\".equipment-container-body .arrow-selector\"\n >\n {quests.length >= 2 ? (\n <QuestsContainer>\n {currentIndex !== 0 && (\n <SelectArrow\n direction=\"left\"\n onClick={onLeftClick}\n onTouchStart={onLeftClick}\n ></SelectArrow>\n )}\n {currentIndex !== quests.length - 1 && (\n <SelectArrow\n direction=\"right\"\n onClick={onRightClick}\n onTouchStart={onRightClick}\n ></SelectArrow>\n )}\n\n <QuestContainer>\n <TitleContainer className=\"drag-handler\">\n <Title>\n <Thumbnail\n src={quests[currentIndex].thumbnail || thumbnailDefault}\n />\n {quests[currentIndex].title}\n </Title>\n <QuestSplitDiv>\n <hr className=\"golden\" />\n </QuestSplitDiv>\n </TitleContainer>\n <Content>\n <p>{quests[currentIndex].description}</p>\n </Content>\n <QuestColumn className=\"dark-background\" justifyContent=\"flex-end\">\n {buttons &&\n buttons.map((button, index) => (\n <Button\n key={index}\n onClick={() =>\n button.onClick(\n quests[currentIndex]._id,\n quests[currentIndex].npcId\n )\n }\n disabled={button.disabled}\n buttonType={ButtonTypes.RPGUIButton}\n id={`button-${index}`}\n >\n {button.title}\n </Button>\n ))}\n </QuestColumn>\n </QuestContainer>\n </QuestsContainer>\n ) : (\n <QuestsContainer>\n <QuestContainer>\n <TitleContainer className=\"drag-handler\">\n <Title>\n <Thumbnail src={quests[0].thumbnail || thumbnailDefault} />\n {quests[0].title}\n </Title>\n <QuestSplitDiv>\n <hr className=\"golden\" />\n </QuestSplitDiv>\n </TitleContainer>\n <Content>\n <p>{quests[0].description}</p>\n </Content>\n <QuestColumn className=\"dark-background\" justifyContent=\"flex-end\">\n {buttons &&\n buttons.map((button, index) => (\n <Button\n key={index}\n onClick={() =>\n button.onClick(quests[0]._id, quests[0].npcId)\n }\n disabled={button.disabled}\n buttonType={ButtonTypes.RPGUIButton}\n id={`button-${index}`}\n >\n {button.title}\n </Button>\n ))}\n </QuestColumn>\n </QuestContainer>\n </QuestsContainer>\n )}\n </QuestDraggableContainer>\n );\n};\n\nconst QuestDraggableContainer = styled(DraggableContainer)`\n border: 1px solid black;\n width: 600px;\n padding: 0 0 0 0 !important;\n .DraggableContainer__TitleContainer-sc-184mpyl-2 {\n height: auto;\n }\n .container-close {\n position: absolute;\n margin-left: auto;\n top: 20px;\n padding-right: 5px;\n }\n img {\n display: inline-block;\n vertical-align: middle;\n line-height: normal;\n }\n`;\n\nconst QuestContainer = styled.div`\n margin-right: 40px;\n margin-left: 40px;\n`;\n\nconst QuestsContainer = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst Content = styled.div`\n padding: 18px;\n h1 {\n text-align: left;\n margin: 14px 0px;\n }\n`;\n\nconst QuestSplitDiv = styled.div`\n width: 100%;\n font-size: 11px;\n margin-bottom: 10px;\n hr {\n margin: 0px;\n padding: 0px;\n }\n p {\n margin-bottom: 0px;\n }\n`;\n\nconst QuestColumn = styled(Column)`\n padding-top: 5px;\n margin-bottom: 20px;\n display: flex;\n justify-content: space-evenly;\n`;\n\nconst TitleContainer = styled.div`\n width: 100%;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 1rem;\n`;\n\nconst Title = styled.h1`\n color: white;\n z-index: 22;\n font-size: ${uiFonts.size.medium} !important;\n color: ${uiColors.yellow} !important;\n`;\n\nconst Thumbnail = styled.img`\n color: white;\n z-index: 22;\n width: 32px * 1.5;\n margin-right: 0.5rem;\n position: relative;\n top: -4px;\n`;\n","import { IQuest } from '@rpg-engine/shared';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { uiFonts } from '../constants/uiFonts';\nimport { DraggableContainer } from './DraggableContainer';\nimport { RPGUIContainerTypes } from './RPGUIContainer';\n\nexport interface IQuestListProps {\n quests?: IQuest[];\n onClose: () => void;\n}\n\nexport const QuestList: React.FC<IQuestListProps> = ({ quests, onClose }) => {\n return (\n <QuestDraggableContainer\n type={RPGUIContainerTypes.Framed}\n onCloseButton={() => {\n if (onClose) onClose();\n }}\n width=\"520px\"\n >\n <div style={{ width: '100%' }}>\n <Title>Quests</Title>\n <hr className=\"golden\" />\n\n <QuestListContainer>\n {quests ? (\n quests.map((quest, i) => (\n <div className=\"quest-item\" key={i}>\n <span className=\"quest-number\">{i + 1}</span>\n <div className=\"quest-detail\">\n <p className=\"quest-detail__title\">{quest.title}</p>\n <p className=\"quest-detail__description\">\n {quest.description}\n </p>\n </div>\n </div>\n ))\n ) : (\n <NoQuestContainer>\n <p>There are no ongoing quests</p>\n </NoQuestContainer>\n )}\n </QuestListContainer>\n </div>\n </QuestDraggableContainer>\n );\n};\n\nconst QuestDraggableContainer = styled(DraggableContainer)`\n .container-close {\n top: 10px;\n right: 10px;\n }\n\n .quest-title {\n text-align: left;\n margin-left: 44px;\n margin-top: 20px;\n color: yellow;\n }\n\n .quest-desc {\n margin-top: 12px;\n margin-left: 44px;\n }\n\n .rpgui-progress {\n min-width: 80%;\n margin: 0 auto;\n }\n`;\n\nconst Title = styled.h1`\n z-index: 22;\n font-size: ${uiFonts.size.medium} !important;\n color: yellow !important;\n`;\n\nconst QuestListContainer = styled.div`\n margin-top: 20px;\n margin-bottom: 40px;\n overflow-y: auto;\n max-height: 400px;\n\n .quest-item {\n display: flex;\n align-items: flex-start;\n margin-bottom: 12px;\n }\n\n .quest-number {\n border-radius: 50%;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 16px;\n background-color: brown;\n flex-shrink: 0;\n }\n\n .quest-number.completed {\n background-color: yellow;\n }\n\n p {\n margin: 0;\n }\n\n .quest-detail__title {\n color: yellow;\n }\n\n .quest-detail__description {\n margin-top: 5px;\n }\n .Noquest-detail__description {\n margin-top: 5px;\n margin: auto;\n }\n`;\nconst NoQuestContainer = styled.div`\n text-align: center;\n p {\n margin-top: 5px;\n }\n`;\n","import React from 'react';\nimport 'rpgui/rpgui.min.css';\nimport 'rpgui/rpgui.min.js';\n\ninterface IProps {\n children: React.ReactNode;\n}\n\n//@ts-ignore\nexport const _RPGUI = RPGUI;\n\nexport const RPGUIRoot: React.FC<IProps> = ({ children }) => {\n return <div className=\"rpgui-content\">{children}</div>;\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\nexport interface ISimpleProgressBarProps {\n value: number;\n bgColor?: string;\n margin?: number;\n}\n\nexport const SimpleProgressBar: React.FC<ISimpleProgressBarProps> = ({\n value,\n bgColor = 'red',\n margin = 20,\n}) => {\n return (\n <Container className=\"simple-progress-bar\">\n <ProgressBarContainer margin={margin}>\n <BackgroundBar>\n <Progress value={value} bgColor={bgColor} />\n </BackgroundBar>\n </ProgressBarContainer>\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n`;\n\nconst BackgroundBar = styled.span`\n background-color: rgba(0, 0, 0, 0.075);\n`;\n\ninterface ISimpleProgressBarThemeProps {\n value: number;\n bgColor: string;\n}\n\nconst Progress = styled.span`\n background-color: ${(props: ISimpleProgressBarThemeProps) => props.bgColor};\n width: ${(props: ISimpleProgressBarThemeProps) => props.value}%;\n`;\n\ninterface ISimpleProgressBarTheme2Props {\n margin: number;\n}\n\nconst ProgressBarContainer = styled.div`\n border-radius: 60px;\n border: 1px solid #282424;\n overflow: hidden;\n width: 100%;\n span {\n display: block;\n height: 100%;\n }\n height: 8px;\n margin-left: ${(props: ISimpleProgressBarTheme2Props) => props.margin}px;\n`;\n","import { getSPForLevel } from '@rpg-engine/shared';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { ErrorBoundary } from './Item/Inventory/ErrorBoundary';\nimport { SpriteFromAtlas } from './shared/SpriteFromAtlas';\nimport { SimpleProgressBar } from './SimpleProgressBar';\n\nexport interface ISkillProgressBarProps {\n skillName: string;\n bgColor: string;\n level: number;\n skillPoints: number;\n skillPointsToNextLevel?: number;\n texturePath: string;\n showSkillPoints?: boolean;\n atlasJSON: any;\n atlasIMG: any;\n}\n\nexport const SkillProgressBar: React.FC<ISkillProgressBarProps> = ({\n bgColor,\n skillName,\n level,\n skillPoints,\n skillPointsToNextLevel,\n texturePath,\n showSkillPoints = true,\n atlasIMG,\n atlasJSON,\n}) => {\n if (!skillPointsToNextLevel) {\n skillPointsToNextLevel = getSPForLevel(level + 1);\n }\n\n const nextLevelSPWillbe = skillPoints + skillPointsToNextLevel;\n\n const ratio = (skillPoints / nextLevelSPWillbe) * 100;\n\n return (\n <>\n <ProgressTitle>\n <TitleName>{skillName}</TitleName>\n <ValueDisplay>lv {level}</ValueDisplay>\n </ProgressTitle>\n <ProgressBody>\n <ProgressIconContainer>\n {atlasIMG && atlasJSON ? (\n <SpriteContainer>\n <ErrorBoundary>\n <SpriteFromAtlas\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={texturePath}\n imgScale={1}\n grayScale\n opacity={0.5}\n />\n </ErrorBoundary>\n </SpriteContainer>\n ) : (\n <></>\n )}\n </ProgressIconContainer>\n\n <ProgressBarContainer>\n <SimpleProgressBar value={ratio} bgColor={bgColor} />\n </ProgressBarContainer>\n </ProgressBody>\n {showSkillPoints && (\n <SkillDisplayContainer>\n <SkillPointsDisplay>\n {skillPoints}/{nextLevelSPWillbe}\n </SkillPointsDisplay>\n </SkillDisplayContainer>\n )}\n </>\n );\n};\n\nconst ProgressBarContainer = styled.div`\n position: relative;\n top: 8px;\n width: 100%;\n height: auto;\n`;\n\nconst SpriteContainer = styled.div`\n position: relative;\n top: -3px;\n left: 0;\n`;\n\nconst SkillDisplayContainer = styled.div`\n margin: 0 auto;\n\n p {\n margin: 0;\n }\n`;\n\nconst SkillPointsDisplay = styled.p`\n font-size: 0.6rem !important;\n font-weight: bold;\n text-align: center;\n`;\n\nconst TitleName = styled.span`\n margin-left: 5px;\n`;\n\nconst ValueDisplay = styled.span``;\n\nconst ProgressIconContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst ProgressBody = styled.div`\n display: flex;\n flex-direction: row;\n width: 100%;\n`;\n\nconst ProgressTitle = styled.div`\n width: 100%;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n span {\n font-size: 0.6rem;\n }\n`;\n","import { ISkill, ISkillDetails } from '@rpg-engine/shared';\nimport _ from 'lodash';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { uiColors } from '../constants/uiColors';\nimport { DraggableContainer } from './DraggableContainer';\nimport { SkillProgressBar } from './SkillProgressBar';\n\nexport interface ISkillContainerProps {\n skill: ISkill;\n onCloseButton: () => void;\n atlasJSON: any;\n atlasIMG: any;\n}\n\nconst skillProps = {\n attributes: {\n color: uiColors.purple,\n values: {\n stamina: 'spell-icons/regenerate.png',\n magic: 'spell-icons/fireball.png',\n magicResistance: 'spell-icons/freeze.png',\n strength: 'spell-icons/enchanted-blow.png',\n resistance: 'spell-icons/magic-shield.png',\n dexterity: 'spell-icons/haste.png',\n },\n },\n combat: {\n color: uiColors.cardinal,\n values: {\n first: 'gloves/leather-gloves.png',\n club: 'maces/club.png',\n sword: 'swords/double-edged-sword.png',\n axe: 'axes/double-axe.png',\n distance: 'ranged-weapons/horse-bow.png',\n shielding: 'shields/studded-shield.png',\n dagger: 'daggers/dagger.png',\n },\n },\n crafting: {\n color: uiColors.blue,\n values: {\n fishing: 'foods/fish.png',\n mining: 'crafting-resources/iron-ingot.png',\n lumberjacking: 'crafting-resources/greater-wooden-log.png',\n cooking: 'foods/chickens-meat.png',\n alchemy: 'potions/greater-mana-potion.png',\n },\n },\n};\n\nexport const SkillsContainer: React.FC<ISkillContainerProps> = ({\n onCloseButton,\n skill,\n atlasIMG,\n atlasJSON,\n}) => {\n const onRenderSkillCategory = (\n category: 'attributes' | 'combat' | 'crafting'\n ) => {\n const skillCategory = skillProps[category];\n\n const skillCategoryColor = skillCategory.color;\n\n const output = [];\n\n for (const [key, value] of Object.entries(skillCategory.values)) {\n //@ts-ignore\n const skillDetails = (skill[key] as unknown) as ISkillDetails;\n \n\n output.push(\n <SkillProgressBar\n key={key}\n skillName={_.capitalize(key)}\n bgColor={skillCategoryColor}\n level={skillDetails.level || 0}\n skillPoints={Math.round(skillDetails.skillPoints) || 0}\n skillPointsToNextLevel={\n Math.round(skillDetails.skillPointsToNextLevel) || 0\n }\n texturePath={value}\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n />\n );\n }\n\n return output;\n };\n\n return (\n <SkillsDraggableContainer title=\"Skills\">\n {onCloseButton && (\n <CloseButton onClick={onCloseButton} onTouchStart={onCloseButton}>\n X\n </CloseButton>\n )}\n <SkillSplitDiv>\n <p>General</p>\n <hr className=\"golden\" />\n\n <SkillProgressBar\n skillName={'Level'}\n bgColor={uiColors.navyBlue}\n level={Math.round(skill.level) || 0}\n skillPoints={Math.round(skill.experience) || 0}\n skillPointsToNextLevel={Math.round(skill.xpToNextLevel) || 0}\n texturePath={'swords/broad-sword.png'}\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n />\n\n <p>Combat Skills</p>\n <hr className=\"golden\" />\n </SkillSplitDiv>\n\n {onRenderSkillCategory('combat')}\n\n <SkillSplitDiv>\n <p>Crafting Skills</p>\n <hr className=\"golden\" />\n </SkillSplitDiv>\n\n {onRenderSkillCategory('crafting')}\n\n <SkillSplitDiv>\n <p>Basic Attributes</p>\n <hr className=\"golden\" />\n </SkillSplitDiv>\n\n {onRenderSkillCategory('attributes')}\n </SkillsDraggableContainer>\n );\n};\n\nconst SkillsDraggableContainer = styled(DraggableContainer)`\n border: 1px solid black;\n width: 400px;\n height: 90%;\n overflow-y: scroll;\n .DraggableContainer__TitleContainer-sc-184mpyl-2 {\n width: auto;\n height: auto;\n }\n`;\n\nconst SkillSplitDiv = styled.div`\n width: 100%;\n font-size: 11px;\n hr {\n margin: 0;\n margin-bottom: 1rem;\n padding: 0px;\n }\n p {\n margin-bottom: 0px;\n }\n`;\n\nconst CloseButton = styled.div`\n position: absolute;\n top: 2px;\n right: 2px;\n color: white;\n z-index: 22;\n font-size: 0.7rem;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\n\nimport { PeriodOfDay } from '@rpg-engine/shared';\nimport AfternoonGif from './gif/afternoon.gif';\nimport MorningGif from './gif/morning.gif';\nimport NightGif from './gif/night.gif';\n\nexport interface IPeriodOfDayDisplayProps {\n periodOfDay: PeriodOfDay;\n}\n\nexport const DayNightPeriod: React.FC<IPeriodOfDayDisplayProps> = ({\n periodOfDay,\n}) => {\n const periodOfDaySrcFiles = {\n [PeriodOfDay.Morning]: MorningGif,\n [PeriodOfDay.Afternoon]: AfternoonGif,\n [PeriodOfDay.Night]: NightGif,\n };\n\n return (\n <GifContainer>\n <img src={periodOfDaySrcFiles[periodOfDay]} />\n </GifContainer>\n );\n};\n\nconst GifContainer = styled.div`\n width: 100%;\n\n img {\n width: 67%;\n }\n`;\n","import { PeriodOfDay } from '@rpg-engine/shared';\nimport React from 'react';\nimport Draggable from 'react-draggable';\nimport styled from 'styled-components';\nimport { uiFonts } from '../../constants/uiFonts';\nimport { DayNightPeriod } from './DayNightPeriod/DayNightPeriod';\n\nimport ClockWidgetImg from './img/clockwidget.png';\n\nexport interface IClockWidgetProps {\n onClose?: () => void;\n TimeClock: string;\n periodOfDay: PeriodOfDay;\n}\n\nexport const TimeWidget: React.FC<IClockWidgetProps> = ({\n onClose,\n TimeClock,\n periodOfDay,\n}) => {\n return (\n <Draggable>\n <WidgetContainer>\n <CloseButton onClick={onClose}>X</CloseButton>\n <DayNightContainer>\n <DayNightPeriod periodOfDay={periodOfDay} />\n </DayNightContainer>\n <Time>{TimeClock}</Time>\n </WidgetContainer>\n </Draggable>\n );\n};\n\nconst WidgetContainer = styled.div`\n background-image: url(${ClockWidgetImg});\n background-size: 10rem;\n background-repeat: no-repeat;\n width: 10rem;\n position: absolute;\n height: 100px;\n`;\n\nconst Time = styled.div`\n top: 0.75rem;\n right: 0.5rem;\n position: absolute;\n font-size: ${uiFonts.size.small};\n color: white;\n`;\n\nconst CloseButton = styled.p`\n position: absolute;\n top: -0.5rem;\n margin: 0;\n right: -0.2rem;\n font-size: ${uiFonts.size.small} !important;\n z-index: 1;\n`;\n\nconst DayNightContainer = styled.div`\n margin-top: -0.3rem;\n margin-left: -0.3rem;\n`;\n","import { ITradeResponseItem, getItemTextureKeyPath } from '@rpg-engine/shared';\nimport capitalize from 'lodash/capitalize';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { uiColors } from '../../constants/uiColors';\nimport { uiFonts } from '../../constants/uiFonts';\nimport SelectArrow from '../Arrow/SelectArrow';\nimport { Ellipsis } from '../shared/Ellipsis';\nimport { SpriteFromAtlas } from '../shared/SpriteFromAtlas';\nexport interface ITradeComponentProps {\n traderItem: ITradeResponseItem;\n onQuantityChange: (\n traderItem: ITradeResponseItem,\n selectedQty: number\n ) => void;\n atlasJSON: any;\n atlasIMG: any;\n selectedQty: number;\n}\n\nexport const TradingItemRow: React.FC<ITradeComponentProps> = ({\n atlasIMG,\n atlasJSON,\n onQuantityChange,\n traderItem,\n selectedQty,\n}) => {\n const onLeftClick = () => {\n if (selectedQty > 0) {\n const newQuantity = selectedQty - 1;\n onQuantityChange(traderItem, newQuantity);\n }\n };\n const onRightClick = () => {\n if (selectedQty < (traderItem.qty ?? 999)) {\n const newQuantity = selectedQty + 1;\n onQuantityChange(traderItem, newQuantity);\n }\n };\n\n return (\n <ItemWrapper>\n <ItemIconContainer>\n <SpriteContainer>\n <SpriteFromAtlas\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={getItemTextureKeyPath(\n {\n key: traderItem.key,\n stackQty: traderItem.qty || 1,\n texturePath: traderItem.texturePath,\n },\n atlasJSON\n )}\n imgScale={2.5}\n />\n </SpriteContainer>\n </ItemIconContainer>\n <ItemNameContainer>\n <NameValue>\n <p>\n <Ellipsis maxLines={1} maxWidth=\"250px\">\n {capitalize(traderItem.name)}\n </Ellipsis>\n </p>\n <p>${traderItem.price}</p>\n </NameValue>\n </ItemNameContainer>\n\n <QuantityContainer>\n <SelectArrow\n size={32}\n className=\"arrow-selector\"\n direction=\"left\"\n onClick={onLeftClick}\n onTouchStart={onLeftClick}\n ></SelectArrow>\n <QuantityDisplay>\n <TextOverlay>\n <Item>{selectedQty}</Item>\n </TextOverlay>\n </QuantityDisplay>\n <SelectArrow\n size={32}\n className=\"arrow-selector\"\n direction=\"right\"\n onClick={onRightClick}\n onTouchStart={onRightClick}\n ></SelectArrow>\n </QuantityContainer>\n </ItemWrapper>\n );\n};\n\nconst ItemWrapper = styled.div`\n width: 100%;\n margin: auto;\n display: flex;\n justify-content: space-between;\n margin-bottom: 1rem;\n\n &:hover {\n background-color: ${uiColors.darkGray};\n }\n padding: 0.5rem;\n`;\n\nconst ItemNameContainer = styled.div`\n flex: 60%;\n`;\n\nconst ItemIconContainer = styled.div`\n display: flex;\n justify-content: flex-start;\n align-items: center;\n\n flex: 0 0 58px;\n`;\n\nconst SpriteContainer = styled.div`\n position: relative;\n top: -0.5rem;\n left: 0.5rem;\n`;\n\nconst NameValue = styled.div`\n p {\n font-size: 0.75rem;\n margin: 0;\n }\n`;\n\nconst Item = styled.span`\n color: white;\n text-align: center;\n z-index: 1;\n\n width: 100%;\n`;\n\nconst TextOverlay = styled.div`\n width: 100%;\n position: relative;\n`;\n\ninterface IContainerProps {\n percentageWidth?: number;\n minWidth?: number;\n style?: Record<string, any>;\n}\n\nconst QuantityContainer = styled.div<IContainerProps>`\n position: relative;\n display: flex;\n\n min-width: 100px;\n width: 40%;\n justify-content: center;\n align-items: center;\n\n flex: 20%;\n`;\n\nconst QuantityDisplay = styled.div`\n font-size: ${uiFonts.size.small};\n`;\n","import { ITradeResponseItem, TradeTransactionType } from '@rpg-engine/shared';\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Button, ButtonTypes } from '../Button';\nimport { DraggableContainer } from '../DraggableContainer';\nimport { RPGUIContainerTypes } from '../RPGUIContainer';\nimport { TradingItemRow } from './TradingItemRow';\nexport interface ITrandingMenu {\n traderItems: ITradeResponseItem[];\n onClose: () => void;\n onConfirm: (items: ITradeResponseItem[]) => void;\n type: TradeTransactionType;\n atlasJSON: any;\n atlasIMG: any;\n characterAvailableGold: number;\n}\n\nexport const TradingMenu: React.FC<ITrandingMenu> = ({\n traderItems,\n onClose,\n type,\n atlasJSON,\n atlasIMG,\n characterAvailableGold,\n onConfirm,\n}) => {\n const [sum, setSum] = useState(0);\n const [qtyMap, setQtyMap] = useState(new Map());\n\n const onQuantityChange = (item: ITradeResponseItem, selectedQty: number) => {\n setQtyMap(new Map(qtyMap.set(item.key, selectedQty)));\n\n let newSum = 0;\n traderItems.forEach(item => {\n const qty = qtyMap.get(item.key);\n if (qty) newSum += qty * item.price;\n setSum(newSum);\n });\n };\n\n const isBuy = () => {\n return type == 'buy';\n };\n\n const hasGoldForSale = () => {\n if (isBuy()) {\n return !(sum > characterAvailableGold);\n }\n return true;\n };\n\n const getFinalGold = () => {\n if (isBuy()) {\n return characterAvailableGold - sum;\n } else {\n return characterAvailableGold + sum;\n }\n };\n\n const Capitalize = (word: string) => {\n return word[0].toUpperCase() + word.substring(1);\n };\n\n const onConfirmClick = () => {\n const items: ITradeResponseItem[] = [];\n\n traderItems.forEach(item => {\n const qty = qtyMap.get(item.key);\n if (qty) {\n items.push(Object.assign({}, item, { qty: qty }));\n }\n });\n\n onConfirm(items);\n };\n\n return (\n <DraggableContainer\n type={RPGUIContainerTypes.Framed}\n onCloseButton={() => {\n if (onClose) onClose();\n }}\n width=\"500px\"\n cancelDrag=\".equipment-container-body .arrow-selector\"\n >\n <>\n <div style={{ width: '100%' }}>\n <Title>{Capitalize(type)} Menu</Title>\n <hr className=\"golden\" />\n </div>\n <TradingComponentScrollWrapper>\n {traderItems.map((tradeItem, index) => (\n <ItemWrapper key={`${tradeItem.key}_${index}`}>\n <TradingItemRow\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n onQuantityChange={onQuantityChange}\n traderItem={tradeItem}\n selectedQty={qtyMap.get(tradeItem.key) ?? 0}\n />\n </ItemWrapper>\n ))}\n </TradingComponentScrollWrapper>\n <GoldWrapper>\n <p>Available Gold:</p>\n <p>${characterAvailableGold}</p>\n </GoldWrapper>\n <TotalWrapper>\n <p>Total:</p>\n <p>${sum}</p>\n </TotalWrapper>\n {!hasGoldForSale() ? (\n <AlertWrapper>\n <p> Sorry, not enough money.</p>\n </AlertWrapper>\n ) : (\n <GoldWrapper>\n <p>Final Gold:</p>\n <p>${getFinalGold()}</p>\n </GoldWrapper>\n )}\n\n <ButtonWrapper>\n <Button\n buttonType={ButtonTypes.RPGUIButton}\n disabled={!hasGoldForSale()}\n onClick={() => onConfirmClick()}\n >\n Confirm\n </Button>\n <Button\n buttonType={ButtonTypes.RPGUIButton}\n onClick={() => onClose()}\n >\n Cancel\n </Button>\n </ButtonWrapper>\n </>\n </DraggableContainer>\n );\n};\n\nconst Title = styled.h1`\n z-index: 22;\n font-size: 0.6rem;\n color: yellow !important;\n`;\n\nconst TradingComponentScrollWrapper = styled.div`\n overflow-y: scroll;\n height: 390px;\n width: 100%;\n margin-top: 1rem;\n`;\n\nconst ItemWrapper = styled.div`\n margin: auto;\n display: flex;\n justify-content: space-between;\n`;\n\nconst TotalWrapper = styled.div`\n margin-top: 1rem;\n display: flex;\n justify-content: space-between;\n height: 20px;\n p {\n color: white !important;\n }\n width: 100%;\n margin-left: 0.8rem;\n`;\n\nconst GoldWrapper = styled.div`\n margin-top: 1rem;\n display: flex;\n justify-content: space-between;\n height: 20px;\n p {\n color: yellow !important;\n }\n width: 100%;\n margin-left: 0.8rem;\n`;\n\nconst AlertWrapper = styled.div`\n margin-top: 1rem;\n display: flex;\n width: 100%;\n justify-content: center;\n height: 20px;\n p {\n color: red !important;\n }\n`;\n\nconst ButtonWrapper = styled.div`\n display: flex;\n justify-content: space-around;\n padding-top: 20px;\n width: 100%;\n margin-top: 1rem;\n`;\n","/* eslint-disable react/require-default-props */\nimport React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n maxLines?: number;\n children: React.ReactNode;\n}\n\nexport const Truncate: React.FC<IProps> = ({ maxLines = 1, children }) => {\n return <Container maxLines={maxLines}>{children}</Container>;\n};\n\ninterface IContainerProps {\n maxLines: number;\n}\n\nconst Container = styled.div<IContainerProps>`\n display: -webkit-box;\n max-width: 100%;\n max-height: 100%;\n -webkit-line-clamp: ${props => props.maxLines};\n -webkit-box-orient: vertical;\n overflow: hidden;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { Button, ButtonTypes } from '../Button';\nimport { DraggableContainer } from '../DraggableContainer';\nimport { RPGUIContainerTypes } from '../RPGUIContainer';\nimport { SpriteFromAtlas } from '../shared/SpriteFromAtlas';\n\nexport interface IOptionsItemSelectorProps {\n name: string;\n description?: string;\n imageKey: string;\n}\n\nexport interface IItemSelectorProps {\n atlasJSON: any;\n atlasIMG: any;\n options: IOptionsItemSelectorProps[];\n onClose: () => void;\n onSelect: (value: string) => void;\n}\n\nexport const ItemSelector: React.FC<IItemSelectorProps> = ({\n atlasIMG,\n atlasJSON,\n options,\n onClose,\n onSelect,\n}) => {\n const [selectedValue, setSelectedValue] = useState<string>();\n\n const handleClick = () => {\n let element = document.querySelector(\n `input[name='test']:checked`\n ) as HTMLInputElement;\n const elementValue = element.value;\n setSelectedValue(elementValue);\n };\n\n useEffect(() => {\n if (selectedValue) {\n onSelect(selectedValue);\n }\n }, [selectedValue]);\n return (\n <DraggableContainer\n type={RPGUIContainerTypes.Framed}\n width=\"500px\"\n cancelDrag=\".equipment-container-body .arrow-selector\"\n onCloseButton={() => {\n if (onClose) {\n onClose();\n }\n }}\n >\n <div style={{ width: '100%' }}>\n <Title>{'Harvesting instruments'}</Title>\n <Subtitle>{'Use the tool, you need it'}</Subtitle>\n <hr className=\"golden\" />\n </div>\n\n <RadioInputScroller>\n {options?.map((option, index) => (\n <RadioOptionsWrapper key={index}>\n <SpriteAtlasWrapper>\n <SpriteFromAtlas\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={option.imageKey}\n imgScale={3}\n />\n </SpriteAtlasWrapper>\n <div>\n <input\n className=\"rpgui-radio\"\n type=\"radio\"\n value={option.name}\n name=\"test\"\n />\n <label\n onClick={handleClick}\n style={{ display: 'flex', alignItems: 'center' }}\n >\n {option.name} <br />\n {option.description}\n </label>\n </div>\n </RadioOptionsWrapper>\n ))}\n </RadioInputScroller>\n <ButtonWrapper>\n <Button buttonType={ButtonTypes.RPGUIButton} onClick={onClose}>\n Cancel\n </Button>\n <Button buttonType={ButtonTypes.RPGUIButton}>Select</Button>\n </ButtonWrapper>\n </DraggableContainer>\n );\n};\n\nconst Title = styled.h1`\n font-size: 0.6rem;\n color: yellow !important;\n`;\nconst Subtitle = styled.h1`\n font-size: 0.4rem;\n color: yellow !important;\n`;\n\nconst RadioInputScroller = styled.div`\n padding-left: 15px;\n padding-top: 10px;\n width: 100%;\n margin-top: 1rem;\n align-items: center;\n margin-left: 20px;\n align-items: flex-start;\n overflow-y: scroll;\n height: 360px;\n`;\n\nconst SpriteAtlasWrapper = styled.div`\n margin-right: 40px;\n`;\n\nconst RadioOptionsWrapper = styled.div`\n display: flex;\n align-items: stretch;\n margin-bottom: 40px;\n`;\n\nconst ButtonWrapper = styled.div`\n display: flex;\n justify-content: space-around;\n padding-top: 20px;\n width: 100%;\n`;\n","import React, { useEffect, useState } from 'react';\n\nexport interface ICheckItems {\n label: string;\n value: string;\n}\n\nexport interface ICheckProps {\n items: ICheckItems[];\n onChange: (selectedValues: IChecklistSelectedValues) => void;\n}\n\nexport interface IChecklistSelectedValues {\n [label: string]: boolean;\n}\n\nexport const CheckButton: React.FC<ICheckProps> = ({ items, onChange }) => {\n const generateSelectedValuesList = () => {\n const selectedValues: IChecklistSelectedValues = {};\n\n items.forEach(item => {\n selectedValues[item.label] = false;\n });\n\n return selectedValues;\n };\n\n const [selectedValues, setSelectedValues] = useState<\n IChecklistSelectedValues\n >(generateSelectedValuesList());\n\n const handleClick = (label: string) => {\n setSelectedValues({\n ...selectedValues,\n [label]: !selectedValues[label],\n });\n };\n\n useEffect(() => {\n if (selectedValues) {\n onChange(selectedValues);\n }\n }, [selectedValues]);\n\n return (\n <div id=\"elemento-checkbox\">\n {items?.map((element, index) => {\n return (\n <div key={`${element.label}_${index}`}>\n <input\n className=\"rpgui-checkbox\"\n type=\"checkbox\"\n checked={selectedValues[element.label]}\n onChange={() => {}}\n />\n <label onClick={() => handleClick(element.label)}>\n {element.label}\n </label>\n <br />\n </div>\n );\n })}\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\n\nexport interface IRadioItems {\n label: string;\n value: string;\n}\n\nexport interface IRadioProps {\n name: string;\n items: IRadioItems[];\n onChange: (value: string) => void;\n}\n\nexport const InputRadio: React.FC<IRadioProps> = ({\n name,\n items,\n onChange,\n}) => {\n const [selectedValue, setSelectedValue] = useState<string>();\n const handleClick = () => {\n let element = document.querySelector(\n `input[name=${name}]:checked`\n ) as HTMLInputElement;\n const elementValue = element.value;\n setSelectedValue(elementValue);\n };\n\n useEffect(() => {\n if (selectedValue) {\n onChange(selectedValue);\n }\n }, [selectedValue]);\n\n return (\n <div id=\"elemento-radio\">\n {items.map(element => {\n return (\n <>\n <input\n key={element.value}\n className=\"rpgui-radio\"\n value={element.value}\n name={name}\n type=\"radio\"\n />\n <label onClick={handleClick}>{element.label}</label>\n <br />\n </>\n );\n })}\n </div>\n );\n};\n","import React from 'react';\n\nexport interface ITextArea\n extends React.DetailedHTMLProps<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n HTMLTextAreaElement\n > {}\n\nexport const TextArea: React.FC<ITextArea> = ({ ...props }) => {\n return <textarea {...props} />;\n};\n"],"names":["ButtonTypes","RPGUIContainerTypes","Button","disabled","children","buttonType","onClick","props","React","ButtonContainer","className","onTouchStart","styled","button","displayName","componentId","ErrorBoundary","args","_this","state","hasError","getDerivedStateFromError","_","_proto","componentDidCatch","error","errorInfo","console","render","this","SpriteFromAtlas","atlasIMG","atlasJSON","spriteKey","imgScale","Component","_ref$width","width","GRID_WIDTH","_ref$height","height","GRID_HEIGHT","_ref$imgScale","imgStyle","containerStyle","_ref$grayScale","grayScale","_ref$opacity","opacity","spriteData","frames","Error","Container","hasHover","style","ImgSprite","frame","scale","div","w","h","x","y","SelectArrow","direction","size","LeftArrow","RightArrow","span","Ellipsis","maxWidth","fontSize","center","maxLines","PropertySelect","item","availableProperties","onChange","useState","currentIndex","setCurrentIndex","propertiesLength","length","onLeftClick","index","onRightClick","useEffect","JSON","stringify","TextOverlay","Item","name","Input","RPGUIContainer","type","Column","flex","flexWrap","alignItems","justifyContent","CloseButton","CustomInput","CustomContainer","Form","form","MessageText","p","useOutsideClick","ref","id","handleClickOutside","event","current","contains","target","CustomEvent","detail","document","dispatchEvent","addEventListener","removeEventListener","NPCDialogType","DraggableContainer","_ref$type","FramedGold","onCloseButton","title","imgSrc","_ref$imgWidth","imgWidth","cancelDrag","onPositionChange","onOutsideClick","draggableRef","useRef","_e","Draggable","cancel","onDrag","data","TitleContainer","Title","Icon","src","h1","img","Dropdown","options","dropdownId","uuidv4","selectedValue","setSelectedValue","selectedOption","setSelectedOption","opened","setOpened","firstOption","value","option","onMouseLeave","DropdownSelect","prev","DropdownOptions","map","key","ul","StyledItem","Recipes","Subtitle","RadioInputScroller","SpriteAtlasWrapper","RadioOptionsWrapper","ButtonWrapper","Details","RelativeListMenu","onSelected","_ref$fontSize","overflow","params","ListElement","text","li","ItemTooltip","label","generateContextMenuListOptions","actionsByTypeList","action","ItemSocketEventsDisplayLabels","EquipmentSlotSpriteByType","Neck","LeftHand","Ring","Head","Torso","Legs","Feet","Inventory","RightHand","Accessory","ItemSlot","observer","slotIndex","containerType","itemContainerType","slotSpriteMask","onMouseOver","onMouseOut","_ref$isContextMenuDis","isContextMenuDisabled","isTooltipVisible","setTooltipVisible","isContextMenuVisible","setIsContextMenuVisible","contextActions","setContextActions","contextActionMenu","ItemContainerType","ItemType","Weapon","Armor","Jewelry","ActionsForInventory","Equipment","Consumable","CraftingResource","Tool","Other","ActionsForEquipmentSet","Loot","ActionsForLoot","MapContainer","ActionsForMapContainer","contextActionMenuDontHaveUseWith","find","toLowerCase","includes","hasUseWith","push","generateContextMenu","getStackInfo","itemId","stackQty","ItemQtyContainer","ItemQty","clientX","clientY","onMouseEnter","optionId","itemToRender","texturePath","allowedEquipSlotType","_itemToRender$allowed","element","_id","getItemTextureKeyPath","stackInfo","renderEquipment","renderItem","onRenderSlot","EquipmentSetContainer","EquipmentColumn","IS_MOBILE_OR_TABLET","isMobile","tablet","DynamicText","onFinish","onStart","textState","setTextState","i","interval","setInterval","substring","clearInterval","TextContainer","NPCDialogText","str","charactersPerLine","linesPerDiv","onClose","onEndStep","onStartStep","windowSize","window","innerWidth","innerHeight","textChunks","Math","floor","round","match","RegExp","chunkIndex","setChunkIndex","onHandleSpacePress","code","goToNextStep","showGoNextIndicator","setShowGoNextIndicator","PressSpaceIndicator","right","TextOnly","pressSpaceGif","useEventListener","handler","el","savedHandler","listener","e","QuestionDialog","questions","answers","currentQuestion","setCurrentQuestion","canShowAnswers","setCanShowAnswers","onGetFirstAnswer","answerIds","firstAnswerId","answer","currentAnswer","setCurrentAnswer","onGetAnswers","answerId","nextAnswerIndex","findIndex","nextAnswerID","nextAnswer","previousAnswerIndex","previousAnswerID","previousAnswer","pop","nextQuestionId","question","QuestionContainer","AnswersContainer","isSelected","selectedColor","AnswerRow","AnswerSelectedIcon","color","Answer","onAnswerClick","onRenderCurrentAnswers","ImgSide","NPCDialog","imagePath","_ref$isQuestionDialog","isQuestionDialog","TextAndThumbnail","ThumbnailContainer","NPCThumbnail","aliceDefaultThumbnail","RangeSliderType","NPCMultiDialog","textAndTypeArray","slide","setSlide","_textAndTypeArray$sli","imageSide","BackgroundContainer","imgPath","DialogContainer","SlotsContainer","Framed","ItemsContainer","ProgressBarText","minWidth","percentageWidth","QuestDraggableContainer","QuestContainer","QuestsContainer","Content","QuestSplitDiv","QuestColumn","Thumbnail","QuestListContainer","NoQuestContainer","_RPGUI","RPGUI","input","SimpleProgressBar","_ref$bgColor","bgColor","_ref$margin","margin","ProgressBarContainer","BackgroundBar","Progress","SkillProgressBar","skillName","level","skillPoints","skillPointsToNextLevel","_ref$showSkillPoints","showSkillPoints","getSPForLevel","nextLevelSPWillbe","ratio","ProgressTitle","TitleName","ValueDisplay","ProgressBody","ProgressIconContainer","SpriteContainer","SkillDisplayContainer","SkillPointsDisplay","skillProps","attributes","values","stamina","magic","magicResistance","strength","resistance","dexterity","combat","first","club","sword","axe","distance","shielding","dagger","crafting","fishing","mining","lumberjacking","cooking","alchemy","SkillsDraggableContainer","SkillSplitDiv","DayNightPeriod","periodOfDay","periodOfDaySrcFiles","PeriodOfDay","Morning","Afternoon","Night","GifContainer","WidgetContainer","Time","DayNightContainer","TradingItemRow","onQuantityChange","traderItem","selectedQty","qty","ItemWrapper","ItemIconContainer","ItemNameContainer","NameValue","capitalize","price","QuantityContainer","QuantityDisplay","TradingComponentScrollWrapper","TotalWrapper","GoldWrapper","AlertWrapper","availableCharacters","propertySelectValues","textureKey","selectedSpriteKey","setSelectedSpriteKey","entitiesJSON","display","paddingBottom","left","chatMessages","onSendChatMessage","onFocus","onBlur","message","setMessage","scrollChatToBottom","scrollingElement","querySelector","scrollTop","scrollHeight","FramedGrey","fallback","emitter","createdAt","dayjs","Date","format","onRenderMessageLines","onRenderChatMessages","onSubmit","preventDefault","autoComplete","RPGUIButton","items","selectedValues","forEach","generateSelectedValuesList","setSelectedValues","checked","onSelect","onCraftItem","craftablesItems","optionsId","show","isShown","setIsShown","craftItem","setCraftItem","modifyString","parts","split","words","replace","slice","toUpperCase","concat","join","handleClick","Object","keys","ItemSubType","canCraft","ingredients","details","equipmentSet","onItemClick","equipmentData","neck","leftHand","ring","head","armor","legs","boot","inventory","rightHand","accessory","equipmentMaskSlots","ItemSlotType","onRenderEquipmentSlotRange","start","end","equipmentRange","slotMaksRange","itemContainer","itemType","ContainerType","backgroundImgPath","fullCoverBackground","setImage","fullImg","_ref$disableContextMe","disableContextMenu","slots","slotQty","_itemContainer$slots","onRenderSlots","imageKey","description","max","_ref$displayText","displayText","_ref$percentageWidth","_ref$minWidth","calculatePercentageValue","quests","buttons","onChangeQuest","questsLength","thumbnail","thumbnailDefault","npcId","quest","valueMin","valueMax","sliderId","onMouseUp","rpguiSlider","getElementById","get_value","Number","Slider","GoldSlider","min","skill","onRenderSkillCategory","category","skillCategory","skillCategoryColor","output","entries","skillDetails","experience","xpToNextLevel","TimeClock","word","traderItems","characterAvailableGold","onConfirm","sum","setSum","Map","qtyMap","setQtyMap","set","newSum","get","isBuy","hasGoldForSale","tradeItem","assign"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"long-bow.cjs.production.min.js","sources":["../src/constants/uiFonts.ts","../src/components/Button.tsx","../src/components/RPGUIContainer.tsx","../src/components/shared/SpriteFromAtlas.tsx","../src/components/Item/Inventory/ErrorBoundary.tsx","../src/components/Arrow/SelectArrow.tsx","../src/components/shared/Ellipsis.tsx","../src/components/PropertySelect/PropertySelect.tsx","../src/components/Character/CharacterSelection.tsx","../src/components/Input.tsx","../src/components/shared/Column.tsx","../src/components/Chat/Chat.tsx","../src/constants/uiColors.ts","../src/hooks/useOutsideAlerter.ts","../src/components/NPCDialog/NPCDialog.tsx","../src/components/DraggableContainer.tsx","../src/components/Dropdown.tsx","../src/components/CraftBook/CraftBook.tsx","../src/components/DropdownSelectorContainer.tsx","../src/components/RelativeListMenu.tsx","../src/components/Item/Cards/ItemTooltip.tsx","../src/components/Item/Inventory/itemContainerHelper.ts","../src/components/Item/Inventory/ItemSlot.tsx","../src/components/Equipment/EquipmentSet.tsx","../src/constants/uiDevices.ts","../src/components/typography/DynamicText.tsx","../src/components/NPCDialog/NPCDialogText.tsx","../src/libs/StringHelpers.ts","../src/hooks/useEventListener.ts","../src/components/NPCDialog/QuestionDialog/QuestionDialog.tsx","../src/components/NPCDialog/NPCMultiDialog.tsx","../src/components/RangeSlider.tsx","../src/components/HistoryDialog.tsx","../src/components/Abstractions/SlotsContainer.tsx","../src/components/Item/Inventory/ItemContainer.tsx","../src/components/ListMenu.tsx","../src/components/ProgressBar.tsx","../src/components/QuestInfo/QuestInfo.tsx","../src/components/QuestList.tsx","../src/components/RPGUIRoot.tsx","../src/components/SimpleProgressBar.tsx","../src/components/SkillProgressBar.tsx","../src/components/SkillsContainer.tsx","../src/components/TimeWidget/DayNightPeriod/DayNightPeriod.tsx","../src/components/TimeWidget/TimeWidget.tsx","../src/components/TradingMenu/TradingItemRow.tsx","../src/components/TradingMenu/TradingMenu.tsx","../src/components/Truncate.tsx","../src/components/itemSelector/ItemSelector.tsx","../src/components/CheckButton.tsx","../src/components/RadioButton.tsx","../src/components/TextArea.tsx"],"sourcesContent":["export const uiFonts = {\n size: {\n xxsmall: '8px',\n xsmall: '9px',\n small: '12px',\n medium: '14px',\n large: '16px',\n xLarge: '18px',\n xxLarge: '20px',\n xxxLarge: '24px',\n },\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { uiFonts } from '../constants/uiFonts';\n\nexport enum ButtonTypes {\n RPGUIButton = 'rpgui-button',\n RPGUIGoldButton = 'rpgui-button golden',\n}\n\nexport interface IButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n disabled?: boolean;\n children: React.ReactNode;\n buttonType: ButtonTypes;\n onClick?: (e: any) => void;\n}\n\nexport const Button = ({\n disabled = false,\n children,\n buttonType,\n onClick,\n ...props\n}: IButtonProps) => {\n return (\n <ButtonContainer\n className={`${buttonType}`}\n disabled={disabled}\n {...props}\n onTouchStart={onClick}\n onClick={onClick}\n >\n <p>{children}</p>\n </ButtonContainer>\n );\n};\n\nconst ButtonContainer = styled.button`\n height: 45px;\n font-size: ${uiFonts.size.small};\n`;\n","import React from 'react';\nimport styled from 'styled-components';\n\nexport enum RPGUIContainerTypes {\n Framed = 'framed',\n FramedGold = 'framed-golden',\n FramedGold2 = 'framed-golden-2',\n FramedGrey = 'framed-grey',\n}\nexport interface IRPGUIContainerProps {\n type: RPGUIContainerTypes;\n children: React.ReactNode;\n width?: string;\n height?: string;\n className?: string;\n}\n\nexport const RPGUIContainer: React.FC<IRPGUIContainerProps> = ({\n children,\n type,\n width = '50%',\n height,\n className,\n}) => {\n return (\n <Container\n width={width}\n height={height || 'auto'}\n className={`rpgui-container ${type} ${className}`}\n >\n {children}\n </Container>\n );\n};\n\ninterface IContainerProps {\n width: string;\n height: string;\n}\n\nconst Container = styled.div<IContainerProps>`\n height: ${props => props.height};\n width: ${({ width }) => width};\n display: flex;\n flex-wrap: wrap;\n image-rendering: pixelated;\n`;\n","import { GRID_HEIGHT, GRID_WIDTH } from '@rpg-engine/shared';\nimport React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n atlasJSON: any;\n atlasIMG: any;\n spriteKey: string;\n width?: number;\n height?: number;\n grayScale?: boolean;\n opacity?: number;\n onClick?: () => void;\n containerStyle?: any;\n imgStyle?: any;\n imgScale?: number;\n}\n\nexport const SpriteFromAtlas: React.FC<IProps> = ({\n atlasJSON,\n atlasIMG,\n spriteKey,\n width = GRID_WIDTH,\n height = GRID_HEIGHT,\n imgScale = 2,\n imgStyle,\n onClick,\n containerStyle,\n grayScale = false,\n opacity = 1,\n}) => {\n //! If an item is not showing, remember that you MUST run yarn atlas:copy everytime you add a new item to the atlas (it will sync our public folder atlas with src/atlas).\n //!Due to React's limitations, we cannot import it from the public folder directly!\n\n const spriteData =\n atlasJSON.frames[spriteKey] || atlasJSON.frames['others/no-image.png'];\n\n if (!spriteData) throw new Error(`Sprite ${spriteKey} not found in atlas!`);\n\n return (\n <Container\n width={width}\n height={height}\n hasHover={grayScale}\n onClick={onClick}\n style={containerStyle}\n >\n <ImgSprite\n className=\"sprite-from-atlas-img\"\n atlasIMG={atlasIMG}\n frame={spriteData.frame}\n scale={imgScale}\n grayScale={grayScale}\n opacity={opacity}\n style={imgStyle}\n />\n </Container>\n );\n};\n\ninterface IImgSpriteProps {\n atlasIMG: any;\n frame: {\n x: number;\n y: number;\n w: number;\n h: number;\n };\n scale: number;\n grayScale: boolean;\n opacity: number;\n}\n\ninterface IContainerProps {\n width: number;\n height: number;\n hasHover: boolean;\n}\n\nconst Container = styled.div`\n width: ${(props: IContainerProps) => props.width}px;\n height: ${(props: IContainerProps) => props.height}px;\n ${(props: IContainerProps) =>\n !props.hasHover\n ? `&:hover {\n filter: sepia(100%) saturate(300%) brightness(70%) hue-rotate(180deg);\n }`\n : ``}\n`;\n\nconst ImgSprite = styled.div<IImgSpriteProps>`\n width: ${props => props.frame.w}px;\n height: ${props => props.frame.h}px;\n background-image: url(${props => props.atlasIMG});\n background-position: -${props => props.frame.x}px -${props => props.frame.y}px;\n transform: scale(${props => props.scale});\n position: relative;\n top: 8px;\n left: 8px;\n filter: ${props => (props.grayScale ? 'grayscale(100%)' : 'none')};\n opacity: ${props => props.opacity};\n`;\n","import React, { Component, ErrorInfo, ReactNode } from 'react';\nimport atlasJSON from '../../../mocks/atlas/items/items.json';\nimport atlasIMG from '../../../mocks/atlas/items/items.png';\nimport { SpriteFromAtlas } from '../../shared/SpriteFromAtlas';\n\ninterface Props {\n children?: ReactNode;\n}\n\ninterface State {\n hasError: boolean;\n}\n\nexport class ErrorBoundary extends Component<Props, State> {\n public state: State = {\n hasError: false,\n };\n\n public static getDerivedStateFromError(_: Error): State {\n // Update state so the next render will show the fallback UI.\n return { hasError: true };\n }\n\n public componentDidCatch(error: Error, errorInfo: ErrorInfo) {\n console.error('Uncaught error:', error, errorInfo);\n }\n\n public render() {\n if (this.state.hasError) {\n return (\n <SpriteFromAtlas\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={'others/no-image.png'}\n imgScale={3}\n />\n );\n }\n\n return this.props.children;\n }\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport LeftArrowClickIcon from './img/arrow01-left-clicked.png';\nimport LeftArrowIcon from './img/arrow01-left.png';\nimport RightArrowClickIcon from './img/arrow01-right-clicked.png';\nimport RightArrowIcon from './img/arrow01-right.png';\n\nexport interface ArrowBarProps extends React.HTMLAttributes<HTMLDivElement> {\n direction: 'right' | 'left';\n onClick: () => void;\n size?: number;\n}\n\nexport const SelectArrow: React.FC<ArrowBarProps> = ({\n direction = 'left',\n size,\n onClick,\n ...props\n}) => {\n return (\n <>\n {direction === 'left' ? (\n <LeftArrow size={size} onClick={() => onClick()} {...props}></LeftArrow>\n ) : (\n <RightArrow\n size={size}\n onClick={() => onClick()}\n {...props}\n ></RightArrow>\n )}\n </>\n );\n};\n\ninterface IArrowProps {\n size?: number;\n}\n\nconst LeftArrow = styled.span<IArrowProps>`\n background-image: url(${LeftArrowIcon});\n background-size: 100% 100%;\n left: 0;\n position: absolute;\n width: ${props => props.size || 40}px;\n height: ${props => props.size || 42}px;\n :active {\n background-image: url(${LeftArrowClickIcon});\n }\n z-index: 2;\n`;\n\nconst RightArrow = styled.span<IArrowProps>`\n background-image: url(${RightArrowIcon});\n right: 0;\n position: absolute;\n width: ${props => props.size || 40}px;\n height: ${props => props.size || 42}px;\n background-size: 100% 100%;\n :active {\n background-image: url(${RightArrowClickIcon});\n }\n z-index: 2;\n`;\n\nexport default SelectArrow;\n","import React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n children: React.ReactNode;\n maxLines: 1 | 2 | 3;\n maxWidth: string;\n fontSize?: string;\n center?: boolean;\n}\n\nexport const Ellipsis = ({\n children,\n maxLines,\n maxWidth,\n fontSize,\n center,\n}: IProps) => {\n return (\n <Container maxWidth={maxWidth} fontSize={fontSize} center={center}>\n <div className={`ellipsis-${maxLines}-lines`}>{children}</div>\n </Container>\n );\n};\n\ninterface IContainerProps {\n maxWidth?: string;\n fontSize?: string;\n center?: boolean;\n}\n\nconst Container = styled.div<IContainerProps>`\n .ellipsis-1-lines {\n white-space: nowrap;\n text-overflow: ellipsis;\n overflow: hidden;\n max-width: ${props => props.maxWidth};\n\n ${props => props.center && `margin: 0 auto;`}\n }\n .ellipsis-2-lines {\n display: -webkit-box;\n max-width: ${props => props.maxWidth}px;\n\n height: 25px;\n margin: 0 auto;\n line-height: 1;\n -webkit-line-clamp: 2;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n .ellipsis-3-lines {\n display: -webkit-box;\n max-width: ${props => props.maxWidth}px;\n\n height: 43px;\n margin: 0 auto;\n line-height: 1;\n -webkit-line-clamp: 3;\n -webkit-box-orient: vertical;\n text-overflow: ellipsis;\n overflow: hidden;\n }\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { uiFonts } from '../../constants/uiFonts';\nimport SelectArrow from '../Arrow/SelectArrow';\nimport { Ellipsis } from '../shared/Ellipsis';\n\nexport interface IPropertySelectProps {\n availableProperties: Array<IPropertiesProps>;\n selectedProperty?: IPropertiesProps;\n children?: React.ReactNode;\n onChange: (selectedProperty: IPropertiesProps) => void;\n}\n\nexport interface IPropertiesProps {\n id: string;\n name: string;\n}\n\nexport const PropertySelect: React.FC<IPropertySelectProps> = ({\n availableProperties,\n onChange,\n}) => {\n const [currentIndex, setCurrentIndex] = useState(0);\n const propertiesLength = availableProperties.length - 1;\n\n const onLeftClick = () => {\n if (currentIndex === 0) setCurrentIndex(propertiesLength);\n else setCurrentIndex(index => index - 1);\n };\n const onRightClick = () => {\n if (currentIndex === propertiesLength) setCurrentIndex(0);\n else setCurrentIndex(index => index + 1);\n };\n\n useEffect(() => {\n onChange(availableProperties[currentIndex]);\n }, [currentIndex]);\n\n useEffect(() => {\n setCurrentIndex(0);\n }, [JSON.stringify(availableProperties)]);\n\n const getCurrentSelectionName = () => {\n const item = availableProperties[currentIndex];\n if (item) {\n return item.name;\n }\n return '';\n };\n\n return (\n <Container>\n <TextOverlay>\n <p>\n <Item>\n <Ellipsis maxLines={1} maxWidth=\"60%\" center>\n {getCurrentSelectionName()}\n </Ellipsis>\n </Item>\n </p>\n </TextOverlay>\n <div className=\"rpgui-progress-track\"></div>\n\n <SelectArrow\n direction=\"left\"\n onClick={onLeftClick}\n onTouchStart={onLeftClick}\n ></SelectArrow>\n <SelectArrow\n direction=\"right\"\n onClick={onRightClick}\n onTouchStart={onRightClick}\n ></SelectArrow>\n </Container>\n );\n};\n\nconst Item = styled.span`\n font-size: 1rem;\n color: white;\n text-align: center;\n z-index: 1;\n position: absolute;\n top: 12px;\n width: 100%;\n\n p {\n margin: 0 auto;\n font-size: ${uiFonts.size.small};\n }\n`;\n\nconst TextOverlay = styled.div`\n width: 100%;\n position: relative;\n`;\n\ninterface IContainerProps {\n percentageWidth?: number;\n minWidth?: number;\n style?: Record<string, any>;\n}\n\nconst Container = styled.div<IContainerProps>`\n position: relative;\n display: flex;\n flex-direction: column;\n justify-content: start;\n align-items: flex-start;\n min-width: 100px;\n width: 40%;\n`;\n\nexport default PropertySelect;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\nimport { SpriteFromAtlas } from '../shared/SpriteFromAtlas';\n\nimport entitiesJSON from '../../mocks/atlas/entities/entities.json';\nimport entitiesIMG from '../../mocks/atlas/entities/entities.png';\nimport { ErrorBoundary } from '../Item/Inventory/ErrorBoundary';\nimport PropertySelect, {\n IPropertiesProps,\n} from '../PropertySelect/PropertySelect';\n\nexport interface ICharacterProps {\n name: string;\n textureKey: string;\n}\n\nexport interface ICharacterSelectionProps {\n availableCharacters: ICharacterProps[];\n onChange: (textureKey: string) => void;\n}\n\nexport const CharacterSelection: React.FC<ICharacterSelectionProps> = ({\n availableCharacters,\n onChange,\n}) => {\n const propertySelectValues = availableCharacters.map(item => {\n return {\n id: item.textureKey,\n name: item.name,\n };\n });\n\n const [selectedValue, setSelectedValue] = useState<IPropertiesProps>();\n const [selectedSpriteKey, setSelectedSpriteKey] = useState('');\n\n const onSelectedValueChange = () => {\n const textureKey = selectedValue ? selectedValue.id : '';\n const spriteKey = textureKey ? textureKey + '/down/standing/0.png' : '';\n\n if (spriteKey === selectedSpriteKey) {\n return;\n }\n\n setSelectedSpriteKey(spriteKey);\n onChange(textureKey);\n };\n\n useEffect(() => {\n onSelectedValueChange();\n }, [selectedValue]);\n\n useEffect(() => {\n setSelectedValue(propertySelectValues[0]);\n }, [availableCharacters]);\n\n return (\n <Container>\n {selectedSpriteKey && (\n <ErrorBoundary>\n <SpriteFromAtlas\n spriteKey={selectedSpriteKey}\n atlasIMG={entitiesIMG}\n atlasJSON={entitiesJSON}\n imgScale={4}\n height={80}\n width={64}\n containerStyle={{\n display: 'flex',\n alignItems: 'center',\n paddingBottom: '15px',\n }}\n imgStyle={{\n left: '22px',\n }}\n />\n </ErrorBoundary>\n )}\n <PropertySelect\n availableProperties={propertySelectValues}\n onChange={value => {\n setSelectedValue(value);\n }}\n />\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n flex-direction: column;\n align-items: center;\n image-rendering: pixelated;\n`;\n\nexport default CharacterSelection;\n","import React from 'react';\n\nexport interface IInputProps\n extends React.DetailedHTMLProps<\n React.InputHTMLAttributes<HTMLInputElement>,\n HTMLInputElement\n > {}\n\nexport const Input: React.FC<IInputProps> = ({ ...props }) => {\n return <input {...props} />;\n};\n","import styled from 'styled-components';\n\ninterface IColumn {\n flex?: number;\n alignItems?: string;\n justifyContent?: string;\n flexWrap?: string;\n}\n\nexport const Column = styled.div<IColumn>`\n flex: ${props => props.flex || 'auto'};\n display: flex;\n flex-wrap: ${props => props.flexWrap || 'nowrap'};\n align-items: ${props => props.alignItems || 'flex-start'};\n justify-content: ${props => props.justifyContent || 'flex-start'};\n`;\n","import { IChatMessage } from '@rpg-engine/shared';\nimport dayjs from 'dayjs';\nimport React, { useEffect, useState } from 'react';\nimport { ErrorBoundary } from 'react-error-boundary';\nimport styled from 'styled-components';\nimport { uiColors } from '../../constants/uiColors';\nimport { uiFonts } from '../../constants/uiFonts';\nimport { Button, ButtonTypes } from '../Button';\nimport { Input } from '../Input';\nimport { RPGUIContainer, RPGUIContainerTypes } from '../RPGUIContainer';\nimport { Column } from '../shared/Column';\n\ninterface IEmitter {\n _id: string;\n name: string;\n}\nexport interface IChatProps {\n chatMessages: IChatMessage[];\n onSendChatMessage: (message: string) => void;\n onCloseButton: () => void;\n onFocus?: () => void;\n onBlur?: () => void;\n opacity?: number;\n width?: string;\n height?: string;\n}\n\nexport const Chat: React.FC<IChatProps> = ({\n chatMessages,\n onSendChatMessage,\n opacity = 1,\n width = '100%',\n height = '250px',\n onCloseButton,\n onFocus,\n onBlur,\n}) => {\n const [message, setMessage] = useState('');\n\n useEffect(() => {\n scrollChatToBottom();\n }, []);\n\n useEffect(() => {\n scrollChatToBottom();\n }, [chatMessages]);\n\n const scrollChatToBottom = () => {\n const scrollingElement = document.querySelector('.chat-body');\n if (scrollingElement) {\n scrollingElement.scrollTop = scrollingElement.scrollHeight;\n }\n };\n\n const handleSubmit = (event: React.SyntheticEvent<HTMLFormElement>) => {\n event.preventDefault();\n onSendChatMessage(message);\n setMessage('');\n };\n const getInputValue = (value: string) => {\n setMessage(value);\n };\n\n const onRenderMessageLines = (\n emitter: IEmitter,\n createdAt: string | undefined,\n message: string\n ) => {\n return `${dayjs(createdAt || new Date()).format('HH:mm')} ${\n emitter?.name ? `${emitter.name}: ` : 'Unknown: '\n } ${message}`;\n };\n\n const onRenderChatMessages = (chatMessages: IChatMessage[]) => {\n return chatMessages?.length ? (\n chatMessages?.map(({ _id, createdAt, emitter, message }, index) => (\n <MessageText key={`${_id}_${index}`}>\n {onRenderMessageLines(emitter, createdAt, message)}\n </MessageText>\n ))\n ) : (\n <MessageText>No messages available.</MessageText>\n );\n };\n\n return (\n <Container>\n <CustomContainer\n type={RPGUIContainerTypes.FramedGrey}\n width={width}\n height={height}\n className=\"chat-container\"\n opacity={opacity}\n >\n <ErrorBoundary fallback={<p>Oops! Your chat has crashed.</p>}>\n {onCloseButton && (\n <CloseButton onClick={onCloseButton} onTouchStart={onCloseButton}>\n X\n </CloseButton>\n )}\n <RPGUIContainer\n type={RPGUIContainerTypes.FramedGrey}\n width={'100%'}\n height={'80%'}\n className=\"chat-body dark-background\"\n >\n {onRenderChatMessages(chatMessages)}\n </RPGUIContainer>\n\n <Form onSubmit={handleSubmit}>\n <Column flex={70}>\n <CustomInput\n value={message}\n id=\"inputMessage\"\n onChange={e => getInputValue(e.target.value)}\n height={20}\n className=\"chat-input dark-background\"\n type=\"text\"\n autoComplete=\"off\"\n onFocus={onFocus}\n onBlur={onBlur}\n />\n </Column>\n <Column justifyContent=\"flex-end\">\n <Button\n buttonType={ButtonTypes.RPGUIButton}\n id=\"chat-send-button\"\n >\n Send\n </Button>\n </Column>\n </Form>\n </ErrorBoundary>\n </CustomContainer>\n </Container>\n );\n};\n\nconst Container = styled.div`\n position: relative;\n`;\n\nconst CloseButton = styled.div`\n position: absolute;\n top: 2px;\n right: 0px;\n color: white;\n z-index: 22;\n font-size: 0.7rem;\n`;\n\nconst CustomInput = styled(Input)`\n height: 30px;\n width: 100%;\n\n .rpgui-content .input {\n min-height: 39px;\n }\n`;\n\ninterface ICustomContainerProps {\n opacity: number;\n}\n\nconst CustomContainer = styled(RPGUIContainer)`\n display: block;\n\n opacity: ${(props: ICustomContainerProps) => props.opacity};\n\n &:hover {\n opacity: 1;\n }\n\n .dark-background {\n background-color: ${uiColors.darkGray} !important;\n }\n\n .chat-body {\n &.rpgui-container.framed-grey {\n background: unset;\n }\n max-height: 170px;\n overflow-y: auto;\n }\n`;\n\nconst Form = styled.form`\n display: flex;\n width: 100%;\n justify-content: center;\n align-items: center;\n`;\n\nconst MessageText = styled.p`\n display: block !important;\n width: 100%;\n font-size: ${uiFonts.size.xsmall} !important;\n overflow-y: auto;\n margin: 0;\n`;\n","export const uiColors = {\n lightGray: '#757161',\n gray: '#4E4A4E',\n darkGray: '#3e3e3e',\n darkYellow: '#FFC857',\n yellow: '#FFFF00',\n orange: '#D27D2C',\n cardinal: '#C5283D',\n red: '#D04648',\n darkRed: '#442434',\n raisinBlack: '#191923',\n navyBlue: '#0E79B2',\n purple: '#6833A3',\n darkPurple: '#522761',\n blue: '#597DCE',\n darkBlue: '#30346D',\n brown: '#854C30',\n lightGreen: '#6DAA2C',\n brownGreen: '#346524',\n};\n","import { useEffect } from 'react';\n\nexport function useOutsideClick(ref: any, id: string) {\n useEffect(() => {\n /**\n * Alert if clicked on outside of element\n */\n function handleClickOutside(event: any) {\n if (ref.current && !ref.current.contains(event.target)) {\n const event = new CustomEvent('clickOutside', {\n detail: {\n id,\n },\n });\n document.dispatchEvent(event);\n }\n }\n // Bind the event listener\n document.addEventListener('mousedown', handleClickOutside);\n return () => {\n // Unbind the event listener on clean up\n document.removeEventListener('mousedown', handleClickOutside);\n };\n }, [ref]);\n}\n","import React from 'react';\nimport styled from 'styled-components';\nimport { RPGUIContainer, RPGUIContainerTypes } from '../RPGUIContainer';\nimport { NPCDialogText } from './NPCDialogText';\nimport {\n IQuestionDialog,\n IQuestionDialogAnswer,\n QuestionDialog,\n} from './QuestionDialog/QuestionDialog';\nimport aliceDefaultThumbnail from './img/npcDialog/npcThumbnails/alice.png';\n\nexport enum NPCDialogType {\n TextOnly = 'TextOnly',\n TextAndThumbnail = 'TextAndThumbnail',\n}\n\nexport interface INPCDialogProps {\n text?: string;\n type: NPCDialogType;\n imagePath?: string;\n onClose?: () => void;\n isQuestionDialog?: boolean;\n answers?: IQuestionDialogAnswer[];\n questions?: IQuestionDialog[];\n}\n\nexport const NPCDialog: React.FC<INPCDialogProps> = ({\n text,\n type,\n onClose,\n imagePath,\n isQuestionDialog = false,\n questions,\n answers,\n}) => {\n return (\n <RPGUIContainer\n type={RPGUIContainerTypes.FramedGold}\n width={isQuestionDialog ? '600px' : '80%'}\n height={'180px'}\n >\n {isQuestionDialog && questions && answers ? (\n <>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <QuestionDialog\n questions={questions}\n answers={answers}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </>\n ) : (\n <>\n <Container>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <NPCDialogText\n type={type}\n text={text || 'No text provided.'}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </Container>\n </>\n )}\n </RPGUIContainer>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n position: relative;\n`;\n\ninterface ITextContainerProps {\n flex: string;\n}\n\nconst TextContainer = styled.div<ITextContainerProps>`\n flex: ${({ flex }) => flex} 0 0;\n width: 355px;\n`;\n\nconst ThumbnailContainer = styled.div`\n flex: 30% 0 0;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst NPCThumbnail = styled.img`\n image-rendering: pixelated;\n height: 128px;\n width: 128px;\n`;\n","import React, { useEffect, useRef } from 'react';\nimport Draggable, { DraggableData } from 'react-draggable';\nimport styled from 'styled-components';\nimport { uiFonts } from '../constants/uiFonts';\nimport { useOutsideClick } from '../hooks/useOutsideAlerter';\nimport { IPosition } from '../types/eventTypes';\nimport { RPGUIContainerTypes } from './RPGUIContainer';\n\nexport interface IDraggableContainerProps {\n children: React.ReactNode;\n width?: string;\n height?: string;\n className?: string;\n type?: RPGUIContainerTypes;\n title?: string;\n imgSrc?: string;\n imgWidth?: string;\n onCloseButton?: () => void;\n cancelDrag?: string;\n onPositionChange?: (position: IPosition) => void;\n onOutsideClick?: () => void;\n}\n\nexport const DraggableContainer: React.FC<IDraggableContainerProps> = ({\n children,\n width = '50%',\n height,\n className,\n type = RPGUIContainerTypes.FramedGold,\n onCloseButton,\n title,\n imgSrc,\n imgWidth = '20px',\n cancelDrag,\n onPositionChange,\n onOutsideClick,\n}) => {\n const draggableRef = useRef(null);\n\n useOutsideClick(draggableRef, 'item-container');\n\n useEffect(() => {\n document.addEventListener('clickOutside', event => {\n const e = event as CustomEvent;\n\n if (e.detail.id === 'item-container') {\n if (onOutsideClick) {\n onOutsideClick();\n }\n }\n });\n\n return () => {\n document.removeEventListener('clickOutside', _e => {});\n };\n }, []);\n\n return (\n <Draggable\n cancel={`.container-close,${cancelDrag}`}\n onDrag={(_e, data: DraggableData) => {\n if (onPositionChange) {\n onPositionChange({\n x: data.x,\n y: data.y,\n });\n }\n }}\n >\n <Container\n ref={draggableRef}\n width={width}\n height={height || 'auto'}\n className={`rpgui-container ${type} ${className}`}\n >\n {title && (\n <TitleContainer className=\"drag-handler\">\n <Title>\n {imgSrc && <Icon src={imgSrc} width={imgWidth} />}\n {title}\n </Title>\n </TitleContainer>\n )}\n {onCloseButton && (\n <CloseButton\n className=\"container-close\"\n onClick={onCloseButton}\n onTouchStart={onCloseButton}\n >\n X\n </CloseButton>\n )}\n\n {children}\n </Container>\n </Draggable>\n );\n};\n\ninterface IContainerProps {\n width: string;\n height: string;\n}\n\nconst Container = styled.div<IContainerProps>`\n height: ${props => props.height};\n width: ${({ width }) => width};\n display: flex;\n flex-wrap: wrap;\n image-rendering: pixelated;\n\n &.rpgui-container {\n padding-top: 1.5rem;\n }\n`;\n\nconst CloseButton = styled.div`\n position: absolute;\n top: 3px;\n right: 0px;\n color: white;\n z-index: 22;\n font-size: 0.8rem;\n`;\n\nconst TitleContainer = styled.div`\n width: 100%;\n height: 100%;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n`;\n\nconst Title = styled.h1`\n color: white;\n z-index: 22;\n font-size: ${uiFonts.size.large};\n`;\n\ninterface ICustomIconProps {\n width: string;\n}\n\nconst Icon = styled.img`\n color: white;\n z-index: 22;\n font-size: ${uiFonts.size.xsmall};\n width: ${(props: ICustomIconProps) => props.width};\n margin-right: 0.5rem;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { v4 as uuidv4 } from 'uuid';\n\nexport interface IOptionsProps {\n id: number;\n value: string;\n option: string;\n}\n\nexport interface IDropdownProps {\n options: IOptionsProps[];\n width?: string;\n onChange: (value: string) => void;\n}\n\nexport const Dropdown: React.FC<IDropdownProps> = ({\n options,\n width,\n onChange,\n}) => {\n const dropdownId = uuidv4();\n\n const [selectedValue, setSelectedValue] = useState<string>('');\n const [selectedOption, setSelectedOption] = useState<string>('');\n const [opened, setOpened] = useState<boolean>(false);\n\n useEffect(() => {\n const firstOption = options[0];\n\n if (firstOption && !selectedValue) {\n setSelectedValue(firstOption.value);\n setSelectedOption(firstOption.option);\n }\n }, [options]);\n\n useEffect(() => {\n if (selectedValue) {\n onChange(selectedValue);\n }\n }, [selectedValue]);\n\n return (\n <Container onMouseLeave={() => setOpened(false)} width={width}>\n <DropdownSelect\n id={`dropdown-${dropdownId}`}\n className=\"rpgui-dropdown-imp rpgui-dropdown-imp-header\"\n onClick={() => setOpened(prev => !prev)}\n >\n <label>▼</label> {selectedOption}\n </DropdownSelect>\n\n <DropdownOptions className=\"rpgui-dropdown-imp\" opened={opened}>\n {options.map(option => {\n return (\n <li\n key={option.id}\n onClick={() => {\n setSelectedValue(option.value);\n setSelectedOption(option.option);\n setOpened(false);\n }}\n >\n {option.option}\n </li>\n );\n })}\n </DropdownOptions>\n </Container>\n );\n};\n\nconst Container = styled.div<{ width: string | undefined }>`\n position: relative;\n width: ${props => props.width || '100%'};\n`;\n\nconst DropdownSelect = styled.p`\n width: 100%;\n box-sizing: border-box;\n`;\n\nconst DropdownOptions = styled.ul<{\n opened: boolean;\n}>`\n position: absolute;\n width: 100%;\n display: ${props => (props.opened ? 'block' : 'none')};\n box-sizing: border-box;\n`;\n","import { ICraftableItem, ItemSubType } from '@rpg-engine/shared';\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Button, ButtonTypes } from '../Button';\nimport { DraggableContainer } from '../DraggableContainer';\nimport { Dropdown, IOptionsProps } from '../Dropdown';\nimport { RPGUIContainerTypes } from '../RPGUIContainer';\nimport { SpriteFromAtlas } from '../shared/SpriteFromAtlas';\n\nexport interface IItemCraftSelectorProps {\n atlasJSON: any;\n atlasIMG: any;\n onClose: () => void;\n onSelect: (value: string) => void;\n onCraftItem: (value: string | undefined) => void;\n craftablesItems: ICraftableItem[];\n}\n\nexport interface ShowMessage {\n show: boolean;\n index: number;\n}\n\nexport const CraftBook: React.FC<IItemCraftSelectorProps> = ({\n atlasIMG,\n atlasJSON,\n onClose,\n onSelect,\n onCraftItem,\n craftablesItems,\n}) => {\n let optionsId: number = 0;\n const [isShown, setIsShown] = useState<ShowMessage>({\n show: false,\n index: 200,\n });\n const [craftItem, setCraftItem] = useState<string>();\n\n const getDropdownOptions = () => {\n const options: IOptionsProps[] = [];\n\n Object.keys(ItemSubType).forEach(key => {\n options.push({\n id: optionsId,\n value: key,\n option: key,\n });\n optionsId += 1;\n });\n\n return options;\n };\n\n const modifyString = (str: string) => {\n // Split the string by \"/\" and \".\"\n let parts = str.split('/');\n let fileName = parts[parts.length - 1];\n parts = fileName.split('.');\n let name = parts[0];\n\n // Replace all occurrences of \"-\" with \" \"\n name = name.replace(/-/g, ' ');\n\n // Uppercase the first word\n let words = name.split(' ');\n let firstWord = words[0].slice(0, 1).toUpperCase() + words[0].slice(1);\n let modifiedWords = [firstWord].concat(words.slice(1));\n name = modifiedWords.join(' ');\n\n return name;\n };\n\n const handleClick = () => {\n let element = document.querySelector(\n `input[name='test']:checked`\n ) as HTMLInputElement;\n const elementValue = element.value;\n setCraftItem(elementValue);\n };\n\n return (\n <DraggableContainer\n type={RPGUIContainerTypes.Framed}\n width=\"500px\"\n cancelDrag=\".equipment-container-body .arrow-selector\"\n onCloseButton={() => {\n if (onClose) {\n onClose();\n }\n }}\n >\n <div style={{ width: '100%' }}>\n <Title>{'Craftbook'}</Title>\n <Subtitle>{'Select an item to craft'}</Subtitle>\n <hr className=\"golden\" />\n </div>\n <Dropdown\n options={getDropdownOptions()}\n onChange={value => onSelect(value)}\n />\n <RadioInputScroller>\n {craftablesItems?.map((option, index) => (\n <RadioOptionsWrapper key={index}>\n <SpriteAtlasWrapper>\n <SpriteFromAtlas\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={option.texturePath}\n imgScale={3}\n grayScale={!option.canCraft}\n />\n </SpriteAtlasWrapper>\n <div>\n <input\n className=\"rpgui-radio\"\n type=\"radio\"\n value={option.name}\n name=\"test\"\n disabled={!option.canCraft}\n />\n <label\n onClick={handleClick}\n style={{ display: 'flex', alignItems: 'center' }}\n onMouseEnter={() => setIsShown({ show: true, index: index })}\n onMouseLeave={() => setIsShown({ show: false, index: index })}\n >\n {modifyString(option.name)}\n </label>\n\n {isShown &&\n isShown.index === index &&\n option.ingredients.map((option, index) => (\n <Recipes key={index}>\n <SpriteFromAtlas\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={option.texturePath}\n imgScale={1}\n />\n <StyledItem>\n {modifyString(option.key)} ({option.qty}x)\n </StyledItem>\n </Recipes>\n ))}\n </div>\n </RadioOptionsWrapper>\n ))}\n </RadioInputScroller>\n <ButtonWrapper>\n <Button buttonType={ButtonTypes.RPGUIButton} onClick={onClose}>\n Cancel\n </Button>\n <Button\n buttonType={ButtonTypes.RPGUIButton}\n onClick={() => onCraftItem(craftItem)}\n >\n Craft\n </Button>\n </ButtonWrapper>\n </DraggableContainer>\n );\n};\n\nconst StyledItem = styled.div`\n margin-left: 10px;\n`;\n\nconst Recipes = styled.div`\n font-size: 0.6rem;\n color: yellow !important;\n margin-bottom: 3px;\n display: flex;\n align-items: center;\n\n .sprite-from-atlas-img {\n top: 0px;\n left: 0px;\n }\n`;\n\nconst Title = styled.h1`\n font-size: 0.6rem;\n color: yellow !important;\n`;\nconst Subtitle = styled.h1`\n font-size: 0.4rem;\n color: yellow !important;\n`;\n\nconst RadioInputScroller = styled.div`\n padding-left: 15px;\n padding-top: 10px;\n width: 100%;\n margin-top: 1rem;\n align-items: center;\n margin-left: 20px;\n align-items: flex-start;\n overflow-y: scroll;\n height: 360px;\n`;\n\nconst SpriteAtlasWrapper = styled.div`\n margin-right: 40px;\n`;\n\nconst RadioOptionsWrapper = styled.div`\n display: flex;\n align-items: stretch;\n margin-bottom: 40px;\n`;\n\nconst ButtonWrapper = styled.div`\n display: flex;\n justify-content: space-around;\n padding-top: 20px;\n width: 100%;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { uiFonts } from '../constants/uiFonts';\nimport { Dropdown } from './Dropdown';\n\ninterface IDropdownSelectorOption {\n id: string;\n name: string;\n}\n\nexport interface IDropdownSelectorContainer {\n onChange: (id: string) => void;\n options: IDropdownSelectorOption[];\n details?: string;\n title: string;\n}\n\nexport const DropdownSelectorContainer: React.FC<IDropdownSelectorContainer> = ({\n title,\n onChange,\n options,\n details,\n}) => {\n return (\n <div>\n <p>{title}</p>\n <Dropdown\n options={options.map((option, index) => ({\n option: option.name,\n value: option.id,\n id: index,\n }))}\n onChange={onChange}\n />\n <Details>{details}</Details>\n </div>\n );\n};\n\nconst Details = styled.p`\n font-size: ${uiFonts.size.xsmall} !important;\n`;\n","import React, { useEffect, useRef } from 'react';\nimport styled from 'styled-components';\nimport { useOutsideClick } from '../hooks/useOutsideAlerter';\n\ninterface IListMenuOption {\n id: string;\n text: string;\n}\n\nexport interface IRelativeMenuProps {\n options: IListMenuOption[];\n onSelected: (selectedOptionId: string) => void;\n fontSize?: number;\n onOutsideClick?: () => void;\n}\n\nexport const RelativeListMenu: React.FC<IRelativeMenuProps> = ({\n options,\n onSelected,\n onOutsideClick,\n fontSize = 0.8,\n}) => {\n const ref = useRef(null);\n\n useOutsideClick(ref, 'relative-context-menu');\n\n useEffect(() => {\n document.addEventListener('clickOutside', event => {\n const e = event as CustomEvent;\n\n if (e.detail.id === 'relative-context-menu') {\n if (onOutsideClick) {\n onOutsideClick();\n }\n }\n });\n\n return () => {\n document.removeEventListener('clickOutside', _e => {});\n };\n }, []);\n\n return (\n <Container fontSize={fontSize} ref={ref}>\n <ul className=\"rpgui-list-imp\" style={{ overflow: 'hidden' }}>\n {options.map((params, index) => (\n <ListElement\n key={params?.id || index}\n onClick={() => {\n onSelected(params?.id);\n }}\n >\n {params?.text || 'No text'}\n </ListElement>\n ))}\n </ul>\n </Container>\n );\n};\n\ninterface IContainerProps {\n fontSize?: number;\n}\n\nconst Container = styled.div<IContainerProps>`\n position: absolute;\n top: 1rem;\n left: 4rem;\n\n display: flex;\n flex-direction: column;\n width: max-content;\n justify-content: start;\n align-items: flex-start;\n\n li {\n font-size: ${props => props.fontSize}em;\n }\n`;\n\nconst ListElement = styled.li`\n margin-right: 0.5rem;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { uiFonts } from '../../../constants/uiFonts';\n\ninterface IProps {\n label: string;\n}\n\nexport const ItemTooltip: React.FC<IProps> = ({ label }) => {\n return (\n <Container>\n <div>{label}</div>\n </Container>\n );\n};\n\nconst Container = styled.div`\n z-index: 2;\n position: absolute;\n top: 1rem;\n left: 4rem;\n\n font-size: ${uiFonts.size.xxsmall};\n color: white;\n background-color: black;\n border-radius: 5px;\n padding: 0.5rem;\n min-width: 20px;\n width: 100%;\n text-align: center;\n\n opacity: 0.75;\n`;\n","import {\n ActionsForEquipmentSet,\n ActionsForInventory,\n ActionsForLoot,\n ActionsForMapContainer,\n IItem,\n ItemContainerType,\n ItemSocketEventsDisplayLabels,\n ItemType,\n} from '@rpg-engine/shared';\n\nexport interface IContextMenuItem {\n id: string;\n text: string;\n}\n\nconst generateContextMenuListOptions = (actionsByTypeList: any) => {\n const contextMenu: IContextMenuItem[] = actionsByTypeList.map(\n (action: string) => {\n return { id: action, text: ItemSocketEventsDisplayLabels[action] };\n }\n );\n return contextMenu;\n};\n\nexport const generateContextMenu = (\n item: IItem,\n itemContainerType: ItemContainerType | null\n) => {\n let contextActionMenu: IContextMenuItem[] = [];\n\n if (itemContainerType === ItemContainerType.Inventory) {\n switch (item.type) {\n case ItemType.Weapon:\n case ItemType.Armor:\n case ItemType.Accessory:\n case ItemType.Jewelry:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForInventory.Equipment\n );\n break;\n case ItemType.Container:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForInventory.Container\n );\n break;\n case ItemType.Consumable:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForInventory.Consumable\n );\n break;\n case ItemType.CraftingResource:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForInventory.CraftingResource\n );\n break;\n case ItemType.Tool:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForInventory.Tool\n );\n break;\n\n default:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForInventory.Other\n );\n break;\n }\n }\n if (itemContainerType === ItemContainerType.Equipment) {\n switch (item.type) {\n case ItemType.Container:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForEquipmentSet.Container\n );\n\n break;\n default:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForEquipmentSet.Equipment\n );\n }\n }\n if (itemContainerType === ItemContainerType.Loot) {\n switch (item.type) {\n case ItemType.Weapon:\n case ItemType.Armor:\n case ItemType.Accessory:\n case ItemType.Jewelry:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForLoot.Equipment\n );\n break;\n case ItemType.Consumable:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForLoot.Consumable\n );\n break;\n case ItemType.CraftingResource:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForLoot.CraftingResource\n );\n break;\n case ItemType.Tool:\n contextActionMenu = generateContextMenuListOptions(ActionsForLoot.Tool);\n break;\n default:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForLoot.Other\n );\n break;\n }\n }\n if (itemContainerType === ItemContainerType.MapContainer) {\n switch (item.type) {\n case ItemType.Weapon:\n case ItemType.Armor:\n case ItemType.Accessory:\n case ItemType.Jewelry:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForMapContainer.Equipment\n );\n break;\n case ItemType.Consumable:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForMapContainer.Consumable\n );\n break;\n case ItemType.CraftingResource:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForMapContainer.CraftingResource\n );\n break;\n case ItemType.Tool:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForMapContainer.Tool\n );\n break;\n default:\n contextActionMenu = generateContextMenuListOptions(\n ActionsForMapContainer.Other\n );\n break;\n }\n\n const contextActionMenuDontHaveUseWith = !contextActionMenu.find(action =>\n action.text.toLowerCase().includes('use with')\n );\n\n if (item.hasUseWith && contextActionMenuDontHaveUseWith) {\n contextActionMenu.push({ id: 'use-with', text: 'Use with...' });\n }\n }\n\n return contextActionMenu;\n};\n","import {\n getItemTextureKeyPath,\n IItem,\n IItemContainer,\n ItemContainerType,\n ItemSlotType,\n ItemType\n} from '@rpg-engine/shared';\n\nimport { observer } from 'mobx-react-lite';\nimport React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { v4 as uuidv4 } from 'uuid';\nimport { uiFonts } from '../../../constants/uiFonts';\nimport { RelativeListMenu } from '../../RelativeListMenu';\nimport { Ellipsis } from '../../shared/Ellipsis';\nimport { SpriteFromAtlas } from '../../shared/SpriteFromAtlas';\nimport { ItemTooltip } from '../Cards/ItemTooltip';\nimport { ErrorBoundary } from './ErrorBoundary';\nimport { generateContextMenu, IContextMenuItem } from './itemContainerHelper';\n\nconst EquipmentSlotSpriteByType: any = {\n Neck: 'accessories/corruption-necklace.png',\n LeftHand: 'swords/broad-sword.png',\n Ring: 'rings/iron-ring.png',\n Head: 'helmets/viking-helmet.png',\n Torso: 'armors/iron-armor.png',\n Legs: 'legs/studded-legs.png',\n Feet: 'boots/iron-boots.png',\n Inventory: 'containers/bag.png',\n RightHand: 'shields/plate-shield.png',\n Accessory: 'ranged-weapons/arrow.png',\n};\n\ninterface IProps {\n slotIndex: number;\n item: IItem | null;\n itemContainer?: IItemContainer | null;\n itemContainerType: ItemContainerType | null;\n slotSpriteMask?: ItemSlotType | null;\n onSelected: (selectedOption: string, item: IItem) => void;\n onMouseOver: (\n event: any,\n slotIndex: number,\n item: IItem | null,\n x: number,\n y: number\n ) => void;\n onMouseOut?: () => void;\n onClick: (\n ItemType: ItemType,\n itemContainerType: ItemContainerType | null,\n item: IItem\n ) => void;\n atlasJSON: any;\n atlasIMG: any;\n isContextMenuDisabled?: boolean;\n}\n\nexport const ItemSlot: React.FC<IProps> = observer(\n ({\n slotIndex,\n item,\n itemContainerType: containerType,\n slotSpriteMask,\n onMouseOver,\n onMouseOut,\n onClick,\n onSelected,\n atlasJSON,\n atlasIMG,\n isContextMenuDisabled = false,\n }) => {\n const [isTooltipVisible, setTooltipVisible] = useState(false);\n\n const [isContextMenuVisible, setIsContextMenuVisible] = useState(false);\n\n const [contextActions, setContextActions] = useState<IContextMenuItem[]>(\n []\n );\n\n useEffect(() => {\n if (item) {\n setContextActions(generateContextMenu(item, containerType));\n }\n }, [item]);\n\n const getStackInfo = (itemId: string, stackQty: number) => {\n // if (itemToRender?.isStackable && itemToRender?.stackQty) {\n\n const isFractionalStackQty = stackQty % 1 !== 0;\n const isLargerThan999 = stackQty > 999;\n\n if (stackQty > 1) {\n return (\n <ItemQtyContainer key={`qty-${itemId}`}>\n <Ellipsis maxLines={1} maxWidth=\"48px\">\n <ItemQty\n className={\n isFractionalStackQty || isLargerThan999 ? 'small' : 'regular'\n }\n >\n {' '}\n {stackQty}{' '}\n </ItemQty>\n </Ellipsis>\n </ItemQtyContainer>\n );\n }\n return undefined;\n };\n\n const renderItem = (itemToRender: IItem | null) => {\n const element = [];\n \n if (itemToRender?.texturePath) {\n element.push(\n <ErrorBoundary key={itemToRender._id}>\n <SpriteFromAtlas\n key={itemToRender._id}\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={getItemTextureKeyPath(\n {\n key: itemToRender.texturePath,\n texturePath: itemToRender.texturePath,\n stackQty: itemToRender.stackQty || 1,\n },\n atlasJSON\n )}\n imgScale={3}\n />\n </ErrorBoundary>\n );\n }\n const stackInfo = getStackInfo(\n itemToRender?._id ?? '',\n itemToRender?.stackQty ?? 0\n );\n if (stackInfo) {\n element.push(stackInfo);\n }\n\n return element;\n };\n\n const renderEquipment = (itemToRender: IItem | null) => {\n if (\n itemToRender?.texturePath &&\n itemToRender.allowedEquipSlotType?.includes(slotSpriteMask!)\n ) {\n const element = [];\n \n element.push(\n <ErrorBoundary key={itemToRender._id}>\n <SpriteFromAtlas\n key={itemToRender._id}\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={getItemTextureKeyPath(\n {\n key: itemToRender.texturePath,\n texturePath: itemToRender.texturePath,\n stackQty: itemToRender.stackQty || 1,\n },\n atlasJSON\n )}\n imgScale={3}\n />\n </ErrorBoundary>\n );\n const stackInfo = getStackInfo(\n itemToRender?._id ?? '',\n itemToRender?.stackQty ?? 0\n );\n if (stackInfo) {\n element.push(stackInfo);\n }\n return element;\n } else {\n return (\n <ErrorBoundary key={uuidv4()}>\n <SpriteFromAtlas\n key={uuidv4()}\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={EquipmentSlotSpriteByType[slotSpriteMask!]}\n imgScale={3}\n grayScale={true}\n opacity={0.4}\n />\n </ErrorBoundary>\n );\n }\n };\n\n const onRenderSlot = (itemToRender: IItem | null) => {\n switch (containerType) {\n case ItemContainerType.Equipment:\n return renderEquipment(itemToRender);\n case ItemContainerType.Inventory:\n return renderItem(itemToRender);\n default:\n return renderItem(itemToRender);\n }\n };\n\n return (\n <Container\n className=\"rpgui-icon empty-slot\"\n onMouseOver={event =>\n onMouseOver(event, slotIndex, item, event.clientX, event.clientY)\n }\n onMouseOut={() => {\n if (onMouseOut) onMouseOut();\n }}\n onMouseEnter={() => setTooltipVisible(true)}\n onMouseLeave={() => setTooltipVisible(false)}\n onClick={() => {\n setTooltipVisible(false);\n\n if (item) {\n if (!isContextMenuDisabled) {\n setIsContextMenuVisible(!isContextMenuVisible);\n }\n\n onClick(item.type, containerType, item);\n }\n }}\n >\n {!isContextMenuDisabled && isContextMenuVisible && contextActions && (\n <RelativeListMenu\n options={contextActions}\n onSelected={(optionId: string) => {\n setIsContextMenuVisible(false);\n if (item) {\n onSelected(optionId, item);\n }\n }}\n onOutsideClick={() => {\n setIsContextMenuVisible(false);\n }}\n />\n )}\n\n {isTooltipVisible && item && <ItemTooltip label={item.name} />}\n\n {onRenderSlot(item)}\n </Container>\n );\n }\n);\n\nconst Container = styled.div`\n margin: 0.1rem;\n .sprite-from-atlas-img {\n position: relative;\n top: 1.5rem;\n left: 1.5rem;\n }\n position: relative;\n`;\n\nconst ItemQtyContainer = styled.div`\n position: relative;\n width: 85%;\n height: 16px;\n top: 25px;\n left: 2px;\n\n display: flex;\n justify-content: flex-end;\n`;\n\nconst ItemQty = styled.span`\n &.regular {\n font-size: ${uiFonts.size.small};\n }\n &.small {\n font-size: ${uiFonts.size.xsmall};\n }\n`;\n","import {\n IEquipmentSet,\n IItem,\n IItemContainer,\n ItemContainerType,\n ItemSlotType,\n ItemType,\n} from '@rpg-engine/shared';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { DraggableContainer } from '../DraggableContainer';\nimport { ItemSlot } from '../Item/Inventory/ItemSlot';\nimport { RPGUIContainerTypes } from '../RPGUIContainer';\n\nexport interface IEquipmentSetProps {\n equipmentSet: IEquipmentSet;\n onClose?: () => void;\n onItemClick?: (\n ItemType: ItemType,\n item: IItem,\n itemContainerType: ItemContainerType | null\n ) => void;\n onMouseOver?: (e: any, slotIndex: number, item: IItem | null) => void;\n onSelected?: (optionId: string) => void;\n initialPosition?: { x: number; y: number };\n type: ItemContainerType | null;\n atlasIMG: any;\n atlasJSON: any;\n}\n\nexport const EquipmentSet: React.FC<IEquipmentSetProps> = ({\n equipmentSet,\n onClose,\n onMouseOver,\n onSelected,\n onItemClick,\n atlasIMG,\n atlasJSON,\n}) => {\n const {\n neck,\n leftHand,\n ring,\n head,\n armor,\n legs,\n boot,\n inventory,\n rightHand,\n accessory,\n } = equipmentSet;\n\n const equipmentData = [\n neck,\n leftHand,\n ring,\n head,\n armor,\n legs,\n boot,\n inventory,\n rightHand,\n accessory,\n ];\n\n const equipmentMaskSlots = [\n ItemSlotType.Neck,\n ItemSlotType.LeftHand,\n ItemSlotType.Ring,\n ItemSlotType.Head,\n ItemSlotType.Torso,\n ItemSlotType.Legs,\n ItemSlotType.Feet,\n ItemSlotType.Inventory,\n ItemSlotType.RightHand,\n ItemSlotType.Accessory,\n ];\n\n const onRenderEquipmentSlotRange = (start: number, end: number) => {\n const equipmentRange = equipmentData.slice(start, end);\n const slotMaksRange = equipmentMaskSlots.slice(start, end);\n\n return equipmentRange.map((data, i) => {\n const item = data as IItem;\n const itemContainer =\n (item && (item.itemContainer as IItemContainer)) ?? null;\n\n return (\n <ItemSlot\n key={i}\n slotIndex={i}\n item={item}\n itemContainer={itemContainer}\n itemContainerType={ItemContainerType.Equipment}\n slotSpriteMask={slotMaksRange[i]}\n onMouseOver={(event, slotIndex, item) => {\n if (onMouseOver) onMouseOver(event, slotIndex, item);\n }}\n onClick={(itemType, ContainerType) => {\n if (onItemClick) onItemClick(itemType, item, ContainerType);\n }}\n onSelected={(optionId: string) => {\n if (onSelected) onSelected(optionId);\n }}\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n />\n );\n });\n };\n\n return (\n <DraggableContainer\n title={'Equipments'}\n type={RPGUIContainerTypes.Framed}\n onCloseButton={() => {\n if (onClose) onClose();\n }}\n width=\"330px\"\n cancelDrag=\".equipment-container-body\"\n >\n <EquipmentSetContainer className=\"equipment-container-body\">\n <EquipmentColumn>{onRenderEquipmentSlotRange(0, 3)}</EquipmentColumn>\n <EquipmentColumn>{onRenderEquipmentSlotRange(3, 7)}</EquipmentColumn>\n <EquipmentColumn>{onRenderEquipmentSlotRange(7, 10)}</EquipmentColumn>\n </EquipmentSetContainer>\n </DraggableContainer>\n );\n};\n\nconst EquipmentSetContainer = styled.div`\n width: inherit;\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n flex-direction: row;\n`;\n\nconst EquipmentColumn = styled.div`\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n flex-direction: column;\n`;\n","import isMobile from 'is-mobile';\n\nexport const IS_MOBILE_OR_TABLET = isMobile({\n tablet: true,\n});\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n text: string;\n onFinish?: () => void;\n onStart?: () => void;\n}\n\nexport const DynamicText: React.FC<IProps> = ({ text, onFinish, onStart }) => {\n const [textState, setTextState] = useState<string>('');\n\n useEffect(() => {\n let i = 0;\n const interval = setInterval(() => {\n // on every interval, show one more character\n\n if (i === 0) {\n if (onStart) {\n onStart();\n }\n }\n\n if (i < text.length) {\n setTextState(text.substring(0, i + 1));\n i++;\n } else {\n clearInterval(interval);\n if (onFinish) {\n onFinish();\n }\n }\n }, 50);\n\n return () => {\n clearInterval(interval);\n };\n }, [text]);\n\n return <TextContainer>{textState}</TextContainer>;\n};\n\nconst TextContainer = styled.p`\n font-size: 0.7rem !important;\n color: white;\n text-shadow: 1px 1px 0px #000000;\n letter-spacing: 1.2px;\n word-break: normal;\n`;\n","import React, { useEffect, useRef, useState } from 'react';\nimport styled from 'styled-components';\nimport { NPCDialogType } from '../..';\nimport { IS_MOBILE_OR_TABLET } from '../../constants/uiDevices';\nimport { chunkString } from '../../libs/StringHelpers';\nimport { DynamicText } from '../typography/DynamicText';\nimport pressButtonGif from './img/press-button.gif';\nimport pressSpaceGif from './img/space.gif';\n\ninterface IProps {\n text: string;\n onClose: () => void;\n onEndStep?: () => void;\n onStartStep?: () => void;\n type?: NPCDialogType;\n}\n\nexport const NPCDialogText: React.FC<IProps> = ({\n text,\n onClose,\n onEndStep,\n onStartStep,\n type,\n}) => {\n const windowSize = useRef([window.innerWidth, window.innerHeight]);\n function maxCharacters(width: number) {\n // Set the font size to 16 pixels\n var fontSize = 11.2;\n\n // Calculate the number of characters that can fit in one line\n var charactersPerLine = Math.floor(width / 2 / fontSize);\n\n // Calculate the number of lines that can fit in the div\n var linesPerDiv = Math.floor(180 / fontSize);\n\n // Calculate the maximum number of characters that can fit in the div\n var maxCharacters = charactersPerLine * linesPerDiv;\n\n // Return the maximum number of characters\n return Math.round(maxCharacters / 5);\n }\n\n const textChunks = chunkString(text, maxCharacters(windowSize.current[0]));\n\n const [chunkIndex, setChunkIndex] = useState<number>(0);\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n goToNextStep();\n }\n };\n\n const goToNextStep = () => {\n const hasNextChunk = textChunks?.[chunkIndex + 1] || false;\n\n if (hasNextChunk) {\n setChunkIndex(prev => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [chunkIndex]);\n\n const [showGoNextIndicator, setShowGoNextIndicator] = useState<boolean>(\n false\n );\n\n return (\n <Container>\n <DynamicText\n text={textChunks?.[chunkIndex] || ''}\n onFinish={() => {\n setShowGoNextIndicator(true);\n\n onEndStep && onEndStep();\n }}\n onStart={() => {\n setShowGoNextIndicator(false);\n\n onStartStep && onStartStep();\n }}\n />\n {showGoNextIndicator && (\n <PressSpaceIndicator\n right={type === NPCDialogType.TextOnly ? '1rem' : '10.5rem'}\n src={IS_MOBILE_OR_TABLET ? pressButtonGif : pressSpaceGif}\n onClick={() => {\n goToNextStep();\n }}\n />\n )}\n </Container>\n );\n};\n\nconst Container = styled.div``;\n\ninterface IPressSpaceIndicatorProps {\n right: string;\n}\n\nconst PressSpaceIndicator = styled.img<IPressSpaceIndicatorProps>`\n position: absolute;\n right: ${({ right }) => right};\n bottom: 1rem;\n height: 20.7px;\n image-rendering: -webkit-optimize-contrast;\n`;\n","export const chunkString = (str: string, length: number) => {\n return str.match(new RegExp('.{1,' + length + '}', 'g'));\n};\n","import React from 'react';\n\n//@ts-ignore\nexport const useEventListener = (type, handler, el = window) => {\n const savedHandler = React.useRef();\n\n React.useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n React.useEffect(() => {\n //@ts-ignore\n const listener = e => savedHandler.current(e);\n\n el.addEventListener(type, listener);\n\n return () => {\n el.removeEventListener(type, listener);\n };\n }, [type, el]);\n};\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { useEventListener } from '../../../hooks/useEventListener';\nimport { DynamicText } from '../../typography/DynamicText';\n\nexport interface IQuestionDialogAnswer {\n id: number;\n text: string;\n nextQuestionId?: number;\n}\n\nexport interface IQuestionDialog {\n id: number;\n text: string;\n answerIds?: number[];\n}\n\nexport interface IProps {\n questions: IQuestionDialog[];\n answers: IQuestionDialogAnswer[];\n onClose: () => void;\n}\n\nexport const QuestionDialog: React.FC<IProps> = ({\n questions,\n answers,\n onClose,\n}) => {\n const [currentQuestion, setCurrentQuestion] = useState(questions[0]);\n\n const [canShowAnswers, setCanShowAnswers] = useState<boolean>(false);\n\n const onGetFirstAnswer = () => {\n if (!currentQuestion.answerIds || currentQuestion.answerIds.length === 0) {\n return null;\n }\n\n const firstAnswerId = currentQuestion.answerIds![0];\n\n return answers.find(answer => answer.id === firstAnswerId);\n };\n\n const [\n currentAnswer,\n setCurrentAnswer,\n ] = useState<IQuestionDialogAnswer | null>(onGetFirstAnswer()!);\n\n useEffect(() => {\n setCurrentAnswer(onGetFirstAnswer()!);\n }, [currentQuestion]);\n\n const onGetAnswers = (answerIds: number[]) => {\n return answerIds.map((answerId: number) =>\n answers.find(answer => answer.id === answerId)\n );\n };\n\n const onKeyPress = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n // select next answer, if any.\n // if no next answer, select first answer\n // const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n // (answer) => answer?.id === currentAnswer!.id + 1\n // );\n\n const nextAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex(answer => answer?.id === currentAnswer!.id + 1);\n\n const nextAnswerID = currentQuestion.answerIds![nextAnswerIndex];\n\n const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n answer => answer?.id === nextAnswerID\n );\n\n setCurrentAnswer(nextAnswer || onGetFirstAnswer()!);\n\n break;\n case 'ArrowUp':\n // select previous answer, if any.\n // if no previous answer, select last answer\n\n const previousAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex(answer => answer?.id === currentAnswer!.id - 1);\n\n const previousAnswerID =\n currentQuestion.answerIds &&\n currentQuestion.answerIds[previousAnswerIndex];\n\n const previousAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n answer => answer?.id === previousAnswerID\n );\n\n if (previousAnswer) {\n setCurrentAnswer(previousAnswer);\n } else {\n setCurrentAnswer(onGetAnswers(currentQuestion.answerIds!).pop()!);\n }\n\n break;\n case 'Enter':\n setCanShowAnswers(false);\n\n if (!currentAnswer?.nextQuestionId) {\n onClose();\n return;\n } else {\n setCurrentQuestion(\n questions.find(\n question => question.id === currentAnswer!.nextQuestionId\n )!\n );\n }\n\n break;\n }\n };\n useEventListener('keydown', onKeyPress);\n\n const onAnswerClick = (answer: IQuestionDialogAnswer) => {\n setCanShowAnswers(false);\n if (answer.nextQuestionId) {\n // if there is a next question, go to it\n setCurrentQuestion(\n questions.find(question => question.id === answer.nextQuestionId)!\n );\n } else {\n // else, finish dialog!\n onClose();\n }\n };\n\n const onRenderCurrentAnswers = () => {\n const answerIds = currentQuestion.answerIds;\n if (!answerIds) {\n return null;\n }\n\n const answers = onGetAnswers(answerIds);\n\n if (!answers) {\n return null;\n }\n\n return answers.map(answer => {\n const isSelected = currentAnswer?.id === answer?.id;\n const selectedColor = isSelected ? 'yellow' : 'white';\n\n if (answer) {\n return (\n <AnswerRow key={`answer_${answer.id}`}>\n <AnswerSelectedIcon color={selectedColor}>\n {isSelected ? 'X' : null}\n </AnswerSelectedIcon>\n\n <Answer\n key={answer.id}\n onClick={() => onAnswerClick(answer)}\n color={selectedColor}\n >\n {answer.text}\n </Answer>\n </AnswerRow>\n );\n }\n\n return null;\n });\n };\n\n return (\n <Container>\n <QuestionContainer>\n <DynamicText\n text={currentQuestion.text}\n onStart={() => setCanShowAnswers(false)}\n onFinish={() => setCanShowAnswers(true)}\n />\n </QuestionContainer>\n\n {canShowAnswers && (\n <AnswersContainer>{onRenderCurrentAnswers()}</AnswersContainer>\n )}\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n word-break: break-all;\n box-sizing: border-box;\n justify-content: flex-start;\n align-items: flex-start;\n flex-wrap: wrap;\n`;\n\nconst QuestionContainer = styled.div`\n flex: 100%;\n width: 100%;\n`;\n\nconst AnswersContainer = styled.div`\n flex: 100%;\n`;\n\ninterface IAnswerProps {\n color: string;\n}\n\nconst Answer = styled.p<IAnswerProps>`\n flex: auto;\n color: ${props => props.color} !important;\n font-size: 0.65rem !important;\n background: inherit;\n border: none;\n`;\n\nconst AnswerSelectedIcon = styled.span<IAnswerProps>`\n flex: 5% 0 0;\n color: ${props => props.color} !important;\n`;\n\nconst AnswerRow = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n margin-bottom: 0.5rem;\n height: 22px;\n p {\n line-height: unset;\n margin-top: 0;\n margin-bottom: 0rem;\n }\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { RPGUIContainer, RPGUIContainerTypes } from '../RPGUIContainer';\nimport aliceDefaultThumbnail from './img/npcDialog/npcThumbnails/alice.png';\nimport pressSpaceGif from './img/space.gif';\nimport { NPCDialogText } from './NPCDialogText';\n\nexport enum ImgSide {\n right = 'right',\n left = 'left',\n}\n\nexport interface NPCMultiDialogType {\n text: string;\n imagePath?: string;\n imageSide: ImgSide;\n}\n\nexport interface INPCMultiDialogProps {\n onClose: () => void;\n textAndTypeArray: NPCMultiDialogType[];\n}\n\nexport const NPCMultiDialog: React.FC<INPCMultiDialogProps> = ({\n onClose,\n textAndTypeArray,\n}) => {\n const [showGoNextIndicator, setShowGoNextIndicator] = useState<boolean>(\n false\n );\n const [slide, setSlide] = useState<number>(0);\n\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n if (slide < textAndTypeArray?.length - 1) {\n setSlide(prev => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [slide]);\n\n return (\n <RPGUIContainer\n type={RPGUIContainerTypes.FramedGold}\n width={'50%'}\n height={'180px'}\n >\n <>\n <Container>\n {textAndTypeArray[slide]?.imageSide === 'right' && (\n <>\n <TextContainer flex={'70%'}>\n <NPCDialogText\n onStartStep={() => setShowGoNextIndicator(false)}\n onEndStep={() => setShowGoNextIndicator(true)}\n text={textAndTypeArray[slide].text || 'No text provided.'}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n <ThumbnailContainer>\n <NPCThumbnail\n src={\n textAndTypeArray[slide].imagePath || aliceDefaultThumbnail\n }\n />\n </ThumbnailContainer>\n {showGoNextIndicator && (\n <PressSpaceIndicator right={'10.5rem'} src={pressSpaceGif} />\n )}\n </>\n )}\n {textAndTypeArray[slide].imageSide === 'left' && (\n <>\n <ThumbnailContainer>\n <NPCThumbnail\n src={\n textAndTypeArray[slide].imagePath || aliceDefaultThumbnail\n }\n />\n </ThumbnailContainer>\n <TextContainer flex={'70%'}>\n <NPCDialogText\n onStartStep={() => setShowGoNextIndicator(false)}\n onEndStep={() => setShowGoNextIndicator(true)}\n text={textAndTypeArray[slide].text || 'No text provided.'}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {showGoNextIndicator && (\n <PressSpaceIndicator right={'1rem'} src={pressSpaceGif} />\n )}\n </>\n )}\n </Container>\n )\n </>\n </RPGUIContainer>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n position: relative;\n`;\n\ninterface ITextContainerProps {\n flex: string;\n}\n\nconst TextContainer = styled.div<ITextContainerProps>`\n flex: ${({ flex }) => flex} 0 0;\n width: 355px;\n`;\n\nconst ThumbnailContainer = styled.div`\n flex: 30% 0 0;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst NPCThumbnail = styled.img`\n image-rendering: pixelated;\n height: 128px;\n width: 128px;\n`;\n\ninterface IPressSpaceIndicatorProps {\n right: string;\n}\n\nconst PressSpaceIndicator = styled.img<IPressSpaceIndicatorProps>`\n position: absolute;\n right: ${({ right }) => right};\n bottom: 1rem;\n height: 20.7px;\n image-rendering: -webkit-optimize-contrast;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { v4 as uuidv4 } from 'uuid';\nimport { _RPGUI } from './RPGUIRoot';\n\nexport enum RangeSliderType {\n Slider = 'rpgui-slider',\n GoldSlider = 'rpgui-slider golden',\n}\n\nexport interface IRangeSliderProps {\n type: RangeSliderType;\n valueMin: number;\n valueMax: number;\n width: string;\n onChange: (value: number) => void;\n}\n\nexport const RangeSlider: React.FC<IRangeSliderProps> = ({\n type,\n valueMin,\n valueMax,\n width,\n onChange,\n}) => {\n const sliderId = uuidv4();\n\n const onHandleMouseUp = () => {\n const rpguiSlider = document.getElementById(`rpgui-slider-${sliderId}`);\n const value = _RPGUI.get_value(rpguiSlider);\n\n onChange(Number(value));\n };\n\n return (\n <div onMouseUp={onHandleMouseUp}>\n <Input\n className={\n type === RangeSliderType.Slider\n ? RangeSliderType.Slider\n : RangeSliderType.GoldSlider\n }\n type=\"range\"\n style={{ width: width }}\n min={valueMin}\n max={valueMax}\n id={`rpgui-slider-${sliderId}`}\n />\n </div>\n );\n};\n\nconst Input = styled.input`\n opacity: 0;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { NPCDialog, NPCDialogType } from './NPCDialog/NPCDialog';\nimport { NPCMultiDialog, NPCMultiDialogType } from './NPCDialog/NPCMultiDialog';\nimport {\n IQuestionDialog,\n IQuestionDialogAnswer,\n QuestionDialog,\n} from './NPCDialog/QuestionDialog/QuestionDialog';\n\nexport interface IHistoryDialogProps {\n backgroundImgPath: string[];\n fullCoverBackground: boolean;\n questions?: IQuestionDialog[];\n answers?: IQuestionDialogAnswer[];\n text?: string;\n imagePath?: string;\n textAndTypeArray?: NPCMultiDialogType[];\n onClose: () => void;\n}\n\nexport const HistoryDialog: React.FC<IHistoryDialogProps> = ({\n backgroundImgPath,\n fullCoverBackground,\n questions,\n answers,\n text,\n imagePath,\n textAndTypeArray,\n onClose,\n}) => {\n const [img, setImage] = useState<number>(0);\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n if (img < backgroundImgPath?.length - 1) {\n setImage(prev => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [backgroundImgPath]);\n return (\n <BackgroundContainer\n imgPath={backgroundImgPath[img]}\n fullImg={fullCoverBackground}\n >\n <DialogContainer>\n {textAndTypeArray ? (\n <NPCMultiDialog\n textAndTypeArray={textAndTypeArray}\n onClose={onClose}\n />\n ) : questions && answers ? (\n <QuestionDialog\n questions={questions}\n answers={answers}\n onClose={onClose}\n />\n ) : text && imagePath ? (\n <NPCDialog\n text={text}\n imagePath={imagePath}\n onClose={onClose}\n type={NPCDialogType.TextAndThumbnail}\n />\n ) : (\n <NPCDialog\n text={text}\n onClose={onClose}\n type={NPCDialogType.TextOnly}\n />\n )}\n </DialogContainer>\n </BackgroundContainer>\n );\n};\n\ninterface IImgContainerProps {\n imgPath: string;\n fullImg: boolean;\n}\n\nconst BackgroundContainer = styled.div<IImgContainerProps>`\n width: 100%;\n height: 100%;\n background-image: url(${props => props.imgPath});\n background-size: ${props => (props.imgPath ? 'cover' : 'auto')};\n display: flex;\n justify-content: space-evenly;\n align-items: center;\n`;\n\nconst DialogContainer = styled.div`\n display: flex;\n justify-content: center;\n padding-top: 200px;\n`;\n","import React from 'react';\nimport { IPosition } from '../../types/eventTypes';\nimport { DraggableContainer } from '../DraggableContainer';\nimport { RPGUIContainerTypes } from '../RPGUIContainer';\n\ninterface IProps {\n children: React.ReactNode;\n title: string;\n onClose?: () => void;\n onPositionChange?: (position: IPosition) => void;\n onOutsideClick?: () => void;\n}\n\nexport const SlotsContainer: React.FC<IProps> = ({\n children,\n title,\n onClose,\n onPositionChange,\n onOutsideClick,\n}) => {\n return (\n <DraggableContainer\n title={title}\n type={RPGUIContainerTypes.Framed}\n onCloseButton={() => {\n if (onClose) {\n onClose();\n }\n }}\n width=\"330px\"\n cancelDrag=\".item-container-body\"\n onPositionChange={({ x, y }) => {\n if (onPositionChange) {\n onPositionChange({ x, y });\n }\n }}\n onOutsideClick={onOutsideClick}\n >\n {children}\n </DraggableContainer>\n );\n};\n","import { IItem, IItemContainer, ItemContainerType } from '@rpg-engine/shared';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { SlotsContainer } from '../../Abstractions/SlotsContainer';\n\nimport { ItemSlot } from './ItemSlot';\n\nexport interface IItemContainerProps {\n itemContainer: IItemContainer;\n onClose?: () => void;\n onItemClick?: (\n item: IItem,\n ItemType: IItem['type'],\n itemContainerType: ItemContainerType | null\n ) => void;\n onMouseOver?: (e: any, slotIndex: number, item: IItem | null) => void;\n onSelected?: (optionId: string, item: IItem) => void;\n type: ItemContainerType;\n atlasJSON: any;\n atlasIMG: any;\n disableContextMenu?: boolean;\n}\n\nexport const ItemContainer: React.FC<IItemContainerProps> = ({\n itemContainer,\n onClose,\n onMouseOver,\n onSelected,\n onItemClick,\n type,\n atlasJSON,\n atlasIMG,\n disableContextMenu = false,\n}) => {\n const onRenderSlots = () => {\n const slots = [];\n\n for (let i = 0; i < itemContainer.slotQty; i++) {\n slots.push(\n <ItemSlot\n isContextMenuDisabled={disableContextMenu}\n key={i}\n slotIndex={i}\n item={itemContainer.slots?.[i] || null}\n itemContainerType={type}\n onMouseOver={(event, slotIndex, item) => {\n if (onMouseOver) onMouseOver(event, slotIndex, item);\n }}\n onClick={(ItemType, ContainerType, item) => {\n if (onItemClick) onItemClick(item, ItemType, ContainerType);\n }}\n onSelected={(optionId: string, item: IItem) => {\n if (onSelected) onSelected(optionId, item);\n }}\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n />\n );\n }\n return slots;\n };\n\n return (\n <SlotsContainer title={itemContainer.name || 'Container'} onClose={onClose}>\n <ItemsContainer className=\"item-container-body\">\n {onRenderSlots()}\n </ItemsContainer>\n </SlotsContainer>\n );\n};\n\nconst ItemsContainer = styled.div`\n max-width: 280px;\n display: flex;\n justify-content: center;\n flex-wrap: wrap;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { uiFonts } from '../constants/uiFonts';\n\ninterface IListMenuOption {\n id: string;\n text: string;\n}\n\nexport interface IListMenuProps {\n x: number;\n y: number;\n options: IListMenuOption[];\n onSelected: (selectedOptionId: string) => void;\n}\n\nexport const ListMenu: React.FC<IListMenuProps> = ({\n options,\n onSelected,\n x,\n y,\n}) => {\n return (\n <Container x={x} y={y}>\n <ul className=\"rpgui-list-imp\" style={{ overflow: 'hidden' }}>\n {options.map((params, index) => (\n <ListElement\n key={params?.id || index}\n onClick={() => {\n onSelected(params?.id);\n }}\n >\n {params?.text || 'No text'}\n </ListElement>\n ))}\n </ul>\n </Container>\n );\n};\n\ninterface IContainerProps {\n x?: number;\n y?: number;\n}\n\nconst Container = styled.div<IContainerProps>`\n display: flex;\n flex-direction: column;\n width: 100%;\n justify-content: start;\n align-items: flex-start;\n position: absolute;\n top: ${props => props.y || 0}px;\n left: ${props => props.x || 0}px;\n\n li {\n font-size: ${uiFonts.size.xsmall};\n }\n`;\n\nconst ListElement = styled.li`\n margin-right: 0.5rem;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\nimport { uiFonts } from '../constants/uiFonts';\n\nexport interface IBarProps {\n max: number;\n value: number;\n color: 'red' | 'blue' | 'green';\n style?: Record<string, any>;\n displayText?: boolean;\n percentageWidth?: number;\n minWidth?: number;\n}\n\nexport const ProgressBar: React.FC<IBarProps> = ({\n max,\n value,\n color,\n displayText = true,\n percentageWidth = 40,\n minWidth = 100,\n style,\n}) => {\n const calculatePercentageValue = function(max: number, value: number) {\n if (value > max) {\n value = max;\n }\n return (value * 100) / max;\n };\n\n return (\n <Container\n className=\"rpgui-progress\"\n data-value={calculatePercentageValue(max, value) / 100}\n data-rpguitype=\"progress\"\n percentageWidth={percentageWidth}\n minWidth={minWidth}\n style={style}\n >\n {displayText && (\n <TextOverlay>\n <ProgressBarText>\n {value}/{max}\n </ProgressBarText>\n </TextOverlay>\n )}\n <div className=\" rpgui-progress-track\">\n <div\n className={`rpgui-progress-fill ${color} `}\n style={{\n left: '0px',\n width: calculatePercentageValue(max, value) + '%',\n }}\n ></div>\n </div>\n <div className=\" rpgui-progress-left-edge\"></div>\n <div className=\" rpgui-progress-right-edge\"></div>\n </Container>\n );\n};\n\nconst ProgressBarText = styled.span`\n font-size: ${uiFonts.size.small} !important;\n color: white;\n text-align: center;\n z-index: 1;\n position: absolute;\n left: 50%;\n transform: translateX(-50%);\n top: 12px;\n`;\n\nconst TextOverlay = styled.div`\n width: 100%;\n position: relative;\n`;\n\ninterface IContainerProps {\n percentageWidth?: number;\n minWidth?: number;\n style?: Record<string, any>;\n}\n\nconst Container = styled.div<IContainerProps>`\n display: flex;\n flex-direction: column;\n min-width: ${props => props.minWidth}px;\n width: ${props => props.percentageWidth}%;\n justify-content: start;\n align-items: flex-start;\n ${props => props.style}\n`;\n","import { IQuest } from '@rpg-engine/shared';\nimport React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { uiColors } from '../../constants/uiColors';\nimport { uiFonts } from '../../constants/uiFonts';\nimport SelectArrow from '../Arrow/SelectArrow';\nimport { Button, ButtonTypes } from '../Button';\nimport { DraggableContainer } from '../DraggableContainer';\n\nimport { RPGUIContainerTypes } from '../RPGUIContainer';\nimport { Column } from '../shared/Column';\nimport thumbnailDefault from './img/default.png';\n\nexport interface IQuestsButtonProps {\n disabled: boolean;\n title: string;\n onClick: (questId: string, npcId: string) => void;\n}\n\nexport interface IQuestInfoProps {\n onClose?: () => void;\n buttons?: IQuestsButtonProps[];\n quests: IQuest[];\n onChangeQuest: (currentQuestIndex: number, currentQuestId: string) => void;\n}\n\nexport const QuestInfo: React.FC<IQuestInfoProps> = ({\n quests,\n onClose,\n buttons,\n onChangeQuest,\n}) => {\n const [currentIndex, setCurrentIndex] = useState(0);\n const questsLength = quests.length - 1;\n\n useEffect(() => {\n if (onChangeQuest) {\n onChangeQuest(currentIndex, quests[currentIndex]._id);\n }\n }, [currentIndex]);\n\n const onLeftClick = () => {\n if (currentIndex === 0) setCurrentIndex(questsLength);\n else setCurrentIndex(index => index - 1);\n };\n const onRightClick = () => {\n if (currentIndex === questsLength) setCurrentIndex(0);\n else setCurrentIndex(index => index + 1);\n };\n\n return (\n <QuestDraggableContainer\n type={RPGUIContainerTypes.Framed}\n onCloseButton={() => {\n if (onClose) onClose();\n }}\n width=\"730px\"\n cancelDrag=\".equipment-container-body .arrow-selector\"\n >\n {quests.length >= 2 ? (\n <QuestsContainer>\n {currentIndex !== 0 && (\n <SelectArrow\n direction=\"left\"\n onClick={onLeftClick}\n onTouchStart={onLeftClick}\n ></SelectArrow>\n )}\n {currentIndex !== quests.length - 1 && (\n <SelectArrow\n direction=\"right\"\n onClick={onRightClick}\n onTouchStart={onRightClick}\n ></SelectArrow>\n )}\n\n <QuestContainer>\n <TitleContainer className=\"drag-handler\">\n <Title>\n <Thumbnail\n src={quests[currentIndex].thumbnail || thumbnailDefault}\n />\n {quests[currentIndex].title}\n </Title>\n <QuestSplitDiv>\n <hr className=\"golden\" />\n </QuestSplitDiv>\n </TitleContainer>\n <Content>\n <p>{quests[currentIndex].description}</p>\n </Content>\n <QuestColumn className=\"dark-background\" justifyContent=\"flex-end\">\n {buttons &&\n buttons.map((button, index) => (\n <Button\n key={index}\n onClick={() =>\n button.onClick(\n quests[currentIndex]._id,\n quests[currentIndex].npcId\n )\n }\n disabled={button.disabled}\n buttonType={ButtonTypes.RPGUIButton}\n id={`button-${index}`}\n >\n {button.title}\n </Button>\n ))}\n </QuestColumn>\n </QuestContainer>\n </QuestsContainer>\n ) : (\n <QuestsContainer>\n <QuestContainer>\n <TitleContainer className=\"drag-handler\">\n <Title>\n <Thumbnail src={quests[0].thumbnail || thumbnailDefault} />\n {quests[0].title}\n </Title>\n <QuestSplitDiv>\n <hr className=\"golden\" />\n </QuestSplitDiv>\n </TitleContainer>\n <Content>\n <p>{quests[0].description}</p>\n </Content>\n <QuestColumn className=\"dark-background\" justifyContent=\"flex-end\">\n {buttons &&\n buttons.map((button, index) => (\n <Button\n key={index}\n onClick={() =>\n button.onClick(quests[0]._id, quests[0].npcId)\n }\n disabled={button.disabled}\n buttonType={ButtonTypes.RPGUIButton}\n id={`button-${index}`}\n >\n {button.title}\n </Button>\n ))}\n </QuestColumn>\n </QuestContainer>\n </QuestsContainer>\n )}\n </QuestDraggableContainer>\n );\n};\n\nconst QuestDraggableContainer = styled(DraggableContainer)`\n border: 1px solid black;\n width: 600px;\n padding: 0 0 0 0 !important;\n .DraggableContainer__TitleContainer-sc-184mpyl-2 {\n height: auto;\n }\n .container-close {\n position: absolute;\n margin-left: auto;\n top: 20px;\n padding-right: 5px;\n }\n img {\n display: inline-block;\n vertical-align: middle;\n line-height: normal;\n }\n`;\n\nconst QuestContainer = styled.div`\n margin-right: 40px;\n margin-left: 40px;\n`;\n\nconst QuestsContainer = styled.div`\n display: flex;\n align-items: center;\n`;\n\nconst Content = styled.div`\n padding: 18px;\n h1 {\n text-align: left;\n margin: 14px 0px;\n }\n`;\n\nconst QuestSplitDiv = styled.div`\n width: 100%;\n font-size: 11px;\n margin-bottom: 10px;\n hr {\n margin: 0px;\n padding: 0px;\n }\n p {\n margin-bottom: 0px;\n }\n`;\n\nconst QuestColumn = styled(Column)`\n padding-top: 5px;\n margin-bottom: 20px;\n display: flex;\n justify-content: space-evenly;\n`;\n\nconst TitleContainer = styled.div`\n width: 100%;\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 1rem;\n`;\n\nconst Title = styled.h1`\n color: white;\n z-index: 22;\n font-size: ${uiFonts.size.medium} !important;\n color: ${uiColors.yellow} !important;\n`;\n\nconst Thumbnail = styled.img`\n color: white;\n z-index: 22;\n width: 32px * 1.5;\n margin-right: 0.5rem;\n position: relative;\n top: -4px;\n`;\n","import { IQuest } from '@rpg-engine/shared';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { uiFonts } from '../constants/uiFonts';\nimport { DraggableContainer } from './DraggableContainer';\nimport { RPGUIContainerTypes } from './RPGUIContainer';\n\nexport interface IQuestListProps {\n quests?: IQuest[];\n onClose: () => void;\n}\n\nexport const QuestList: React.FC<IQuestListProps> = ({ quests, onClose }) => {\n return (\n <QuestDraggableContainer\n type={RPGUIContainerTypes.Framed}\n onCloseButton={() => {\n if (onClose) onClose();\n }}\n width=\"520px\"\n >\n <div style={{ width: '100%' }}>\n <Title>Quests</Title>\n <hr className=\"golden\" />\n\n <QuestListContainer>\n {quests ? (\n quests.map((quest, i) => (\n <div className=\"quest-item\" key={i}>\n <span className=\"quest-number\">{i + 1}</span>\n <div className=\"quest-detail\">\n <p className=\"quest-detail__title\">{quest.title}</p>\n <p className=\"quest-detail__description\">\n {quest.description}\n </p>\n </div>\n </div>\n ))\n ) : (\n <NoQuestContainer>\n <p>There are no ongoing quests</p>\n </NoQuestContainer>\n )}\n </QuestListContainer>\n </div>\n </QuestDraggableContainer>\n );\n};\n\nconst QuestDraggableContainer = styled(DraggableContainer)`\n .container-close {\n top: 10px;\n right: 10px;\n }\n\n .quest-title {\n text-align: left;\n margin-left: 44px;\n margin-top: 20px;\n color: yellow;\n }\n\n .quest-desc {\n margin-top: 12px;\n margin-left: 44px;\n }\n\n .rpgui-progress {\n min-width: 80%;\n margin: 0 auto;\n }\n`;\n\nconst Title = styled.h1`\n z-index: 22;\n font-size: ${uiFonts.size.medium} !important;\n color: yellow !important;\n`;\n\nconst QuestListContainer = styled.div`\n margin-top: 20px;\n margin-bottom: 40px;\n overflow-y: auto;\n max-height: 400px;\n\n .quest-item {\n display: flex;\n align-items: flex-start;\n margin-bottom: 12px;\n }\n\n .quest-number {\n border-radius: 50%;\n width: 28px;\n height: 28px;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 16px;\n background-color: brown;\n flex-shrink: 0;\n }\n\n .quest-number.completed {\n background-color: yellow;\n }\n\n p {\n margin: 0;\n }\n\n .quest-detail__title {\n color: yellow;\n }\n\n .quest-detail__description {\n margin-top: 5px;\n }\n .Noquest-detail__description {\n margin-top: 5px;\n margin: auto;\n }\n`;\nconst NoQuestContainer = styled.div`\n text-align: center;\n p {\n margin-top: 5px;\n }\n`;\n","import React from 'react';\nimport 'rpgui/rpgui.min.css';\nimport 'rpgui/rpgui.min.js';\n\ninterface IProps {\n children: React.ReactNode;\n}\n\n//@ts-ignore\nexport const _RPGUI = RPGUI;\n\nexport const RPGUIRoot: React.FC<IProps> = ({ children }) => {\n return <div className=\"rpgui-content\">{children}</div>;\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\nexport interface ISimpleProgressBarProps {\n value: number;\n bgColor?: string;\n margin?: number;\n}\n\nexport const SimpleProgressBar: React.FC<ISimpleProgressBarProps> = ({\n value,\n bgColor = 'red',\n margin = 20,\n}) => {\n return (\n <Container className=\"simple-progress-bar\">\n <ProgressBarContainer margin={margin}>\n <BackgroundBar>\n <Progress value={value} bgColor={bgColor} />\n </BackgroundBar>\n </ProgressBarContainer>\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n width: 100%;\n`;\n\nconst BackgroundBar = styled.span`\n background-color: rgba(0, 0, 0, 0.075);\n`;\n\ninterface ISimpleProgressBarThemeProps {\n value: number;\n bgColor: string;\n}\n\nconst Progress = styled.span`\n background-color: ${(props: ISimpleProgressBarThemeProps) => props.bgColor};\n width: ${(props: ISimpleProgressBarThemeProps) => props.value}%;\n`;\n\ninterface ISimpleProgressBarTheme2Props {\n margin: number;\n}\n\nconst ProgressBarContainer = styled.div`\n border-radius: 60px;\n border: 1px solid #282424;\n overflow: hidden;\n width: 100%;\n span {\n display: block;\n height: 100%;\n }\n height: 8px;\n margin-left: ${(props: ISimpleProgressBarTheme2Props) => props.margin}px;\n`;\n","import { getSPForLevel } from '@rpg-engine/shared';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { ErrorBoundary } from './Item/Inventory/ErrorBoundary';\nimport { SpriteFromAtlas } from './shared/SpriteFromAtlas';\nimport { SimpleProgressBar } from './SimpleProgressBar';\n\nexport interface ISkillProgressBarProps {\n skillName: string;\n bgColor: string;\n level: number;\n skillPoints: number;\n skillPointsToNextLevel?: number;\n texturePath: string;\n showSkillPoints?: boolean;\n atlasJSON: any;\n atlasIMG: any;\n}\n\nexport const SkillProgressBar: React.FC<ISkillProgressBarProps> = ({\n bgColor,\n skillName,\n level,\n skillPoints,\n skillPointsToNextLevel,\n texturePath,\n showSkillPoints = true,\n atlasIMG,\n atlasJSON,\n}) => {\n if (!skillPointsToNextLevel) {\n skillPointsToNextLevel = getSPForLevel(level + 1);\n }\n\n const nextLevelSPWillbe = skillPoints + skillPointsToNextLevel;\n\n const ratio = (skillPoints / nextLevelSPWillbe) * 100;\n\n return (\n <>\n <ProgressTitle>\n <TitleName>{skillName}</TitleName>\n <ValueDisplay>lv {level}</ValueDisplay>\n </ProgressTitle>\n <ProgressBody>\n <ProgressIconContainer>\n {atlasIMG && atlasJSON ? (\n <SpriteContainer>\n <ErrorBoundary>\n <SpriteFromAtlas\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={texturePath}\n imgScale={1}\n grayScale\n opacity={0.5}\n />\n </ErrorBoundary>\n </SpriteContainer>\n ) : (\n <></>\n )}\n </ProgressIconContainer>\n\n <ProgressBarContainer>\n <SimpleProgressBar value={ratio} bgColor={bgColor} />\n </ProgressBarContainer>\n </ProgressBody>\n {showSkillPoints && (\n <SkillDisplayContainer>\n <SkillPointsDisplay>\n {skillPoints}/{nextLevelSPWillbe}\n </SkillPointsDisplay>\n </SkillDisplayContainer>\n )}\n </>\n );\n};\n\nconst ProgressBarContainer = styled.div`\n position: relative;\n top: 8px;\n width: 100%;\n height: auto;\n`;\n\nconst SpriteContainer = styled.div`\n position: relative;\n top: -3px;\n left: 0;\n`;\n\nconst SkillDisplayContainer = styled.div`\n margin: 0 auto;\n\n p {\n margin: 0;\n }\n`;\n\nconst SkillPointsDisplay = styled.p`\n font-size: 0.6rem !important;\n font-weight: bold;\n text-align: center;\n`;\n\nconst TitleName = styled.span`\n margin-left: 5px;\n`;\n\nconst ValueDisplay = styled.span``;\n\nconst ProgressIconContainer = styled.div`\n display: flex;\n justify-content: center;\n align-items: center;\n`;\n\nconst ProgressBody = styled.div`\n display: flex;\n flex-direction: row;\n width: 100%;\n`;\n\nconst ProgressTitle = styled.div`\n width: 100%;\n display: flex;\n flex-direction: row;\n justify-content: space-between;\n span {\n font-size: 0.6rem;\n }\n`;\n","import { ISkill, ISkillDetails } from '@rpg-engine/shared';\nimport _ from 'lodash';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { uiColors } from '../constants/uiColors';\nimport { DraggableContainer } from './DraggableContainer';\nimport { SkillProgressBar } from './SkillProgressBar';\n\nexport interface ISkillContainerProps {\n skill: ISkill;\n onCloseButton: () => void;\n atlasJSON: any;\n atlasIMG: any;\n}\n\nconst skillProps = {\n attributes: {\n color: uiColors.purple,\n values: {\n stamina: 'spell-icons/regenerate.png',\n magic: 'spell-icons/fireball.png',\n magicResistance: 'spell-icons/freeze.png',\n strength: 'spell-icons/enchanted-blow.png',\n resistance: 'spell-icons/magic-shield.png',\n dexterity: 'spell-icons/haste.png',\n },\n },\n combat: {\n color: uiColors.cardinal,\n values: {\n first: 'gloves/leather-gloves.png',\n club: 'maces/club.png',\n sword: 'swords/double-edged-sword.png',\n axe: 'axes/double-axe.png',\n distance: 'ranged-weapons/horse-bow.png',\n shielding: 'shields/studded-shield.png',\n dagger: 'daggers/dagger.png',\n },\n },\n crafting: {\n color: uiColors.blue,\n values: {\n fishing: 'foods/fish.png',\n mining: 'crafting-resources/iron-ingot.png',\n lumberjacking: 'crafting-resources/greater-wooden-log.png',\n cooking: 'foods/chickens-meat.png',\n alchemy: 'potions/greater-mana-potion.png',\n },\n },\n};\n\nexport const SkillsContainer: React.FC<ISkillContainerProps> = ({\n onCloseButton,\n skill,\n atlasIMG,\n atlasJSON,\n}) => {\n const onRenderSkillCategory = (\n category: 'attributes' | 'combat' | 'crafting'\n ) => {\n const skillCategory = skillProps[category];\n\n const skillCategoryColor = skillCategory.color;\n\n const output = [];\n\n for (const [key, value] of Object.entries(skillCategory.values)) {\n //@ts-ignore\n const skillDetails = (skill[key] as unknown) as ISkillDetails;\n \n\n output.push(\n <SkillProgressBar\n key={key}\n skillName={_.capitalize(key)}\n bgColor={skillCategoryColor}\n level={skillDetails.level || 0}\n skillPoints={Math.round(skillDetails.skillPoints) || 0}\n skillPointsToNextLevel={\n Math.round(skillDetails.skillPointsToNextLevel) || 0\n }\n texturePath={value}\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n />\n );\n }\n\n return output;\n };\n\n return (\n <SkillsDraggableContainer title=\"Skills\">\n {onCloseButton && (\n <CloseButton onClick={onCloseButton} onTouchStart={onCloseButton}>\n X\n </CloseButton>\n )}\n <SkillSplitDiv>\n <p>General</p>\n <hr className=\"golden\" />\n\n <SkillProgressBar\n skillName={'Level'}\n bgColor={uiColors.navyBlue}\n level={Math.round(skill.level) || 0}\n skillPoints={Math.round(skill.experience) || 0}\n skillPointsToNextLevel={Math.round(skill.xpToNextLevel) || 0}\n texturePath={'swords/broad-sword.png'}\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n />\n\n <p>Combat Skills</p>\n <hr className=\"golden\" />\n </SkillSplitDiv>\n\n {onRenderSkillCategory('combat')}\n\n <SkillSplitDiv>\n <p>Crafting Skills</p>\n <hr className=\"golden\" />\n </SkillSplitDiv>\n\n {onRenderSkillCategory('crafting')}\n\n <SkillSplitDiv>\n <p>Basic Attributes</p>\n <hr className=\"golden\" />\n </SkillSplitDiv>\n\n {onRenderSkillCategory('attributes')}\n </SkillsDraggableContainer>\n );\n};\n\nconst SkillsDraggableContainer = styled(DraggableContainer)`\n border: 1px solid black;\n width: 400px;\n height: 90%;\n overflow-y: scroll;\n .DraggableContainer__TitleContainer-sc-184mpyl-2 {\n width: auto;\n height: auto;\n }\n`;\n\nconst SkillSplitDiv = styled.div`\n width: 100%;\n font-size: 11px;\n hr {\n margin: 0;\n margin-bottom: 1rem;\n padding: 0px;\n }\n p {\n margin-bottom: 0px;\n }\n`;\n\nconst CloseButton = styled.div`\n position: absolute;\n top: 2px;\n right: 2px;\n color: white;\n z-index: 22;\n font-size: 0.7rem;\n`;\n","import React from 'react';\nimport styled from 'styled-components';\n\nimport { PeriodOfDay } from '@rpg-engine/shared';\nimport AfternoonGif from './gif/afternoon.gif';\nimport MorningGif from './gif/morning.gif';\nimport NightGif from './gif/night.gif';\n\nexport interface IPeriodOfDayDisplayProps {\n periodOfDay: PeriodOfDay;\n}\n\nexport const DayNightPeriod: React.FC<IPeriodOfDayDisplayProps> = ({\n periodOfDay,\n}) => {\n const periodOfDaySrcFiles = {\n [PeriodOfDay.Morning]: MorningGif,\n [PeriodOfDay.Afternoon]: AfternoonGif,\n [PeriodOfDay.Night]: NightGif,\n };\n\n return (\n <GifContainer>\n <img src={periodOfDaySrcFiles[periodOfDay]} />\n </GifContainer>\n );\n};\n\nconst GifContainer = styled.div`\n width: 100%;\n\n img {\n width: 67%;\n }\n`;\n","import { PeriodOfDay } from '@rpg-engine/shared';\nimport React from 'react';\nimport Draggable from 'react-draggable';\nimport styled from 'styled-components';\nimport { uiFonts } from '../../constants/uiFonts';\nimport { DayNightPeriod } from './DayNightPeriod/DayNightPeriod';\n\nimport ClockWidgetImg from './img/clockwidget.png';\n\nexport interface IClockWidgetProps {\n onClose?: () => void;\n TimeClock: string;\n periodOfDay: PeriodOfDay;\n}\n\nexport const TimeWidget: React.FC<IClockWidgetProps> = ({\n onClose,\n TimeClock,\n periodOfDay,\n}) => {\n return (\n <Draggable>\n <WidgetContainer>\n <CloseButton onClick={onClose}>X</CloseButton>\n <DayNightContainer>\n <DayNightPeriod periodOfDay={periodOfDay} />\n </DayNightContainer>\n <Time>{TimeClock}</Time>\n </WidgetContainer>\n </Draggable>\n );\n};\n\nconst WidgetContainer = styled.div`\n background-image: url(${ClockWidgetImg});\n background-size: 10rem;\n background-repeat: no-repeat;\n width: 10rem;\n position: absolute;\n height: 100px;\n`;\n\nconst Time = styled.div`\n top: 0.75rem;\n right: 0.5rem;\n position: absolute;\n font-size: ${uiFonts.size.small};\n color: white;\n`;\n\nconst CloseButton = styled.p`\n position: absolute;\n top: -0.5rem;\n margin: 0;\n right: -0.2rem;\n font-size: ${uiFonts.size.small} !important;\n z-index: 1;\n`;\n\nconst DayNightContainer = styled.div`\n margin-top: -0.3rem;\n margin-left: -0.3rem;\n`;\n","import { ITradeResponseItem, getItemTextureKeyPath } from '@rpg-engine/shared';\nimport capitalize from 'lodash/capitalize';\nimport React from 'react';\nimport styled from 'styled-components';\nimport { uiColors } from '../../constants/uiColors';\nimport { uiFonts } from '../../constants/uiFonts';\nimport SelectArrow from '../Arrow/SelectArrow';\nimport { Ellipsis } from '../shared/Ellipsis';\nimport { SpriteFromAtlas } from '../shared/SpriteFromAtlas';\nexport interface ITradeComponentProps {\n traderItem: ITradeResponseItem;\n onQuantityChange: (\n traderItem: ITradeResponseItem,\n selectedQty: number\n ) => void;\n atlasJSON: any;\n atlasIMG: any;\n selectedQty: number;\n}\n\nexport const TradingItemRow: React.FC<ITradeComponentProps> = ({\n atlasIMG,\n atlasJSON,\n onQuantityChange,\n traderItem,\n selectedQty,\n}) => {\n const onLeftClick = () => {\n if (selectedQty > 0) {\n const newQuantity = selectedQty - 1;\n onQuantityChange(traderItem, newQuantity);\n }\n };\n const onRightClick = () => {\n if (selectedQty < (traderItem.qty ?? 999)) {\n const newQuantity = selectedQty + 1;\n onQuantityChange(traderItem, newQuantity);\n }\n };\n\n return (\n <ItemWrapper>\n <ItemIconContainer>\n <SpriteContainer>\n <SpriteFromAtlas\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={getItemTextureKeyPath(\n {\n key: traderItem.key,\n stackQty: traderItem.qty || 1,\n texturePath: traderItem.texturePath,\n },\n atlasJSON\n )}\n imgScale={2.5}\n />\n </SpriteContainer>\n </ItemIconContainer>\n <ItemNameContainer>\n <NameValue>\n <p>\n <Ellipsis maxLines={1} maxWidth=\"250px\">\n {capitalize(traderItem.name)}\n </Ellipsis>\n </p>\n <p>${traderItem.price}</p>\n </NameValue>\n </ItemNameContainer>\n\n <QuantityContainer>\n <SelectArrow\n size={32}\n className=\"arrow-selector\"\n direction=\"left\"\n onClick={onLeftClick}\n onTouchStart={onLeftClick}\n ></SelectArrow>\n <QuantityDisplay>\n <TextOverlay>\n <Item>{selectedQty}</Item>\n </TextOverlay>\n </QuantityDisplay>\n <SelectArrow\n size={32}\n className=\"arrow-selector\"\n direction=\"right\"\n onClick={onRightClick}\n onTouchStart={onRightClick}\n ></SelectArrow>\n </QuantityContainer>\n </ItemWrapper>\n );\n};\n\nconst ItemWrapper = styled.div`\n width: 100%;\n margin: auto;\n display: flex;\n justify-content: space-between;\n margin-bottom: 1rem;\n\n &:hover {\n background-color: ${uiColors.darkGray};\n }\n padding: 0.5rem;\n`;\n\nconst ItemNameContainer = styled.div`\n flex: 60%;\n`;\n\nconst ItemIconContainer = styled.div`\n display: flex;\n justify-content: flex-start;\n align-items: center;\n\n flex: 0 0 58px;\n`;\n\nconst SpriteContainer = styled.div`\n position: relative;\n top: -0.5rem;\n left: 0.5rem;\n`;\n\nconst NameValue = styled.div`\n p {\n font-size: 0.75rem;\n margin: 0;\n }\n`;\n\nconst Item = styled.span`\n color: white;\n text-align: center;\n z-index: 1;\n\n width: 100%;\n`;\n\nconst TextOverlay = styled.div`\n width: 100%;\n position: relative;\n`;\n\ninterface IContainerProps {\n percentageWidth?: number;\n minWidth?: number;\n style?: Record<string, any>;\n}\n\nconst QuantityContainer = styled.div<IContainerProps>`\n position: relative;\n display: flex;\n\n min-width: 100px;\n width: 40%;\n justify-content: center;\n align-items: center;\n\n flex: 20%;\n`;\n\nconst QuantityDisplay = styled.div`\n font-size: ${uiFonts.size.small};\n`;\n","import { ITradeResponseItem, TradeTransactionType } from '@rpg-engine/shared';\nimport React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { Button, ButtonTypes } from '../Button';\nimport { DraggableContainer } from '../DraggableContainer';\nimport { RPGUIContainerTypes } from '../RPGUIContainer';\nimport { TradingItemRow } from './TradingItemRow';\nexport interface ITrandingMenu {\n traderItems: ITradeResponseItem[];\n onClose: () => void;\n onConfirm: (items: ITradeResponseItem[]) => void;\n type: TradeTransactionType;\n atlasJSON: any;\n atlasIMG: any;\n characterAvailableGold: number;\n}\n\nexport const TradingMenu: React.FC<ITrandingMenu> = ({\n traderItems,\n onClose,\n type,\n atlasJSON,\n atlasIMG,\n characterAvailableGold,\n onConfirm,\n}) => {\n const [sum, setSum] = useState(0);\n const [qtyMap, setQtyMap] = useState(new Map());\n\n const onQuantityChange = (item: ITradeResponseItem, selectedQty: number) => {\n setQtyMap(new Map(qtyMap.set(item.key, selectedQty)));\n\n let newSum = 0;\n traderItems.forEach(item => {\n const qty = qtyMap.get(item.key);\n if (qty) newSum += qty * item.price;\n setSum(newSum);\n });\n };\n\n const isBuy = () => {\n return type == 'buy';\n };\n\n const hasGoldForSale = () => {\n if (isBuy()) {\n return !(sum > characterAvailableGold);\n }\n return true;\n };\n\n const getFinalGold = () => {\n if (isBuy()) {\n return characterAvailableGold - sum;\n } else {\n return characterAvailableGold + sum;\n }\n };\n\n const Capitalize = (word: string) => {\n return word[0].toUpperCase() + word.substring(1);\n };\n\n const onConfirmClick = () => {\n const items: ITradeResponseItem[] = [];\n\n traderItems.forEach(item => {\n const qty = qtyMap.get(item.key);\n if (qty) {\n items.push(Object.assign({}, item, { qty: qty }));\n }\n });\n\n onConfirm(items);\n };\n\n return (\n <DraggableContainer\n type={RPGUIContainerTypes.Framed}\n onCloseButton={() => {\n if (onClose) onClose();\n }}\n width=\"500px\"\n cancelDrag=\".equipment-container-body .arrow-selector\"\n >\n <>\n <div style={{ width: '100%' }}>\n <Title>{Capitalize(type)} Menu</Title>\n <hr className=\"golden\" />\n </div>\n <TradingComponentScrollWrapper>\n {traderItems.map((tradeItem, index) => (\n <ItemWrapper key={`${tradeItem.key}_${index}`}>\n <TradingItemRow\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n onQuantityChange={onQuantityChange}\n traderItem={tradeItem}\n selectedQty={qtyMap.get(tradeItem.key) ?? 0}\n />\n </ItemWrapper>\n ))}\n </TradingComponentScrollWrapper>\n <GoldWrapper>\n <p>Available Gold:</p>\n <p>${characterAvailableGold}</p>\n </GoldWrapper>\n <TotalWrapper>\n <p>Total:</p>\n <p>${sum}</p>\n </TotalWrapper>\n {!hasGoldForSale() ? (\n <AlertWrapper>\n <p> Sorry, not enough money.</p>\n </AlertWrapper>\n ) : (\n <GoldWrapper>\n <p>Final Gold:</p>\n <p>${getFinalGold()}</p>\n </GoldWrapper>\n )}\n\n <ButtonWrapper>\n <Button\n buttonType={ButtonTypes.RPGUIButton}\n disabled={!hasGoldForSale()}\n onClick={() => onConfirmClick()}\n >\n Confirm\n </Button>\n <Button\n buttonType={ButtonTypes.RPGUIButton}\n onClick={() => onClose()}\n >\n Cancel\n </Button>\n </ButtonWrapper>\n </>\n </DraggableContainer>\n );\n};\n\nconst Title = styled.h1`\n z-index: 22;\n font-size: 0.6rem;\n color: yellow !important;\n`;\n\nconst TradingComponentScrollWrapper = styled.div`\n overflow-y: scroll;\n height: 390px;\n width: 100%;\n margin-top: 1rem;\n`;\n\nconst ItemWrapper = styled.div`\n margin: auto;\n display: flex;\n justify-content: space-between;\n`;\n\nconst TotalWrapper = styled.div`\n margin-top: 1rem;\n display: flex;\n justify-content: space-between;\n height: 20px;\n p {\n color: white !important;\n }\n width: 100%;\n margin-left: 0.8rem;\n`;\n\nconst GoldWrapper = styled.div`\n margin-top: 1rem;\n display: flex;\n justify-content: space-between;\n height: 20px;\n p {\n color: yellow !important;\n }\n width: 100%;\n margin-left: 0.8rem;\n`;\n\nconst AlertWrapper = styled.div`\n margin-top: 1rem;\n display: flex;\n width: 100%;\n justify-content: center;\n height: 20px;\n p {\n color: red !important;\n }\n`;\n\nconst ButtonWrapper = styled.div`\n display: flex;\n justify-content: space-around;\n padding-top: 20px;\n width: 100%;\n margin-top: 1rem;\n`;\n","/* eslint-disable react/require-default-props */\nimport React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n maxLines?: number;\n children: React.ReactNode;\n}\n\nexport const Truncate: React.FC<IProps> = ({ maxLines = 1, children }) => {\n return <Container maxLines={maxLines}>{children}</Container>;\n};\n\ninterface IContainerProps {\n maxLines: number;\n}\n\nconst Container = styled.div<IContainerProps>`\n display: -webkit-box;\n max-width: 100%;\n max-height: 100%;\n -webkit-line-clamp: ${props => props.maxLines};\n -webkit-box-orient: vertical;\n overflow: hidden;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { Button, ButtonTypes } from '../Button';\nimport { DraggableContainer } from '../DraggableContainer';\nimport { RPGUIContainerTypes } from '../RPGUIContainer';\nimport { SpriteFromAtlas } from '../shared/SpriteFromAtlas';\n\nexport interface IOptionsItemSelectorProps {\n name: string;\n description?: string;\n imageKey: string;\n}\n\nexport interface IItemSelectorProps {\n atlasJSON: any;\n atlasIMG: any;\n options: IOptionsItemSelectorProps[];\n onClose: () => void;\n onSelect: (value: string) => void;\n}\n\nexport const ItemSelector: React.FC<IItemSelectorProps> = ({\n atlasIMG,\n atlasJSON,\n options,\n onClose,\n onSelect,\n}) => {\n const [selectedValue, setSelectedValue] = useState<string>();\n\n const handleClick = () => {\n let element = document.querySelector(\n `input[name='test']:checked`\n ) as HTMLInputElement;\n const elementValue = element.value;\n setSelectedValue(elementValue);\n };\n\n useEffect(() => {\n if (selectedValue) {\n onSelect(selectedValue);\n }\n }, [selectedValue]);\n return (\n <DraggableContainer\n type={RPGUIContainerTypes.Framed}\n width=\"500px\"\n cancelDrag=\".equipment-container-body .arrow-selector\"\n onCloseButton={() => {\n if (onClose) {\n onClose();\n }\n }}\n >\n <div style={{ width: '100%' }}>\n <Title>{'Harvesting instruments'}</Title>\n <Subtitle>{'Use the tool, you need it'}</Subtitle>\n <hr className=\"golden\" />\n </div>\n\n <RadioInputScroller>\n {options?.map((option, index) => (\n <RadioOptionsWrapper key={index}>\n <SpriteAtlasWrapper>\n <SpriteFromAtlas\n atlasIMG={atlasIMG}\n atlasJSON={atlasJSON}\n spriteKey={option.imageKey}\n imgScale={3}\n />\n </SpriteAtlasWrapper>\n <div>\n <input\n className=\"rpgui-radio\"\n type=\"radio\"\n value={option.name}\n name=\"test\"\n />\n <label\n onClick={handleClick}\n style={{ display: 'flex', alignItems: 'center' }}\n >\n {option.name} <br />\n {option.description}\n </label>\n </div>\n </RadioOptionsWrapper>\n ))}\n </RadioInputScroller>\n <ButtonWrapper>\n <Button buttonType={ButtonTypes.RPGUIButton} onClick={onClose}>\n Cancel\n </Button>\n <Button buttonType={ButtonTypes.RPGUIButton}>Select</Button>\n </ButtonWrapper>\n </DraggableContainer>\n );\n};\n\nconst Title = styled.h1`\n font-size: 0.6rem;\n color: yellow !important;\n`;\nconst Subtitle = styled.h1`\n font-size: 0.4rem;\n color: yellow !important;\n`;\n\nconst RadioInputScroller = styled.div`\n padding-left: 15px;\n padding-top: 10px;\n width: 100%;\n margin-top: 1rem;\n align-items: center;\n margin-left: 20px;\n align-items: flex-start;\n overflow-y: scroll;\n height: 360px;\n`;\n\nconst SpriteAtlasWrapper = styled.div`\n margin-right: 40px;\n`;\n\nconst RadioOptionsWrapper = styled.div`\n display: flex;\n align-items: stretch;\n margin-bottom: 40px;\n`;\n\nconst ButtonWrapper = styled.div`\n display: flex;\n justify-content: space-around;\n padding-top: 20px;\n width: 100%;\n`;\n","import React, { useEffect, useState } from 'react';\n\nexport interface ICheckItems {\n label: string;\n value: string;\n}\n\nexport interface ICheckProps {\n items: ICheckItems[];\n onChange: (selectedValues: IChecklistSelectedValues) => void;\n}\n\nexport interface IChecklistSelectedValues {\n [label: string]: boolean;\n}\n\nexport const CheckButton: React.FC<ICheckProps> = ({ items, onChange }) => {\n const generateSelectedValuesList = () => {\n const selectedValues: IChecklistSelectedValues = {};\n\n items.forEach(item => {\n selectedValues[item.label] = false;\n });\n\n return selectedValues;\n };\n\n const [selectedValues, setSelectedValues] = useState<\n IChecklistSelectedValues\n >(generateSelectedValuesList());\n\n const handleClick = (label: string) => {\n setSelectedValues({\n ...selectedValues,\n [label]: !selectedValues[label],\n });\n };\n\n useEffect(() => {\n if (selectedValues) {\n onChange(selectedValues);\n }\n }, [selectedValues]);\n\n return (\n <div id=\"elemento-checkbox\">\n {items?.map((element, index) => {\n return (\n <div key={`${element.label}_${index}`}>\n <input\n className=\"rpgui-checkbox\"\n type=\"checkbox\"\n checked={selectedValues[element.label]}\n onChange={() => {}}\n />\n <label onClick={() => handleClick(element.label)}>\n {element.label}\n </label>\n <br />\n </div>\n );\n })}\n </div>\n );\n};\n","import React, { useEffect, useState } from 'react';\n\nexport interface IRadioItems {\n label: string;\n value: string;\n}\n\nexport interface IRadioProps {\n name: string;\n items: IRadioItems[];\n onChange: (value: string) => void;\n}\n\nexport const InputRadio: React.FC<IRadioProps> = ({\n name,\n items,\n onChange,\n}) => {\n const [selectedValue, setSelectedValue] = useState<string>();\n const handleClick = () => {\n let element = document.querySelector(\n `input[name=${name}]:checked`\n ) as HTMLInputElement;\n const elementValue = element.value;\n setSelectedValue(elementValue);\n };\n\n useEffect(() => {\n if (selectedValue) {\n onChange(selectedValue);\n }\n }, [selectedValue]);\n\n return (\n <div id=\"elemento-radio\">\n {items.map(element => {\n return (\n <>\n <input\n key={element.value}\n className=\"rpgui-radio\"\n value={element.value}\n name={name}\n type=\"radio\"\n />\n <label onClick={handleClick}>{element.label}</label>\n <br />\n </>\n );\n })}\n </div>\n );\n};\n","import React from 'react';\n\nexport interface ITextArea\n extends React.DetailedHTMLProps<\n React.TextareaHTMLAttributes<HTMLTextAreaElement>,\n HTMLTextAreaElement\n > {}\n\nexport const TextArea: React.FC<ITextArea> = ({ ...props }) => {\n return <textarea {...props} />;\n};\n"],"names":["ButtonTypes","RPGUIContainerTypes","Button","disabled","children","buttonType","onClick","props","React","ButtonContainer","className","onTouchStart","styled","button","displayName","componentId","SpriteFromAtlas","atlasJSON","atlasIMG","spriteKey","_ref$width","width","GRID_WIDTH","_ref$height","height","GRID_HEIGHT","_ref$imgScale","imgScale","imgStyle","containerStyle","_ref$grayScale","grayScale","_ref$opacity","opacity","spriteData","frames","Error","Container","hasHover","style","ImgSprite","frame","scale","div","w","h","x","y","ErrorBoundary","args","_this","state","hasError","getDerivedStateFromError","_","_proto","componentDidCatch","error","errorInfo","console","render","this","Component","SelectArrow","direction","size","LeftArrow","RightArrow","span","Ellipsis","maxWidth","fontSize","center","maxLines","PropertySelect","item","availableProperties","onChange","useState","currentIndex","setCurrentIndex","propertiesLength","length","onLeftClick","index","onRightClick","useEffect","JSON","stringify","TextOverlay","Item","name","Input","RPGUIContainer","type","Column","flex","flexWrap","alignItems","justifyContent","CloseButton","CustomInput","CustomContainer","Form","form","MessageText","p","useOutsideClick","ref","id","handleClickOutside","event","current","contains","target","CustomEvent","detail","document","dispatchEvent","addEventListener","removeEventListener","NPCDialogType","DraggableContainer","_ref$type","FramedGold","onCloseButton","title","imgSrc","_ref$imgWidth","imgWidth","cancelDrag","onPositionChange","onOutsideClick","draggableRef","useRef","_e","Draggable","cancel","onDrag","data","TitleContainer","Title","Icon","src","h1","img","Dropdown","options","dropdownId","uuidv4","selectedValue","setSelectedValue","selectedOption","setSelectedOption","opened","setOpened","firstOption","value","option","onMouseLeave","DropdownSelect","prev","DropdownOptions","map","key","ul","StyledItem","Recipes","Subtitle","RadioInputScroller","SpriteAtlasWrapper","RadioOptionsWrapper","ButtonWrapper","Details","RelativeListMenu","onSelected","_ref$fontSize","overflow","params","ListElement","text","li","ItemTooltip","label","generateContextMenuListOptions","actionsByTypeList","action","ItemSocketEventsDisplayLabels","EquipmentSlotSpriteByType","Neck","LeftHand","Ring","Head","Torso","Legs","Feet","Inventory","RightHand","Accessory","ItemSlot","observer","slotIndex","containerType","itemContainerType","slotSpriteMask","onMouseOver","onMouseOut","_ref$isContextMenuDis","isContextMenuDisabled","isTooltipVisible","setTooltipVisible","isContextMenuVisible","setIsContextMenuVisible","contextActions","setContextActions","contextActionMenu","ItemContainerType","ItemType","Weapon","Armor","Jewelry","ActionsForInventory","Equipment","Consumable","CraftingResource","Tool","Other","ActionsForEquipmentSet","Loot","ActionsForLoot","MapContainer","ActionsForMapContainer","contextActionMenuDontHaveUseWith","find","toLowerCase","includes","hasUseWith","push","generateContextMenu","getStackInfo","itemId","stackQty","ItemQtyContainer","ItemQty","clientX","clientY","onMouseEnter","optionId","itemToRender","texturePath","allowedEquipSlotType","_itemToRender$allowed","element","_id","getItemTextureKeyPath","stackInfo","renderEquipment","renderItem","onRenderSlot","EquipmentSetContainer","EquipmentColumn","IS_MOBILE_OR_TABLET","isMobile","tablet","DynamicText","onFinish","onStart","textState","setTextState","i","interval","setInterval","substring","clearInterval","TextContainer","NPCDialogText","str","charactersPerLine","linesPerDiv","onClose","onEndStep","onStartStep","windowSize","window","innerWidth","innerHeight","textChunks","Math","floor","round","match","RegExp","chunkIndex","setChunkIndex","onHandleSpacePress","code","goToNextStep","showGoNextIndicator","setShowGoNextIndicator","PressSpaceIndicator","right","TextOnly","pressSpaceGif","useEventListener","handler","el","savedHandler","listener","e","QuestionDialog","questions","answers","currentQuestion","setCurrentQuestion","canShowAnswers","setCanShowAnswers","onGetFirstAnswer","answerIds","firstAnswerId","answer","currentAnswer","setCurrentAnswer","onGetAnswers","answerId","nextAnswerIndex","findIndex","nextAnswerID","nextAnswer","previousAnswerIndex","previousAnswerID","previousAnswer","pop","nextQuestionId","question","QuestionContainer","AnswersContainer","isSelected","selectedColor","AnswerRow","AnswerSelectedIcon","color","Answer","onAnswerClick","onRenderCurrentAnswers","ImgSide","NPCDialog","imagePath","_ref$isQuestionDialog","isQuestionDialog","TextAndThumbnail","ThumbnailContainer","NPCThumbnail","aliceDefaultThumbnail","RangeSliderType","NPCMultiDialog","textAndTypeArray","slide","setSlide","_textAndTypeArray$sli","imageSide","BackgroundContainer","imgPath","DialogContainer","SlotsContainer","Framed","ItemsContainer","ProgressBarText","minWidth","percentageWidth","QuestDraggableContainer","QuestContainer","QuestsContainer","Content","QuestSplitDiv","QuestColumn","Thumbnail","QuestListContainer","NoQuestContainer","_RPGUI","RPGUI","input","SimpleProgressBar","_ref$bgColor","bgColor","_ref$margin","margin","ProgressBarContainer","BackgroundBar","Progress","SkillProgressBar","skillName","level","skillPoints","skillPointsToNextLevel","_ref$showSkillPoints","showSkillPoints","getSPForLevel","nextLevelSPWillbe","ratio","ProgressTitle","TitleName","ValueDisplay","ProgressBody","ProgressIconContainer","SpriteContainer","SkillDisplayContainer","SkillPointsDisplay","skillProps","attributes","values","stamina","magic","magicResistance","strength","resistance","dexterity","combat","first","club","sword","axe","distance","shielding","dagger","crafting","fishing","mining","lumberjacking","cooking","alchemy","SkillsDraggableContainer","SkillSplitDiv","DayNightPeriod","periodOfDay","periodOfDaySrcFiles","PeriodOfDay","Morning","Afternoon","Night","GifContainer","WidgetContainer","Time","DayNightContainer","TradingItemRow","onQuantityChange","traderItem","selectedQty","qty","ItemWrapper","ItemIconContainer","ItemNameContainer","NameValue","capitalize","price","QuantityContainer","QuantityDisplay","TradingComponentScrollWrapper","TotalWrapper","GoldWrapper","AlertWrapper","availableCharacters","propertySelectValues","textureKey","selectedSpriteKey","setSelectedSpriteKey","entitiesJSON","display","paddingBottom","left","chatMessages","onSendChatMessage","onFocus","onBlur","message","setMessage","scrollChatToBottom","scrollingElement","querySelector","scrollTop","scrollHeight","FramedGrey","fallback","emitter","createdAt","dayjs","Date","format","onRenderMessageLines","onRenderChatMessages","onSubmit","preventDefault","autoComplete","RPGUIButton","items","selectedValues","forEach","generateSelectedValuesList","setSelectedValues","checked","onSelect","onCraftItem","craftablesItems","optionsId","show","isShown","setIsShown","craftItem","setCraftItem","modifyString","parts","split","words","replace","slice","toUpperCase","concat","join","handleClick","Object","keys","ItemSubType","canCraft","ingredients","details","equipmentSet","onItemClick","equipmentData","neck","leftHand","ring","head","armor","legs","boot","inventory","rightHand","accessory","equipmentMaskSlots","ItemSlotType","onRenderEquipmentSlotRange","start","end","equipmentRange","slotMaksRange","itemContainer","itemType","ContainerType","backgroundImgPath","fullCoverBackground","setImage","fullImg","_ref$disableContextMe","disableContextMenu","slots","slotQty","_itemContainer$slots","onRenderSlots","imageKey","description","max","_ref$displayText","displayText","_ref$percentageWidth","_ref$minWidth","calculatePercentageValue","quests","buttons","onChangeQuest","questsLength","thumbnail","thumbnailDefault","npcId","quest","valueMin","valueMax","sliderId","onMouseUp","rpguiSlider","getElementById","get_value","Number","Slider","GoldSlider","min","skill","onRenderSkillCategory","category","skillCategory","skillCategoryColor","output","entries","skillDetails","experience","xpToNextLevel","TimeClock","word","traderItems","characterAvailableGold","onConfirm","sum","setSum","Map","qtyMap","setQtyMap","set","newSum","get","isBuy","hasGoldForSale","tradeItem","assign"],"mappings":"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"}
|