diff --git a/.gitignore b/.gitignore index aff81c8ae..9e361e498 100644 --- a/.gitignore +++ b/.gitignore @@ -10,6 +10,12 @@ # dependencies /node_modules +# yarn berry cache (not tracked at repo root) +/.yarn/cache +/.yarn/install-state.gz +/.yarn/unplugged +/.yarn/build-state.yml + # profiling files chrome-profiler-events*.json speed-measure-plugin*.json diff --git a/frontend/src/app/app.component.html b/frontend/src/app/app.component.html index 16b2ee830..ac08be930 100644 --- a/frontend/src/app/app.component.html +++ b/frontend/src/app/app.component.html @@ -195,6 +195,11 @@ Zapier + help Help center diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts index 8d08e92af..9186d692a 100644 --- a/frontend/src/app/app.component.ts +++ b/frontend/src/app/app.component.ts @@ -302,6 +302,7 @@ export class AppComponent { user_hash: res.intercom_hash, user_id: res.id, email: res.email, + hide_default_launcher: true, }); if (this.isDemo) @@ -343,6 +344,12 @@ export class AppComponent { this.isFeatureNotificationShown = false; } + openSupportChat() { + if (typeof window.Intercom !== 'undefined') { + window.Intercom('show'); + } + } + setUserLoggedIn(state) { this.userLoggedIn = state; this.changeDetector.detectChanges(); diff --git a/frontend/src/app/components/connections-list/connections-list.component.css b/frontend/src/app/components/connections-list/connections-list.component.css index fc3527475..bd0d88cfd 100644 --- a/frontend/src/app/components/connections-list/connections-list.component.css +++ b/frontend/src/app/components/connections-list/connections-list.component.css @@ -56,6 +56,13 @@ margin-bottom: 0; } +@media (width <= 600px) { + .pageTitleHeader .pageTitle__name { + font-size: 20px !important; + line-height: 1.2 !important; + } +} + .companyEditLink { position: absolute; top: 50%; diff --git a/frontend/src/app/components/connections-list/demo-connections/demo-connections.component.css b/frontend/src/app/components/connections-list/demo-connections/demo-connections.component.css index 2cb93121e..b794ba21b 100644 --- a/frontend/src/app/components/connections-list/demo-connections/demo-connections.component.css +++ b/frontend/src/app/components/connections-list/demo-connections/demo-connections.component.css @@ -4,6 +4,14 @@ width: 100%; } +@media (width <= 600px) { + :host h1.mat-display-1 { + font-size: 22px !important; + line-height: 1.2 !important; + margin-bottom: 20px; + } +} + .section__label { display: block; font-size: 11px; @@ -17,11 +25,18 @@ .demoGrid { list-style: none; display: grid; - grid-template-columns: repeat(3, 1fr); + grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 12px; width: 100%; padding: 0; margin: 0; + align-items: stretch; +} + +@media (601px <= width <= 1024px) { + .demoGrid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } } @media (width <= 600px) { @@ -36,6 +51,7 @@ gap: 12px; border-radius: 8px; padding: 12px 16px; + height: 100%; text-decoration: none; color: inherit; transition: box-shadow 200ms, background 200ms, border 200ms; @@ -102,6 +118,12 @@ min-width: 0; } +.demoCard__info strong { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + .demoCard__type { font-size: 12px; margin-top: -2px; diff --git a/frontend/src/app/components/connections-list/own-connections/own-connections.component.css b/frontend/src/app/components/connections-list/own-connections/own-connections.component.css index 2638a5434..96ff85183 100644 --- a/frontend/src/app/components/connections-list/own-connections/own-connections.component.css +++ b/frontend/src/app/components/connections-list/own-connections/own-connections.component.css @@ -5,6 +5,16 @@ width: 100%; } +/* ── Page heading: shrink on mobile to match company name ── */ + +@media (width <= 600px) { + :host h1.mat-display-1 { + font-size: 22px !important; + line-height: 1.2 !important; + margin-bottom: 20px; + } +} + /* ── Section labels ── */ .section { @@ -124,30 +134,50 @@ white-space: nowrap; } +.hosted-banner__chevron { + display: none; + flex-shrink: 0; + color: var(--color-accentedPalette-700); +} + @media (width <= 600px) { .hosted-banner { - flex-direction: column; - align-items: flex-start; - padding: 16px; - gap: 12px; + align-items: center; + padding: 10px 14px; + gap: 10px; } .hosted-banner__iconBox { - width: 36px; - height: 36px; + width: 30px; + height: 30px; + } + + .hosted-banner__icon { + width: 18px !important; + height: 18px !important; + font-size: 18px !important; + line-height: 18px !important; } .hosted-banner__title { - font-size: 14px; + font-size: 13px; + line-height: 1.2; } .hosted-banner__subtitle { - font-size: 12px; + font-size: 11.5px; + line-height: 1.25; } .hosted-banner__badge { - align-self: flex-start; - font-size: 11px; + display: none; + } + + .hosted-banner__chevron { + display: block; + font-size: 20px; + width: 20px; + height: 20px; } } @@ -167,6 +197,8 @@ @media (width <= 600px) { .dbGrid { width: 100%; + grid-template-columns: 1fr; + grid-gap: 8px; } } @@ -191,6 +223,16 @@ 0px 0px 2px 0px rgba(0, 0, 0, 0.14); } +@media (width <= 600px) { + .dbCard { + flex-direction: row; + justify-content: flex-start; + gap: 12px; + padding: 10px 14px; + min-height: 54px; + } +} + .dbCard:hover { box-shadow: 0px 1px 5px 0px rgba(0, 0, 0, 0.2), @@ -251,6 +293,19 @@ margin-top: -2px; } +@media (width <= 600px) { + .dbCard__label { + text-align: left; + line-height: 1.2; + flex: 1; + min-width: 0; + } + + .dbCard__subLabel { + margin-top: 2px; + } +} + /* ── Existing connections list ── */ .connections { @@ -333,6 +388,33 @@ width: 100%; } +/* ── Compact mobile layout (keep desktop dark banner, just shorter) ── */ + +@media (width <= 600px) { + .connections { + grid-template-columns: 1fr; + gap: 8px; + } + + .connection { + padding: 8px; + } + + .connectionLogoPreview { + height: 56px; + padding: 6px 10px; + gap: 10px; + } + + .connectionInfo .connectionInfo__connectionTitle { + font-size: 14px !important; + } + + .connectionLogoPreview .mat-body-2 { + font-size: 11px; + } +} + /* ── Schema button inside card ── */ .connectionSchemaButton { @@ -369,7 +451,12 @@ 0px 4px 5px 0px rgba(0, 0, 0, 0.12), 0px 2px 4px 0px rgba(0, 0, 0, 0.14); height: 48px !important; - width: 178px; + min-width: 178px; + padding: 0 14px 0 16px !important; +} + +.fabAddButton .mat-icon[iconPositionEnd] { + margin-left: 4px; } .fabHostedButton { @@ -397,6 +484,128 @@ } } +/* ── Add-connection menu styling (panelClass="addConnectionMenu") ── */ + +::ng-deep .addConnectionMenu.mat-mdc-menu-panel { + min-width: 320px !important; + max-width: 360px !important; + border-radius: 14px !important; + box-shadow: + 0 12px 28px rgba(0, 0, 0, 0.16), + 0 4px 8px rgba(0, 0, 0, 0.08); + padding: 6px !important; + margin-bottom: 20px !important; +} + +::ng-deep .addConnectionMenu .mat-mdc-menu-content { + padding: 0 !important; +} + +::ng-deep .addConnectionMenu .mat-mdc-menu-item { + padding: 0 !important; + min-height: auto !important; + border-radius: 10px; + margin: 2px 0; +} + +::ng-deep .addConnectionMenu .mat-mdc-menu-item:hover { + background-color: rgba(0, 0, 0, 0.04); +} + +::ng-deep .addConnectionMenu .mat-mdc-menu-item .mat-mdc-menu-item-text { + width: 100%; +} + +.addConnectionItem { + display: flex; + align-items: center; + gap: 10px; + width: 100%; + padding: 10px 12px 10px 0; + line-height: 1; +} + +.addConnectionItem mat-icon { + margin: 0 !important; +} + +.addConnectionItem__iconBox { + flex-shrink: 0; + width: 32px; + height: 32px; + border-radius: 8px; + display: inline-flex; + align-items: center; + justify-content: center; + line-height: 1; +} + +.addConnectionItem__iconBox mat-icon { + font-size: 18px !important; + width: 18px !important; + height: 18px !important; + line-height: 18px !important; + display: inline-flex; + align-items: center; + justify-content: center; +} + +.addConnectionItem__iconBox--primary { + background-color: color-mix(in srgb, var(--color-accentedPalette-500) 14%, transparent); + color: var(--color-accentedPalette-500); +} + +.addConnectionItem__iconBox--accent { + background-color: color-mix(in srgb, var(--color-alternativePalette-500) 14%, transparent); + color: var(--color-alternativePalette-500); +} + +.addConnectionItem__iconBox--warn { + background-color: color-mix(in srgb, var(--color-warningPalette-500) 16%, transparent); + color: var(--color-warningPalette-500); +} + +.addConnectionItem__text { + flex: 1; + display: flex; + flex-direction: column; + gap: 2px; + min-width: 0; +} + +.addConnectionItem__title { + font-size: 14px; + font-weight: 600; + color: rgba(0, 0, 0, 0.88); + line-height: 1.2; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; +} + +.addConnectionItem__subtitle { + font-size: 12px; + color: rgba(0, 0, 0, 0.55); + line-height: 1.3; + white-space: normal; + overflow: hidden; + text-overflow: ellipsis; +} + +@media (prefers-color-scheme: dark) { + ::ng-deep .addConnectionMenu .mat-mdc-menu-item:hover { + background-color: rgba(255, 255, 255, 0.06); + } + + .addConnectionItem__title { + color: rgba(255, 255, 255, 0.92); + } + + .addConnectionItem__subtitle { + color: rgba(255, 255, 255, 0.6); + } +} + /* ── Empty state bottom ── */ .empty-state_bottom { diff --git a/frontend/src/app/components/connections-list/own-connections/own-connections.component.html b/frontend/src/app/components/connections-list/own-connections/own-connections.component.html index e446491f0..01e890895 100644 --- a/frontend/src/app/components/connections-list/own-connections/own-connections.component.html +++ b/frontend/src/app/components/connections-list/own-connections/own-connections.component.html @@ -3,7 +3,7 @@ @if (isDemo) {

