@himakarinv/nativex 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 (170) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +105 -0
  3. package/images.d.ts +14 -0
  4. package/index.js +8 -0
  5. package/nativewind-preset.js +18 -0
  6. package/package.json +120 -0
  7. package/src/assets/branding/logo.jpg +0 -0
  8. package/src/assets/branding/softech-logo.png +0 -0
  9. package/src/assets/icons/2-layers.svg +3 -0
  10. package/src/assets/icons/Forbidden.svg +211 -0
  11. package/src/assets/icons/Internal-server-error.svg +119 -0
  12. package/src/assets/icons/Log-out-nav.svg +4 -0
  13. package/src/assets/icons/Not-Found.svg +282 -0
  14. package/src/assets/icons/Unauthorized.svg +314 -0
  15. package/src/assets/icons/User-Frame.svg +5 -0
  16. package/src/assets/icons/alert.svg +4 -0
  17. package/src/assets/icons/arrow-right.svg +3 -0
  18. package/src/assets/icons/avatar-female.svg +10 -0
  19. package/src/assets/icons/avatar-male.svg +10 -0
  20. package/src/assets/icons/bell.svg +3 -0
  21. package/src/assets/icons/calendar-event.svg +11 -0
  22. package/src/assets/icons/calendar.svg +6 -0
  23. package/src/assets/icons/card.svg +4 -0
  24. package/src/assets/icons/caret-right.svg +3 -0
  25. package/src/assets/icons/chat.svg +11 -0
  26. package/src/assets/icons/check.svg +3 -0
  27. package/src/assets/icons/checkbox-minus.svg +3 -0
  28. package/src/assets/icons/checkmark.svg +3 -0
  29. package/src/assets/icons/chevron-down.svg +3 -0
  30. package/src/assets/icons/chevron-left.svg +9 -0
  31. package/src/assets/icons/chevron-right.svg +9 -0
  32. package/src/assets/icons/circle-radio-active.svg +10 -0
  33. package/src/assets/icons/circle-radio.svg +10 -0
  34. package/src/assets/icons/clock.svg +3 -0
  35. package/src/assets/icons/close.svg +3 -0
  36. package/src/assets/icons/code.svg +3 -0
  37. package/src/assets/icons/country.svg +20 -0
  38. package/src/assets/icons/dot.svg +3 -0
  39. package/src/assets/icons/download.svg +1 -0
  40. package/src/assets/icons/dropdown-arrow.svg +3 -0
  41. package/src/assets/icons/dropdown-avatar.svg +3 -0
  42. package/src/assets/icons/email.svg +3 -0
  43. package/src/assets/icons/error.svg +3 -0
  44. package/src/assets/icons/eye-off.svg +1 -0
  45. package/src/assets/icons/eye.svg +1 -0
  46. package/src/assets/icons/hashtag-icon.svg +3 -0
  47. package/src/assets/icons/help-circle.svg +10 -0
  48. package/src/assets/icons/help.svg +4 -0
  49. package/src/assets/icons/hide-checkbox.svg +3 -0
  50. package/src/assets/icons/home-smile.svg +3 -0
  51. package/src/assets/icons/home.svg +3 -0
  52. package/src/assets/icons/info.svg +5 -0
  53. package/src/assets/icons/left-arrow.svg +3 -0
  54. package/src/assets/icons/log-out.svg +3 -0
  55. package/src/assets/icons/notification-box.svg +4 -0
  56. package/src/assets/icons/pencil.svg +1 -0
  57. package/src/assets/icons/plus.svg +3 -0
  58. package/src/assets/icons/radio-dot.svg +3 -0
  59. package/src/assets/icons/right-arrow.svg +3 -0
  60. package/src/assets/icons/search.svg +3 -0
  61. package/src/assets/icons/settings.svg +11 -0
  62. package/src/assets/icons/slack.svg +17 -0
  63. package/src/assets/icons/slash.svg +3 -0
  64. package/src/assets/icons/success.svg +3 -0
  65. package/src/assets/icons/successicon.svg +5 -0
  66. package/src/assets/icons/three-dot-vertical.svg +5 -0
  67. package/src/assets/icons/trash.svg +1 -0
  68. package/src/assets/icons/trend-down-01.svg +3 -0
  69. package/src/assets/icons/trend-up-01.svg +3 -0
  70. package/src/assets/icons/up-arrow.svg +3 -0
  71. package/src/assets/icons/user-plus.svg +10 -0
  72. package/src/assets/icons/user.svg +3 -0
  73. package/src/assets/icons/users.svg +3 -0
  74. package/src/assets/icons/vertical-dots-true-icon.svg +5 -0
  75. package/src/assets/icons/vertical-line.svg +3 -0
  76. package/src/assets/icons/vertical-three-dots-icon.svg +5 -0
  77. package/src/assets/icons/warning.svg +3 -0
  78. package/src/assets/icons/zap.svg +3 -0
  79. package/src/components/ActionsMenu/ActionsMenu.tsx +314 -0
  80. package/src/components/ActionsMenu/index.ts +2 -0
  81. package/src/components/Alert/Alert.tsx +291 -0
  82. package/src/components/Alert/index.ts +2 -0
  83. package/src/components/Badge/Badge.tsx +230 -0
  84. package/src/components/Badge/index.ts +2 -0
  85. package/src/components/Breadcrumb/Breadcrumb.tsx +364 -0
  86. package/src/components/Breadcrumb/index.ts +7 -0
  87. package/src/components/Button/Button.tsx +584 -0
  88. package/src/components/Button/index.ts +9 -0
  89. package/src/components/Checkbox/Checkbox.tsx +336 -0
  90. package/src/components/Checkbox/index.ts +2 -0
  91. package/src/components/CreatePassword/CreatePassword.tsx +161 -0
  92. package/src/components/CreatePassword/index.ts +2 -0
  93. package/src/components/DataTable/DataTable.tsx +822 -0
  94. package/src/components/DataTable/index.ts +10 -0
  95. package/src/components/Datepicker/Datepicker.tsx +797 -0
  96. package/src/components/Datepicker/index.ts +2 -0
  97. package/src/components/Dropdown/Dropdown.tsx +277 -0
  98. package/src/components/Dropdown/index.ts +7 -0
  99. package/src/components/DropdownMenu/DropdownMenu.tsx +471 -0
  100. package/src/components/DropdownMenu/index.ts +11 -0
  101. package/src/components/DynamicForm/DynamicForm.tsx +741 -0
  102. package/src/components/DynamicForm/index.ts +13 -0
  103. package/src/components/ErrorPages/ErrorPages.tsx +135 -0
  104. package/src/components/ErrorPages/index.ts +2 -0
  105. package/src/components/ForgotPassword/ForgotPassword.tsx +121 -0
  106. package/src/components/ForgotPassword/index.ts +2 -0
  107. package/src/components/HintError/HintError.tsx +37 -0
  108. package/src/components/HintError/index.ts +2 -0
  109. package/src/components/Icon/Icon.tsx +43 -0
  110. package/src/components/Icon/icon-registry.ts +227 -0
  111. package/src/components/Icon/index.ts +3 -0
  112. package/src/components/InputDropdown/InputDropdown.tsx +662 -0
  113. package/src/components/InputDropdown/index.ts +9 -0
  114. package/src/components/InputField/InputField.tsx +527 -0
  115. package/src/components/InputField/index.ts +2 -0
  116. package/src/components/Label/Label.tsx +88 -0
  117. package/src/components/Label/index.ts +2 -0
  118. package/src/components/LoginForm/LoginForm.tsx +158 -0
  119. package/src/components/LoginForm/index.ts +2 -0
  120. package/src/components/LoginShell/LoginShell.tsx +97 -0
  121. package/src/components/LoginShell/RoleCard.tsx +24 -0
  122. package/src/components/LoginShell/SoftechLogo.tsx +24 -0
  123. package/src/components/LoginShell/branding-assets.ts +2 -0
  124. package/src/components/LoginShell/index.ts +20 -0
  125. package/src/components/LoginShell/login-copy.ts +45 -0
  126. package/src/components/LoginShell/loginPageStyles.ts +210 -0
  127. package/src/components/Modals/Modals.tsx +313 -0
  128. package/src/components/Modals/index.ts +2 -0
  129. package/src/components/Offcanvas/Offcanvas.tsx +404 -0
  130. package/src/components/Offcanvas/index.ts +13 -0
  131. package/src/components/PageHeader/PageHeader.tsx +128 -0
  132. package/src/components/PageHeader/index.ts +2 -0
  133. package/src/components/Pagination/Pagination.tsx +540 -0
  134. package/src/components/Pagination/index.ts +8 -0
  135. package/src/components/ResetPassword/ResetPassword.tsx +172 -0
  136. package/src/components/ResetPassword/index.ts +2 -0
  137. package/src/components/RoleSelection/RoleSelection.tsx +111 -0
  138. package/src/components/RoleSelection/index.ts +2 -0
  139. package/src/components/SendOtp/SendOtp.tsx +149 -0
  140. package/src/components/SendOtp/index.ts +2 -0
  141. package/src/components/Sidenavbar/Sidenavbar.tsx +358 -0
  142. package/src/components/Sidenavbar/index.ts +2 -0
  143. package/src/components/StatCard/StatCard.tsx +393 -0
  144. package/src/components/StatCard/index.ts +6 -0
  145. package/src/components/Tabs/Tabs.tsx +239 -0
  146. package/src/components/Tabs/index.ts +2 -0
  147. package/src/components/Textarea/Textarea.tsx +217 -0
  148. package/src/components/Textarea/index.ts +2 -0
  149. package/src/components/Timepicker/Timepicker.tsx +384 -0
  150. package/src/components/Timepicker/index.ts +2 -0
  151. package/src/components/Toast/Toast.tsx +278 -0
  152. package/src/components/Toast/index.ts +2 -0
  153. package/src/components/Toggle/Toggle.tsx +296 -0
  154. package/src/components/Toggle/index.ts +2 -0
  155. package/src/components/Typeahead/Typeahead.tsx +521 -0
  156. package/src/components/Typeahead/index.ts +2 -0
  157. package/src/components/Verification/Verification.tsx +374 -0
  158. package/src/components/Verification/index.ts +2 -0
  159. package/src/index.ts +39 -0
  160. package/src/theme/borders.ts +19 -0
  161. package/src/theme/button.ts +41 -0
  162. package/src/theme/colors.ts +273 -0
  163. package/src/theme/index.ts +14 -0
  164. package/src/theme/nativewind-theme.js +182 -0
  165. package/src/theme/radius.ts +12 -0
  166. package/src/theme/shadows.ts +40 -0
  167. package/src/theme/spacing.ts +18 -0
  168. package/src/theme/typography.ts +35 -0
  169. package/src/utils/a11y.ts +21 -0
  170. package/svg.d.ts +7 -0
