Snippet

The Snippet component is designed to display inline or multiline code snippets or commands, providing an easy way to copy them to the clipboard.

Installation

$ cbui-cli install snippet

Import

index.tsx
1import { Snippet } from '@/crossbuildui/snippet'; 2// Required for copy functionality: 3// import * as Clipboard from 'expo-clipboard'; 4// For default copy/check icons (or custom icons): 5// import Icon from 'react-native-vector-icons/MaterialIcons';

Basic Usage

Provide string children to display a simple snippet. Use the symbol prop to change the leading symbol. The default variant is 'default'. If children is complex ReactNode, use codeString for accurate copying.

index.tsx
1<Snippet>npm install @crossbuildui/snippet</Snippet> 2 3<Snippet symbol="#">yarn add @crossbuildui/snippet</Snippet> 4 5<Snippet variant="glass" glassIntensity={70} glassTint="light" style={{marginTop: 8}}> 6 npm install --save-dev @types/react 7</Snippet> 8 9<Snippet codeString="Just this part is copied" style={{marginTop: 8}}> 10 <Text>Display text can be <Text style={{fontWeight: 'bold'}}>ReactNode</Text></Text> 11</Snippet>

Multiline Snippets

Set multiline= to enable multiline display. You can optionally provide maxLines to limit the visible height and enable scrolling.

index.tsx
1<Snippet multiline maxLines={3}> 2 {`function greet(name) { 3 // This is a multiline snippet 4 // It will scroll if content exceeds maxLines 5 console.log("Hello, " + name + "!"); 6 } 7 greet("World");`} 8</Snippet>

Sizes

Adjust padding, font size, and icon size using the size prop: 'sm', 'md' (default), or 'lg'.

index.tsx
1<Snippet size="sm">Small snippet content</Snippet> 2<Snippet size="md" style={{marginTop: 8}}>Medium snippet (default)</Snippet> 3<Snippet size="lg" style={{marginTop: 8}}>Large snippet content</Snippet>

Radius

Control the border radius of the snippet container with the radius prop.

index.tsx
1<Snippet radius="none">No radius</Snippet> 2<Snippet radius="sm" style={{marginTop: 8}}>Small radius</Snippet> 3<Snippet radius="md" style={{marginTop: 8}}>Medium radius (default)</Snippet> 4<Snippet radius="lg" style={{marginTop: 8}}>Large radius</Snippet>

Symbols

Hide the default symbol with hideSymbol, or provide a custom string or ReactNode to the symbol prop.

index.tsx
1<Snippet hideSymbol>No symbol here</Snippet> 2 3{/* Example using a hypothetical Icon component */} 4{/* <Snippet symbol={<Icon name="code-tags" size={16} />} style={{marginTop: 8}}> 5 Custom icon symbol 6</Snippet> */} 7 8<Snippet symbol="" style={{marginTop: 8}}> 9 Custom string symbol 10</Snippet>

Copy Functionality

Disable copying with disableCopy. Customize the copy and check (copied state) icons using copyIcon and checkIcon. Provide specific text for copying via codeString. Use onCopy for a callback after successful copy.

index.tsx
1<Snippet disableCopy style={{marginBottom: 8}}> 2 Copying is disabled for this snippet. 3</Snippet> 4 5{/* Example using hypothetical Icon components */} 6{/* <Snippet 7 copyIcon={<Icon name="content-paste" size={16} />} 8 checkIcon={<Icon name="check-circle" size={16} color="green" />} 9 style={{marginBottom: 8}} 10> 11 Snippet with custom copy and check icons. 12</Snippet> */} 13 14<Snippet 15 codeString="This specific text will be copied." 16 onCopy={() => alert('Copied custom text!')} 17> 18 The displayed text is different from the copied text. 19</Snippet>

Animations

The copy icon animates to a check icon upon successful copy. Disable this animation with disableAnimation.

index.tsx
1<Snippet disableAnimation> 2 No animation on copy icon change for this snippet. 3</Snippet>

Glass Variant

The glass variant applies a frosted glass effect to the snippet background using expo-blur. Customize it with glassIntensity (0-100) and glassTint ('light', 'dark', 'default'). Text and symbol colors for this variant typically default to the theme's foreground color for better contrast.

