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

View File

@ -1,5 +1,6 @@
<div class="row"> <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"> <div class="col-xl-6 col-md-12">
<h2 i18n class="subtitle">Follower instances ({{ followersPagination.totalItems }})</h2> <h2 i18n class="subtitle">Follower instances ({{ followersPagination.totalItems }})</h2>

View File

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

View File

@ -8,9 +8,9 @@
</div> </div>
<div class="instance-badges" *ngIf="categories.length !== 0 || languages.length !== 0"> <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>
<div class="short-description"> <div class="short-description">
@ -204,7 +204,7 @@
</div> </div>
<div class="col-md-12 col-xl-6" myPluginSelector pluginSelectorId="about-instance-features"> <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> <my-instance-features-table></my-instance-features-table>
</div> </div>

View File

@ -19,18 +19,11 @@
} }
.instance-badges { .instance-badges {
font-size: 16px;
margin-bottom: 20px; margin-bottom: 20px;
font-size: 16px;
.badge { .pt-badge {
@include margin-right(5px); @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="sub-menu" [ngClass]="{ 'sub-menu-fixed': !isBroadcastMessageDisplayed }">
<div class="links"> <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"> <div class="margin-content">

View File

@ -18,7 +18,7 @@
(userChanged)="onUserChanged()" (userDeleted)="onUserDeleted()" (userChanged)="onUserChanged()" (userDeleted)="onUserDeleted()"
></my-user-moderation-dropdown> ></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> <my-account-block-badges [account]="account"></my-account-block-badges>
</div> </div>

View File

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

View File

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

View File

@ -1,13 +1,13 @@
<ng-container [formGroup]="form"> <ng-container [formGroup]="form">
<div class="form-row mt-5"> <!-- appearance grid --> <div class="row mt-5"> <!-- appearance grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">APPEARANCE</div> <div i18n class="inner-form-title">APPEARANCE</div>
<div i18n class="inner-form-description"> <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>. 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> </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"> <ng-container formGroupName="theme">
<div class="form-group"> <div class="form-group">
@ -88,15 +88,15 @@
</div> </div>
</div> </div>
<div class="form-row mt-4"> <!-- broadcast grid --> <div class="row mt-4"> <!-- broadcast grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">BROADCAST MESSAGE</div> <div i18n class="inner-form-title">BROADCAST MESSAGE</div>
<div i18n class="inner-for-description"> <div i18n class="inner-for-description">
Display a message on your instance Display a message on your instance
</div> </div>
</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"> <ng-container formGroupName="broadcastMessage">
@ -144,15 +144,15 @@
</div> </div>
</div> </div>
<div class="form-row mt-4"> <!-- new users grid --> <div class="row mt-4"> <!-- new users grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">NEW USERS</div> <div i18n class="inner-form-title">NEW USERS</div>
<div i18n class="inner-for-description"> <div i18n class="inner-for-description">
Manage <a routerLink="/admin/users">users</a> to set their quota individually. Manage <a routerLink="/admin/users">users</a> to set their quota individually.
</div> </div>
</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"> <ng-container formGroupName="signup">
<div class="form-group"> <div class="form-group">
@ -239,20 +239,20 @@
</div> </div>
</div> </div>
<div class="form-row mt-4"> <!-- videos grid --> <div class="row mt-4"> <!-- videos grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">VIDEOS</div> <div i18n class="inner-form-title">VIDEOS</div>
</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="import">
<ng-container formGroupName="videos"> <ng-container formGroupName="videos">
<div class="form-group mt-4"> <div class="form-group">
<label i18n for="importConcurrency">Import jobs concurrency</label> <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"> <div class="number-with-unit">
<input type="number" name="importConcurrency" formControlName="concurrency" /> <input type="number" name="importConcurrency" formControlName="concurrency" />
@ -309,12 +309,12 @@
</div> </div>
</div> </div>
<div class="form-row mt-4"> <!-- video channels grid --> <div class="row mt-4"> <!-- video channels grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">VIDEO CHANNELS</div> <div i18n class="inner-form-title">VIDEO CHANNELS</div>
</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"> <div class="form-group" formGroupName="videoChannels">
<label i18n for="videoChannelsMaxPerUser">Max video channels per user</label> <label i18n for="videoChannelsMaxPerUser">Max video channels per user</label>
@ -331,12 +331,12 @@
</div> </div>
</div> </div>
<div class="form-row mt-4"> <!-- search grid --> <div class="row mt-4"> <!-- search grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">SEARCH</div> <div i18n class="inner-form-title">SEARCH</div>
</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="search">
<ng-container formGroupName="remoteUri"> <ng-container formGroupName="remoteUri">
@ -420,15 +420,15 @@
</div> </div>
</div> </div>
<div class="form-row mt-4"> <!-- federation grid --> <div class="row mt-4"> <!-- federation grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">FEDERATION</div> <div i18n class="inner-form-title">FEDERATION</div>
<div i18n class="inner-form-description"> <div i18n class="inner-form-description">
Manage <a routerLink="/admin/follows">relations</a> with other instances. Manage <a routerLink="/admin/follows">relations</a> with other instances.
</div> </div>
</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="followers">
<ng-container formGroupName="instance"> <ng-container formGroupName="instance">
@ -499,12 +499,12 @@
</div> </div>
</div> </div>
<div class="form-row mt-4"> <!-- administrators grid --> <div class="row mt-4"> <!-- administrators grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">ADMINISTRATORS</div> <div i18n class="inner-form-title">ADMINISTRATORS</div>
</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"> <div class="form-group" formGroupName="admin">
<label i18n for="adminEmail">Admin email</label> <label i18n for="adminEmail">Admin email</label>
@ -527,8 +527,8 @@
</div> </div>
</div> </div>
<div class="form-row mt-4"> <!-- Twitter grid --> <div class="row mt-4"> <!-- Twitter grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">TWITTER</div> <div i18n class="inner-form-title">TWITTER</div>
<div i18n class="inner-form-description"> <div i18n class="inner-form-description">
Provide the Twitter account representing your instance to improve link previews. Provide the Twitter account representing your instance to improve link previews.
@ -536,7 +536,7 @@
</div> </div>
</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="services">
<ng-container formGroupName="twitter"> <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> <div class="alert alert-warning" *ngIf="!isUpdateAllowed()" i18n>
Updating instance configuration from the web interface is disabled by the system administrator. Updating instance configuration from the web interface is disabled by the system administrator.
@ -64,7 +64,7 @@
<div [ngbNavOutlet]="nav"></div> <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-7 col-xl-5"></div>
<div class="col-md-5 col-xl-5"> <div class="col-md-5 col-xl-5">

View File

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

View File

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

View File

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

View File

@ -1,14 +1,14 @@
<ng-container [formGroup]="form"> <ng-container [formGroup]="form">
<div class="form-row mt-5"> <div class="row mt-5">
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">LIVE</div> <div i18n class="inner-form-title">LIVE</div>
<div i18n class="inner-form-description"> <div i18n class="inner-form-description">
Enable users of your instance to stream live. Enable users of your instance to stream live.
</div> </div>
</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="live">
@ -89,15 +89,15 @@
</div> </div>
</div> </div>
<div class="form-row"> <!-- transcoding live streams grid --> <div class="row"> <!-- transcoding live streams grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">TRANSCODING</div> <div i18n class="inner-form-title">TRANSCODING</div>
<div i18n class="inner-form-description"> <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. 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> </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="live">
<ng-container formGroupName="transcoding"> <ng-container formGroupName="transcoding">
@ -115,7 +115,7 @@
<div class="form-group" [ngClass]="getDisabledLiveTranscodingClass()"> <div class="form-group" [ngClass]="getDisabledLiveTranscodingClass()">
<label i18n for="liveTranscodingThreads">Live resolutions to generate</label> <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"> <ng-container formGroupName="resolutions">
<div class="form-group" *ngFor="let resolution of liveResolutions"> <div class="form-group" *ngFor="let resolution of liveResolutions">
@ -136,7 +136,7 @@
<div class="form-group" [ngClass]="getDisabledLiveTranscodingClass()"> <div class="form-group" [ngClass]="getDisabledLiveTranscodingClass()">
<label i18n for="liveTranscodingThreads">Live transcoding threads</label> <label i18n for="liveTranscodingThreads">Live transcoding threads</label>
<span class="muted ml-1"> <span class="muted ms-1">
<ng-container *ngIf="getTotalTranscodingThreads().atMost" i18n> <ng-container *ngIf="getTotalTranscodingThreads().atMost" i18n>
will claim at most {{ getTotalTranscodingThreads().value }} {{ getTotalTranscodingThreads().unit }} with VOD transcoding will claim at most {{ getTotalTranscodingThreads().value }} {{ getTotalTranscodingThreads().unit }} with VOD transcoding
</ng-container> </ng-container>
@ -157,7 +157,7 @@
<div class="form-group mt-4" [ngClass]="getDisabledLiveTranscodingClass()"> <div class="form-group mt-4" [ngClass]="getDisabledLiveTranscodingClass()">
<label i18n for="liveTranscodingProfile">Live transcoding profile</label> <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 <my-select-options
id="liveTranscodingProfile" id="liveTranscodingProfile"

View File

@ -1,8 +1,8 @@
<ng-container [formGroup]="form"> <ng-container [formGroup]="form">
<div class="form-row mt-4"> <!-- transcoding grid --> <div class="row mt-4"> <!-- transcoding grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"></div> <div class="col-12 col-lg-4 col-xl-3"></div>
<div class="form-group form-group-right col-12 col-lg-8"> <div class="col-12 col-lg-8">
<div class="callout callout-info"> <div class="callout callout-info">
<span i18n> <span i18n>
@ -21,8 +21,8 @@
</div> </div>
</div> </div>
<div class="form-row mt-2"> <!-- transcoding grid --> <div class="row mt-4"> <!-- transcoding grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">TRANSCODING</div> <div i18n class="inner-form-title">TRANSCODING</div>
<div i18n class="inner-form-description"> <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 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> </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"> <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"> <my-peertube-checkbox inputName="transcodingEnabled" formControlName="enabled" [recommended]="true">
<ng-template ptTemplate="label"> <ng-template ptTemplate="label">
<ng-container i18n>Transcoding enabled</ng-container> <ng-container i18n>Transcoding enabled</ng-container>
@ -115,7 +115,7 @@
<div class="form-group" [ngClass]="getTranscodingDisabledClass()"> <div class="form-group" [ngClass]="getTranscodingDisabledClass()">
<label i18n>Resolutions to generate per enabled format</label> <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"> <ng-container formGroupName="resolutions">
<div class="form-group" *ngFor="let resolution of resolutions"> <div class="form-group" *ngFor="let resolution of resolutions">
<my-peertube-checkbox <my-peertube-checkbox
@ -142,7 +142,7 @@
<div class="form-group mt-4" [ngClass]="getTranscodingDisabledClass()"> <div class="form-group mt-4" [ngClass]="getTranscodingDisabledClass()">
<label i18n for="transcodingThreads">Transcoding threads</label> <label i18n for="transcodingThreads">Transcoding threads</label>
<span class="muted ml-1"> <span class="muted ms-1">
<ng-container *ngIf="getTotalTranscodingThreads().atMost" i18n> <ng-container *ngIf="getTotalTranscodingThreads().atMost" i18n>
will claim at most {{ getTotalTranscodingThreads().value }} {{ getTotalTranscodingThreads().unit }} with live transcoding will claim at most {{ getTotalTranscodingThreads().value }} {{ getTotalTranscodingThreads().unit }} with live transcoding
</ng-container> </ng-container>
@ -162,9 +162,9 @@
<div *ngIf="formErrors.transcoding.threads" class="form-error">{{ formErrors.transcoding.threads }}</div> <div *ngIf="formErrors.transcoding.threads" class="form-error">{{ formErrors.transcoding.threads }}</div>
</div> </div>
<div class="form-group mt-4" [ngClass]="getTranscodingDisabledClass()"> <div class="form-group" [ngClass]="getTranscodingDisabledClass()">
<label i18n for="transcodingConcurrency">Transcoding jobs concurrency</label> <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"> <div class="number-with-unit">
<input type="number" name="transcodingConcurrency" formControlName="concurrency" /> <input type="number" name="transcodingConcurrency" formControlName="concurrency" />
@ -174,9 +174,9 @@
<div *ngIf="formErrors.transcoding.concurrency" class="form-error">{{ formErrors.transcoding.concurrency }}</div> <div *ngIf="formErrors.transcoding.concurrency" class="form-error">{{ formErrors.transcoding.concurrency }}</div>
</div> </div>
<div class="form-group mt-4" [ngClass]="getTranscodingDisabledClass()"> <div class="form-group" [ngClass]="getTranscodingDisabledClass()">
<label i18n for="transcodingProfile">Transcoding profile</label> <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 <my-select-options
id="transcodingProfile" id="transcodingProfile"
@ -193,15 +193,15 @@
</div> </div>
</div> </div>
<div class="form-row mt-2"> <!-- video studio grid --> <div class="row mt-2"> <!-- video studio grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div i18n class="inner-form-title">VIDEO STUDIO</div> <div i18n class="inner-form-title">VIDEO STUDIO</div>
<div i18n class="inner-form-description"> <div i18n class="inner-form-description">
Allows your users to edit their video (cut, add intro/outro, add a watermark etc) Allows your users to edit their video (cut, add intro/outro, add a watermark etc)
</div> </div>
</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"> <ng-container formGroupName="videoStudio">
<div class="form-group" [ngClass]="getTranscodingDisabledClass()"> <div class="form-group" [ngClass]="getTranscodingDisabledClass()">

View File

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

View File

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

View File

@ -13,7 +13,7 @@
> >
<ng-template pTemplate="caption"> <ng-template pTemplate="caption">
<div class="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> <my-advanced-input-filter [filters]="inputFilters" (search)="onSearch($event)"></my-advanced-input-filter>
</div> </div>
</div> </div>
@ -53,11 +53,11 @@
</td> </td>
<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>
<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>
<td> <td>

View File

@ -25,7 +25,7 @@
</my-action-dropdown> </my-action-dropdown>
</div> </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-advanced-input-filter [filters]="inputFilters" (search)="onSearch($event)"></my-advanced-input-filter>
<my-button i18n-label label="Refresh" icon="refresh" (click)="reloadData()"></my-button> <my-button i18n-label label="Refresh" icon="refresh" (click)="reloadData()"></my-button>

View File

@ -57,7 +57,7 @@
</div> </div>
</ng-template> </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-3"></div>
<div class="col-12 col-xl-9"> <div class="col-12 col-xl-9">
@ -67,8 +67,8 @@
<div *ngIf="error" class="alert alert-danger">{{ error }}</div> <div *ngIf="error" class="alert alert-danger">{{ error }}</div>
<div class="form-row mt-4"> <!-- user grid --> <div class="row mt-4"> <!-- user grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div class="anchor" id="user"></div> <!-- user anchor --> <div class="anchor" id="user"></div> <!-- user anchor -->
<div *ngIf="isCreation()" class="account-title" i18n>NEW USER</div> <div *ngIf="isCreation()" class="account-title" i18n>NEW USER</div>
<div *ngIf="!isCreation() && user" class="account-title"> <div *ngIf="!isCreation() && user" class="account-title">
@ -76,150 +76,150 @@
</div> </div>
</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="row">
<form role="form" (ngSubmit)="formValidated()" [formGroup]="form" [ngClass]="{ 'col-5': isInBigView() }"> <form class="col" role="form" (ngSubmit)="formValidated()" [formGroup]="form">
<div class="form-group" *ngIf="isCreation()"> <div class="form-group" *ngIf="isCreation()">
<label i18n for="username">Username</label> <label i18n for="username">Username</label>
<input <input
type="text" id="username" i18n-placeholder placeholder="john" class="form-control" type="text" id="username" i18n-placeholder placeholder="john" class="form-control"
formControlName="username" [ngClass]="{ 'input-error': formErrors['username'] }" formControlName="username" [ngClass]="{ 'input-error': formErrors['username'] }"
> >
<div *ngIf="formErrors.username" class="form-error"> <div *ngIf="formErrors.username" class="form-error">
{{ formErrors.username }} {{ formErrors.username }}
</div>
</div> </div>
</div>
<div class="form-group" *ngIf="isCreation()"> <div class="form-group" *ngIf="isCreation()">
<label i18n for="channelName">Channel name</label> <label i18n for="channelName">Channel name</label>
<input <input
type="text" id="channelName" i18n-placeholder placeholder="john_channel" class="form-control" type="text" id="channelName" i18n-placeholder placeholder="john_channel" class="form-control"
formControlName="channelName" [ngClass]="{ 'input-error': formErrors['channelName'] }" formControlName="channelName" [ngClass]="{ 'input-error': formErrors['channelName'] }"
> >
<div *ngIf="formErrors.channelName" class="form-error"> <div *ngIf="formErrors.channelName" class="form-error">
{{ formErrors.channelName }} {{ formErrors.channelName }}
</div>
</div> </div>
</div>
<div class="form-group"> <div class="form-group">
<label i18n for="email">Email</label> <label i18n for="email">Email</label>
<input <input
type="text" id="email" i18n-placeholder placeholder="mail@example.com" class="form-control" type="text" id="email" i18n-placeholder placeholder="mail@example.com" class="form-control"
formControlName="email" [ngClass]="{ 'input-error': formErrors['email'] }" formControlName="email" [ngClass]="{ 'input-error': formErrors['email'] }"
autocomplete="off" [readonly]="user && user.pluginAuth !== null" autocomplete="off" [readonly]="user && user.pluginAuth !== null"
> >
<div *ngIf="formErrors.email" class="form-error"> <div *ngIf="formErrors.email" class="form-error">
{{ formErrors.email }} {{ formErrors.email }}
</div>
</div> </div>
</div>
<div class="form-group" *ngIf="isCreation()"> <div class="form-group" *ngIf="isCreation()">
<label i18n for="password">Password</label> <label i18n for="password">Password</label>
<my-help *ngIf="isPasswordOptional()"> <my-help *ngIf="isPasswordOptional()">
<ng-template ptTemplate="customHtml"> <ng-template ptTemplate="customHtml">
<ng-container i18n> <ng-container i18n>
If you leave the password empty, an email will be sent to the user. If you leave the password empty, an email will be sent to the user.
</ng-container> </ng-container>
</ng-template> </ng-template>
</my-help> </my-help>
<my-input-toggle-hidden <my-input-toggle-hidden
formControlName="password" inputId="password" [ngClass]="{ 'input-error': formErrors['password'] }" autocomplete="new-password" formControlName="password" inputId="password" [ngClass]="{ 'input-error': formErrors['password'] }" autocomplete="new-password"
></my-input-toggle-hidden> ></my-input-toggle-hidden>
<div *ngIf="formErrors.password" class="form-error"> <div *ngIf="formErrors.password" class="form-error">
{{ formErrors.password }} {{ formErrors.password }}
</div>
</div> </div>
</div>
<div class="form-group"> <div class="form-group">
<label i18n for="role">Role</label> <label i18n for="role">Role</label>
<div class="peertube-select-container"> <div class="peertube-select-container">
<select id="role" formControlName="role" class="form-control"> <select id="role" formControlName="role" class="form-control">
<option *ngFor="let role of roles" [value]="role.value"> <option *ngFor="let role of roles" [value]="role.value">
{{ role.label }} {{ role.label }}
</option> </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> </select>
</div>
</div> </div>
<div *ngIf="formErrors.role" class="form-error"> <div class="form-group">
{{ formErrors.role }} <my-peertube-checkbox
inputName="byPassAutoBlock" formControlName="byPassAutoBlock"
i18n-labelText labelText="Doesn't need review before a video goes public"
></my-peertube-checkbox>
</div> </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>
<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>
</div> </div>
<div *ngIf="!isCreation() && user && user.pluginAuth === null" class="form-row mt-4"> <!-- danger zone grid --> <div *ngIf="!isCreation() && user && user.pluginAuth === null" class="row mt-4"> <!-- danger zone grid -->
<div class="form-group col-12 col-lg-4 col-xl-3"> <div class="col-12 col-lg-4 col-xl-3">
<div class="anchor" id="danger"></div> <!-- danger zone anchor --> <div class="anchor" id="danger"></div> <!-- danger zone anchor -->
<div i18n class="account-title account-title-danger">DANGER ZONE</div> <div i18n class="account-title account-title-danger">DANGER ZONE</div>
</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="danger-zone">
<div class="form-group reset-password-email"> <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)) .concat(this.serverConfig.plugin.registeredExternalAuths.map(p => p.npmName))
} }
isInBigView () {
return this.screenService.getWindowInnerWidth() > 1600
}
buildRoles () { buildRoles () {
const authUser = this.auth.getUser() const authUser = this.auth.getUser()

View File

@ -1,20 +1,16 @@
<form role="form" (ngSubmit)="formValidated()" [formGroup]="form"> <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"> <div *ngIf="formErrors.password" class="form-error">
<input id="password" [attr.type]="showPassword ? 'text' : 'password'" class="form-control" {{ formErrors.password }}
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> </div>
<input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid"> <input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -32,9 +32,9 @@
<ng-container *ngFor="let plugin of plugins" > <ng-container *ngFor="let plugin of plugins" >
<my-plugin-card [plugin]="plugin" [version]="plugin.latestVersion" [pluginType]="pluginType"> <my-plugin-card [plugin]="plugin" [version]="plugin.latestVersion" [pluginType]="pluginType">
<div ngProjectAs="badges"> <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 Official
</span> </span>
</div> </div>

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -3,8 +3,9 @@
<ng-container i18n>Applications</ng-container> <ng-container i18n>Applications</ng-container>
</h1> </h1>
<div class="form-row"> <!-- built-in token grid --> <div class="row"> <!-- built-in token grid -->
<div class="form-group col-12 col-lg-4 col-xl-3">
<div class="group col-12 col-lg-4 col-xl-3">
<h2 i18n class="applications-title">SUBSCRIPTION FEED</h2> <h2 i18n class="applications-title">SUBSCRIPTION FEED</h2>
<div i18n class="applications-description"> <div i18n class="applications-description">
Use third-party feed aggregators to retrieve the list of videos from Use third-party feed aggregators to retrieve the list of videos from
@ -12,7 +13,7 @@
</div> </div>
</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"> <div class="form-group">
<label i18n for="feed-url">Feed URL</label> <label i18n for="feed-url">Feed URL</label>
@ -29,7 +30,7 @@
</div> </div>
</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-7 col-xl-5"></div>
<div class="col-md-5 col-xl-5"> <div class="col-md-5 col-xl-5">
<input (click)="renewToken()" type="submit" i18n-value value="Renew token"> <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"> <div class="header">
<a routerLink="/my-account/settings" fragment="notifications" i18n> <a routerLink="/my-account/settings" fragment="notifications" i18n>
<my-global-icon iconName="cog" aria-hidden="true"></my-global-icon> <my-global-icon iconName="cog" aria-hidden="true"></my-global-icon>
Notification preferences Notification preferences
</a> </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"> <select [(ngModel)]="notificationSortType" (ngModelChange)="onChangeSortColumn()" class="form-control">
<option value="undefined" disabled>Sort by</option> <option value="undefined" disabled>Sort by</option>
<option value="createdAt" i18n>Newest first</option> <option value="createdAt" i18n>Newest first</option>
@ -13,7 +13,7 @@
</select> </select>
</div> </div>
<button class="btn ml-auto" [disabled]="!hasUnreadNotifications()" (click)="markAllAsRead()"> <button class="btn ms-auto" [disabled]="!hasUnreadNotifications()" (click)="markAllAsRead()">
<ng-container *ngIf="hasUnreadNotifications()"> <ng-container *ngIf="hasUnreadNotifications()">
<my-global-icon iconName="tick" aria-hidden="true"></my-global-icon> <my-global-icon iconName="tick" aria-hidden="true"></my-global-icon>

View File

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

View File

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

View File

@ -1,5 +1,6 @@
@use '_variables' as *; @use '_variables' as *;
@use '_mixins' as *; @use '_mixins' as *;
@use '~bootstrap/scss/functions' as *;
.account-title { .account-title {
@include settings-big-title; @include settings-big-title;
@ -9,6 +10,6 @@
} }
} }
.form-group { .row > div {
max-width: 500px; 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> <my-top-menu-dropdown [menuEntries]="menuEntries"></my-top-menu-dropdown>
<div class="margin-content pb-5" [ngClass]="{ 'offset-content': !isBroadcastMessageDisplayed }"> <div class="margin-content pb-5" [ngClass]="{ 'offset-content': !isBroadcastMessageDisplayed }">

View File

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

View File

@ -1,7 +1,7 @@
<h1> <h1>
<my-global-icon iconName="channel" aria-hidden="true"></my-global-icon> <my-global-icon iconName="channel" aria-hidden="true"></my-global-icon>
<ng-container i18n>My channels</ng-container> <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> </h1>
<my-channels-setup-message [hideLink]="true"></my-channels-setup-message> <my-channels-setup-message [hideLink]="true"></my-channels-setup-message>

View File

@ -2,7 +2,7 @@
<span> <span>
<my-global-icon iconName="follower" aria-hidden="true"></my-global-icon> <my-global-icon iconName="follower" aria-hidden="true"></my-global-icon>
<ng-container i18n>My followers</ng-container> <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> </span>
</h1> </h1>

View File

@ -2,7 +2,7 @@
<span> <span>
<my-global-icon iconName="subscriptions" aria-hidden="true"></my-global-icon> <my-global-icon iconName="subscriptions" aria-hidden="true"></my-global-icon>
<ng-container i18n>My subscriptions</ng-container> <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> </span>
</h1> </h1>

View File

@ -1,6 +1,7 @@
<h1> <h1>
<my-global-icon iconName="history" aria-hidden="true"></my-global-icon> <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> </h1>
<div class="top-buttons"> <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> <my-top-menu-dropdown [menuEntries]="menuEntries"></my-top-menu-dropdown>
<div class="margin-content pb-5" [ngClass]="{ 'offset-content': !isBroadcastMessageDisplayed }"> <div class="margin-content pb-5" [ngClass]="{ 'offset-content': !isBroadcastMessageDisplayed }">

View File

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

View File

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

View File

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

View File

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

View File

@ -1,6 +1,7 @@
<h1> <h1>
<my-global-icon iconName="playlists" aria-hidden="true"></my-global-icon> <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> </h1>
<my-channels-setup-message></my-channels-setup-message> <my-channels-setup-message></my-channels-setup-message>

View File

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

View File

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

View File

@ -2,7 +2,7 @@
<span> <span>
<my-global-icon iconName="videos" aria-hidden="true"></my-global-icon> <my-global-icon iconName="videos" aria-hidden="true"></my-global-icon>
<ng-container i18n>My videos</ng-container> <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> </span>
<div> <div>

View File

@ -1,7 +1,7 @@
<div class="root"> <div class="root">
<div *ngIf="status !== 403 && status !== 418" class="box"> <div *ngIf="status !== 403 && status !== 418" class="box">
<strong>{{ status }}.</strong> <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"> <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> <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"> <div *ngIf="status === 403" class="box">
<strong>{{ status }}.</strong> <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"> <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> <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"> <div *ngIf="status === 418" class="box">
<strong>{{ status }}.</strong> <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"> <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. The requested entity body blends sweet bits with a mellow earthiness.

View File

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

View File

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

View File

@ -2,22 +2,22 @@
<div class="results-header"> <div class="results-header">
<div class="first-line"> <div class="first-line">
<div class="results-counter" *ngIf="pagination.totalItems"> <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="me-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 === 'search-index'">on the vidiverse</span>
<span *ngIf="currentSearch" i18n>for <span class="search-value">{{ currentSearch }}</span></span> <span *ngIf="currentSearch" i18n>for <span class="search-value">{{ currentSearch }}</span></span>
</div> </div>
<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" [attr.aria-expanded]="!isSearchFilterCollapsed" aria-controls="collapseBasic"
> >
<span class="icon icon-filter"></span> <span class="icon icon-filter"></span>
<ng-container i18n> <ng-container i18n>
Filters Filters
<span *ngIf="numberOfFilters() > 0" class="badge badge-secondary">{{ numberOfFilters() }}</span> <span *ngIf="numberOfFilters() > 0" class="pt-badge badge-secondary">{{ numberOfFilters() }}</span>
</ng-container> </ng-container>
</div> </div>
</div> </div>

View File

@ -6,7 +6,7 @@
(click)="onClick(i)" (click)="onClick(i)"
> >
<div class="step-index"> <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> <my-global-icon *ngIf="isCompleted(step)" iconName="tick"></my-global-icon>
</div> </div>

View File

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

View File

@ -1,8 +1,8 @@
<form role="form" [formGroup]="form"> <form role="form" [formGroup]="form">
<div class="form-group form-group-terms"> <div class="form-group">
<my-peertube-checkbox inputName="terms" formControlName="terms"> <my-peertube-checkbox inputName="terms" formControlName="terms">
<ng-template ptTemplate="label"> <ng-template ptTemplate="label">
<ng-container i18n> <ng-container i18n>
I am at least {{ minimumAge }} years old and agree I am at least {{ minimumAge }} years old and agree
to the <a class="terms-anchor" (click)="onTermsClick($event)" href='#'>Terms</a> 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> <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" 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'] }" formControlName="username" class="form-control" [ngClass]="{ 'input-error': formErrors['username'] }"
> >
<div class="input-group-append"> <span class="input-group-text">@{{ instanceHost }}</span>
<span class="input-group-text">@{{ instanceHost }}</span>
</div>
</div> </div>
<div class="name-information" i18n> <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]) { input:not([type=submit]) {
@include peertube-input-text(100%); @include peertube-input-text(100%);
display: block; display: block;

View File

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

View File

@ -1,6 +1,6 @@
<div class="margin-content"> <div class="margin-content">
<div class="title-page title-page-single"> <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> <a [routerLink]="getVideoUrl()">{{ video?.name }}</a>
</div> </div>

View File

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

View File

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

View File

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

View File

@ -6,7 +6,7 @@
<my-feed [syndicationItems]="syndicationItems"></my-feed> <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> <button class="btn btn-sm btn-outline-secondary" id="dropdown-sort-comments" ngbDropdownToggle i18n>
SORT BY SORT BY
</button> </button>
@ -80,7 +80,7 @@
<ng-template i18n #noAuthorComments>View {comment.totalReplies, plural, =1 {1 reply} other {{{ comment.totalReplies }} replies}}</ng-template> <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> </div>
</my-video-comment> </my-video-comment>

View File

@ -1,6 +1,6 @@
<div class="privacy-concerns" *ngIf="display"> <div class="privacy-concerns" *ngIf="display">
<div class="privacy-concerns-text"> <div class="privacy-concerns-text">
<span class="mr-2"> <span class="me-2">
<strong i18n>Friendly Reminder: </strong> <strong i18n>Friendly Reminder: </strong>
<ng-container i18n> <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. 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"> <div class="playlist-display-name">
{{ playlist.displayName }} {{ playlist.displayName }}
<span *ngIf="isUnlistedPlaylist()" class="badge badge-warning" i18n>Unlisted</span> <span *ngIf="isUnlistedPlaylist()" class="pt-badge badge-warning" i18n>Unlisted</span>
<span *ngIf="isPrivatePlaylist()" class="badge badge-danger" i18n>Private</span> <span *ngIf="isPrivatePlaylist()" class="pt-badge badge-danger" i18n>Private</span>
<span *ngIf="isPublicPlaylist()" class="badge badge-info" i18n>Public</span> <span *ngIf="isPublicPlaylist()" class="pt-badge badge-info" i18n>Public</span>
</div> </div>
<div class="playlist-by-index"> <div class="playlist-by-index">

View File

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

View File

@ -61,7 +61,7 @@
<div class="video-info-channel-left d-flex"> <div class="video-info-channel-left d-flex">
<my-video-avatar-channel [video]="video" [showChannel]="!isChannelDisplayNameGeneric()"></my-video-avatar-channel> <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()"> <ng-container *ngIf="!isChannelDisplayNameGeneric()">
<a [routerLink]="[ '/c', video.byVideoChannel ]" i18n-title title="Channel page"> <a [routerLink]="[ '/c', video.byVideoChannel ]" i18n-title title="Channel page">
{{ video.channel.displayName }} {{ 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="margin-content">
<div class="no-results" i18n *ngIf="notResults">No results.</div> <div class="no-results" i18n *ngIf="notResults">No results.</div>

View File

@ -25,7 +25,7 @@
<div class="d-flex justify-content-between"> <div class="d-flex justify-content-between">
<label class="small-title" i18n>GLOBAL SEARCH</label> <label class="small-title" i18n>GLOBAL SEARCH</label>
<div class="advanced-search-status muted"> <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> <i class="glyphicon glyphicon-globe"></i>
</div> </div>
</div> </div>
@ -39,8 +39,8 @@
<label class="small-title" i18n>ADVANCED SEARCH</label> <label class="small-title" i18n>ADVANCED SEARCH</label>
<div class="advanced-search-status c-help"> <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 [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="me-1" i18n>any instance</span>
<span *ngIf="!canSearchAnyURI()" class="mr-1" i18n>only followed instances</span> <span *ngIf="!canSearchAnyURI()" class="me-1" i18n>only followed instances</span>
<i [ngClass]="canSearchAnyURI() ? 'glyphicon glyphicon-ok-sign' : 'glyphicon glyphicon-exclamation-sign'"></i> <i [ngClass]="canSearchAnyURI() ? 'glyphicon glyphicon-ok-sign' : 'glyphicon glyphicon-exclamation-sign'"></i>
</span> </span>
</div> </div>

View File

@ -1,16 +1,16 @@
<a tabindex="-1" class="d-flex flex-auto flex-items-center p-2" [class.focus-visible]="active"> <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> <my-global-icon iconName="search"></my-global-icon>
</div> </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 <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" [attr.aria-label]="result.text" [innerHTML]="result.text | highlight : highlight"
></div> ></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-instance'" i18n>In this instance's network</span>
<span *ngIf="result.type === 'search-index'" i18n>In the vidiverse</span> <span *ngIf="result.type === 'search-index'" i18n>In the vidiverse</span>
</div> </div>

View File

@ -36,14 +36,14 @@
> >
<my-global-icon iconName="language" aria-hidden="true"></my-global-icon> <my-global-icon iconName="language" aria-hidden="true"></my-global-icon>
<span i18n>Interface:</span> <span i18n>Interface:</span>
<span class="ml-auto muted">{{ currentInterfaceLanguage }}</span> <span class="ms-auto muted">{{ currentInterfaceLanguage }}</span>
</a> </a>
<a ngbDropdownItem ngbDropdownToggle class="dropdown-item" routerLink="/my-account/settings" fragment="video-languages-subtitles" <a ngbDropdownItem ngbDropdownToggle class="dropdown-item" routerLink="/my-account/settings" fragment="video-languages-subtitles"
#settingsLanguagesSubtitles (click)="onActiveLinkScrollToAnchor(settingsLanguagesSubtitles)"> #settingsLanguagesSubtitles (click)="onActiveLinkScrollToAnchor(settingsLanguagesSubtitles)">
<my-global-icon iconName="video-lang" aria-hidden="true"></my-global-icon> <my-global-icon iconName="video-lang" aria-hidden="true"></my-global-icon>
<span i18n>Videos:</span> <span i18n>Videos:</span>
<span class="ml-auto muted">{{ videoLanguages.join(', ') }}</span> <span class="ms-auto muted">{{ videoLanguages.join(', ') }}</span>
</a> </a>
<a ngbDropdownItem ngbDropdownToggle class="dropdown-item settings-sensitive" routerLink="/my-account/settings" <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="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> <my-global-icon class="hover-display-toggle" [hidden]="user.nsfwPolicy !== 'display'" iconName="unsensitive" aria-hidden="true"></my-global-icon>
<span i18n>Sensitive:</span> <span i18n>Sensitive:</span>
<span class="ml-auto muted">{{ nsfwPolicy }}</span> <span class="ms-auto muted">{{ nsfwPolicy }}</span>
</a> </a>
<a ngbDropdownItem class="dropdown-item" (click)="toggleUseP2P()"> <a ngbDropdownItem class="dropdown-item" (click)="toggleUseP2P()">
<my-global-icon iconName="p2p" aria-hidden="true"></my-global-icon> <my-global-icon iconName="p2p" aria-hidden="true"></my-global-icon>
<ng-container i18n>Help share videos</ng-container> <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> </a>
<div class="dropdown-divider"></div> <div class="dropdown-divider"></div>
@ -149,7 +149,7 @@
<div class="footer-copyleft"> <div class="footer-copyleft">
<small class="d-inline" i18n-title title="powered by PeerTube - CopyLeft 2015-2022"> <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"> <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 <span aria-label="copyleft" class="d-inline-block" style="transform: rotateY(180deg)">&copy;</span> 2015-2022

View File

@ -24,7 +24,7 @@
<div> <div>
<button <button
*ngIf="unreadNotifications" *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()" (click)="markAllAsRead()"
></button> ></button>
<a <a
@ -45,7 +45,7 @@
></my-user-notifications> ></my-user-notifications>
<a *ngIf="loaded" class="all-notifications" routerLink="/my-account/notifications" #notifications (click)="onNavigate(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> <span i18n>See all your notifications</span>
</a> </a>
</div> </div>

View File

@ -9,7 +9,7 @@
<div class="modal-body" > <div class="modal-body" >
<div [innerHtml]="message"></div> <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> <label for="confirmInput">{{ inputLabel }}</label>
<input type="text" id="confirmInput" name="confirmInput" [(ngModel)]="inputValue" /> <input type="text" id="confirmInput" name="confirmInput" [(ngModel)]="inputValue" />
</div> </div>

View File

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

View File

@ -17,9 +17,9 @@
</a> </a>
<a [routerLink]="[ '.' ]" [queryParams]="{ 'search': 'reporter:&quot;' + abuse.reporterAccount.displayName + '&quot;' }" <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> </a>
</span> </span>
</div> </div>
@ -37,9 +37,9 @@
</a> </a>
<a *ngIf="isAdminView" [routerLink]="[ '.' ]" [queryParams]="{ 'search': 'reportee:&quot;' +abuse.flaggedAccount.displayName + '&quot;' }" <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> </a>
</span> </span>
</div> </div>
@ -53,7 +53,7 @@
<div class="mt-3 d-flex"> <div class="mt-3 d-flex">
<span class="moderation-expanded-label"> <span class="moderation-expanded-label">
<ng-container i18n>Report</ng-container> <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>
<span class="moderation-expanded-text" [innerHTML]="abuse.reasonHtml"></span> <span class="moderation-expanded-text" [innerHTML]="abuse.reasonHtml"></span>
</div> </div>

View File

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

View File

@ -6,7 +6,7 @@
<div *ngIf="editable && !hasAvatar()" class="actor-img-edit-button" [ngbTooltip]="avatarFormat" placement="right" container="body"> <div *ngIf="editable && !hasAvatar()" class="actor-img-edit-button" [ngbTooltip]="avatarFormat" placement="right" container="body">
<my-global-icon iconName="upload"></my-global-icon> <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)"/> <input #avatarfileInput type="file" name="avatarfile" id="avatarfile" [accept]="avatarExtensions" (change)="onAvatarChange(avatarfileInput)"/>
</div> </div>
@ -15,7 +15,7 @@
#avatarPopover="ngbPopover" [ngbPopover]="avatarEditContent" popoverClass="popover-image-info" autoClose="outside" placement="right" #avatarPopover="ngbPopover" [ngbPopover]="avatarEditContent" popoverClass="popover-image-info" autoClose="outside" placement="right"
> >
<my-global-icon iconName="edit"></my-global-icon> <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>
</div> </div>

View File

@ -3,35 +3,35 @@
.actor { .actor {
display: flex; display: flex;
}
my-actor-avatar { my-actor-avatar {
@include margin-right(15px); @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 { .actor-info-username {
display: inline-flex; position: relative;
flex-direction: column; font-size: 14px;
color: pvar(--greyForegroundColor);
}
.actor-info-display-name { .actor-info-followers {
font-size: 20px; font-size: 15px;
font-weight: $font-bold; padding-bottom: .5rem;
@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-img-edit-container { .actor-img-edit-container {

View File

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

View File

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

View File

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

View File

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

View File

@ -5,11 +5,14 @@ input {
@include peertube-input-text(auto); @include peertube-input-text(auto);
@include padding-left(15px !important); @include padding-left(15px !important);
@include padding-right(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 { .btn {
line-height: 1 !important; 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="root flex-column">
<div class="d-flex"> <div class="d-flex">
<label class="form-group-checkbox"> <label>
<input <input
type="checkbox" type="checkbox"
[(ngModel)]="checked" [(ngModel)]="checked"
@ -33,7 +33,7 @@
<div *ngIf="recommended" class="recommended" i18n>Recommended</div> <div *ngIf="recommended" class="recommended" i18n>Recommended</div>
</div> </div>
<div class="ml-4 d-flex flex-column"> <div class="ms-4 d-flex flex-column">
<small class="wrapper mt-2 muted"> <small class="wrapper mt-2 muted">
<ng-content select="description"></ng-content> <ng-content select="description"></ng-content>
</small> </small>

View File

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

View File

@ -7,7 +7,7 @@
[searchable]="searchable" [searchable]="searchable"
> >
<ng-option *ngFor="let channel of channels" [value]="channel.id"> <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 }} {{ channel.label }}
</ng-option> </ng-option>
</ng-select> </ng-select>

View File

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

View File

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

View File

@ -16,26 +16,3 @@
font-size: 15px; font-size: 15px;
margin-bottom: 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"> <div *ngIf="serverConfig" class="feature-table">
<table class="table" *ngIf="serverConfig"> <table *ngIf="serverConfig">
<caption i18n>Features found on this instance</caption> <caption i18n>Features found on this instance</caption>
<tr> <tr>
<th i18n class="label" scope="row">PeerTube version</th> <th i18n class="label" scope="row">PeerTube version</th>

View File

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

View File

@ -1,5 +1,5 @@
<div class="root"> <div class="root">
<div class="input-group has-feedback has-clear"> <div class="input-group has-clear">
<input <input
#ref #ref
type="text" type="text"
@ -10,8 +10,7 @@
[placeholder]="placeholder" [placeholder]="placeholder"
> >
<a class="glyphicon glyphicon-remove-sign form-control-feedback form-control-clear" (click)="onResetFilter()"></a> <a class="glyphicon glyphicon-remove-sign form-control-clear" title="Clear filter" i18n-title (click)="onResetFilter()"></a>
<span class="sr-only" i18n>Clear filters</span>
</div> </div>
<my-global-icon iconName="search" aria-label="Search" role="button" (click)="onIconClick()" [title]="iconTitle"></my-global-icon> <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.mutedByUser" class="pt-badge badge-danger" i18n>Muted</span>
<span *ngIf="account.mutedServerByUser" class="badge badge-danger" i18n>Instance muted</span> <span *ngIf="account.mutedServerByUser" class="pt-badge badge-danger" i18n>Instance muted</span>
<span *ngIf="account.mutedByInstance" class="badge badge-danger" i18n>Muted by your instance</span> <span *ngIf="account.mutedByInstance" class="pt-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.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