taro-uno-ui 0.9.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.
- package/README.md +21 -0
- package/dist/js/{index-DffLRSro.js → index-CDFsvu80.js} +15369 -10741
- package/dist/js/index-CDFsvu80.js.map +1 -0
- package/dist/js/index-DFdcksbe.js.map +1 -1
- package/dist/js/index-DXRIkWX1.js.map +1 -1
- package/dist/js/{index-6NJ3A1Dn.js → index-JffnTUrv.js} +15430 -10801
- package/dist/js/index-JffnTUrv.js.map +1 -0
- package/dist/utils/http/request.d.ts +280 -0
- package/package.json +14 -10
- package/src/components/basic/Button/Button.tsx +53 -13
- package/src/components/basic/Button/Button.types.ts +45 -9
- package/src/components/basic/Divider/Divider.tsx +60 -29
- package/src/components/basic/Icon/Icon.data.ts +474 -0
- package/src/components/basic/Icon/Icon.test.tsx +2 -2
- package/src/components/basic/Icon/Icon.tsx +48 -35
- package/src/components/basic/Icon/IconManager.ts +229 -0
- package/src/components/basic/Text/Text.styles.ts +3 -3
- package/src/components/basic/Text/Text.types.ts +14 -4
- package/src/components/basic/Typography/Typography.styles.ts +10 -9
- package/src/components/basic/Typography/Typography.tsx +15 -13
- package/src/components/basic/Typography/Typography.types.ts +41 -41
- package/src/components/basic/Typography/index.tsx +1 -1
- package/src/components/basic/Video/Video.styles.ts +777 -0
- package/src/components/basic/Video/Video.test.tsx +490 -0
- package/src/components/basic/Video/Video.tsx +1468 -0
- package/src/components/basic/Video/Video.types.ts +500 -0
- package/src/components/basic/Video/index.tsx +26 -0
- package/src/components/basic/index.tsx +13 -15
- package/src/components/common/ErrorBoundary.tsx +1 -1
- package/src/components/common/LazyComponent.tsx +9 -8
- package/src/components/common/SecurityProvider.tsx +2 -14
- package/src/components/common/ThemeProvider.tsx +43 -56
- package/src/components/common/VirtualList.tsx +187 -205
- package/src/components/common/index.tsx +25 -0
- package/src/components/display/Avatar/Avatar.styles.ts +1 -1
- package/src/components/display/Avatar/Avatar.tsx +6 -19
- package/src/components/display/Avatar/Avatar.types.ts +1 -1
- package/src/components/display/Avatar/index.ts +1 -1
- package/src/components/display/Badge/Badge.tsx +3 -16
- package/src/components/display/Badge/Badge.types.ts +1 -1
- package/src/components/display/Badge/index.ts +1 -1
- package/src/components/display/Calendar/Calendar.styles.ts +36 -36
- package/src/components/display/Calendar/Calendar.test.tsx +27 -15
- package/src/components/display/Calendar/Calendar.tsx +56 -35
- package/src/components/display/Calendar/Calendar.types.ts +1 -1
- package/src/components/display/Calendar/index.ts +1 -1
- package/src/components/display/Card/Card.styles.ts +2 -2
- package/src/components/display/Card/Card.test.tsx +6 -4
- package/src/components/display/Card/Card.tsx +1 -1
- package/src/components/display/Card/Card.types.ts +4 -4
- package/src/components/display/Card/index.ts +1 -1
- package/src/components/display/Carousel/Carousel.styles.ts +31 -31
- package/src/components/display/Carousel/Carousel.tsx +34 -39
- package/src/components/display/Carousel/Carousel.types.ts +1 -1
- package/src/components/display/Carousel/index.ts +1 -1
- package/src/components/display/List/List.styles.ts +3 -3
- package/src/components/display/List/List.tsx +0 -1
- package/src/components/display/List/index.ts +1 -1
- package/src/components/display/Rate/Rate.styles.ts +5 -17
- package/src/components/display/Rate/Rate.tsx +6 -14
- package/src/components/display/Rate/Rate.types.ts +4 -3
- package/src/components/display/Rate/index.ts +3 -11
- package/src/components/display/Table/Table.test.tsx +2 -0
- package/src/components/display/Table/Table.tsx +3 -7
- package/src/components/display/Table/Table.types.ts +3 -2
- package/src/components/display/Tag/Tag.styles.ts +31 -31
- package/src/components/display/Tag/Tag.tsx +9 -26
- package/src/components/display/Tag/Tag.types.ts +1 -1
- package/src/components/display/Tag/index.ts +1 -1
- package/src/components/display/Timeline/Timeline.styles.ts +32 -32
- package/src/components/display/Timeline/Timeline.tsx +23 -42
- package/src/components/display/Timeline/Timeline.types.ts +1 -1
- package/src/components/display/Timeline/index.ts +1 -1
- package/src/components/display/index.tsx +33 -29
- package/src/components/feedback/Loading/Loading.tsx +6 -1
- package/src/components/feedback/Loading/index.ts +2 -5
- package/src/components/feedback/Message/Message.styles.ts +3 -3
- package/src/components/feedback/Message/index.ts +2 -5
- package/src/components/feedback/Modal/Modal.styles.ts +1 -1
- package/src/components/feedback/Modal/Modal.tsx +9 -31
- package/src/components/feedback/Modal/Modal.types.ts +12 -2
- package/src/components/feedback/Notification/Notification.styles.ts +49 -39
- package/src/components/feedback/Notification/Notification.test.tsx +1 -1
- package/src/components/feedback/Notification/Notification.tsx +97 -120
- package/src/components/feedback/Notification/Notification.types.ts +11 -8
- package/src/components/feedback/Notification/NotificationManager.tsx +135 -106
- package/src/components/feedback/Notification/index.ts +10 -3
- package/src/components/feedback/Notification/index.tsx +16 -26
- package/src/components/feedback/Progress/Progress.styles.ts +23 -14
- package/src/components/feedback/Progress/Progress.tsx +93 -113
- package/src/components/feedback/Progress/Progress.types.ts +1 -1
- package/src/components/feedback/Progress/index.ts +1 -1
- package/src/components/feedback/Progress/utils/animation.ts +12 -23
- package/src/components/feedback/Progress/utils/index.ts +2 -2
- package/src/components/feedback/Progress/utils/progress-calculator.ts +14 -32
- package/src/components/feedback/Result/Result.styles.ts +29 -29
- package/src/components/feedback/Result/Result.tsx +8 -20
- package/src/components/feedback/Result/Result.types.ts +7 -7
- package/src/components/feedback/Result/index.tsx +1 -1
- package/src/components/feedback/Toast/Toast.styles.ts +1 -1
- package/src/components/feedback/Toast/Toast.tsx +25 -13
- package/src/components/feedback/Tooltip/Tooltip.examples.tsx +21 -44
- package/src/components/feedback/Tooltip/Tooltip.styles.ts +16 -22
- package/src/components/feedback/Tooltip/Tooltip.test.tsx +1 -1
- package/src/components/feedback/Tooltip/Tooltip.tsx +65 -46
- package/src/components/feedback/Tooltip/Tooltip.types.ts +14 -20
- package/src/components/feedback/Tooltip/index.ts +1 -1
- package/src/components/feedback/Tooltip/index.tsx +12 -24
- package/src/components/feedback/index.tsx +54 -42
- package/src/components/form/Cascader/Cascader.styles.ts +2 -2
- package/src/components/form/Cascader/Cascader.tsx +84 -88
- package/src/components/form/Cascader/Cascader.types.ts +49 -50
- package/src/components/form/Cascader/hooks/useCascaderFieldNames.ts +11 -8
- package/src/components/form/Cascader/hooks/useCascaderOptions.ts +73 -55
- package/src/components/form/Cascader/hooks/useCascaderState.ts +31 -25
- package/src/components/form/Cascader/index.ts +1 -1
- package/src/components/form/Cascader/utils/formatDisplayValue.ts +4 -4
- package/src/components/form/Checkbox/Checkbox.styles.ts +83 -84
- package/src/components/form/Checkbox/Checkbox.tsx +2 -9
- package/src/components/form/Checkbox/CheckboxGroup.tsx +7 -7
- package/src/components/form/DatePicker/DatePicker.test.tsx +1 -1
- package/src/components/form/DatePicker/DatePicker.tsx +91 -75
- package/src/components/form/DatePicker/DatePicker.types.ts +4 -1
- package/src/components/form/Form/Form.tsx +66 -504
- package/src/components/form/Form/Form.types.ts +16 -1
- package/src/components/form/Form/useFormLogic.ts +497 -0
- package/src/components/form/Input/Input.styles.ts +8 -1
- package/src/components/form/Input/Input.tsx +55 -291
- package/src/components/form/Input/Input.types.ts +13 -1
- package/src/components/form/Input/useInputLogic.test.ts +82 -0
- package/src/components/form/Input/useInputLogic.ts +260 -0
- package/src/components/form/InputNumber/InputNumber.styles.ts +76 -25
- package/src/components/form/InputNumber/InputNumber.tsx +53 -21
- package/src/components/form/InputNumber/InputNumber.types.ts +21 -3
- package/src/components/form/InputNumber/components/InputNumberClearButton.tsx +3 -11
- package/src/components/form/InputNumber/components/InputNumberControls.tsx +3 -12
- package/src/components/form/InputNumber/hooks/index.ts +1 -1
- package/src/components/form/InputNumber/hooks/useInputNumberState.ts +7 -9
- package/src/components/form/InputNumber/hooks/useInputNumberValidation.ts +18 -17
- package/src/components/form/InputNumber/index.ts +7 -7
- package/src/components/form/Radio/Radio.styles.ts +1 -8
- package/src/components/form/Radio/Radio.tsx +3 -9
- package/src/components/form/Radio/Radio.types.ts +5 -1
- package/src/components/form/Select/Select.styles.ts +5 -1
- package/src/components/form/Select/Select.tsx +15 -15
- package/src/components/form/Select/Select.types.ts +2 -1
- package/src/components/form/Slider/Slider.styles.ts +13 -13
- package/src/components/form/Slider/Slider.tsx +19 -33
- package/src/components/form/Slider/Slider.types.ts +14 -12
- package/src/components/form/Slider/index.tsx +2 -9
- package/src/components/form/Switch/Switch.styles.ts +1 -7
- package/src/components/form/Switch/Switch.tsx +7 -13
- package/src/components/form/Textarea/Textarea.styles.ts +4 -4
- package/src/components/form/Textarea/Textarea.tsx +7 -1
- package/src/components/form/Textarea/Textarea.types.ts +4 -1
- package/src/components/form/TimePicker/TimePicker.styles.ts +8 -12
- package/src/components/form/TimePicker/TimePicker.tsx +122 -100
- package/src/components/form/TimePicker/TimePicker.types.ts +2 -2
- package/src/components/form/TimePicker/index.ts +1 -1
- package/src/components/form/Transfer/Transfer.styles.ts +3 -15
- package/src/components/form/Transfer/Transfer.tsx +146 -134
- package/src/components/form/Transfer/Transfer.types.ts +34 -26
- package/src/components/form/Transfer/components/TransferItem.tsx +55 -62
- package/src/components/form/Transfer/components/TransferList.tsx +212 -199
- package/src/components/form/Transfer/components/TransferOperations.tsx +52 -55
- package/src/components/form/Transfer/components/TransferPagination.tsx +115 -111
- package/src/components/form/Transfer/components/TransferSearch.tsx +52 -55
- package/src/components/form/Transfer/hooks/useTransferData.ts +91 -81
- package/src/components/form/Transfer/hooks/useTransferState.ts +22 -16
- package/src/components/form/Transfer/index.ts +2 -8
- package/src/components/form/Upload/Upload.styles.ts +21 -21
- package/src/components/form/Upload/Upload.tsx +189 -142
- package/src/components/form/Upload/Upload.types.ts +31 -31
- package/src/components/form/Upload/index.tsx +1 -1
- package/src/components/form/index.tsx +60 -29
- package/src/components/index.tsx +0 -1
- package/src/components/layout/Affix/Affix.styles.ts +16 -11
- package/src/components/layout/Affix/Affix.tsx +67 -75
- package/src/components/layout/Affix/Affix.types.ts +18 -18
- package/src/components/layout/Affix/index.tsx +1 -1
- package/src/components/layout/Col/Col.styles.ts +17 -17
- package/src/components/layout/Col/Col.test.tsx +7 -5
- package/src/components/layout/Col/Col.tsx +3 -21
- package/src/components/layout/Col/Col.types.ts +1 -1
- package/src/components/layout/Container/Container.styles.ts +3 -1
- package/src/components/layout/Container/Container.tsx +2 -11
- package/src/components/layout/Grid/Grid.tsx +3 -53
- package/src/components/layout/Layout/Content.tsx +24 -32
- package/src/components/layout/Layout/Footer.tsx +24 -32
- package/src/components/layout/Layout/Header.tsx +24 -32
- package/src/components/layout/Layout/Layout.styles.ts +17 -17
- package/src/components/layout/Layout/Layout.tsx +14 -25
- package/src/components/layout/Layout/Layout.types.ts +29 -29
- package/src/components/layout/Layout/Sider.tsx +44 -56
- package/src/components/layout/Layout/index.tsx +16 -2
- package/src/components/layout/Row/Row.tsx +15 -43
- package/src/components/layout/Space/Space.tsx +3 -11
- package/src/components/layout/Space/Space.types.ts +1 -1
- package/src/components/layout/index.tsx +29 -19
- package/src/components/navigation/Menu/Menu.constants.ts +69 -0
- package/src/components/navigation/Menu/Menu.stories.tsx +107 -0
- package/src/components/navigation/Menu/Menu.styles.ts +25 -37
- package/src/components/navigation/Menu/Menu.tsx +8 -11
- package/src/components/navigation/Menu/Menu.types.ts +2 -2
- package/src/components/navigation/Menu/Menu.utils.ts +17 -17
- package/src/components/navigation/Menu/MenuItem.tsx +9 -11
- package/src/components/navigation/Menu/SubMenu.tsx +8 -6
- package/src/components/navigation/Menu/index.tsx +4 -69
- package/src/components/navigation/NavBar/NavBar.styles.ts +1 -1
- package/src/components/navigation/NavBar/NavBar.tsx +7 -10
- package/src/components/navigation/NavBar/NavBar.types.ts +3 -3
- package/src/components/navigation/NavBar/index.tsx +1 -1
- package/src/components/navigation/Pagination/Pagination.test.tsx +2 -3
- package/src/components/navigation/Pagination/Pagination.tsx +3 -3
- package/src/components/navigation/Pagination/Pagination.types.ts +3 -2
- package/src/components/navigation/Pagination/index.ts +9 -3
- package/src/components/navigation/Steps/Step.tsx +24 -44
- package/src/components/navigation/Steps/Steps.styles.ts +28 -13
- package/src/components/navigation/Steps/Steps.test.tsx +2 -0
- package/src/components/navigation/Steps/Steps.tsx +88 -89
- package/src/components/navigation/Steps/Steps.types.ts +30 -30
- package/src/components/navigation/Steps/index.tsx +1 -1
- package/src/components/navigation/Tabs/Tabs.test.tsx +3 -2
- package/src/components/navigation/Tabs/Tabs.types.ts +4 -3
- package/src/components/navigation/index.tsx +21 -16
- package/src/constants/index.ts +1 -1
- package/src/hooks/index.ts +52 -102
- package/src/hooks/types.ts +4 -5
- package/src/hooks/useAsync.ts +46 -47
- package/src/hooks/useClickOutside.ts +52 -0
- package/src/hooks/useCounter.ts +87 -0
- package/src/hooks/useDebounce.ts +150 -0
- package/src/hooks/useDeepCompareEffect.ts +88 -0
- package/src/hooks/useEventListener.ts +77 -0
- package/src/hooks/useMediaQuery.ts +75 -0
- package/src/hooks/useMutation.ts +233 -0
- package/src/hooks/usePerformance.ts +1 -64
- package/src/hooks/usePlatform.ts +3 -1
- package/src/hooks/usePrevious.ts +25 -0
- package/src/hooks/useRequest.ts +12 -7
- package/src/hooks/useStateManagement.ts +1 -1
- package/src/hooks/useStorage.ts +169 -0
- package/src/hooks/useStyle.ts +8 -2
- package/src/hooks/useToggle.ts +54 -0
- package/src/index.ts +34 -9
- package/src/theme/ThemeProvider.tsx +3 -7
- package/src/theme/ThemeProvider.types.ts +1 -1
- package/src/theme/defaults.ts +1 -1
- package/src/theme/design-system.ts +2 -2
- package/src/theme/design-tokens.ts +85 -99
- package/src/theme/generated/dark-theme.scss +1 -1
- package/src/theme/generated/tokens.scss +82 -18
- package/src/theme/index.ts +8 -29
- package/src/theme/responsive.tsx +36 -34
- package/src/theme/styles.ts +1 -1
- package/src/theme/useThemeUtils.ts +43 -43
- package/src/theme/utils.ts +32 -32
- package/src/theme/variables.ts +70 -51
- package/src/types/accessibility.ts +36 -37
- package/src/types/button.ts +25 -27
- package/src/types/component-props.ts +6 -1
- package/src/types/glob.d.ts +4 -0
- package/src/types/index.ts +2 -2
- package/src/types/standardized-components.ts +9 -3
- package/src/types/utils.ts +13 -23
- package/src/utils/__tests__/responsiveUtils.test.ts +5 -4
- package/src/utils/abort-controller.ts +48 -0
- package/src/utils/cache.ts +2 -6
- package/src/utils/createNamespace.ts +4 -4
- package/src/utils/environment.ts +26 -6
- package/src/utils/error-handler.ts +2 -2
- package/src/utils/errorLogger.ts +16 -20
- package/src/utils/formatUtils.ts +38 -70
- package/src/utils/http/error-codes.ts +314 -0
- package/src/utils/http/http-client.test.ts +63 -0
- package/src/utils/{network → http}/http-client.ts +45 -35
- package/src/utils/http/request-cache.ts +127 -0
- package/src/utils/http/request.ts +954 -0
- package/src/utils/http/taro-adapter.test.ts +74 -0
- package/src/utils/http/taro-adapter.ts +24 -0
- package/src/utils/http/types.ts +414 -0
- package/src/utils/http/web-adapter.ts +33 -0
- package/src/utils/index.ts +5 -8
- package/src/utils/inputValidator.ts +17 -14
- package/src/utils/performance/performance.ts +60 -71
- package/src/utils/responsiveUtils.ts +7 -16
- package/src/utils/rtl-support.ts +29 -19
- package/src/utils/security/api-security.ts +47 -39
- package/src/utils/securityHeaders.ts +61 -67
- package/src/utils/typeHelpers.ts +10 -10
- package/src/utils/types/dataProcessing.ts +93 -92
- package/src/utils/types/typeHelpers.ts +31 -21
- package/src/utils/xssProtection.ts +96 -48
- package/dist/js/index-6NJ3A1Dn.js.map +0 -1
- package/dist/js/index-DffLRSro.js.map +0 -1
- package/src/components/form/Input/Input.enhanced.tsx +0 -732
- package/src/components/navigation/Menu/__tests__/Menu.test.tsx +0 -687
- package/src/components/navigation/Tree/Tree.styles.ts +0 -553
- package/src/components/navigation/Tree/Tree.test.basic.tsx +0 -7
- package/src/components/navigation/Tree/Tree.test.functional.tsx +0 -496
- package/src/components/navigation/Tree/Tree.test.import.check.tsx +0 -6
- package/src/components/navigation/Tree/Tree.test.import.tsx +0 -6
- package/src/components/navigation/Tree/Tree.test.minimal.tsx +0 -5
- package/src/components/navigation/Tree/Tree.test.simple.tsx +0 -30
- package/src/components/navigation/Tree/Tree.test.tsx +0 -908
- package/src/components/navigation/Tree/Tree.test.working.tsx +0 -673
- package/src/components/navigation/Tree/Tree.tsx +0 -600
- package/src/components/navigation/Tree/Tree.types.ts +0 -909
- package/src/components/navigation/Tree/Tree.utils.ts +0 -452
- package/src/components/navigation/Tree/index.ts +0 -33
- package/src/components/navigation/Tree/index.tsx +0 -23
- package/src/utils/network/http-client.test.ts +0 -18
|
@@ -46,7 +46,7 @@ export class MemoryManager {
|
|
|
46
46
|
}
|
|
47
47
|
|
|
48
48
|
static cleanup(): void {
|
|
49
|
-
this.cleanupCallbacks.forEach(callback => callback());
|
|
49
|
+
this.cleanupCallbacks.forEach((callback) => callback());
|
|
50
50
|
this.cleanupCallbacks.clear();
|
|
51
51
|
}
|
|
52
52
|
|
|
@@ -65,29 +65,17 @@ export class MemoryManager {
|
|
|
65
65
|
}
|
|
66
66
|
|
|
67
67
|
// 性能优化Hooks
|
|
68
|
-
export function useDebounce<T extends (...args: unknown[]) => unknown>(
|
|
69
|
-
callback
|
|
70
|
-
delay: number
|
|
71
|
-
): T {
|
|
72
|
-
return useMemo(
|
|
73
|
-
() => debounce(callback, delay) as unknown as T,
|
|
74
|
-
[callback, delay]
|
|
75
|
-
);
|
|
68
|
+
export function useDebounce<T extends (...args: unknown[]) => unknown>(callback: T, delay: number): T {
|
|
69
|
+
return useMemo(() => debounce(callback, delay) as unknown as T, [callback, delay]);
|
|
76
70
|
}
|
|
77
71
|
|
|
78
|
-
export function useThrottle<T extends (...args: unknown[]) => unknown>(
|
|
79
|
-
callback
|
|
80
|
-
delay: number
|
|
81
|
-
): T {
|
|
82
|
-
return useMemo(
|
|
83
|
-
() => throttle(callback, delay) as unknown as T,
|
|
84
|
-
[callback, delay]
|
|
85
|
-
);
|
|
72
|
+
export function useThrottle<T extends (...args: unknown[]) => unknown>(callback: T, delay: number): T {
|
|
73
|
+
return useMemo(() => throttle(callback, delay) as unknown as T, [callback, delay]);
|
|
86
74
|
}
|
|
87
75
|
|
|
88
76
|
export function useLazyLoad<T>(
|
|
89
77
|
loader: () => Promise<T>,
|
|
90
|
-
deps: any[] = []
|
|
78
|
+
deps: any[] = [],
|
|
91
79
|
): { data: T | null; loading: boolean; error: Error | null; reload: () => void } {
|
|
92
80
|
const [data, setData] = useState<T | null>(null);
|
|
93
81
|
const [loading, setLoading] = useState(false);
|
|
@@ -116,7 +104,7 @@ export function useLazyLoad<T>(
|
|
|
116
104
|
|
|
117
105
|
export function useIntersectionObserver(
|
|
118
106
|
callback: (entry: IntersectionObserverEntry) => void,
|
|
119
|
-
options: IntersectionObserverInit = {}
|
|
107
|
+
options: IntersectionObserverInit = {},
|
|
120
108
|
): (node: Element | null) => void {
|
|
121
109
|
const [node, setNode] = useState<Element | null>(null);
|
|
122
110
|
|
|
@@ -137,9 +125,7 @@ export function useIntersectionObserver(
|
|
|
137
125
|
return setNode;
|
|
138
126
|
}
|
|
139
127
|
|
|
140
|
-
export function useResizeObserver(
|
|
141
|
-
callback: (entry: ResizeObserverEntry) => void
|
|
142
|
-
): (node: Element | null) => void {
|
|
128
|
+
export function useResizeObserver(callback: (entry: ResizeObserverEntry) => void): (node: Element | null) => void {
|
|
143
129
|
const [node, setNode] = useState<Element | null>(null);
|
|
144
130
|
|
|
145
131
|
useEffect(() => {
|
|
@@ -190,9 +176,7 @@ export function usePerformanceMonitor({
|
|
|
190
176
|
const navigation = performance.getEntriesByType('navigation')[0] as PerformanceNavigationTiming;
|
|
191
177
|
const loadTime = navigation ? navigation.loadEventEnd - navigation.fetchStart : 0;
|
|
192
178
|
|
|
193
|
-
const isHealthy =
|
|
194
|
-
fps >= (thresholds.fps || 30) &&
|
|
195
|
-
memory <= (thresholds.memory || 80);
|
|
179
|
+
const isHealthy = fps >= (thresholds.fps || 30) && memory <= (thresholds.memory || 80);
|
|
196
180
|
|
|
197
181
|
setMetrics({
|
|
198
182
|
fps,
|
|
@@ -241,17 +225,20 @@ export function useBatch<T>(callback: (items: T[]) => void, delay: number = 100)
|
|
|
241
225
|
}
|
|
242
226
|
}, [callback]);
|
|
243
227
|
|
|
244
|
-
const addItem = useCallback(
|
|
245
|
-
|
|
228
|
+
const addItem = useCallback(
|
|
229
|
+
(item: T) => {
|
|
230
|
+
batchRef.current.push(item);
|
|
246
231
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
232
|
+
if (timeoutRef.current) {
|
|
233
|
+
clearTimeout(timeoutRef.current);
|
|
234
|
+
}
|
|
250
235
|
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
236
|
+
timeoutRef.current = setTimeout(() => {
|
|
237
|
+
flush();
|
|
238
|
+
}, delay);
|
|
239
|
+
},
|
|
240
|
+
[flush, delay],
|
|
241
|
+
);
|
|
255
242
|
|
|
256
243
|
useEffect(() => {
|
|
257
244
|
return () => {
|
|
@@ -271,10 +258,13 @@ export function useCache<T>(key: string, initialValue: T, deps: any[] = []): [T,
|
|
|
271
258
|
return cached ? JSON.parse(cached) : initialValue;
|
|
272
259
|
});
|
|
273
260
|
|
|
274
|
-
const updateValue = useCallback(
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
261
|
+
const updateValue = useCallback(
|
|
262
|
+
(newValue: T) => {
|
|
263
|
+
setValue(newValue);
|
|
264
|
+
localStorage.setItem(`cache_${key}`, JSON.stringify(newValue));
|
|
265
|
+
},
|
|
266
|
+
[key],
|
|
267
|
+
);
|
|
278
268
|
|
|
279
269
|
useEffect(() => {
|
|
280
270
|
const cached = localStorage.getItem(`cache_${key}`);
|
|
@@ -295,7 +285,7 @@ export function useOptimizedRequest<T>(
|
|
|
295
285
|
retryDelay?: number;
|
|
296
286
|
debounceTime?: number;
|
|
297
287
|
throttleTime?: number;
|
|
298
|
-
} = {}
|
|
288
|
+
} = {},
|
|
299
289
|
) {
|
|
300
290
|
const {
|
|
301
291
|
cacheKey,
|
|
@@ -336,7 +326,7 @@ export function useOptimizedRequest<T>(
|
|
|
336
326
|
attempts++;
|
|
337
327
|
|
|
338
328
|
if (attempts < retryCount) {
|
|
339
|
-
await new Promise(resolve => setTimeout(resolve, retryDelay));
|
|
329
|
+
await new Promise((resolve) => setTimeout(resolve, retryDelay));
|
|
340
330
|
}
|
|
341
331
|
}
|
|
342
332
|
}
|
|
@@ -393,7 +383,7 @@ export function debounce<T extends (...args: unknown[]) => unknown>(
|
|
|
393
383
|
leading?: boolean;
|
|
394
384
|
trailing?: boolean;
|
|
395
385
|
maxWait?: number;
|
|
396
|
-
} = {}
|
|
386
|
+
} = {},
|
|
397
387
|
): (...args: Parameters<T>) => void {
|
|
398
388
|
const { leading = false, trailing = true, maxWait } = options;
|
|
399
389
|
let timeoutId: NodeJS.Timeout | null = null;
|
|
@@ -409,17 +399,17 @@ export function debounce<T extends (...args: unknown[]) => unknown>(
|
|
|
409
399
|
lastArgs = null;
|
|
410
400
|
lastThis = null;
|
|
411
401
|
lastCallTime = time;
|
|
412
|
-
|
|
402
|
+
|
|
413
403
|
if (args) {
|
|
414
404
|
result = func.apply(thisArg as any, args) as ReturnType<T>;
|
|
415
405
|
}
|
|
416
|
-
|
|
406
|
+
|
|
417
407
|
return result;
|
|
418
408
|
};
|
|
419
409
|
|
|
420
410
|
const shouldInvoke = (time: number) => {
|
|
421
411
|
const timeSinceLastCall = time - lastCallTime;
|
|
422
|
-
|
|
412
|
+
|
|
423
413
|
return (
|
|
424
414
|
lastCallTime === 0 || // 首次调用
|
|
425
415
|
timeSinceLastCall >= delay || // 超过延迟时间
|
|
@@ -429,11 +419,11 @@ export function debounce<T extends (...args: unknown[]) => unknown>(
|
|
|
429
419
|
|
|
430
420
|
const trailingEdge = (time: number) => {
|
|
431
421
|
timeoutId = null;
|
|
432
|
-
|
|
422
|
+
|
|
433
423
|
if (trailing && lastArgs) {
|
|
434
424
|
return invokeFunc(time);
|
|
435
425
|
}
|
|
436
|
-
|
|
426
|
+
|
|
437
427
|
lastArgs = null;
|
|
438
428
|
lastThis = null;
|
|
439
429
|
return result;
|
|
@@ -441,21 +431,21 @@ export function debounce<T extends (...args: unknown[]) => unknown>(
|
|
|
441
431
|
|
|
442
432
|
const timerExpired = (): ReturnType<T> | null => {
|
|
443
433
|
const time = Date.now();
|
|
444
|
-
|
|
434
|
+
|
|
445
435
|
if (shouldInvoke(time)) {
|
|
446
436
|
return trailingEdge(time);
|
|
447
437
|
}
|
|
448
|
-
|
|
438
|
+
|
|
449
439
|
// 重新计算剩余时间
|
|
450
440
|
const timeSinceLastCall = time - lastCallTime;
|
|
451
441
|
const timeWaiting = delay - timeSinceLastCall;
|
|
452
442
|
const remainingWait = maxWait !== undefined ? Math.min(timeWaiting, maxWait - timeSinceLastCall) : timeWaiting;
|
|
453
|
-
|
|
443
|
+
|
|
454
444
|
timeoutId = setTimeout(timerExpired, remainingWait);
|
|
455
445
|
return null;
|
|
456
446
|
};
|
|
457
447
|
|
|
458
|
-
const debounced = function(this: unknown, ...args: Parameters<T>) {
|
|
448
|
+
const debounced = function (this: unknown, ...args: Parameters<T>) {
|
|
459
449
|
const time = Date.now();
|
|
460
450
|
lastArgs = args;
|
|
461
451
|
lastThis = this;
|
|
@@ -508,7 +498,7 @@ export function throttle<T extends (...args: unknown[]) => unknown>(
|
|
|
508
498
|
options: {
|
|
509
499
|
leading?: boolean;
|
|
510
500
|
trailing?: boolean;
|
|
511
|
-
} = {}
|
|
501
|
+
} = {},
|
|
512
502
|
): (...args: Parameters<T>) => void {
|
|
513
503
|
const { leading = true, trailing = true } = options;
|
|
514
504
|
let lastCallTime = 0;
|
|
@@ -516,7 +506,7 @@ export function throttle<T extends (...args: unknown[]) => unknown>(
|
|
|
516
506
|
let lastArgs: Parameters<T> | null = null;
|
|
517
507
|
let lastThis: unknown = null;
|
|
518
508
|
|
|
519
|
-
const throttled = function(this: unknown, ...args: Parameters<T>) {
|
|
509
|
+
const throttled = function (this: unknown, ...args: Parameters<T>) {
|
|
520
510
|
const now = Date.now();
|
|
521
511
|
const timeSinceLastCall = now - lastCallTime;
|
|
522
512
|
|
|
@@ -533,14 +523,14 @@ export function throttle<T extends (...args: unknown[]) => unknown>(
|
|
|
533
523
|
clearTimeout(timeoutId);
|
|
534
524
|
timeoutId = null;
|
|
535
525
|
}
|
|
536
|
-
|
|
526
|
+
|
|
537
527
|
lastCallTime = now;
|
|
538
528
|
func.apply(this, args);
|
|
539
529
|
} else if (trailing && !timeoutId) {
|
|
540
530
|
timeoutId = setTimeout(() => {
|
|
541
531
|
lastCallTime = leading ? Date.now() : 0;
|
|
542
532
|
timeoutId = null;
|
|
543
|
-
|
|
533
|
+
|
|
544
534
|
if (lastArgs && trailing) {
|
|
545
535
|
func.apply(lastThis, lastArgs);
|
|
546
536
|
}
|
|
@@ -572,7 +562,7 @@ export function rafThrottle<T extends (...args: unknown[]) => unknown>(func: T):
|
|
|
572
562
|
let lastArgs: Parameters<T> | null = null;
|
|
573
563
|
let lastThis: unknown = null;
|
|
574
564
|
|
|
575
|
-
const throttled = function(this: unknown, ...args: Parameters<T>) {
|
|
565
|
+
const throttled = function (this: unknown, ...args: Parameters<T>) {
|
|
576
566
|
lastArgs = args;
|
|
577
567
|
lastThis = this;
|
|
578
568
|
|
|
@@ -612,7 +602,7 @@ export function lazyLoad<T>(
|
|
|
612
602
|
timeout?: number;
|
|
613
603
|
retryCount?: number;
|
|
614
604
|
retryDelay?: number;
|
|
615
|
-
} = {}
|
|
605
|
+
} = {},
|
|
616
606
|
): Promise<T> {
|
|
617
607
|
const { timeout = 5000, retryCount = 3, retryDelay = 1000 } = options;
|
|
618
608
|
let retries = 0;
|
|
@@ -630,7 +620,7 @@ export function lazyLoad<T>(
|
|
|
630
620
|
})
|
|
631
621
|
.catch((error) => {
|
|
632
622
|
clearTimeout(timeoutId);
|
|
633
|
-
|
|
623
|
+
|
|
634
624
|
if (retries < retryCount) {
|
|
635
625
|
retries++;
|
|
636
626
|
setTimeout(() => {
|
|
@@ -661,7 +651,7 @@ export function lazyLoadImage(
|
|
|
661
651
|
placeholder?: string;
|
|
662
652
|
onLoad?: () => void;
|
|
663
653
|
onError?: () => void;
|
|
664
|
-
} = {}
|
|
654
|
+
} = {},
|
|
665
655
|
): void {
|
|
666
656
|
const {
|
|
667
657
|
threshold = 0.1,
|
|
@@ -700,7 +690,7 @@ export function lazyLoadImage(
|
|
|
700
690
|
}
|
|
701
691
|
});
|
|
702
692
|
},
|
|
703
|
-
{ threshold, rootMargin }
|
|
693
|
+
{ threshold, rootMargin },
|
|
704
694
|
);
|
|
705
695
|
|
|
706
696
|
observer.observe(element);
|
|
@@ -714,7 +704,7 @@ export function lazyLoadImage(
|
|
|
714
704
|
*/
|
|
715
705
|
export function batch<T extends (...args: any[]) => any>(
|
|
716
706
|
func: (items: Parameters<T>[]) => void,
|
|
717
|
-
wait: number
|
|
707
|
+
wait: number,
|
|
718
708
|
): (...args: Parameters<T>) => void {
|
|
719
709
|
let batch: Parameters<T>[] = [];
|
|
720
710
|
let timeoutId: NodeJS.Timeout | null = null;
|
|
@@ -744,13 +734,13 @@ export function batch<T extends (...args: any[]) => any>(
|
|
|
744
734
|
*/
|
|
745
735
|
export function memoize<T extends (...args: unknown[]) => unknown>(
|
|
746
736
|
func: T,
|
|
747
|
-
keyGenerator?: (...args: Parameters<T>) => string
|
|
737
|
+
keyGenerator?: (...args: Parameters<T>) => string,
|
|
748
738
|
): T {
|
|
749
739
|
const cache = new Map<string, ReturnType<T>>();
|
|
750
740
|
|
|
751
741
|
return ((...args: Parameters<T>) => {
|
|
752
742
|
const key = keyGenerator ? keyGenerator(...args) : JSON.stringify(args);
|
|
753
|
-
|
|
743
|
+
|
|
754
744
|
if (cache.has(key)) {
|
|
755
745
|
return cache.get(key)!;
|
|
756
746
|
}
|
|
@@ -765,11 +755,13 @@ export function memoize<T extends (...args: unknown[]) => unknown>(
|
|
|
765
755
|
* 性能监控装饰器
|
|
766
756
|
* @param options 选项
|
|
767
757
|
*/
|
|
768
|
-
export function performanceMonitor(
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
|
|
772
|
-
|
|
758
|
+
export function performanceMonitor(
|
|
759
|
+
options: {
|
|
760
|
+
name?: string;
|
|
761
|
+
threshold?: number;
|
|
762
|
+
logLevel?: 'warn' | 'error' | 'info';
|
|
763
|
+
} = {},
|
|
764
|
+
) {
|
|
773
765
|
return function (_target: unknown, propertyKey: string, descriptor: PropertyDescriptor) {
|
|
774
766
|
const originalMethod = descriptor.value;
|
|
775
767
|
const { name = propertyKey, threshold = 16, logLevel = 'warn' } = options;
|
|
@@ -814,10 +806,7 @@ export function raf(callback: () => void): () => void {
|
|
|
814
806
|
* @param callback 回调函数
|
|
815
807
|
* @param options 选项
|
|
816
808
|
*/
|
|
817
|
-
export function idleCallback(
|
|
818
|
-
callback: () => void,
|
|
819
|
-
options: { timeout?: number } = {}
|
|
820
|
-
): () => void {
|
|
809
|
+
export function idleCallback(callback: () => void, options: { timeout?: number } = {}): () => void {
|
|
821
810
|
let handle: number;
|
|
822
811
|
|
|
823
812
|
if ('requestIdleCallback' in window) {
|
|
@@ -113,7 +113,7 @@ class ResponsiveUtils {
|
|
|
113
113
|
}
|
|
114
114
|
|
|
115
115
|
// 如果没有找到,返回默认值(确保不会返回undefined)
|
|
116
|
-
return (responsiveValue.xs || value as T) as T;
|
|
116
|
+
return (responsiveValue.xs || (value as T)) as T;
|
|
117
117
|
}
|
|
118
118
|
|
|
119
119
|
/**
|
|
@@ -142,11 +142,7 @@ class ResponsiveUtils {
|
|
|
142
142
|
* @param otherStyles 其他平台样式
|
|
143
143
|
* @returns 当前平台的样式
|
|
144
144
|
*/
|
|
145
|
-
getPlatformStyles<T>(
|
|
146
|
-
webStyles: T,
|
|
147
|
-
weappStyles: T,
|
|
148
|
-
otherStyles?: Partial<Record<Platform, T>>
|
|
149
|
-
): T {
|
|
145
|
+
getPlatformStyles<T>(webStyles: T, weappStyles: T, otherStyles?: Partial<Record<Platform, T>>): T {
|
|
150
146
|
if (this.platform === 'web' || this.platform === 'h5') {
|
|
151
147
|
return webStyles;
|
|
152
148
|
}
|
|
@@ -274,7 +270,7 @@ export const useResponsive = () => {
|
|
|
274
270
|
const systemInfo = Taro.getSystemInfoSync();
|
|
275
271
|
setWindowSize({
|
|
276
272
|
windowWidth: systemInfo.windowWidth || 375,
|
|
277
|
-
windowHeight: systemInfo.windowHeight || 667
|
|
273
|
+
windowHeight: systemInfo.windowHeight || 667,
|
|
278
274
|
});
|
|
279
275
|
} catch (e) {
|
|
280
276
|
// 如果获取失败,使用默认值
|
|
@@ -320,14 +316,12 @@ export const useResponsive = () => {
|
|
|
320
316
|
safeArea,
|
|
321
317
|
statusBarHeight,
|
|
322
318
|
navigationBarHeight,
|
|
323
|
-
getResponsiveValue: <T>(value: ResponsiveValue<T>) =>
|
|
324
|
-
responsiveUtils.getResponsiveValue(value, windowWidth),
|
|
319
|
+
getResponsiveValue: <T>(value: ResponsiveValue<T>) => responsiveUtils.getResponsiveValue(value, windowWidth),
|
|
325
320
|
generateResponsiveStyles: (styles: ResponsiveStyle) =>
|
|
326
321
|
responsiveUtils.generateResponsiveStyles(styles, windowWidth),
|
|
327
322
|
getPlatformStyles: <T>(webStyles: T, weappStyles: T, otherStyles?: Partial<Record<Platform, T>>) =>
|
|
328
323
|
responsiveUtils.getPlatformStyles(webStyles, weappStyles, otherStyles),
|
|
329
|
-
matchScreenSize: (size: ScreenSize) =>
|
|
330
|
-
responsiveUtils.matchScreenSize(size, windowWidth),
|
|
324
|
+
matchScreenSize: (size: ScreenSize) => responsiveUtils.matchScreenSize(size, windowWidth),
|
|
331
325
|
};
|
|
332
326
|
};
|
|
333
327
|
|
|
@@ -338,11 +332,8 @@ export const getResponsiveValue = <T>(value: ResponsiveValue<T>, width: number)
|
|
|
338
332
|
responsiveUtils.getResponsiveValue(value, width);
|
|
339
333
|
export const generateResponsiveStyles = (styles: ResponsiveStyle, width: number) =>
|
|
340
334
|
responsiveUtils.generateResponsiveStyles(styles, width);
|
|
341
|
-
export const getPlatformStyles = <T>(
|
|
342
|
-
webStyles
|
|
343
|
-
weappStyles: T,
|
|
344
|
-
otherStyles?: Partial<Record<Platform, T>>
|
|
345
|
-
) => responsiveUtils.getPlatformStyles(webStyles, weappStyles, otherStyles);
|
|
335
|
+
export const getPlatformStyles = <T>(webStyles: T, weappStyles: T, otherStyles?: Partial<Record<Platform, T>>) =>
|
|
336
|
+
responsiveUtils.getPlatformStyles(webStyles, weappStyles, otherStyles);
|
|
346
337
|
export const getPlatform = () => responsiveUtils.getPlatform();
|
|
347
338
|
export const isMobile = (width: number) => responsiveUtils.isMobile(width);
|
|
348
339
|
export const isTablet = (width: number) => responsiveUtils.isTablet(width);
|
package/src/utils/rtl-support.ts
CHANGED
|
@@ -8,13 +8,13 @@ type SupportedLanguage = 'ar-SA' | 'he-IL' | 'fa-IR' | 'ur-PK' | string;
|
|
|
8
8
|
|
|
9
9
|
// RTL语言列表
|
|
10
10
|
export const RTL_LANGUAGES: SupportedLanguage[] = [
|
|
11
|
-
'ar-SA',
|
|
12
|
-
'he-IL',
|
|
13
|
-
'fa-IR',
|
|
14
|
-
'ur-PK',
|
|
15
|
-
'yi',
|
|
16
|
-
'ps',
|
|
17
|
-
'sd',
|
|
11
|
+
'ar-SA', // 阿拉伯语
|
|
12
|
+
'he-IL', // 希伯来语
|
|
13
|
+
'fa-IR', // 波斯语
|
|
14
|
+
'ur-PK', // 乌尔都语
|
|
15
|
+
'yi', // 意第绪语
|
|
16
|
+
'ps', // 普什图语
|
|
17
|
+
'sd', // 信德语
|
|
18
18
|
];
|
|
19
19
|
|
|
20
20
|
// 扩展RTL语言配置
|
|
@@ -38,7 +38,8 @@ export const RTL_CONFIGS: Record<string, RTLConfig> = {
|
|
|
38
38
|
language: 'ar-SA',
|
|
39
39
|
name: 'Arabic (Saudi Arabia)',
|
|
40
40
|
rtl: true,
|
|
41
|
-
fontFamily:
|
|
41
|
+
fontFamily:
|
|
42
|
+
'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", "Tahoma", "Arial Unicode MS", "Traditional Arabic"',
|
|
42
43
|
textAlign: 'right',
|
|
43
44
|
direction: 'rtl',
|
|
44
45
|
flipProperties: true,
|
|
@@ -50,7 +51,8 @@ export const RTL_CONFIGS: Record<string, RTLConfig> = {
|
|
|
50
51
|
language: 'he-IL',
|
|
51
52
|
name: 'Hebrew (Israel)',
|
|
52
53
|
rtl: true,
|
|
53
|
-
fontFamily:
|
|
54
|
+
fontFamily:
|
|
55
|
+
'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", "David", "Arial Hebrew", "Arial"',
|
|
54
56
|
textAlign: 'right',
|
|
55
57
|
direction: 'rtl',
|
|
56
58
|
flipProperties: true,
|
|
@@ -62,7 +64,8 @@ export const RTL_CONFIGS: Record<string, RTLConfig> = {
|
|
|
62
64
|
language: 'fa-IR',
|
|
63
65
|
name: 'Persian (Iran)',
|
|
64
66
|
rtl: true,
|
|
65
|
-
fontFamily:
|
|
67
|
+
fontFamily:
|
|
68
|
+
'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", "Tahoma", "Arial Unicode MS", "IRANSans", "Vazir"',
|
|
66
69
|
textAlign: 'right',
|
|
67
70
|
direction: 'rtl',
|
|
68
71
|
flipProperties: true,
|
|
@@ -74,7 +77,8 @@ export const RTL_CONFIGS: Record<string, RTLConfig> = {
|
|
|
74
77
|
language: 'ur-PK',
|
|
75
78
|
name: 'Urdu (Pakistan)',
|
|
76
79
|
rtl: true,
|
|
77
|
-
fontFamily:
|
|
80
|
+
fontFamily:
|
|
81
|
+
'-apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji", "Noto Nastaliq Urdu", "Arial Unicode MS", "Tahoma"',
|
|
78
82
|
textAlign: 'right',
|
|
79
83
|
direction: 'rtl',
|
|
80
84
|
flipProperties: true,
|
|
@@ -86,11 +90,13 @@ export const RTL_CONFIGS: Record<string, RTLConfig> = {
|
|
|
86
90
|
|
|
87
91
|
// 检查是否为RTL语言
|
|
88
92
|
export const isRTL = (language: string): boolean => {
|
|
89
|
-
return
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
93
|
+
return (
|
|
94
|
+
RTL_LANGUAGES.includes(language as SupportedLanguage) ||
|
|
95
|
+
language.startsWith('ar') ||
|
|
96
|
+
language.startsWith('he') ||
|
|
97
|
+
language.startsWith('fa') ||
|
|
98
|
+
language.startsWith('ur')
|
|
99
|
+
);
|
|
94
100
|
};
|
|
95
101
|
|
|
96
102
|
// 应用RTL样式
|
|
@@ -129,7 +135,9 @@ export const applyRTLStyles = (language: string): void => {
|
|
|
129
135
|
transform: scaleX(-1);
|
|
130
136
|
}
|
|
131
137
|
.rtl .flip-property {
|
|
132
|
-
${
|
|
138
|
+
${
|
|
139
|
+
config.flipProperties
|
|
140
|
+
? `
|
|
133
141
|
margin-left: initial;
|
|
134
142
|
margin-right: initial;
|
|
135
143
|
padding-left: initial;
|
|
@@ -137,7 +145,9 @@ export const applyRTLStyles = (language: string): void => {
|
|
|
137
145
|
border-left: initial;
|
|
138
146
|
border-right: initial;
|
|
139
147
|
border-radius: initial;
|
|
140
|
-
`
|
|
148
|
+
`
|
|
149
|
+
: ''
|
|
150
|
+
}
|
|
141
151
|
}
|
|
142
152
|
`;
|
|
143
153
|
|
|
@@ -322,7 +332,7 @@ export const createRTLCSS = (css: string, language: string): string => {
|
|
|
322
332
|
];
|
|
323
333
|
|
|
324
334
|
let rtlCSS = css;
|
|
325
|
-
rtlRules.forEach(rule => {
|
|
335
|
+
rtlRules.forEach((rule) => {
|
|
326
336
|
rtlCSS = rtlCSS.replace(rule.pattern, rule.replacement);
|
|
327
337
|
});
|
|
328
338
|
|