@@ -0,0 +1,2 @@
1
+ export { Datepicker, DatepickerMode } from './Datepicker';
2
+ export type { DatepickerDate, DatepickerDateRange, DatepickerProps } from './Datepicker';
@@ -0,0 +1,277 @@
1
+ import { useRef, useState } from 'react';
2
+ import {
3
+ Dimensions,
4
+ Modal,
5
+ Platform,
6
+ Pressable,
7
+ StyleSheet,
8
+ Text,
9
+ View,
10
+ type StyleProp,
11
+ type ViewStyle,
12
+ } from 'react-native';
13
+
14
+ import { borders, colors, radius, shadows, spacing, typography } from '../../theme';
15
+ import { Button, ButtonSize, IconPosition, dismissButtonFocus } from '../Button';
16
+ import { IconName } from '../Icon';
17
+
18
+ export const DropdownVariant = {
19
+ Primary: 'primary',
20
+ Secondary: 'secondary',
21
+ Success: 'success',
22
+ Danger: 'danger',
23
+ Warning: 'warning',
24
+ Info: 'info',
25
+ } as const;
26
+
27
+ export type DropdownVariant = (typeof DropdownVariant)[keyof typeof DropdownVariant];
28
+
29
+ export const DropdownSize = {
30
+ Small: 'sm',
31
+ Large: 'lg',
32
+ } as const;
33
+
34
+ export type DropdownSize = (typeof DropdownSize)[keyof typeof DropdownSize];
35
+
36
+ export const DropdownPlacement = {
37
+ Top: 'top',
38
+ Bottom: 'bottom',
39
+ Start: 'start',
40
+ End: 'end',
41
+ } as const;
42
+
43
+ export type DropdownPlacement = (typeof DropdownPlacement)[keyof typeof DropdownPlacement];
44
+
45
+ export type DropdownItem = {
46
+ label?: string;
47
+ value?: string;
48
+ disabled?: boolean;
49
+ divider?: boolean;
50
+ };
51
+
52
+ export type DropdownProps = {
53
+ label?: string;
54
+ items?: DropdownItem[];
55
+ variant?: DropdownVariant;
56
+ size?: DropdownSize;
57
+ split?: boolean;
58
+ placement?: DropdownPlacement;
59
+ onItemSelected?: (item: DropdownItem) => void;
60
+ style?: StyleProp<ViewStyle>;
61
+ };
62
+
63
+ const isNative = Platform.OS !== 'web';
64
+ const MENU_MIN_WIDTH = spacing['7xl'] + spacing['7xl'] + spacing['7xl'] + spacing['3xl'];
65
+ const MENU_GAP = spacing.xs;
66
+
67
+ function buttonSize(size?: DropdownSize): ButtonSize {
68
+ if (size === DropdownSize.Small) {
69
+ return ButtonSize.Small;
70
+ }
71
+ if (size === DropdownSize.Large) {
72
+ return ButtonSize.Large;
73
+ }
74
+ return ButtonSize.Medium;
75
+ }
76
+
77
+ function compactTriggerStyle(size?: DropdownSize): ViewStyle | undefined {
78
+ if (size === DropdownSize.Small) {
79
+ return {
80
+ height: spacing['4xl'],
81
+ minHeight: spacing['4xl'],
82
+ paddingVertical: spacing.xs,
83
+ paddingHorizontal: spacing.md,
84
+ };
85
+ }
86
+ if (size === DropdownSize.Large) {
87
+ return {
88
+ height: spacing['6xl'],
89
+ minHeight: spacing['6xl'],
90
+ paddingVertical: spacing.sm,
91
+ paddingHorizontal: spacing.base,
92
+ };
93
+ }
94
+ return undefined;
95
+ }
96
+
97
+ function webMenuShadow(): ViewStyle {
98
+ return {
99
+ boxShadow: `0 ${shadows.boxLight.offsetY}px ${shadows.boxLight.radius}px ${colors.boxShadowLight}`,
100
+ } as ViewStyle;
101
+ }
102
+
103
+ function menuPosition(
104
+ placement: DropdownPlacement,
105
+ trigger: { x: number; y: number; width: number; height: number },
106
+ menu: { width: number; height: number },
107
+ ) {
108
+ const window = Dimensions.get('window');
109
+ const pad = spacing.lg;
110
+ let top = trigger.y + trigger.height + MENU_GAP;
111
+ let left = trigger.x;
112
+
113
+ if (placement === DropdownPlacement.Top) {
114
+ top = trigger.y - menu.height - MENU_GAP;
115
+ } else if (placement === DropdownPlacement.Start) {
116
+ top = trigger.y;
117
+ left = trigger.x - menu.width - MENU_GAP;
118
+ } else if (placement === DropdownPlacement.End) {
119
+ top = trigger.y;
120
+ left = trigger.x + trigger.width + MENU_GAP;
121
+ }
122
+
123
+ left = Math.min(Math.max(pad, left), window.width - menu.width - pad);
124
+ top = Math.min(Math.max(pad, top), window.height - menu.height - pad);
125
+
126
+ return { top, left };
127
+ }
128
+
129
+ export function Dropdown({
130
+ label = 'Dropdown',
131
+ items = [],
132
+ variant = DropdownVariant.Primary,
133
+ size,
134
+ split: _split = false,
135
+ placement = DropdownPlacement.Bottom,
136
+ onItemSelected,
137
+ style,
138
+ }: DropdownProps) {
139
+ const triggerRef = useRef<View>(null);
140
+ const [open, setOpen] = useState(false);
141
+ const [hoveredItem, setHoveredItem] = useState<number | null>(null);
142
+ const [triggerBox, setTriggerBox] = useState({ x: 0, y: 0, width: 0, height: 0 });
143
+ const [menuSize, setMenuSize] = useState({ width: MENU_MIN_WIDTH, height: 0 });
144
+ const position = menuPosition(placement, triggerBox, menuSize);
145
+
146
+ const close = () => {
147
+ setOpen(false);
148
+ setHoveredItem(null);
149
+ dismissButtonFocus();
150
+ setTimeout(() => dismissButtonFocus(), 220);
151
+ };
152
+
153
+ const toggle = () => {
154
+ if (open) {
155
+ close();
156
+ return;
157
+ }
158
+
159
+ triggerRef.current?.measureInWindow((x, y, width, measuredHeight) => {
160
+ setTriggerBox({ x, y, width, height: measuredHeight });
161
+ setOpen(true);
162
+ });
163
+ };
164
+
165
+ const select = (item: DropdownItem) => {
166
+ if (item.disabled || item.divider || !item.value) {
167
+ return;
168
+ }
169
+ onItemSelected?.(item);
170
+ close();
171
+ };
172
+
173
+ return (
174
+ <View ref={triggerRef} collapsable={false} style={[styles.host, style]}>
175
+ <Button
176
+ label={label}
177
+ variant={variant}
178
+ size={buttonSize(size)}
179
+ iconPosition={IconPosition.After}
180
+ iconName={IconName.ChevronDown}
181
+ iconDecorative
182
+ accessibilityLabel={open ? 'Close menu' : 'Open menu'}
183
+ onPress={toggle}
184
+ contentStyle={compactTriggerStyle(size)}
185
+ />
186
+
187
+ <Modal visible={open} transparent animationType="none" onRequestClose={close}>
188
+ <Pressable accessible={false} style={styles.backdrop} onPress={close}>
189
+ <Pressable
190
+ accessible={false}
191
+ onPress={(event) => {
192
+ if ('stopPropagation' in event && typeof event.stopPropagation === 'function') {
193
+ event.stopPropagation();
194
+ }
195
+ }}
196
+ onLayout={(event) => {
197
+ const { width, height: nextHeight } = event.nativeEvent.layout;
198
+ if (width !== menuSize.width || nextHeight !== menuSize.height) {
199
+ setMenuSize({ width, height: nextHeight });
200
+ }
201
+ }}
202
+ style={[
203
+ styles.menu,
204
+ { top: position.top, left: position.left, minWidth: Math.max(MENU_MIN_WIDTH, triggerBox.width) },
205
+ !isNative && webMenuShadow(),
206
+ ]}>
207
+ {items.map((item, index) => {
208
+ if (item.divider) {
209
+ return <View key={`divider-${index}`} style={styles.divider} />;
210
+ }
211
+
212
+ const disabled = Boolean(item.disabled);
213
+ const hovered = hoveredItem === index && !disabled;
214
+
215
+ return (
216
+ <Pressable
217
+ key={`${item.value ?? item.label ?? index}`}
218
+ accessibilityRole="menuitem"
219
+ accessibilityState={{ disabled }}
220
+ disabled={disabled}
221
+ onHoverIn={() => setHoveredItem(index)}
222
+ onHoverOut={() => setHoveredItem((current) => (current === index ? null : current))}
223
+ onPress={() => select(item)}
224
+ style={[styles.item, hovered && styles.itemHovered, disabled && styles.itemDisabled]}>
225
+ <Text style={[styles.itemLabel, disabled && styles.itemLabelDisabled]}>{item.label}</Text>
226
+ </Pressable>
227
+ );
228
+ })}
229
+ </Pressable>
230
+ </Pressable>
231
+ </Modal>
232
+ </View>
233
+ );
234
+ }
235
+
236
+ const styles = StyleSheet.create({
237
+ host: {
238
+ alignSelf: 'center',
239
+ },
240
+ backdrop: {
241
+ flex: 1,
242
+ },
243
+ menu: {
244
+ position: 'absolute',
245
+ backgroundColor: colors.white,
246
+ borderWidth: borders.width.thin,
247
+ borderColor: colors.borderSubtle,
248
+ borderRadius: radius.sm,
249
+ paddingVertical: spacing.sm,
250
+ overflow: 'hidden',
251
+ },
252
+ item: {
253
+ paddingVertical: spacing.md,
254
+ paddingHorizontal: spacing.lg,
255
+ },
256
+ itemHovered: {
257
+ backgroundColor: colors.gray.light,
258
+ },
259
+ itemDisabled: {
260
+ opacity: 0.5,
261
+ },
262
+ itemLabel: {
263
+ fontFamily: typography.fontFamily.base,
264
+ fontSize: typography.fontSize.sm,
265
+ lineHeight: typography.fontSize.sm * typography.lineHeight.normal,
266
+ color: colors.text.primary,
267
+ },
268
+ itemLabelDisabled: {
269
+ color: colors.gray.dark,
270
+ },
271
+ divider: {
272
+ height: borders.width.thin,
273
+ backgroundColor: colors.borderSubtle,
274
+ marginVertical: spacing.md,
275
+ marginHorizontal: spacing.none,
276
+ },
277
+ });
@@ -0,0 +1,7 @@
1
+ export {
2
+ Dropdown,
3
+ DropdownPlacement,
4
+ DropdownSize,
5
+ DropdownVariant,
6
+ } from './Dropdown';
7
+ export type { DropdownItem, DropdownProps } from './Dropdown';