@rpg-engine/long-bow 0.1.23 → 0.1.26

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.
@@ -1,13 +1,16 @@
1
1
  import React from 'react';
2
+ import { IQuestionDialog, IQuestionDialogAnswer } from '..';
2
3
  export declare enum NPCDialogType {
3
4
  TextOnly = "TextOnly",
4
- TextAndThumbnail = "TextAndThumbnail",
5
- QuestionAndText = "QuestionAndText"
5
+ TextAndThumbnail = "TextAndThumbnail"
6
6
  }
7
7
  export interface INPCDialogProps {
8
- text: string;
8
+ text?: string;
9
9
  type: NPCDialogType;
10
10
  imagePath?: string;
11
11
  onClose?: () => void;
12
+ isQuestionDialog: boolean;
13
+ answers?: IQuestionDialogAnswer[];
14
+ questions?: IQuestionDialog[];
12
15
  }
13
16
  export declare const NPCDialog: React.FC<INPCDialogProps>;
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ export interface IQuestionDialogAnswer {
3
+ id: number;
4
+ text: string;
5
+ nextQuestionId?: number;
6
+ }
7
+ export interface IQuestionDialog {
8
+ id: number;
9
+ text: string;
10
+ answerIds?: number[];
11
+ }
12
+ export interface IProps {
13
+ questions: IQuestionDialog[];
14
+ answers: IQuestionDialogAnswer[];
15
+ onClose: () => void;
16
+ }
17
+ export declare const QuestionDialog: React.FC<IProps>;
@@ -3,6 +3,7 @@ interface IProps {
3
3
  type: 'framed' | 'framed-golden' | 'framed-golden-2' | 'framed-grey';
4
4
  children: React.ReactNode;
5
5
  width?: string;
6
+ height?: string;
6
7
  }
7
8
  export declare const RPGUIContainer: React.FC<IProps>;
8
9
  export {};
@@ -0,0 +1,9 @@
1
+ import React from 'react';
2
+ import 'rpgui/rpgui.min.css';
3
+ import 'rpgui/rpgui.min.js';
4
+ interface IProps {
5
+ children: React.ReactNode;
6
+ }
7
+ export declare const _RPGUI: any;
8
+ export declare const RPGUIRoot: React.FC<IProps>;
9
+ export {};
@@ -0,0 +1,13 @@
1
+ import React from 'react';
2
+ export declare enum SliderType {
3
+ Slider = "rpgui-slider",
4
+ GoldSlider = "rpgui-slider golden"
5
+ }
6
+ export interface ISliderProps {
7
+ type: SliderType;
8
+ valueMin: number;
9
+ valueMax: number;
10
+ width: string;
11
+ onChange: (value: number) => void;
12
+ }
13
+ export declare const RPGUISlider: React.FC<ISliderProps>;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ export interface IListMenuProps {
3
+ x: number;
4
+ y: number;
5
+ options: [{
6
+ id: string;
7
+ text: string;
8
+ }];
9
+ onSelected: (selectedOptionId: string) => void;
10
+ }
11
+ export declare const ListMenu: React.FC<IListMenuProps>;
package/dist/index.d.ts CHANGED
@@ -1,4 +1,8 @@
1
+ export * from './components/ListMenu';
2
+ export { useEventListener } from './hooks/useEventListener';
1
3
  export * from './NPCDialog/NPCDialog';
2
- export * from './RPGUI/RPGUI';
4
+ export * from './NPCDialog/QuestionDialog/QuestionDialog';
3
5
  export * from './RPGUI/RPGUIContainer';
6
+ export * from './RPGUI/RPGUIRoot';
7
+ export * from './RPGUI/RPGUISlider';
4
8
  export * from './typography/DynamicText';
@@ -7,30 +7,89 @@ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'defau
7
7
  var React = require('react');
8
8
  var React__default = _interopDefault(React);
9
9
  var styled = _interopDefault(require('styled-components'));
10
- require('rpgui/rpgui.css');
11
- require('rpgui/rpgui.js');
10
+ require('rpgui/rpgui.min.css');
11
+ require('rpgui/rpgui.min.js');
12
+ var uuid = require('uuid');
12
13
 
