Merge remote-tracking branch 'origin/master'

master
Константин 2023-12-30 13:01:35 +03:00
commit 1143770632
611 changed files with 9570 additions and 290 deletions

View File

@ -77,6 +77,9 @@
"sourceMap": true,
"namedChunks": true
},
"vniigaz-v2": {
"buildOptimizer": false,
"optimization": false,
@ -89,6 +92,10 @@
"replace": "src/environments/environment.ts",
"with": "src/environments/vniigaz-v2.env.dev.ts"
},
{
"replace": "src/app/_modules/layout/grid/grid.component.ts",
"with": "src/vniigaz-v2/component/layout/grid/grid.component.ts"
},
{
"replace": "src/app/_modules/layout/header/header.component.ts",
"with": "src/vniigaz-v2/component/layout/header/header.component.ts"
@ -100,6 +107,10 @@
{
"replace": "src/app/_modules/layout/jumbotron/jumbotron.component.ts",
"with": "src/vniigaz-v2/component/layout/jumbotron/jumbotron.component.ts"
},
{
"replace": "src/app/_modules/pages/menu/slider-menu/slider-menu.component.ts",
"with": "src/vniigaz-v2/component/pages/menu/slider-menu/slider-menu.component.ts"
}
],
"inlineStyleLanguage": "scss",
@ -127,6 +138,7 @@
],
"index": "src/vniigaz-v2/index.html"
},
"vniigaz-v2-prod": {
"buildOptimizer": false,
"optimization": false,
@ -139,6 +151,10 @@
"replace": "src/environments/environment.ts",
"with": "src/environments/vniigaz-v2.env.prod.ts"
},
{
"replace": "src/app/_modules/layout/grid/grid.component.ts",
"with": "src/vniigaz-v2/component/layout/grid/grid.component.ts"
},
{
"replace": "src/app/_modules/layout/header/header.component.ts",
"with": "src/vniigaz-v2/component/layout/header/header.component.ts"
@ -150,6 +166,10 @@
{
"replace": "src/app/_modules/layout/jumbotron/jumbotron.component.ts",
"with": "src/vniigaz-v2/component/layout/jumbotron/jumbotron.component.ts"
},
{
"replace": "src/app/_modules/pages/menu/slider-menu/slider-menu.component.ts",
"with": "src/vniigaz-v2/component/pages/menu/slider-menu/slider-menu.component.ts"
}
],
"inlineStyleLanguage": "scss",
@ -176,6 +196,67 @@
"node_modules/swiper/swiper-bundle.css"
],
"index": "src/vniigaz-v2/index.html"
},
"nir": {
"buildOptimizer": false,
"optimization": false,
"vendorChunk": true,
"extractLicenses": false,
"sourceMap": true,
"namedChunks": true,
"fileReplacements": [
{
"replace": "src/environments/environment.ts",
"with": "src/environments/nir.env.dev.ts"
},
{
"replace": "src/app/_modules/layout/grid/grid.component.ts",
"with": "src/nir/component/layout/grid/grid.component.ts"
},
{
"replace": "src/app/_modules/layout/header/header.component.ts",
"with": "src/nir/component/layout/header/header.component.ts"
},
{
"replace": "src/app/_modules/layout/footer/footer.component.ts",
"with": "src/nir/component/layout/footer/footer.component.ts"
},
{
"replace": "src/app/_modules/layout/jumbotron/jumbotron.component.ts",
"with": "src/nir/component/layout/jumbotron/jumbotron.component.ts"
},
{
"replace": "src/app/_modules/pages/menu/slider-menu/slider-menu.component.ts",
"with": "src/nir/component/pages/menu/slider-menu/slider-menu.component.ts"
}
],
"inlineStyleLanguage": "scss",
"assets": [
{
"glob": "**/*",
"input": "node_modules/tinymce",
"output": "/tinymce/"
},
"src/favicon.ico",
{
"glob": "**/*",
"input": "src/nir/",
"output": "/assets/"
}
],
"stylePreprocessorOptions": {
"includePaths": [
"src/nir/css"
]
},
"styles": [
"src/styles.scss",
"node_modules/swiper/swiper-bundle.css"
],
"index": "src/nir/index.html"
}
},
"defaultConfiguration": "production"
@ -191,6 +272,9 @@
},
"vniigaz-v2": {
"browserTarget": "front:build:vniigaz-v2"
},
"nir": {
"browserTarget": "front:build:nir"
}
},
"defaultConfiguration": "development"

View File

@ -4,7 +4,9 @@
</div>
<div class="tabs default">
<button type="button" *ngFor="let tab of tabs" [class.active]="tab.active" routerLink="/administrate/{{tab.name}}">{{tab.title}}</button>
<div *ngFor="let tab of tabs" >
<button type="button"[class.active]="tab.active" *ngIf="showTab(tab)" routerLink="/administrate/{{tab.name}}">{{tab.title}}</button>
</div>
</div>
<div [ngSwitch]="tab.name">
<administrate-company *ngSwitchCase="'company'" [companyId]="'main'"></administrate-company>

View File

@ -35,7 +35,10 @@ export class AdministrationPageComponent {
makeTabs() {
//this.tabs = [{name: 'company', title: 'Структура ФАУ «ФЦС»'}, {name: 'committee', title: 'Структура ТК 465'}];
//if (this.authService.isSuperAdmin) this.tabs.push({name: 'site-pages', title: 'Структура сайта'});
this.tabs = [{name: 'site-pages', title: 'Структура сайта'}, {name: 'users', title: 'Пользователи'}, {name: 'licence', title: 'Данные о лицензии'}];
this.tabs = [
{name: 'site-pages', title: 'Структура сайта', access: ["admin", "editor"]},
{name: 'users', title: 'Пользователи', access: ["admin"]},
{name: 'licence', title: 'Данные о лицензии', access: ["admin"]}];
this.switchTab(this.route.snapshot.paramMap.get('tab'));
}
@ -43,4 +46,12 @@ export class AdministrationPageComponent {
this.tabs.map(tab => {tab.active = tab.name === name});
}
showTab(tab){
return this.privileges&&tab.access.filter(role=>this.privileges[role]).length
}
get privileges(){
return this.authService.user?.privileges
}
}

View File

