@solostylist/ui-kit-native 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (210) hide show
  1. package/dist/hooks/index.d.ts +6 -0
  2. package/dist/hooks/index.d.ts.map +1 -0
  3. package/dist/hooks/index.js +5 -0
  4. package/dist/hooks/use-count-down.d.ts +74 -0
  5. package/dist/hooks/use-count-down.d.ts.map +1 -0
  6. package/dist/hooks/use-count-down.js +204 -0
  7. package/dist/hooks/use-is-passed-position.d.ts +20 -0
  8. package/dist/hooks/use-is-passed-position.d.ts.map +1 -0
  9. package/dist/hooks/use-is-passed-position.js +31 -0
  10. package/dist/index.d.ts +32 -0
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +33 -0
  13. package/dist/s-avatar/index.d.ts +3 -0
  14. package/dist/s-avatar/index.d.ts.map +1 -0
  15. package/dist/s-avatar/index.js +1 -0
  16. package/dist/s-avatar/s-avatar.d.ts +47 -0
  17. package/dist/s-avatar/s-avatar.d.ts.map +1 -0
  18. package/dist/s-avatar/s-avatar.js +112 -0
  19. package/dist/s-button/index.d.ts +3 -0
  20. package/dist/s-button/index.d.ts.map +1 -0
  21. package/dist/s-button/index.js +1 -0
  22. package/dist/s-button/s-button.d.ts +57 -0
  23. package/dist/s-button/s-button.d.ts.map +1 -0
  24. package/dist/s-button/s-button.js +158 -0
  25. package/dist/s-button-link/index.d.ts +2 -0
  26. package/dist/s-button-link/index.d.ts.map +1 -0
  27. package/dist/s-button-link/index.js +1 -0
  28. package/dist/s-button-link/s-button-link.d.ts +45 -0
  29. package/dist/s-button-link/s-button-link.d.ts.map +1 -0
  30. package/dist/s-button-link/s-button-link.js +64 -0
  31. package/dist/s-chat-input/index.d.ts +2 -0
  32. package/dist/s-chat-input/index.d.ts.map +1 -0
  33. package/dist/s-chat-input/index.js +1 -0
  34. package/dist/s-chat-input/s-chat-input.d.ts +41 -0
  35. package/dist/s-chat-input/s-chat-input.d.ts.map +1 -0
  36. package/dist/s-chat-input/s-chat-input.js +66 -0
  37. package/dist/s-chat-message/index.d.ts +3 -0
  38. package/dist/s-chat-message/index.d.ts.map +1 -0
  39. package/dist/s-chat-message/index.js +2 -0
  40. package/dist/s-chat-message/s-chat-message.d.ts +63 -0
  41. package/dist/s-chat-message/s-chat-message.d.ts.map +1 -0
  42. package/dist/s-chat-message/s-chat-message.js +207 -0
  43. package/dist/s-checkbox/index.d.ts +3 -0
  44. package/dist/s-checkbox/index.d.ts.map +1 -0
  45. package/dist/s-checkbox/index.js +1 -0
  46. package/dist/s-checkbox/s-checkbox.d.ts +34 -0
  47. package/dist/s-checkbox/s-checkbox.d.ts.map +1 -0
  48. package/dist/s-checkbox/s-checkbox.js +59 -0
  49. package/dist/s-chip/index.d.ts +3 -0
  50. package/dist/s-chip/index.d.ts.map +1 -0
  51. package/dist/s-chip/index.js +1 -0
  52. package/dist/s-chip/s-chip.d.ts +54 -0
  53. package/dist/s-chip/s-chip.d.ts.map +1 -0
  54. package/dist/s-chip/s-chip.js +170 -0
  55. package/dist/s-code-block/index.d.ts +3 -0
  56. package/dist/s-code-block/index.d.ts.map +1 -0
  57. package/dist/s-code-block/index.js +2 -0
  58. package/dist/s-code-block/s-code-block.d.ts +42 -0
  59. package/dist/s-code-block/s-code-block.d.ts.map +1 -0
  60. package/dist/s-code-block/s-code-block.js +81 -0
  61. package/dist/s-comment-message/index.d.ts +3 -0
  62. package/dist/s-comment-message/index.d.ts.map +1 -0
  63. package/dist/s-comment-message/index.js +2 -0
  64. package/dist/s-comment-message/s-comment-message.d.ts +56 -0
  65. package/dist/s-comment-message/s-comment-message.d.ts.map +1 -0
  66. package/dist/s-comment-message/s-comment-message.js +222 -0
  67. package/dist/s-copyable-text/index.d.ts +3 -0
  68. package/dist/s-copyable-text/index.d.ts.map +1 -0
  69. package/dist/s-copyable-text/index.js +1 -0
  70. package/dist/s-copyable-text/s-copyable-text.d.ts +26 -0
  71. package/dist/s-copyable-text/s-copyable-text.d.ts.map +1 -0
  72. package/dist/s-copyable-text/s-copyable-text.js +77 -0
  73. package/dist/s-countdown/index.d.ts +8 -0
  74. package/dist/s-countdown/index.d.ts.map +1 -0
  75. package/dist/s-countdown/index.js +7 -0
  76. package/dist/s-countdown/s-count-box.d.ts +42 -0
  77. package/dist/s-countdown/s-count-box.d.ts.map +1 -0
  78. package/dist/s-countdown/s-count-box.js +126 -0
  79. package/dist/s-countdown/s-countdown.d.ts +69 -0
  80. package/dist/s-countdown/s-countdown.d.ts.map +1 -0
  81. package/dist/s-countdown/s-countdown.js +93 -0
  82. package/dist/s-data-table/index.d.ts +3 -0
  83. package/dist/s-data-table/index.d.ts.map +1 -0
  84. package/dist/s-data-table/index.js +2 -0
  85. package/dist/s-data-table/s-data-table.d.ts +67 -0
  86. package/dist/s-data-table/s-data-table.d.ts.map +1 -0
  87. package/dist/s-data-table/s-data-table.js +98 -0
  88. package/dist/s-date-picker/index.d.ts +3 -0
  89. package/dist/s-date-picker/index.d.ts.map +1 -0
  90. package/dist/s-date-picker/index.js +2 -0
  91. package/dist/s-date-picker/s-date-picker.d.ts +43 -0
  92. package/dist/s-date-picker/s-date-picker.d.ts.map +1 -0
  93. package/dist/s-date-picker/s-date-picker.js +220 -0
  94. package/dist/s-date-time-picker/index.d.ts +3 -0
  95. package/dist/s-date-time-picker/index.d.ts.map +1 -0
  96. package/dist/s-date-time-picker/index.js +2 -0
  97. package/dist/s-date-time-picker/s-date-time-picker.d.ts +49 -0
  98. package/dist/s-date-time-picker/s-date-time-picker.d.ts.map +1 -0
  99. package/dist/s-date-time-picker/s-date-time-picker.js +390 -0
  100. package/dist/s-file-dropzone/index.d.ts +3 -0
  101. package/dist/s-file-dropzone/index.d.ts.map +1 -0
  102. package/dist/s-file-dropzone/index.js +2 -0
  103. package/dist/s-file-dropzone/s-file-dropzone.d.ts +98 -0
  104. package/dist/s-file-dropzone/s-file-dropzone.d.ts.map +1 -0
  105. package/dist/s-file-dropzone/s-file-dropzone.js +189 -0
  106. package/dist/s-file-icon/index.d.ts +3 -0
  107. package/dist/s-file-icon/index.d.ts.map +1 -0
  108. package/dist/s-file-icon/index.js +2 -0
  109. package/dist/s-file-icon/s-file-icon.d.ts +25 -0
  110. package/dist/s-file-icon/s-file-icon.d.ts.map +1 -0
  111. package/dist/s-file-icon/s-file-icon.js +87 -0
  112. package/dist/s-image-comparison/index.d.ts +2 -0
  113. package/dist/s-image-comparison/index.d.ts.map +1 -0
  114. package/dist/s-image-comparison/index.js +1 -0
  115. package/dist/s-image-comparison/s-image-comparison.d.ts +37 -0
  116. package/dist/s-image-comparison/s-image-comparison.d.ts.map +1 -0
  117. package/dist/s-image-comparison/s-image-comparison.js +138 -0
  118. package/dist/s-label/index.d.ts +3 -0
  119. package/dist/s-label/index.d.ts.map +1 -0
  120. package/dist/s-label/index.js +1 -0
  121. package/dist/s-label/s-label.d.ts +25 -0
  122. package/dist/s-label/s-label.d.ts.map +1 -0
  123. package/dist/s-label/s-label.js +35 -0
  124. package/dist/s-language-switcher/index.d.ts +4 -0
  125. package/dist/s-language-switcher/index.d.ts.map +1 -0
  126. package/dist/s-language-switcher/index.js +2 -0
  127. package/dist/s-language-switcher/s-language-switcher.d.ts +56 -0
  128. package/dist/s-language-switcher/s-language-switcher.d.ts.map +1 -0
  129. package/dist/s-language-switcher/s-language-switcher.js +68 -0
  130. package/dist/s-lazy-image/index.d.ts +3 -0
  131. package/dist/s-lazy-image/index.d.ts.map +1 -0
  132. package/dist/s-lazy-image/index.js +1 -0
  133. package/dist/s-lazy-image/s-lazy-image.d.ts +45 -0
  134. package/dist/s-lazy-image/s-lazy-image.d.ts.map +1 -0
  135. package/dist/s-lazy-image/s-lazy-image.js +71 -0
  136. package/dist/s-moving-border/index.d.ts +2 -0
  137. package/dist/s-moving-border/index.d.ts.map +1 -0
  138. package/dist/s-moving-border/index.js +1 -0
  139. package/dist/s-moving-border/s-moving-border.d.ts +40 -0
  140. package/dist/s-moving-border/s-moving-border.d.ts.map +1 -0
  141. package/dist/s-moving-border/s-moving-border.js +158 -0
  142. package/dist/s-multi-select/index.d.ts +2 -0
  143. package/dist/s-multi-select/index.d.ts.map +1 -0
  144. package/dist/s-multi-select/index.js +1 -0
  145. package/dist/s-multi-select/s-multi-select.d.ts +55 -0
  146. package/dist/s-multi-select/s-multi-select.d.ts.map +1 -0
  147. package/dist/s-multi-select/s-multi-select.js +201 -0
  148. package/dist/s-pagination/index.d.ts +3 -0
  149. package/dist/s-pagination/index.d.ts.map +1 -0
  150. package/dist/s-pagination/index.js +2 -0
  151. package/dist/s-pagination/s-pagination.d.ts +43 -0
  152. package/dist/s-pagination/s-pagination.d.ts.map +1 -0
  153. package/dist/s-pagination/s-pagination.js +121 -0
  154. package/dist/s-rating/index.d.ts +3 -0
  155. package/dist/s-rating/index.d.ts.map +1 -0
  156. package/dist/s-rating/index.js +1 -0
  157. package/dist/s-rating/s-rating.d.ts +57 -0
  158. package/dist/s-rating/s-rating.d.ts.map +1 -0
  159. package/dist/s-rating/s-rating.js +155 -0
  160. package/dist/s-review/index.d.ts +3 -0
  161. package/dist/s-review/index.d.ts.map +1 -0
  162. package/dist/s-review/index.js +1 -0
  163. package/dist/s-review/s-review.d.ts +57 -0
  164. package/dist/s-review/s-review.d.ts.map +1 -0
  165. package/dist/s-review/s-review.js +235 -0
  166. package/dist/s-scroll-to-top/index.d.ts +3 -0
  167. package/dist/s-scroll-to-top/index.d.ts.map +1 -0
  168. package/dist/s-scroll-to-top/index.js +2 -0
  169. package/dist/s-scroll-to-top/s-scroll-to-top.d.ts +38 -0
  170. package/dist/s-scroll-to-top/s-scroll-to-top.d.ts.map +1 -0
  171. package/dist/s-scroll-to-top/s-scroll-to-top.js +76 -0
  172. package/dist/s-select/s-select.d.ts.map +1 -1
  173. package/dist/s-select/s-select.js +8 -8
  174. package/dist/s-select-list/index.d.ts +3 -0
  175. package/dist/s-select-list/index.d.ts.map +1 -0
  176. package/dist/s-select-list/index.js +2 -0
  177. package/dist/s-select-list/s-select-list.d.ts +36 -0
  178. package/dist/s-select-list/s-select-list.d.ts.map +1 -0
  179. package/dist/s-select-list/s-select-list.js +129 -0
  180. package/dist/s-text-shimmer/index.d.ts +2 -0
  181. package/dist/s-text-shimmer/index.d.ts.map +1 -0
  182. package/dist/s-text-shimmer/index.js +1 -0
  183. package/dist/s-text-shimmer/s-text-shimmer.d.ts +36 -0
  184. package/dist/s-text-shimmer/s-text-shimmer.d.ts.map +1 -0
  185. package/dist/s-text-shimmer/s-text-shimmer.js +120 -0
  186. package/dist/s-text-truncation/index.d.ts +2 -0
  187. package/dist/s-text-truncation/index.d.ts.map +1 -0
  188. package/dist/s-text-truncation/index.js +1 -0
  189. package/dist/s-text-truncation/s-text-truncation.d.ts +45 -0
  190. package/dist/s-text-truncation/s-text-truncation.d.ts.map +1 -0
  191. package/dist/s-text-truncation/s-text-truncation.js +48 -0
  192. package/dist/s-tip/index.d.ts +3 -0
  193. package/dist/s-tip/index.d.ts.map +1 -0
  194. package/dist/s-tip/index.js +1 -0
  195. package/dist/s-tip/s-tip.d.ts +18 -0
  196. package/dist/s-tip/s-tip.d.ts.map +1 -0
  197. package/dist/s-tip/s-tip.js +32 -0
  198. package/dist/s-zoom-image/index.d.ts +3 -0
  199. package/dist/s-zoom-image/index.d.ts.map +1 -0
  200. package/dist/s-zoom-image/index.js +1 -0
  201. package/dist/s-zoom-image/s-zoom-image.d.ts +40 -0
  202. package/dist/s-zoom-image/s-zoom-image.d.ts.map +1 -0
  203. package/dist/s-zoom-image/s-zoom-image.js +154 -0
  204. package/dist/utils/bytes-to-size.d.ts +10 -0
  205. package/dist/utils/bytes-to-size.d.ts.map +1 -0
  206. package/dist/utils/bytes-to-size.js +18 -0
  207. package/dist/utils/index.d.ts +2 -0
  208. package/dist/utils/index.d.ts.map +1 -0
  209. package/dist/utils/index.js +1 -0
  210. package/package.json +174 -5
