@rpg-engine/long-bow 0.3.76 → 0.3.77

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 (160) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +181 -181
  3. package/dist/components/CraftBook/CraftBook.d.ts +1 -3
  4. package/dist/components/Item/Cards/ItemTooltip.d.ts +4 -7
  5. package/dist/components/Item/Inventory/ItemContainer.d.ts +1 -2
  6. package/dist/components/Item/Inventory/ItemSlot.d.ts +1 -4
  7. package/dist/components/TradingMenu/TradingItemRow.d.ts +1 -3
  8. package/dist/components/TradingMenu/TradingMenu.d.ts +4 -6
  9. package/dist/components/shared/SpriteFromAtlas.d.ts +0 -1
  10. package/dist/long-bow.cjs.development.js +1029 -1420
  11. package/dist/long-bow.cjs.development.js.map +1 -1
  12. package/dist/long-bow.cjs.production.min.js +1 -1
  13. package/dist/long-bow.cjs.production.min.js.map +1 -1
  14. package/dist/long-bow.esm.js +1032 -1421
  15. package/dist/long-bow.esm.js.map +1 -1
  16. package/dist/stories/TradingMenu.stories.d.ts +2 -2
  17. package/package.json +100 -100
  18. package/src/components/Abstractions/SlotsContainer.tsx +45 -45
  19. package/src/components/Arrow/SelectArrow.tsx +69 -69
  20. package/src/components/Arrow/img/arrow01-left-clicked.png +0 -0
  21. package/src/components/Arrow/img/arrow01-left.png +0 -0
  22. package/src/components/Arrow/img/arrow01-right-clicked.png +0 -0
  23. package/src/components/Arrow/img/arrow01-right.png +0 -0
  24. package/src/components/Arrow/img/arrow02-left-clicked.png +0 -0
  25. package/src/components/Arrow/img/arrow02-left.png +0 -0
  26. package/src/components/Arrow/img/arrow02-right-clicked.png +0 -0
  27. package/src/components/Arrow/img/arrow02-right.png +0 -0
  28. package/src/components/Button.tsx +40 -40
  29. package/src/components/Character/CharacterSelection.tsx +96 -96
  30. package/src/components/CharacterStatus/CharacterStatus.tsx +120 -120
  31. package/src/components/Chat/Chat.tsx +195 -195
  32. package/src/components/Chatdeprecated/ChatDeprecated.tsx +198 -198
  33. package/src/components/CheckButton.tsx +65 -65
  34. package/src/components/CircularController/CircularController.tsx +248 -248
  35. package/src/components/CraftBook/CraftBook.tsx +227 -240
  36. package/src/components/CraftBook/MockItems.ts +251 -246
  37. package/src/components/DraggableContainer.tsx +153 -153
  38. package/src/components/Dropdown.tsx +90 -90
  39. package/src/components/DropdownSelectorContainer.tsx +42 -42
  40. package/src/components/Equipment/EquipmentSet.tsx +190 -190
  41. package/src/components/HistoryDialog.tsx +104 -104
  42. package/src/components/Input.tsx +15 -15
  43. package/src/components/Item/Cards/ItemTooltip.tsx +33 -85
  44. package/src/components/Item/Inventory/ErrorBoundary.tsx +42 -42
  45. package/src/components/Item/Inventory/ItemContainer.tsx +210 -214
  46. package/src/components/Item/Inventory/ItemContainerTypes.ts +6 -6
  47. package/src/components/Item/Inventory/ItemQuantitySelector.tsx +138 -138
  48. package/src/components/Item/Inventory/ItemSlot.tsx +501 -540
  49. package/src/components/Item/Inventory/itemContainerHelper.ts +156 -156
  50. package/src/components/ListMenu.tsx +63 -63
  51. package/src/components/Multitab/Tab.tsx +66 -66
  52. package/src/components/Multitab/TabBody.tsx +13 -13
  53. package/src/components/Multitab/TabsContainer.tsx +97 -97
  54. package/src/components/NPCDialog/NPCDialog.tsx +121 -121
  55. package/src/components/NPCDialog/NPCDialogText.tsx +113 -113
  56. package/src/components/NPCDialog/NPCMultiDialog.tsx +159 -159
  57. package/src/components/NPCDialog/QuestionDialog/QuestionDialog.tsx +237 -237
  58. package/src/components/ProgressBar.tsx +92 -92
  59. package/src/components/PropertySelect/PropertySelect.tsx +106 -106
  60. package/src/components/QuestInfo/QuestInfo.tsx +230 -230
  61. package/src/components/QuestList.tsx +129 -129
  62. package/src/components/RPGUIContainer.tsx +47 -47
  63. package/src/components/RPGUIForceRenderStart.tsx +45 -45
  64. package/src/components/RPGUIRoot.tsx +14 -14
  65. package/src/components/RadioButton.tsx +53 -53
  66. package/src/components/RadioInput/RadioButton.tsx +96 -96
  67. package/src/components/RadioInput/RadioInput.tsx +102 -102
  68. package/src/components/RadioInput/instruments.ts +15 -15
  69. package/src/components/RangeSlider.tsx +78 -78
  70. package/src/components/RelativeListMenu.tsx +83 -83
  71. package/src/components/ScrollList.tsx +79 -79
  72. package/src/components/Shortcuts/Shortcuts.tsx +151 -151
  73. package/src/components/Shortcuts/ShortcutsSetter.tsx +132 -132
  74. package/src/components/Shortcuts/SingleShortcut.ts +62 -62
  75. package/src/components/SimpleProgressBar.tsx +62 -62
  76. package/src/components/SkillProgressBar.tsx +133 -133
  77. package/src/components/SkillsContainer.tsx +200 -200
  78. package/src/components/Spellbook/Spell.tsx +201 -201
  79. package/src/components/Spellbook/Spellbook.tsx +150 -150
  80. package/src/components/Spellbook/constants.ts +8 -8
  81. package/src/components/Spellbook/mockSpells.ts +60 -60
  82. package/src/components/StaticBook/StaticBook.tsx +103 -103
  83. package/src/components/TextArea.tsx +11 -11
  84. package/src/components/TimeWidget/DayNightPeriod/DayNightPeriod.tsx +35 -35
  85. package/src/components/TimeWidget/TimeWidget.tsx +63 -63
  86. package/src/components/TradingMenu/TradingItemRow.tsx +181 -198
  87. package/src/components/TradingMenu/TradingMenu.tsx +203 -215
  88. package/src/components/TradingMenu/items.mock.ts +96 -48
  89. package/src/components/Truncate.tsx +25 -25
  90. package/src/components/itemSelector/ItemSelector.tsx +136 -136
  91. package/src/components/shared/Column.tsx +16 -16
  92. package/src/components/shared/Ellipsis.tsx +65 -65
  93. package/src/components/shared/SpriteFromAtlas.tsx +102 -104
  94. package/src/components/typography/DynamicText.tsx +49 -49
  95. package/src/constants/uiColors.ts +20 -20
  96. package/src/constants/uiDevices.ts +3 -3
  97. package/src/constants/uiFonts.ts +12 -12
  98. package/src/hooks/useEventListener.ts +21 -21
  99. package/src/hooks/useOutsideAlerter.ts +25 -25
  100. package/src/index.tsx +40 -40
  101. package/src/libs/StringHelpers.ts +3 -3
  102. package/src/mocks/atlas/entities/entities.json +20215 -20215
  103. package/src/mocks/atlas/icons/icons.json +735 -735
  104. package/src/mocks/atlas/items/items.json +12086 -12086
  105. package/src/mocks/equipmentSet.mocks.ts +393 -391
  106. package/src/mocks/itemContainer.mocks.ts +562 -563
  107. package/src/mocks/skills.mocks.ts +128 -128
  108. package/src/stories/Arrow.stories.tsx +26 -26
  109. package/src/stories/Button.stories.tsx +36 -36
  110. package/src/stories/CharacterSelection.stories.tsx +45 -45
  111. package/src/stories/CharacterStatus.stories.tsx +29 -29
  112. package/src/stories/Chat.stories.tsx +187 -187
  113. package/src/stories/ChatDeprecated.stories.tsx +170 -170
  114. package/src/stories/CheckButton.stories.tsx +48 -48
  115. package/src/stories/CircullarController.stories.tsx +37 -37
  116. package/src/stories/CraftBook.stories.tsx +40 -42
  117. package/src/stories/DayNightPeriod.stories.tsx +27 -27
  118. package/src/stories/DraggableContainer.stories.tsx +28 -28
  119. package/src/stories/Dropdown.stories.tsx +46 -46
  120. package/src/stories/DropdownSelectorContainer.stories.tsx +41 -41
  121. package/src/stories/EquipmentSet.stories.tsx +65 -65
  122. package/src/stories/HistoryDialog.stories.tsx +61 -61
  123. package/src/stories/ItemContainer.stories.tsx +198 -200
  124. package/src/stories/ItemQuantitySelector.stories.tsx +26 -26
  125. package/src/stories/ItemSelector.stories.tsx +77 -77
  126. package/src/stories/ItemTradingComponent.stories.tsx +35 -35
  127. package/src/stories/ListMenu.stories.tsx +56 -56
  128. package/src/stories/Multitab.stories.tsx +51 -51
  129. package/src/stories/NPCDialog.stories.tsx +130 -130
  130. package/src/stories/NPCMultiDialog.stories.tsx +71 -71
  131. package/src/stories/ProgressBar.stories.tsx +23 -23
  132. package/src/stories/PropertySelect.stories.tsx +40 -40
  133. package/src/stories/QuestInfo.stories.tsx +107 -107
  134. package/src/stories/QuestList.stories.tsx +82 -82
  135. package/src/stories/RPGUIContainers.stories.tsx +42 -42
  136. package/src/stories/RadioButton.stories.tsx +49 -49
  137. package/src/stories/RadioInput.stories.tsx +34 -34
  138. package/src/stories/RangeSlider.stories.tsx +64 -64
  139. package/src/stories/ScrollList.stories.tsx +85 -85
  140. package/src/stories/Shortcuts.stories.tsx +39 -39
  141. package/src/stories/SimpleProgressBar.stories.tsx +22 -22
  142. package/src/stories/SkillProgressBar.stories.tsx +34 -34
  143. package/src/stories/SkillsContainer.stories.tsx +35 -35
  144. package/src/stories/Spellbook.stories.tsx +104 -104
  145. package/src/stories/StaticBook.stories.tsx +32 -32
  146. package/src/stories/Text.stories.tsx +42 -42
  147. package/src/stories/TimeWidget.stories.tsx +27 -27
  148. package/src/stories/TradingMenu.stories.tsx +45 -47
  149. package/src/types/eventTypes.ts +4 -4
  150. package/src/types/index.d.ts +2 -2
  151. package/dist/components/Item/Cards/ItemInfo.d.ts +0 -10
  152. package/dist/components/Item/Cards/ItemInfoDisplay.d.ts +0 -10
  153. package/dist/components/Item/Cards/ItemInfoWrapper.d.ts +0 -12
  154. package/dist/components/Item/Cards/MobileItemTooltip.d.ts +0 -18
  155. package/dist/stories/ItemInfoDisplay.stories.d.ts +0 -8
  156. package/src/components/Item/Cards/ItemInfo.tsx +0 -248
  157. package/src/components/Item/Cards/ItemInfoDisplay.tsx +0 -123
  158. package/src/components/Item/Cards/ItemInfoWrapper.tsx +0 -62
  159. package/src/components/Item/Cards/MobileItemTooltip.tsx +0 -105
  160. package/src/stories/ItemInfoDisplay.stories.tsx +0 -33
