Editor updates
This commit is contained in:
@@ -96,7 +96,8 @@ module.exports = function(grunt) {
|
|||||||
|
|
||||||
css: {
|
css: {
|
||||||
src: [
|
src: [
|
||||||
'vendor/assets/stylesheets/app.css'
|
'vendor/assets/stylesheets/app.css',
|
||||||
|
'node_modules/sn-stylekit/dist/stylekit.css'
|
||||||
],
|
],
|
||||||
dest: 'vendor/assets/stylesheets/app.css'
|
dest: 'vendor/assets/stylesheets/app.css'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,19 +115,21 @@ angular.module('app.frontend')
|
|||||||
// if plain editor or other editor
|
// if plain editor or other editor
|
||||||
this.showEditorMenu = false;
|
this.showEditorMenu = false;
|
||||||
var editor = component;
|
var editor = component;
|
||||||
|
if(this.selectedEditor && editor !== this.selectedEditor) {
|
||||||
|
this.disassociateComponentWithCurrentNote(this.selectedEditor);
|
||||||
|
}
|
||||||
if(editor) {
|
if(editor) {
|
||||||
this.note.setAppDataItem("prefersPlainEditor", false);
|
if(this.note.getAppDataItem("prefersPlainEditor") == true) {
|
||||||
this.note.setDirty(true);
|
this.note.setAppDataItem("prefersPlainEditor", false);
|
||||||
componentManager.associateComponentWithItem(editor, this.note);
|
this.note.setDirty(true);
|
||||||
|
}
|
||||||
|
this.associateComponentWithCurrentNote(editor);
|
||||||
} else {
|
} else {
|
||||||
// Note prefers plain editor
|
// Note prefers plain editor
|
||||||
if(this.selectedEditor) {
|
if(!this.note.getAppDataItem("prefersPlainEditor")) {
|
||||||
this.disableComponentForCurrentItem(this.selectedEditor);
|
this.note.setAppDataItem("prefersPlainEditor", true);
|
||||||
|
this.note.setDirty(true);
|
||||||
}
|
}
|
||||||
this.note.setAppDataItem("prefersPlainEditor", true);
|
|
||||||
this.note.setDirty(true);
|
|
||||||
syncManager.sync();
|
|
||||||
|
|
||||||
$timeout(() => {
|
$timeout(() => {
|
||||||
this.reloadFont();
|
this.reloadFont();
|
||||||
})
|
})
|
||||||
@@ -139,6 +141,8 @@ angular.module('app.frontend')
|
|||||||
this.toggleStackComponentForCurrentItem(component);
|
this.toggleStackComponentForCurrentItem(component);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Lots of dirtying can happen above, so we'll sync
|
||||||
|
syncManager.sync();
|
||||||
}.bind(this)
|
}.bind(this)
|
||||||
|
|
||||||
this.hasAvailableExtensions = function() {
|
this.hasAvailableExtensions = function() {
|
||||||
@@ -502,31 +506,34 @@ angular.module('app.frontend')
|
|||||||
|
|
||||||
this.toggleStackComponentForCurrentItem = function(component) {
|
this.toggleStackComponentForCurrentItem = function(component) {
|
||||||
if(component.isActiveForItem(this.note)) {
|
if(component.isActiveForItem(this.note)) {
|
||||||
this.disableComponentForCurrentItem(component);
|
componentManager.deactivateComponent(component);
|
||||||
|
this.disassociateComponentWithCurrentNote(component);
|
||||||
} else {
|
} else {
|
||||||
this.enableComponentForCurrentItem(component);
|
componentManager.activateComponent(component);
|
||||||
|
componentManager.contextItemDidChangeInArea("editor-stack");
|
||||||
|
this.associateComponentWithCurrentNote(component);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
this.disableComponentForCurrentItem = function(component) {
|
this.disassociateComponentWithCurrentNote = function(component) {
|
||||||
componentManager.deactivateComponent(component);
|
component.associatedItemIds = component.associatedItemIds.filter((id) => {return id !== this.note.uuid});
|
||||||
_.pull(component.associatedItemIds, this.note.uuid);
|
|
||||||
if(component.disassociatedItemIds.indexOf(this.note.uuid) !== -1) {
|
// Only disassociative components should modify the disassociatedItemIds
|
||||||
return;
|
if(!component.isAssociative() && !component.disassociatedItemIds.includes(this.note.uuid)) {
|
||||||
|
component.disassociatedItemIds.push(this.note.uuid);
|
||||||
}
|
}
|
||||||
|
|
||||||
component.disassociatedItemIds.push(this.note.uuid);
|
|
||||||
component.setDirty(true);
|
component.setDirty(true);
|
||||||
syncManager.sync();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
this.enableComponentForCurrentItem = function(component) {
|
this.associateComponentWithCurrentNote = function(component) {
|
||||||
componentManager.activateComponent(component);
|
component.disassociatedItemIds = component.disassociatedItemIds.filter((id) => {return id !== this.note.uuid});
|
||||||
componentManager.contextItemDidChangeInArea("editor-stack");
|
|
||||||
|
if(component.isAssociative() && !component.associatedItemIds.includes(this.note.uuid)) {
|
||||||
|
component.associatedItemIds.push(this.note.uuid);
|
||||||
|
}
|
||||||
|
|
||||||
_.pull(component.disassociatedItemIds, this.note.uuid);
|
|
||||||
component.setDirty(true);
|
component.setDirty(true);
|
||||||
syncManager.sync();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -166,6 +166,11 @@ angular.module('app.frontend')
|
|||||||
|
|
||||||
// Safe to create. Create and return object.
|
// Safe to create. Create and return object.
|
||||||
let url = window._prolink_package_url;
|
let url = window._prolink_package_url;
|
||||||
|
console.log("Installing ProLink from URL", url);
|
||||||
|
if(!url) {
|
||||||
|
console.error("window._prolink_package_url must be set.");
|
||||||
|
return;
|
||||||
|
}
|
||||||
packageManager.installPackage(url, (component) => {
|
packageManager.installPackage(url, (component) => {
|
||||||
valueCallback(component);
|
valueCallback(component);
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -23,9 +23,10 @@ class Component extends Item {
|
|||||||
/* New */
|
/* New */
|
||||||
this.local_url = content.local_url;
|
this.local_url = content.local_url;
|
||||||
this.hosted_url = content.hosted_url;
|
this.hosted_url = content.hosted_url;
|
||||||
|
this.offlineOnly = content.offlineOnly;
|
||||||
|
|
||||||
this.name = content.name;
|
this.name = content.name;
|
||||||
this.autoupdate = content.autoupdate;
|
this.autoupdateDisabled = content.autoupdateDisabled;
|
||||||
|
|
||||||
this.package_info = content.package_info;
|
this.package_info = content.package_info;
|
||||||
|
|
||||||
@@ -50,12 +51,13 @@ class Component extends Item {
|
|||||||
url: this.url,
|
url: this.url,
|
||||||
hosted_url: this.hosted_url,
|
hosted_url: this.hosted_url,
|
||||||
local_url: this.local_url,
|
local_url: this.local_url,
|
||||||
|
offlineOnly: this.offlineOnly,
|
||||||
name: this.name,
|
name: this.name,
|
||||||
area: this.area,
|
area: this.area,
|
||||||
package_info: this.package_info,
|
package_info: this.package_info,
|
||||||
permissions: this.permissions,
|
permissions: this.permissions,
|
||||||
active: this.active,
|
active: this.active,
|
||||||
autoupdate: this.autoupdate,
|
autoupdateDisabled: this.autoupdateDisabled,
|
||||||
componentData: this.componentData,
|
componentData: this.componentData,
|
||||||
disassociatedItemIds: this.disassociatedItemIds,
|
disassociatedItemIds: this.disassociatedItemIds,
|
||||||
associatedItemIds: this.associatedItemIds,
|
associatedItemIds: this.associatedItemIds,
|
||||||
@@ -73,14 +75,6 @@ class Component extends Item {
|
|||||||
return "SN|Component";
|
return "SN|Component";
|
||||||
}
|
}
|
||||||
|
|
||||||
computedUrl() {
|
|
||||||
if(this.offlineOnly || (isDesktopApplication() && this.local_url)) {
|
|
||||||
return this.local_url.replace("sn://", this.desktopManager.getApplicationDataPath() + "/");
|
|
||||||
} else {
|
|
||||||
return this.url || this.hosted_url;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
isEditor() {
|
isEditor() {
|
||||||
return this.area == "editor-editor";
|
return this.area == "editor-editor";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,10 +6,14 @@ class ItemParams {
|
|||||||
this.version = version || "002";
|
this.version = version || "002";
|
||||||
}
|
}
|
||||||
|
|
||||||
paramsForExportFile() {
|
paramsForExportFile(includeDeleted) {
|
||||||
this.additionalFields = ["updated_at"];
|
this.additionalFields = ["updated_at"];
|
||||||
this.forExportFile = true;
|
this.forExportFile = true;
|
||||||
return _.omit(this.__params(), ["deleted"]);
|
if(includeDeleted) {
|
||||||
|
return this.__params();
|
||||||
|
} else {
|
||||||
|
return _.omit(this.__params(), ["deleted"]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
paramsForExtension() {
|
paramsForExtension() {
|
||||||
|
|||||||
@@ -127,7 +127,7 @@ class ComponentManager {
|
|||||||
postThemeToComponent(component) {
|
postThemeToComponent(component) {
|
||||||
var activeTheme = this.getActiveTheme();
|
var activeTheme = this.getActiveTheme();
|
||||||
var data = {
|
var data = {
|
||||||
themes: [activeTheme ? activeTheme.computedUrl() : null]
|
themes: [activeTheme ? this.urlForComponent(activeTheme) : null]
|
||||||
}
|
}
|
||||||
|
|
||||||
this.sendMessageToComponent(component, {action: "themes", data: data})
|
this.sendMessageToComponent(component, {action: "themes", data: data})
|
||||||
@@ -196,6 +196,14 @@ class ComponentManager {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
urlForComponent(component) {
|
||||||
|
if(component.offlineOnly || (isDesktopApplication() && component.local_url)) {
|
||||||
|
return component.local_url.replace("sn://", this.desktopManager.getApplicationDataPath() + "/");
|
||||||
|
} else {
|
||||||
|
return component.url || component.hosted_url;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
componentForUrl(url) {
|
componentForUrl(url) {
|
||||||
return this.components.filter(function(component){
|
return this.components.filter(function(component){
|
||||||
return component.url === url || component.hosted_url === url;
|
return component.url === url || component.hosted_url === url;
|
||||||
@@ -246,8 +254,6 @@ class ComponentManager {
|
|||||||
this.handleCreateItemMessage(component, message);
|
this.handleCreateItemMessage(component, message);
|
||||||
} else if(message.action === "save-items") {
|
} else if(message.action === "save-items") {
|
||||||
this.handleSaveItemsMessage(component, message);
|
this.handleSaveItemsMessage(component, message);
|
||||||
} else if(message.action === "install-local-component") {
|
|
||||||
this.handleInstallLocalComponentMessage(component, message);
|
|
||||||
} else if(message.action === "toggle-activate-component") {
|
} else if(message.action === "toggle-activate-component") {
|
||||||
let componentToToggle = this.modelManager.findItem(message.data.uuid);
|
let componentToToggle = this.modelManager.findItem(message.data.uuid);
|
||||||
this.handleToggleComponentMessage(component, componentToToggle, message);
|
this.handleToggleComponentMessage(component, componentToToggle, message);
|
||||||
@@ -265,7 +271,7 @@ class ComponentManager {
|
|||||||
|
|
||||||
removePrivatePropertiesFromResponseItems(responseItems, includeUrls) {
|
removePrivatePropertiesFromResponseItems(responseItems, includeUrls) {
|
||||||
// Don't allow component to overwrite these properties.
|
// Don't allow component to overwrite these properties.
|
||||||
var privateProperties = ["appData", "autoupdate", "permissions", "active", "encrypted"];
|
var privateProperties = ["appData", "autoupdateDisabled", "permissions", "active", "encrypted"];
|
||||||
if(includeUrls) {
|
if(includeUrls) {
|
||||||
privateProperties = privateProperties.concat(["url", "hosted_url", "local_url"]);
|
privateProperties = privateProperties.concat(["url", "hosted_url", "local_url"]);
|
||||||
}
|
}
|
||||||
@@ -329,17 +335,21 @@ class ComponentManager {
|
|||||||
|
|
||||||
// push immediately now
|
// push immediately now
|
||||||
for(let handler of this.handlersForArea(component.area)) {
|
for(let handler of this.handlersForArea(component.area)) {
|
||||||
var itemInContext = handler.contextRequestHandler(component);
|
if(handler.contextRequestHandler) {
|
||||||
this.sendContextItemInReply(component, itemInContext, message);
|
var itemInContext = handler.contextRequestHandler(component);
|
||||||
|
this.sendContextItemInReply(component, itemInContext, message);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}.bind(this))
|
}.bind(this))
|
||||||
}
|
}
|
||||||
|
|
||||||
isItemWithinComponentContextJurisdiction(item, component) {
|
isItemWithinComponentContextJurisdiction(item, component) {
|
||||||
for(let handler of this.handlersForArea(component.area)) {
|
for(let handler of this.handlersForArea(component.area)) {
|
||||||
var itemInContext = handler.contextRequestHandler(component);
|
if(handler.contextRequestHandler) {
|
||||||
if(itemInContext.uuid == item.uuid) {
|
var itemInContext = handler.contextRequestHandler(component);
|
||||||
return true;
|
if(itemInContext.uuid == item.uuid) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
@@ -388,6 +398,7 @@ class ComponentManager {
|
|||||||
}
|
}
|
||||||
item.setDirty(true);
|
item.setDirty(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.syncManager.sync((response) => {
|
this.syncManager.sync((response) => {
|
||||||
// Allow handlers to be notified when a save begins and ends, to update the UI
|
// Allow handlers to be notified when a save begins and ends, to update the UI
|
||||||
var saveMessage = Object.assign({}, message);
|
var saveMessage = Object.assign({}, message);
|
||||||
@@ -443,24 +454,6 @@ class ComponentManager {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
handleInstallLocalComponentMessage(component, message) {
|
|
||||||
var requiredPermissions = [
|
|
||||||
{
|
|
||||||
name: "stream-items",
|
|
||||||
content_types: [message.data.content_type]
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
this.runWithPermissions(component, requiredPermissions, () => {
|
|
||||||
this.desktopManager.installOfflineComponentFromData(message.data, (response) => {
|
|
||||||
var component = this.modelManager.mapResponseItemsToLocalModels([response], ModelManager.MappingSourceComponentRetrieved)[0];
|
|
||||||
// Save updated URL
|
|
||||||
component.setDirty(true);
|
|
||||||
this.syncManager.sync();
|
|
||||||
})
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
handleSetComponentDataMessage(component, message) {
|
handleSetComponentDataMessage(component, message) {
|
||||||
// A component setting its own data does not require special permissions
|
// A component setting its own data does not require special permissions
|
||||||
this.runWithPermissions(component, [], () => {
|
this.runWithPermissions(component, [], () => {
|
||||||
@@ -719,19 +712,6 @@ class ComponentManager {
|
|||||||
return component.active;
|
return component.active;
|
||||||
}
|
}
|
||||||
|
|
||||||
associateComponentWithItem(component, item) {
|
|
||||||
_.pull(component.disassociatedItemIds, item.uuid);
|
|
||||||
|
|
||||||
if(component.associatedItemIds.includes(item.uuid)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
component.associatedItemIds.push(item.uuid);
|
|
||||||
|
|
||||||
component.setDirty(true);
|
|
||||||
this.syncManager.sync();
|
|
||||||
}
|
|
||||||
|
|
||||||
iframeForComponent(component) {
|
iframeForComponent(component) {
|
||||||
for(var frame of document.getElementsByTagName("iframe")) {
|
for(var frame of document.getElementsByTagName("iframe")) {
|
||||||
var componentId = frame.dataset.componentId;
|
var componentId = frame.dataset.componentId;
|
||||||
|
|||||||
@@ -25,14 +25,6 @@ class DesktopManager {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Can handle components and themes */
|
|
||||||
installOfflineComponentFromData(componentData, callback) {
|
|
||||||
this.componentInstallationHandler(componentData, (installedComponent) => {
|
|
||||||
componentData.content.local_url = installedComponent.content.local_url;
|
|
||||||
callback(componentData);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
getApplicationDataPath() {
|
getApplicationDataPath() {
|
||||||
console.assert(this.applicationDataPath, "applicationDataPath is null");
|
console.assert(this.applicationDataPath, "applicationDataPath is null");
|
||||||
return this.applicationDataPath;
|
return this.applicationDataPath;
|
||||||
@@ -40,24 +32,31 @@ class DesktopManager {
|
|||||||
|
|
||||||
/* Sending a component in its raw state is really slow for the desktop app */
|
/* Sending a component in its raw state is really slow for the desktop app */
|
||||||
convertComponentForTransmission(component) {
|
convertComponentForTransmission(component) {
|
||||||
return new ItemParams(component).paramsForExportFile();
|
return new ItemParams(component).paramsForExportFile(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
// All `components` should be installed
|
// All `components` should be installed
|
||||||
syncComponentsInstallation(components) {
|
syncComponentsInstallation(components) {
|
||||||
|
// console.log("Web Syncing Components", components);
|
||||||
if(!this.isDesktop) return;
|
if(!this.isDesktop) return;
|
||||||
|
|
||||||
/* Allows us to look up component on desktop_updateComponentComplete */
|
|
||||||
this.syncingComponents = components;
|
|
||||||
|
|
||||||
var data = components.map((component) => {
|
var data = components.map((component) => {
|
||||||
|
console.log("Web Sycying Component", this.convertComponentForTransmission(component));
|
||||||
return this.convertComponentForTransmission(component);
|
return this.convertComponentForTransmission(component);
|
||||||
})
|
})
|
||||||
this.installationSyncHandler(data);
|
this.installationSyncHandler(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
desktop_onComponentInstallationComplete(componentData) {
|
||||||
|
console.log("Web|Component Installation Complete", componentData);
|
||||||
|
var component = this.modelManager.mapResponseItemsToLocalModels([componentData], ModelManager.MappingSourceDesktopInstalled)[0];
|
||||||
|
component.setDirty(true);
|
||||||
|
this.syncManager.sync();
|
||||||
|
}
|
||||||
|
|
||||||
desktop_updateComponentComplete(componentData) {
|
desktop_updateComponentComplete(componentData) {
|
||||||
var component = this.syncingComponents.filter((c) => {return c.uuid == componentData.uuid})[0];
|
console.log("Web|Component Update Complete", componentData);
|
||||||
|
var component = this.modelManager.mapResponseItemsToLocalModels([componentData], ModelManager.MappingSourceDesktopInstalled)[0];
|
||||||
component.setDirty(true);
|
component.setDirty(true);
|
||||||
this.syncManager.sync();
|
this.syncManager.sync();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -35,7 +35,6 @@ class ComponentView {
|
|||||||
}.bind(this)});
|
}.bind(this)});
|
||||||
|
|
||||||
$scope.$watch('component', function(component, prevComponent){
|
$scope.$watch('component', function(component, prevComponent){
|
||||||
// console.log("Component View Setting Component", component);
|
|
||||||
ctrl.componentValueChanging(component, prevComponent);
|
ctrl.componentValueChanging(component, prevComponent);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -43,22 +42,26 @@ class ComponentView {
|
|||||||
controller($scope, $timeout, componentManager, desktopManager) {
|
controller($scope, $timeout, componentManager, desktopManager) {
|
||||||
'ngInject';
|
'ngInject';
|
||||||
|
|
||||||
console.log("Creating New Component View");
|
|
||||||
|
|
||||||
this.componentValueChanging = (component, prevComponent) => {
|
this.componentValueChanging = (component, prevComponent) => {
|
||||||
if(prevComponent && component !== prevComponent) {
|
if(prevComponent && component !== prevComponent) {
|
||||||
// Deactive old component
|
// Deactive old component
|
||||||
console.log("DEACTIVATING OLD COMPONENT", prevComponent);
|
|
||||||
componentManager.deactivateComponent(prevComponent);
|
componentManager.deactivateComponent(prevComponent);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(component) {
|
if(component) {
|
||||||
componentManager.activateComponent(component);
|
componentManager.activateComponent(component);
|
||||||
|
component.runningLocally = $scope.getUrl
|
||||||
|
console.log("Loading", $scope.component.name, $scope.getUrl());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$scope.getUrl = function() {
|
||||||
|
var url = componentManager.urlForComponent($scope.component);
|
||||||
|
$scope.component.runningLocally = url !== ($scope.component.url || $scope.component.hosted_url);
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
|
||||||
$scope.$on("$destroy", function() {
|
$scope.$on("$destroy", function() {
|
||||||
console.log("DESTROY COMPONENT VIEW");
|
|
||||||
componentManager.deregisterHandler($scope.identifier);
|
componentManager.deregisterHandler($scope.identifier);
|
||||||
if($scope.component) {
|
if($scope.component) {
|
||||||
componentManager.deactivateComponent($scope.component);
|
componentManager.deactivateComponent($scope.component);
|
||||||
|
|||||||
@@ -39,6 +39,10 @@ class EditorMenu {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$scope.offlineAvailableForComponent = function(component) {
|
||||||
|
return component.local_url && isDesktopApplication();
|
||||||
|
}
|
||||||
|
|
||||||
$scope.makeEditorDefault = function(component) {
|
$scope.makeEditorDefault = function(component) {
|
||||||
var currentDefault = componentManager.componentsForArea("editor-editor").filter((e) => {return e.isDefaultEditor()})[0];
|
var currentDefault = componentManager.componentsForArea("editor-editor").filter((e) => {return e.isDefaultEditor()})[0];
|
||||||
if(currentDefault) {
|
if(currentDefault) {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ class ModelManager {
|
|||||||
ModelManager.MappingSourceLocalSaved = "MappingSourceLocalSaved";
|
ModelManager.MappingSourceLocalSaved = "MappingSourceLocalSaved";
|
||||||
ModelManager.MappingSourceLocalRetrieved = "MappingSourceLocalRetrieved";
|
ModelManager.MappingSourceLocalRetrieved = "MappingSourceLocalRetrieved";
|
||||||
ModelManager.MappingSourceComponentRetrieved = "MappingSourceComponentRetrieved";
|
ModelManager.MappingSourceComponentRetrieved = "MappingSourceComponentRetrieved";
|
||||||
|
ModelManager.MappingSourceDesktopInstalled = "MappingSourceDesktopInstalled"; // When a component is installed by the desktop and some of its values change
|
||||||
ModelManager.MappingSourceRemoteActionRetrieved = "MappingSourceRemoteActionRetrieved"; /* aciton-based Extensions like note history */
|
ModelManager.MappingSourceRemoteActionRetrieved = "MappingSourceRemoteActionRetrieved"; /* aciton-based Extensions like note history */
|
||||||
ModelManager.MappingSourceFileImport = "MappingSourceFileImport";
|
ModelManager.MappingSourceFileImport = "MappingSourceFileImport";
|
||||||
|
|
||||||
@@ -147,7 +148,7 @@ class ModelManager {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(!item) {
|
if(!item) {
|
||||||
item = this.createItem(json_obj);
|
item = this.createItem(json_obj, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
this.addItem(item);
|
this.addItem(item);
|
||||||
@@ -200,7 +201,7 @@ class ModelManager {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
createItem(json_obj) {
|
createItem(json_obj, dontNotifyObservers) {
|
||||||
var item;
|
var item;
|
||||||
if(json_obj.content_type == "Note") {
|
if(json_obj.content_type == "Note") {
|
||||||
item = new Note(json_obj);
|
item = new Note(json_obj);
|
||||||
@@ -224,6 +225,15 @@ class ModelManager {
|
|||||||
item = new Item(json_obj);
|
item = new Item(json_obj);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Some observers would be interested to know when an an item is locally created
|
||||||
|
// If we don't send this out, these observers would have to wait until MappingSourceRemoteSaved
|
||||||
|
// to hear about it, but sometimes, RemoveSaved is explicitly ignored by the observer to avoid
|
||||||
|
// recursive callbacks. See componentManager's syncObserver callback.
|
||||||
|
// dontNotifyObservers is currently only set true by modelManagers mapResponseItemsToLocalModels
|
||||||
|
if(!dontNotifyObservers) {
|
||||||
|
this.notifySyncObserversOfModels([item], ModelManager.MappingSourceLocalSaved);
|
||||||
|
}
|
||||||
|
|
||||||
item.addObserver(this, function(changedItem){
|
item.addObserver(this, function(changedItem){
|
||||||
this.notifyItemChangeObserversOfModels([changedItem]);
|
this.notifyItemChangeObserversOfModels([changedItem]);
|
||||||
}.bind(this));
|
}.bind(this));
|
||||||
|
|||||||
@@ -18,10 +18,11 @@ class PackageManager {
|
|||||||
// Remove private properties
|
// Remove private properties
|
||||||
this.componentManager.removePrivatePropertiesFromResponseItems([aPackage]);
|
this.componentManager.removePrivatePropertiesFromResponseItems([aPackage]);
|
||||||
|
|
||||||
var assembled = this.modelManager.createItem(aPackage);
|
aPackage.package_info = Object.assign({}, aPackage);
|
||||||
|
|
||||||
assembled.package_info = aPackage;
|
var assembled = this.modelManager.createItem(aPackage);;
|
||||||
this.modelManager.addItem(assembled);
|
this.modelManager.addItem(assembled);
|
||||||
|
|
||||||
assembled.setDirty(true);
|
assembled.setDirty(true);
|
||||||
this.syncManager.sync();
|
this.syncManager.sync();
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,6 @@ class SingletonManager {
|
|||||||
setTimeout(function () {
|
setTimeout(function () {
|
||||||
var userPrefs = modelManager.itemsForContentType("SN|UserPreferences");
|
var userPrefs = modelManager.itemsForContentType("SN|UserPreferences");
|
||||||
console.assert(userPrefs.length == 1);
|
console.assert(userPrefs.length == 1);
|
||||||
console.log("All extant prefs", userPrefs);
|
|
||||||
}, 1000);
|
}, 1000);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ class ThemeManager {
|
|||||||
this.modelManager = modelManager;
|
this.modelManager = modelManager;
|
||||||
this.$rootScope = $rootScope;
|
this.$rootScope = $rootScope;
|
||||||
this.storageManager = storageManager;
|
this.storageManager = storageManager;
|
||||||
|
this.componentManager = componentManager;
|
||||||
|
|
||||||
componentManager.registerHandler({identifier: "themeManager", areas: ["themes"], activationHandler: (component) => {
|
componentManager.registerHandler({identifier: "themeManager", areas: ["themes"], activationHandler: (component) => {
|
||||||
if(component.active) {
|
if(component.active) {
|
||||||
@@ -55,8 +56,7 @@ class ThemeManager {
|
|||||||
this.deactivateTheme(this.activeTheme);
|
this.deactivateTheme(this.activeTheme);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var url = this.componentManager.urlForComponent(theme);
|
||||||
var url = theme.computedUrl();
|
|
||||||
|
|
||||||
var link = document.createElement("link");
|
var link = document.createElement("link");
|
||||||
link.href = url;
|
link.href = url;
|
||||||
|
|||||||
@@ -16,6 +16,10 @@
|
|||||||
background-color: white;
|
background-color: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.header .subtitle {
|
||||||
|
font-size: 1.1rem;
|
||||||
|
}
|
||||||
|
|
||||||
.modal {
|
.modal {
|
||||||
position: fixed;
|
position: fixed;
|
||||||
margin-left: auto;
|
margin-left: auto;
|
||||||
|
|||||||
@@ -17,7 +17,7 @@
|
|||||||
color: rgba(black, 0.8);
|
color: rgba(black, 0.8);
|
||||||
}
|
}
|
||||||
|
|
||||||
#tags-content {
|
&, #tags-content {
|
||||||
background-color: #f6f6f6;
|
background-color: #f6f6f6;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,6 +4,8 @@
|
|||||||
.sn-component
|
.sn-component
|
||||||
.panel{"ng-attr-id" => "component-{{component.uuid}}"}
|
.panel{"ng-attr-id" => "component-{{component.uuid}}"}
|
||||||
.header
|
.header
|
||||||
%h1.title {{component.name}}
|
%h1.title
|
||||||
|
{{component.name}}
|
||||||
|
%span.subtle.subtitle{"ng-if" => "component.runningLocally"} | Desktop Mode
|
||||||
%a.close-button.info{"ng-click" => "dismiss()"} Close
|
%a.close-button.info{"ng-click" => "dismiss()"} Close
|
||||||
%component-view.component-view{"component" => "component"}
|
%component-view.component-view{"component" => "component"}
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
%iframe{"ng-if" => "component",
|
%iframe{"ng-if" => "component",
|
||||||
"ng-attr-id" => "component-{{component.uuid}}",
|
"ng-attr-id" => "component-{{component.uuid}}",
|
||||||
"ng-src" => "{{component.computedUrl() | trusted}}", "frameBorder" => "0",
|
"ng-src" => "{{getUrl() | trusted}}", "frameBorder" => "0",
|
||||||
"sandbox" => "allow-scripts allow-top-navigation-by-user-activation allow-popups allow-popups-to-escape-sandbox allow-modals",
|
"sandbox" => "allow-scripts allow-top-navigation-by-user-activation allow-popups allow-popups-to-escape-sandbox allow-same-origin allow-modals",
|
||||||
"data-component-id" => "{{component.uuid}}"}
|
"data-component-id" => "{{component.uuid}}"}
|
||||||
Loading
|
Loading
|
||||||
|
|||||||
@@ -12,7 +12,7 @@
|
|||||||
.row
|
.row
|
||||||
.column
|
.column
|
||||||
%strong.red.medium{"ng-if" => "editor.conflict_of"} Conflicted copy
|
%strong.red.medium{"ng-if" => "editor.conflict_of"} Conflicted copy
|
||||||
.sublabel{"ng-if" => "editor.local_url"}
|
.sublabel{"ng-if" => "offlineAvailableForComponent(editor)"}
|
||||||
Available Offline
|
Available Offline
|
||||||
|
|
||||||
%a.no-decoration{"ng-if" => "editors.length == 0", "href" => "https://standardnotes.org/extensions", "target" => "blank"}
|
%a.no-decoration{"ng-if" => "editors.length == 0", "href" => "https://standardnotes.org/extensions", "target" => "blank"}
|
||||||
|
|||||||
@@ -39,7 +39,6 @@
|
|||||||
<%= javascript_include_tag "compiled.min.js", debug: false %>
|
<%= javascript_include_tag "compiled.min.js", debug: false %>
|
||||||
<% end %>
|
<% end %>
|
||||||
<%= stylesheet_link_tag "app", media: "all", debug: false %>
|
<%= stylesheet_link_tag "app", media: "all", debug: false %>
|
||||||
<%= stylesheet_link_tag 'stylekit.css', media: 'all', 'data-turbolinks-track' => true %>
|
|
||||||
|
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
|
|||||||
6539
package-lock.json
generated
Normal file
6539
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -34,5 +34,8 @@
|
|||||||
"karma-jasmine": "^1.1.0",
|
"karma-jasmine": "^1.1.0",
|
||||||
"karma-phantomjs-launcher": "^1.0.2"
|
"karma-phantomjs-launcher": "^1.0.2"
|
||||||
},
|
},
|
||||||
"license": "GPL-3.0"
|
"license": "GPL-3.0",
|
||||||
|
"dependencies": {
|
||||||
|
"sn-stylekit": "^1.0.1"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
686
vendor/assets/stylesheets/stylekit.css
vendored
686
vendor/assets/stylesheets/stylekit.css
vendored
@@ -1,686 +0,0 @@
|
|||||||
.sn-component {
|
|
||||||
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
|
|
||||||
-webkit-font-smoothing: antialiased;
|
|
||||||
user-select: none;
|
|
||||||
}
|
|
||||||
.sn-component .panel {
|
|
||||||
box-shadow: 0px 2px 13px #C8C8C8;
|
|
||||||
border-radius: 0.7rem;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
.sn-component .panel a:hover {
|
|
||||||
text-decoration: underline;
|
|
||||||
}
|
|
||||||
.sn-component .panel.static {
|
|
||||||
box-shadow: none;
|
|
||||||
border: none;
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
.sn-component .panel .header {
|
|
||||||
flex-shrink: 0;
|
|
||||||
/* Don't allow to condense in height */
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
padding: 1.1rem 2rem;
|
|
||||||
border-bottom: 1px solid #E1E1E1;
|
|
||||||
background-color: #F6F6F6;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
.sn-component .panel .header .close-button {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.sn-component .panel .footer, .sn-component .panel .panel-footer {
|
|
||||||
padding: 1rem 2rem;
|
|
||||||
border-top: 1px solid #E1E1E1;
|
|
||||||
box-sizing: border-box;
|
|
||||||
}
|
|
||||||
.sn-component .panel .footer .left, .sn-component .panel .panel-footer .left {
|
|
||||||
text-align: right;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.sn-component .panel .footer .right, .sn-component .panel .panel-footer .right {
|
|
||||||
text-align: right;
|
|
||||||
display: block;
|
|
||||||
}
|
|
||||||
.sn-component .panel .content {
|
|
||||||
padding: 1.6rem 2rem;
|
|
||||||
padding-bottom: 0;
|
|
||||||
flex-grow: 1;
|
|
||||||
overflow: scroll;
|
|
||||||
}
|
|
||||||
.sn-component .panel .content p {
|
|
||||||
color: #454545;
|
|
||||||
line-height: 1.3;
|
|
||||||
}
|
|
||||||
.sn-component .panel .content .label, .sn-component .panel .content .panel-section .subtitle, .sn-component .panel-section .panel .content .subtitle {
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.sn-component .panel-section {
|
|
||||||
padding-bottom: 1.6rem;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
.sn-component .panel-section.no-bottom-pad {
|
|
||||||
padding-bottom: 0;
|
|
||||||
}
|
|
||||||
.sn-component .panel-section.hero {
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.sn-component .panel-section p:last-child {
|
|
||||||
margin-bottom: 0;
|
|
||||||
}
|
|
||||||
.sn-component .panel-section:not(:last-child) {
|
|
||||||
margin-bottom: 1.5rem;
|
|
||||||
border-bottom: 1px solid #DDDDDD;
|
|
||||||
}
|
|
||||||
.sn-component .panel-section:not(:last-child).no-border {
|
|
||||||
border-bottom: none;
|
|
||||||
}
|
|
||||||
.sn-component .panel-section:last-child {
|
|
||||||
margin-bottom: 0.5rem;
|
|
||||||
}
|
|
||||||
.sn-component .panel-section .outer-title {
|
|
||||||
border-bottom: 1px solid #DDDDDD;
|
|
||||||
padding-bottom: 0.9rem;
|
|
||||||
margin-top: 2.1rem;
|
|
||||||
margin-bottom: 15px;
|
|
||||||
}
|
|
||||||
.sn-component .panel-section .subtitle {
|
|
||||||
margin-top: -0.5rem;
|
|
||||||
}
|
|
||||||
.sn-component .panel-section .subtitle.subtle {
|
|
||||||
font-weight: normal;
|
|
||||||
opacity: 0.6;
|
|
||||||
}
|
|
||||||
.sn-component .panel-row {
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
padding-top: 0.4rem;
|
|
||||||
}
|
|
||||||
.sn-component .panel-row.centered {
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
.sn-component .panel-row .panel-column {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.sn-component .panel-row.default-padding, .sn-component .panel-row:not(:last-child) {
|
|
||||||
padding-bottom: 0.4rem;
|
|
||||||
}
|
|
||||||
.sn-component .panel-row.default-padding.condensed, .sn-component .panel-row:not(:last-child).condensed {
|
|
||||||
padding-top: 0.2rem;
|
|
||||||
padding-bottom: 0.2rem;
|
|
||||||
}
|
|
||||||
.sn-component .panel-row p {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
.sn-component .panel-form {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.sn-component .panel-form.half {
|
|
||||||
width: 50%;
|
|
||||||
}
|
|
||||||
.sn-component .panel-form .form-submit {
|
|
||||||
margin-top: 0.15rem;
|
|
||||||
}
|
|
||||||
.sn-component .right-aligned {
|
|
||||||
justify-content: flex-end;
|
|
||||||
text-align: right;
|
|
||||||
}
|
|
||||||
.sn-component .menu-panel {
|
|
||||||
box-shadow: 0px 4px 4px #C8C8C8;
|
|
||||||
border-radius: 0.6rem;
|
|
||||||
overflow: scroll;
|
|
||||||
}
|
|
||||||
.sn-component .menu-panel .header {
|
|
||||||
padding: 0.8rem 1rem;
|
|
||||||
border-bottom: 1px solid #E1E1E1;
|
|
||||||
background-color: #F6F6F6;
|
|
||||||
display: flex;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
.sn-component .menu-panel .header .subtitle {
|
|
||||||
font-size: 0.95rem;
|
|
||||||
margin-top: 0.2rem;
|
|
||||||
opacity: 0.6;
|
|
||||||
}
|
|
||||||
.sn-component .menu-panel .row {
|
|
||||||
padding: 1rem 1rem;
|
|
||||||
border-bottom: 1px solid #DDDDDD;
|
|
||||||
cursor: pointer;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
.sn-component .menu-panel .row .column {
|
|
||||||
display: flex;
|
|
||||||
justify-content: center;
|
|
||||||
flex-direction: column;
|
|
||||||
/* Nested row */
|
|
||||||
}
|
|
||||||
.sn-component .menu-panel .row .column:not(:first-child) {
|
|
||||||
padding-left: 1.0rem;
|
|
||||||
padding-right: 0.15rem;
|
|
||||||
}
|
|
||||||
.sn-component .menu-panel .row .column .row {
|
|
||||||
padding: 0;
|
|
||||||
border-bottom: none;
|
|
||||||
}
|
|
||||||
.sn-component .menu-panel .row .column .left {
|
|
||||||
display: flex;
|
|
||||||
}
|
|
||||||
.sn-component .menu-panel .row .button .label, .sn-component .menu-panel .row .box .label, .sn-component .menu-panel .row .circle .label, .sn-component .menu-panel .row .button .panel-section .subtitle, .sn-component .panel-section .menu-panel .row .button .subtitle, .sn-component .menu-panel .row .box .panel-section .subtitle, .sn-component .panel-section .menu-panel .row .box .subtitle, .sn-component .menu-panel .row .circle .panel-section .subtitle, .sn-component .panel-section .menu-panel .row .circle .subtitle {
|
|
||||||
font-size: 0.8rem;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
.sn-component .menu-panel .row:hover {
|
|
||||||
background-color: #efefef;
|
|
||||||
}
|
|
||||||
.sn-component .menu-panel .row .label, .sn-component .menu-panel .row .panel-section .subtitle, .sn-component .panel-section .menu-panel .row .subtitle {
|
|
||||||
font-size: 1rem;
|
|
||||||
font-weight: bold;
|
|
||||||
}
|
|
||||||
.sn-component .menu-panel .row .sublabel {
|
|
||||||
font-size: 0.9rem;
|
|
||||||
margin-top: 0.2rem;
|
|
||||||
opacity: 0.6;
|
|
||||||
}
|
|
||||||
.sn-component .red {
|
|
||||||
color: #F80324;
|
|
||||||
}
|
|
||||||
.sn-component .tinted {
|
|
||||||
color: #086DD6;
|
|
||||||
}
|
|
||||||
.sn-component h1, .sn-component h2, .sn-component h3, .sn-component h4, .sn-component h5 {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
.sn-component h1 {
|
|
||||||
font-weight: 500;
|
|
||||||
font-size: 1.3rem;
|
|
||||||
line-height: 1.9rem;
|
|
||||||
}
|
|
||||||
.sn-component h2 {
|
|
||||||
font-size: 1.2rem;
|
|
||||||
line-height: 1.8rem;
|
|
||||||
}
|
|
||||||
.sn-component h3 {
|
|
||||||
font-weight: normal;
|
|
||||||
font-size: 1.2rem;
|
|
||||||
line-height: 1.7rem;
|
|
||||||
}
|
|
||||||
.sn-component h4 {
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 0.95rem;
|
|
||||||
line-height: 1.4rem;
|
|
||||||
}
|
|
||||||
.sn-component h5 {
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 0.85rem;
|
|
||||||
}
|
|
||||||
.sn-component a {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
.sn-component .wrap {
|
|
||||||
word-wrap: break-word;
|
|
||||||
}
|
|
||||||
.sn-component *.info {
|
|
||||||
color: #086DD6;
|
|
||||||
}
|
|
||||||
.sn-component *.warning {
|
|
||||||
color: #f6a200;
|
|
||||||
}
|
|
||||||
.sn-component *.danger {
|
|
||||||
color: #F80324;
|
|
||||||
}
|
|
||||||
.sn-component *.success {
|
|
||||||
color: #2B9612;
|
|
||||||
}
|
|
||||||
.sn-component *.clear {
|
|
||||||
background-color: transparent;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
.sn-component .center-text {
|
|
||||||
text-align: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
.sn-component p {
|
|
||||||
margin: 0.5rem 0;
|
|
||||||
}
|
|
||||||
.sn-component input {
|
|
||||||
box-sizing: border-box;
|
|
||||||
padding: 0.75rem 0.8rem;
|
|
||||||
margin: 0.30rem 0;
|
|
||||||
border-radius: 3px;
|
|
||||||
border: 1px solid #e1e1e1;
|
|
||||||
font-size: 1.1rem;
|
|
||||||
width: 100%;
|
|
||||||
outline: 0;
|
|
||||||
resize: none;
|
|
||||||
}
|
|
||||||
.sn-component input.info {
|
|
||||||
border-color: #086DD6;
|
|
||||||
background-color: transparent;
|
|
||||||
color: #086DD6;
|
|
||||||
}
|
|
||||||
.sn-component input.info::-webkit-input-placeholder {
|
|
||||||
color: rgba(8, 109, 214, 0.5);
|
|
||||||
}
|
|
||||||
.sn-component label {
|
|
||||||
margin: 0.7rem 0;
|
|
||||||
display: block;
|
|
||||||
font-size: 1.1rem;
|
|
||||||
}
|
|
||||||
.sn-component label input[type='checkbox'], .sn-component input[type='radio'] {
|
|
||||||
width: auto;
|
|
||||||
margin-right: 0.45rem;
|
|
||||||
/* Space after checkbox */
|
|
||||||
}
|
|
||||||
.sn-component .horizontal-group > *, .sn-component .input-group > * {
|
|
||||||
display: inline-block;
|
|
||||||
vertical-align: middle;
|
|
||||||
}
|
|
||||||
.sn-component .horizontal-group > *:not(:first-child), .sn-component .input-group > *:not(:first-child) {
|
|
||||||
margin-left: 0.9rem;
|
|
||||||
}
|
|
||||||
.sn-component .border-bottom {
|
|
||||||
border-bottom: 1px solid #DDDDDD;
|
|
||||||
}
|
|
||||||
.sn-component .checkbox-group {
|
|
||||||
padding-top: 0.5rem;
|
|
||||||
padding-bottom: 0.3rem;
|
|
||||||
}
|
|
||||||
.sn-component ::placeholder {
|
|
||||||
/* Chrome, Firefox, Opera, Safari 10.1+ */
|
|
||||||
color: #c4c4c4;
|
|
||||||
}
|
|
||||||
.sn-component :-ms-input-placeholder {
|
|
||||||
/* Internet Explorer 10-11 */
|
|
||||||
color: #c4c4c4;
|
|
||||||
}
|
|
||||||
.sn-component ::-ms-input-placeholder {
|
|
||||||
/* Microsoft Edge */
|
|
||||||
color: #c4c4c4;
|
|
||||||
}
|
|
||||||
.sn-component .button-group.stretch {
|
|
||||||
display: flex;
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.sn-component .button-group.stretch .button, .sn-component .button-group.stretch .box, .sn-component .button-group.stretch .circle {
|
|
||||||
display: block;
|
|
||||||
flex-grow: 1;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.sn-component .button-group .button, .sn-component .button-group .box, .sn-component .button-group .circle {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.sn-component .button-group .button:not(:last-child), .sn-component .button-group .box:not(:last-child), .sn-component .button-group .circle:not(:last-child) {
|
|
||||||
margin-right: 5px;
|
|
||||||
}
|
|
||||||
.sn-component .button-group .button:not(:last-child).featured, .sn-component .button-group .box:not(:last-child).featured, .sn-component .button-group .circle:not(:last-child).featured {
|
|
||||||
margin-right: 8px;
|
|
||||||
}
|
|
||||||
.sn-component .box-group .box {
|
|
||||||
display: inline-block;
|
|
||||||
}
|
|
||||||
.sn-component .box-group .box:not(:last-child) {
|
|
||||||
margin-right: 5px;
|
|
||||||
}
|
|
||||||
.sn-component a.button, .sn-component a.box, .sn-component a.circle {
|
|
||||||
text-decoration: none;
|
|
||||||
}
|
|
||||||
.sn-component .button, .sn-component .box, .sn-component .circle {
|
|
||||||
display: table;
|
|
||||||
border-radius: 3px;
|
|
||||||
padding: 0.5rem 0.7rem;
|
|
||||||
font-size: 0.9rem;
|
|
||||||
cursor: pointer;
|
|
||||||
text-align: center;
|
|
||||||
border: 1px solid;
|
|
||||||
}
|
|
||||||
.sn-component .button .label, .sn-component .box .label, .sn-component .circle .label, .sn-component .button .panel-section .subtitle, .sn-component .panel-section .button .subtitle, .sn-component .box .panel-section .subtitle, .sn-component .panel-section .box .subtitle, .sn-component .circle .panel-section .subtitle, .sn-component .panel-section .circle .subtitle {
|
|
||||||
font-weight: bold;
|
|
||||||
display: block;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
.sn-component .button.big, .sn-component .big.box, .sn-component .big.circle {
|
|
||||||
font-size: 1.1rem;
|
|
||||||
padding: 0.7rem 2.5rem;
|
|
||||||
}
|
|
||||||
.sn-component .box {
|
|
||||||
padding: 2.5rem 1.5rem;
|
|
||||||
}
|
|
||||||
.sn-component .button.default, .sn-component .default.box, .sn-component .default.circle, .sn-component .box.default, .sn-component .circle.default {
|
|
||||||
background-color: rgba(139, 139, 139, 0.1);
|
|
||||||
border-color: #8b8b8b;
|
|
||||||
color: #8b8b8b;
|
|
||||||
}
|
|
||||||
.sn-component .button.default:hover, .sn-component .default.box:hover, .sn-component .default.circle:hover, .sn-component .box.default:hover, .sn-component .circle.default:hover {
|
|
||||||
background-color: white;
|
|
||||||
color: #939393;
|
|
||||||
}
|
|
||||||
.sn-component .button.default.featured, .sn-component .default.featured.box, .sn-component .default.featured.circle, .sn-component .box.default.featured, .sn-component .circle.default.featured {
|
|
||||||
background-color: #8b8b8b;
|
|
||||||
border: none;
|
|
||||||
color: white;
|
|
||||||
padding: 0.75rem 1.25rem;
|
|
||||||
font-size: 1.1rem;
|
|
||||||
}
|
|
||||||
.sn-component .button.default.featured:hover, .sn-component .default.featured.box:hover, .sn-component .default.featured.circle:hover, .sn-component .box.default.featured:hover, .sn-component .circle.default.featured:hover {
|
|
||||||
background-color: #9f9f9f;
|
|
||||||
}
|
|
||||||
.sn-component .button.info, .sn-component .info.box, .sn-component .info.circle, .sn-component .box.info, .sn-component .circle.info {
|
|
||||||
background-color: rgba(8, 109, 214, 0.1);
|
|
||||||
border-color: #086DD6;
|
|
||||||
color: #086DD6;
|
|
||||||
}
|
|
||||||
.sn-component .button.info:hover, .sn-component .info.box:hover, .sn-component .info.circle:hover, .sn-component .box.info:hover, .sn-component .circle.info:hover {
|
|
||||||
background-color: #d5e9fd;
|
|
||||||
color: #0975e5;
|
|
||||||
}
|
|
||||||
.sn-component .button.info.featured, .sn-component .info.featured.box, .sn-component .info.featured.circle, .sn-component .box.info.featured, .sn-component .circle.info.featured {
|
|
||||||
background-color: #086DD6;
|
|
||||||
border: none;
|
|
||||||
color: white;
|
|
||||||
padding: 0.75rem 1.25rem;
|
|
||||||
font-size: 1.1rem;
|
|
||||||
}
|
|
||||||
.sn-component .button.info.featured:hover, .sn-component .info.featured.box:hover, .sn-component .info.featured.circle:hover, .sn-component .box.info.featured:hover, .sn-component .circle.info.featured:hover {
|
|
||||||
background-color: #1181f6;
|
|
||||||
}
|
|
||||||
.sn-component .button.warning, .sn-component .warning.box, .sn-component .warning.circle, .sn-component .box.warning, .sn-component .circle.warning {
|
|
||||||
background-color: rgba(246, 162, 0, 0.1);
|
|
||||||
border-color: #f6a200;
|
|
||||||
color: #f6a200;
|
|
||||||
}
|
|
||||||
.sn-component .button.warning:hover, .sn-component .warning.box:hover, .sn-component .warning.circle:hover, .sn-component .box.warning:hover, .sn-component .circle.warning:hover {
|
|
||||||
background-color: #fff8ec;
|
|
||||||
color: #ffaa06;
|
|
||||||
}
|
|
||||||
.sn-component .button.warning.featured, .sn-component .warning.featured.box, .sn-component .warning.featured.circle, .sn-component .box.warning.featured, .sn-component .circle.warning.featured {
|
|
||||||
background-color: #f6a200;
|
|
||||||
border: none;
|
|
||||||
color: white;
|
|
||||||
padding: 0.75rem 1.25rem;
|
|
||||||
font-size: 1.1rem;
|
|
||||||
}
|
|
||||||
.sn-component .button.warning.featured:hover, .sn-component .warning.featured.box:hover, .sn-component .warning.featured.circle:hover, .sn-component .box.warning.featured:hover, .sn-component .circle.warning.featured:hover {
|
|
||||||
background-color: #ffb320;
|
|
||||||
}
|
|
||||||
.sn-component .button.danger, .sn-component .danger.box, .sn-component .danger.circle, .sn-component .box.danger, .sn-component .circle.danger {
|
|
||||||
background-color: rgba(248, 3, 36, 0.1);
|
|
||||||
border-color: #F80324;
|
|
||||||
color: #F80324;
|
|
||||||
}
|
|
||||||
.sn-component .button.danger:hover, .sn-component .danger.box:hover, .sn-component .danger.circle:hover, .sn-component .box.danger:hover, .sn-component .circle.danger:hover {
|
|
||||||
background-color: #fff1f3;
|
|
||||||
color: #fc0e2e;
|
|
||||||
}
|
|
||||||
.sn-component .button.danger.featured, .sn-component .danger.featured.box, .sn-component .danger.featured.circle, .sn-component .box.danger.featured, .sn-component .circle.danger.featured {
|
|
||||||
background-color: #F80324;
|
|
||||||
border: none;
|
|
||||||
color: white;
|
|
||||||
padding: 0.75rem 1.25rem;
|
|
||||||
font-size: 1.1rem;
|
|
||||||
}
|
|
||||||
.sn-component .button.danger.featured:hover, .sn-component .danger.featured.box:hover, .sn-component .danger.featured.circle:hover, .sn-component .box.danger.featured:hover, .sn-component .circle.danger.featured:hover {
|
|
||||||
background-color: #fc2744;
|
|
||||||
}
|
|
||||||
.sn-component .button.success, .sn-component .success.box, .sn-component .success.circle, .sn-component .box.success, .sn-component .circle.success {
|
|
||||||
background-color: rgba(43, 150, 18, 0.1);
|
|
||||||
border-color: #2B9612;
|
|
||||||
color: #2B9612;
|
|
||||||
}
|
|
||||||
.sn-component .button.success:hover, .sn-component .success.box:hover, .sn-component .success.circle:hover, .sn-component .box.success:hover, .sn-component .circle.success:hover {
|
|
||||||
background-color: #b7f5a8;
|
|
||||||
color: #2fa414;
|
|
||||||
}
|
|
||||||
.sn-component .button.success.featured, .sn-component .success.featured.box, .sn-component .success.featured.circle, .sn-component .box.success.featured, .sn-component .circle.success.featured {
|
|
||||||
background-color: #2B9612;
|
|
||||||
border: none;
|
|
||||||
color: white;
|
|
||||||
padding: 0.75rem 1.25rem;
|
|
||||||
font-size: 1.1rem;
|
|
||||||
}
|
|
||||||
.sn-component .button.success.featured:hover, .sn-component .success.featured.box:hover, .sn-component .success.featured.circle:hover, .sn-component .box.success.featured:hover, .sn-component .circle.success.featured:hover {
|
|
||||||
background-color: #35ba16;
|
|
||||||
}
|
|
||||||
.sn-component .notification.default {
|
|
||||||
background-color: #F6F6F6;
|
|
||||||
border-color: #c4c4c4;
|
|
||||||
}
|
|
||||||
.sn-component .notification.info {
|
|
||||||
background-color: rgba(8, 109, 214, 0.1);
|
|
||||||
border-color: #086DD6;
|
|
||||||
color: #086DD6;
|
|
||||||
}
|
|
||||||
.sn-component .notification.info.featured {
|
|
||||||
background-color: #086DD6;
|
|
||||||
border: none;
|
|
||||||
color: white;
|
|
||||||
padding: 0.75rem 1.25rem;
|
|
||||||
font-size: 1.1rem;
|
|
||||||
}
|
|
||||||
.sn-component .notification.info.featured:hover {
|
|
||||||
background-color: #1181f6;
|
|
||||||
}
|
|
||||||
.sn-component .notification.warning {
|
|
||||||
background-color: rgba(246, 162, 0, 0.1);
|
|
||||||
border-color: #f6a200;
|
|
||||||
color: #f6a200;
|
|
||||||
}
|
|
||||||
.sn-component .notification.warning.featured {
|
|
||||||
background-color: #f6a200;
|
|
||||||
border: none;
|
|
||||||
color: white;
|
|
||||||
padding: 0.75rem 1.25rem;
|
|
||||||
font-size: 1.1rem;
|
|
||||||
}
|
|
||||||
.sn-component .notification.warning.featured:hover {
|
|
||||||
background-color: #ffb320;
|
|
||||||
}
|
|
||||||
.sn-component .notification.danger {
|
|
||||||
background-color: rgba(248, 3, 36, 0.1);
|
|
||||||
border-color: #F80324;
|
|
||||||
color: #F80324;
|
|
||||||
}
|
|
||||||
.sn-component .notification.danger.featured {
|
|
||||||
background-color: #F80324;
|
|
||||||
border: none;
|
|
||||||
color: white;
|
|
||||||
padding: 0.75rem 1.25rem;
|
|
||||||
font-size: 1.1rem;
|
|
||||||
}
|
|
||||||
.sn-component .notification.danger.featured:hover {
|
|
||||||
background-color: #fc2744;
|
|
||||||
}
|
|
||||||
.sn-component .notification.success {
|
|
||||||
background-color: rgba(43, 150, 18, 0.1);
|
|
||||||
border-color: #2B9612;
|
|
||||||
color: #2B9612;
|
|
||||||
}
|
|
||||||
.sn-component .notification.success.featured {
|
|
||||||
background-color: #2B9612;
|
|
||||||
border: none;
|
|
||||||
color: white;
|
|
||||||
padding: 0.75rem 1.25rem;
|
|
||||||
font-size: 1.1rem;
|
|
||||||
}
|
|
||||||
.sn-component .notification.success.featured:hover {
|
|
||||||
background-color: #35ba16;
|
|
||||||
}
|
|
||||||
.sn-component .notification {
|
|
||||||
border: 1px solid;
|
|
||||||
padding: 1.1rem 1rem;
|
|
||||||
margin: 1.4rem 0;
|
|
||||||
text-align: left;
|
|
||||||
border-radius: 0.2rem;
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
.sn-component .notification.one-line {
|
|
||||||
padding: 0rem 0.4rem;
|
|
||||||
}
|
|
||||||
.sn-component .notification.stretch {
|
|
||||||
width: 100%;
|
|
||||||
}
|
|
||||||
.sn-component .notification.dashed {
|
|
||||||
border-style: dashed;
|
|
||||||
}
|
|
||||||
.sn-component .notification .text {
|
|
||||||
line-height: 1.5rem;
|
|
||||||
font-size: 1.05rem;
|
|
||||||
text-align: left;
|
|
||||||
font-weight: normal;
|
|
||||||
}
|
|
||||||
.sn-component .circle {
|
|
||||||
border-color: #DDDDDD;
|
|
||||||
background-color: #F6F6F6;
|
|
||||||
padding: 0;
|
|
||||||
border-radius: 50%;
|
|
||||||
}
|
|
||||||
.sn-component .circle.small {
|
|
||||||
width: 11px;
|
|
||||||
height: 11px;
|
|
||||||
}
|
|
||||||
.sn-component .spinner {
|
|
||||||
border: 1px solid #515263;
|
|
||||||
border-radius: 50%;
|
|
||||||
animation: rotate 0.8s infinite linear;
|
|
||||||
border-right-color: transparent;
|
|
||||||
}
|
|
||||||
.sn-component .spinner.small {
|
|
||||||
width: 12px;
|
|
||||||
height: 12px;
|
|
||||||
}
|
|
||||||
.sn-component .spinner.info {
|
|
||||||
border-color: #086DD6;
|
|
||||||
border-right-color: transparent;
|
|
||||||
}
|
|
||||||
.sn-component .spinner.warning {
|
|
||||||
border-color: #f6a200;
|
|
||||||
border-right-color: transparent;
|
|
||||||
}
|
|
||||||
.sn-component .spinner.danger {
|
|
||||||
border-color: #F80324;
|
|
||||||
border-right-color: transparent;
|
|
||||||
}
|
|
||||||
.sn-component .spinner.success {
|
|
||||||
border-color: #2B9612;
|
|
||||||
border-right-color: transparent;
|
|
||||||
}
|
|
||||||
@keyframes rotate {
|
|
||||||
0% {
|
|
||||||
transform: rotate(0deg);
|
|
||||||
}
|
|
||||||
100% {
|
|
||||||
transform: rotate(360deg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
.sn-component .app-bar {
|
|
||||||
display: flex;
|
|
||||||
width: 100%;
|
|
||||||
height: 2rem;
|
|
||||||
padding: 0.1rem 0.8rem;
|
|
||||||
background-color: #F6F6F6;
|
|
||||||
justify-content: space-between;
|
|
||||||
align-items: center;
|
|
||||||
border: 1px solid #DDDDDD;
|
|
||||||
}
|
|
||||||
.sn-component .app-bar.no-edges {
|
|
||||||
border-left: 0;
|
|
||||||
border-right: 0;
|
|
||||||
}
|
|
||||||
.sn-component .app-bar .left, .sn-component .app-bar .right {
|
|
||||||
display: flex;
|
|
||||||
height: 100%;
|
|
||||||
}
|
|
||||||
.sn-component .app-bar .item {
|
|
||||||
flex-grow: 1;
|
|
||||||
cursor: pointer;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
justify-content: center;
|
|
||||||
}
|
|
||||||
.sn-component .app-bar .item:not(:first-child) {
|
|
||||||
margin-left: 1rem;
|
|
||||||
}
|
|
||||||
.sn-component .app-bar .item.border {
|
|
||||||
border-left: 1px solid #DDDDDD;
|
|
||||||
}
|
|
||||||
.sn-component .app-bar .item > .column {
|
|
||||||
height: 100%;
|
|
||||||
display: flex;
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
.sn-component .app-bar .item > .column:not(:first-child) {
|
|
||||||
margin-left: 0.5rem;
|
|
||||||
}
|
|
||||||
.sn-component .app-bar .item.no-pointer {
|
|
||||||
cursor: default;
|
|
||||||
}
|
|
||||||
.sn-component .app-bar .item:hover > .label:not(.subtle), .sn-component .app-bar .panel-section .item:hover > .subtitle:not(.subtle), .sn-component .panel-section .app-bar .item:hover > .subtitle:not(.subtle), .sn-component .app-bar .item:hover > .sublabel:not(.subtle), .sn-component .app-bar .item:hover > .column > .label:not(.subtle), .sn-component .app-bar .panel-section .item:hover > .column > .subtitle:not(.subtle), .sn-component .panel-section .app-bar .item:hover > .column > .subtitle:not(.subtle), .sn-component .app-bar .item:hover > .column > .sublabel:not(.subtle) {
|
|
||||||
color: #086DD6;
|
|
||||||
}
|
|
||||||
.sn-component .app-bar .item > .label, .sn-component .app-bar .panel-section .item > .subtitle, .sn-component .panel-section .app-bar .item > .subtitle, .sn-component .app-bar .item > .column > .label, .sn-component .app-bar .panel-section .item > .column > .subtitle, .sn-component .panel-section .app-bar .item > .column > .subtitle {
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: 0.9rem;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.sn-component .app-bar .item > .sublabel, .sn-component .app-bar .item > .column > .sublabel {
|
|
||||||
font-size: 0.9rem;
|
|
||||||
font-weight: normal;
|
|
||||||
white-space: nowrap;
|
|
||||||
}
|
|
||||||
.sn-component .app-bar .item .subtle {
|
|
||||||
font-weight: normal;
|
|
||||||
opacity: 0.6;
|
|
||||||
}
|
|
||||||
.sn-component .panel-table {
|
|
||||||
display: flex;
|
|
||||||
flex-wrap: wrap;
|
|
||||||
padding-left: 1px;
|
|
||||||
padding-top: 1px;
|
|
||||||
}
|
|
||||||
.sn-component .panel-table .table-item {
|
|
||||||
flex: 45%;
|
|
||||||
flex-flow: wrap;
|
|
||||||
border: 1px solid #DDDDDD;
|
|
||||||
padding: 1rem;
|
|
||||||
margin-left: -1px;
|
|
||||||
margin-top: -1px;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
justify-content: space-between;
|
|
||||||
}
|
|
||||||
.sn-component .panel-table .table-item img {
|
|
||||||
max-width: 100%;
|
|
||||||
margin-bottom: 1rem;
|
|
||||||
}
|
|
||||||
.sn-component .panel-table .table-item .item-content {
|
|
||||||
display: flex;
|
|
||||||
flex-direction: row;
|
|
||||||
}
|
|
||||||
.sn-component .panel-table .table-item .item-column {
|
|
||||||
align-items: center;
|
|
||||||
}
|
|
||||||
.sn-component .panel-table .table-item .item-column:not(:first-child) {
|
|
||||||
padding-left: 0.75rem;
|
|
||||||
}
|
|
||||||
.sn-component .panel-table .table-item .item-column.quarter {
|
|
||||||
flex-basis: 25%;
|
|
||||||
}
|
|
||||||
.sn-component .panel-table .table-item .item-column.three-quarters {
|
|
||||||
flex-basis: 75%;
|
|
||||||
}
|
|
||||||
.sn-component .panel-table .table-item .item-footer {
|
|
||||||
margin-top: 1.25rem;
|
|
||||||
}
|
|
||||||
.sn-component .panel-table .table-item.no-border {
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*# sourceMappingURL=stylekit.css.map */
|
|
||||||
Reference in New Issue
Block a user