@@ -0,0 +1,6 @@
1
+ /**
2
+ * Custom hooks for UI Kit Native
3
+ */
4
+ export { default as useCountDown, type UseCountDownProps, type UseCountDownReturn, type TimeLeft, } from './use-count-down';
5
+ export { useIsPassedPosition, checkIsPassedPosition } from './use-is-passed-position';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/hooks/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EACL,OAAO,IAAI,YAAY,EACvB,KAAK,iBAAiB,EACtB,KAAK,kBAAkB,EACvB,KAAK,QAAQ,GACd,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,mBAAmB,EAAE,qBAAqB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,5 @@
1
+ /**
2
+ * Custom hooks for UI Kit Native
3
+ */
4
+ export { default as useCountDown, } from './use-count-down';
5
+ export { useIsPassedPosition, checkIsPassedPosition } from './use-is-passed-position';
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Time left object structure
3
+ * Synced with web useCountDown from @solostylist/ui-kit
4
+ */
5
+ export interface TimeLeft {
6
+ days: number;
7
+ hours: number;
8
+ minutes: number;
9
+ seconds: number;
10
+ }
11
+ /**
12
+ * Props for useCountDown hook
13
+ */
14
+ export interface UseCountDownProps {
15
+ /** Target date timestamp in milliseconds */
16
+ expireDate: number;
17
+ /** Callback fired when countdown reaches zero */
18
+ onComplete?: () => void;
19
+ /** Callback fired on each tick (every second) */
20
+ onTick?: (timeLeft: TimeLeft) => void;
21
+ /** Callback fired when countdown starts */
22
+ onStart?: () => void;
23
+ /** Whether the countdown is paused */
24
+ paused?: boolean;
25
+ /** Custom interval in milliseconds (default: 1000) */
26
+ interval?: number;
27
+ /** Whether to automatically start the countdown */
28
+ autoStart?: boolean;
29
+ }
30
+ /**
31
+ * Return type for useCountDown hook
32
+ */
33
+ export interface UseCountDownReturn {
34
+ /** Current time left */
35
+ timeLeft: TimeLeft;
36
+ /** Whether the countdown has expired */
37
+ isExpired: boolean;
38
+ /** Whether the countdown is currently running */
39
+ isRunning: boolean;
40
+ /** Whether the countdown is paused */
41
+ isPaused: boolean;
42
+ /** Start the countdown */
43
+ start: () => void;
44
+ /** Pause the countdown */
45
+ pause: () => void;
46
+ /** Resume the countdown */
47
+ resume: () => void;
48
+ /** Reset the countdown to initial state */
49
+ reset: () => void;
50
+ /** Get the total duration in milliseconds */
51
+ totalDuration: number;
52
+ /** Get the elapsed time in milliseconds */
53
+ elapsedTime: number;
54
+ /** Get the progress as a percentage (0-100) */
55
+ progress: number;
56
+ }
57
+ /**
58
+ * Enhanced countdown hook with comprehensive features
59
+ * Synced with web useCountDown from @solostylist/ui-kit
60
+ *
61
+ * Features:
62
+ * - Pause/resume functionality
63
+ * - Event callbacks (onComplete, onTick, onStart)
64
+ * - Custom intervals
65
+ * - Progress tracking
66
+ * - Manual start/stop controls
67
+ * - Expiration detection
68
+ *
69
+ * @param props - UseCountDownProps
70
+ * @returns UseCountDownReturn - Hook return value with time data and controls
71
+ */
72
+ declare const useCountDown: ({ expireDate, onComplete, onTick, onStart, paused, interval, autoStart, }: UseCountDownProps) => UseCountDownReturn;
73
+ export default useCountDown;
74
+ //# sourceMappingURL=use-count-down.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-count-down.d.ts","sourceRoot":"","sources":["../../src/hooks/use-count-down.ts"],"names":[],"mappings":"AAEA;;;GAGG;AACH,MAAM,WAAW,QAAQ;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;CACjB;AAYD;;GAEG;AACH,MAAM,WAAW,iBAAiB;IAChC,4CAA4C;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,iDAAiD;IACjD,UAAU,CAAC,EAAE,MAAM,IAAI,CAAC;IACxB,iDAAiD;IACjD,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,QAAQ,KAAK,IAAI,CAAC;IACtC,2CAA2C;IAC3C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;IACrB,sCAAsC;IACtC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,sDAAsD;IACtD,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,mDAAmD;IACnD,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,wBAAwB;IACxB,QAAQ,EAAE,QAAQ,CAAC;IACnB,wCAAwC;IACxC,SAAS,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,SAAS,EAAE,OAAO,CAAC;IACnB,sCAAsC;IACtC,QAAQ,EAAE,OAAO,CAAC;IAClB,0BAA0B;IAC1B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,0BAA0B;IAC1B,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,2BAA2B;IAC3B,MAAM,EAAE,MAAM,IAAI,CAAC;IACnB,2CAA2C;IAC3C,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,6CAA6C;IAC7C,aAAa,EAAE,MAAM,CAAC;IACtB,2CAA2C;IAC3C,WAAW,EAAE,MAAM,CAAC;IACpB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;;;;;;;;;;;;GAcG;AACH,QAAA,MAAM,YAAY,GAAI,2EAQnB,iBAAiB,KAAG,kBAuMtB,CAAC;AAEF,eAAe,YAAY,CAAC"}
@@ -0,0 +1,204 @@
1
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
2
+ /**
3
+ * Initial state for countdown
4
+ */
5
+ const initialState = {
6
+ days: 0,
7
+ hours: 0,
8
+ minutes: 0,
9
+ seconds: 0,
10
+ };
11
+ /**
12
+ * Enhanced countdown hook with comprehensive features
13
+ * Synced with web useCountDown from @solostylist/ui-kit
14
+ *
15
+ * Features:
16
+ * - Pause/resume functionality
17
+ * - Event callbacks (onComplete, onTick, onStart)
18
+ * - Custom intervals
19
+ * - Progress tracking
20
+ * - Manual start/stop controls
21
+ * - Expiration detection
22
+ *
23
+ * @param props - UseCountDownProps
24
+ * @returns UseCountDownReturn - Hook return value with time data and controls
25
+ */
26
+ const useCountDown = ({ expireDate, onComplete, onTick, onStart, paused = false, interval = 1000, autoStart = true, }) => {
27
+ const [timeLeft, setTimeLeft] = useState(initialState);
28
+ const [isExpired, setIsExpired] = useState(false);
29
+ const [isRunning, setIsRunning] = useState(autoStart && !paused);
30
+ const [isPaused, setIsPaused] = useState(paused);
31
+ const [startTime, setStartTime] = useState(null);
32
+ const timerRef = useRef(null);
33
+ const onCompleteRef = useRef(onComplete);
34
+ const onTickRef = useRef(onTick);
35
+ const onStartRef = useRef(onStart);
36
+ const hasStartedRef = useRef(false);
37
+ const hasCompletedRef = useRef(false);
38
+ // Update refs when callbacks change
39
+ useEffect(() => {
40
+ onCompleteRef.current = onComplete;
41
+ }, [onComplete]);
42
+ useEffect(() => {
43
+ onTickRef.current = onTick;
44
+ }, [onTick]);
45
+ useEffect(() => {
46
+ onStartRef.current = onStart;
47
+ }, [onStart]);
48
+ /**
49
+ * Calculate time remaining
50
+ */
51
+ const calculateTimeLeft = useCallback(() => {
52
+ const now = new Date().getTime();
53
+ const distance = expireDate - now;
54
+ if (distance < 0) {
55
+ return { timeLeft: initialState, expired: true };
56
+ }
57
+ return {
58
+ timeLeft: {
59
+ days: Math.floor(distance / (1000 * 60 * 60 * 24)),
60
+ hours: Math.floor((distance % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60)),
61
+ minutes: Math.floor((distance % (1000 * 60 * 60)) / (1000 * 60)),
62
+ seconds: Math.floor((distance % (1000 * 60)) / 1000),
63
+ },
64
+ expired: false,
65
+ };
66
+ }, [expireDate]);
67
+ /**
68
+ * Update timer state
69
+ */
70
+ const updateTimer = useCallback(() => {
71
+ const { timeLeft: newTimeLeft, expired } = calculateTimeLeft();
72
+ setTimeLeft(newTimeLeft);
73
+ setIsExpired(expired);
74
+ // Call onTick callback
75
+ if (onTickRef.current) {
76
+ onTickRef.current(newTimeLeft);
77
+ }
78
+ // Handle completion
79
+ if (expired && !hasCompletedRef.current) {
80
+ hasCompletedRef.current = true;
81
+ setIsRunning(false);
82
+ if (onCompleteRef.current) {
83
+ onCompleteRef.current();
84
+ }
85
+ }
86
+ }, [calculateTimeLeft]);
87
+ /**
88
+ * Start the countdown
89
+ */
90
+ const start = useCallback(() => {
91
+ if (!hasStartedRef.current && onStartRef.current) {
92
+ onStartRef.current();
93
+ hasStartedRef.current = true;
94
+ }
95
+ setIsRunning(true);
96
+ setIsPaused(false);
97
+ if (!startTime) {
98
+ setStartTime(new Date().getTime());
99
+ }
100
+ }, [startTime]);
101
+ /**
102
+ * Pause the countdown
103
+ */
104
+ const pause = useCallback(() => {
105
+ setIsRunning(false);
106
+ setIsPaused(true);
107
+ }, []);
108
+ /**
109
+ * Resume the countdown
110
+ */
111
+ const resume = useCallback(() => {
112
+ setIsRunning(true);
113
+ setIsPaused(false);
114
+ }, []);
115
+ /**
116
+ * Reset the countdown
117
+ */
118
+ const reset = useCallback(() => {
119
+ setIsRunning(autoStart && !paused);
120
+ setIsPaused(paused);
121
+ setIsExpired(false);
122
+ setStartTime(null);
123
+ hasStartedRef.current = false;
124
+ hasCompletedRef.current = false;
125
+ const { timeLeft: newTimeLeft } = calculateTimeLeft();
126
+ setTimeLeft(newTimeLeft);
127
+ }, [autoStart, paused, calculateTimeLeft]);
128
+ /**
129
+ * Handle pause prop changes
130
+ */
131
+ useEffect(() => {
132
+ if (paused) {
133
+ pause();
134
+ }
135
+ else if (isPaused && !paused) {
136
+ resume();
137
+ }
138
+ }, [paused, isPaused, pause, resume]);
139
+ /**
140
+ * Timer effect
141
+ */
142
+ useEffect(() => {
143
+ if (isRunning && !isExpired) {
144
+ timerRef.current = setInterval(updateTimer, interval);
145
+ }
146
+ else {
147
+ if (timerRef.current) {
148
+ clearInterval(timerRef.current);
149
+ timerRef.current = null;
150
+ }
151
+ }
152
+ return () => {
153
+ if (timerRef.current) {
154
+ clearInterval(timerRef.current);
155
+ timerRef.current = null;
156
+ }
157
+ };
158
+ }, [isRunning, isExpired, interval, updateTimer]);
159
+ /**
160
+ * Initial calculation
161
+ */
162
+ useEffect(() => {
163
+ updateTimer();
164
+ }, [updateTimer]);
165
+ /**
166
+ * Calculate total duration
167
+ */
168
+ const totalDuration = useMemo(() => {
169
+ if (!startTime)
170
+ return 0;
171
+ return Math.max(0, expireDate - startTime);
172
+ }, [expireDate, startTime]);
173
+ /**
174
+ * Calculate elapsed time
175
+ */
176
+ const elapsedTime = useMemo(() => {
177
+ if (!startTime)
178
+ return 0;
179
+ const now = new Date().getTime();
180
+ return Math.max(0, now - startTime);
181
+ }, [startTime]);
182
+ /**
183
+ * Calculate progress percentage
184
+ */
185
+ const progress = useMemo(() => {
186
+ if (totalDuration === 0)
187
+ return 0;
188
+ return Math.min(100, Math.max(0, (elapsedTime / totalDuration) * 100));
189
+ }, [elapsedTime, totalDuration]);
190
+ return {
191
+ timeLeft,
192
+ isExpired,
193
+ isRunning,
194
+ isPaused,
195
+ start,
196
+ pause,
197
+ resume,
198
+ reset,
199
+ totalDuration,
200
+ elapsedTime,
201
+ progress,
202
+ };
203
+ };
204
+ export default useCountDown;
@@ -0,0 +1,20 @@
1
+ import type { ScrollView } from 'react-native';
2
+ /**
3
+ * Hook to detect if a scroll position has been passed
4
+ * Native version of useIsPassedPosition from @solostylist/ui-kit
5
+ *
6
+ * @param scrollRef - Reference to the ScrollView component
7
+ * @param positionY - Y position threshold to detect
8
+ * @returns boolean indicating if the scroll position has been passed
9
+ */
10
+ export declare function useIsPassedPosition(scrollRef: React.RefObject<ScrollView> | null, positionY: number): boolean;
11
+ /**
12
+ * Helper function to check if scroll position is passed
13
+ * This should be called from the ScrollView's onScroll event
14
+ *
15
+ * @param scrollY - Current scroll Y position
16
+ * @param threshold - Threshold position
17
+ * @returns boolean indicating if threshold is passed
18
+ */
19
+ export declare function checkIsPassedPosition(scrollY: number, threshold: number): boolean;
20
+ //# sourceMappingURL=use-is-passed-position.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"use-is-passed-position.d.ts","sourceRoot":"","sources":["../../src/hooks/use-is-passed-position.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE/C;;;;;;;GAOG;AACH,wBAAgB,mBAAmB,CAAC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,UAAU,CAAC,GAAG,IAAI,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAa7G;AAED;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAEjF"}
@@ -0,0 +1,31 @@
1
+ import { useEffect, useState } from 'react';
2
+ /**
3
+ * Hook to detect if a scroll position has been passed
4
+ * Native version of useIsPassedPosition from @solostylist/ui-kit
5
+ *
6
+ * @param scrollRef - Reference to the ScrollView component
7
+ * @param positionY - Y position threshold to detect
8
+ * @returns boolean indicating if the scroll position has been passed
9
+ */
10
+ export function useIsPassedPosition(scrollRef, positionY) {
11
+ const [isPassed, setIsPassed] = useState(false);
12
+ useEffect(() => {
13
+ // For React Native, we can't directly attach scroll listeners like in web
14
+ // The scroll position tracking should be handled by the parent component
15
+ // This hook will be updated via the onScroll event in the ScrollView
16
+ // Initialize as not passed
17
+ setIsPassed(false);
18
+ }, [scrollRef, positionY]);
19
+ return isPassed;
20
+ }
21
+ /**
22
+ * Helper function to check if scroll position is passed
23
+ * This should be called from the ScrollView's onScroll event
24
+ *
25
+ * @param scrollY - Current scroll Y position
26
+ * @param threshold - Threshold position
27
+ * @returns boolean indicating if threshold is passed
28
+ */
29
+ export function checkIsPassedPosition(scrollY, threshold) {
30
+ return scrollY > threshold;
31
+ }
package/dist/index.d.ts CHANGED
@@ -5,10 +5,42 @@
5
5
  * Synced with web ui-kit and uses @solostylist/core for theming
