Migrate to bootstrap 5

This commit is contained in:
Chocobozzz 2022-06-08 16:14:24 +02:00
parent b89b0bfce9
commit 4c8749cb9e
No known key found for this signature in database
GPG Key ID: 583A612D890159BE
128 changed files with 730 additions and 855 deletions

View File

@ -48,7 +48,7 @@
"@babel/core": "^7.15.0",
"@babel/preset-env": "^7.15.0",
"@neos21/bootstrap3-glyphicons": "^1.0.1",
"@ng-bootstrap/ng-bootstrap": "^11.0.0",
"@ng-bootstrap/ng-bootstrap": "^12.1.2",
"@ng-select/ng-select": "^8.1.1",
"@ngx-loading-bar/core": "^6.0.0",
"@ngx-loading-bar/http-client": "^6.0.0",
@ -57,6 +57,7 @@
"@peertube/p2p-media-loader-hlsjs": "^1.0.8",
"@peertube/videojs-contextmenu": "^5.5.0",
"@peertube/xliffmerge": "^2.0.3",
"@popperjs/core": "^2.11.5",
"@types/chart.js": "^2.9.16",
"@types/core-js": "^2.5.2",
"@types/debug": "^4.1.5",
@ -79,7 +80,7 @@
"angular2-hotkeys": "^13.1.0",
"angularx-qrcode": "13.0.3",
"babel-loader": "^8.2.2",
"bootstrap": "^4.1.3",
"bootstrap": "^5.1.3",
"buffer": "^6.0.3",
"cache-chunk-store": "^3.0.0",
"chart.js": "^3.5.1",

View File

@ -1,5 +1,6 @@
<div class="row">
<h1 class="sr-only" i18n>Follows</h1>
<h1 class="visually-hidden" i18n>Follows</h1>
<div class="col-xl-6 col-md-12">
<h2 i18n class="subtitle">Follower instances ({{ followersPagination.totalItems }})</h2>

View File

