ngx-text-diff
Version:
A Text Diff component for Angular.
16 lines (14 loc) • 25.4 kB
JavaScript
!function(t,n){"object"==typeof exports&&"undefined"!=typeof module?n(exports,require("@angular/core"),require("diff-match-patch"),require("rxjs"),require("@angular/cdk/scrolling"),require("@angular/common"),require("@angular/forms")):"function"==typeof define&&define.amd?define("ngx-text-diff",["exports","@angular/core","diff-match-patch","rxjs","@angular/cdk/scrolling","@angular/common","@angular/forms"],n):n((t=t||self)["ngx-text-diff"]={},t.ng.core,t.diffMatchPatch,t.rxjs,t.ng.cdk.scrolling,t.ng.common,t.ng.forms)}(this,(function(t,n,e,r,i,o,l){"use strict";
/*! *****************************************************************************
Copyright (c) Microsoft Corporation. All rights reserved.
Licensed under the Apache License, Version 2.0 (the "License"); you may not use
this file except in compliance with the License. You may obtain a copy of the
License at http://www.apache.org/licenses/LICENSE-2.0
THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
MERCHANTABLITY OR NON-INFRINGEMENT.
See the Apache Version 2.0 License for specific language governing permissions
and limitations under the License.
***************************************************************************** */function s(t,n,e,r){var i,o=arguments.length,l=o<3?n:null===r?r=Object.getOwnPropertyDescriptor(n,e):r;if("object"==typeof Reflect&&"function"==typeof Reflect.decorate)l=Reflect.decorate(t,n,e,r);else for(var s=t.length-1;s>=0;s--)(i=t[s])&&(l=(o<3?i(l):o>3?i(n,e,l):i(n,e))||l);return o>3&&l&&Object.defineProperty(n,e,l),l}function a(t,n){if("object"==typeof Reflect&&"function"==typeof Reflect.metadata)return Reflect.metadata(t,n)}function f(t,n,e,r){return new(e||(e=Promise))((function(i,o){function l(t){try{a(r.next(t))}catch(t){o(t)}}function s(t){try{a(r.throw(t))}catch(t){o(t)}}function a(t){var n;t.done?i(t.value):(n=t.value,n instanceof e?n:new e((function(t){t(n)}))).then(l,s)}a((r=r.apply(t,n||[])).next())}))}function d(t,n){var e,r,i,o,l={label:0,sent:function(){if(1&i[0])throw i[1];return i[1]},trys:[],ops:[]};return o={next:s(0),throw:s(1),return:s(2)},"function"==typeof Symbol&&(o[Symbol.iterator]=function(){return this}),o;function s(o){return function(s){return function(o){if(e)throw new TypeError("Generator is already executing.");for(;l;)try{if(e=1,r&&(i=2&o[0]?r.return:o[0]?r.throw||((i=r.return)&&i.call(r),0):r.next)&&!(i=i.call(r,o[1])).done)return i;switch(r=0,i&&(o=[2&o[0],i.value]),o[0]){case 0:case 1:i=o;break;case 4:return l.label++,{value:o[1],done:!1};case 5:l.label++,r=o[1],o=[0];continue;case 7:o=l.ops.pop(),l.trys.pop();continue;default:if(!(i=l.trys,(i=i.length>0&&i[i.length-1])||6!==o[0]&&2!==o[0])){l=0;continue}if(3===o[0]&&(!i||o[1]>i[0]&&o[1]<i[3])){l.label=o[1];break}if(6===o[0]&&l.label<i[1]){l.label=i[1],i=o;break}if(i&&l.label<i[2]){l.label=i[2],l.ops.push(o);break}i[2]&&l.ops.pop(),l.trys.pop();continue}o=n.call(t,l)}catch(t){o=[6,t],r=0}finally{e=i=0}if(5&o[0])throw o[1];return{value:o[0]?o[1]:void 0,done:!0}}([o,s])}}}var c=function(t){return null==t||!(Object.keys(t)||t).length||0===(Object.keys(t)||t).length},p=function(){function t(){this.initParser()}return t.prototype.initParser=function(){this.diffParser=new e.diff_match_patch},t.prototype.getDiffsByLines=function(t,n){var e=this;return new Promise((function(r,i){var o=e.diffParser.diff_linesToChars_(t,n),l=o.chars1,s=o.chars2,a=o.lineArray,f=e.diffParser.diff_main(l,s,!0);e.diffParser.diff_charsToLines_(f,a);var d=e.formatOutput(f);d||i("Error"),r(d)}))},t.prototype.formatOutput=function(t){var n=this,r=1,i=1;return t.reduce((function(t,o){t||(t=[]);var l=o[0],s=o[1],a=null,f=null,d=null,p=null,h=null;switch(l){case e.DIFF_EQUAL:s.split("\n").filter((function(t,n,e){return n!==e.length-1||!c(t)})).forEach((function(n){h={leftContent:d={lineNumber:r,lineContent:n,lineDiffs:[],prefix:""},rightContent:p={lineNumber:i,lineContent:n,lineDiffs:[],prefix:""},belongTo:"both",hasDiffs:!1,numDiffs:0},t.push(h),i+=1,r+=1}));break;case e.DIFF_DELETE:s.split("\n").filter((function(t,n,e){return n!==e.length-1||!c(t)})).forEach((function(e){f=t.find((function(t){return!t.leftContent&&t.rightContent&&t.rightContent.lineNumber===r&&""!==t.rightContent.prefix})),d={lineNumber:r,lineContent:e,lineDiffs:[{content:e,isDiff:!0}],prefix:"-"},f?(f.leftContent=d,f.leftContent.lineDiffs=n.getDiffParts(f.leftContent.lineContent,f.rightContent.lineContent),f.rightContent.lineDiffs=n.getDiffParts(f.rightContent.lineContent,f.leftContent.lineContent),f.belongTo="both",f.numDiffs=n.countDiffs(f)):t.push({leftContent:d,rightContent:null,hasDiffs:!0,belongTo:"left",numDiffs:1}),r+=1}));break;case e.DIFF_INSERT:s.split("\n").filter((function(t,n,e){return n!==e.length-1||!c(t)})).forEach((function(e){a=t.find((function(t){return t.leftContent&&!t.rightContent&&t.leftContent.lineNumber===i&&""!==t.leftContent.prefix})),p={lineNumber:i,lineContent:e,lineDiffs:[{content:e,isDiff:!0}],prefix:"+"},a?(a.rightContent=p,a.leftContent.lineDiffs=n.getDiffParts(a.leftContent.lineContent,a.rightContent.lineContent),a.rightContent.lineDiffs=n.getDiffParts(a.rightContent.lineContent,a.leftContent.lineContent),a.belongTo="both",a.numDiffs=n.countDiffs(a)):t.push({leftContent:null,rightContent:p,hasDiffs:!0,belongTo:"right",numDiffs:1}),i+=1}))}return t}),[])},t.prototype.countDiffs=function(t){var n=0;return t.leftContent&&(n+=t.leftContent.lineDiffs.filter((function(t){return t.isDiff})).length),t.leftContent&&(n+=t.rightContent.lineDiffs.filter((function(t){return t.isDiff})).length),n},t.prototype.getDiffParts=function(t,n){for(var e=[],r=0,i=0,o="",l="";r<t.length;)t[r]===n[i]&&i<n.length?(""!==l&&(e.push({content:l,isDiff:!0}),l=""),o+=t[r]):(""!==o&&(e.push({content:o,isDiff:!1}),o=""),l+=t[r]),r++,i++;return""!==l?e.push({content:l,isDiff:!0}):""!==o&&e.push({content:o,isDiff:!1}),e},t.ɵprov=n["ɵɵdefineInjectable"]({factory:function(){return new t},token:t,providedIn:"root"}),t=s([n.Injectable({providedIn:"root"}),a("design:paramtypes",[])],t)}(),h=function(){function t(t){this._el=t,this.element=t.nativeElement}return t.ctorParameters=function(){return[{type:n.ElementRef}]},s([n.Input(),a("design:type",String)],t.prototype,"id",void 0),t=s([n.Directive({selector:"[tdContainer]"}),a("design:paramtypes",[n.ElementRef])],t)}(),u=function(){function t(t,e,r){this.scrollService=t,this.diff=e,this.cd=r,this._hideMatchingLines=!1,this.format="SideBySide",this.left="",this.right="",this.loading=!1,this.showToolbar=!0,this.showBtnToolbar=!0,this.synchronizeScrolling=!0,this.compareResults=new n.EventEmitter,this.subscriptions=[],this.tableRows=[],this.filteredTableRows=[],this.tableRowsLineByLine=[],this.filteredTableRowsLineByLine=[],this.diffsCount=0,this.formatOptions=[{id:"side-by-side",name:"side-by-side",label:"Side by Side",value:"SideBySide",icon:"la-code"},{id:"line-by-line",name:"line-by-line",label:"Line by Line",value:"LineByLine",icon:"la-file-text"}]}return Object.defineProperty(t.prototype,"hideMatchingLines",{get:function(){return this._hideMatchingLines},set:function(t){this.hideMatchingLinesChanged(t)},enumerable:!0,configurable:!0}),t.prototype.ngOnInit=function(){var t=this;this.loading=!0,this.diffContent&&this.subscriptions.push(this.diffContent.subscribe((function(n){t.loading=!0,t.left=n.leftContent,t.right=n.rightContent,t.renderDiffs().then((function(){t.cd.detectChanges(),t.loading=!1})).catch((function(){return t.loading=!1}))}))),this.renderDiffs().then((function(){return t.loading=!1})).catch((function(n){return t.loading=!1}))},t.prototype.ngAfterViewInit=function(){this.initScrollListener()},t.prototype.ngOnDestroy=function(){this.subscriptions&&this.subscriptions.forEach((function(t){return t.unsubscribe()}))},t.prototype.hideMatchingLinesChanged=function(t){this._hideMatchingLines=t,this.hideMatchingLines?(this.filteredTableRows=this.tableRows.filter((function(t){return t.leftContent&&"-"===t.leftContent.prefix||t.rightContent&&"+"===t.rightContent.prefix})),this.filteredTableRowsLineByLine=this.tableRowsLineByLine.filter((function(t){return t.leftContent&&"-"===t.leftContent.prefix||t.rightContent&&"+"===t.rightContent.prefix}))):(this.filteredTableRows=this.tableRows,this.filteredTableRowsLineByLine=this.tableRowsLineByLine)},t.prototype.setDiffTableFormat=function(t){this.format=t},t.prototype.renderDiffs=function(){return f(this,void 0,void 0,(function(){var t;return d(this,(function(n){switch(n.label){case 0:return n.trys.push([0,2,,3]),this.diffsCount=0,t=this,[4,this.diff.getDiffsByLines(this.left,this.right)];case 1:return t.tableRows=n.sent(),this.tableRowsLineByLine=this.tableRows.reduce((function(t,n){return t||(t=[]),n.hasDiffs?(n.leftContent&&t.push({leftContent:n.leftContent,rightContent:null,belongTo:n.belongTo,hasDiffs:!0,numDiffs:n.numDiffs}),n.rightContent&&t.push({leftContent:null,rightContent:n.rightContent,belongTo:n.belongTo,hasDiffs:!0,numDiffs:n.numDiffs})):t.push(n),t}),[]),this.diffsCount=this.tableRows.filter((function(t){return t.hasDiffs})).length,this.filteredTableRows=this.tableRows,this.filteredTableRowsLineByLine=this.tableRowsLineByLine,this.emitCompareResultsEvent(),[3,3];case 2:throw n.sent();case 3:return[2]}}))}))},t.prototype.emitCompareResultsEvent=function(){var t={hasDiff:this.diffsCount>0,diffsCount:this.diffsCount,rowsWithDiff:this.tableRows.filter((function(t){return t.hasDiffs})).map((function(t){return{leftLineNumber:t.leftContent?t.leftContent.lineNumber:null,rightLineNumber:t.rightContent?t.rightContent.lineNumber:null,numDiffs:t.numDiffs}}))};this.compareResults.next(t)},t.prototype.trackTableRows=function(t,n){return n&&n.leftContent?n.leftContent.lineContent:n&&n.rightContent?n.rightContent.lineContent:void 0},t.prototype.trackDiffs=function(t,n){return n&&n.content?n.content:void 0},t.prototype.initScrollListener=function(){var t=this;this.subscriptions.push(this.scrollService.scrolled().subscribe((function(n){if(n&&t.synchronizeScrolling){var e=n.getElementRef().nativeElement.id,r=t.containers.find((function(t){return t.id!==e}));r&&r.element.scrollTo({top:n.measureScrollOffset("top"),left:n.measureScrollOffset("left")})}})))},t.ctorParameters=function(){return[{type:i.ScrollDispatcher},{type:p},{type:n.ChangeDetectorRef}]},s([n.ViewChildren(h),a("design:type",n.QueryList)],t.prototype,"containers",void 0),s([n.Input(),a("design:type",String)],t.prototype,"format",void 0),s([n.Input(),a("design:type",Object)],t.prototype,"left",void 0),s([n.Input(),a("design:type",Object)],t.prototype,"right",void 0),s([n.Input(),a("design:type",r.Observable)],t.prototype,"diffContent",void 0),s([n.Input(),a("design:type",Object)],t.prototype,"loading",void 0),s([n.Input(),a("design:type",Object)],t.prototype,"showToolbar",void 0),s([n.Input(),a("design:type",Object)],t.prototype,"showBtnToolbar",void 0),s([n.Input(),a("design:type",Boolean),a("design:paramtypes",[Boolean])],t.prototype,"hideMatchingLines",null),s([n.Input(),a("design:type",String)],t.prototype,"outerContainerClass",void 0),s([n.Input(),a("design:type",Object)],t.prototype,"outerContainerStyle",void 0),s([n.Input(),a("design:type",String)],t.prototype,"toolbarClass",void 0),s([n.Input(),a("design:type",Object)],t.prototype,"toolbarStyle",void 0),s([n.Input(),a("design:type",String)],t.prototype,"compareRowsClass",void 0),s([n.Input(),a("design:type",Object)],t.prototype,"compareRowsStyle",void 0),s([n.Input(),a("design:type",Object)],t.prototype,"synchronizeScrolling",void 0),s([n.Output(),a("design:type",Object)],t.prototype,"compareResults",void 0),t=s([n.Component({selector:"td-ngx-text-diff",template:'<td-loader-spinner [active]="loading"></td-loader-spinner>\r\n<div class="td-wrapper" [ngClass]="outerContainerClass" [ngStyle]="outerContainerStyle" *ngIf="!loading">\r\n\r\n <div [ngClass]="toolbarClass" [ngStyle]="toolbarStyle" *ngIf="showToolbar">\r\n <div class="td-toolbar-show-diff">\r\n <label class="td-checkbox-container">\r\n Only Show Lines with Differences ({{ diffsCount }})\r\n <input type="checkbox" id="showDiffs" [ngModel]="hideMatchingLines" (ngModelChange)="hideMatchingLinesChanged($event)" />\r\n <span class="checkmark"></span>\r\n </label>\r\n </div>\r\n </div>\r\n\r\n <div class="td-toolbar-select-format" *ngIf="showToolbar && showBtnToolbar">\r\n <div class="td-btn-group td-btn-group-toggle" data-toggle="buttons">\r\n <button\r\n *ngFor="let option of formatOptions"\r\n [ngClass]="{ active: format === option.value, disabled: !!option.disabled }"\r\n [name]="option.name"\r\n [id]="option.id"\r\n [disabled]="!!option.disabled"\r\n (click)="setDiffTableFormat(option.value)"\r\n >\r\n {{ option.label }}\r\n </button>\r\n </div>\r\n </div>\r\n\r\n <div class="td-table-wrapper" [ngClass]="compareRowsClass" [ngStyle]="compareRowsStyle">\r\n \x3c!-- Right side-by-side --\x3e\r\n <div class="td-table-container side-by-side" *ngIf="format === \'SideBySide\'" id="td-left-compare-container" tdContainer cdkScrollable>\r\n <table class="td-table">\r\n <tbody>\r\n <tr *ngFor="let row of filteredTableRows; trackBy: trackTableRows">\r\n <td\r\n scope="row"\r\n class="fit-column line-number-col"\r\n [ngClass]="{ \'delete-row\': row.leftContent?.prefix === \'-\', \'empty-row\': !row.leftContent?.lineContent }"\r\n >\r\n {{ row.leftContent?.lineNumber !== -1 ? row.leftContent?.lineNumber : \' \' }}\r\n </td>\r\n <td\r\n class="fit-column prefix-col"\r\n [ngClass]="{ \'delete-row\': row.leftContent?.prefix === \'-\', \'empty-row\': !row.leftContent?.lineContent }"\r\n >\r\n <span>{{ row.leftContent?.prefix || \' \' }}</span>\r\n </td>\r\n <td\r\n class="content-col"\r\n [ngClass]="{ \'delete-row\': row.leftContent?.prefix === \'-\', \'empty-row\': !row.leftContent?.lineContent }"\r\n *ngIf="!row.hasDiffs"\r\n >\r\n <span [innerHTML]="row.leftContent?.lineContent | formatLine"></span>\r\n </td>\r\n <td\r\n class="content-col"\r\n [ngClass]="{ \'delete-row\': row.leftContent?.prefix === \'-\', \'empty-row\': !row.leftContent?.lineContent }"\r\n *ngIf="row.hasDiffs"\r\n >\r\n <span\r\n [innerHTML]="diff.content | formatLine"\r\n [ngClass]="{ highlight: diff.isDiff }"\r\n *ngFor="let diff of row.leftContent?.lineDiffs; trackBy: trackDiffs"\r\n ></span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n \x3c!-- Left side-by-side --\x3e\r\n <div class="td-table-container side-by-side" *ngIf="format === \'SideBySide\'" id="td-right-compare-container" tdContainer cdkScrollable>\r\n <table class="td-table">\r\n <tbody>\r\n <tr *ngFor="let row of filteredTableRows; trackBy: trackTableRows">\r\n <td\r\n scope="row"\r\n class="fit-column line-number-col"\r\n [ngClass]="{ \'insert-row\': row.rightContent?.prefix === \'+\', \'empty-row\': !row.rightContent?.lineContent }"\r\n >\r\n {{ row.rightContent?.lineNumber !== -1 ? row.rightContent?.lineNumber : \' \' }}\r\n </td>\r\n <td\r\n class="fit-column prefix-col"\r\n [ngClass]="{ \'insert-row\': row.rightContent?.prefix === \'+\', \'empty-row\': !row.rightContent?.lineContent }"\r\n >\r\n <span>{{ row.rightContent?.prefix || \' \' }}</span>\r\n </td>\r\n <td\r\n class="content-col"\r\n [ngClass]="{ \'insert-row\': row.rightContent?.prefix === \'+\', \'empty-row\': !row.rightContent?.lineContent }"\r\n *ngIf="!row.hasDiffs"\r\n >\r\n <span [innerHTML]="row.rightContent?.lineContent | formatLine"></span>\r\n </td>\r\n <td\r\n class="content-col"\r\n [ngClass]="{ \'insert-row\': row.rightContent?.prefix === \'+\', \'empty-row\': !row.rightContent?.lineContent }"\r\n *ngIf="row.hasDiffs"\r\n >\r\n <span\r\n [innerHTML]="diff.content | formatLine"\r\n [ngClass]="{ highlight: diff.isDiff }"\r\n *ngFor="let diff of row.rightContent?.lineDiffs; trackBy: trackDiffs"\r\n ></span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n \x3c!-- Line By Line - combined table --\x3e\r\n <div class="td-table-container line-by-line" *ngIf="format === \'LineByLine\'">\r\n <table class="td-table">\r\n <tbody>\r\n <tr *ngFor="let row of filteredTableRowsLineByLine; trackBy: trackTableRows">\r\n <td scope="row" class="fit-column line-number-col-left">{{ row.leftContent?.lineNumber }}</td>\r\n <td scope="row" class="fit-column line-number-col">{{ row.rightContent?.lineNumber }}</td>\r\n <td\r\n class="fit-column prefix-col"\r\n [ngClass]="{ \'delete-row\': row.leftContent?.prefix === \'-\', \'insert-row\': row.rightContent?.prefix === \'+\' }"\r\n >\r\n <span>{{ row.leftContent?.prefix || row.rightContent?.prefix || \' \' }}</span>\r\n </td>\r\n <td\r\n class="content-col"\r\n [ngClass]="{ \'delete-row\': row.leftContent?.prefix === \'-\', \'insert-row\': row.rightContent?.prefix === \'+\' }"\r\n *ngIf="!row.hasDiffs"\r\n >\r\n <span [innerHTML]="row.leftContent?.lineContent | formatLine"></span>\r\n </td>\r\n <td\r\n class="content-col"\r\n [ngClass]="{ \'delete-row\': row.leftContent?.prefix === \'-\', \'insert-row\': row.rightContent?.prefix === \'+\' }"\r\n *ngIf="row.hasDiffs && row.leftContent && row.leftContent?.lineDiffs.length !== 0"\r\n >\r\n <span\r\n [innerHTML]="diff.content | formatLine"\r\n [ngClass]="{ highlight: diff.isDiff }"\r\n *ngFor="let diff of row.leftContent?.lineDiffs; trackBy: trackDiffs"\r\n ></span>\r\n </td>\r\n <td\r\n class="content-col"\r\n [ngClass]="{ \'delete-row\': row.leftContent?.prefix === \'-\', \'insert-row\': row.rightContent?.prefix === \'+\' }"\r\n *ngIf="row.hasDiffs && row.rightContent && row.rightContent?.lineDiffs.length !== 0"\r\n >\r\n <span\r\n [innerHTML]="diff.content | formatLine"\r\n [ngClass]="{ highlight: diff.isDiff }"\r\n *ngFor="let diff of row.rightContent?.lineDiffs; trackBy: trackDiffs"\r\n ></span>\r\n </td>\r\n </tr>\r\n </tbody>\r\n </table>\r\n </div>\r\n </div>\r\n</div>\r\n',styles:[".td-wrapper{display:grid;width:100%;grid-row-gap:10px;grid-template-columns:repeat(2,[col] 50%);grid-template-rows:repeat(2,[row] auto);background-color:#fff;color:#444}.td-toolbar-show-diff{grid-column:1;grid-row:1}.td-toolbar-select-format{margin-left:auto;grid-column:2;grid-row:1}.td-table-container{grid-column:1/2;grid-row:2;width:100%;max-width:100%;overflow-x:auto}.td-table-wrapper{display:flex;width:200%}.td-table{border:1px solid #a9a9a9;max-height:50vh;width:100%;max-width:100%}.fit-column{width:1px;white-space:nowrap}.line-number-col{position:relative;position:-webkit-sticky;position:sticky;left:0;top:auto;border-right:1px solid #ddd;color:#999;text-align:right;background-color:#f7f7f7;padding-left:10px;padding-right:10px;font-size:87.5%}.line-number-col-left{color:#999;padding-left:10px;padding-right:10px;text-align:right;background-color:#f7f7f7;font-size:87.5%}.insert-row,.insert-row>.line-number-col{background-color:#dfd;border-color:#b4e2b4}.delete-row,.delete-row>.line-number-col{background-color:#fee8e9;border-color:#e9aeae}.empty-row{background-color:#f7f7f7;height:24px}.td-table td{border-top:0;padding-top:0;padding-bottom:0;white-space:nowrap;max-width:50%}pre{margin-bottom:0}td.content-col{padding:0;margin:0;line-height:24px}td.prefix-col{padding-left:10px;padding-right:10px;line-height:24px}.td-btn-group{border-radius:4px}.td-btn-group button{background-color:rgba(23,162,184,.7);border:1px solid #17a2b8;color:#fff;cursor:pointer;float:left}.td-btn-group button:not(:last-child){border-right:none}.td-btn-group button:first-child{-webkit-border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-topleft:4px;-moz-border-radius-bottomleft:4px;border-top-left-radius:4px;border-bottom-left-radius:4px}.td-btn-group button:last-child{-webkit-border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-topright:4px;-moz-border-radius-bottomright:4px;border-top-right-radius:4px;border-bottom-right-radius:4px}.td-btn-group:after{content:'';clear:both;display:table}.td-btn-group button.active,.td-btn-group button:hover{background-color:#17a2b8}.td-checkbox-container{display:block;position:relative;padding-left:21px;margin-bottom:0;cursor:pointer;font-size:16px;line-height:28px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.td-checkbox-container input{position:absolute;opacity:0;cursor:pointer;height:0;width:0}.checkmark{position:absolute;top:7px;left:0;height:16px;width:16px;background-color:#eee}.td-checkbox-container:hover input~.checkmark{background-color:#ccc}.td-checkbox-container input:checked~.checkmark{background-color:#17a2b8}.checkmark:after{content:\"\";position:absolute;display:none}.td-checkbox-container input:checked~.checkmark:after{display:block}.td-checkbox-container .checkmark:after{left:5px;top:3px;width:5px;height:10px;border:solid #fff;border-width:0 3px 3px 0;transform:rotate(45deg)}.insert-row>.highlight{background-color:#acf2bd!important}.delete-row>.highlight{background-color:#fdb8c0!important}"]}),a("design:paramtypes",[i.ScrollDispatcher,p,n.ChangeDetectorRef])],t)}(),g=function(){function t(){this.active=!1}return t.prototype.ngOnInit=function(){},s([n.Input(),a("design:type",Object)],t.prototype,"active",void 0),t=s([n.Component({selector:"td-loader-spinner",template:'<div class="td-loading-roller" *ngIf="active">\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n <div></div>\r\n</div>\r\n',styles:['.td-loading-roller{display:inline-block;position:relative;width:64px;height:64px}.td-loading-roller div{-webkit-animation:1.2s cubic-bezier(.5,0,.5,1) infinite lds-roller;animation:1.2s cubic-bezier(.5,0,.5,1) infinite lds-roller;transform-origin:32px 32px}.td-loading-roller div:after{content:" ";display:block;position:absolute;width:6px;height:6px;border-radius:50%;background:#000;margin:-3px 0 0 -3px}.td-loading-roller div:nth-child(1){-webkit-animation-delay:-36ms;animation-delay:-36ms}.td-loading-roller div:nth-child(1):after{top:50px;left:50px}.td-loading-roller div:nth-child(2){-webkit-animation-delay:-72ms;animation-delay:-72ms}.td-loading-roller div:nth-child(2):after{top:54px;left:45px}.td-loading-roller div:nth-child(3){-webkit-animation-delay:-108ms;animation-delay:-108ms}.td-loading-roller div:nth-child(3):after{top:57px;left:39px}.td-loading-roller div:nth-child(4){-webkit-animation-delay:-144ms;animation-delay:-144ms}.td-loading-roller div:nth-child(4):after{top:58px;left:32px}.td-loading-roller div:nth-child(5){-webkit-animation-delay:-.18s;animation-delay:-.18s}.td-loading-roller div:nth-child(5):after{top:57px;left:25px}.td-loading-roller div:nth-child(6){-webkit-animation-delay:-216ms;animation-delay:-216ms}.td-loading-roller div:nth-child(6):after{top:54px;left:19px}.td-loading-roller div:nth-child(7){-webkit-animation-delay:-252ms;animation-delay:-252ms}.td-loading-roller div:nth-child(7):after{top:50px;left:14px}.td-loading-roller div:nth-child(8){-webkit-animation-delay:-288ms;animation-delay:-288ms}.td-loading-roller div:nth-child(8):after{top:45px;left:10px}@-webkit-keyframes lds-roller{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes lds-roller{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}']}),a("design:paramtypes",[])],t)}(),b=function(){function t(){}return t.prototype.transform=function(t,n){return t?(n&&n.length,t.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">").replace(/"/g,""").replace(/ /g," ")):" "},t=s([n.Pipe({name:"formatLine"})],t)}(),m=function(){function t(){}return t=s([n.NgModule({imports:[o.CommonModule,l.FormsModule,i.ScrollingModule],declarations:[u,g,b,h],exports:[u]})],t)}();t.NgxTextDiffComponent=u,t.NgxTextDiffModule=m,t.NgxTextDiffService=p,t.ɵa=h,t.ɵb=g,t.ɵc=b,Object.defineProperty(t,"__esModule",{value:!0})}));
//# sourceMappingURL=ngx-text-diff.umd.min.js.map