6
6
  */
7
7
  export { SThemeProvider, useSTheme, darkTheme, lightTheme, type SThemeProviderProps, type ThemeMode, type NativeTheme, type NativeThemeColors, } from './theme';
8
+ export { SAvatar, type SAvatarProps, type SAvatarSize, type SAvatarColor } from './s-avatar';
9
+ export { SButton, type SButtonProps, type SButtonColor, type SButtonVariant, type SButtonSize } from './s-button';
10
+ export { SButtonLink, type SButtonLinkProps } from './s-button-link';
11
+ export { SChatInput, type SChatInputProps } from './s-chat-input';
12
+ export { SChatMessage, type SChatMessageProps, type ChatAttachment } from './s-chat-message';
13
+ export { SCheckbox, type SCheckboxProps } from './s-checkbox';
14
+ export { SCodeBlock, type SCodeBlockProps } from './s-code-block';
15
+ export { SCommentMessage, type SCommentMessageProps } from './s-comment-message';
16
+ export { SChip, type SChipProps, type SChipColor, type SChipVariant, type SChipSize } from './s-chip';
17
+ export { SCopyableText, type SCopyableTextProps } from './s-copyable-text';
18
+ export { SCountdown, SCountBox, type SCountdownProps, type SCountBoxProps } from './s-countdown';
19
+ export { SDataTable, type SDataTableProps, type ColumnDef } from './s-data-table';
20
+ export { SDatePicker, type SDatePickerProps } from './s-date-picker';
21
+ export { SDateTimePicker, type SDateTimePickerProps } from './s-date-time-picker';
22
+ export { SFileIcon, type SFileIconProps } from './s-file-icon';
23
+ export { SFileDropzone, type SFileDropzoneProps, type CustomFile } from './s-file-dropzone';
8
24
  export { SForm, type SFormProps } from './s-form';
