diff --git a/README.md b/README.md index a656620d..aeb83f74 100644 --- a/README.md +++ b/README.md @@ -25,4 +25,4 @@ This package is under active construction. ## Components 1. Loading -1. Dialogs || Alerts || Sheets \ No newline at end of file +1. Dialogs || Alerts || Sheets diff --git a/package-lock.json b/package-lock.json index 85bad05d..747288e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -336,8 +336,7 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "aproba": { "version": "1.2.0", @@ -358,14 +357,12 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -380,20 +377,17 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -510,8 +504,7 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "ini": { "version": "1.3.5", @@ -523,7 +516,6 @@ "version": "1.0.0", "bundled": true, "dev": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -538,7 +530,6 @@ "version": "3.0.4", "bundled": true, "dev": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -546,14 +537,12 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "minipass": { "version": "2.3.5", "bundled": true, "dev": true, - "optional": true, "requires": { "safe-buffer": "^5.1.2", "yallist": "^3.0.0" @@ -572,7 +561,6 @@ "version": "0.5.1", "bundled": true, "dev": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -653,8 +641,7 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "object-assign": { "version": "4.1.1", @@ -666,7 +653,6 @@ "version": "1.4.0", "bundled": true, "dev": true, - "optional": true, "requires": { "wrappy": "1" } @@ -752,8 +738,7 @@ "safe-buffer": { "version": "5.1.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "safer-buffer": { "version": "2.1.2", @@ -789,7 +774,6 @@ "version": "1.0.2", "bundled": true, "dev": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -809,7 +793,6 @@ "version": "3.0.1", "bundled": true, "dev": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -853,14 +836,12 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true, - "optional": true + "dev": true }, "yallist": { "version": "3.0.3", "bundled": true, - "dev": true, - "optional": true + "dev": true } } }, @@ -1305,6 +1286,14 @@ } } }, + "@ctrl/ngx-github-buttons": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/@ctrl/ngx-github-buttons/-/ngx-github-buttons-2.1.1.tgz", + "integrity": "sha512-WWV+J/CA5IBixGYB/aQlfIakYbX9B4n4btHx4WhVVKKQZxt8mTpmTu6DEXYzS5Srm9uvDWdsEiBWh6bPxZhB5w==", + "requires": { + "tslib": "^1.9.0" + } + }, "@ionic-native/core": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/@ionic-native/core/-/core-5.2.0.tgz", @@ -5233,8 +5222,7 @@ }, "ansi-regex": { "version": "2.1.1", - "bundled": true, - "optional": true + "bundled": true }, "aproba": { "version": "1.2.0", @@ -5252,13 +5240,11 @@ }, "balanced-match": { "version": "1.0.0", - "bundled": true, - "optional": true + "bundled": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, - "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -5271,18 +5257,15 @@ }, "code-point-at": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "concat-map": { "version": "0.0.1", - "bundled": true, - "optional": true + "bundled": true }, "console-control-strings": { "version": "1.1.0", - "bundled": true, - "optional": true + "bundled": true }, "core-util-is": { "version": "1.0.2", @@ -5385,8 +5368,7 @@ }, "inherits": { "version": "2.0.3", - "bundled": true, - "optional": true + "bundled": true }, "ini": { "version": "1.3.5", @@ -5396,7 +5378,6 @@ "is-fullwidth-code-point": { "version": "1.0.0", "bundled": true, - "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -5409,20 +5390,17 @@ "minimatch": { "version": "3.0.4", "bundled": true, - "optional": true, "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { "version": "0.0.8", - "bundled": true, - "optional": true + "bundled": true }, "minipass": { "version": "2.2.4", "bundled": true, - "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -5439,7 +5417,6 @@ "mkdirp": { "version": "0.5.1", "bundled": true, - "optional": true, "requires": { "minimist": "0.0.8" } @@ -5512,8 +5489,7 @@ }, "number-is-nan": { "version": "1.0.1", - "bundled": true, - "optional": true + "bundled": true }, "object-assign": { "version": "4.1.1", @@ -5523,7 +5499,6 @@ "once": { "version": "1.4.0", "bundled": true, - "optional": true, "requires": { "wrappy": "1" } @@ -5599,8 +5574,7 @@ }, "safe-buffer": { "version": "5.1.1", - "bundled": true, - "optional": true + "bundled": true }, "safer-buffer": { "version": "2.1.2", @@ -5630,7 +5604,6 @@ "string-width": { "version": "1.0.2", "bundled": true, - "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -5648,7 +5621,6 @@ "strip-ansi": { "version": "3.0.1", "bundled": true, - "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -5687,13 +5659,11 @@ }, "wrappy": { "version": "1.0.2", - "bundled": true, - "optional": true + "bundled": true }, "yallist": { "version": "3.0.2", - "bundled": true, - "optional": true + "bundled": true } } }, diff --git a/package.json b/package.json index 7c4e3799..e31708ca 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "@angular/pwa": "0.13.6", "@angular/router": "7.2.9", "@angular/service-worker": "7.2.9", + "@ctrl/ngx-github-buttons": "^2.1.1", "@ionic-native/core": "5.2.0", "@ionic-native/google-maps": "5.0.0-beta.24", "@ionic-native/splash-screen": "5.2.0", @@ -133,4 +134,4 @@ "platforms": [ "android" ] -} \ No newline at end of file +} diff --git a/projects/core/src/lib/bottom-sheet/bottom-sheet.component.ts b/projects/core/src/lib/bottom-sheet/bottom-sheet.component.ts index e433eb4e..62e9cfe5 100644 --- a/projects/core/src/lib/bottom-sheet/bottom-sheet.component.ts +++ b/projects/core/src/lib/bottom-sheet/bottom-sheet.component.ts @@ -42,8 +42,7 @@ export class FivBottomSheet implements AfterViewInit, OnChanges { private _element: ElementRef, private _renderer: Renderer2, private _domCtrl: DomController, - private _platform: Platform, - private sanitizer: DomSanitizer + private _platform: Platform ) { } diff --git a/projects/core/src/lib/collapsable-menu/collapsable-menu.directive.ts b/projects/core/src/lib/collapsable-menu/collapsable-menu.directive.ts index 5ffe0310..908530ee 100644 --- a/projects/core/src/lib/collapsable-menu/collapsable-menu.directive.ts +++ b/projects/core/src/lib/collapsable-menu/collapsable-menu.directive.ts @@ -11,6 +11,10 @@ export class FivCollapsableMenu { collapsed = false; hovering = false; @Input() hoverMenu = true; + @Input() width = 64; + @Input() minWidth = 270; + @Input() maxWidth = this.platform.width() * 0.28; + constructor(private sanitizer: DomSanitizer, private platform: Platform) { } @@ -21,9 +25,12 @@ export class FivCollapsableMenu { if (this.collapsed && (this.platform.is('tablet') || this.platform.is('electron') || this.platform.is('desktop'))) { return this.sanitizer - .bypassSecurityTrustStyle('min-width: 64px; max-width: 64px; --border: 0; transition: all cubic-bezier(.55,0,.1,1) 200ms;'); + // tslint:disable-next-line:max-line-length + .bypassSecurityTrustStyle(`min-width: ${this.width}px; max-width: ${this.width}px; --border: 0; transition: all cubic-bezier(.55,0,.1,1) 200ms;`); } else { - return this.sanitizer.bypassSecurityTrustStyle('--border: 0; transition: all cubic-bezier(.55,0,.1,1) 250ms;'); + return this.sanitizer + // tslint:disable-next-line:max-line-length + .bypassSecurityTrustStyle(`min-width: ${this.minWidth}px; max-width: ${this.maxWidth}px; --border: 0; transition: all cubic-bezier(.55,0,.1,1) 200ms;`); } } diff --git a/projects/core/src/lib/directives/lazy-image.directive.ts b/projects/core/src/lib/directives/lazy-image.directive.ts index 25a7d9ea..f55b3aa5 100644 --- a/projects/core/src/lib/directives/lazy-image.directive.ts +++ b/projects/core/src/lib/directives/lazy-image.directive.ts @@ -1,4 +1,4 @@ -import { FivImageViewer } from './../image-viewer/image-viewer.component'; +import { FivGalleryImage } from './../gallery-image/gallery-image.component'; import { Directive, OnInit, Input, EventEmitter, Output, Host, Self, Optional, ElementRef } from '@angular/core'; @Directive({ @@ -7,10 +7,10 @@ import { Directive, OnInit, Input, EventEmitter, Output, Host, Self, Optional, E export class LazyImageDirective implements OnInit { @Input() fivLazyImage: string; - @Output() willShow = new EventEmitter(); + @Output() willShow = new EventEmitter(); constructor( - @Host() @Self() @Optional() public fivImage: FivImageViewer, + @Host() @Self() @Optional() public fivImage: FivGalleryImage, public image: ElementRef, ) { } @@ -27,7 +27,7 @@ export class LazyImageDirective implements OnInit { }); io['POLL_INTERVAL'] = 100; if (this.fivImage) { - io.observe(this.fivImage.element.nativeElement); + io.observe(this.fivImage.image.nativeElement); } else { io.observe(this.image.nativeElement); } diff --git a/projects/core/src/lib/fivethree.core.module.ts b/projects/core/src/lib/fivethree.core.module.ts index 538ce886..7a4e61df 100644 --- a/projects/core/src/lib/fivethree.core.module.ts +++ b/projects/core/src/lib/fivethree.core.module.ts @@ -1,4 +1,5 @@ -import { FivImage } from './image/image.component'; +import { FivGallery } from './gallery/gallery.component'; +import { FivGalleryImage } from './gallery-image/gallery-image.component'; import { FivBackButton } from './back-button/back-button.component'; import { FivDialogService } from './services/dialog.service'; import { FivNetworkStatus } from './network-status/network-status.component'; @@ -37,7 +38,6 @@ import { FivDialog } from './dialog/dialog.component'; import { FivLoadingRefresherContent } from './loading-refresher-content/loading-refresher-content.component'; import { FivAppBarTab } from './app-bar-tab/app-bar-tab.component'; import { FivAppBarTabContent } from './app-bar-tab-content/app-bar-tab-content.component'; -import { FivImageViewer } from './image-viewer/image-viewer.component'; import { FivToolbarSearch } from './toolbar-search/toolbar-search.component'; import { FivButtons } from './buttons/buttons.component'; import { FivButton } from './button/button.component'; @@ -48,7 +48,6 @@ import { FivOverlayService } from './services/overlay.service'; import { FivOverlay } from './overlay/overlay.component'; import { FivOverlayContent } from './overlay-content/overlay-content.component'; import { LazyImageDirective } from './directives/lazy-image.directive'; -import { FivImageGallery } from './image-gallery/image-gallery.component'; export class MyHammerConfig extends HammerGestureConfig { @@ -95,9 +94,8 @@ export class MyHammerConfig extends HammerGestureConfig { FivDialog, FivAppBarTab, FivAppBarTabContent, - FivImage, - FivImageGallery, - FivImageViewer, + FivGalleryImage, + FivGallery, FivButtons, FivButton, FivPopover, @@ -109,7 +107,6 @@ export class MyHammerConfig extends HammerGestureConfig { LazyImageDirective ], entryComponents: [ - FivImageViewer, FivPopover, FivOverlayContent, FivNetworkStatus, @@ -146,9 +143,8 @@ export class MyHammerConfig extends HammerGestureConfig { FivDialog, FivAppBarTab, FivAppBarTabContent, - FivImage, - FivImageGallery, - FivImageViewer, + FivGalleryImage, + FivGallery, FivButtons, FivButton, FivExpandableIndicator, diff --git a/projects/core/src/lib/gallery-image/gallery-image.component.html b/projects/core/src/lib/gallery-image/gallery-image.component.html new file mode 100644 index 00000000..b4380dc1 --- /dev/null +++ b/projects/core/src/lib/gallery-image/gallery-image.component.html @@ -0,0 +1,9 @@ + + + +
+ + + +
\ No newline at end of file diff --git a/projects/core/src/lib/image/image.component.scss b/projects/core/src/lib/gallery-image/gallery-image.component.scss similarity index 69% rename from projects/core/src/lib/image/image.component.scss rename to projects/core/src/lib/gallery-image/gallery-image.component.scss index fd77ca45..baacf3c3 100644 --- a/projects/core/src/lib/image/image.component.scss +++ b/projects/core/src/lib/gallery-image/gallery-image.component.scss @@ -1,13 +1,15 @@ :host { display: block; --max-height: 100%; + --border-radius: 0px; } .backdrop { - background: rgba(0, 0, 0, 0.97); width: 100vw; height: 100vh; + opacity: 0.97; position: absolute; + transition: background-color 300ms; } .thumbnail { @@ -17,6 +19,7 @@ height: auto; max-height: var(--max-height); width: 100%; + border-radius: var(--border-radius); } .hidden { @@ -24,6 +27,8 @@ } .viewer-image { + object-position: center; + object-fit: cover; position: absolute; top: 50%; left: 50%; @@ -32,4 +37,5 @@ max-height: 100%; width: auto; max-width: 100%; -} + border-radius: var(--border-radius); +} \ No newline at end of file diff --git a/projects/core/src/lib/image/image.component.ts b/projects/core/src/lib/gallery-image/gallery-image.component.ts similarity index 78% rename from projects/core/src/lib/image/image.component.ts rename to projects/core/src/lib/gallery-image/gallery-image.component.ts index 19576bf3..28211d48 100644 --- a/projects/core/src/lib/image/image.component.ts +++ b/projects/core/src/lib/gallery-image/gallery-image.component.ts @@ -1,14 +1,14 @@ -import { Platform } from '@ionic/angular'; -import { Component, OnInit, Input, ElementRef, ViewChild, Host, Optional, Output, EventEmitter } from '@angular/core'; +import { FivGallery } from './../gallery/gallery.component'; +import { Component, OnInit, Input, ElementRef, ViewChild, Host, Optional } from '@angular/core'; import { SafeResourceUrl } from '@angular/platform-browser'; import { trigger, transition, style, animate, state, AnimationEvent, keyframes } from '@angular/animations'; import { FivOverlay } from '../overlay/overlay.component'; -import { FivImageGallery } from '../image-gallery/image-gallery.component'; +import { ImageService } from '../services/image.service'; @Component({ - selector: 'fiv-image', - templateUrl: './image.component.html', - styleUrls: ['./image.component.scss'], + selector: 'fiv-gallery-image', + templateUrl: './gallery-image.component.html', + styleUrls: ['./gallery-image.component.scss'], animations: [ trigger('image', [ transition('* => in', [ @@ -19,7 +19,8 @@ import { FivImageGallery } from '../image-gallery/image-gallery.component'; transform: 'translate(0%,0%)', height: '{{height}}px', width: '{{width}}px', - opacity: 1 + opacity: 1, + borderRadius: '*' }), animate('160ms', style({ @@ -29,7 +30,8 @@ import { FivImageGallery } from '../image-gallery/image-gallery.component'; transform: 'translate(-50%,-50%)', height: '*', width: '*', - opacity: 1 + opacity: 1, + borderRadius: '0' })) ], { params: { top: '0', left: '0', height: '*', width: '*' } }), transition('* => out', [ @@ -40,7 +42,8 @@ import { FivImageGallery } from '../image-gallery/image-gallery.component'; transform: 'translate(-50%,-50%)', height: '*', width: '*', - opacity: 1 + opacity: 1, + borderRadius: '0' }), animate('175ms', style({ @@ -50,7 +53,8 @@ import { FivImageGallery } from '../image-gallery/image-gallery.component'; transform: 'translate(0%,0%)', height: '{{height}}px', width: '{{width}}px', - opacity: 1 + opacity: 1, + borderRadius: '*' })), ], { params: { top: '0', left: '0', height: '*', width: '*', translate: '0' } }), state('hidden', style({ opacity: 0 })) @@ -62,20 +66,20 @@ import { FivImageGallery } from '../image-gallery/image-gallery.component'; keyframes([ style({ opacity: 0, offset: 0 }), style({ opacity: 0.3, offset: 0.75 }), - style({ opacity: 1, offset: 1 })]) + style({ opacity: 0.97, offset: 1 })]) ) ]), transition(':leave', [ - style({ opacity: 1 }), + style({ opacity: 0.97 }), animate('150ms', keyframes([ - style({ opacity: 1, offset: 0 }), - style({ opacity: 0.7, offset: 0.8 }), + style({ opacity: 0.97, offset: 0 }), + style({ opacity: 0.6, offset: 0.8 }), style({ opacity: 0, offset: 1 })])) ]) ])] }) -export class FivImage implements OnInit { +export class FivGalleryImage implements OnInit { @Input() src: string | SafeResourceUrl; index: number; @@ -86,9 +90,11 @@ export class FivImage implements OnInit { viewerState = 'in'; animationParams: Position; + backdropColor = 'rgb(0,0,0)'; + constructor( - private platform: Platform, - @Optional() @Host() private gallery: FivImageGallery + @Optional() @Host() private gallery: FivGallery, + private imageService: ImageService ) { } ngOnInit() { } @@ -97,6 +103,7 @@ export class FivImage implements OnInit { this.animationParams = this.getThumbnailPosition(this.image); console.log(this.animationParams); this.overlay.show(49999); + this.backdropColor = this.imageService.getAverageRGB(this.image.nativeElement); } close(position: Position) { @@ -125,8 +132,6 @@ export class FivImage implements OnInit { width: element.nativeElement.clientWidth }; } - - } export class Position { diff --git a/projects/core/src/lib/image-gallery/image-gallery.component.html b/projects/core/src/lib/gallery/gallery.component.html similarity index 86% rename from projects/core/src/lib/image-gallery/image-gallery.component.html rename to projects/core/src/lib/gallery/gallery.component.html index 0465bb93..b8494839 100644 --- a/projects/core/src/lib/image-gallery/image-gallery.component.html +++ b/projects/core/src/lib/gallery/gallery.component.html @@ -19,19 +19,19 @@ - + - -
+ (ionSlideDidChange)="slideDidChange()" (ionSlideNextStart)="ionSlideNextStart()" + (ionSlidePrevStart)="ionSlidePrevStart()" + (ionSlidesDidLoad)="onSlidesLoad()" [options]="options">
diff --git a/projects/core/src/lib/image-gallery/image-gallery.component.scss b/projects/core/src/lib/gallery/gallery.component.scss similarity index 83% rename from projects/core/src/lib/image-gallery/image-gallery.component.scss rename to projects/core/src/lib/gallery/gallery.component.scss index da63e5fc..2c493c14 100644 --- a/projects/core/src/lib/image-gallery/image-gallery.component.scss +++ b/projects/core/src/lib/gallery/gallery.component.scss @@ -20,6 +20,13 @@ } +.backdrop { + background: rgba(0, 0, 0, 0.97); + width: 100vw; + height: 100vh; + position: absolute; +} + ion-toolbar { position: absolute; diff --git a/projects/core/src/lib/image-gallery/image-gallery.component.ts b/projects/core/src/lib/gallery/gallery.component.ts similarity index 83% rename from projects/core/src/lib/image-gallery/image-gallery.component.ts rename to projects/core/src/lib/gallery/gallery.component.ts index 6ca4765b..e38904db 100644 --- a/projects/core/src/lib/image-gallery/image-gallery.component.ts +++ b/projects/core/src/lib/gallery/gallery.component.ts @@ -1,19 +1,19 @@ -import { FivImage } from './../image/image.component'; +import { FivGalleryImage, Position } from './../gallery-image/gallery-image.component'; +import { ImageService } from './../services/image.service'; import { IonSlides, DomController, Platform } from '@ionic/angular'; import { FivOverlay } from './../overlay/overlay.component'; import { - Component, OnInit, ViewChild, Input, ElementRef, Renderer2, + Component, OnInit, ViewChild, ElementRef, Renderer2, ContentChildren, QueryList, AfterContentInit, forwardRef, HostListener, Inject, ChangeDetectorRef } from '@angular/core'; -import { style, animate, AnimationBuilder, trigger, transition, keyframes } from '@angular/animations'; -import { Position } from '../image/image.component'; +import { style, animate, AnimationBuilder, trigger, transition } from '@angular/animations'; import { Key } from './keycodes.enum'; import { DOCUMENT } from '@angular/common'; @Component({ - selector: 'fiv-image-gallery', - templateUrl: './image-gallery.component.html', - styleUrls: ['./image-gallery.component.scss'], + selector: 'fiv-gallery', + templateUrl: './gallery.component.html', + styleUrls: ['./gallery.component.scss'], animations: [ trigger('scale', [ transition('void => *', [ @@ -44,17 +44,17 @@ import { DOCUMENT } from '@angular/common'; style({ opacity: 1, transform: 'translateY(-100%)' }), animate('125ms', style({ opacity: 0, transform: 'translateY(0%)' })) ]) - ]), + ]) ] }) -export class FivImageGallery implements OnInit, AfterContentInit { +export class FivGallery implements OnInit, AfterContentInit { @ViewChild('overlay') overlay: FivOverlay; @ViewChild('viewer') viewer: ElementRef; @ViewChild('slider', { read: ElementRef }) swiper: ElementRef; @ViewChild('slider') slides: IonSlides; - @ContentChildren(forwardRef(() => FivImage), { descendants: true }) images: QueryList; + @ContentChildren(forwardRef(() => FivGalleryImage), { descendants: true }) images: QueryList; // properties for the slides activeIndex = 0; @@ -62,10 +62,11 @@ export class FivImageGallery implements OnInit, AfterContentInit { zoom: true, initialSlide: 0 }; - initialImage: FivImage; + initialImage: FivGalleryImage; inFullscreen: boolean; zoomedIn: boolean; controlsVisible = true; + private slidesLoaded; @HostListener('window:keyup', ['$event']) keyEvent(event: KeyboardEvent) { @@ -82,6 +83,7 @@ export class FivImageGallery implements OnInit, AfterContentInit { private change: ChangeDetectorRef, private platform: Platform, @Inject(DOCUMENT) private document: any, + private imageService: ImageService ) { } ngOnInit() { @@ -124,7 +126,7 @@ export class FivImageGallery implements OnInit, AfterContentInit { - open(index: number, initial: FivImage) { + open(index: number, initial: FivGalleryImage) { this.options.initialSlide = index; this.overlay.show(50000); this.initialImage = initial; @@ -140,6 +142,10 @@ export class FivImageGallery implements OnInit, AfterContentInit { const position = this.getImagePosition(this.images.toArray()[this.activeIndex].image, progress); console.log('close from position', position); this.initialImage.close(position); + if (this.inFullscreen) { + this.closeFullscreen(); + } + this.slidesLoaded = false; this.overlay.hide(); } @@ -187,7 +193,24 @@ export class FivImageGallery implements OnInit, AfterContentInit { this.activeIndex = this.swiper.nativeElement.swiper.activeIndex; } + ionSlideNextStart() { + if (this.slidesLoaded) { + this.updateBackdrop(this.activeIndex + 1); + } + } + ionSlidePrevStart() { + if (this.slidesLoaded) { + this.updateBackdrop(this.activeIndex - 1); + } + } + + updateBackdrop(index: number) { + this.initialImage.backdropColor = this.imageService.getAverageRGB(this.images.toArray()[index].image.nativeElement); + } + onSlidesLoad() { + this.slidesLoaded = true; + this.activeIndex = this.swiper.nativeElement.swiper.activeIndex; this.initialImage.viewerState = 'hidden'; this.swiper.nativeElement.swiper.on('click', () => { this.handleSingleTap(); diff --git a/projects/core/src/lib/image-gallery/keycodes.enum.ts b/projects/core/src/lib/gallery/keycodes.enum.ts similarity index 100% rename from projects/core/src/lib/image-gallery/keycodes.enum.ts rename to projects/core/src/lib/gallery/keycodes.enum.ts diff --git a/projects/core/src/lib/image-viewer/image-viewer.component.html b/projects/core/src/lib/image-viewer/image-viewer.component.html deleted file mode 100644 index 68b412cd..00000000 --- a/projects/core/src/lib/image-viewer/image-viewer.component.html +++ /dev/null @@ -1,29 +0,0 @@ - -
- - - - - - - -
- - - - - - {{action.name}} - - - - - - - -
-
- \ No newline at end of file diff --git a/projects/core/src/lib/image-viewer/image-viewer.component.scss b/projects/core/src/lib/image-viewer/image-viewer.component.scss deleted file mode 100644 index 9aa6ecef..00000000 --- a/projects/core/src/lib/image-viewer/image-viewer.component.scss +++ /dev/null @@ -1,46 +0,0 @@ -:host { - display: block; - position: relative; -} - -.thumbnail { - height: auto; -} - -.backdrop { - position: absolute; - width: 100vw; - height: 100vh; - background: rgba(0, 0, 0, 0.87); - top: 0; - left: 0; - ion-icon { - color: var(--ion-color-light); - } -} - -.image-view { - width: 100%; - height: auto; - position: absolute; - top: 50%; - transform: translateY(-50%); - left: 0; -} - -.actions { - z-index: 5000; - --ion-grid-padding: 0px; - --ion-grid-column-padding: 0px; - position: fixed; - bottom: 0; - left: 0; - width: 100%; - height: 56px; - fiv-ripple { - height: 56px; - } - ion-icon { - font-size: 1.8em; - } -} \ No newline at end of file diff --git a/projects/core/src/lib/image-viewer/image-viewer.component.spec.ts b/projects/core/src/lib/image-viewer/image-viewer.component.spec.ts deleted file mode 100644 index c259994d..00000000 --- a/projects/core/src/lib/image-viewer/image-viewer.component.spec.ts +++ /dev/null @@ -1,25 +0,0 @@ -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { FivImageViewer } from './image-viewer.component'; - -describe('FivImageViewer', () => { - let component: FivImageViewer; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ FivImageViewer ] - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(FivImageViewer); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/projects/core/src/lib/image-viewer/image-viewer.component.ts b/projects/core/src/lib/image-viewer/image-viewer.component.ts deleted file mode 100644 index 65bbea8b..00000000 --- a/projects/core/src/lib/image-viewer/image-viewer.component.ts +++ /dev/null @@ -1,562 +0,0 @@ -import { SafeUrl, SafeStyle, DomSanitizer } from '@angular/platform-browser'; -import { - Component, - OnInit, - Input, - ViewEncapsulation, - Injector, - ComponentFactoryResolver, - EmbeddedViewRef, - ApplicationRef, - ComponentRef, - ViewChild, - ElementRef, - Renderer2, - ChangeDetectorRef, - Output, - EventEmitter, - HostBinding -} from '@angular/core'; -import { trigger, transition, style, animate, AnimationBuilder } from '@angular/animations'; -import { Subscription, merge, fromEvent } from 'rxjs'; -import * as Hammer from 'hammerjs'; -import { DomController, Platform } from '@ionic/angular'; -import { flatMap, tap, filter, debounceTime, takeUntil, take, repeat } from 'rxjs/operators'; - -@Component({ - selector: 'fiv-image-viewer', - templateUrl: './image-viewer.component.html', - styleUrls: ['./image-viewer.component.scss'], - encapsulation: ViewEncapsulation.None, - animations: [ - trigger('backdrop', [ - transition(':enter', [ - style({ opacity: 0 }), - // tslint:disable-next-line:max-line-length - animate('75ms 125ms linear', style({ opacity: 1 })) - ]), - transition(':leave', [ - style({ opacity: 1 }), - // tslint:disable-next-line:max-line-length - animate('100ms linear', style({ opacity: 0 })) - ]) - ]), - trigger('fade', [ - transition(':enter', [ - style({ opacity: 0 }), - animate('125ms linear', style({ opacity: 1 })) - ]), - transition(':leave', [ - style({ opacity: 1 }), - animate('150ms linear', style({ opacity: 0 })) - ]) - ]), - trigger('imageEnter', [ - transition(':enter', [ - // tslint:disable-next-line:max-line-length - style({ position: 'absolute', top: '{{top}}px', left: '{{left}}px', transform: 'translate(0,0)', height: '{{height}}px', width: '{{width}}px' }), - // tslint:disable-next-line:max-line-length - animate('120ms linear', style({ position: 'absolute', top: '50%', left: '50%', transform: 'translate(-50%,-50%)', height: 'auto', width: '100%' })) - ], { params: { top: '0px', left: '0px', height: '*', width: '*' } }) - ]), - trigger('imageLeave', [ - transition(':leave', [ - style({ position: 'absolute', top: '{{panTop}}', left: '50%', transform: 'translate(-50%,-50%)', height: 'auto', width: '100%' }), - // tslint:disable-next-line:max-line-length - animate('135ms linear', style({ position: 'absolute', top: '{{top}}px', left: '{{left}}px', transform: 'translate(0,0)', height: '{{height}}px', width: '{{width}}px' }) - ) - ], { params: { top: '0px', left: '0px', height: '*', width: '*', panTop: '50%' } }) - ]) - ] -}) -export class FivImageViewer implements OnInit { - @HostBinding('style') - get myStyle(): SafeStyle { - if (this._isOpen) { - return this.sanitizer.bypassSecurityTrustStyle(`height: 100%; width: 100%; display: block;`); - } else { - return this.sanitizer.bypassSecurityTrustStyle(`height: ${this.height}px; width: ${this.width}px; display: block;`); - } - } - - @ViewChild('thumbnail') thumbnail: ElementRef; - @ViewChild('imageView') imageView: ElementRef; - @ViewChild('footer') footer: ElementRef; - @Input() src: SafeUrl; - @Input() height; - @Input() width; - @Input() pullDistance = 150; - @Input() actions: ImageViewerAction[] = []; - @Output() fivClose = new EventEmitter(); - @Output() fivOpen = new EventEmitter(); - @Output() fivActionClick = new EventEmitter(); - componentRef: ComponentRef; - _isOpen = false; - _controlsVisible = true; - thumbnailVisible = true; - opacity = 0.87; - - thumbnailPosition: { offsetTop: number, offsetLeft: number, height: number, width: number, panTop?: string }; - scale = 1; - top: number; - left: number; - pinchend: Subscription; - pinch: Subscription; - verticalPan: Subscription; - panRemove: Subscription; - panReset: Subscription; - doubletap: Subscription; - singletap: Subscription; - closeSub: Subscription; - pinchPan: Subscription; - actionSub: Subscription; - - singletapHammer; - doubleTapHammer; - pinchHammer; - panHammer; - - - pinchCenter: { x: number, y: number }; - - constructor(private componentFactoryResolver: ComponentFactoryResolver, - private appRef: ApplicationRef, - public element: ElementRef, - private domCtrl: DomController, - private platform: Platform, - private renderer: Renderer2, - private change: ChangeDetectorRef, - private animation: AnimationBuilder, - private sanitizer: DomSanitizer, - private injector: Injector) { - } - - ngOnInit() { - } - - open(event) { - this.fivOpen.emit(this); - this.appendComponentToBody(event); - } - - getPosition(event) { - const bounds = this.thumbnail.nativeElement.getBoundingClientRect(); - return { offsetTop: bounds.top, offsetLeft: bounds.left, height: event.srcElement.clientHeight, width: event.srcElement.clientWidth }; - } - - appendComponentToBody(event) { - this.componentRef = this.componentFactoryResolver - .resolveComponentFactory(FivImageViewer) - .create(this.injector); - - this.thumbnailVisible = false; - this.componentRef.instance._isOpen = true; - this.componentRef.instance.src = this.src; - this.componentRef.instance.componentRef = this.componentRef; - this.componentRef.instance.thumbnailPosition = this.getPosition(event); - this.width = this.componentRef.instance.thumbnailPosition.width; - this.height = this.componentRef.instance.thumbnailPosition.height; - this.componentRef.instance.actions = this.actions; - - this.closeSub = this.componentRef.instance.fivClose - .pipe(take(1)) - .subscribe(() => { - this.fivClose.emit(this); - this.closeSub.unsubscribe(); - this.actionSub.unsubscribe(); - this.thumbnailVisible = true; - }); - - this.actionSub = this.componentRef.instance.fivActionClick - .subscribe((ev) => { - this.fivActionClick.emit(ev); - }); - - this.appRef.attachView(this.componentRef.hostView); - - const domElem = (this.componentRef.hostView as EmbeddedViewRef) - .rootNodes[0] as HTMLElement; - - document.body.appendChild(domElem); - - } - - remove() { - if (!this.thumbnailPosition.panTop) { - this.thumbnailPosition.panTop = this.top + 'px'; - this.change.detectChanges(); - } - this._isOpen = false; - } - clearSubscriptions(): any { - this.panRemove.unsubscribe(); - this.panReset.unsubscribe(); - this.verticalPan.unsubscribe(); - this.pinch.unsubscribe(); - this.pinchend.unsubscribe(); - this.singletap.unsubscribe(); - this.doubletap.unsubscribe(); - this.pinchPan.unsubscribe(); - } - - removeHammerManager(): any { - this.singletapHammer.destroy(); - this.doubleTapHammer.destroy(); - this.pinchHammer.destroy(); - this.panHammer.destroy(); - } - - detach(event) { - if (event.toState === 'void') { - this.appRef.detachView(this.componentRef.hostView); - this.clearSubscriptions(); - this.removeHammerManager(); - this.fivClose.emit(); - this.componentRef.destroy(); - } - } - - resetPosition() { - this.top = this.platform.height() / 2; - this.left = 0; - this.pinchCenter = { x: this.platform.width() / 2, y: this.platform.height() / 2 }; - } - - onEnter(event) { - if (event.fromState === 'void') { - // setup variables in fullscreen - this.resetPosition(); - this.setupClicks(); - this.setupPan(); - this.setupPinch(); - } - } - setupClicks(): any { - this.doubleTapHammer = new Hammer(this.imageView.nativeElement); - this.doubleTapHammer.get('tap').set({ enable: true, taps: 2 }); - - this.singletapHammer = new Hammer(this.imageView.nativeElement); - this.singletapHammer.get('tap').set({ enable: true, taps: 1 }); - - const doubletap$ = fromEvent(this.doubleTapHammer, 'tap'); - const singletap$ = fromEvent(this.singletapHammer, 'tap') - .pipe( - debounceTime(300), - takeUntil(doubletap$), - filter((event: any) => event.tapCount === 1), - repeat() - ); - - this.doubletap = doubletap$.subscribe(res => this.handleDoubleTap(res)); - this.singletap = singletap$.subscribe(res => this.handleSingleTap()); - } - - setupPinch() { - this.pinchHammer = new Hammer(this.imageView.nativeElement); - this.pinchHammer.get('pinch').set({ enable: true }); - - const pinchend$ = fromEvent(this.pinchHammer, 'pinchend'); - this.pinchend = pinchend$.subscribe((event: any) => { - - this.scale = Math.max(0, Math.min(this.scale * event.scale, 8)); - if (this.scale < 1) { - this.resetScale(); - } - }); - - const pinch$ = fromEvent(this.pinchHammer, 'pinch'); - this.pinch = pinch$ - .subscribe((event: any) => { - this.pinchCenter = event.center; - this.transform(event.scale); - this.move(event); - }); - } - - setupPan() { - // close pans - const pullDistance = 120; - this.panHammer = new Hammer(this.imageView.nativeElement); - this.panHammer.get('pan').set({ enable: true, direction: Hammer.DIRECTION_ALL }); - const panstart = fromEvent(this.panHammer, 'panstart'); - - const panend = fromEvent(this.panHammer, 'panend'); - const panmove = fromEvent(this.panHammer, 'panmove'); - - const pandown = fromEvent(this.panHammer, 'pandown'); - const panup = fromEvent(this.panHammer, 'panup'); - - const down = panstart - .pipe( - flatMap(() => pandown.pipe( - filter(() => this.scale === 1))) - ); - - const up = panstart - .pipe( - flatMap(() => panup.pipe( - filter(() => this.scale === 1))) - ); - - const verticalPan$ = merge(up, down); - - this.verticalPan = verticalPan$.subscribe((res: any) => { - this.opacity = this.calculatePanProgress(event) / 100 * 0.87; - console.log('opacity', this.opacity); - this.setBottom(this.calculateBottom(res)); - this.setTop(this.calculateTop(res)); - }); - - - const pinchPanMove = panmove - .pipe( - filter(() => this.scale > 1) - ); - - const pinchPan$ = panstart - .pipe( - tap((event: any) => this.pinchCenter = event.center), - flatMap(() => pinchPanMove - )); - - this.pinchPan = pinchPan$ - .subscribe((res: any) => { - this.move(res); - }); - - - this.panRemove = panend - .pipe( - filter((event: any) => this.scale === 1 && event.distance > pullDistance && event.maxPointers === 1), - ) - .subscribe(() => { this.remove(); }); - - this.panReset = panend - .pipe( - // tslint:disable-next-line:max-line-length - filter((event: any) => this.scale === 1 && event.distance <= pullDistance || this.scale === 1 && event.distance > pullDistance && event.maxPointers > 1) - ) - .subscribe((event) => { - this.resetPan(); - this.resetFooter(this.calculateBottom(event)); - this.opacity = 0.87; - }); - } - - move(event: any) { - if (!this.pinchCenter) { - this.pinchCenter = event.center; - } - const moveV = event.center.y - this.pinchCenter.y; - const moveH = event.center.x - this.pinchCenter.x; - this.pinchCenter = event.center; - const newX = this.restrictRawPosX(this.left + moveH); - const newY = this.restrictRawPosY(this.top + moveV); - - this.setTop(newY); - this.setLeft(newX); - } - - restrictRawPosX(pos) { - const viewportDim = this.platform.width(); - const imageWidth = this.getCurrentImageWidth() / this.scale; - const borderPos = (this.getCurrentImageWidth() - Math.min(viewportDim, imageWidth)) / 2; - if (pos < borderPos * -1) { - return borderPos * -1; - } else if (pos > borderPos) { - return borderPos; - } - return pos; - } - - restrictRawPosY(pos) { - const viewportDim = this.platform.height(); - const imageHeight = this.getCurrentImageHeight() / this.scale; - const offset = this.platform.height() / 2; - let borderPos = pos; - if (this.getCurrentImageHeight() > this.platform.height()) { - borderPos = (this.getCurrentImageHeight() - Math.max(viewportDim, imageHeight)) / 2; - } else { - borderPos = (this.getCurrentImageHeight() - Math.min(viewportDim, imageHeight)) / 2; - } - if (pos < borderPos * -1 + offset) { - return borderPos * -1 + offset; - } else if (pos > borderPos + offset) { - return borderPos + offset; - } - return pos; - } - - setBottom(bottom: number) { - this.domCtrl.write(() => { - if (this._controlsVisible && this.footer) { - this.renderer.setStyle(this.footer.nativeElement, 'bottom', `-${bottom}px`); - } - }); - - } - - calculatePanProgress(event: any): number { - const pullDistance = 120; - return Math.abs(100 * event.distance / pullDistance); - } - - transform(scale) { - const s = Math.max(0, Math.min(this.scale * scale, 8)); - this.setScale(s, true); - } - - calculateBottom(event) { - const progress = this.calculatePanProgress(event); - return event.distance * progress / 100; - } - - setScale(scale, skip?) { - if (!skip) { - this.scale = scale; - } - this.domCtrl.write(() => { - if (this.imageView) { - this.renderer.setStyle(this.imageView.nativeElement, 'transform', `translateY(-50%) scale(${scale})`); - } - }); - } - - setTop(top) { - this.top = top; - this.thumbnailPosition.panTop = this.top + 'px'; - this.domCtrl.write(() => { - if (this.imageView) { - this.renderer.setStyle(this.imageView.nativeElement, 'top', `${top}px`); - } - }); - } - - setLeft(left) { - this.left = left; - this.domCtrl.write(() => { - if (this.imageView) { - this.renderer.setStyle(this.imageView.nativeElement, 'left', `${left}px`); - } - }); - } - - calculateTop(event: any) { - const distance = event.distance; - const progress = Math.abs(100 * distance / this.pullDistance); - - if (progress <= 100) { - return this.platform.height() / 2 + distance; - } else if (progress >= 100 && progress < 200) { - return this.platform.height() / 2 + this.pullDistance + this.pullDistance / 2 * (progress - 100) / 100; - } else { - return this.platform.height() / 2 + this.pullDistance + this.pullDistance / 2; - } - } - - resetPan() { - const reset = this.animation.build([ - style({ top: `${this.top}px` }), - animate('150ms linear', style({ top: `${this.platform.height() / 2}px` })) - ]); - - const animation = reset.create(this.imageView.nativeElement); - animation.play(); - animation.onDone(() => { - animation.destroy(); - this.setTop(this.platform.height() / 2); - }); - } - - resetFooter(start) { - if (!this._controlsVisible) { - this.setBottom(0); - return; - } - const reset = this.animation.build([ - style({ bottom: `-${start}px` }), - animate('150ms linear', style({ bottom: `0px` })) - ]); - - const animation = reset.create(this.footer.nativeElement); - animation.play(); - animation.onDone(() => { - animation.destroy(); - this.setBottom(0); - }); - } - - animateScale(toScale: number, toPosition: { x: number, y: number }) { - // const deltaX = this.pinchCenter.x - toPosition.x; - // const deltaY = this.pinchCenter.y - toPosition.y; - const deltaX = (this.pinchCenter.x - toPosition.x) * toScale; - const deltaY = (this.pinchCenter.y - toPosition.y) * toScale; - const newLeft = this.left + deltaX / toScale; - const newTop = this.top + deltaY / toScale; - const scale = this.animation.build([ - style({ transform: `translateY(-50%) scale(${this.scale})`, top: `${this.top}px`, left: `${this.left}px` }), - animate('200ms linear', style({ transform: `translateY(-50%) scale(${toScale})`, top: `${newTop}px`, left: `${newLeft}px` })) - ]); - const animation = scale.create(this.imageView.nativeElement); - animation.play(); - animation.onDone(() => { - animation.destroy(); - this.setScale(toScale); - this.setTop(newTop); - this.setLeft(newLeft); - this.pinchCenter = toPosition; - }); - } - - resetScale() { - const t = this.platform.height() / 2; - const scale = this.animation.build([ - style({ transform: `translateY(-50%) scale(${this.scale})`, top: `${this.top}px`, left: `${this.left}px` }), - animate('200ms linear', style({ transform: `translateY(-50%) scale(${1})`, top: `${t}px`, left: `${0}px` })) - ]); - const animation = scale.create(this.imageView.nativeElement); - animation.play(); - animation.onDone(() => { - animation.destroy(); - this.setScale(1); - this.setTop(t); - this.setLeft(0); - this.pinchCenter = this.getAbsoluteCenter(); - }); - } - - handleSingleTap() { - this._controlsVisible = !this._controlsVisible; - } - - handleDoubleTap(event) { - if (this.scale === 1) { - this.animateScale(2, event.center); - } else { - this.resetScale(); - } - - } - - getCurrentImageHeight() { - return this.imageView.nativeElement.clientHeight * this.scale; - } - getCurrentImageWidth() { - return this.imageView.nativeElement.clientWidth * this.scale; - } - - getAbsoluteCenter() { - return { x: this.platform.width() / 2, y: this.platform.height() / 2 }; - } - - onActionClicked(index: number) { - this.fivActionClick.emit(index); - } -} - - - -export interface ImageViewerAction { - name?: string; - icon?: string; -} diff --git a/projects/core/src/lib/image/image.component.html b/projects/core/src/lib/image/image.component.html deleted file mode 100644 index 62850ceb..00000000 --- a/projects/core/src/lib/image/image.component.html +++ /dev/null @@ -1,9 +0,0 @@ - - - -
- - - -
\ No newline at end of file diff --git a/projects/core/src/lib/image/image.component.spec.ts b/projects/core/src/lib/image/image.component.spec.ts deleted file mode 100644 index b512c9c0..00000000 --- a/projects/core/src/lib/image/image.component.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { ImagePage } from './image.page'; - -describe('ImagePage', () => { - let component: ImagePage; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ ImagePage ], - schemas: [CUSTOM_ELEMENTS_SCHEMA], - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(ImagePage); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/projects/core/src/lib/router-item/router-item.component.html b/projects/core/src/lib/router-item/router-item.component.html index e8d437b4..f478eca4 100644 --- a/projects/core/src/lib/router-item/router-item.component.html +++ b/projects/core/src/lib/router-item/router-item.component.html @@ -1,7 +1,7 @@ - + {{text}} diff --git a/projects/core/src/lib/services/image.service.ts b/projects/core/src/lib/services/image.service.ts new file mode 100644 index 00000000..934a6423 --- /dev/null +++ b/projects/core/src/lib/services/image.service.ts @@ -0,0 +1,53 @@ +import { Injectable } from '@angular/core'; + +@Injectable({ + providedIn: 'root' +}) +export class ImageService { + + constructor() { } + + + getAverageRGB(imgEl) { + const blockSize = 5, // only visit every 5 pixels + defaultRGB = { r: 0, g: 0, b: 0 }, // for non-supporting envs + canvas = document.createElement('canvas'), + context = canvas.getContext && canvas.getContext('2d'), + rgb = { r: 0, g: 0, b: 0 }; + + let data, width, height, length, i = -4, count = 0; + + if (!context) { + return `rgb(${defaultRGB.r},${defaultRGB.g},${defaultRGB.b})`; + } + + height = canvas.height = imgEl.naturalHeight || imgEl.offsetHeight || imgEl.height; + width = canvas.width = imgEl.naturalWidth || imgEl.offsetWidth || imgEl.width; + + context.drawImage(imgEl, 0, 0); + + try { + data = context.getImageData(0, 0, width, height); + } catch (e) { + /* security error, img on diff domain */ + console.log('return default rgb', e); + return `rgb(${defaultRGB.r},${defaultRGB.g},${defaultRGB.b})`; + } + + length = data.data.length; + + while ((i += blockSize * 4) < length) { + ++count; + rgb.r += data.data[i]; + rgb.g += data.data[i + 1]; + rgb.b += data.data[i + 2]; + } + + // ~~ used to floor values + rgb.r = Math.floor(rgb.r / count); + rgb.g = Math.floor(rgb.g / count); + rgb.b = Math.floor(rgb.b / count); + + return `rgb(${rgb.r},${rgb.g},${rgb.b})`; + } +} diff --git a/projects/core/src/public_api.ts b/projects/core/src/public_api.ts index f192a105..9c57653e 100644 --- a/projects/core/src/public_api.ts +++ b/projects/core/src/public_api.ts @@ -31,12 +31,14 @@ export * from './lib/app-bar-tab/app-bar-tab.component'; export * from './lib/app-bar-tab-content/app-bar-tab-content.component'; export * from './lib/buttons/buttons.component'; export * from './lib/button/button.component'; -export * from './lib/image-viewer/image-viewer.component'; export * from './lib/network-status/network-status.component'; export * from './lib/back-button/back-button.component'; +export * from './lib/gallery/gallery.component'; +export * from './lib/gallery-image/gallery-image.component'; // export services export * from './lib/loading/loading.service'; +export * from './lib/services/image.service'; export * from './lib/services/overlay.service'; export * from './lib/services/dialog.service'; export * from './lib/services/routing-state.service'; diff --git a/src/app/app-routing.module.ts b/src/app/app-routing.module.ts index 7310c22a..4f4f80d9 100644 --- a/src/app/app-routing.module.ts +++ b/src/app/app-routing.module.ts @@ -30,7 +30,6 @@ const routes: Routes = [ { path: 'expandable', loadChildren: './pages/expandable/expandable.module#ExpandablePageModule' }, { path: 'stepper', loadChildren: './pages/stepper/stepper.module#StepperPageModule' }, { path: 'directives', loadChildren: './pages/directives/directives.module#DirectivesPageModule' }, - { path: 'test', loadChildren: './test/test.module#TestPageModule' }, { path: 'editable-label', loadChildren: './pages/editable-label/editable-label.module#EditableLabelPageModule' }, { path: '**', loadChildren: './pages/page-not-found/page-not-found.module#PageNotFoundPageModule' }, ]; diff --git a/src/app/app.component.html b/src/app/app.component.html index e97d3e36..2ab59e94 100644 --- a/src/app/app.component.html +++ b/src/app/app.component.html @@ -1,21 +1,101 @@ - + - Fivethree Components + Fivethree - + + + + + + + + Documentation + + + + + Components + + + +
+ + +
+
+ + + + Directives + + + +
+ + + + nothing yet + +
+
+ + + + Services + + + +
+ + + + nothing yet + +
+
+ + More + +
+ + + + + + + + + + + + + + + + + + + + +
diff --git a/src/app/app.component.ts b/src/app/app.component.ts index 7dc2d7e8..18edd5f7 100644 --- a/src/app/app.component.ts +++ b/src/app/app.component.ts @@ -11,93 +11,72 @@ import { FivRoutingStateService } from '@fivethree/core'; templateUrl: 'app.component.html' }) export class AppComponent { - public appPages = [ + public components = [ { title: 'App Bar', url: '/app-bar', icon: 'git-commit', - shape: 'rounded' }, { title: 'Bottom Sheet', url: '/bottom-sheet', icon: 'ios-arrow-up', - shape: 'rounded' }, { title: 'Dialog', url: '/dialog', - icon: 'notifications' + icon: 'notifications', }, { title: 'Editable Label', url: '/editable-label', icon: 'create', - shape: 'line' }, { title: 'Expandable', url: '/expandable', icon: 'resize', - shape: 'dot' }, { title: 'Icon', url: '/icon', icon: 'mail-unread', - shape: 'rounded' }, { - title: 'Image View', + title: 'Image Gallery', url: '/image', icon: 'image', - shape: 'dot' }, { title: 'Loading Indicators', url: '/loading', icon: 'time', - shape: 'line' }, - // { - // title: 'Map', - // url: '/map', - // icon: 'map' - // }, { title: 'Overflow Buttons', url: '/buttons', icon: 'more', - shape: 'rounded' }, { title: 'Password Reveal Input', url: '/password', icon: 'key', - shape: 'line' }, { title: 'Refresher', url: '/refresh', icon: 'refresh', - shape: 'dot' }, - // { - // title: 'Searchbar', - // url: '/toolbar-search', - // icon: 'search' - // }, + { title: 'Stepper', url: '/stepper', icon: 'share', - shape: 'rounded' - }, - { - title: 'Test', - url: '/test', - icon: 'bug' - }, + } + ]; + public directives = [ + ]; + public services = [ ]; constructor( diff --git a/src/app/components/header/header.component.html b/src/app/components/header/header.component.html index 7cf6178f..2a077b3e 100644 --- a/src/app/components/header/header.component.html +++ b/src/app/components/header/header.component.html @@ -8,9 +8,13 @@ {{title}} - - + + + + fivethree.io + + \ No newline at end of file diff --git a/src/app/components/header/header.component.ts b/src/app/components/header/header.component.ts index 082affb9..dbec8960 100644 --- a/src/app/components/header/header.component.ts +++ b/src/app/components/header/header.component.ts @@ -8,7 +8,7 @@ import { Component, OnInit, Input } from '@angular/core'; }) export class HeaderComponent implements OnInit { - @Input() title = 'Fivethree'; + @Input() title = 'Ionic 4 Components'; @Input() backbutton = true; constructor(private navController: NavController) { } diff --git a/src/app/pages/app-bar/app-bar.page.html b/src/app/pages/app-bar/app-bar.page.html index 301ec154..88ab09d7 100644 --- a/src/app/pages/app-bar/app-bar.page.html +++ b/src/app/pages/app-bar/app-bar.page.html @@ -55,5 +55,4 @@ - \ No newline at end of file diff --git a/src/app/pages/bottom-sheet/bottom-sheet.page.html b/src/app/pages/bottom-sheet/bottom-sheet.page.html index 4d8618b7..1c4bc389 100644 --- a/src/app/pages/bottom-sheet/bottom-sheet.page.html +++ b/src/app/pages/bottom-sheet/bottom-sheet.page.html @@ -68,7 +68,6 @@ - diff --git a/src/app/pages/buttons/buttons.page.html b/src/app/pages/buttons/buttons.page.html index a4cf6d47..c50cd5a8 100644 --- a/src/app/pages/buttons/buttons.page.html +++ b/src/app/pages/buttons/buttons.page.html @@ -60,5 +60,4 @@ - \ No newline at end of file diff --git a/src/app/pages/expandable/expandable.page.html b/src/app/pages/expandable/expandable.page.html index ff38b67d..18afbbae 100644 --- a/src/app/pages/expandable/expandable.page.html +++ b/src/app/pages/expandable/expandable.page.html @@ -34,5 +34,4 @@ - \ No newline at end of file diff --git a/src/app/pages/getting-started/getting-started.page.html b/src/app/pages/getting-started/getting-started.page.html index 42f9fdad..7ee30eed 100644 --- a/src/app/pages/getting-started/getting-started.page.html +++ b/src/app/pages/getting-started/getting-started.page.html @@ -12,5 +12,4 @@
- \ No newline at end of file diff --git a/src/app/pages/home/home.module.ts b/src/app/pages/home/home.module.ts index 450d5af2..3a79a6f1 100644 --- a/src/app/pages/home/home.module.ts +++ b/src/app/pages/home/home.module.ts @@ -8,6 +8,8 @@ import { IonicModule } from '@ionic/angular'; import { HomePage } from './home.page'; import { TranslateModule } from '@ngx-translate/core'; +import { MdoButtonModule } from '@ctrl/ngx-github-buttons'; + const routes: Routes = [ { @@ -23,8 +25,9 @@ const routes: Routes = [ IonicModule, RouterModule.forChild(routes), ComponentsModule, - TranslateModule.forChild() + TranslateModule.forChild(), + MdoButtonModule ], declarations: [HomePage] }) -export class HomePageModule {} +export class HomePageModule { } diff --git a/src/app/pages/home/home.page.html b/src/app/pages/home/home.page.html index a30aaa80..f9ebd3cc 100644 --- a/src/app/pages/home/home.page.html +++ b/src/app/pages/home/home.page.html @@ -1,28 +1,152 @@ -
-

Fivethree Components

-

Material components for Ionic and Angular

+ + + + Fivethree Ionic 4 Component Library + ![npm: version](https://flat.badgen.net/npm/v/@fivethree/core) + + + + + Lorem ipsum dolor sit amet, consetetur sadipscing elitr, sed diam nonumy + eirmod + tempor + invidunt ut labore et dolore magna aliquyam erat, sed diam voluptua. At vero eos et accusam et justo + duo + dolores et ea rebum. Stet clita kasd gubergren, no sea takimata sanctus est Lorem ipsum dolor sit + amet. + + + - - common.get-started - -
+ + + + + Ionic 4 UI Components + Components + + + Awesome content + + + + + + + + + + Learn more about the UI Library + Introduction + + + Awesome content + + + + + + + Getting Started + First Steps + + + Awesome content + + + + + + + + + Discover our VS Code Plugins + Developer Tools + + -
- - - -

Optimized for Ionic and Angular

-

Built with Angular Library adding new components and extending Ionic components.

-
- - - -
-
-
+
+
+
+ + + + Support Us + Star this project on github + + + Make our day by staring the project on GitHub + + + + + + + + Visit GitHub + + + + + +
+
+
+
+ + + + + Get in Touch + The Fivethree Team + + + You can find us on twitter and or on fivethree.io. + + + + + + + Contributions Welcome + Contributing + + + If you want to add a component or found a bug, create a pull request or file an issue! + + + + + + + More about Angular and Ionic + Resources + + + The UI Library uses Ionic and Angular + + + + + + Ionic + + + + Angular + + + + + + + -
\ No newline at end of file diff --git a/src/app/pages/home/home.page.scss b/src/app/pages/home/home.page.scss index f4241dea..93f2d8c1 100644 --- a/src/app/pages/home/home.page.scss +++ b/src/app/pages/home/home.page.scss @@ -1,13 +1,30 @@ -.docs-header { - text-align: center; - margin-top: 64px; - margin-bottom: 64px; +.big { + height: calc(100% - 20px); } -.docs-header-get-started { - margin: 60px 0; +.small { + height: 164px; } -.docs-homepage-promo { - min-height: 42vh; +ion-card { + transition: box-shadow 140ms; + + .card-content { + font-size: 12px; + } +} + +ion-card:hover { + box-shadow: 0 0.35em 1.175em rgba(0, 0, 0, 0.1), 0 0.175em 0.5em rgba(0, 0, 0, 0.08); + cursor: pointer; +} + +ion-title { + font-size: 26px; +} + +ion-title { + markdown { + display: inline-block; + } } \ No newline at end of file diff --git a/src/app/pages/icon/icon.page.html b/src/app/pages/icon/icon.page.html index 5616e809..2c4697f8 100644 --- a/src/app/pages/icon/icon.page.html +++ b/src/app/pages/icon/icon.page.html @@ -36,5 +36,4 @@ - \ No newline at end of file diff --git a/src/app/pages/image/image.page.html b/src/app/pages/image/image.page.html index 756f67b4..0c3d9519 100644 --- a/src/app/pages/image/image.page.html +++ b/src/app/pages/image/image.page.html @@ -1,40 +1,44 @@ - + - - - - - - - - - - Awesome Subtitle - Awesome Title - - - Awesome content - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/app/pages/image/image.page.scss b/src/app/pages/image/image.page.scss index 47657d89..d8722f43 100644 --- a/src/app/pages/image/image.page.scss +++ b/src/app/pages/image/image.page.scss @@ -1,4 +1,17 @@ -.test { - height: 120px; - display: block; -} \ No newline at end of file + +ion-row.big { + fiv-gallery-image { + --max-height: 86px; + } +} + +ion-row.small { + fiv-gallery-image { + --max-height: 60px; + } +} +ion-row.large { + fiv-gallery-image { + --max-height: 120px; + } +} diff --git a/src/app/pages/image/image.page.ts b/src/app/pages/image/image.page.ts index bf9f715f..b7539a30 100644 --- a/src/app/pages/image/image.page.ts +++ b/src/app/pages/image/image.page.ts @@ -1,4 +1,3 @@ -import { FivImageViewer } from './../../../../projects/core/src/lib/image-viewer/image-viewer.component'; import { Component, OnInit } from '@angular/core'; @Component({ @@ -7,34 +6,12 @@ import { Component, OnInit } from '@angular/core'; styleUrls: ['./image.page.scss'], }) export class ImagePage implements OnInit { - numbers: number[]; - - options = { - lazy: true - }; constructor() { - this.numbers = Array(5).fill(0).map((x, i) => i); } ngOnInit() { } - onActionClick(index) { - console.log('test', index); - } - - fivClose(event) { - console.log('fivClose', event); - } - - onLoad(image: FivImageViewer | HTMLImageElement) { - console.log('onload', image); - image.src = 'https://placehold.it/936x936'; - } - - log(event, number) { - console.log('slide image showed', number, event); - } } diff --git a/src/app/pages/loading/loading.page.html b/src/app/pages/loading/loading.page.html index 4953c63b..ca224f22 100644 --- a/src/app/pages/loading/loading.page.html +++ b/src/app/pages/loading/loading.page.html @@ -86,5 +86,4 @@ - \ No newline at end of file diff --git a/src/app/pages/page-not-found/page-not-found.page.html b/src/app/pages/page-not-found/page-not-found.page.html index 8713b4e2..a45f1b2a 100644 --- a/src/app/pages/page-not-found/page-not-found.page.html +++ b/src/app/pages/page-not-found/page-not-found.page.html @@ -12,5 +12,4 @@

404.text

- \ No newline at end of file diff --git a/src/app/pages/password/password.page.html b/src/app/pages/password/password.page.html index ea62ad68..d63e316c 100644 --- a/src/app/pages/password/password.page.html +++ b/src/app/pages/password/password.page.html @@ -68,5 +68,4 @@ - diff --git a/src/app/pages/stepper/stepper.page.html b/src/app/pages/stepper/stepper.page.html index 30999af3..86223aa4 100644 --- a/src/app/pages/stepper/stepper.page.html +++ b/src/app/pages/stepper/stepper.page.html @@ -155,5 +155,4 @@ - \ No newline at end of file diff --git a/src/app/test/test.module.ts b/src/app/test/test.module.ts deleted file mode 100644 index 39e56ad7..00000000 --- a/src/app/test/test.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { NgModule } from '@angular/core'; -import { CommonModule } from '@angular/common'; -import { FormsModule } from '@angular/forms'; -import { Routes, RouterModule } from '@angular/router'; - -import { IonicModule } from '@ionic/angular'; -import { FivethreeCoreModule } from '@fivethree/core'; - - -import { TestPage } from './test.page'; - -const routes: Routes = [ - { - path: '', - component: TestPage - } -]; - -@NgModule({ - imports: [ - CommonModule, - FormsModule, - IonicModule, - RouterModule.forChild(routes), - FivethreeCoreModule - ], - declarations: [TestPage] -}) -export class TestPageModule { } diff --git a/src/app/test/test.page.html b/src/app/test/test.page.html deleted file mode 100644 index 03a8ed53..00000000 --- a/src/app/test/test.page.html +++ /dev/null @@ -1,48 +0,0 @@ - - - - - - test - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/app/test/test.page.scss b/src/app/test/test.page.scss deleted file mode 100644 index b578e0b4..00000000 --- a/src/app/test/test.page.scss +++ /dev/null @@ -1,19 +0,0 @@ -#grid { - - margin-top: 100px; - /* Prevent vertical gaps */ - line-height: 0; - - -webkit-column-count: 3; - -webkit-column-gap: 0px; - -moz-column-count: 3; - -moz-column-gap: 0px; - column-count: 3; - column-gap: 0px; -} - -#grid fiv-image { - /* Just in case there are inline attributes */ - width: 100% !important; - height: auto !important; -} \ No newline at end of file diff --git a/src/app/test/test.page.spec.ts b/src/app/test/test.page.spec.ts deleted file mode 100644 index 12b75bef..00000000 --- a/src/app/test/test.page.spec.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; -import { async, ComponentFixture, TestBed } from '@angular/core/testing'; - -import { TestPage } from './test.page'; - -describe('TestPage', () => { - let component: TestPage; - let fixture: ComponentFixture; - - beforeEach(async(() => { - TestBed.configureTestingModule({ - declarations: [ TestPage ], - schemas: [CUSTOM_ELEMENTS_SCHEMA], - }) - .compileComponents(); - })); - - beforeEach(() => { - fixture = TestBed.createComponent(TestPage); - component = fixture.componentInstance; - fixture.detectChanges(); - }); - - it('should create', () => { - expect(component).toBeTruthy(); - }); -}); diff --git a/src/app/test/test.page.ts b/src/app/test/test.page.ts deleted file mode 100644 index 5e34be76..00000000 --- a/src/app/test/test.page.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Component, OnInit, ComponentRef } from '@angular/core'; -import { FivNetworkStatus, FivOverlayService } from '@fivethree/core'; - -@Component({ - selector: 'app-test', - templateUrl: './test.page.html', - styleUrls: ['./test.page.scss'], -}) -export class TestPage implements OnInit { - componentRef: ComponentRef; - - - constructor(private overlay: FivOverlayService) { } - - ngOnInit() { - } - - show() { - if (!this.componentRef) { - this.componentRef = this.overlay.createOverlay(FivNetworkStatus); - this.componentRef.instance.onClick.subscribe(this.onclick); - } else { - this.componentRef.instance.show(); - - } - } - hide() { - if (this.componentRef) { - this.componentRef.instance.hide(); - } - } - - online() { - if (this.componentRef) { - this.componentRef.instance.setStatus('online'); - } - } - offline() { - if (this.componentRef) { - this.componentRef.instance.setStatus('offline'); - } - } - - onclick(component: FivNetworkStatus) { - console.log(component); - } - - - - - - -} diff --git a/src/assets/images/photo_1.jpeg b/src/assets/images/photo_1.jpeg new file mode 100644 index 00000000..70b10cd6 Binary files /dev/null and b/src/assets/images/photo_1.jpeg differ diff --git a/src/assets/images/photo_2.jpeg b/src/assets/images/photo_2.jpeg new file mode 100644 index 00000000..9543209b Binary files /dev/null and b/src/assets/images/photo_2.jpeg differ diff --git a/src/assets/images/photo_3.jpeg b/src/assets/images/photo_3.jpeg new file mode 100644 index 00000000..877c17cd Binary files /dev/null and b/src/assets/images/photo_3.jpeg differ diff --git a/src/assets/images/photo_4.jpeg b/src/assets/images/photo_4.jpeg new file mode 100644 index 00000000..8cdf560b Binary files /dev/null and b/src/assets/images/photo_4.jpeg differ diff --git a/src/assets/images/photo_5.jpeg b/src/assets/images/photo_5.jpeg new file mode 100644 index 00000000..da47a947 Binary files /dev/null and b/src/assets/images/photo_5.jpeg differ diff --git a/src/assets/images/photo_6.jpeg b/src/assets/images/photo_6.jpeg new file mode 100644 index 00000000..68c5fc70 Binary files /dev/null and b/src/assets/images/photo_6.jpeg differ diff --git a/src/assets/images/photo_7.jpeg b/src/assets/images/photo_7.jpeg new file mode 100644 index 00000000..31f533e4 Binary files /dev/null and b/src/assets/images/photo_7.jpeg differ diff --git a/src/assets/images/photo_8.jpeg b/src/assets/images/photo_8.jpeg new file mode 100644 index 00000000..fa2ace0d Binary files /dev/null and b/src/assets/images/photo_8.jpeg differ diff --git a/src/assets/images/photo_9.jpeg b/src/assets/images/photo_9.jpeg new file mode 100644 index 00000000..7eb4fd05 Binary files /dev/null and b/src/assets/images/photo_9.jpeg differ diff --git a/src/global.scss b/src/global.scss index f35266e0..66511f9c 100644 --- a/src/global.scss +++ b/src/global.scss @@ -8,6 +8,7 @@ @import '~@ionic/angular/css/text-alignment.css'; @import '~@ionic/angular/css/text-transformation.css'; @import '~@ionic/angular/css/flex-utils.css'; + .wrapper { width: 100%; min-height: 180px; @@ -15,10 +16,22 @@ position: relative; } -.mat-tab-group.mat-primary .mat-ink-bar, .mat-tab-nav-bar.mat-primary .mat-ink-bar{ +.mat-tab-group.mat-primary .mat-ink-bar, +.mat-tab-nav-bar.mat-primary .mat-ink-bar { background: var(--ion-color-primary); - } +} + +.page-content { + min-height: var(--example-min-height); +} + +:root { + // --ion-font-family: 'Roboto Slab', serif; + +} - .page-content{ - min-height: var(--example-min-height); - } +.avatar{ + width: 24px; + height: 24px; + border-radius: 100%; +} \ No newline at end of file diff --git a/src/index.html b/src/index.html index 7292972f..756883b2 100644 --- a/src/index.html +++ b/src/index.html @@ -1,12 +1,14 @@ + Fivethree - + @@ -18,8 +20,13 @@ + + + + - + + \ No newline at end of file