@rpg-engine/long-bow 0.3.97 → 0.3.98

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.
Files changed (179) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +181 -181
  3. package/dist/components/Spellbook/Spell.d.ts +4 -4
  4. package/dist/components/Spellbook/Spellbook.d.ts +2 -2
  5. package/dist/components/Spellbook/cards/MobileSpellTooltip.d.ts +15 -0
  6. package/dist/components/Spellbook/cards/SpellInfo.d.ts +7 -0
  7. package/dist/components/Spellbook/cards/SpellInfoDisplay.d.ts +7 -0
  8. package/dist/components/Spellbook/cards/SpellInfoWrapper.d.ts +9 -0
  9. package/dist/components/Spellbook/cards/SpellTooltip.d.ts +6 -0
  10. package/dist/components/Spellbook/mockSpells.d.ts +2 -2
  11. package/dist/libs/CastingTypeHelper.d.ts +1 -0
  12. package/dist/long-bow.cjs.development.js +1438 -1229
  13. package/dist/long-bow.cjs.development.js.map +1 -1
  14. package/dist/long-bow.cjs.production.min.js +1 -1
  15. package/dist/long-bow.cjs.production.min.js.map +1 -1
  16. package/dist/long-bow.esm.js +1439 -1230
  17. package/dist/long-bow.esm.js.map +1 -1
  18. package/dist/stories/SpellInfoDisplay.stories.d.ts +8 -0
  19. package/package.json +100 -100
  20. package/src/.DS_Store +0 -0
  21. package/src/components/.DS_Store +0 -0
  22. package/src/components/Abstractions/ModalPortal.tsx +22 -22
  23. package/src/components/Abstractions/SlotsContainer.tsx +62 -62
  24. package/src/components/Arrow/SelectArrow.tsx +69 -69
  25. package/src/components/Arrow/img/arrow01-left-clicked.png +0 -0
  26. package/src/components/Arrow/img/arrow01-left.png +0 -0
  27. package/src/components/Arrow/img/arrow01-right-clicked.png +0 -0
  28. package/src/components/Arrow/img/arrow01-right.png +0 -0
  29. package/src/components/Arrow/img/arrow02-left-clicked.png +0 -0
  30. package/src/components/Arrow/img/arrow02-left.png +0 -0
  31. package/src/components/Arrow/img/arrow02-right-clicked.png +0 -0
  32. package/src/components/Arrow/img/arrow02-right.png +0 -0
  33. package/src/components/Button.tsx +40 -40
  34. package/src/components/Character/CharacterSelection.tsx +98 -98
  35. package/src/components/CharacterStatus/CharacterStatus.tsx +120 -120
  36. package/src/components/Chat/Chat.tsx +196 -196
  37. package/src/components/Chatdeprecated/ChatDeprecated.tsx +198 -198
  38. package/src/components/CheckButton.tsx +65 -65
  39. package/src/components/CircularController/CircularController.tsx +282 -282
  40. package/src/components/CraftBook/CraftBook.tsx +286 -286
  41. package/src/components/CraftBook/CraftingRecipe.tsx +161 -161
  42. package/src/components/CraftBook/MockItems.ts +101 -101
  43. package/src/components/DraggableContainer.tsx +180 -180
  44. package/src/components/DropdownSelectorContainer.tsx +42 -42
  45. package/src/components/Equipment/EquipmentSet.tsx +199 -199
  46. package/src/components/HistoryDialog.tsx +104 -104
  47. package/src/components/Input.tsx +15 -15
  48. package/src/components/InputRadio.tsx +41 -41
  49. package/src/components/Item/Cards/ItemInfo.tsx +298 -298
  50. package/src/components/Item/Cards/ItemInfoDisplay.tsx +135 -135
  51. package/src/components/Item/Cards/ItemInfoWrapper.tsx +62 -62
  52. package/src/components/Item/Cards/ItemTooltip.tsx +83 -83
  53. package/src/components/Item/Cards/MobileItemTooltip.tsx +149 -149
  54. package/src/components/Item/Inventory/ErrorBoundary.tsx +42 -42
  55. package/src/components/Item/Inventory/ItemContainer.tsx +231 -231
  56. package/src/components/Item/Inventory/ItemContainerTypes.ts +6 -6
  57. package/src/components/Item/Inventory/ItemQuantitySelector.tsx +138 -138
  58. package/src/components/Item/Inventory/ItemSlot.tsx +580 -580
  59. package/src/components/Item/Inventory/itemContainerHelper.ts +175 -175
  60. package/src/components/ListMenu.tsx +63 -63
  61. package/src/components/Marketplace/Marketplace.tsx +132 -132
  62. package/src/components/Marketplace/MarketplaceRows.tsx +171 -171
  63. package/src/components/Marketplace/__mocks__/index.tsx +65 -65
  64. package/src/components/Multitab/Tab.tsx +66 -66
  65. package/src/components/Multitab/TabBody.tsx +13 -13
  66. package/src/components/Multitab/TabsContainer.tsx +97 -97
  67. package/src/components/NPCDialog/.DS_Store +0 -0
  68. package/src/components/NPCDialog/NPCDialog.tsx +121 -121
  69. package/src/components/NPCDialog/NPCDialogText.tsx +113 -113
  70. package/src/components/NPCDialog/NPCMultiDialog.tsx +159 -159
  71. package/src/components/NPCDialog/QuestionDialog/QuestionDialog.tsx +237 -237
  72. package/src/components/NPCDialog/img/.DS_Store +0 -0
  73. package/src/components/ProgressBar.tsx +92 -92
  74. package/src/components/PropertySelect/PropertySelect.tsx +106 -106
  75. package/src/components/QuestInfo/QuestInfo.tsx +233 -233
  76. package/src/components/QuestList.tsx +135 -135
  77. package/src/components/RPGUIContainer.tsx +47 -47
  78. package/src/components/RPGUIForceRenderStart.tsx +45 -45
  79. package/src/components/RPGUIRoot.tsx +14 -14
  80. package/src/components/RadioButton.tsx +53 -53
  81. package/src/components/RadioInput/RadioButton.tsx +96 -96
  82. package/src/components/RadioInput/RadioInput.tsx +102 -102
  83. package/src/components/RadioInput/instruments.ts +15 -15
  84. package/src/components/RangeSlider.tsx +78 -78
  85. package/src/components/RelativeListMenu.tsx +90 -90
  86. package/src/components/ScrollList.tsx +79 -79
  87. package/src/components/Shortcuts/Shortcuts.tsx +192 -192
  88. package/src/components/Shortcuts/ShortcutsSetter.tsx +139 -139
  89. package/src/components/Shortcuts/SingleShortcut.ts +82 -82
  90. package/src/components/Shortcuts/useShortcutCooldown.ts +23 -23
  91. package/src/components/SimpleProgressBar.tsx +62 -62
  92. package/src/components/SkillProgressBar.tsx +133 -133
  93. package/src/components/SkillsContainer.tsx +206 -206
  94. package/src/components/Spellbook/Spell.tsx +236 -226
  95. package/src/components/Spellbook/Spellbook.tsx +159 -158
  96. package/src/components/Spellbook/cards/MobileSpellTooltip.tsx +137 -0
  97. package/src/components/Spellbook/cards/SpellInfo.tsx +132 -0
  98. package/src/components/Spellbook/cards/SpellInfoDisplay.tsx +31 -0
  99. package/src/components/Spellbook/cards/SpellInfoWrapper.tsx +48 -0
  100. package/src/components/Spellbook/cards/SpellTooltip.tsx +70 -0
  101. package/src/components/Spellbook/constants.ts +8 -8
  102. package/src/components/Spellbook/mockSpells.ts +85 -60
  103. package/src/components/StaticBook/StaticBook.tsx +103 -103
  104. package/src/components/TextArea.tsx +11 -11
  105. package/src/components/TimeWidget/DayNightPeriod/DayNightPeriod.tsx +35 -35
  106. package/src/components/TimeWidget/TimeWidget.tsx +65 -65
  107. package/src/components/TradingMenu/TradingItemRow.tsx +199 -199
  108. package/src/components/TradingMenu/TradingMenu.tsx +219 -219
  109. package/src/components/TradingMenu/items.mock.ts +48 -48
  110. package/src/components/Truncate.tsx +25 -25
  111. package/src/components/itemSelector/ItemSelector.tsx +136 -136
  112. package/src/components/shared/Column.tsx +16 -16
  113. package/src/components/shared/Ellipsis.tsx +68 -68
  114. package/src/components/shared/SpriteFromAtlas.tsx +104 -104
  115. package/src/components/typography/DynamicText.tsx +49 -49
  116. package/src/constants/uiColors.ts +20 -20
  117. package/src/constants/uiDevices.ts +3 -3
  118. package/src/constants/uiFonts.ts +12 -12
  119. package/src/hooks/useEventListener.ts +21 -21
  120. package/src/hooks/useOutsideAlerter.ts +25 -25
  121. package/src/index.tsx +42 -42
  122. package/src/libs/CastingTypeHelper.ts +8 -0
  123. package/src/libs/StringHelpers.ts +3 -3
  124. package/src/libs/itemCounter.ts +21 -21
  125. package/src/mocks/.DS_Store +0 -0
  126. package/src/mocks/atlas/.DS_Store +0 -0
  127. package/src/mocks/atlas/entities/entities.json +20215 -20215
  128. package/src/mocks/atlas/icons/icons.json +735 -735
  129. package/src/mocks/atlas/items/items.json +12086 -12086
  130. package/src/mocks/equipmentSet.mocks.ts +391 -391
  131. package/src/mocks/itemContainer.mocks.ts +605 -605
  132. package/src/mocks/skills.mocks.ts +128 -128
  133. package/src/stories/Arrow.stories.tsx +26 -26
  134. package/src/stories/Button.stories.tsx +36 -36
  135. package/src/stories/CharacterSelection.stories.tsx +44 -44
  136. package/src/stories/CharacterStatus.stories.tsx +29 -29
  137. package/src/stories/Chat.stories.tsx +187 -187
  138. package/src/stories/ChatDeprecated.stories.tsx +170 -170
  139. package/src/stories/CheckButton.stories.tsx +48 -48
  140. package/src/stories/CircullarController.stories.tsx +37 -37
  141. package/src/stories/CraftBook.stories.tsx +42 -42
  142. package/src/stories/DayNightPeriod.stories.tsx +27 -27
  143. package/src/stories/DraggableContainer.stories.tsx +28 -28
  144. package/src/stories/Dropdown.stories.tsx +46 -46
  145. package/src/stories/DropdownSelectorContainer.stories.tsx +41 -41
  146. package/src/stories/EquipmentSet.stories.tsx +65 -65
  147. package/src/stories/HistoryDialog.stories.tsx +61 -61
  148. package/src/stories/ItemContainer.stories.tsx +201 -201
  149. package/src/stories/ItemInfoDisplay.stories.tsx +33 -33
  150. package/src/stories/ItemQuantitySelector.stories.tsx +26 -26
  151. package/src/stories/ItemSelector.stories.tsx +77 -77
  152. package/src/stories/ItemTradingComponent.stories.tsx +35 -35
  153. package/src/stories/ListMenu.stories.tsx +56 -56
  154. package/src/stories/Marketplace.stories.tsx +42 -42
  155. package/src/stories/MarketplaceRows.stories.tsx +28 -28
  156. package/src/stories/Multitab.stories.tsx +51 -51
  157. package/src/stories/NPCDialog.stories.tsx +130 -130
  158. package/src/stories/NPCMultiDialog.stories.tsx +71 -71
  159. package/src/stories/ProgressBar.stories.tsx +23 -23
  160. package/src/stories/PropertySelect.stories.tsx +40 -40
  161. package/src/stories/QuestInfo.stories.tsx +107 -107
  162. package/src/stories/QuestList.stories.tsx +82 -82
  163. package/src/stories/RPGUIContainers.stories.tsx +42 -42
  164. package/src/stories/RadioButton.stories.tsx +49 -49
  165. package/src/stories/RadioInput.stories.tsx +34 -34
  166. package/src/stories/RangeSlider.stories.tsx +64 -64
  167. package/src/stories/ScrollList.stories.tsx +85 -85
  168. package/src/stories/Shortcuts.stories.tsx +39 -39
  169. package/src/stories/SimpleProgressBar.stories.tsx +22 -22
  170. package/src/stories/SkillProgressBar.stories.tsx +34 -34
  171. package/src/stories/SkillsContainer.stories.tsx +35 -35
  172. package/src/stories/SpellInfoDisplay.stories.tsx +27 -0
  173. package/src/stories/Spellbook.stories.tsx +104 -104
  174. package/src/stories/StaticBook.stories.tsx +32 -32
  175. package/src/stories/Text.stories.tsx +42 -42
  176. package/src/stories/TimeWidget.stories.tsx +27 -27
  177. package/src/stories/TradingMenu.stories.tsx +47 -47
  178. package/src/types/eventTypes.ts +4 -4
  179. package/src/types/index.d.ts +2 -2
