myshell-react-lib 0.1.5 → 0.1.7

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 (147) hide show
  1. package/dist/index.cjs +50 -2
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +1 -2
  4. package/dist/index.d.ts +1 -2
  5. package/dist/index.js +6 -1
  6. package/dist/index.js.map +1 -1
  7. package/package.json +1 -2
  8. package/src/common/assets/audio-playing.json +0 -3657
  9. package/src/common/constants/constants.ts +0 -24
  10. package/src/common/constants/types/common.ts +0 -10
  11. package/src/common/hooks/useAudioPlayer.tsx +0 -198
  12. package/src/common/hooks/useDevice.ts +0 -26
  13. package/src/common/hooks/useNativeBridge.ts +0 -42
  14. package/src/common/hooks/useNotification.tsx +0 -179
  15. package/src/common/hooks/useWindowWidth.ts +0 -19
  16. package/src/common/utils/common-helper.ts +0 -81
  17. package/src/components/ItemDemo.tsx +0 -15
  18. package/src/components/accordion.tsx +0 -126
  19. package/src/components/alert-dialog.tsx +0 -148
  20. package/src/components/alert.tsx +0 -65
  21. package/src/components/aspect-ratio.tsx +0 -7
  22. package/src/components/audio-player.tsx +0 -60
  23. package/src/components/audio-playing.tsx +0 -33
  24. package/src/components/avatar.tsx +0 -133
  25. package/src/components/badge.tsx +0 -67
  26. package/src/components/button/button.styles.ts +0 -258
  27. package/src/components/button/button.tsx +0 -215
  28. package/src/components/button/icon-button.styles.ts +0 -103
  29. package/src/components/button/icon-button.tsx +0 -100
  30. package/src/components/button/index.tsx +0 -3
  31. package/src/components/button/link-button.tsx +0 -184
  32. package/src/components/cascader.tsx +0 -175
  33. package/src/components/checkbox.tsx +0 -135
  34. package/src/components/command.tsx +0 -155
  35. package/src/components/context-menu.tsx +0 -198
  36. package/src/components/count-down.tsx +0 -83
  37. package/src/components/custom-notification.tsx +0 -95
  38. package/src/components/dialog.tsx +0 -158
  39. package/src/components/drawer.tsx +0 -116
  40. package/src/components/dropdown-menu.tsx +0 -196
  41. package/src/components/energy-progress.tsx +0 -55
  42. package/src/components/form.tsx +0 -201
  43. package/src/components/group.tsx +0 -9
  44. package/src/components/guide.tsx +0 -243
  45. package/src/components/icon.tsx +0 -96
  46. package/src/components/icons/index.tsx +0 -13
  47. package/src/components/icons/outline/ArrowLeftIcon.tsx +0 -28
  48. package/src/components/icons/outline/ArrowUpTrayIcon.tsx +0 -28
  49. package/src/components/icons/outline/CheckCircleIcon.tsx +0 -27
  50. package/src/components/icons/outline/ConfigIcon.tsx +0 -42
  51. package/src/components/icons/outline/DownIcon.tsx +0 -18
  52. package/src/components/icons/outline/FilterIcon.tsx +0 -20
  53. package/src/components/icons/outline/PencilSquareIcon.tsx +0 -28
  54. package/src/components/icons/outline/WindowIcon.tsx +0 -26
  55. package/src/components/icons/solid/CaretDownIcon.tsx +0 -22
  56. package/src/components/icons/solid/CodeIcon.tsx +0 -25
  57. package/src/components/icons/solid/DragIcon.tsx +0 -24
  58. package/src/components/icons/solid/PhoneIcon.tsx +0 -29
  59. package/src/components/icons/solid/RectangleGroupIcon.tsx +0 -26
  60. package/src/components/image.tsx +0 -152
  61. package/src/components/input.tsx +0 -118
  62. package/src/components/label.tsx +0 -26
  63. package/src/components/link.tsx +0 -123
  64. package/src/components/marquee/index.css +0 -15
  65. package/src/components/marquee/marquee.tsx +0 -220
  66. package/src/components/masonry.tsx +0 -138
  67. package/src/components/menubar.tsx +0 -234
  68. package/src/components/mobile/m-tooltip.tsx +0 -34
  69. package/src/components/modal.tsx +0 -561
  70. package/src/components/navigation-bar.tsx +0 -100
  71. package/src/components/number-input.tsx +0 -143
  72. package/src/components/page-content.tsx +0 -16
  73. package/src/components/popover.tsx +0 -191
  74. package/src/components/progress.tsx +0 -80
  75. package/src/components/radio-group.tsx +0 -44
  76. package/src/components/scroll-area.tsx +0 -49
  77. package/src/components/search-bar.tsx +0 -140
  78. package/src/components/secondary-navigation-bar.tsx +0 -328
  79. package/src/components/select.tsx +0 -273
  80. package/src/components/separator.tsx +0 -31
  81. package/src/components/sheet.tsx +0 -143
  82. package/src/components/skeleton.tsx +0 -20
  83. package/src/components/slider.tsx +0 -160
  84. package/src/components/spinner.tsx +0 -50
  85. package/src/components/swiper/index.module.scss +0 -88
  86. package/src/components/swiper/index.tsx +0 -319
  87. package/src/components/switch.tsx +0 -67
  88. package/src/components/tabs.tsx +0 -325
  89. package/src/components/textarea.tsx +0 -71
  90. package/src/components/toast/toast.tsx +0 -182
  91. package/src/components/toast/toaster.tsx +0 -160
  92. package/src/components/toast/use-toast.tsx +0 -248
  93. package/src/components/toggle-group.tsx +0 -64
  94. package/src/components/toggle.tsx +0 -46
  95. package/src/components/tooltip.tsx +0 -283
  96. package/src/components/typography.tsx +0 -437
  97. package/src/index.ts +0 -70
  98. package/src/lib/utils.ts +0 -62
  99. package/src/stories/Accordion.stories.tsx +0 -64
  100. package/src/stories/AccordionItem.stories.tsx +0 -48
  101. package/src/stories/Avatar.stories.ts +0 -58
  102. package/src/stories/Badge.stories.tsx +0 -40
  103. package/src/stories/BannerSwiper.stories.tsx +0 -102
  104. package/src/stories/Button.stories.tsx +0 -543
  105. package/src/stories/Checkbox.stories.tsx +0 -161
  106. package/src/stories/Configure.mdx +0 -341
  107. package/src/stories/CssProperties.mdx +0 -30
  108. package/src/stories/Description.stories.ts +0 -70
  109. package/src/stories/Display.stories.ts +0 -64
  110. package/src/stories/FeaturedSwiper.stories.tsx +0 -6978
  111. package/src/stories/GridSwiper.stories.tsx +0 -1407
  112. package/src/stories/Guide.stories.tsx +0 -247
  113. package/src/stories/Heading.stories.ts +0 -89
  114. package/src/stories/Icon.stories.ts +0 -77
  115. package/src/stories/IconButton.stories.tsx +0 -301
  116. package/src/stories/IconTextButton.stories.ts +0 -59
  117. package/src/stories/Image.stories.ts +0 -55
  118. package/src/stories/Input.stories.tsx +0 -203
  119. package/src/stories/Modal.stories.tsx +0 -144
  120. package/src/stories/NavigationBar.stories.tsx +0 -81
  121. package/src/stories/Notification.stories.tsx +0 -276
  122. package/src/stories/Popover.stories.tsx +0 -100
  123. package/src/stories/SearchBar.stories.ts +0 -43
  124. package/src/stories/SecondaryNavigationBar.stories.tsx +0 -199
  125. package/src/stories/Select.stories.tsx +0 -107
  126. package/src/stories/Separator.stories.tsx +0 -49
  127. package/src/stories/Spinner.stories.tsx +0 -48
  128. package/src/stories/SubHeading.stories.ts +0 -64
  129. package/src/stories/Swich.stories.tsx +0 -69
  130. package/src/stories/Tabs.stories.tsx +0 -90
  131. package/src/stories/Text.stories.ts +0 -78
  132. package/src/stories/Textarea.stories.tsx +0 -155
  133. package/src/stories/Toast.stories.tsx +0 -424
  134. package/src/stories/Tooltip.stories.tsx +0 -244
  135. package/src/stories/ViewAutoSwiper.stories.tsx +0 -1408
  136. package/src/styles/components-dark.scss +0 -212
  137. package/src/styles/components-light.scss +0 -210
  138. package/src/styles/design-dark.scss +0 -330
  139. package/src/styles/design-light.scss +0 -345
  140. package/src/styles/design2-dark.scss +0 -319
  141. package/src/styles/design2-light.scss +0 -364
  142. package/src/styles/font.css +0 -19
  143. package/src/styles/global.scss +0 -251
  144. package/src/styles/md-viewer.scss +0 -155
  145. package/src/styles/new-tokens.scss +0 -255
  146. package/src/styles/tokens.scss +0 -401
  147. package/src/types/scss.d.ts +0 -24