13
- var RPGUI = function RPGUI(_ref) {
14
+ var _RPGUI = RPGUI;
15
+ var RPGUIRoot = function RPGUIRoot(_ref) {
14
16
  var children = _ref.children;
15
17
  return React__default.createElement("div", {
16
18
  className: "rpgui-content"
17
19
  }, children);
18
20
  };
19
21
 
22
+ var ListMenu = function ListMenu(_ref) {
23
+ var options = _ref.options,
24
+ onSelected = _ref.onSelected,
25
+ x = _ref.x,
26
+ y = _ref.y;
27
+ return React__default.createElement(RPGUIRoot, null, React__default.createElement(Container, {
28
+ x: x,
29
+ y: y
30
+ }, React__default.createElement("ul", {
31
+ className: "rpgui-list-imp",
32
+ style: {
33
+ overflow: 'hidden'
34
+ }
35
+ }, options.map(function (params) {
36
+ return React__default.createElement("li", {
37
+ key: params.text,
38
+ onClick: function onClick() {
39
+ onSelected(params.id);
40
+ }
41
+ }, params.text);
42
+ }))));
43
+ };
44
+ var Container = /*#__PURE__*/styled.div.withConfig({
45
+ displayName: "ListMenu__Container",
46
+ componentId: "sc-i9097t-0"
47
+ })(["display:flex;flex-direction:column;width:100%;justify-content:start;align-items:flex-start;position:absolute;top:", "px;left:", "px;"], function (props) {
48
+ return props.y || 0;
49
+ }, function (props) {
50
+ return props.x || 0;
51
+ });
52
+
53
+ var useEventListener = function useEventListener(type, handler, el) {
54
+ if (el === void 0) {
55
+ el = window;
56
+ }
57
+
58
+ var savedHandler = React__default.useRef();
59
+ React__default.useEffect(function () {
60
+ savedHandler.current = handler;
61
+ }, [handler]);
62
+ React__default.useEffect(function () {
63
+ //@ts-ignore
64
+ var listener = function listener(e) {
65
+ return savedHandler.current(e);
66
+ };
67
+
68
+ el.addEventListener(type, listener);
69
+ return function () {
70
+ el.removeEventListener(type, listener);
71
+ };
72
+ }, [type, el]);
73
+ };
74
+
20
75
  var RPGUIContainer = function RPGUIContainer(_ref) {
21
76
  var children = _ref.children,
22
77
  type = _ref.type,
23
78
  _ref$width = _ref.width,
24
- width = _ref$width === void 0 ? '50%' : _ref$width;
25
- return React__default.createElement(Container, {
79
+ width = _ref$width === void 0 ? '50%' : _ref$width,
80
+ height = _ref.height;
81
+ return React__default.createElement(Container$1, {
26
82
  width: width,
83
+ height: height || 'auto',
27
84
  className: "rpgui-container " + type
28
85
  }, children);
29
86
  };
30
- var Container = /*#__PURE__*/styled.div.withConfig({
87
+ var Container$1 = /*#__PURE__*/styled.div.withConfig({
31
88
  displayName: "RPGUIContainer__Container",
32
89
  componentId: "sc-3xvrxc-0"
33
- })(["max-width:", ";"], function (_ref2) {
90
+ })(["height:", ";width:", ";display:flex;flex-wrap:wrap;"], function (props) {
91
+ return props.height;
92
+ }, function (_ref2) {
34
93
  var width = _ref2.width;
35
94
  return width;
36
95
  });
@@ -82,7 +141,7 @@ var DynamicText = function DynamicText(_ref) {
82
141
  var TextContainer = /*#__PURE__*/styled.p.withConfig({
83
142
  displayName: "DynamicText__TextContainer",
84
143
  componentId: "sc-acj2q5-0"
85
- })(["font-size:0.7rem !important;color:white;text-shadow:1px 1px 0px #000000;letter-spacing:1.2px;"]);
144
+ })(["font-size:0.7rem !important;color:white;text-shadow:1px 1px 0px #000000;letter-spacing:1.2px;word-break:normal;"]);
86
145
 
87
146
  var NPCDialogText = function NPCDialogText(_ref) {
88
147
  var text = _ref.text,
@@ -116,45 +175,246 @@ var NPCDialogText = function NPCDialogText(_ref) {
116
175
  return document.removeEventListener('keydown', onHandleSpacePress);
117
176
  };
118
177
  }, [chunkIndex]);
119
- return React__default.createElement(Container$1, null, React__default.createElement(DynamicText, {
178
+ return React__default.createElement(Container$2, null, React__default.createElement(DynamicText, {
120
179
  text: (textChunks == null ? void 0 : textChunks[chunkIndex]) || '',
121
180
  onFinish: onEndStep,
122
181
  onStart: onStartStep
123
182
  }));
124
183
  };
125
- var Container$1 = /*#__PURE__*/styled.div.withConfig({
184
+ var Container$2 = /*#__PURE__*/styled.div.withConfig({
126
185
  displayName: "NPCDialogText__Container",
127
186
  componentId: "sc-ahseq0-0"
128
187
  })([""]);
129
188
 
189
+ var QuestionDialog = function QuestionDialog(_ref) {
190
+ var questions = _ref.questions,
191
+ answers = _ref.answers,
192
+ onClose = _ref.onClose;
193
+
194
+ var _useState = React.useState(questions[0]),
195
+ currentQuestion = _useState[0],
196
+ setCurrentQuestion = _useState[1];
197
+
198
+ var _useState2 = React.useState(false),
199
+ canShowAnswers = _useState2[0],
200
+ setCanShowAnswers = _useState2[1];
201
+
202
+ var onGetFirstAnswer = function onGetFirstAnswer() {
203
+ if (!currentQuestion.answerIds || currentQuestion.answerIds.length === 0) {
204
+ return null;
205
+ }
206
+
207
+ var firstAnswerId = currentQuestion.answerIds[0];
208
+ return answers.find(function (answer) {
209
+ return answer.id === firstAnswerId;
210
+ });
211
+ };
212
+
213
+ var _useState3 = React.useState(onGetFirstAnswer()),
214
+ currentAnswer = _useState3[0],
215
+ setCurrentAnswer = _useState3[1];
216
+
217
+ React.useEffect(function () {
218
+ setCurrentAnswer(onGetFirstAnswer());
219
+ }, [currentQuestion]);
220
+
221
+ var onGetAnswers = function onGetAnswers(answerIds) {
222
+ return answerIds.map(function (answerId) {
223
+ return answers.find(function (answer) {
224
+ return answer.id === answerId;
225
+ });
226
+ });
227
+ };
228
+
229
+ var onKeyPress = function onKeyPress(e) {
230
+ switch (e.key) {
231
+ case 'ArrowDown':
232
+ // select next answer, if any.
233
+ // if no next answer, select first answer
234
+ // const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(
235
+ // (answer) => answer?.id === currentAnswer!.id + 1
236
+ // );
237
+ var nextAnswerIndex = onGetAnswers(currentQuestion.answerIds).findIndex(function (answer) {
238
+ return (answer == null ? void 0 : answer.id) === currentAnswer.id + 1;
239
+ });
240
+ var nextAnswerID = currentQuestion.answerIds[nextAnswerIndex]; // console.log(nextAnswerIndex);
241
+
242
+ var nextAnswer = onGetAnswers(currentQuestion.answerIds).find(function (answer) {
243
+ return (answer == null ? void 0 : answer.id) === nextAnswerID;
244
+ });
245
+ setCurrentAnswer(nextAnswer || onGetFirstAnswer());
246
+ break;
247
+
248
+ case 'ArrowUp':
249
+ // select previous answer, if any.
250
+ // if no previous answer, select last answer
251
+ var previousAnswerIndex = onGetAnswers(currentQuestion.answerIds).findIndex(function (answer) {
252
+ return (answer == null ? void 0 : answer.id) === currentAnswer.id - 1;
253
+ });
254
+ var previousAnswerID = currentQuestion.answerIds && currentQuestion.answerIds[previousAnswerIndex];
255
+ var previousAnswer = onGetAnswers(currentQuestion.answerIds).find(function (answer) {
256
+ return (answer == null ? void 0 : answer.id) === previousAnswerID;
257
+ });
258
+
259
+ if (previousAnswer) {
260
+ setCurrentAnswer(previousAnswer);
261
+ } else {
262
+ setCurrentAnswer(onGetAnswers(currentQuestion.answerIds).pop());
263
+ }
264
+
265
+ break;
266
+
267
+ case 'Enter':
268
+ setCanShowAnswers(false);
269
+
270
+ if (!(currentAnswer != null && currentAnswer.nextQuestionId)) {
271
+ onClose();
272
+ return;
273
+ } else {
274
+ setCurrentQuestion(questions.find(function (question) {
275
+ return question.id === currentAnswer.nextQuestionId;
276
+ }));
277
+ }
278
+
279
+ break;
280
+ }
281
+ };
282
+
283
+ useEventListener('keydown', onKeyPress);
284
+
285
+ var onAnswerClick = function onAnswerClick(answer) {
286
+ setCanShowAnswers(false);
287
+
288
+ if (answer.nextQuestionId) {
289
+ // if there is a next question, go to it
290
+ setCurrentQuestion(questions.find(function (question) {
291
+ return question.id === answer.nextQuestionId;
292
+ }));
293
+ } else {
294
+ // else, finish dialog!
295
+ onClose();
296
+ }
297
+ };
298
+
299
+ var onRenderCurrentAnswers = function onRenderCurrentAnswers() {
300
+ var answerIds = currentQuestion.answerIds;
301
+
302
+ if (!answerIds) {
303
+ return null;
304
+ }
305
+
306
+ var answers = onGetAnswers(answerIds);
307
+
308
+ if (!answers) {
309
+ return null;
310
+ }
311
+
312
+ return answers.map(function (answer) {
313
+ var isSelected = (currentAnswer == null ? void 0 : currentAnswer.id) === (answer == null ? void 0 : answer.id);
314
+ var selectedColor = isSelected ? 'yellow' : 'white';
315
+
316
+ if (answer) {
317
+ return React__default.createElement(AnswerRow, {
318
+ key: "answer_" + answer.id
319
+ }, React__default.createElement(AnswerSelectedIcon, {
320
+ color: selectedColor
321
+ }, isSelected ? 'X' : null), React__default.createElement(Answer, {
322
+ key: answer.id,
323
+ onClick: function onClick() {
324
+ return onAnswerClick(answer);
325
+ },
326
+ color: selectedColor
327
+ }, answer.text));
328
+ }
329
+
330
+ return null;
331
+ });
332
+ };
333
+
334
+ return React__default.createElement(Container$3, null, React__default.createElement(QuestionContainer, null, React__default.createElement(DynamicText, {
335
+ text: currentQuestion.text,
336
+ onStart: function onStart() {
337
+ return setCanShowAnswers(false);
338
+ },
339
+ onFinish: function onFinish() {
340
+ return setCanShowAnswers(true);
341
+ }
342
+ })), canShowAnswers && React__default.createElement(AnswersContainer, null, onRenderCurrentAnswers()));
343
+ };
344
+ var Container$3 = /*#__PURE__*/styled.div.withConfig({
345
+ displayName: "QuestionDialog__Container",
346
+ componentId: "sc-15nvgq5-0"
347
+ })(["display:flex;word-break:break-all;box-sizing:border-box;justify-content:flex-start;align-items:flex-start;flex-wrap:wrap;"]);
348
+ var QuestionContainer = /*#__PURE__*/styled.div.withConfig({
349
+ displayName: "QuestionDialog__QuestionContainer",
350
+ componentId: "sc-15nvgq5-1"
351
+ })(["flex:100%;width:100%;"]);
352
+ var AnswersContainer = /*#__PURE__*/styled.div.withConfig({
353
+ displayName: "QuestionDialog__AnswersContainer",
354
+ componentId: "sc-15nvgq5-2"
355
+ })(["flex:100%;"]);
356
+ var Answer = /*#__PURE__*/styled.p.withConfig({
357
+ displayName: "QuestionDialog__Answer",
358
+ componentId: "sc-15nvgq5-3"
359
+ })(["flex:auto;color:", " !important;font-size:0.65rem !important;background:inherit;border:none;"], function (props) {
360
+ return props.color;
361
+ });
362
+ var AnswerSelectedIcon = /*#__PURE__*/styled.span.withConfig({
363
+ displayName: "QuestionDialog__AnswerSelectedIcon",
364
+ componentId: "sc-15nvgq5-4"
365
+ })(["flex:5% 0 0;color:", " !important;"], function (props) {
366
+ return props.color;
367
+ });
368
+ var AnswerRow = /*#__PURE__*/styled.div.withConfig({
369
+ displayName: "QuestionDialog__AnswerRow",
370
+ componentId: "sc-15nvgq5-5"
371
+ })(["display:flex;flex-wrap:wrap;justify-content:center;align-items:center;margin-bottom:0.5rem;height:22px;p{line-height:unset;margin-top:0;margin-bottom:0rem;}"]);
372
+
130
373
  (function (NPCDialogType) {
131
374
  NPCDialogType["TextOnly"] = "TextOnly";
132
375
  NPCDialogType["TextAndThumbnail"] = "TextAndThumbnail";
133
- NPCDialogType["QuestionAndText"] = "QuestionAndText";
134
376
  })(exports.NPCDialogType || (exports.NPCDialogType = {}));
135
377
 
136
378
  var NPCDialog = function NPCDialog(_ref) {
137
379
  var text = _ref.text,
138
380
  type = _ref.type,
139
381
  _onClose = _ref.onClose,
140
- imagePath = _ref.imagePath;
382
+ imagePath = _ref.imagePath,
383
+ _ref$isQuestionDialog = _ref.isQuestionDialog,
384
+ isQuestionDialog = _ref$isQuestionDialog === void 0 ? false : _ref$isQuestionDialog,
385
+ questions = _ref.questions,
386
+ answers = _ref.answers;
141
387
 
142
388
  var _useState = React.useState(false),
143
389
  showGoNextIndicator = _useState[0],
144
390
  setShowGoNextIndicator = _useState[1];
145
391
 
146
- return React__default.createElement(RPGUI, null, React__default.createElement(RPGUIContainer, {
147
- type: "framed-golden"
148
- }, React__default.createElement(Container$2, null, React__default.createElement(TextContainer$1, {
392
+ return React__default.createElement(RPGUIRoot, null, React__default.createElement(RPGUIContainer, {
393
+ type: "framed-golden",
394
+ width: isQuestionDialog ? '600px' : '50%',
395
+ height: '180px'
396
+ }, isQuestionDialog && questions && answers ? React__default.createElement(React__default.Fragment, null, React__default.createElement(TextContainer$1, {
397
+ flex: type === exports.NPCDialogType.TextAndThumbnail ? '70%' : '100%'
398
+ }, React__default.createElement(QuestionDialog, {
399
+ questions: questions,
400
+ answers: answers,
401
+ onClose: function onClose() {
402
+ if (_onClose) {
403
+ _onClose();
404
+ }
405
+ }
406
+ })), type === exports.NPCDialogType.TextAndThumbnail && React__default.createElement(ThumbnailContainer, null, React__default.createElement(NPCThumbnail, {
407
+ src: imagePath || img
408
+ }))) : React__default.createElement(React__default.Fragment, null, React__default.createElement(Container$4, null, React__default.createElement(TextContainer$1, {
149
409
  flex: type === exports.NPCDialogType.TextAndThumbnail ? '70%' : '100%'
150
- }, type === exports.NPCDialogType.QuestionAndText ? React__default.createElement("p", null, "QUESTIONS AQUI!") : React__default.createElement(NPCDialogText, {
410
+ }, React__default.createElement(NPCDialogText, {
151
411
  onStartStep: function onStartStep() {
152
412
  return setShowGoNextIndicator(false);
153
413
  },
154
414
  onEndStep: function onEndStep() {
155
415
  return setShowGoNextIndicator(true);
156
416
  },
157
- text: text,
417
+ text: text || 'No text provided.',
158
418
  onClose: function onClose() {
159
419
  if (_onClose) {
160
420
  _onClose();
@@ -165,12 +425,12 @@ var NPCDialog = function NPCDialog(_ref) {
165
425
  }))), showGoNextIndicator && React__default.createElement(PressSpaceIndicator, {
166
426
  right: type === exports.NPCDialogType.TextOnly ? '1rem' : '10.5rem',
167
427
  src: img$1
168
- })));
428
+ }))));
169
429
  };
170
- var Container$2 = /*#__PURE__*/styled.div.withConfig({
430
+ var Container$4 = /*#__PURE__*/styled.div.withConfig({
171
431
  displayName: "NPCDialog__Container",
172
432
  componentId: "sc-omm2zk-0"
173
- })(["display:flex;width:100%;height:125px;box-sizing:border-box;justify-content:center;align-items:flex-start;position:relative;"]);
433
+ })(["display:flex;width:100%;height:100%;box-sizing:border-box;justify-content:center;align-items:flex-start;position:relative;"]);
174
434
  var TextContainer$1 = /*#__PURE__*/styled.div.withConfig({
175
435
  displayName: "NPCDialog__TextContainer",
176
436
  componentId: "sc-omm2zk-1"
@@ -194,8 +454,67 @@ var PressSpaceIndicator = /*#__PURE__*/styled.img.withConfig({
194
454
  return right;
195
455
  });
196
456
 
457
+ (function (SliderType) {
458
+ SliderType["Slider"] = "rpgui-slider";
459
+ SliderType["GoldSlider"] = "rpgui-slider golden";
460
+ })(exports.SliderType || (exports.SliderType = {}));
461
+
462
+ var RPGUISlider = function RPGUISlider(_ref) {
463
+ var type = _ref.type,
464
+ valueMin = _ref.valueMin,
465
+ valueMax = _ref.valueMax,
466
+ width = _ref.width,
467
+ onChange = _ref.onChange;
468
+ var sliderId = uuid.v4();
469
+
470
+ var _useState = React.useState(false),
471
+ wasMouseDownFirst = _useState[0],
472
+ setWasMouseDownFirst = _useState[1];
473
+
474
+ useEventListener('mouseup', function () {
475
+ if (wasMouseDownFirst) {
476
+ onHandleMouseUp();
477
+ }
478
+
479
+ setWasMouseDownFirst(false);
480
+ });
481
+
482
+ var onHandleMouseUp = function onHandleMouseUp() {
483
+ var rpguiSlider = document.getElementById("rpgui-slider-" + sliderId);
484
+
485
+ var value = _RPGUI.get_value(rpguiSlider);
486
+
487
+ onChange(Number(value));
488
+ };
489
+
490
+ return React__default.createElement(RPGUIRoot, null, React__default.createElement("div", {
491
+ onMouseUp: onHandleMouseUp,
492
+ onMouseDown: function onMouseDown() {
493
+ return setWasMouseDownFirst(true);
494
+ }
495
+ }, React__default.createElement(Input, {
496
+ className: type === exports.SliderType.Slider ? exports.SliderType.Slider : exports.SliderType.GoldSlider,
497
+ type: "range",
498
+ style: {
499
+ width: width
500
+ },
501
+ min: valueMin,
502
+ max: valueMax,
503
+ id: "rpgui-slider-" + sliderId
504
+ })));
505
+ };
506
+ var Input = /*#__PURE__*/styled.input.withConfig({
507
+ displayName: "RPGUISlider__Input",
508
+ componentId: "sc-1sjghaz-0"
509
+ })(["opacity:0;"]);
510
+
197
511
  exports.DynamicText = DynamicText;
512
+ exports.ListMenu = ListMenu;
198
513
  exports.NPCDialog = NPCDialog;
199
- exports.RPGUI = RPGUI;
514
+ exports.QuestionDialog = QuestionDialog;
200
515
  exports.RPGUIContainer = RPGUIContainer;
516
+ exports.RPGUIRoot = RPGUIRoot;
517
+ exports.RPGUISlider = RPGUISlider;
518
+ exports._RPGUI = _RPGUI;
519
+ exports.useEventListener = useEventListener;
201
520
  //# sourceMappingURL=long-bow.cjs.development.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"long-bow.cjs.development.js","sources":["../src/RPGUI/RPGUI.tsx","../src/RPGUI/RPGUIContainer.tsx","../src/NPCDialog/img/npcDialog/npcThumbnails/alice.png","../src/NPCDialog/img/space.gif","../src/libs/StringHelpers.ts","../src/typography/DynamicText.tsx","../src/NPCDialog/NPCDialogText.tsx","../src/NPCDialog/NPCDialog.tsx"],"sourcesContent":["import React from 'react';\nimport 'rpgui/rpgui.css';\nimport 'rpgui/rpgui.js';\n\ninterface IProps {\n children: React.ReactNode;\n}\n\nexport const RPGUI: React.FC<IProps> = ({ children }) => {\n return <div className=\"rpgui-content\">{children}</div>;\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n type: 'framed' | 'framed-golden' | 'framed-golden-2' | 'framed-grey';\n children: React.ReactNode;\n width?: string;\n}\n\nexport const RPGUIContainer: React.FC<IProps> = ({\n children,\n type,\n width = '50%',\n}) => {\n return (\n <Container width={width} className={`rpgui-container ${type}`}>\n {children}\n </Container>\n );\n};\n\ninterface IContainerProps {\n width: string;\n}\n\nconst Container = styled.div<IContainerProps>`\n max-width: ${({ width }) => width};\n`;\n","const img = require('./alice.png'); export default img;","const img = require('./space.gif'); export default img;","export const chunkString = (str: string, length: number) => {\n return str.match(new RegExp('.{1,' + length + '}', 'g'));\n};\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n text: string;\n onFinish?: () => void;\n onStart?: () => void;\n}\n\nexport const DynamicText: React.FC<IProps> = ({ text, onFinish, onStart }) => {\n const [textState, setTextState] = useState<string>('');\n\n useEffect(() => {\n let i = 0;\n const interval = setInterval(() => {\n // on every interval, show one more character\n\n if (i === 0) {\n if (onStart) {\n onStart();\n }\n }\n\n if (i < text.length) {\n setTextState(text.substring(0, i + 1));\n i++;\n } else {\n clearInterval(interval);\n if (onFinish) {\n onFinish();\n }\n }\n }, 50);\n\n return () => {\n clearInterval(interval);\n };\n }, [text]);\n\n return <TextContainer>{textState}</TextContainer>;\n};\n\nconst TextContainer = styled.p`\n font-size: 0.7rem !important;\n color: white;\n text-shadow: 1px 1px 0px #000000;\n letter-spacing: 1.2px;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { chunkString } from '../libs/StringHelpers';\nimport { DynamicText } from '../typography/DynamicText';\n\ninterface IProps {\n text: string;\n onClose: () => void;\n onEndStep: () => void;\n onStartStep: () => void;\n}\n\nexport const NPCDialogText: React.FC<IProps> = ({\n text,\n onClose,\n onEndStep,\n onStartStep,\n}) => {\n const textChunks = chunkString(text, 85);\n\n const [chunkIndex, setChunkIndex] = useState<number>(0);\n\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n const hasNextChunk = textChunks?.[chunkIndex + 1] || false;\n\n if (hasNextChunk) {\n setChunkIndex((prev) => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [chunkIndex]);\n\n return (\n <Container>\n <DynamicText\n text={textChunks?.[chunkIndex] || ''}\n onFinish={onEndStep}\n onStart={onStartStep}\n />\n </Container>\n );\n};\n\nconst Container = styled.div``;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { RPGUI } from '../RPGUI/RPGUI';\nimport { RPGUIContainer } from '../RPGUI/RPGUIContainer';\nimport aliceDefaultThumbnail from './img/npcDialog/npcThumbnails/alice.png';\nimport pressSpaceGif from './img/space.gif';\nimport { NPCDialogText } from './NPCDialogText';\n\nexport enum NPCDialogType {\n TextOnly = 'TextOnly',\n TextAndThumbnail = 'TextAndThumbnail',\n QuestionAndText = 'QuestionAndText',\n}\n\nexport interface INPCDialogProps {\n text: string;\n type: NPCDialogType;\n imagePath?: string;\n onClose?: () => void;\n}\n\nexport const NPCDialog: React.FC<INPCDialogProps> = ({\n text,\n type,\n onClose,\n imagePath,\n}) => {\n const [showGoNextIndicator, setShowGoNextIndicator] =\n useState<boolean>(false);\n\n return (\n <RPGUI>\n <RPGUIContainer type=\"framed-golden\">\n <Container>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n {type === NPCDialogType.QuestionAndText ? (\n <p>QUESTIONS AQUI!</p>\n ) : (\n <NPCDialogText\n onStartStep={() => setShowGoNextIndicator(false)}\n onEndStep={() => setShowGoNextIndicator(true)}\n text={text}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n )}\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </Container>\n {showGoNextIndicator && (\n <PressSpaceIndicator\n right={type === NPCDialogType.TextOnly ? '1rem' : '10.5rem'}\n src={pressSpaceGif}\n />\n )}\n </RPGUIContainer>\n </RPGUI>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: 125px;\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n position: relative;\n`;\n\ninterface ITextContainerProps {\n flex: string;\n}\n\nconst TextContainer = styled.div<ITextContainerProps>`\n flex: ${({ flex }) => flex} 0 0;\n width: 355px;\n`;\n\nconst ThumbnailContainer = styled.div`\n flex: 30% 0 0;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst NPCThumbnail = styled.img`\n image-rendering: pixelated;\n height: 128px;\n width: 128px;\n`;\n\ninterface IPressSpaceIndicatorProps {\n right: string;\n}\n\nconst PressSpaceIndicator = styled.img<IPressSpaceIndicatorProps>`\n position: absolute;\n right: ${({ right }) => right};\n bottom: 1rem;\n height: 20.7px;\n image-rendering: -webkit-optimize-contrast;\n`;\n"],"names":["RPGUI","children","React","className","RPGUIContainer","type","width","Container","styled","div","img","chunkString","str","length","match","RegExp","DynamicText","text","onFinish","onStart","useState","textState","setTextState","useEffect","i","interval","setInterval","substring","clearInterval","TextContainer","p","NPCDialogText","onClose","onEndStep","onStartStep","textChunks","chunkIndex","setChunkIndex","onHandleSpacePress","event","code","hasNextChunk","prev","document","addEventListener","removeEventListener","NPCDialogType","NPCDialog","imagePath","showGoNextIndicator","setShowGoNextIndicator","flex","TextAndThumbnail","QuestionAndText","ThumbnailContainer","NPCThumbnail","src","aliceDefaultThumbnail","PressSpaceIndicator","right","TextOnly","pressSpaceGif"],"mappings":"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"}
1
+ {"version":3,"file":"long-bow.cjs.development.js","sources":["../src/RPGUI/RPGUIRoot.tsx","../src/components/ListMenu.tsx","../src/hooks/useEventListener.ts","../src/RPGUI/RPGUIContainer.tsx","../src/NPCDialog/img/npcDialog/npcThumbnails/alice.png","../src/NPCDialog/img/space.gif","../src/libs/StringHelpers.ts","../src/typography/DynamicText.tsx","../src/NPCDialog/NPCDialogText.tsx","../src/NPCDialog/QuestionDialog/QuestionDialog.tsx","../src/NPCDialog/NPCDialog.tsx","../src/RPGUI/RPGUISlider.tsx"],"sourcesContent":["import React from 'react';\nimport 'rpgui/rpgui.min.css';\nimport 'rpgui/rpgui.min.js';\n\ninterface IProps {\n children: React.ReactNode;\n}\n\n//@ts-ignore\nexport const _RPGUI = RPGUI;\n\nexport const RPGUIRoot: React.FC<IProps> = ({ children }) => {\n return <div className=\"rpgui-content\">{children}</div>;\n};\n","import React from 'react';\nimport styled from 'styled-components';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\n\nexport interface IListMenuProps {\n x: number;\n y: number;\n options: [\n {\n id: string;\n text: string;\n }\n ];\n onSelected: (selectedOptionId: string) => void;\n}\n\nexport const ListMenu: React.FC<IListMenuProps> = ({\n options,\n onSelected,\n x,\n y,\n}) => {\n return (\n <RPGUIRoot>\n <Container x={x} y={y}>\n <ul className=\"rpgui-list-imp\" style={{ overflow: 'hidden' }}>\n {options.map((params) => (\n <li\n key={params.text}\n onClick={() => {\n onSelected(params.id);\n }}\n >\n {params.text}\n </li>\n ))}\n </ul>\n </Container>\n </RPGUIRoot>\n );\n};\n\ninterface IContainerProps {\n x?: number;\n y?: number;\n}\n\nconst Container = styled.div<IContainerProps>`\n display: flex;\n flex-direction: column;\n width: 100%;\n justify-content: start;\n align-items: flex-start;\n position: absolute;\n top: ${(props) => props.y || 0}px;\n left: ${(props) => props.x || 0}px;\n`;\n","import React from 'react';\n\n//@ts-ignore\nexport const useEventListener = (type, handler, el = window) => {\n const savedHandler = React.useRef();\n\n React.useEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n\n React.useEffect(() => {\n //@ts-ignore\n const listener = (e) => savedHandler.current(e);\n\n el.addEventListener(type, listener);\n\n return () => {\n el.removeEventListener(type, listener);\n };\n }, [type, el]);\n};\n","import React from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n type: 'framed' | 'framed-golden' | 'framed-golden-2' | 'framed-grey';\n children: React.ReactNode;\n width?: string;\n height?: string;\n}\n\nexport const RPGUIContainer: React.FC<IProps> = ({\n children,\n type,\n width = '50%',\n height,\n}) => {\n return (\n <Container\n width={width}\n height={height || 'auto'}\n className={`rpgui-container ${type}`}\n >\n {children}\n </Container>\n );\n};\n\ninterface IContainerProps {\n width: string;\n height: string;\n}\n\nconst Container = styled.div<IContainerProps>`\n height: ${(props) => props.height};\n width: ${({ width }) => width};\n display: flex;\n flex-wrap: wrap;\n`;\n","const img = require('./alice.png'); export default img;","const img = require('./space.gif'); export default img;","export const chunkString = (str: string, length: number) => {\n return str.match(new RegExp('.{1,' + length + '}', 'g'));\n};\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\n\ninterface IProps {\n text: string;\n onFinish?: () => void;\n onStart?: () => void;\n}\n\nexport const DynamicText: React.FC<IProps> = ({ text, onFinish, onStart }) => {\n const [textState, setTextState] = useState<string>('');\n\n useEffect(() => {\n let i = 0;\n const interval = setInterval(() => {\n // on every interval, show one more character\n\n if (i === 0) {\n if (onStart) {\n onStart();\n }\n }\n\n if (i < text.length) {\n setTextState(text.substring(0, i + 1));\n i++;\n } else {\n clearInterval(interval);\n if (onFinish) {\n onFinish();\n }\n }\n }, 50);\n\n return () => {\n clearInterval(interval);\n };\n }, [text]);\n\n return <TextContainer>{textState}</TextContainer>;\n};\n\nconst TextContainer = styled.p`\n font-size: 0.7rem !important;\n color: white;\n text-shadow: 1px 1px 0px #000000;\n letter-spacing: 1.2px;\n word-break: normal;\n`;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { chunkString } from '../libs/StringHelpers';\nimport { DynamicText } from '../typography/DynamicText';\n\ninterface IProps {\n text: string;\n onClose: () => void;\n onEndStep: () => void;\n onStartStep: () => void;\n}\n\nexport const NPCDialogText: React.FC<IProps> = ({\n text,\n onClose,\n onEndStep,\n onStartStep,\n}) => {\n const textChunks = chunkString(text, 85);\n\n const [chunkIndex, setChunkIndex] = useState<number>(0);\n\n const onHandleSpacePress = (event: KeyboardEvent) => {\n if (event.code === 'Space') {\n const hasNextChunk = textChunks?.[chunkIndex + 1] || false;\n\n if (hasNextChunk) {\n setChunkIndex((prev) => prev + 1);\n } else {\n // if there's no more text chunks, close the dialog\n onClose();\n }\n }\n };\n\n useEffect(() => {\n document.addEventListener('keydown', onHandleSpacePress);\n\n return () => document.removeEventListener('keydown', onHandleSpacePress);\n }, [chunkIndex]);\n\n return (\n <Container>\n <DynamicText\n text={textChunks?.[chunkIndex] || ''}\n onFinish={onEndStep}\n onStart={onStartStep}\n />\n </Container>\n );\n};\n\nconst Container = styled.div``;\n","import React, { useEffect, useState } from 'react';\nimport styled from 'styled-components';\nimport { useEventListener } from '../../hooks/useEventListener';\nimport { DynamicText } from '../../typography/DynamicText';\n\nexport interface IQuestionDialogAnswer {\n id: number;\n text: string;\n nextQuestionId?: number;\n}\n\nexport interface IQuestionDialog {\n id: number;\n text: string;\n answerIds?: number[];\n}\n\nexport interface IProps {\n questions: IQuestionDialog[];\n answers: IQuestionDialogAnswer[];\n onClose: () => void;\n}\n\nexport const QuestionDialog: React.FC<IProps> = ({\n questions,\n answers,\n onClose,\n}) => {\n const [currentQuestion, setCurrentQuestion] = useState(questions[0]);\n\n const [canShowAnswers, setCanShowAnswers] = useState<boolean>(false);\n\n const onGetFirstAnswer = () => {\n if (!currentQuestion.answerIds || currentQuestion.answerIds.length === 0) {\n return null;\n }\n\n const firstAnswerId = currentQuestion.answerIds![0];\n\n return answers.find((answer) => answer.id === firstAnswerId);\n };\n\n const [currentAnswer, setCurrentAnswer] =\n useState<IQuestionDialogAnswer | null>(onGetFirstAnswer()!);\n\n useEffect(() => {\n setCurrentAnswer(onGetFirstAnswer()!);\n }, [currentQuestion]);\n\n const onGetAnswers = (answerIds: number[]) => {\n return answerIds.map((answerId: number) =>\n answers.find((answer) => answer.id === answerId)\n );\n };\n\n const onKeyPress = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n // select next answer, if any.\n // if no next answer, select first answer\n // const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n // (answer) => answer?.id === currentAnswer!.id + 1\n // );\n\n const nextAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id + 1);\n\n const nextAnswerID = currentQuestion.answerIds![nextAnswerIndex];\n\n // console.log(nextAnswerIndex);\n\n const nextAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === nextAnswerID\n );\n\n setCurrentAnswer(nextAnswer || onGetFirstAnswer()!);\n\n break;\n case 'ArrowUp':\n // select previous answer, if any.\n // if no previous answer, select last answer\n\n const previousAnswerIndex = onGetAnswers(\n currentQuestion.answerIds!\n ).findIndex((answer) => answer?.id === currentAnswer!.id - 1);\n\n const previousAnswerID =\n currentQuestion.answerIds &&\n currentQuestion.answerIds[previousAnswerIndex];\n\n const previousAnswer = onGetAnswers(currentQuestion.answerIds!).find(\n (answer) => answer?.id === previousAnswerID\n );\n\n if (previousAnswer) {\n setCurrentAnswer(previousAnswer);\n } else {\n setCurrentAnswer(onGetAnswers(currentQuestion.answerIds!).pop()!);\n }\n\n break;\n case 'Enter':\n setCanShowAnswers(false);\n\n if (!currentAnswer?.nextQuestionId) {\n onClose();\n return;\n } else {\n setCurrentQuestion(\n questions.find(\n (question) => question.id === currentAnswer!.nextQuestionId\n )!\n );\n }\n\n break;\n }\n };\n useEventListener('keydown', onKeyPress);\n\n const onAnswerClick = (answer: IQuestionDialogAnswer) => {\n setCanShowAnswers(false);\n if (answer.nextQuestionId) {\n // if there is a next question, go to it\n setCurrentQuestion(\n questions.find((question) => question.id === answer.nextQuestionId)!\n );\n } else {\n // else, finish dialog!\n onClose();\n }\n };\n\n const onRenderCurrentAnswers = () => {\n const answerIds = currentQuestion.answerIds;\n if (!answerIds) {\n return null;\n }\n\n const answers = onGetAnswers(answerIds);\n\n if (!answers) {\n return null;\n }\n\n return answers.map((answer) => {\n const isSelected = currentAnswer?.id === answer?.id;\n const selectedColor = isSelected ? 'yellow' : 'white';\n\n if (answer) {\n return (\n <AnswerRow key={`answer_${answer.id}`}>\n <AnswerSelectedIcon color={selectedColor}>\n {isSelected ? 'X' : null}\n </AnswerSelectedIcon>\n\n <Answer\n key={answer.id}\n onClick={() => onAnswerClick(answer)}\n color={selectedColor}\n >\n {answer.text}\n </Answer>\n </AnswerRow>\n );\n }\n\n return null;\n });\n };\n\n return (\n <Container>\n <QuestionContainer>\n <DynamicText\n text={currentQuestion.text}\n onStart={() => setCanShowAnswers(false)}\n onFinish={() => setCanShowAnswers(true)}\n />\n </QuestionContainer>\n\n {canShowAnswers && (\n <AnswersContainer>{onRenderCurrentAnswers()}</AnswersContainer>\n )}\n </Container>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n\n word-break: break-all;\n\n box-sizing: border-box;\n justify-content: flex-start;\n align-items: flex-start;\n flex-wrap: wrap;\n`;\n\nconst QuestionContainer = styled.div`\n flex: 100%;\n width: 100%;\n`;\n\nconst AnswersContainer = styled.div`\n flex: 100%;\n`;\n\ninterface IAnswerProps {\n color: string;\n}\n\nconst Answer = styled.p<IAnswerProps>`\n flex: auto;\n color: ${(props) => props.color} !important;\n font-size: 0.65rem !important;\n background: inherit;\n border: none;\n`;\n\nconst AnswerSelectedIcon = styled.span<IAnswerProps>`\n flex: 5% 0 0;\n color: ${(props) => props.color} !important;\n`;\n\nconst AnswerRow = styled.div`\n display: flex;\n flex-wrap: wrap;\n justify-content: center;\n align-items: center;\n margin-bottom: 0.5rem;\n height: 22px;\n\n p {\n line-height: unset;\n margin-top: 0;\n margin-bottom: 0rem;\n }\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { IQuestionDialog, IQuestionDialogAnswer } from '..';\nimport { RPGUIContainer } from '../RPGUI/RPGUIContainer';\nimport { RPGUIRoot } from '../RPGUI/RPGUIRoot';\nimport aliceDefaultThumbnail from './img/npcDialog/npcThumbnails/alice.png';\nimport pressSpaceGif from './img/space.gif';\nimport { NPCDialogText } from './NPCDialogText';\nimport { QuestionDialog } from './QuestionDialog/QuestionDialog';\nexport enum NPCDialogType {\n TextOnly = 'TextOnly',\n TextAndThumbnail = 'TextAndThumbnail',\n}\n\nexport interface INPCDialogProps {\n text?: string;\n type: NPCDialogType;\n imagePath?: string;\n onClose?: () => void;\n isQuestionDialog: boolean;\n answers?: IQuestionDialogAnswer[];\n questions?: IQuestionDialog[];\n}\n\nexport const NPCDialog: React.FC<INPCDialogProps> = ({\n text,\n type,\n onClose,\n imagePath,\n isQuestionDialog = false,\n questions,\n answers,\n}) => {\n const [showGoNextIndicator, setShowGoNextIndicator] =\n useState<boolean>(false);\n\n return (\n <RPGUIRoot>\n <RPGUIContainer\n type=\"framed-golden\"\n width={isQuestionDialog ? '600px' : '50%'}\n height={'180px'}\n >\n {isQuestionDialog && questions && answers ? (\n <>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <QuestionDialog\n questions={questions}\n answers={answers}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </>\n ) : (\n <>\n <Container>\n <TextContainer\n flex={type === NPCDialogType.TextAndThumbnail ? '70%' : '100%'}\n >\n <NPCDialogText\n onStartStep={() => setShowGoNextIndicator(false)}\n onEndStep={() => setShowGoNextIndicator(true)}\n text={text || 'No text provided.'}\n onClose={() => {\n if (onClose) {\n onClose();\n }\n }}\n />\n </TextContainer>\n {type === NPCDialogType.TextAndThumbnail && (\n <ThumbnailContainer>\n <NPCThumbnail src={imagePath || aliceDefaultThumbnail} />\n </ThumbnailContainer>\n )}\n </Container>\n {showGoNextIndicator && (\n <PressSpaceIndicator\n right={type === NPCDialogType.TextOnly ? '1rem' : '10.5rem'}\n src={pressSpaceGif}\n />\n )}\n </>\n )}\n </RPGUIContainer>\n </RPGUIRoot>\n );\n};\n\nconst Container = styled.div`\n display: flex;\n width: 100%;\n height: 100%;\n\n box-sizing: border-box;\n justify-content: center;\n align-items: flex-start;\n position: relative;\n`;\n\ninterface ITextContainerProps {\n flex: string;\n}\n\nconst TextContainer = styled.div<ITextContainerProps>`\n flex: ${({ flex }) => flex} 0 0;\n width: 355px;\n`;\n\nconst ThumbnailContainer = styled.div`\n flex: 30% 0 0;\n display: flex;\n justify-content: flex-end;\n`;\n\nconst NPCThumbnail = styled.img`\n image-rendering: pixelated;\n height: 128px;\n width: 128px;\n`;\n\ninterface IPressSpaceIndicatorProps {\n right: string;\n}\n\nconst PressSpaceIndicator = styled.img<IPressSpaceIndicatorProps>`\n position: absolute;\n right: ${({ right }) => right};\n bottom: 1rem;\n height: 20.7px;\n image-rendering: -webkit-optimize-contrast;\n`;\n","import React, { useState } from 'react';\nimport styled from 'styled-components';\nimport { v4 as uuidv4 } from 'uuid';\nimport { useEventListener } from '../hooks/useEventListener';\nimport { RPGUIRoot, _RPGUI } from './RPGUIRoot';\n\nexport enum SliderType {\n Slider = 'rpgui-slider',\n GoldSlider = 'rpgui-slider golden',\n}\n\nexport interface ISliderProps {\n type: SliderType;\n valueMin: number;\n valueMax: number;\n width: string;\n\n onChange: (value: number) => void;\n}\n\nexport const RPGUISlider: React.FC<ISliderProps> = ({\n type,\n valueMin,\n valueMax,\n width,\n onChange,\n}) => {\n const sliderId = uuidv4();\n\n const [wasMouseDownFirst, setWasMouseDownFirst] = useState<boolean>(false);\n\n useEventListener('mouseup', () => {\n if (wasMouseDownFirst) {\n onHandleMouseUp();\n }\n setWasMouseDownFirst(false);\n });\n\n const onHandleMouseUp = () => {\n const rpguiSlider = document.getElementById(`rpgui-slider-${sliderId}`);\n const value = _RPGUI.get_value(rpguiSlider);\n\n onChange(Number(value));\n };\n\n return (\n <RPGUIRoot>\n <div\n onMouseUp={onHandleMouseUp}\n onMouseDown={() => setWasMouseDownFirst(true)}\n >\n <Input\n className={\n type === SliderType.Slider\n ? SliderType.Slider\n : SliderType.GoldSlider\n }\n type=\"range\"\n style={{ width: width }}\n min={valueMin}\n max={valueMax}\n id={`rpgui-slider-${sliderId}`}\n />\n </div>\n </RPGUIRoot>\n );\n};\n\nconst Input = styled.input`\n opacity: 0;\n`;\n"],"names":["_RPGUI","RPGUI","RPGUIRoot","children","React","className","ListMenu","options","onSelected","x","y","Container","style","overflow","map","params","key","text","onClick","id","styled","div","props","useEventListener","type","handler","el","window","savedHandler","useRef","useEffect","current","listener","e","addEventListener","removeEventListener","RPGUIContainer","width","height","img","chunkString","str","length","match","RegExp","DynamicText","onFinish","onStart","useState","textState","setTextState","i","interval","setInterval","substring","clearInterval","TextContainer","p","NPCDialogText","onClose","onEndStep","onStartStep","textChunks","chunkIndex","setChunkIndex","onHandleSpacePress","event","code","hasNextChunk","prev","document","QuestionDialog","questions","answers","currentQuestion","setCurrentQuestion","canShowAnswers","setCanShowAnswers","onGetFirstAnswer","answerIds","firstAnswerId","find","answer","currentAnswer","setCurrentAnswer","onGetAnswers","answerId","onKeyPress","nextAnswerIndex","findIndex","nextAnswerID","nextAnswer","previousAnswerIndex","previousAnswerID","previousAnswer","pop","nextQuestionId","question","onAnswerClick","onRenderCurrentAnswers","isSelected","selectedColor","AnswerRow","AnswerSelectedIcon","color","Answer","QuestionContainer","AnswersContainer","span","NPCDialogType","NPCDialog","imagePath","isQuestionDialog","showGoNextIndicator","setShowGoNextIndicator","flex","TextAndThumbnail","ThumbnailContainer","NPCThumbnail","src","aliceDefaultThumbnail","PressSpaceIndicator","right","TextOnly","pressSpaceGif","SliderType","RPGUISlider","valueMin","valueMax","onChange","sliderId","uuidv4","wasMouseDownFirst","setWasMouseDownFirst","onHandleMouseUp","rpguiSlider","getElementById","value","get_value","Number","onMouseUp","onMouseDown","Input","Slider","GoldSlider","min","max","input"],"mappings":"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"}