@rpg-engine/long-bow 0.3.77 → 0.3.78

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 +3 -1
  4. package/dist/components/Item/Cards/ItemInfo.d.ts +10 -0
  5. package/dist/components/Item/Cards/ItemInfoDisplay.d.ts +10 -0
  6. package/dist/components/Item/Cards/ItemInfoWrapper.d.ts +12 -0
  7. package/dist/components/Item/Cards/ItemTooltip.d.ts +7 -4
  8. package/dist/components/Item/Cards/MobileItemTooltip.d.ts +18 -0
  9. package/dist/components/Item/Inventory/ItemContainer.d.ts +2 -1
  10. package/dist/components/Item/Inventory/ItemSlot.d.ts +4 -1
  11. package/dist/components/TradingMenu/TradingItemRow.d.ts +3 -1
  12. package/dist/components/TradingMenu/TradingMenu.d.ts +6 -4
  13. package/dist/components/shared/SpriteFromAtlas.d.ts +1 -0
  14. package/dist/long-bow.cjs.development.js +1404 -1009
  15. package/dist/long-bow.cjs.development.js.map +1 -1
  16. package/dist/long-bow.cjs.production.min.js +1 -1
  17. package/dist/long-bow.cjs.production.min.js.map +1 -1
  18. package/dist/long-bow.esm.js +1406 -1013
  19. package/dist/long-bow.esm.js.map +1 -1
  20. package/dist/stories/ItemInfoDisplay.stories.d.ts +8 -0
  21. package/dist/stories/TradingMenu.stories.d.ts +2 -2
  22. package/package.json +100 -100
  23. package/src/components/Abstractions/SlotsContainer.tsx +45 -45
  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 +96 -96
  35. package/src/components/CharacterStatus/CharacterStatus.tsx +120 -120
  36. package/src/components/Chat/Chat.tsx +195 -195
  37. package/src/components/Chatdeprecated/ChatDeprecated.tsx +198 -198
  38. package/src/components/CheckButton.tsx +65 -65
  39. package/src/components/CircularController/CircularController.tsx +248 -248
  40. package/src/components/CraftBook/CraftBook.tsx +240 -227
  41. package/src/components/CraftBook/MockItems.ts +77 -251
  42. package/src/components/DraggableContainer.tsx +153 -153
  43. package/src/components/Dropdown.tsx +90 -90
  44. package/src/components/DropdownSelectorContainer.tsx +42 -42
  45. package/src/components/Equipment/EquipmentSet.tsx +190 -190
  46. package/src/components/HistoryDialog.tsx +104 -104
  47. package/src/components/Input.tsx +15 -15
  48. package/src/components/Item/Cards/ItemInfo.tsx +252 -0
  49. package/src/components/Item/Cards/ItemInfoDisplay.tsx +128 -0
  50. package/src/components/Item/Cards/ItemInfoWrapper.tsx +62 -0
  51. package/src/components/Item/Cards/ItemTooltip.tsx +85 -33
  52. package/src/components/Item/Cards/MobileItemTooltip.tsx +134 -0
  53. package/src/components/Item/Inventory/ErrorBoundary.tsx +42 -42
  54. package/src/components/Item/Inventory/ItemContainer.tsx +214 -210
  55. package/src/components/Item/Inventory/ItemContainerTypes.ts +6 -6
  56. package/src/components/Item/Inventory/ItemQuantitySelector.tsx +138 -138
  57. package/src/components/Item/Inventory/ItemSlot.tsx +540 -501
  58. package/src/components/Item/Inventory/itemContainerHelper.ts +156 -156
  59. package/src/components/ListMenu.tsx +63 -63
  60. package/src/components/Multitab/Tab.tsx +66 -66
  61. package/src/components/Multitab/TabBody.tsx +13 -13
  62. package/src/components/Multitab/TabsContainer.tsx +97 -97
  63. package/src/components/NPCDialog/NPCDialog.tsx +121 -121
  64. package/src/components/NPCDialog/NPCDialogText.tsx +113 -113
  65. package/src/components/NPCDialog/NPCMultiDialog.tsx +159 -159
  66. package/src/components/NPCDialog/QuestionDialog/QuestionDialog.tsx +237 -237
  67. package/src/components/ProgressBar.tsx +92 -92
  68. package/src/components/PropertySelect/PropertySelect.tsx +106 -106
  69. package/src/components/QuestInfo/QuestInfo.tsx +230 -230
  70. package/src/components/QuestList.tsx +129 -129
  71. package/src/components/RPGUIContainer.tsx +47 -47
  72. package/src/components/RPGUIForceRenderStart.tsx +45 -45
  73. package/src/components/RPGUIRoot.tsx +14 -14
  74. package/src/components/RadioButton.tsx +53 -53
  75. package/src/components/RadioInput/RadioButton.tsx +96 -96
  76. package/src/components/RadioInput/RadioInput.tsx +102 -102
  77. package/src/components/RadioInput/instruments.ts +15 -15
  78. package/src/components/RangeSlider.tsx +78 -78
  79. package/src/components/RelativeListMenu.tsx +83 -83
  80. package/src/components/ScrollList.tsx +79 -79
  81. package/src/components/Shortcuts/Shortcuts.tsx +151 -151
  82. package/src/components/Shortcuts/ShortcutsSetter.tsx +132 -132
  83. package/src/components/Shortcuts/SingleShortcut.ts +62 -62
  84. package/src/components/SimpleProgressBar.tsx +62 -62
  85. package/src/components/SkillProgressBar.tsx +133 -133
  86. package/src/components/SkillsContainer.tsx +200 -200
  87. package/src/components/Spellbook/Spell.tsx +201 -201
  88. package/src/components/Spellbook/Spellbook.tsx +150 -150
  89. package/src/components/Spellbook/constants.ts +8 -8
  90. package/src/components/Spellbook/mockSpells.ts +60 -60
  91. package/src/components/StaticBook/StaticBook.tsx +103 -103
  92. package/src/components/TextArea.tsx +11 -11
  93. package/src/components/TimeWidget/DayNightPeriod/DayNightPeriod.tsx +35 -35
  94. package/src/components/TimeWidget/TimeWidget.tsx +63 -63
  95. package/src/components/TradingMenu/TradingItemRow.tsx +198 -181
  96. package/src/components/TradingMenu/TradingMenu.tsx +215 -203
  97. package/src/components/TradingMenu/items.mock.ts +48 -96
  98. package/src/components/Truncate.tsx +25 -25
  99. package/src/components/itemSelector/ItemSelector.tsx +136 -136
  100. package/src/components/shared/Column.tsx +16 -16
  101. package/src/components/shared/Ellipsis.tsx +65 -65
  102. package/src/components/shared/SpriteFromAtlas.tsx +104 -102
  103. package/src/components/typography/DynamicText.tsx +49 -49
  104. package/src/constants/uiColors.ts +20 -20
  105. package/src/constants/uiDevices.ts +3 -3
  106. package/src/constants/uiFonts.ts +12 -12
  107. package/src/hooks/useEventListener.ts +21 -21
  108. package/src/hooks/useOutsideAlerter.ts +25 -25
  109. package/src/index.tsx +40 -40
  110. package/src/libs/StringHelpers.ts +3 -3
  111. package/src/mocks/atlas/entities/entities.json +20215 -20215
  112. package/src/mocks/atlas/icons/icons.json +735 -735
  113. package/src/mocks/atlas/items/items.json +12086 -12086
  114. package/src/mocks/equipmentSet.mocks.ts +391 -393
  115. package/src/mocks/itemContainer.mocks.ts +563 -562
  116. package/src/mocks/skills.mocks.ts +128 -128
  117. package/src/stories/Arrow.stories.tsx +26 -26
  118. package/src/stories/Button.stories.tsx +36 -36
  119. package/src/stories/CharacterSelection.stories.tsx +45 -45
  120. package/src/stories/CharacterStatus.stories.tsx +29 -29
  121. package/src/stories/Chat.stories.tsx +187 -187
  122. package/src/stories/ChatDeprecated.stories.tsx +170 -170
  123. package/src/stories/CheckButton.stories.tsx +48 -48
  124. package/src/stories/CircullarController.stories.tsx +37 -37
  125. package/src/stories/CraftBook.stories.tsx +42 -40
  126. package/src/stories/DayNightPeriod.stories.tsx +27 -27
  127. package/src/stories/DraggableContainer.stories.tsx +28 -28
  128. package/src/stories/Dropdown.stories.tsx +46 -46
  129. package/src/stories/DropdownSelectorContainer.stories.tsx +41 -41
  130. package/src/stories/EquipmentSet.stories.tsx +65 -65
  131. package/src/stories/HistoryDialog.stories.tsx +61 -61
  132. package/src/stories/ItemContainer.stories.tsx +200 -198
  133. package/src/stories/ItemInfoDisplay.stories.tsx +33 -0
  134. package/src/stories/ItemQuantitySelector.stories.tsx +26 -26
  135. package/src/stories/ItemSelector.stories.tsx +77 -77
  136. package/src/stories/ItemTradingComponent.stories.tsx +35 -35
  137. package/src/stories/ListMenu.stories.tsx +56 -56
  138. package/src/stories/Multitab.stories.tsx +51 -51
  139. package/src/stories/NPCDialog.stories.tsx +130 -130
  140. package/src/stories/NPCMultiDialog.stories.tsx +71 -71
  141. package/src/stories/ProgressBar.stories.tsx +23 -23
  142. package/src/stories/PropertySelect.stories.tsx +40 -40
  143. package/src/stories/QuestInfo.stories.tsx +107 -107
  144. package/src/stories/QuestList.stories.tsx +82 -82
  145. package/src/stories/RPGUIContainers.stories.tsx +42 -42
  146. package/src/stories/RadioButton.stories.tsx +49 -49
  147. package/src/stories/RadioInput.stories.tsx +34 -34
  148. package/src/stories/RangeSlider.stories.tsx +64 -64
  149. package/src/stories/ScrollList.stories.tsx +85 -85
  150. package/src/stories/Shortcuts.stories.tsx +39 -39
  151. package/src/stories/SimpleProgressBar.stories.tsx +22 -22
  152. package/src/stories/SkillProgressBar.stories.tsx +34 -34
  153. package/src/stories/SkillsContainer.stories.tsx +35 -35
  154. package/src/stories/Spellbook.stories.tsx +104 -104
  155. package/src/stories/StaticBook.stories.tsx +32 -32
  156. package/src/stories/Text.stories.tsx +42 -42
  157. package/src/stories/TimeWidget.stories.tsx +27 -27
  158. package/src/stories/TradingMenu.stories.tsx +47 -45
  159. package/src/types/eventTypes.ts +4 -4
  160. package/src/types/index.d.ts +2 -2