@ -2,6 +2,7 @@ import {Component} from '@angular/core';
import {PagesService} from "@app/_services/pages.service";
import { FormsService } from '@app/_services';
import {LicenceService} from "@app/_services/licence.service";
import { DialogService } from '@app/_services/dialog.service';
@Component({
selector: 'administrate-site-pages',
@ -9,7 +10,7 @@ import {LicenceService} from "@app/_services/licence.service";
styleUrls: ['administrate-site-pages.component.scss']
})
export class AdministrateSitePagesComponent {
constructor(private pagesService: PagesService, private formsService: FormsService, public licenceService: LicenceService) {
constructor(private pagesService: PagesService, private formsService: FormsService, public licenceService: LicenceService, private dialog: DialogService) {
}
get isLicenceActive() {
@ -33,7 +34,7 @@ export class AdministrateSitePagesComponent {
addLocale() {
if (this.isMultilang) this.formsService.createModel('localePage', null, 'pages-tree-root');
else alert('Отсутствует необходимая опция');
else this.dialog.alert('Данная опция не входит в Вашу лицензию. Для включения опции обратитесь в службу поддержки НИР (+7 499 490 04 65, help@nirgroup.ru)');
}
toggle() {

View File

@ -2,6 +2,7 @@ import {Component, Input} from '@angular/core';
import {AdvisoriesService} from "@app/_services/advisories.service";
import {FormsService, ListsService} from "@app/_services";
import {Subscription} from "rxjs";
import { DialogService } from '@app/_services/dialog.service';
@Component({
selector: 'advisories-tree-advisory',
@ -17,7 +18,7 @@ export class AdvisoriesTreeAdvisoryComponent {
public touched = false;
constructor(private advisoriesService: AdvisoriesService, private listsService: ListsService, private formsService: FormsService) {
constructor(private advisoriesService: AdvisoriesService, private listsService: ListsService, private formsService: FormsService, private dialog: DialogService) {
}
@ -83,9 +84,13 @@ export class AdvisoriesTreeAdvisoryComponent {
}
delete() {
if (confirm(`Удалить ${this.advisory.caption}`)) this.advisoriesService.delete(this.advisory.id).subscribe(res => {
this.listsService.refresh(this.parent.id);
});
this.dialog.confirm(`Удалить ${this.advisory.caption}`).subscribe(
resp=>{
if (resp) this.advisoriesService.delete(this.advisory.id).subscribe(res => {
this.listsService.refresh(this.parent.id);
});
}
)
}
addAdvisory() {

View File

@ -3,6 +3,7 @@ import {Router} from "@angular/router";
import {AdvisoryCompaniesService} from "@app/_services/advisory-companies.service";
import {FormsService, ListsService} from "@app/_services";
import {Subscription} from "rxjs";
import { DialogService } from '@app/_services/dialog.service';
@Component({
selector: 'advisories-tree-company',
@ -18,7 +19,7 @@ export class AdvisoriesTreeCompanyComponent {
public touched = false;
constructor(private advisoryCompaniesService: AdvisoryCompaniesService, private listsService: ListsService, private formsService: FormsService, private router: Router) {
constructor(private advisoryCompaniesService: AdvisoryCompaniesService, private listsService: ListsService, private formsService: FormsService, private router: Router, private dialog: DialogService) {
}
@ -89,11 +90,14 @@ export class AdvisoriesTreeCompanyComponent {
delete() {
if (confirm('Исключить организацию из списка участников комитета?')) {
this.advisoryCompaniesService.delete(this.advisoryCompany.id).subscribe(res => {
this.listsService.refresh(this.parent?.id);
});
}
this.dialog.confirm('Исключить организацию из списка участников комитета?').subscribe(
resp=>{
if (resp) {
this.advisoryCompaniesService.delete(this.advisoryCompany.id).subscribe(res => {
this.listsService.refresh(this.parent?.id);
});
}
}
)
}
}

View File

@ -1,6 +1,7 @@
import {Component, Input} from '@angular/core';
import {AdvisoryMembersService} from "@app/_services/advisory-members.service";
import {ListsService} from "@app/_services";
import { DialogService } from '@app/_services/dialog.service';
@Component({
selector: 'advisories-tree-member',
@ -11,7 +12,7 @@ export class AdvisoriesTreeMemberComponent {
@Input() advisoryMember: any;
@Input() parent: any;
constructor(private advisoryMembersService: AdvisoryMembersService, private listsService: ListsService) {
constructor(private advisoryMembersService: AdvisoryMembersService, private listsService: ListsService, private dialog: DialogService) {
}
@ -41,12 +42,14 @@ export class AdvisoriesTreeMemberComponent {
delete() {
if (confirm('Исключить сотрудника из участников комитета?')) {
this.advisoryMembersService.delete(this.advisoryMember.id).subscribe(res => {
this.listsService.refresh(this.parent?.id);
});
}
this.dialog.confirm('Исключить сотрудника из участников комитета?').subscribe(
resp=>{
if (resp) {
this.advisoryMembersService.delete(this.advisoryMember.id).subscribe(res => {
this.listsService.refresh(this.parent?.id);
});
}
}
)
}
}

View File

@ -1,12 +1,11 @@
<modal (close)="close()">
<div [ngSwitch]="url"header>
<cms-modal (close)="close()">
<div [ngSwitch]="url" header>
<h3 *ngSwitchCase="'login'">Вход в систему</h3>
<h3 *ngSwitchCase="'signup'">Регистрация</h3>
<h3 *ngSwitchCase="'password/forget'">Восстановление пароля</h3>
<h3 *ngSwitchCase="'password/reset'">Сброс пароля</h3>
</div>
<div class="authentication">
<div class="authentication">
<div class="form">
<div class="center" [ngSwitch]="url">
<auth-form-login *ngSwitchCase="'login'"></auth-form-login>
@ -17,5 +16,5 @@
</div>
</div>
</div>
</modal>
</cms-modal>

View File

@ -15,10 +15,10 @@
</div>
<div class="forget">
<a (click)="forget()">Забыли пароль?</a>
<a (click)="signup()">Регистрация</a>
</div>
</div>
<div class="bottom">
<button [disabled]="loading" type="submit" class="btn">Войти</button>
<!-- <button [disabled]="loading" (click)="signup()" class="prime outline">Регистрация</button> -->
<button [disabled]="loading" type="submit" class="prime">Войти</button>
</div>
</form>

View File

@ -42,7 +42,7 @@
<div *ngIf="error" class="error">{{error}}</div>
</div>
<div class="bottom">
<button type="button" class="btn secondary" routerLink="/login">Авторизоваться</button>
<button type="button" class="btn secondary" (click)="login()">Авторизоваться</button>
<button type="submit" [disabled]="loading" class="btn">Зарегистрироваться</button>
</div>
</form>

View File

@ -79,4 +79,11 @@ export class AuthFormSignupComponent implements OnInit {
let trans = {'The given data was invalid.': 'Проверьте правильность заполнения формы'};
this.error = trans[error.message] || error.message;
}
login(){
this.router.navigate(
[ {outlets: {auth: 'login'}}],
{skipLocationChange: true}
).then();
}
}

View File

@ -16,8 +16,12 @@
<label for="description" class="caption">Описание документа</label>
<input id="description" type="text" name="description" formControlName="description" />
<div class="doc-item-form-bar">
<ico iso (click)="close()"></ico>
<ico ico="done_24" (click)="update()"></ico>
<div class="close" (click)="close()">
<ico></ico>
</div>
<div class="update" (click)="update()">
<ico ico="done_24"></ico>
</div>
</div>
</div>
<div class="fader" (click)="close()"></div>

View File

@ -16,3 +16,4 @@
<footer class="space"></footer>
</div>
<fullscreen-gallery></fullscreen-gallery>
<cms-dialog></cms-dialog>

View File

@ -9,8 +9,8 @@
<div class="row">Личный кабинет</div>
</div>
<!-- <li *ngIf="isJournalVisible" (click)="link('applications')">Журнал заявок</li> -->
<div class="type" *ngIf="authService.isAdmin" (click)="link('administrate')">
<div class="row">Структура сайта</div>
<div class="type" *ngIf="authService.isAdmin||authService.isEditor" (click)="link('administrate')">
<div class="row">Панель управления</div>
</div>
<div class="type" (click)="logout()">
<div class="row">Выход из системы</div>

View File

@ -2,6 +2,7 @@ import {Component, Input} from '@angular/core';
import {AuthenticationService} from "@app/_services";
import {Router} from "@angular/router";
import { PagesService } from '@app/_services/pages.service';
import { DialogService } from '@app/_services/dialog.service';
@Component({
@ -13,7 +14,7 @@ export class HeaderUserBarComponent {
public menuItems = <any>[];
public ddHidden = true;
constructor(public authService: AuthenticationService, private router: Router, private pagesService: PagesService) {
constructor(public authService: AuthenticationService, private router: Router, private pagesService: PagesService, private dialog: DialogService) {
}
get user() {
@ -39,12 +40,16 @@ export class HeaderUserBarComponent {
logout() {
if (confirm('Вы деествительно хотите выйти из системы?')) {
this.pagesService.editMode = false;
this.authService.logout();
this.ddHidden = true;
this.router.navigate(['']).then();
}
this.dialog.confirm('Вы действительно хотите выйти из системы?').subscribe(
resp=>{
if (resp) {
this.pagesService.editMode = false;
this.authService.logout();
this.ddHidden = true;
this.router.navigate(['']).then();
}
}
)
}
link(link: string) {

View File

@ -1,5 +1,5 @@
<div class="item" [ngClass]="itemClass">
<drop-down ico="arrow_drop_down_24" (toggle)="toggle($event)" [visible]="open" [angle]="[-90,0]" *ngIf="hasChildren"></drop-down>
<drop-down ico="chevron_menu_24" (toggle)="toggle($event)" [visible]="open" [angle]="[-90,0]" *ngIf="hasChildren"></drop-down>
<a (click)="select()">{{item.name}}</a>
</div>
<pages-menu *ngIf="children?.length" [items]="children" [level]="level + 1" [ngClass]="menuClass"></pages-menu>

View File

@ -21,7 +21,6 @@ export class PagesMenuComponent implements OnInit {
ngOnInit() {
if(!this.items){
this.subscription = combineLatest([
this.pagesService.currentPageSubject,
this.pagesService.rootPagesSubject

View File

@ -1,4 +1,4 @@
<slider [width]="'320px'" side="left">
<slider side="left">
<div body>
<pages-menu *ngIf="rootPages" [root]="rootPages" class="top-menu"></pages-menu>

View File

@ -15,7 +15,7 @@ export class PageComponent {
private url: string;
private inited = false;
routeSubscription?: Subscription;
subscription: Subscription;
listSubscription: Subscription;
constructor(
private router: Router,
@ -42,13 +42,14 @@ export class PageComponent {
ngOnInit() {
this.listsService.controls().subscribe(res => {
this.listSubscription = this.listsService.controls().subscribe(res => {
this.inited ? this.fetch() : this.inited = true;
});
}
ngOnDestroy() {
this.routeSubscription?.unsubscribe();
this.listSubscription?.unsubscribe()
}
onNavigationEnd(event: NavigationEnd) {
@ -64,6 +65,7 @@ export class PageComponent {
this.loading = true;
let include = [
'parents.children',
'parents.picture',
'children',
'sections.type',
'sections.groups.fields.value',
@ -78,7 +80,7 @@ export class PageComponent {
this.page = res?.data;
if (this.page) {
this.pagesService.currentPage = this.page;
this.titleService.setTitle(this.page.title||this.page.h1||this.page.name)
// this.titleService.setTitle(this.page.title||this.page.h1||this.page.name)
}
this.loading = false;
}, error => {

View File

@ -1,5 +1,6 @@
import {Component, Input} from '@angular/core';
import {FormsService, ListsService, ObjectsService} from "@app/_services";
import { DialogService } from '@app/_services/dialog.service';
@Component({
selector: 'page-menu',
@ -7,6 +8,17 @@ import {FormsService, ListsService, ObjectsService} from "@app/_services";
styleUrls: ['page-menu.component.scss']
})
export class PageMenuComponent {
delete() {
this.dialog.confirm('Удалить этот блок?').subscribe(
resp=>{
if (resp) this.objectsService.destroy(this.section.id).subscribe(res => {
this.listsService.refresh();
});
}
)
}
@Input() page: any;
@Input() section: any;
@Input() editMode: boolean;
@ -14,7 +26,11 @@ export class PageMenuComponent {
@Input() modelId: string;
@Input() modelType: string;
constructor(private formsService: FormsService, private objectsService: ObjectsService, private listsService: ListsService) {
constructor(
private formsService: FormsService,
private objectsService: ObjectsService,
private listsService: ListsService,
private dialog: DialogService) {
}
ngOnInit() {
@ -49,10 +65,5 @@ export class PageMenuComponent {
});
}
delete() {
//r u sure?
if (confirm('Удалить этот блок?')) this.objectsService.destroy(this.section.id).subscribe(res => {
this.listsService.refresh();
});
}
}

View File

@ -1,5 +1,6 @@
import {Component, Input} from '@angular/core';
import {FormsService, ListsService, ObjectsService} from "@app/_services";
import { DialogService } from '@app/_services/dialog.service';
@Component({
selector: 'cards-section-item',
@ -11,7 +12,7 @@ export class CardsSectionItemComponent {
@Input() type: any;
@Input() editMode = false;
constructor(private objectsService: ObjectsService, private formsService: FormsService, private listsService: ListsService) {
constructor(private objectsService: ObjectsService, private formsService: FormsService, private listsService: ListsService, private dialog: DialogService) {
}
@ -23,10 +24,13 @@ export class CardsSectionItemComponent {
}
delete() {
if (confirm('r u sure?')) this.objectsService.destroy(this.card.id).subscribe(res => {
this.listsService.refresh();
});
this.dialog.confirm('Удалить эту карточку?').subscribe(
resp=>{
if (resp) this.objectsService.destroy(this.card.id).subscribe(res => {
this.listsService.refresh();
});
}
)
}
}

View File

@ -2,6 +2,7 @@ import {Component, Input} from '@angular/core';
import {PagesService} from "@app/_services/pages.service";
import {FormsService, ListsService} from "@app/_services";
import {Subscription} from "rxjs";
import { DialogService } from '@app/_services/dialog.service';
@Component({
selector: 'pages-tree-item',
@ -18,7 +19,8 @@ export class PagesTreeItemComponent {
constructor(
public pagesService: PagesService,
private formsService: FormsService,
private listsService: ListsService) {
private listsService: ListsService,
private dialog: DialogService) {
}
ngOnInit() {
@ -85,26 +87,36 @@ export class PagesTreeItemComponent {
}
delete() {
if (confirm('r u sure?')) this.pagesService.delete(this.page.id).subscribe(res => {
this.listsService.refresh(this.parentListId);
this.refresh();
});
this.dialog.confirm(`Удалить страницу ${this.page.name}?`).subscribe(
resp=>{
if (resp) this.pagesService.delete(this.page.id).subscribe(res => {
this.listsService.refresh(this.parentListId);
this.refresh();
});
}
)
}
restore() {
if (confirm(`Восстановить страницу ${this.page.name}?`)) this.pagesService.restore(this.page.id, {}).subscribe(res => {
this.listsService.refresh(this.parentListId);
this.refresh();
});
this.dialog.confirm(`Восстановить страницу ${this.page.name}?`).subscribe(
resp=>{
if (resp) this.pagesService.restore(this.page.id, {}).subscribe(res => {
this.listsService.refresh(this.parentListId);
this.refresh();
});
}
)
}
clone() {
if (confirm(`Копировать страницу ${this.page.name}?`)) this.pagesService.clone(this.page.id, {recursive: true}).subscribe(res => {
this.listsService.refresh(this.parentListId);
this.refresh();
});
this.dialog.confirm(`Копировать страницу ${this.page.name}?`).subscribe(
resp=>{
if (resp) this.pagesService.clone(this.page.id, {recursive: true}).subscribe(res => {
this.listsService.refresh(this.parentListId);
this.refresh();
});
}
)
}
private refresh(){

View File

@ -42,7 +42,7 @@ export class PublicationsListItemMenuComponent {
}
delete(id: string) {
if (confirm('Вы деествительно хотите удалить эту запись?')) {
if (confirm('Вы действительно хотите удалить эту запись?')) {
this.publicationsService.delete(id).subscribe(res => {
this.listsService.refresh(this.listId, true);
});

View File

@ -8,16 +8,18 @@
</a>
</div>
</div>
<div class="date">{{publication.publishedAt | date : 'dd.MM.yy'}}</div>
<div class="name">
<a [routerLink]="publication.link">
<h3>{{publication.name}}</h3>
<div [class.not-published]="!isPublished">
<div class="date">{{publication.publishedAt | date : 'dd.MM.yy'}}</div>
<div class="name">
<a [routerLink]="publication.link">
<h3>{{publication.name}}</h3>
</a>
</div>
<gellery [images]="posters" *ngIf="posters"></gellery>
<div class="excerpt">{{publication.excerpt}}</div>
<a class="publication-read-more" [routerLink]="publication.link">
Читать далее
<ico ico="chevron_right_24"></ico>
</a>
</div>
<gellery [images]="posters" *ngIf="posters"></gellery>
<div class="excerpt">{{publication.excerpt}}</div>
<a class="publication-read-more" [routerLink]="publication.link">
Читать далее
<ico ico="chevron_right_24"></ico>
</a>

View File

@ -1,6 +1,7 @@
import {Component, Input} from '@angular/core';
import {FormsService, ListsService} from "@app/_services";
import {PublicationsService} from "@app/_services/publications.service";
import { DialogService } from '@app/_services/dialog.service';
@Component({
selector: 'publications-list-item',
@ -12,7 +13,7 @@ export class PublicationsListItemComponent {
@Input() editMode: boolean;
currentPoster:any;
constructor(private publicationsService: PublicationsService, private formsService: FormsService, private listsService: ListsService) {
constructor(private publicationsService: PublicationsService, private formsService: FormsService, private listsService: ListsService, private dialog: DialogService) {
}
get listId() {
@ -23,22 +24,30 @@ export class PublicationsListItemComponent {
return this.publication.posters?.data;
}
get isPublished(){
return this.publication.isPublished
}
ngOnInit() {
if (this.publication.posters) this.currentPoster = this.posters[0];
}
edit() {
this.formsService.editModel('publication', this.publication.id, null, this.listId);
}
delete() {
if (confirm('R u sure?')) {
this.publicationsService.delete(this.publication.id).subscribe(res => {
this.listsService.refresh(this.listId, true);
});
}
this.dialog.confirm('Удалить эту новость?').subscribe(
resp=>{
if (resp) {
this.publicationsService.delete(this.publication.id).subscribe(res => {
this.listsService.refresh(this.listId, true);
});
}
}
)
}
}

View File

@ -2,9 +2,15 @@
<div class="name">
<h3>{{page.name}}</h3>
</div>
<div class="intro" *ngIf="!page.isBlank">
<gellery [images]="posters" *ngIf="posters"></gellery>
</div>
<div class="content" *ngIf="page.content" [innerHTML]="page.content"></div>
<page-sections [page]="page" [editMode]="editMode" [modelType]="'publication'"></page-sections>
<a (click)="back()" class="publication-page-back">
<ico ico="chevron_left_24"></ico>
Назад
</a>

View File

@ -1,4 +1,5 @@
import {Component, Input} from '@angular/core';
import { Router } from '@angular/router';
@Component({
selector: 'publication-page',
@ -9,13 +10,19 @@ export class PublicationPageComponent {
@Input() page: any;
@Input() editMode: boolean;
constructor() {
constructor(
private router: Router
) {
}
get posters() {
return this.page.posters?.data;
}
back(): void {
window.history.back();
}
ngOnInit() {
}
}

View File

@ -1,5 +1,6 @@
import {Component, Input} from '@angular/core';
import {FormsService, ListsService, UsersService} from "@app/_services";
import { DialogService } from '@app/_services/dialog.service';
@Component({
selector: 'users-list-item',
@ -10,7 +11,7 @@ export class UsersListItemComponent {
@Input() user: any;
@Input() listId: string;
constructor(private usersService: UsersService, private formsService: FormsService, private listsService: ListsService) {
constructor(private usersService: UsersService, private formsService: FormsService, private listsService: ListsService, private dialog: DialogService) {
}
get role() {
@ -29,9 +30,12 @@ export class UsersListItemComponent {
}
delete() {
if (confirm(`Удалить пользователя ${this.user.name}?`)) this.usersService.delete(this.user.id).subscribe(res => {
this.listsService.refresh(this.listId, true);
});
this.dialog.confirm(`Удалить пользователя ${this.user.name}?`).subscribe(
resp=>{
if (resp) this.usersService.delete(this.user.id).subscribe(res => {
this.listsService.refresh(this.listId, true);
});
}
)
}
}

View File

@ -0,0 +1,30 @@
<cms-modal (close)="close()" *ngIf="showAllert">
<div header>
<h4>Внимание</h4>
</div>
<div body>
{{allert}}
</div>
<div footer>
<button class="prime" (click)="close()">
Закрыть
</button>
</div>
</cms-modal>
<cms-modal (close)="respNo()" *ngIf="showPrompt">
<div header>
<h4>Подтверждение</h4>
</div>
<div body>
{{prompt}}
</div>
<div footer>
<button class="prime outline" (click)="respNo()">
ОТМЕНА
</button>
<button class="prime" (click)="respYes()">
ПОДТВЕРДИТЬ
</button>
</div>
</cms-modal>

View File

@ -0,0 +1,6 @@
[footer]{
display: flex;
justify-content: flex-end;
gap: 20px;
margin-bottom: 24px;
}

View File

@ -0,0 +1,54 @@
import { Component } from '@angular/core';
import { DialogService } from '@app/_services/dialog.service';
import { Subscription, BehaviorSubject } from 'rxjs';
@Component({
selector: 'cms-dialog',
templateUrl: './cms-dialog.component.html',
styleUrls: ['./cms-dialog.component.scss']
})
export class CmsDialogComponent {
constructor(
private dialog: DialogService
){}
allert: string;
prompt: string;
resp: BehaviorSubject<string>;
showAllert: boolean;
showPrompt: boolean;
ngOnInit(){
this.dialog.modalAllertSubject.subscribe(
allert=>{
if (allert) {
this.allert = allert;
this.showAllert = true;
}
}
)
this.dialog.modalPromptSubject.subscribe(
prompt=>{
if (prompt) {
this.prompt = prompt;
this.showPrompt = true;
}
}
)
}
respYes(){
this.dialog.modalRespSubject.next(true);
this.close();
}
respNo(){
this.dialog.modalRespSubject.next(false);
this.close();
}
close(){
this.showPrompt = this.showAllert = false;
}
}

View File

@ -0,0 +1,15 @@
<div class="cms-modal-overlay" (click)="cls()">
</div>
<div class="cms-modal-bar">
<div class="cms-modal-header">
<ng-content select="[header]"></ng-content>
<ico (click)="cls()"></ico>
</div>
<div class="cms-modal-body">
<ng-content></ng-content>
</div>
<div class="cms-modal-footer">
<ng-content select="[footer]"></ng-content>
</div>
</div>

View File

@ -0,0 +1,114 @@
:host{
position: fixed;
width: 100vw;
height: 100vh;
left: 0;
top: 0;
display: flex;
align-items: center;
justify-content: center;
z-index: 10000;
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
.cms-modal-overlay{
position: fixed;
width: 100vw;
height: 100vh;
left: 0;
top: 0;
background-color: rgba(62, 61, 64, 0.7);
z-index: 1000;
}
.cms-modal-bar{
position: fixed;
max-height: 100vh;
width: 448px;
background-color: var(--white);
border: 1px solid var(--second-dis);
display: flex;
flex-direction: column;
border-radius: 4px;
padding: 24px 24px 0;
z-index: 1000;
overflow: hidden;
gap: 24px;
.cms-modal-header{
display: flex;
justify-content: space-between;
align-items: center;
h4{
font-family: PT Sans;
font-size: 20px;
font-style: normal;
font-weight: 700;
line-height: 28px;
margin: 0;
}
ico{
cursor: pointer;
}
}
.cms-modal-body{
overflow-y: auto;
}
.cms-modal-footer{
display: flex;
justify-content: flex-end;
gap: 20px;
}
}
::ng-deep{
button{
border-radius: 4px;
padding: 8px 20px;
font-family: PT Sans;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
letter-spacing: 0.56px;
text-transform: uppercase;
border: 1px solid;
&.prime{
background-color: var(--prime);
color: var(--white);
border-color: var(--prime);
&:hover{
background-color: var(--prime-act);
border-color: var(--prime-act);
}
}
&.outline{
background-color: var(--white);
color: var(--prime);
&:hover{
background-color: var(--white);
color: var(--prime-act);
border-color: var(--prime-act);
}
}
}
input{
width: 100%;
height: 40px;
padding: 8px 16px;
border-radius: 4px;
border: solid 1px var(--second-dis);
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
}
input:autofill{
background-color: var(--prime-dis);
border-color: var(--prime);
background-image: none !important;
}
}
}

View File

@ -0,0 +1,24 @@
import { Component, Output, EventEmitter } from '@angular/core';
import {WindowScrollingService} from "@app/_services/window-scrolling.service";
@Component({
selector: 'cms-modal',
templateUrl: './cms-modal.component.html',
styleUrls: ['./cms-modal.component.scss']
})
export class CmsModalComponent {
@Output() close = new EventEmitter<string>();
constructor( private windowScrollingService: WindowScrollingService ){}
ngOnInit(){
this.windowScrollingService.disable();
}
ngOnDestroy(){
this.windowScrollingService.enable();
}
cls(){
this.close.emit('close')
}
}

View File

@ -6,7 +6,7 @@
<div class="dropdown" (click)="close()" #langMenu>
<div class="menu">
<div class="type" *ngFor="let locale of locales" [routerLink]="locale.link" >
<div class="type" *ngFor="let locale of locales" (click)="select(locale)" >
<div class="row">
<img [src]="flag(locale.slug)">
{{locale.name}}

View File

@ -1,4 +1,5 @@
import { Component } from '@angular/core';
import { Router } from '@angular/router';
import {PagesService} from "@app/_services/pages.service";
import { environment } from '@environments/environment';
import {Subscription} from "rxjs";
@ -15,7 +16,8 @@ export class LocaleComponent {
private rootSubscription: Subscription
constructor(
public pagesService: PagesService
public pagesService: PagesService,
private router: Router
){}
ngOnInit() {
@ -49,4 +51,10 @@ export class LocaleComponent {
}, 10);
}
select(locale){
let link = locale.link
this.router.navigate([{outlets: {slider: null}}]).then(() => {
this.router.navigate([link])});
}
}

View File

@ -3,6 +3,7 @@
flex-direction: column;
width: 100%;
height: 100%;
max-height: 100vw;
--swiper-navigation-color: #fff;
--swiper-pagination-color: #fff;

View File

@ -13,6 +13,8 @@ import { ModalComponent } from './modal/modal.component';
import {SwiperModule} from "swiper/angular";
import { SwiperGalleryComponent } from './swiper-gallery/swiper-gallery.component';
import {FullscreenGalleryComponent} from "@app/_modules/widjet/swiper-gallery/fullscreen/fullscreen-gallery.component";
import { CmsModalComponent } from './cms-modal/cms-modal.component';
import { CmsDialogComponent } from './cms-dialog/cms-dialog.component';
@NgModule({
@ -32,7 +34,9 @@ import {FullscreenGalleryComponent} from "@app/_modules/widjet/swiper-gallery/fu
FileIcoComponent,
ModalComponent,
SwiperGalleryComponent,
FullscreenGalleryComponent
FullscreenGalleryComponent,
CmsModalComponent,
CmsDialogComponent
],
exports: [
IcoComponent,
@ -44,7 +48,9 @@ import {FullscreenGalleryComponent} from "@app/_modules/widjet/swiper-gallery/fu
FileIcoComponent,
ModalComponent,
SwiperGalleryComponent,
FullscreenGalleryComponent
FullscreenGalleryComponent,
CmsModalComponent,
CmsDialogComponent
]
})
export class WidjetModule {

View File

@ -57,7 +57,9 @@ export class AuthenticationService {
get isMainCompanyMember() {
return this.privileges?.mainCompanyMember;
}
get isEditor() {
return this.privileges?.editor;
}
signup(data: any): Observable<any> {

View File

@ -0,0 +1,35 @@
import {Injectable} from '@angular/core';
import {HttpClient} from '@angular/common/http';
import {environment} from '@environments/environment';
import {Observable, BehaviorSubject} from "rxjs";
@Injectable({ providedIn: 'root' })
export class DialogService {
public modalAllertSubject = new BehaviorSubject<string>(null)
public modalPromptSubject = new BehaviorSubject<string>(null);
public modalRespSubject = new BehaviorSubject<boolean>(null);
private userResp: BehaviorSubject<boolean>
constructor(){
this.modalRespSubject.subscribe(
resp=>{
if (resp !== null){
this.userResp.next(resp);
this.userResp.complete();
}
}
)
}
alert(txt:string){
this.modalAllertSubject.next(txt)
}
confirm(txt:string){
this.modalPromptSubject.next(txt);
this.userResp = new BehaviorSubject(null)
return this.userResp;
}
}

View File

@ -59,8 +59,8 @@ export class LicenceService {
public checkEditAvailability(page?: any) {
if (!this.isActive) return this.error('Licence not active');
if ((page?.type?.name === 'registry') && !this.hasOption('registries')) return this.error('Registries option required');
if ((page?.type?.name === 'publications') && !this.hasOption('publications')) return this.error('Publications option required');
if ((page?.type?.name === 'registry') && !this.hasOption('registries')) return this.error('Срок действия лицензии истек. Режим редактирования не доступен. Продлите лицензию или обратитесь в службу поддержки НИР (+7 499 490 04 65, help@nirgroup.ru)');
if ((page?.type?.name === 'publications') && !this.hasOption('publications')) return this.error('Данная опция не входит в Вашу лицензию. Для включения опции обратитесь в службу поддержки НИР (+7 499 490 04 65, help@nirgroup.ru)');
return null;
}

View File

@ -3,6 +3,7 @@ import {HttpClient} from '@angular/common/http';
import {environment} from '@environments/environment';
import {Observable, BehaviorSubject} from "rxjs";
import {LicenceService} from "@app/_services/licence.service";
import { DialogService } from '@app/_services/dialog.service';
@Injectable({providedIn: 'root'})
@ -16,7 +17,7 @@ export class PagesService {
public rootPage = {link:'', slug:environment.defaultLocale};
constructor(private http: HttpClient, private licenceService: LicenceService) {
constructor(private http: HttpClient, private licenceService: LicenceService, private dialog: DialogService) {
//this.find('/').subscribe(res => {this.rootPages = res.data});
}
@ -42,7 +43,7 @@ export class PagesService {
if (value) {
let error = this.licenceService.checkEditAvailability(this.currentPage);
if (error) {
alert(error);
this.dialog.alert(error);
return;
}
}

View File

@ -0,0 +1,23 @@
// This file can be replaced during build by using the `fileReplacements` array.
// `ng build` replaces `environment.ts` with `environment.prod.ts`.
// The list of file replacements can be found in `angular.json`.
export const environment = {
production: false,
apiUrl: 'http://api.nircms.lc',
clientId: 2,
clientSecret: 'm5VOU2mv0psRFIL32QRGvKmtaE57ijGS4FTBMyn9',
project: null,
licence: 'POUFLO4YW7SU',
defaultLocale: 'ru'
};
/*
* For easier debugging in development mode, you can import the following file
* to ignore zone related error stack frames such as `zone.run`, `zoneDelegate.invokeTask`.
*
* This import should be commented out in production mode because it will have a negative impact
* on performance if an error is thrown.
*/
// import 'zone.js/plugins/zone-error'; // Included with Angular CLI.

View File

@ -0,0 +1,9 @@
export const environment = {
production: true,
apiUrl: 'https://api-vniigaz-cert-v2.testnir.ru',
clientId: 2,
clientSecret: 'uMYJ7jTYfSKst631D9gKlSwlNF0bWlcrR1d5mTKX',
project: null,
licence: '',
defaultLocale: 'ru'
};

View File

@ -0,0 +1,17 @@
<div class="footer">
<a href="mailto:info@nirgroup.ru">
<ico ico="mail_24"></ico>
<span>info@nirgroup.ru</span>
</a>
<div>
<ico ico="phone_24"></ico>
<span>+7 (499) 490-04-65</span>
</div>
<div>
<ico ico="location_24"></ico>
<span>121170, Москва, Кутузовский пр-т, д. 36, стр. 3, оф. 222</span>
</div>
<div class="nir-link">
© 20162023 ООО «НИР»
</div>
</div>

View File

@ -0,0 +1,29 @@
import {Component} from '@angular/core';
import {AuthenticationService} from "@app/_services";
@Component({
selector: 'footer',
templateUrl: 'footer.component.html',
styleUrls: ['footer.component.scss']
})
export class FooterComponent {
public year = new Date().getFullYear();
constructor(public authService: AuthenticationService) {
}
get isLoggedIn() {
return this.authService.isLoggedIn;
}
ngOnInit() {
}
login() {
this.authService.popup('login');
}
}

View File

@ -0,0 +1,19 @@
<router-outlet name="auth"></router-outlet>
<router-outlet name="slider"></router-outlet>
<div class="wrapper" [class.this-root-page] = "isRootPage">
<header class="space"></header>
<jumbotron></jumbotron>
<div class="space content-sapce">
<div class="content-grid layout-corral">
<left-content></left-content>
<div class="main-content">
<router-outlet></router-outlet>
</div>
<right-content></right-content>
</div>
</div>
<footer class="space"></footer>
</div>
<fullscreen-gallery></fullscreen-gallery>
<cms-dialog></cms-dialog>

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,39 @@
import {Component} from '@angular/core';
import {Subscription} from "rxjs";
import {ListsService} from "@app/_services";
import { PagesService } from '@app/_services/pages.service';
@Component({
selector: 'grid',
templateUrl: 'grid.component.html',
styleUrls: ['grid.component.scss']
})
export class GridComponent {
public classActive = '';
public bright: number = 150;
public contrast: number = 100;
subscription?: Subscription;
constructor(
private listsService: ListsService, private pagesService: PagesService
) {
}
ngOnInit() {
this.subscription = this.listsService.result('class').subscribe(val => {
this.classActive = val;
});
}
ngOnDestroy() {
this.subscription?.unsubscribe();
}
get isRootPage(){
return this.pagesService.currentPage && this.pagesService.currentPage.parents && this.pagesService.currentPage.parents.data.length == 0
}
}

View File

@ -0,0 +1,17 @@
<div class="header">
<a class="burger" (click)="openMobileMenu()">
<ico ico="burger_32" color="var(--black)" [size]="32"></ico>
</a>
<img src="assets/images/nir-logo.svg" alt="НИР" [routerLink]="rootPage?.link" class="header-logo" >
<pages-menu class="lvl-0"></pages-menu>
<a (click)="login()" class="header-login" *ngIf="!isLoggedIn">
<ico ico="login_24" ></ico>
<span>Войти</span>
</a>
<header-user-bar *ngIf="isLoggedIn"></header-user-bar>
</div>

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,41 @@
import {Component} from '@angular/core';
import {Router} from "@angular/router";
import { AuthenticationService } from '@app/_services';
import {PagesService} from "@app/_services/pages.service";
@Component({
selector: 'header',
templateUrl: 'header.component.html',
styleUrls: ['header.component.scss']
})
export class HeaderComponent {
constructor(
private router: Router,
public pagesService: PagesService,
public authService: AuthenticationService
) {
}
// ngOnInit(){
// this.pagesService.root().subscribe(
// resp=> this.pagesService.rootPages = resp
// )
// }
get rootPage() {
return this.pagesService.rootPage;
}
openMobileMenu(){
this.router.navigate([{outlets: {slider: 'pages-menu'}}], {skipLocationChange: true}).then();
}
login() {
this.authService.popup('login');
}
get isLoggedIn() {
return this.authService.isLoggedIn;
}
}

View File

@ -0,0 +1,23 @@
<div class="jumbotron-bg space" [ngStyle]="bgStyle" [class.rootpage-jumbotron]="isRootPage">
<div class="jumbotron-content layout-corral">
<div class="jumbotron-content-center">
<h1 [ngStyle]="h1Style">{{name}}</h1>
<!-- <h1 *ngIf="isRootPage" [ngStyle]="h1Style">
Сертификация<br>
продукции, работ и услуг</h1> -->
<h4 *ngIf="since">
<a href="https://vniigaz.gazprom.ru/" target="_blank">Учреждено в 1998</a>
</h4>
</div>
</div>
</div>
<div class="space jumbotron-edit-field" *ngIf="editable">
<div class="layout-corral jumbotron-edit-field-row">
<div class="switch-host" (click)="toggleEditMode()">
Режим редактирования
<switch [val]="editMode"></switch>
</div>
</div>
</div>

View File

@ -0,0 +1,107 @@
import { Component } from '@angular/core';
import { PagesService } from '@app/_services/pages.service';
import { Subscription } from 'rxjs';
import { AuthenticationService } from '@app/_services';
@Component({
selector: 'jumbotron',
templateUrl: './jumbotron.component.html',
styleUrls: ['./jumbotron.component.scss']
})
export class JumbotronComponent {
private subscription:Subscription
public currentPage:any;
public pagePicture:any;
constructor(
private pagesService: PagesService,
public authService: AuthenticationService,
){}
ngOnInit(){
this.subscription = this.pagesService.currentPageSubject.subscribe(
resp=> {
this.currentPage = resp;
if (this.currentPage) {
if(this.currentPage.picture){
this.pagePicture = this.currentPage.picture.data.links.open
}else{
let parents = this.currentPage.parents.data
let content = parents.map(page=>page.picture).filter(page=>page)
this.pagePicture = content.pop()?.data.links.open
}
}else{this.pagePicture = null;}
}
)
}
ngOnDestoy(){
this.subscription.unsubscribe();
}
get name(){
let name:string
if(this.currentPage){
name = this.currentPage?.h1 || this.currentPage?.name;
let parents = this.currentPage?.parents?.data
if(parents){
if (parents[1]?.type.name=='nav-page'){
if (parents[2]) name = parents[2].h1|| parents[2].name
}else{
if (parents[1]) name = parents[1].h1|| parents[1].name
}
}
}
return name
}
get bgStyle(){
let height = 70;
let pictURL:string;
if (this.pagePicture){
height = 150;
pictURL = this.pagePicture;
}
return {
'background-image' : `url(${pictURL})`||'none',
'height': (this.mainPage?700:pictURL?400:height) + 'px'
}
}
get h1Style(){
return {
color: this.pagePicture?'var(--white)':'var(--second-act)',
'align-self': this.mainPage?'center':'flex-start',
'text-align': this.mainPage?'center':'left',
'width': this.mainPage?'900px':null,
'border-bottom':this.mainPage?null:'12px solid #2EB2E8'
}
}
get mainPage(){
return this.currentPage?.parents?.data.length === 0;
}
get editable(){
return this.currentPage&&(this.authService.privileges?.admin|| this.authService.privileges?.editor);
}
get editMode(){
return this.pagesService.editMode;
}
toggleEditMode(){
this.pagesService.editMode = !this.pagesService.editMode;
}
get isRootPage(){
return !this.pagesService.currentPage?.parents.data.length && this.pagesService.currentPage
}
get since(){
return this.currentPage?.link === '/'
}
}

View File

@ -0,0 +1,6 @@
<slider side="left">
<div body>
<pages-menu *ngIf="rootPages" [root]="rootPages" class="lvl-0"></pages-menu>
</div>
</slider>

View File

@ -0,0 +1,22 @@
import { Component } from '@angular/core';
import {Router} from "@angular/router";
import {PagesService} from "@app/_services/pages.service";
@Component({
selector: 'slider-menu',
templateUrl: './slider-menu.component.html',
styleUrls: ['./slider-menu.component.scss']
})
export class SliderMenuComponent {
constructor(
private router: Router,
public pagesService: PagesService
) {
}
get rootPages() {
return this.pagesService.rootPages;
}
}

316
src/nir/css/_admin.scss Normal file
View File

@ -0,0 +1,316 @@
.administration-page{
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
h2{
color: var(--second-act);
margin-bottom: 48px;
}
}
.site-admin-control{
.site-admin-control-toggle{
display: flex;
align-items: center;
gap: 16px;
cursor: pointer;
margin-bottom: 32px;
}
.site-admin-page-block{
display: flex;
justify-content: space-between;
align-items: center;
height: 64px;
border-top: 1px solid var(--second-dis);
border-bottom: 1px solid var(--second-dis);
div{
display: flex;
align-items: center;
}
.site-admin-company{
font-weight: 700;
}
}
ico.page-lable{
background-color: var(--prime);
border-radius: 20px;
width: 40px;
height: 40px;
display: flex;
align-items: center;
justify-content: center;
margin-right: 12px;
}
}
administrate-site-pages{
>pages-tree{
display: block;
margin-bottom: 128px;
}
@media screen and (max-width: 1330px) {
.page-control {
display: none;
}
.logo, .page-lable{
display: none !important;
}
}
}
ico.page-control{
cursor: pointer;
svg{
color:var(--second);
&:hover{
color: var(--second-act);
}
}
}
pages-tree{
.item:not(.home){
.bar{
padding-left: 50px;
}
.item .bar{
padding-left: 100px;
}
.item .item .bar{
padding-left: 150px;
}
.item .item .item .bar{
padding-left: 200px;
}
.item .item .item .item .bar{
padding-left: 250px;
}
.item .item .item .item .item .bar{
padding-left: 300px;
}
}
.item {
flex-direction: column;
align-items: stretch;
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
.bar {
display: flex;
flex-direction: row;
align-items: center;
border-bottom: solid var(--second-dis) 1px;
.left {
cursor: pointer;
width: 24px;
flex-shrink: 0;
}
.mid {
flex-grow: 1;
padding: 0 16px;
.info {
display: flex;
flex-direction: row;
align-items: center;
.logo {
display: flex;
align-items: center;
justify-content: center;
position: relative;
flex-shrink: 0;
width: 40px;
height: 40px;
margin-right: 16px;
border-radius: 100px;
background-color: var(--prime);
color: #ffffff;
cursor: move;
&:hover{
background-color: var(--prime-act);
}
span{
display: none;
}
}
.name {
display: flex;
flex-direction: column;
height: 100%;
padding: 20px 0;
a {
color: var(--dadk);
&:nth-child(2){
color: var(--second);
}
}
}
}
}
.right {
display: flex;
flex-direction: row;
align-items: center;
flex-shrink: 1;
gap: 24px;
}
}
}
}
administrate-licence{
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
color: var(--dark);
.default{
.caption{
color: var(--second);
}
.value{
&.ok{
color: #14A92D
}
&.warn{
color: #E51F30
}
}
}
h3{
font-family: PT Sans;
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: 28px;
margin: 24px 0 16px;
}
p{
font-size: 16px;
}
}
users-list{
.bar {
display: flex;
align-items: center;
justify-content: space-between;
height: 72px;
border-top: var(--second-dis) solid 1px;
border-bottom: var(--second-dis) solid 1px;
ico{
cursor: pointer;
}
.title {
flex-grow: 1;
font-weight: bold;
}
.buttons {
display: flex;
flex-direction: row;
align-items: center;
gap: 24px;
flex-shrink: 0;
}
}
users-list-item {
display: flex;
align-items: center;
height: 72px;
border-bottom: var(--second-dis) solid 1px;
.item{
display: flex;
width: 100%;
.left{
.avatar{
display: flex;
align-items: center;
justify-content: center;
position: relative;
flex-shrink: 0;
width: 40px;
height: 40px;
margin-right: 16px;
border-radius: 100px;
background-color: var(--prime);
color: #ffffff;
overflow: hidden;
img{
object-fit: cover;
width: 100%;
height: 100%;
}
}
}
.middle{
.user-data{
.name{
&::after{
content: '';
color: var(--second);
margin: 0 8px;
}
}
.Administrator{
color: #E51F30;
}
.Editor{
color: #A39600
}
.User{
color: #14A92D;
}
}
.position{
color: var(--second);
}
}
.right{
flex-grow: 1;
display: flex;
justify-content: flex-end;
align-items: center;
gap: 24px;
}
ico{
cursor: pointer;
svg{
color: var(--second) ;
}
&:hover{
svg{
color: var(--second-act) ;
}
}
}
}
}
}

641
src/nir/css/_basics.scss Normal file
View File

@ -0,0 +1,641 @@
@import "~@angular/material/prebuilt-themes/indigo-pink.css";
* {
font-family: "PT Sans";
}
// li {
// list-style-image: url("~src/assets/images/icons/add_24dp.svg");
// }
// .btn {
// font-weight: 500;
// font-size: 0.875rem;
// line-height: 1.125rem;
// letter-spacing: 0.02em;
// text-transform: uppercase;
// }
.toggle-hide{
display: none;
}
.inline{
display: inline-flex;
}
.center{
align-items: center;
}
$layout-width: 1280px;
$page-width: 840px;
$pxl:40px;
$pl:32px;
$p:24px;
$ps:16px;
$pxs:8px;
$pxxs:4px;
.size-little {
* {
font-size: 0.75rem;
line-height: 1rem;
}
h1 {font-size: 1.5rem;}
}
.size-middle {
* {
font-size: 1rem;
line-height: 20px;
}
h1 {
font-weight: 700;
font-size: 2rem;
line-height: 40px;
}
}
.size-large {
* {
font-size: 1.25rem;
line-height: 24px;
}
h1 {font-size: 3rem;}
}
.image-hidden {
img, svg {
visibility: hidden !important;
}
*, *::after, *::before {
background-image: none !important;
}
}
.style-brown {
filter: sepia(150%) !important;
}
.style-white-black {
filter: grayscale(100%) !important;;
}
.style-black-white {
filter: grayscale(100%) invert(100%) !important;;
}
:root {
--smart: 688px;
--medium: 1048px;
--xs: 4px;
--s: 8px;
--m: 16px;
--l: 24px;
--xl: 36px;
--xxl: 48px;
--radius-1: 12px;
--radius-2: 20px;
--white: #ffffff;
--light: #D8D8D8;
--prime: #009CAD;
--prime-hov: #007E91;
--prime-act: #006275;
--prime-dis: #a1dde5;
--second: #6C6C6C;
--second-hov: #4D4D4D;
--second-act: #2D2D2D;
--second-dis: #C0C0C0;
--black: rgba(0,0,0,0.88);
--bk66: rgba(0,0,0,0.66);
--bk44: rgba(0,0,0,0.44);
--bk22: rgba(0,0,0,0.22);
--bk8: rgba(0,0,0,0.08);
--bk4: rgba(0,0,0,0.04);
--bg: #F4F5F3;
--bg-lt: #FBFCFA;
--bg-dk: #CFCFC6;
}
.style-color{
background-color: var(--light);
}
.mat-calendar-body-selected {
background-color: #0079c2;
}
button.mat-calendar-body-cell:hover{
background-color: transparent;
border: none;
font-weight: 400;
}
button.mat-calendar-body-cell{
font-weight: 400;
}
.mat-calendar-body-cell:not(.mat-calendar-body-disabled):hover > .mat-calendar-body-cell-content:not(.mat-calendar-body-selected):not(.mat-calendar-body-comparison-identical){
background-color: rgba(0, 162, 255,0.3);
font-weight: 400;
}
.tox-promotion, .tox-statusbar__branding {
display: none!important;
}
*, ::after, ::before {
box-sizing: border-box;
}
* {scrollbar-color:transparent transparent; scrollbar-width:none;}
*::-webkit-scrollbar-track {background-color:transparent;}
*::-webkit-scrollbar {width:0; height:0; background-color:transparent;}
*::-webkit-scrollbar-thumb {background-color:transparent; border-radius:2rem;}
html {
height: 100%;
font-family: "PT Sans";
font-size: 16px;
-webkit-font-smoothing:antialiased;
}
body {
height: 100%;
padding: 0;
margin: 0;
color: var(--second-act);
background-color: var(--light);
font-size: 20px;
.wrapper {
width: 100%;
min-height: 100vh;
display: flex;
flex-direction: column;
}
}
.limiter {
width: 100%;
max-width: 1280px;
margin: 0 auto;
}
p {
font-family: PT Sans;
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: 32px;
margin: 0;
}
h1{
color: var(--white);
font-family: PT Sans Narrow;
font-size: 76px;
font-style: normal;
font-weight: 700;
line-height: 76px; /* 100% */
letter-spacing: 0.76px;
}
h2 {
color: var(--second-act);
font-family: PT Sans Narrow;
font-size: 50px;
font-style: normal;
font-weight: 700;
line-height: 60px; /* 120% */
letter-spacing: 0.5px;
margin:0;
}
h3 {
color: var(--second-act);
font-family: PT Sans Narrow;
font-size: 36px;
font-style: normal;
font-weight: 700;
line-height: 44px; /* 120% */
letter-spacing: 0.36px;
margin:0;
}
h4 {
color: var(--second-act);
font-family: PT Sans Narrow;
font-size: 24px;
font-style: normal;
font-weight: 700;
line-height: 32px; /* 133.333% */
letter-spacing: 0.24px;
margin:0;
}
a {
text-decoration: none;
color: var(--prime);
cursor: pointer;
&:hover{
color: var(--prime-hov);
};
}
iframe {
width: 100%;
height: 400px;
}
span.link {
font-weight: normal;
color: #86898E;
cursor: pointer;
}
.fullwidth {
width: calc(100% + 80px);
margin-left: -40px;
margin-right: -40px;
}
.loader {
margin-top: 32px;
text-align: center;
animation: fade-in-and-scale 0.5s infinite;
&:before {
display: inline-block;
width: 80px;
height: 80px;
border-radius: 100px;
background-image: radial-gradient(rgba(44,134,205,1), rgba(44,134,205,0));
content: '';
}
}
.op-63{
opacity: 0.63;
}
@media screen and (min-width: 1330px) {
.fullwidth {
width: 100vw;
margin-left: calc((1160px - 100vw) / 2);
margin-right: 0;
}
}
@keyframes slide-from-right {
0% {transform: translateX(100%);}
100% {transform: translateX(0);}
}
@keyframes slide-from-left {
0% {transform: translateX(-100%);}
100% {transform: translateX(0);}
}
@keyframes slide-from-top-and-fade-in {
0% {transform: translateY(-100%); opacity: 0}
100% {transform: translateY(0); opacity: 1}
}
@keyframes slide-from-bottom-and-fade-in {
0% {transform: translateY(100%); opacity: 0}
100% {transform: translateY(0); opacity: 1}
}
@keyframes fade-in-and-scale {
0% {transform:scale(0.3); opacity:0;}
100% {transform:scale(1); opacity:0.5;}
}
@media screen and (max-width: 480px) {
h1{
font-size: 50px;
line-height: 60px;
}
h2{
font-size: 36px;
line-height: 44px;
}
h3{
font-size: 24px;
line-height: 32px;
}
h4{
color:var(--second);
}
}
@media screen and (max-width: 1330px) {
.limiter {
padding: 0 24px;
}
.fullwidth {
width: calc(100% + 48px);
margin-left: -24px;
margin-right: -24px;
}
}
file-ico{
width: 52px;
height: 60px;
display: inline-flex;
}
modal{
position: fixed;
width: 100vw;
height: 100vh;
left: 0;
top: 0;
display: flex;
align-items: center;
justify-content: center;
z-index: 10000;
.modal-overlay{
position: fixed;
width: 100vw;
height: 100vh;
left: 0;
top: 0;
background-color: rgba(62, 61, 64, 0.7);
z-index: 1000;
}
.modal-bar{
position: fixed;
max-width: 800px;
max-height: 100vh;
background-color: var(--white);
border: 1px solid var(--second-dis);
display: flex;
flex-direction: column;
border-radius: 12px;
z-index: 1000;
overflow: hidden;
.modal-header{
display: flex;
justify-content: space-between;
align-items: center;
margin-top: -1px;
border-bottom: 1px solid var(--second-dis);
padding: 14px 24px;
h4{
margin: 0;
}
ico{
cursor: pointer;
}
}
.modal-body{
padding: 36px 24px;
overflow-y: auto;
img{
width: 330px;
max-width: 80vw;
}
}
.modal-footer{
display: flex;
justify-content: space-between;
margin-bottom: -1px;
border-top: 1px solid var(--second-dis);
}
}
}
.combobox {
position: relative;
font-family: "PT Sans";
border: solid 1px var(--second-dis);
border-radius: 12px;
font-size: 20px;
color: var(--second-act);
padding: 8px 12px 8px 16px;
background: no-repeat left 16px center / 140px 16px url('~src/assets/images/icons/placeholder.svg');
&:hover{
border-color: var(--second);
outline: none;
}
&.active {
border-color: var(--prime);
outline: none;
}
&:disabled{
border-color: #EDEDED;
outline: none;
}
.toggle {
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
display: flex;
flex-direction: row;
align-items: center;
width: 100%;
height: 24px;
font-size: 20px;
box-sizing: border-box;
cursor: pointer;
.caption {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
width: 100%;
background-color: #ffffff;
p {
padding: 0;
overflow: hidden;
text-overflow: ellipsis;
&.faded {
color: #7f7f7f;
}
}
}
.filter {
display: none;
width: 100%;
input {
width: 100%;
padding: 8px 0;
border: 0;
}
}
&:after {
display: block;
width: 24px;
height: 20px;
margin-left: auto;
background: url('~src/assets/images/icons/arrow_drop_down_grey_24dp.svg') 50% 50% no-repeat;
content: "";
transition: transform 0.2s;
}
&:hover:after {
background: url('~src/assets/images/icons/arrow_drop_down_dark_24dp.svg') 50% 50% no-repeat;
}
}
&.active .toggle:after {
background: url('~src/assets/images/icons/arrow_drop_down_24dp.svg') 50% 50% no-repeat;
}
.dropdown {
display: none;
position: absolute;
top: calc(100% + 1px);
left: -1px;
width: calc(100% + 2px);
margin-bottom: 50px;
background-color: #ffffff;
border: #dfdfdf solid 1px;
border-radius: 4px;
box-shadow: rgba(0, 0, 0, 0.16) 0 2px 3px 0;
overflow: hidden;
z-index: 100;
ul {
padding: 0;
margin: 0;
max-height: 280px;
overflow: auto;
-webkit-overflow-scrolling: touch;
.empty {
padding: 10px 16px;
background-color: #f7f7f7;
color: #7f7f7f;
.add {
display: block;
color: #2c86cd;
cursor: pointer;
}
}
li {
.title {
padding: 8px 16px;
border-bottom: #dfdfdf solid 1px;
margin: 0 !important;
cursor: pointer;
p {
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
margin: 0;
padding: 0;
font-size: 16px;
&.faded {
color: #7f7f7f;
}
}
&:hover {
background-color: #f7f7f7;
}
&.selected {
background-color: #e3eff9;
}
}
}
}
}
&.active {
.toggle {
.caption {
display: none;
}
.filter {
display: block;
}
&::after {
transform: rotateZ(180deg);
}
}
.dropdown {
display: block;
}
}
}
.values {
display: flex;
flex-direction: row;
align-items: center;
flex-wrap: wrap;
.item {
display: flex;
flex-direction: row;
align-items: center;
margin: 8px 8px 0 0;
.name {
padding-right: 8px;
line-height: 20px;
p {
margin: 0;
}
.faded {
color: #7f7f7f;
}
}
.remove {
width: 16px;
height: 16px;
padding: 0;
margin: auto;
border: none;
//background: transparent url('~src/assets/images/icons/close_16dp.svg') 50% 50% no-repeat;
cursor: pointer;
}
}
}

209
src/nir/css/_buttons.scss Normal file
View File

@ -0,0 +1,209 @@
button, .btn, a.btn {
display: inline-flex;
padding: 8px 24px;
justify-content: center;
align-items: center;
gap: 10px;
cursor: pointer;
border-radius: 12px;
border: 1px solid var(--prime);
background:var(--prime);
color: #FFF;
font-family: PT Sans Narrow;
font-size: 24px;
font-style: normal;
font-weight: 700;
line-height: 32px; /* 133.333% */
letter-spacing: 0.24px;
&:hover{
border: 1px solid var(--prime-hov);
background: var(--prime-hov);
}
&:active{
border: 1px solid #004077;
background: #004077;
}
&[disabled] {
border: 1px solid #A1CAE5;
background: #A1CAE5;
}
&.outline{
background:#FFF;
color: var(--prime);
&:hover{
border: 1px solid var(--prime-hov);
color: var(--prime-hov);
}
&:active{
border: 1px solid #004077;
color: #004077;
}
&[disabled] {
border: 1px solid #A1CAE5;
color: #A1CAE5;
}
}
&.clear,&.icon{
padding: 0;
justify-content: center;
align-items: center;
gap: 10px;
cursor: pointer;
border-radius: 0;
border: none;
background-color: transparent;
color: var(--second-act);
font-family: PT Sans Narrow;
font-size: 12px;
font-style: normal;
font-weight: 400;
line-height: 100%; /* 133.333% */
letter-spacing: 100%;
}
&.trash,&.add-child,&.edit,&.delete,&.close-blue,&.move{
width: 24px;
height: 24px;
background: center no-repeat;
}
&.trash {
background-image: url('~src/assets/images/icons/trash_grey_24dp.svg');
}
&.add-child {
background-image: url('~src/assets/images/icons/add_web_page_24dp.svg');
}
&.edit {
background-image: url('~src/assets/images/icons/edit_24dp.svg');
}
&.close-blue {
background-image: url('~src/assets/images/icons/close_blue_24dp.svg');
};
&.move {
background-image: url('~src/assets/images/icons/drag-n-drop_24.svg');
};
}
div.move{
cursor: move;
width: 24px;
height: 24px;
background: center no-repeat;
background-image: url('~src/assets/images/icons/drag-n-drop_24.svg');
}
// .inline-menu.default {
// display: inline-flex;
// align-items: center;
// gap: 24px;
// padding: 8px 24px;
// background-color: #F5F4F4;
// border: #E8E8E8 solid 1px;
// border-radius: 4px;
// button {
// width: 20px;
// height: 20px;
// background: transparent none 50% 50% no-repeat;
// &.add {background-image: url('~src/assets/images/icons/note_add_20.svg');}
// &.edit {background-image: url('~src/assets/images/icons/edit_20.svg');}
// &.delete {background-image: url('~src/assets/images/icons/trash_20.svg');}
// &.move {background-image: url('~src/assets/images/icons/drag-n-drop_24.svg');}
// }
// }
// .btn {
// color: #ffffff;
// padding: 11px 24px;
// background: var(--orange-2);
// border: 1px solid var(--orange-2);
// border-radius: 4px;
// font-weight: 500;
// font-size: 0.875rem;
// line-height: 18px;
// letter-spacing: 0.02em;
// text-transform: uppercase;
// &.with-icon {
// display: flex;
// flex-direction: row;
// align-items: center;
// padding: 8px 20px 8px 12px;
// &:before {
// display: block;
// width: 24px;
// height: 24px;
// margin-right: 8px;
// background: transparent none 50% 50% no-repeat;
// content: "";
// }
// &.add {
// &:before {
// //background-image: url('~src/assets/images/icons/add_circle_white_24dp.svg');
// }
// }
// }
// &.small {
// height: 28px;
// padding: 4px 16px;
// }
// &.danger {
// background-color: #db373a;
// }
// &.secondary {
// background-color: var(--white);
// color: var(--orange-2);
// border: var(--orange-2) solid 1px;
// &.danger {
// border-color: #db373a;
// color: #db373a;
// }
// }
// &.icon {
// width: 24px;
// height: 24px;
// padding: 0;
// border-color: transparent;
// background: transparent none 50% 50% no-repeat;
// //&.reply {background-image: url('~src/assets/images/icons/add_comment_20dp.svg');}
// //&.delete {background-image: url('~src/assets/images/icons/close_20dp.svg');}
// &.trash {background-image: url('~src/assets/images/icons/delete_24dp.svg');}
// &.edit {background-image: url('~src/assets/images/icons/edit_dark_24.svg');}
// //&.chain {background-image: url('~src/assets/images/icons/linked_24dp.svg');}
// &.checkbox {
// display: flex;
// width: 18px;
// height: 18px;
// border: solid 1px #7f7f7f;
// border-radius: 2px;
// &.checked,&.mixed {
// background-color: #2c86cd;
// border-color: #2c86cd;
// }
// &.checked {
// //background-image: url('~src/assets/images/icons/checkbox_24dp.svg');
// }
// &.mixed {
// &:before {
// display: block;
// width: 12px;
// height: 2px;
// margin: auto;
// background-color: #ffffff;
// content: "";
// }
// }
// }
// }
// }

View File

@ -0,0 +1,66 @@
.documents.list.default {
font-size: 20px;
.items {
.item {
display: flex;
gap: 8px;
margin: 0 0 16px;
.value{
display: flex;
flex-direction: column;
a {
display: inline-block;
}
.description{
font-size: 16px;
line-height: 24px;
color: var(--second);
}
}
&:last-child {
margin: 0;
}
}
.none {
color: #7f7f7f;
}
}
.buttons {
margin-top: 24px;
button {
margin-right: 24px;
margin-bottom: 8px;
&:last-child {
margin-right: 0;
}
}
}
}
.documents.list.inline {
.item {
display: inline-block;
padding: 3px 30px 3px 12px;
margin: 0 12px 4px 0;
border: solid 1px rgba(0, 0, 0, 0.06);
border-radius: 12px;
//background: #e3eff9 url('~src/assets/images/icons/open_in_new_18dp.svg') calc(100% - 8px) 50% no-repeat;
font-size: 0.875rem;
a {
color: #000000;
}
}
}
@media screen and (max-width: 410px) {
.documents.list.default {
.buttons {
button {
width: 100%;
margin: 0 0 12px;
}
}
}
}

View File

@ -0,0 +1,90 @@
.dropdown {
position: absolute;
width: 250px;
right: 24px;
top: 62px;
z-index: 10;
z-index: 1000;
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
.menu {
display: flex;
flex-direction: column;
border: var(--second-dis) solid 1px;
border-radius: 4px;
box-shadow: 0 3px 6px 0 rgb(0 0 0 / 16%);
.type {
display: flex;
flex-direction: column;
background-color: var(--white);
border-bottom: var(--second-dis) solid 1px;
overflow: hidden;
&:first-child {
border-radius: 4px 4px 0 0;
}
&:last-child {
border-radius: 0 0 4px 4px;
.row {
border-bottom: none;
}
a, span {
border-bottom: none;
}
}
>&:hover {
background-color: var(--light);
}
.row {
display: flex;
flex-direction: row;
align-items: center;
padding: 12px 20px;
column-gap: 12px;
cursor: pointer;
color: var(--second-act);
.title {
}
a, span {
display: block;
padding: 12px 16px;
color: #000000;
cursor: pointer;
border-bottom: #E0E0E0 solid 1px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
&:last-child {
a, span {
border-bottom: none;
}
}
}
.sub-row {
padding: 12px 16px 12px 32px;
border-top: var(--second-dis) solid 1px;
color: var(--second);
background-color: var(--white);
cursor: pointer;
&:hover {
background-color: var(--light);
}
}
}
}
}

166
src/nir/css/_fonts.scss Normal file
View File

@ -0,0 +1,166 @@
// @font-face {
// font-family: 'Open Sans';
// src: url('../fonts/sans/OpenSans-Italic.eot');
// src: local('Open Sans Italic'), local('OpenSans-Italic'),
// url('../fonts/sans/OpenSans-Italic.eot?#iefix') format('embedded-opentype'),
// url('../fonts/sans/OpenSans-Italic.woff2') format('woff2'),
// url('../fonts/sans/OpenSans-Italic.woff') format('woff'),
// url('../fonts/sans/OpenSans-Italic.ttf') format('truetype');
// font-weight: normal;
// font-style: italic;
// }
// @font-face {
// font-family: 'Open Sans';
// src: url('../fonts/sans/OpenSans-Regular.eot');
// src: local('Open Sans Regular'), local('OpenSans-Regular'),
// url('../fonts/sans/OpenSans-Regular.eot?#iefix') format('embedded-opentype'),
// url('../fonts/sans/OpenSans-Regular.woff2') format('woff2'),
// url('../fonts/sans/OpenSans-Regular.woff') format('woff'),
// url('../fonts/sans/OpenSans-Regular.ttf') format('truetype');
// font-weight: normal;
// font-style: normal;
// }
// @font-face {
// font-family: 'Open Sans';
// src: url('../fonts/sans/OpenSans-BoldItalic.eot');
// src: local('Open Sans Bold Italic'), local('OpenSans-BoldItalic'),
// url('../fonts/sans/OpenSans-BoldItalic.eot?#iefix') format('embedded-opentype'),
// url('../fonts/sans/OpenSans-BoldItalic.woff2') format('woff2'),
// url('../fonts/sans/OpenSans-BoldItalic.woff') format('woff'),
// url('../fonts/sans/OpenSans-BoldItalic.ttf') format('truetype');
// font-weight: bold;
// font-style: italic;
// }
// @font-face {
// font-family: 'Open Sans';
// src: url('../fonts/sans/OpenSans-SemiBold.eot');
// src: local('Open Sans SemiBold'), local('OpenSans-SemiBold'),
// url('../fonts/sans/OpenSans-SemiBold.eot?#iefix') format('embedded-opentype'),
// url('../fonts/sans/OpenSans-SemiBold.woff2') format('woff2'),
// url('../fonts/sans/OpenSans-SemiBold.woff') format('woff'),
// url('../fonts/sans/OpenSans-SemiBold.ttf') format('truetype');
// font-weight: 600;
// font-style: normal;
// }
// @font-face {
// font-family: 'Open Sans';
// src: url('../fonts/sans/OpenSans-ExtraBoldItalic.eot');
// src: local('Open Sans ExtraBold Italic'), local('OpenSans-ExtraBoldItalic'),
// url('../fonts/sans/OpenSans-ExtraBoldItalic.eot?#iefix') format('embedded-opentype'),
// url('../fonts/sans/OpenSans-ExtraBoldItalic.woff2') format('woff2'),
// url('../fonts/sans/OpenSans-ExtraBoldItalic.woff') format('woff'),
// url('../fonts/sans/OpenSans-ExtraBoldItalic.ttf') format('truetype');
// font-weight: 800;
// font-style: italic;
// }
// @font-face {
// font-family: 'Open Sans';
// src: url('../fonts/sans/OpenSans-LightItalic.eot');
// src: local('Open Sans Light Italic'), local('OpenSans-LightItalic'),
// url('../fonts/sans/OpenSans-LightItalic.eot?#iefix') format('embedded-opentype'),
// url('../fonts/sans/OpenSans-LightItalic.woff2') format('woff2'),
// url('../fonts/sans/OpenSans-LightItalic.woff') format('woff'),
// url('../fonts/sans/OpenSans-LightItalic.ttf') format('truetype');
// font-weight: 300;
// font-style: italic;
// }
// @font-face {
// font-family: 'Open Sans';
// src: url('../fonts/sans/OpenSans-Bold.eot');
// src: local('Open Sans Bold'), local('OpenSans-Bold'),
// url('../fonts/sans/OpenSans-Bold.eot?#iefix') format('embedded-opentype'),
// url('../fonts/sans/OpenSans-Bold.woff2') format('woff2'),
// url('../fonts/sans/OpenSans-Bold.woff') format('woff'),
// url('../fonts/sans/OpenSans-Bold.ttf') format('truetype');
// font-weight: bold;
// font-style: normal;
// }
// @font-face {
// font-family: 'Open Sans';
// src: url('../fonts/sans/OpenSans-SemiBoldItalic.eot');
// src: local('Open Sans SemiBold Italic'), local('OpenSans-SemiBoldItalic'),
// url('../fonts/sans/OpenSans-SemiBoldItalic.eot?#iefix') format('embedded-opentype'),
// url('../fonts/sans/OpenSans-SemiBoldItalic.woff2') format('woff2'),
// url('../fonts/sans/OpenSans-SemiBoldItalic.woff') format('woff'),
// url('../fonts/sans/OpenSans-SemiBoldItalic.ttf') format('truetype');
// font-weight: 600;
// font-style: italic;
// }
// @font-face {
// font-family: 'Open Sans';
// src: url('../fonts/sans/OpenSans-ExtraBold.eot');
// src: local('Open Sans ExtraBold'), local('OpenSans-ExtraBold'),
// url('../fonts/sans/OpenSans-ExtraBold.eot?#iefix') format('embedded-opentype'),
// url('../fonts/sans/OpenSans-ExtraBold.woff2') format('woff2'),
// url('../fonts/sans/OpenSans-ExtraBold.woff') format('woff'),
// url('../fonts/sans/OpenSans-ExtraBold.ttf') format('truetype');
// font-weight: 800;
// font-style: normal;
// }
// @font-face {
// font-family: 'Open Sans';
// src: url('../fonts/sans/OpenSans-Light.eot');
// src: local('Open Sans Light'), local('OpenSans-Light'),
// url('../fonts/sans/OpenSans-Light.eot?#iefix') format('embedded-opentype'),
// url('../fonts/sans/OpenSans-Light.woff2') format('woff2'),
// url('../fonts/sans/OpenSans-Light.woff') format('woff'),
// url('../fonts/sans/OpenSans-Light.ttf') format('truetype');
// font-weight: 300;
// font-style: normal;
// }
@font-face {
font-family: 'PT Sans';
src: url('../fonts/ptsans/PT_Sans-Web-Regular.ttf');
font-style: normal;
font-weight: 400;
font-display: swap;
}
@font-face {
font-family: 'PT Sans';
src: url('../fonts/ptsans/PT_Sans-Web-Bold.ttf');
font-style: normal;
font-weight: 700;
font-display: swap;
}
@font-face {
font-family: 'PT Sans';
src: url('../fonts/ptsans/PT_Sans-Web-Italic.ttf');
font-style: italic;
font-weight: 400;
font-display: swap;
}
@font-face {
font-family: 'PT Sans';
src: url('../fonts/ptsans/PT_Sans-Web-Bolditalic.ttf');
font-style: italic;
font-weight: 700;
font-display: swap;
}
@font-face {
font-family: 'PT Sans Narrow';
src: url('../fonts/ptsans/PTSansNarrow-Regular.ttf');
font-style: itnormalalic;
font-weight: 400;
font-display: swap;
}
@font-face {
font-family: 'PT Sans Narrow';
src: url('../fonts/ptsans/PTSansNarrow-Bold.ttf');
font-style: normal;
font-weight: 700;
font-display: swap;
}

553
src/nir/css/_forms.scss Normal file
View File

@ -0,0 +1,553 @@
input, select, textarea {
width: 100%;
height: 40px;
padding: 8px 16px;
border-radius: 12px;
border: solid 1px var(--second-dis);
font-family: "PT Sans";
font-size: 20px;
color: var(--second-act);
background-color: #fff;
&:hover{
border-color: var(--second);
outline: none;
}
&:focus, &:focus-visible {
border-color: var(--prime);
outline: none;
}
&:disabled{
border-color: #EDEDED;
outline: none;
}
}
.invalid {
input, select, .textbox {
border-color: #e60046!important;
}
}
.switch {
width: 44px;
height: 24px;
margin: auto 0;
padding: 2px;
border-radius: 12px;
background-color: #fff;
border: 1px solid var(--second);
cursor: pointer;
transition: background-color 0.3s;
&:before {
display: block;
width: 18px;
height: 18px;
background-color: var(--second-dis);
border-radius: 9px;
transition: transform 0.3s;
content: '';
}
&.active {
background-color:var(--prime);
border-color:var(--prime);
&:before {
transform: translateX(20px);
background-color: #fff;
}
}
&.active{
&:hover {
background-color:var(--prime-hov);
border-color:var(--prime-hov);
&:before {
transform: translateX(20px);
}
}
&:focus{
background-color:var(--prime-act);
border-color:var(--prime-act);
&:before {
transform: translateX(20px);
}
}
}
&:not(.active):hover {
border-color:var(--second-hov);
&:before {
background-color: var(--second);
}
}
&.disabled {
opacity: 0.5;
}
}
field-date-single{
input{
background: url("/assets/images/ico/calendar_grey_24.svg") no-repeat right 12px center ;
}
}
.checkbox {
position: absolute;
z-index: -1;
opacity: 0;
}
.checkbox+label {
display: inline-flex;
align-items: center;
user-select: none;
font-size: 20px;
}
.checkbox+label::before {
content: '';
display: inline-block;
width: 24px;
height: 24px;
flex-shrink: 0;
flex-grow: 0;
margin-right: 0.5em;
background-repeat: no-repeat;
background-position: center center;
background-size: 100% 100%;
background-image: url("~/src/assets/images/icons/checkbox/checbox_none_base_24dp.svg");
}
.checkbox:checked+label::before {
background-image: url("~/src/assets/images/icons/checkbox/checbox_check_base_24dp.svg");
}
.checkbox:not(:disabled):not(:checked)+label:hover::before {
background-image: url("~/src/assets/images/icons/checkbox/checbox_none_hover_24dp.svg");
}
.checkbox:not(:disabled):checked+label:hover::before {
background-image: url("~/src/assets/images/icons/checkbox/checbox_check_hover_24dp.svg");
}
.checkbox:not(:disabled):checked:active+label::before {
background-image: url("~/src/assets/images/icons/checkbox/checbox_check_active_24dp.svg");
}
.checkbox:not(:disabled):not(:checked):active+label::before {
background-image: url("~/src/assets/images/icons/checkbox/checbox_none_active_24dp.svg");
}
.checkbox:focus:checked+label::before {
background-image: url("~/src/assets/images/icons/checkbox/checbox_check_hover_24dp.svg");
}
.checkbox:focus:not(:checked)+label::before {
background-image: url("~/src/assets/images/icons/checkbox/checbox_none_hover_24dp.svg");
}
.checkbox:disabled:checked+label::before {
background-image: url("~/src/assets/images/icons/checkbox/checbox_check_disabled_24dp.svg");
}
.checkbox:disabled:not(:checked)+label::before {
background-image: url("~/src/assets/images/icons/checkbox/checbox_none_disabled_24dp.svg");
}
form-field-document{
.area {
position: relative;
display: flex;
height: 100px;
padding: 16px;
border: var(--prime) solid 1px;
border-radius: 4px;
overflow: hidden;
font-size: 20px;
&.hover {
background-color: #e0e0e0;
}
p {
margin: auto;
color: var(--second-dis);
text-align: center;
span {
color: var(--orange-2);
cursor: pointer;
}
}
input {
display: none;
}
.indicator {
display: flex;
flex-direction: column;
justify-content: center;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
padding: 16px;
background-color: #f7f7f7;
.label {
margin-bottom: 4px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.progress {
height: 4px;
background-color: #dfdfdf;
overflow: hidden;
.fill {
width: 0;
height: 100%;
background-color: #3ca128;
}
}
}
}
.values {
display: flex;
flex-direction: column;
align-items: flex-start;
flex-wrap: nowrap;
.item {
display: flex;
flex-direction: column;
margin-top: $p;
align-items: flex-start;
.doc-item-header{
display: flex;
align-items: flex-start;
gap: $pxs;
.info{
flex-shrink: 1;
overflow: hidden;
max-width: 530px;
}
.description{
font-size: 16px;
line-height: 24px;
color: var(--second);
}
file-ico{
cursor: move;
}
}
.doc-item-form{
input{
margin-bottom: $pxs;
}
.doc-item-form-bar{
display: flex;
justify-content: flex-end;
gap: $pxs;
ico{
cursor: pointer;
display: flex;
svg{
color: var(--white);
}
}
.close{
background-color: var(--second);
border-radius: 4px;
}
.update{
background-color: var(--prime);
border-radius: 4px;
}
}
}
}
.fader {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background-color: rgba(0,0,0,0.6);
}
.form {
position: relative;
background-color: #ffffff;
z-index: 100;
border-radius: 12px;
padding: $p;
}
}
}
form-field-image{
.area {
position: relative;
display: flex;
height: 100px;
padding: 16px;
border: var(--prime) dashed 3px;
border-radius: 4px;
border-image: url('/assets/images/ico/border_gr.svg') 3 round round;
overflow: hidden;
font-size: 20px;
&.hover {
background-color: #e0e0e0;
}
p {
margin: auto;
color: var(--second-dis);
text-align: center;
span {
color: var(--orange-2);
cursor: pointer;
}
}
input {
display: none;
}
.indicator {
display: flex;
flex-direction: column;
justify-content: center;
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
padding: 16px;
background-color: #f7f7f7;
.label {
margin-bottom: 4px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
.progress {
height: 4px;
background-color: #dfdfdf;
overflow: hidden;
.fill {
width: 0;
height: 100%;
background-color: #3ca128;
}
}
}
}
.values {
display: flex;
column-gap: 24px;
row-gap: 12px;
margin-top: 8px;
overflow: hidden;
.item {
display: flex;
flex-direction: row;
max-width: 100%;
align-items: flex-start;
overflow: hidden;
.preview {
width: 80px;
height: 80px;
border: #0033661F solid 2px;
overflow: hidden;
cursor: move;
img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
}
.trash {
margin-left: 4px;
}
}
}
}
.field {
flex-direction: column;
width: 100%;
margin: 0 0 24px;
row-gap: 8px;
.caption {
color: var(--second);
font-family: PT Sans;
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: 32px;
}
.value {
.error {
margin-top: 2px;
font-size: 0.875rem;
color: #e60046;
}
}
&.readonly {
margin: 0 0 12px;
.caption {
//padding: 0;
}
}
}
@media screen and (max-width: 600px) {
.field {
margin-bottom: 8px;
.caption {
width: 100%;
padding: 0;
margin: 0 0 8px;
}
.value {
width: 100%;
margin: 0 0 16px;
}
}
}
auth-page{
.authentication {
display: flex;
flex-direction: row;
.logo {
display: flex;
width: 50%;
flex-shrink: 0;
height: 100%;
border-right: #E0E0E0 solid 1px;
text-align: center;
color: #0071BB;
}
.form {
display: flex;
flex-grow: 1;
padding: 24px;
}
.center {
width: 100%;
max-width: 416px;
margin: auto;
}
}
@media screen and (max-width: 959px) {
.authentication {
flex-direction: column;
justify-content: center;
.logo {
width: 100%;
height: auto;
border-right: none;
}
.form {
flex-grow: 0;
}
::ng-deep h2 {
text-align: center;
}
}
}
}
auth-page, auth-modal{
h2 {
margin: 0 0 24px;
font-size: 24px;
font-weight: normal;
}
.field {
margin: 0 0 16px;
label {
font-size: 14px;
color: #666666;
line-height: 20px;
}
.checkbox {
display: flex;
flex-direction: row;
gap: 12px;
margin: 0 0 12px;
&:last-child {margin: 0;}
label {
font-size: 0.875rem;
color: #86898E;
a {
color: #F9B417;
}
}
input {
flex-shrink: 0;
width: 20px;
height: 20px;
margin: 0;
padding: 0;
}
}
}
.error {
margin: 0 0 16px;
font-size: 14px;
color: #D91519;
text-align: center;
}
.bar {
display: flex;
flex-direction: row;
align-items: center;
width: 100%;
justify-content: space-between;
row-gap: 18px;
.remember {
display: flex;
flex-direction: row;
align-items: center;
input {
width: 16px;
height: 16px;
margin-right: 8px;
border-radius: 2px;
border: 1px solid #86898E;
}
}
.forget {
cursor: pointer;
display: flex;
justify-content: space-between;
}
}
.bottom {
display: flex;
flex-direction: row;
align-items: center;
justify-content: flex-end;
gap: 24px;
margin: 24px 0 0;
}
@media screen and (max-width: 600px) {
.bottom {
flex-direction: column-reverse;
button {
width: 100%;
}
}
}
}

202
src/nir/css/_grid.scss Normal file
View File

@ -0,0 +1,202 @@
.center{
align-items: center;
}
.space{
display: flex;
justify-content: center;
}
jumbotron{
.jumbotron-bg{
height: 400px;
background-size: cover;
background-position: center;
max-height: 150vw;
.jumbotron-content{
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: flex-start;
position: relative;
.user-bar{
justify-content: flex-end;
}
header-user-bar{
top: $pl;
right: 40px;
position: absolute;
}
.jumbotron-content-center{
display: flex;
flex-direction: column;
max-width: 100%;
h1{
margin: 0;
padding: $ps 0;
max-width: 100%;
}
}
}
}
.jumbotron-edit-field{
height: 60px;
background-color: var(--white);
border-bottom: 1px solid var(--second-dis);
.jumbotron-edit-field-row{
div{
display: flex;
align-items: center;
gap: $pxs;
}
display: flex;
justify-content: flex-end;
}
}
}
.content-sapce{
flex-grow: 1;
.content-grid{
display: flex;
justify-content: space-between;
margin: 40px 0 120px;
left-content{
display: none;
}
right-content{
flex-shrink: 0;
pages-menu.current{
pages-menu-item>.item{
display: flex;
}
}
}
.main-content{
max-width: 100%;
width: $page-width;
}
}
}
.this-root-page{
.content-sapce{
.content-grid{
justify-content: center;
right-content{
display: none;
}
};
}
}
@media screen and (min-width: 1330px){
.this-root-page{
.content-sapce{
.content-grid{
.main-content{
margin-left: 150px;
}
};
}
}
}
footer{
background-color: var(--bg-lt);
box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.12);
display: flex;
justify-content: center;
padding: 32px;
.footer{
display: flex;
flex-direction: column;
gap: 16px;
flex-basis: 720px;
>*{
display: inline-flex;
align-items: center;
gap: 16px;
svg{
color: var(--bk44);
}
}
.nir-link{
margin-top: 16px;
color: var(--bk44);
}
}
}
pages-menu-item{
display: flex;
flex-direction: column;
.item{
display: flex;
align-items: flex-start;
drop-down{
margin-left: -24px;
}
min-height: 24px;
>a{
margin-top: 4px;
&.active {
color: #000000;
}
}
}
}
.pages{
width: 100%;
}
@media screen and (max-width: 1024px){
footer{
padding: 24px;
}
.space{
.layout-corral{
max-width: 100vw;
}
}
right-content, left-content{
display: none;
}
.jumbotron-edit-field{
display: none;
}
}
@media screen and (max-width: 720px){
footer{
padding: 16px;
}
.space{
.layout-corral, .page-corral{
padding: 0 24px;
}
}
.copyright{
flex-direction: column;
gap: 24px;
}
}

View File

@ -0,0 +1,86 @@
.list.item.default {
padding: 24px;
margin-bottom: 24px;
background-color: #FFFFFF;
box-shadow: 0 3px 6px 0 rgba(0, 0, 0, 0.16);
.main-bar {
display: flex;
flex-direction: row;
width: 100%;
.left {
flex-grow: 1;
}
.right {
display: flex;
flex-direction: column;
margin-left: 24px;
flex-shrink: 0;
.row {
display: flex;
flex-direction: row;
button {
margin: 0 12px 0 0;
&:last-child {
margin-right: 0;
}
}
}
}
.params {
p {
margin-bottom: 14px;
&:last-child {
margin-bottom: 0;
}
}
}
}
.title {
margin-bottom: 12px;
font-weight: bold;
}
.status {
margin-bottom: 14px;
font-size: 0.875rem;
font-weight: bold;
color: #7f7f7f;
}
.yellow, .reviewing {color: #c48723;}
.green, .active {color: #669933;}
.red, .declined {color: #e60046;}
.edit {
//background-image: url("~src/assets/images/icons/edit_24dp.svg");
}
.delete {
//background-image: url("~src/assets/images/icons/delete_24dp.svg");
}
.toggle {
margin-top: auto;
margin-left: auto;
//background-image: url("~src/assets/images/icons/arrow_down_24dp.svg");
transition: transform 0.2s;
&.active {
transform: rotateZ(180deg);
}
}
.name {
margin-bottom: 14px;
font-weight: bold;
}
.details {
margin-top: 24px;
}
}
@media screen and (max-width: 767px) {
.list.item.default {
padding: 16px;
margin-left: -16px;
margin-right: -16px;
}
}

166
src/nir/css/_main-menu.scss Normal file
View File

@ -0,0 +1,166 @@
// pages-menu{
// display:flex;
// flex-direction: column;
// padding-left: 0;
// }
// pages-menu{
// padding-left: 24px;
// }
header, slider-menu{
pages-menu-item{
.item{
drop-down{
display: none;
}
a{
font-family: PT Sans;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px;
letter-spacing: 0.56px;
text-transform: uppercase;
color: var(--black);
margin: 0;
}
padding: 4px 0 0 0;
border-bottom: solid 4px transparent;
&.current{
border-color: var(--prime);
}
}
}
}
header{
height: 80px;
display: flex;
align-items: center;
justify-content: center;
background-color: var(--bg-lt);
box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.12);
.header{
display: flex;
justify-content: center;
align-items: center;
pages-menu{
display: flex;
flex-direction: row;
gap: 16px;
margin: 0 60px;
&:not(.lvl-0){
display: none;
}
}
.burger{
align-items: center;
height: 32px;
}
.header-login{
display: flex;
align-items: center;
gap: 8px;
color: var(--black);
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
ico svg{
color: var(--bk44) !important;
}
}
.header-logo{
cursor: pointer;
}
.burger:hover, .header-logo:hover, .header-login:hover ico, .item:hover{
background-color: var(--bk4);
}
.burger:active, .header-logo:active, .header-login:active ico, .item:active{
background-color: var(--bk8);
}
}
}
slider[side="left"]{
.slider-bar{
background-color: var(--bg-lt);
width: 360px;
max-width: 100vw;
.header{
box-shadow: none;
background-color: transparent;
.title{
ico svg{
color: var(--black);
}
}
}
.body{
padding: 64px 0;
pages-menu{
display: flex;
flex-direction: column;
align-items: center;
gap: 32px;
&:not(.lvl-0){
display: none;
}
}
}
}
}
@media screen and (max-width: 720px){
header{
padding: 0 24px;
.header{
width: 100%;
justify-content: space-between;
pages-menu{
display: none !important;
}
}
}
}
@media screen and (min-width: 721px){
.header{
.burger{
display: none;
}
}
}

View File

@ -0,0 +1,70 @@
header-user-bar{
cursor: pointer;
.user {
position: relative;
display: flex;
justify-content: center;
background-color: #fff;
.avatar {
width: 38px;
height: 38px;
flex-shrink: 0;
color: var(--prime);
border: 1px solid var(--prime);
background: #fff;
border-radius: 100%;
display: flex;
justify-content: center;
align-items: center;
cursor: pointer;
overflow: hidden;
.initials {
}
img {
display: block;
width: 100%;
height: 100%;
object-fit: cover;
}
}
.name{
margin: 8px 4px 0 12px;
color: var(--black);
font-family: PT Sans;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 20px; /* 142.857% */
}
.dropdown{
right: 4px;
top: 36px;
}
drop-down {
display: flex;
margin-top: 6px;
.on{
svg{
color:var(--dark)
}
}
}
}
@media screen and (max-width: 760px) {
.user {
.name{
display: none;
}
}
}
}

View File

@ -0,0 +1,604 @@
page-sections{
display: flex;
flex-direction: column;
gap:24px;
.section{
display: flex;
flex-direction: column;
}
h2{
margin-bottom: 8px;
}
h4 {
margin-bottom: -16px;
}
p+p{
padding-top: 16px;
}
page-section:first-child{
.menu .block .up{
display: none;
}
}
page-section:nth-last-child(2){
.menu .block .down{
display: none;
}
}
}
html-section {
ul{
padding: 0;
margin-bottom: 0;
>li{
list-style: none;
line-height: 32px;
text-indent: -32px;
padding-left: 32px;
&::before{
display: inline-block;
content: "";
width: 16px;
height: 2px;
background-color: var(--prime);
margin-bottom: 5px;
margin-right: 16px;
}
}
*+li{
margin-top: 24px;
}
}
ul+*{
margin-bottom: 20px;
}
}
add-section, publications-list{
.add{
position: relative;
margin: 24px 0;
.toggle{
display: flex;
align-items: center;
justify-content: center;
ico{
cursor: pointer;
}
.two-lines{
flex-grow: 1;
height: 4px;
border-top: 1px solid var(--second-dis);
border-bottom: 1px solid var(--second-dis);
}
&.active{
a{
color: var(--prime-act);
}
}
}
.dropdown{
left:calc( 50% - 125px );
top:22px;
}
}
}
.menu {
display: flex;
.block {
ico{
height: 24px;
cursor: pointer;
svg{
color: var(--second)
};
&:hover{
svg{
color: var(--second-act)
};
}
}
background: var(--light);
border: 1px solid var(--second-dis);
border-radius: 4px;
padding: 8px 24px;
display: flex;
margin-bottom: 24px;
gap: 24px
}
}
cards-section{
.cards-add{
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 16px;
border-top: 1px solid var(--second-dis);
border-bottom: 1px solid var(--second-dis);
margin-bottom: 40px;
ico{
cursor: pointer;
svg{
color: var(--prime) !important;
}
&:hover{
svg{
color: var(--prime-act) !important;
}
}
}
}
}
cards-section-items{
.items {
display: flex;
flex-direction: row;
align-items: stretch;
gap: 24px;
flex-wrap: wrap;
cards-section-item {
width: 252px;
cards-item-persons{
display: flex;
flex-direction: column;
gap: 16px;
.image{
width: 100%;
height: 338px;
border-radius: 12px;
border: 1px solid var(--second-dis);
background: url('../images/view-man.svg') var(--white) center / 65% no-repeat;
overflow: hidden;
img{
object-fit: cover;
width: 100%;
height: 100%;
}
}
.title{
font-family: PT Sans Narrow;
font-size: 24px;
font-style: normal;
font-weight: 700;
line-height: 32px;
letter-spacing: 0.24px;
color: var(--second);
}
.subtitle{
color: var(--dark);
}
.subtitle{
color: var(--dark);
}
.email{
color:var(--prime)
}
.details a{
display: inline-flex;
align-items: center;
}
}
cards-item-partners{
a{
display: block;
width: 100%;
height: 252px;
padding: 16px;
border-radius: 12px;
border: 1px solid var(--second-dis);
background-color: var(--white);
overflow: hidden;
img{
object-fit: contain;
width: 100%;
height: 100%;
transition: transform 0.1s;
&:hover{
transform: scale(1.05);
}
}
}
}
}
}
}
images-section{
display: block;
.mobile{
display: none;
}
.desctop{
display: flex;
}
.close{
position: absolute;
top:24px;
right: 24px;
}
.items {
display: flex;
flex-direction: row;
flex-wrap: wrap;
width: 100%;
gap: 8px;
img{
border-radius: 12px;
}
&.tiles{
.item{
margin-bottom: 16px;
img{
border: 1px solid var(--second-dis);
max-height: 273px;
max-width: 273px;
}
}
}
&.full-width{
display: flex;
flex-direction: column;
.item{
max-width: 100%;
margin-bottom: 32px;
img{
max-width: 100%;
}
}
}
.item {
position: relative;
img {
cursor: pointer;
}
&:last-child {
margin-bottom: 0;
}
&.full-width {
display: flex;
flex-direction: column;
img {
width: 100%;
height: auto;
}
}
}
}
.swiper-box{
width: 100% !important;
height: 75vw !important;
max-height: 400px;
}
.fullscreen {
top: 0;
left: 0;
right: 0;
bottom: 0;
z-index: 2;
position: fixed;
align-items: center;
width: 100vw;
height: 100vh;
background-color: grey;
}
@media screen and (max-width: 700px){
.carousel {
.prev, .next {
cursor: pointer;
z-index: 1;
position: absolute;
&.prev{
left: 36px;
z-index: 2;
}
&.next{
right: 36px;
}
}
.center {
width: 100%;
.slide {
width: calc( 100vw - 80px );
height: calc( (100vw - 80px) * 0.75 );
img {
}
}
}
}
}
@media screen and (max-width: 480px) {
.desctop{
display: none !important;
}
.mobile{
display: flex !important;
}
.fullscreen {
.content {
position: fixed;
display: flex;
pointer-events: none;
width:100vw;
height:100vh;
left: 0;
right: 0;
}
.prev{
z-index: 5;
margin-right: -50px;
}
.next{
z-index: 5;
margin-left: -50px;
}
}
}
}
publications-list{
.add a, .publication-read-more{
display: inline-flex;
align-items: flex-end;
gap: 8px;
}
.items {
margin: 24px 0;
}
publications-list-item {
display: block;
padding: 24px 0;
border-top: 1px solid var(--second-dis);
&:last-child{
border-bottom: 1px solid var(--second-dis);
}
.not-published{
opacity: 0.5;
}
.date{
color: var(--second);
margin-bottom: 16px;
}
.excerpt{
margin-top: $p;
font-family: PT Sans;
font-size: 20px;
font-style: normal;
font-weight: 400;
line-height: 32px;
}
.name{
margin-bottom: 24px;
}
.publication-read-more{
margin-top: 24px;
}
.content{
margin-top: $p;
display: flex;
flex-direction: column;
gap: $p;
};
}
}
publication-page {
.date{
color: var(--second);
margin-bottom: 16px;
}
.name{
margin-bottom: 24px;
}
.content{
margin-top: $p;
display: flex;
flex-direction: column;
gap: $p;
};
.publication-page-back {
display: inline-flex;
align-items: center;
gap: 8px;
margin-top: 24px;
}
}
gellery{
.poster{
height: 468px;
max-width: calc( 100vw - 80px);
max-height: calc( (100vw - 80px ) * 0.7 );
margin-bottom: 8px;
overflow: hidden;
cursor: pointer;
>img{
height: 100%;
border: 1px solid var(--second-dis);
background-color: var(--second-dis);
border-radius: 12px;
}
}
.posters{
display: flex;
flex-wrap: wrap;
align-content: flex-start;
gap: 8px;
.item{
width: 72px;
height: 52px;
border: 1px solid var(--prime);
cursor: pointer;
:hover{
border-color: var(--prime-act);
}
img{
object-fit: cover;
object-position: 50% 20%;
width: 100%;
height: 100%;
}
}
}
.gellery-fullscreen{
position: fixed;
width: 100vw;
height: 100vh;
z-index: 1000;
top:0;
left: 0;
background-color: gray;
swiper-gellery{
width: 100%;
height: 100%;
}
}
}
video-section{
cursor: pointer;
.video-box{
max-width: 720px;
height: 405px;
max-height: 52vw;
position: relative;
z-index: 0;
.poster{
object-fit: cover;
width: 100%;
height: 100%;
}
.icon{
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
}
iframe{
width: 100%;
height: 100%;
background-color: black;
}
}
}
.pagination {
display: flex;
flex-direction: row;
align-items: center;
flex-wrap: wrap;
gap: 12px;
button {
background-color: transparent;
min-width: 24px;
height: 24px;
border-radius: 4px;
font-weight: 700;
font-size: 0.875rem;
line-height: 18px;
border: 1px solid var(--second);
text-align: center;
padding: 1px 6px;
color: var(--dark);
&.active {
border-color: var(--prime);
color: var(--prime);
}
&.next {
margin-right: 20px;
border-color: transparent;
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
}
}
.dots {
width: 24px;
height: 24px;
background: transparent url("~src/assets/images/icons/more_horiz_20dp.svg") no-repeat center;
}
.count {
display: flex;
justify-content: right;
flex-grow: 1;
color: var(--black);
font-size: 16px;
}
}
@media screen and (max-width: 767px) {
.pagination {
.next {
display: none;
}
.count {
display: none;
}
}
}

202
src/nir/css/_registry.scss Normal file
View File

@ -0,0 +1,202 @@
.registry {
.filters{
display: flex;
gap:24px;
align-items: flex-end;
}
.bar {
background-color: var(--second);
display: flex;
align-items: center;
justify-content: space-between;
padding: 12px 24px;
margin-bottom: 24px;
.name{
color: var(--white);
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 24px; /* 150% */
}
.menu{
display: flex;
gap: $p;
svg{
cursor: pointer;
color: var(--white);
}
}
drop-down{
margin-left: 24px;
}
}
registry-category {
display: block;
.bar{
background-color: var(--light);
border-top: 1px solid var(--second-dis);
border-bottom: 1px solid var(--second-dis);
.name{
color: var(--dark);
}
.menu{
svg{
color: var(--second);
}
}
}
}
}
.top-panel {
.buttons {
margin-bottom: 32px;
}
.filters {
padding: 16px 0 24px;
.search {
flex-grow: 1;
label {
margin-bottom: 2px;
color: var(--second);
}
input {
height: 40px;
padding: 8px 52px 8px 16px;
border: 1px solid (--second-dis);
border-radius: 12px;
background: #ffffff url('~src/assets/images/icons/search_24dp.svg') calc(100% - 12px) 50% no-repeat;
}
}
.advanced {
margin-left: 24px;
}
}
}
registry-entries {
display: block;
padding-bottom: 24px;
}
registry-category{
.bar {
display: flex;
flex-direction: row;
align-items: center;
padding: 12px 24px;
cursor: pointer;
.name {
margin-right: auto;
font-size: 1.125rem;
font-weight: 700;
}
.menu {
display: flex;
flex-direction: row;
gap: 24px;
button {
width: 24px;
height: 24px;
}
}
.expand {
margin-left: 48px;
button {
width: 24px;
height: 24px;
transform: rotateZ(180deg);
transition: transform 0.3s;
&.less {transform: rotateZ(0);}
}
}
}
}
.items {
min-height: 20px;
}
registry-entry {
display: block;
padding: 16px 24px;
border-bottom: #E8E8E8 solid 1px;
&:first-child {
border-top: #E8E8E8 solid 1px;
}
.main {
.name {
margin-right: 24px;
}
.menu-entry{
display: inline-flex;
gap: 24px;
}
.toggle {
margin-left: auto;
button {
display: block;
width: 20px;
height: 20px;
padding: 0;
background: transparent url('~src/assets/images/icons/expand_less_20.svg') 50% 50% no-repeat;
transform: rotateZ(180deg);
transition: transform 0.3s;
&.less {
transform: rotateZ(0);
}
}
}
.state {
display: inline-block;
padding: 0 8px;
border-radius: 10px;
background-color: #777777;
color: #ffffff;
font-size: 0.875rem;
font-weight: 700;
&.active {background-color: #28A814;}
&.suspended,&.cancelled {background-color: #D9235F;}
}
}
.details {
padding: 16px 0 0;
}
.block {
margin-bottom: 16px;
&:last-child {margin-bottom: 0}
&.row {
display: flex;
flex-direction: row;
align-items: center;
}
}
}
pagination{
display: block;
padding: 0 24px;
&:first-child {
margin-bottom: 12px;
}
&:last-child {
margin-top: 12px;
}
}
@media screen and (max-width: 1330px) {
registry-entry {
padding: 16px 0;
}
}

234
src/nir/css/_slider.scss Normal file
View File

@ -0,0 +1,234 @@
.slider-bar {
max-width: 720px;
background-color: #ffffff;
&.right-side{
animation: slide-from-right 0.3s;
right: 0;
box-shadow: -3px 0 6px 0 rgba(0, 0, 0, 0.16);
}
&.left-side{
animation: slide-from-left 0.3s;
left: 0;
box-shadow: 3px 0 6px 0 rgba(0, 0, 0, 0.16);
}
z-index: 110;
.header {
padding: 16px 24px;
background: #F8F8F8;
box-shadow: 0px 2px 8px 0px rgba(0, 0, 0, 0.12);
.title {
h2 {
font-family: PT Sans;
font-size: 20px;
font-style: normal;
font-weight: 700;
line-height: 28px;
}
ico{
cursor: pointer;
}
}
.stepper {
padding: var(--l) 0 0;
.items {
display: flex;
flex-direction: row;
gap: var(--l);
.item {
width: 150px;
flex-shrink: 1;
font-size: 14px;
overflow: hidden;
.num {
position: relative;
width: calc(100% - 13px);
height: var(--l);
padding: 4px 6px;
margin: 0 0 4px;
border-radius: 2px 0 0 2px;
background-color: #E8E9EB;
color: #86898E;
font-weight: bold;
&:after {
position: absolute;
left: 100%;
top: 0;
width: 13px;
height: 100%;
background: transparent url('~src/assets/images/icons/step_upcoming.svg') 100% 50% no-repeat;
content: '';
}
}
.name {
font-size: 14px;
color: #6c6c6c;
}
&.active {
.num {
background-color: #B88E12;
color: #ffffff;
&:after {
background-image: url('~src/assets/images/icons/step_active.svg');
}
}
.name {
color: #B88E12;
font-weight: bold;
}
}
&.finished {
.num {
background-color: rgba(184, 142, 18, 0.2);
color: #B88E12;
&:after {
background-image: url('~src/assets/images/icons/step_finished.svg');
}
}
.name {
color: #B88E12;
}
}
}
}
}
}
.body {
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
form-frame, object-filters{
margin: 36px 24px;
display: block;
.group .title {
margin: 16px 0;
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 700;
line-height: 24px;
}
form-field{
margin-bottom: 16px;
.field {
.caption{
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
margin-bottom: 4px;
}
input, textarea, .combobox, .area p{
border-radius: 4px;
padding: 8px 12px;
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
}
input{
height: 40px;
}
}
}
}
}
[footer] {
display: flex;
flex-direction: row;
align-items: center;
padding: 16px 24px;
background: #F8F8F8;
box-shadow: 0px -2px 8px 0px rgba(0, 0, 0, 0.12);
button{
font-family: PT Sans;
font-size: 14px;
font-style: normal;
font-weight: 400;
line-height: 24px; /* 171.429% */
letter-spacing: 0.56px;
text-transform: uppercase;
border-radius: 4px;
padding: 8px 20px;
}
.left {
.reset {
color: #6C6C6C;
cursor: pointer;
}
.notice {
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px;
}
}
.right {
margin-left: auto;
display: flex;
button {
margin-left: var(--l);
}
}
}
}
.slider-overlay {
background-color: rgba(0, 0, 0, 0.37);
}
@media screen and (max-width: 767px) {
.slider-bar {
.header, .footer {
padding: var(--m);
}
[footer] {
.left {
font-size: 14px;
}
.right {
button {
padding: var(--s) var(--m);
margin-left: var(--m);
}
}
}
}
}

60
src/nir/css/_tables.scss Normal file
View File

@ -0,0 +1,60 @@
table.default {
width: 100%;
border-collapse: collapse;
tr {
td {
padding: 6px 0;
&.caption {
width: 232px;
padding-right: 24px;
color: #86898E;
vertical-align: top;
}
&.value {
vertical-align: top;
p {
margin: 0 0 12px;
}
}
}
}
&.lined {
tr {
td {
border-bottom: #e0e0e0 solid 1px;
}
&:last-child {
td {
border-bottom: none;
}
}
}
}
}
@media screen and (max-width: 767px) {
table.default {
tr {
display: block;
td {
display: block;
padding: 0;
b {
display: block;
padding: 14px 0 0;
}
&.caption {
width: 100%;
margin: 14px 0 6px;
}
&.value {
}
}
}
&.lined tr td {
border-bottom: none;
}
}
}

51
src/nir/css/_tabs.scss Normal file
View File

@ -0,0 +1,51 @@
.tabs.default {
display: flex;
margin-bottom: 32px;
max-width: 100%;
overflow: auto;
box-shadow: inset 0px -1px var(--second-dis);
-webkit-overflow-scrolling: touch;
&.simple {
margin-bottom: 24px;
}
>div{
margin-right: -1px;
button {
padding: 8px 20px;
background: #ffffff;
border-radius: 4px 4px 0 0;
border: var(--prime) solid 1px;
color: var(--prime);
font-family: PT Sans;
font-size: 16px;
font-style: normal;
font-weight: 400;
line-height: 24px; /* 150% */
cursor: pointer;
&:last-child {
margin-right: 0;
}
span {
white-space: nowrap;
}
&:last-child {
}
&.active {
color: #ffffff;
background-color: var(--prime);
border-color: var(--prime)
}
&.disabled {
opacity: 0.7;
cursor: not-allowed;
}
&:hover {
background-color: var(--prime-act);
border-color: var(--prime-act);
color: #ffffff;
}
}
}
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

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