@wireservers-ui/react-natives 0.1.0 → 1.0.0-rc.0

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 ADDED
@@ -0,0 +1,98 @@
1
+ # @wireservers-ui/react-natives
2
+
3
+ 70+ production-ready React Native components — TypeScript-first, themeable, accessible.
4
+
5
+ Built with [NativeWind](https://www.nativewind.dev/) and [Tailwind Variants](https://www.tailwind-variants.org/).
6
+
7
+ ## Installation
8
+
9
+ ```bash
10
+ npm install @wireservers-ui/react-natives
11
+ ```
12
+
13
+ ### Peer Dependencies
14
+
15
+ Make sure you have the following installed in your project:
16
+
17
+ ```bash
18
+ npm install nativewind tailwind-variants react-native-reanimated react-native-gesture-handler react-native-svg
19
+ ```
20
+
21
+ `react-native-reanimated`, `react-native-gesture-handler`, and `react-native-svg` are optional — only needed if you use components that depend on them.
22
+
23
+ ## Setup
24
+
25
+ Add the preset to your `tailwind.config.js`:
26
+
27
+ ```js
28
+ /** @type {import('tailwindcss').Config} */
29
+ module.exports = {
30
+ content: [
31
+ "./app/**/*.{js,jsx,ts,tsx}",
32
+ // ...your other content paths
33
+ ],
34
+ presets: [require("@wireservers-ui/react-natives/tailwind-preset")],
35
+ };
36
+ ```
37
+
38
+ The preset includes the NativeWind preset, the full color/theme system, and automatic content scanning of the component library — no additional configuration needed.
39
+
40
+ ### Theme Variables
41
+
42
+ Components use CSS variables for theming. Define them in your global CSS to customize colors:
43
+
44
+ ```css
45
+ @tailwind base;
46
+ @tailwind components;
47
+ @tailwind utilities;
48
+
49
+ :root {
50
+ --color-primary-500: 80 70 230;
51
+ --color-background-0: 255 255 255;
52
+ --color-typography-900: 23 23 23;
53
+ /* ... */
54
+ }
55
+
56
+ .dark {
57
+ --color-primary-500: 120 110 255;
58
+ --color-background-0: 24 23 25;
59
+ --color-typography-900: 245 245 245;
60
+ /* ... */
61
+ }
62
+ ```
63
+
64
+ ## Usage
65
+
66
+ ```tsx
67
+ import { Button, ButtonText } from "@wireservers-ui/react-natives";
68
+
69
+ export function MyComponent() {
70
+ return (
71
+ <Button action="primary" variant="solid" size="md">
72
+ <ButtonText>Get Started</ButtonText>
73
+ </Button>
74
+ );
75
+ }
76
+ ```
77
+
78
+ ## Components
79
+
80
+ Includes 70+ components across these categories:
81
+
82
+ **Core** — Text, Heading, Icon, Divider, Badge, Spinner, Image, Avatar, Card, Button, Kbd, Code, Blockquote
83
+
84
+ **Form Controls** — Input, Textarea, Switch, Checkbox, Radio, Slider, Select, FormControl, NumberInput, PasswordInput, SearchInput, Rating, TagsInput, DatePicker, PinInput, ColorPicker
85
+
86
+ **Feedback & Overlay** — Alert, Progress, CircularProgress, Modal, Toast, Tooltip, Drawer, ActionSheet, AlertDialog, Popover, Snackbar, Overlay
87
+
88
+ **Navigation** — Tabs, Accordion, Breadcrumb, Menu, Pagination, Stepper, SegmentedControl, Fab, Link
89
+
90
+ **Data Display** — Tag, Skeleton, Empty, Stat, Table, List, Timeline, Carousel
91
+
92
+ **Layout** — Box, Stack (VStack, HStack), Center, AspectRatio, Container, Pressable, Portal, VisuallyHidden
93
+
94
+ **Interactive** — Toggle, ToggleGroup, Collapsible, Calendar
95
+
96
+ ## License
97
+
98
+ MIT
package/package.json CHANGED
@@ -1,9 +1,13 @@
1
1
  {
2
2
  "name": "@wireservers-ui/react-natives",
3
- "version": "0.1.0",
3
+ "version": "1.0.0-rc.0",
4
4
  "description": "70+ production-ready React Native components — TypeScript-first, themeable, accessible. Created by WireServers-UI.",
5
5
  "main": "src/index.ts",
6
6
  "types": "src/index.ts",
7
+ "exports": {
8
+ ".": "./src/index.ts",
9
+ "./tailwind-preset": "./tailwind-preset.js"
10
+ },
7
11
  "publishConfig": {
8
12
  "access": "public"
9
13
  },
@@ -31,7 +35,7 @@
31
35
  },
32
36
  "files": [
33
37
  "src",
34
- "assets",
38
+ "tailwind-preset.js",
35
39
  "README.md"
36
40
  ],
37
41
  "peerDependencies": {
@@ -0,0 +1,203 @@
1
+ const path = require('path');
2
+
3
+ /** @type {import('tailwindcss').Config} */
4
+ module.exports = {
5
+ darkMode: 'class',
6
+ content: [
7
+ path.join(__dirname, 'src/**/*.{ts,tsx}'),
8
+ ],
9
+ presets: [require('nativewind/preset')],
10
+ safelist: [
11
+ {
12
+ pattern:
13
+ /(bg|border|text|stroke|fill)-(primary|secondary|tertiary|error|success|warning|info|typography|outline|background|indicator)-(0|50|100|200|300|400|500|600|700|800|900|950|white|gray|black|error|warning|muted|success|info|light|dark|primary)/,
14
+ },
15
+ ],
16
+ theme: {
17
+ extend: {
18
+ colors: {
19
+ primary: {
20
+ 0: 'rgb(var(--color-primary-0)/<alpha-value>)',
21
+ 50: 'rgb(var(--color-primary-50)/<alpha-value>)',
22
+ 100: 'rgb(var(--color-primary-100)/<alpha-value>)',
23
+ 200: 'rgb(var(--color-primary-200)/<alpha-value>)',
24
+ 300: 'rgb(var(--color-primary-300)/<alpha-value>)',
25
+ 400: 'rgb(var(--color-primary-400)/<alpha-value>)',
26
+ 500: 'rgb(var(--color-primary-500)/<alpha-value>)',
27
+ 600: 'rgb(var(--color-primary-600)/<alpha-value>)',
28
+ 700: 'rgb(var(--color-primary-700)/<alpha-value>)',
29
+ 800: 'rgb(var(--color-primary-800)/<alpha-value>)',
30
+ 900: 'rgb(var(--color-primary-900)/<alpha-value>)',
31
+ 950: 'rgb(var(--color-primary-950)/<alpha-value>)',
32
+ },
33
+ secondary: {
34
+ 0: 'rgb(var(--color-secondary-0)/<alpha-value>)',
35
+ 50: 'rgb(var(--color-secondary-50)/<alpha-value>)',
36
+ 100: 'rgb(var(--color-secondary-100)/<alpha-value>)',
37
+ 200: 'rgb(var(--color-secondary-200)/<alpha-value>)',
38
+ 300: 'rgb(var(--color-secondary-300)/<alpha-value>)',
39
+ 400: 'rgb(var(--color-secondary-400)/<alpha-value>)',
40
+ 500: 'rgb(var(--color-secondary-500)/<alpha-value>)',
41
+ 600: 'rgb(var(--color-secondary-600)/<alpha-value>)',
42
+ 700: 'rgb(var(--color-secondary-700)/<alpha-value>)',
43
+ 800: 'rgb(var(--color-secondary-800)/<alpha-value>)',
44
+ 900: 'rgb(var(--color-secondary-900)/<alpha-value>)',
45
+ 950: 'rgb(var(--color-secondary-950)/<alpha-value>)',
46
+ },
47
+ tertiary: {
48
+ 50: 'rgb(var(--color-tertiary-50)/<alpha-value>)',
49
+ 100: 'rgb(var(--color-tertiary-100)/<alpha-value>)',
50
+ 200: 'rgb(var(--color-tertiary-200)/<alpha-value>)',
51
+ 300: 'rgb(var(--color-tertiary-300)/<alpha-value>)',
52
+ 400: 'rgb(var(--color-tertiary-400)/<alpha-value>)',
53
+ 500: 'rgb(var(--color-tertiary-500)/<alpha-value>)',
54
+ 600: 'rgb(var(--color-tertiary-600)/<alpha-value>)',
55
+ 700: 'rgb(var(--color-tertiary-700)/<alpha-value>)',
56
+ 800: 'rgb(var(--color-tertiary-800)/<alpha-value>)',
57
+ 900: 'rgb(var(--color-tertiary-900)/<alpha-value>)',
58
+ 950: 'rgb(var(--color-tertiary-950)/<alpha-value>)',
59
+ },
60
+ error: {
61
+ 0: 'rgb(var(--color-error-0)/<alpha-value>)',
62
+ 50: 'rgb(var(--color-error-50)/<alpha-value>)',
63
+ 100: 'rgb(var(--color-error-100)/<alpha-value>)',
64
+ 200: 'rgb(var(--color-error-200)/<alpha-value>)',
65
+ 300: 'rgb(var(--color-error-300)/<alpha-value>)',
66
+ 400: 'rgb(var(--color-error-400)/<alpha-value>)',
67
+ 500: 'rgb(var(--color-error-500)/<alpha-value>)',
68
+ 600: 'rgb(var(--color-error-600)/<alpha-value>)',
69
+ 700: 'rgb(var(--color-error-700)/<alpha-value>)',
70
+ 800: 'rgb(var(--color-error-800)/<alpha-value>)',
71
+ 900: 'rgb(var(--color-error-900)/<alpha-value>)',
72
+ 950: 'rgb(var(--color-error-950)/<alpha-value>)',
73
+ },
74
+ success: {
75
+ 0: 'rgb(var(--color-success-0)/<alpha-value>)',
76
+ 50: 'rgb(var(--color-success-50)/<alpha-value>)',
77
+ 100: 'rgb(var(--color-success-100)/<alpha-value>)',
78
+ 200: 'rgb(var(--color-success-200)/<alpha-value>)',
79
+ 300: 'rgb(var(--color-success-300)/<alpha-value>)',
80
+ 400: 'rgb(var(--color-success-400)/<alpha-value>)',
81
+ 500: 'rgb(var(--color-success-500)/<alpha-value>)',
82
+ 600: 'rgb(var(--color-success-600)/<alpha-value>)',
83
+ 700: 'rgb(var(--color-success-700)/<alpha-value>)',
84
+ 800: 'rgb(var(--color-success-800)/<alpha-value>)',
85
+ 900: 'rgb(var(--color-success-900)/<alpha-value>)',
86
+ 950: 'rgb(var(--color-success-950)/<alpha-value>)',
87
+ },
88
+ warning: {
89
+ 0: 'rgb(var(--color-warning-0)/<alpha-value>)',
90
+ 50: 'rgb(var(--color-warning-50)/<alpha-value>)',
91
+ 100: 'rgb(var(--color-warning-100)/<alpha-value>)',
92
+ 200: 'rgb(var(--color-warning-200)/<alpha-value>)',
93
+ 300: 'rgb(var(--color-warning-300)/<alpha-value>)',
94
+ 400: 'rgb(var(--color-warning-400)/<alpha-value>)',
95
+ 500: 'rgb(var(--color-warning-500)/<alpha-value>)',
96
+ 600: 'rgb(var(--color-warning-600)/<alpha-value>)',
97
+ 700: 'rgb(var(--color-warning-700)/<alpha-value>)',
98
+ 800: 'rgb(var(--color-warning-800)/<alpha-value>)',
99
+ 900: 'rgb(var(--color-warning-900)/<alpha-value>)',
100
+ 950: 'rgb(var(--color-warning-950)/<alpha-value>)',
101
+ },
102
+ info: {
103
+ 0: 'rgb(var(--color-info-0)/<alpha-value>)',
104
+ 50: 'rgb(var(--color-info-50)/<alpha-value>)',
105
+ 100: 'rgb(var(--color-info-100)/<alpha-value>)',
106
+ 200: 'rgb(var(--color-info-200)/<alpha-value>)',
107
+ 300: 'rgb(var(--color-info-300)/<alpha-value>)',
108
+ 400: 'rgb(var(--color-info-400)/<alpha-value>)',
109
+ 500: 'rgb(var(--color-info-500)/<alpha-value>)',
110
+ 600: 'rgb(var(--color-info-600)/<alpha-value>)',
111
+ 700: 'rgb(var(--color-info-700)/<alpha-value>)',
112
+ 800: 'rgb(var(--color-info-800)/<alpha-value>)',
113
+ 900: 'rgb(var(--color-info-900)/<alpha-value>)',
114
+ 950: 'rgb(var(--color-info-950)/<alpha-value>)',
115
+ },
116
+ typography: {
117
+ 0: 'rgb(var(--color-typography-0)/<alpha-value>)',
118
+ 50: 'rgb(var(--color-typography-50)/<alpha-value>)',
119
+ 100: 'rgb(var(--color-typography-100)/<alpha-value>)',
120
+ 200: 'rgb(var(--color-typography-200)/<alpha-value>)',
121
+ 300: 'rgb(var(--color-typography-300)/<alpha-value>)',
122
+ 400: 'rgb(var(--color-typography-400)/<alpha-value>)',
123
+ 500: 'rgb(var(--color-typography-500)/<alpha-value>)',
124
+ 600: 'rgb(var(--color-typography-600)/<alpha-value>)',
125
+ 700: 'rgb(var(--color-typography-700)/<alpha-value>)',
126
+ 800: 'rgb(var(--color-typography-800)/<alpha-value>)',
127
+ 900: 'rgb(var(--color-typography-900)/<alpha-value>)',
128
+ 950: 'rgb(var(--color-typography-950)/<alpha-value>)',
129
+ white: '#FFFFFF',
130
+ gray: '#D4D4D4',
131
+ black: '#181718',
132
+ },
133
+ outline: {
134
+ 0: 'rgb(var(--color-outline-0)/<alpha-value>)',
135
+ 50: 'rgb(var(--color-outline-50)/<alpha-value>)',
136
+ 100: 'rgb(var(--color-outline-100)/<alpha-value>)',
137
+ 200: 'rgb(var(--color-outline-200)/<alpha-value>)',
138
+ 300: 'rgb(var(--color-outline-300)/<alpha-value>)',
139
+ 400: 'rgb(var(--color-outline-400)/<alpha-value>)',
140
+ 500: 'rgb(var(--color-outline-500)/<alpha-value>)',
141
+ 600: 'rgb(var(--color-outline-600)/<alpha-value>)',
142
+ 700: 'rgb(var(--color-outline-700)/<alpha-value>)',
143
+ 800: 'rgb(var(--color-outline-800)/<alpha-value>)',
144
+ 900: 'rgb(var(--color-outline-900)/<alpha-value>)',
145
+ 950: 'rgb(var(--color-outline-950)/<alpha-value>)',
146
+ },
147
+ background: {
148
+ 0: 'rgb(var(--color-background-0)/<alpha-value>)',
149
+ 50: 'rgb(var(--color-background-50)/<alpha-value>)',
150
+ 100: 'rgb(var(--color-background-100)/<alpha-value>)',
151
+ 200: 'rgb(var(--color-background-200)/<alpha-value>)',
152
+ 300: 'rgb(var(--color-background-300)/<alpha-value>)',
153
+ 400: 'rgb(var(--color-background-400)/<alpha-value>)',
154
+ 500: 'rgb(var(--color-background-500)/<alpha-value>)',
155
+ 600: 'rgb(var(--color-background-600)/<alpha-value>)',
156
+ 700: 'rgb(var(--color-background-700)/<alpha-value>)',
157
+ 800: 'rgb(var(--color-background-800)/<alpha-value>)',
158
+ 900: 'rgb(var(--color-background-900)/<alpha-value>)',
159
+ 950: 'rgb(var(--color-background-950)/<alpha-value>)',
160
+ error: 'rgb(var(--color-background-error)/<alpha-value>)',
161
+ warning: 'rgb(var(--color-background-warning)/<alpha-value>)',
162
+ muted: 'rgb(var(--color-background-muted)/<alpha-value>)',
163
+ success: 'rgb(var(--color-background-success)/<alpha-value>)',
164
+ info: 'rgb(var(--color-background-info)/<alpha-value>)',
165
+ light: '#FBFBFB',
166
+ dark: '#181719',
167
+ },
168
+ indicator: {
169
+ primary: 'rgb(var(--color-indicator-primary)/<alpha-value>)',
170
+ info: 'rgb(var(--color-indicator-info)/<alpha-value>)',
171
+ error: 'rgb(var(--color-indicator-error)/<alpha-value>)',
172
+ },
173
+ },
174
+ fontFamily: {
175
+ heading: undefined,
176
+ body: undefined,
177
+ mono: undefined,
178
+ jakarta: ['var(--font-plus-jakarta-sans)'],
179
+ roboto: ['var(--font-roboto)'],
180
+ code: ['var(--font-source-code-pro)'],
181
+ inter: ['var(--font-inter)'],
182
+ 'space-mono': ['var(--font-space-mono)'],
183
+ },
184
+ fontWeight: {
185
+ extrablack: '950',
186
+ },
187
+ fontSize: {
188
+ '2xs': '10px',
189
+ },
190
+ boxShadow: {
191
+ 'hard-1': '-2px 2px 8px 0px rgba(38, 38, 38, 0.20)',
192
+ 'hard-2': '0px 3px 10px 0px rgba(38, 38, 38, 0.20)',
193
+ 'hard-3': '2px 2px 8px 0px rgba(38, 38, 38, 0.20)',
194
+ 'hard-4': '0px -3px 10px 0px rgba(38, 38, 38, 0.20)',
195
+ 'hard-5': '0px 2px 10px 0px rgba(38, 38, 38, 0.10)',
196
+ 'soft-1': '0px 0px 10px rgba(38, 38, 38, 0.1)',
197
+ 'soft-2': '0px 0px 20px rgba(38, 38, 38, 0.2)',
198
+ 'soft-3': '0px 0px 30px rgba(38, 38, 38, 0.1)',
199
+ 'soft-4': '0px 0px 40px rgba(38, 38, 38, 0.1)',
200
+ },
201
+ },
202
+ },
203
+ };
@@ -1,45 +0,0 @@
1
- <svg width="1980" height="600" viewBox="0 60 1980 500" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc">
2
- <title id="title">React-Natives logo</title>
3
- <desc id="desc">High-resolution React-Natives horizontal logo with plus signs, italic wordmark, and tilted mobile-device icon.</desc>
4
- <defs>
5
- <linearGradient id="orbGradient" x1="84" y1="108" x2="434" y2="458" gradientUnits="userSpaceOnUse">
6
- <stop stop-color="#61DBFB"/>
7
- <stop offset="1" stop-color="#2BA8CC"/>
8
- </linearGradient>
9
- <linearGradient id="phoneBody" x1="156" y1="154" x2="344" y2="408" gradientUnits="userSpaceOnUse">
10
- <stop stop-color="#F8FBFF"/>
11
- <stop offset="1" stop-color="#D9E8F5"/>
12
- </linearGradient>
13
- <linearGradient id="phoneScreen" x1="174" y1="184" x2="302" y2="362" gradientUnits="userSpaceOnUse">
14
- <stop stop-color="#F9FCFF"/>
15
- <stop offset="1" stop-color="#E4EDF6"/>
16
- </linearGradient>
17
- </defs>
18
-
19
- <circle cx="250" cy="304" r="224" fill="url(#orbGradient)"/>
20
- <circle cx="250" cy="304" r="224" stroke="#2BA8CC" stroke-width="10"/>
21
- <circle cx="250" cy="304" r="160" fill="none" stroke="#E8F9FE" stroke-width="10"/>
22
-
23
- <path d="M162 120H194" stroke="#E8F9FE" stroke-width="10" stroke-linecap="round"/>
24
- <path d="M178 104V136" stroke="#E8F9FE" stroke-width="10" stroke-linecap="round"/>
25
- <path d="M204 96H230" stroke="#E8F9FE" stroke-width="8" stroke-linecap="round"/>
26
- <path d="M217 83V109" stroke="#E8F9FE" stroke-width="8" stroke-linecap="round"/>
27
- <path d="M130 146H150" stroke="#61DBFB" stroke-width="6" stroke-linecap="round"/>
28
- <path d="M140 136V156" stroke="#61DBFB" stroke-width="6" stroke-linecap="round"/>
29
-
30
- <g transform="rotate(-16 246 324)">
31
- <rect x="154" y="152" width="188" height="282" rx="34" fill="url(#phoneBody)" stroke="#8FA7BA" stroke-width="10"/>
32
- <rect x="176" y="182" width="144" height="206" rx="20" fill="url(#phoneScreen)"/>
33
- <rect x="194" y="208" width="108" height="8" rx="4" fill="#C8D4E0"/>
34
- <rect x="194" y="234" width="96" height="8" rx="4" fill="#C8D4E0"/>
35
- <rect x="194" y="260" width="102" height="8" rx="4" fill="#C8D4E0"/>
36
- <rect x="220" y="166" width="56" height="6" rx="3" fill="#C0D2E1"/>
37
- <circle cx="248" cy="408" r="8" fill="#C0D2E1"/>
38
- <path d="M188 222L304 350" stroke="#ECF3FA" stroke-width="7" stroke-linecap="round"/>
39
- </g>
40
-
41
- <g transform="skewX(-9)">
42
- <text x="620" y="266" fill="#2BA8CC" font-size="132" font-family="Inter, Segoe UI, Roboto, Helvetica, Arial, sans-serif" font-style="italic" font-weight="800" letter-spacing="16">REACT-NATIVES</text>
43
- <text x="620" y="376" fill="#61DBFB" font-size="58" font-family="Inter, Segoe UI, Roboto, Helvetica, Arial, sans-serif" font-style="italic" font-weight="600" letter-spacing="14">WIRED FOR SPEED</text>
44
- </g>
45
- </svg>
@@ -1,42 +0,0 @@
1
- <svg width="1024" height="1024" viewBox="100 100 560 560" fill="none" xmlns="http://www.w3.org/2000/svg" role="img" aria-labelledby="title desc">
2
- <title id="title">React-Natives icon</title>
3
- <desc id="desc">High-resolution React-Natives icon with plus signs and tilted mobile-device symbol.</desc>
4
- <defs>
5
- <linearGradient id="orb" x1="120" y1="120" x2="590" y2="610" gradientUnits="userSpaceOnUse">
6
- <stop stop-color="#61DBFB"/>
7
- <stop offset="1" stop-color="#2BA8CC"/>
8
- </linearGradient>
9
- <linearGradient id="phoneBody" x1="226" y1="208" x2="500" y2="564" gradientUnits="userSpaceOnUse">
10
- <stop stop-color="#F8FBFF"/>
11
- <stop offset="1" stop-color="#D9E8F5"/>
12
- </linearGradient>
13
- <linearGradient id="phoneScreen" x1="254" y1="254" x2="430" y2="500" gradientUnits="userSpaceOnUse">
14
- <stop stop-color="#F9FCFF"/>
15
- <stop offset="1" stop-color="#E4EDF6"/>
16
- </linearGradient>
17
- </defs>
18
-
19
- <g transform="translate(50 0)">
20
- <circle cx="330" cy="378" r="268" fill="url(#orb)"/>
21
- <circle cx="330" cy="378" r="268" stroke="#2BA8CC" stroke-width="12"/>
22
- <circle cx="330" cy="378" r="194" fill="none" stroke="#E8F9FE" stroke-width="10"/>
23
-
24
- <path d="M208 154H248" stroke="#E8F9FE" stroke-width="12" stroke-linecap="round"/>
25
- <path d="M228 134V174" stroke="#E8F9FE" stroke-width="12" stroke-linecap="round"/>
26
- <path d="M262 124H292" stroke="#E8F9FE" stroke-width="10" stroke-linecap="round"/>
27
- <path d="M277 109V139" stroke="#E8F9FE" stroke-width="10" stroke-linecap="round"/>
28
- <path d="M170 186H194" stroke="#61DBFB" stroke-width="8" stroke-linecap="round"/>
29
- <path d="M182 174V198" stroke="#61DBFB" stroke-width="8" stroke-linecap="round"/>
30
-
31
- <g transform="rotate(-17 332 412)">
32
- <rect x="222" y="216" width="232" height="360" rx="42" fill="url(#phoneBody)" stroke="#8FA7BA" stroke-width="12"/>
33
- <rect x="250" y="252" width="176" height="262" rx="26" fill="url(#phoneScreen)"/>
34
- <rect x="272" y="286" width="132" height="10" rx="5" fill="#C8D4E0"/>
35
- <rect x="272" y="320" width="118" height="10" rx="5" fill="#C8D4E0"/>
36
- <rect x="272" y="354" width="126" height="10" rx="5" fill="#C8D4E0"/>
37
- <rect x="306" y="232" width="64" height="8" rx="4" fill="#C0D2E1"/>
38
- <circle cx="338" cy="542" r="10" fill="#C0D2E1"/>
39
- <path d="M266 302L410 464" stroke="#ECF3FA" stroke-width="8" stroke-linecap="round"/>
40
- </g>
41
- </g>
42
- </svg>