diff --git a/app/internal_packages_disabled/plugins/lib/main.tsx b/app/internal_packages_disabled/plugins/lib/main.tsx deleted file mode 100644 index 221e50733..000000000 --- a/app/internal_packages_disabled/plugins/lib/main.tsx +++ /dev/null @@ -1,16 +0,0 @@ -import { PreferencesUIStore } from 'mailspring-exports'; -import PluginsView from './preferences-plugins'; - -export function activate() { - this.preferencesTab = new PreferencesUIStore.TabItem({ - tabId: 'Plugins', - displayName: 'Plugins', - componentClassFn: () => PluginsView, - }); - - PreferencesUIStore.registerPreferencesTab(this.preferencesTab); -} - -export function deactivate() { - PreferencesUIStore.unregisterPreferencesTab(this.preferencesTab.sectionId); -} diff --git a/app/internal_packages_disabled/plugins/lib/package-set.tsx b/app/internal_packages_disabled/plugins/lib/package-set.tsx deleted file mode 100644 index 3455c2c5c..000000000 --- a/app/internal_packages_disabled/plugins/lib/package-set.tsx +++ /dev/null @@ -1,42 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -import Package from './package'; - -class PackageSet extends React.Component { - static propTypes = { - title: PropTypes.string.isRequired, - packages: PropTypes.array, - emptyText: PropTypes.element, - showVersions: PropTypes.bool, - }; - - render() { - if (!this.props.packages) return false; - - const packages = this.props.packages.map(pkg => ( - - )); - let count = ({this.props.packages.length}); - - if (packages.length === 0) { - count = []; - packages.push( -
- {this.props.emptyText || 'No plugins to display.'} -
- ); - } - - return ( -
-
- {this.props.title} {count} -
- {packages} -
- ); - } -} - -export default PackageSet; diff --git a/app/internal_packages_disabled/plugins/lib/package.tsx b/app/internal_packages_disabled/plugins/lib/package.tsx deleted file mode 100644 index e0bb9d790..000000000 --- a/app/internal_packages_disabled/plugins/lib/package.tsx +++ /dev/null @@ -1,140 +0,0 @@ -import React from 'react'; -import PropTypes from 'prop-types'; - -import { Flexbox, RetinaImg, Switch } from 'mailspring-component-kit'; -import PluginsActions from './plugins-actions'; - -class Package extends React.Component { - static displayName = 'Package'; - - static propTypes = { - package: PropTypes.object.isRequired, - showVersions: PropTypes.bool, - }; - - _onDisablePackage = () => { - PluginsActions.disablePackage(this.props.package); - }; - - _onEnablePackage = () => { - PluginsActions.enablePackage(this.props.package); - }; - - _onUninstallPackage = () => { - PluginsActions.uninstallPackage(this.props.package); - }; - - _onUpdatePackage = () => { - PluginsActions.updatePackage(this.props.package); - }; - - _onInstallPackage = () => { - PluginsActions.installPackage(this.props.package); - }; - - _onShowPackage = () => { - PluginsActions.showPackage(this.props.package); - }; - - render() { - const actions = []; - const extras = []; - let icon = ; - let uninstallButton = null; - - if (this.props.package.icon) { - icon = ( - - ); - } else if (this.props.package.theme) { - icon = ; - } - - if (this.props.package.installed) { - if ( - ['user', 'dev', 'example'].indexOf(this.props.package.category) !== -1 && - !this.props.package.theme - ) { - if (this.props.package.enabled) { - actions.push( - - Disable - - ); - } else { - actions.push( - - Enable - - ); - } - } - if (this.props.package.category === 'user') { - uninstallButton = ( -
- Uninstall -
- ); - } - if (this.props.package.category === 'dev') { - actions.push( -
- Show... -
- ); - } - } else if (this.props.package.installing) { - actions.push( -
- Installing... -
- ); - } else { - actions.push( -
- Install -
- ); - } - - const { name, description, title, version } = this.props.package; - - if (this.props.package.newerVersionAvailable) { - extras.push( -
- A newer version is available: {this.props.package.newerVersion} -
- Update -
-
- ); - } - - const versionLabel = this.props.showVersions ? `v${version}` : null; - - return ( - -
-
{icon}
-
-
-
-
- {title || name} {versionLabel} -
- {uninstallButton} -
-
{description}
-
-
{actions}
- {extras} -
- ); - } -} - -export default Package; diff --git a/app/internal_packages_disabled/plugins/lib/packages-store.tsx b/app/internal_packages_disabled/plugins/lib/packages-store.tsx deleted file mode 100644 index 7aa59a400..000000000 --- a/app/internal_packages_disabled/plugins/lib/packages-store.tsx +++ /dev/null @@ -1,240 +0,0 @@ -import _ from 'underscore'; -import Reflux from 'reflux'; -import path from 'path'; -import fs from 'fs-plus'; -import { ipcRenderer, shell, remote } from 'electron'; - -import PluginsActions from './plugins-actions'; - -const dialog = remote.dialog; - -const PackagesStore = Reflux.createStore({ - init: function init() { - // this._globalSearch = ""; - // this._installedSearch = ""; - // this._installing = {}; - // this._featured = { - // themes: [], - // packages: [], - // }; - // this._newerVersions = []; - // this._searchResults = null; - // this._refreshFeatured(); - // this.listenTo(PluginsActions.refreshFeaturedPackages, this._refreshFeatured); - // this.listenTo(PluginsActions.refreshInstalledPackages, this._refreshInstalled); - // this.listenTo(PluginsActions.installNewPackage, this._onInstallPackage); - // this.listenTo(PluginsActions.createPackage, this._onCreatePackage); - // this.listenTo(PluginsActions.updatePackage, this._onUpdatePackage); - // this.listenTo(PluginsActions.setGlobalSearchValue, this._onGlobalSearchChange); - // this.listenTo(PluginsActions.setInstalledSearchValue, this._onInstalledSearchChange); - // this.listenTo(PluginsActions.showPackage, (pkg) => { - // const dir = AppEnv.packages.resolvePackagePath(pkg.name); - // if (dir) shell.showItemInFolder(dir); - // }); - // this.listenTo(PluginsActions.installPackage, (pkg) => { - // this._installing[pkg.name] = true; - // this.trigger(this); - // this._apm.install(pkg, (err) => { - // if (err) { - // delete this._installing[pkg.name]; - // this._displayMessage("Sorry, an error occurred", err.toString()); - // } else { - // if (AppEnv.packages.isPackageDisabled(pkg.name)) { - // AppEnv.packages.enablePackage(pkg.name); - // } - // } - // this._onPackagesChanged(); - // }); - // }); - // this.listenTo(PluginsActions.uninstallPackage, (pkg) => { - // if (AppEnv.packages.isPackageLoaded(pkg.name)) { - // AppEnv.packages.disablePackage(pkg.name); - // AppEnv.packages.unloadPackage(pkg.name); - // } - // this._apm.uninstall(pkg, (err) => { - // if (err) this._displayMessage("Sorry, an error occurred", err.toString()) - // this._onPackagesChanged(); - // }) - // }); - // this.listenTo(PluginsActions.enablePackage, (pkg) => { - // if (AppEnv.packages.isPackageDisabled(pkg.name)) { - // AppEnv.packages.enablePackage(pkg.name); - // this._onPackagesChanged(); - // } - // }); - // this.listenTo(PluginsActions.disablePackage, (pkg) => { - // if (!AppEnv.packages.isPackageDisabled(pkg.name)) { - // AppEnv.packages.disablePackage(pkg.name); - // this._onPackagesChanged(); - // } - // }); - // this._hasPrepared = false; - }, - - // Getters - - installed: function installed() { - this._prepareIfFresh(); - return this._addPackageStates(this._filter(this._installed, this._installedSearch)); - }, - - installedSearchValue: function installedSearchValue() { - return this._installedSearch; - }, - - featured: function featured() { - this._prepareIfFresh(); - return this._addPackageStates(this._featured); - }, - - searchResults: function searchResults() { - return this._addPackageStates(this._searchResults); - }, - - globalSearchValue: function globalSearchValue() { - return this._globalSearch; - }, - - // Action Handlers - - _prepareIfFresh: function _prepareIfFresh() { - if (this._hasPrepared) return; - AppEnv.packages.onDidActivatePackage(() => this._onPackagesChangedDebounced()); - AppEnv.packages.onDidDeactivatePackage(() => this._onPackagesChangedDebounced()); - AppEnv.packages.onDidLoadPackage(() => this._onPackagesChangedDebounced()); - AppEnv.packages.onDidUnloadPackage(() => this._onPackagesChangedDebounced()); - this._onPackagesChanged(); - this._hasPrepared = true; - }, - - _filter: function _filter(hash, search) { - const result = {}; - const query = search.toLowerCase(); - if (hash) { - Object.keys(hash).forEach(key => { - result[key] = _.filter( - hash[key], - p => query.length === 0 || p.name.toLowerCase().indexOf(query) !== -1 - ); - }); - } - return result; - }, - - _refreshFeatured: function _refreshFeatured() { - this._apm - .getFeatured({ themes: false }) - .then(results => { - this._featured.packages = results; - this.trigger(); - }) - .catch(() => { - // We may be offline - }); - this._apm - .getFeatured({ themes: true }) - .then(results => { - this._featured.themes = results; - this.trigger(); - }) - .catch(() => { - // We may be offline - }); - }, - - _refreshInstalled: function _refreshInstalled() { - this._onPackagesChanged(); - }, - - _refreshSearch: function _refreshSearch() { - if (!this._globalSearch || this._globalSearch.length <= 0) return; - - this._apm - .search(this._globalSearch) - .then(results => { - this._searchResults = { - packages: results.filter(({ theme }) => !theme), - themes: results.filter(({ theme }) => theme), - }; - this.trigger(); - }) - .catch(() => { - // We may be offline - }); - }, - - _refreshSearchThrottled: function _refreshSearchThrottled() { - _.debounce(this._refreshSearch, 400); - }, - - _onPackagesChanged: function _onPackagesChanged() { - this._apm.getInstalled().then(packages => { - for (const category of ['dev', 'user']) { - packages[category].forEach(pkg => { - pkg.category = category; - delete this._installing[pkg.name]; - }); - } - - const available = AppEnv.packages.getAvailablePackageMetadata(); - const examples = available.filter( - ({ isOptional, isHiddenOnPluginsPage }) => isOptional && !isHiddenOnPluginsPage - ); - packages.example = examples.map(pkg => - Object.assign({}, pkg, { installed: true, category: 'example' }) - ); - this._installed = packages; - this.trigger(); - }); - }, - - _onPackagesChangedDebounced: function _onPackagesChangedDebounced() { - _.debounce(this._onPackagesChanged, 200); - }, - - _onInstalledSearchChange: function _onInstalledSearchChange(val) { - this._installedSearch = val; - this.trigger(); - }, - - _onUpdatePackage: function _onUpdatePackage(pkg) { - this._apm.update(pkg, pkg.newerVersion); - }, - - _onGlobalSearchChange: function _onGlobalSearchChange(val) { - // Clear previous search results data if this is a new - // search beginning from "". - if (this._globalSearch.length === 0 && val.length > 0) { - this._searchResults = null; - } - - this._globalSearch = val; - this._refreshSearchThrottled(); - this.trigger(); - }, - - _addPackageStates: function _addPackageStates(pkgs) { - const installedNames = _.flatten(Object.values(this._installed)).map(pkg => pkg.name); - - _.flatten(Object.values(pkgs)).forEach(pkg => { - pkg.enabled = !AppEnv.packages.isPackageDisabled(pkg.name); - pkg.installed = installedNames.indexOf(pkg.name) !== -1; - pkg.installing = this._installing[pkg.name]; - pkg.newerVersionAvailable = this._newerVersions[pkg.name]; - pkg.newerVersion = this._newerVersions[pkg.name]; - }); - - return pkgs; - }, - - _displayMessage: function _displayMessage(title, message) { - dialog.showMessageBox({ - type: 'warning', - message: title, - detail: message, - buttons: ['OK'], - }); - }, -}); - -export default PackagesStore; diff --git a/app/internal_packages_disabled/plugins/lib/plugins-actions.tsx b/app/internal_packages_disabled/plugins/lib/plugins-actions.tsx deleted file mode 100644 index 35e0d4485..000000000 --- a/app/internal_packages_disabled/plugins/lib/plugins-actions.tsx +++ /dev/null @@ -1,26 +0,0 @@ -import Reflux from 'reflux'; - -const Actions = Reflux.createActions([ - 'selectTabIndex', - 'setInstalledSearchValue', - 'setGlobalSearchValue', - - 'disablePackage', - 'enablePackage', - 'installPackage', - 'installNewPackage', - 'uninstallPackage', - 'createPackage', - 'reloadPackage', - 'showPackage', - 'updatePackage', - - 'refreshFeaturedPackages', - 'refreshInstalledPackages', -]); - -for (const key of Object.keys(Actions)) { - Actions[key].sync = true; -} - -export default Actions; diff --git a/app/internal_packages_disabled/plugins/lib/plugins-tabs-view.tsx b/app/internal_packages_disabled/plugins/lib/plugins-tabs-view.tsx deleted file mode 100644 index 5ab5c9d2c..000000000 --- a/app/internal_packages_disabled/plugins/lib/plugins-tabs-view.tsx +++ /dev/null @@ -1,66 +0,0 @@ -import React from 'react'; -import classNames from 'classnames'; -import PropTypes from 'prop-types'; - -import Tabs from './tabs'; -import TabsStore from './tabs-store'; -import PluginsActions from './plugins-actions'; - -class PluginsTabs extends React.Component { - static displayName = 'PluginsTabs'; - - static propTypes = { - onChange: PropTypes.Func, - }; - - static containerRequired = false; - - static containerStyles = { - minWidth: 200, - maxWidth: 290, - }; - - constructor() { - super(); - this.state = this._getStateFromStores(); - } - - componentDidMount() { - this._unsubscribers = []; - this._unsubscribers.push(TabsStore.listen(this._onChange)); - } - - componentWillUnmount() { - this._unsubscribers.forEach(unsubscribe => unsubscribe()); - } - - _getStateFromStores() { - return { - tabIndex: TabsStore.tabIndex(), - }; - } - - _onChange = () => { - this.setState(this._getStateFromStores()); - }; - - _renderItems() { - return Tabs.map(({ name, key, icon }, idx) => { - const classes = classNames({ - tab: true, - active: idx === this.state.tabIndex, - }); - return ( -
  • PluginsActions.selectTabIndex(idx)}> - {name} -
  • - ); - }); - } - - render() { - return
      {this._renderItems()}
    ; - } -} - -export default PluginsTabs; diff --git a/app/internal_packages_disabled/plugins/lib/preferences-plugins.tsx b/app/internal_packages_disabled/plugins/lib/preferences-plugins.tsx deleted file mode 100644 index 5a3bfceda..000000000 --- a/app/internal_packages_disabled/plugins/lib/preferences-plugins.tsx +++ /dev/null @@ -1,46 +0,0 @@ -import React from 'react'; - -import TabsStore from './tabs-store'; -import Tabs from './tabs'; - -class PluginsView extends React.Component { - static displayName = 'PluginsView'; - - static containerStyles = { - minWidth: 500, - maxWidth: 99999, - }; - - constructor() { - super(); - this.state = this._getStateFromStores(); - } - - componentDidMount() { - this._unsubscribers = []; - this._unsubscribers.push(TabsStore.listen(this._onChange)); - } - - componentWillUnmount() { - this._unsubscribers.forEach(unsubscribe => unsubscribe()); - } - - _getStateFromStores() { - return { tabIndex: TabsStore.tabIndex() }; - } - - _onChange = () => { - this.setState(this._getStateFromStores()); - }; - - render() { - const PluginsTabComponent = Tabs[this.state.tabIndex].component; - return ( -
    - -
    - ); - } -} - -export default PluginsView; diff --git a/app/internal_packages_disabled/plugins/lib/tab-explore.tsx b/app/internal_packages_disabled/plugins/lib/tab-explore.tsx deleted file mode 100644 index 43935d01c..000000000 --- a/app/internal_packages_disabled/plugins/lib/tab-explore.tsx +++ /dev/null @@ -1,87 +0,0 @@ -import React from 'react'; - -import PackageSet from './package-set'; -import PackagesStore from './packages-store'; -import PluginsActions from './plugins-actions'; - -class TabExplore extends React.Component { - static displayName = 'TabExplore'; - - constructor() { - super(); - this.state = this._getStateFromStores(); - } - - componentDidMount() { - this._unsubscribers = []; - this._unsubscribers.push(PackagesStore.listen(this._onChange)); - - // Trigger a refresh of the featured packages - PluginsActions.refreshFeaturedPackages(); - } - - componentWillUnmount() { - this._unsubscribers.forEach(unsubscribe => unsubscribe()); - } - - _getStateFromStores() { - return { - featured: PackagesStore.featured(), - search: PackagesStore.globalSearchValue(), - searchResults: PackagesStore.searchResults(), - }; - } - - _onChange = () => { - this.setState(this._getStateFromStores()); - }; - - _onSearchChange = event => { - PluginsActions.setGlobalSearchValue(event.target.value); - }; - - render() { - let collection = this.state.featured; - let collectionPrefix = 'Featured '; - let emptyText = null; - if (this.state.search.length > 0) { - collectionPrefix = 'Matching '; - if (this.state.searchResults) { - collection = this.state.searchResults; - emptyText = 'No results found.'; - } else { - collection = { - packages: [], - themes: [], - }; - emptyText = 'Loading results...'; - } - } - - return ( -
    -
    - - - -
    -
    - ); - } -} - -export default TabExplore; diff --git a/app/internal_packages_disabled/plugins/lib/tab-installed.tsx b/app/internal_packages_disabled/plugins/lib/tab-installed.tsx deleted file mode 100644 index 938278512..000000000 --- a/app/internal_packages_disabled/plugins/lib/tab-installed.tsx +++ /dev/null @@ -1,129 +0,0 @@ -import React from 'react'; -import { ipcRenderer } from 'electron'; -import { Flexbox } from 'mailspring-component-kit'; - -import PackageSet from './package-set'; -import PackagesStore from './packages-store'; -import PluginsActions from './plugins-actions'; - -class TabInstalled extends React.Component { - static displayName = 'TabInstalled'; - - constructor() { - super(); - this.state = this._getStateFromStores(); - } - - componentDidMount() { - this._unsubscribers = []; - this._unsubscribers.push(PackagesStore.listen(this._onChange)); - - PluginsActions.refreshInstalledPackages(); - } - - componentWillUnmount() { - this._unsubscribers.forEach(unsubscribe => unsubscribe()); - } - - _getStateFromStores() { - return { - packages: PackagesStore.installed(), - search: PackagesStore.installedSearchValue(), - }; - } - - _onChange = () => { - this.setState(this._getStateFromStores()); - }; - - _onInstallPackage() { - PluginsActions.installNewPackage(); - } - - _onCreatePackage() { - PluginsActions.createPackage(); - } - - _onSearchChange = event => { - PluginsActions.setInstalledSearchValue(event.target.value); - }; - - _onEnableDevMode() { - ipcRenderer.send('command', 'application:toggle-dev'); - } - - render() { - let searchEmpty = null; - if (this.state.search.length > 0) { - searchEmpty = 'No matching packages.'; - } - - let devPackages = []; - let devEmpty = ( - {`Run with debug flags enabled to load ${AppEnv.getConfigDirPath()}/dev/packages.`} - ); - let devCTA = ( -
    - Enable Debug Flags -
    - ); - - if (AppEnv.inDevMode()) { - devPackages = this.state.packages.dev || []; - devEmpty = ( - - {`You don't have any packages installed in ${AppEnv.getConfigDirPath()}/dev/packages. `} - These plugins are only loaded when you run the app with debug flags enabled (via the - Developer menu).
    -
    Learn more about building plugins with{' '} - our docs. -
    - ); - devCTA = ( -
    - Create New Plugin... -
    - ); - } - - return ( -
    -
    - -
    - Install Plugin... -
    - -
    - {`You don't have any plugins installed in ${AppEnv.getConfigDirPath()}/packages.`} - ) - } - /> - - -
    {devCTA}
    -
    -
    - ); - } -} - -export default TabInstalled; diff --git a/app/internal_packages_disabled/plugins/lib/tabs-store.tsx b/app/internal_packages_disabled/plugins/lib/tabs-store.tsx deleted file mode 100644 index 0bc6aa7a6..000000000 --- a/app/internal_packages_disabled/plugins/lib/tabs-store.tsx +++ /dev/null @@ -1,25 +0,0 @@ -import Reflux from 'reflux'; - -import PluginsActions from './plugins-actions'; - -const TabsStore = Reflux.createStore({ - init: function init() { - this._tabIndex = 0; - this.listenTo(PluginsActions.selectTabIndex, this._onTabIndexChanged); - }, - - // Getters - - tabIndex: function tabIndex() { - return this._tabIndex; - }, - - // Action Handlers - - _onTabIndexChanged: function _onTabIndexChanged(idx) { - this._tabIndex = idx; - this.trigger(this); - }, -}); - -export default TabsStore; diff --git a/app/internal_packages_disabled/plugins/lib/tabs.tsx b/app/internal_packages_disabled/plugins/lib/tabs.tsx deleted file mode 100644 index d07ac8805..000000000 --- a/app/internal_packages_disabled/plugins/lib/tabs.tsx +++ /dev/null @@ -1,12 +0,0 @@ -import TabInstalled from './tab-installed'; - -const Tabs = [ - { - key: 'installed', - name: 'Installed', - icon: 'tbd', - component: TabInstalled, - }, -]; - -export default Tabs; diff --git a/app/internal_packages_disabled/plugins/package.json b/app/internal_packages_disabled/plugins/package.json deleted file mode 100755 index 619997c0b..000000000 --- a/app/internal_packages_disabled/plugins/package.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "name": "plugins", - "version": "0.1.0", - "main": "./lib/main", - "description": "Plugins", - "license": "GPL-3.0", - "private": true, - "engines": { - "mailspring": "*" - } -} diff --git a/app/internal_packages_disabled/plugins/styles/plugins.less b/app/internal_packages_disabled/plugins/styles/plugins.less deleted file mode 100644 index 5e2d341fa..000000000 --- a/app/internal_packages_disabled/plugins/styles/plugins.less +++ /dev/null @@ -1,132 +0,0 @@ -@import 'ui-variables'; -@import 'ui-mixins'; - -.plugins-view-tabs { - color: @text-color-subtle; - list-style-type: none; - padding-left: 0; - cursor: default; - - li { - padding: @padding-large-vertical @padding-large-horizontal; - border-bottom: 1px solid @border-color-divider; - - &.active { - background: @source-list-active-bg; - color: @source-list-active-color; - img.colorfill { - background: @source-list-active-color; - } - } - } -} - -.plugins-view { - max-width: 800px; - margin: 0 auto; - .new-package { - margin-bottom: 50px; - } - - .installed, - .explore { - overflow-y: scroll; - padding-left: @padding-large-horizontal; - height: 100%; - - .inner { - max-width: 800px; - .search-container { - margin: @padding-large-vertical 2px; - justify-content: space-between; - } - } - - input { - box-sizing: border-box; - width: 30%; - } - .search { - padding-left: 0; - background-repeat: no-repeat; - background-image: url('../static/images/search/searchloupe@2x.png'); - background-size: 15px 15px; - background-position: 7px 4px; - text-indent: 31px; - } - .empty { - color: @text-color-very-subtle; - margin-bottom: @padding-large-vertical * 2; - } - } - - .package-set { - margin-top: 35px; - } - .package { - align-items: center; - background: @background-primary; - border: 1px solid @border-color-divider; - border-radius: @border-radius-large; - margin-top: @padding-large-vertical; - margin-bottom: @padding-large-vertical; - padding: @padding-large-vertical @padding-large-horizontal; - - .icon-container { - width: 52px; - height: 52px; - border-radius: 6px; - background: linear-gradient(to bottom, @background-primary 0%, @background-secondary 100%); - box-shadow: 0 0.5px 0 rgba(0, 0, 0, 0.15), 0 -0.5px 0 rgba(0, 0, 0, 0.15), - 0.5px 0 0 rgba(0, 0, 0, 0.15), -0.5px 0 0 rgba(0, 0, 0, 0.15), - 0 0.5px 1px rgba(0, 0, 0, 0.15); - flex-shrink: 0; - margin-right: @padding-large-horizontal; - text-align: center; - line-height: 50px; - } - .info { - max-width: 380px; - cursor: default; - - .title { - color: @text-color-heading; - font-size: @font-size-h4; - font-weight: @font-weight-normal; - white-space: nowrap; - overflow: hidden; - text-overflow: ellipsis; - } - .version { - font-size: @font-size-small; - font-weight: @font-weight-normal; - margin-left: 10px; - margin-top: 4px; - } - .uninstall-plugin { - color: @text-color-link; - margin-left: 10px; - margin-top: 4px; - } - .description { - padding-top: @padding-base-vertical; - color: @text-color-very-subtle; - font-size: @font-size-small; - } - } - .actions { - flex: 1; - text-align: right; - .btn { - margin-left: @padding-small-horizontal; - } - } - .update-info { - background: fade(@accent-primary, 10%); - line-height: @line-height-computed * 1.1; - .btn { - float: right; - } - } - } -}