9
25
  export { SIconButton, type SIconButtonProps } from './s-icon-button';
26
+ export { SImageComparison, type SImageComparisonProps } from './s-image-comparison';
27
+ export { SLanguageSwitcher, type SLanguageSwitcherProps, type SLanguageOption, defaultLanguageOptions, } from './s-language-switcher';
28
+ export { SLabel, type SLabelProps } from './s-label';
29
+ export { SLazyImage, type SLazyImageProps, type SLazyImageVariant } from './s-lazy-image';
30
+ export { SMovingBorder, type SMovingBorderProps } from './s-moving-border';
31
+ export { SZoomImage, type SZoomImageProps } from './s-zoom-image';
32
+ export { SPagination, type SPaginationProps } from './s-pagination';
33
+ export { SRating, type SRatingProps, type SRatingSize, type SRatingColor } from './s-rating';
34
+ export { SReview, type SReviewProps } from './s-review';
35
+ export { SScrollToTop, type SScrollToTopProps } from './s-scroll-to-top';
10
36
  export { SSelect, type SSelectProps } from './s-select';
37
+ export { SSelectList, type SSelectListProps, type SSelectListItem } from './s-select-list';
38
+ export { SMultiSelect, type SMultiSelectProps } from './s-multi-select';
11
39
  export { SText, type STextProps } from './s-text';
