@icomponents/react 0.1.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 +40 -0
- package/package.json +165 -0
- package/src/assets/custom/icon-dir.tsx +105 -0
- package/src/assets/custom/icon-layout-compact.tsx +84 -0
- package/src/assets/custom/icon-layout-default.tsx +48 -0
- package/src/assets/custom/icon-layout-full.tsx +68 -0
- package/src/assets/custom/icon-sidebar-floating.tsx +62 -0
- package/src/assets/custom/icon-sidebar-inset.tsx +53 -0
- package/src/assets/custom/icon-sidebar-sidebar.tsx +48 -0
- package/src/assets/custom/icon-theme-dark.tsx +36 -0
- package/src/assets/custom/icon-theme-light.tsx +35 -0
- package/src/assets/custom/icon-theme-system.tsx +113 -0
- package/src/components/admin-page-header.tsx +29 -0
- package/src/components/color-theme-switch.tsx +93 -0
- package/src/components/coming-soon.tsx +16 -0
- package/src/components/command-menu.tsx +98 -0
- package/src/components/config-drawer.tsx +401 -0
- package/src/components/confirm-dialog.dom.test.tsx +60 -0
- package/src/components/confirm-dialog.tsx +75 -0
- package/src/components/data-table/bulk-actions.tsx +193 -0
- package/src/components/data-table/column-header.tsx +66 -0
- package/src/components/data-table/data-table.dom.test.tsx +54 -0
- package/src/components/data-table/data-table.tsx +189 -0
- package/src/components/data-table/faceted-filter.tsx +156 -0
- package/src/components/data-table/index.ts +5 -0
- package/src/components/data-table/pagination.tsx +127 -0
- package/src/components/data-table/tanstack-table.d.ts +12 -0
- package/src/components/data-table/toolbar.tsx +88 -0
- package/src/components/data-table/view-options.tsx +49 -0
- package/src/components/date-picker.tsx +39 -0
- package/src/components/detail-card.tsx +63 -0
- package/src/components/language-switch.tsx +38 -0
- package/src/components/layout/app-sidebar.tsx +59 -0
- package/src/components/layout/app-title.tsx +62 -0
- package/src/components/layout/header.tsx +61 -0
- package/src/components/layout/main.tsx +34 -0
- package/src/components/layout/nav-group.tsx +185 -0
- package/src/components/layout/nav-user.tsx +115 -0
- package/src/components/layout/screen-header.tsx +119 -0
- package/src/components/layout/team-switcher.tsx +84 -0
- package/src/components/layout/top-nav.tsx +68 -0
- package/src/components/layout/types.ts +44 -0
- package/src/components/learn-more.tsx +35 -0
- package/src/components/long-text.tsx +80 -0
- package/src/components/navigation-progress.tsx +18 -0
- package/src/components/password-input.tsx +36 -0
- package/src/components/profile-dropdown.tsx +106 -0
- package/src/components/search.tsx +38 -0
- package/src/components/select-dropdown.tsx +62 -0
- package/src/components/sign-out-dialog.tsx +31 -0
- package/src/components/skip-to-main.tsx +10 -0
- package/src/components/stat-tile.tsx +56 -0
- package/src/components/status-badge.test.ts +23 -0
- package/src/components/status-badge.tsx +49 -0
- package/src/components/theme-switch.tsx +61 -0
- package/src/components/ui/alert-dialog.tsx +134 -0
- package/src/components/ui/alert.tsx +59 -0
- package/src/components/ui/avatar.tsx +38 -0
- package/src/components/ui/badge.tsx +39 -0
- package/src/components/ui/base-ui-state-attrs.dom.test.tsx +80 -0
- package/src/components/ui/button.tsx +51 -0
- package/src/components/ui/calendar.tsx +174 -0
- package/src/components/ui/card.tsx +74 -0
- package/src/components/ui/checkbox.tsx +26 -0
- package/src/components/ui/collapsible.tsx +18 -0
- package/src/components/ui/command.tsx +160 -0
- package/src/components/ui/dialog.tsx +129 -0
- package/src/components/ui/dropdown-menu.tsx +254 -0
- package/src/components/ui/form.tsx +155 -0
- package/src/components/ui/input-otp.tsx +67 -0
- package/src/components/ui/input.tsx +20 -0
- package/src/components/ui/label.tsx +21 -0
- package/src/components/ui/popover.tsx +54 -0
- package/src/components/ui/radio-group.tsx +37 -0
- package/src/components/ui/scroll-area.tsx +57 -0
- package/src/components/ui/select.tsx +213 -0
- package/src/components/ui/separator.tsx +23 -0
- package/src/components/ui/sheet.tsx +128 -0
- package/src/components/ui/sidebar.tsx +702 -0
- package/src/components/ui/skeleton.tsx +13 -0
- package/src/components/ui/sonner.tsx +26 -0
- package/src/components/ui/switch.tsx +25 -0
- package/src/components/ui/table.tsx +89 -0
- package/src/components/ui/tabs.tsx +51 -0
- package/src/components/ui/textarea.tsx +17 -0
- package/src/components/ui/tooltip.tsx +65 -0
- package/src/config/fonts.ts +2 -0
- package/src/context/direction-provider.tsx +61 -0
- package/src/context/font-provider.tsx +70 -0
- package/src/context/language-provider.tsx +73 -0
- package/src/context/layout-provider.tsx +81 -0
- package/src/context/search-provider.tsx +48 -0
- package/src/context/theme-provider.tsx +108 -0
- package/src/hooks/sort-url.test.ts +16 -0
- package/src/hooks/use-dialog-state.tsx +15 -0
- package/src/hooks/use-mobile.tsx +16 -0
- package/src/hooks/use-table-url-state.ts +243 -0
- package/src/i18n/common.ts +164 -0
- package/src/i18n/create-i18n.test.ts +50 -0
- package/src/i18n/create-i18n.ts +67 -0
- package/src/i18n/types.ts +22 -0
- package/src/i18n/use-translation.ts +6 -0
- package/src/lib/clipboard.test.ts +46 -0
- package/src/lib/clipboard.ts +29 -0
- package/src/lib/cookies.ts +39 -0
- package/src/lib/format-cell.test.ts +57 -0
- package/src/lib/format-cell.ts +63 -0
- package/src/lib/handle-server-error.test.ts +85 -0
- package/src/lib/handle-server-error.ts +39 -0
- package/src/lib/random-id.ts +13 -0
- package/src/lib/show-submitted-data.tsx +14 -0
- package/src/lib/utils.test.ts +35 -0
- package/src/lib/utils.ts +78 -0
- package/src/secure-context.contract.test.ts +63 -0
- package/src/testids.contract.test.ts +113 -0
- package/src/testids.ts +8 -0
- package/src/theme-contract.test.ts +72 -0
package/README.md
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
> ⚠️ **Ядро шаблона.** В продукте этот пакет **перезаписывается целиком** (`scripts/sync-core.sh`):
|
|
2
|
+
> локальная правка здесь будет затёрта следующим синком. Расширяй через **швы** (каталог прав, список
|
|
3
|
+
> шрифтов, резолвер), а полезное — портируй в шаблон, чтобы это получили все продукты. Политика и
|
|
4
|
+
> процедура: [`docs/engineering/core-modules.md`](../../docs/engineering/core-modules.md).
|
|
5
|
+
|
|
6
|
+
# @stack/ui
|
|
7
|
+
|
|
8
|
+
The design system: shared shadcn-based primitives plus the admin ("Evoca") theme components and the app shell, consumed by every UI slice and `apps/web`.
|
|
9
|
+
|
|
10
|
+
## What it is / responsibility
|
|
11
|
+
|
|
12
|
+
An infra/presentation package. It holds the shadcn/Radix UI primitives, the higher-level admin components (status pill / detail card / KPI tile) built on semantic theme tokens, the layout shell (sidebar / header / nav), React context providers (theme/font/layout/direction/search), hooks, and low-level utils. No feature domain and no server code — pure client building blocks. Shape: `exports: "./*"` maps directly onto `src/*`, so there is no barrel; each module is imported by its subpath.
|
|
13
|
+
|
|
14
|
+
## Public surface (`package.json` `exports` = `./*` → `src/*`)
|
|
15
|
+
|
|
16
|
+
Imported by path, e.g.:
|
|
17
|
+
|
|
18
|
+
- `@stack/ui/lib/utils` — `cn`, `sleep`, `getPageNumbers`, `getDisplayNameInitials`.
|
|
19
|
+
- `@stack/ui/components/status-badge` — `StatusBadge` + `StatusTone` (semantic tones: success/info/neutral/warning/danger/muted).
|
|
20
|
+
- `@stack/ui/components/detail-card` — `DetailCard`, `DetailRow`.
|
|
21
|
+
- `@stack/ui/components/stat-tile` — `StatTile`.
|
|
22
|
+
- `@stack/ui/components/ui/*` — shadcn primitives (`button`, `dialog`, `table`, `form`, `select`, `sidebar`, `sonner`, …).
|
|
23
|
+
- `@stack/ui/components/layout/*` — `header`, `main`, `app-sidebar`, `nav-*`.
|
|
24
|
+
- `@stack/ui/context/*` — `theme-provider`, `font-provider`, `layout-provider`, `direction-provider`, `search-provider`.
|
|
25
|
+
- `@stack/ui/components/data-table/*`, `@stack/ui/hooks/*`.
|
|
26
|
+
|
|
27
|
+
## Structure (`src/`)
|
|
28
|
+
|
|
29
|
+
- `components/ui/` — shadcn/Radix primitives.
|
|
30
|
+
- `components/` — admin composites (`status-badge`, `detail-card`, `stat-tile`, `data-table/`, `command-menu`, `confirm-dialog`, `password-input`, …).
|
|
31
|
+
- `components/layout/` — the app shell (sidebar/header/nav).
|
|
32
|
+
- `context/`, `hooks/`, `config/fonts`, `assets/custom/` (layout/theme icons), `lib/` (`utils`, `cookies`, `format-cell`, `handle-server-error`).
|
|
33
|
+
|
|
34
|
+
## Depends on
|
|
35
|
+
|
|
36
|
+
`@radix-ui/*`, `class-variance-authority`, `clsx`, `tailwind-merge`, `cmdk`, `lucide-react`, `date-fns`, `sonner`, `react-hook-form`, `input-otp`, `react-day-picker`, `react-top-loading-bar`, `tw-animate-css`; peer: `react`, `react-dom`, `@tanstack/react-router`, `@tanstack/react-table`.
|
|
37
|
+
|
|
38
|
+
## Consumed by / how to use
|
|
39
|
+
|
|
40
|
+
Imported as `@stack/ui/<path>` by every UI-bearing slice (`account`, `audit`, `roles-matrix`, `tenants`, `tenant-users`, `token-inspector`) and by `apps/web`. Tailwind theme tokens (success/warning/destructive/primary/…) are defined by the consuming app; these components only reference them.
|
package/package.json
ADDED
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@icomponents/react",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Кит компонентов для веба: shadcn по форме на Base UI, оболочка, темизация, контракт testid",
|
|
5
|
+
"type": "module",
|
|
6
|
+
"license": "UNLICENSED",
|
|
7
|
+
"publishConfig": {
|
|
8
|
+
"access": "public"
|
|
9
|
+
},
|
|
10
|
+
"files": [
|
|
11
|
+
"src"
|
|
12
|
+
],
|
|
13
|
+
"exports": {
|
|
14
|
+
"./assets/custom/icon-dir": "./src/assets/custom/icon-dir.tsx",
|
|
15
|
+
"./assets/custom/icon-layout-compact": "./src/assets/custom/icon-layout-compact.tsx",
|
|
16
|
+
"./assets/custom/icon-layout-default": "./src/assets/custom/icon-layout-default.tsx",
|
|
17
|
+
"./assets/custom/icon-layout-full": "./src/assets/custom/icon-layout-full.tsx",
|
|
18
|
+
"./assets/custom/icon-sidebar-floating": "./src/assets/custom/icon-sidebar-floating.tsx",
|
|
19
|
+
"./assets/custom/icon-sidebar-inset": "./src/assets/custom/icon-sidebar-inset.tsx",
|
|
20
|
+
"./assets/custom/icon-sidebar-sidebar": "./src/assets/custom/icon-sidebar-sidebar.tsx",
|
|
21
|
+
"./assets/custom/icon-theme-dark": "./src/assets/custom/icon-theme-dark.tsx",
|
|
22
|
+
"./assets/custom/icon-theme-light": "./src/assets/custom/icon-theme-light.tsx",
|
|
23
|
+
"./assets/custom/icon-theme-system": "./src/assets/custom/icon-theme-system.tsx",
|
|
24
|
+
"./components/admin-page-header": "./src/components/admin-page-header.tsx",
|
|
25
|
+
"./components/color-theme-switch": "./src/components/color-theme-switch.tsx",
|
|
26
|
+
"./components/coming-soon": "./src/components/coming-soon.tsx",
|
|
27
|
+
"./components/command-menu": "./src/components/command-menu.tsx",
|
|
28
|
+
"./components/config-drawer": "./src/components/config-drawer.tsx",
|
|
29
|
+
"./components/confirm-dialog": "./src/components/confirm-dialog.tsx",
|
|
30
|
+
"./components/data-table/bulk-actions": "./src/components/data-table/bulk-actions.tsx",
|
|
31
|
+
"./components/data-table/column-header": "./src/components/data-table/column-header.tsx",
|
|
32
|
+
"./components/data-table/data-table": "./src/components/data-table/data-table.tsx",
|
|
33
|
+
"./components/data-table/faceted-filter": "./src/components/data-table/faceted-filter.tsx",
|
|
34
|
+
"./components/data-table/index": "./src/components/data-table/index.ts",
|
|
35
|
+
"./components/data-table/pagination": "./src/components/data-table/pagination.tsx",
|
|
36
|
+
"./components/data-table/tanstack-table.d": "./src/components/data-table/tanstack-table.d.ts",
|
|
37
|
+
"./components/data-table/toolbar": "./src/components/data-table/toolbar.tsx",
|
|
38
|
+
"./components/data-table/view-options": "./src/components/data-table/view-options.tsx",
|
|
39
|
+
"./components/date-picker": "./src/components/date-picker.tsx",
|
|
40
|
+
"./components/detail-card": "./src/components/detail-card.tsx",
|
|
41
|
+
"./components/language-switch": "./src/components/language-switch.tsx",
|
|
42
|
+
"./components/layout/app-sidebar": "./src/components/layout/app-sidebar.tsx",
|
|
43
|
+
"./components/layout/app-title": "./src/components/layout/app-title.tsx",
|
|
44
|
+
"./components/layout/header": "./src/components/layout/header.tsx",
|
|
45
|
+
"./components/layout/main": "./src/components/layout/main.tsx",
|
|
46
|
+
"./components/layout/nav-group": "./src/components/layout/nav-group.tsx",
|
|
47
|
+
"./components/layout/nav-user": "./src/components/layout/nav-user.tsx",
|
|
48
|
+
"./components/layout/screen-header": "./src/components/layout/screen-header.tsx",
|
|
49
|
+
"./components/layout/team-switcher": "./src/components/layout/team-switcher.tsx",
|
|
50
|
+
"./components/layout/top-nav": "./src/components/layout/top-nav.tsx",
|
|
51
|
+
"./components/layout/types": "./src/components/layout/types.ts",
|
|
52
|
+
"./components/learn-more": "./src/components/learn-more.tsx",
|
|
53
|
+
"./components/long-text": "./src/components/long-text.tsx",
|
|
54
|
+
"./components/navigation-progress": "./src/components/navigation-progress.tsx",
|
|
55
|
+
"./components/password-input": "./src/components/password-input.tsx",
|
|
56
|
+
"./components/profile-dropdown": "./src/components/profile-dropdown.tsx",
|
|
57
|
+
"./components/search": "./src/components/search.tsx",
|
|
58
|
+
"./components/select-dropdown": "./src/components/select-dropdown.tsx",
|
|
59
|
+
"./components/sign-out-dialog": "./src/components/sign-out-dialog.tsx",
|
|
60
|
+
"./components/skip-to-main": "./src/components/skip-to-main.tsx",
|
|
61
|
+
"./components/stat-tile": "./src/components/stat-tile.tsx",
|
|
62
|
+
"./components/status-badge": "./src/components/status-badge.tsx",
|
|
63
|
+
"./components/theme-switch": "./src/components/theme-switch.tsx",
|
|
64
|
+
"./components/ui/alert-dialog": "./src/components/ui/alert-dialog.tsx",
|
|
65
|
+
"./components/ui/alert": "./src/components/ui/alert.tsx",
|
|
66
|
+
"./components/ui/avatar": "./src/components/ui/avatar.tsx",
|
|
67
|
+
"./components/ui/badge": "./src/components/ui/badge.tsx",
|
|
68
|
+
"./components/ui/button": "./src/components/ui/button.tsx",
|
|
69
|
+
"./components/ui/calendar": "./src/components/ui/calendar.tsx",
|
|
70
|
+
"./components/ui/card": "./src/components/ui/card.tsx",
|
|
71
|
+
"./components/ui/checkbox": "./src/components/ui/checkbox.tsx",
|
|
72
|
+
"./components/ui/collapsible": "./src/components/ui/collapsible.tsx",
|
|
73
|
+
"./components/ui/command": "./src/components/ui/command.tsx",
|
|
74
|
+
"./components/ui/dialog": "./src/components/ui/dialog.tsx",
|
|
75
|
+
"./components/ui/dropdown-menu": "./src/components/ui/dropdown-menu.tsx",
|
|
76
|
+
"./components/ui/form": "./src/components/ui/form.tsx",
|
|
77
|
+
"./components/ui/input-otp": "./src/components/ui/input-otp.tsx",
|
|
78
|
+
"./components/ui/input": "./src/components/ui/input.tsx",
|
|
79
|
+
"./components/ui/label": "./src/components/ui/label.tsx",
|
|
80
|
+
"./components/ui/popover": "./src/components/ui/popover.tsx",
|
|
81
|
+
"./components/ui/radio-group": "./src/components/ui/radio-group.tsx",
|
|
82
|
+
"./components/ui/scroll-area": "./src/components/ui/scroll-area.tsx",
|
|
83
|
+
"./components/ui/select": "./src/components/ui/select.tsx",
|
|
84
|
+
"./components/ui/separator": "./src/components/ui/separator.tsx",
|
|
85
|
+
"./components/ui/sheet": "./src/components/ui/sheet.tsx",
|
|
86
|
+
"./components/ui/sidebar": "./src/components/ui/sidebar.tsx",
|
|
87
|
+
"./components/ui/skeleton": "./src/components/ui/skeleton.tsx",
|
|
88
|
+
"./components/ui/sonner": "./src/components/ui/sonner.tsx",
|
|
89
|
+
"./components/ui/switch": "./src/components/ui/switch.tsx",
|
|
90
|
+
"./components/ui/table": "./src/components/ui/table.tsx",
|
|
91
|
+
"./components/ui/tabs": "./src/components/ui/tabs.tsx",
|
|
92
|
+
"./components/ui/textarea": "./src/components/ui/textarea.tsx",
|
|
93
|
+
"./components/ui/tooltip": "./src/components/ui/tooltip.tsx",
|
|
94
|
+
"./config/fonts": "./src/config/fonts.ts",
|
|
95
|
+
"./context/direction-provider": "./src/context/direction-provider.tsx",
|
|
96
|
+
"./context/font-provider": "./src/context/font-provider.tsx",
|
|
97
|
+
"./context/language-provider": "./src/context/language-provider.tsx",
|
|
98
|
+
"./context/layout-provider": "./src/context/layout-provider.tsx",
|
|
99
|
+
"./context/search-provider": "./src/context/search-provider.tsx",
|
|
100
|
+
"./context/theme-provider": "./src/context/theme-provider.tsx",
|
|
101
|
+
"./hooks/use-dialog-state": "./src/hooks/use-dialog-state.tsx",
|
|
102
|
+
"./hooks/use-mobile": "./src/hooks/use-mobile.tsx",
|
|
103
|
+
"./hooks/use-table-url-state": "./src/hooks/use-table-url-state.ts",
|
|
104
|
+
"./i18n/common": "./src/i18n/common.ts",
|
|
105
|
+
"./i18n/create-i18n": "./src/i18n/create-i18n.ts",
|
|
106
|
+
"./i18n/types": "./src/i18n/types.ts",
|
|
107
|
+
"./i18n/use-translation": "./src/i18n/use-translation.ts",
|
|
108
|
+
"./lib/clipboard": "./src/lib/clipboard.ts",
|
|
109
|
+
"./lib/cookies": "./src/lib/cookies.ts",
|
|
110
|
+
"./lib/format-cell": "./src/lib/format-cell.ts",
|
|
111
|
+
"./lib/handle-server-error": "./src/lib/handle-server-error.ts",
|
|
112
|
+
"./lib/random-id": "./src/lib/random-id.ts",
|
|
113
|
+
"./lib/show-submitted-data": "./src/lib/show-submitted-data.tsx",
|
|
114
|
+
"./lib/utils": "./src/lib/utils.ts",
|
|
115
|
+
"./testids": "./src/testids.ts",
|
|
116
|
+
"./assets/*": "./src/assets/*"
|
|
117
|
+
},
|
|
118
|
+
"scripts": {
|
|
119
|
+
"type-check": "bunx tsc --noEmit",
|
|
120
|
+
"test": "bun test",
|
|
121
|
+
"prepack": "bun scripts/gen-exports.mjs"
|
|
122
|
+
},
|
|
123
|
+
"dependencies": {
|
|
124
|
+
"@base-ui/react": "^1.6.0",
|
|
125
|
+
"@icomponents/tokens": "workspace:*",
|
|
126
|
+
"@radix-ui/react-icons": "^1.3.2",
|
|
127
|
+
"class-variance-authority": "^0.7.1",
|
|
128
|
+
"clsx": "^2.1.1",
|
|
129
|
+
"cmdk": "^1.1.1",
|
|
130
|
+
"date-fns": "^4.4.0",
|
|
131
|
+
"i18next": "^26.3.6",
|
|
132
|
+
"input-otp": "^1.4.2",
|
|
133
|
+
"lucide-react": "^1.28.0",
|
|
134
|
+
"react-day-picker": "^9.14.0",
|
|
135
|
+
"react-hook-form": "^7.83.0",
|
|
136
|
+
"react-i18next": "^17.0.10",
|
|
137
|
+
"react-top-loading-bar": "^3.0.2",
|
|
138
|
+
"sonner": "^2.0.7",
|
|
139
|
+
"tailwind-merge": "^3.6.0",
|
|
140
|
+
"tw-animate-css": "^1.4.0"
|
|
141
|
+
},
|
|
142
|
+
"peerDependencies": {
|
|
143
|
+
"@tanstack/react-router": ">=1.170.0",
|
|
144
|
+
"@tanstack/react-table": ">=8.21.0",
|
|
145
|
+
"react": ">=19",
|
|
146
|
+
"react-dom": ">=19"
|
|
147
|
+
},
|
|
148
|
+
"devDependencies": {
|
|
149
|
+
"@happy-dom/global-registrator": "^20.10.6",
|
|
150
|
+
"@icomponents/typescript-config": "workspace:*",
|
|
151
|
+
"@tanstack/react-router": "^1.170.18",
|
|
152
|
+
"@tanstack/react-table": "^8.21.3",
|
|
153
|
+
"@testing-library/dom": "^10.4.1",
|
|
154
|
+
"@testing-library/react": "^16.3.2",
|
|
155
|
+
"@testing-library/user-event": "^14.6.1",
|
|
156
|
+
"@types/bun": "latest",
|
|
157
|
+
"@types/node": "latest",
|
|
158
|
+
"@types/react": "^19.2.0",
|
|
159
|
+
"@types/react-dom": "^19.2.0",
|
|
160
|
+
"happy-dom": "^20.10.6",
|
|
161
|
+
"react": "^19.2.7",
|
|
162
|
+
"react-dom": "^19.2.7",
|
|
163
|
+
"typescript": "latest"
|
|
164
|
+
}
|
|
165
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import { type Direction } from "@icomponents/react/context/direction-provider";
|
|
2
|
+
import { cn } from "@icomponents/react/lib/utils";
|
|
3
|
+
import { type SVGProps } from "react";
|
|
4
|
+
|
|
5
|
+
type IconDirProps = SVGProps<SVGSVGElement> & {
|
|
6
|
+
dir: Direction;
|
|
7
|
+
};
|
|
8
|
+
|
|
9
|
+
export function IconDir({ dir, className, ...props }: IconDirProps) {
|
|
10
|
+
return (
|
|
11
|
+
<svg
|
|
12
|
+
data-name={`icon-dir-${dir}`}
|
|
13
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
14
|
+
viewBox="0 0 79.86 51.14"
|
|
15
|
+
className={cn(dir === "rtl" && "rotate-y-180", className)}
|
|
16
|
+
{...props}
|
|
17
|
+
>
|
|
18
|
+
<path
|
|
19
|
+
d="M23.42.51h51.92c2.21 0 4 1.79 4 4v42.18c0 2.21-1.79 4-4 4H23.42s-.04-.02-.04-.04V.55s.02-.04.04-.04z"
|
|
20
|
+
opacity={0.15}
|
|
21
|
+
/>
|
|
22
|
+
<path
|
|
23
|
+
fill="none"
|
|
24
|
+
opacity={0.72}
|
|
25
|
+
strokeLinecap="round"
|
|
26
|
+
strokeMiterlimit={10}
|
|
27
|
+
strokeWidth="2px"
|
|
28
|
+
d="M5.56 14.88L17.78 14.88"
|
|
29
|
+
/>
|
|
30
|
+
<path
|
|
31
|
+
fill="none"
|
|
32
|
+
opacity={0.48}
|
|
33
|
+
strokeLinecap="round"
|
|
34
|
+
strokeMiterlimit={10}
|
|
35
|
+
strokeWidth="2px"
|
|
36
|
+
d="M5.56 22.09L16.08 22.09"
|
|
37
|
+
/>
|
|
38
|
+
<path
|
|
39
|
+
fill="none"
|
|
40
|
+
opacity={0.55}
|
|
41
|
+
strokeLinecap="round"
|
|
42
|
+
strokeMiterlimit={10}
|
|
43
|
+
strokeWidth="2px"
|
|
44
|
+
d="M5.56 18.38L14.93 18.38"
|
|
45
|
+
/>
|
|
46
|
+
<g strokeLinecap="round" strokeMiterlimit={10}>
|
|
47
|
+
<circle cx={7.51} cy={7.4} r={2.54} opacity={0.8} />
|
|
48
|
+
<path fill="none" opacity={0.8} strokeWidth="2px" d="M12.06 6.14L17.78 6.14" />
|
|
49
|
+
<path fill="none" opacity={0.6} d="M11.85 8.79L16.91 8.79" />
|
|
50
|
+
</g>
|
|
51
|
+
<path
|
|
52
|
+
fill="none"
|
|
53
|
+
opacity={0.62}
|
|
54
|
+
strokeLinecap="round"
|
|
55
|
+
strokeMiterlimit={10}
|
|
56
|
+
strokeWidth="3px"
|
|
57
|
+
d="M29.41 7.4L34.67 7.4"
|
|
58
|
+
/>
|
|
59
|
+
<rect
|
|
60
|
+
x={28.76}
|
|
61
|
+
y={11.21}
|
|
62
|
+
width={26.03}
|
|
63
|
+
height={2.73}
|
|
64
|
+
rx={0.64}
|
|
65
|
+
ry={0.64}
|
|
66
|
+
opacity={0.44}
|
|
67
|
+
strokeLinecap="round"
|
|
68
|
+
strokeMiterlimit={10}
|
|
69
|
+
/>
|
|
70
|
+
<rect
|
|
71
|
+
x={28.76}
|
|
72
|
+
y={17.01}
|
|
73
|
+
width={44.25}
|
|
74
|
+
height={13.48}
|
|
75
|
+
rx={0.64}
|
|
76
|
+
ry={0.64}
|
|
77
|
+
opacity={0.3}
|
|
78
|
+
strokeLinecap="round"
|
|
79
|
+
strokeMiterlimit={10}
|
|
80
|
+
/>
|
|
81
|
+
<rect
|
|
82
|
+
x={28.76}
|
|
83
|
+
y={33.57}
|
|
84
|
+
width={44.25}
|
|
85
|
+
height={4.67}
|
|
86
|
+
rx={0.64}
|
|
87
|
+
ry={0.64}
|
|
88
|
+
opacity={0.21}
|
|
89
|
+
strokeLinecap="round"
|
|
90
|
+
strokeMiterlimit={10}
|
|
91
|
+
/>
|
|
92
|
+
<rect
|
|
93
|
+
x={28.76}
|
|
94
|
+
y={41.32}
|
|
95
|
+
width={36.21}
|
|
96
|
+
height={4.67}
|
|
97
|
+
rx={0.64}
|
|
98
|
+
ry={0.64}
|
|
99
|
+
opacity={0.3}
|
|
100
|
+
strokeLinecap="round"
|
|
101
|
+
strokeMiterlimit={10}
|
|
102
|
+
/>
|
|
103
|
+
</svg>
|
|
104
|
+
);
|
|
105
|
+
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { type SVGProps } from "react";
|
|
2
|
+
|
|
3
|
+
export function IconLayoutCompact(props: SVGProps<SVGSVGElement>) {
|
|
4
|
+
return (
|
|
5
|
+
<svg
|
|
6
|
+
data-name="icon-layout-compact"
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
viewBox="0 0 79.86 51.14"
|
|
9
|
+
{...props}
|
|
10
|
+
>
|
|
11
|
+
<rect
|
|
12
|
+
x={5.84}
|
|
13
|
+
y={5.2}
|
|
14
|
+
width={4}
|
|
15
|
+
height={40}
|
|
16
|
+
rx={2}
|
|
17
|
+
ry={2}
|
|
18
|
+
strokeLinecap="round"
|
|
19
|
+
strokeMiterlimit={10}
|
|
20
|
+
/>
|
|
21
|
+
<g stroke="#fff" strokeLinecap="round" strokeMiterlimit={10}>
|
|
22
|
+
<path fill="none" opacity={0.66} strokeWidth="2px" d="M7.26 11.56L8.37 11.56" />
|
|
23
|
+
<path fill="none" opacity={0.51} strokeWidth="2px" d="M7.26 14.49L8.37 14.49" />
|
|
24
|
+
<path fill="none" opacity={0.52} strokeWidth="2px" d="M7.26 17.39L8.37 17.39" />
|
|
25
|
+
<circle cx={7.81} cy={7.25} r={1.16} fill="#fff" opacity={0.8} />
|
|
26
|
+
</g>
|
|
27
|
+
<path
|
|
28
|
+
fill="none"
|
|
29
|
+
opacity={0.75}
|
|
30
|
+
strokeLinecap="round"
|
|
31
|
+
strokeMiterlimit={10}
|
|
32
|
+
strokeWidth="3px"
|
|
33
|
+
d="M15.81 14.49L22.89 14.49"
|
|
34
|
+
/>
|
|
35
|
+
<rect
|
|
36
|
+
x={14.93}
|
|
37
|
+
y={18.39}
|
|
38
|
+
width={22.19}
|
|
39
|
+
height={2.73}
|
|
40
|
+
rx={0.64}
|
|
41
|
+
ry={0.64}
|
|
42
|
+
opacity={0.5}
|
|
43
|
+
strokeLinecap="round"
|
|
44
|
+
strokeMiterlimit={10}
|
|
45
|
+
/>
|
|
46
|
+
<rect
|
|
47
|
+
x={14.93}
|
|
48
|
+
y={5.89}
|
|
49
|
+
width={59.16}
|
|
50
|
+
height={2.73}
|
|
51
|
+
rx={0.64}
|
|
52
|
+
ry={0.64}
|
|
53
|
+
opacity={0.9}
|
|
54
|
+
strokeLinecap="round"
|
|
55
|
+
strokeMiterlimit={10}
|
|
56
|
+
/>
|
|
57
|
+
<rect
|
|
58
|
+
x={14.93}
|
|
59
|
+
y={24.22}
|
|
60
|
+
width={32.68}
|
|
61
|
+
height={19.95}
|
|
62
|
+
rx={2.11}
|
|
63
|
+
ry={2.11}
|
|
64
|
+
opacity={0.4}
|
|
65
|
+
strokeLinecap="round"
|
|
66
|
+
strokeMiterlimit={10}
|
|
67
|
+
/>
|
|
68
|
+
<g strokeLinecap="round" strokeMiterlimit={10}>
|
|
69
|
+
<rect x={59.05} y={38.15} width={2.01} height={3.42} rx={0.33} ry={0.33} opacity={0.32} />
|
|
70
|
+
<rect x={54.78} y={34.99} width={2.01} height={6.58} rx={0.33} ry={0.33} opacity={0.44} />
|
|
71
|
+
<rect x={63.17} y={32.86} width={2.01} height={8.7} rx={0.33} ry={0.33} opacity={0.53} />
|
|
72
|
+
<rect x={67.54} y={29.17} width={2.01} height={12.4} rx={0.33} ry={0.33} opacity={0.66} />
|
|
73
|
+
</g>
|
|
74
|
+
<g opacity={0.5}>
|
|
75
|
+
<circle cx={62.16} cy={18.63} r={7.5} />
|
|
76
|
+
<path d="M62.16 11.63c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.14-7-7 3.14-7 7-7m0-1c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8z" />
|
|
77
|
+
</g>
|
|
78
|
+
<g opacity={0.74}>
|
|
79
|
+
<path d="M63.04 18.13l3.38-5.67c.93.64 1.7 1.48 2.26 2.47.56.98.89 2.08.96 3.21h-6.6z" />
|
|
80
|
+
<path d="M66.57 13.19a6.977 6.977 0 012.52 4.44h-5.17l2.65-4.44m-.31-1.43l-4.1 6.87h8c0-1.39-.36-2.75-1.04-3.95a8.007 8.007 0 00-2.86-2.92z" />
|
|
81
|
+
</g>
|
|
82
|
+
</svg>
|
|
83
|
+
);
|
|
84
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { type SVGProps } from "react";
|
|
2
|
+
|
|
3
|
+
export function IconLayoutDefault(props: SVGProps<SVGSVGElement>) {
|
|
4
|
+
return (
|
|
5
|
+
<svg
|
|
6
|
+
data-name="con-layout-default"
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
viewBox="0 0 79.86 51.14"
|
|
9
|
+
{...props}
|
|
10
|
+
>
|
|
11
|
+
<path
|
|
12
|
+
d="M39.22 15.99h-8.16c-.79 0-1.43-.67-1.43-1.5s.64-1.5 1.43-1.5h8.16c.79 0 1.43.67 1.43 1.5s-.64 1.5-1.43 1.5z"
|
|
13
|
+
opacity={0.75}
|
|
14
|
+
/>
|
|
15
|
+
<rect x={29.63} y={18.39} width={16.72} height={2.73} rx={1.36} ry={1.36} opacity={0.5} />
|
|
16
|
+
<path
|
|
17
|
+
d="M75.1 6.68v1.45c0 .63-.49 1.14-1.09 1.14H30.72c-.6 0-1.09-.51-1.09-1.14V6.68c0-.62.49-1.14 1.09-1.14h43.29c.6 0 1.09.52 1.09 1.14z"
|
|
18
|
+
opacity={0.9}
|
|
19
|
+
/>
|
|
20
|
+
<rect x={29.63} y={24.22} width={21.8} height={19.95} rx={2.11} ry={2.11} opacity={0.4} />
|
|
21
|
+
<g strokeLinecap="round" strokeMiterlimit={10}>
|
|
22
|
+
<rect x={61.06} y={38.15} width={2.01} height={3.42} rx={0.33} ry={0.33} opacity={0.32} />
|
|
23
|
+
<rect x={56.78} y={34.99} width={2.01} height={6.58} rx={0.33} ry={0.33} opacity={0.44} />
|
|
24
|
+
<rect x={65.17} y={32.86} width={2.01} height={8.7} rx={0.33} ry={0.33} opacity={0.53} />
|
|
25
|
+
<rect x={69.55} y={29.17} width={2.01} height={12.4} rx={0.33} ry={0.33} opacity={0.66} />
|
|
26
|
+
</g>
|
|
27
|
+
<g opacity={0.5}>
|
|
28
|
+
<circle cx={63.17} cy={18.63} r={7.5} />
|
|
29
|
+
<path d="M63.17 11.63c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.14-7-7 3.14-7 7-7m0-1c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8z" />
|
|
30
|
+
</g>
|
|
31
|
+
<g opacity={0.74}>
|
|
32
|
+
<path d="M64.05 18.13l3.38-5.67c.93.64 1.7 1.48 2.26 2.47.56.98.89 2.08.96 3.21h-6.6z" />
|
|
33
|
+
<path d="M67.57 13.19a6.977 6.977 0 012.52 4.44h-5.17l2.65-4.44m-.31-1.43l-4.1 6.87h8c0-1.39-.36-2.75-1.04-3.95a8.007 8.007 0 00-2.86-2.92z" />
|
|
34
|
+
</g>
|
|
35
|
+
<g strokeLinecap="round" strokeMiterlimit={10}>
|
|
36
|
+
<rect x={5.84} y={5.02} width={19.14} height={40} rx={2} ry={2} opacity={0.8} />
|
|
37
|
+
<g stroke="#fff">
|
|
38
|
+
<path fill="none" opacity={0.72} strokeWidth="2px" d="M9.02 17.39L21.25 17.39" />
|
|
39
|
+
<path fill="none" opacity={0.48} strokeWidth="2px" d="M9.02 24.6L19.54 24.6" />
|
|
40
|
+
<path fill="none" opacity={0.55} strokeWidth="2px" d="M9.02 20.88L18.4 20.88" />
|
|
41
|
+
<circle cx={10.98} cy={9.91} r={2.54} fill="#fff" opacity={0.8} />
|
|
42
|
+
<path fill="none" opacity={0.8} strokeWidth="2px" d="M15.53 8.65L21.25 8.65" />
|
|
43
|
+
<path fill="none" opacity={0.6} d="M15.32 11.3L20.38 11.3" />
|
|
44
|
+
</g>
|
|
45
|
+
</g>
|
|
46
|
+
</svg>
|
|
47
|
+
);
|
|
48
|
+
}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { type SVGProps } from "react";
|
|
2
|
+
|
|
3
|
+
export function IconLayoutFull(props: SVGProps<SVGSVGElement>) {
|
|
4
|
+
return (
|
|
5
|
+
<svg
|
|
6
|
+
data-name="icon-layout-full"
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
viewBox="0 0 79.86 51.14"
|
|
9
|
+
{...props}
|
|
10
|
+
>
|
|
11
|
+
<path
|
|
12
|
+
fill="none"
|
|
13
|
+
opacity={0.75}
|
|
14
|
+
strokeLinecap="round"
|
|
15
|
+
strokeMiterlimit={10}
|
|
16
|
+
strokeWidth="3px"
|
|
17
|
+
d="M6.85 14.49L15.02 14.49"
|
|
18
|
+
/>
|
|
19
|
+
<rect
|
|
20
|
+
x={5.84}
|
|
21
|
+
y={18.39}
|
|
22
|
+
width={25.6}
|
|
23
|
+
height={2.73}
|
|
24
|
+
rx={0.64}
|
|
25
|
+
ry={0.64}
|
|
26
|
+
opacity={0.5}
|
|
27
|
+
strokeLinecap="round"
|
|
28
|
+
strokeMiterlimit={10}
|
|
29
|
+
/>
|
|
30
|
+
<rect
|
|
31
|
+
x={5.84}
|
|
32
|
+
y={5.89}
|
|
33
|
+
width={68.26}
|
|
34
|
+
height={2.73}
|
|
35
|
+
rx={0.64}
|
|
36
|
+
ry={0.64}
|
|
37
|
+
opacity={0.9}
|
|
38
|
+
strokeLinecap="round"
|
|
39
|
+
strokeMiterlimit={10}
|
|
40
|
+
/>
|
|
41
|
+
<rect
|
|
42
|
+
x={5.84}
|
|
43
|
+
y={24.22}
|
|
44
|
+
width={37.71}
|
|
45
|
+
height={19.95}
|
|
46
|
+
rx={2.11}
|
|
47
|
+
ry={2.11}
|
|
48
|
+
opacity={0.4}
|
|
49
|
+
strokeLinecap="round"
|
|
50
|
+
strokeMiterlimit={10}
|
|
51
|
+
/>
|
|
52
|
+
<g strokeLinecap="round" strokeMiterlimit={10}>
|
|
53
|
+
<rect x={59.05} y={38.15} width={2.01} height={3.42} rx={0.33} ry={0.33} opacity={0.32} />
|
|
54
|
+
<rect x={54.78} y={34.99} width={2.01} height={6.58} rx={0.33} ry={0.33} opacity={0.44} />
|
|
55
|
+
<rect x={63.17} y={32.86} width={2.01} height={8.7} rx={0.33} ry={0.33} opacity={0.53} />
|
|
56
|
+
<rect x={67.54} y={29.17} width={2.01} height={12.4} rx={0.33} ry={0.33} opacity={0.66} />
|
|
57
|
+
</g>
|
|
58
|
+
<g opacity={0.5}>
|
|
59
|
+
<circle cx={62.16} cy={18.63} r={7.5} />
|
|
60
|
+
<path d="M62.16 11.63c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.14-7-7 3.14-7 7-7m0-1c-4.42 0-8 3.58-8 8s3.58 8 8 8 8-3.58 8-8-3.58-8-8-8z" />
|
|
61
|
+
</g>
|
|
62
|
+
<g opacity={0.74}>
|
|
63
|
+
<path d="M63.04 18.13l3.38-5.67c.93.64 1.7 1.48 2.26 2.47.56.98.89 2.08.96 3.21h-6.6z" />
|
|
64
|
+
<path d="M66.57 13.19a6.977 6.977 0 012.52 4.44h-5.17l2.65-4.44m-.31-1.43l-4.1 6.87h8c0-1.39-.36-2.75-1.04-3.95a8.007 8.007 0 00-2.86-2.92z" />
|
|
65
|
+
</g>
|
|
66
|
+
</svg>
|
|
67
|
+
);
|
|
68
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { type SVGProps } from "react";
|
|
2
|
+
|
|
3
|
+
export function IconSidebarFloating(props: SVGProps<SVGSVGElement>) {
|
|
4
|
+
return (
|
|
5
|
+
<svg
|
|
6
|
+
data-name="icon-sidebar-floating"
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
viewBox="0 0 79.86 51.14"
|
|
9
|
+
{...props}
|
|
10
|
+
>
|
|
11
|
+
<rect
|
|
12
|
+
x={5.89}
|
|
13
|
+
y={5.15}
|
|
14
|
+
width={19.74}
|
|
15
|
+
height={40}
|
|
16
|
+
rx={2}
|
|
17
|
+
ry={2}
|
|
18
|
+
opacity={0.8}
|
|
19
|
+
strokeLinecap="round"
|
|
20
|
+
strokeMiterlimit={10}
|
|
21
|
+
/>
|
|
22
|
+
<g stroke="#fff" strokeLinecap="round" strokeMiterlimit={10}>
|
|
23
|
+
<path fill="none" opacity={0.72} strokeWidth="2px" d="M9.81 18.36L22.04 18.36" />
|
|
24
|
+
<path fill="none" opacity={0.48} strokeWidth="2px" d="M9.81 25.57L20.33 25.57" />
|
|
25
|
+
<path fill="none" opacity={0.55} strokeWidth="2px" d="M9.81 21.85L19.18 21.85" />
|
|
26
|
+
<circle cx={11.76} cy={10.88} r={2.54} fill="#fff" opacity={0.8} />
|
|
27
|
+
<path fill="none" opacity={0.8} strokeWidth="2px" d="M16.31 9.62L22.04 9.62" />
|
|
28
|
+
<path fill="none" opacity={0.6} d="M16.1 12.27L21.16 12.27" />
|
|
29
|
+
</g>
|
|
30
|
+
<path
|
|
31
|
+
fill="none"
|
|
32
|
+
opacity={0.62}
|
|
33
|
+
strokeLinecap="round"
|
|
34
|
+
strokeMiterlimit={10}
|
|
35
|
+
strokeWidth="3px"
|
|
36
|
+
d="M30.59 9.62L35.85 9.62"
|
|
37
|
+
/>
|
|
38
|
+
<rect
|
|
39
|
+
x={29.94}
|
|
40
|
+
y={13.42}
|
|
41
|
+
width={26.03}
|
|
42
|
+
height={2.73}
|
|
43
|
+
rx={0.64}
|
|
44
|
+
ry={0.64}
|
|
45
|
+
opacity={0.44}
|
|
46
|
+
strokeLinecap="round"
|
|
47
|
+
strokeMiterlimit={10}
|
|
48
|
+
/>
|
|
49
|
+
<rect
|
|
50
|
+
x={29.94}
|
|
51
|
+
y={19.28}
|
|
52
|
+
width={43.11}
|
|
53
|
+
height={25.87}
|
|
54
|
+
rx={2}
|
|
55
|
+
ry={2}
|
|
56
|
+
opacity={0.3}
|
|
57
|
+
strokeLinecap="round"
|
|
58
|
+
strokeMiterlimit={10}
|
|
59
|
+
/>
|
|
60
|
+
</svg>
|
|
61
|
+
);
|
|
62
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { type SVGProps } from "react";
|
|
2
|
+
|
|
3
|
+
export function IconSidebarInset(props: SVGProps<SVGSVGElement>) {
|
|
4
|
+
return (
|
|
5
|
+
<svg
|
|
6
|
+
data-name="icon-sidebar-inset"
|
|
7
|
+
xmlns="http://www.w3.org/2000/svg"
|
|
8
|
+
viewBox="0 0 79.86 51.14"
|
|
9
|
+
{...props}
|
|
10
|
+
>
|
|
11
|
+
<rect
|
|
12
|
+
x={23.39}
|
|
13
|
+
y={5.57}
|
|
14
|
+
width={50.22}
|
|
15
|
+
height={40}
|
|
16
|
+
rx={2}
|
|
17
|
+
ry={2}
|
|
18
|
+
opacity={0.2}
|
|
19
|
+
strokeLinecap="round"
|
|
20
|
+
strokeMiterlimit={10}
|
|
21
|
+
/>
|
|
22
|
+
<path
|
|
23
|
+
fill="none"
|
|
24
|
+
opacity={0.72}
|
|
25
|
+
strokeLinecap="round"
|
|
26
|
+
strokeMiterlimit={10}
|
|
27
|
+
strokeWidth="2px"
|
|
28
|
+
d="M5.08 17.05L17.31 17.05"
|
|
29
|
+
/>
|
|
30
|
+
<path
|
|
31
|
+
fill="none"
|
|
32
|
+
opacity={0.48}
|
|
33
|
+
strokeLinecap="round"
|
|
34
|
+
strokeMiterlimit={10}
|
|
35
|
+
strokeWidth="2px"
|
|
36
|
+
d="M5.08 24.25L15.6 24.25"
|
|
37
|
+
/>
|
|
38
|
+
<path
|
|
39
|
+
fill="none"
|
|
40
|
+
opacity={0.55}
|
|
41
|
+
strokeLinecap="round"
|
|
42
|
+
strokeMiterlimit={10}
|
|
43
|
+
strokeWidth="2px"
|
|
44
|
+
d="M5.08 20.54L14.46 20.54"
|
|
45
|
+
/>
|
|
46
|
+
<g strokeLinecap="round" strokeMiterlimit={10}>
|
|
47
|
+
<circle cx={7.04} cy={9.57} r={2.54} opacity={0.8} />
|
|
48
|
+
<path fill="none" opacity={0.8} strokeWidth="2px" d="M11.59 8.3L17.31 8.3" />
|
|
49
|
+
<path fill="none" opacity={0.6} d="M11.38 10.95L16.44 10.95" />
|
|
50
|
+
</g>
|
|
51
|
+
</svg>
|
|
52
|
+
);
|
|
53
|
+
}
|