@@ -0,0 +1,70 @@
1
+ import { ISpell } from '@rpg-engine/shared';
2
+ import React, { useEffect, useRef } from 'react';
3
+ import styled from 'styled-components';
4
+ import ModalPortal from '../../Abstractions/ModalPortal';
5
+ import { SpellInfoDisplay } from './SpellInfoDisplay';
6
+
7
+ export interface IMagicTooltipProps {
8
+ spell: ISpell;
9
+ }
10
+
11
+ const offset = 20;
12
+
13
+ export const MagicTooltip: React.FC<IMagicTooltipProps> = ({ spell }) => {
14
+ const ref = useRef<HTMLDivElement>(null);
15
+
16
+ useEffect(() => {
17
+ const { current } = ref;
18
+
19
+ if (current) {
20
+ const handleMouseMove = (event: MouseEvent) => {
21
+ const { clientX, clientY } = event;
22
+
23
+ // Adjust the position of the tooltip based on the mouse position
24
+ const rect = current.getBoundingClientRect();
25
+
26
+ const tooltipWidth = rect.width;
27
+ const tooltipHeight = rect.height;
28
+ const isOffScreenRight =
29
+ clientX + tooltipWidth + offset > window.innerWidth;
30
+ const isOffScreenBottom =
31
+ clientY + tooltipHeight + offset > window.innerHeight;
32
+ const x = isOffScreenRight
33
+ ? clientX - tooltipWidth - offset
34
+ : clientX + offset;
35
+ const y = isOffScreenBottom
36
+ ? clientY - tooltipHeight - offset
37
+ : clientY + offset;
38
+
39
+ current.style.transform = `translate(${x}px, ${y}px)`;
40
+ current.style.opacity = '1';
41
+ };
42
+
43
+ window.addEventListener('mousemove', handleMouseMove);
44
+
45
+ return () => {
46
+ window.removeEventListener('mousemove', handleMouseMove);
47
+ };
48
+ }
49
+
50
+ return;
51
+ }, []);
52
+
53
+ return (
54
+ <ModalPortal>
55
+ <Container ref={ref}>
56
+ <SpellInfoDisplay spell={spell} />
57
+ </Container>
58
+ </ModalPortal>
59
+ );
60
+ };
61
+
62
+ const Container = styled.div`
63
+ position: absolute;
64
+ z-index: 100;
65
+ pointer-events: none;
66
+ left: 0;
67
+ top: 0;
68
+ opacity: 0;
69
+ transition: opacity 0.08s;
70
+ `;
@@ -1,8 +1,8 @@
1
- import { IShortcut, ShortcutType } from '@rpg-engine/shared';
2
-
3
- export const SHORTCUTS_STORAGE_KEY = 'shortcuts';
4
-
5
- export const defaultShortcut: IShortcut = {
6
- type: ShortcutType.None,
7
- payload: null,
8
- };
1
+ import { IShortcut, ShortcutType } from '@rpg-engine/shared';
2
+
3
+ export const SHORTCUTS_STORAGE_KEY = 'shortcuts';
4
+
5
+ export const defaultShortcut: IShortcut = {
6
+ type: ShortcutType.None,
7
+ payload: null,
8
+ };
@@ -1,60 +1,85 @@
1
- import { IRawSpell } from '@rpg-engine/shared';
2
-
3
- enum SpellsBlueprint {
4
- SelfHealingSpell = 'self-healing-spell',
5
- FoodCreationSpell = 'food-creation-spell',
6
- ArrowCreationSpell = 'arrow-creation-spell',
7
- BoltCreationSpell = 'bolt-creation-spell',
8
- BlankRuneCreationSpell = 'blank-rune-creation-spell',
9
- SelfHasteSpell = 'self-haste-spell',
10
- FireRuneCreationSpell = 'fire-rune-creation-spell',
11
- HealRuneCreationSpell = 'healing-rune-creation-spell',
12
- PoisonRuneCreationSpell = 'poison-rune-creation-spell',
13
- DarkRuneCreationSpell = 'dark-rune-creation-spell',
14
- GreaterHealingSpell = 'greater-healing-spell',
15
- EnergyBoltCreationSpell = 'energy-bolt-creation-spell',
16
- FireBoltCreationSpell = 'fire-bolt-creation-spell',
17
- }
18
-
19
- export const mockSpells: IRawSpell[] = [
20
- {
21
- key: SpellsBlueprint.ArrowCreationSpell,
22
- name: 'Arrow Creation Spell',
23
- description: 'A spell that creates arrow in your inventory.',
24
- magicWords: 'iquar elandi',
25
- manaCost: 10,
26
- minMagicLevelRequired: 3,
27
- },
28
- {
29
- key: SpellsBlueprint.BlankRuneCreationSpell,
30
- name: 'Blank Rune Creation Spell',
31
- description: 'A spell that creates a blank rune in your inventory.',
32
- magicWords: 'iquar ansr ki',
33
- manaCost: 5,
34
- minMagicLevelRequired: 3,
35
- },
36
- {
37
- key: SpellsBlueprint.BoltCreationSpell,
38
- name: 'Bolt Creation Spell',
39
- description: 'A spell that creates bolt in your inventory.',
40
- magicWords: 'iquar lyn',
41
- manaCost: 15,
42
- minMagicLevelRequired: 3,
43
- },
44
- {
45
- key: SpellsBlueprint.SelfHasteSpell,
46
- name: 'Self Haste Spell',
47
- description: 'A self haste spell.',
48
- magicWords: 'talas hiz',
49
- manaCost: 40,
50
- minMagicLevelRequired: 5,
51
- },
52
- {
53
- key: SpellsBlueprint.SelfHealingSpell,
54
- name: 'Self Healing Spell',
55
- description: 'A self healing spell.',
56
- magicWords: 'talas faenya',
57
- manaCost: 10,
58
- minMagicLevelRequired: 1,
59
- },
60
- ];
1
+ import { AnimationEffectKeys, ISpell, SpellCastingType, SpellsBlueprint } from '@rpg-engine/shared';
2
+
3
+
4
+ export const mockSpells: ISpell[] = [
5
+ {
6
+ key: SpellsBlueprint.ArrowCreationSpell,
7
+ name: 'Arrow Creation Spell',
8
+ description: 'A spell that creates arrow in your inventory.',
9
+ magicWords: 'iquar elandi',
10
+ manaCost: 10,
11
+ minMagicLevelRequired: 3,
12
+ castingType: SpellCastingType.RangedCasting,
13
+ minLevelRequired: 1,
14
+ cooldown: 20,
15
+ maxDistanceGrid: 2,
16
+ castingAnimationKey: AnimationEffectKeys.SkillLevelUp,
17
+ targetHitAnimationKey: AnimationEffectKeys.Rooted,
18
+ projectileAnimationKey: AnimationEffectKeys.Energy,
19
+ usableEffect: () => {}
20
+ },
21
+ {
22
+ key: SpellsBlueprint.ArrowCreationSpell,
23
+ name: 'Arrow Creation Spell',
24
+ description: 'A spell that creates arrow in your inventory.',
25
+ magicWords: 'iquar elandi',
26
+ manaCost: 10,
27
+ minMagicLevelRequired: 3,
28
+ castingType: SpellCastingType.RangedCasting,
29
+ minLevelRequired: 1,
30
+ cooldown: 20,
31
+ maxDistanceGrid: 2,
32
+ castingAnimationKey: AnimationEffectKeys.SkillLevelUp,
33
+ targetHitAnimationKey: AnimationEffectKeys.Rooted,
34
+ projectileAnimationKey: AnimationEffectKeys.Energy,
35
+ usableEffect: () => {}
36
+ },
37
+ {
38
+ key: SpellsBlueprint.ArrowCreationSpell,
39
+ name: 'Arrow Creation Spell',
40
+ description: 'A spell that creates arrow in your inventory.',
41
+ magicWords: 'iquar elandi',
42
+ manaCost: 10,
43
+ minMagicLevelRequired: 3,
44
+ castingType: SpellCastingType.RangedCasting,
45
+ minLevelRequired: 1,
46
+ cooldown: 20,
47
+ maxDistanceGrid: 2,
48
+ castingAnimationKey: AnimationEffectKeys.SkillLevelUp,
49
+ targetHitAnimationKey: AnimationEffectKeys.Rooted,
50
+ projectileAnimationKey: AnimationEffectKeys.Energy,
51
+ usableEffect: () => {}
52
+ },
53
+ {
54
+ key: SpellsBlueprint.ArrowCreationSpell,
55
+ name: 'Arrow Creation Spell',
56
+ description: 'A spell that creates arrow in your inventory.',
57
+ magicWords: 'iquar elandi',
58
+ manaCost: 10,
59
+ minMagicLevelRequired: 3,
60
+ castingType: SpellCastingType.RangedCasting,
61
+ minLevelRequired: 1,
62
+ cooldown: 20,
63
+ maxDistanceGrid: 2,
64
+ castingAnimationKey: AnimationEffectKeys.SkillLevelUp,
65
+ targetHitAnimationKey: AnimationEffectKeys.Rooted,
66
+ projectileAnimationKey: AnimationEffectKeys.Energy,
67
+ usableEffect: () => {}
68
+ },
69
+ {
70
+ key: SpellsBlueprint.ArrowCreationSpell,
71
+ name: 'Arrow Creation Spell',
72
+ description: 'A spell that creates arrow in your inventory.',
73
+ magicWords: 'iquar elandi',
74
+ manaCost: 10,
75
+ minMagicLevelRequired: 3,
76
+ castingType: SpellCastingType.RangedCasting,
77
+ minLevelRequired: 1,
78
+ cooldown: 20,
79
+ maxDistanceGrid: 2,
80
+ castingAnimationKey: AnimationEffectKeys.SkillLevelUp,
81
+ targetHitAnimationKey: AnimationEffectKeys.Rooted,
82
+ projectileAnimationKey: AnimationEffectKeys.Energy,
83
+ usableEffect: () => {}
84
+ },
85
+ ];
@@ -1,103 +1,103 @@
1
- import React, { useEffect, useState } from 'react';
2
- import Draggable from 'react-draggable';
3
- import styled from 'styled-components';
4
- import { uiFonts } from '../../constants/uiFonts';
5
- import SelectArrow from '../Arrow/SelectArrow';
6
- import Book from './img/0.png';
7
-
8
- export interface IStaticBookProps {
9
- content: string;
10
- onChange?: (slice: string) => void;
11
- onClose?: () => void;
12
- }
13
-
14
- export const StaticBook: React.FC<IStaticBookProps> = ({
15
- content,
16
- onChange,
17
- onClose,
18
- }) => {
19
- const [currentIndex, setCurrentIndex] = useState(0);
20
-
21
- // create slicedContent with string sliced every 550 characters
22
- const slicedContent = content.match(/.{1,550}/g) || [];
23
-
24
- useEffect(() => {
25
- if (onChange) onChange(slicedContent[currentIndex]);
26
- }, [currentIndex]);
27
-
28
- const bookLength = slicedContent.length - 1;
29
-
30
- const onLeftClick = () => {
31
- if (currentIndex === 0) setCurrentIndex(bookLength);
32
- else setCurrentIndex(index => index - 1);
33
- };
34
- const onRightClick = () => {
35
- if (currentIndex === bookLength) setCurrentIndex(0);
36
- else setCurrentIndex(index => index + 1);
37
- };
38
-
39
- const getCurrentContentSlice = () => {
40
- return slicedContent[currentIndex];
41
- };
42
-
43
- return (
44
- <Draggable>
45
- <Container>
46
- <CloseButton onPointerDown={onClose}>X</CloseButton>
47
- <ColumnBook isLastPage={currentIndex === bookLength}>
48
- {getCurrentContentSlice()}
49
- </ColumnBook>
50
-
51
- <ArrowContainer>
52
- {currentIndex >= 1 && (
53
- <SelectArrow
54
- direction="left"
55
- onPointerDown={onLeftClick}
56
- ></SelectArrow>
57
- )}
58
- {currentIndex !== bookLength && (
59
- <SelectArrow
60
- direction="right"
61
- onPointerDown={onRightClick}
62
- ></SelectArrow>
63
- )}
64
- </ArrowContainer>
65
- </Container>
66
- </Draggable>
67
- );
68
- };
69
-
70
- const Container = styled.div`
71
- background-image: url(${Book});
72
- background-repeat: no-repeat;
73
- position: relative;
74
- width: 778px;
75
- height: 463px;
76
- background-position-y: -1rem;
77
- `;
78
-
79
- const CloseButton = styled.p`
80
- position: absolute;
81
- top: 1.9rem;
82
- right: 5rem;
83
- font-size: ${uiFonts.size.large} !important;
84
- `;
85
-
86
- interface IColumnBook {
87
- isLastPage: boolean;
88
- }
89
-
90
- const ColumnBook = styled.span<IColumnBook>`
91
- position: absolute;
92
- left: 5.2rem;
93
- top: 3.8rem;
94
- width: ${({ isLastPage }) => (!isLastPage ? '77%' : '37%')};
95
- column-count: ${({ isLastPage }) => (isLastPage ? 1 : 2)};
96
- grid-gap: 56px;
97
- min-height: 340px;
98
- `;
99
- const ArrowContainer = styled.span`
100
- display: flex;
101
- height: 100%;
102
- align-items: center;
103
- `;
1
+ import React, { useEffect, useState } from 'react';
2
+ import Draggable from 'react-draggable';
3
+ import styled from 'styled-components';
4
+ import { uiFonts } from '../../constants/uiFonts';
5
+ import SelectArrow from '../Arrow/SelectArrow';
6
+ import Book from './img/0.png';
7
+
8
+ export interface IStaticBookProps {
9
+ content: string;
10
+ onChange?: (slice: string) => void;
11
+ onClose?: () => void;
12
+ }
13
+
14
+ export const StaticBook: React.FC<IStaticBookProps> = ({
15
+ content,
16
+ onChange,
17
+ onClose,
18
+ }) => {
19
+ const [currentIndex, setCurrentIndex] = useState(0);
20
+
21
+ // create slicedContent with string sliced every 550 characters
22
+ const slicedContent = content.match(/.{1,550}/g) || [];
23
+
24
+ useEffect(() => {
25
+ if (onChange) onChange(slicedContent[currentIndex]);
26
+ }, [currentIndex]);
27
+
28
+ const bookLength = slicedContent.length - 1;
29
+
30
+ const onLeftClick = () => {
31
+ if (currentIndex === 0) setCurrentIndex(bookLength);
32
+ else setCurrentIndex(index => index - 1);
33
+ };
34
+ const onRightClick = () => {
35
+ if (currentIndex === bookLength) setCurrentIndex(0);
36
+ else setCurrentIndex(index => index + 1);
37
+ };
38
+
39
+ const getCurrentContentSlice = () => {
40
+ return slicedContent[currentIndex];
41
+ };
42
+
43
+ return (
44
+ <Draggable>
45
+ <Container>
46
+ <CloseButton onPointerDown={onClose}>X</CloseButton>
47
+ <ColumnBook isLastPage={currentIndex === bookLength}>
48
+ {getCurrentContentSlice()}
49
+ </ColumnBook>
50
+
51
+ <ArrowContainer>
52
+ {currentIndex >= 1 && (
53
+ <SelectArrow
54
+ direction="left"
55
+ onPointerDown={onLeftClick}
56
+ ></SelectArrow>
57
+ )}
58
+ {currentIndex !== bookLength && (
59
+ <SelectArrow
60
+ direction="right"
61
+ onPointerDown={onRightClick}
62
+ ></SelectArrow>
63
+ )}
64
+ </ArrowContainer>
65
+ </Container>
66
+ </Draggable>
67
+ );
68
+ };
69
+
70
+ const Container = styled.div`
71
+ background-image: url(${Book});
72
+ background-repeat: no-repeat;
73
+ position: relative;
74
+ width: 778px;
75
+ height: 463px;
76
+ background-position-y: -1rem;
77
+ `;
78
+
79
+ const CloseButton = styled.p`
80
+ position: absolute;
81
+ top: 1.9rem;
82
+ right: 5rem;
83
+ font-size: ${uiFonts.size.large} !important;
84
+ `;
85
+
86
+ interface IColumnBook {
87
+ isLastPage: boolean;
88
+ }
89
+
90
+ const ColumnBook = styled.span<IColumnBook>`
91
+ position: absolute;
92
+ left: 5.2rem;
93
+ top: 3.8rem;
94
+ width: ${({ isLastPage }) => (!isLastPage ? '77%' : '37%')};
95
+ column-count: ${({ isLastPage }) => (isLastPage ? 1 : 2)};
96
+ grid-gap: 56px;
97
+ min-height: 340px;
98
+ `;
99
+ const ArrowContainer = styled.span`
100
+ display: flex;
101
+ height: 100%;
102
+ align-items: center;
103
+ `;
@@ -1,11 +1,11 @@
1
- import React from 'react';
2
-
3
- export interface ITextArea
4
- extends React.DetailedHTMLProps<
5
- React.TextareaHTMLAttributes<HTMLTextAreaElement>,
6
- HTMLTextAreaElement
7
- > {}
8
-
9
- export const TextArea: React.FC<ITextArea> = ({ ...props }) => {
10
- return <textarea {...props} />;
11
- };
1
+ import React from 'react';
2
+
3
+ export interface ITextArea
4
+ extends React.DetailedHTMLProps<
5
+ React.TextareaHTMLAttributes<HTMLTextAreaElement>,
6
+ HTMLTextAreaElement
7
+ > {}
8
+
9
+ export const TextArea: React.FC<ITextArea> = ({ ...props }) => {
10
+ return <textarea {...props} />;
11
+ };
@@ -1,35 +1,35 @@
1
- import React from 'react';
2
- import styled from 'styled-components';
3
-
4
- import { PeriodOfDay } from '@rpg-engine/shared';
5
- import AfternoonGif from './gif/afternoon.gif';
6
- import MorningGif from './gif/morning.gif';
7
- import NightGif from './gif/night.gif';
8
-
9
- export interface IPeriodOfDayDisplayProps {
10
- periodOfDay: PeriodOfDay;
11
- }
12
-
13
- export const DayNightPeriod: React.FC<IPeriodOfDayDisplayProps> = ({
14
- periodOfDay,
15
- }) => {
16
- const periodOfDaySrcFiles = {
17
- [PeriodOfDay.Morning]: MorningGif,
18
- [PeriodOfDay.Afternoon]: AfternoonGif,
19
- [PeriodOfDay.Night]: NightGif,
20
- };
21
-
22
- return (
23
- <GifContainer>
24
- <img src={periodOfDaySrcFiles[periodOfDay]} />
25
- </GifContainer>
26
- );
27
- };
28
-
29
- const GifContainer = styled.div`
30
- width: 100%;
31
-
32
- img {
33
- width: 67%;
34
- }
35
- `;
1
+ import React from 'react';
2
+ import styled from 'styled-components';
3
+
4
+ import { PeriodOfDay } from '@rpg-engine/shared';
5
+ import AfternoonGif from './gif/afternoon.gif';
6
+ import MorningGif from './gif/morning.gif';
7
+ import NightGif from './gif/night.gif';
8
+
9
+ export interface IPeriodOfDayDisplayProps {
10
+ periodOfDay: PeriodOfDay;
11
+ }
12
+
13
+ export const DayNightPeriod: React.FC<IPeriodOfDayDisplayProps> = ({
14
+ periodOfDay,
15
+ }) => {
16
+ const periodOfDaySrcFiles = {
17
+ [PeriodOfDay.Morning]: MorningGif,
18
+ [PeriodOfDay.Afternoon]: AfternoonGif,
19
+ [PeriodOfDay.Night]: NightGif,
20
+ };
21
+
22
+ return (
23
+ <GifContainer>
24
+ <img src={periodOfDaySrcFiles[periodOfDay]} />
25
+ </GifContainer>
26
+ );
27
+ };
28
+
29
+ const GifContainer = styled.div`
30
+ width: 100%;
31
+
32
+ img {
33
+ width: 67%;
34
+ }
35
+ `;
@@ -1,65 +1,65 @@
1
- import { PeriodOfDay } from '@rpg-engine/shared';
2
- import React from 'react';
3
- import Draggable from 'react-draggable';
4
- import styled from 'styled-components';
5
- import { uiFonts } from '../../constants/uiFonts';
6
- import { DayNightPeriod } from './DayNightPeriod/DayNightPeriod';
7
-
8
- import ClockWidgetImg from './img/clockwidget.png';
9
-
10
- export interface IClockWidgetProps {
11
- onClose?: () => void;
12
- TimeClock: string;
13
- periodOfDay: PeriodOfDay;
14
- scale?: number;
15
- }
16
-
17
- export const TimeWidget: React.FC<IClockWidgetProps> = ({
18
- onClose,
19
- TimeClock,
20
- periodOfDay,
21
- scale,
22
- }) => {
23
- return (
24
- <Draggable scale={scale}>
25
- <WidgetContainer>
26
- <CloseButton onPointerDown={onClose}>X</CloseButton>
27
- <DayNightContainer>
28
- <DayNightPeriod periodOfDay={periodOfDay} />
29
- </DayNightContainer>
30
- <Time>{TimeClock}</Time>
31
- </WidgetContainer>
32
- </Draggable>
33
- );
34
- };
35
-
36
- const WidgetContainer = styled.div`
37
- background-image: url(${ClockWidgetImg});
38
- background-size: 10rem;
39
- background-repeat: no-repeat;
40
- width: 10rem;
41
- position: absolute;
42
- height: 100px;
43
- `;
44
-
45
- const Time = styled.div`
46
- top: 0.75rem;
47
- right: 0.5rem;
48
- position: absolute;
49
- font-size: ${uiFonts.size.small};
50
- color: white;
51
- `;
52
-
53
- const CloseButton = styled.p`
54
- position: absolute;
55
- top: -0.5rem;
56
- margin: 0;
57
- right: -0.2rem;
58
- font-size: ${uiFonts.size.small} !important;
59
- z-index: 1;
60
- `;
61
-
62
- const DayNightContainer = styled.div`
63
- margin-top: -0.3rem;
64
- margin-left: -0.3rem;
65
- `;
1
+ import { PeriodOfDay } from '@rpg-engine/shared';
2
+ import React from 'react';
3
+ import Draggable from 'react-draggable';
4
+ import styled from 'styled-components';
5
+ import { uiFonts } from '../../constants/uiFonts';
6
+ import { DayNightPeriod } from './DayNightPeriod/DayNightPeriod';
7
+
8
+ import ClockWidgetImg from './img/clockwidget.png';
9
+
10
+ export interface IClockWidgetProps {
11
+ onClose?: () => void;
12
+ TimeClock: string;
13
+ periodOfDay: PeriodOfDay;
14
+ scale?: number;
15
+ }
16
+
17
+ export const TimeWidget: React.FC<IClockWidgetProps> = ({
18
+ onClose,
19
+ TimeClock,
20
+ periodOfDay,
21
+ scale,
22
+ }) => {
23
+ return (
24
+ <Draggable scale={scale}>
25
+ <WidgetContainer>
26
+ <CloseButton onPointerDown={onClose}>X</CloseButton>
27
+ <DayNightContainer>
28
+ <DayNightPeriod periodOfDay={periodOfDay} />
29
+ </DayNightContainer>
30
+ <Time>{TimeClock}</Time>
31
+ </WidgetContainer>
32
+ </Draggable>
33
+ );
34
+ };
35
+
36
+ const WidgetContainer = styled.div`
37
+ background-image: url(${ClockWidgetImg});
38
+ background-size: 10rem;
39
+ background-repeat: no-repeat;
40
+ width: 10rem;
41
+ position: absolute;
42
+ height: 100px;
43
+ `;
44
+
45
+ const Time = styled.div`
46
+ top: 0.75rem;
47
+ right: 0.5rem;
48
+ position: absolute;
49
+ font-size: ${uiFonts.size.small};
50
+ color: white;
51
+ `;
52
+
53
+ const CloseButton = styled.p`
54
+ position: absolute;
55
+ top: -0.5rem;
56
+ margin: 0;
57
+ right: -0.2rem;
58
+ font-size: ${uiFonts.size.small} !important;
59
+ z-index: 1;
60
+ `;
61
+
62
+ const DayNightContainer = styled.div`
63
+ margin-top: -0.3rem;
64
+ margin-left: -0.3rem;
65
+ `;