index.tsx
1<View style={{gap: 16, padding: 10, backgroundColor: 'rgba(0,0,0,0.1)' /* Example background */}}> 2 <Snippet variant="glass" glassIntensity={80} glassTint="light"> 3 echo "Light Glass Snippet"; 4 </Snippet> 5 <Snippet variant="glass" glassIntensity={50} glassTint="dark" symbol=">" styles={{symbolText: {color: 'white'}, text: {color: 'white'}}}> 6 cd /var/www/dark_glass 7 </Snippet> 8 <Snippet variant="glass" glassIntensity={30} glassTint="default" multiline maxLines={2}> 9 {`# Default tint glass 10 # Adapts to theme mode (light/dark)`} 11 </Snippet> 12</View> 13/* Note: For glass variant, ensure text and symbol colors have sufficient contrast. */

Props Overview

PROPTYPEDEFAULTDESCRIPTION
childrenReactNode | ReactNode[]-Content of the snippet. String children are copied by default.
variant'default' | 'glass''default'Visual style of the snippet.
size'sm' | 'md' | 'lg''md'Visual size (padding, font).
radius'none' | 'sm' | 'md' | 'lg''md'Border radius.
symbolstring | ReactNode'$'Leading symbol.
timeoutnumber2000Duration (ms) for copied state.
codeStringstring-Explicit string to copy, overrides children for copy action.
copyIconReactNode-Custom copy icon.
checkIconReactNode-Custom check (copied) icon.
disableCopybooleanfalseDisable copy button.
hideSymbolbooleanfalseHide the symbol.
disableAnimationbooleanfalseDisable copy state animations.
stylesPartial<SnippetStyleSlots>-Custom styles for component slots.
styleStyleProp<ViewStyle>-Style for the outermost container.
onCopy() => void-Callback on successful copy.
multilinebooleanfalseEnable multiline display.
maxLinesnumber-Max lines for multiline before scrolling.
glassTint'default' | 'light' | 'dark'Theme-derivedTint for the 'glass' variant blur effect.
glassIntensitynumber30Intensity (0-100) for the 'glass' variant blur effect.

Styling

Customize the appearance using:

  • style: Applied to the outermost wrapper View of the component.
  • styles (slot styles): An object to style specific internal parts:
    • base: The main wrapper. Default background and border are theme-dependent (colors.default['100'], colors.default['300']). For glass variant, background becomes transparent.
    • symbolContainer: Container for the symbol.
    • symbolText: Style for the symbol if it's a string. Default color is colors.foreground.
    • contentWrapper: Wrapper for the children content.
    • text: Style for the default Text wrapper around string children. Default color is colors.foreground. Uses monospaced font.
    • copyButton: The copy button Pressable area.
    • scrollableView: The ScrollView style for multiline snippets.
    • scrollContent: The contentContainerStyle for the ScrollView.

The component uses a monospaced font (Menlo for iOS, monospace for Android) for string children and symbols by default. For the glass variant, the background is rendered by BlurView from expo-blur, controlled by glassIntensity and glassTint. The styles.base.backgroundColor will be overridden for this variant. If complex ReactNode is passed as children, you are responsible for its styling, including font family.

index.tsx
1<Snippet 2 style={{ marginVertical: 10, borderColor: 'purple', borderWidth: 2 }} // Styles the outermost wrapper 3 styles={{ 4 base: { backgroundColor: 'lightyellow' }, // Overrides default background/border, applied to wrapper 5 symbolContainer: { paddingRight: 12 }, 6 symbolText: { color: 'orange', fontWeight: 'bold' }, 7 contentWrapper: { flexShrink: 1 }, // Allow content to shrink if needed 8 text: { color: 'darkblue', fontStyle: 'italic' }, // Styles the Text wrapper for string children 9 copyButton: { padding: 6, backgroundColor: 'rgba(0,0,0,0.1)' }, 10 scrollableView: { maxHeight: 80 } // For multiline with maxLines 11 }} 12 symbol=">" 13 multiline 14> 15 This is a styled snippet. 16 It demonstrates custom styles for various slots. 17 The text color and symbol are customized. 18</Snippet>

Accessibility

The Snippet component includes accessibility features:

  • The copy button has accessibilityRole="button".
  • The copy button has an accessibilityLabel of "Copy code" or "Copied" depending on its state.
  • Content provided as strings is rendered within Text components, making it accessible to screen readers.