@ -15,6 +15,7 @@ a {
.no-results {
justify-content: flex-start;
align-items: flex-start;
}
.show-more {

View File

@ -8,9 +8,9 @@
</div>
<div class="instance-badges" *ngIf="categories.length !== 0 || languages.length !== 0">
<span *ngFor="let category of categories" class="badge badge-primary category">{{ category }}</span>
<span *ngFor="let category of categories" class="pt-badge badge-primary">{{ category }}</span>
<span *ngFor="let language of languages" class="badge badge-secondary language">{{ language }}</span>
<span *ngFor="let language of languages" class="pt-badge badge-secondary">{{ language }}</span>
</div>
<div class="short-description">
@ -204,7 +204,7 @@
</div>
<div class="col-md-12 col-xl-6" myPluginSelector pluginSelectorId="about-instance-features">
<h2 class="sr-only" i18n>FEATURES</h2>
<h2 class="visually-hidden" i18n>FEATURES</h2>
<my-instance-features-table></my-instance-features-table>
</div>

View File

@ -19,18 +19,11 @@
}
.instance-badges {
font-size: 16px;
margin-bottom: 20px;
font-size: 16px;
.badge {
.pt-badge {
@include margin-right(5px);
font-size: 12px;
font-weight: $font-semibold;
&.category {
background-color: pvar(--mainColor);
}
}
}

View File

@ -1,4 +1,4 @@
<div class="row">
<div>
<div class="sub-menu" [ngClass]="{ 'sub-menu-fixed': !isBroadcastMessageDisplayed }">
<div class="links">

View File

@ -1,4 +1,4 @@
<h1 class="sr-only" i18n>Video channels</h1>
<h1 class="visually-hidden" i18n>Video channels</h1>
<div class="margin-content">

View File

@ -18,7 +18,7 @@
(userChanged)="onUserChanged()" (userDeleted)="onUserDeleted()"
></my-user-moderation-dropdown>
<span *ngIf="accountUser?.blocked" [ngbTooltip]="accountUser.blockedReason" class="badge badge-danger" i18n>Banned</span>
<span *ngIf="accountUser?.blocked" [ngbTooltip]="accountUser.blockedReason" class="pt-badge badge-danger" i18n>Banned</span>
<my-account-block-badges [account]="account"></my-account-block-badges>
</div>

View File

@ -93,6 +93,10 @@ my-user-moderation-dropdown {
}
}
.pt-badge {
@include margin-right(5px);
}
@media screen and (max-width: $small-view) {
.root {
--myGlobalTopPadding: 45px;

View File

@ -1,15 +1,15 @@
<ng-container [formGroup]="form">
<div class="form-row mt-5"> <!-- cache grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-5"> <!-- cache grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">CACHE</div>
<div i18n class="inner-form-description">
Some files are not federated, and fetched when necessary. Define their caching policies.
</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<ng-container formGroupName="cache">
<div class="form-group" formGroupName="previews">
<label i18n for="cachePreviewsSize">Number of previews to keep in cache</label>
@ -57,8 +57,8 @@
</div>
</div>
<div class="form-row mt-4"> <!-- cache grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-4"> <!-- cache grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div class="anchor" id="customizations"></div> <!-- customizations anchor -->
<div i18n class="inner-form-title">CUSTOMIZATIONS</div>
<div i18n class="inner-form-description">
@ -66,8 +66,7 @@
</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<ng-container formGroupName="instance">
<ng-container formGroupName="customizations">
<div class="form-group">

View File

@ -1,13 +1,13 @@
<ng-container [formGroup]="form">
<div class="form-row mt-5"> <!-- appearance grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-5"> <!-- appearance grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">APPEARANCE</div>
<div i18n class="inner-form-description">
Use <a routerLink="/admin/plugins">plugins & themes</a> for more involved changes, or <a routerLink="/admin/config/edit-custom" fragment="advanced-configuration">add slight customizations</a>.
</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<ng-container formGroupName="theme">
<div class="form-group">
@ -88,15 +88,15 @@
</div>
</div>
<div class="form-row mt-4"> <!-- broadcast grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-4"> <!-- broadcast grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">BROADCAST MESSAGE</div>
<div i18n class="inner-for-description">
Display a message on your instance
</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<ng-container formGroupName="broadcastMessage">
@ -144,15 +144,15 @@
</div>
</div>
<div class="form-row mt-4"> <!-- new users grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-4"> <!-- new users grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">NEW USERS</div>
<div i18n class="inner-for-description">
Manage <a routerLink="/admin/users">users</a> to set their quota individually.
</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<ng-container formGroupName="signup">
<div class="form-group">
@ -239,20 +239,20 @@
</div>
</div>
<div class="form-row mt-4"> <!-- videos grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-4"> <!-- videos grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">VIDEOS</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<ng-container formGroupName="import">
<ng-container formGroupName="videos">
<div class="form-group mt-4">
<div class="form-group">
<label i18n for="importConcurrency">Import jobs concurrency</label>
<span i18n class="muted ml-1">allows to import multiple videos in parallel. ⚠️ Requires a PeerTube restart.</span>
<span i18n class="muted ms-1">allows to import multiple videos in parallel. ⚠️ Requires a PeerTube restart.</span>
<div class="number-with-unit">
<input type="number" name="importConcurrency" formControlName="concurrency" />
@ -309,12 +309,12 @@
</div>
</div>
<div class="form-row mt-4"> <!-- video channels grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-4"> <!-- video channels grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">VIDEO CHANNELS</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<div class="form-group" formGroupName="videoChannels">
<label i18n for="videoChannelsMaxPerUser">Max video channels per user</label>
@ -331,12 +331,12 @@
</div>
</div>
<div class="form-row mt-4"> <!-- search grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-4"> <!-- search grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">SEARCH</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<ng-container formGroupName="search">
<ng-container formGroupName="remoteUri">
@ -420,15 +420,15 @@
</div>
</div>
<div class="form-row mt-4"> <!-- federation grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-4"> <!-- federation grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">FEDERATION</div>
<div i18n class="inner-form-description">
Manage <a routerLink="/admin/follows">relations</a> with other instances.
</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<ng-container formGroupName="followers">
<ng-container formGroupName="instance">
@ -499,12 +499,12 @@
</div>
</div>
<div class="form-row mt-4"> <!-- administrators grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-4"> <!-- administrators grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">ADMINISTRATORS</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<div class="form-group" formGroupName="admin">
<label i18n for="adminEmail">Admin email</label>
@ -527,8 +527,8 @@
</div>
</div>
<div class="form-row mt-4"> <!-- Twitter grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-4"> <!-- Twitter grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">TWITTER</div>
<div i18n class="inner-form-description">
Provide the Twitter account representing your instance to improve link previews.
@ -536,7 +536,7 @@
</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<ng-container formGroupName="services">
<ng-container formGroupName="twitter">

View File

@ -1,4 +1,4 @@
<h1 class="sr-only" i18n>Configuration</h1>
<h1 class="visually-hidden" i18n>Configuration</h1>
<div class="alert alert-warning" *ngIf="!isUpdateAllowed()" i18n>
Updating instance configuration from the web interface is disabled by the system administrator.
@ -64,7 +64,7 @@
<div [ngbNavOutlet]="nav"></div>
<div class="form-row mt-4"> <!-- submit placement block -->
<div class="row mt-4"> <!-- submit placement block -->
<div class="col-md-7 col-xl-5"></div>
<div class="col-md-5 col-xl-5">

View File

@ -102,11 +102,6 @@ input[disabled] {
opacity: 0.5;
}
.form-group-right {
padding-top: 2px;
}
ngb-tabset:not(.previews) ::ng-deep {
.nav-link {
font-size: 105%;

View File

@ -2,12 +2,12 @@
<ng-container formGroupName="instanceCustomHomepage">
<div class="form-row mt-5"> <!-- homepage grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-5"> <!-- homepage grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">INSTANCE HOMEPAGE</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<div class="form-group">
<label i18n for="instanceCustomHomepageContent">Homepage</label>

View File

@ -2,13 +2,12 @@
<ng-container formGroupName="instance">
<div class="form-row mt-5"> <!-- instance grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-5"> <!-- instance grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">INSTANCE</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<div class="form-group">
<label i18n for="instanceName">Name</label>
@ -77,16 +76,15 @@
</div>
</div>
<div class="form-row mt-4"> <!-- moderation & nsfw grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-4"> <!-- moderation & nsfw grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">MODERATION & NSFW</div>
<div i18n class="inner-for-description">
<div i18row="inner-for-description">
Manage <a routerLink="/admin/users">users</a> to build a moderation team.
</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<div class="form-group">
<my-peertube-checkbox inputName="instanceIsNSFW" formControlName="isNSFW">
<ng-template ptTemplate="label">
@ -162,12 +160,12 @@
</div>
</div>
<div class="form-row mt-4"> <!-- you and your instance grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-4"> <!-- you and your instance grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">YOU AND YOUR INSTANCE</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<div class="form-group">
<label i18n for="instanceAdministrator">Who is behind the instance?</label><my-help helpType="markdownText"></my-help>
@ -220,12 +218,12 @@
</div>
</div>
<div class="form-row mt-4"> <!-- other information grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-4"> <!-- other information grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">OTHER INFORMATION</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<div class="form-group">
<label i18n for="instanceHardwareInformation">What server/hardware does the instance run on?</label>

View File

@ -1,14 +1,14 @@
<ng-container [formGroup]="form">
<div class="form-row mt-5">
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-5">
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">LIVE</div>
<div i18n class="inner-form-description">
Enable users of your instance to stream live.
</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<ng-container formGroupName="live">
@ -89,15 +89,15 @@
</div>
</div>
<div class="form-row"> <!-- transcoding live streams grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row"> <!-- transcoding live streams grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">TRANSCODING</div>
<div i18n class="inner-form-description">
Same as VOD transcoding, transcoding live streams so that they are in a streamable form that any device can play. Requires a beefy CPU, and then some.
</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<ng-container formGroupName="live">
<ng-container formGroupName="transcoding">
@ -115,7 +115,7 @@
<div class="form-group" [ngClass]="getDisabledLiveTranscodingClass()">
<label i18n for="liveTranscodingThreads">Live resolutions to generate</label>
<div class="ml-2 mt-2 d-flex flex-column">
<div class="ms-2 mt-2 d-flex flex-column">
<ng-container formGroupName="resolutions">
<div class="form-group" *ngFor="let resolution of liveResolutions">
@ -136,7 +136,7 @@
<div class="form-group" [ngClass]="getDisabledLiveTranscodingClass()">
<label i18n for="liveTranscodingThreads">Live transcoding threads</label>
<span class="muted ml-1">
<span class="muted ms-1">
<ng-container *ngIf="getTotalTranscodingThreads().atMost" i18n>
will claim at most {{ getTotalTranscodingThreads().value }} {{ getTotalTranscodingThreads().unit }} with VOD transcoding
</ng-container>
@ -157,7 +157,7 @@
<div class="form-group mt-4" [ngClass]="getDisabledLiveTranscodingClass()">
<label i18n for="liveTranscodingProfile">Live transcoding profile</label>
<span class="muted ml-1" i18n>new live transcoding profiles can be added by PeerTube plugins</span>
<span class="muted ms-1" i18n>new live transcoding profiles can be added by PeerTube plugins</span>
<my-select-options
id="liveTranscodingProfile"

View File

@ -1,8 +1,8 @@
<ng-container [formGroup]="form">
<div class="form-row mt-4"> <!-- transcoding grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"></div>
<div class="form-group form-group-right col-12 col-lg-8">
<div class="row mt-4"> <!-- transcoding grid -->
<div class="col-12 col-lg-4 col-xl-3"></div>
<div class="col-12 col-lg-8">
<div class="callout callout-info">
<span i18n>
@ -21,8 +21,8 @@
</div>
</div>
<div class="form-row mt-2"> <!-- transcoding grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-4"> <!-- transcoding grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">TRANSCODING</div>
<div i18n class="inner-form-description">
Process uploaded videos so that they are in a streamable form that any device can play. Though costly in
@ -30,11 +30,11 @@
</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<ng-container formGroupName="transcoding">
<div class="form-group mb-0 col-12 col-xl-11">
<div class="col-12 col-xl-11">
<my-peertube-checkbox inputName="transcodingEnabled" formControlName="enabled" [recommended]="true">
<ng-template ptTemplate="label">
<ng-container i18n>Transcoding enabled</ng-container>
@ -115,7 +115,7 @@
<div class="form-group" [ngClass]="getTranscodingDisabledClass()">
<label i18n>Resolutions to generate per enabled format</label>
<div class="ml-2 mt-2 d-flex flex-column">
<div class="ms-2 mt-2 d-flex flex-column">
<ng-container formGroupName="resolutions">
<div class="form-group" *ngFor="let resolution of resolutions">
<my-peertube-checkbox
@ -142,7 +142,7 @@
<div class="form-group mt-4" [ngClass]="getTranscodingDisabledClass()">
<label i18n for="transcodingThreads">Transcoding threads</label>
<span class="muted ml-1">
<span class="muted ms-1">
<ng-container *ngIf="getTotalTranscodingThreads().atMost" i18n>
will claim at most {{ getTotalTranscodingThreads().value }} {{ getTotalTranscodingThreads().unit }} with live transcoding
</ng-container>
@ -162,9 +162,9 @@
<div *ngIf="formErrors.transcoding.threads" class="form-error">{{ formErrors.transcoding.threads }}</div>
</div>
<div class="form-group mt-4" [ngClass]="getTranscodingDisabledClass()">
<div class="form-group" [ngClass]="getTranscodingDisabledClass()">
<label i18n for="transcodingConcurrency">Transcoding jobs concurrency</label>
<span class="muted ml-1" i18n>allows to transcode multiple files in parallel. ⚠️ Requires a PeerTube restart</span>
<span class="muted ms-1" i18n>allows to transcode multiple files in parallel. ⚠️ Requires a PeerTube restart</span>
<div class="number-with-unit">
<input type="number" name="transcodingConcurrency" formControlName="concurrency" />
@ -174,9 +174,9 @@
<div *ngIf="formErrors.transcoding.concurrency" class="form-error">{{ formErrors.transcoding.concurrency }}</div>
</div>
<div class="form-group mt-4" [ngClass]="getTranscodingDisabledClass()">
<div class="form-group" [ngClass]="getTranscodingDisabledClass()">
<label i18n for="transcodingProfile">Transcoding profile</label>
<span class="muted ml-1" i18n>new transcoding profiles can be added by PeerTube plugins</span>
<span class="muted ms-1" i18n>new transcoding profiles can be added by PeerTube plugins</span>
<my-select-options
id="transcodingProfile"
@ -193,15 +193,15 @@
</div>
</div>
<div class="form-row mt-2"> <!-- video studio grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-2"> <!-- video studio grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">VIDEO STUDIO</div>
<div i18n class="inner-form-description">
Allows your users to edit their video (cut, add intro/outro, add a watermark etc)
</div>
</div>
<div class="form-group form-group-right col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<ng-container formGroupName="videoStudio">
<div class="form-group" [ngClass]="getTranscodingDisabledClass()">

View File

@ -12,7 +12,7 @@
>
<ng-template pTemplate="caption">
<div class="caption">
<div class="ml-auto">
<div class="ms-auto">
<my-advanced-input-filter (search)="onSearch($event)"></my-advanced-input-filter>
</div>
</div>
@ -46,10 +46,10 @@
</td>
<td *ngIf="follow.state === 'accepted'">
<span class="badge badge-green" i18n>Accepted</span>
<span class="pt-badge badge-green" i18n>Accepted</span>
</td>
<td *ngIf="follow.state === 'pending'">
<span class="badge badge-yellow" i18n>Pending</span>
<span class="pt-badge badge-yellow" i18n>Pending</span>
</td>
<td>{{ follow.score }}</td>

View File

@ -19,7 +19,7 @@
</a>
</div>
<div class="ml-auto">
<div class="ms-auto">
<my-advanced-input-filter (search)="onSearch($event)"></my-advanced-input-filter>
</div>
</div>
@ -48,10 +48,10 @@
</td>
<td *ngIf="follow.state === 'accepted'">
<span class="badge badge-green" i18n>Accepted</span>
<span class="pt-badge badge-green" i18n>Accepted</span>
</td>
<td *ngIf="follow.state === 'pending'">
<span class="badge badge-yellow" i18n>Pending</span>
<span class="pt-badge badge-yellow" i18n>Pending</span>
</td>
<td>{{ follow.createdAt | date: 'short' }}</td>

View File

@ -13,7 +13,7 @@
>
<ng-template pTemplate="caption">
<div class="caption">
<div class="ml-auto">
<div class="ms-auto">
<my-advanced-input-filter [filters]="inputFilters" (search)="onSearch($event)"></my-advanced-input-filter>
</div>
</div>
@ -53,11 +53,11 @@
</td>
<td>
<span *ngIf="videoBlock.video.nsfw" class="badge badge-red" i18n>NSFW</span>
<span *ngIf="videoBlock.video.nsfw" class="pt-badge badge-red" i18n>NSFW</span>
</td>
<td>
<span *ngIf="videoBlock.unfederated" class="badge badge-blue" i18n>Unfederated</span>
<span *ngIf="videoBlock.unfederated" class="pt-badge badge-blue" i18n>Unfederated</span>
</td>
<td>

View File

@ -25,7 +25,7 @@
</my-action-dropdown>
</div>
<div class="ml-auto right-form">
<div class="ms-auto right-form">
<my-advanced-input-filter [filters]="inputFilters" (search)="onSearch($event)"></my-advanced-input-filter>
<my-button i18n-label label="Refresh" icon="refresh" (click)="reloadData()"></my-button>

View File

@ -57,7 +57,7 @@
</div>
</ng-template>
<div class="form-row" *ngIf="!isInBigView()"> <!-- hidden on large screens, as it is then displayed on the right side of the form -->
<div class="row d-xxl-none"> <!-- hidden on large screens, as it is then displayed on the right side of the form -->
<div class="col-12 col-xl-3"></div>
<div class="col-12 col-xl-9">
@ -67,8 +67,8 @@
<div *ngIf="error" class="alert alert-danger">{{ error }}</div>
<div class="form-row mt-4"> <!-- user grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-4"> <!-- user grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div class="anchor" id="user"></div> <!-- user anchor -->
<div *ngIf="isCreation()" class="account-title" i18n>NEW USER</div>
<div *ngIf="!isCreation() && user" class="account-title">
@ -76,150 +76,150 @@
</div>
</div>
<div class="form-group col-12 col-lg-8 col-xl-9" [ngClass]="{ 'form-row': isInBigView() }">
<form role="form" (ngSubmit)="formValidated()" [formGroup]="form" [ngClass]="{ 'col-5': isInBigView() }">
<div class="form-group" *ngIf="isCreation()">
<label i18n for="username">Username</label>
<input
type="text" id="username" i18n-placeholder placeholder="john" class="form-control"
formControlName="username" [ngClass]="{ 'input-error': formErrors['username'] }"
>
<div *ngIf="formErrors.username" class="form-error">
{{ formErrors.username }}
<div class="col-12 col-lg-8 col-xl-9">
<div class="row">
<form class="col" role="form" (ngSubmit)="formValidated()" [formGroup]="form">
<div class="form-group" *ngIf="isCreation()">
<label i18n for="username">Username</label>
<input
type="text" id="username" i18n-placeholder placeholder="john" class="form-control"
formControlName="username" [ngClass]="{ 'input-error': formErrors['username'] }"
>
<div *ngIf="formErrors.username" class="form-error">
{{ formErrors.username }}
</div>
</div>
</div>
<div class="form-group" *ngIf="isCreation()">
<label i18n for="channelName">Channel name</label>
<input
type="text" id="channelName" i18n-placeholder placeholder="john_channel" class="form-control"
formControlName="channelName" [ngClass]="{ 'input-error': formErrors['channelName'] }"
>
<div *ngIf="formErrors.channelName" class="form-error">
{{ formErrors.channelName }}
<div class="form-group" *ngIf="isCreation()">
<label i18n for="channelName">Channel name</label>
<input
type="text" id="channelName" i18n-placeholder placeholder="john_channel" class="form-control"
formControlName="channelName" [ngClass]="{ 'input-error': formErrors['channelName'] }"
>
<div *ngIf="formErrors.channelName" class="form-error">
{{ formErrors.channelName }}
</div>
</div>
</div>
<div class="form-group">
<label i18n for="email">Email</label>
<input
type="text" id="email" i18n-placeholder placeholder="mail@example.com" class="form-control"
formControlName="email" [ngClass]="{ 'input-error': formErrors['email'] }"
autocomplete="off" [readonly]="user && user.pluginAuth !== null"
>
<div *ngIf="formErrors.email" class="form-error">
{{ formErrors.email }}
<div class="form-group">
<label i18n for="email">Email</label>
<input
type="text" id="email" i18n-placeholder placeholder="mail@example.com" class="form-control"
formControlName="email" [ngClass]="{ 'input-error': formErrors['email'] }"
autocomplete="off" [readonly]="user && user.pluginAuth !== null"
>
<div *ngIf="formErrors.email" class="form-error">
{{ formErrors.email }}
</div>
</div>
</div>
<div class="form-group" *ngIf="isCreation()">
<label i18n for="password">Password</label>
<my-help *ngIf="isPasswordOptional()">
<ng-template ptTemplate="customHtml">
<ng-container i18n>
If you leave the password empty, an email will be sent to the user.
</ng-container>
</ng-template>
</my-help>
<div class="form-group" *ngIf="isCreation()">
<label i18n for="password">Password</label>
<my-help *ngIf="isPasswordOptional()">
<ng-template ptTemplate="customHtml">
<ng-container i18n>
If you leave the password empty, an email will be sent to the user.
</ng-container>
</ng-template>
</my-help>
<my-input-toggle-hidden
formControlName="password" inputId="password" [ngClass]="{ 'input-error': formErrors['password'] }" autocomplete="new-password"
></my-input-toggle-hidden>
<my-input-toggle-hidden
formControlName="password" inputId="password" [ngClass]="{ 'input-error': formErrors['password'] }" autocomplete="new-password"
></my-input-toggle-hidden>
<div *ngIf="formErrors.password" class="form-error">
{{ formErrors.password }}
<div *ngIf="formErrors.password" class="form-error">
{{ formErrors.password }}
</div>
</div>
</div>
<div class="form-group">
<label i18n for="role">Role</label>
<div class="peertube-select-container">
<select id="role" formControlName="role" class="form-control">
<option *ngFor="let role of roles" [value]="role.value">
{{ role.label }}
</option>
<div class="form-group">
<label i18n for="role">Role</label>
<div class="peertube-select-container">
<select id="role" formControlName="role" class="form-control">
<option *ngFor="let role of roles" [value]="role.value">
{{ role.label }}
</option>
</select>
</div>
<div *ngIf="formErrors.role" class="form-error">
{{ formErrors.role }}
</div>
</div>
<div class="form-group">
<label i18n for="videoQuota">Video quota</label>
<my-select-custom-value
id="videoQuota"
[items]="videoQuotaOptions"
formControlName="videoQuota"
i18n-inputSuffix inputSuffix="bytes" inputType="number"
[clearable]="false"
></my-select-custom-value>
<div i18n class="transcoding-information" *ngIf="isTranscodingInformationDisplayed()">
Transcoding is enabled. The video quota only takes into account <strong>original</strong> video size. <br />
At most, this user could upload ~ {{ computeQuotaWithTranscoding() | bytes: 0 }}.
</div>
<div *ngIf="formErrors.videoQuota" class="form-error">
{{ formErrors.videoQuota }}
</div>
</div>
<div class="form-group">
<label i18n for="videoQuotaDaily">Daily video quota</label>
<my-select-custom-value
id="videoQuotaDaily"
[items]="videoQuotaDailyOptions"
formControlName="videoQuotaDaily"
i18n-inputSuffix inputSuffix="bytes" inputType="number"
[clearable]="false"
></my-select-custom-value>
<div *ngIf="formErrors.videoQuotaDaily" class="form-error">
{{ formErrors.videoQuotaDaily }}
</div>
</div>
<div class="form-group" *ngIf="!isCreation() && getAuthPlugins().length !== 0">
<label i18n for="pluginAuth">Auth plugin</label>
<div class="peertube-select-container">
<select id="pluginAuth" formControlName="pluginAuth" class="form-control">
<option [value]="null" i18n>None (local authentication)</option>
<option *ngFor="let authPlugin of getAuthPlugins()" [value]="authPlugin">{{ authPlugin }}</option>
</select>
</div>
</div>
<div *ngIf="formErrors.role" class="form-error">
{{ formErrors.role }}
<div class="form-group">
<my-peertube-checkbox
inputName="byPassAutoBlock" formControlName="byPassAutoBlock"
i18n-labelText labelText="Doesn't need review before a video goes public"
></my-peertube-checkbox>
</div>
<input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">
</form>
<div class="d-none d-xxl-block col-7">
<ng-template *ngTemplateOutlet="dashboard"></ng-template>
</div>
<div class="form-group">
<label i18n for="videoQuota">Video quota</label>
<my-select-custom-value
id="videoQuota"
[items]="videoQuotaOptions"
formControlName="videoQuota"
i18n-inputSuffix inputSuffix="bytes" inputType="number"
[clearable]="false"
></my-select-custom-value>
<div i18n class="transcoding-information" *ngIf="isTranscodingInformationDisplayed()">
Transcoding is enabled. The video quota only takes into account <strong>original</strong> video size. <br />
At most, this user could upload ~ {{ computeQuotaWithTranscoding() | bytes: 0 }}.
</div>
<div *ngIf="formErrors.videoQuota" class="form-error">
{{ formErrors.videoQuota }}
</div>
</div>
<div class="form-group">
<label i18n for="videoQuotaDaily">Daily video quota</label>
<my-select-custom-value
id="videoQuotaDaily"
[items]="videoQuotaDailyOptions"
formControlName="videoQuotaDaily"
i18n-inputSuffix inputSuffix="bytes" inputType="number"
[clearable]="false"
></my-select-custom-value>
<div *ngIf="formErrors.videoQuotaDaily" class="form-error">
{{ formErrors.videoQuotaDaily }}
</div>
</div>
<div class="form-group" *ngIf="!isCreation() && getAuthPlugins().length !== 0">
<label i18n for="pluginAuth">Auth plugin</label>
<div class="peertube-select-container">
<select id="pluginAuth" formControlName="pluginAuth" class="form-control">
<option [value]="null" i18n>None (local authentication)</option>
<option *ngFor="let authPlugin of getAuthPlugins()" [value]="authPlugin">{{ authPlugin }}</option>
</select>
</div>
</div>
<div class="form-group">
<my-peertube-checkbox
inputName="byPassAutoBlock" formControlName="byPassAutoBlock"
i18n-labelText labelText="Doesn't need review before a video goes public"
></my-peertube-checkbox>
</div>
<input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">
</form>
<div *ngIf="isInBigView()" class="col-7">
<ng-template *ngTemplateOutlet="dashboard"></ng-template>
</div>
</div>
</div>
<div *ngIf="!isCreation() && user && user.pluginAuth === null" class="form-row mt-4"> <!-- danger zone grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div *ngIf="!isCreation() && user && user.pluginAuth === null" class="row mt-4"> <!-- danger zone grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div class="anchor" id="danger"></div> <!-- danger zone anchor -->
<div i18n class="account-title account-title-danger">DANGER ZONE</div>
</div>
<div class="form-group col-12 col-lg-8 col-xl-9" [ngClass]="{ 'form-row': isInBigView() }">
<div class="col-12 col-lg-8 col-xl-9">
<div class="danger-zone">
<div class="form-group reset-password-email">

View File

@ -46,10 +46,6 @@ export abstract class UserEdit extends FormReactive implements OnInit {
.concat(this.serverConfig.plugin.registeredExternalAuths.map(p => p.npmName))
}
isInBigView () {
return this.screenService.getWindowInnerWidth() > 1600
}
buildRoles () {
const authUser = this.auth.getUser()

View File

@ -1,20 +1,16 @@
<form role="form" (ngSubmit)="formValidated()" [formGroup]="form">
<div class="form-group">
<div class="input-group">
<input id="password" [attr.type]="showPassword ? 'text' : 'password'" class="form-control"
formControlName="password" [ngClass]="{ 'input-error': formErrors['password'] }"
>
<button class="btn btn-sm btn-outline-secondary" (click)="togglePasswordVisibility()" type="button">
<ng-container *ngIf="!showPassword" i18n>Show</ng-container>
<ng-container *ngIf="!!showPassword" i18n>Hide</ng-container>
</button>
</div>
<div class="input-group">
<input id="password" [attr.type]="showPassword ? 'text' : 'password'" class="form-control"
formControlName="password" [ngClass]="{ 'input-error': formErrors['password'] }"
>
<div class="input-group-append">
<button class="btn btn-sm btn-outline-secondary" (click)="togglePasswordVisibility()" type="button">
<ng-container *ngIf="!showPassword" i18n>Show</ng-container>
<ng-container *ngIf="!!showPassword" i18n>Hide</ng-container>
</button>
</div>
</div>
<div *ngIf="formErrors.password" class="form-error">
{{ formErrors.password }}
</div>
<div *ngIf="formErrors.password" class="form-error">
{{ formErrors.password }}
</div>
<input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">

View File

@ -1,13 +1,9 @@
@use '_variables' as *;
@use '_mixins' as *;
input:not([type=submit]):not([type=checkbox]) {
input[type=text],
input[type=password] {
@include peertube-input-text(340px);
display: block;
border-top-right-radius: 0;
border-bottom-right-radius: 0;
border-right: 0;
}
input[type=submit] {
@ -17,7 +13,3 @@ input[type=submit] {
margin-top: 10px;
}
.input-group-append {
height: 30px;
}

View File

@ -26,7 +26,7 @@
</a>
</div>
<div class="ml-auto">
<div class="ms-auto">
<my-advanced-input-filter [filters]="inputFilters" (search)="onSearch($event)"></my-advanced-input-filter>
</div>
@ -90,7 +90,7 @@
</my-user-moderation-dropdown>
</td>
<td *ngIf="isSelected('username')">
<td *ngIf="isSelected('username')" class="cell-username">
<a i18n-title title="Open account in a new tab" target="_blank" rel="noopener noreferrer" [routerLink]="[ '/a/' + user.username ]">
<div class="chip two-lines">
<my-actor-avatar [account]="user?.account" size="32"></my-actor-avatar>
@ -101,13 +101,13 @@
</div>
</a>
<div *ngIf="user.accountMutedStatus.mutedByInstance" class="badges-username badge badge-red" i18n>Muted</div>
<div *ngIf="user.blocked" class="badges-username badge badge-red" i18n>Banned</div>
<div *ngIf="user.accountMutedStatus.mutedByInstance" class="pt-badge badge-red" i18n>Muted</div>
<div *ngIf="user.blocked" class="pt-badge badge-red" i18n>Banned</div>
</td>
<td *ngIf="isSelected('role')">
<span *ngIf="user.blocked" class="badge badge-banned" i18n-title title="The user was banned">{{ user.roleLabel }}</span>
<span *ngIf="!user.blocked" class="badge" [ngClass]="getRoleClass(user.role)">{{ user.roleLabel }}</span>
<span *ngIf="user.blocked" class="pt-badge badge-banned" i18n-title title="The user was banned">{{ user.roleLabel }}</span>
<span *ngIf="!user.blocked" class="pt-badge" [ngClass]="getRoleClass(user.role)">{{ user.roleLabel }}</span>
</td>
<td *ngIf="isSelected('email')" [title]="user.email">

View File

@ -1,5 +1,6 @@
@use '_variables' as *;
@use '_mixins' as *;
@use '~bootstrap/scss/functions' as *;
.add-button {
@include create-button;
@ -23,8 +24,8 @@ tr.banned > td {
font-weight: $font-semibold;
}
.badges-username {
margin-left: 15px;
.cell-username .pt-badge {
@include margin-left(15px);
}
.user-table-primary-text .glyphicon {

View File

@ -21,7 +21,7 @@
</my-action-dropdown>
</div>
<div class="ml-auto right-form">
<div class="ms-auto right-form">
<my-advanced-input-filter [filters]="inputFilters" (search)="onSearch($event)"></my-advanced-input-filter>
<my-button i18n-label label="Refresh" icon="refresh" (click)="reloadData()"></my-button>
@ -67,25 +67,25 @@
</td>
<td>
<span class="badge badge-blue" *ngIf="video.isLocal">Local</span>
<span class="badge badge-purple" *ngIf="!video.isLocal">Remote</span>
<span class="pt-badge badge-blue" *ngIf="video.isLocal">Local</span>
<span class="pt-badge badge-purple" *ngIf="!video.isLocal">Remote</span>
<span [ngClass]="getPrivacyBadgeClass(video)" class="badge">{{ video.privacy.label }}</span>
<span [ngClass]="getPrivacyBadgeClass(video)" class="pt-badge">{{ video.privacy.label }}</span>
<span *ngIf="video.nsfw" class="badge badge-red" i18n>NSFW</span>
<span *ngIf="video.nsfw" class="pt-badge badge-red" i18n>NSFW</span>
<span *ngIf="isUnpublished(video)" class="badge badge-yellow" i18n>{{ video.state.label }}</span>
<span *ngIf="isUnpublished(video)" class="pt-badge badge-yellow" i18n>{{ video.state.label }}</span>
<span *ngIf="isAccountBlocked(video)" class="badge badge-red" i18n>Account muted</span>
<span *ngIf="isServerBlocked(video)" class="badge badge-red" i18n>Server muted</span>
<span *ngIf="isAccountBlocked(video)" class="pt-badge badge-red" i18n>Account muted</span>
<span *ngIf="isServerBlocked(video)" class="pt-badge badge-red" i18n>Server muted</span>
<span *ngIf="isVideoBlocked(video)" class="badge badge-red" i18n>Blocked</span>
<span *ngIf="isVideoBlocked(video)" class="pt-badge badge-red" i18n>Blocked</span>
</td>
<td>
<span *ngIf="isHLS(video)" class="badge badge-blue">HLS</span>
<span *ngIf="isWebTorrent(video)" class="badge badge-blue">WebTorrent ({{ video.files.length }})</span>
<span *ngIf="video.isLive" class="badge badge-blue">Live</span>
<span *ngIf="isHLS(video)" class="pt-badge badge-blue">HLS</span>
<span *ngIf="isWebTorrent(video)" class="pt-badge badge-blue">WebTorrent ({{ video.files.length }})</span>
<span *ngIf="video.isLive" class="pt-badge badge-blue">Live</span>
<span *ngIf="!isImport(video) && !video.isLive && video.isLocal">{{ getFilesSize(video) | bytes: 1 }}</span>
</td>
@ -121,7 +121,7 @@
</ul>
</div>
<my-embed class="ml-auto" [video]="video"></my-embed>
<my-embed class="ms-auto" [video]="video"></my-embed>
</div>
</td>
</tr>

View File

@ -7,10 +7,8 @@ my-embed {
width: 50%;
}
.badge {
@include peertube-badge;
margin-right: 5px;
.pt-badge {
@include margin-right(5px);
}
.video-info > div {

View File

@ -32,9 +32,9 @@
<ng-container *ngFor="let plugin of plugins" >
<my-plugin-card [plugin]="plugin" [version]="plugin.latestVersion" [pluginType]="pluginType">
<div ngProjectAs="badges">
<span i18n *ngIf="plugin.installed" class="badge badge-success">Installed</span>
<span i18n *ngIf="plugin.installed" class="pt-badge badge-success">Installed</span>
<span *ngIf="plugin.official" class="badge badge-primary" i18n i18n-title title="This plugin is developed by Framasoft">
<span *ngIf="plugin.official" class="pt-badge badge-primary" i18n i18n-title title="This plugin is developed by Framasoft">
Official
</span>
</div>

View File

@ -22,11 +22,10 @@
}
}
.badge {
.pt-badge {
@include margin-left(15px);
font-size: 13px;
font-weight: $font-semibold;
}
.alert {

View File

@ -21,7 +21,7 @@
<span i18n="Selector for the list displaying jobs, filtering by their state">any</span>
</ng-option>
<ng-option *ngFor="let state of jobStates" [value]="state">
<span class="badge" [ngClass]="getJobStateClass(state)">{{ state }}</span>
<span class="pt-badge" [ngClass]="getJobStateClass(state)">{{ state }}</span>
</ng-option>
</ng-select>
</div>
@ -62,7 +62,7 @@
<td class="job-priority c-hand" [pRowToggler]="job">{{ job.priority }}</td>
<td class="job-state c-hand" [pRowToggler]="job" *ngIf="jobState === 'all'">
<span class="badge" [ngClass]="getJobStateClass(job.state)">{{ job.state }}</span>
<span class="pt-badge" [ngClass]="getJobStateClass(job.state)">{{ job.state }}</span>
</td>
<td *ngIf="hasGlobalProgress()" class="job-progress c-hand" [pRowToggler]="job">
@ -107,8 +107,8 @@
</ng-container>
<ng-container *ngIf="jobState !== 'all'">
<ng-container *ngIf="jobType === 'all'" i18n>No <span class="badge" [ngClass]="getJobStateClass(jobState)">{{ jobState }}</span> jobs found.</ng-container>
<ng-container *ngIf="jobType !== 'all'" i18n>No <code>{{ jobType }}</code> jobs found that are <span class="badge" [ngClass]="getJobStateClass(jobState)">{{ jobState }}</span>.</ng-container>
<ng-container *ngIf="jobType === 'all'" i18n>No <span class="pt-badge" [ngClass]="getJobStateClass(jobState)">{{ jobState }}</span> jobs found.</ng-container>
<ng-container *ngIf="jobType !== 'all'" i18n>No <code>{{ jobType }}</code> jobs found that are <span class="pt-badge" [ngClass]="getJobStateClass(jobState)">{{ jobState }}</span>.</ng-container>
</ng-container>
</div>
</div>

View File

@ -55,7 +55,3 @@ pre {
.job-error {
color: #ff0000;
}
.select-filter-block .badge {
@include peertube-badge;
}

View File

@ -3,42 +3,41 @@
<div class="margin-content">
<form role="form" (ngSubmit)="formValidated()" [formGroup]="form">
<div class="form-row"> <!-- channel grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row"> <!-- channel grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div *ngIf="isCreation()" class="video-channel-title" i18n>NEW CHANNEL</div>
<div *ngIf="!isCreation() && videoChannel" class="video-channel-title" i18n>CHANNEL</div>
</div>
<div class="form-group col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<h6 i18n>Banner image of the channel</h6>
<my-actor-banner-edit
*ngIf="videoChannel" [previewImage]="isCreation()"
[actor]="videoChannel" (bannerChange)="onBannerChange($event)" (bannerDelete)="onBannerDelete()"
></my-actor-banner-edit>
<my-actor-avatar-edit
*ngIf="videoChannel" [previewImage]="isCreation()"
[actor]="videoChannel" (avatarChange)="onAvatarChange($event)" (avatarDelete)="onAvatarDelete()"
[displayUsername]="!isCreation()" [displaySubscribers]="!isCreation()"
></my-actor-avatar-edit>
<div class="form-group" *ngIf="isCreation()">
<label i18n for="name">Name</label>
<div class="input-group">
<input
type="text" id="name" i18n-placeholder placeholder="Example: my_channel"
formControlName="name" [ngClass]="{ 'input-error': formErrors['name'] }" class="form-control"
>
<div class="input-group-append">
<span class="input-group-text">@{{ instanceHost }}</span>
</div>
<div class="input-group-text">@{{ instanceHost }}</div>
</div>
<div *ngIf="formErrors['name']" class="form-error">
{{ formErrors['name'] }}
</div>
</div>
<div class="form-group">
<label i18n for="display-name">Display name</label>
<input
@ -49,7 +48,7 @@
{{ formErrors['display-name'] }}
</div>
</div>
<div class="form-group">
<label i18n for="description">Description</label>
<textarea
@ -60,7 +59,7 @@
{{ formErrors.description }}
</div>
</div>
<div class="form-group">
<label for="support">Support</label>
<my-help
@ -75,22 +74,22 @@
{{ formErrors.support }}
</div>
</div>
<div class="form-group" *ngIf="isBulkUpdateVideosDisplayed()">
<my-peertube-checkbox
inputName="bulkVideosSupportUpdate" formControlName="bulkVideosSupportUpdate"
i18n-labelText labelText="Overwrite support field of all videos of this channel"
></my-peertube-checkbox>
</div>
</div>
</div>
<div class="form-row"> <!-- submit placement block -->
<div class="row"> <!-- submit placement block -->
<div class="col-md-7 col-xl-5"></div>
<div class="col-md-5 col-xl-5 d-inline-flex">
<input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">
</div>
</div>
</form>
</div>
</form>
</div>

View File

@ -24,31 +24,21 @@ my-actor-banner-edit {
max-width: 500px;
}
.input-group {
@include peertube-input-group(fit-content);
input[type=text] {
@include peertube-input-text(340px);
display: block;
&#name {
width: auto;
flex-grow: 1;
}
}
.input-group-append {
height: 30px;
}
input {
&[type=text] {
@include peertube-input-text(340px);
display: block;
&#name {
width: auto;
flex-grow: 1;
}
}
&[type=submit] {
@include peertube-button;
@include orange-button;
@include margin-left(auto);
}
input[type=submit] {
@include peertube-button;
@include orange-button;
@include margin-left(auto);
}
textarea {

View File

@ -3,8 +3,9 @@
<ng-container i18n>Applications</ng-container>
</h1>
<div class="form-row"> <!-- built-in token grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row"> <!-- built-in token grid -->
<div class="group col-12 col-lg-4 col-xl-3">
<h2 i18n class="applications-title">SUBSCRIPTION FEED</h2>
<div i18n class="applications-description">
Use third-party feed aggregators to retrieve the list of videos from
@ -12,7 +13,7 @@
</div>
</div>
<div class="form-group col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<div class="form-group">
<label i18n for="feed-url">Feed URL</label>
@ -29,7 +30,7 @@
</div>
</div>
<div class="form-row mt-4"> <!-- submit placement block -->
<div class="row mt-4"> <!-- submit placement block -->
<div class="col-md-7 col-xl-5"></div>
<div class="col-md-5 col-xl-5">
<input (click)="renewToken()" type="submit" i18n-value value="Renew token">

View File

@ -1,11 +1,11 @@
<h1 class="sr-only" i18n>Notifications</h1>
<h1 class="visually-hidden" i18n>Notifications</h1>
<div class="header">
<a routerLink="/my-account/settings" fragment="notifications" i18n>
<my-global-icon iconName="cog" aria-hidden="true"></my-global-icon>
Notification preferences
</a>
<div class="peertube-select-container peertube-select-button ml-2 mr-2">
<div class="peertube-select-container peertube-select-button ms-2 me-2">
<select [(ngModel)]="notificationSortType" (ngModelChange)="onChangeSortColumn()" class="form-control">
<option value="undefined" disabled>Sort by</option>
<option value="createdAt" i18n>Newest first</option>
@ -13,7 +13,7 @@
</select>
</div>
<button class="btn ml-auto" [disabled]="!hasUnreadNotifications()" (click)="markAllAsRead()">
<button class="btn ms-auto" [disabled]="!hasUnreadNotifications()" (click)="markAllAsRead()">
<ng-container *ngIf="hasUnreadNotifications()">
<my-global-icon iconName="tick" aria-hidden="true"></my-global-icon>

View File

@ -6,10 +6,6 @@ label {
font-size: 100%;
}
.form-group:first-child {
margin-bottom: 15px;
}
input#username + .muted {
margin-top: 5px;
}

View File

@ -1,18 +1,19 @@
<h1 class="sr-only" i18n>Settings</h1>
<div class="form-row"> <!-- preview -->
<div class="form-group col-12 col-lg-4 col-xl-3"></div>
<h1 class="visually-hidden" i18n>Settings</h1>
<div class="form-group col-12 col-lg-8 col-xl-9">
<div class="row"> <!-- preview -->
<div class="col-12 col-lg-4 col-xl-3"></div>
<div class="col-12 col-lg-8 col-xl-9">
<my-actor-avatar-edit [actor]="user.account" (avatarChange)="onAvatarChange($event)" (avatarDelete)="onAvatarDelete()"></my-actor-avatar-edit>
</div>
</div>
<div class="form-row"> <!-- profile settings grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-3"> <!-- profile settings grid -->
<div class="col-12 col-lg-4 col-xl-3">
<h2 i18n class="account-title">PROFILE SETTINGS</h2>
</div>
<div class="form-group col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<my-user-quota [user]="user" [userInformationLoaded]="userInformationLoaded"></my-user-quota>
@ -20,64 +21,64 @@
</div>
</div>
<div class="form-row mt-5"> <!-- interface grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-5"> <!-- interface grid -->
<div class="col-12 col-lg-4 col-xl-3">
<h2 i18n class="account-title">INTERFACE</h2>
</div>
<div class="form-group col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<my-user-interface-settings [user]="user" [userInformationLoaded]="userInformationLoaded"></my-user-interface-settings>
</div>
</div>
<div class="form-row mt-5"> <!-- video settings grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-5"> <!-- video settings grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div class="anchor" id="video-settings"></div> <!-- video settings anchor -->
<h2 i18n class="account-title">VIDEO SETTINGS</h2>
</div>
<div class="form-group col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<my-user-video-settings [user]="user" [userInformationLoaded]="userInformationLoaded"></my-user-video-settings>
</div>
</div>
<div class="form-row mt-5"> <!-- notifications grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-5"> <!-- notifications grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div class="anchor" id="notifications"></div> <!-- notifications anchor -->
<h2 i18n class="account-title">NOTIFICATIONS</h2>
</div>
<div class="form-group col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<my-account-notification-preferences [user]="user" [userInformationLoaded]="userInformationLoaded"></my-account-notification-preferences>
</div>
</div>
<div class="form-row mt-5" *ngIf="user.pluginAuth === null"> <!-- password grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-5" *ngIf="user.pluginAuth === null"> <!-- password grid -->
<div class="col-12 col-lg-4 col-xl-3">
<h2 i18n class="account-title">PASSWORD</h2>
</div>
<div class="form-group col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<my-account-change-password></my-account-change-password>
</div>
</div>
<div class="form-row mt-5"> <!-- email grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-5"> <!-- email grid -->
<div class="col-12 col-lg-4 col-xl-3">
<h2 i18n class="account-title">EMAIL</h2>
</div>
<div class="form-group col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<my-account-change-email></my-account-change-email>
</div>
</div>
<div class="form-row mt-5"> <!-- danger zone grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row mt-5"> <!-- danger zone grid -->
<div class="col-12 col-lg-4 col-xl-3">
<h2 i18n class="account-title account-title-danger">DANGER ZONE</h2>
</div>
<div class="form-group col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<my-account-danger-zone [user]="user"></my-account-danger-zone>
</div>
</div>

View File

@ -1,5 +1,6 @@
@use '_variables' as *;
@use '_mixins' as *;
@use '~bootstrap/scss/functions' as *;
.account-title {
@include settings-big-title;
@ -9,6 +10,6 @@
}
}
.form-group {
.row > div {
max-width: 500px;
}

View File

@ -1,4 +1,4 @@
<div class="row">
<div class="root">
<my-top-menu-dropdown [menuEntries]="menuEntries"></my-top-menu-dropdown>
<div class="margin-content pb-5" [ngClass]="{ 'offset-content': !isBroadcastMessageDisplayed }">

View File

@ -1,7 +1,7 @@
@use '_variables' as *;
@use '_mixins' as *;
.row {
.root {
@include sub-menu-h1;
flex-direction: column;

View File

@ -1,7 +1,7 @@
<h1>
<my-global-icon iconName="channel" aria-hidden="true"></my-global-icon>
<ng-container i18n>My channels</ng-container>
<span class="badge badge-secondary">{{ totalItems }}</span>
<span *ngIf="totalItems" class="pt-badge badge-secondary">{{ totalItems }}</span>
</h1>
<my-channels-setup-message [hideLink]="true"></my-channels-setup-message>

View File

@ -2,7 +2,7 @@
<span>
<my-global-icon iconName="follower" aria-hidden="true"></my-global-icon>
<ng-container i18n>My followers</ng-container>
<span class="badge badge-secondary"> {{ pagination.totalItems }}</span>
<span *ngIf="pagination.totalItems" class="pt-badge badge-secondary"> {{ pagination.totalItems }}</span>
</span>
</h1>

View File

@ -2,7 +2,7 @@
<span>
<my-global-icon iconName="subscriptions" aria-hidden="true"></my-global-icon>
<ng-container i18n>My subscriptions</ng-container>
<span class="badge badge-secondary"> {{ pagination.totalItems }}</span>
<span *ngIf="pagination.totalItems" class="pt-badge badge-secondary"> {{ pagination.totalItems }}</span>
</span>
</h1>

View File

@ -1,6 +1,7 @@
<h1>
<my-global-icon iconName="history" aria-hidden="true"></my-global-icon>
<ng-container i18n>My watch history</ng-container> <span class="badge badge-secondary">{{ pagination.totalItems }}</span>
<ng-container i18n>My watch history</ng-container>
<span *ngIf="pagination.totalItems" class="pt-badge badge-secondary">{{ pagination.totalItems }}</span>
</h1>
<div class="top-buttons">

View File

@ -1,4 +1,4 @@
<div class="row">
<div class="root">
<my-top-menu-dropdown [menuEntries]="menuEntries"></my-top-menu-dropdown>
<div class="margin-content pb-5" [ngClass]="{ 'offset-content': !isBroadcastMessageDisplayed }">

View File

@ -1,7 +1,7 @@
@use '_variables' as *;
@use '_mixins' as *;
.row {
.root {
@include sub-menu-h1;
flex-direction: column;

View File

@ -65,7 +65,7 @@
<td>{{ videoChangeOwnership.createdAt | date: 'short' }}</td>
<td>
<span class="badge"
<span class="pt-badge"
[ngClass]="getStatusClass(videoChangeOwnership.status)">{{ videoChangeOwnership.status }}</span>
</td>
</tr>

View File

@ -50,7 +50,7 @@
</td>
<td>
<span class="badge" [ngClass]="getVideoImportStateClass(videoImport.state.id)">
<span class="pt-badge" [ngClass]="getVideoImportStateClass(videoImport.state.id)">
{{ videoImport.state.label }}
</span>
</td>

View File

@ -20,13 +20,13 @@
<form role="form" (ngSubmit)="formValidated()" [formGroup]="form">
<div class="form-row"> <!-- playlist grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="row"> <!-- playlist grid -->
<div class="col-12 col-lg-4 col-xl-3">
<div *ngIf="isCreation()" class="video-playlist-title" i18n>NEW PLAYLIST</div>
<div *ngIf="!isCreation() && videoPlaylistToUpdate" class="video-playlist-title" i18n>PLAYLIST</div>
</div>
<div class="form-group col-12 col-lg-8 col-xl-9">
<div class="col-12 col-lg-8 col-xl-9">
<div class="col-md-12 col-xl-6">
<div class="form-group">
@ -88,7 +88,7 @@
</div>
</div>
<div class="form-row"> <!-- submit placement block -->
<div class="row"> <!-- submit placement block -->
<div class="col-md-7 col-xl-5"></div>
<div class="col-md-5 col-xl-5 d-inline-flex">
<input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">

View File

@ -1,6 +1,7 @@
<h1>
<my-global-icon iconName="playlists" aria-hidden="true"></my-global-icon>
<ng-container i18n>My playlists</ng-container> <span class="badge badge-secondary">{{ pagination.totalItems }}</span>
<ng-container i18n>My playlists</ng-container>
<span *ngIf="pagination.totalItems" class="pt-badge badge-secondary">{{ pagination.totalItems }}</span>
</h1>
<my-channels-setup-message></my-channels-setup-message>

View File

@ -17,7 +17,7 @@
</div>
<div class="modal-footer">
<div class="form-group inputs">
<div class="inputs">
<input
type="button" role="button" i18n-value value="Cancel" class="peertube-button grey-button"
(click)="dismiss()" (key.enter)="dismiss()"

View File

@ -4,7 +4,3 @@
p-autocomplete {
display: block;
}
.form-group {
margin: 20px 0;
}

View File

@ -2,7 +2,7 @@
<span>
<my-global-icon iconName="videos" aria-hidden="true"></my-global-icon>
<ng-container i18n>My videos</ng-container>
<span class="badge badge-secondary"> {{ pagination.totalItems }}</span>
<span *ngIf="pagination.totalItems" class="pt-badge badge-secondary"> {{ pagination.totalItems }}</span>
</span>
<div>

View File

@ -1,7 +1,7 @@
<div class="root">
<div *ngIf="status !== 403 && status !== 418" class="box">
<strong>{{ status }}.</strong>
<span class="ml-1 muted" i18n>That's an error.</span>
<span class="ms-1 muted" i18n>That's an error.</span>
<div class="text mt-4">
<ng-container *ngIf="type === 'video'" i18n>We couldn't find any video tied to the URL {{ pathname }} you were looking for.</ng-container>
@ -24,7 +24,7 @@
<div *ngIf="status === 403" class="box">
<strong>{{ status }}.</strong>
<span class="ml-1 muted" i18n>You are not authorized here.</span>
<span class="ms-1 muted" i18n>You are not authorized here.</span>
<div class="text mt-4">
<ng-container *ngIf="type === 'video'" i18n>You might need to check your account is allowed by the video or instance owner.</ng-container>
@ -34,7 +34,7 @@
<div *ngIf="status === 418" class="box">
<strong>{{ status }}.</strong>
<span class="ml-1 muted">I'm a teapot.</span>
<span class="ms-1 muted">I'm a teapot.</span>
<div class="text mt-4" i18n="Description of a tea flavour, keeping the 'requested entity body' as a technical expression referring to a web request">
The requested entity body blends sweet bits with a mellow earthiness.

View File

@ -77,7 +77,7 @@
</div>
<div class="row">
<div class="pl-0 col-sm-6">
<div class="ps-0 col-sm-6">
<input
(change)="onDurationOrPublishedUpdated()"
(keydown.enter)="$event.preventDefault()"
@ -87,7 +87,7 @@
class="form-control"
>
</div>
<div class="pr-0 col-sm-6">
<div class="pe-0 col-sm-6">
<input
(change)="onDurationOrPublishedUpdated()"
(keydown.enter)="$event.preventDefault()"

View File

@ -22,10 +22,6 @@ form {
margin-bottom: 1rem;
}
.form-group {
margin-bottom: 25px;
}
input[type=text] {
@include peertube-input-text(100%);
display: block;

View File

@ -2,22 +2,22 @@
<div class="results-header">
<div class="first-line">
<div class="results-counter" *ngIf="pagination.totalItems">
<span class="mr-1" i18n>{{ pagination.totalItems | myNumberFormatter }} {pagination.totalItems, plural, =1 {result} other {results}}</span>
<span class="me-1" i18n>{{ pagination.totalItems | myNumberFormatter }} {pagination.totalItems, plural, =1 {result} other {results}}</span>
<span class="mr-1" i18n *ngIf="advancedSearch.searchTarget === 'local'">on this instance</span>
<span class="mr-1" i18n *ngIf="advancedSearch.searchTarget === 'search-index'">on the vidiverse</span>
<span class="me-1" i18n *ngIf="advancedSearch.searchTarget === 'local'">on this instance</span>
<span class="me-1" i18n *ngIf="advancedSearch.searchTarget === 'search-index'">on the vidiverse</span>
<span *ngIf="currentSearch" i18n>for <span class="search-value">{{ currentSearch }}</span></span>
</div>
<div
class="results-filter-button ml-auto" (click)="isSearchFilterCollapsed = !isSearchFilterCollapsed" role="button"
class="results-filter-button ms-auto" (click)="isSearchFilterCollapsed = !isSearchFilterCollapsed" role="button"
[attr.aria-expanded]="!isSearchFilterCollapsed" aria-controls="collapseBasic"
>
<span class="icon icon-filter"></span>
<ng-container i18n>
Filters
<span *ngIf="numberOfFilters() > 0" class="badge badge-secondary">{{ numberOfFilters() }}</span>
<span *ngIf="numberOfFilters() > 0" class="pt-badge badge-secondary">{{ numberOfFilters() }}</span>
</ng-container>
</div>
</div>

View File

@ -6,7 +6,7 @@
(click)="onClick(i)"
>
<div class="step-index">
<ng-container *ngIf="!isCompleted(step)"><span class="sr-only" i18n>Step</span> {{ i + 1 }}</ng-container>
<ng-container *ngIf="!isCompleted(step)"><span class="visually-hidden" i18n>Step</span> {{ i + 1 }}</ng-container>
<my-global-icon *ngIf="isCompleted(step)" iconName="tick"></my-global-icon>
</div>

View File

@ -34,9 +34,7 @@
type="text" id="name" i18n-placeholder placeholder="Example: my_super_channel"
formControlName="name" [ngClass]="{ 'input-error': formErrors['name'] }"
>
<div class="input-group-append">
<span class="input-group-text">@{{ instanceHost }}</span>
</div>
<div class="input-group-text">@{{ instanceHost }}</div>
</div>
<div class="name-information" i18n>

View File

@ -1,8 +1,8 @@
<form role="form" [formGroup]="form">
<div class="form-group form-group-terms">
<div class="form-group">
<my-peertube-checkbox inputName="terms" formControlName="terms">
<ng-template ptTemplate="label">
<ng-container i18n>
<ng-container i18n>
I am at least {{ minimumAge }} years old and agree
to the <a class="terms-anchor" (click)="onTermsClick($event)" href='#'>Terms</a>
<ng-container *ngIf="hasCodeOfConduct"> and to the <a (click)="onCodeOfConductClick($event)" href='#'>Code of Conduct</a></ng-container>

View File

@ -27,9 +27,7 @@
type="text" id="username" i18n-placeholder="Username choice placeholder in the registration form" placeholder="e.g. jane_doe"
formControlName="username" class="form-control" [ngClass]="{ 'input-error': formErrors['username'] }"
>
<div class="input-group-append">
<span class="input-group-text">@{{ instanceHost }}</span>
</div>
<span class="input-group-text">@{{ instanceHost }}</span>
</div>
<div class="name-information" i18n>

View File

@ -29,22 +29,6 @@
}
}
.form-group-terms {
margin: 30px 0;
}
.input-group {
@include peertube-input-group(100%);
}
.input-group-append {
height: 30px;
}
.form-group-terms {
width: 100% !important;
}
input:not([type=submit]) {
@include peertube-input-text(100%);
display: block;

View File

@ -33,10 +33,6 @@ my-peertube-checkbox {
height: 100%;
min-height: 300px;
.form-group {
margin-bottom: 25px;
}
input {
@include peertube-input-text(100%);
display: block;
@ -45,10 +41,6 @@ my-peertube-checkbox {
.label-tags + span {
font-size: 15px;
}
.advanced-settings .form-group {
margin-bottom: 20px;
}
}
.captions-header {

View File

@ -1,6 +1,6 @@
<div class="margin-content">
<div class="title-page title-page-single">
<span class="mr-1" i18n>Update</span>
<span class="me-1" i18n>Update</span>
<a [routerLink]="getVideoUrl()">{{ video?.name }}</a>
</div>

View File

@ -2,7 +2,7 @@
<div class="avatar-and-textarea">
<my-actor-avatar [account]="user?.account" size="25"></my-actor-avatar>
<div class="form-group">
<div class="textarea-wrapper">
<textarea i18n-placeholder placeholder="Add comment..." myAutoResize
[readonly]="(user === null) ? true : false"
(click)="openVisitorModal($event)"

View File

@ -17,9 +17,8 @@ form {
@include margin-right(10px);
}
.form-group {
.textarea-wrapper {
flex-grow: 1;
margin: 0;
position: relative;
}

View File

@ -16,7 +16,7 @@
{{ comment.account.displayName }}
</span>
<span class="comment-account-fid ml-1">{{ comment.by }}</span>
<span class="comment-account-fid ms-1">{{ comment.by }}</span>
</a>
</div>

View File

@ -6,7 +6,7 @@
<my-feed [syndicationItems]="syndicationItems"></my-feed>
<div ngbDropdown class="d-inline-block ml-4 dropdown-root">
<div ngbDropdown class="d-inline-block ms-4 dropdown-root">
<button class="btn btn-sm btn-outline-secondary" id="dropdown-sort-comments" ngbDropdownToggle i18n>
SORT BY
</button>
@ -80,7 +80,7 @@
<ng-template i18n #noAuthorComments>View {comment.totalReplies, plural, =1 {1 reply} other {{{ comment.totalReplies }} replies}}</ng-template>
<my-small-loader class="comment-thread-loading ml-1" [loading]="threadLoading[comment.id]"></my-small-loader>
<my-small-loader class="comment-thread-loading ms-1" [loading]="threadLoading[comment.id]"></my-small-loader>
</div>
</my-video-comment>

View File

@ -1,6 +1,6 @@
<div class="privacy-concerns" *ngIf="display">
<div class="privacy-concerns-text">
<span class="mr-2">
<span class="me-2">
<strong i18n>Friendly Reminder: </strong>
<ng-container i18n>
the sharing system used for this video implies that some technical information about your system (such as a public IP address) can be sent to other peers.

View File

@ -6,9 +6,9 @@
<div class="playlist-display-name">
{{ playlist.displayName }}
<span *ngIf="isUnlistedPlaylist()" class="badge badge-warning" i18n>Unlisted</span>
<span *ngIf="isPrivatePlaylist()" class="badge badge-danger" i18n>Private</span>
<span *ngIf="isPublicPlaylist()" class="badge badge-info" i18n>Public</span>
<span *ngIf="isUnlistedPlaylist()" class="pt-badge badge-warning" i18n>Unlisted</span>
<span *ngIf="isPrivatePlaylist()" class="pt-badge badge-danger" i18n>Private</span>
<span *ngIf="isPublicPlaylist()" class="pt-badge badge-info" i18n>Public</span>
</div>
<div class="playlist-by-index">

View File

@ -15,43 +15,47 @@
.playlist-info {
padding: 5px 30px;
background-color: pvar(--greyBackgroundColor);
}
.playlist-display-name {
font-size: 18px;
font-weight: $font-semibold;
margin-bottom: 5px;
.playlist-display-name {
font-size: 18px;
font-weight: $font-semibold;
margin-bottom: 5px;
.pt-badge {
@include margin-left(5px);
}
}
.playlist-by-index {
color: pvar(--greyForegroundColor);
display: flex;
.playlist-by {
@include margin-right(5px);
}
.playlist-by-index {
color: pvar(--greyForegroundColor);
display: flex;
.playlist-index span:first-child::after {
content: '/';
margin: 0 3px;
}
}
.playlist-by {
@include margin-right(5px);
}
.playlist-controls {
display: flex;
margin: 10px 0;
.playlist-index span:first-child::after {
content: '/';
margin: 0 3px;
}
my-global-icon:not(:last-child) {
@include margin-right(.5rem);
}
.playlist-controls {
display: flex;
margin: 10px 0;
my-global-icon:not(:last-child) {
@include margin-right(.5rem);
my-global-icon {
&:not(.active) {
opacity: .5;
}
my-global-icon {
&:not(.active) {
opacity: .5;
}
::ng-deep {
cursor: pointer;
}
::ng-deep {
cursor: pointer;
}
}
}

View File

@ -61,7 +61,7 @@
<div class="video-info-channel-left d-flex">
<my-video-avatar-channel [video]="video" [showChannel]="!isChannelDisplayNameGeneric()"></my-video-avatar-channel>
<div class="video-info-channel-left-links ml-1">
<div class="video-info-channel-left-links ms-1">
<ng-container *ngIf="!isChannelDisplayNameGeneric()">
<a [routerLink]="[ '/c', video.byVideoChannel ]" i18n-title title="Channel page">
{{ video.channel.displayName }}

View File

@ -1,4 +1,4 @@
<h1 class="sr-only" i18n>Discover</h1>
<h1 class="visually-hidden" i18n>Discover</h1>
<div class="margin-content">
<div class="no-results" i18n *ngIf="notResults">No results.</div>

View File

@ -25,7 +25,7 @@
<div class="d-flex justify-content-between">
<label class="small-title" i18n>GLOBAL SEARCH</label>
<div class="advanced-search-status muted">
<span *ngIf="serverConfig" class="mr-1" i18n>using {{ serverConfig.search.searchIndex.url }}</span>
<span *ngIf="serverConfig" class="me-1" i18n>using {{ serverConfig.search.searchIndex.url }}</span>
<i class="glyphicon glyphicon-globe"></i>
</div>
</div>
@ -39,8 +39,8 @@
<label class="small-title" i18n>ADVANCED SEARCH</label>
<div class="advanced-search-status c-help">
<span [ngClass]="canSearchAnyURI ? 'text-success' : 'muted'" i18n-title title="Determines whether you can resolve any distant content, or if this instance only allows doing so for instances it follows.">
<span *ngIf="canSearchAnyURI()" class="mr-1" i18n>any instance</span>
<span *ngIf="!canSearchAnyURI()" class="mr-1" i18n>only followed instances</span>
<span *ngIf="canSearchAnyURI()" class="me-1" i18n>any instance</span>
<span *ngIf="!canSearchAnyURI()" class="me-1" i18n>only followed instances</span>
<i [ngClass]="canSearchAnyURI() ? 'glyphicon glyphicon-ok-sign' : 'glyphicon glyphicon-exclamation-sign'"></i>
</span>
</div>

View File

@ -1,16 +1,16 @@
<a tabindex="-1" class="d-flex flex-auto flex-items-center p-2" [class.focus-visible]="active">
<div class="flex-shrink-0 mr-2 text-center">
<div class="flex-shrink-0 me-2 text-center">
<my-global-icon iconName="search"></my-global-icon>
</div>
<img class="avatar mr-2 flex-shrink-0 d-none" alt="" aria-label="Team" src="" width="28" height="28">
<img class="avatar me-2 flex-shrink-0 d-none" alt="" aria-label="Team" src="" width="28" height="28">
<div
class="flex-auto overflow-hidden text-left no-wrap css-truncate css-truncate-target"
class="flex-auto overflow-hidden text-start no-wrap css-truncate css-truncate-target"
[attr.aria-label]="result.text" [innerHTML]="result.text | highlight : highlight"
></div>
<div class="border rounded flex-shrink-0 px-1 bg-gray text-gray-light ml-1 f6">
<div class="border rounded flex-shrink-0 px-1 bg-gray text-gray-light ms-1 f6">
<span *ngIf="result.type === 'search-instance'" i18n>In this instance's network</span>
<span *ngIf="result.type === 'search-index'" i18n>In the vidiverse</span>
</div>

View File

@ -36,14 +36,14 @@
>
<my-global-icon iconName="language" aria-hidden="true"></my-global-icon>
<span i18n>Interface:</span>
<span class="ml-auto muted">{{ currentInterfaceLanguage }}</span>
<span class="ms-auto muted">{{ currentInterfaceLanguage }}</span>
</a>
<a ngbDropdownItem ngbDropdownToggle class="dropdown-item" routerLink="/my-account/settings" fragment="video-languages-subtitles"
#settingsLanguagesSubtitles (click)="onActiveLinkScrollToAnchor(settingsLanguagesSubtitles)">
<my-global-icon iconName="video-lang" aria-hidden="true"></my-global-icon>
<span i18n>Videos:</span>
<span class="ml-auto muted">{{ videoLanguages.join(', ') }}</span>
<span class="ms-auto muted">{{ videoLanguages.join(', ') }}</span>
</a>
<a ngbDropdownItem ngbDropdownToggle class="dropdown-item settings-sensitive" routerLink="/my-account/settings"
@ -53,14 +53,14 @@
<my-global-icon class="hover-display-toggle" [hidden]="user.nsfwPolicy === 'display'" iconName="sensitive" aria-hidden="true"></my-global-icon>
<my-global-icon class="hover-display-toggle" [hidden]="user.nsfwPolicy !== 'display'" iconName="unsensitive" aria-hidden="true"></my-global-icon>
<span i18n>Sensitive:</span>
<span class="ml-auto muted">{{ nsfwPolicy }}</span>
<span class="ms-auto muted">{{ nsfwPolicy }}</span>
</a>
<a ngbDropdownItem class="dropdown-item" (click)="toggleUseP2P()">
<my-global-icon iconName="p2p" aria-hidden="true"></my-global-icon>
<ng-container i18n>Help share videos</ng-container>
<my-input-switch class="ml-auto" [checked]="user.p2pEnabled"></my-input-switch>
<my-input-switch class="ms-auto" [checked]="user.p2pEnabled"></my-input-switch>
</a>
<div class="dropdown-divider"></div>
@ -149,7 +149,7 @@
<div class="footer-copyleft">
<small class="d-inline" i18n-title title="powered by PeerTube - CopyLeft 2015-2022">
<a href="https://joinpeertube.org" class="mr-1" target="_blank" rel="noopener noreferrer" i18n>powered by PeerTube</a>
<a href="https://joinpeertube.org" class="me-1" target="_blank" rel="noopener noreferrer" i18n>powered by PeerTube</a>
<a href="https://github.com/Chocobozzz/PeerTube/blob/develop/LICENSE" target="_blank" rel="noopener noreferrer">
<span aria-label="copyleft" class="d-inline-block" style="transform: rotateY(180deg)">&copy;</span> 2015-2022

View File

@ -24,7 +24,7 @@
<div>
<button
*ngIf="unreadNotifications"
i18n-title title="Mark all as read" class="glyphicon glyphicon-ok mr-2"
i18n-title title="Mark all as read" class="glyphicon glyphicon-ok me-2"
(click)="markAllAsRead()"
></button>
<a
@ -45,7 +45,7 @@
></my-user-notifications>
<a *ngIf="loaded" class="all-notifications" routerLink="/my-account/notifications" #notifications (click)="onNavigate(notifications)">
<my-global-icon class="mr-1" iconName="bell" aria-hidden="true"></my-global-icon>
<my-global-icon class="me-1" iconName="bell" aria-hidden="true"></my-global-icon>
<span i18n>See all your notifications</span>
</a>
</div>

View File

@ -9,7 +9,7 @@
<div class="modal-body" >
<div [innerHtml]="message"></div>
<div *ngIf="inputLabel && expectedInputValue" class="form-group">
<div *ngIf="inputLabel && expectedInputValue" class="form-group mt-3">
<label for="confirmInput">{{ inputLabel }}</label>
<input type="text" id="confirmInput" name="confirmInput" [(ngModel)]="inputValue" />
</div>

View File

@ -13,7 +13,3 @@ input[type=text] {
@include peertube-input-text(100%);
display: block;
}
.form-group {
margin: 20px 0;
}

View File

@ -17,9 +17,9 @@
</a>
<a [routerLink]="[ '.' ]" [queryParams]="{ 'search': 'reporter:&quot;' + abuse.reporterAccount.displayName + '&quot;' }"
class="ml-auto muted abuse-details-links" i18n
class="ms-auto muted abuse-details-links" i18n
>
{abuse.countReportsForReporter, plural, =1 {1 report} other {{{ abuse.countReportsForReporter }} reports}}<span class="ml-1 glyphicon glyphicon-flag"></span>
{abuse.countReportsForReporter, plural, =1 {1 report} other {{{ abuse.countReportsForReporter }} reports}}<span class="ms-1 glyphicon glyphicon-flag"></span>
</a>
</span>
</div>
@ -37,9 +37,9 @@
</a>
<a *ngIf="isAdminView" [routerLink]="[ '.' ]" [queryParams]="{ 'search': 'reportee:&quot;' +abuse.flaggedAccount.displayName + '&quot;' }"
class="ml-auto muted abuse-details-links" i18n
class="ms-auto muted abuse-details-links" i18n
>
{abuse.countReportsForReportee, plural, =1 {1 report} other {{{ abuse.countReportsForReportee }} reports}}<span class="ml-1 glyphicon glyphicon-flag"></span>
{abuse.countReportsForReportee, plural, =1 {1 report} other {{{ abuse.countReportsForReportee }} reports}}<span class="ms-1 glyphicon glyphicon-flag"></span>
</a>
</span>
</div>
@ -53,7 +53,7 @@
<div class="mt-3 d-flex">
<span class="moderation-expanded-label">
<ng-container i18n>Report</ng-container>
<a [routerLink]="[ '.' ]" [queryParams]="{ 'search': '#' + abuse.id }" class="ml-1 muted">#{{ abuse.id }}</a>
<a [routerLink]="[ '.' ]" [queryParams]="{ 'search': '#' + abuse.id }" class="ms-1 muted">#{{ abuse.id }}</a>
</span>
<span class="moderation-expanded-text" [innerHTML]="abuse.reasonHtml"></span>
</div>

View File

@ -8,7 +8,7 @@
>
<ng-template pTemplate="caption">
<div class="caption">
<div class="ml-auto">
<div class="ms-auto">
<my-advanced-input-filter [filters]="inputFilters" (search)="onSearch($event)"></my-advanced-input-filter>
</div>
</div>

View File

@ -6,7 +6,7 @@
<div *ngIf="editable && !hasAvatar()" class="actor-img-edit-button" [ngbTooltip]="avatarFormat" placement="right" container="body">
<my-global-icon iconName="upload"></my-global-icon>
<label class="sr-only" for="avatarfile" i18n>Upload a new avatar</label>
<label class="visually-hidden" for="avatarfile" i18n>Upload a new avatar</label>
<input #avatarfileInput type="file" name="avatarfile" id="avatarfile" [accept]="avatarExtensions" (change)="onAvatarChange(avatarfileInput)"/>
</div>
@ -15,7 +15,7 @@
#avatarPopover="ngbPopover" [ngbPopover]="avatarEditContent" popoverClass="popover-image-info" autoClose="outside" placement="right"
>
<my-global-icon iconName="edit"></my-global-icon>
<label class="sr-only" for="avatarMenu" i18n>Change your avatar</label>
<label class="visually-hidden" for="avatarMenu" i18n>Change your avatar</label>
</div>
</div>

View File

@ -3,35 +3,35 @@
.actor {
display: flex;
}
my-actor-avatar {
@include margin-right(15px);
my-actor-avatar {
@include margin-right(15px);
}
.actor-info {
display: inline-flex;
flex-direction: column;
}
.actor-info-display-name {
font-size: 20px;
font-weight: $font-bold;
@media screen and (max-width: $small-view) {
font-size: 16px;
}
}
.actor-info {
display: inline-flex;
flex-direction: column;
.actor-info-username {
position: relative;
font-size: 14px;
color: pvar(--greyForegroundColor);
}
.actor-info-display-name {
font-size: 20px;
font-weight: $font-bold;
@media screen and (max-width: $small-view) {
font-size: 16px;
}
}
.actor-info-username {
position: relative;
font-size: 14px;
color: pvar(--greyForegroundColor);
}
.actor-info-followers {
font-size: 15px;
padding-bottom: .5rem;
}
}
.actor-info-followers {
font-size: 15px;
padding-bottom: .5rem;
}
.actor-img-edit-container {

View File

@ -1,6 +1,7 @@
<div class="input-group has-feedback has-clear">
<div *ngIf="hasFilters()" class="input-group-prepend c-hand" ngbDropdown placement="bottom-left auto" container="body">
<div class="input-group-text" ngbDropdownToggle>
<div class="input-group has-clear" ngbDropdown placement="bottom-left auto" container="body">
<ng-container *ngIf="hasFilters()">
<div class="input-group-text c-hand" ngbDropdownToggle>
<span class="caret" aria-haspopup="menu" role="button"></span>
</div>
@ -15,14 +16,14 @@
</button>
</ng-container>
</div>
</div>
</ng-container>
<input
type="text" name="table-filter" id="table-filter" i18n-placeholder placeholder="Filter..."
class="last-in-group"
[(ngModel)]="searchValue"
(keyup)="onInputSearch($event)"
>
<a class="glyphicon glyphicon-remove-sign form-control-feedback form-control-clear" (click)="onResetTableFilter()"></a>
<span class="sr-only" i18n>Clear filters</span>
<a class="glyphicon glyphicon-remove-sign form-control-clear" title="Clear filter" i18n-title (click)="onResetTableFilter()"></a>
</div>

View File

@ -23,7 +23,6 @@ my-global-icon {
width: 18px;
height: 18px;
&.no-visible {
@include margin-right($size + $margin);

View File

@ -1,4 +1,4 @@
<div (click)="update()">
<input type="checkbox" [checked]="checked"/>
<label class="ml-auto">Toggle</label>
<label class="ms-auto">Toggle</label>
</div>

View File

@ -1,21 +1,19 @@
<div class="input-group input-group-sm">
<div class="input-group">
<input
[id]="inputId" [autocomplete]="autocomplete" [value]="value" [placeholder]="placeholder" [tabindex]="tabindex"
[(ngModel)]="value" (ngModelChange)="update()" [readonly]="readonly"
#input (click)="input.select()" (input)="update()" (change)="update()" [type]="inputType" class="form-control"
/>
<div *ngIf="withToggle || withCopy" class="input-group-append">
<button *ngIf="withToggle" (click)="toggle()" type="button" class="btn btn-outline-secondary eye-button" [title]="toggleTitle">
<span class="glyphicon glyphicon-eye-{{ show ? 'open' : 'close' }}"></span>
</button>
<button *ngIf="withToggle" (click)="toggle()" type="button" class="btn btn-outline-secondary eye-button" [title]="toggleTitle">
<span class="glyphicon glyphicon-eye-{{ show ? 'open' : 'close' }}"></span>
</button>
<button
*ngIf="withCopy" [cdkCopyToClipboard]="input.value" (click)="activateCopiedMessage()" type="button"
class="btn btn-outline-secondary text-uppercase" i18n-title title="Copy"
>
<span class="glyphicon glyphicon-duplicate"></span>
Copy
</button>
</div>
<button
*ngIf="withCopy" [cdkCopyToClipboard]="input.value" (click)="activateCopiedMessage()" type="button"
class="btn btn-outline-secondary text-uppercase" i18n-title title="Copy"
>
<span class="glyphicon glyphicon-duplicate"></span>
<span class="copy-text">Copy</span>
</button>
</div>

View File

@ -5,11 +5,14 @@ input {
@include peertube-input-text(auto);
@include padding-left(15px !important);
@include padding-right(15px !important);
// set again properties of peertube-input-text that are overridden by .input-group
font-size: 15px !important;
}
.eye-button {
line-height: 1 !important;
.btn {
font-size: 15px;
}
.copy-text {
font-size: 14px;
margin-left: 5px;
vertical-align: top;
}

View File

@ -1,6 +1,6 @@
<div class="root flex-column">
<div class="d-flex">
<label class="form-group-checkbox">
<label>
<input
type="checkbox"
[(ngModel)]="checked"
@ -33,7 +33,7 @@
<div *ngIf="recommended" class="recommended" i18n>Recommended</div>
</div>
<div class="ml-4 d-flex flex-column">
<div class="ms-4 d-flex flex-column">
<small class="wrapper mt-2 muted">
<ng-content select="description"></ng-content>
</small>

View File

@ -4,7 +4,7 @@
.root {
display: flex;
.form-group-checkbox {
label {
display: flex;
align-items: center;

View File

@ -7,7 +7,7 @@
[searchable]="searchable"
>
<ng-option *ngFor="let channel of channels" [value]="channel.id">
<img alt="" class="avatar mr-1" [src]="channel.avatarPath" />
<img alt="" class="avatar me-1" [src]="channel.avatarPath" />
{{ channel.label }}
</ng-option>
</ng-select>

View File

@ -22,7 +22,7 @@
>
<ng-template ng-optgroup-tmp let-item="item" let-item$="item$" let-index="index">
<div class="form-group-checkbox">
<div class="checkbox-wrapper">
<input id="item-{{index}}" type="checkbox" [ngModel]="item$.selected"/>
<span role="checkbox" [attr.aria-checked]="item$.selected"></span>
<span>{{ item.group }}</span>
@ -30,7 +30,7 @@
</ng-template>
<ng-template ng-option-tmp let-item="item" let-item$="item$" let-index="index">
<div class="form-group-checkbox">
<div class="checkbox-wrapper">
<input id="item-{{index}}" type="checkbox" [ngModel]="item$.selected"/>
<span role="checkbox" [attr.aria-checked]="item$.selected"></span>
<span>{{ item.label }}</span>

View File

@ -7,7 +7,7 @@ ng-select ::ng-deep {
align-items: center;
}
.form-group-checkbox {
.checkbox-wrapper {
display: flex;
align-items: center;

View File

@ -16,26 +16,3 @@
font-size: 15px;
margin-bottom: 15px;
}
ngb-accordion ::ng-deep {
.card {
border-color: var(--mainBackgroundColor);
.card-header {
background-color: unset;
padding: 0;
+ .collapse.show {
background-color: var(--submenuBackgroundColor);
}
}
}
.btn {
@include peertube-button;
@include grey-button;
border-radius: unset;
width: 100%;
}
}

View File

@ -1,6 +1,6 @@
<div *ngIf="serverConfig" class="feature-table">
<table class="table" *ngIf="serverConfig">
<table *ngIf="serverConfig">
<caption i18n>Features found on this instance</caption>
<tr>
<th i18n class="label" scope="row">PeerTube version</th>

View File

@ -4,6 +4,7 @@
table {
font-size: 14px;
color: pvar(--mainForegroundColor);
width: 100%;
.label,
.sub-label {
@ -24,8 +25,10 @@ table {
}
}
th,
td {
vertical-align: middle;
padding: 0.75rem;
border-top: 1px solid #dee2e6;
}
caption {

View File

@ -1,5 +1,5 @@
<div class="root">
<div class="input-group has-feedback has-clear">
<div class="input-group has-clear">
<input
#ref
type="text"
@ -10,8 +10,7 @@
[placeholder]="placeholder"
>
<a class="glyphicon glyphicon-remove-sign form-control-feedback form-control-clear" (click)="onResetFilter()"></a>
<span class="sr-only" i18n>Clear filters</span>
<a class="glyphicon glyphicon-remove-sign form-control-clear" title="Clear filter" i18n-title (click)="onResetFilter()"></a>
</div>
<my-global-icon iconName="search" aria-label="Search" role="button" (click)="onIconClick()" [title]="iconTitle"></my-global-icon>

View File

@ -1,4 +1,4 @@
<span *ngIf="account.mutedByUser" class="badge badge-danger" i18n>Muted</span>
<span *ngIf="account.mutedServerByUser" class="badge badge-danger" i18n>Instance muted</span>
<span *ngIf="account.mutedByInstance" class="badge badge-danger" i18n>Muted by your instance</span>
<span *ngIf="account.mutedServerByInstance" class="badge badge-danger" i18n>Instance muted by your instance</span>
<span *ngIf="account.mutedByUser" class="pt-badge badge-danger" i18n>Muted</span>
<span *ngIf="account.mutedServerByUser" class="pt-badge badge-danger" i18n>Instance muted</span>
<span *ngIf="account.mutedByInstance" class="pt-badge badge-danger" i18n>Muted by your instance</span>
<span *ngIf="account.mutedServerByInstance" class="pt-badge badge-danger" i18n>Instance muted by your instance</span>

Some files were not shown because too many files have changed in this diff Show More