@xaui/native 0.0.30 → 0.0.32

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.
@@ -0,0 +1,282 @@
1
+ "use strict";Object.defineProperty(exports, "__esModule", {value: true}); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _nullishCoalesce(lhs, rhsFn) { if (lhs != null) { return lhs; } else { return rhsFn(); } } function _optionalChain(ops) { let lastAccessLHS = undefined; let value = ops[0]; let i = 1; while (i < ops.length) { const op = ops[i]; const fn = ops[i + 1]; i += 2; if ((op === 'optionalAccess' || op === 'optionalCall') && value == null) { return undefined; } if (op === 'access' || op === 'optionalAccess') { lastAccessLHS = value; value = fn(value); } else if (op === 'call' || op === 'optionalCall') { value = fn((...args) => value.call(lastAccessLHS, ...args)); lastAccessLHS = undefined; } } return value; }require('../chunk-HSPTLUFA.cjs');
2
+
3
+
4
+
5
+ var _chunkOQ2BLOOGcjs = require('../chunk-OQ2BLOOG.cjs');
6
+
7
+ // src/components/snippet/snippet.tsx
8
+ var _react = require('react'); var _react2 = _interopRequireDefault(_react);
9
+ var _reactnative = require('react-native');
10
+ var _icons = require('@xaui/icons');
11
+
12
+ // src/components/snippet/snippet.style.ts
13
+
14
+ var styles = _reactnative.StyleSheet.create({
15
+ container: {
16
+ flexShrink: 1,
17
+ flexBasis: "auto",
18
+ width: "100%"
19
+ },
20
+ noFullWidth: {
21
+ width: void 0,
22
+ alignSelf: "flex-start"
23
+ },
24
+ snippet: {
25
+ position: "relative",
26
+ borderWidth: 1,
27
+ overflow: "hidden"
28
+ },
29
+ content: {
30
+ minHeight: 64,
31
+ justifyContent: "center",
32
+ paddingHorizontal: 14,
33
+ paddingVertical: 12
34
+ },
35
+ text: {
36
+ fontSize: 14,
37
+ lineHeight: 20,
38
+ fontFamily: "monospace",
39
+ includeFontPadding: false
40
+ },
41
+ topInset: {
42
+ paddingTop: 44
43
+ },
44
+ bottomInset: {
45
+ paddingBottom: 44
46
+ },
47
+ copyButton: {
48
+ position: "absolute",
49
+ flexDirection: "row",
50
+ alignItems: "center",
51
+ gap: 6,
52
+ borderWidth: 1,
53
+ paddingHorizontal: 10,
54
+ paddingVertical: 6
55
+ },
56
+ top: {
57
+ top: 8
58
+ },
59
+ bottom: {
60
+ bottom: 8
61
+ },
62
+ left: {
63
+ left: 8
64
+ },
65
+ right: {
66
+ right: 8
67
+ },
68
+ copyButtonText: {
69
+ fontSize: 12,
70
+ fontWeight: "600",
71
+ includeFontPadding: false
72
+ },
73
+ disabled: {
74
+ opacity: 0.55
75
+ }
76
+ });
77
+
78
+ // src/components/snippet/snippet.hook.ts
79
+
80
+ var _core = require('@xaui/core');
81
+ var useSnippetColors = (themeColor, variant, isDisabled) => {
82
+ const theme = _chunkOQ2BLOOGcjs.useXUITheme.call(void 0, );
83
+ return _react.useMemo.call(void 0, () => {
84
+ const safeThemeColor = _core.getSafeThemeColor.call(void 0, themeColor);
85
+ const colorScheme = theme.colors[safeThemeColor];
86
+ const isDark = theme.mode === "dark";
87
+ const textColor = isDisabled ? _core.withOpacity.call(void 0, theme.colors.foreground, 0.56) : theme.colors.foreground;
88
+ if (variant === "flat") {
89
+ return {
90
+ containerBackground: colorScheme.background,
91
+ containerBorder: "transparent",
92
+ text: textColor,
93
+ copyButtonBackground: _core.withOpacity.call(void 0, colorScheme.main, isDark ? 0.2 : 0.14),
94
+ copyButtonBorder: "transparent",
95
+ copyButtonText: colorScheme.main
96
+ };
97
+ }
98
+ if (variant === "light") {
99
+ return {
100
+ containerBackground: _core.withOpacity.call(void 0, colorScheme.main, isDark ? 0.12 : 0.08),
101
+ containerBorder: "transparent",
102
+ text: textColor,
103
+ copyButtonBackground: "transparent",
104
+ copyButtonBorder: "transparent",
105
+ copyButtonText: colorScheme.main
106
+ };
107
+ }
108
+ return {
109
+ containerBackground: theme.colors.background,
110
+ containerBorder: _core.withOpacity.call(void 0, colorScheme.main, isDark ? 0.7 : 0.55),
111
+ text: textColor,
112
+ copyButtonBackground: _core.withOpacity.call(void 0, colorScheme.main, isDark ? 0.16 : 0.08),
113
+ copyButtonBorder: _core.withOpacity.call(void 0, colorScheme.main, isDark ? 0.48 : 0.32),
114
+ copyButtonText: colorScheme.main
115
+ };
116
+ }, [isDisabled, theme, themeColor, variant]);
117
+ };
118
+ var useCopyButtonPositionStyles = (position) => {
119
+ return _react.useMemo.call(void 0,
120
+ () => ({
121
+ isTop: position.startsWith("top"),
122
+ isLeft: position.endsWith("left")
123
+ }),
124
+ [position]
125
+ );
126
+ };
127
+
128
+ // src/components/snippet/snippet.tsx
129
+ var copyText = async (text) => {
130
+ const runtime = globalThis;
131
+ const writeText = _optionalChain([runtime, 'access', _ => _.navigator, 'optionalAccess', _2 => _2.clipboard, 'optionalAccess', _3 => _3.writeText]);
132
+ if (typeof writeText === "function") {
133
+ await writeText(text);
134
+ return true;
135
+ }
136
+ const modules = _reactnative.NativeModules;
137
+ const setString = _nullishCoalesce(_optionalChain([modules, 'access', _4 => _4.RNCClipboard, 'optionalAccess', _5 => _5.setString]), () => ( _optionalChain([modules, 'access', _6 => _6.Clipboard, 'optionalAccess', _7 => _7.setString])));
138
+ if (typeof setString === "function") {
139
+ setString(text);
140
+ return true;
141
+ }
142
+ return false;
143
+ };
144
+ var Snippet = ({
145
+ value,
146
+ themeColor = "primary",
147
+ variant = "outlined",
148
+ radius = "md",
149
+ copyButtonPosition = "top-right",
150
+ copyLabel = "Copy",
151
+ copiedLabel = "Copied",
152
+ copyResetDelay = 1500,
153
+ fullWidth = true,
154
+ isDisabled = false,
155
+ numberOfLines,
156
+ fontSize = 14,
157
+ fontWeight = "400",
158
+ onCopy,
159
+ customAppearance
160
+ }) => {
161
+ const [isCopied, setIsCopied] = _react2.default.useState(false);
162
+ const resetTimerRef = _react2.default.useRef(null);
163
+ const radiusStyles = _chunkOQ2BLOOGcjs.useBorderRadiusStyles.call(void 0, radius);
164
+ const colors = useSnippetColors(themeColor, variant, isDisabled);
165
+ const { isTop, isLeft } = useCopyButtonPositionStyles(copyButtonPosition);
166
+ _react2.default.useEffect(() => {
167
+ return () => {
168
+ if (resetTimerRef.current) {
169
+ clearTimeout(resetTimerRef.current);
170
+ }
171
+ };
172
+ }, []);
173
+ const handleCopy = _react2.default.useCallback(async () => {
174
+ if (isDisabled) {
175
+ return;
176
+ }
177
+ let isSuccess = false;
178
+ try {
179
+ isSuccess = await copyText(value);
180
+ setIsCopied(isSuccess);
181
+ } catch (e) {
182
+ setIsCopied(false);
183
+ }
184
+ _optionalChain([onCopy, 'optionalCall', _8 => _8(value, isSuccess)]);
185
+ if (!isSuccess) {
186
+ return;
187
+ }
188
+ if (resetTimerRef.current) {
189
+ clearTimeout(resetTimerRef.current);
190
+ }
191
+ resetTimerRef.current = setTimeout(() => {
192
+ setIsCopied(false);
193
+ }, copyResetDelay);
194
+ }, [copyResetDelay, isDisabled, onCopy, value]);
195
+ return /* @__PURE__ */ _react2.default.createElement(
196
+ _reactnative.View,
197
+ {
198
+ style: [
199
+ styles.container,
200
+ !fullWidth && styles.noFullWidth,
201
+ isDisabled && styles.disabled,
202
+ _optionalChain([customAppearance, 'optionalAccess', _9 => _9.container])
203
+ ]
204
+ },
205
+ /* @__PURE__ */ _react2.default.createElement(
206
+ _reactnative.View,
207
+ {
208
+ style: [
209
+ styles.snippet,
210
+ radiusStyles,
211
+ {
212
+ backgroundColor: colors.containerBackground,
213
+ borderColor: colors.containerBorder
214
+ }
215
+ ]
216
+ },
217
+ /* @__PURE__ */ _react2.default.createElement(
218
+ _reactnative.Pressable,
219
+ {
220
+ onPress: handleCopy,
221
+ accessibilityRole: "button",
222
+ accessibilityLabel: isCopied ? copiedLabel : copyLabel,
223
+ disabled: isDisabled,
224
+ style: [
225
+ styles.copyButton,
226
+ radiusStyles,
227
+ isTop ? styles.top : styles.bottom,
228
+ isLeft ? styles.left : styles.right,
229
+ {
230
+ backgroundColor: colors.copyButtonBackground,
231
+ borderColor: colors.copyButtonBorder
232
+ },
233
+ _optionalChain([customAppearance, 'optionalAccess', _10 => _10.copyButton])
234
+ ]
235
+ },
236
+ /* @__PURE__ */ _react2.default.createElement(_icons.CopyIcon, { size: 14, color: colors.copyButtonText }),
237
+ /* @__PURE__ */ _react2.default.createElement(
238
+ _reactnative.Text,
239
+ {
240
+ style: [
241
+ styles.copyButtonText,
242
+ { color: colors.copyButtonText },
243
+ _optionalChain([customAppearance, 'optionalAccess', _11 => _11.copyButtonText])
244
+ ]
245
+ },
246
+ isCopied ? copiedLabel : copyLabel
247
+ )
248
+ ),
249
+ /* @__PURE__ */ _react2.default.createElement(
250
+ _reactnative.View,
251
+ {
252
+ style: [
253
+ styles.content,
254
+ isTop ? styles.topInset : styles.bottomInset,
255
+ _optionalChain([customAppearance, 'optionalAccess', _12 => _12.content])
256
+ ]
257
+ },
258
+ /* @__PURE__ */ _react2.default.createElement(
259
+ _reactnative.Text,
260
+ {
261
+ selectable: true,
262
+ numberOfLines,
263
+ style: [
264
+ styles.text,
265
+ {
266
+ color: colors.text,
267
+ fontSize,
268
+ lineHeight: Math.round(fontSize * 1.45),
269
+ fontWeight
270
+ },
271
+ _optionalChain([customAppearance, 'optionalAccess', _13 => _13.text])
272
+ ]
273
+ },
274
+ value
275
+ )
276
+ )
277
+ )
278
+ );
279
+ };
280
+
281
+
282
+ exports.Snippet = Snippet;
@@ -0,0 +1,90 @@
1
+ import React from 'react';
2
+ import { TextStyle, StyleProp, ViewStyle } from 'react-native';
3
+ import { T as ThemeColor, R as Radius } from '../index-DyU3sW3_.cjs';
4
+
5
+ type SnippetVariant = 'outlined' | 'flat' | 'light';
6
+ type CopyButtonPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
7
+ type SnippetCustomAppearance = {
8
+ container?: StyleProp<ViewStyle>;
9
+ content?: StyleProp<ViewStyle>;
10
+ text?: StyleProp<TextStyle>;
11
+ copyButton?: StyleProp<ViewStyle>;
12
+ copyButtonText?: StyleProp<TextStyle>;
13
+ };
14
+ type SnippetProps = {
15
+ /**
16
+ * Text content displayed in the snippet.
17
+ */
18
+ value: string;
19
+ /**
20
+ * Theme color used for variant styling.
21
+ * @default 'primary'
22
+ */
23
+ themeColor?: ThemeColor;
24
+ /**
25
+ * Visual style variant.
26
+ * @default 'outlined'
27
+ */
28
+ variant?: SnippetVariant;
29
+ /**
30
+ * Snippet border radius.
31
+ * @default 'md'
32
+ */
33
+ radius?: Radius;
34
+ /**
35
+ * Position of the copy button in the snippet container.
36
+ * @default 'top-right'
37
+ */
38
+ copyButtonPosition?: CopyButtonPosition;
39
+ /**
40
+ * Copy button label.
41
+ * @default 'Copy'
42
+ */
43
+ copyLabel?: string;
44
+ /**
45
+ * Label shown after a successful copy action.
46
+ * @default 'Copied'
47
+ */
48
+ copiedLabel?: string;
49
+ /**
50
+ * Delay in milliseconds before reverting copied state.
51
+ * @default 1500
52
+ */
53
+ copyResetDelay?: number;
54
+ /**
55
+ * Whether the snippet should occupy all available width.
56
+ * @default true
57
+ */
58
+ fullWidth?: boolean;
59
+ /**
60
+ * Whether the snippet is disabled.
61
+ * @default false
62
+ */
63
+ isDisabled?: boolean;
64
+ /**
65
+ * Number of lines to clamp the snippet text.
66
+ */
67
+ numberOfLines?: number;
68
+ /**
69
+ * Font size for snippet text.
70
+ * @default 14
71
+ */
72
+ fontSize?: number;
73
+ /**
74
+ * Font weight for snippet text.
75
+ * @default '400'
76
+ */
77
+ fontWeight?: TextStyle['fontWeight'];
78
+ /**
79
+ * Callback fired after copy action.
80
+ */
81
+ onCopy?: (value: string, isSuccess: boolean) => void;
82
+ /**
83
+ * Optional custom styles for snippet parts.
84
+ */
85
+ customAppearance?: SnippetCustomAppearance;
86
+ };
87
+
88
+ declare const Snippet: React.FC<SnippetProps>;
89
+
90
+ export { type CopyButtonPosition, Snippet, type SnippetCustomAppearance, type SnippetProps, type SnippetVariant };
@@ -0,0 +1,90 @@
1
+ import React from 'react';
2
+ import { TextStyle, StyleProp, ViewStyle } from 'react-native';
3
+ import { T as ThemeColor, R as Radius } from '../index-DyU3sW3_.js';
4
+
5
+ type SnippetVariant = 'outlined' | 'flat' | 'light';
6
+ type CopyButtonPosition = 'top-left' | 'top-right' | 'bottom-left' | 'bottom-right';
7
+ type SnippetCustomAppearance = {
8
+ container?: StyleProp<ViewStyle>;
9
+ content?: StyleProp<ViewStyle>;
10
+ text?: StyleProp<TextStyle>;
11
+ copyButton?: StyleProp<ViewStyle>;
12
+ copyButtonText?: StyleProp<TextStyle>;
13
+ };
14
+ type SnippetProps = {
15
+ /**
16
+ * Text content displayed in the snippet.
17
+ */
18
+ value: string;
19
+ /**
20
+ * Theme color used for variant styling.
21
+ * @default 'primary'
22
+ */
23
+ themeColor?: ThemeColor;
24
+ /**
25
+ * Visual style variant.
26
+ * @default 'outlined'
27
+ */
28
+ variant?: SnippetVariant;
29
+ /**
30
+ * Snippet border radius.
31
+ * @default 'md'
32
+ */
33
+ radius?: Radius;
34
+ /**
35
+ * Position of the copy button in the snippet container.
36
+ * @default 'top-right'
37
+ */
38
+ copyButtonPosition?: CopyButtonPosition;
39
+ /**
40
+ * Copy button label.
41
+ * @default 'Copy'
42
+ */
43
+ copyLabel?: string;
44
+ /**
45
+ * Label shown after a successful copy action.
46
+ * @default 'Copied'
47
+ */
48
+ copiedLabel?: string;
49
+ /**
50
+ * Delay in milliseconds before reverting copied state.
51
+ * @default 1500
52
+ */
53
+ copyResetDelay?: number;
54
+ /**
55
+ * Whether the snippet should occupy all available width.
56
+ * @default true
57
+ */
58
+ fullWidth?: boolean;
59
+ /**
60
+ * Whether the snippet is disabled.
61
+ * @default false
62
+ */
63
+ isDisabled?: boolean;
64
+ /**
65
+ * Number of lines to clamp the snippet text.
66
+ */
67
+ numberOfLines?: number;
68
+ /**
69
+ * Font size for snippet text.
70
+ * @default 14
71
+ */
72
+ fontSize?: number;
73
+ /**
74
+ * Font weight for snippet text.
75
+ * @default '400'
76
+ */
77
+ fontWeight?: TextStyle['fontWeight'];
78
+ /**
79
+ * Callback fired after copy action.
80
+ */
81
+ onCopy?: (value: string, isSuccess: boolean) => void;
82
+ /**
83
+ * Optional custom styles for snippet parts.
84
+ */
85
+ customAppearance?: SnippetCustomAppearance;
86
+ };
87
+
88
+ declare const Snippet: React.FC<SnippetProps>;
89
+
90
+ export { type CopyButtonPosition, Snippet, type SnippetCustomAppearance, type SnippetProps, type SnippetVariant };