@rpg-engine/long-bow 0.3.71 → 0.3.73

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 (158) hide show
  1. package/LICENSE +20 -20
  2. package/README.md +181 -181
  3. package/dist/components/CraftBook/CraftBook.d.ts +1 -2
  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 -2
  8. package/dist/components/TradingMenu/TradingMenu.d.ts +3 -4
  9. package/dist/components/shared/SpriteFromAtlas.d.ts +0 -1
  10. package/dist/long-bow.cjs.development.js +958 -1225
  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 +961 -1226
  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 -237
  36. package/src/components/CraftBook/MockItems.ts +251 -41
  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 -512
  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 -198
  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 -195
  87. package/src/components/TradingMenu/TradingMenu.tsx +203 -211
  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 -9
  153. package/dist/components/Item/Cards/ItemInfoWrapper.d.ts +0 -11
  154. package/dist/stories/ItemInfoDisplay.stories.d.ts +0 -8
  155. package/src/components/Item/Cards/ItemInfo.tsx +0 -248
  156. package/src/components/Item/Cards/ItemInfoDisplay.tsx +0 -120
  157. package/src/components/Item/Cards/ItemInfoWrapper.tsx +0 -39
  158. package/src/stories/ItemInfoDisplay.stories.tsx +0 -33
@@ -1,41 +1,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
- ];
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,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
+ `;