@@ -1,2 +1,2 @@
1
- declare module '*.gif';
2
- declare module '*.png';
1
+ declare module '*.gif';
2
+ declare module '*.png';
@@ -1,10 +0,0 @@
1
- import { IItem } from '@rpg-engine/shared';
2
- import React from 'react';
3
- interface IItemInfoProps {
4
- item: IItem;
5
- itemToCompare?: IItem;
6
- atlasIMG: any;
7
- atlasJSON: any;
8
- }
9
- export declare const ItemInfo: React.FC<IItemInfoProps>;
10
- export {};
@@ -1,10 +0,0 @@
1
- import { IEquipmentSet, IItem } from '@rpg-engine/shared';
2
- import React from 'react';
3
- export interface IItemInfoDisplayProps {
4
- item: IItem;
5
- atlasIMG: any;
6
- atlasJSON: any;
7
- equipmentSet?: IEquipmentSet | null;
8
- isMobile?: boolean;
9
- }
10
- export declare const ItemInfoDisplay: React.FC<IItemInfoDisplayProps>;
@@ -1,12 +0,0 @@
1
- import { IEquipmentSet, IItem } from '@rpg-engine/shared';
2
- import React from 'react';
3
- interface IItemInfoWrapperProps {
4
- item: IItem;
5
- children: React.ReactNode;
6
- atlasIMG: any;
7
- atlasJSON: any;
8
- equipmentSet?: IEquipmentSet | null;
9
- scale?: number;
10
- }
11
- export declare const ItemInfoWrapper: React.FC<IItemInfoWrapperProps>;
12
- export {};
@@ -1,18 +0,0 @@
1
- import { IEquipmentSet, IItem } from '@rpg-engine/shared';
2
- import React from 'react';
3
- interface IListMenuOption {
4
- id: string;
5
- text: string;
6
- }
7
- export interface MobileItemTooltipProps {
8
- item: IItem;
9
- atlasIMG: any;
10
- atlasJSON: any;
11
- closeTooltip: () => void;
12
- equipmentSet?: IEquipmentSet | null;
13
- scale?: number;
14
- options?: IListMenuOption[];
15
- onSelected?: (selectedOptionId: string) => void;
16
- }
17
- export declare const MobileItemTooltip: React.FC<MobileItemTooltipProps>;
18
- export {};
@@ -1,8 +0,0 @@
1
- import React from 'react';
2
- import { IItemInfoDisplayProps } from '../components/Item/Cards/ItemInfoDisplay';
3
- declare const _default: {
4
- title: string;
5
- component: React.FC<IItemInfoDisplayProps>;
6
- };
7
- export default _default;
8
- export declare const Default: import("@storybook/csf").AnnotatedStoryFn<import("@storybook/react").ReactFramework, IItemInfoDisplayProps>;
@@ -1,248 +0,0 @@
1
- import { IItem } from '@rpg-engine/shared';
2
- import React from 'react';
3
- import styled from 'styled-components';
4
- import { uiColors } from '../../../constants/uiColors';
5
- import { uiFonts } from '../../../constants/uiFonts';
6
- import { SpriteFromAtlas } from '../../shared/SpriteFromAtlas';
7
- import { ErrorBoundary } from '../Inventory/ErrorBoundary';
8
- import { EquipmentSlotSpriteByType, rarityColor } from '../Inventory/ItemSlot';
9
-
10
- interface IItemInfoProps {
11
- item: IItem;
12
- itemToCompare?: IItem;
13
- atlasIMG: any;
14
- atlasJSON: any;
15
- }
16
-
17
- interface IItemStat {
18
- key: keyof IItem;
19
- label?: string;
20
- higherIsWorse?: boolean;
21
- }
22
-
23
- const statisticsToDisplay: IItemStat[] = [
24
- { key: 'attack' },
25
- { key: 'defense' },
26
- { key: 'maxRange', label: 'Range' },
27
- { key: 'weight', higherIsWorse: true },
28
- ];
29
-
30
- export const ItemInfo: React.FC<IItemInfoProps> = ({
31
- item,
32
- itemToCompare,
33
- atlasIMG,
34
- atlasJSON,
35
- }) => {
36
- const renderStatistics = () => {
37
- const statistics = [];
38
-
39
- for (const stat of statisticsToDisplay) {
40
- const itemStatistic = item[stat.key];
41
-
42
- if (itemStatistic) {
43
- const label =
44
- stat.label || stat.key[0].toUpperCase() + stat.key.slice(1);
45
-
46
- const isItemToCompare = !!itemToCompare;
47
-
48
- const isOnlyInOneItem = isItemToCompare && !itemToCompare?.[stat.key];
49
- const statDiff =
50
- parseInt(itemStatistic.toString()) -
51
- parseInt(itemToCompare?.[stat.key]?.toString() ?? '0');
52
-
53
- const isDifference = isItemToCompare && statDiff !== 0;
54
- const isBetter =
55
- (statDiff > 0 && !stat.higherIsWorse) ||
56
- (statDiff < 0 && stat.higherIsWorse);
57
-
58
- statistics.push(
59
- <Statistic key={stat.key} className={isOnlyInOneItem ? 'better' : ''}>
60
- <div className="label">{label}:</div>
61
- <div
62
- className={`value ${
63
- isDifference ? (isBetter ? 'better' : 'worse') : ''
64
- }`}
65
- >
66
- {`${itemStatistic.toString()} ${
67
- isDifference ? `(${statDiff > 0 ? '+' : ''}${statDiff})` : ''
68
- }`}
69
- </div>
70
- </Statistic>
71
- );
72
- }
73
- }
74
-
75
- return statistics;
76
- };
77
-
78
- const renderMissingStatistic = () => {
79
- const statistics = [];
80
-
81
- for (const stat of statisticsToDisplay) {
82
- const itemToCompareStatistic = itemToCompare?.[stat.key];
83
-
84
- if (itemToCompareStatistic && !item[stat.key]) {
85
- const label =
86
- stat.label || stat.key[0].toUpperCase() + stat.key.slice(1);
87
-
88
- statistics.push(
89
- <Statistic key={stat.key} className="worse">
90
- <div className="label">{label}:</div>
91
- <div className="value worse">
92
- {itemToCompareStatistic.toString()}
93
- </div>
94
- </Statistic>
95
- );
96
- }
97
- }
98
-
99
- return statistics;
100
- };
101
-
102
- const renderAvaibleSlots = () => {
103
- if (!item.allowedEquipSlotType) return null;
104
-
105
- return item.allowedEquipSlotType.map((slotType, index) => (
106
- <ErrorBoundary key={index}>
107
- <SpriteFromAtlas
108
- atlasIMG={atlasIMG}
109
- atlasJSON={atlasJSON}
110
- spriteKey={EquipmentSlotSpriteByType[slotType]}
111
- imgScale={2}
112
- grayScale={true}
113
- opacity={0.4}
114
- containerStyle={{ width: '32px', height: '32px' }}
115
- />
116
- </ErrorBoundary>
117
- ));
118
- };
119
-
120
- return (
121
- <Container item={item}>
122
- <Header>
123
- <div>
124
- <Title>{item.name}</Title>
125
- {item.rarity !== 'Common' && (
126
- <Rarity item={item}>{item.rarity}</Rarity>
127
- )}
128
- <Type>{item.subType}</Type>
129
- </div>
130
- <AllowedSlots>{renderAvaibleSlots()}</AllowedSlots>
131
- </Header>
132
-
133
- {renderStatistics()}
134
- {item.isTwoHanded && <Statistic>Two handed</Statistic>}
135
-
136
- <Description>{item.description}</Description>
137
-
138
- {item.maxStackSize && item.maxStackSize !== 1 && (
139
- <StackInfo>
140
- x{item.stackQty ?? 1}({item.maxStackSize})
141
- </StackInfo>
142
- )}
143
-
144
- {renderMissingStatistic().length > 0 && (
145
- <MissingStatistics>
146
- <Statistic>Equipped Diff</Statistic>
147
- {itemToCompare && renderMissingStatistic()}
148
- </MissingStatistics>
149
- )}
150
- </Container>
151
- );
152
- };
153
-
154
- const Container = styled.div<{ item: IItem }>`
155
- color: white;
156
- background-color: #222;
157
- border-radius: 5px;
158
- padding: 0.5rem;
159
- width: max-content;
160
- font-size: ${uiFonts.size.small};
161
- border: 3px solid ${({ item }) => rarityColor(item) ?? uiColors.lightGray};
162
- `;
163
-
164
- const Title = styled.div`
165
- font-size: ${uiFonts.size.medium};
166
- font-weight: bold;
167
- margin-bottom: 0.5rem;
168
- display: flex;
169
- align-items: center;
170
- margin: 0;
171
- `;
172
-
173
- const Rarity = styled.div<{ item: IItem }>`
174
- font-size: ${uiFonts.size.small};
175
- font-weight: normal;
176
- margin-top: 0.2rem;
177
- color: ${({ item }) => rarityColor(item)};
178
- filter: brightness(1.5);
179
- `;
180
-
181
- const Type = styled.div`
182
- font-size: ${uiFonts.size.small};
183
- margin-top: 0.2rem;
184
- color: ${uiColors.lightGray};
185
- `;
186
-
187
- const Statistic = styled.div`
188
- margin-bottom: 0.4rem;
189
-
190
- .label {
191
- display: inline-block;
192
- margin-right: 0.5rem;
193
- color: inherit;
194
- }
195
-
196
- .value {
197
- display: inline-block;
198
- color: inherit;
199
- }
200
-
201
- &.better,
202
- .better {
203
- color: ${uiColors.lightGreen};
204
- }
205
-
206
- &.worse,
207
- .worse {
208
- color: ${uiColors.cardinal};
209
- }
210
- `;
211
-
212
- const Description = styled.div`
213
- margin-top: 1.5rem;
214
- font-size: ${uiFonts.size.small};
215
- color: ${uiColors.lightGray};
216
- font-style: italic;
217
- width: max-content;
218
- max-width: 20rem;
219
- `;
220
-
221
- const Header = styled.div`
222
- display: flex;
223
- align-items: center;
224
- justify-content: space-between;
225
- margin-bottom: 0.5rem;
226
- `;
227
-
228
- const AllowedSlots = styled.div`
229
- display: flex;
230
- align-items: center;
231
- justify-content: center;
232
- flex-wrap: wrap;
233
- gap: 0.5rem;
234
- margin-left: 2rem;
235
- `;
236
-
237
- const StackInfo = styled.div`
238
- width: 100%;
239
- text-align: right;
240
- font-size: ${uiFonts.size.small};
241
- color: ${uiColors.orange};
242
- margin-top: 1rem;
243
- `;
244
-
245
- const MissingStatistics = styled.div`
246
- margin-top: 1rem;
247
- color: ${uiColors.cardinal};
248
- `;
@@ -1,123 +0,0 @@
1
- import { IEquipmentSet, IItem } from '@rpg-engine/shared';
2
- import { camelCase } from 'lodash';
3
- import React, { useMemo } from 'react';
4
- import styled from 'styled-components';
5
- import { ItemInfo } from './ItemInfo';
6
-
7
- export interface IItemInfoDisplayProps {
8
- item: IItem;
9
- atlasIMG: any;
10
- atlasJSON: any;
11
- equipmentSet?: IEquipmentSet | null;
12
- isMobile?: boolean;
13
- }
14
-
15
- type EquipmentSlotTypes =
16
- | 'head'
17
- | 'neck'
18
- | 'leftHand'
19
- | 'rightHand'
20
- | 'ring'
21
- | 'legs'
22
- | 'boot'
23
- | 'accessory'
24
- | 'armor'
25
- | 'inventory';
26
-
27
- const itemSlotTypes: EquipmentSlotTypes[] = [
28
- 'head',
29
- 'neck',
30
- 'leftHand',
31
- 'rightHand',
32
- 'ring',
33
- 'legs',
34
- 'boot',
35
- 'accessory',
36
- 'armor',
37
- 'inventory',
38
- ];
39
-
40
- const getSlotType = (
41
- itemSlotTypes: string[],
42
- slotType: string,
43
- subType: string
44
- ): keyof IEquipmentSet => {
45
- if (!itemSlotTypes.includes(slotType)) {
46
- return subType as keyof IEquipmentSet;
47
- }
48
- return slotType as keyof IEquipmentSet;
49
- };
50
-
51
- export const ItemInfoDisplay: React.FC<IItemInfoDisplayProps> = ({
52
- item,
53
- atlasIMG,
54
- atlasJSON,
55
- equipmentSet,
56
- isMobile,
57
- }) => {
58
- const itemToCompare = useMemo(() => {
59
- if (equipmentSet && item.allowedEquipSlotType?.length) {
60
- const allowedSlotTypeCamelCase = camelCase(item.allowedEquipSlotType[0]);
61
- const itemSubTypeCamelCase = camelCase(item.subType);
62
-
63
- const slotType = getSlotType(
64
- itemSlotTypes,
65
- allowedSlotTypeCamelCase,
66
- itemSubTypeCamelCase
67
- );
68
-
69
- const itemFromEquipment = equipmentSet[slotType] as IItem;
70
-
71
- if (
72
- itemFromEquipment &&
73
- (!item._id || itemFromEquipment._id !== item._id)
74
- ) {
75
- return itemFromEquipment;
76
- }
77
- }
78
-
79
- return undefined;
80
- }, [equipmentSet, item]);
81
-
82
- return (
83
- <Flex $isMobile={isMobile}>
84
- <ItemInfo
85
- item={item}
86
- itemToCompare={itemToCompare}
87
- atlasIMG={atlasIMG}
88
- atlasJSON={atlasJSON}
89
- />
90
-
91
- {itemToCompare && (
92
- <CompareContainer>
93
- <Equipped>
94
- <span>Equipped</span>
95
- </Equipped>
96
- <ItemInfo
97
- item={itemToCompare}
98
- itemToCompare={item}
99
- atlasIMG={atlasIMG}
100
- atlasJSON={atlasJSON}
101
- />
102
- </CompareContainer>
103
- )}
104
- </Flex>
105
- );
106
- };
107
-
108
- const Flex = styled.div<{ $isMobile?: boolean }>`
109
- display: flex;
110
- gap: 0.5rem;
111
- flex-direction: ${({ $isMobile }) => ($isMobile ? 'row-reverse' : 'row')};
112
- `;
113
-
114
- const Equipped = styled.div`
115
- position: absolute;
116
- bottom: 100%;
117
- left: 50%;
118
- transform: translateX(-50%);
119
- `;
120
-
121
- const CompareContainer = styled.div`
122
- position: relative;
123
- `;
@@ -1,62 +0,0 @@
1
- import { IEquipmentSet, IItem } from '@rpg-engine/shared';
2
- import React, { useState } from 'react';
3
- import { ItemTooltip } from './ItemTooltip';
4
- import { MobileItemTooltip } from './MobileItemTooltip';
5
-
6
- interface IItemInfoWrapperProps {
7
- item: IItem;
8
- children: React.ReactNode;
9
- atlasIMG: any;
10
- atlasJSON: any;
11
- equipmentSet?: IEquipmentSet | null;
12
- scale?: number;
13
- }
14
-
15
- export const ItemInfoWrapper: React.FC<IItemInfoWrapperProps> = ({
16
- children,
17
- atlasIMG,
18
- atlasJSON,
19
- item,
20
- equipmentSet,
21
- scale,
22
- }) => {
23
- const [isTooltipVisible, setIsTooltipVisible] = useState(false);
24
- const [isTooltipMobileVisible, setIsTooltipMobileVisible] = useState(false);
25
-
26
- return (
27
- <div
28
- onMouseEnter={() => {
29
- if (!isTooltipMobileVisible) setIsTooltipVisible(true);
30
- }}
31
- onMouseLeave={setIsTooltipVisible.bind(null, false)}
32
- onTouchEnd={() => {
33
- setIsTooltipMobileVisible(true);
34
- setIsTooltipVisible(false);
35
- }}
36
- >
37
- {children}
38
-
39
- {isTooltipVisible && !isTooltipMobileVisible && (
40
- <ItemTooltip
41
- atlasIMG={atlasIMG}
42
- atlasJSON={atlasJSON}
43
- equipmentSet={equipmentSet}
44
- item={item}
45
- />
46
- )}
47
- {isTooltipMobileVisible && (
48
- <MobileItemTooltip
49
- atlasIMG={atlasIMG}
50
- atlasJSON={atlasJSON}
51
- equipmentSet={equipmentSet}
52
- closeTooltip={() => {
53
- setIsTooltipMobileVisible(false);
54
- console.log('close');
55
- }}
56
- item={item}
57
- scale={scale}
58
- />
59
- )}
60
- </div>
61
- );
62
- };
@@ -1,105 +0,0 @@
1
- import { IEquipmentSet, IItem } from '@rpg-engine/shared';
2
- import React, { useEffect, useRef } from 'react';
3
- import styled from 'styled-components';
4
- import { uiColors } from '../../../constants/uiColors';
5
- import { ItemInfoDisplay } from './ItemInfoDisplay';
6
-
7
- interface IListMenuOption {
8
- id: string;
9
- text: string;
10
- }
11
-
12
- export interface MobileItemTooltipProps {
13
- item: IItem;
14
- atlasIMG: any;
15
- atlasJSON: any;
16
- closeTooltip: () => void;
17
- equipmentSet?: IEquipmentSet | null;
18
- scale?: number;
19
- options?: IListMenuOption[];
20
- onSelected?: (selectedOptionId: string) => void;
21
- }
22
-
23
- export const MobileItemTooltip: React.FC<MobileItemTooltipProps> = ({
24
- item,
25
- atlasIMG,
26
- atlasJSON,
27
- closeTooltip,
28
- equipmentSet,
29
- scale = 1,
30
- options,
31
- onSelected,
32
- }) => {
33
- const ref = useRef<HTMLDivElement>(null);
34
-
35
- useEffect(() => {
36
- const { current } = ref;
37
-
38
- if (current) {
39
- // Adjust the position to be on whole window
40
- const rect = current.getBoundingClientRect();
41
-
42
- const x = (-rect.x * 100) / (scale * 100);
43
- const y = (-rect.y * 100) / (scale * 100);
44
-
45
- current.style.transform = `translate(${x}px, ${y}px)`;
46
- current.style.opacity = '1';
47
- }
48
-
49
- return;
50
- }, []);
51
-
52
- return (
53
- <Container
54
- ref={ref}
55
- onTouchEnd={e => {
56
- e.stopPropagation();
57
- closeTooltip();
58
- }}
59
- scale={scale}
60
- >
61
- <ItemInfoDisplay
62
- item={item}
63
- atlasIMG={atlasIMG}
64
- atlasJSON={atlasJSON}
65
- equipmentSet={equipmentSet}
66
- isMobile
67
- />
68
- <OptionsContainer>
69
- {options?.map(option => (
70
- <Option key={option.id} onTouchEnd={() => onSelected?.(option.id)}>
71
- {option.text}
72
- </Option>
73
- ))}
74
- </OptionsContainer>
75
- </Container>
76
- );
77
- };
78
-
79
- const Container = styled.div<{ scale: number }>`
80
- position: fixed;
81
- z-index: 50;
82
- left: 0;
83
- top: 0;
84
- opacity: 0;
85
- width: ${({ scale }) => `calc(100vw * 100 / ${scale * 100})`};
86
- height: ${({ scale }) => `calc(100vh * 100 / ${scale * 100})`};
87
- background-color: rgba(0 0 0 / 0.5);
88
- display: flex;
89
- justify-content: center;
90
- align-items: center;
91
- `;
92
-
93
- const OptionsContainer = styled.div`
94
- display: flex;
95
- flex-direction: column;
96
- margin-left: 2rem;
97
- gap: 1rem;
98
- `;
99
-
100
- const Option = styled.button`
101
- padding: 1rem;
102
- background-color: ${uiColors.lightGray};
103
- border: none;
104
- border-radius: 3px;
105
- `;
@@ -1,33 +0,0 @@
1
- import { Story } from '@storybook/react';
2
- import React from 'react';
3
- import {
4
- IItemInfoDisplayProps,
5
- ItemInfoDisplay,
6
- } from '../components/Item/Cards/ItemInfoDisplay';
7
- import { RPGUIRoot } from '../components/RPGUIRoot';
8
- import atlasJSON from '../mocks/atlas/items/items.json';
9
- import atlasIMG from '../mocks/atlas/items/items.png';
10
- import { equipmentSetMock } from '../mocks/equipmentSet.mocks';
11
- import { items } from '../mocks/itemContainer.mocks';
12
-
13
- export default {
14
- title: 'Item info',
15
- component: ItemInfoDisplay,
16
- };
17
-
18
- const Template: Story<IItemInfoDisplayProps> = args => (
19
- <RPGUIRoot>
20
- <div style={{ margin: '2rem' }}>
21
- <ItemInfoDisplay {...args} />
22
- </div>
23
- </RPGUIRoot>
24
- );
25
-
26
- export const Default = Template.bind({});
27
-
28
- Default.args = {
29
- item: items[0],
30
- atlasIMG: atlasIMG,
31
- atlasJSON: atlasJSON,
32
- equipmentSet: equipmentSetMock,
33
- };