@almadar/mobile 1.1.0 → 1.2.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (104) hide show
  1. package/README.md +1 -1
  2. package/dist/{chunk-S2IT7WZT.js → chunk-5JVEVV74.js} +1 -1
  3. package/dist/{chunk-DY52O4T3.js → chunk-5U5Z65ZO.js} +46 -83
  4. package/dist/chunk-5U5Z65ZO.js.map +1 -0
  5. package/dist/chunk-A56SRZKI.js +59 -0
  6. package/dist/chunk-A56SRZKI.js.map +1 -0
  7. package/dist/{chunk-DMLYJFYQ.js → chunk-BFRVXKSP.js} +594 -88
  8. package/dist/chunk-BFRVXKSP.js.map +1 -0
  9. package/dist/{chunk-YMJZLYLV.js → chunk-ETD72PHO.js} +1991 -466
  10. package/dist/chunk-ETD72PHO.js.map +1 -0
  11. package/dist/{chunk-LFHVNHVA.js → chunk-GMR5FKKB.js} +3 -83
  12. package/dist/chunk-GMR5FKKB.js.map +1 -0
  13. package/dist/chunk-K2JGK2QD.js +17 -0
  14. package/dist/chunk-K2JGK2QD.js.map +1 -0
  15. package/dist/chunk-MLTSQPVN.js +337 -0
  16. package/dist/chunk-MLTSQPVN.js.map +1 -0
  17. package/dist/{chunk-T77JPOTP.js → chunk-PBO6ZN2M.js} +1206 -1269
  18. package/dist/chunk-PBO6ZN2M.js.map +1 -0
  19. package/dist/{chunk-7C5JCLLY.js → chunk-QUFLYKWA.js} +125 -45
  20. package/dist/chunk-QUFLYKWA.js.map +1 -0
  21. package/dist/chunk-TRYFJDL3.js +7 -0
  22. package/dist/chunk-TRYFJDL3.js.map +1 -0
  23. package/dist/components/atoms/AnimatedCounter.d.ts +15 -0
  24. package/dist/components/atoms/AnimatedCounter.d.ts.map +1 -0
  25. package/dist/components/atoms/DayCell.d.ts +18 -0
  26. package/dist/components/atoms/DayCell.d.ts.map +1 -0
  27. package/dist/components/atoms/InfiniteScrollSentinel.d.ts +14 -0
  28. package/dist/components/atoms/InfiniteScrollSentinel.d.ts.map +1 -0
  29. package/dist/components/atoms/RangeSlider.d.ts +20 -0
  30. package/dist/components/atoms/RangeSlider.d.ts.map +1 -0
  31. package/dist/components/atoms/StatusDot.d.ts +16 -0
  32. package/dist/components/atoms/StatusDot.d.ts.map +1 -0
  33. package/dist/components/atoms/TextHighlight.d.ts +17 -0
  34. package/dist/components/atoms/TextHighlight.d.ts.map +1 -0
  35. package/dist/components/atoms/ThemeToggle.d.ts +13 -0
  36. package/dist/components/atoms/ThemeToggle.d.ts.map +1 -0
  37. package/dist/components/atoms/TrendIndicator.d.ts +16 -0
  38. package/dist/components/atoms/TrendIndicator.d.ts.map +1 -0
  39. package/dist/components/atoms/TypewriterText.d.ts +16 -0
  40. package/dist/components/atoms/TypewriterText.d.ts.map +1 -0
  41. package/dist/components/atoms/index.d.ts +18 -0
  42. package/dist/components/atoms/index.d.ts.map +1 -1
  43. package/dist/components/atoms/index.js +30 -10
  44. package/dist/components/index.js +59 -18
  45. package/dist/components/molecules/Accordion.d.ts +20 -0
  46. package/dist/components/molecules/Accordion.d.ts.map +1 -0
  47. package/dist/components/molecules/CalendarGrid.d.ts +22 -0
  48. package/dist/components/molecules/CalendarGrid.d.ts.map +1 -0
  49. package/dist/components/molecules/Carousel.d.ts +17 -0
  50. package/dist/components/molecules/Carousel.d.ts.map +1 -0
  51. package/dist/components/molecules/DataGrid.d.ts +43 -0
  52. package/dist/components/molecules/DataGrid.d.ts.map +1 -0
  53. package/dist/components/molecules/DataList.d.ts +43 -0
  54. package/dist/components/molecules/DataList.d.ts.map +1 -0
  55. package/dist/components/molecules/FlipCard.d.ts +16 -0
  56. package/dist/components/molecules/FlipCard.d.ts.map +1 -0
  57. package/dist/components/molecules/Lightbox.d.ts +19 -0
  58. package/dist/components/molecules/Lightbox.d.ts.map +1 -0
  59. package/dist/components/molecules/NumberStepper.d.ts +19 -0
  60. package/dist/components/molecules/NumberStepper.d.ts.map +1 -0
  61. package/dist/components/molecules/PullToRefresh.d.ts +14 -0
  62. package/dist/components/molecules/PullToRefresh.d.ts.map +1 -0
  63. package/dist/components/molecules/SortableList.d.ts +17 -0
  64. package/dist/components/molecules/SortableList.d.ts.map +1 -0
  65. package/dist/components/molecules/StarRating.d.ts +19 -0
  66. package/dist/components/molecules/StarRating.d.ts.map +1 -0
  67. package/dist/components/molecules/SwipeableRow.d.ts +20 -0
  68. package/dist/components/molecules/SwipeableRow.d.ts.map +1 -0
  69. package/dist/components/molecules/index.d.ts +24 -0
  70. package/dist/components/molecules/index.d.ts.map +1 -1
  71. package/dist/components/molecules/index.js +30 -5
  72. package/dist/components/organisms/FormSection.d.ts +7 -0
  73. package/dist/components/organisms/FormSection.d.ts.map +1 -1
  74. package/dist/components/organisms/index.d.ts +0 -4
  75. package/dist/components/organisms/index.d.ts.map +1 -1
  76. package/dist/components/organisms/index.js +4 -8
  77. package/dist/index.js +72 -26
  78. package/dist/index.js.map +1 -1
  79. package/dist/lib/getNestedValue.d.ts +5 -0
  80. package/dist/lib/getNestedValue.d.ts.map +1 -0
  81. package/dist/lib/index.d.ts +1 -0
  82. package/dist/lib/index.d.ts.map +1 -1
  83. package/dist/lib/index.js +6 -2
  84. package/dist/providers/ThemeProvider.d.ts +7 -0
  85. package/dist/providers/ThemeProvider.d.ts.map +1 -1
  86. package/dist/providers/index.d.ts +2 -2
  87. package/dist/providers/index.d.ts.map +1 -1
  88. package/dist/providers/index.js +8 -4
  89. package/package.json +31 -30
  90. package/dist/chunk-6RVITGGH.js +0 -167
  91. package/dist/chunk-6RVITGGH.js.map +0 -1
  92. package/dist/chunk-7C5JCLLY.js.map +0 -1
  93. package/dist/chunk-DMLYJFYQ.js.map +0 -1
  94. package/dist/chunk-DY52O4T3.js.map +0 -1
  95. package/dist/chunk-LFHVNHVA.js.map +0 -1
  96. package/dist/chunk-T77JPOTP.js.map +0 -1
  97. package/dist/chunk-VLUJ7BXN.js +0 -36
  98. package/dist/chunk-VLUJ7BXN.js.map +0 -1
  99. package/dist/chunk-YMJZLYLV.js.map +0 -1
  100. package/dist/components/organisms/EntityCard.d.ts +0 -11
  101. package/dist/components/organisms/EntityCard.d.ts.map +0 -1
  102. package/dist/components/organisms/EntityList.d.ts +0 -17
  103. package/dist/components/organisms/EntityList.d.ts.map +0 -1
  104. /package/dist/{chunk-S2IT7WZT.js.map → chunk-5JVEVV74.js.map} +0 -0
