@inorain_development/hotel-smarters-chat-ui 1.0.0

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 (241) hide show
  1. package/README.md +110 -0
  2. package/lib/commonjs/features/chat/components/common/cart-icon.native.js +36 -0
  3. package/lib/commonjs/features/chat/components/common/cart-icon.native.js.map +1 -0
  4. package/lib/commonjs/features/chat/components/common/collapsible.js +20 -0
  5. package/lib/commonjs/features/chat/components/common/collapsible.js.map +1 -0
  6. package/lib/commonjs/features/chat/components/common/collapsible.native.js +38 -0
  7. package/lib/commonjs/features/chat/components/common/collapsible.native.js.map +1 -0
  8. package/lib/commonjs/features/chat/components/product/index.js +13 -0
  9. package/lib/commonjs/features/chat/components/product/index.js.map +1 -0
  10. package/lib/commonjs/features/chat/components/product/product.js +83 -0
  11. package/lib/commonjs/features/chat/components/product/product.js.map +1 -0
  12. package/lib/commonjs/features/chat/components/product/product.model.js +6 -0
  13. package/lib/commonjs/features/chat/components/product/product.model.js.map +1 -0
  14. package/lib/commonjs/features/chat/components/product/product.native.js +125 -0
  15. package/lib/commonjs/features/chat/components/product/product.native.js.map +1 -0
  16. package/lib/commonjs/features/chat/components/service/index.js +13 -0
  17. package/lib/commonjs/features/chat/components/service/index.js.map +1 -0
  18. package/lib/commonjs/features/chat/components/service/service.js +83 -0
  19. package/lib/commonjs/features/chat/components/service/service.js.map +1 -0
  20. package/lib/commonjs/features/chat/components/service/service.model.js +6 -0
  21. package/lib/commonjs/features/chat/components/service/service.model.js.map +1 -0
  22. package/lib/commonjs/features/chat/components/service/service.native.js +106 -0
  23. package/lib/commonjs/features/chat/components/service/service.native.js.map +1 -0
  24. package/lib/commonjs/features/chat/index.d.js +6 -0
  25. package/lib/commonjs/features/chat/index.d.js.map +1 -0
  26. package/lib/commonjs/features/chat/index.d.ts.map +1 -0
  27. package/lib/commonjs/features/chat/index.js +46 -0
  28. package/lib/commonjs/features/chat/index.js.map +1 -0
  29. package/lib/commonjs/features/chat/model/chat.model.js +23 -0
  30. package/lib/commonjs/features/chat/model/chat.model.js.map +1 -0
  31. package/lib/commonjs/features/chat/renderer/index.js +13 -0
  32. package/lib/commonjs/features/chat/renderer/index.js.map +1 -0
  33. package/lib/commonjs/features/chat/renderer/renderer.js +32 -0
  34. package/lib/commonjs/features/chat/renderer/renderer.js.map +1 -0
  35. package/lib/commonjs/features/chat/renderer/renderer.native.js +32 -0
  36. package/lib/commonjs/features/chat/renderer/renderer.native.js.map +1 -0
  37. package/lib/commonjs/index.d.js +17 -0
  38. package/lib/commonjs/index.d.js.map +1 -0
  39. package/lib/commonjs/index.d.ts.map +1 -0
  40. package/lib/commonjs/index.js +17 -0
  41. package/lib/commonjs/index.js.map +1 -0
  42. package/lib/commonjs/native.d.js +6 -0
  43. package/lib/commonjs/native.d.js.map +1 -0
  44. package/lib/commonjs/native.d.ts.map +1 -0
  45. package/lib/commonjs/native.js +46 -0
  46. package/lib/commonjs/native.js.map +1 -0
  47. package/lib/commonjs/package.json +1 -0
  48. package/lib/commonjs/styles/global.css +3 -0
  49. package/lib/commonjs/utils/i18n.utils.js +12 -0
  50. package/lib/commonjs/utils/i18n.utils.js.map +1 -0
  51. package/lib/commonjs/utils/theme.utils.js +37 -0
  52. package/lib/commonjs/utils/theme.utils.js.map +1 -0
  53. package/lib/commonjs/utils/use-expandable-list.js +23 -0
  54. package/lib/commonjs/utils/use-expandable-list.js.map +1 -0
  55. package/lib/commonjs/web.d.js +6 -0
  56. package/lib/commonjs/web.d.js.map +1 -0
  57. package/lib/commonjs/web.d.ts.map +1 -0
  58. package/lib/commonjs/web.js +46 -0
  59. package/lib/commonjs/web.js.map +1 -0
  60. package/lib/module/features/chat/components/common/cart-icon.native.js +32 -0
  61. package/lib/module/features/chat/components/common/cart-icon.native.js.map +1 -0
  62. package/lib/module/features/chat/components/common/collapsible.js +16 -0
  63. package/lib/module/features/chat/components/common/collapsible.js.map +1 -0
  64. package/lib/module/features/chat/components/common/collapsible.native.js +34 -0
  65. package/lib/module/features/chat/components/common/collapsible.native.js.map +1 -0
  66. package/lib/module/features/chat/components/product/index.js +4 -0
  67. package/lib/module/features/chat/components/product/index.js.map +1 -0
  68. package/lib/module/features/chat/components/product/product.js +79 -0
  69. package/lib/module/features/chat/components/product/product.js.map +1 -0
  70. package/lib/module/features/chat/components/product/product.model.js +4 -0
  71. package/lib/module/features/chat/components/product/product.model.js.map +1 -0
  72. package/lib/module/features/chat/components/product/product.native.js +121 -0
  73. package/lib/module/features/chat/components/product/product.native.js.map +1 -0
  74. package/lib/module/features/chat/components/service/index.js +4 -0
  75. package/lib/module/features/chat/components/service/index.js.map +1 -0
  76. package/lib/module/features/chat/components/service/service.js +79 -0
  77. package/lib/module/features/chat/components/service/service.js.map +1 -0
  78. package/lib/module/features/chat/components/service/service.model.js +4 -0
  79. package/lib/module/features/chat/components/service/service.model.js.map +1 -0
  80. package/lib/module/features/chat/components/service/service.native.js +102 -0
  81. package/lib/module/features/chat/components/service/service.native.js.map +1 -0
  82. package/lib/module/features/chat/index.d.js +10 -0
  83. package/lib/module/features/chat/index.d.js.map +1 -0
  84. package/lib/module/features/chat/index.d.ts.map +1 -0
  85. package/lib/module/features/chat/index.js +7 -0
  86. package/lib/module/features/chat/index.js.map +1 -0
  87. package/lib/module/features/chat/model/chat.model.js +19 -0
  88. package/lib/module/features/chat/model/chat.model.js.map +1 -0
  89. package/lib/module/features/chat/renderer/index.js +4 -0
  90. package/lib/module/features/chat/renderer/index.js.map +1 -0
  91. package/lib/module/features/chat/renderer/renderer.js +28 -0
  92. package/lib/module/features/chat/renderer/renderer.js.map +1 -0
  93. package/lib/module/features/chat/renderer/renderer.native.js +28 -0
  94. package/lib/module/features/chat/renderer/renderer.native.js.map +1 -0
  95. package/lib/module/index.d.js +13 -0
  96. package/lib/module/index.d.js.map +1 -0
  97. package/lib/module/index.d.ts.map +1 -0
  98. package/lib/module/index.js +13 -0
  99. package/lib/module/index.js.map +1 -0
  100. package/lib/module/native.d.js +11 -0
  101. package/lib/module/native.d.js.map +1 -0
  102. package/lib/module/native.d.ts.map +1 -0
  103. package/lib/module/native.js +7 -0
  104. package/lib/module/native.js.map +1 -0
  105. package/lib/module/package.json +1 -0
  106. package/lib/module/styles/global.css +3 -0
  107. package/lib/module/utils/i18n.utils.js +8 -0
  108. package/lib/module/utils/i18n.utils.js.map +1 -0
  109. package/lib/module/utils/theme.utils.js +33 -0
  110. package/lib/module/utils/theme.utils.js.map +1 -0
  111. package/lib/module/utils/use-expandable-list.js +19 -0
  112. package/lib/module/utils/use-expandable-list.js.map +1 -0
  113. package/lib/module/web.d.js +10 -0
  114. package/lib/module/web.d.js.map +1 -0
  115. package/lib/module/web.d.ts.map +1 -0
  116. package/lib/module/web.js +7 -0
  117. package/lib/module/web.js.map +1 -0
  118. package/lib/typescript/commonjs/features/chat/components/common/cart-icon.native.d.ts +6 -0
  119. package/lib/typescript/commonjs/features/chat/components/common/cart-icon.native.d.ts.map +1 -0
  120. package/lib/typescript/commonjs/features/chat/components/common/collapsible.d.ts +6 -0
  121. package/lib/typescript/commonjs/features/chat/components/common/collapsible.d.ts.map +1 -0
  122. package/lib/typescript/commonjs/features/chat/components/common/collapsible.native.d.ts +6 -0
  123. package/lib/typescript/commonjs/features/chat/components/common/collapsible.native.d.ts.map +1 -0
  124. package/lib/typescript/commonjs/features/chat/components/product/index.d.ts +3 -0
  125. package/lib/typescript/commonjs/features/chat/components/product/index.d.ts.map +1 -0
  126. package/lib/typescript/commonjs/features/chat/components/product/product.d.ts +4 -0
  127. package/lib/typescript/commonjs/features/chat/components/product/product.d.ts.map +1 -0
  128. package/lib/typescript/commonjs/features/chat/components/product/product.model.d.ts +10 -0
  129. package/lib/typescript/commonjs/features/chat/components/product/product.model.d.ts.map +1 -0
  130. package/lib/typescript/commonjs/features/chat/components/product/product.native.d.ts +4 -0
  131. package/lib/typescript/commonjs/features/chat/components/product/product.native.d.ts.map +1 -0
  132. package/lib/typescript/commonjs/features/chat/components/service/index.d.ts +3 -0
  133. package/lib/typescript/commonjs/features/chat/components/service/index.d.ts.map +1 -0
  134. package/lib/typescript/commonjs/features/chat/components/service/service.d.ts +4 -0
  135. package/lib/typescript/commonjs/features/chat/components/service/service.d.ts.map +1 -0
  136. package/lib/typescript/commonjs/features/chat/components/service/service.model.d.ts +10 -0
  137. package/lib/typescript/commonjs/features/chat/components/service/service.model.d.ts.map +1 -0
  138. package/lib/typescript/commonjs/features/chat/components/service/service.native.d.ts +4 -0
  139. package/lib/typescript/commonjs/features/chat/components/service/service.native.d.ts.map +1 -0
  140. package/lib/typescript/commonjs/features/chat/index.d.ts +8 -0
  141. package/lib/typescript/commonjs/features/chat/index.d.ts.map +1 -0
  142. package/lib/typescript/commonjs/features/chat/model/chat.model.d.ts +31 -0
  143. package/lib/typescript/commonjs/features/chat/model/chat.model.d.ts.map +1 -0
  144. package/lib/typescript/commonjs/features/chat/renderer/index.d.ts +2 -0
  145. package/lib/typescript/commonjs/features/chat/renderer/index.d.ts.map +1 -0
  146. package/lib/typescript/commonjs/features/chat/renderer/renderer.d.ts +5 -0
  147. package/lib/typescript/commonjs/features/chat/renderer/renderer.d.ts.map +1 -0
  148. package/lib/typescript/commonjs/features/chat/renderer/renderer.native.d.ts +5 -0
  149. package/lib/typescript/commonjs/features/chat/renderer/renderer.native.d.ts.map +1 -0
  150. package/lib/typescript/commonjs/index.d.ts +11 -0
  151. package/lib/typescript/commonjs/index.d.ts.map +1 -0
  152. package/lib/typescript/commonjs/native.d.ts +8 -0
  153. package/lib/typescript/commonjs/native.d.ts.map +1 -0
  154. package/lib/typescript/commonjs/package.json +1 -0
  155. package/lib/typescript/commonjs/utils/i18n.utils.d.ts +3 -0
  156. package/lib/typescript/commonjs/utils/i18n.utils.d.ts.map +1 -0
  157. package/lib/typescript/commonjs/utils/theme.utils.d.ts +16 -0
  158. package/lib/typescript/commonjs/utils/theme.utils.d.ts.map +1 -0
  159. package/lib/typescript/commonjs/utils/use-expandable-list.d.ts +8 -0
  160. package/lib/typescript/commonjs/utils/use-expandable-list.d.ts.map +1 -0
  161. package/lib/typescript/commonjs/web.d.ts +8 -0
  162. package/lib/typescript/commonjs/web.d.ts.map +1 -0
  163. package/lib/typescript/module/features/chat/components/common/cart-icon.native.d.ts +6 -0
  164. package/lib/typescript/module/features/chat/components/common/cart-icon.native.d.ts.map +1 -0
  165. package/lib/typescript/module/features/chat/components/common/collapsible.d.ts +6 -0
  166. package/lib/typescript/module/features/chat/components/common/collapsible.d.ts.map +1 -0
  167. package/lib/typescript/module/features/chat/components/common/collapsible.native.d.ts +6 -0
  168. package/lib/typescript/module/features/chat/components/common/collapsible.native.d.ts.map +1 -0
  169. package/lib/typescript/module/features/chat/components/product/index.d.ts +3 -0
  170. package/lib/typescript/module/features/chat/components/product/index.d.ts.map +1 -0
  171. package/lib/typescript/module/features/chat/components/product/product.d.ts +4 -0
  172. package/lib/typescript/module/features/chat/components/product/product.d.ts.map +1 -0
  173. package/lib/typescript/module/features/chat/components/product/product.model.d.ts +10 -0
  174. package/lib/typescript/module/features/chat/components/product/product.model.d.ts.map +1 -0
  175. package/lib/typescript/module/features/chat/components/product/product.native.d.ts +4 -0
  176. package/lib/typescript/module/features/chat/components/product/product.native.d.ts.map +1 -0
  177. package/lib/typescript/module/features/chat/components/service/index.d.ts +3 -0
  178. package/lib/typescript/module/features/chat/components/service/index.d.ts.map +1 -0
  179. package/lib/typescript/module/features/chat/components/service/service.d.ts +4 -0
  180. package/lib/typescript/module/features/chat/components/service/service.d.ts.map +1 -0
  181. package/lib/typescript/module/features/chat/components/service/service.model.d.ts +10 -0
  182. package/lib/typescript/module/features/chat/components/service/service.model.d.ts.map +1 -0
  183. package/lib/typescript/module/features/chat/components/service/service.native.d.ts +4 -0
  184. package/lib/typescript/module/features/chat/components/service/service.native.d.ts.map +1 -0
  185. package/lib/typescript/module/features/chat/index.d.ts +8 -0
  186. package/lib/typescript/module/features/chat/index.d.ts.map +1 -0
  187. package/lib/typescript/module/features/chat/model/chat.model.d.ts +31 -0
  188. package/lib/typescript/module/features/chat/model/chat.model.d.ts.map +1 -0
  189. package/lib/typescript/module/features/chat/renderer/index.d.ts +2 -0
  190. package/lib/typescript/module/features/chat/renderer/index.d.ts.map +1 -0
  191. package/lib/typescript/module/features/chat/renderer/renderer.d.ts +5 -0
  192. package/lib/typescript/module/features/chat/renderer/renderer.d.ts.map +1 -0
  193. package/lib/typescript/module/features/chat/renderer/renderer.native.d.ts +5 -0
  194. package/lib/typescript/module/features/chat/renderer/renderer.native.d.ts.map +1 -0
  195. package/lib/typescript/module/index.d.ts +11 -0
  196. package/lib/typescript/module/index.d.ts.map +1 -0
  197. package/lib/typescript/module/native.d.ts +8 -0
  198. package/lib/typescript/module/native.d.ts.map +1 -0
  199. package/lib/typescript/module/package.json +1 -0
  200. package/lib/typescript/module/utils/i18n.utils.d.ts +3 -0
  201. package/lib/typescript/module/utils/i18n.utils.d.ts.map +1 -0
  202. package/lib/typescript/module/utils/theme.utils.d.ts +16 -0
  203. package/lib/typescript/module/utils/theme.utils.d.ts.map +1 -0
  204. package/lib/typescript/module/utils/use-expandable-list.d.ts +8 -0
  205. package/lib/typescript/module/utils/use-expandable-list.d.ts.map +1 -0
  206. package/lib/typescript/module/web.d.ts +8 -0
  207. package/lib/typescript/module/web.d.ts.map +1 -0
  208. package/nativewind-env.d.ts +1 -0
  209. package/package.json +142 -0
  210. package/src/features/chat/components/common/cart-icon.native.tsx +20 -0
  211. package/src/features/chat/components/common/collapsible.native.tsx +28 -0
  212. package/src/features/chat/components/common/collapsible.tsx +13 -0
  213. package/src/features/chat/components/product/index.ts +2 -0
  214. package/src/features/chat/components/product/product.model.ts +10 -0
  215. package/src/features/chat/components/product/product.native.tsx +117 -0
  216. package/src/features/chat/components/product/product.tsx +80 -0
  217. package/src/features/chat/components/service/index.ts +2 -0
  218. package/src/features/chat/components/service/service.model.ts +10 -0
  219. package/src/features/chat/components/service/service.native.tsx +96 -0
  220. package/src/features/chat/components/service/service.tsx +80 -0
  221. package/src/features/chat/index.d.ts +8 -0
  222. package/src/features/chat/index.d.ts.map +1 -0
  223. package/src/features/chat/index.ts +13 -0
  224. package/src/features/chat/model/chat.model.ts +36 -0
  225. package/src/features/chat/renderer/index.ts +1 -0
  226. package/src/features/chat/renderer/renderer.native.tsx +22 -0
  227. package/src/features/chat/renderer/renderer.tsx +22 -0
  228. package/src/index.d.ts +11 -0
  229. package/src/index.d.ts.map +1 -0
  230. package/src/index.ts +10 -0
  231. package/src/native.d.ts +9 -0
  232. package/src/native.d.ts.map +1 -0
  233. package/src/native.ts +13 -0
  234. package/src/styles/global.css +3 -0
  235. package/src/utils/i18n.utils.ts +7 -0
  236. package/src/utils/theme.utils.ts +47 -0
  237. package/src/utils/use-expandable-list.ts +12 -0
  238. package/src/web.d.ts +8 -0
  239. package/src/web.d.ts.map +1 -0
  240. package/src/web.ts +13 -0
  241. package/tailwind.config.js +43 -0