@@ -1,251 +1,77 @@
1
- import { ICraftableItem } from '@rpg-engine/shared';
2
-
3
- export const craftableItems: ICraftableItem[] = [
4
- {
5
- key: 'bandana',
6
- name: 'Bandana',
7
- canCraft: true,
8
- texturePath: 'accessories/bandana.png',
9
- ingredients: [
10
- {
11
- key: 'leather',
12
- name: 'leather',
13
- qty: 10,
14
- texturePath: 'crafting-resources/leather.png',
15
- },
16
- ],
17
- },
18
- {
19
- key: 'bandana1',
20
- name: 'Bandana',
21
- canCraft: true,
22
- texturePath: 'accessories/bandana.png',
23
- ingredients: [
24
- {
25
- key: 'leather',
26
- name: 'leather',
27
- qty: 10,
28
- texturePath: 'crafting-resources/leather.png',
29
- },
30
- ],
31
- },
32
- {
33
- key: 'bandana2',
34
- name: 'Bandana',
35
- canCraft: true,
36
- texturePath: 'accessories/bandana.png',
37
- ingredients: [
38
- {
39
- key: 'leather',
40
- name: 'leather',
41
- qty: 10,
42
- texturePath: 'crafting-resources/leather.png',
43
- },
44
- ],
45
- }, {
46
- key: 'bandana',
47
- name: 'Bandana',
48
- canCraft: true,
49
- texturePath: 'accessories/bandana.png',
50
- ingredients: [
51
- {
52
- key: 'leather',
53
- name: 'leather',
54
- qty: 10,
55
- texturePath: 'crafting-resources/leather.png',
56
- },
57
- ],
58
- },
59
- {
60
- key: 'bandana1',
61
- name: 'Bandana',
62
- canCraft: true,
63
- texturePath: 'accessories/bandana.png',
64
- ingredients: [
65
- {
66
- key: 'leather',
67
- name: 'leather',
68
- qty: 10,
69
- texturePath: 'crafting-resources/leather.png',
70
- },
71
- ],
72
- },
73
- {
74
- key: 'bandana2',
75
- name: 'Bandana',
76
- canCraft: true,
77
- texturePath: 'accessories/bandana.png',
78
- ingredients: [
79
- {
80
- key: 'leather',
81
- name: 'leather',
82
- qty: 10,
83
- texturePath: 'crafting-resources/leather.png',
84
- },
85
- ],
86
- }, {
87
- key: 'bandana',
88
- name: 'Bandana',
89
- canCraft: true,
90
- texturePath: 'accessories/bandana.png',
91
- ingredients: [
92
- {
93
- key: 'leather',
94
- name: 'leather',
95
- qty: 10,
96
- texturePath: 'crafting-resources/leather.png',
97
- },
98
- ],
99
- },
100
- {
101
- key: 'bandana1',
102
- name: 'Bandana',
103
- canCraft: true,
104
- texturePath: 'accessories/bandana.png',
105
- ingredients: [
106
- {
107
- key: 'leather',
108
- name: 'leather',
109
- qty: 10,
110
- texturePath: 'crafting-resources/leather.png',
111
- },
112
- ],
113
- },
114
- {
115
- key: 'bandana2',
116
- name: 'Bandana',
117
- canCraft: true,
118
- texturePath: 'accessories/bandana.png',
119
- ingredients: [
120
- {
121
- key: 'leather',
122
- name: 'leather',
123
- qty: 10,
124
- texturePath: 'crafting-resources/leather.png',
125
- },
126
- ],
127
- }, {
128
- key: 'bandana',
129
- name: 'Bandana',
130
- canCraft: true,
131
- texturePath: 'accessories/bandana.png',
132
- ingredients: [
133
- {
134
- key: 'leather',
135
- name: 'leather',
136
- qty: 10,
137
- texturePath: 'crafting-resources/leather.png',
138
- },
139
- ],
140
- },
141
- {
142
- key: 'bandana1',
143
- name: 'Bandana',
144
- canCraft: true,
145
- texturePath: 'accessories/bandana.png',
146
- ingredients: [
147
- {
148
- key: 'leather',
149
- name: 'leather',
150
- qty: 10,
151
- texturePath: 'crafting-resources/leather.png',
152
- },
153
- ],
154
- },
155
- {
156
- key: 'bandana2',
157
- name: 'Bandana',
158
- canCraft: true,
159
- texturePath: 'accessories/bandana.png',
160
- ingredients: [
161
- {
162
- key: 'leather',
163
- name: 'leather',
164
- qty: 10,
165
- texturePath: 'crafting-resources/leather.png',
166
- },
167
- ],
168
- }, {
169
- key: 'bandana',
170
- name: 'Bandana',
171
- canCraft: true,
172
- texturePath: 'accessories/bandana.png',
173
- ingredients: [
174
- {
175
- key: 'leather',
176
- name: 'leather',
177
- qty: 10,
178
- texturePath: 'crafting-resources/leather.png',
179
- },
180
- ],
181
- },
182
- {
183
- key: 'bandana1',
184
- name: 'Bandana',
185
- canCraft: true,
186
- texturePath: 'accessories/bandana.png',
187
- ingredients: [
188
- {
189
- key: 'leather',
190
- name: 'leather',
191
- qty: 10,
192
- texturePath: 'crafting-resources/leather.png',
193
- },
194
- ],
195
- },
196
- {
197
- key: 'bandana2',
198
- name: 'Bandana',
199
- canCraft: true,
200
- texturePath: 'accessories/bandana.png',
201
- ingredients: [
202
- {
203
- key: 'leather',
204
- name: 'leather',
205
- qty: 10,
206
- texturePath: 'crafting-resources/leather.png',
207
- },
208
- ],
209
- }, {
210
- key: 'bandana',
211
- name: 'Bandana',
212
- canCraft: true,
213
- texturePath: 'accessories/bandana.png',
214
- ingredients: [
215
- {
216
- key: 'leather',
217
- name: 'leather',
218
- qty: 10,
219
- texturePath: 'crafting-resources/leather.png',
220
- },
221
- ],
222
- },
223
- {
224
- key: 'bandana1',
225
- name: 'Bandana',
226
- canCraft: true,
227
- texturePath: 'accessories/bandana.png',
228
- ingredients: [
229
- {
230
- key: 'leather',
231
- name: 'leather',
232
- qty: 10,
233
- texturePath: 'crafting-resources/leather.png',
234
- },
235
- ],
236
- },
237
- {
238
- key: 'bandana2',
239
- name: 'Bandana',
240
- canCraft: true,
241
- texturePath: 'accessories/bandana.png',
242
- ingredients: [
243
- {
244
- key: 'leather',
245
- name: 'leather',
246
- qty: 10,
247
- texturePath: 'crafting-resources/leather.png',
248
- },
249
- ],
250
- },
251
- ];
1
+ import { ICraftableItem } from '@rpg-engine/shared';
2
+ import { items } from '../../mocks/itemContainer.mocks';
3
+
4
+ export const craftableItems: ICraftableItem[] = [
5
+ {
6
+ ...items[0],
7
+ canCraft: true,
8
+ ingredients: [
9
+ {
10
+ key: 'leather',
11
+ name: 'leather',
12
+ qty: 10,
13
+ texturePath: 'crafting-resources/leather.png',
14
+ },
15
+ ],
16
+ },
17
+ {
18
+ ...items[1],
19
+ canCraft: true,
20
+ ingredients: [
21
+ {
22
+ key: 'leather',
23
+ name: 'leather',
24
+ qty: 10,
25
+ texturePath: 'crafting-resources/leather.png',
26
+ },
27
+ ],
28
+ },
29
+ {
30
+ ...items[2],
31
+ canCraft: true,
32
+ ingredients: [
33
+ {
34
+ key: 'leather',
35
+ name: 'leather',
36
+ qty: 10,
37
+ texturePath: 'crafting-resources/leather.png',
38
+ },
39
+ ],
40
+ },
41
+ {
42
+ ...items[0],
43
+ canCraft: true,
44
+ ingredients: [
45
+ {
46
+ key: 'leather',
47
+ name: 'leather',
48
+ qty: 10,
49
+ texturePath: 'crafting-resources/leather.png',
50
+ },
51
+ ],
52
+ },
53
+ {
54
+ ...items[1],
55
+ canCraft: true,
56
+ ingredients: [
57
+ {
58
+ key: 'leather',
59
+ name: 'leather',
60
+ qty: 10,
61
+ texturePath: 'crafting-resources/leather.png',
62
+ },
63
+ ],
64
+ },
65
+ {
66
+ ...items[2],
67
+ canCraft: true,
68
+ ingredients: [
69
+ {
70
+ key: 'leather',
71
+ name: 'leather',
72
+ qty: 10,
73
+ texturePath: 'crafting-resources/leather.png',
74
+ },
75
+ ],
76
+ },
77
+ ];
@@ -1,153 +1,153 @@
1
- import React, { useEffect, useRef } from 'react';
2
- import Draggable, { DraggableData } from 'react-draggable';
3
- import styled from 'styled-components';
4
- import { uiFonts } from '../constants/uiFonts';
5
- import { useOutsideClick } from '../hooks/useOutsideAlerter';
6
- import { IPosition } from '../types/eventTypes';
7
- import { RPGUIContainerTypes } from './RPGUIContainer';
8
-
9
- export interface IDraggableContainerProps {
10
- children: React.ReactNode;
11
- width?: string;
12
- height?: string;
13
- className?: string;
14
- type?: RPGUIContainerTypes;
15
- title?: string;
16
- imgSrc?: string;
17
- imgWidth?: string;
18
- onCloseButton?: () => void;
19
- cancelDrag?: string;
20
- onPositionChange?: (position: IPosition) => void;
21
- onOutsideClick?: () => void;
22
- initialPosition?: IPosition;
23
- }
24
-
25
- export const DraggableContainer: React.FC<IDraggableContainerProps> = ({
26
- children,
27
- width = '50%',
28
- height,
29
- className,
30
- type = RPGUIContainerTypes.FramedGold,
31
- onCloseButton,
32
- title,
33
- imgSrc,
34
- imgWidth = '20px',
35
- cancelDrag,
36
- onPositionChange,
37
- onOutsideClick,
38
- initialPosition = { x: 0, y: 0 },
39
- }) => {
40
- const draggableRef = useRef(null);
41
-
42
- useOutsideClick(draggableRef, 'item-container');
43
-
44
- useEffect(() => {
45
- document.addEventListener('clickOutside', event => {
46
- const e = event as CustomEvent;
47
-
48
- if (e.detail.id === 'item-container') {
49
- if (onOutsideClick) {
50
- onOutsideClick();
51
- }
52
- }
53
- });
54
-
55
- return () => {
56
- document.removeEventListener('clickOutside', _e => {});
57
- };
58
- }, []);
59
-
60
- return (
61
- <Draggable
62
- cancel={`.container-close,${cancelDrag}`}
63
- onDrag={(_e, data: DraggableData) => {
64
- if (onPositionChange) {
65
- onPositionChange({
66
- x: data.x,
67
- y: data.y,
68
- });
69
- }
70
- }}
71
- defaultPosition={initialPosition}
72
- >
73
- <Container
74
- ref={draggableRef}
75
- width={width}
76
- height={height || 'auto'}
77
- className={`rpgui-container ${type} ${className}`}
78
- >
79
- {title && (
80
- <TitleContainer className="drag-handler">
81
- <Title>
82
- {imgSrc && <Icon src={imgSrc} width={imgWidth} />}
83
- {title}
84
- </Title>
85
- </TitleContainer>
86
- )}
87
- {onCloseButton && (
88
- <CloseButton
89
- className="container-close"
90
- onPointerDown={onCloseButton}
91
- >
92
- X
93
- </CloseButton>
94
- )}
95
-
96
- {children}
97
- </Container>
98
- </Draggable>
99
- );
100
- };
101
-
102
- interface IContainerProps {
103
- width: string;
104
- height: string;
105
- }
106
-
107
- const Container = styled.div<IContainerProps>`
108
- height: ${props => props.height};
109
- width: ${({ width }) => width};
110
- display: flex;
111
- flex-wrap: wrap;
112
- image-rendering: pixelated;
113
-
114
- &.rpgui-container {
115
- padding-top: 1.5rem;
116
- }
117
- `;
118
-
119
- const CloseButton = styled.div`
120
- position: absolute;
121
- top: 3px;
122
- right: 0px;
123
- color: white;
124
- z-index: 22;
125
- font-size: 1.1rem;
126
- `;
127
-
128
- const TitleContainer = styled.div`
129
- width: 100%;
130
- height: 100%;
131
- display: flex;
132
- flex-wrap: wrap;
133
- justify-content: flex-start;
134
- align-items: center;
135
- `;
136
-
137
- const Title = styled.h1`
138
- color: white;
139
- z-index: 22;
140
- font-size: ${uiFonts.size.large};
141
- `;
142
-
143
- interface ICustomIconProps {
144
- width: string;
145
- }
146
-
147
- const Icon = styled.img`
148
- color: white;
149
- z-index: 22;
150
- font-size: ${uiFonts.size.xsmall};
151
- width: ${(props: ICustomIconProps) => props.width};
152
- margin-right: 0.5rem;
153
- `;
1
+ import React, { useEffect, useRef } from 'react';
2
+ import Draggable, { DraggableData } from 'react-draggable';
3
+ import styled from 'styled-components';
4
+ import { uiFonts } from '../constants/uiFonts';
5
+ import { useOutsideClick } from '../hooks/useOutsideAlerter';
6
+ import { IPosition } from '../types/eventTypes';
7
+ import { RPGUIContainerTypes } from './RPGUIContainer';
8
+
9
+ export interface IDraggableContainerProps {
10
+ children: React.ReactNode;
11
+ width?: string;
12
+ height?: string;
13
+ className?: string;
14
+ type?: RPGUIContainerTypes;
15
+ title?: string;
16
+ imgSrc?: string;
17
+ imgWidth?: string;
18
+ onCloseButton?: () => void;
19
+ cancelDrag?: string;
20
+ onPositionChange?: (position: IPosition) => void;
21
+ onOutsideClick?: () => void;
22
+ initialPosition?: IPosition;
23
+ }
24
+
25
+ export const DraggableContainer: React.FC<IDraggableContainerProps> = ({
26
+ children,
27
+ width = '50%',
28
+ height,
29
+ className,
30
+ type = RPGUIContainerTypes.FramedGold,
31
+ onCloseButton,
32
+ title,
33
+ imgSrc,
34
+ imgWidth = '20px',
35
+ cancelDrag,
36
+ onPositionChange,
37
+ onOutsideClick,
38
+ initialPosition = { x: 0, y: 0 },
39
+ }) => {
40
+ const draggableRef = useRef(null);
41
+
42
+ useOutsideClick(draggableRef, 'item-container');
43
+
44
+ useEffect(() => {
45
+ document.addEventListener('clickOutside', event => {
46
+ const e = event as CustomEvent;
47
+
48
+ if (e.detail.id === 'item-container') {
49
+ if (onOutsideClick) {
50
+ onOutsideClick();
51
+ }
52
+ }
53
+ });
54
+
55
+ return () => {
56
+ document.removeEventListener('clickOutside', _e => {});
57
+ };
58
+ }, []);
59
+
60
+ return (
61
+ <Draggable
62
+ cancel={`.container-close,${cancelDrag}`}
63
+ onDrag={(_e, data: DraggableData) => {
64
+ if (onPositionChange) {
65
+ onPositionChange({
66
+ x: data.x,
67
+ y: data.y,
68
+ });
69
+ }
70
+ }}
71
+ defaultPosition={initialPosition}
72
+ >
73
+ <Container
74
+ ref={draggableRef}
75
+ width={width}
76
+ height={height || 'auto'}
77
+ className={`rpgui-container ${type} ${className}`}
78
+ >
79
+ {title && (
80
+ <TitleContainer className="drag-handler">
81
+ <Title>
82
+ {imgSrc && <Icon src={imgSrc} width={imgWidth} />}
83
+ {title}
84
+ </Title>
85
+ </TitleContainer>
86
+ )}
87
+ {onCloseButton && (
88
+ <CloseButton
89
+ className="container-close"
90
+ onPointerDown={onCloseButton}
91
+ >
92
+ X
93
+ </CloseButton>
94
+ )}
95
+
96
+ {children}
97
+ </Container>
98
+ </Draggable>
99
+ );
100
+ };
101
+
102
+ interface IContainerProps {
103
+ width: string;
104
+ height: string;
105
+ }
106
+
107
+ const Container = styled.div<IContainerProps>`
108
+ height: ${props => props.height};
109
+ width: ${({ width }) => width};
110
+ display: flex;
111
+ flex-wrap: wrap;
112
+ image-rendering: pixelated;
113
+
114
+ &.rpgui-container {
115
+ padding-top: 1.5rem;
116
+ }
117
+ `;
118
+
119
+ const CloseButton = styled.div`
120
+ position: absolute;
121
+ top: 3px;
122
+ right: 0px;
123
+ color: white;
124
+ z-index: 22;
125
+ font-size: 1.1rem;
126
+ `;
127
+
128
+ const TitleContainer = styled.div`
129
+ width: 100%;
130
+ height: 100%;
131
+ display: flex;
132
+ flex-wrap: wrap;
133
+ justify-content: flex-start;
134
+ align-items: center;
135
+ `;
136
+
137
+ const Title = styled.h1`
138
+ color: white;
139
+ z-index: 22;
140
+ font-size: ${uiFonts.size.large};
141
+ `;
142
+
143
+ interface ICustomIconProps {
144
+ width: string;
145
+ }
146
+
147
+ const Icon = styled.img`
148
+ color: white;
149
+ z-index: 22;
150
+ font-size: ${uiFonts.size.xsmall};
151
+ width: ${(props: ICustomIconProps) => props.width};
152
+ margin-right: 0.5rem;
153
+ `;