diff --git a/web/package-lock.json b/web/package-lock.json index 72e79e219..67d6eedf3 100644 --- a/web/package-lock.json +++ b/web/package-lock.json @@ -1,12 +1,12 @@ { "name": "startos-ui", - "version": "0.3.5.1", + "version": "0.3.5.2", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "startos-ui", - "version": "0.3.5.1", + "version": "0.3.5.2", "dependencies": { "@angular/animations": "^17.3.1", "@angular/cdk": "^17.3.1", @@ -1988,6 +1988,7 @@ "devDependencies": { "@iarna/toml": "^2.2.5", "@types/jest": "^29.4.0", + "copyfiles": "^2.4.1", "jest": "^29.4.3", "prettier": "^3.2.5", "ts-jest": "^29.0.5", diff --git a/web/projects/marketplace/package.json b/web/projects/marketplace/package.json index 7c628694b..a9202baab 100644 --- a/web/projects/marketplace/package.json +++ b/web/projects/marketplace/package.json @@ -1,6 +1,6 @@ { "name": "@start9labs/marketplace", - "version": "0.3.19", + "version": "0.3.25", "peerDependencies": { "@angular/common": ">=13.2.0", "@angular/core": ">=13.2.0", diff --git a/web/projects/marketplace/src/components/menu/menu.component.html b/web/projects/marketplace/src/components/menu/menu.component.html index 47468205d..efc98bcbe 100644 --- a/web/projects/marketplace/src/components/menu/menu.component.html +++ b/web/projects/marketplace/src/components/menu/menu.component.html @@ -4,7 +4,7 @@ @@ -27,13 +27,14 @@ type="button" appearance="flat" [pseudoActive]="false" + [pseudoHover]="false" (click)="toggleMenu(true)" (tuiActiveZoneChange)="toggleMenu($event)" - [style.--tui-padding]="'1rem'" + [style.--tui-padding]="'1.2rem'" > - - - - Launch your project - +
+ + + + + Package a service + + +
@@ -95,17 +101,22 @@ [category]="query ? '' : category" (categoryChange)="onCategoryChange($event)" > - - - - Launch your project - +
+ + + + + Package a service + + +
diff --git a/web/projects/marketplace/src/components/menu/menu.component.scss b/web/projects/marketplace/src/components/menu/menu.component.scss index 9a013c478..c7280021c 100644 --- a/web/projects/marketplace/src/components/menu/menu.component.scss +++ b/web/projects/marketplace/src/components/menu/menu.component.scss @@ -14,12 +14,12 @@ header { flex-direction: column; z-index: 10; - @media screen and (min-width: 640px) { - width: 15rem; + @media screen and (min-width: 768px) { + width: 17rem; background-color: rgb(var(--tw-color-zinc-700) / 0.9); backdrop-filter: blur(40px); min-height: calc(100vh - var(--portal-header-height)); - padding: 1.5rem 0; + padding: 2rem 0 1.5rem 0; &::after { display: block; @@ -36,12 +36,16 @@ header { ); } } + + @media screen and (min-width: 1536px) { + width: 18rem; + } } .title { display: none; - @media (min-width: 640px) { + @media (min-width: 768px) { display: flex; flex-direction: column; align-items: center; @@ -74,9 +78,10 @@ header { marketplace-search { place-self: center; padding-bottom: 2rem; + width: 100%; } - @media (min-width: 640px) { + @media (min-width: 768px) { display: flex; flex-grow: 1; flex-direction: column; @@ -88,27 +93,17 @@ header { flex-direction: column; justify-content: space-between; - a { + ::ng-deep a { display: flex; + justify-content: center; gap: 0.5rem; padding: 0.5rem; - z-index: 50; - border-top-left-radius: 0.5rem; - border-bottom-left-radius: 0.5rem; - transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); - transition-delay: 75ms; - transition-duration: 300ms; &:hover { text-decoration-line: none; cursor: pointer; } - img { - opacity: 0.7; - filter: invert(100%); - } - span { font-size: 1rem; line-height: 1.5rem; @@ -117,31 +112,23 @@ header { overflow: hidden; white-space: nowrap; } - @media (min-width: 640px) { - width: 120%; - - &:hover { - background-color: rgb(34 36 40); - } - } } } } &-mobile { - @media (min-width: 640px) { + @media (min-width: 768px) { display: none; } &-bar { display: flex; - justify-content: space-between; align-items: center; padding: 1rem; width: 100vw; marketplace-search { - max-width: fit-content; + flex-grow: 1; } } @@ -184,9 +171,8 @@ header { padding: 1.25rem 1.25rem 0px 1.25rem; } - a { + ::ng-deep a { display: flex; - position: relative; gap: 0.5rem; padding: 1.25rem; @@ -194,11 +180,6 @@ header { text-decoration-line: none; } - img { - opacity: 0.7; - filter: invert(100%); - } - span { font-size: 1rem; line-height: 1.5rem; diff --git a/web/projects/marketplace/src/components/store-icon/store-icon.component.module.ts b/web/projects/marketplace/src/components/store-icon/store-icon.component.module.ts index e9d24c022..c11896fe8 100644 --- a/web/projects/marketplace/src/components/store-icon/store-icon.component.module.ts +++ b/web/projects/marketplace/src/components/store-icon/store-icon.component.module.ts @@ -1,11 +1,10 @@ import { NgModule } from '@angular/core' import { CommonModule } from '@angular/common' -import { TuiIconModule } from '@taiga-ui/experimental' import { StoreIconComponent } from './store-icon.component' @NgModule({ declarations: [StoreIconComponent], - imports: [CommonModule, TuiIconModule], + imports: [CommonModule], exports: [StoreIconComponent], }) export class StoreIconComponentModule {} diff --git a/web/projects/marketplace/src/components/store-icon/store-icon.component.ts b/web/projects/marketplace/src/components/store-icon/store-icon.component.ts index 97e0088ea..0fef3489e 100644 --- a/web/projects/marketplace/src/components/store-icon/store-icon.component.ts +++ b/web/projects/marketplace/src/components/store-icon/store-icon.component.ts @@ -9,10 +9,14 @@ import { MarketplaceConfig, sameUrl } from '@start9labs/shared' [style.border-radius.%]="100" [style.max-width]="size || '100%'" [src]="icon" - alt="Service Icon" + alt="Marketplace Icon" /> - + Marketplace Icon `, changeDetection: ChangeDetectionStrategy.OnPush, diff --git a/web/projects/marketplace/src/pages/list/categories/categories.component.html b/web/projects/marketplace/src/pages/list/categories/categories.component.html index b50152e8f..f1ee2c5f5 100644 --- a/web/projects/marketplace/src/pages/list/categories/categories.component.html +++ b/web/projects/marketplace/src/pages/list/categories/categories.component.html @@ -19,7 +19,7 @@ {{ cat === 'ai' ? (cat | uppercase) - : (cat | titlecase) || 'loading category...' + : (cat | titlecase) || 'Loading category...' }} diff --git a/web/projects/marketplace/src/pages/list/categories/categories.component.scss b/web/projects/marketplace/src/pages/list/categories/categories.component.scss index 57b9b6e61..a52dfb59c 100644 --- a/web/projects/marketplace/src/pages/list/categories/categories.component.scss +++ b/web/projects/marketplace/src/pages/list/categories/categories.component.scss @@ -2,7 +2,7 @@ font-weight: bold; } -@media (min-width: 600px) { +@media (min-width: 768px) { .category_selected { border-top-left-radius: 0.5rem; border-bottom-left-radius: 0.5rem; @@ -20,7 +20,7 @@ button { transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); transition-delay: 75ms; transition-duration: 300ms; - margin-bottom: 1.25rem; + margin-bottom: 2rem; z-index: 50; &:hover { diff --git a/web/projects/marketplace/src/pages/list/item/item.component.scss b/web/projects/marketplace/src/pages/list/item/item.component.scss index 2276a8acc..445bef2c9 100644 --- a/web/projects/marketplace/src/pages/list/item/item.component.scss +++ b/web/projects/marketplace/src/pages/list/item/item.component.scss @@ -32,7 +32,7 @@ width: 150%; height: 150%; max-width: 200%; - filter: blur(100px); + filter: blur(100px) saturate(85%); } } @@ -45,7 +45,7 @@ left: 0px; border-radius: 1.5rem; background-color: rgb(39 39 42); - opacity: 0.4; + opacity: 0.6; } .icon { @@ -56,7 +56,6 @@ top: -2.5rem; border-radius: 9999px; object-fit: cover; - z-index: 10; backdrop-filter: blur(24px); background-color: rgb(0 0 0 / 0.5); transform: none; @@ -67,11 +66,10 @@ mix-blend-mode: plus-lighter; &-title { - display: block; font-size: 1.5rem; line-height: 2rem; margin-bottom: 0.25rem; - font-weight: 500; + font-weight: 400; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; @@ -79,9 +77,9 @@ } &-description { - display: block; font-size: 1rem; line-height: 1.5rem; + font-weight: 300; height: 3rem; overflow: hidden; display: -webkit-box; diff --git a/web/projects/marketplace/src/pages/list/search/search.component.ts b/web/projects/marketplace/src/pages/list/search/search.component.ts index 26dfd3998..11a749c3a 100644 --- a/web/projects/marketplace/src/pages/list/search/search.component.ts +++ b/web/projects/marketplace/src/pages/list/search/search.component.ts @@ -6,6 +6,7 @@ import { Input, Output, } from '@angular/core' +import { Router } from '@angular/router' import { THEME } from '@start9labs/shared' @Component({ @@ -20,11 +21,12 @@ export class SearchComponent { @Output() readonly queryChange = new EventEmitter() - + private readonly router = inject(Router) readonly theme$ = inject(THEME) onModelChange(query: string) { this.query = query this.queryChange.emit(query) + this.router.navigate(['../']) } } diff --git a/web/projects/marketplace/src/pages/release-notes/release-notes.component.html b/web/projects/marketplace/src/pages/release-notes/release-notes.component.html index be9537114..8a10daeb2 100644 --- a/web/projects/marketplace/src/pages/release-notes/release-notes.component.html +++ b/web/projects/marketplace/src/pages/release-notes/release-notes.component.html @@ -1,18 +1,9 @@
-
-

What's new

-

- Latest Release -  -  - - {{ published | date: 'medium' }} - -

-
+

What's new

-

Version {{ pkg.manifest.version }}

+

Version {{ pkg.manifest.version }}

- - - +
diff --git a/web/projects/marketplace/src/pages/show/additional/additional.component.scss b/web/projects/marketplace/src/pages/show/additional/additional.component.scss index d4607d6e1..0a8c0e199 100644 --- a/web/projects/marketplace/src/pages/show/additional/additional.component.scss +++ b/web/projects/marketplace/src/pages/show/additional/additional.component.scss @@ -13,33 +13,26 @@ border-bottom-width: 0px; border-color: rgb(113 113 122); } - - &-item { - display: flex; - flex-wrap: wrap; - justify-content: space-between; - align-items: center; - } } -.item { - &-padding { - padding: 0.75rem 0.25rem; - } +.item-pointer:hover { + cursor: pointer; - &-pointer:hover { + ::ng-deep label { cursor: pointer; - background-color: rgb(113 113 122 / 0.1); - } - - &-copy:hover { - cursor: copy; - background-color: rgb(113 113 122 / 0.1); } } -::ng-deep .t-text { - font-weight: 600; +.item-copy:hover { + cursor: copy; + + ::ng-deep label { + cursor: copy; + } +} + +.item-padding { + padding: 0.75rem 0.25rem; } *, @@ -50,7 +43,3 @@ border-style: solid; border-color: rgb(var(--tw-color-gray-200) / 1); } - -.git-hash-label { - font-size: 0.73rem; -} \ No newline at end of file diff --git a/web/projects/marketplace/src/pages/show/additional/additional.component.ts b/web/projects/marketplace/src/pages/show/additional/additional.component.ts index e1876bb81..aa80f9d23 100644 --- a/web/projects/marketplace/src/pages/show/additional/additional.component.ts +++ b/web/projects/marketplace/src/pages/show/additional/additional.component.ts @@ -1,26 +1,13 @@ import { ChangeDetectionStrategy, Component, - EventEmitter, inject, Input, - Output, - TemplateRef, } from '@angular/core' import { ActivatedRoute } from '@angular/router' -import { - TuiAlertService, - TuiDialogContext, - TuiDialogService, -} from '@taiga-ui/core' +import { TuiDialogService } from '@taiga-ui/core' import { PolymorpheusComponent } from '@tinkoff/ng-polymorpheus' -import { - CopyService, - displayEmver, - Emver, - MarkdownComponent, -} from '@start9labs/shared' -import { filter } from 'rxjs' +import { CopyService, MarkdownComponent } from '@start9labs/shared' import { MarketplacePkg } from '../../../types' import { AbstractMarketplaceService } from '../../../services/marketplace.service' @@ -34,38 +21,16 @@ export class AdditionalComponent { @Input({ required: true }) pkg!: MarketplacePkg - @Output() - version = new EventEmitter() - - readonly displayEmver = displayEmver private readonly marketplaceService = inject(AbstractMarketplaceService) constructor( readonly copyService: CopyService, - private readonly alerts: TuiAlertService, private readonly dialogs: TuiDialogService, - private readonly emver: Emver, private readonly route: ActivatedRoute, ) {} readonly url = this.route.snapshot.queryParamMap.get('url') || undefined - presentAlertVersions(version: TemplateRef) { - this.dialogs - .open(version, { - label: 'Versions', - size: 's', - data: { - value: this.pkg.manifest.version, - items: this.pkg.versions.sort( - (a, b) => -1 * (this.emver.compare(a, b) || 0), - ), - }, - }) - .pipe(filter(Boolean)) - .subscribe(version => this.version.emit(version)) - } - presentModalMd(label: string) { this.dialogs .open(new PolymorpheusComponent(MarkdownComponent), { diff --git a/web/projects/marketplace/src/pages/show/additional/additional.module.ts b/web/projects/marketplace/src/pages/show/additional/additional.module.ts index 56414ed66..4416cfad2 100644 --- a/web/projects/marketplace/src/pages/show/additional/additional.module.ts +++ b/web/projects/marketplace/src/pages/show/additional/additional.module.ts @@ -1,24 +1,17 @@ import { CommonModule } from '@angular/common' import { NgModule } from '@angular/core' import { AdditionalComponent } from './additional.component' -import { - TuiRadioListModule, - TuiStringifyContentPipeModule, -} from '@taiga-ui/kit' -import { FormsModule } from '@angular/forms' -import { TuiButtonModule, TuiLabelModule, TuiSvgModule } from '@taiga-ui/core' -import { AdditionalLinkModule } from './additional-link/additional-link.component.module' +import { TuiButtonModule, TuiLabelModule } from '@taiga-ui/core' +import { MarketplaceAdditionalItemComponent } from './additional-item.component' +import { MarketplaceAdditionalLinkComponent } from './additional-link.component' @NgModule({ imports: [ CommonModule, - TuiRadioListModule, - FormsModule, - TuiStringifyContentPipeModule, TuiButtonModule, TuiLabelModule, - AdditionalLinkModule, - TuiSvgModule, + MarketplaceAdditionalItemComponent, + MarketplaceAdditionalLinkComponent, ], declarations: [AdditionalComponent], exports: [AdditionalComponent], diff --git a/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.html b/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.html deleted file mode 100644 index ecd726a84..000000000 --- a/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.html +++ /dev/null @@ -1,22 +0,0 @@ -
-
- -
-
- - {{ pkg.dependencyMetadata[dep.key].title || dep.key }} - -

- @if (dep.value.optional) { - (optional) - } @else { - (required) - } -

-
- - {{ dep.value.description }} - -
-
-
diff --git a/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.scss b/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.scss deleted file mode 100644 index f06835c9d..000000000 --- a/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.scss +++ /dev/null @@ -1,63 +0,0 @@ -.outer-container { - background-color: rgb(63 63 70 / 0.4); - border-radius: 0.75rem; - padding: 0.75rem 1.25rem; - gap: 0.5rem; - filter: drop-shadow(0 10px 8px rgb(0 0 0 / 0.04)) - drop-shadow(0 4px 3px rgb(0 0 0 / 0.1)); - - &:hover { - background-color: rgb(63 63 70 / 0.7); - } -} - -.inner-container { - display: flex; - align-items: center; - gap: 1.5rem; - - &-title { - margin-bottom: 0.25rem; - display: flex; - flex-wrap: wrap; - align-items: center; - gap: 0.25rem; - - span { - display: block; - font-size: 1rem; - line-height: 1.5rem; - font-weight: 500; - color: rgb(250 250 250 / 0.9); - overflow: hidden; - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 1; - } - } - - &-description { - font-size: 0.875rem; - line-height: 1.25rem; - color: rgb(250 250 250 / 0.7); - height: 2.75rem; - overflow: hidden; - display: -webkit-box; - -webkit-box-orient: vertical; - -webkit-line-clamp: 2; - } -} - -::ng-deep .dep-img { - width: 4rem; - pointer-events: none; - border-radius: 9999px; - object-fit: cover; - filter: drop-shadow(0 10px 8px rgb(0 0 0 / 0.04)) - drop-shadow(0 4px 3px rgb(0 0 0 / 0.1)); - margin-bottom: 0.75rem; -} - -.wrapper-margin { - margin-top: 0.75rem; -} diff --git a/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts b/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts index 30e0aa90e..523e49489 100644 --- a/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts +++ b/web/projects/marketplace/src/pages/show/dependencies/dependencies.component.ts @@ -1,17 +1,62 @@ -import { ChangeDetectionStrategy, Component, Input } from '@angular/core' -import { Dependency, MarketplacePkg } from '../../../types' -import { KeyValue } from '@angular/common' +import { + ChangeDetectionStrategy, + Component, + EventEmitter, + Input, + Output, + inject, +} from '@angular/core' +import { CommonModule } from '@angular/common' +import { MarketplaceDepItemComponent } from './dependency-item.component' +import { MarketplacePkg } from '../../../types' @Component({ selector: 'marketplace-dependencies', - templateUrl: 'dependencies.component.html', - styleUrls: ['./dependencies.component.scss'], + template: ` +
+
+

Dependencies

+
+ @for (dep of pkg.manifest.dependencies | keyvalue; track $index) { + + } +
+
+
+ `, + styles: [ + ` + .dependencies-container { + background-color: rgb(39 39 42); + border-radius: 0.75rem; + padding: 1.75rem; + + @media (min-width: 1024px) { + grid-column: span 5 / span 5; + } + @media (min-width: 1280px) { + grid-column: span 4 / span 4; + } + } + + .dependencies-list { + display: grid; + grid-auto-rows: auto; + gap: 0.75rem; + } + `, + ], changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, MarketplaceDepItemComponent], }) -export class DependenciesComponent { +export class MarketplaceDependenciesComponent { @Input({ required: true }) pkg!: MarketplacePkg - @Input({ required: true }) - dep!: KeyValue + @Output() open = new EventEmitter() } diff --git a/web/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts b/web/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts deleted file mode 100644 index 01cadddf3..000000000 --- a/web/projects/marketplace/src/pages/show/dependencies/dependencies.module.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { CommonModule } from '@angular/common' -import { NgModule } from '@angular/core' -import { RouterModule } from '@angular/router' -import { EmverPipesModule } from '@start9labs/shared' -import { DependenciesComponent } from './dependencies.component' -import { TuiAvatarModule } from '@taiga-ui/experimental' -@NgModule({ - imports: [CommonModule, RouterModule, TuiAvatarModule, EmverPipesModule], - declarations: [DependenciesComponent], - exports: [DependenciesComponent], -}) -export class DependenciesModule {} diff --git a/web/projects/marketplace/src/pages/show/dependencies/dependency-item.component.ts b/web/projects/marketplace/src/pages/show/dependencies/dependency-item.component.ts new file mode 100644 index 000000000..d1b2dfba6 --- /dev/null +++ b/web/projects/marketplace/src/pages/show/dependencies/dependency-item.component.ts @@ -0,0 +1,133 @@ +import { CommonModule, KeyValue } from '@angular/common' +import { ChangeDetectionStrategy, Component, Input } from '@angular/core' +import { EmverPipesModule } from '@start9labs/shared' +import { Dependency, MarketplacePkg } from '../../../types' +import { RouterModule } from '@angular/router' +import { TuiAvatarModule } from '@taiga-ui/experimental' + +@Component({ + selector: 'marketplace-dep-item', + template: ` +
+
+ +
+
+ + {{ getTitle(dep.key) }} + +

+ + (required) + (optional) + +

+
+ + + + + {{ dep.value.description }} + +
+
+
+ `, + styles: [ + ` + .outer-container { + background-color: rgb(63 63 70 / 0.4); + border-radius: 0.75rem; + padding: 0.75rem 1.25rem; + gap: 0.5rem; + filter: drop-shadow(0 10px 8px rgb(0 0 0 / 0.04)) + drop-shadow(0 4px 3px rgb(0 0 0 / 0.1)); + + &:hover { + background-color: rgb(63 63 70 / 0.7); + cursor: pointer; + } + } + + .inner-container { + display: flex; + align-items: center; + gap: 1.5rem; + } + + .inner-container-title { + margin-bottom: 0.25rem; + display: flex; + flex-wrap: wrap; + align-items: center; + gap: 0.25rem; + + span { + display: block; + font-size: 1rem; + line-height: 1.5rem; + font-weight: 500; + color: rgb(250 250 250 / 0.9); + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + } + } + + .inner-container-version { + font-size: 0.875rem; + line-height: 1.25rem; + color: rgb(250 250 250 / 0.7); + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; + } + + .inner-container-description { + font-size: 0.875rem; + line-height: 1.25rem; + color: rgb(250 250 250 / 0.7); + height: 2.75rem; + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; + } + + ::ng-deep .dep-img { + width: 4rem; + pointer-events: none; + border-radius: 100%; + object-fit: cover; + filter: drop-shadow(0 10px 8px rgb(0 0 0 / 0.04)) + drop-shadow(0 4px 3px rgb(0 0 0 / 0.1)); + } + + .wrapper-margin { + margin-top: 0.75rem; + } + `, + ], + changeDetection: ChangeDetectionStrategy.OnPush, + standalone: true, + imports: [CommonModule, RouterModule, TuiAvatarModule, EmverPipesModule], +}) +export class MarketplaceDepItemComponent { + @Input({ required: true }) + pkg!: MarketplacePkg + + @Input({ required: true }) + dep!: KeyValue + + getImage(key: string): string { + const icon = this.pkg.dependencyMetadata[key]?.icon + // @TODO fix when registry api is updated to include mimetype in icon url + return icon ? `data:image/png;base64,${icon}` : key.substring(0, 2) + } + + getTitle(key: string): string { + return this.pkg.dependencyMetadata[key]?.title || key + } +} diff --git a/web/projects/marketplace/src/pages/show/hero/hero.component.ts b/web/projects/marketplace/src/pages/show/hero/hero.component.ts index 22e0ea965..ac6afc0cf 100644 --- a/web/projects/marketplace/src/pages/show/hero/hero.component.ts +++ b/web/projects/marketplace/src/pages/show/hero/hero.component.ts @@ -27,6 +27,9 @@ import { MarketplacePkg } from '../../../types'

{{ pkg.manifest.title }}

+

+ {{ pkg.manifest.version }} +

{{ pkg.manifest.description.short }}

@@ -42,7 +45,6 @@ import { MarketplacePkg } from '../../../types' display: flex; justify-content: center; margin-top: 2.5rem; - z-index: 0; @media (min-width: 768px) { margin-top: 0px; @@ -53,13 +55,13 @@ import { MarketplacePkg } from '../../../types' display: flex; flex-direction: column; width: 100%; - height: 32vh; + min-height: 32vh; position: relative; border-radius: 1.5rem; padding: 4rem 2rem 0 2rem; @media (min-width: 376px) { - height: 26vh; + min-height: 26vh; } @media (min-width: 768px) { min-height: 14rem; @@ -72,6 +74,8 @@ import { MarketplacePkg } from '../../../types' border-radius: 9999px; object-fit: cover; position: absolute; + backdrop-filter: blur(24px); + background-color: rgb(0 0 0 / 0.5); top: -2.25rem; left: 1.75rem; z-index: 1; @@ -84,20 +88,26 @@ import { MarketplacePkg } from '../../../types' z-index: 1; h2 { - font-size: 1.5rem; - line-height: 2rem; - font-weight: 500; + font-size: 2rem; + line-height: 3rem; + font-weight: 400; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 1; - margin-bottom: 0.25rem; + margin-left: -1px; + } + + h3 { + font-size: 1.1rem; + font-weight: 400; + margin-bottom: 1rem; } p { - display: block; font-size: 1rem; line-height: 1.5rem; + font-weight: 300; overflow: hidden; display: -webkit-box; -webkit-box-orient: vertical; @@ -123,7 +133,7 @@ import { MarketplacePkg } from '../../../types' width: 200%; height: 200%; max-width: 200%; - filter: blur(100px) saturate(1.5); + filter: blur(100px); } } diff --git a/web/projects/marketplace/src/pages/show/screenshots/screenshots.component.ts b/web/projects/marketplace/src/pages/show/screenshots/screenshots.component.ts index 8566473a3..bc9b2c929 100644 --- a/web/projects/marketplace/src/pages/show/screenshots/screenshots.component.ts +++ b/web/projects/marketplace/src/pages/show/screenshots/screenshots.component.ts @@ -38,7 +38,7 @@ import { PolymorpheusContent } from '@tinkoff/ng-polymorpheus' *tuiItem draggable="false" [class.item_active]="i === index + 1" - class="screenshot-item box-shadow-lg" + class="screenshot-item" > @if (!(pkg.manifest.dependencies | empty)) { -
-
-

Dependencies

-
- @for ( - dep of pkg.manifest.dependencies | keyvalue; - track $index - ) { - - } -
-
-
+ } - + + + + +
+ + +
+
+
`, @@ -83,36 +112,6 @@ import { Router } from '@angular/router' column-gap: 2rem; } - .dependencies { - &-container { - background-color: rgb(39 39 42); - border-radius: 0.75rem; - padding: 1.75rem; - - @media (min-width: 1024px) { - grid-column: span 5 / span 5; - } - @media (min-width: 1280px) { - grid-column: span 4 / span 4; - } - - h2 { - font-size: 1.125rem; - line-height: 1.75rem; - font-weight: 700; - margin: 0.5rem 0; - padding-bottom: 0.75rem; - font-variant: all-small-caps; - } - } - - &-list { - display: grid; - grid-auto-rows: auto; - gap: 0.75rem; - } - } - .additional-wrapper { margin-top: 1.5rem; } @@ -124,24 +123,52 @@ import { Router } from '@angular/router' CommonModule, MarketplacePackageHeroComponent, TuiButtonModule, - DependenciesModule, + MarketplaceDependenciesComponent, ReleaseNotesModule, AdditionalModule, AboutModule, SharedPipesModule, + FormsModule, + TuiStringifyContentPipeModule, + MarketplaceAdditionalItemComponent, + TuiRadioListModule, ], }) export class MarketplacePreviewComponent { - private readonly router = inject(Router) - @Input({ required: true }) pkg!: MarketplacePkg + @Output() + version = new EventEmitter() + + readonly displayEmver = displayEmver + private readonly router = inject(Router) readonly url$ = inject(AbstractMarketplaceService) .getSelectedHost$() .pipe(map(({ url }) => url)) + constructor( + private readonly dialogs: TuiDialogService, + private readonly emver: Emver, + ) {} + open(id: string) { this.router.navigate([], { queryParams: { id } }) } + + presentAlertVersions(version: TemplateRef) { + this.dialogs + .open(version, { + label: 'Versions', + size: 's', + data: { + value: this.pkg.manifest.version, + items: [...new Set(this.pkg.versions)].sort( + (a, b) => -1 * (this.emver.compare(a, b) || 0), + ), + }, + }) + .pipe(filter(Boolean)) + .subscribe(version => this.version.emit(version)) + } } diff --git a/web/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts b/web/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts index d596df6e1..55f0b654d 100644 --- a/web/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts +++ b/web/projects/ui/src/app/apps/portal/routes/system/sideload/package.component.ts @@ -4,7 +4,7 @@ import { Router, RouterLink } from '@angular/router' import { AboutModule, AdditionalModule, - DependenciesModule, + MarketplaceDependenciesComponent, MarketplacePackageHeroComponent, MarketplacePkg, } from '@start9labs/marketplace' @@ -27,13 +27,13 @@ import { getManifest } from 'src/app/util/get-package-data' @Component({ selector: 'sideload-package', template: ` -
+
-
+ `, + styles: [ + ` + .outer-container { + display: grid; + justify-content: center; + gap: 2rem; + padding: 2.5rem 1rem 1rem 1rem; + margin-bottom: 4rem; + + @media (min-width: 1024px) { + padding: 2.5rem 4rem 2rem 4rem; + } + } + + .inner-container { + display: flex; + justify-content: flex-start; + } + `, + ], standalone: true, imports: [ CommonModule, @@ -74,7 +84,7 @@ import { getManifest } from 'src/app/util/get-package-data' TuiButtonModule, TuiLetModule, MarketplacePackageHeroComponent, - DependenciesModule, + MarketplaceDependenciesComponent, ], }) export class SideloadPackageComponent { @@ -140,4 +150,8 @@ export class SideloadPackageComponent { loader.unsubscribe() } } + + open(id: string) { + this.router.navigate(['/marketplace'], { queryParams: { id } }) + } } diff --git a/web/projects/ui/src/styles.scss b/web/projects/ui/src/styles.scss index 3b6684e27..51de60246 100644 --- a/web/projects/ui/src/styles.scss +++ b/web/projects/ui/src/styles.scss @@ -1,72 +1,5 @@ @import '@taiga-ui/core/styles/taiga-ui-local'; - -@font-face { - font-family: 'text-security-disc'; - src: url('/assets/fonts/text-security-disc.woff2') format('woff2'); -} - -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: normal; - src: url('/assets/fonts/Montserrat/Montserrat-Regular.ttf'); -} - -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: bold; - src: url('/assets/fonts/Montserrat/Montserrat-Bold.ttf'); -} - -@font-face { - font-family: 'Montserrat'; - font-style: normal; - font-weight: thin; - src: url('/assets/fonts/Montserrat/Montserrat-Light.ttf'); -} - -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: normal; - src: url('/assets/fonts/Open_Sans/OpenSans-Regular.ttf'); -} - -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: 600; - src: url('/assets/fonts/Open_Sans/OpenSans-SemiBold.ttf'); -} - -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: bold; - src: url('/assets/fonts/Open_Sans/OpenSans-Bold.ttf'); -} - -@font-face { - font-family: 'Open Sans'; - font-style: normal; - font-weight: thin; - src: url('/assets/fonts/Open_Sans/OpenSans-Light.ttf'); -} - -@font-face { - font-family: 'Courier New'; - font-style: normal; - font-weight: normal; - src: url('/assets/fonts/Courier_New/CourierNew-Regular.ttf'); -} - -@font-face { - font-family: 'Courier New'; - font-style: normal; - font-weight: bold; - src: url('/assets/fonts/Courier_New/CourierNew-Bold.ttf'); -} +@import '@start9labs/shared/styles/shared.scss'; /** Ionic CSS Variables overrides **/ :root {