@@ -0,0 +1,96 @@
1
+ import { Fragment } from 'react';
2
+ import { Image, Pressable, Text, View } from 'react-native';
3
+ import { getThemeClasses } from '../../../../utils/theme.utils';
4
+ import { resolveText } from '../../../../utils/i18n.utils';
5
+ import { useExpandableList } from '../../../../utils/use-expandable-list';
6
+ import { Collapsible } from '../common/collapsible.native';
7
+ import { Theme } from '../../model/chat.model';
8
+ import type { ChatComponentProps } from '../../model/chat.model';
9
+ import type { ServiceItem } from './service.model';
10
+
11
+ export function Service({
12
+ data,
13
+ theme = Theme.Dark,
14
+ language,
15
+ actionLabel = 'Request',
16
+ onAction,
17
+ onSelect,
18
+ }: ChatComponentProps<ServiceItem>) {
19
+ const c = getThemeClasses(theme);
20
+ const items = Array.isArray(data) ? data : [data];
21
+ const { head, rest, expanded, hasMore, toggle } = useExpandableList(items);
22
+
23
+ const renderRow = (item: ServiceItem) => {
24
+ const name = resolveText(item.name, language);
25
+ const description = resolveText(item.description, language);
26
+
27
+ return (
28
+ <Pressable className="flex-row items-center gap-3" onPress={() => onSelect?.(item)}>
29
+ <Image
30
+ accessibilityLabel={name}
31
+ source={{ uri: item.image }}
32
+ className={`h-14 w-14 rounded-lg down-sm:h-12 down-sm:w-12 ${c.iconBg}`}
33
+ />
34
+
35
+ <View className="flex-1 gap-1">
36
+ <View className="flex-row items-center justify-between gap-2">
37
+ <Text className={`flex-1 text-base font-bold down-sm:text-sm ${c.title}`} numberOfLines={1}>
38
+ {name}
39
+ </Text>
40
+ <Text className={`text-base font-bold down-sm:text-sm ${c.price}`}>{item.price}</Text>
41
+ </View>
42
+
43
+ <View className="flex-row items-center justify-between gap-2">
44
+ <Text className={`flex-1 text-sm down-sm:text-xs ${c.subtitle}`} numberOfLines={2}>
45
+ {description}
46
+ </Text>
47
+ <Pressable
48
+ accessibilityRole="button"
49
+ onPress={() => onAction?.(item)}
50
+ className={`rounded-xl border px-3 py-1.5 ${c.actionBorder}`}
51
+ >
52
+ <Text className={`text-sm font-medium ${c.actionText}`}>{actionLabel}</Text>
53
+ </Pressable>
54
+ </View>
55
+ </View>
56
+ </Pressable>
57
+ );
58
+ };
59
+
60
+ return (
61
+ <View className="gap-2">
62
+ <View className={`rounded-2xl border px-3 py-2 ${c.surface} ${c.border}`}>
63
+ {head.map((item, index) => (
64
+ <Fragment key={item.id}>
65
+ {index > 0 ? <View className={`my-2.5 h-px ${c.divider}`} /> : null}
66
+ {renderRow(item)}
67
+ </Fragment>
68
+ ))}
69
+
70
+ {hasMore ? (
71
+ <>
72
+ <Collapsible expanded={expanded}>
73
+ {rest.map((item) => (
74
+ <Fragment key={item.id}>
75
+ <View className={`my-2.5 h-px ${c.divider}`} />
76
+ {renderRow(item)}
77
+ </Fragment>
78
+ ))}
79
+ </Collapsible>
80
+
81
+ <View className="mt-2 items-center">
82
+ <Pressable
83
+ onPress={toggle}
84
+ className={`rounded-xl border px-4 py-1.5 ${c.actionBorder}`}
85
+ >
86
+ <Text className={`text-sm font-medium ${c.actionText}`}>
87
+ {expanded ? 'Show less' : 'Show more'}
88
+ </Text>
89
+ </Pressable>
90
+ </View>
91
+ </>
92
+ ) : null}
93
+ </View>
94
+ </View>
95
+ );
96
+ }
@@ -0,0 +1,80 @@
1
+ import { Fragment } from 'react';
2
+ import { getThemeClasses } from '../../../../utils/theme.utils';
3
+ import { resolveText } from '../../../../utils/i18n.utils';
4
+ import { useExpandableList } from '../../../../utils/use-expandable-list';
5
+ import { Collapsible } from '../common/collapsible';
6
+ import { Theme } from '../../model/chat.model';
7
+ import type { ChatComponentProps } from '../../model/chat.model';
8
+ import type { ServiceItem } from './service.model';
9
+
10
+ export function Service({
11
+ data,
12
+ theme = Theme.Dark,
13
+ language,
14
+ onSelect,
15
+ }: ChatComponentProps<ServiceItem>) {
16
+ const c = getThemeClasses(theme);
17
+ const items = Array.isArray(data) ? data : [data];
18
+ const { head, rest, expanded, hasMore, toggle } = useExpandableList(items);
19
+
20
+ const renderRow = (item: ServiceItem) => {
21
+ const name = resolveText(item.name, language);
22
+ const description = resolveText(item.description, language);
23
+
24
+ return (
25
+ <div
26
+ className="flex cursor-pointer items-center gap-3"
27
+ onClick={() => onSelect?.(item)}
28
+ >
29
+ <img
30
+ src={item.image}
31
+ alt={name}
32
+ className={`h-14 w-14 rounded-lg object-cover down-sm:h-12 down-sm:w-12 ${c.iconBg}`}
33
+ />
34
+
35
+ <div className="flex min-w-0 flex-1 flex-col gap-1">
36
+ <div className="flex items-center justify-between gap-2">
37
+ <span className={`flex-1 truncate text-base font-bold down-sm:text-sm ${c.title}`}>{name}</span>
38
+ <span className={`shrink-0 text-base font-bold down-sm:text-sm ${c.price}`}>{item.price}</span>
39
+ </div>
40
+
41
+ <span className={`line-clamp-2 text-sm down-sm:text-xs ${c.subtitle}`}>{description}</span>
42
+ </div>
43
+ </div>
44
+ );
45
+ };
46
+
47
+ return (
48
+ <div className={`rounded-2xl border px-3 py-2 ${c.surface} ${c.border}`}>
49
+ {head.map((item, index) => (
50
+ <Fragment key={item.id}>
51
+ {index > 0 ? <div className={`my-2.5 h-px ${c.divider}`} /> : null}
52
+ {renderRow(item)}
53
+ </Fragment>
54
+ ))}
55
+
56
+ {hasMore ? (
57
+ <>
58
+ <Collapsible expanded={expanded}>
59
+ {rest.map((item) => (
60
+ <Fragment key={item.id}>
61
+ <div className={`my-2.5 h-px ${c.divider}`} />
62
+ {renderRow(item)}
63
+ </Fragment>
64
+ ))}
65
+ </Collapsible>
66
+
67
+ <div className="mt-2 flex justify-center">
68
+ <button
69
+ type="button"
70
+ onClick={toggle}
71
+ className={`rounded-xl border px-4 py-1.5 text-sm font-medium ${c.actionBorder} ${c.actionText}`}
72
+ >
73
+ {expanded ? 'Show less' : 'Show more'}
74
+ </button>
75
+ </div>
76
+ </>
77
+ ) : null}
78
+ </div>
79
+ );
80
+ }
@@ -0,0 +1,8 @@
1
+ /**
2
+ * `chat` feature barrel.
3
+ *
4
+ * Will re-export the feature's public surface (renderer, models, components)
5
+ * once they are implemented.
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC"}
@@ -0,0 +1,13 @@
1
+ export { Product } from './components/product';
2
+ export { Service } from './components/service';
3
+ export { ChatComponentRenderer } from './renderer';
4
+ export { ComponentType, ItemAction, Theme } from './model/chat.model';
5
+ export type { ProductItem } from './components/product/product.model';
6
+ export type { ServiceItem } from './components/service/service.model';
7
+ export type {
8
+ ActionHandler,
9
+ ChatComponentProps,
10
+ ItemCount,
11
+ Language,
12
+ LocalizedText,
13
+ } from './model/chat.model';
@@ -0,0 +1,36 @@
1
+ export enum Theme {
2
+ Dark = 'dark',
3
+ Light = 'light',
4
+ }
5
+
6
+ export type Language = string;
7
+ export type LocalizedText = Record<string, string>;
8
+
9
+ export enum ComponentType {
10
+ Product = 'product',
11
+ ProductList = 'productList',
12
+ Service = 'service',
13
+ ServiceList = 'serviceList',
14
+ }
15
+
16
+ export enum ItemAction {
17
+ Add = 'add',
18
+ }
19
+
20
+ export type ActionHandler<TItem = unknown> = (item: TItem, action?: ItemAction) => void;
21
+
22
+ export interface ItemCount {
23
+ id: number;
24
+ count: number;
25
+ }
26
+
27
+ export interface ChatComponentProps<TItem = unknown> {
28
+ type: ComponentType;
29
+ data: TItem | TItem[];
30
+ language?: Language;
31
+ onAction?: ActionHandler<TItem>;
32
+ onSelect?: ActionHandler<TItem>;
33
+ actionLabel?: string;
34
+ counts?: ItemCount[];
35
+ theme?: Theme;
36
+ }
@@ -0,0 +1 @@
1
+ export { ChatComponentRenderer } from './renderer';
@@ -0,0 +1,22 @@
1
+ import { Product } from '../components/product/product.native';
2
+ import { Service } from '../components/service/service.native';
3
+ import type { ProductItem } from '../components/product/product.model';
4
+ import type { ServiceItem } from '../components/service/service.model';
5
+ import { ComponentType } from '../model/chat.model';
6
+ import type { ChatComponentProps } from '../model/chat.model';
7
+
8
+ export function ChatComponentRenderer({
9
+ type,
10
+ ...rest
11
+ }: ChatComponentProps<ProductItem | ServiceItem>) {
12
+ switch (type) {
13
+ case ComponentType.Product:
14
+ case ComponentType.ProductList:
15
+ return <Product type={type} {...(rest as Omit<ChatComponentProps<ProductItem>, 'type'>)} />;
16
+ case ComponentType.Service:
17
+ case ComponentType.ServiceList:
18
+ return <Service type={type} {...(rest as Omit<ChatComponentProps<ServiceItem>, 'type'>)} />;
19
+ default:
20
+ return null;
21
+ }
22
+ }
@@ -0,0 +1,22 @@
1
+ import { Product } from '../components/product/product';
2
+ import { Service } from '../components/service/service';
3
+ import type { ProductItem } from '../components/product/product.model';
4
+ import type { ServiceItem } from '../components/service/service.model';
5
+ import { ComponentType } from '../model/chat.model';
6
+ import type { ChatComponentProps } from '../model/chat.model';
7
+
8
+ export function ChatComponentRenderer({
9
+ type,
10
+ ...rest
11
+ }: ChatComponentProps<ProductItem | ServiceItem>) {
12
+ switch (type) {
13
+ case ComponentType.Product:
14
+ case ComponentType.ProductList:
15
+ return <Product type={type} {...(rest as Omit<ChatComponentProps<ProductItem>, 'type'>)} />;
16
+ case ComponentType.Service:
17
+ case ComponentType.ServiceList:
18
+ return <Service type={type} {...(rest as Omit<ChatComponentProps<ServiceItem>, 'type'>)} />;
19
+ default:
20
+ return null;
21
+ }
22
+ }
package/src/index.d.ts ADDED
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Root entry (aggregator). Defaults to the web/DOM build.
3
+ *
4
+ * Prefer importing the explicit platform entry in apps:
5
+ * - `hotel-smarters-chat-ui/native` -> React Native (mobile + web client via react-native-web)
6
+ * - `hotel-smarters-chat-ui/web` -> React DOM (admin)
7
+ *
8
+ * Public exports are added here once domain components exist.
9
+ */
10
+ export * from './web';
11
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AACH,cAAc,OAAO,CAAC"}
package/src/index.ts ADDED
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Root entry (aggregator). Defaults to the web/DOM build.
3
+ *
4
+ * Prefer importing the explicit platform entry in apps:
5
+ * - `@inorain_development/hotel-smarters-chat-ui/native` -> React Native (mobile + web client via react-native-web)
6
+ * - `@inorain_development/hotel-smarters-chat-ui/web` -> React DOM (admin)
7
+ *
8
+ * Public exports are added here once domain components exist.
9
+ */
10
+ export * from './web';
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Native entry (mobile + web client via react-native-web).
3
+ * Re-exports the `*.native.tsx` (React Native) component implementations.
4
+ *
5
+ * Placeholder until domain components are added, e.g.:
6
+ * export { Event } from './features/chat/components/Event/Event.native';
7
+ */
8
+ export {};
9
+ //# sourceMappingURL=native.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"native.d.ts","sourceRoot":"","sources":["native.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,EAAE,CAAC"}
package/src/native.ts ADDED
@@ -0,0 +1,13 @@
1
+ export { Product } from './features/chat/components/product/product.native';
2
+ export { Service } from './features/chat/components/service/service.native';
3
+ export { ChatComponentRenderer } from './features/chat/renderer/renderer.native';
4
+ export { ComponentType, ItemAction, Theme } from './features/chat/model/chat.model';
5
+ export type { ProductItem } from './features/chat/components/product/product.model';
6
+ export type { ServiceItem } from './features/chat/components/service/service.model';
7
+ export type {
8
+ ActionHandler,
9
+ ChatComponentProps,
10
+ ItemCount,
11
+ Language,
12
+ LocalizedText,
13
+ } from './features/chat/model/chat.model';
@@ -0,0 +1,3 @@
1
+ @tailwind base;
2
+ @tailwind components;
3
+ @tailwind utilities;
@@ -0,0 +1,7 @@
1
+ import type { Language, LocalizedText } from '../features/chat/model/chat.model';
2
+
3
+ export function resolveText(text: LocalizedText, language?: Language): string {
4
+ if (language && text[language] != null) return text[language];
5
+ const first = Object.values(text)[0];
6
+ return first ?? '';
7
+ }
@@ -0,0 +1,47 @@
1
+ import { Theme } from '../features/chat/model/chat.model';
2
+
3
+ export interface ThemeClasses {
4
+ surface: string;
5
+ border: string;
6
+ title: string;
7
+ subtitle: string;
8
+ price: string;
9
+ actionBorder: string;
10
+ actionText: string;
11
+ divider: string;
12
+ iconBg: string;
13
+ iconText: string;
14
+ iconColor: string;
15
+ }
16
+
17
+ const DARK: ThemeClasses = {
18
+ surface: 'bg-chat-surface-dark',
19
+ border: 'border-chat-border-dark',
20
+ title: 'text-white',
21
+ subtitle: 'text-chat-subtitle-dark',
22
+ price: 'text-white',
23
+ actionBorder: 'border-neutral-700',
24
+ actionText: 'text-white',
25
+ divider: 'bg-neutral-800',
26
+ iconBg: 'bg-indigo-500/20',
27
+ iconText: 'text-indigo-300',
28
+ iconColor: '#a5b4fc',
29
+ };
30
+
31
+ const LIGHT: ThemeClasses = {
32
+ surface: 'bg-chat-surface-light',
33
+ border: 'border-chat-border-light',
34
+ title: 'text-neutral-900',
35
+ subtitle: 'text-neutral-500',
36
+ price: 'text-neutral-900',
37
+ actionBorder: 'border-slate-400',
38
+ actionText: 'text-neutral-900',
39
+ divider: 'bg-slate-300',
40
+ iconBg: 'bg-indigo-500/15',
41
+ iconText: 'text-indigo-500',
42
+ iconColor: '#6366f1',
43
+ };
44
+
45
+ export function getThemeClasses(theme: Theme = Theme.Dark): ThemeClasses {
46
+ return theme === Theme.Light ? LIGHT : DARK;
47
+ }
@@ -0,0 +1,12 @@
1
+ import { useState } from 'react';
2
+
3
+ const COLLAPSED_COUNT = 3;
4
+
5
+ export function useExpandableList<T>(items: T[], limit = COLLAPSED_COUNT) {
6
+ const [expanded, setExpanded] = useState(false);
7
+ const hasMore = items.length > limit;
8
+ const head = hasMore ? items.slice(0, limit) : items;
9
+ const rest = hasMore ? items.slice(limit) : [];
10
+ const toggle = () => setExpanded((v) => !v);
11
+ return { head, rest, expanded, hasMore, toggle };
12
+ }
package/src/web.d.ts ADDED
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Web / DOM entry (admin). Re-exports the `*.tsx` (DOM) component implementations.
3
+ *
4
+ * Placeholder until domain components are added, e.g.:
5
+ * export { Event } from './features/chat/components/Event/Event';
6
+ */
7
+ export {};
8
+ //# sourceMappingURL=web.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"web.d.ts","sourceRoot":"","sources":["web.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC"}
package/src/web.ts ADDED
@@ -0,0 +1,13 @@
1
+ export { Product } from './features/chat/components/product/product';
2
+ export { Service } from './features/chat/components/service/service';
3
+ export { ChatComponentRenderer } from './features/chat/renderer/renderer';
4
+ export { ComponentType, ItemAction, Theme } from './features/chat/model/chat.model';
5
+ export type { ProductItem } from './features/chat/components/product/product.model';
6
+ export type { ServiceItem } from './features/chat/components/service/service.model';
7
+ export type {
8
+ ActionHandler,
9
+ ChatComponentProps,
10
+ ItemCount,
11
+ Language,
12
+ LocalizedText,
13
+ } from './features/chat/model/chat.model';
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Shared Tailwind config for both web (tailwindcss) and React Native (NativeWind).
3
+ *
4
+ * Consumers can extend this via `presets: [require('@inorain_development/hotel-smarters-chat-ui/tailwind.config')]`
5
+ * so design tokens stay in sync across admin (DOM) and mobile/web-RN (NativeWind).
6
+ */
7
+ /** @type {import('tailwindcss').Config} */
8
+ module.exports = {
9
+ // NativeWind preset enables Tailwind class compilation in React Native.
10
+ presets: [require('nativewind/preset')],
11
+ content: ['./src/**/*.{ts,tsx}'],
12
+ theme: {
13
+ extend: {
14
+ colors: {
15
+ chat: {
16
+ 'surface-dark': 'rgb(26, 28, 40)',
17
+ 'surface-light': '#dfeaf2',
18
+ 'border-dark': 'rgba(255, 255, 255, 0.06)',
19
+ 'border-light': '#b4cbdc',
20
+ 'subtitle-dark': 'rgb(130, 132, 154)',
21
+ },
22
+ },
23
+ },
24
+ screens: {
25
+ xs: { min: '0' },
26
+ xsm: { min: '380px' },
27
+ sm: { min: '576px' },
28
+ md: { min: '786px' },
29
+ lg: { min: '1024px' },
30
+ xl: { min: '1280px' },
31
+ xxl: { min: '1366px' },
32
+ 'lg-xl': { min: '1512px' },
33
+ 'down-lg-xl': { max: '1512px' },
34
+ 'down-xxl': { max: '1399px' },
35
+ 'down-xl': { max: '1279px' },
36
+ 'down-lg': { max: '1023px' },
37
+ 'down-md': { max: '785px' },
38
+ 'down-sm': { max: '575px' },
39
+ 'down-xsm': { max: '380px' }
40
+ }
41
+ },
42
+ plugins: [],
43
+ };