12
40
  export { STextField, type STextFieldProps } from './s-text-field';
41
+ export { STextShimmer, type STextShimmerProps } from './s-text-shimmer';
42
+ export { STextTruncation, type STextTruncationProps, type STextTruncationVariant } from './s-text-truncation';
43
+ export { STip, type STipProps } from './s-tip';
44
+ export { useCountDown, type UseCountDownProps, type UseCountDownReturn, type TimeLeft, useIsPassedPosition, checkIsPassedPosition, } from './hooks';
13
45
  export { brand, lightBrand, gray, lightGray, green, lightGreen, orange, lightOrange, blue, lightBlue, red, lightRed, purple, lightPurple, blackAlpha, whiteAlpha, darkGradients, lightGradients, darkPulse, lightPulse, } from './theme';
14
46
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EACL,cAAc,EACd,SAAS,EACT,SAAS,EACT,UAAU,EACV,KAAK,mBAAmB,EACxB,KAAK,SAAS,EACd,KAAK,WAAW,EAChB,KAAK,iBAAiB,GACvB,MAAM,SAAS,CAAC;AAGjB,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACrE,OAAO,EAAE,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,YAAY,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,KAAK,UAAU,EAAE,MAAM,UAAU,CAAC;AAClD,OAAO,EAAE,UAAU,EAAE,KAAK,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAGlE,OAAO,EACL,KAAK,EACL,UAAU,EACV,IAAI,EACJ,SAAS,EACT,KAAK,EACL,UAAU,EACV,MAAM,EACN,WAAW,EACX,IAAI,EACJ,SAAS,EACT,GAAG,EACH,QAAQ,EACR,MAAM,EACN,WAAW,EACX,UAAU,EACV,UAAU,EACV,aAAa,EACb,cAAc,EACd,SAAS,EACT,UAAU,GACX,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -7,10 +7,43 @@
7
7
  // Theme