Create your own test connection

} @else if (currentUser?.role === 'ADMIN' || currentUser?.role === 'DB_ADMIN') { -

Create your first connection

+

Add your first connection

} } @@ -66,6 +66,7 @@

{{ $any(connectionItem).displayTitle You've reached the limit of 3 hosted databases ✦ Upgrade + chevron_right } @else { } @@ -118,39 +120,65 @@

{{ $any(connectionItem).displayTitle @if (connections?.length) {
- @if (showHostedDatabaseEntry) { - @if (hostedDbLimitReached) { - - cloud_queue - Upgrade to host more - - } @else { + @if (currentUser?.role === 'ADMIN' || currentUser?.role === 'DB_ADMIN') { + @if (showHostedDatabaseEntry) { + + +
+
+ cable +
+
+ Connect your own + MySQL, PostgreSQL, MongoDB and more +
+
+
+ @if (hostedDbLimitReached) { + +
+
+ upgrade +
+
+ Upgrade to host more + You've reached the limit of 3 hosted databases +
+
+
+ } +
+ } @else { + + add + Add connection + } } - @if (currentUser?.role === 'ADMIN' || currentUser?.role === 'DB_ADMIN') { - - add - Add database - - }
} diff --git a/frontend/src/app/components/connections-list/own-connections/own-connections.component.ts b/frontend/src/app/components/connections-list/own-connections/own-connections.component.ts index 93ed11313..3da7dfb17 100644 --- a/frontend/src/app/components/connections-list/own-connections/own-connections.component.ts +++ b/frontend/src/app/components/connections-list/own-connections/own-connections.component.ts @@ -3,6 +3,7 @@ import { Component, Input, OnChanges, OnInit, SimpleChanges, signal } from '@ang import { MatButtonModule } from '@angular/material/button'; import { MatDialog } from '@angular/material/dialog'; import { MatIconModule } from '@angular/material/icon'; +import { MatMenuModule } from '@angular/material/menu'; import { MatTooltipModule } from '@angular/material/tooltip'; import { Router, RouterModule } from '@angular/router'; import posthog from 'posthog-js'; @@ -34,7 +35,7 @@ import { @Component({ selector: 'app-own-connections', - imports: [CommonModule, RouterModule, MatIconModule, MatButtonModule, MatTooltipModule], + imports: [CommonModule, RouterModule, MatIconModule, MatButtonModule, MatMenuModule, MatTooltipModule], templateUrl: './own-connections.component.html', styleUrl: './own-connections.component.css', })