package/README.md CHANGED
@@ -200,4 +200,4 @@ const theme = {
200
200
 
201
201
  ## License
202
202
 
203
- MIT
203
+ BSL 1.1 (Business Source License). Converts to Apache 2.0 on 2030-02-01. Non-production use is free.
@@ -68,4 +68,4 @@ export {
68
68
  convertThemeToRN,
69
69
  defaultRNTheme
70
70
  };
71
- //# sourceMappingURL=chunk-S2IT7WZT.js.map
71
+ //# sourceMappingURL=chunk-5JVEVV74.js.map
@@ -8,7 +8,7 @@ import {
8
8
  ScoreDisplay,
9
9
  Typography,
10
10
  VStack
11
- } from "./chunk-7C5JCLLY.js";
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 React3, { useCallback } from "react";
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__ */ React3.createElement(
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__ */ React3.createElement(
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__ */ React3.createElement(View, { style: styles2.centeredView }, /* @__PURE__ */ React3.createElement(TouchableOpacity, { activeOpacity: 1, onPress: (e) => e.stopPropagation() }, /* @__PURE__ */ React3.createElement(Card, { style: [styles2.modalCard, styles2[size]] }, /* @__PURE__ */ React3.createElement(VStack, { spacing: 16 }, title && /* @__PURE__ */ React3.createElement(HStack, { justify: "space-between", align: "center" }, /* @__PURE__ */ React3.createElement(Typography, { variant: "h4" }, title), showCloseButton && /* @__PURE__ */ React3.createElement(TouchableOpacity, { onPress: onClose }, /* @__PURE__ */ React3.createElement(Typography, { variant: "body", color: "#6b7280" }, "\u2715"))), /* @__PURE__ */ React3.createElement(View, null, children), footer && /* @__PURE__ */ React3.createElement(HStack, { justify: "flex-end", spacing: 12 }, footer)))))
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__ */ React3.createElement(
118
+ return /* @__PURE__ */ React2.createElement(
155
119
  Modal,
156
120
  {
157
121
  isOpen,
158
122
  onClose,
159
123
  title,
160
- footer: /* @__PURE__ */ React3.createElement(React3.Fragment, null, /* @__PURE__ */ React3.createElement(Typography, { variant: "body", color: "#6b7280", onPress: onClose }, cancelLabel), /* @__PURE__ */ React3.createElement(Typography, { variant: "body", color: "#ef4444", onPress: onConfirm }, confirmLabel))
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__ */ React3.createElement(Typography, { variant: "body" }, message)
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 React4 from "react";
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 = React4.useRef(
149
+ const translateX = React3.useRef(
186
150
  new Animated.Value(placement === "right" ? SCREEN_WIDTH : -SCREEN_WIDTH)
187
151
  ).current;
188
- React4.useEffect(() => {
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__ */ React4.createElement(View2, { style: styles3.overlay }, /* @__PURE__ */ React4.createElement(
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__ */ React4.createElement(
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__ */ React4.createElement(View2, { style: styles3.content }, (title || true) && /* @__PURE__ */ React4.createElement(View2, { style: styles3.header }, /* @__PURE__ */ React4.createElement(TouchableOpacity2, { onPress: onClose, style: styles3.closeButton }, /* @__PURE__ */ React4.createElement(Typography, { variant: "body", color: "#6b7280" }, "\u2715")), title && /* @__PURE__ */ React4.createElement(Typography, { variant: "h4" }, title)), /* @__PURE__ */ React4.createElement(VStack, { spacing: 0, style: styles3.children }, children))
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 React5, { useState } from "react";
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__ */ React5.createElement(View3, { style: [styles4.container, style] }, /* @__PURE__ */ React5.createElement(LoadingState, { message: "Loading..." }));
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__ */ React5.createElement(View3, { style: [styles4.container, style] }, /* @__PURE__ */ React5.createElement(ErrorState, { message: error.message }));
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__ */ React5.createElement(View3, { style: [styles4.container, style] }, /* @__PURE__ */ React5.createElement(
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__ */ React5.createElement(HStack, { spacing: 8 }, tabs.map((tab) => {
287
+ /* @__PURE__ */ React4.createElement(HStack, { spacing: 8 }, tabs.map((tab) => {
324
288
  const isActive = currentTab === tab.id;
325
- return /* @__PURE__ */ React5.createElement(
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__ */ React5.createElement(HStack, { spacing: 4, align: "center" }, tab.icon, /* @__PURE__ */ React5.createElement(
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__ */ React5.createElement(View3, { style: [styles4.badge, { backgroundColor: theme.colors.error }] }, /* @__PURE__ */ React5.createElement(Typography, { variant: "caption", style: { color: theme.colors["error-foreground"] } }, tab.badge > 99 ? "99+" : tab.badge)))
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 React6, { useEffect } from "react";
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 = React6.useRef(new Animated2.Value(-100)).current;
392
- const opacity = React6.useRef(new Animated2.Value(0)).current;
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__ */ React6.createElement(
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__ */ React6.createElement(HStack, { spacing: 12, align: "center", justify: "space-between" }, /* @__PURE__ */ React6.createElement(Typography, { variant: "body", style: { color: textColor, flex: 1 } }, message), /* @__PURE__ */ React6.createElement(TouchableOpacity4, { onPress: handleDismiss, style: styles5.dismiss }, /* @__PURE__ */ React6.createElement(Typography, { variant: "body", style: { color: textColor } }, "\u2715")))
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 React7 from "react";
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__ */ React7.createElement(Card, { style: [styles6.container, style || {}] }, /* @__PURE__ */ React7.createElement(LoadingState, { message: "Loading code..." }));
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__ */ React7.createElement(Card, { style: [styles6.container, style || {}] }, /* @__PURE__ */ React7.createElement(ErrorState, { message: error.message }));
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__ */ React7.createElement(View4, { style: styles6.codeContainer }, tokenizedLines.map((tokens, lineIndex) => /* @__PURE__ */ React7.createElement(View4, { key: lineIndex, style: styles6.line }, showLineNumbers && /* @__PURE__ */ React7.createElement(View4, { style: [styles6.lineNumber, { width: lineNumberWidth }] }, /* @__PURE__ */ React7.createElement(
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__ */ React7.createElement(View4, { style: styles6.lineContent }, tokens.length === 0 ? /* @__PURE__ */ React7.createElement(Typography, { variant: "body" }, " ") : /* @__PURE__ */ React7.createElement(Typography, { variant: "body" }, tokens.map((token, tokenIndex) => /* @__PURE__ */ React7.createElement(
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__ */ React7.createElement(Card, { style: [styles6.container, style || {}], padding: "none" }, (language || showCopyButton) && /* @__PURE__ */ React7.createElement(
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__ */ React7.createElement(
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__ */ React7.createElement(View4, null),
648
- showCopyButton && /* @__PURE__ */ React7.createElement(Button, { variant: "ghost", size: "sm", onPress: handleCopy }, "Copy")
649
- ), scrollable ? /* @__PURE__ */ React7.createElement(ScrollView2, { horizontal: true, showsHorizontalScrollIndicator: true }, CodeContent) : CodeContent);
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 React8 from "react";
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__ */ React8.createElement(
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__ */ React8.createElement(Text, { style: { fontSize: 18, marginRight: 8 } }, icon),
723
- /* @__PURE__ */ React8.createElement(
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__ */ React8.createElement(
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__ */ React8.createElement(
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__ */ React8.createElement(
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__ */ React8.createElement(
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-DY52O4T3.js.map
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":[]}