@almadar/mobile 1.1.0 → 1.2.1
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.
- package/dist/{chunk-S2IT7WZT.js → chunk-5JVEVV74.js} +1 -1
- package/dist/{chunk-DY52O4T3.js → chunk-5U5Z65ZO.js} +46 -83
- package/dist/chunk-5U5Z65ZO.js.map +1 -0
- package/dist/chunk-A56SRZKI.js +59 -0
- package/dist/chunk-A56SRZKI.js.map +1 -0
- package/dist/{chunk-DMLYJFYQ.js → chunk-BFRVXKSP.js} +594 -88
- package/dist/chunk-BFRVXKSP.js.map +1 -0
- package/dist/{chunk-YMJZLYLV.js → chunk-ETD72PHO.js} +1991 -466
- package/dist/chunk-ETD72PHO.js.map +1 -0
- package/dist/{chunk-LFHVNHVA.js → chunk-GMR5FKKB.js} +3 -83
- package/dist/chunk-GMR5FKKB.js.map +1 -0
- package/dist/chunk-K2JGK2QD.js +17 -0
- package/dist/chunk-K2JGK2QD.js.map +1 -0
- package/dist/chunk-MLTSQPVN.js +337 -0
- package/dist/chunk-MLTSQPVN.js.map +1 -0
- package/dist/{chunk-T77JPOTP.js → chunk-PBO6ZN2M.js} +1206 -1269
- package/dist/chunk-PBO6ZN2M.js.map +1 -0
- package/dist/{chunk-7C5JCLLY.js → chunk-QUFLYKWA.js} +125 -45
- package/dist/chunk-QUFLYKWA.js.map +1 -0
- package/dist/chunk-TRYFJDL3.js +7 -0
- package/dist/chunk-TRYFJDL3.js.map +1 -0
- package/dist/components/atoms/AnimatedCounter.d.ts +15 -0
- package/dist/components/atoms/AnimatedCounter.d.ts.map +1 -0
- package/dist/components/atoms/DayCell.d.ts +18 -0
- package/dist/components/atoms/DayCell.d.ts.map +1 -0
- package/dist/components/atoms/InfiniteScrollSentinel.d.ts +14 -0
- package/dist/components/atoms/InfiniteScrollSentinel.d.ts.map +1 -0
- package/dist/components/atoms/RangeSlider.d.ts +20 -0
- package/dist/components/atoms/RangeSlider.d.ts.map +1 -0
- package/dist/components/atoms/StatusDot.d.ts +16 -0
- package/dist/components/atoms/StatusDot.d.ts.map +1 -0
- package/dist/components/atoms/TextHighlight.d.ts +17 -0
- package/dist/components/atoms/TextHighlight.d.ts.map +1 -0
- package/dist/components/atoms/ThemeToggle.d.ts +13 -0
- package/dist/components/atoms/ThemeToggle.d.ts.map +1 -0
- package/dist/components/atoms/TrendIndicator.d.ts +16 -0
- package/dist/components/atoms/TrendIndicator.d.ts.map +1 -0
- package/dist/components/atoms/TypewriterText.d.ts +16 -0
- package/dist/components/atoms/TypewriterText.d.ts.map +1 -0
- package/dist/components/atoms/index.d.ts +18 -0
- package/dist/components/atoms/index.d.ts.map +1 -1
- package/dist/components/atoms/index.js +30 -10
- package/dist/components/index.js +59 -18
- package/dist/components/molecules/Accordion.d.ts +20 -0
- package/dist/components/molecules/Accordion.d.ts.map +1 -0
- package/dist/components/molecules/CalendarGrid.d.ts +22 -0
- package/dist/components/molecules/CalendarGrid.d.ts.map +1 -0
- package/dist/components/molecules/Carousel.d.ts +17 -0
- package/dist/components/molecules/Carousel.d.ts.map +1 -0
- package/dist/components/molecules/DataGrid.d.ts +43 -0
- package/dist/components/molecules/DataGrid.d.ts.map +1 -0
- package/dist/components/molecules/DataList.d.ts +43 -0
- package/dist/components/molecules/DataList.d.ts.map +1 -0
- package/dist/components/molecules/FlipCard.d.ts +16 -0
- package/dist/components/molecules/FlipCard.d.ts.map +1 -0
- package/dist/components/molecules/Lightbox.d.ts +19 -0
- package/dist/components/molecules/Lightbox.d.ts.map +1 -0
- package/dist/components/molecules/NumberStepper.d.ts +19 -0
- package/dist/components/molecules/NumberStepper.d.ts.map +1 -0
- package/dist/components/molecules/PullToRefresh.d.ts +14 -0
- package/dist/components/molecules/PullToRefresh.d.ts.map +1 -0
- package/dist/components/molecules/SortableList.d.ts +17 -0
- package/dist/components/molecules/SortableList.d.ts.map +1 -0
- package/dist/components/molecules/StarRating.d.ts +19 -0
- package/dist/components/molecules/StarRating.d.ts.map +1 -0
- package/dist/components/molecules/SwipeableRow.d.ts +20 -0
- package/dist/components/molecules/SwipeableRow.d.ts.map +1 -0
- package/dist/components/molecules/index.d.ts +24 -0
- package/dist/components/molecules/index.d.ts.map +1 -1
- package/dist/components/molecules/index.js +30 -5
- package/dist/components/organisms/FormSection.d.ts +7 -0
- package/dist/components/organisms/FormSection.d.ts.map +1 -1
- package/dist/components/organisms/index.d.ts +0 -4
- package/dist/components/organisms/index.d.ts.map +1 -1
- package/dist/components/organisms/index.js +4 -8
- package/dist/index.js +72 -26
- package/dist/index.js.map +1 -1
- package/dist/lib/getNestedValue.d.ts +5 -0
- package/dist/lib/getNestedValue.d.ts.map +1 -0
- package/dist/lib/index.d.ts +1 -0
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +6 -2
- package/dist/providers/ThemeProvider.d.ts +7 -0
- package/dist/providers/ThemeProvider.d.ts.map +1 -1
- package/dist/providers/index.d.ts +2 -2
- package/dist/providers/index.d.ts.map +1 -1
- package/dist/providers/index.js +8 -4
- package/package.json +30 -29
- package/dist/chunk-6RVITGGH.js +0 -167
- package/dist/chunk-6RVITGGH.js.map +0 -1
- package/dist/chunk-7C5JCLLY.js.map +0 -1
- package/dist/chunk-DMLYJFYQ.js.map +0 -1
- package/dist/chunk-DY52O4T3.js.map +0 -1
- package/dist/chunk-LFHVNHVA.js.map +0 -1
- package/dist/chunk-T77JPOTP.js.map +0 -1
- package/dist/chunk-VLUJ7BXN.js +0 -36
- package/dist/chunk-VLUJ7BXN.js.map +0 -1
- package/dist/chunk-YMJZLYLV.js.map +0 -1
- package/dist/components/organisms/EntityCard.d.ts +0 -11
- package/dist/components/organisms/EntityCard.d.ts.map +0 -1
- package/dist/components/organisms/EntityList.d.ts +0 -17
- package/dist/components/organisms/EntityList.d.ts.map +0 -1
- /package/dist/{chunk-S2IT7WZT.js.map → chunk-5JVEVV74.js.map} +0 -0
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
ScoreDisplay,
|
|
9
9
|
Typography,
|
|
10
10
|
VStack
|
|
11
|
-
} from "./chunk-
|
|
11
|
+
} from "./chunk-QUFLYKWA.js";
|
|
12
12
|
import {
|
|
13
13
|
useEventBus
|
|
14
14
|
} from "./chunk-YTVYMEKU.js";
|
|
@@ -34,44 +34,8 @@ var styles = StyleSheet.create({
|
|
|
34
34
|
});
|
|
35
35
|
EmptyState.displayName = "EmptyState";
|
|
36
36
|
|
|
37
|
-
// src/components/molecules/List.tsx
|
|
38
|
-
import React2 from "react";
|
|
39
|
-
import {
|
|
40
|
-
FlatList
|
|
41
|
-
} from "react-native";
|
|
42
|
-
function List({
|
|
43
|
-
data,
|
|
44
|
-
renderItem,
|
|
45
|
-
keyExtractor,
|
|
46
|
-
isLoading,
|
|
47
|
-
isError,
|
|
48
|
-
onRetry,
|
|
49
|
-
emptyMessage = "No items found",
|
|
50
|
-
...flatListProps
|
|
51
|
-
}) {
|
|
52
|
-
if (isLoading) {
|
|
53
|
-
return /* @__PURE__ */ React2.createElement(LoadingState, null);
|
|
54
|
-
}
|
|
55
|
-
if (isError) {
|
|
56
|
-
return /* @__PURE__ */ React2.createElement(ErrorState, { onRetry });
|
|
57
|
-
}
|
|
58
|
-
if (!data || data.length === 0) {
|
|
59
|
-
return /* @__PURE__ */ React2.createElement(EmptyState, { message: emptyMessage });
|
|
60
|
-
}
|
|
61
|
-
return /* @__PURE__ */ React2.createElement(
|
|
62
|
-
FlatList,
|
|
63
|
-
{
|
|
64
|
-
data,
|
|
65
|
-
renderItem: ({ item }) => renderItem(item),
|
|
66
|
-
keyExtractor,
|
|
67
|
-
...flatListProps
|
|
68
|
-
}
|
|
69
|
-
);
|
|
70
|
-
}
|
|
71
|
-
List.displayName = "List";
|
|
72
|
-
|
|
73
37
|
// src/components/molecules/Modal.tsx
|
|
74
|
-
import
|
|
38
|
+
import React2, { useCallback } from "react";
|
|
75
39
|
import {
|
|
76
40
|
Modal as RNModal,
|
|
77
41
|
View,
|
|
@@ -96,7 +60,7 @@ var Modal = ({
|
|
|
96
60
|
}
|
|
97
61
|
}, [closeOnBackdrop, onClose]);
|
|
98
62
|
const transparent = animationType !== "slide";
|
|
99
|
-
return /* @__PURE__ */
|
|
63
|
+
return /* @__PURE__ */ React2.createElement(
|
|
100
64
|
RNModal,
|
|
101
65
|
{
|
|
102
66
|
visible: isOpen,
|
|
@@ -105,14 +69,14 @@ var Modal = ({
|
|
|
105
69
|
onRequestClose: onClose,
|
|
106
70
|
...modalProps
|
|
107
71
|
},
|
|
108
|
-
/* @__PURE__ */
|
|
72
|
+
/* @__PURE__ */ React2.createElement(
|
|
109
73
|
TouchableOpacity,
|
|
110
74
|
{
|
|
111
75
|
style: styles2.overlay,
|
|
112
76
|
activeOpacity: 1,
|
|
113
77
|
onPress: handleBackdropPress
|
|
114
78
|
},
|
|
115
|
-
/* @__PURE__ */
|
|
79
|
+
/* @__PURE__ */ React2.createElement(View, { style: styles2.centeredView }, /* @__PURE__ */ React2.createElement(TouchableOpacity, { activeOpacity: 1, onPress: (e) => e.stopPropagation() }, /* @__PURE__ */ React2.createElement(Card, { style: [styles2.modalCard, styles2[size]] }, /* @__PURE__ */ React2.createElement(VStack, { spacing: 16 }, title && /* @__PURE__ */ React2.createElement(HStack, { justify: "space-between", align: "center" }, /* @__PURE__ */ React2.createElement(Typography, { variant: "h4" }, title), showCloseButton && /* @__PURE__ */ React2.createElement(TouchableOpacity, { onPress: onClose }, /* @__PURE__ */ React2.createElement(Typography, { variant: "body", color: "#6b7280" }, "\u2715"))), /* @__PURE__ */ React2.createElement(View, null, children), footer && /* @__PURE__ */ React2.createElement(HStack, { justify: "flex-end", spacing: 12 }, footer)))))
|
|
116
80
|
)
|
|
117
81
|
);
|
|
118
82
|
};
|
|
@@ -151,21 +115,21 @@ var ConfirmModal = ({
|
|
|
151
115
|
confirmLabel = "Confirm",
|
|
152
116
|
cancelLabel = "Cancel"
|
|
153
117
|
}) => {
|
|
154
|
-
return /* @__PURE__ */
|
|
118
|
+
return /* @__PURE__ */ React2.createElement(
|
|
155
119
|
Modal,
|
|
156
120
|
{
|
|
157
121
|
isOpen,
|
|
158
122
|
onClose,
|
|
159
123
|
title,
|
|
160
|
-
footer: /* @__PURE__ */
|
|
124
|
+
footer: /* @__PURE__ */ React2.createElement(React2.Fragment, null, /* @__PURE__ */ React2.createElement(Typography, { variant: "body", color: "#6b7280", onPress: onClose }, cancelLabel), /* @__PURE__ */ React2.createElement(Typography, { variant: "body", color: "#ef4444", onPress: onConfirm }, confirmLabel))
|
|
161
125
|
},
|
|
162
|
-
/* @__PURE__ */
|
|
126
|
+
/* @__PURE__ */ React2.createElement(Typography, { variant: "body" }, message)
|
|
163
127
|
);
|
|
164
128
|
};
|
|
165
129
|
ConfirmModal.displayName = "ConfirmModal";
|
|
166
130
|
|
|
167
131
|
// src/components/molecules/Drawer.tsx
|
|
168
|
-
import
|
|
132
|
+
import React3 from "react";
|
|
169
133
|
import {
|
|
170
134
|
View as View2,
|
|
171
135
|
StyleSheet as StyleSheet3,
|
|
@@ -182,10 +146,10 @@ var Drawer = ({
|
|
|
182
146
|
placement = "right",
|
|
183
147
|
width = SCREEN_WIDTH * 0.8
|
|
184
148
|
}) => {
|
|
185
|
-
const translateX =
|
|
149
|
+
const translateX = React3.useRef(
|
|
186
150
|
new Animated.Value(placement === "right" ? SCREEN_WIDTH : -SCREEN_WIDTH)
|
|
187
151
|
).current;
|
|
188
|
-
|
|
152
|
+
React3.useEffect(() => {
|
|
189
153
|
Animated.timing(translateX, {
|
|
190
154
|
toValue: isOpen ? 0 : placement === "right" ? width : -width,
|
|
191
155
|
duration: 250,
|
|
@@ -193,14 +157,14 @@ var Drawer = ({
|
|
|
193
157
|
}).start();
|
|
194
158
|
}, [isOpen, placement, translateX, width]);
|
|
195
159
|
if (!isOpen) return null;
|
|
196
|
-
return /* @__PURE__ */
|
|
160
|
+
return /* @__PURE__ */ React3.createElement(View2, { style: styles3.overlay }, /* @__PURE__ */ React3.createElement(
|
|
197
161
|
TouchableOpacity2,
|
|
198
162
|
{
|
|
199
163
|
style: styles3.backdrop,
|
|
200
164
|
activeOpacity: 1,
|
|
201
165
|
onPress: onClose
|
|
202
166
|
}
|
|
203
|
-
), /* @__PURE__ */
|
|
167
|
+
), /* @__PURE__ */ React3.createElement(
|
|
204
168
|
Animated.View,
|
|
205
169
|
{
|
|
206
170
|
style: [
|
|
@@ -212,7 +176,7 @@ var Drawer = ({
|
|
|
212
176
|
}
|
|
213
177
|
]
|
|
214
178
|
},
|
|
215
|
-
/* @__PURE__ */
|
|
179
|
+
/* @__PURE__ */ React3.createElement(View2, { style: styles3.content }, (title || true) && /* @__PURE__ */ React3.createElement(View2, { style: styles3.header }, /* @__PURE__ */ React3.createElement(TouchableOpacity2, { onPress: onClose, style: styles3.closeButton }, /* @__PURE__ */ React3.createElement(Typography, { variant: "body", color: "#6b7280" }, "\u2715")), title && /* @__PURE__ */ React3.createElement(Typography, { variant: "h4" }, title)), /* @__PURE__ */ React3.createElement(VStack, { spacing: 0, style: styles3.children }, children))
|
|
216
180
|
));
|
|
217
181
|
};
|
|
218
182
|
var styles3 = StyleSheet3.create({
|
|
@@ -258,7 +222,7 @@ var styles3 = StyleSheet3.create({
|
|
|
258
222
|
Drawer.displayName = "Drawer";
|
|
259
223
|
|
|
260
224
|
// src/components/molecules/Tabs.tsx
|
|
261
|
-
import
|
|
225
|
+
import React4, { useState } from "react";
|
|
262
226
|
import {
|
|
263
227
|
View as View3,
|
|
264
228
|
TouchableOpacity as TouchableOpacity3,
|
|
@@ -287,10 +251,10 @@ var Tabs = ({
|
|
|
287
251
|
onChange?.(tabId);
|
|
288
252
|
};
|
|
289
253
|
if (isLoading) {
|
|
290
|
-
return /* @__PURE__ */
|
|
254
|
+
return /* @__PURE__ */ React4.createElement(View3, { style: [styles4.container, style] }, /* @__PURE__ */ React4.createElement(LoadingState, { message: "Loading..." }));
|
|
291
255
|
}
|
|
292
256
|
if (error) {
|
|
293
|
-
return /* @__PURE__ */
|
|
257
|
+
return /* @__PURE__ */ React4.createElement(View3, { style: [styles4.container, style] }, /* @__PURE__ */ React4.createElement(ErrorState, { message: error.message }));
|
|
294
258
|
}
|
|
295
259
|
const getTabStyle = (isActive) => {
|
|
296
260
|
switch (variant) {
|
|
@@ -313,16 +277,16 @@ var Tabs = ({
|
|
|
313
277
|
};
|
|
314
278
|
}
|
|
315
279
|
};
|
|
316
|
-
return /* @__PURE__ */
|
|
280
|
+
return /* @__PURE__ */ React4.createElement(View3, { style: [styles4.container, style] }, /* @__PURE__ */ React4.createElement(
|
|
317
281
|
ScrollView,
|
|
318
282
|
{
|
|
319
283
|
horizontal: true,
|
|
320
284
|
showsHorizontalScrollIndicator: false,
|
|
321
285
|
contentContainerStyle: styles4.scrollContent
|
|
322
286
|
},
|
|
323
|
-
/* @__PURE__ */
|
|
287
|
+
/* @__PURE__ */ React4.createElement(HStack, { spacing: 8 }, tabs.map((tab) => {
|
|
324
288
|
const isActive = currentTab === tab.id;
|
|
325
|
-
return /* @__PURE__ */
|
|
289
|
+
return /* @__PURE__ */ React4.createElement(
|
|
326
290
|
TouchableOpacity3,
|
|
327
291
|
{
|
|
328
292
|
key: tab.id,
|
|
@@ -332,7 +296,7 @@ var Tabs = ({
|
|
|
332
296
|
getTabStyle(isActive)
|
|
333
297
|
]
|
|
334
298
|
},
|
|
335
|
-
/* @__PURE__ */
|
|
299
|
+
/* @__PURE__ */ React4.createElement(HStack, { spacing: 4, align: "center" }, tab.icon, /* @__PURE__ */ React4.createElement(
|
|
336
300
|
Typography,
|
|
337
301
|
{
|
|
338
302
|
variant: "body",
|
|
@@ -341,7 +305,7 @@ var Tabs = ({
|
|
|
341
305
|
}
|
|
342
306
|
},
|
|
343
307
|
tab.label
|
|
344
|
-
), tab.badge !== void 0 && tab.badge > 0 && /* @__PURE__ */
|
|
308
|
+
), tab.badge !== void 0 && tab.badge > 0 && /* @__PURE__ */ React4.createElement(View3, { style: [styles4.badge, { backgroundColor: theme.colors.error }] }, /* @__PURE__ */ React4.createElement(Typography, { variant: "caption", style: { color: theme.colors["error-foreground"] } }, tab.badge > 99 ? "99+" : tab.badge)))
|
|
345
309
|
);
|
|
346
310
|
}))
|
|
347
311
|
));
|
|
@@ -370,7 +334,7 @@ var styles4 = StyleSheet4.create({
|
|
|
370
334
|
Tabs.displayName = "Tabs";
|
|
371
335
|
|
|
372
336
|
// src/components/molecules/Toast.tsx
|
|
373
|
-
import
|
|
337
|
+
import React5, { useEffect } from "react";
|
|
374
338
|
import {
|
|
375
339
|
TouchableOpacity as TouchableOpacity4,
|
|
376
340
|
StyleSheet as StyleSheet5,
|
|
@@ -388,8 +352,8 @@ var Toast = ({
|
|
|
388
352
|
}) => {
|
|
389
353
|
const theme = useTheme();
|
|
390
354
|
const eventBus = useEventBus();
|
|
391
|
-
const translateY =
|
|
392
|
-
const opacity =
|
|
355
|
+
const translateY = React5.useRef(new Animated2.Value(-100)).current;
|
|
356
|
+
const opacity = React5.useRef(new Animated2.Value(0)).current;
|
|
393
357
|
useEffect(() => {
|
|
394
358
|
Animated2.parallel([
|
|
395
359
|
Animated2.timing(translateY, {
|
|
@@ -437,7 +401,7 @@ var Toast = ({
|
|
|
437
401
|
};
|
|
438
402
|
const { bg } = variantStyles[variant];
|
|
439
403
|
const textColor = variant === "warning" ? "#000000" : "#ffffff";
|
|
440
|
-
return /* @__PURE__ */
|
|
404
|
+
return /* @__PURE__ */ React5.createElement(
|
|
441
405
|
Animated2.View,
|
|
442
406
|
{
|
|
443
407
|
style: [
|
|
@@ -447,7 +411,7 @@ var Toast = ({
|
|
|
447
411
|
style
|
|
448
412
|
]
|
|
449
413
|
},
|
|
450
|
-
/* @__PURE__ */
|
|
414
|
+
/* @__PURE__ */ React5.createElement(HStack, { spacing: 12, align: "center", justify: "space-between" }, /* @__PURE__ */ React5.createElement(Typography, { variant: "body", style: { color: textColor, flex: 1 } }, message), /* @__PURE__ */ React5.createElement(TouchableOpacity4, { onPress: handleDismiss, style: styles5.dismiss }, /* @__PURE__ */ React5.createElement(Typography, { variant: "body", style: { color: textColor } }, "\u2715")))
|
|
451
415
|
);
|
|
452
416
|
};
|
|
453
417
|
var styles5 = StyleSheet5.create({
|
|
@@ -469,7 +433,7 @@ var styles5 = StyleSheet5.create({
|
|
|
469
433
|
Toast.displayName = "Toast";
|
|
470
434
|
|
|
471
435
|
// src/components/molecules/CodeBlock.tsx
|
|
472
|
-
import
|
|
436
|
+
import React6 from "react";
|
|
473
437
|
import { View as View4, ScrollView as ScrollView2, StyleSheet as StyleSheet6 } from "react-native";
|
|
474
438
|
var KEYWORDS = [
|
|
475
439
|
"const",
|
|
@@ -597,21 +561,21 @@ var CodeBlock = ({
|
|
|
597
561
|
}
|
|
598
562
|
};
|
|
599
563
|
if (isLoading) {
|
|
600
|
-
return /* @__PURE__ */
|
|
564
|
+
return /* @__PURE__ */ React6.createElement(Card, { style: [styles6.container, style || {}] }, /* @__PURE__ */ React6.createElement(LoadingState, { message: "Loading code..." }));
|
|
601
565
|
}
|
|
602
566
|
if (error) {
|
|
603
|
-
return /* @__PURE__ */
|
|
567
|
+
return /* @__PURE__ */ React6.createElement(Card, { style: [styles6.container, style || {}] }, /* @__PURE__ */ React6.createElement(ErrorState, { message: error.message }));
|
|
604
568
|
}
|
|
605
569
|
const tokenizedLines = tokenizeCode(code);
|
|
606
570
|
const lineNumberWidth = String(tokenizedLines.length).length * 10 + 16;
|
|
607
|
-
const CodeContent = /* @__PURE__ */
|
|
571
|
+
const CodeContent = /* @__PURE__ */ React6.createElement(View4, { style: styles6.codeContainer }, tokenizedLines.map((tokens, lineIndex) => /* @__PURE__ */ React6.createElement(View4, { key: lineIndex, style: styles6.line }, showLineNumbers && /* @__PURE__ */ React6.createElement(View4, { style: [styles6.lineNumber, { width: lineNumberWidth }] }, /* @__PURE__ */ React6.createElement(
|
|
608
572
|
Typography,
|
|
609
573
|
{
|
|
610
574
|
variant: "caption",
|
|
611
575
|
style: { color: theme.colors["muted-foreground"] }
|
|
612
576
|
},
|
|
613
577
|
lineIndex + 1
|
|
614
|
-
)), /* @__PURE__ */
|
|
578
|
+
)), /* @__PURE__ */ React6.createElement(View4, { style: styles6.lineContent }, tokens.length === 0 ? /* @__PURE__ */ React6.createElement(Typography, { variant: "body" }, " ") : /* @__PURE__ */ React6.createElement(Typography, { variant: "body" }, tokens.map((token, tokenIndex) => /* @__PURE__ */ React6.createElement(
|
|
615
579
|
Typography,
|
|
616
580
|
{
|
|
617
581
|
key: tokenIndex,
|
|
@@ -623,7 +587,7 @@ var CodeBlock = ({
|
|
|
623
587
|
},
|
|
624
588
|
token.text
|
|
625
589
|
)))))));
|
|
626
|
-
return /* @__PURE__ */
|
|
590
|
+
return /* @__PURE__ */ React6.createElement(Card, { style: [styles6.container, style || {}], padding: "none" }, (language || showCopyButton) && /* @__PURE__ */ React6.createElement(
|
|
627
591
|
HStack,
|
|
628
592
|
{
|
|
629
593
|
spacing: 8,
|
|
@@ -634,7 +598,7 @@ var CodeBlock = ({
|
|
|
634
598
|
{ backgroundColor: theme.colors.muted, borderBottomColor: theme.colors.border }
|
|
635
599
|
]
|
|
636
600
|
},
|
|
637
|
-
language ? /* @__PURE__ */
|
|
601
|
+
language ? /* @__PURE__ */ React6.createElement(
|
|
638
602
|
Typography,
|
|
639
603
|
{
|
|
640
604
|
variant: "caption",
|
|
@@ -644,9 +608,9 @@ var CodeBlock = ({
|
|
|
644
608
|
}
|
|
645
609
|
},
|
|
646
610
|
language
|
|
647
|
-
) : /* @__PURE__ */
|
|
648
|
-
showCopyButton && /* @__PURE__ */
|
|
649
|
-
), scrollable ? /* @__PURE__ */
|
|
611
|
+
) : /* @__PURE__ */ React6.createElement(View4, null),
|
|
612
|
+
showCopyButton && /* @__PURE__ */ React6.createElement(Button, { variant: "ghost", size: "sm", onPress: handleCopy }, "Copy")
|
|
613
|
+
), scrollable ? /* @__PURE__ */ React6.createElement(ScrollView2, { horizontal: true, showsHorizontalScrollIndicator: true }, CodeContent) : CodeContent);
|
|
650
614
|
};
|
|
651
615
|
var styles6 = StyleSheet6.create({
|
|
652
616
|
container: {
|
|
@@ -675,7 +639,7 @@ var styles6 = StyleSheet6.create({
|
|
|
675
639
|
CodeBlock.displayName = "CodeBlock";
|
|
676
640
|
|
|
677
641
|
// src/components/molecules/game/StatBadge.tsx
|
|
678
|
-
import
|
|
642
|
+
import React7 from "react";
|
|
679
643
|
import { View as View5, Text, StyleSheet as StyleSheet7 } from "react-native";
|
|
680
644
|
var sizeMap = {
|
|
681
645
|
sm: { padding: 8, fontSize: 12 },
|
|
@@ -706,7 +670,7 @@ var StatBadge = ({
|
|
|
706
670
|
const numValue = typeof value === "number" ? value : parseInt(String(value), 10) || 0;
|
|
707
671
|
const sizeStyles = sizeMap[size] ?? sizeMap.md;
|
|
708
672
|
const variantStyles = variantMap[variant] ?? variantMap.default;
|
|
709
|
-
return /* @__PURE__ */
|
|
673
|
+
return /* @__PURE__ */ React7.createElement(
|
|
710
674
|
View5,
|
|
711
675
|
{
|
|
712
676
|
style: [
|
|
@@ -719,8 +683,8 @@ var StatBadge = ({
|
|
|
719
683
|
style
|
|
720
684
|
]
|
|
721
685
|
},
|
|
722
|
-
icon && /* @__PURE__ */
|
|
723
|
-
/* @__PURE__ */
|
|
686
|
+
icon && /* @__PURE__ */ React7.createElement(Text, { style: { fontSize: 18, marginRight: 8 } }, icon),
|
|
687
|
+
/* @__PURE__ */ React7.createElement(
|
|
724
688
|
Text,
|
|
725
689
|
{
|
|
726
690
|
style: {
|
|
@@ -732,7 +696,7 @@ var StatBadge = ({
|
|
|
732
696
|
},
|
|
733
697
|
label
|
|
734
698
|
),
|
|
735
|
-
format === "hearts" && max && /* @__PURE__ */
|
|
699
|
+
format === "hearts" && max && /* @__PURE__ */ React7.createElement(
|
|
736
700
|
HealthBar,
|
|
737
701
|
{
|
|
738
702
|
current: numValue,
|
|
@@ -741,7 +705,7 @@ var StatBadge = ({
|
|
|
741
705
|
size: size === "lg" ? "md" : "sm"
|
|
742
706
|
}
|
|
743
707
|
),
|
|
744
|
-
format === "bar" && max && /* @__PURE__ */
|
|
708
|
+
format === "bar" && max && /* @__PURE__ */ React7.createElement(
|
|
745
709
|
HealthBar,
|
|
746
710
|
{
|
|
747
711
|
current: numValue,
|
|
@@ -750,7 +714,7 @@ var StatBadge = ({
|
|
|
750
714
|
size: size === "lg" ? "md" : "sm"
|
|
751
715
|
}
|
|
752
716
|
),
|
|
753
|
-
format === "number" && /* @__PURE__ */
|
|
717
|
+
format === "number" && /* @__PURE__ */ React7.createElement(
|
|
754
718
|
ScoreDisplay,
|
|
755
719
|
{
|
|
756
720
|
value: numValue,
|
|
@@ -758,7 +722,7 @@ var StatBadge = ({
|
|
|
758
722
|
animated: true
|
|
759
723
|
}
|
|
760
724
|
),
|
|
761
|
-
format === "text" && /* @__PURE__ */
|
|
725
|
+
format === "text" && /* @__PURE__ */ React7.createElement(
|
|
762
726
|
Text,
|
|
763
727
|
{
|
|
764
728
|
style: {
|
|
@@ -783,7 +747,6 @@ StatBadge.displayName = "StatBadge";
|
|
|
783
747
|
|
|
784
748
|
export {
|
|
785
749
|
EmptyState,
|
|
786
|
-
List,
|
|
787
750
|
Modal,
|
|
788
751
|
ConfirmModal,
|
|
789
752
|
Drawer,
|
|
@@ -792,4 +755,4 @@ export {
|
|
|
792
755
|
CodeBlock,
|
|
793
756
|
StatBadge
|
|
794
757
|
};
|
|
795
|
-
//# sourceMappingURL=chunk-
|
|
758
|
+
//# sourceMappingURL=chunk-5U5Z65ZO.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/molecules/EmptyState.tsx","../src/components/molecules/Modal.tsx","../src/components/molecules/Drawer.tsx","../src/components/molecules/Tabs.tsx","../src/components/molecules/Toast.tsx","../src/components/molecules/CodeBlock.tsx","../src/components/molecules/game/StatBadge.tsx"],"sourcesContent":["import React from 'react';\nimport { StyleSheet } from 'react-native';\nimport { Typography } from '../atoms/Typography';\nimport { VStack } from '../atoms/Stack';\n\nexport interface EmptyStateProps {\n message?: string;\n icon?: React.ReactNode;\n}\n\nexport const EmptyState: React.FC<EmptyStateProps> = ({\n message = 'No data available',\n icon,\n}) => {\n return (\n <VStack align=\"center\" spacing={12} style={styles.container}>\n {icon}\n <Typography variant=\"body\" color=\"#6b7280\">\n {message}\n </Typography>\n </VStack>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n padding: 32,\n alignItems: 'center',\n justifyContent: 'center',\n },\n});\n\nEmptyState.displayName = 'EmptyState';\n","import React, { useCallback } from 'react';\nimport { \n Modal as RNModal, \n View, \n TouchableOpacity, \n StyleSheet,\n ViewStyle\n} from 'react-native';\nimport { Card } from '../atoms/Card';\nimport { Typography } from '../atoms/Typography';\nimport { VStack, HStack } from '../atoms/Stack';\n\nexport interface ModalProps {\n isOpen: boolean;\n onClose: () => void;\n title?: string;\n children: React.ReactNode;\n footer?: React.ReactNode;\n size?: 'sm' | 'md' | 'lg';\n showCloseButton?: boolean;\n closeOnBackdrop?: boolean;\n animationType?: 'none' | 'slide' | 'fade';\n}\n\nexport const Modal: React.FC<ModalProps> = ({\n isOpen,\n onClose,\n title,\n children,\n footer,\n size = 'md',\n showCloseButton = true,\n closeOnBackdrop = true,\n animationType = 'fade',\n ...modalProps\n}) => {\n const handleBackdropPress = useCallback(() => {\n if (closeOnBackdrop) {\n onClose();\n }\n }, [closeOnBackdrop, onClose]);\n\n const transparent = animationType !== 'slide';\n\n return (\n <RNModal\n visible={isOpen}\n animationType={animationType}\n transparent={transparent}\n onRequestClose={onClose}\n {...modalProps}\n >\n <TouchableOpacity\n style={styles.overlay}\n activeOpacity={1}\n onPress={handleBackdropPress}\n >\n <View style={styles.centeredView}>\n <TouchableOpacity activeOpacity={1} onPress={(e) => e.stopPropagation()}>\n <Card style={[styles.modalCard, styles[size] as ViewStyle]}>\n <VStack spacing={16}>\n {/* Header */}\n {title && (\n <HStack justify=\"space-between\" align=\"center\">\n <Typography variant=\"h4\">{title}</Typography>\n {showCloseButton && (\n <TouchableOpacity onPress={onClose}>\n <Typography variant=\"body\" color=\"#6b7280\">✕</Typography>\n </TouchableOpacity>\n )}\n </HStack>\n )}\n\n {/* Content */}\n <View>{children}</View>\n\n {/* Footer */}\n {footer && (\n <HStack justify=\"flex-end\" spacing={12}>\n {footer}\n </HStack>\n )}\n </VStack>\n </Card>\n </TouchableOpacity>\n </View>\n </TouchableOpacity>\n </RNModal>\n );\n};\n\nconst styles = StyleSheet.create({\n overlay: {\n flex: 1,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n },\n centeredView: {\n flex: 1,\n justifyContent: 'center',\n alignItems: 'center',\n padding: 20,\n },\n modalCard: {\n width: '100%',\n maxWidth: 400,\n },\n sm: {\n maxWidth: 300,\n },\n md: {\n maxWidth: 400,\n },\n lg: {\n maxWidth: 600,\n },\n});\n\nModal.displayName = 'Modal';\n\n// Confirm Modal\nexport interface ConfirmModalProps extends Omit<ModalProps, 'children' | 'footer'> {\n message: string;\n onConfirm: () => void;\n confirmLabel?: string;\n cancelLabel?: string;\n isLoading?: boolean;\n}\n\nexport const ConfirmModal: React.FC<ConfirmModalProps> = ({\n isOpen,\n onClose,\n onConfirm,\n title = 'Confirm',\n message = 'Are you sure you want to proceed?',\n confirmLabel = 'Confirm',\n cancelLabel = 'Cancel',\n \n}) => {\n return (\n <Modal\n isOpen={isOpen}\n onClose={onClose}\n title={title}\n footer={\n <>\n <Typography variant=\"body\" color=\"#6b7280\" onPress={onClose}>\n {cancelLabel}\n </Typography>\n <Typography variant=\"body\" color=\"#ef4444\" onPress={onConfirm}>\n {confirmLabel}\n </Typography>\n </>\n }\n >\n <Typography variant=\"body\">{message}</Typography>\n </Modal>\n );\n};\n\nConfirmModal.displayName = 'ConfirmModal';\n","import React from 'react';\nimport {\n View,\n StyleSheet,\n TouchableOpacity,\n Animated,\n Dimensions,\n} from 'react-native';\nimport { Typography } from '../atoms/Typography';\nimport { VStack } from '../atoms/Stack';\n\nconst { width: SCREEN_WIDTH } = Dimensions.get('window');\n\nexport interface DrawerProps {\n isOpen: boolean;\n onClose: () => void;\n children: React.ReactNode;\n title?: string;\n placement?: 'left' | 'right';\n width?: number;\n}\n\nexport const Drawer: React.FC<DrawerProps> = ({\n isOpen,\n onClose,\n children,\n title,\n placement = 'right',\n width = SCREEN_WIDTH * 0.8,\n}) => {\n const translateX = React.useRef(\n new Animated.Value(placement === 'right' ? SCREEN_WIDTH : -SCREEN_WIDTH)\n ).current;\n\n React.useEffect(() => {\n Animated.timing(translateX, {\n toValue: isOpen ? 0 : placement === 'right' ? width : -width,\n duration: 250,\n useNativeDriver: true,\n }).start();\n }, [isOpen, placement, translateX, width]);\n\n if (!isOpen) return null;\n\n return (\n <View style={styles.overlay}>\n {/* Backdrop */}\n <TouchableOpacity\n style={styles.backdrop}\n activeOpacity={1}\n onPress={onClose}\n />\n \n {/* Drawer Panel */}\n <Animated.View\n style={[\n styles.drawer,\n {\n width,\n [placement]: 0,\n transform: [{ translateX }],\n },\n ]}\n >\n <View style={styles.content}>\n {/* Header */}\n {(title || true) && (\n <View style={styles.header}>\n <TouchableOpacity onPress={onClose} style={styles.closeButton}>\n <Typography variant=\"body\" color=\"#6b7280\">✕</Typography>\n </TouchableOpacity>\n {title && <Typography variant=\"h4\">{title}</Typography>}\n </View>\n )}\n\n {/* Drawer Content */}\n <VStack spacing={0} style={styles.children}>\n {children}\n </VStack>\n </View>\n </Animated.View>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n overlay: {\n ...StyleSheet.absoluteFillObject,\n zIndex: 1000,\n flexDirection: 'row',\n },\n backdrop: {\n ...StyleSheet.absoluteFillObject,\n backgroundColor: 'rgba(0, 0, 0, 0.5)',\n },\n drawer: {\n position: 'absolute',\n top: 0,\n bottom: 0,\n backgroundColor: '#ffffff',\n shadowColor: '#000',\n shadowOffset: { width: -2, height: 0 },\n shadowOpacity: 0.25,\n shadowRadius: 5,\n elevation: 5,\n },\n content: {\n flex: 1,\n },\n header: {\n flexDirection: 'row',\n alignItems: 'center',\n padding: 16,\n borderBottomWidth: 1,\n borderBottomColor: '#e5e7eb',\n gap: 12,\n },\n closeButton: {\n padding: 4,\n },\n children: {\n flex: 1,\n padding: 16,\n },\n});\n\nDrawer.displayName = 'Drawer';\n","import React, { useState } from 'react';\nimport { \n View, \n TouchableOpacity, \n StyleSheet, \n ViewStyle,\n ScrollView \n} from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport { Typography } from '../atoms/Typography';\nimport { LoadingState } from './LoadingState';\nimport { ErrorState } from './ErrorState';\nimport { HStack } from '../atoms/Stack';\n\nexport interface Tab {\n id: string;\n label: string;\n icon?: React.ReactNode;\n badge?: number;\n}\n\nexport interface TabsProps {\n tabs: Tab[];\n activeTab?: string;\n onChange?: (tabId: string) => void;\n style?: ViewStyle;\n variant?: 'default' | 'pills' | 'underlined';\n /** Loading state indicator */\n isLoading?: boolean;\n /** Error state */\n error?: Error | null;\n /** Entity name for schema-driven auto-fetch */\n entity?: string;\n /** Declarative change event name - emits UI:${changeEvent} via eventBus */\n changeEvent?: string;\n}\n\nexport const Tabs: React.FC<TabsProps> = ({\n tabs,\n activeTab,\n onChange,\n style,\n variant = 'default',\n isLoading,\n error,\n changeEvent,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n const [internalActiveTab, setInternalActiveTab] = useState(tabs[0]?.id);\n const currentTab = activeTab ?? internalActiveTab;\n\n const handleTabPress = (tabId: string) => {\n setInternalActiveTab(tabId);\n if (changeEvent) {\n eventBus.emit(`UI:${changeEvent}`, { tabId });\n }\n onChange?.(tabId);\n };\n\n if (isLoading) {\n return (\n <View style={[styles.container, style]}>\n <LoadingState message=\"Loading...\" />\n </View>\n );\n }\n\n if (error) {\n return (\n <View style={[styles.container, style]}>\n <ErrorState message={error.message} />\n </View>\n );\n }\n\n const getTabStyle = (isActive: boolean) => {\n switch (variant) {\n case 'pills':\n return {\n backgroundColor: isActive ? theme.colors.primary : 'transparent',\n borderRadius: theme.borderRadius.full,\n };\n case 'underlined':\n return {\n borderBottomWidth: 2,\n borderBottomColor: isActive ? theme.colors.primary : 'transparent',\n backgroundColor: 'transparent',\n };\n default:\n return {\n backgroundColor: isActive ? theme.colors.card : 'transparent',\n borderRadius: theme.borderRadius.md,\n ...theme.shadows.sm,\n };\n }\n };\n\n return (\n <View style={[styles.container, style]}>\n <ScrollView \n horizontal \n showsHorizontalScrollIndicator={false}\n contentContainerStyle={styles.scrollContent}\n >\n <HStack spacing={8}>\n {tabs.map((tab) => {\n const isActive = currentTab === tab.id;\n return (\n <TouchableOpacity\n key={tab.id}\n onPress={() => handleTabPress(tab.id)}\n style={[\n styles.tab,\n getTabStyle(isActive),\n ]}\n >\n <HStack spacing={4} align=\"center\">\n {tab.icon}\n <Typography \n variant=\"body\" \n style={{ \n color: isActive && variant === 'pills' \n ? theme.colors['primary-foreground'] \n : theme.colors.foreground \n }}\n >\n {tab.label}\n </Typography>\n {tab.badge !== undefined && tab.badge > 0 && (\n <View style={[styles.badge, { backgroundColor: theme.colors.error }]}>\n <Typography variant=\"caption\" style={{ color: theme.colors['error-foreground'] }}>\n {tab.badge > 99 ? '99+' : tab.badge}\n </Typography>\n </View>\n )}\n </HStack>\n </TouchableOpacity>\n );\n })}\n </HStack>\n </ScrollView>\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n width: '100%',\n },\n scrollContent: {\n paddingHorizontal: 16,\n paddingVertical: 8,\n },\n tab: {\n paddingHorizontal: 16,\n paddingVertical: 8,\n },\n badge: {\n minWidth: 18,\n height: 18,\n borderRadius: 9,\n alignItems: 'center',\n justifyContent: 'center',\n paddingHorizontal: 4,\n },\n});\n\nTabs.displayName = 'Tabs';\n","import React, { useEffect } from 'react';\nimport { \n TouchableOpacity,\n StyleSheet, \n ViewStyle,\n Animated\n} from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport { Typography } from '../atoms/Typography';\nimport { HStack } from '../atoms/Stack';\n\nexport type ToastVariant = 'info' | 'success' | 'warning' | 'error';\n\nexport interface ToastProps {\n id: string;\n message: string;\n variant?: ToastVariant;\n duration?: number;\n onDismiss?: (id: string) => void;\n dismissAction?: string;\n style?: ViewStyle;\n /** Entity name for schema-driven auto-fetch */\n entity?: string;\n /** Payload for dismiss action */\n actionPayload?: Record<string, unknown>;\n}\n\nexport const Toast: React.FC<ToastProps> = ({\n id,\n message,\n variant = 'info',\n duration = 5000,\n onDismiss,\n dismissAction,\n style,\n actionPayload,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n const translateY = React.useRef(new Animated.Value(-100)).current;\n const opacity = React.useRef(new Animated.Value(0)).current;\n\n useEffect(() => {\n Animated.parallel([\n Animated.timing(translateY, {\n toValue: 0,\n duration: 300,\n useNativeDriver: true,\n }),\n Animated.timing(opacity, {\n toValue: 1,\n duration: 300,\n useNativeDriver: true,\n }),\n ]).start();\n\n if (duration > 0) {\n const timer = setTimeout(() => {\n handleDismiss();\n }, duration);\n\n return () => clearTimeout(timer);\n }\n }, [duration]);\n\n const handleDismiss = () => {\n Animated.parallel([\n Animated.timing(translateY, {\n toValue: -100,\n duration: 200,\n useNativeDriver: true,\n }),\n Animated.timing(opacity, {\n toValue: 0,\n duration: 200,\n useNativeDriver: true,\n }),\n ]).start(() => {\n if (dismissAction) {\n eventBus.emit(`UI:${dismissAction}`, { ...actionPayload, toastId: id });\n }\n onDismiss?.(id);\n });\n };\n\n const variantStyles: Record<ToastVariant, { bg: string }> = {\n info: { bg: theme.colors.info },\n success: { bg: theme.colors.success },\n warning: { bg: theme.colors.warning },\n error: { bg: theme.colors.error },\n };\n\n const { bg } = variantStyles[variant];\n const textColor = variant === 'warning' ? '#000000' : '#ffffff';\n\n return (\n <Animated.View\n style={[\n styles.container,\n { backgroundColor: bg },\n { transform: [{ translateY }], opacity },\n style,\n ]}\n >\n <HStack spacing={12} align=\"center\" justify=\"space-between\">\n <Typography variant=\"body\" style={{ color: textColor, flex: 1 }}>\n {message}\n </Typography>\n \n <TouchableOpacity onPress={handleDismiss} style={styles.dismiss}>\n <Typography variant=\"body\" style={{ color: textColor }}>\n ✕\n </Typography>\n </TouchableOpacity>\n </HStack>\n </Animated.View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n borderRadius: 8,\n padding: 12,\n marginHorizontal: 16,\n marginVertical: 4,\n shadowColor: '#000',\n shadowOffset: { width: 0, height: 2 },\n shadowOpacity: 0.2,\n shadowRadius: 4,\n elevation: 4,\n },\n dismiss: {\n padding: 4,\n },\n});\n\nToast.displayName = 'Toast';\n","import React from 'react';\nimport { View, ScrollView, StyleSheet, ViewStyle } from 'react-native';\nimport { useTheme } from '../../providers/ThemeContext';\nimport { useEventBus } from '../../hooks/useEventBus';\nimport { Typography } from '../atoms/Typography';\nimport { Card } from '../atoms/Card';\nimport { HStack } from '../atoms/Stack';\nimport { Button } from '../atoms/Button';\nimport { LoadingState } from './LoadingState';\nimport { ErrorState } from './ErrorState';\n\nexport interface CodeBlockProps {\n /** Code content to display */\n code: string;\n /** Programming language for syntax highlighting hint */\n language?: string;\n /** Whether to show line numbers */\n showLineNumbers?: boolean;\n /** Whether to show copy button */\n showCopyButton?: boolean;\n /** Whether to allow horizontal scrolling */\n scrollable?: boolean;\n /** Style override */\n style?: ViewStyle;\n /** Loading state indicator */\n isLoading?: boolean;\n /** Error state */\n error?: Error | null;\n /** Entity name for schema-driven auto-fetch */\n entity?: string;\n /** Declarative copy event name - emits UI:${copyEvent} via eventBus */\n copyEvent?: string;\n}\n\n// Simple syntax highlighting tokens\ninterface Token {\n text: string;\n style: 'keyword' | 'string' | 'comment' | 'number' | 'function' | 'default';\n}\n\nconst KEYWORDS = [\n 'const', 'let', 'var', 'function', 'return', 'if', 'else', 'for', 'while',\n 'import', 'export', 'from', 'class', 'interface', 'type', 'async', 'await',\n 'try', 'catch', 'throw', 'new', 'this', 'true', 'false', 'null', 'undefined',\n];\n\nconst TOKEN_COLORS: Record<Token['style'], string> = {\n keyword: '#c678dd',\n string: '#98c379',\n comment: '#5c6370',\n number: '#d19a66',\n function: '#61afef',\n default: '#abb2bf',\n};\n\n/**\n * Simple tokenizer for basic syntax highlighting\n */\nconst tokenizeCode = (code: string): Token[][] => {\n const lines = code.split('\\n');\n\n return lines.map((line) => {\n const tokens: Token[] = [];\n let remaining = line;\n\n while (remaining.length > 0) {\n let matched = false;\n\n // Check for comments\n if (remaining.startsWith('//')) {\n tokens.push({ text: remaining, style: 'comment' });\n break;\n }\n\n // Check for strings (double quotes)\n if (remaining.startsWith('\"')) {\n const endIndex = remaining.indexOf('\"', 1);\n if (endIndex > 0) {\n tokens.push({ text: remaining.slice(0, endIndex + 1), style: 'string' });\n remaining = remaining.slice(endIndex + 1);\n matched = true;\n continue;\n }\n }\n\n // Check for strings (single quotes)\n if (remaining.startsWith(\"'\")) {\n const endIndex = remaining.indexOf(\"'\", 1);\n if (endIndex > 0) {\n tokens.push({ text: remaining.slice(0, endIndex + 1), style: 'string' });\n remaining = remaining.slice(endIndex + 1);\n matched = true;\n continue;\n }\n }\n\n // Check for strings (template literals)\n if (remaining.startsWith('`')) {\n const endIndex = remaining.indexOf('`', 1);\n if (endIndex > 0) {\n tokens.push({ text: remaining.slice(0, endIndex + 1), style: 'string' });\n remaining = remaining.slice(endIndex + 1);\n matched = true;\n continue;\n }\n }\n\n // Check for numbers\n const numberMatch = remaining.match(/^\\d+(\\.\\d+)?/);\n if (numberMatch) {\n tokens.push({ text: numberMatch[0], style: 'number' });\n remaining = remaining.slice(numberMatch[0].length);\n matched = true;\n continue;\n }\n\n // Check for keywords and identifiers\n const wordMatch = remaining.match(/^[a-zA-Z_][a-zA-Z0-9_]*/);\n if (wordMatch) {\n const word = wordMatch[0];\n const style: Token['style'] = KEYWORDS.includes(word) ? 'keyword' : 'default';\n tokens.push({ text: word, style });\n remaining = remaining.slice(word.length);\n matched = true;\n continue;\n }\n\n // Check for function calls (identifier followed by opening paren)\n const funcMatch = remaining.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\\s*\\(/);\n if (funcMatch && !KEYWORDS.includes(funcMatch[1])) {\n tokens.pop(); // Remove the identifier we just added\n tokens.push({ text: funcMatch[1], style: 'function' });\n tokens.push({ text: '(', style: 'default' });\n remaining = remaining.slice(funcMatch[0].length - 1);\n matched = true;\n continue;\n }\n\n // If nothing matched, take the first character as default\n if (!matched) {\n tokens.push({ text: remaining[0], style: 'default' });\n remaining = remaining.slice(1);\n }\n }\n\n return tokens;\n });\n};\n\nexport const CodeBlock: React.FC<CodeBlockProps> = ({\n code,\n language,\n showLineNumbers = true,\n showCopyButton = true,\n scrollable = true,\n style,\n isLoading,\n error,\n copyEvent,\n}) => {\n const theme = useTheme();\n const eventBus = useEventBus();\n\n const handleCopy = () => {\n if (copyEvent) {\n eventBus.emit(`UI:${copyEvent}`, { code, language });\n }\n };\n\n if (isLoading) {\n return (\n <Card style={[styles.container, style || {}]}>\n <LoadingState message=\"Loading code...\" />\n </Card>\n );\n }\n\n if (error) {\n return (\n <Card style={[styles.container, style || {}]}>\n <ErrorState message={error.message} />\n </Card>\n );\n }\n\n const tokenizedLines = tokenizeCode(code);\n const lineNumberWidth = String(tokenizedLines.length).length * 10 + 16;\n\n const CodeContent = (\n <View style={styles.codeContainer}>\n {tokenizedLines.map((tokens, lineIndex) => (\n <View key={lineIndex} style={styles.line}>\n {showLineNumbers && (\n <View style={[styles.lineNumber, { width: lineNumberWidth }]}>\n <Typography\n variant=\"caption\"\n style={{ color: theme.colors['muted-foreground'] }}\n >\n {lineIndex + 1}\n </Typography>\n </View>\n )}\n <View style={styles.lineContent}>\n {tokens.length === 0 ? (\n <Typography variant=\"body\"> </Typography>\n ) : (\n <Typography variant=\"body\">\n {tokens.map((token, tokenIndex) => (\n <Typography\n key={tokenIndex}\n variant=\"body\"\n style={{\n color: TOKEN_COLORS[token.style],\n fontFamily: 'monospace',\n }}\n >\n {token.text}\n </Typography>\n ))}\n </Typography>\n )}\n </View>\n </View>\n ))}\n </View>\n );\n\n return (\n <Card style={[styles.container, style || {}]} padding=\"none\">\n {(language || showCopyButton) && (\n <HStack\n spacing={8}\n align=\"center\"\n justify=\"space-between\"\n style={[\n styles.header,\n { backgroundColor: theme.colors.muted, borderBottomColor: theme.colors.border },\n ]}\n >\n {language ? (\n <Typography\n variant=\"caption\"\n style={{\n color: theme.colors['muted-foreground'],\n textTransform: 'uppercase',\n }}\n >\n {language}\n </Typography>\n ) : (\n <View />\n )}\n {showCopyButton && (\n <Button variant=\"ghost\" size=\"sm\" onPress={handleCopy}>\n Copy\n </Button>\n )}\n </HStack>\n )}\n\n {scrollable ? (\n <ScrollView horizontal showsHorizontalScrollIndicator={true}>\n {CodeContent}\n </ScrollView>\n ) : (\n CodeContent\n )}\n </Card>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n overflow: 'hidden',\n },\n header: {\n paddingHorizontal: 16,\n paddingVertical: 8,\n borderBottomWidth: 1,\n },\n codeContainer: {\n padding: 16,\n },\n line: {\n flexDirection: 'row',\n },\n lineNumber: {\n alignItems: 'flex-end',\n paddingRight: 16,\n opacity: 0.5,\n },\n lineContent: {\n flex: 1,\n },\n});\n\nCodeBlock.displayName = 'CodeBlock';\n","import React from 'react';\nimport { View, Text, StyleSheet, ViewStyle } from 'react-native';\nimport { useTheme } from '../../../providers/ThemeContext';\nimport { HealthBar } from '../../atoms/game/HealthBar';\nimport { ScoreDisplay } from '../../atoms/game/ScoreDisplay';\n\nexport interface StatBadgeProps {\n /** Stat label */\n label: string;\n /** Current value (defaults to 0 if not provided) */\n value?: number | string;\n /** Maximum value (for bar/hearts format) */\n max?: number;\n /** Data source entity name (for schema config) */\n source?: string;\n /** Field name in the source (for schema config) */\n field?: string;\n /** Display format */\n format?: 'number' | 'hearts' | 'bar' | 'text' | string;\n /** Icon component or emoji */\n icon?: React.ReactNode;\n /** Size variant */\n size?: 'sm' | 'md' | 'lg' | string;\n /** Visual variant */\n variant?: 'default' | 'primary' | 'success' | 'warning' | 'danger' | string;\n /** Additional styles */\n style?: ViewStyle;\n}\n\nconst sizeMap: Record<string, { padding: number; fontSize: number }> = {\n sm: { padding: 8, fontSize: 12 },\n md: { padding: 12, fontSize: 14 },\n lg: { padding: 16, fontSize: 16 },\n};\n\nconst variantMap: Record<string, { backgroundColor: string; borderColor: string }> = {\n default: { backgroundColor: 'rgba(31, 41, 55, 0.8)', borderColor: '#374151' },\n primary: { backgroundColor: 'rgba(30, 58, 138, 0.8)', borderColor: '#1d4ed8' },\n success: { backgroundColor: 'rgba(20, 83, 45, 0.8)', borderColor: '#15803d' },\n warning: { backgroundColor: 'rgba(113, 63, 18, 0.8)', borderColor: '#a16207' },\n danger: { backgroundColor: 'rgba(127, 29, 29, 0.8)', borderColor: '#b91c1c' },\n};\n\nexport const StatBadge: React.FC<StatBadgeProps> = ({\n label,\n value = 0,\n max,\n format = 'number',\n icon,\n size = 'md',\n variant = 'default',\n style,\n // Ignored config props (used for schema binding)\n source: _source,\n field: _field,\n}) => {\n const theme = useTheme();\n const numValue = typeof value === 'number' ? value : parseInt(String(value), 10) || 0;\n const sizeStyles = sizeMap[size] ?? sizeMap.md;\n const variantStyles = variantMap[variant] ?? variantMap.default;\n\n return (\n <View\n style={[\n styles.container,\n {\n backgroundColor: variantStyles.backgroundColor,\n borderColor: variantStyles.borderColor,\n padding: sizeStyles.padding,\n },\n style as never,\n ]}\n >\n {icon && (\n <Text style={{ fontSize: 18, marginRight: 8 }}>\n {icon as string}\n </Text>\n )}\n \n <Text\n style={{\n fontSize: sizeStyles.fontSize,\n color: theme.colors['muted-foreground'],\n fontWeight: '500',\n marginRight: 8,\n }}\n >\n {label}\n </Text>\n \n {format === 'hearts' && max && (\n <HealthBar\n current={numValue}\n max={max}\n format=\"hearts\"\n size={size === 'lg' ? 'md' : 'sm'}\n />\n )}\n \n {format === 'bar' && max && (\n <HealthBar\n current={numValue}\n max={max}\n format=\"bar\"\n size={size === 'lg' ? 'md' : 'sm'}\n />\n )}\n \n {format === 'number' && (\n <ScoreDisplay\n value={numValue}\n size={size === 'lg' ? 'md' : 'sm'}\n animated\n />\n )}\n \n {format === 'text' && (\n <Text\n style={{\n fontSize: sizeStyles.fontSize,\n color: theme.colors['primary-foreground'],\n fontWeight: '700',\n }}\n >\n {value}\n </Text>\n )}\n </View>\n );\n};\n\nconst styles = StyleSheet.create({\n container: {\n flexDirection: 'row',\n alignItems: 'center',\n borderRadius: 8,\n borderWidth: 1,\n },\n});\n\nStatBadge.displayName = 'StatBadge';\n"],"mappings":"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","names":["React","StyleSheet","React","styles","StyleSheet","React","View","StyleSheet","TouchableOpacity","React","View","styles","TouchableOpacity","StyleSheet","React","View","TouchableOpacity","StyleSheet","React","View","styles","TouchableOpacity","StyleSheet","React","TouchableOpacity","StyleSheet","Animated","React","Animated","styles","TouchableOpacity","StyleSheet","React","View","ScrollView","StyleSheet","React","styles","View","ScrollView","StyleSheet","React","View","StyleSheet","React","View","styles","StyleSheet"]}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import {
|
|
2
|
+
almadarDark,
|
|
3
|
+
almadarLight
|
|
4
|
+
} from "./chunk-MFU7Q7LU.js";
|
|
5
|
+
import {
|
|
6
|
+
ThemeContext
|
|
7
|
+
} from "./chunk-CUAWHLEK.js";
|
|
8
|
+
|
|
9
|
+
// src/providers/ThemeProvider.tsx
|
|
10
|
+
import React, { createContext, useContext, useState, useCallback } from "react";
|
|
11
|
+
import { useColorScheme } from "react-native";
|
|
12
|
+
var ThemeModeContext = createContext({
|
|
13
|
+
mode: "system",
|
|
14
|
+
resolvedMode: "light",
|
|
15
|
+
toggleMode: () => {
|
|
16
|
+
},
|
|
17
|
+
setMode: () => {
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
var useThemeMode = () => useContext(ThemeModeContext);
|
|
21
|
+
var ThemeProvider = ({
|
|
22
|
+
children,
|
|
23
|
+
theme: initialTheme = "system",
|
|
24
|
+
customTheme
|
|
25
|
+
}) => {
|
|
26
|
+
const systemColorScheme = useColorScheme();
|
|
27
|
+
const [mode, setMode] = useState(initialTheme);
|
|
28
|
+
const resolvedMode = React.useMemo(() => {
|
|
29
|
+
if (mode === "system") {
|
|
30
|
+
return systemColorScheme === "dark" ? "dark" : "light";
|
|
31
|
+
}
|
|
32
|
+
return mode;
|
|
33
|
+
}, [mode, systemColorScheme]);
|
|
34
|
+
const toggleMode = useCallback(() => {
|
|
35
|
+
setMode((prev) => {
|
|
36
|
+
if (prev === "system") {
|
|
37
|
+
return systemColorScheme === "dark" ? "light" : "dark";
|
|
38
|
+
}
|
|
39
|
+
return prev === "light" ? "dark" : "light";
|
|
40
|
+
});
|
|
41
|
+
}, [systemColorScheme]);
|
|
42
|
+
const effectiveTheme = React.useMemo(() => {
|
|
43
|
+
if (customTheme) return customTheme;
|
|
44
|
+
return resolvedMode === "dark" ? almadarDark : almadarLight;
|
|
45
|
+
}, [customTheme, resolvedMode]);
|
|
46
|
+
const modeValue = React.useMemo(() => ({
|
|
47
|
+
mode,
|
|
48
|
+
resolvedMode,
|
|
49
|
+
toggleMode,
|
|
50
|
+
setMode
|
|
51
|
+
}), [mode, resolvedMode, toggleMode]);
|
|
52
|
+
return /* @__PURE__ */ React.createElement(ThemeModeContext.Provider, { value: modeValue }, /* @__PURE__ */ React.createElement(ThemeContext.Provider, { value: effectiveTheme }, children));
|
|
53
|
+
};
|
|
54
|
+
|
|
55
|
+
export {
|
|
56
|
+
useThemeMode,
|
|
57
|
+
ThemeProvider
|
|
58
|
+
};
|
|
59
|
+
//# sourceMappingURL=chunk-A56SRZKI.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/providers/ThemeProvider.tsx"],"sourcesContent":["import React, { createContext, useContext, useState, useCallback } from 'react';\nimport { useColorScheme } from 'react-native';\nimport { ThemeContext, RNTheme } from './ThemeContext';\nimport { almadarLight, almadarDark } from '../themes';\n\nexport { RNTheme } from './ThemeContext';\n\nexport interface ThemeModeContextValue {\n mode: 'light' | 'dark' | 'system';\n resolvedMode: 'light' | 'dark';\n toggleMode: () => void;\n setMode: (mode: 'light' | 'dark' | 'system') => void;\n}\n\nconst ThemeModeContext = createContext<ThemeModeContextValue>({\n mode: 'system',\n resolvedMode: 'light',\n toggleMode: () => {},\n setMode: () => {},\n});\n\nexport const useThemeMode = () => useContext(ThemeModeContext);\n\nexport interface ThemeProviderProps {\n children: React.ReactNode;\n theme?: 'light' | 'dark' | 'system';\n customTheme?: RNTheme;\n}\n\nexport const ThemeProvider: React.FC<ThemeProviderProps> = ({\n children,\n theme: initialTheme = 'system',\n customTheme,\n}) => {\n const systemColorScheme = useColorScheme();\n const [mode, setMode] = useState<'light' | 'dark' | 'system'>(initialTheme);\n\n const resolvedMode: 'light' | 'dark' = React.useMemo(() => {\n if (mode === 'system') {\n return systemColorScheme === 'dark' ? 'dark' : 'light';\n }\n return mode;\n }, [mode, systemColorScheme]);\n\n const toggleMode = useCallback(() => {\n setMode(prev => {\n if (prev === 'system') {\n return systemColorScheme === 'dark' ? 'light' : 'dark';\n }\n return prev === 'light' ? 'dark' : 'light';\n });\n }, [systemColorScheme]);\n\n const effectiveTheme = React.useMemo(() => {\n if (customTheme) return customTheme;\n return resolvedMode === 'dark' ? almadarDark : almadarLight;\n }, [customTheme, resolvedMode]);\n\n const modeValue = React.useMemo<ThemeModeContextValue>(() => ({\n mode,\n resolvedMode,\n toggleMode,\n setMode,\n }), [mode, resolvedMode, toggleMode]);\n\n return (\n <ThemeModeContext.Provider value={modeValue}>\n <ThemeContext.Provider value={effectiveTheme}>\n {children}\n </ThemeContext.Provider>\n </ThemeModeContext.Provider>\n );\n};\n"],"mappings":";;;;;;;;;AAAA,OAAO,SAAS,eAAe,YAAY,UAAU,mBAAmB;AACxE,SAAS,sBAAsB;AAa/B,IAAM,mBAAmB,cAAqC;AAAA,EAC5D,MAAM;AAAA,EACN,cAAc;AAAA,EACd,YAAY,MAAM;AAAA,EAAC;AAAA,EACnB,SAAS,MAAM;AAAA,EAAC;AAClB,CAAC;AAEM,IAAM,eAAe,MAAM,WAAW,gBAAgB;AAQtD,IAAM,gBAA8C,CAAC;AAAA,EAC1D;AAAA,EACA,OAAO,eAAe;AAAA,EACtB;AACF,MAAM;AACJ,QAAM,oBAAoB,eAAe;AACzC,QAAM,CAAC,MAAM,OAAO,IAAI,SAAsC,YAAY;AAE1E,QAAM,eAAiC,MAAM,QAAQ,MAAM;AACzD,QAAI,SAAS,UAAU;AACrB,aAAO,sBAAsB,SAAS,SAAS;AAAA,IACjD;AACA,WAAO;AAAA,EACT,GAAG,CAAC,MAAM,iBAAiB,CAAC;AAE5B,QAAM,aAAa,YAAY,MAAM;AACnC,YAAQ,UAAQ;AACd,UAAI,SAAS,UAAU;AACrB,eAAO,sBAAsB,SAAS,UAAU;AAAA,MAClD;AACA,aAAO,SAAS,UAAU,SAAS;AAAA,IACrC,CAAC;AAAA,EACH,GAAG,CAAC,iBAAiB,CAAC;AAEtB,QAAM,iBAAiB,MAAM,QAAQ,MAAM;AACzC,QAAI,YAAa,QAAO;AACxB,WAAO,iBAAiB,SAAS,cAAc;AAAA,EACjD,GAAG,CAAC,aAAa,YAAY,CAAC;AAE9B,QAAM,YAAY,MAAM,QAA+B,OAAO;AAAA,IAC5D;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAAI,CAAC,MAAM,cAAc,UAAU,CAAC;AAEpC,SACE,oCAAC,iBAAiB,UAAjB,EAA0B,OAAO,aAChC,oCAAC,aAAa,UAAb,EAAsB,OAAO,kBAC3B,QACH,CACF;AAEJ;","names":[]}
|