8
8
  export { SThemeProvider, useSTheme, darkTheme, lightTheme, } from './theme';
9
9
  // Components
10
+ export { SAvatar } from './s-avatar';
11
+ export { SButton } from './s-button';
12
+ export { SButtonLink } from './s-button-link';
13
+ export { SChatInput } from './s-chat-input';
14
+ export { SChatMessage } from './s-chat-message';
15
+ export { SCheckbox } from './s-checkbox';
16
+ export { SCodeBlock } from './s-code-block';
17
+ export { SCommentMessage } from './s-comment-message';
18
+ export { SChip } from './s-chip';
19
+ export { SCopyableText } from './s-copyable-text';
20
+ export { SCountdown, SCountBox } from './s-countdown';
21
+ export { SDataTable } from './s-data-table';
22
+ export { SDatePicker } from './s-date-picker';
23
+ export { SDateTimePicker } from './s-date-time-picker';
24
+ export { SFileIcon } from './s-file-icon';
25
+ export { SFileDropzone } from './s-file-dropzone';
10
26
  export { SForm } from './s-form';
11
27
  export { SIconButton } from './s-icon-button';
28
+ export { SImageComparison } from './s-image-comparison';
29
+ export { SLanguageSwitcher, defaultLanguageOptions, } from './s-language-switcher';
30
+ export { SLabel } from './s-label';
31
+ export { SLazyImage } from './s-lazy-image';
32
+ export { SMovingBorder } from './s-moving-border';
33
+ export { SZoomImage } from './s-zoom-image';
34
+ export { SPagination } from './s-pagination';
35
+ export { SRating } from './s-rating';
36
+ export { SReview } from './s-review';
37
+ export { SScrollToTop } from './s-scroll-to-top';
12
38
  export { SSelect } from './s-select';
