Skip to content

Commit eb146b1

Browse files
Merge remote-tracking branch 'origin/staging' into improvement/table-row-deletes
Migration renumbered 0231 -> 0232 (staging took 0231) and reworked for the new CI-driven migration runner: - expand/contract: the import_* column drops are removed — the previous app version still reads them while migrations apply from CI; a later release drops them (data migration gains ON CONFLICT DO NOTHING and the whole file is replay-idempotent per the runner convention) - user_table_rows indexes (keyset btree + tenant-scoped GIN) build via COMMIT + CREATE INDEX CONCURRENTLY so the write-hot shared relation is never write-blocked; old GIN dropped CONCURRENTLY after the new one Also unions the rows-route imports with staging's row-wire translators and re-baselines the route count (811 staging + 2 export routes). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2 parents c4b2891 + bc55fc3 commit eb146b1

967 files changed

Lines changed: 47958 additions & 23416 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.agents/skills/add-block/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ export const {ServiceName}Block: BlockConfig = {
4141
name: '{Service Name}', // Human readable
4242
description: 'Brief description', // One sentence
4343
longDescription: 'Detailed description for docs',
44-
docsLink: 'https://docs.sim.ai/tools/{service}',
44+
docsLink: 'https://docs.sim.ai/integrations/{service}',
4545
category: 'tools', // 'tools' | 'blocks' | 'triggers'
4646
integrationType: IntegrationType.X, // Primary category (see IntegrationType enum)
4747
tags: ['oauth', 'api'], // Cross-cutting tags (see IntegrationTag type)
@@ -732,7 +732,7 @@ export const ServiceBlock: BlockConfig = {
732732
name: 'Service',
733733
description: 'Integrate with Service API',
734734
longDescription: 'Full description for documentation...',
735-
docsLink: 'https://docs.sim.ai/tools/service',
735+
docsLink: 'https://docs.sim.ai/integrations/service',
736736
category: 'tools',
737737
integrationType: IntegrationType.DeveloperTools,
738738
tags: ['oauth', 'api'],

.agents/skills/add-integration/SKILL.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ export const {Service}Block: BlockConfig = {
137137
name: '{Service}',
138138
description: '...',
139139
longDescription: '...',
140-
docsLink: 'https://docs.sim.ai/tools/{service}',
140+
docsLink: 'https://docs.sim.ai/integrations/{service}',
141141
category: 'tools',
142142
bgColor: '#HEXCOLOR',
143143
icon: {Service}Icon,
@@ -425,7 +425,7 @@ Run the documentation generator:
425425
bun run scripts/generate-docs.ts
426426
```
427427

428-
This creates `apps/docs/content/docs/en/tools/{service}.mdx`
428+
This creates `apps/docs/content/docs/en/integrations/{service}.mdx` — one page per service carrying the block's Actions and, if it has one, its Triggers section. Never hand-edit generated pages; the only editable region is the `{/* MANUAL-CONTENT */}` block (see `scripts/README.md`).
429429

430430
## V2 Integration Pattern
431431

.agents/skills/validate-integration/SKILL.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -200,7 +200,7 @@ For **each tool** in `tools.access`:
200200
- [ ] `name` is human-readable (e.g., `'X'`, `'Cloudflare'`)
201201
- [ ] `description` is a concise one-liner
202202
- [ ] `longDescription` provides detail for docs
203-
- [ ] `docsLink` points to `'https://docs.sim.ai/tools/{service}'`
203+
- [ ] `docsLink` points to `'https://docs.sim.ai/integrations/{service}'`
204204
- [ ] `category` is `'tools'`
205205
- [ ] `bgColor` uses the service's brand color hex
206206
- [ ] `icon` references the correct icon component from `@/components/icons`

.github/workflows/ci.yml

Lines changed: 25 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -46,10 +46,33 @@ jobs:
4646
echo "ℹ️ Not a release commit"
4747
fi
4848
49+
# Run database migrations before images are pushed: the ECR push triggers
50+
# CodePipeline, so migrating first guarantees the schema is in place before
51+
# the new app version deploys (replaces the removed ECS migration sidecar)
52+
migrate:
53+
name: Migrate DB
54+
needs: [test-build]
55+
if: >-
56+
github.event_name == 'push' &&
57+
(github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging')
58+
uses: ./.github/workflows/migrations.yml
59+
with:
60+
environment: ${{ github.ref == 'refs/heads/main' && 'production' || 'staging' }}
61+
secrets: inherit
62+
63+
# Same ordering for dev (schema push before the dev image lands in ECR)
64+
migrate-dev:
65+
name: Migrate Dev DB
66+
if: github.event_name == 'push' && github.ref == 'refs/heads/dev'
67+
uses: ./.github/workflows/migrations.yml
68+
with:
69+
environment: dev
70+
secrets: inherit
71+
4972
# Dev: build all 3 images for ECR only (no GHCR, no ARM64)
5073
build-dev:
5174
name: Build Dev ECR
52-
needs: [detect-version]
75+
needs: [detect-version, migrate-dev]
5376
if: github.event_name == 'push' && github.ref == 'refs/heads/dev'
5477
runs-on: blacksmith-8vcpu-ubuntu-2404
5578
permissions:
@@ -108,7 +131,7 @@ jobs:
108131
# Main/staging: build AMD64 images and push to ECR + GHCR
109132
build-amd64:
110133
name: Build AMD64
111-
needs: [test-build, detect-version]
134+
needs: [test-build, detect-version, migrate]
112135
if: >-
113136
github.event_name == 'push' &&
114137
(github.ref == 'refs/heads/main' || github.ref == 'refs/heads/staging')
@@ -318,14 +341,6 @@ jobs:
318341
docker manifest push "${IMAGE_BASE}:${VERSION}"
319342
fi
320343
321-
# Run database migrations for dev
322-
migrate-dev:
323-
name: Migrate Dev DB
324-
needs: [build-dev]
325-
if: github.event_name == 'push' && github.ref == 'refs/heads/dev'
326-
uses: ./.github/workflows/migrations.yml
327-
secrets: inherit
328-
329344
# Check if docs changed
330345
check-docs-changes:
331346
name: Check Docs Changes

.github/workflows/migrations.yml

Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,21 @@ name: Database Migrations
22

33
on:
44
workflow_call:
5+
inputs:
6+
environment:
7+
description: Target environment (production, staging, or dev)
8+
required: true
9+
type: string
510
workflow_dispatch:
11+
inputs:
12+
environment:
13+
description: Target environment
14+
required: true
15+
type: choice
16+
options:
17+
- production
18+
- staging
19+
- dev
620

721
permissions:
822
contents: read
@@ -35,15 +49,28 @@ jobs:
3549
- name: Install dependencies
3650
run: bun install --frozen-lockfile
3751

52+
# The expression maps the explicit environment input to exactly one repo
53+
# secret, so the job never holds another environment's database URL. An
54+
# unknown environment resolves to empty and the guard below fails the job.
55+
# MIGRATION_DATABASE_URL is the optional direct (non-pooled) DSN preferred
56+
# by migrate.ts; when the secret is unset it resolves to empty and the
57+
# script falls back to DATABASE_URL.
3858
- name: Apply database schema changes
3959
working-directory: ./packages/db
4060
env:
41-
DATABASE_URL: ${{ github.ref == 'refs/heads/main' && secrets.DATABASE_URL || github.ref == 'refs/heads/dev' && secrets.DEV_DATABASE_URL || secrets.STAGING_DATABASE_URL }}
61+
DATABASE_URL: ${{ inputs.environment == 'production' && secrets.DATABASE_URL || inputs.environment == 'staging' && secrets.STAGING_DATABASE_URL || inputs.environment == 'dev' && secrets.DEV_DATABASE_URL || '' }}
62+
MIGRATION_DATABASE_URL: ${{ inputs.environment == 'production' && secrets.MIGRATION_DATABASE_URL || inputs.environment == 'staging' && secrets.STAGING_MIGRATION_DATABASE_URL || '' }}
63+
ENVIRONMENT: ${{ inputs.environment }}
4264
run: |
43-
if [ "${{ github.ref }}" = "refs/heads/dev" ]; then
44-
echo "Dev environment detected — pushing schema with drizzle-kit (db:push)"
65+
if [ -z "$DATABASE_URL" ]; then
66+
echo "ERROR: no database URL secret resolved for environment '${ENVIRONMENT}'" >&2
67+
exit 1
68+
fi
69+
70+
if [ "${ENVIRONMENT}" = "dev" ]; then
71+
echo "Dev environment — pushing schema directly (db:push)"
4572
bun run db:push --force
4673
else
4774
echo "Applying versioned migrations (db:migrate)"
4875
bun run ./scripts/migrate.ts
49-
fi
76+
fi

apps/docs/.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,4 +36,5 @@ bun-debug.log*
3636
next-env.d.ts
3737

3838
# Fumadocs
39-
/.source/
39+
/.source/
40+
.plans/

apps/docs/app/[lang]/[[...slug]]/page.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@ import type { ApiPageProps } from 'fumadocs-openapi/ui'
55
import { createAPIPage } from 'fumadocs-openapi/ui'
66
import { Pre } from 'fumadocs-ui/components/codeblock'
77
import defaultMdxComponents from 'fumadocs-ui/mdx'
8-
import { DocsBody, DocsDescription, DocsPage, DocsTitle } from 'fumadocs-ui/page'
8+
import { DocsBody, DocsPage, DocsTitle } from 'fumadocs-ui/page'
99
import { notFound } from 'next/navigation'
1010
import { PageFooter } from '@/components/docs-layout/page-footer'
1111
import { PageNavigationArrows } from '@/components/docs-layout/page-navigation-arrows'
1212
import { LLMCopyButton } from '@/components/page-actions'
13+
import { PageTypeBadge } from '@/components/page-type-badge'
1314
import { StructuredData } from '@/components/structured-data'
1415
import { CodeBlock } from '@/components/ui/code-block'
1516
import { Heading } from '@/components/ui/heading'
@@ -173,7 +174,6 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
173174
<PageNavigationArrows previous={neighbours?.previous} next={neighbours?.next} />
174175
</div>
175176
<DocsTitle className='mb-2'>{data.title}</DocsTitle>
176-
<DocsDescription>{data.description}</DocsDescription>
177177
</div>
178178
<DocsBody>
179179
<APIPage {...apiProps} />
@@ -222,8 +222,8 @@ export default async function Page(props: { params: Promise<{ slug?: string[]; l
222222
</div>
223223
<PageNavigationArrows previous={neighbours?.previous} next={neighbours?.next} />
224224
</div>
225+
{data.pageType && <PageTypeBadge type={data.pageType} className='mb-3' />}
225226
<DocsTitle className='mb-2'>{data.title}</DocsTitle>
226-
<DocsDescription>{data.description}</DocsDescription>
227227
</div>
228228
<DocsBody>
229229
<MDX

apps/docs/app/global.css

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1850,6 +1850,83 @@ html.dark main article blockquote {
18501850
box-shadow: none !important;
18511851
}
18521852

1853+
/* Workflow-preview theme scope. Values mirror the app's tokens in
1854+
apps/sim/app/_styles/globals.css (light from :root/.light, dark from .dark)
1855+
so the docs previews match the OG repository in both modes. */
1856+
.wp-scope {
1857+
/* surfaces */
1858+
--wp-canvas: #fefefe; /* --bg */
1859+
--wp-panel: #fbfbfb; /* --surface-1 */
1860+
--wp-surface: #ffffff; /* --surface-2 */
1861+
--wp-header: #f7f7f7; /* --surface-3 */
1862+
--wp-btn: #f5f5f5; /* --surface-4 */
1863+
--wp-control: #f3f3f3; /* --surface-5 */
1864+
--wp-active: #ececec; /* --surface-active */
1865+
--wp-container-fill: rgba(0, 0, 0, 0.02);
1866+
1867+
/* borders */
1868+
--wp-border: #dedede; /* --border */
1869+
--wp-border-1: #e0e0e0; /* --border-1 */
1870+
--wp-chip-bg: #f3f3f3; /* --surface-5: ChipTag surface (light) */
1871+
--wp-chip-text: #3b3b3b; /* --text-body */
1872+
--wp-divider: #ededed; /* --divider */
1873+
--wp-edge: #e0e0e0; /* --workflow-edge */
1874+
1875+
/* text */
1876+
--wp-text: #1a1a1a; /* --text-primary */
1877+
--wp-text-2: #525252; /* --text-secondary */
1878+
--wp-text-3: #5c5c5c; /* --text-tertiary */
1879+
--wp-text-muted: #707070; /* --text-muted */
1880+
--wp-text-subtle: #8c8c8c; /* --text-subtle */
1881+
1882+
/* type badges (output inspector) */
1883+
--wp-badge-success-bg: #bbf7d0;
1884+
--wp-badge-success-text: #15803d;
1885+
--wp-badge-blue-bg: #bfdbfe;
1886+
--wp-badge-blue-text: #1d4ed8;
1887+
--wp-badge-orange-bg: #fed7aa;
1888+
--wp-badge-orange-text: #c2410c;
1889+
--wp-badge-purple-bg: #e9d5ff;
1890+
--wp-badge-purple-text: #7c3aed;
1891+
--wp-badge-gray-bg: #e7e5e4;
1892+
--wp-badge-gray-text: #57534e;
1893+
}
1894+
1895+
.dark .wp-scope {
1896+
--wp-canvas: #1b1b1b;
1897+
--wp-panel: #1e1e1e;
1898+
--wp-surface: #232323;
1899+
--wp-header: #242424;
1900+
--wp-btn: #292929;
1901+
--wp-control: #363636;
1902+
--wp-active: #2c2c2c;
1903+
--wp-container-fill: rgba(255, 255, 255, 0.02);
1904+
1905+
--wp-border: #333333;
1906+
--wp-border-1: #3d3d3d;
1907+
--wp-chip-bg: #292929; /* --surface-4: ChipTag surface (dark) */
1908+
--wp-chip-text: #cdcdcd; /* --text-body */
1909+
--wp-divider: #393939;
1910+
--wp-edge: #454545;
1911+
1912+
--wp-text: #e6e6e6;
1913+
--wp-text-2: #cccccc;
1914+
--wp-text-3: #b3b3b3;
1915+
--wp-text-muted: #787878;
1916+
--wp-text-subtle: #7d7d7d;
1917+
1918+
--wp-badge-success-bg: rgba(34, 197, 94, 0.2);
1919+
--wp-badge-success-text: #86efac;
1920+
--wp-badge-blue-bg: rgba(59, 130, 246, 0.2);
1921+
--wp-badge-blue-text: #93c5fd;
1922+
--wp-badge-orange-bg: rgba(249, 115, 22, 0.2);
1923+
--wp-badge-orange-text: #fdba74;
1924+
--wp-badge-purple-bg: rgba(168, 85, 247, 0.2);
1925+
--wp-badge-purple-text: #d8b4fe;
1926+
--wp-badge-gray-bg: #3a3a3a;
1927+
--wp-badge-gray-text: #a8a8a8;
1928+
}
1929+
18531930
/* Tailwind v4 content sources */
18541931
@source '../app/**/*.{js,ts,jsx,tsx,mdx}';
18551932
@source '../components/**/*.{js,ts,jsx,tsx,mdx}';

apps/docs/components/icons.tsx

Lines changed: 52 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2492,7 +2492,7 @@ export function LinkupIcon(props: SVGProps<SVGSVGElement>) {
24922492
<svg {...props} xmlns='http://www.w3.org/2000/svg' viewBox='0 0 154 107' fill='none'>
24932493
<path
24942494
d='M150.68 72.71C146.61 70.25 137.91 69.54 124.79 70.61C128.99 57.68 133.76 35.39 121.32 25.15C115.89 20.67 107.47 19.04 97.62 20.56C94.68 21.01 91.58 21.74 88.39 22.73C78.87 8.28 66.3 0 53.86 0C39.43 0 26.13 9.34 16.41 26.29C5.68 45.01 0 71.96 0 104.23V104.53L3.6 106.94L3.88 106.83C30.58 95.56 67.58 85.07 100.59 79.4C101.6 87.64 102.12 95.99 102.12 104.24V104.52L105.49 107L105.76 106.91C106.26 106.75 155.16 90.88 153.98 77.59C153.86 76.2 153.18 74.23 150.68 72.71ZM148.41 78.09C148.72 81.54 133.24 91.06 111.84 98.89C115.97 92.1 119.82 84.17 122.78 76.36C135.66 75.14 144.53 75.55 147.79 77.53C148.38 77.88 148.41 78.09 148.41 78.09ZM116.67 77.01C114.08 83.38 110.95 89.63 107.54 95.25C107.33 89.51 106.91 83.88 106.3 78.46C109.92 77.9 113.41 77.41 116.67 77.01ZM117.77 29.5C125.38 35.76 125.78 51.32 118.87 71.18C114.75 71.63 110.28 72.24 105.6 72.98C103.05 55.17 98.28 39.97 91.42 27.75C94.57 26.82 96.97 26.35 98.46 26.11C106.72 24.84 113.58 26.04 117.77 29.5ZM53.86 5.62C65.06 5.62 74.89 12 83.09 24.59C57.7 34.54 30.32 59.41 5.78 94.8C7.43 51.48 23.03 5.62 53.86 5.62M10.19 98.24C40.75 53.93 68.2 36.44 86.07 29.59C92.45 41.24 97.2 56.55 99.84 73.93C70.52 79.03 35.64 88.5 10.19 98.24Z'
2495-
fill='currentColor'
2495+
fill='#000000'
24962496
/>
24972497
</svg>
24982498
)
@@ -4967,7 +4967,7 @@ export function InfisicalIcon(props: SVGProps<SVGSVGElement>) {
49674967
<svg {...props} viewBox='20 25 233 132' xmlns='http://www.w3.org/2000/svg'>
49684968
<path
49694969
d='m191.6 39.4c-20.3 0-37.15 13.21-52.9 30.61-12.99-16.4-29.8-30.61-51.06-30.61-27.74 0-50.44 23.86-50.44 51.33 0 26.68 21.43 51.8 48.98 51.8 20.55 0 37.07-13.86 51.32-31.81 12.69 16.97 29.1 31.41 53.2 31.41 27.13 0 49.85-22.96 49.85-51.4 0-27.12-20.44-51.33-48.95-51.33zm-104.3 77.94c-14.56 0-25.51-12.84-25.51-26.07 0-13.7 10.95-28.29 25.51-28.29 14.93 0 25.71 11.6 37.6 27.34-11.31 15.21-22.23 27.02-37.6 27.02zm104.4 0.25c-15 0-25.28-11.13-37.97-27.37 12.69-16.4 22.01-27.24 37.59-27.24 14.97 0 24.79 13.25 24.79 27.26 0 13-10.17 27.35-24.41 27.35z'
4970-
fill='currentColor'
4970+
fill='#000000'
49714971
/>
49724972
</svg>
49734973
)
@@ -5512,6 +5512,33 @@ export function CloudWatchIcon(props: SVGProps<SVGSVGElement>) {
55125512
)
55135513
}
55145514

5515+
export function CodePipelineIcon(props: SVGProps<SVGSVGElement>) {
5516+
return (
5517+
<svg
5518+
{...props}
5519+
viewBox='5 5 70.002 70.002'
5520+
version='1.1'
5521+
xmlns='http://www.w3.org/2000/svg'
5522+
xmlnsXlink='http://www.w3.org/1999/xlink'
5523+
>
5524+
<g
5525+
id='Icon-Architecture/64/Arch_AWS-CodePipeline_64'
5526+
stroke='none'
5527+
strokeWidth='1'
5528+
fill='none'
5529+
fillRule='evenodd'
5530+
transform='translate(40, 40) scale(1.25) translate(-40, -40)'
5531+
>
5532+
<path
5533+
d='M30,31 L35,31 L35,29 L30,29 L30,31 Z M36.667,61.166 L34.817,60.407 L42.409,41.885 L44.259,42.644 L36.667,61.166 Z M45.571,55.78 L51.068,50.958 L45.575,46.197 L46.886,44.685 L53.245,50.198 C53.463,50.387 53.589,50.662 53.590006,50.951 C53.591,51.24 53.467,51.515 53.249,51.706 L46.89,57.284 L45.571,55.78 Z M25.508976,51.048 C25.507,50.759 25.63,50.484 25.847,50.293 L32.184,44.691 L33.508,46.19 L28.029,51.033 L33.478,55.73 L32.171,57.245 L25.855,51.799 C25.637,51.611 25.511,51.337 25.508976,51.048 L25.508976,51.048 Z M62.535,35 L18.465,35 C16.555,35 15,33.446 15,31.536 L15,31 L27,31 L27,29 L15,29 L15,18.464 C15,16.554 16.555,15 18.465,15 L62.535,15 C64.445,15 66,16.554 66,18.464 L66,29 L38,29 L38,31 L66,31 L66,31.536 C66,33.446 64.445,35 62.535,35 L62.535,35 Z M22,66 L58,66 L58,37 L22,37 L22,66 Z M62.535,13 L18.465,13 C15.451,13 13,15.451 13,18.464 L13,31.536 C13,34.549 15.451,37 18.465,37 L20,37 L20,67 C20,67.552 20.447,68 21,68 L59,68 C59.553,68 60,67.552 60,67 L60,37 L62.535,37 C65.549,37 68,34.549 68,31.536 L68,18.464 C68,15.451 65.549,13 62.535,13 L62.535,13 Z'
5534+
id='AWS-CodePipeline_Icon_64_Squid'
5535+
fill='currentColor'
5536+
/>
5537+
</g>
5538+
</svg>
5539+
)
5540+
}
5541+
55155542
export function TextractIcon(props: SVGProps<SVGSVGElement>) {
55165543
return (
55175544
<svg
@@ -6823,6 +6850,29 @@ export function SixtyfourIcon(props: SVGProps<SVGSVGElement>) {
68236850
)
68246851
}
68256852

6853+
export function SimTriggerIcon(props: SVGProps<SVGSVGElement>) {
6854+
return (
6855+
<svg
6856+
{...props}
6857+
viewBox='0 0 222 222'
6858+
fill='none'
6859+
xmlns='http://www.w3.org/2000/svg'
6860+
aria-hidden='true'
6861+
>
6862+
<path
6863+
fillRule='evenodd'
6864+
clipRule='evenodd'
6865+
d='M107.822 93.76C107.822 97.35 106.403 100.792 103.884 103.328L103.523 103.692C101.006 106.236 97.59 107.658 94.02 107.658H13.45C6.02 107.658 0 113.718 0 121.191V208.332C0 215.806 6.02 221.866 13.45 221.866H99.96C107.383 221.866 113.4 215.806 113.4 208.332V126.745C113.4 123.419 114.71 120.228 117.047 117.874C119.377 115.527 122.546 114.207 125.849 114.207H207.777C215.198 114.207 221.214 108.148 221.214 100.674V13.53C221.214 6.06 215.198 0 207.777 0H121.26C113.839 0 107.822 6.06 107.822 13.53V93.76ZM134.078 18.55H194.952C199.289 18.55 202.796 22.09 202.796 26.45V87.76C202.796 92.12 199.289 95.66 194.952 95.66H134.078C129.748 95.66 126.233 92.12 126.233 87.76V26.45C126.233 22.09 129.748 18.55 134.078 18.55Z'
6866+
fill='currentColor'
6867+
/>
6868+
<path
6869+
d='M207.878 129.57H143.554C135.756 129.57 129.434 135.937 129.434 143.791V207.784C129.434 215.638 135.756 222.005 143.554 222.005H207.878C215.677 222.005 221.999 215.638 221.999 207.784V143.791C221.999 135.937 215.677 129.57 207.878 129.57Z'
6870+
fill='currentColor'
6871+
/>
6872+
</svg>
6873+
)
6874+
}
6875+
68266876
export function SimilarwebIcon(props: SVGProps<SVGSVGElement>) {
68276877
return (
68286878
<svg

0 commit comments

Comments
 (0)