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,9 +76,9 @@
</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
@ -205,21 +205,21 @@
<input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid"> <input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">
</form> </form>
<div *ngIf="isInBigView()" class="col-7"> <div class="d-none d-xxl-block col-7">
<ng-template *ngTemplateOutlet="dashboard"></ng-template> <ng-template *ngTemplateOutlet="dashboard"></ng-template>
</div> </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,21 +1,17 @@
<form role="form" (ngSubmit)="formValidated()" [formGroup]="form"> <form role="form" (ngSubmit)="formValidated()" [formGroup]="form">
<div class="form-group">
<div class="input-group"> <div class="input-group">
<input id="password" [attr.type]="showPassword ? 'text' : 'password'" class="form-control" <input id="password" [attr.type]="showPassword ? 'text' : 'password'" class="form-control"
formControlName="password" [ngClass]="{ 'input-error': 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"> <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>Show</ng-container>
<ng-container *ngIf="!!showPassword" i18n>Hide</ng-container> <ng-container *ngIf="!!showPassword" i18n>Hide</ng-container>
</button> </button>
</div> </div>
</div>
<div *ngIf="formErrors.password" class="form-error"> <div *ngIf="formErrors.password" class="form-error">
{{ formErrors.password }} {{ formErrors.password }}
</div> </div>
</div>
<input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid"> <input type="submit" value="{{ getFormButtonTitle() }}" [disabled]="!form.valid">
</form> </form>

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,13 +3,13 @@
<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
@ -25,14 +25,13 @@
<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'] }}
@ -86,7 +85,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

@ -24,16 +24,7 @@ my-actor-banner-edit {
max-width: 500px; max-width: 500px;
} }
.input-group { input[type=text] {
@include peertube-input-group(fit-content);
}
.input-group-append {
height: 30px;
}
input {
&[type=text] {
@include peertube-input-text(340px); @include peertube-input-text(340px);
display: block; display: block;
@ -44,12 +35,11 @@ input {
} }
} }
&[type=submit] { input[type=submit] {
@include peertube-button; @include peertube-button;
@include orange-button; @include orange-button;
@include margin-left(auto); @include margin-left(auto);
} }
}
textarea { textarea {
@include peertube-textarea(500px, 150px); @include peertube-textarea(500px, 150px);

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,5 +1,5 @@
<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>

View File

@ -27,10 +27,8 @@
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>
The username is a unique identifier of your account on this and all the other instances. It's as unique as an email address, which makes it easy for other people to interact with it. The username is a unique identifier of your account on this and all the other instances. It's as unique as an email address, which makes it easy for other people to interact with it.

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,11 +15,16 @@
.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 { .playlist-by-index {
@ -54,7 +59,6 @@
} }
} }
} }
}
my-video-playlist-element-miniature { my-video-playlist-element-miniature {
::ng-deep { ::ng-deep {

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,6 +3,7 @@
.actor { .actor {
display: flex; display: flex;
}
my-actor-avatar { my-actor-avatar {
@include margin-right(15px); @include margin-right(15px);
@ -11,6 +12,7 @@
.actor-info { .actor-info {
display: inline-flex; display: inline-flex;
flex-direction: column; flex-direction: column;
}
.actor-info-display-name { .actor-info-display-name {
font-size: 20px; font-size: 20px;
@ -31,8 +33,6 @@
font-size: 15px; font-size: 15px;
padding-bottom: .5rem; padding-bottom: .5rem;
} }
}
}
.actor-img-edit-container { .actor-img-edit-container {
position: relative; position: relative;

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,11 +1,10 @@
<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>
@ -15,7 +14,6 @@
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