39
+ export { SSelectList } from './s-select-list';
40
+ export { SMultiSelect } from './s-multi-select';
13
41
  export { SText } from './s-text';
14
42
  export { STextField } from './s-text-field';
43
+ export { STextShimmer } from './s-text-shimmer';
44
+ export { STextTruncation } from './s-text-truncation';
45
+ export { STip } from './s-tip';
46
+ // Hooks
47
+ export { useCountDown, useIsPassedPosition, checkIsPassedPosition, } from './hooks';
15
48
  // Re-export core colors for convenience
16
49
  export { brand, lightBrand, gray, lightGray, green, lightGreen, orange, lightOrange, blue, lightBlue, red, lightRed, purple, lightPurple, blackAlpha, whiteAlpha, darkGradients, lightGradients, darkPulse, lightPulse, } from './theme';
@@ -0,0 +1,3 @@
1
+ export { SAvatar, default } from './s-avatar';
2
+ export type { SAvatarProps, SAvatarSize, SAvatarColor } from './s-avatar';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/s-avatar/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAY,EAAE,YAAY,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1 @@
1
+ export { SAvatar, default } from './s-avatar';
@@ -0,0 +1,47 @@
1
+ import React from 'react';
2
+ import { type StyleProp, type TextStyle, type ViewStyle } from 'react-native';
3
+ /**
4
+ * Avatar size variants - matches common sizing patterns
5
+ */
6
+ export type SAvatarSize = 'small' | 'medium' | 'large' | number;
7
+ /**
8
+ * Avatar color variants for background when showing initials
9
+ */
10
+ export type SAvatarColor = 'primary' | 'secondary' | 'success' | 'error' | 'info' | 'warning';
11
+ /**
12
+ * Props interface for SAvatar component
13
+ * Synced with web SAvatar from @solostylist/ui-kit
14
+ */
15
+ export interface SAvatarProps {
16
+ /** URL of the avatar image to display */
17
+ avatar?: string;
18
+ /** Name of the user, used for initials fallback and optional display */
19
+ name?: string;
20
+ /** Whether to display the name alongside the avatar */
21
+ showName?: boolean;
22
+ /** Size of the avatar in pixels (width and height) or preset size */
23
+ size?: SAvatarSize;
24
+ /** Background color for initials avatar */
25
+ color?: SAvatarColor;
26
+ /** Additional styles for the avatar container */
27
+ style?: StyleProp<ViewStyle>;
28
+ /** Additional styles for the avatar */
29
+ avatarStyle?: StyleProp<ViewStyle>;
30
+ /** Additional styles for the name text */
31
+ nameStyle?: StyleProp<TextStyle>;
32
+ /** Font size for the name text (default: 16) */
33
+ nameFontSize?: number;
34
+ /** Callback fired when avatar is pressed */
35
+ onPress?: () => void;
36
+ }
37
+ /**
38
+ * A flexible avatar component that displays user profile images with fallback to initials.
39
+ * Built on React Native Paper Avatar with optional name display and customizable sizing.
40
+ * Synced with web SAvatar from @solostylist/ui-kit.
41
+ */
42
+ export declare const SAvatar: {
43
+ ({ avatar, name, showName, size, color, style, avatarStyle, nameStyle, nameFontSize, onPress, }: SAvatarProps): React.JSX.Element;
44
+ displayName: string;
45
+ };
46
+ export default SAvatar;
47
+ //# sourceMappingURL=s-avatar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"s-avatar.d.ts","sourceRoot":"","sources":["../../src/s-avatar/s-avatar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AACvC,OAAO,EAAc,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,KAAK,SAAS,EAAE,MAAM,cAAc,CAAC;AAK1F;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG,OAAO,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,CAAC;AAEhE;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,SAAS,CAAC;AAE9F;;;GAGG;AACH,MAAM,WAAW,YAAY;IAC3B,yCAAyC;IACzC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wEAAwE;IACxE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,qEAAqE;IACrE,IAAI,CAAC,EAAE,WAAW,CAAC;IACnB,2CAA2C;IAC3C,KAAK,CAAC,EAAE,YAAY,CAAC;IACrB,iDAAiD;IACjD,KAAK,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IAC7B,uCAAuC;IACvC,WAAW,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACnC,0CAA0C;IAC1C,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,CAAC,CAAC;IACjC,gDAAgD;IAChD,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,4CAA4C;IAC5C,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB;AAiDD;;;;GAIG;AACH,eAAO,MAAM,OAAO;qGAWjB,YAAY,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO;;CA+ElC,CAAC;AAIF,eAAe,OAAO,CAAC"}
@@ -0,0 +1,112 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { StyleSheet } from 'react-native';
4
+ import { Avatar, Surface } from 'react-native-paper';
5
+ import { SText } from '../s-text';
6
+ import { useSTheme } from '../theme';
7
+ /**
8
+ * Get size in pixels from size prop
9
+ */
10
+ const getSizeInPixels = (size) => {
11
+ if (typeof size === 'number') {
12
+ return size;
13
+ }
14
+ switch (size) {
15
+ case 'small':
16
+ return 32;
17
+ case 'medium':
18
+ return 40;
19
+ case 'large':
20
+ return 56;
21
+ default:
22
+ return 40;
23
+ }
24
+ };
25
+ /**
26
+ * Get font size for initials based on avatar size
27
+ */
28
+ const getInitialsFontSize = (sizeInPixels) => {
29
+ if (sizeInPixels <= 32) {
30
+ return 12;
31
+ }
32
+ else if (sizeInPixels <= 40) {
33
+ return 14;
34
+ }
35
+ else if (sizeInPixels <= 56) {
36
+ return 18;
37
+ }
38
+ else {
39
+ return Math.round(sizeInPixels * 0.4);
40
+ }
41
+ };
42
+ /**
43
+ * Get initials from name (up to 2 characters)
44
+ */
45
+ const getInitials = (name) => {
46
+ if (!name)
47
+ return 'A';
48
+ const parts = name.trim().split(/\s+/);
49
+ if (parts.length === 1) {
50
+ return parts[0].charAt(0).toUpperCase();
51
+ }
52
+ return (parts[0].charAt(0) + parts[parts.length - 1].charAt(0)).toUpperCase();
53
+ };
54
+ /**
55
+ * A flexible avatar component that displays user profile images with fallback to initials.
56
+ * Built on React Native Paper Avatar with optional name display and customizable sizing.
57
+ * Synced with web SAvatar from @solostylist/ui-kit.
58
+ */
59
+ export const SAvatar = ({ avatar, name, showName = false, size = 'medium', color = 'primary', style, avatarStyle, nameStyle, nameFontSize = 16, onPress, }) => {
60
+ const { theme } = useSTheme();
61
+ const sizeInPixels = getSizeInPixels(size);
62
+ const initialsFontSize = getInitialsFontSize(sizeInPixels);
63
+ const initials = getInitials(name);
64
+ // Get background color for initials avatar
65
+ const backgroundColor = useMemo(() => {
66
+ const colorPalette = theme.colors[color] || theme.colors.primary;
67
+ return theme.dark ? colorPalette[700] : colorPalette[500];
68
+ }, [theme.dark, theme.colors, color]);
69
+ // Get text color for initials
70
+ const textColor = useMemo(() => {
71
+ const colorPalette = theme.colors[color] || theme.colors.primary;
72
+ return theme.dark ? colorPalette[100] : colorPalette[50];
73
+ }, [theme.dark, theme.colors, color]);
74
+ const styles = useMemo(() => StyleSheet.create({
75
+ container: {
76
+ flexDirection: 'row',
77
+ alignItems: 'center',
78
+ gap: theme.spacing.md,
79
+ },
80
+ avatarText: {
81
+ backgroundColor,
82
+ },
83
+ initials: {
84
+ fontSize: initialsFontSize,
85
+ fontFamily: theme.typography.fontFamily,
86
+ fontWeight: '500',
87
+ color: textColor,
88
+ },
89
+ nameText: {
90
+ fontSize: nameFontSize,
91
+ fontFamily: theme.typography.fontFamily,
92
+ color: theme.colors.text.primary,
93
+ },
94
+ }), [
95
+ theme.spacing.md,
96
+ theme.typography.fontFamily,
97
+ theme.colors.text.primary,
98
+ backgroundColor,
99
+ textColor,
100
+ initialsFontSize,
101
+ nameFontSize,
102
+ ]);
103
+ const renderAvatar = () => {
104
+ if (avatar) {
105
+ return _jsx(Avatar.Image, { size: sizeInPixels, source: { uri: avatar }, style: [avatarStyle], onTouchEnd: onPress });
106
+ }
107
+ return (_jsx(Avatar.Text, { size: sizeInPixels, label: initials, style: [styles.avatarText, avatarStyle], labelStyle: styles.initials, onTouchEnd: onPress }));
108
+ };
109
+ return (_jsxs(Surface, { elevation: 0, style: [styles.container, style], children: [renderAvatar(), showName && name && (_jsx(SText, { variant: "body1", style: [styles.nameText, nameStyle], children: name }))] }));
110
+ };
111
+ SAvatar.displayName = 'SAvatar';
112
+ export default SAvatar;
@@ -0,0 +1,3 @@
1
+ export { SButton, default } from './s-button';
2
+ export type { SButtonProps, SButtonColor, SButtonVariant, SButtonSize } from './s-button';
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/s-button/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAC9C,YAAY,EAAE,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC"}
@@ -0,0 +1 @@
1
+ export { SButton, default } from './s-button';