@@ -1,24 +0,0 @@
1
- /**
2
- * 通用白名单
3
- */
4
-
5
- export const NotMatchWhitelist = [
6
- '/privacy-policy',
7
- '/tos',
8
- '/connect/tg',
9
- '/browser',
10
- '/upload',
11
- '/shadcn-playground',
12
- '/sc-did',
13
- '/mainpage',
14
- '/sitemap',
15
- '/chatpage',
16
- '/widgetpage',
17
- '/postpage',
18
- '/articlepage',
19
- '/gallerypage',
20
- '/botimage',
21
- '/galleryimage',
22
- '/robots.txt',
23
- '/favicon.ico',
24
- ];
@@ -1,10 +0,0 @@
1
- /**
2
- * 通用类型定义
3
- */
4
-
5
- export type HeroIcon = React.ForwardRefExoticComponent<
6
- React.PropsWithoutRef<React.SVGProps<SVGSVGElement>> & {
7
- title?: string;
8
- titleId?: string;
9
- } & React.RefAttributes<SVGSVGElement>
10
- >;
@@ -1,198 +0,0 @@
1
- import {
2
- forwardRef,
3
- useCallback,
4
- useImperativeHandle,
5
- useLayoutEffect,
6
- useRef,
7
- } from 'react';
8
-
9
- import { useDevice } from './useDevice';
10
-
11
- declare global {
12
- interface Window {
13
- webkitAudioContext: typeof AudioContext;
14
- }
15
- }
16
-
17
- type AudioAPI = {
18
- play(arrayBuffer: ArrayBuffer, start: number): void;
19
- pause(): void;
20
- };
21
-
22
- let audioAPI: AudioAPI | null = null;
23
-
24
- const getAudioAPI = (): AudioAPI => {
25
- if (audioAPI) return audioAPI;
26
-
27
- // make it crossbrowser, vendor prefix implement is supported from 6.14 (Released 2012-09-10)
28
- const AudioContext = window.AudioContext || window.webkitAudioContext;
29
- const context = new AudioContext();
30
- const gainNode = context.createGain();
31
- // set volume to 100%
32
- gainNode.gain.value = 1;
33
-
34
- let currentSourceNode: AudioBufferSourceNode | null = null;
35
-
36
- // unlock the audio context
37
- window.addEventListener(
38
- 'touchstart',
39
- () => {
40
- // target to play an empty audio
41
- const buffer = context.createBuffer(1, 1, 22050);
42
- const source = context.createBufferSource();
43
- source.buffer = buffer;
44
- source.connect(context.destination);
45
- source.start(0);
46
- },
47
- { once: true }
48
- );
49
-
50
- audioAPI = {
51
- play(arrayBuffer: ArrayBuffer, start: number) {
52
- // call slice to clone, avoid disposing the input array buffer
53
- context.decodeAudioData(arrayBuffer.slice(0), (audioBuffer) => {
54
- if (context.state === 'suspended') {
55
- if (currentSourceNode) {
56
- currentSourceNode.stop();
57
- }
58
-
59
- context.resume();
60
- }
61
-
62
- if (gainNode.gain.value === 0) {
63
- gainNode.gain.value = 1;
64
- }
65
- const source = context.createBufferSource();
66
- source.buffer = audioBuffer;
67
- source.connect(context.destination);
68
- currentSourceNode = source;
69
-
70
- source.start(0, start);
71
- });
72
- },
73
- pause() {
74
- // if (context.state === 'running') {
75
- // context.suspend();
76
- // }
77
- // 不能判定状态,否则在 iOS 端,若录制声音,然后再继续播放,会有两条音轨播放
78
- context.suspend();
79
- },
80
- };
81
-
82
- return audioAPI;
83
- };
84
-
85
- const IosAudioPlayer = forwardRef(
86
- (
87
- props: React.DetailedHTMLProps<
88
- React.AudioHTMLAttributes<HTMLAudioElement>,
89
- HTMLAudioElement
90
- >,
91
- ref
92
- ) => {
93
- const audioRef = useRef<HTMLAudioElement>(null);
94
- const audioApi = getAudioAPI();
95
- const loadTask = useRef<Promise<ArrayBuffer | void>>();
96
-
97
- useLayoutEffect(() => {
98
- return () => {
99
- audioApi.pause();
100
- if (audioRef.current) {
101
- audioRef.current!.pause();
102
- }
103
- };
104
- }, []);
105
-
106
- const handlePlay = useCallback(async () => {
107
- if (!audioRef.current?.paused) return Promise.reject();
108
-
109
- if (props.src && loadTask.current) {
110
- const arrayBuffer = await loadTask.current;
111
- if (arrayBuffer) {
112
- return audioApi.play(arrayBuffer, audioRef.current!.currentTime);
113
- }
114
- }
115
-
116
- return Promise.resolve();
117
- }, []);
118
-
119
- const handleLoad = useCallback(async () => {
120
- if (props.src) {
121
- try {
122
- loadTask.current = window
123
- .fetch(props.src)
124
- .then((response) => response.arrayBuffer())
125
- .catch((error) => {
126
- console.error(error);
127
- });
128
- } catch (error) {
129
- console.error(error);
130
- }
131
- }
132
- }, []);
133
-
134
- // expose same ref interface as audio element, delegate to muted <audio /> besides real audio play implement
135
- useImperativeHandle(
136
- ref,
137
- () => {
138
- return {
139
- play: () =>
140
- handlePlay()
141
- .then(() => {
142
- console.log('audioCompPlay');
143
-
144
- return audioRef.current!.play();
145
- })
146
- .catch(() => {
147
- // playing
148
- }),
149
- pause: () => {
150
- audioAPI?.pause();
151
-
152
- return audioRef.current!.pause();
153
- },
154
- load: () => {
155
- // loading the audio array buffer
156
- handleLoad();
157
-
158
- return audioRef.current!.load();
159
- },
160
- addEventListener: (
161
- type: 'play' | 'pause',
162
- listener: (this: HTMLAudioElement, ev: Event) => any,
163
- options?: boolean | AddEventListenerOptions | undefined
164
- ) => {
165
- return audioRef.current!.addEventListener(type, listener, options);
166
- },
167
- get currentTime() {
168
- return audioRef.current!.currentTime;
169
- },
170
- set currentTime(value) {
171
- audioRef.current!.currentTime = value;
172
- },
173
- get duration() {
174
- return audioRef.current!.duration;
175
- },
176
- get paused() {
177
- return audioRef.current!.paused;
178
- },
179
- };
180
- },
181
- [handlePlay, handleLoad]
182
- );
183
-
184
- // iOS allows muted audio played without a user gesture, use this silent <audio /> to reflect the current audio status.
185
- // eslint-disable-next-line react/jsx-props-no-spreading
186
- return <audio {...props} muted ref={audioRef} />;
187
- }
188
- );
189
-
190
- IosAudioPlayer.displayName = 'IosAudioPlayer';
191
-
192
- const useAudioPlayer = (): React.ComponentType | 'audio' => {
193
- const { isIos } = useDevice();
194
-
195
- return !isIos ? 'audio' : IosAudioPlayer;
196
- };
197
-
198
- export default useAudioPlayer;
@@ -1,26 +0,0 @@
1
- import isMobile from 'ismobilejs';
2
- import { useState, useEffect } from 'react';
3
-
4
- import { useWindowWidth } from './useWindowWidth';
5
-
6
- export const useDevice = () => {
7
- const [device, setDevice] = useState(isMobile());
8
- const [isWeixin, setIsWeixin] = useState<boolean>(false);
9
- useEffect(() => {
10
- const device = isMobile();
11
- setDevice(device);
12
- setIsWeixin(
13
- navigator.userAgent.toLowerCase().indexOf('micromessenger') !== -1
14
- );
15
- }, []);
16
-
17
- return {
18
- isMobile: device.phone || device.tablet,
19
- isIos: device.apple.phone || device.apple.tablet || device.apple.ipod,
20
- isWeixin,
21
- };
22
- };
23
-
24
- export const useIsMobileByWindowWidth = () => {
25
- return useWindowWidth() <= 768;
26
- };
@@ -1,42 +0,0 @@
1
- /**
2
- * 与原生应用交互的钩子
3
- */
4
-
5
- import { useCallback } from 'react';
6
- import { isIosApp } from '../utils/common-helper';
7
-
8
- export function useNativeBridge() {
9
- const callNative = useCallback((action: string, data?: any) => {
10
- if (isIosApp() && window.webkit?.messageHandlers?.reactNative) {
11
- window.webkit.messageHandlers.reactNative.postMessage({
12
- action,
13
- data,
14
- });
15
- }
16
-
17
- // 安卓交互逻辑
18
- if (typeof window !== 'undefined' && (window as any).ReactNativeWebView) {
19
- (window as any).ReactNativeWebView.postMessage(
20
- JSON.stringify({
21
- action,
22
- data,
23
- })
24
- );
25
- }
26
- }, []);
27
-
28
- const getIosUrl = useCallback((path: string) => {
29
- // 简单实现,实际可能需要更复杂的逻辑
30
- return path;
31
- }, []);
32
-
33
- const nativeGoBack = useCallback(() => {
34
- callNative('goBack');
35
- }, [callNative]);
36
-
37
- return {
38
- callNative,
39
- getIosUrl,
40
- nativeGoBack,
41
- };
42
- }
@@ -1,179 +0,0 @@
1
- import CustomNotification from '@/components/custom-notification';
2
- import { useCallback } from 'react';
3
- import { toast, ToastOptions } from 'react-hot-toast';
4
-
5
- export type ToastType = 'success' | 'info' | 'warning' | 'error';
6
-
7
- export interface CustomToasterProps {
8
- id?: string;
9
- type?: ToastType;
10
- title?: string;
11
- content: string;
12
- isClosable?: boolean;
13
- translateInToast?: boolean;
14
- reason?: string;
15
- action?: React.ReactNode;
16
- loading?: boolean;
17
- }
18
-
19
- export function useNotification() {
20
- const addToast = useCallback(
21
- (config: CustomToasterProps, duration?: number) => {
22
- // 如果显式指定 id 的,则同时只能有一条显示
23
- if (config.id) {
24
- toast.remove(config.id);
25
- }
26
- toast.custom(
27
- (t: ToastOptions) => {
28
- return (
29
- <CustomNotification
30
- tProps={{ ...t, duration }}
31
- customProps={config}
32
- />
33
- );
34
- },
35
- {
36
- id: config.id,
37
- duration,
38
- }
39
- );
40
- },
41
- []
42
- );
43
-
44
- const message = useCallback(
45
- (config: CustomToasterProps, duration?: number) =>
46
- addToast(
47
- {
48
- ...config,
49
- },
50
- duration
51
- ),
52
- []
53
- );
54
-
55
- const success = useCallback(
56
- (config: CustomToasterProps, duration?: number) =>
57
- addToast(
58
- {
59
- ...config,
60
- type: 'success',
61
- },
62
- duration
63
- ),
64
- []
65
- );
66
-
67
- const error = useCallback(
68
- (config: CustomToasterProps, duration?: number) =>
69
- addToast(
70
- {
71
- ...config,
72
- type: 'error',
73
- },
74
- duration
75
- ),
76
- []
77
- );
78
-
79
- const warning = useCallback(
80
- (config: CustomToasterProps, duration?: number) =>
81
- addToast(
82
- {
83
- ...config,
84
- type: 'warning',
85
- },
86
- duration
87
- ),
88
- []
89
- );
90
-
91
- const info = useCallback(
92
- (config: CustomToasterProps, duration?: number) =>
93
- addToast(
94
- {
95
- ...config,
96
- type: 'info',
97
- },
98
- duration
99
- ),
100
- []
101
- );
102
-
103
- const close = useCallback((id: string) => {
104
- toast.dismiss(id);
105
- }, []);
106
-
107
- return { addToast, success, error, warning, info, close, message };
108
- }
109
-
110
- export class Message {
111
- private static _toast(config: CustomToasterProps, duration?: number) {
112
- if (config.id) {
113
- toast.remove(config.id);
114
- }
115
-
116
- const addToast = () => {
117
- toast.custom(
118
- (t: ToastOptions) => {
119
- return (
120
- <CustomNotification
121
- tProps={{ ...t, duration }}
122
- customProps={config}
123
- />
124
- );
125
- },
126
- {
127
- id: config.id,
128
- duration,
129
- }
130
- );
131
- };
132
-
133
- addToast();
134
- }
135
-
136
- static success(config: CustomToasterProps, duration?: number) {
137
- return this._toast(
138
- {
139
- ...config,
140
- type: 'success',
141
- },
142
- duration
143
- );
144
- }
145
-
146
- static error(config: CustomToasterProps, duration?: number) {
147
- return this._toast(
148
- {
149
- ...config,
150
- type: 'error',
151
- },
152
- duration
153
- );
154
- }
155
-
156
- static info(config: CustomToasterProps, duration?: number) {
157
- return this._toast(
158
- {
159
- ...config,
160
- type: 'info',
161
- },
162
- duration
163
- );
164
- }
165
-
166
- static warning(config: CustomToasterProps, duration?: number) {
167
- return this._toast(
168
- {
169
- ...config,
170
- type: 'warning',
171
- },
172
- duration
173
- );
174
- }
175
-
176
- static close(id: string) {
177
- toast.dismiss(id);
178
- }
179
- }
@@ -1,19 +0,0 @@
1
- import { useEffect, useState } from 'react';
2
-
3
- export const useWindowWidth = () => {
4
- const [windowWidth, setWindowWidth] = useState(0);
5
- useEffect(() => {
6
- const handleResize = () => {
7
- setWindowWidth(window.innerWidth);
8
- };
9
- window.addEventListener('resize', handleResize);
10
- handleResize();
11
-
12
- // 在组件卸载时移除事件监听
13
- return () => {
14
- window.removeEventListener('resize', handleResize);
15
- };
16
- }, []);
17
-
18
- return windowWidth;
19
- };
@@ -1,81 +0,0 @@
1
- export const CDN_URL = 'https://www.myshellstatic.com/';
2
- /**
3
- * 通用工具函数
4
- */
5
-
6
- /**
7
- * 获取资源URL
8
- */
9
-
10
- export function getAssetsUrl(url: string | any) {
11
- if (!isString(url) || !(url || '').trim()) {
12
- return url;
13
- }
14
- if (url.startsWith('http')) {
15
- return url;
16
- }
17
-
18
- return `${CDN_URL}${url}`;
19
- }
20
-
21
- /**
22
- * 格式化时长
23
- */
24
- export function durationFormatter(seconds: number): string {
25
- const minutes = Math.floor(seconds / 60);
26
- const remainingSeconds = Math.floor(seconds % 60);
27
- return `${minutes}:${remainingSeconds.toString().padStart(2, '0')}`;
28
- }
29
-
30
- /**
31
- * 获取百分比
32
- */
33
- export function getPercent(value: number, total: number): number {
34
- if (total === 0) return 0;
35
- return (value / total) * 100;
36
- }
37
-
38
- /**
39
- * 限制数值在指定范围内
40
- */
41
- export function clamp(value: number, min: number, max: number): number {
42
- return Math.min(Math.max(value, min), max);
43
- }
44
-
45
- /**
46
- * 检查是否为客户端环境
47
- */
48
- export function isClient(): boolean {
49
- return typeof window !== 'undefined';
50
- }
51
-
52
- /**
53
- * 为Window添加webkit属性的类型定义
54
- */
55
- declare global {
56
- interface Window {
57
- webkit?: {
58
- messageHandlers?: {
59
- reactNative?: {
60
- postMessage: (message: any) => void;
61
- };
62
- };
63
- };
64
- }
65
- }
66
-
67
- /**
68
- * 检查是否为iOS应用环境
69
- */
70
- export function isIosApp(): boolean {
71
- return (
72
- isClient() &&
73
- typeof navigator !== 'undefined' &&
74
- /iPhone|iPad|iPod/i.test(navigator.userAgent) &&
75
- !!window.webkit
76
- );
77
- }
78
-
79
- export function isString(str: any): str is string {
80
- return typeof str === 'string' || str instanceof String;
81
- }
@@ -1,15 +0,0 @@
1
- 'use client';
2
-
3
- import React from 'react';
4
-
5
- const ItemDemo: React.FC = () => {
6
- console.log('a');
7
-
8
- return (
9
- <div className="text-lg text-Colors-Text-Brand-Default">
10
- Yes. this is ItemDemo children.
11
- </div>
12
- );
13
- };
14
-
15
- export default ItemDemo;