Created
December 9, 2017 01:06
-
-
Save leroix/f2d68bf754ce39c6ec3c10e472e56a76 to your computer and use it in GitHub Desktop.
This file has been truncated, but you can view the full file.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var snapshotAuxiliaryData = {"lessSourcesByRelativeFilePath":{"static/atom.less":{"content":"// Import from the syntax theme's variables with a fallback to ./variables/syntax-variables.less\n@import \"./variables/syntax-variables\";\n@import \"syntax-variables\";\n\n// Import from the ui theme's variables with a fallback to ./variables/ui-variables.less\n@import \"./variables/ui-variables\";\n@import \"ui-variables\";\n\n// Octicons\n@import \"octicon-utf-codes\";\n@import \"octicon-mixins\";\n@import \"octicons\";\n\n// Normalize + scaffolding\n@import \"normalize\";\n@import \"scaffolding\";\n\n// Core components\n@import \"cursors\";\n@import \"panels\";\n@import \"docks\";\n@import \"panes\";\n@import \"syntax\";\n@import \"text-editor\";\n@import \"title-bar\";\n@import \"workspace-view\";\n\n// Atom UI library\n@import \"../node_modules/atom-ui/atom-ui.less\";\n","digest":"efab0f9ffc43da40c3d8338fc16e191714b58371"},"static/cursors.less":{"content":"@import \"./variables/syntax-variables\";\n@import \"syntax-variables\";\n\n@import \"./variables/ui-variables\";\n@import \"ui-variables\";\n\n@ibeam-1x: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAQAAAC1+jfqAAAAL0lEQVQoz2NgCD3x//9/BhBYBWdhgFVAiVW4JBFKGIa4AqD0//9D3pt4I4tAdAMAHTQ/j5Zom30AAAAASUVORK5CYII=');\n@ibeam-2x: url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAQAAADZc7J/AAAAz0lEQVRIx2NgYGBY/R8I/vx5eelX3n82IJ9FxGf6tksvf/8FiTMQAcAGQMDvSwu09abffY8QYSAScNk45G198eX//yev73/4///701eh//kZSARckrNBRvz//+8+6ZohwCzjGNjdgQxkAg7B9WADeBjIBqtJCbhRA0YNoIkBSNmaPEMoNmA0FkYNoFKhapJ6FGyAH3nauaSmPfwI0v/3OukVi0CIZ+F25KrtYcx/CTIy0e+rC7R1Z4KMICVTQQ14feVXIbR695u14+Ir4gwAAD49E54wc1kWAAAAAElFTkSuQmCC');\n\n.cursor-white() {\n cursor: -webkit-image-set(@ibeam-1x 1x, @ibeam-2x 2x) 5 8, text;\n}\n\n// Editors\n& when ( lightness(@syntax-background-color) < 50% ) {\n .platform-darwin atom-text-editor:not([mini]) {\n .cursor-white();\n }\n}\n\n// Mini Editors\n& when ( lightness(@input-background-color) < 50% ) {\n .platform-darwin atom-text-editor[mini] {\n .cursor-white();\n }\n}\n","digest":"1735d16beddc1b6fefb5ea5c8d599c9e7a285a7a"},"static/docks.less":{"content":"@import 'ui-variables';\n@import 'syntax-variables';\n\n@atom-dock-toggle-button-size: 50px;\n@atom-dock-resize-handle-size: 4px;\n\n// Dock --------------\n\n// The actual dock element is used as a kind of placeholder in the DOM, relative\n// to which its children can be positioned.\natom-dock {\n display: flex;\n position: relative;\n}\n\n.atom-dock-inner {\n display: flex;\n\n // Keep the area at least a pixel wide so that you have something to hover\n // over to trigger the toggle button affordance even when fullscreen.\n &.left, &.right { min-width: 1px; }\n &.bottom { min-height: 1px; }\n\n &.bottom { width: 100%; }\n &.left, &.right { height: 100%; }\n\n // Make sure to center the toggle buttons\n &.bottom { flex-direction: column; }\n align-items: center;\n\n // Position the docks flush with their side of the editor.\n &.right { right: 0; }\n &.bottom { bottom: 0; }\n &.left { left: 0; }\n\n // Position the docks flush with their side of the editor.\n &.right { right: 0; }\n &.bottom { bottom: 0; }\n &.left { left: 0; }\n\n &:not(.atom-dock-open) {\n // The dock should only take up space when it's active (i.e. it shouldn't\n // take up space when you're dragging something into it).\n position: absolute;\n z-index: 10; // An arbitrary number. Seems high enough. ¯\\_(ツ)_/¯\n }\n}\n\n.atom-dock-mask {\n position: relative;\n background-color: @tool-panel-background-color;\n overflow: hidden; // Mask the content.\n\n // One of these will be overridden by the component with an explicit size.\n // Which depends on the position of the dock.\n width: 100%;\n height: 100%;\n\n transition: none;\n &.atom-dock-should-animate {\n transition: width 0.2s ease-out, height 0.2s ease-out;\n }\n}\n\n.atom-dock-content-wrapper {\n position: absolute;\n display: flex;\n flex: 1;\n align-items: stretch;\n width: 100%;\n height: 100%;\n\n // The contents of the dock should be \"stuck\" to the moving edge of the mask,\n // so it looks like they're sliding in (instead of being unmasked in place).\n &.right { left: 0; }\n &.bottom { top: 0; }\n &.left { right: 0; }\n\n // Use flex-direction to put the resize handle in the correct place.\n &.left { flex-direction: row-reverse; }\n &.bottom { flex-direction: column; }\n &.right { flex-direction: row; }\n}\n\n// Toggle button --------------\n\n.atom-dock-toggle-button {\n position: absolute;\n overflow: hidden; // Mask half of the circle.\n\n // Must be > .scrollbar-content and inactive atom-dock\n z-index: 11;\n\n // Position the toggle button target at the edge of the dock. It's important\n // that this is absolutely positioned so that it doesn't expand the area of\n // its container (which would block mouse events).\n &.right { right: 100%; }\n &.bottom { bottom: 100%; }\n &.left { left: 100%; }\n\n width: @atom-dock-toggle-button-size;\n height: @atom-dock-toggle-button-size;\n &.bottom { height: @atom-dock-toggle-button-size / 2; }\n &.left, &.right { width: @atom-dock-toggle-button-size / 2; }\n\n .atom-dock-toggle-button-inner {\n width: @atom-dock-toggle-button-size;\n height: @atom-dock-toggle-button-size;\n border-radius: @atom-dock-toggle-button-size / 2;\n\n position: absolute;\n display: flex;\n text-align: center;\n justify-content: center;\n align-items: center;\n cursor: pointer;\n\n // Promote to own layer, fixes rendering issue atom/atom#14915\n will-change: transform;\n\n &.right { left: 0; }\n &.bottom { top: 0; }\n &.left { right: 0; }\n }\n\n // Hide the button.\n &:not(.atom-dock-toggle-button-visible) {\n .atom-dock-toggle-button-inner {\n &.right { transform: translateX(50%); }\n &.bottom { transform: translateY(50%); }\n &.left { transform: translateX(-50%); }\n }\n }\n\n // Center the icon.\n @offset: 8px;\n .atom-dock-toggle-button-inner {\n &.right .icon { transform: translateX(-@offset); }\n &.bottom .icon { transform: translateY(-@offset); }\n &.left .icon { transform: translateX(@offset); }\n }\n\n // Animate the icon.\n .icon {\n transition: opacity 0.1s ease-in 0.1s; // intro\n opacity: 1;\n\n &::before {\n // Shrink the icon element to the size of the character.\n width: auto;\n margin: 0;\n }\n }\n &:not(.atom-dock-toggle-button-visible) .icon {\n opacity: 0;\n transition: opacity 0.2s ease-out 0s; // outro\n }\n\n .atom-dock-toggle-button-inner {\n background-color: @tool-panel-background-color;\n border: 1px solid @pane-item-border-color;\n transition: transform 0.2s ease-out 0s; // intro\n }\n\n &:not(.atom-dock-toggle-button-visible) {\n // Don't contribute to mouseenter/drag events when not visible.\n pointer-events: none;\n\n .atom-dock-toggle-button-inner {\n transition: transform 0.2s ease-out 0.1s; // outro\n }\n }\n}\n\n// Resize handle --------------\n\n.atom-dock-resize-handle {\n width: auto;\n height: auto;\n flex: 0 0 auto;\n\n // Use the resize cursor when the handle's resizable\n &.atom-dock-resize-handle-resizable {\n &.left, &.right { cursor: col-resize; }\n &.bottom { cursor: row-resize; }\n }\n\n &.left, &.right { width: @atom-dock-resize-handle-size; }\n &.bottom { height: @atom-dock-resize-handle-size; }\n}\n\n// Cursor overlay --------------\n\n.atom-dock-cursor-overlay {\n position: fixed;\n top: 0;\n bottom: 0;\n left: 0;\n right: 0;\n z-index: 4;\n\n &.left,\n &.right {\n cursor: col-resize;\n }\n\n &.bottom {\n cursor: row-resize;\n }\n\n &:not(.atom-dock-cursor-overlay-visible) {\n display: none;\n }\n}\n","digest":"d005b1871040daf059507d1a14a3bd552503125a"},"static/jasmine.less":{"content":"@import \"ui-variables\";\n@import \"octicon-mixins\";\n\nhtml {\n background-color: @base-background-color;\n}\n\nbody {\n padding: 0;\n background-color: transparent;\n}\n\n.spec-reporter-container {\n position: fixed;\n display: flex;\n flex-direction: column;\n justify-content: flex-end;\n z-index: 99999;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n}\n\n.spec-reporter {\n flex: 1 1 0;\n overflow-y: auto;\n font-size: 11px;\n line-height: 1.6em;\n color: #333;\n background-color: hsl(0, 0%, 98%);\n\n // 578px initial window height, resize to see underlying editor\n @media (min-height: 578px) {\n flex: 0 1 75%;\n min-height: 578px;\n }\n\n .list-unstyled {\n list-style: none;\n }\n\n .reload-button {\n color: #333;\n background-color: #fff;\n border: 1px solid #ccc;\n\n &:hover {\n background-color: #ddd;\n color: #222;\n }\n }\n\n .symbol-header {\n font-size: 18px;\n font-weight: bold;\n padding-bottom: 10px;\n }\n\n .symbol-area {\n padding: 10px;\n }\n\n .symbol-summary {\n overflow: hidden;\n margin: 0;\n\n li {\n font-family: Monaco, Consolas, monospace;\n float: left;\n line-height: 10px;\n height: 10px;\n width: 10px;\n font-size: 10px;\n\n &.passed {\n color: #5cb85c;\n }\n\n &.failed {\n color: #d9534f;\n }\n\n &.skipped {\n color: #f0ad4e;\n }\n\n &.pending {\n color: #eee;\n }\n\n &::before {\n content: \"\\02022\";\n }\n }\n }\n\n .status {\n font-size: 20px;\n line-height: 2em;\n padding: 5px;\n border-radius: 0;\n text-align: center;\n\n .spec-count {\n float: left;\n }\n\n .time {\n float: right;\n }\n }\n\n .results {\n padding: 10px;\n\n .description {\n font-size: 16px;\n padding: 5px 0 5px 0;\n }\n\n > .suite {\n > .description {\n font-size: 18px;\n font-weight: bold;\n }\n\n margin-bottom: 20px;\n }\n\n .spec {\n margin-top: 5px;\n padding: 0 10px 10px 10px;\n border-left: 3px solid #d9534f;\n\n .spec-toggle {\n .octicon(fold);\n float: right;\n cursor: pointer;\n opacity: 0;\n color: #999;\n\n &.folded {\n .octicon(unfold);\n }\n }\n\n .spec-toggle:hover {\n color: #333;\n }\n\n &:hover .spec-toggle {\n opacity: 1;\n }\n }\n\n .suite > .suite,\n .suite > .spec {\n margin-left: 10px;\n }\n }\n\n .result-message {\n font-size: 16px;\n font-weight: bold;\n color: #d9534f;\n padding: 5px 0 5px 0;\n white-space: pre-wrap;\n }\n\n .result-message.deprecation-message {\n font-weight: normal;\n color: darken(#f0ad4e, 20%);\n line-height: 1.4;\n\n a {\n color: darken(#f0ad4e, 15%);\n }\n\n code {\n color: darken(#f0ad4e, 20%);\n background: lighten(#f0ad4e, 35%);\n }\n }\n\n .stack-trace {\n font-size: 12px;\n margin: 5px 0 0 0;\n border-radius: 2px;\n line-height: 18px;\n color: #ccc;\n border: 1px solid #ddd;\n overflow: auto;\n }\n\n .tooltip {\n .tooltip-inner {\n border: 1px solid #ccc;\n background: #fff;\n color: #666;\n max-width: 400px;\n }\n\n &.in {\n opacity: 1;\n }\n\n .tooltip-arrow {\n visibility: hidden;\n }\n }\n\n .result-message.fail, .stack-trace.padded {\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-box-orient: vertical;\n -webkit-line-clamp: 10;\n overflow: hidden;\n\n &.expanded {\n -webkit-line-clamp: inherit;\n // overflow: hidden;\n }\n }\n\n .deprecation-toggle {\n .octicon(fold);\n float: right;\n cursor: pointer;\n opacity: 0;\n color: #999;\n\n &.folded {\n .octicon(unfold);\n }\n }\n\n .deprecation-toggle:hover {\n color: #333;\n }\n\n &:hover .deprecation-toggle {\n opacity: 1;\n }\n}\n","digest":"e40f499e4c81187cb45b28968d0307a73e146103"},"static/linux.less":{"content":"::-webkit-scrollbar-corner {\n background-color: transparent;\n}\n\n::-webkit-scrollbar {\n width: 8px;\n height: 8px;\n}\n\n::-webkit-scrollbar-thumb {\n border-radius: 2px;\n background: rgba(150, 150, 150, .33);\n}\n","digest":"4c4a94845e7f223b4aca5a2ac1fb52a02eb1ce43"},"static/normalize.less":{"content":"/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */\n// Modified to Chrome only.\n\n//\n// Remove default margin.\n//\n\nbody {\n margin: 0;\n}\n\n// HTML5 display definitions\n// ==========================================================================\n\n//\n// 1. Normalize vertical alignment of `progress` in Chrome, Firefox, and Opera.\n//\n\naudio,\ncanvas,\nprogress,\nvideo {\n vertical-align: baseline; // 1\n}\n\n//\n// Prevent modern browsers from displaying `audio` without controls.\n//\n\naudio:not([controls]) {\n display: none;\n}\n\n// Links\n// ==========================================================================\n\n//\n// Improve readability of focused elements when they are also in an\n// active/hover state.\n//\n\na:active,\na:hover {\n outline: 0;\n}\n\n// Text-level semantics\n// ==========================================================================\n\n//\n// Address styling not present in IE 8/9/10/11, Safari, and Chrome.\n//\n\nabbr[title] {\n border-bottom: 1px dotted;\n}\n\n//\n// Address style set to `bolder` in Firefox 4+, Safari, and Chrome.\n//\n\nb,\nstrong {\n font-weight: bold;\n}\n\n//\n// Address styling not present in Safari and Chrome.\n//\n\ndfn {\n font-style: italic;\n}\n\n//\n// Address variable `h1` font-size and margin within `section` and `article`\n// contexts in Firefox 4+, Safari, and Chrome.\n//\n\nh1 {\n font-size: 2em;\n margin: 0.67em 0;\n}\n\n//\n// Address inconsistent and variable font size in all browsers.\n//\n\nsmall {\n font-size: 80%;\n}\n\n//\n// Prevent `sub` and `sup` affecting `line-height` in all browsers.\n//\n\nsub,\nsup {\n font-size: 75%;\n line-height: 0;\n position: relative;\n vertical-align: baseline;\n}\n\nsup {\n top: -0.5em;\n}\n\nsub {\n bottom: -0.25em;\n}\n\n// Grouping content\n// ==========================================================================\n\n//\n// Address differences between Firefox and other browsers.\n//\n\nhr {\n box-sizing: content-box;\n height: 0;\n}\n\n//\n// Contain overflow in all browsers.\n//\n\npre {\n overflow: auto;\n}\n\n//\n// Address odd `em`-unit font size rendering in all browsers.\n//\n\ncode,\nkbd,\npre,\nsamp {\n font-family: monospace, monospace;\n font-size: 1em;\n}\n\n// Forms\n// ==========================================================================\n\n//\n// Known limitation: by default, Chrome and Safari on OS X allow very limited\n// styling of `select`, unless a `border` property is set.\n//\n\n//\n// 1. Correct color not being inherited.\n// Known issue: affects color of disabled elements.\n// 2. Correct font properties not being inherited.\n// 3. Address margins set differently in Firefox 4+, Safari, and Chrome.\n//\n\nbutton,\ninput,\noptgroup,\nselect,\ntextarea {\n color: inherit; // 1\n font: inherit; // 2\n margin: 0; // 3\n}\n\n//\n// Address inconsistent `text-transform` inheritance for `button` and `select`.\n// All other form control elements do not inherit `text-transform` values.\n//\n\nbutton,\nselect {\n text-transform: none;\n}\n\n//\n// 1. Improve usability and consistency of cursor style between image-type\n// `input` and others.\n//\n\nbutton,\ninput[type=\"reset\"],\ninput[type=\"submit\"] {\n cursor: pointer; // 1\n}\n\n//\n// Re-set default cursor for disabled elements.\n//\n\nbutton[disabled],\nhtml input[disabled] {\n cursor: default;\n}\n\n//\n// Fix the cursor style for Chrome's increment/decrement buttons. For certain\n// `font-size` values of the `input`, it causes the cursor style of the\n// decrement button to change from `default` to `text`.\n//\n\ninput[type=\"number\"]::-webkit-inner-spin-button,\ninput[type=\"number\"]::-webkit-outer-spin-button {\n height: auto;\n}\n\n//\n// 1. Address `appearance` set to `searchfield` in Safari and Chrome.\n// 2. Address `box-sizing` set to `border-box` in Safari and Chrome.\n//\n\ninput[type=\"search\"] {\n -webkit-appearance: textfield; // 1\n box-sizing: content-box; //2\n}\n\n//\n// Remove inner padding and search cancel button in Safari and Chrome on OS X.\n// Safari (but not Chrome) clips the cancel button when the search input has\n// padding (and `textfield` appearance).\n//\n\ninput[type=\"search\"]::-webkit-search-cancel-button,\ninput[type=\"search\"]::-webkit-search-decoration {\n -webkit-appearance: none;\n}\n\n//\n// Define consistent border, margin, and padding.\n//\n\nfieldset {\n border: 1px solid;\n margin: 0 2px;\n padding: 0.35em 0.625em 0.75em;\n}\n\n//\n// 1. Remove padding so people aren't caught out if they zero out fieldsets.\n//\n\nlegend {\n padding: 0; // 1\n}\n\n//\n// Don't inherit the `font-weight` (applied by a rule above).\n// NOTE: the default cannot safely be changed in Chrome and Safari on OS X.\n//\n\noptgroup {\n font-weight: bold;\n}\n\n// Tables\n// ==========================================================================\n\n//\n// Remove most spacing between table cells.\n//\n\ntable {\n border-collapse: collapse;\n border-spacing: 0;\n}\n\ntd,\nth {\n padding: 0;\n}\n","digest":"ab87f6d9d1264047613b807775d6a8407ee6675a"},"static/octicons.less":{"content":"@import \"octicon-mixins.less\";\n@import \"octicon-utf-codes.less\";\n\n.make-icon(@name) {\n .icon-@{name} { .octicon(@name); }\n}\n\n// There seems to be no way to make an array, or grab all the local vars in\n// less, so I am copying the octicon-utf-codes in, then doing a find and\n// replace.\n// Find: @([a-z-]+): \"[^\"]+\";\n// Replace: .make-icon(\\1);\n\n\n// Atomicons (private)\n\n.make-icon(type-array);\n.make-icon(type-boolean);\n.make-icon(type-class);\n.make-icon(type-constant);\n.make-icon(type-constructor);\n.make-icon(type-enum);\n.make-icon(type-field);\n.make-icon(type-file);\n.make-icon(type-function);\n.make-icon(type-interface);\n.make-icon(type-method);\n.make-icon(type-module);\n.make-icon(type-namespace);\n.make-icon(type-number);\n.make-icon(type-package);\n.make-icon(type-property);\n.make-icon(type-string);\n.make-icon(type-variable);\n\n\n// Octicons\n\n.make-icon(alert);\n.make-icon(alignment-align);\n.make-icon(alignment-aligned-to);\n.make-icon(alignment-unalign);\n.make-icon(arrow-down);\n.make-icon(arrow-left);\n.make-icon(arrow-right);\n.make-icon(arrow-small-down);\n.make-icon(arrow-small-left);\n.make-icon(arrow-small-right);\n.make-icon(arrow-small-up);\n.make-icon(arrow-up);\n.make-icon(beaker);\n.make-icon(beer);\n.make-icon(bell);\n.make-icon(bold);\n.make-icon(book);\n.make-icon(bookmark);\n.make-icon(briefcase);\n.make-icon(broadcast);\n.make-icon(browser);\n.make-icon(bug);\n.make-icon(calendar);\n.make-icon(check);\n.make-icon(checklist);\n.make-icon(chevron-down);\n.make-icon(chevron-left);\n.make-icon(chevron-right);\n.make-icon(chevron-up);\n.make-icon(circle-slash);\n.make-icon(circuit-board);\n.make-icon(clippy);\n.make-icon(clock);\n.make-icon(cloud-download);\n.make-icon(cloud-upload);\n.make-icon(code);\n.make-icon(color-mode);\n.make-icon(comment);\n.make-icon(comment-add);\n.make-icon(comment-discussion);\n.make-icon(credit-card);\n.make-icon(dash);\n.make-icon(dashboard);\n.make-icon(database);\n.make-icon(desktop-download);\n.make-icon(device-camera);\n.make-icon(device-camera-video);\n.make-icon(device-desktop);\n.make-icon(device-mobile);\n.make-icon(diff);\n.make-icon(diff-added);\n.make-icon(diff-ignored);\n.make-icon(diff-modified);\n.make-icon(diff-removed);\n.make-icon(diff-renamed);\n.make-icon(ellipses);\n.make-icon(ellipsis);\n.make-icon(eye);\n.make-icon(eye-unwatch);\n.make-icon(eye-watch);\n.make-icon(file);\n.make-icon(file-add);\n.make-icon(file-binary);\n.make-icon(file-code);\n.make-icon(file-directory);\n.make-icon(file-directory-create);\n.make-icon(file-media);\n.make-icon(file-pdf);\n.make-icon(file-submodule);\n.make-icon(file-symlink-directory);\n.make-icon(file-symlink-file);\n.make-icon(file-text);\n.make-icon(file-zip);\n.make-icon(flame);\n.make-icon(fold);\n.make-icon(gear);\n.make-icon(gift);\n.make-icon(gist);\n.make-icon(gist-fork);\n.make-icon(gist-new);\n.make-icon(gist-private);\n.make-icon(gist-secret);\n.make-icon(git-branch);\n.make-icon(git-branch-create);\n.make-icon(git-branch-delete);\n.make-icon(git-commit);\n.make-icon(git-compare);\n.make-icon(git-fork-private);\n.make-icon(git-merge);\n.make-icon(git-pull-request);\n.make-icon(git-pull-request-abandoned);\n.make-icon(globe);\n.make-icon(grabber);\n.make-icon(graph);\n.make-icon(heart);\n.make-icon(history);\n.make-icon(home);\n.make-icon(horizontal-rule);\n.make-icon(hourglass);\n.make-icon(hubot);\n.make-icon(inbox);\n.make-icon(info);\n.make-icon(issue-closed);\n.make-icon(issue-opened);\n.make-icon(issue-reopened);\n.make-icon(italic);\n.make-icon(jersey);\n.make-icon(jump-down);\n.make-icon(jump-left);\n.make-icon(jump-right);\n.make-icon(jump-up);\n.make-icon(key);\n.make-icon(keyboard);\n.make-icon(law);\n.make-icon(light-bulb);\n.make-icon(link);\n.make-icon(link-external);\n.make-icon(list-ordered);\n.make-icon(list-unordered);\n.make-icon(location);\n.make-icon(lock);\n.make-icon(log-in);\n.make-icon(log-out);\n.make-icon(logo-gist);\n.make-icon(logo-github);\n.make-icon(mail);\n.make-icon(mail-read);\n.make-icon(mail-reply);\n.make-icon(mark-github);\n.make-icon(markdown);\n.make-icon(megaphone);\n.make-icon(mention);\n.make-icon(microscope);\n.make-icon(milestone);\n.make-icon(mirror);\n.make-icon(mirror-private);\n.make-icon(mirror-public);\n.make-icon(mortar-board);\n.make-icon(move-down);\n.make-icon(move-left);\n.make-icon(move-right);\n.make-icon(move-up);\n.make-icon(mute);\n.make-icon(no-newline);\n.make-icon(octoface);\n.make-icon(organization);\n.make-icon(package);\n.make-icon(paintcan);\n.make-icon(pencil);\n.make-icon(person);\n.make-icon(person-add);\n.make-icon(person-follow);\n.make-icon(pin);\n.make-icon(playback-fast-forward);\n.make-icon(playback-pause);\n.make-icon(playback-play);\n.make-icon(playback-rewind);\n.make-icon(plug);\n.make-icon(plus);\n.make-icon(plus-small);\n.make-icon(podium);\n.make-icon(primitive-dot);\n.make-icon(primitive-square);\n.make-icon(pulse);\n.make-icon(puzzle);\n.make-icon(question);\n.make-icon(quote);\n.make-icon(radio-tower);\n.make-icon(remove-close);\n.make-icon(reply);\n.make-icon(repo);\n.make-icon(repo-clone);\n.make-icon(repo-create);\n.make-icon(repo-delete);\n.make-icon(repo-force-push);\n.make-icon(repo-forked);\n.make-icon(repo-pull);\n.make-icon(repo-push);\n.make-icon(repo-sync);\n.make-icon(rocket);\n.make-icon(rss);\n.make-icon(ruby);\n.make-icon(screen-full);\n.make-icon(screen-normal);\n.make-icon(search);\n.make-icon(search-save);\n.make-icon(server);\n.make-icon(settings);\n.make-icon(shield);\n.make-icon(sign-in);\n.make-icon(sign-out);\n.make-icon(smiley);\n.make-icon(split);\n.make-icon(squirrel);\n.make-icon(star);\n.make-icon(star-add);\n.make-icon(star-delete);\n.make-icon(steps);\n.make-icon(stop);\n.make-icon(sync);\n.make-icon(tag);\n.make-icon(tag-add);\n.make-icon(tag-remove);\n.make-icon(tasklist);\n.make-icon(telescope);\n.make-icon(terminal);\n.make-icon(text-size);\n.make-icon(three-bars);\n.make-icon(thumbsdown);\n.make-icon(thumbsup);\n.make-icon(tools);\n.make-icon(trashcan);\n.make-icon(triangle-down);\n.make-icon(triangle-left);\n.make-icon(triangle-right);\n.make-icon(triangle-up);\n.make-icon(unfold);\n.make-icon(unmute);\n.make-icon(unverified);\n.make-icon(verified);\n.make-icon(versions);\n.make-icon(watch);\n.make-icon(x);\n.make-icon(zap);\n","digest":"5ecc30d59bb67571a2c93ae8a69a50e523792cf8"},"static/panels.less":{"content":"@import \"ui-variables\";\n\n// Atom panels\n\natom-panel-container.left,\natom-panel-container.right {\n display: flex;\n}\n\natom-panel-container.left {\n // Align panels to the right of the panel container. The effect of this is\n // that the left dock's toggle button will appear on the right side of the\n // empty space when the panel container has a min width in the theme.\n justify-content: flex-end;\n}\n\n.tool-panel, // deprecated: .tool-panel\natom-panel {\n display: block;\n position: relative;\n}\n\natom-panel-container > atom-panel.left,\natom-panel-container > atom-panel.right {\n display: flex;\n}\n\n// Some packages use `height: 100%` which doesn't play nice with flexbox\natom-panel-container > atom-panel.left > *,\natom-panel-container > atom-panel.right > * {\n height: initial;\n}\n","digest":"c914b2dc5aa4dd33d986620897ffd8175f27a82a"},"static/panes.less":{"content":"@import \"ui-variables\";\n\n// Pane-items are things that go inside a pane. Like the UI-Demo, the\n// settings-view, the archive-view, the image-view. Etc. Basically a non-\n// editor resource with a tab.\natom-pane-container {\n position: relative;\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n\n atom-pane-axis {\n position: relative;\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n\n & > atom-pane-resize-handle {\n position: relative;\n &:before {\n content: \"\";\n position: absolute;\n z-index: 3;\n }\n }\n }\n\n atom-pane-axis.vertical {\n flex-direction: column;\n\n & > atom-pane-resize-handle {\n border-bottom: none;\n &:before {\n height: 8px;\n top: -4px;\n left: 0;\n right: 0;\n cursor: row-resize;\n }\n }\n }\n\n atom-pane-axis.horizontal {\n flex-direction: row;\n\n & > atom-pane-resize-handle {\n border-right: none;\n &:before {\n width: 8px;\n left: -4px;\n top: 0;\n bottom: 0;\n cursor: col-resize;\n }\n }\n }\n\n atom-pane {\n position: relative;\n display: flex;\n flex: 1;\n flex-direction: column;\n overflow: visible;\n min-width: 0;\n min-height: 0;\n\n .item-views {\n flex: 1;\n display: flex;\n min-width: 0;\n min-height: 0;\n position: relative;\n\n .pane-item {\n color: @text-color;\n background-color: @pane-item-background-color;\n }\n\n > *, > atom-text-editor.react > * {\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n }\n }\n }\n}\n\n// Windows doesn't have row- and col-resize cursors\n.platform-win32 {\n atom-pane-container {\n atom-pane-axis.vertical {\n & > atom-pane-resize-handle {\n cursor: ns-resize;\n }\n }\n\n atom-pane-axis.horizontal {\n & > atom-pane-resize-handle {\n cursor: ew-resize;\n }\n }\n }\n}\n","digest":"6e09826167bc6efad6d102ff6ee0e5b1cc2578d1"},"static/scaffolding.less":{"content":"@import \"ui-variables\";\n@import \"octicon-mixins\";\n\n//\n// Icon fonts\n// --------------------------------------------------\n\n@font-face { .octicon-font-legacy(); } // keep for backwards compatibility\n@font-face { .octicon-font(); }\n@font-face { .atomicon-font(); } // Private\n\n\n//\n// Scaffolding\n// --------------------------------------------------\n\n*,\n*:before,\n*:after {\n box-sizing: border-box; // Reset the box-sizing\n}\n\nhtml,\nbody {\n width: 100%;\n height: 100%;\n overflow: hidden;\n}\n\nhtml {\n font-family: @font-family;\n font-size: @font-size;\n line-height: 1.428571429; // 20/14\n color: @text-color;\n background-color: @app-background-color;\n}\n","digest":"760f9b6cc195500bebcc111651f277041c6ad40b"},"static/syntax.less":{"content":"@import \"syntax-variables\";\n\natom-text-editor {\n .lines {\n .markup {\n &.git-commit {\n &.changed {\n color: @syntax-color-modified;\n }\n\n &.deleted {\n color: @syntax-color-removed;\n }\n\n &.inserted {\n color: @syntax-color-added;\n }\n }\n }\n }\n}\n\n.define-selection-flash-color-if-not-defined() { @syntax-selection-flash-color: rgba(100, 255, 100, 0.7); }\n.define-selection-flash-color-if-not-defined();\n\n@keyframes flash {\n from { background-color: @syntax-selection-flash-color; }\n to { background-color: null; }\n}\n\natom-text-editor .flash.selection .region {\n animation-name: flash;\n animation-duration: .5s;\n animation-iteration-count: 1;\n}\n","digest":"bb074c8cc4d337b86f3e16712aa4b1a10174df24"},"static/text-editor.less":{"content":"@import \"ui-variables\";\n@import \"octicon-utf-codes\";\n@import \"octicon-mixins\";\n\natom-text-editor {\n display: flex;\n font-family: Menlo, Consolas, 'DejaVu Sans Mono', monospace;\n cursor: text;\n\n .gutter-container {\n width: min-content;\n background-color: inherit;\n cursor: default;\n }\n\n .gutter {\n overflow: hidden;\n z-index: 0;\n text-align: right;\n min-width: 1em;\n box-sizing: border-box;\n background-color: inherit;\n position: relative;\n }\n\n .gutter:hover {\n .line-number.foldable .icon-right {\n visibility: visible;\n\n &:hover {\n opacity: 1;\n }\n }\n }\n\n .gutter, .gutter:hover {\n .line-number.folded .icon-right {\n .octicon(chevron-right, 0.8em);\n\n visibility: visible;\n\n &::before {\n position: relative;\n left: -.1em;\n }\n }\n }\n\n .line-numbers {\n width: max-content;\n background-color: inherit;\n }\n\n .line-number {\n padding-left: .5em;\n white-space: nowrap;\n opacity: 0.6;\n position: relative;\n\n .icon-right {\n .octicon(chevron-down, 0.8em);\n display: inline-block;\n visibility: hidden;\n opacity: .6;\n padding: 0 .4em;\n\n &::before {\n text-align: center;\n }\n }\n }\n\n .highlight {\n background: none;\n padding: 0;\n }\n\n .highlight .region {\n pointer-events: none;\n z-index: -1;\n }\n\n .line {\n white-space: pre;\n contain: layout;\n\n &.cursor-line .fold-marker::after {\n opacity: 1;\n }\n }\n\n .fold-marker {\n cursor: default;\n\n &::after {\n .icon(0.8em, inline);\n\n content: @ellipsis;\n padding-left: 0.2em;\n }\n }\n\n .placeholder-text {\n position: absolute;\n color: @text-color-subtle;\n }\n\n .invisible-character {\n font-weight: normal !important;\n font-style: normal !important;\n }\n\n .indent-guide {\n display: inline-block;\n box-shadow: inset 1px 0;\n }\n\n .cursor {\n z-index: 4;\n pointer-events: none;\n box-sizing: border-box;\n position: absolute;\n border-left: 1px solid;\n opacity: 0;\n }\n\n &.is-focused .cursor {\n opacity: 1;\n }\n\n .cursors.blink-off .cursor {\n opacity: 0;\n }\n}\n\natom-text-editor[mini] {\n font-size: @input-font-size;\n line-height: @component-line-height;\n max-height: @component-line-height + 2; // +2 for borders\n overflow: auto;\n}\n\natom-overlay {\n position: fixed;\n display: block;\n z-index: 4;\n}\n","digest":"557dca01940b829a17ff515e4e73e94ec506c239"},"static/title-bar.less":{"content":"@import \"ui-variables\";\n\n@title-bar-height: 22px;\n@traffic-lights-width: 68px;\n\n@inset-title-bar-height: 38px;\n@inset-traffic-lights-width: 78px;\n\n@title-bar-text-size: 13px;\n@title-bar-background-color: @base-background-color;\n@title-bar-border-color: @base-border-color;\n\n\n// Title Bar -------------------------------\n\n.title-bar {\n display: flex;\n flex-shrink: 0;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n box-sizing: content-box;\n font-size: @title-bar-text-size;\n background-color: @title-bar-background-color;\n border-bottom: 1px solid @title-bar-border-color;\n transition: margin-top 160ms;\n -webkit-user-select: none;\n -webkit-app-region: drag;\n\n .title {\n flex: 0 1 auto;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n }\n\n .is-blurred & {\n color: @text-color-subtle;\n }\n}\n\n\n// Custom -------------------------------\n\n.custom-title-bar {\n .title-bar {\n height: @title-bar-height;\n padding-left: @traffic-lights-width;\n padding-right: @traffic-lights-width;\n }\n\n &.fullscreen .title-bar {\n margin-top: -@title-bar-height; // hide title bar in fullscreen mode\n }\n\n atom-panel.modal {\n top: @title-bar-height; // Move modals down\n }\n}\n\n\n// Custom Inset -------------------------------\n\n.custom-inset-title-bar {\n .title-bar {\n height: @inset-title-bar-height;\n padding-left: @inset-traffic-lights-width;\n padding-right: @inset-traffic-lights-width;\n }\n\n &.fullscreen .title-bar {\n margin-top: -@inset-title-bar-height; // hide title bar in fullscreen mode\n }\n\n atom-panel.modal {\n top: @inset-title-bar-height; // Move modals down\n }\n}\n\n\n// Hidden -------------------------------\n\n.hidden-title-bar {\n .status-bar {\n -webkit-app-region: drag; // Enable dragging\n }\n}\n","digest":"7aeb076632ef30bcb6f4c3b25facc4f487b1929d"},"static/variables/octicon-mixins.less":{"content":"@import \"octicon-utf-codes.less\";\n\n.icon-size(@size) {\n font-size: @size;\n width: @size;\n height: @size;\n}\n\n.icon(@size, @display: inline-block) {\n font-family: 'Octicons Regular';\n font-weight: normal;\n font-style: normal;\n display: @display;\n line-height: 1;\n -webkit-font-smoothing: antialiased;\n text-decoration: none;\n\n .icon-size(@size);\n}\n\n.octicon(@name, @size: 16px) {\n &::before {\n .icon(@size);\n content: @@name\n }\n}\n\n.mega-octicon(@name, @size: 32px) {\n &::before {\n .icon(@size);\n content: @@name\n }\n}\n\n// keep for backwards compatibility\n.octicon-font-legacy() {\n font-family: 'Octicons Regular';\n src: url(\"octicons-2.1.2.woff\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n.octicon-font() {\n font-family: 'Octicons Regular';\n src: url(\"octicons.woff\") format(\"woff\");\n font-weight: normal;\n font-style: normal;\n}\n\n.atomicon-font() {\n font-family: 'Octicons Regular';\n src: url('atomicons.woff') format('woff');\n font-weight: normal;\n font-style: normal;\n}\n","digest":"95ee6fc64ee8890d428ac75c63d8b8de3ead010c"},"static/variables/octicon-utf-codes.less":{"content":"\n// Atomicons (private)\n\n@type-array: \"\\e900\";\n@type-boolean: \"\\e901\";\n@type-class: \"\\e902\";\n@type-constant: \"\\e903\";\n@type-constructor: \"\\e904\";\n@type-enum: \"\\e905\";\n@type-field: \"\\e906\";\n@type-file: \"\\e907\";\n@type-function: \"\\e908\";\n@type-interface: \"\\e909\";\n@type-method: \"\\e90a\";\n@type-module: \"\\e90b\";\n@type-namespace: \"\\e90c\";\n@type-number: \"\\e90d\";\n@type-package: \"\\e90e\";\n@type-property: \"\\e90f\";\n@type-string: \"\\e910\";\n@type-variable: \"\\e911\";\n\n\n// Octicons\n\n@alert: \"\\f02d\";\n@alignment-align: \"\\f08a\";\n@alignment-aligned-to: \"\\f08e\";\n@alignment-unalign: \"\\f08b\";\n@arrow-down: \"\\f03f\";\n@arrow-left: \"\\f040\";\n@arrow-right: \"\\f03e\";\n@arrow-small-down: \"\\f0a0\";\n@arrow-small-left: \"\\f0a1\";\n@arrow-small-right: \"\\f071\";\n@arrow-small-up: \"\\f09f\";\n@arrow-up: \"\\f03d\";\n@beaker: \"\\f0dd\";\n@beer: \"\\f069\";\n@bell: \"\\f0de\";\n@bold: \"\\f0e2\";\n@book: \"\\f007\";\n@bookmark: \"\\f07b\";\n@briefcase: \"\\f0d3\";\n@broadcast: \"\\f048\";\n@browser: \"\\f0c5\";\n@bug: \"\\f091\";\n@calendar: \"\\f068\";\n@check: \"\\f03a\";\n@checklist: \"\\f076\";\n@chevron-down: \"\\f0a3\";\n@chevron-left: \"\\f0a4\";\n@chevron-right: \"\\f078\";\n@chevron-up: \"\\f0a2\";\n@circle-slash: \"\\f084\";\n@circuit-board: \"\\f0d6\";\n@clippy: \"\\f035\";\n@clock: \"\\f046\";\n@cloud-download: \"\\f00b\";\n@cloud-upload: \"\\f00c\";\n@code: \"\\f05f\";\n@color-mode: \"\\f065\";\n@comment: \"\\f02b\";\n@comment-add: \"\\f02b\";\n@comment-discussion: \"\\f04f\";\n@credit-card: \"\\f045\";\n@dash: \"\\f0ca\";\n@dashboard: \"\\f07d\";\n@database: \"\\f096\";\n@desktop-download: \"\\f0dc\";\n@device-camera: \"\\f056\";\n@device-camera-video: \"\\f057\";\n@device-desktop: \"\\f27c\";\n@device-mobile: \"\\f038\";\n@diff: \"\\f04d\";\n@diff-added: \"\\f06b\";\n@diff-ignored: \"\\f099\";\n@diff-modified: \"\\f06d\";\n@diff-removed: \"\\f06c\";\n@diff-renamed: \"\\f06e\";\n@ellipses: \"\\f101\";\n@ellipsis: \"\\f09a\";\n@eye: \"\\f04e\";\n@eye-unwatch: \"\\f04e\";\n@eye-watch: \"\\f04e\";\n@file: \"\\f102\";\n@file-add: \"\\f05d\";\n@file-binary: \"\\f094\";\n@file-code: \"\\f010\";\n@file-directory: \"\\f016\";\n@file-directory-create: \"\\f05d\";\n@file-media: \"\\f012\";\n@file-pdf: \"\\f014\";\n@file-submodule: \"\\f017\";\n@file-symlink-directory: \"\\f0b1\";\n@file-symlink-file: \"\\f0b0\";\n@file-text: \"\\f011\";\n@file-zip: \"\\f013\";\n@flame: \"\\f0d2\";\n@fold: \"\\f0cc\";\n@gear: \"\\f02f\";\n@gift: \"\\f042\";\n@gist: \"\\f00e\";\n@gist-fork: \"\\f002\";\n@gist-new: \"\\f05d\";\n@gist-private: \"\\f06a\";\n@gist-secret: \"\\f08c\";\n@git-branch: \"\\f020\";\n@git-branch-create: \"\\f020\";\n@git-branch-delete: \"\\f020\";\n@git-commit: \"\\f01f\";\n@git-compare: \"\\f0ac\";\n@git-fork-private: \"\\f06a\";\n@git-merge: \"\\f023\";\n@git-pull-request: \"\\f009\";\n@git-pull-request-abandoned: \"\\f009\";\n@globe: \"\\f0b6\";\n@grabber: \"\\f103\";\n@graph: \"\\f043\";\n@heart: \"\\2665\";\n@history: \"\\f07e\";\n@home: \"\\f08d\";\n@horizontal-rule: \"\\f070\";\n@hourglass: \"\\f09e\";\n@hubot: \"\\f09d\";\n@inbox: \"\\f0cf\";\n@info: \"\\f059\";\n@issue-closed: \"\\f028\";\n@issue-opened: \"\\f026\";\n@issue-reopened: \"\\f027\";\n@italic: \"\\f0e4\";\n@jersey: \"\\f019\";\n@jump-down: \"\\f072\";\n@jump-left: \"\\f0a5\";\n@jump-right: \"\\f0a6\";\n@jump-up: \"\\f073\";\n@key: \"\\f049\";\n@keyboard: \"\\f00d\";\n@law: \"\\f0d8\";\n@light-bulb: \"\\f000\";\n@link: \"\\f05c\";\n@link-external: \"\\f07f\";\n@list-ordered: \"\\f062\";\n@list-unordered: \"\\f061\";\n@location: \"\\f060\";\n@lock: \"\\f06a\";\n@log-in: \"\\f036\";\n@log-out: \"\\f032\";\n@logo-gist: \"\\f0ad\";\n@logo-github: \"\\f092\";\n@mail: \"\\f03b\";\n@mail-read: \"\\f03c\";\n@mail-reply: \"\\f051\";\n@mark-github: \"\\f00a\";\n@markdown: \"\\f0c9\";\n@megaphone: \"\\f077\";\n@mention: \"\\f0be\";\n@microscope: \"\\f089\";\n@milestone: \"\\f075\";\n@mirror: \"\\f024\";\n@mirror-private: \"\\f06a\";\n@mirror-public: \"\\f024\";\n@mortar-board: \"\\f0d7\";\n@move-down: \"\\f0a8\";\n@move-left: \"\\f074\";\n@move-right: \"\\f0a9\";\n@move-up: \"\\f0a7\";\n@mute: \"\\f080\";\n@no-newline: \"\\f09c\";\n@octoface: \"\\f008\";\n@organization: \"\\f037\";\n@package: \"\\f0c4\";\n@paintcan: \"\\f0d1\";\n@pencil: \"\\f058\";\n@person: \"\\f018\";\n@person-add: \"\\f018\";\n@person-follow: \"\\f018\";\n@pin: \"\\f041\";\n@playback-fast-forward: \"\\f0bd\";\n@playback-pause: \"\\f0bb\";\n@playback-play: \"\\f0bf\";\n@playback-rewind: \"\\f0bc\";\n@plug: \"\\f0d4\";\n@plus: \"\\f05d\";\n@plus-small: \"\\f104\";\n@podium: \"\\f0af\";\n@primitive-dot: \"\\f052\";\n@primitive-square: \"\\f053\";\n@pulse: \"\\f085\";\n@puzzle: \"\\f0c0\";\n@question: \"\\f02c\";\n@quote: \"\\f063\";\n@radio-tower: \"\\f030\";\n@remove-close: \"\\f081\";\n@reply: \"\\f105\";\n@repo: \"\\f001\";\n@repo-clone: \"\\f04c\";\n@repo-create: \"\\f05d\";\n@repo-delete: \"\\f001\";\n@repo-force-push: \"\\f04a\";\n@repo-forked: \"\\f002\";\n@repo-pull: \"\\f006\";\n@repo-push: \"\\f005\";\n@repo-sync: \"\\f087\";\n@rocket: \"\\f033\";\n@rss: \"\\f034\";\n@ruby: \"\\f047\";\n@screen-full: \"\\f066\";\n@screen-normal: \"\\f067\";\n@search: \"\\f02e\";\n@search-save: \"\\f02e\";\n@server: \"\\f097\";\n@settings: \"\\f07c\";\n@shield: \"\\f0e1\";\n@sign-in: \"\\f036\";\n@sign-out: \"\\f032\";\n@smiley: \"\\f0e7\";\n@split: \"\\f0c6\";\n@squirrel: \"\\f0b2\";\n@star: \"\\f02a\";\n@star-add: \"\\f02a\";\n@star-delete: \"\\f02a\";\n@steps: \"\\f0c7\";\n@stop: \"\\f08f\";\n@sync: \"\\f087\";\n@tag: \"\\f015\";\n@tag-add: \"\\f015\";\n@tag-remove: \"\\f015\";\n@tasklist: \"\\f0e5\";\n@telescope: \"\\f088\";\n@terminal: \"\\f0c8\";\n@text-size: \"\\f0e3\";\n@three-bars: \"\\f05e\";\n@thumbsdown: \"\\f0db\";\n@thumbsup: \"\\f0da\";\n@tools: \"\\f031\";\n@trashcan: \"\\f0d0\";\n@triangle-down: \"\\f05b\";\n@triangle-left: \"\\f044\";\n@triangle-right: \"\\f05a\";\n@triangle-up: \"\\f0aa\";\n@unfold: \"\\f039\";\n@unmute: \"\\f0ba\";\n@unverified: \"\\f0e8\";\n@verified: \"\\f0e6\";\n@versions: \"\\f064\";\n@watch: \"\\f0e0\";\n@x: \"\\f081\";\n@zap: \"\\26A1\";\n","digest":"fca97c7cecae6f10fc64d90751603b41f79a4a0d"},"static/variables/syntax-variables.less":{"content":"// This file has fallback variables. It specifies all syntax variables that\n// themes must implement if they include a syntax-variables.less file.\n\n// General colors\n@syntax-text-color: #333;\n@syntax-cursor-color: #333;\n@syntax-selection-color: #69c;\n@syntax-selection-flash-color: #00f; // Color the selection is 'flashed' when you run find next\n@syntax-background-color: #fff;\n\n// Guide colors\n@syntax-wrap-guide-color: #ccc;\n@syntax-indent-guide-color: #ccc;\n@syntax-invisible-character-color: #ccc;\n\n// For find and replace markers\n@syntax-result-marker-color: #444;\n@syntax-result-marker-color-selected: #000;\n\n// Gutter colors\n@syntax-gutter-text-color: #333;\n@syntax-gutter-text-color-selected: #000;\n@syntax-gutter-background-color: #ccc;\n@syntax-gutter-background-color-selected: #eee;\n\n// For git diff info. i.e. in the gutter\n@syntax-color-added: green;\n@syntax-color-modified: orange;\n@syntax-color-removed: red;\n@syntax-color-renamed: blue;\n\n// For language entity colors\n@syntax-color-variable: #DF6A73;\n@syntax-color-constant: #DF6A73;\n@syntax-color-property: #DF6A73;\n@syntax-color-value: #D29B67;\n@syntax-color-function: #61AEEF;\n@syntax-color-method: @syntax-color-function;\n@syntax-color-class: #E5C17C;\n@syntax-color-keyword: #a431c4;\n@syntax-color-tag: #b72424;\n@syntax-color-attribute: #87400d;\n@syntax-color-import: #97C378;\n@syntax-color-snippet: #97C378;\n","digest":"812c1b7883a023f768773d14294653adcdb932d7"},"static/variables/ui-variables.less":{"content":"// This file has fallback variables. It specifies the variables themes\n// must implement.\n\n// Colors\n\n@text-color: #333;\n@text-color-subtle: #777;\n@text-color-highlight: #111;\n@text-color-selected: @text-color-highlight;\n\n@text-color-info: #5293d8;\n@text-color-success: #1fe977;\n@text-color-warning: #f78a46;\n@text-color-error: #c00;\n\n@background-color-info: #0098ff;\n@background-color-success: #17ca65;\n@background-color-warning: #ff4800;\n@background-color-error: #c00;\n@background-color-highlight: hsla(0,0%,0%,.1);\n@background-color-selected: @background-color-highlight;\n\n@app-background-color: #fff;\n\n@base-background-color: #fff;\n@base-border-color: #eee;\n\n@pane-item-background-color: @base-background-color;\n@pane-item-border-color: @base-border-color;\n\n@input-background-color: #fff;\n@input-border-color: @base-border-color;\n\n@tool-panel-background-color: #f4f4f4;\n@tool-panel-border-color: @base-border-color;\n\n@inset-panel-background-color: #eee;\n@inset-panel-border-color: @base-border-color;\n\n@panel-heading-background-color: #ddd;\n@panel-heading-border-color: transparent;\n\n@overlay-background-color: #f4f4f4;\n@overlay-border-color: @base-border-color;\n\n@button-background-color: #ccc;\n@button-background-color-hover: lighten(@button-background-color, 5%);\n@button-background-color-selected: @button-background-color-hover;\n@button-border-color: #aaa;\n\n@tab-bar-background-color: #fff;\n@tab-bar-border-color: darken(@tab-background-color-active, 10%);\n@tab-background-color: #f4f4f4;\n@tab-background-color-active: #fff;\n@tab-border-color: @base-border-color;\n\n@tree-view-background-color: @tool-panel-background-color;\n@tree-view-border-color: @tool-panel-border-color;\n\n@ui-site-color-1: @background-color-success; // green\n@ui-site-color-2: @background-color-info; // blue\n@ui-site-color-3: @background-color-warning; // orange\n@ui-site-color-4: #db2ff4; // purple\n@ui-site-color-5: #f5e11d; // yellow\n\n\n// Sizes\n\n@font-size: 13px;\n@input-font-size: 14px;\n\n@disclosure-arrow-size: 12px;\n\n@component-padding: 10px;\n@component-icon-padding: 5px;\n@component-icon-size: 16px;\n@component-line-height: 25px;\n@component-border-radius: 2px;\n\n@tab-height: 30px;\n\n// Other\n\n@font-family: 'BlinkMacSystemFont', 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif;\n@use-custom-controls: true; // false uses native controls\n","digest":"e3029f763111ec391f6dcea8178d35be7c798b4f"},"static/workspace-view.less":{"content":"@import \"ui-variables\";\n\natom-workspace {\n display: flex;\n flex-direction: column;\n height: 100%;\n overflow: hidden;\n position: relative;\n color: @text-color;\n background-color: @app-background-color;\n font-family: @font-family;\n\n atom-workspace-axis {\n position: relative;\n }\n\n atom-workspace-axis.horizontal {\n display: flex;\n flex: 1;\n min-width: 0;\n min-height: 0;\n }\n\n atom-workspace-axis.vertical {\n display: flex;\n flex: 1;\n flex-direction: column;\n min-width: 0;\n min-height: 0;\n }\n}\n","digest":"a2c3f77adc22e4dbff693a00d43be77c3431eea5"},"node_modules/about/styles/about.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"variables\";\n\n.about {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: flex-start;\n -webkit-user-select: none;\n cursor: default;\n overflow: auto;\n text-align: center;\n font-size: 1.25em;\n line-height: 1.4;\n padding: 4em;\n color: @text-color;\n background-color: @base-background-color;\n\n button {\n cursor: default;\n }\n\n a:focus {\n // Don't use Bootstrap default here\n color: inherit;\n }\n\n img, a {\n -webkit-user-drag: none;\n }\n\n .input-checkbox {\n margin-top: -.2em;\n }\n\n // used to group different elements\n .group-start {\n margin-top: 4em;\n }\n .group-item {\n margin-top: 1.5em;\n }\n}\n\n.about-container {\n width: 100%;\n max-width: 500px;\n}\n\n\n// Header --------------------------------\n\n.about-atom-io:hover {\n .about-logo {\n color: @atom-green;\n }\n}\n\n.about-logo {\n display: block;\n width: 100%;\n max-width: 280px;\n margin: 0 auto 1em auto;\n color: @text-color-highlight;\n transition: color 0.2s;\n}\n\n.about-version-container {\n &:hover {\n color: lighten(@text-color, 15%);\n }\n &:active {\n color: lighten(@text-color, 30%);\n }\n}\n\n.about-version {\n margin-right: .5em;\n font-size: 1.25em;\n vertical-align: middle;\n}\n\n.about-header-release-notes {\n vertical-align: middle;\n margin-left: 1em;\n}\n\n\n// Updates --------------------------------\n\n.about-updates-box {\n display: flex;\n align-items: center;\n padding: @component-padding;\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius * 2;\n background-color: @background-color-highlight;\n}\n\n.about-updates-status {\n flex: 1;\n margin-left: .5em;\n text-align: left;\n}\n\n.about-updates-item,\n.about-default-update-message .about-updates-label {\n display: block;\n}\n\n.about-updates-label {\n color: @text-color-subtle;\n &.is-strong {\n color: @text-color;\n }\n}\n\n.about-updates-version {\n margin: 0 .4em;\n}\n\n.about-updates-release-notes {\n margin: 0 1em 0 1.5em;\n}\n\n.about-auto-updates {\n margin-top: 1em;\n input {\n margin-right: .5em;\n }\n}\n\n\n// Love --------------------------------\n\n.about-love {\n .icon::before {\n // Make these octicons look good inlined with text\n position: relative;\n width: auto;\n height: auto;\n margin-right: 0;\n font-size: 1.5em;\n vertical-align: text-top;\n }\n\n .icon-logo-github::before {\n font-size: 3.6em;\n height: .36em;\n }\n}\n\n.about-credits {\n color: @text-color-subtle;\n}\n\n\n// the blue squirrel --------------------------------\n\n.about-release-notes {\n color: @background-color-info;\n &:hover {\n color: lighten(@background-color-info, 15%);\n }\n}\n","digest":"fb7e3f364b75acce30e629a0eaec8bda8cea5e16"},"node_modules/about/styles/variables.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@atom-green: #40a977;\n","digest":"af218163acb279019a92806f4afe744bb0e0ccbf"},"node_modules/archive-view/styles/archive-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n.archive-editor {\n background-color: @inset-panel-background-color;\n overflow: auto;\n\n .archive-container {\n height:100%;\n width: 100%;\n\n .inset-panel {\n border-width: 0;\n\n .panel-heading {\n border-radius: 0;\n }\n }\n\n .archive-tree {\n padding: 5px;\n }\n }\n}\n","digest":"c928c6e5a9508d14097a0524462f17d0cd2c1d48"},"node_modules/autocomplete-plus/styles/autocomplete.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n// TODO: remove this fallback when 193 is out for a while\n.attr-syntax-color() { @syntax-color-attribute: #888; } .attr-syntax-color();\n\n@import \"ui-variables\";\n@import \"syntax-variables\";\n\n@font-size-small: .9em;\n@type-icon-font-size: 1em;\n@type-letter-icon-font-size: @font-size-small;\n@row-line-height: 2em;\n@item-padding: .75em;\n@item-side-padding: .6em;\n\natom-overlay.autocomplete-plus {\n z-index: 12; // higher than docks\n}\n\nautocomplete-suggestion-list.select-list.popover-list {\n width: auto !important; // TODO: Can be removed once the inline style is gone\n display: inline-block;\n min-width: 243px; // Try and fail until the specs pass\n padding: 0;\n overflow: hidden;\n color: @text-color;\n\n .suggestion-list-scroller {\n overflow-y: auto;\n }\n\n .suggestion-description {\n padding: 5px 0;\n padding-left: @item-side-padding;\n padding-right: @item-side-padding;\n min-height: @row-line-height;\n line-height: 1.3;\n background: darken(@overlay-background-color, 4%);\n border-radius: 0 0 @component-border-radius @component-border-radius;\n\n // let the other sibling decide how large the container should be\n width: min-content;\n min-width: 100%;\n }\n\n .suggestion-description-content {\n font-size: @font-size + 1px;\n font-family: @font-family;\n max-height: 33vh;\n display: block;\n overflow-y: auto;\n white-space: pre-wrap;\n }\n\n .suggestion-description-more-link {\n font-size: @font-size + 1px;\n font-family: @font-family;\n color: @text-color-info;\n }\n\n input {\n position: absolute;\n opacity: 0.00;\n }\n\n ol.list-group {\n margin-top: 0;\n display: table;\n width: 100%;\n margin-right: 10px; // Needed to prevent horizontal scrolling when right label is too long\n\n li {\n display: table-row;\n color: @text-color;\n line-height: @row-line-height;\n\n > span {\n display: table-cell;\n vertical-align: middle;\n }\n\n &:after {\n clear: both;\n display: block;\n content: ' ';\n }\n\n &.selected {\n .word {\n color: fadeout(@text-color-selected, 20%);\n }\n .character-match {\n color: @text-color-selected;\n }\n .left-label, .right-label, .snippet-completion {\n color: fadeout(@text-color-selected, 50%);\n }\n }\n }\n }\n}\n\nautocomplete-suggestion-list {\n .icon-container {\n width: @row-line-height;\n padding-left: 0;\n padding-right: @item-padding;\n &:empty {\n width: @item-side-padding;\n padding: 0;\n }\n }\n\n .icon {\n display: block;\n width: @row-line-height;\n line-height: @row-line-height;\n text-align: center;\n font-style: normal;\n font-weight: bold;\n\n color: @text-color-subtle;\n background: fadeout(@text-color, 90%);\n\n &:empty { display: none; }\n > *::before {\n font-size: @type-icon-font-size;\n width: @type-icon-font-size;\n height: @type-icon-font-size;\n }\n\n .icon-letter {\n // I'm failing to vert center these letters. So shift them up...\n position: relative;\n top: -.1em;\n font-size: @type-letter-icon-font-size;\n line-height: @type-letter-icon-font-size;\n }\n }\n\n .left-label {\n text-align: right;\n padding-right: @item-padding;\n vertical-align: middle;\n\n font-size: @font-size-small;\n color: @text-color-subtle;\n\n &:empty {\n padding-right: 0;\n }\n }\n\n .right-label {\n padding-right: @item-padding;\n font-size: @font-size-small;\n color: @text-color-subtle;\n\n &:empty {\n padding-right: 0;\n }\n }\n\n .word-container {\n padding-right: @item-padding;\n }\n\n .word {\n float: left;\n }\n\n .character-match {\n font-weight: bold;\n color: @text-color-highlight;\n }\n\n .snippet-completion {\n color: @text-color-subtle;\n }\n\n // Here we set the max width of the popup\n .left-label {\n max-width: 20vw;\n }\n .word {\n max-width: 35vw;\n }\n .right-label {\n max-width: 25vw;\n }\n\n .word, .left-label, .right-label {\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n }\n\n .make-type-icon(attribute, @syntax-color-attribute);\n .make-type-icon(builtin, @syntax-color-keyword);\n .make-type-icon(class, @syntax-color-class);\n .make-type-icon(constant, @syntax-color-constant);\n .make-type-icon(function, @syntax-color-function);\n .make-type-icon(import, @syntax-color-import);\n .make-type-icon(keyword, @syntax-color-keyword);\n .make-type-icon(method, @syntax-color-method);\n .make-type-icon(module, @syntax-color-import);\n .make-type-icon(mixin, @syntax-color-class);\n .make-type-icon(package, @syntax-color-import);\n .make-type-icon(property, @syntax-color-property);\n .make-type-icon(require, @syntax-color-import);\n .make-type-icon(snippet, @syntax-color-snippet);\n .make-type-icon(tag, @syntax-color-tag);\n .make-type-icon(type, @syntax-color-class);\n .make-type-icon(value, @syntax-color-value);\n .make-type-icon(variable, @syntax-color-variable);\n .make-type-icon(selector, @syntax-color-attribute);\n .make-type-icon(pseudo-selector, @syntax-color-attribute);\n}\n\n.make-type-icon(@type, @color) {\n .icon.@{type} {\n color: @color;\n background: fadeout(@color, 80%)\n }\n}\n.make-type-icon(@type, @color)\n when (hsvvalue(@color) - hsvvalue(@overlay-background-color) > -20)\n and (hsvvalue(@color) - hsvvalue(@overlay-background-color) < 20) {\n .icon.@{type} {\n @corrected-color: contrast(@overlay-background-color, darken(@color, 30%), lighten(@color, 30%));\n color: @corrected-color;\n background: fadeout(@corrected-color, 80%);\n }\n}\n","digest":"a67bb2a764bd14a0d0d022deaaf06a02f0205088"},"node_modules/background-tips/styles/background-tips.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n// The ui-variables file is provided by base themes provided by Atom.\n//\n// See https://github.com/atom/atom-dark-ui/blob/master/styles/ui-variables.less\n// for a full listing of what's available.\n@import \"ui-variables\";\n\nbackground-tips {\n display: block;\n pointer-events: none;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n overflow: hidden;\n\n .background-message {\n -webkit-user-select: none;\n cursor: default;\n\n .message {\n padding: 0 @component-padding*3;\n opacity: 0;\n transition: opacity .3s ease-in-out;\n &.fade-in {\n opacity: 1;\n }\n\n .keystroke {\n border: 2px solid;\n padding: 0 @component-padding/2;\n border-radius: @component-border-radius * 3;\n font-family: \"Helvetica Neue\", Arial, sans-serif;\n }\n }\n }\n}\n","digest":"4844ed52aace7b2aabc1600197b0c67d523fa018"},"node_modules/bookmarks/styles/bookmarks.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"octicon-utf-codes.less\";\n\natom-text-editor {\n .gutter .line-number.bookmarked .icon-right {\n visibility: visible;\n\n &:before {\n content: @bookmark;\n color: #09C;\n }\n }\n}\n\n.bookmarks-view {\n .bookmark {\n .line-text {\n font-family: monospace;\n }\n }\n}\n","digest":"16ccb42180dde26a0525047c649420fc349cc803"},"node_modules/bracket-matcher/styles/bracket-matcher.atom-text-editor.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.bracket-matcher .region {\n border-bottom: 1px dotted lime;\n position: absolute;\n}\n\n.line-number.bracket-matcher {\n background-color: @text-color-subtle\n}","digest":"4c5ca1e7952051f2495852a8fdc5475a937ce6da"},"node_modules/command-palette/styles/command-palette.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n// Highlight matched text\n.command-palette .list-group .character-match {\n color: @text-color-highlight;\n font-weight: bold;\n}\n","digest":"4b22bbd3a8da4831603f9cd9a6719906e27b0f60"},"node_modules/deprecation-cop/styles/deprecation-cop.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n// The ui-variables file is provided by base themes provided by Atom.\n//\n// See https://github.com/atom/atom-dark-ui/blob/master/stylesheets/ui-variables.less\n// for a full listing of what's available.\n@import \"ui-variables\";\n\n.deprecation-cop-status {\n .icon.icon-alert:before {\n // It's a really big icon...\n width: 17px;\n }\n}\n.deprecation-cop {\n overflow: auto;\n -webkit-flex: 1;\n background-color: @app-background-color !important;\n\n .deprecation-overview { \n &:after {\n content: '';\n clear: both;\n display: block;\n }\n }\n\n .deprecation-info {\n padding: 0 @component-padding;\n }\n\n .deprecation-info:hover {\n background-color: @background-color-selected !important;\n }\n\n .deprecation-detail.list-item {\n white-space: normal;\n clear: both;\n\n .deprecation-message {\n padding: 5px 0 5px 28px;\n line-height: 1.4;\n font-size: @font-size;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n .icon-alert {\n margin-top: 5px;\n float: left;\n }\n }\n\n .collapsed > ul {\n display: none;\n }\n\n .list {\n list-style-type: none;\n padding: 0;\n }\n\n .stack-trace {\n background-color: @tool-panel-background-color;\n padding: @component-padding;\n margin-bottom: @component-padding;\n }\n\n a {\n color: @text-color-highlight;\n }\n}\n","digest":"7843074dd162b61c7fc9ff62d55eccfbfcdb78d5"},"node_modules/encoding-selector/styles/encoding-selector.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n.encoding-status a,\n.encoding-status a:hover {\n color: @text-color;\n}\n","digest":"32b0dfd811078fe30702e597d22d2709785f2742"},"node_modules/find-and-replace/styles/find-and-replace.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"syntax-variables\";\n\n@find-and-replace-font: Menlo, Consolas, 'DejaVu Sans Mono', monospace;\n\n// result markers\natom-text-editor {\n .find-result .region {\n background-color: transparent;\n border-radius: @component-border-radius;\n border: 1px solid @syntax-result-marker-color;\n box-sizing: border-box;\n z-index: 0;\n }\n\n .current-result .region {\n border-radius: @component-border-radius;\n border: 1px solid @syntax-result-marker-color-selected;\n box-sizing: border-box;\n z-index: 0;\n }\n\n .find-result,\n .current-result {\n display: none;\n }\n}\n\natom-workspace.find-visible {\n atom-text-editor {\n .find-result,\n .current-result {\n display: block;\n }\n }\n}\n\n// Both project and buffer FNR styles\n.find-and-replace,\n.preview-pane,\n.project-find {\n @min-width: 200px; // min width before it starts scrolling\n\n -webkit-user-select: none;\n padding: @component-padding/2;\n overflow-x: auto;\n\n .header {\n padding: @component-padding/4 @component-padding/2;\n min-width: @min-width;\n line-height: 1.75;\n }\n .header-item {\n margin: @component-padding/4 0;\n }\n\n .input-block {\n display: flex;\n flex-wrap: wrap;\n width: 100%;\n min-width: @min-width;\n }\n .input-block-item {\n display: flex;\n flex: 1;\n padding: @component-padding / 2;\n }\n\n .btn-group {\n display: flex;\n flex: 1;\n .btn {\n flex: 1;\n }\n & + .btn-group {\n margin-left: @component-padding;\n }\n }\n\n .btn > .icon {\n width: 20px;\n height: 16px;\n vertical-align: middle;\n fill: currentColor;\n stroke: currentColor;\n pointer-events: none;\n }\n\n .close-button {\n margin-left: @component-padding;\n cursor: pointer;\n color: @text-color-subtle;\n &:hover {\n color: @text-color-highlight;\n }\n .icon::before {\n margin-right: 0;\n text-align: center;\n vertical-align: middle;\n }\n }\n\n .description {\n display: inline-block;\n .subtle-info-message {\n padding-left: 5px;\n color: @text-color-subtle;\n .highlight {\n color: @text-color;\n font-weight: normal;\n }\n }\n }\n\n .options-label {\n color: @text-color-subtle;\n position: relative;\n .options {\n margin-right: .5em;\n color: @text-color;\n }\n }\n\n .btn-group-options {\n display: inline-flex;\n margin-top: -.1em;\n\n .btn {\n width: 36px;\n padding: 0;\n line-height: 1.75;\n }\n }\n\n .editor-container {\n position: relative;\n atom-text-editor {\n width: 100%;\n }\n }\n\n}\n\n// Buffer find and replace\n.find-and-replace {\n @input-width: 260px;\n @block-width: 260px;\n\n .input-block-item {\n flex: 1 1 @block-width;\n }\n .input-block-item--flex {\n flex: 100 1 @input-width;\n }\n\n .btn-group-find,\n .btn-group-replace {\n flex: 1;\n }\n\n .btn-group-find-all,\n .btn-group-replace-all {\n flex: 2;\n }\n\n .find-container atom-text-editor {\n padding-right: 64px; // leave some room for the results count\n }\n\n // results count\n .find-meta-container {\n position: absolute;\n top: 1px;\n right: 0;\n margin: @component-padding/2 @component-padding/2 0 0;\n z-index: 2;\n font-size: .9em;\n line-height: @component-line-height;\n pointer-events: none;\n .result-counter {\n margin-right: @component-padding;\n }\n }\n}\n\n.find-wrap-icon {\n @wrap-size: @font-size * 10;\n\n opacity: 0;\n transition: opacity 0.5s;\n &.visible { opacity: 1; }\n\n position: absolute;\n\n // These are getting placed in the DOM as a pane item, so override the pane\n // item positioning styles. :/\n top: 50% !important;\n left: 50% !important;\n right: initial !important;\n bottom: initial !important;\n\n margin-top: @wrap-size * -0.5;\n margin-left: @wrap-size * -0.5;\n\n background: fadeout(darken(@syntax-background-color, 4%), 55%);\n border-radius: @component-border-radius * 2;\n text-align: center;\n pointer-events: none;\n &:before {\n // Octicons look best in sizes that are multiples of 16px\n font-size: @wrap-size - mod(@wrap-size, 16px) - 32px;\n line-height: @wrap-size;\n height: @wrap-size;\n width: @wrap-size;\n color: @syntax-text-color;\n opacity: .5;\n }\n}\n\n// Project find and replace\n.project-find {\n @project-input-width: 260px;\n @project-block-width: 160px;\n\n .input-block-item {\n flex: 1 1 @project-block-width;\n }\n .input-block-item--flex {\n flex: 100 1 @project-input-width;\n }\n\n .loading,\n .preview-block,\n .error-messages,\n .filter-container {\n display: none;\n }\n}\n\n.preview-pane {\n position: relative;\n display: flex;\n flex-direction: column;\n\n .preview-header {\n display: flex;\n padding: @component-padding/2 @component-padding/2 @component-padding/2 @component-padding;\n align-items: center;\n justify-content: space-between;\n font-weight: normal;\n border-bottom: 1px solid @panel-heading-border-color;\n background-color: @panel-heading-background-color;\n }\n\n .preview-controls {\n flex-shrink: 0;\n }\n\n .loading-spinner-tiny,\n .loading-spinner-tiny + .inline-block {\n vertical-align: middle;\n }\n\n .no-results-overlay {\n visibility: hidden;\n }\n\n &.no-results .no-results-overlay {\n visibility: visible;\n }\n\n .results-view {\n overflow: auto;\n position: relative;\n flex: 1;\n\n .list-tree {\n padding: 0 @component-padding;\n }\n\n .line-number {\n margin-right: 1ex;\n text-align: right;\n display: inline-block;\n font-family: @find-and-replace-font;\n }\n .match-line.selected .line-number {\n color: @text-color-selected;\n }\n\n .path-match-number {\n padding-left: @component-padding;\n color: @text-color-subtle;\n }\n\n .search-result {\n // box-shadow over a border is used to not affect height calculation\n box-shadow: inset 0 -1px 0 @base-border-color;\n &:first-child {\n box-shadow: inset 0 -1px 0 @base-border-color, inset 0 1px 0 @base-border-color;\n }\n }\n\n .preview {\n word-break: break-all;\n font-family: @find-and-replace-font;\n white-space: pre;\n color: @text-color-subtle;\n }\n\n .match-line .preview {\n color: @text-color-highlight;\n }\n .match-line.selected .preview {\n color: @text-color-selected;\n }\n\n\n .selected {\n .highlight-info {\n box-shadow: inset 0 0 1px lighten(@background-color-info, 50%);\n }\n\n .highlight-error {\n box-shadow: inset 0 0 1px lighten(@background-color-error, 25%);\n }\n\n .highlight-success {\n box-shadow: inset 0 0 1px lighten(@background-color-success, 25%);\n }\n }\n }\n}\n\n.find-container atom-text-editor, .replace-container atom-text-editor {\n // Styles for regular expression highlighting\n .syntax--regexp {\n .syntax--escape {\n color: @text-color-info;\n }\n .syntax--range, .syntax--character-class, .syntax--wildcard {\n color: @text-color-success;\n }\n .syntax--wildcard {\n font-weight: bold;\n }\n .syntax--set {\n color: inherit;\n }\n .syntax--keyword, .syntax--punctuation {\n color: @text-color-error;\n font-weight: normal;\n }\n\n .syntax--replacement.syntax--variable {\n color: @text-color-warning;\n }\n }\n}\n","digest":"5a7ed14760617a7440f845b68f007710839334f3"},"node_modules/fuzzy-finder/styles/fuzzy-finder.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n// Highlight matched text\n.fuzzy-finder .list-group .character-match {\n color: @text-color-highlight;\n font-weight: bold;\n}\n","digest":"d49db921170357f83612471149eac507cf6c0f76"},"node_modules/github/styles/_global.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n// Styles for things that are sprinkled throuout various places\n\n// vertical align the text with the icon\n.github-Tabs,\n.github-PrPaneItem,\n.tooltip {\n .badge .icon:before {\n vertical-align: text-top;\n }\n}\n\n// indent task lists\n.github-DotComMarkdownHtml .task-list-item {\n list-style: none;\n .task-list-item-checkbox {\n position: absolute;\n margin-left: -20px;\n }\n}\n\n\n.issueish-badge, .issueish-badge.badge {\n align-self: flex-start;\n flex-shrink: 0;\n margin-right: @component-padding;\n font-weight: bold;\n text-transform: capitalize;\n border-radius: @component-border-radius;\n\n &.open {\n color: contrast(@gh-background-color-green, black, white, 50%);\n background-color: @gh-background-color-green;\n }\n\n &.closed {\n color: contrast(@gh-background-color-red, black, white, 50%);\n background-color: @gh-background-color-red;\n }\n\n &.merged {\n color: contrast(@gh-background-color-purple, black, white, 50%);\n background-color: @gh-background-color-purple;\n }\n}\n\n.status-warning {\n color: @gh-background-color-yellow;\n}\n\n.status-success {\n color: @gh-background-color-green;\n}\n\n.status-error {\n color: @gh-background-color-red;\n}\n","digest":"1ec25d4470eb2304d47883c2fa0aafb5b57390ac"},"node_modules/github/styles/branch-menu-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-BranchMenuView {\n\n &-selector {\n display: flex;\n align-items: center;\n }\n\n &-item {\n margin: @component-padding / 2;\n }\n\n .icon-git-branch {\n flex-basis: 16px;\n flex-grow: 0;\n flex-shrink: 0;\n color: @text-color-subtle;\n }\n\n .icon-git-branch::before {\n margin-right: 0;\n text-align: center;\n }\n\n &-select {\n flex-grow: 1;\n flex-shrink: 1;\n width: 100%;\n }\n\n &-button {\n flex-grow: 0;\n flex-shrink: 0;\n }\n\n &-editor {\n flex: 1;\n\n atom-text-editor,\n atom-text-editor .cursor-line {\n background-color: inherit;\n }\n atom-text-editor[mini] {\n font-size: inherit;\n text-align: left;\n }\n }\n\n &-message {\n max-height: 20em;\n margin: @component-padding / 2;\n padding: @component-padding / 2;\n line-height: 1.4;\n white-space: normal;\n text-align: left;\n overflow-y: auto;\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n background-color: @inset-panel-background-color;\n\n &:empty {\n display: none;\n }\n }\n}\n","digest":"0cbddff446212db08d871a028dd406f4ce0e3c11"},"node_modules/github/styles/changed-files-count-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n// Used in the status-bar\n\n.github-ChangedFilesCount {\n\n &.icon-diff::before {\n margin-right: .2em;\n }\n\n}\n","digest":"e2c6c93159b16fee602d1862449cf0b6bfe45d9f"},"node_modules/github/styles/commit-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-CommitView {\n padding: @component-padding;\n border-top: 1px solid @base-border-color;\n flex: 0 0 auto;\n\n &-editor {\n position: relative;\n border: 1px solid @input-border-color;\n border-radius: @component-border-radius;\n padding: @component-padding / 2;\n font-size: @font-size;\n background-color: @syntax-background-color;\n }\n\n &-editor.hidden {\n display: none;\n }\n\n &-editor atom-text-editor {\n height: 100px;\n .cursor-line.cursor-line.cursor-line {\n background-color: transparent;\n }\n }\n\n &-expandButton {\n position: absolute;\n right: 0;\n bottom: 0;\n padding: @component-padding / 2;\n line-height: 1;\n border: none;\n background-color: @syntax-background-color;\n cursor: default;\n opacity: .3;\n &:hover {\n opacity: 1;\n }\n &:active {\n opacity: .5;\n }\n &:before {\n margin: 0;\n }\n }\n\n &-bar {\n display: flex;\n align-items: center;\n margin-top: @component-padding;\n }\n\n &-label {\n margin-right: @component-padding;\n }\n\n &-button {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n cursor: default;\n &.is-secondary {\n flex: 0 1 auto;\n margin-right: @component-padding;\n }\n }\n\n &-remaining-characters {\n width: 1.25em;\n text-align: right;\n margin-left: @component-padding;\n color: @text-color-subtle;\n\n &.is-warning { color: @text-color-warning; }\n &.is-error { color: @text-color-error; }\n }\n\n\n // States ---------------------------------------------------\n\n &-editor.is-expanded {\n background-color: transparent;\n atom-text-editor {\n display: none;\n }\n .github-CommitView-expandButton {\n position: relative;\n width: 100%;\n line-height: inherit;\n background-color: transparent;\n opacity: .5;\n &::before {\n margin-right: @component-padding / 2;\n }\n &::after {\n content: \"Toggle expanded commit message\";\n }\n &:active {\n opacity: .3;\n }\n }\n }\n\n}\n\n\n\n\n\n\n// Hacks ---------------------------------------------------\n// TODO: Unhack if possible\n\n\n// Fix focus styles\n// Since it's not possible to add a padding to <atom-text-editor>\n// a pseudo element is used to add the border when focused.\n\n.theme-one-dark-ui,\n.theme-one-light-ui {\n .github-CommitView-editor atom-text-editor.is-focused {\n box-shadow: none;\n &:before {\n content: \"\";\n position: absolute;\n top: -2px;\n left: -2px;\n right: -2px;\n bottom: -2px;\n border: 2px solid;\n border-color: inherit;\n border-radius: @component-border-radius;\n }\n }\n}\n","digest":"9e5cbf636f2ccc35496b051f83a432acec5b4045"},"node_modules/github/styles/conflicting-editor.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n@conflict-color-ours: spin(@syntax-color-renamed, 80); // usually magenta/purple-ish\n@conflict-color-theirs: @syntax-color-renamed;\n@conflict-color-base: desaturate( @syntax-color-renamed, 100% );\n@conflict-color-modified: @syntax-color-modified;\n@conflict-color-resolved: @syntax-color-added;\n\n\natom-text-editor {\n\n .github-ConflictBlock {\n display: flex;\n align-items: center;\n margin-right: @component-padding;\n padding: @component-padding / 2;\n cursor: default;\n color: fade(@syntax-text-color, 75%);\n\n .github-ResolutionControls {\n flex: 1;\n button {\n margin-right: @component-padding;\n }\n\n span {\n cursor: pointer;\n }\n }\n }\n\n .github-SideDescription {\n font-family: @font-family;\n font-size: .9em;\n }\n\n .github-ResolutionControls .icon {\n line-height: 0;\n }\n\n .github-ConflictTopBlock {\n margin-top: @component-padding;\n border-top-left-radius: @component-border-radius * 1.5;\n border-top-right-radius: @component-border-radius * 1.5;\n }\n .github-ConflictBottomBlock {\n margin-bottom: @component-padding;\n border-bottom-left-radius: @component-border-radius * 1.5;\n border-bottom-right-radius: @component-border-radius * 1.5;\n }\n\n\n // Color variations -------------------------\n\n .generate-conflicts(@name, @color) {\n .github-Conflict@{name} {\n margin-right: @component-padding;\n background-color: @color;\n &.cursor-line { background-color: fadein(@color, 10%) !important; }\n }\n\n .github-Conflict@{name}Banner {\n margin-right: @component-padding;\n background-color: @color;\n &.cursor-line { background-color: fadein(@color, 10%) !important; }\n &.github-ConflictUnmodifiedBanner span { color: fade(@color, 66%) !important; };\n }\n\n .github-Conflict@{name}Block {\n color: contrast(@syntax-background-color, hsla(0,0%,0%,.66), hsla(0,0%,100%,.5));\n background-color: fadein(@color, 20%);\n\n .btn {\n color: white;\n border-color: hsla(0,0%,0%,.15);\n border: none;\n background: fade(@color, 100%);\n }\n }\n }\n\n .generate-conflicts(Ours, fade(@conflict-color-ours, 15%) );\n .generate-conflicts(Theirs, fade(@conflict-color-theirs, 15%) );\n .generate-conflicts(Base, fade(@conflict-color-base, 15%) );\n .generate-conflicts(Modified, fade(@conflict-color-modified, 15%) );\n\n\n // Separator -------------------------\n // Uses same color as Base\n\n .github-ConflictSeparator {\n margin-right: @component-padding;\n background-color: fade(@conflict-color-base, 15%);\n &.cursor-line { background-color: fade(@conflict-color-base, 25%) !important; }\n span { color: fade(@conflict-color-base, 66%) !important; };\n }\n\n // Resolved -------------------------\n\n .github-ResolvedLines {\n background-color: fade(@conflict-color-resolved, 15%);\n &.cursor-line { background-color: fade(@conflict-color-resolved, 25%) !important; }\n }\n}\n","digest":"b186401a41aa0364bfed9c88162b18a96f3bbb87"},"node_modules/github/styles/dialog.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n@github-dialog-spacing: @component-padding / 2;\n\n.github-Dialog {\n\n &Prompt {\n margin: @component-padding;\n text-align: center;\n font-size: 1.2em;\n }\n\n &Inputs {\n display: flex;\n flex-direction: column;\n padding: @github-dialog-spacing;\n }\n\n &Label {\n flex: 1;\n margin: @github-dialog-spacing;\n line-height: 2;\n }\n\n &Buttons {\n display: flex;\n justify-content: flex-end;\n padding: @github-dialog-spacing;\n\n // Switch button order on Windows\n .platform-win32 & {\n flex-direction: row-reverse;\n justify-content: flex-start;\n }\n\n .btn {\n margin: @github-dialog-spacing;\n }\n }\n\n &Spinner {\n display: flex;\n align-items: center;\n justify-content: center;\n padding: @component-padding;\n\n .loading {\n margin: @component-padding;\n }\n }\n\n atom-text-editor[mini].editor {\n margin: 0;\n }\n}\n","digest":"666aae03e802fe20d2f9c2547aaa3151aef6a343"},"node_modules/github/styles/file-patch-list-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-FilePatchListView {\n &:empty:before {\n content:'No changes';\n display: block;\n padding: @component-padding;\n text-align: center;\n color: @text-color-subtle;\n font-style: italic;\n }\n\n &-item {\n position: relative;\n display: flex;\n align-items: flex-start;\n padding: @component-padding/2 @component-padding;\n padding-left: @component-padding * 3.5;\n overflow: hidden;\n -webkit-user-select: none;\n cursor: default;\n }\n\n &-icon {\n text-align: right;\n &:before {\n margin-right: @component-padding / 1.2;\n }\n }\n\n &-path {\n flex: 1;\n word-break: break-word;\n }\n\n &-resolutionItem {\n padding-top: 0;\n padding-bottom: @component-padding / 2;\n }\n}\n\n.github-MergeConflictPaths .github-FilePatchListView-icon:last-child {\n margin-left: @component-padding / 2;\n}\n","digest":"a86dc9565052d0e9c830974a7f164ae66a7b0e06"},"node_modules/github/styles/file-patch-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-FilePatchView {\n display: flex;\n flex-direction: column;\n -webkit-user-select: none;\n cursor: default;\n flex: 1;\n min-width: 0;\n\n &-header {\n display: flex;\n justify-content: space-between;\n align-items: center;\n padding: @component-padding/2;\n padding-left: @component-padding;\n border-bottom: 1px solid @base-border-color;\n\n .btn {\n font-size: .9em;\n &.icon-move-up::before,\n &.icon-move-down::before {\n font-size: 1em;\n margin-right: .5em;\n }\n }\n }\n\n &-title {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-right: @component-padding;\n }\n\n &-container {\n flex: 1;\n overflow-y: auto;\n\n .is-blank, .large-file-patch {\n display: flex;\n height: 100%;\n align-items: center;\n justify-content: center;\n text-align: center;\n font-size: 1.2em;\n padding: @component-padding;\n }\n\n .large-file-patch {\n flex-direction: column;\n }\n }\n}\n","digest":"faa80c413e9f60ff766e507c573b14530694384a"},"node_modules/github/styles/git-panel.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-StubItem-git-tab-controller {\n flex: 1;\n display: flex;\n}\n\n.github-PanelEtchWrapper {\n flex: 1;\n display: flex;\n min-width: 0;\n}\n\n.github-Panel {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n font-family: @font-family;\n font-size: @font-size;\n color: @text-color;\n -webkit-user-select: none;\n cursor: default;\n\n &.no-repository {\n padding: @component-padding * 3;\n text-align: center;\n }\n\n &.is-loading {\n color: @text-color-subtle;\n }\n\n &.no-repository {\n display: flex;\n justify-content: center;\n font-size: 1.25em;\n\n > * {\n margin: @component-padding 0;\n }\n\n .git-logo-path {\n fill: mix(@base-background-color, @text-color, 66%); // 2/3 of bg color\n }\n\n .btn.btn-primary {\n overflow: hidden;\n text-overflow: ellipsis;\n }\n }\n}\n\natom-dock.bottom {\n .github-Panel {\n flex-direction: row;\n }\n .github-StagingView {\n flex-direction: row;\n flex: 2;\n }\n .github-StagedChanges {\n border-left: 1px solid @base-border-color;\n border-right: 1px solid @base-border-color;\n }\n .github-StagingView-group:first-child .github-StagingView-header {\n border-top: 1px solid @base-border-color;\n }\n .github-CommitView {\n flex: 1;\n }\n}\n","digest":"21dbf06996a424e1c8eec8d9e5122bbd9b813056"},"node_modules/github/styles/github-controller.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.github-StubItem-github-tab-controller {\n flex: 1;\n display: flex;\n}\n\n.github-GithubTabController {\n flex: 1;\n display: flex;\n flex-direction: column;\n\n &-content {\n flex: 1;\n display: flex;\n }\n\n &-no-remotes {\n margin: 10px;\n font-size: @font-size * 1.25;\n }\n\n .github-RemoteSelector {\n font-size: @font-size * 1.25;\n\n p {\n text-align: center;\n margin: 10px;\n }\n\n ul {\n list-style: none;\n padding-left: 1em;\n }\n\n a {\n color: @text-color-info;\n }\n }\n}\n","digest":"963a90ebbd22941db87bfa58517c4ee9831c6e4a"},"node_modules/github/styles/github-login-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.github-GithubLoginView-Container {\n height: 100%;\n display: flex;\n}\n\n.github-GithubLoginView {\n height: 100%;\n display: flex;\n\n .github-GithubLoginView-Subview {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-self: center;\n align-items: center;\n padding: 20px;\n\n > button, > input {\n margin: @component-padding;\n }\n }\n\n p {\n text-align: center;\n font-size: @font-size * 1.25;\n margin: 0;\n\n &:first-child {\n margin-bottom: 20px;\n }\n\n a {\n color: @text-color-info;\n }\n }\n\n input[type=text] {\n width: 100%;\n }\n}\n","digest":"ac9a34a60d6b07479d9804318cc56bab71143908"},"node_modules/github/styles/hunk-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n@hunk-fg-color: @text-color-subtle;\n@hunk-bg-color: @pane-item-background-color;\n\n.github-HunkView {\n font-family: Menlo, Consolas, 'DejaVu Sans Mono', monospace;\n border-bottom: 1px solid @pane-item-border-color;\n background-color: @hunk-bg-color;\n\n &-header {\n display: flex;\n align-items: stretch;\n font-size: .9em;\n background-color: @panel-heading-background-color;\n border-bottom: 1px solid @panel-heading-border-color;\n }\n\n &-title {\n flex: 1;\n line-height: 2.4;\n padding: 0 @component-padding;\n color: @text-color-subtle;\n overflow: hidden;\n white-space: nowrap;\n text-overflow: ellipsis;\n -webkit-font-smoothing: antialiased;\n }\n\n &-stageButton,\n &-discardButton {\n line-height: 1;\n padding-left: @component-padding;\n padding-right: @component-padding;\n font-family: @font-family;\n border: none;\n border-left: 1px solid @panel-heading-border-color;\n background-color: transparent;\n cursor: default;\n &:hover { background-color: @button-background-color-hover; }\n &:active { background-color: @panel-heading-border-color; }\n }\n\n // pixel fit the icon\n &-discardButton:before {\n text-align: left;\n width: auto;\n }\n\n &-line {\n display: table-row;\n line-height: 1.5em;\n color: @hunk-fg-color;\n &.is-unchanged {\n -webkit-font-smoothing: antialiased;\n }\n }\n\n &-lineNumber {\n display: table-cell;\n min-width: 3.5em; // min 4 chars\n overflow: hidden;\n padding: 0 .5em;\n text-align: right;\n border-right: 1px solid @base-border-color;\n -webkit-font-smoothing: antialiased;\n }\n\n &-plusMinus {\n margin-right: 1ch;\n color: fade(@text-color, 50%);\n vertical-align: top;\n }\n\n &-lineContent {\n display: table-cell;\n padding: 0 .5em 0 3ch; // indent 3 characters\n text-indent: -2ch; // remove indentation for the +/-\n white-space: pre-wrap;\n word-break: break-word;\n width: 100%;\n vertical-align: top;\n }\n\n &-lineText {\n display: inline-block;\n text-indent: 0;\n }\n}\n\n\n//\n// States\n// -------------------------------\n\n.github-HunkView.is-selected.is-hunkMode .github-HunkView-header {\n background-color: @background-color-selected;\n .github-HunkView-title {\n color: @text-color;\n }\n .github-HunkView-stageButton, .github-HunkView-discardButton {\n border-color: mix(@text-color, @background-color-selected, 25%);\n }\n}\n\n.github-HunkView-title:hover {\n color: @text-color-highlight;\n}\n\n.github-HunkView-line {\n\n // mixin\n .hunk-line-mixin(@fg; @bg) {\n &:hover {\n background-color: @background-color-highlight;\n }\n &.is-selected {\n color: @text-color;\n background-color: @background-color-selected;\n }\n .github-HunkView-lineContent {\n color: saturate( mix(@fg, @text-color-highlight, 20%), 20%);\n background-color: saturate( mix(@bg, @hunk-bg-color, 15%), 20%);\n }\n // hightlight when focused + selected\n .github-FilePatchView:focus &.is-selected .github-HunkView-lineContent {\n color: saturate( mix(@fg, @text-color-highlight, 10%), 10%);\n background-color: saturate( mix(@bg, @hunk-bg-color, 25%), 10%);\n }\n }\n\n &.is-deleted {\n .hunk-line-mixin(@text-color-error, @background-color-error);\n }\n\n &.is-added {\n .hunk-line-mixin(@text-color-success, @background-color-success);\n }\n\n // divider line between added and deleted lines\n &.is-deleted + .is-added .github-HunkView-lineContent {\n box-shadow: 0 -1px 0 hsla(0,0%,50%,.1);\n }\n\n}\n\n// focus colors\n.github-FilePatchView:focus {\n .github-HunkView.is-selected.is-hunkMode .github-HunkView-title,\n .github-HunkView.is-selected.is-hunkMode .github-HunkView-header,\n .github-HunkView-line.is-selected .github-HunkView-lineNumber {\n color: contrast(@button-background-color-selected);\n background: @button-background-color-selected;\n }\n .github-HunkView-line.is-selected .github-HunkView-lineNumber {\n border-color: mix(@button-border-color, @button-background-color-selected, 25%);\n }\n .github-HunkView.is-selected.is-hunkMode .github-HunkView {\n &-stageButton,\n &-discardButton {\n border-color: mix(@hunk-bg-color, @button-background-color-selected, 30%);\n &:hover { background-color: mix(@hunk-bg-color, @button-background-color-selected, 10%); }\n &:active { background-color: @button-background-color-selected; }\n }\n }\n}\n","digest":"d071e3342d98b85c0f3dc23dfb62f8799ebf4207"},"node_modules/github/styles/issueish-tooltip.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'variables';\n\n.github-IssueishTooltip {\n max-width: 500px;\n text-align: left;\n\n .issueish-badge-and-link {\n padding-bottom: @component-padding;\n }\n\n .issueish-badge {\n align-self: flex-start;\n flex-shrink: 0;\n margin-right: @component-padding;\n font-weight: bold;\n text-transform: capitalize;\n border-radius: @component-border-radius;\n\n &.open {\n color: contrast(@gh-background-color-green, black, white, 50%);\n background-color: @gh-background-color-green;\n }\n\n &.closed {\n color: contrast(@gh-background-color-red, black, white, 50%);\n background-color: @gh-background-color-red;\n }\n\n &.merged {\n color: contrast(@gh-background-color-purple, black, white, 50%);\n background-color: @gh-background-color-purple;\n }\n }\n\n .issueish-title {\n margin: 0;\n padding-bottom: @component-padding;\n line-height: 1.2;\n display: block;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n .author-avatar {\n margin-right: 10px;\n width: 20px;\n height: 20px;\n }\n}\n","digest":"43d49a3f33510ca56adc2bcf272d9377f82938d0"},"node_modules/github/styles/loader.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n@import \"variables\";\n\n// Loader\n// Shows a spinner with an Octoface\n\n/* Usage: ---------------------------------------------\n\n<div className=\"github-Loader\">\n <span className=\"github-Spinner\"></span>\n</div>\n\n--------------------------------------------------- */\n\n// Loader (just the container)\n\n.github-Loader {\n height: 100%;\n display: flex;\n align-items: center;\n justify-content: center;\n font-size: 32px;\n color: @gh-background-color-purple;\n\n .tooltip & { color: inherit; }\n}\n\n\n// Spinner (can be used outside of github-Loader too)\n\n.github-Spinner {\n position: relative;\n display: inline-block;\n vertical-align: middle;\n width: 2em;\n height: 2em;\n\n // Octoface\n &::before {\n display: inline-block;\n width: inherit;\n height: inherit;\n content: \"\\f008\";\n font-family: 'Octicons Regular';\n font-weight: normal;\n font-style: normal;\n line-height: 2;\n text-align: center;\n -webkit-font-smoothing: antialiased;\n }\n\n // spinner\n &::after {\n content: \"\";\n position: absolute;\n width: inherit;\n height: inherit;\n top: 0;\n left: 0;\n border-right: 2px dotted;\n border-bottom: 2px dotted;\n border-left: 2px solid transparent;\n border-radius: 1em;\n\n // To limit CPU usage, the animation plays for some time at normal speed,\n // then slows down frame-rate for a while and stops at some point\n animation: github-Spinner-animation 4s linear 12,\n github-Spinner-animation 4s 48s steps(12) 100;\n\n @keyframes github-Spinner-animation {\n 100% { transform: rotate(360deg); }\n }\n }\n}\n","digest":"fcfbd015c3136813441bacb738856357318e1533"},"node_modules/github/styles/message.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n@import \"variables\";\n\n// Message\n// Use to show some sort of message, like an error or so\n\n/* Usage: ---------------------------------------------\n\n<div className=\"github-Message\">\n <div className=\"github-Message-wrapper\">\n <h1 className=\"github-Message-title\">Whooops</h1>\n <p className=\"github-Message-description\">Bad things happened</p>\n <p className=\"github-Message-action\">\n <button className=\"github-Message-button btn btn-primary\">Get me out of here</button>\n </p>\n </div>\n</div>\n\n--------------------------------------------------- */\n\n\n.github-Message {\n flex: 1;\n display: flex;\n overflow-x: hidden;\n overflow-y: auto;\n\n &-wrapper {\n margin: auto;\n padding: @component-padding*2;\n text-align: center;\n }\n\n &-title {\n color: @text-color-highlight;\n font-size: 1.5em;\n margin-bottom: .5em;\n }\n\n &-description {\n font-size: 1.2em;\n line-height: 1.4;\n margin-bottom: 0;\n }\n\n &-longDescription {\n font-size: 1.1em;\n line-height: 1.4;\n text-align: left;\n margin-bottom: 0;\n }\n\n &-action {\n margin-top: @component-padding* 2;\n }\n\n &-button {\n margin: @component-padding/2;\n }\n\n}\n","digest":"67da1c1e4c884f86f0dc5091ee290aaa296c90f8"},"node_modules/github/styles/pane-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n@import \"ui-variables\";\n\n.github-PaneView {\n display: flex;\n height: 100%;\n}\n","digest":"d767a2539746faac8959261c770bd262e58c4587"},"node_modules/github/styles/pr-info.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'variables';\n\n@label-padding: @component-padding / 2;\n@avatar-size: 32px;\n\n.github-RemotePrController {\n flex: 1;\n display: flex;\n flex-direction: column;\n}\n\n.github-PrInfo {\n padding: @component-padding * 2;\n overflow: auto;\n flex: 1;\n cursor: default;\n\n .icon {\n vertical-align: middle;\n }\n\n .pinned-by-url {\n cursor: pointer;\n }\n\n .pinned-pr-info {\n display: flex;\n padding: @component-padding;\n border: 1px solid @text-color-subtle;\n border-radius: @component-border-radius;\n margin-bottom: @component-padding * 2;\n\n a {\n text-decoration: underline;\n }\n }\n\n // Badge and link ------------------------\n .pr-badge-and-link {\n display: flex;\n align-items: center;\n margin-bottom: @component-padding * 2;\n\n .browser-link {\n display: inline-block;\n margin-left: 0.5em;\n }\n\n :last-child {\n flex: 1;\n text-align: right;\n }\n }\n\n .pr-link a {\n color: @text-color-subtle;\n word-break: break-all;\n }\n\n .refresh-button {\n .icon {\n color: @text-color-subtle;\n cursor: pointer;\n\n &.refreshing::before {\n @keyframes github-RefreshButton-animation {\n 100% { transform: rotate(360deg); }\n }\n animation: github-RefreshButton-animation 2s linear 30; // limit to 1min in case something gets stuck\n }\n }\n }\n\n\n // Avatar and title ------------------------\n\n .pr-avatar-and-title {\n display: flex;\n align-items: center;\n margin-bottom: @component-padding;\n }\n\n .author-avatar-link {\n margin-right: @component-padding;\n align-self: flex-start;\n }\n\n .author-avatar {\n max-height: @avatar-size;\n border-radius: @component-border-radius;\n }\n\n .pr-title {\n margin: 0;\n line-height: 1.2;\n color: @text-color-highlight;\n }\n\n // Status ------------------------\n\n .merge-status,\n .build-status {\n line-height: 2;\n }\n .merge-status.success {\n .icon { color: @text-color-success; }\n }\n .build-status.pending {\n .icon { color: @text-color-warning; }\n }\n\n // Info ------------------------\n\n .count-number {\n margin-left: .25em;\n font-size: 1.1em;\n font-weight: 600;\n line-height: 1;\n }\n\n .label {\n padding: 0 @label-padding;\n margin: 0 @label-padding @label-padding 0;\n border-radius: @component-border-radius;\n line-height: 2em;\n display: inline-block;\n }\n\n\n // Reactions ------------------------\n\n .reactions {\n .reaction-group {\n margin-right: @component-padding * 2;\n }\n }\n\n // Statuses ------------------------\n\n .github-PrStatuses {\n border-top: 1px solid @base-border-color;\n padding-top: @component-padding * 2;\n }\n\n // All \"items\" ------------------------\n\n .meta-info,\n .conversation,\n .commit-count,\n .file-count,\n .reactions,\n .labels {\n border-top: 1px solid @base-border-color;\n padding: @component-padding 0;\n }\n\n .conversation {\n cursor: pointer;\n }\n}\n","digest":"5837d6e7353bb5d158aa8179919adb2904a55774"},"node_modules/github/styles/pr-pane-item.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'variables';\n\n.github-PrPaneItem {\n padding: @component-padding * 3;\n overflow: auto;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n font-size: 1.25em;\n line-height: 1.5;\n background-color: @base-background-color;\n\n * {\n user-select: text;\n -webkit-user-select: text;\n }\n\n &-container {\n max-width: 48em;\n margin: 0 auto;\n }\n\n // Badge and link ------------------------\n .issueish-badge-and-link {\n display: flex;\n align-items: center;\n margin-bottom: @component-padding * 2;\n\n :last-child {\n flex: 1;\n text-align: right;\n }\n }\n\n .issueish-link a {\n color: @text-color-subtle;\n }\n\n .pr-build-status-icon {\n margin-left: @component-padding;\n }\n\n .refresh-button {\n .icon {\n color: @text-color-subtle;\n cursor: pointer;\n\n &.refreshing::before {\n @keyframes github-RefreshButton-animation {\n 100% { transform: rotate(360deg); }\n }\n animation: github-RefreshButton-animation 2s linear 30; // limit to 1min in case something gets stuck\n }\n }\n }\n\n\n // Avatar and title ------------------------\n\n .issueish-avatar-and-title {\n display: flex;\n align-items: center;\n margin-bottom: @component-padding * 2;\n padding-bottom: @component-padding;\n border-bottom: 1px solid @base-border-color;\n }\n\n .author-avatar-link {\n margin-right: @component-padding;\n align-self: flex-start;\n }\n\n .author-avatar {\n max-height: 32px;\n border-radius: @component-border-radius;\n }\n\n .issueish-title {\n margin: 0;\n font-size: 1.5em;\n font-weight: 500;\n line-height: 1.3;\n color: @text-color-highlight;\n }\n\n\n // Body ------------------------\n\n .issueish-body {\n padding-top: @component-padding;\n border-top: 1px solid @base-border-color;\n\n & > *:first-child {\n margin-top: 0;\n }\n }\n\n .github-DotComMarkdownHtml {\n a {\n color: @text-color-info;\n }\n\n p {\n line-height: 1.5;\n }\n\n hr {\n margin-top: 5px;\n margin-bottom: 5px;\n border-top: 1px solid @text-color;\n width: 100%\n }\n\n ul {\n margin-left: -10px;\n }\n\n ol {\n margin-left: -20px;\n }\n\n li {\n font-size: .9em;\n padding-top: .1em;\n padding-bottom: .1em;\n\n li {\n font-size: 1em;\n }\n }\n\n pre > code {\n white-space: pre;\n }\n }\n\n\n // Reactions ------------------------\n\n .reactions {\n width: fit-content;\n padding-top: @component-padding;\n .reaction-group {\n margin-right: @component-padding;\n padding: @component-padding;\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n &:empty {\n all: unset;\n }\n }\n\n // Statuses ------------------------\n\n .github-PrStatuses {\n margin-top: @component-padding * 4;\n padding: @component-padding;\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n\n\n // Elements ------------------------\n\n blockquote {\n font-size: inherit;\n padding-top: 0;\n padding-left: @component-padding;\n padding-bottom: 0;\n color: @text-color-subtle;\n border-left: 2px solid @text-color-subtle;\n }\n}\n","digest":"971ec9a620680e0d82cff70685d38daf6097cddb"},"node_modules/github/styles/pr-selection.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'variables';\n\n.github-PrSelectionByBranch {\n flex: 1;\n display: flex;\n overflow: auto;\n\n &-container {\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n\n &-message {\n padding: 0 @component-padding;\n margin: @component-padding 0;\n }\n\n &-input {\n padding: 0 @component-padding;\n margin: @component-padding 0;\n\n // TODO: Simplify selector\n .github-PrUrlInputBox-Subview > input {\n margin-top: 0;\n }\n }\n\n &-list {\n list-style: none;\n padding-left: 0;\n cursor: default;\n\n li {\n padding: @component-padding/2 @component-padding;\n border-top: 1px solid @base-border-color;\n &:hover {\n background-color: @background-color-highlight;\n }\n }\n }\n\n}\n","digest":"631c3dd52f9760cdeaa04183207d97e870e4d030"},"node_modules/github/styles/pr-statuses.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'variables';\n\n.github-PrStatuses {\n .donut-ring-pending {\n stroke: @gh-background-color-yellow;\n }\n\n .donut-ring-succeeded {\n stroke: @gh-background-color-green;\n }\n\n .donut-ring-failed {\n stroke: @gh-background-color-red;\n }\n\n &-header {\n display: flex;\n\n svg {\n width: 50px;\n height: 50px;\n\n circle {\n stroke-width: 5;\n }\n }\n }\n\n &-summary {\n font-weight: bold;\n padding: @component-padding 0;\n flex: 1;\n }\n\n &-list {\n display: flex;\n flex-direction: column;\n list-style: none;\n padding: 0;\n margin-bottom: 0;\n }\n\n &-list-item {\n display: flex;\n flex-direction: row;\n border-top: 1px solid @base-border-color;\n padding: @component-padding / 2;\n\n &-icon {\n padding-right: @component-padding;\n display: flex;\n align-items: center; // hmm, does it look better centered vertically or not\n }\n\n &-context {\n flex: 1;\n }\n\n &-details-link {\n margin-left: 5px;\n }\n }\n}\n","digest":"489204272cd824ae56c32946c4d80de4034b5362"},"node_modules/github/styles/pr-timeline.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'variables';\n\n@avatar-size: 20px;\n\n.github-PrTimeline {\n margin-top: @component-padding * 3;\n border-top: 1px solid mix(@text-color, @base-background-color, 15%);\n\n // all items\n .timeline-item {\n margin: 0 @component-padding * 3;\n padding: @component-padding*3 0;\n border-bottom: 1px solid mix(@text-color, @base-background-color, 15%);\n }\n\n .emoji,\n g-emoji {\n margin-right: .25em;\n }\n\n\n .author-avatar {\n width: @avatar-size;\n height: @avatar-size;\n margin-right: 5px;\n }\n\n .pre-timeline-item-icon {\n position: absolute;\n margin-left: -25px;\n margin-top: 2px;\n color: @text-color-subtle;\n }\n\n .commits {\n .info-row {\n margin-bottom: @component-padding;\n }\n }\n\n .commit {\n display: table-row;\n align-items: center;\n margin-left: @component-padding * 2;\n\n &:first-child {\n padding-top: @component-padding;\n }\n\n &:only-child {\n padding-top: 0;\n padding-bottom: 0;\n margin-left: -@component-padding;\n }\n\n & + .issue {\n margin-top: @component-padding/2;\n }\n\n .commit-author {\n display: table-cell;\n white-space: nowrap;\n text-align: right;\n }\n\n .author-avatar {\n flex-basis: @avatar-size;\n }\n\n .commit-message-headline {\n display: table-cell;\n font-size: .9em;\n padding: 0 @component-padding/3;\n max-height: @avatar-size;\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n max-width: 0; // this makes sure the ellipsis work in table-cell\n width: 100%;\n }\n\n .commit-sha {\n display: table-cell;\n text-align: right;\n font-family: monospace;\n padding-left: 5px;\n font-size: .85em;\n color: @text-color-subtle;\n }\n }\n\n .cross-referenced-events {\n // provides spacing between cross-referenced-event rows\n border-spacing: 0 @component-padding / 2;\n\n .info-row {\n margin-bottom: @component-padding;\n }\n }\n\n .cross-referenced-event {\n display: table-row;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &-label {\n display: table-cell;\n width: 100%;\n\n &-title {\n font-weight: bold;\n }\n\n &-number {\n display: inline;\n margin-left: 5px;\n white-space: nowrap;\n }\n }\n\n &-private {\n display: table-cell;\n }\n\n &-state {\n display: table-cell;\n text-align: right;\n\n .badge {\n margin-left: 5px;\n }\n }\n }\n\n .sha {\n font-family: monospace;\n }\n\n .merged-event {\n display: flex;\n align-items: center;\n font-size: .9em;\n line-height: 1.3;\n color: @text-color-subtle;\n\n .username,\n .merge-ref {\n font-weight: bold;\n color: @text-color-highlight;\n }\n }\n\n .merged-event ~ .issue {\n border-bottom-style: dashed;\n }\n\n .head-ref-force-pushed-event {\n .username {\n font-weight: bold;\n color: @text-color-highlight;\n }\n .sha {\n font-weight: bold;\n }\n }\n\n .issue {\n\n .info-row {\n margin-bottom: @component-padding/1.5;\n }\n .comment-message-header {\n font-size: .9em;\n color: @text-color-subtle;\n }\n\n .github-DotComMarkdownHtml {\n\n p:last-child {\n margin-bottom: 0;\n }\n\n pre > code {\n white-space: pre;\n }\n }\n }\n\n &-load-more-link {\n cursor: pointer;\n text-align: center;\n }\n\n}\n","digest":"d50d5e0e5a2b8d3228297364d703cec05d3ea8d1"},"node_modules/github/styles/pr-url-input-box.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n@import \"variables\";\n\n.github-PrUrlInputBox {\n\n &-Container {\n display: flex;\n flex: 1;\n flex-direction: row;\n\n // TODO: Simplify selector\n // Only add padding when inside this container\n .github-PrUrlInputBox-Subview {\n padding: @component-padding * 2;\n }\n\n p {\n text-align: center;\n }\n }\n\n &-pinButton {\n padding: @component-padding;\n border-bottom: 1px solid @base-border-color;\n cursor: default;\n }\n\n // TODO: Simplify selector\n &-pinButton + &-Subview {\n padding: @component-padding;\n border-bottom: 1px solid @base-border-color;\n }\n\n &-Subview {\n flex: 1;\n display: flex;\n flex-direction: column;\n align-self: center;\n align-items: center;\n\n > button, > input {\n margin: @component-padding;\n }\n\n .icon-git-pull-request:before {\n width: auto;\n font-size: 48px;\n color: @text-color-subtle;\n }\n\n p {\n font-size: 1.1em;\n line-height: 1.5;\n -webkit-user-select: none;\n cursor: default;\n\n &:last-of-type {\n margin-bottom: 0;\n }\n\n a {\n color: @text-color-info;\n }\n }\n\n input[type=text] {\n width: 100%;\n }\n }\n\n}\n","digest":"3356a1beac32671788f42690a808c687abeb4a3f"},"node_modules/github/styles/push-pull-menu-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-PushPullMenuView {\n\n &-selector {\n display: flex;\n align-items: center;\n }\n\n &-item {\n margin: @component-padding / 2;\n &.is-flexible {\n flex: 1;\n }\n }\n\n // margin not needed, .github-PushPullMenuView-item takes care of the spacing\n .icon-mark-github::before {\n margin-right: 0;\n color: @text-color-subtle;\n }\n\n // Make Pull/Push buttons take up available space\n // since they're more important than Fetch\n .btn-group {\n display: flex;\n .btn {\n flex: 1;\n }\n }\n\n // Removes flickering of the toolip if there is an icon inside\n .btn-tooltip-wrapper .icon {\n pointer-events: none;\n }\n\n &-message {\n max-height: 4.8em;\n margin: @component-padding / 2;\n padding: @component-padding / 2;\n line-height: 1.4;\n white-space: normal;\n text-align: left;\n overflow-y: auto;\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n background-color: @inset-panel-background-color;\n\n &:empty {\n display: none;\n }\n }\n\n\n // Progress indicator\n &.in-progress {\n .icon-mark-github {\n position: relative;\n color: @text-color;\n &:before {\n color: inherit;\n }\n &:after {\n content: \"\";\n position: absolute;\n top: -4px;\n left: -4px;\n width: 24px;\n height: 24px;\n border-top: 2px dotted;\n border-right: 2px dotted;\n border-bottom: 2px dotted transparent;\n border-radius: 16px;\n\n // To limit CPU usage, the animation plays for some time at normal speed,\n // then slows down frame-rate for a while and stops at some point\n -webkit-animation: github-PushPullMenuView-animation 2s linear 12,\n github-PushPullMenuView-animation 4s 24s steps(12) 100;\n }\n }\n }\n}\n\n\n// Animations\n@-webkit-keyframes github-PushPullMenuView-animation {\n 100% { transform: rotate(360deg); }\n}\n","digest":"118a5da77647865a0ccc7dce4494103e94bf99cb"},"node_modules/github/styles/push-pull-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n// Used in the status-bar\n\n.github-PushPull {\n\n &-icon.icon.icon.icon {\n margin-right: 0;\n text-align: center;\n }\n\n &-label.is-pull {\n margin-right: .4em;\n }\n\n}\n","digest":"e6ede175925ba2b76f78ff28d3efbbd366b055b3"},"node_modules/github/styles/resizer.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.resizer-container {\n height: 100%;\n display: flex;\n\n .sizing-handle, .content {\n display: inline;\n }\n\n .sizing-handle {\n position: absolute;\n width: 8px;\n top: 0;\n bottom: 0;\n left: -5px;\n z-index: 3;\n cursor: col-resize;\n }\n}\n","digest":"36d765d44e0dbf2bed725bfacb3eb25a6ce9b732"},"node_modules/github/styles/staging-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-StagingView {\n flex: 1;\n display: flex;\n flex-direction: column;\n\n &-group {\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n\n &-header {\n display: flex;\n align-items: center;\n padding: 0 0 0 @component-padding;\n font-weight: 600;\n border-top: 1px solid @panel-heading-border-color;\n border-bottom: 1px solid @panel-heading-border-color;\n\n .github-StagingView-group:first-child & {\n border-top: none;\n }\n\n .icon {\n text-align: center;\n &:before {\n color: @text-color-subtle;\n margin-right: @component-padding / 1.2;\n vertical-align: middle;\n }\n }\n }\n\n &-headerButton {\n height: 2.5em;\n border: none;\n padding: 0 @component-padding;\n font-weight: normal;\n border-left: 1px solid @panel-heading-border-color;\n white-space: nowrap;\n background: none;\n cursor: default;\n\n &:disabled {\n color: @text-color-subtle;\n }\n\n &:active {\n background-color: @button-background-color-hover;\n }\n\n &.icon:before {\n margin-right: 0;\n font-size: 1em;\n text-align: left;\n }\n\n &--fullWidth {\n border-left: none;\n border-bottom: 1px solid @panel-heading-border-color;\n }\n }\n\n\n &-title {\n flex: 1;\n margin-right: @component-padding;\n line-height: 2.5em;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n &-list {\n flex: 1 1 0;\n overflow-x: auto;\n }\n}\n\n\n//\n// States\n// -----------------------------------------\n\n.github-StagingView-group-truncatedMsg {\n padding: @component-padding / 2 @component-padding;\n}\n\n.github-StagingView-group.is-focused .is-selected {\n // is selected\n color: @text-color-selected;\n background: @background-color-selected;\n\n // also has focus\n .github-StagingView:focus & {\n color: contrast(@button-background-color-selected);\n background: @button-background-color-selected;\n }\n}\n","digest":"57b9fc8f4327f0d431f62b68211b538219ffc179"},"node_modules/github/styles/status-bar-tile-controller.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-StatusBarTileController {\n display: inline-block;\n\n &-tooltipMenu {\n &.tooltip {\n width: 400px; // Same as the github-Panel\n padding-left: @component-padding;\n padding-right: @component-padding;\n box-sizing: border-box;\n }\n .tooltip-inner.tooltip-inner {\n padding: @component-padding / 2;\n background-color: @tool-panel-background-color;\n border: 1px solid @base-border-color;\n box-shadow: 0 4px 8px hsla(0, 0, 0, .1);\n color: @text-color;\n }\n &.top .tooltip-arrow.tooltip-arrow {\n width: @component-padding;\n height: @component-padding;\n border-width: 0 0 1px 1px;\n border-color: @base-border-color;\n background-color: @tool-panel-background-color;\n border-bottom-right-radius: 2px;\n transform: rotate(-45deg);\n }\n }\n\n & > .inline-block:hover {\n text-decoration: underline;\n cursor: default;\n }\n\n // Sync animation\n .icon-sync::before {\n @keyframes github-StatusBarSync-animation {\n 100% { transform: rotate(360deg); }\n }\n animation: github-StatusBarSync-animation 2s linear 30; // limit to 1min in case something gets stuck\n }\n\n // Merge conflict icon\n .github-ChangedFilesCount .icon-alert {\n margin-left: @component-padding / 2;\n }\n\n .github-branch-detached {\n color: @text-color-subtle;\n font-style: italic;\n }\n}\n","digest":"0b28811db4a81ee3a9d00e86921d202db079bf80"},"node_modules/github/styles/tabs.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n// General Styles\n.github-Tabs {\n &-Panel {\n &.active {\n display: flex;\n }\n\n &.inactive {\n display: none;\n }\n }\n}\n\n// App-specific styles\n.github-Tabs.sidebar-tabs {\n height: 100%;\n display: flex;\n flex-direction: column;\n\n .github-Tabs-NavigationContainer {\n display: flex;\n flex-direction: row;\n padding: @component-padding;\n border-bottom: 1px solid @panel-heading-border-color;\n\n .github-Tabs-NavigationItem {\n flex: 1;\n text-align: center;\n cursor: pointer;\n background-color: @button-background-color;\n color: contrast(@button-background-color, hsla(0,0%,0%,.6), hsla(0,0%,100%,.6));\n border: 1px solid @button-border-color;\n padding: .25em .5em;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n\n & + .github-Tabs-NavigationItem {\n border-left: none;\n }\n\n &.active {\n background-color: @button-background-color-selected;\n color: contrast(@button-background-color-selected, hsla(0,0%,0%,1), hsla(0,0%,100%,1));\n }\n\n &:first-child {\n border-top-left-radius: @component-border-radius;\n border-bottom-left-radius: @component-border-radius;\n }\n\n &:last-child {\n border-top-right-radius: @component-border-radius;\n border-bottom-right-radius: @component-border-radius;\n }\n }\n\n }\n\n &[data-tabs-count=\"1\"] {\n .github-Tabs-NavigationContainer {\n display: none;\n }\n }\n\n .github-Tabs-PanelContainer {\n flex: 1;\n display: flex;\n flex-direction: column;\n }\n\n .github-Tabs-Panel {\n flex: 1;\n\n &.active {\n }\n\n &.inactive {\n }\n }\n}\n","digest":"99acecab444f511281e3e2d55385a58617bd2ee2"},"node_modules/github/styles/timings-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"variables\";\n\n.github-GitTimingsView {\n width: 100%;\n height: 100%;\n overflow: auto;\n\n &-header {\n display: flex;\n justify-content: flex-end;\n padding: @component-padding;\n border-bottom: 1px solid @base-border-color;\n }\n\n .waterfall-widget {\n border-radius: @component-border-radius;\n border: 1px solid @pane-item-border-color;\n background-color: @pane-item-background-color;\n margin: 10px;\n }\n\n .waterfall-header {\n padding: 5px 5px 0 5px;\n color: @text-color;\n font-size: @font-size;\n display: flex;\n border-bottom: 1px solid @pane-item-border-color;\n\n .collapse-toggle {\n cursor: pointer;\n margin-right: 2px;\n }\n\n &-text {\n flex: 1;\n }\n\n &-controls {\n flex-basis: 250px;\n display: flex;\n align-items: center;\n }\n }\n\n .waterfall-export-button {\n margin: 0 10px 3px 0;\n }\n\n .waterfall-scroller {\n overflow: auto;\n }\n\n .waterfall-container {\n position: relative;\n display: inline-block; // stretches to childs width\n min-width: 100%;\n }\n\n .waterfall-time-marker {\n position: absolute;\n height: 100%;\n width: 1px;\n border-left: 1px solid @pane-item-border-color;\n }\n\n .waterfall-timeline {\n position: relative;\n margin: 5px 0;\n }\n\n .waterfall-timeline-label {\n position: absolute;\n padding-left: 5px;\n color: @text-color;\n }\n\n .waterfall-row {\n position: relative;\n min-height: 15px;\n padding: 2px 0;\n\n &:nth-child(2n+1) {\n background-color: @app-background-color;\n }\n\n &:hover {\n background-color: @pane-item-border-color;\n }\n }\n\n .waterfall-row-label {\n position: relative;\n margin: 0 5px;\n white-space: nowrap;\n }\n\n .waterfall-marker {\n position: absolute;\n top: 2px;\n bottom: 2px;\n }\n\n .waterfall-marker-section {\n display: inline-block;\n position: relative;\n height: 100%;\n vertical-align: top;\n }\n}\n","digest":"e35a7ff8f4c72b7ab63447c07b852019f211be3f"},"node_modules/github/styles/user-mention-tooltip.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'variables';\n\n.github-UserMentionTooltip {\n display: flex;\n\n &-avatar {\n flex-basis: 50px;\n padding-right: @component-padding;\n\n > img {\n width: 90px;\n height: 90px;\n border-radius: @component-border-radius / 2;\n }\n }\n\n &-info {\n flex: 1;\n text-align: left;\n line-height: 1.6;\n\n > div {\n white-space: nowrap;\n }\n .icon {\n vertical-align: middle;\n }\n }\n}\n","digest":"dd1c13acecf2cc9a731fd3039a41cd519ad8f7f8"},"node_modules/github/styles/variables.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"syntax-variables\";\n\n@separator-border-color: contrast(@pane-item-background-color, fade(@pane-item-border-color, 20%), @pane-item-border-color);\n\n@gh-background-color-blue: #006eeb;\n@gh-background-color-light-blue: #dbedff;\n@gh-background-color-yellow: #ffd93d;\n@gh-background-color-red: #dc3545;\n@gh-background-color-purple: #6f42c1;\n@gh-background-color-green: #28a745;\n","digest":"9ee4e4579d5fd51444f9269f6fa5074eda5bd98d"},"node_modules/git-diff/styles/git-diff.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"syntax-variables\";\n@import \"octicon-utf-codes\";\n@import \"octicon-mixins\";\n\natom-text-editor {\n .gutter .line-number {\n &.git-line-modified {\n border-left: 2px solid @syntax-color-modified;\n padding-left: ~\"calc(0.5em - 2px)\";\n }\n\n &.git-line-added {\n border-left: 2px solid @syntax-color-added;\n padding-left: ~\"calc(0.5em - 2px)\";\n }\n\n &.git-line-removed:before {\n @size: 4px;\n\n position: absolute;\n left: 0;\n bottom: -@size;\n height: 0;\n width: 0;\n content: \" \";\n border: solid transparent;\n border-left-color: @syntax-color-removed;\n border-width: @size;\n margin-top: -@size;\n pointer-events: none;\n }\n }\n .gutter.git-diff-icon .line-number {\n width: 100%;\n border-left: none;\n padding-left: 0.4em;\n\n &:before {\n .octicon-font();\n display: inline-block;\n position: relative;\n top: -.05em;\n\n // make sure it doesnt affect the gutter line height.\n height: 0px;\n width: 1em;\n content: \" \";\n padding-right: 0.4em;\n font-size: .95em;\n }\n\n &.git-line-modified:before {\n content: @primitive-dot;\n color: @syntax-color-modified;\n }\n\n &.git-line-added:before {\n content: @plus;\n color: @syntax-color-added;\n }\n\n &.git-line-removed:before {\n border: none; // reset triangle\n content: @dash;\n color: @syntax-color-removed;\n position: relative;\n top: .6em;\n }\n }\n}\n","digest":"6db75eab1b667749742226ec2e39bdb78335c799"},"node_modules/grammar-selector/styles/grammar-selector.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n.grammar-status a,\n.grammar-status a:hover {\n color: @text-color;\n}\n","digest":"b23e8d5530f94d34c75f7500027d8dca5a25f02e"},"node_modules/image-view/styles/image-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n@spacing: @component-padding/2;\n@transparent-background-image: \"atom://image-view/images/transparent-background.png\";\n\n.image-view {\n display: flex;\n flex-direction: column;\n background-color: @pane-item-background-color;\n\n\n // Image Controls -------------------\n\n .image-controls {\n display: flex;\n justify-content: space-between;\n align-items: center;\n flex-wrap: wrap;\n padding: @spacing;\n border-bottom: 1px solid @panel-heading-border-color;\n background-color: @panel-heading-background-color;\n\n a {\n display: inline-block;\n position: relative;\n width: 24px;\n height: 24px;\n margin: @spacing;\n vertical-align: middle;\n font-size: 0;\n border-radius: 22px;\n border: 2px solid #fff;\n box-shadow: inset 0 1px 2px hsla(0,0%,0%,.4), 0 0 0 1px hsla(0,0%,0%,.1), 0 2px 2px hsla(0,0%,0%,.2);\n background-clip: content-box;\n\n &:hover {\n border-color: #ccc;\n }\n &:active {\n border-color: #999;\n }\n }\n\n &-color-white {\n color: #000;\n background-color: #fff;\n background-image: url(@transparent-background-image);\n }\n\n &-color-black {\n color: #fff;\n background-color: #000;\n background-image: url(@transparent-background-image);\n }\n\n .btn-group {\n margin: @spacing;\n }\n\n .reset-zoom-button {\n min-width: 5em;\n }\n\n // disabled once the button is selected\n .zoom-to-fit-button.selected {\n pointer-events: none;\n cursor: default;\n }\n }\n\n\n // Image -------------------\n\n .image-container {\n flex: 1 1 0;\n display: flex;\n overflow: auto;\n\n img {\n flex: none;\n margin: auto;\n }\n }\n\n // Background color\n [background=\"white\"] {\n background-color: white;\n background-image: url(@transparent-background-image);\n }\n [background=\"black\"] {\n background-color: black;\n background-image: url(@transparent-background-image);\n }\n\n\n\n // Zoom to fit -------------------\n // Scales the image to fit the available space.\n\n .zoom-to-fit {\n &.image-container {\n padding: @component-padding;\n\n img {\n flex: 1 1 0;\n min-width: 0;\n margin: 0;\n\n // Alternative: object-fit: contain;\n // then it would also scale larger than its original size\n object-fit: scale-down;\n }\n }\n }\n\n}\n","digest":"b94bb3785de9428c7780f2af2eb49d0eaf7096e1"},"node_modules/incompatible-packages/styles/incompatible-packages.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n.incompatible-packages {\n background-color: @pane-item-background-color;\n overflow-y: scroll;\n\n .incompatible-package {\n padding: 15px;\n margin-bottom: 10px;\n border-radius: 6px;\n border: 1px solid #d1d1d2;\n background-color: #fafafa;\n overflow: hidden;\n\n .badge {\n margin-left: 1em;\n }\n\n .heading {\n margin-top: 0px;\n }\n\n ul {\n padding-left: 1em;\n }\n\n li {\n list-style-type: none;\n }\n\n pre {\n margin-top: 2em;\n max-height: 25em;\n overflow: scroll;\n color: @text-color-error;\n }\n }\n}\n\n.incompatible-packages-status {\n padding-left: 2px;\n}\n","digest":"9388e1cd27b0b0fd67e21bdbc809d996b8d27706"},"node_modules/keybinding-resolver/styles/keybinding-resolver.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"octicon-mixins\";\n\n.key-binding-resolver {\n -webkit-flex: 0.25;\n overflow: auto;\n\n .keystroke {\n margin-right: 1em;\n }\n\n table {\n .used {\n color: @text-color-success;\n }\n\n .unused {\n color: @text-color;\n }\n\n .unmatched {\n color: @text-color-subtle;\n }\n\n .used .command, .unused .command{\n .octicon(check);\n }\n\n .unmatched .command {\n .octicon(x);\n }\n\n .command, .selector, .source {\n min-width: 10em;\n }\n\n .source {\n cursor: pointer;\n }\n }\n}\n","digest":"a25a3b8c740ed552295164442b4ff8d8d1515f52"},"node_modules/markdown-preview/assets/primer-markdown.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n// All of our block level items should have the same margin\n@margin: 16px;\n\n// This is styling for generic markdownized text. Anything you put in a\n// container with .markdown-body on it should render generally well. It also\n// includes some GitHub Flavored Markdown specific styling (like @mentions)\n.markdown-body {\n overflow: hidden;\n font-family: \"Helvetica Neue\", Helvetica, \"Segoe UI\", Arial, freesans, sans-serif;\n font-size: 16px;\n line-height: 1.6;\n word-wrap: break-word;\n\n > *:first-child {\n margin-top: 0 !important;\n }\n\n > *:last-child {\n margin-bottom: 0 !important;\n }\n\n // Anchors like <a name=\"examples\">. These sometimes end up wrapped around\n // text when users mistakenly forget to close the tag or use self-closing tag\n // syntax. We don't want them to appear like links.\n // FIXME: a:not(:link):not(:visited) would be a little clearer here (and\n // possibly faster to match), but it breaks styling of <a href> elements due\n // to https://bugs.webkit.org/show_bug.cgi?id=142737.\n a:not([href]) {\n color: inherit;\n text-decoration: none;\n }\n\n // Link Colors\n .absent {\n color: #c00;\n }\n\n .anchor {\n position: absolute;\n top: 0;\n left: 0;\n display: block;\n padding-right: 6px;\n padding-left: 30px;\n margin-left: -30px;\n\n &:focus {\n outline: none;\n }\n }\n\n // Headings\n h1, h2, h3, h4, h5, h6 {\n position: relative;\n margin-top: 1em;\n margin-bottom: @margin;\n font-weight: bold;\n line-height: 1.4;\n\n .octicon-link {\n display: none;\n color: #000;\n vertical-align: middle;\n }\n\n &:hover .anchor {\n padding-left: 8px;\n margin-left: -30px;\n text-decoration: none;\n\n .octicon-link {\n display: inline-block;\n }\n }\n\n tt,\n code {\n font-size: inherit;\n }\n }\n\n h1 {\n padding-bottom: 0.3em;\n font-size: 2.25em;\n line-height: 1.2;\n border-bottom: 1px solid #eee;\n\n .anchor {\n line-height: 1;\n }\n }\n\n h2 {\n padding-bottom: 0.3em;\n font-size: 1.75em;\n line-height: 1.225;\n border-bottom: 1px solid #eee;\n\n .anchor {\n line-height: 1;\n }\n }\n\n h3 {\n font-size: 1.5em;\n line-height: 1.43;\n\n .anchor {\n line-height: 1.2;\n }\n }\n\n h4 {\n font-size: 1.25em;\n\n .anchor {\n line-height: 1.2;\n }\n }\n\n h5 {\n font-size: 1em;\n\n .anchor {\n line-height: 1.1;\n }\n }\n\n h6 {\n font-size: 1em;\n color: #777;\n\n .anchor {\n line-height: 1.1;\n }\n }\n\n p,\n blockquote,\n ul, ol, dl,\n table,\n pre {\n margin-top: 0;\n margin-bottom: @margin;\n }\n\n hr {\n height: 4px;\n padding: 0;\n margin: @margin 0;\n background-color: #e7e7e7;\n border: 0 none;\n }\n\n // Lists, Blockquotes & Such\n ul,\n ol {\n padding-left: 2em;\n\n &.no-list {\n padding: 0;\n list-style-type: none;\n }\n }\n\n // Did someone complain about list spacing? Encourage them\n // to create the spacing with their markdown formatting.\n // List behavior should be controled by the markup, not the css.\n //\n // For lists with padding between items, use blank\n // lines between items. This will generate paragraphs with\n // padding to space things out.\n //\n // - item\n //\n // - item\n //\n // - item\n //\n // For list without padding, don't use blank lines.\n //\n // - item\n // - item\n // - item\n //\n // Modifying the css to emulate these behaviors merely brakes\n // one case in the process of solving another. Don't change\n // this unless it's really really a bug.\n ul ul,\n ul ol,\n ol ol,\n ol ul {\n margin-top: 0;\n margin-bottom: 0;\n }\n\n li > p {\n margin-top: @margin;\n }\n\n dl {\n padding: 0;\n }\n\n dl dt {\n padding: 0;\n margin-top: @margin;\n font-size: 1em;\n font-style: italic;\n font-weight: bold;\n }\n\n dl dd {\n padding: 0 @margin;\n margin-bottom: @margin;\n }\n\n blockquote {\n padding: 0 15px;\n color: #777;\n border-left: 4px solid #ddd;\n\n > :first-child {\n margin-top: 0;\n }\n\n > :last-child {\n margin-bottom: 0;\n }\n }\n\n // Tables\n table {\n display: block;\n width: 100%;\n overflow: auto;\n word-break: normal;\n word-break: keep-all; // For Firefox to horizontally scroll wider tables.\n\n th {\n font-weight: bold;\n }\n\n th, td {\n padding: 6px 13px;\n border: 1px solid #ddd;\n }\n\n tr {\n background-color: #fff;\n border-top: 1px solid #ccc;\n\n &:nth-child(2n) {\n background-color: #f8f8f8;\n }\n }\n }\n\n // Images & Stuff\n img {\n max-width: 100%;\n -moz-box-sizing: border-box;\n box-sizing: border-box;\n }\n\n .emoji {\n max-width: none;\n }\n\n // Gollum Image Tags\n\n // Framed\n span.frame {\n display: block;\n overflow: hidden;\n\n & > span {\n display: block;\n float: left;\n width: auto;\n padding: 7px;\n margin: 13px 0 0;\n overflow: hidden;\n border: 1px solid #ddd;\n }\n\n span img {\n display: block;\n float: left;\n }\n\n span span {\n display: block;\n padding: 5px 0 0;\n clear: both;\n color: #333;\n }\n }\n\n span.align-center {\n display: block;\n overflow: hidden;\n clear: both;\n\n & > span {\n display: block;\n margin: 13px auto 0;\n overflow: hidden;\n text-align: center;\n }\n\n span img {\n margin: 0 auto;\n text-align: center;\n }\n }\n\n span.align-right {\n display: block;\n overflow: hidden;\n clear: both;\n\n & > span {\n display: block;\n margin: 13px 0 0;\n overflow: hidden;\n text-align: right;\n }\n\n span img {\n margin: 0;\n text-align: right;\n }\n }\n\n span.float-left {\n display: block;\n float: left;\n margin-right: 13px;\n overflow: hidden;\n\n span {\n margin: 13px 0 0;\n }\n }\n\n span.float-right {\n display: block;\n float: right;\n margin-left: 13px;\n overflow: hidden;\n\n & > span {\n display: block;\n margin: 13px auto 0;\n overflow: hidden;\n text-align: right;\n }\n }\n\n // Inline code snippets\n code,\n tt {\n padding: 0;\n padding-top: 0.2em;\n padding-bottom: 0.2em;\n margin: 0;\n font-size: 85%;\n background-color: rgba(0,0,0,0.04);\n border-radius: 3px; // don't add padding, gives scrollbars\n\n &:before,\n &:after {\n letter-spacing: -0.2em; // this creates padding\n content: \"\\00a0\";\n }\n\n br { display: none; }\n }\n\n del code { text-decoration: inherit; }\n\n // Code tags within code blocks (<pre>s)\n pre > code {\n padding: 0;\n margin: 0;\n font-size: 100%;\n word-break: normal;\n white-space: pre;\n background: transparent;\n border: 0;\n }\n\n .highlight {\n margin-bottom: @margin;\n }\n\n .highlight pre,\n pre {\n padding: @margin;\n overflow: auto;\n font-size: 85%;\n line-height: 1.45;\n background-color: #f7f7f7;\n border-radius: 3px;\n }\n\n .highlight pre {\n margin-bottom: 0;\n word-break: normal;\n }\n\n pre {\n word-wrap: normal;\n }\n\n pre code,\n pre tt {\n display: inline;\n max-width: initial;\n padding: 0;\n margin: 0;\n overflow: initial;\n line-height: inherit;\n word-wrap: normal;\n background-color: transparent;\n border: 0;\n\n &:before,\n &:after {\n content: normal;\n }\n }\n\n kbd {\n display: inline-block;\n padding: 3px 5px;\n font-size: 11px;\n line-height: 10px;\n color: #555;\n vertical-align: middle;\n background-color: #fcfcfc;\n border: solid 1px #ccc;\n border-bottom-color: #bbb;\n border-radius: 3px;\n box-shadow: inset 0 -1px 0 #bbb;\n }\n}\n","digest":"34042e121a602019f7f5984cacf079bd171c002c"},"node_modules/markdown-preview/styles/markdown-preview-default.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Default Markdown Preview styles\n\n// These are the default Markdown Preview styles.\n// They use the syntax-variables to adapt to the color scheme of syntax themes.\n\n\n@import \"syntax-variables\";\n\n.markdown-preview:not([data-use-github-style]) {\n\n @fg: @syntax-text-color;\n @bg: @syntax-background-color;\n\n @fg-accent: @syntax-cursor-color;\n @fg-strong: contrast(@bg, darken(@fg, 32%), lighten(@fg, 32%));\n @fg-subtle: contrast(@fg, lighten(@fg, 16%), darken(@fg, 16%));\n\n @border: contrast(@bg, lighten(@bg, 16%), darken(@bg, 16%));\n\n @margin: 1.5em;\n\n\n padding: 2em;\n font-size: 1.2em;\n color: @fg;\n background-color: @bg;\n overflow: auto;\n\n & > :first-child {\n margin-top: 0;\n }\n\n\n // Headings --------------------\n\n h1, h2, h3, h4, h5, h6 {\n line-height: 1.2;\n margin-top: @margin;\n margin-bottom: @margin/3;\n color: @fg-strong;\n }\n\n h1 { font-size: 2.4em; font-weight: 300; }\n h2 { font-size: 1.8em; font-weight: 400; }\n h3 { font-size: 1.5em; font-weight: 500; }\n h4 { font-size: 1.2em; font-weight: 600; }\n h5 { font-size: 1.1em; font-weight: 600; }\n h6 { font-size: 1.0em; font-weight: 600; }\n\n\n // Emphasis --------------------\n\n strong {\n color: @fg-strong;\n }\n\n del {\n color: @fg-subtle;\n }\n\n\n // Link --------------------\n\n a,\n a code {\n color: @fg-accent;\n }\n\n\n // Images --------------------\n\n img {\n max-width: 100%;\n }\n\n\n // Paragraph --------------------\n\n & > p {\n margin-top: 0;\n margin-bottom: @margin;\n }\n\n\n // List --------------------\n\n & > ul,\n & > ol {\n margin-bottom: @margin;\n }\n\n\n // Blockquotes --------------------\n\n blockquote {\n margin: @margin 0;\n font-size: inherit;\n color: @fg-subtle;\n border-color: @border;\n border-width: 4px;\n }\n\n\n // HR --------------------\n\n hr {\n margin: @margin*2 0;\n border-top: 2px dashed @border;\n background: none;\n }\n\n\n // Table --------------------\n\n table {\n margin: @margin 0;\n }\n\n th {\n color: @fg-strong;\n }\n\n th,\n td {\n padding: .66em 1em;\n border: 1px solid @border;\n }\n\n\n // Code --------------------\n\n code {\n color: @fg-strong;\n background-color: contrast(@syntax-background-color, lighten(@syntax-background-color, 8%), darken(@syntax-background-color, 6%));\n }\n\n atom-text-editor {\n margin: @margin 0;\n padding: 1em;\n font-size: .92em;\n border-radius: 3px;\n background-color: contrast(@syntax-background-color, lighten(@syntax-background-color, 4%), darken(@syntax-background-color, 4%));\n }\n\n\n // KBD --------------------\n\n kbd {\n color: @fg-strong;\n border: 1px solid @border;\n border-bottom: 2px solid darken(@border, 6%);\n background-color: contrast(@syntax-background-color, lighten(@syntax-background-color, 8%), darken(@syntax-background-color, 6%));\n }\n\n}\n","digest":"a812c45bf13bc5cfb9b4050eb8eb9214071ab015"},"node_modules/markdown-preview/styles/markdown-preview-github.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// GitHub.com styles\n\n// These are the GitHub Flavored Markdown styles also found on github.com.\n// They can be anabled in the markdown-preview settings by turning on \"Use GitHub.com styles\".\n\n\n@import (reference) \"../assets/primer-markdown\";\n\n.markdown-preview[data-use-github-style] {\n\n // Includes GitHub.com styles from `../assets/primer-markdown.less`.\n // Source: https://github.com/primer/markdown/blob/master/components/markdown.scss\n .markdown-body();\n\n\n // The styles below override/complement the GitHub.com styles\n // It's needed because some markup or global styles are different\n padding: 30px;\n font-size: 16px;\n color: #333;\n background-color: #fff;\n overflow: scroll;\n\n a {\n color: #337ab7;\n }\n\n code {\n color: inherit;\n }\n\n atom-text-editor {\n padding: .8em 1em;\n margin-bottom: 1em;\n font-size: .85em;\n border-radius: 4px;\n overflow: auto;\n }\n}\n","digest":"07fc65e213bb99fa0b8d24962b645fb170850a69"},"node_modules/markdown-preview/styles/markdown-preview.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Global Markdown Preview styles\n\n.markdown-preview {\n atom-text-editor {\n // only show scrollbars on hover\n .scrollbars-visible-always & {\n .vertical-scrollbar,\n .horizontal-scrollbar {\n visibility: hidden;\n }\n }\n .scrollbars-visible-always &:hover {\n .vertical-scrollbar,\n .horizontal-scrollbar {\n visibility: visible;\n }\n }\n }\n\n // move task list checkboxes\n .task-list-item-checkbox {\n position: absolute;\n margin: .25em 0 0 -1.4em;\n }\n}\n\n.markdown-spinner {\n margin: auto;\n background-image: url(images/octocat-spinner-128.gif);\n background-repeat: no-repeat;\n background-size: 64px;\n background-position: top center;\n padding-top: 70px;\n text-align: center;\n}\n","digest":"61743ae59cf2dd4caf7f148985be6bccc3d74d0a"},"node_modules/notifications/styles/notifications-log.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"octicon-mixins\";\n\n@icon-size: 30px;\n@font-family-monospace: Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n\n.notifications-log {\n display: flex;\n flex-direction: column;\n min-width: 200px;\n\n header {\n flex: none;\n background-color: @base-background-color;\n border-bottom: 1px solid @base-border-color;\n\n .notification-type {\n border: none;\n width: @icon-size;\n height: @icon-size;\n margin: 1px;\n padding: 0;\n color: @text-color-subtle;\n opacity: .5;\n background: @base-background-color;\n }\n }\n\n .notifications-log-items {\n flex: auto;\n list-style: none;\n padding: 0;\n margin: 0;\n overflow: auto;\n\n .notifications-log-item {\n display: flex;\n box-sizing: content-box; // Keep spacing even\n border-bottom: 1px solid @base-border-color;\n max-height: @icon-size;\n overflow: hidden;\n\n .notifications-log-notification {\n flex: auto;\n display: flex;\n position: relative;\n padding-left: @icon-size;\n overflow: hidden;\n\n &.icon:before {\n position: absolute;\n top: 0;\n left: 0;\n bottom: 0;\n width: @icon-size;\n height: 100%;\n padding-top: @component-padding/2;\n text-align: center;\n }\n\n .message {\n flex: 0 1 auto;\n word-wrap: break-word;\n padding: @component-padding/2 @component-padding;\n border-left: 1px solid @base-border-color;\n }\n\n .btn-toolbar {\n flex: 1 0 auto;\n display: flex;\n align-items: center;\n white-space: nowrap;\n\n &:empty {\n display: none;\n }\n\n .btn-copy-report {\n vertical-align: middle;\n margin-left: @component-padding/2;\n\n &::before {\n margin: 0;\n }\n }\n }\n }\n\n .timestamp {\n flex: 0 0 auto;\n white-space: nowrap;\n text-align: center;\n line-height: @icon-size;\n padding: 0 @component-padding;\n }\n }\n }\n\n}\n\n// Types -------------------------------\n\n.notifications-log {\n\n // fatal\n .notification-type.fatal {\n .type(@text-color-error; @background-color-error);\n }\n\n .hide-fatal li.fatal {\n display: none;\n }\n\n .notifications-log-notification.fatal {\n .log(@text-color-error; @background-color-error);\n }\n\n // error\n .notification-type.error {\n .type(@text-color-error; @background-color-error);\n }\n\n .hide-error li.error {\n display: none;\n }\n\n .notifications-log-notification.error {\n .log(@text-color-error; @background-color-error);\n }\n\n // warning\n .notification-type.warning {\n .type(@text-color-warning; @background-color-warning);\n }\n\n .hide-warning li.warning {\n display: none;\n }\n\n .notifications-log-notification.warning {\n .log(@text-color-warning; @background-color-warning);\n }\n\n // info\n .notification-type.info {\n .type(@text-color-info; @background-color-info);\n }\n\n .hide-info li.info {\n display: none;\n }\n\n .notifications-log-notification.info {\n .log(@text-color-info; @background-color-info);\n }\n\n // success\n .notification-type.success {\n .type(@text-color-success; @background-color-success);\n }\n\n .hide-success li.success {\n display: none;\n }\n\n .notifications-log-notification.success {\n .log(@text-color-success; @background-color-success);\n }\n\n}\n\n// Type Mixin\n\n.type(@txt; @bg) {\n &.show-type {\n color: @txt;\n opacity: 1;\n }\n}\n\n.log(@txt; @bg) {\n .message {\n color: lighten(@txt, 0%);\n }\n\n &.icon:before {\n color: @txt;\n }\n}\n","digest":"547af188df482ab9d735154eec4177e43955bae6"},"node_modules/notifications/styles/notifications.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"octicon-mixins\";\n\n@icon-size: 30px;\n@width: 450px;\n@width-detail: 450px;\n@max-height-message: 200px;\n@max-height-detail: 500px;\n@max-height: @max-height-message + @max-height-detail + 100px; // 100px for footer. This is only used for the closing animation\n@notification-gap: 2px;\n@font-family-monospace: Consolas, \"Liberation Mono\", Menlo, Courier, monospace;\n\natom-notifications {\n display: block;\n z-index: 1000; // TODO: Have some convention about z-index stacking\n position: absolute;\n top: 35px;\n right: 0;\n bottom: 0;\n padding: @component-padding;\n font-size: 1.2em;\n overflow-x: hidden;\n overflow-y: auto;\n pointer-events: none;\n &::-webkit-scrollbar {\n display: none;\n }\n\n atom-notification {\n .close-all {\n display: none;\n }\n }\n\n atom-notification:first-child {\n .close-all {\n display: block;\n }\n .message {\n padding-right: @component-padding * 2 + 95px; // space for icon and button\n }\n }\n\n atom-notification:only-child {\n .close-all {\n display: none;\n }\n .message {\n padding-right: inherit;\n }\n &.has-close .message {\n padding-right: @component-padding + 24px; // space for icon\n }\n }\n\n atom-notification {\n float: right;\n clear: right;\n position: relative;\n width: @width;\n padding-left: @icon-size;\n margin-bottom: @notification-gap;\n max-height: @max-height;\n word-wrap: break-word;\n pointer-events: auto;\n\n &.icon:before {\n position: absolute;\n top: 0;\n left: 0;\n width: @icon-size;\n height: 100%;\n padding-top: @component-padding;\n text-align: center;\n border-radius: @component-border-radius 0 0 @component-border-radius;\n }\n\n\n // fill space between notifiactions to prevent click throughs\n &:after {\n content: \"\";\n display: block;\n position: absolute;\n left: 0;\n right: 0;\n bottom: -@notification-gap;\n height: @notification-gap;\n }\n\n .meta,\n .close,\n .detail,\n .stack-toggle,\n .stack-container {\n display: none;\n }\n\n &.fatal .meta,\n &.has-description .meta,\n &.has-buttons .meta,\n &.has-close .close,\n &.has-detail .detail,\n &.has-stack .stack-toggle,\n &.has-stack .stack-container {\n display: block;\n }\n\n // .item's are used as general containers\n .item {\n padding: @component-padding;\n border-top: 1px solid hsla(0,0%,0%,.1);\n &.message {\n border-top: none;\n p:last-child {\n margin-bottom: 0;\n }\n }\n }\n\n &.has-close .message {\n padding-right: @component-padding + 24px; // space for icon\n }\n\n .content {\n border-radius: 0 @component-border-radius @component-border-radius 0;\n }\n\n .message {\n max-height: @max-height-message;\n overflow-y: auto;\n }\n\n .close-all.btn {\n position: absolute;\n top: 7px;\n right: 38px;\n background: none;\n }\n\n .close {\n position: absolute;\n top: 0;\n right: 0;\n width: 38px;\n height: 38px;\n line-height: 38px;\n text-align: center;\n font-size: 16px;\n text-shadow: none;\n color: black;\n opacity: .4;\n &:hover, &:focus {\n opacity: 1;\n }\n &:active {\n opacity: .2;\n }\n &:before {\n margin: 0;\n }\n }\n\n &.has-detail {\n width: @width-detail;\n }\n\n .detail {\n font-size: .8em;\n background-color: hsla(0,0%,100%,.3);\n background-clip: padding-box;\n max-height: @max-height-detail;\n overflow-y: auto;\n\n .line {\n font-family: @font-family-monospace;\n }\n\n .stack-toggle {\n margin-top: @component-padding;\n\n .icon:before {\n margin: 0;\n }\n }\n\n .detail-content {\n .line {\n white-space: pre-wrap;\n }\n }\n\n .stack-container {\n margin-top: @component-padding;\n\n .line {\n white-space: pre;\n }\n }\n }\n\n .description {\n font-size: .8em;\n\n p:last-child {\n margin-bottom: 0;\n }\n }\n\n .btn-toolbar.btn-toolbar {\n margin-top: 10px;\n margin-bottom: -5px;\n margin-left: 0;\n }\n\n .btn-toolbar.btn-toolbar > .btn {\n margin-left: 0;\n margin-bottom: 5px;\n }\n\n .btn-copy-report {\n vertical-align: middle;\n }\n\n .opening {\n cursor: progress;\n }\n }\n}\n\n// Types -------------------------------\n\natom-notifications {\n atom-notification.fatal {\n .notification(@text-color-error; @background-color-error);\n }\n\n atom-notification.error {\n .notification(@text-color-error; @background-color-error);\n }\n\n atom-notification.warning {\n .notification(@text-color-warning; @background-color-warning);\n }\n\n atom-notification.info {\n .notification(@text-color-info; @background-color-info);\n }\n\n atom-notification.success {\n .notification(@text-color-success; @background-color-success);\n }\n}\n\n\n// Mixins -------------------------------\n\n.notification(@txt; @bg) {\n\n .content {\n color: darken(@txt, 40%);\n background-color: lighten(@bg, 25%);\n }\n\n a {\n color: darken(@txt, 20%);\n }\n\n code {\n color: darken(@txt, 40%);\n background-color: desaturate(lighten(@bg, 18%), 5%);\n }\n\n &.icon:before {\n color: lighten(@bg, 36%);\n background-color: @bg;\n }\n\n .close-all.btn {\n border: 1px solid fadeout(darken(@txt, 40%), 70%);\n color: fadeout(darken(@txt, 40%), 40%);\n text-shadow: none;\n\n &:hover {\n background: none;\n border-color: fadeout(darken(@txt, 40%), 20%);\n color: darken(@txt, 40%);\n }\n }\n}\n\n\n// Animations -------------------------------\n\natom-notifications atom-notification {\n -webkit-animation: notification-show .16s cubic-bezier(0.175, 0.885, 0.32, 1.27499);\n\n &[type=\"fatal\"] {\n -webkit-animation: notification-show .16s cubic-bezier(0.175, 0.885, 0.32, 1.27499),\n notification-shake 4s 2s;\n -webkit-animation-iteration-count: 1, 3; // shake 3 times after showing\n &:hover {\n -webkit-animation-play-state: paused; // stop shaking when hovering\n }\n }\n\n &.remove,\n &.remove:hover {\n -webkit-animation: notification-hide .12s cubic-bezier(.34,.07,1,.2),\n notification-shrink .24s .12s cubic-bezier(0.5, 0, 0, 1);\n -webkit-animation-fill-mode: forwards;\n }\n}\n\n@-webkit-keyframes notification-show {\n 0% { opacity: 0; transform: perspective(@width) translate(0, -@icon-size) rotateX(90deg); }\n 100% { opacity: 1; transform: perspective(@width) translate(0, 0) rotateX( 0deg); }\n}\n\n@-webkit-keyframes notification-hide {\n 0% { opacity: 1; transform: scale( 1); }\n 100% { opacity: 0; transform: scale(.8); }\n}\n\n@-webkit-keyframes notification-shrink {\n 0% { opacity: 0; max-height: @max-height; transform: scale(.8); }\n 100% { opacity: 0; max-height: 0; transform: scale(.8); }\n}\n\n@-webkit-keyframes notification-shake {\n 0% { transform: translateX( 0); }\n 2% { transform: translateX(-4px); }\n 4% { transform: translateX( 8px); }\n 6% { transform: translateX(-4px); }\n 8% { transform: translateX( 0); }\n 100% { transform: translateX( 0); }\n}\n","digest":"3a911249ddafbc4e8508a8e05d86a11a613f6f21"},"node_modules/package-generator/styles/package-generator.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.package-generator .error {\n display: none;\n}","digest":"4cd559f40d4bb3277680a5502a5179654fded2b1"},"node_modules/settings-view/styles/package-card.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"octicon-mixins\";\n@import \"ui-variables\";\n@import \"variables\";\n\n.settings-view {\n\n // TODO: Somehow unify the \"card\".\n\n .package-card {\n padding: @component-padding*1.5;\n margin-bottom: @component-padding;\n list-style-type: none;\n font-size: 1.2em;\n border-radius: @component-border-radius*2;\n border: 1px solid @base-border-color;\n background-color: @package-card-background-color;\n overflow: hidden;\n cursor: pointer;\n -webkit-user-select: none;\n\n &:hover {\n background-color: contrast(@package-card-background-color, darken(@package-card-background-color, 2%), lighten(@package-card-background-color, 2%));\n }\n &:active {\n background-color: @package-card-background-color;\n }\n\n &.disabled {\n background-color: @package-card-disabled-background-color;\n .body,\n .avatar,\n .author,\n .stats {\n opacity: .5;\n }\n }\n\n &.deprecated, {\n background-color: @package-card-disabled-background-color;\n // .body,\n .avatar,\n .author,\n .stats {\n opacity: .5;\n }\n }\n\n .deprecation-badge {\n display: none;\n font-size: .75em;\n text-transform: uppercase;\n }\n\n &.deprecated .deprecation-badge {\n display: inline;\n }\n\n &.col-lg-4 {\n min-width: 190px;\n padding: @component-padding 0;\n padding-left: @component-padding;\n padding-right: @component-padding;\n }\n\n .thumbnail {\n border-radius: 3px;\n margin: 0;\n min-height: 140px;\n color: @text-color;\n border-radius: @component-border-radius*2;\n border: 1px solid @base-border-color;\n background-color: @package-card-background-color;\n\n .caption {\n width: 100%;\n position: relative;\n }\n }\n .package-name {\n font-weight: bolder;\n color: @text-color-highlight;\n }\n\n .package-version {\n font-size: .8em\n }\n\n .description {\n color: @text-color;\n overflow: hidden;\n min-height: 38px;\n max-height: 38px;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 2; /* number of lines to show */\n -webkit-box-orient: vertical;\n }\n\n .package-message p:last-child {\n margin: 0;\n }\n\n .downloads {\n color: @text-color-highlight;\n overflow: hidden;\n text-overflow: ellipsis;\n display: -webkit-box;\n -webkit-line-clamp: 1; /* number of lines to show */\n -webkit-box-orient: vertical;\n }\n\n .package-status {\n right: 0px;\n top: 5px;\n text-align: center;\n\n &.icon-cloud-download {\n color: #428bca;\n }\n\n &.icon-check {\n color: #6CC644;\n }\n\n &.icon-alert {\n color: #BD2C00;\n }\n }\n\n .card-name {\n font-weight: 300;\n margin: 0 0 .2em 0;\n font-size: 1.2em;\n line-height: 1.4;\n\n .css-truncate-target {\n color: $greenDark;\n }\n }\n\n .stats {\n\n .stats-item {\n margin-left: @component-padding*1.5;\n height: 26px;\n display: inline-block;\n line-height: 24px;\n vertical-align: top;\n\n .icon {\n color: @text-color-subtle;\n }\n }\n\n .star-box {\n display: inline-block;\n vertical-align: top;\n\n .star-button {\n padding: 0 6px;\n\n .octicon {\n margin-right: 0px;\n }\n }\n }\n }\n\n .body {\n .css-truncate-target {\n max-width: 100%;\n }\n }\n\n .package-description {\n white-space: normal;\n line-height: 1.4;\n }\n\n .meta {\n display: flex;\n flex-wrap: wrap;\n justify-content: flex-end;\n width: 100%;\n\n a.linked-octicon {\n text-decoration: none;\n\n &:hover {\n .octicon {\n color: $greenDark;\n }\n\n .value {\n color: $greenDark;\n }\n }\n }\n\n .action {\n border-radius: 3px;\n padding: 3px 6px;\n\n &:hover {\n background-color: #eaeaea;\n }\n }\n\n .value {\n color: #999;\n }\n }\n\n .meta-user {\n flex: 1 0 auto;\n margin-top: @component-padding;\n margin-right: @component-padding;\n\n .avatar {\n border-radius: @component-border-radius;\n height: 24px;\n width: 24px;\n display: inline-block;\n vertical-align: middle;\n background-color: hsla(0,0%,0%,.1);\n }\n\n .author {\n color: @text-color-subtle;\n margin-left: @component-padding;\n &:focus {\n outline: none;\n }\n }\n }\n\n .meta-controls {\n margin-top: @component-padding/2;\n\n .install-button.is-installing,\n .uninstall-button.is-uninstalling {\n opacity: 1; // override disabled style\n background-image: linear-gradient(to right, transparent 50%, hsla(0,0%,0%,.15) 50%);\n background-size: 10px 100%;\n -webkit-animation: available-package-is-installing .5s linear infinite;\n }\n\n .status-indicator {\n padding: 0;\n width: @component-padding/2;\n min-width: 4px;\n pointer-events: none;\n transition: background .4s;\n background: @background-color-success;\n &.is-disabled {\n background: @background-color-warning;\n }\n }\n\n .btn-toolbar > .btn-group {\n float: left;\n margin: @component-padding/2 0 0 @component-padding/2;\n }\n }\n\n .meta-lower {\n padding: 13px;\n background-color: @input-background-color;\n line-height: 1;\n }\n\n &.blank-slate {\n text-align: center;\n color: $beigeDark;\n height: 132px;\n line-height: 132px;\n }\n\n // End copy-paste from atom.io\n }\n\n // Remove hover styles if it's in a detail view\n .package-detail .package-card {\n cursor: default;\n &:hover {\n background-color: @package-card-background-color;\n }\n &.disabled {\n background-color: @package-card-disabled-background-color;\n }\n }\n\n}\n\n@-webkit-keyframes available-package-is-installing {\n 100% { background-position: -10px 0px; }\n}\n","digest":"90620b6b73a187e587ca81213560a13c3fe0e55c"},"node_modules/settings-view/styles/package-readme.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n// Package README\n\n@import \"ui-variables\";\n\n.settings-view {\n\n .package-readme {\n font-size: 1.25em;\n\n h1 { font-size: 2em; margin-top: 1.5em; }\n h2 { font-size: 1.75em; margin-top: 1.5em; }\n h3 { font-size: 1.5em; margin-top: 1.75em; }\n h4 { font-size: 1.25em; margin-top: 1.25em; }\n h1, h2, h3, h4 {\n color: @text-color-highlight;\n }\n\n a {\n color: @text-color-info;\n }\n\n hr {\n border-color: @text-color-subtle;\n }\n\n blockquote {\n border-left-color: @text-color-subtle;\n }\n\n pre {\n margin-bottom: 1em;\n }\n\n img {\n max-width: 100%;\n }\n\n table {\n display: block;\n margin-bottom: 1em;\n width: 100%;\n overflow: auto;\n word-break: normal;\n\n th {\n font-weight: bold;\n text-align: center;\n }\n\n th, td {\n padding: 6px 13px;\n border: 1px solid @base-border-color;\n }\n\n tr {\n border-top: 1px solid @base-border-color;\n background-color: @base-background-color;\n &:nth-child(2n) {\n background-color: @background-color-highlight;\n }\n }\n }\n\n kbd {\n display: inline-block;\n padding: .3em .4em;\n font-size: .8em;\n line-height: 1;\n color: @text-color-highlight;\n vertical-align: middle;\n background-color: lighten(@base-background-color, 10%);\n border: solid 1px @base-border-color;\n border-bottom-color: darken(@base-border-color, 10%);\n border-radius: @component-border-radius;\n box-shadow: inset 0 -1px 0 darken(@base-border-color, 10%);\n }\n\n }\n}\n","digest":"c7aecf94bf4c4229b6d83d8b0f913cc9bfb46231"},"node_modules/settings-view/styles/settings-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"octicon-mixins\";\n@import \"octicon-utf-codes\";\n@import \"ui-variables\";\n\n@section-padding: 4 * @component-padding;\n@breadcrumb-padding: 2 * @component-padding;\n\n.settings-view {\n display: flex;\n overflow: auto;\n\n .breadcrumb {\n margin-bottom: 0;\n padding: @breadcrumb-padding;\n font-size: 1.2em;\n color: @text-color-subtle;\n list-style: none;\n\n > li {\n display: inline-block;\n a {\n color: @text-color;\n }\n\n + li:before {\n content: \"/\\00a0\"; // Unicode space added since inline-block means non-collapsing white-space\n padding: 0 5px;\n }\n }\n\n > .active a {\n color: @text-color-highlight;\n }\n\n }\n\n .text {\n color: @text-color;\n }\n\n .alert-type(@tx; @bg) {\n @alert-background-color: mix(@bg, @base-background-color, 10%);\n color: contrast(@alert-background-color, darken(@tx, 20%), lighten(@tx, 20%) );\n border-color: darken(@alert-background-color, 10%);\n background-color: @alert-background-color;\n\n .alert-link {\n color: inherit;\n text-decoration: underline;\n }\n }\n\n .alert-info { .alert-type(@text-color-info; @background-color-info); }\n .alert-success { .alert-type(@text-color-success; @background-color-success); }\n .alert-warning { .alert-type(@text-color-warning; @background-color-warning); }\n .alert-error,\n .alert-danger { .alert-type(@text-color-error; @background-color-error); }\n\n\n .error-message {\n .alert {\n margin-bottom: 0;\n }\n\n .close {\n top: -6px; // magic number... for now\n }\n\n .error-details {\n .alert-type(@text-color-error; @background-color-error);\n }\n\n .error-link {\n color: inherit;\n text-decoration: underline;\n margin-left: @component-padding/2;\n }\n }\n\n select.form-control {\n color: @text-color;\n border-color: @button-border-color;\n background-color: @button-background-color;\n &:hover,\n &:focus {\n box-shadow: none;\n background-color: @button-background-color-hover;\n }\n }\n\n .select-container {\n display: flex;\n align-items: stretch;\n }\n\n .themes-picker-item .btn {\n margin-left: 2px;\n &::before {\n margin-right: 0;\n text-align: left;\n }\n }\n\n .checkbox {\n padding-left: 2.25em;\n label {\n padding-left: 0;\n display: block;\n }\n .setting-title {\n display: inline-block;\n }\n }\n input[type=\"checkbox\"] {\n margin: 0 .75em 0 -2.25em;\n }\n\n .color {\n padding-left: 5em;\n .setting-title {\n margin-top: .15em;\n }\n }\n input[type=\"color\"] {\n float: left;\n margin: 0 0 0 -5em;\n padding: 0;\n width: 4em;\n height: 1.6em;\n border-radius: 4px;\n border: 1px solid @base-border-color;\n background: darken(@base-background-color, 2%);\n &::-webkit-color-swatch-wrapper {\n padding: 2px;\n margin: 0;\n border-radius: inherit;\n }\n &::-webkit-color-swatch {\n border-radius: 2px;\n border: 1px solid hsla(0,0%,0%,.1);\n }\n }\n\n .editor-container {\n margin: @component-padding*2 0;\n &:last-child {\n margin-bottom: 0;\n }\n &.settings-filter {\n margin-bottom: 36px;\n }\n }\n\n .section {\n padding: @section-padding;\n border-top: 1px solid @base-border-color;\n &:first-child,\n &:last-child {\n padding: @section-padding;\n }\n &.section:empty {\n padding: 0;\n border-top: none;\n }\n\n atom-text-editor[mini] {\n opacity: .75;\n .selection .region {\n background-color: contrast(@input-background-color, lighten(@input-background-color, 8%), darken(@input-background-color, 8%) );\n }\n }\n\n atom-text-editor[mini].is-focused {\n opacity: 1;\n .selection .region {\n background-color: contrast(@input-background-color, lighten(@input-background-color, 12%), darken(@input-background-color, 12%) );\n }\n }\n }\n\n div > .package-detail section.section.settings-panel {\n border-top: 1px solid @base-border-color;\n }\n\n .section-container {\n width: 100%;\n max-width: 800px;\n\n &.updates-container {\n .package-container {\n > .row {\n margin-left: -@component-padding;\n margin-right: -@component-padding;\n }\n }\n .native-key-bindings, .alert-info {\n margin-bottom: 15px;\n }\n }\n }\n\n section .section-heading,\n .section .section-heading {\n margin-bottom: @component-padding*2;\n color: @text-color-highlight;\n font-size: 1.75em;\n font-weight: bold;\n line-height: 1;\n -webkit-user-select: none;\n cursor: default;\n }\n\n .sub-section-heading.icon:before,\n .section-heading.icon:before {\n margin-right: @component-padding*.8;\n }\n\n .section-heading-count {\n margin-left: .5em;\n }\n\n .section-body {\n margin-top: 20px;\n }\n\n .sub-section {\n margin: @section-padding 0;\n\n .sub-section-heading {\n color: @text-color-highlight;\n font-size: 1.4em;\n font-weight: bold;\n line-height: 1;\n -webkit-user-select: none;\n\n &.has-items {\n cursor: pointer;\n\n &::after {\n .icon(16px);\n content: @fold;\n position: absolute;\n right: 0;\n color: @text-color-subtle;\n }\n\n &:hover:after {\n color: @text-color-highlight;\n }\n }\n }\n\n .sub-section-body {\n margin-top: 20px;\n }\n\n &.collapsed {\n .sub-section-heading:after {\n content: @unfold;\n }\n .package-container .package-card,\n .sub-section-body .control-group {\n display: none !important;\n }\n }\n }\n\n .control-label {\n -webkit-user-select: none;\n cursor: default;\n }\n\n .setting-title {\n font-size: 1.2em;\n -webkit-user-select: none;\n }\n\n .setting-description {\n color: @text-color-subtle;\n -webkit-user-select: none;\n cursor: default;\n\n &:empty {\n display: none;\n }\n }\n\n .link {\n color: @text-color-info;\n\n &:hover, &:focus {\n color: lighten(@text-color-info, 4%);\n }\n }\n\n .config-menu {\n flex: 1.6;\n min-width: 180px;\n max-width: 240px;\n -webkit-user-select: none;\n user-select: none;\n padding-top: @component-padding;\n background-color: lighten(@base-background-color, 2%);\n border-right: 1px solid @base-border-color;\n overflow-x: auto;\n\n .icon:before {\n text-align: center;\n }\n\n .panels-packages{\n flex-grow: 1;\n overflow: auto;\n height: 0;\n\n li + li {\n margin-top: 0;\n }\n\n li > a {\n border-radius: 1px !important;\n padding: 12px 14px;\n font-weight: bold;\n line-height: 16px;\n opacity: .85;\n transition: opacity .1s ease-in;\n box-shadow: inset 0 -1px 0 rgba(0,0,0, 7%);\n\n &:hover {\n opacity: 1;\n box-shadow: inset 0 -1px 0 rgba(0,0,0, 7%) !important;\n }\n }\n\n li:first-child {margin-top:2px;}\n li:last-child {margin-bottom: 10px;}\n\n li.active a, li.active a:hover {\n opacity: 1;\n box-shadow: 0 0 0 1px darken(#3c76dd, 10%) !important;\n\n .package-author, .package-version {\n color: #fff;\n opacity: .6;\n }\n }\n\n .package-version {\n line-height: 16px;\n margin-left: 5px;\n font-weight: normal;\n color: #999;\n }\n\n .package-author {\n font-weight: normal;\n display: block;\n color: #999;\n }\n }\n\n .button-area {\n margin: 15px; // same as nav\n > .btn {\n width: 100%;\n }\n }\n\n .nav > li {\n margin-top: 0;\n > a {\n border-radius: 0;\n white-space: nowrap;\n\n &:hover {\n color: @text-color-highlight;\n background-color: @background-color-highlight;\n }\n }\n }\n\n .nav > li.active > a {\n color: @text-color-selected;\n background-color: @background-color-selected;\n }\n }\n\n .panels {\n flex: 8.4;\n flex-flow: column;\n display: flex;\n position: relative;\n min-width: 0;\n\n .panels-item {\n flex: 1;\n min-width: 372px; // magic number: fit the Settings, Uninstall and Disable button\n overflow: auto;\n }\n }\n\n .settings-panel {\n label {\n color: @text-color;\n }\n\n .control-group + .control-group {\n margin-top: 1.5em;\n }\n\n .control-group .editor-container {\n margin: 0;\n }\n\n .grammar-filetypes {\n margin-top: @component-padding;\n }\n }\n\n .package-detail-view {\n .package-keymap-table,\n .package-grammars-table,\n .package-snippets-table {\n padding-top: @component-padding;\n padding-left: @component-padding;\n\n td {\n white-space: nowrap;\n }\n\n .snippet-body,\n .snippet-prefix {\n font-family: monospace;\n }\n }\n\n .update-message {\n padding-right: @component-padding;\n }\n\n .link {\n width: -webkit-fit-content; // prevents hover area being full-width\n }\n\n .link,\n .text {\n margin: 0 15px @component-padding 15px;\n }\n\n .update-link,\n .repo-link {\n &:hover {\n cursor: pointer;\n text-decoration: underline;\n }\n }\n }\n\n .themes-panel {\n .control-group {\n margin-top: @component-padding*3;\n }\n .themes-picker {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -@component-padding;\n }\n .themes-picker-item {\n flex: 1;\n min-width: 320px; // Enough for the UI Theme description\n padding: 0 @component-padding;\n }\n }\n\n .packages {\n display: flex;\n flex-flow: column;\n\n .themes-label {\n font-size: 1.25em;\n font-weight: bold;\n }\n\n .theme-chooser {\n padding-top: @component-padding*2;\n }\n\n .theme-description {\n -webkit-user-select: none;\n cursor: default;\n }\n\n .package-container {\n width: 100%;\n }\n\n .search-container {\n display: flex;\n flex-wrap: wrap;\n margin: 0 -@component-padding/2;\n padding-top: @component-padding*1.5;\n\n\n .editor-container {\n flex: 1;\n min-width: 130px;\n margin: @component-padding/2;\n }\n\n .btn-group {\n margin: @component-padding/2;\n padding-left: 1px; // Counter balance since btns have margin-left: -1px\n }\n }\n\n .search-message {\n margin: @component-padding 0 0;\n }\n\n .error-message {\n padding: @component-padding 0;\n }\n\n }\n\n .btn-retry {\n margin-left: @component-padding;\n }\n\n .readme {\n margin-top: @component-padding;\n }\n\n .panel-heading .label {\n margin-left: @component-padding;\n }\n\n .loading-area {\n span {\n &::before {\n font-size: 1.1em;\n width: 1.1em;\n height: 1.1em;\n }\n }\n }\n\n .error-view {\n margin: @component-padding 0 @component-padding 0;\n }\n\n .packages-panel {\n .nav {\n .badge {\n margin-left: @component-icon-padding;\n }\n }\n }\n\n .copy-icon {\n cursor: pointer;\n padding-right: 2px;\n\n &:hover {\n color: #2a6496;\n }\n }\n\n .table {\n table {\n width: 100%;\n table-layout: initial;\n }\n\n th {\n padding: @component-padding - 2px @component-padding;\n padding-left: 0;\n }\n\n td {\n height: @component-line-height;\n }\n\n td, th {\n padding-left: 1%;\n padding-right: 1%;\n white-space: nowrap;\n overflow: hidden;\n border-color: @base-border-color;\n }\n\n col.keystroke {\n width: (15% - 2%);\n }\n\n col.command {\n width: (40% - 2%);\n }\n\n col.source {\n width: (10% - 2%);\n }\n\n col.selector {\n width: (35% - 2%);\n }\n }\n\n .compile-tools-heading {\n font-weight: bold;\n }\n\n .compile-tools-message {\n padding-top: @component-padding;\n\n code {\n text-shadow: none;\n border-width: 1px;\n border-style: solid;\n }\n }\n\n .uri-history {\n width: 100%;\n\n th {\n white-space: nowrap;\n }\n\n td, th {\n padding: 0 @component-padding @component-padding/2 0;\n }\n }\n}\n\n@media all and (max-width: 800px) {\n .thumbnail .btn-toolbar {\n .btn {\n width: 100%;\n margin: 2px 0;\n }\n }\n}\n\n.package-updates-status-view:hover {\n text-decoration: underline;\n}\n\n.available-updates-status {\n padding-left: 2px;\n}\n\n\n// Overrides\n// TODO: Refactor + cleanup\n\n.settings-view {\n\n .container {\n padding: 0;\n > .row {\n margin-left: 0;\n margin-right: 0;\n }\n }\n\n .updates-heading-container {\n display: flex;\n flex-wrap: wrap;\n justify-content: space-between;\n align-items: center;\n }\n\n .update-all-button:last-child {\n margin-left: @component-padding/2;\n }\n\n .keybinding-panel .is-user {\n color: @text-color-selected;\n background-color: @background-color-selected;\n }\n\n .btn-wrap-group .btn {\n margin: 0 @component-padding/2 @component-padding/2 0;\n }\n}\n\n.clearfix {\n &::before {\n display: table;\n content: \"\";\n }\n\n &::after {\n display: table;\n clear: both;\n content: \"\";\n }\n}\n\n// Reset Bootstrap media queries,\n// since it breaks when resizing the treeview or in multiple panes\n\n@media (min-width: 768px) {\n .container {\n width: auto;\n }\n}\n@media (min-width: 992px) {\n .container {\n width: auto;\n }\n}\n@media (min-width: 1200px) {\n .container {\n width: auto;\n }\n .col-lg-8 {\n width: 100%;\n }\n}\n","digest":"353f99d8bd7ca4e7cb8cd467208012d646bc2edf"},"node_modules/settings-view/styles/variables.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n// Import only after ui-variables.less\n@package-card-background-color: lighten(@tool-panel-background-color, 8%);\n@package-card-disabled-background-color: darken(@package-card-background-color, 3%);\n","digest":"cffd057442ce83af2518c9627d28c87cfbb5fafa"},"node_modules/spell-check/styles/spell-check.atom-text-editor.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.spell-check-misspelling .region {\n border-bottom: 2px dotted hsla(0, 100%, 60%, 0.75);\n}\n\n.spell-check-corrections {\n width: 25em !important;\n}\n","digest":"dabc0ce2a181159b0875d3f5d1b59be9d0ec2cfb"},"node_modules/status-bar/styles/status-bar.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"octicon-mixins\";\n\nstatus-bar {\n display: block;\n font-size: 11px;\n line-height: @component-line-height - 3px;\n height: @component-line-height + 1px;\n position: relative;\n -webkit-user-select: none;\n cursor: default;\n overflow: hidden;\n white-space: nowrap;\n min-width: -webkit-min-content;\n\n a, a:hover {\n color: @text-color;\n }\n\n .flexbox-repaint-hack {\n padding: 0 @component-line-height/2;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n display: flex;\n justify-content: space-between;\n }\n\n // Use 1/3 of space -> will get cut-off first when narrow\n .status-bar-left {\n flex: 1 1 33%;\n }\n\n // Use 2/3 of space\n .status-bar-right {\n padding-left: @component-padding;\n .inline-block {\n margin-right: 0;\n margin-left: @component-padding;\n & > .inline-block {\n margin-left: 0;\n }\n }\n }\n\n // Add horizontal overflow scrolling\n .status-bar-left,\n .status-bar-right {\n overflow-x: auto;\n // prevent badly behaved status bar items from causing vertical scrolling\n // in the status bar. They can always implement overflow: auto to scroll\n // within themselves.\n overflow-y: hidden;\n &::-webkit-scrollbar {\n display: none;\n }\n }\n\n // Limit inline-blocks from getting too long\n .inline-block {\n max-width: 20vw;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n }\n\n // No width limit for file-info -> will get cut off if too long\n .inline-block.file-info {\n max-width: none;\n }\n\n .file-info.buffer-modified::after {\n content: '*';\n }\n\n // All icons are smaller than normal (normal is 16px)\n .icon:before {\n .icon-size(14px);\n position: relative;\n top: 1px;\n margin-right: 0px;\n }\n\n .icon-diff-ignored:before,\n .commits-ahead-label:before,\n .commits-behind-label:before {\n margin-right: -1px;\n }\n\n .hide,\n .current-path:empty,\n .cursor-position:empty,\n .selection-count:empty {\n display: none;\n }\n\n .git-view {\n display: inline-block;\n }\n\n .cursor-position a,\n .cursor-position a:hover {\n color: @text-color;\n }\n}\n","digest":"73ed165f0ba9727bb6aceaa136e3c4dd24a0b498"},"node_modules/styleguide/styles/components.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n//\n// This adds some component styles specifically for the Styleguide\n// --------------------------------\n\n.styleguide {\n\n // Icons ---------------\n\n [data-name=\"icons\"] {\n .example-rendered {\n display: flex;\n flex-wrap: wrap;\n align-content: flex-start;\n }\n\n .example-code {\n display: none; // remove, doesn't make much sense here\n }\n\n .icon {\n position: relative;\n flex: 1 0 200px;\n padding: 10px 0 10px 40px;\n color: @text-color-subtle;\n &:before {\n position: absolute;\n margin-left: -32px;\n color: @text-color-highlight;\n text-align: center;\n }\n &:hover {\n color: @text-color-highlight;\n &:before {\n color: @text-color-selected;\n font-size: 32px;\n width: 32px;\n height: 32px;\n margin-top: -8px;\n margin-left: -40px; // 32px (initial) + 8px (grow)\n }\n }\n }\n\n // Make the Gist logo bigger\n .icon-logo-gist {\n &:before,\n &:hover:before {\n font-size: 2.5em;\n margin-top: -.05em;\n margin-left: -1.3em;\n width: 16px;\n height: 16px;\n }\n }\n\n // Make the GitHub logo bigger\n .icon-logo-github {\n &:before,\n &:hover:before {\n font-size: 3em;\n margin-top: .08em;\n margin-left: -1.2em;\n }\n }\n }\n\n // Inputs + controls ---------------\n\n .input-search,\n .input-textarea {\n margin-top: @component-padding;\n }\n\n .input-label {\n display: block;\n width: -webkit-max-content;\n margin: 0 1em 1em 0;\n }\n\n .input-color,\n .input-number,\n .input-select {\n margin: 0 @component-padding 0 0 !important;\n }\n\n\n // Site colors ---------------\n\n .ui-site-1,\n .ui-site-2,\n .ui-site-3,\n .ui-site-4,\n .ui-site-5 {\n height: 10px;\n width: 100px;\n }\n\n\n // Modals ---------------\n\n atom-panel.modal {\n // makde them responsive in the styleguide\n position: relative;\n max-width: 100%;\n left: 0;\n margin: 0;\n }\n\n\n // Misc ---------------\n\n .popover-list {\n position: relative;\n }\n\n .popover-list,\n .select-list {\n atom-text-editor[mini] { height: 27px; }\n }\n\n .tooltip {\n position: relative;\n opacity: 1;\n display: inline-block;\n margin-right: @component-padding;\n }\n\n [data-name=\"error-messages\"] .example-rendered {\n min-height: 60px; // don't cut off centered messages\n }\n\n}\n","digest":"bf26369d71be6cb187463352133d755cb3fb1a4d"},"node_modules/styleguide/styles/styleguide.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"syntax-variables\";\n\n@styleguide-spacing: @component-padding *1.5;\n@styleguide-bg: darken(@base-background-color, 2%);\n\n.styleguide {\n position: relative;\n display: flex;\n flex-direction: column;\n\n a {\n text-decoration: underline;\n }\n}\n\n.styleguide-controls {\n position: absolute;\n right: @component-padding;\n top: @component-padding;\n z-index: 100;\n}\n\n.styleguide-header {\n padding: @styleguide-spacing;\n border-bottom: 1px solid @base-border-color;\n h1 {\n font-size: 2em;\n margin: 0 0 .5em 0;\n color: @text-color-highlight;\n }\n p {\n font-size: 1.2em;\n &:last-of-type {\n margin-bottom: 0;\n }\n }\n}\n\n.styleguide-sections {\n flex: 1;\n overflow: auto;\n\n & > section {\n background-color: @styleguide-bg;\n padding: 0;\n border-bottom: 1px solid @base-border-color;\n border-top: none;\n\n &:last-child {\n margin-bottom: 0;\n }\n\n &.collapsed {\n background-color: @base-background-color;\n > .section-heading {\n display: block;\n margin: 0;\n padding-bottom: @styleguide-spacing;\n color: @text-color;\n &:hover {\n color: @text-color-highlight;\n background-color: @background-color-highlight;\n }\n &:active {\n background-color: @base-background-color;\n }\n }\n > * {\n display: none\n }\n }\n }\n\n .section-heading.section-heading {\n padding: @styleguide-spacing @styleguide-spacing 0 @styleguide-spacing;\n cursor: pointer;\n font-weight: normal;\n font-size: 1.8em;\n color: @text-color-highlight;\n }\n\n section > h2 {\n font-size: 1.5em;\n line-height: 1.2;\n margin: 1em @styleguide-spacing 0 @styleguide-spacing;\n color: @text-color-highlight;\n }\n\n section > p {\n font-size: 1.1em;\n margin: .5em @styleguide-spacing 1em @styleguide-spacing;\n }\n}\n\n// Example -------------------------------\n\n.styleguide .example {\n @example-background: @base-background-color;\n\n display: flex;\n flex-wrap: wrap;\n border-radius: @component-border-radius;\n padding: @component-padding / 2;\n\n .example-rendered,\n .example-code {\n position: relative;\n flex: 1 1 300px;\n min-width: 0;\n margin: @component-padding / 2;\n border-radius: @component-border-radius;\n border: 1px solid @tool-panel-border-color;\n }\n\n .example-rendered {\n padding: @component-padding;\n background: @example-background;\n overflow: hidden;\n }\n\n .example-code {\n background-color: @syntax-background-color;\n pre {\n border: none;\n background-color: inherit;\n }\n }\n}\n","digest":"70f8674ff2b98bc0af5bbbb850cebf5083e321af"},"node_modules/styleguide/styles/variables.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"syntax-variables\";\n\n.styleguide [data-name=\"variables\"] {\n\n // Text colors\n .color( text-color );\n .color( text-color-subtle );\n .color( text-color-highlight );\n .color( text-color-selected );\n .color( text-color-info );\n .color( text-color-success );\n .color( text-color-warning );\n .color( text-color-error );\n\n // Background colors\n .color( background-color-info );\n .color( background-color-success );\n .color( background-color-warning );\n .color( background-color-error );\n .color( background-color-highlight );\n .color( background-color-selected );\n .color( app-background-color );\n\n // Base colors\n .color( base-background-color );\n .color( base-border-color );\n\n // Pane colors\n .color( pane-item-background-color );\n .color( pane-item-border-color );\n\n // Input colors\n .color( input-background-color );\n .color( input-border-color );\n\n // Panel colors\n .color( tool-panel-background-color );\n .color( tool-panel-border-color );\n .color( inset-panel-background-color );\n .color( inset-panel-border-color );\n .color( panel-heading-background-color );\n .color( panel-heading-border-color );\n .color( overlay-background-color );\n .color( overlay-border-color );\n\n // Button colors\n .color( button-background-color );\n .color( button-background-color-hover );\n .color( button-background-color-selected );\n .color( button-border-color );\n\n // Tab colors\n .color( tab-bar-background-color );\n .color( tab-bar-border-color );\n .color( tab-background-color );\n .color( tab-background-color-active );\n .color( tab-border-color );\n\n // Tree-view colors\n .color( tree-view-background-color );\n .color( tree-view-border-color );\n\n // Site colors\n .color( ui-site-color-1 );\n .color( ui-site-color-2 );\n .color( ui-site-color-3 );\n .color( ui-site-color-4 );\n .color( ui-site-color-5 );\n\n // Component sizes\n .size( disclosure-arrow-size );\n .size( component-padding );\n .size( component-icon-padding );\n .size( component-icon-size );\n .size( component-line-height );\n .size( tab-height );\n .size( font-size );\n\n // Misc\n .radius( component-border-radius );\n .font( font-family );\n\n\n // Visualize --------------------------------\n\n .is-color:before,\n .is-size:after,\n .is-radius:after {\n content: \"\";\n display: inline-block;\n height: 20px;\n vertical-align: middle;\n }\n .is-color:before {\n margin-right: @component-padding*1.5;\n width: 20%;\n }\n .is-size:after {\n margin-left: @component-padding*1.5;\n height: 4px;\n background-color: @text-color;\n }\n .is-radius:after {\n width: 20px;\n margin-left: @component-padding*1.5;\n background-color: @text-color;\n }\n .is-font:after {\n margin-left: @component-padding;\n color: @text-color-highlight;\n }\n\n\n // Mixins --------------------------------\n\n .color(@variable) {\n .is-color.@{variable}:before {\n background-color: @@variable;\n }\n }\n\n .size(@variable) {\n .is-size.@{variable}:after {\n width: @@variable;\n }\n }\n\n .radius(@variable) {\n .is-radius.@{variable}:after {\n border-radius: @@variable;\n }\n }\n\n .font(@variable) {\n .is-font.@{variable}:after {\n content: @@variable;\n font-family: @@variable;\n }\n }\n\n\n // Custom styling for vars --------------------------------\n\n .example-code {\n display: none; // remove, doesn't make much sense here\n }\n}\n","digest":"c29607cc1fadfb7abcb490864e92816e63e8c2e9"},"node_modules/symbols-view/styles/symbols-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n// Highlight matched text\n.symbols-view .list-group .character-match {\n color: @text-color-highlight;\n font-weight: bold;\n}\n","digest":"0d42513a8411ac9f44466cbbddb994e532965ba2"},"node_modules/tabs/styles/layout.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.tabs-layout-overlay {\n background: grey;\n position: absolute;\n z-index: 11; // Make sure this covers absolutely-positioned docks\n opacity: 0;\n pointer-events: none;\n transition: all 0.2s;\n &.visible {\n opacity: 0.1;\n }\n}\n","digest":"d314bc400d4e94580ab82e1b7a49ea4c98b7c2f2"},"node_modules/tabs/styles/tabs-mru-switcher.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n.tabs-mru-switcher {\n .list-group.list-group {\n margin-top: 0;\n\n // Fix to make the scrollbar appear\n // Not necessary for all themes\n backface-visibility: hidden;\n }\n}\n","digest":"3a300a3e1bea67913d4620ed192ae9e2522ef45a"},"node_modules/tabs/styles/tabs.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n@import \"octicon-mixins\";\n\n@close-icon-size: 12px;\n\n.tab-bar {\n display: flex;\n -webkit-user-select: none;\n margin: 0;\n\n .tab {\n font-size: 11px;\n position: relative;\n padding-left: 10px;\n padding-right: 10px + @close-icon-size + 2px;\n -webkit-user-drag: element;\n flex: 1;\n max-width: 175px;\n min-width: 40px;\n transition: max-width .25s ease-in-out;\n\n &.active {\n flex: 2;\n width: -webkit-fit-content;\n\n .title {\n padding-right: 10px;\n }\n }\n\n .title {\n overflow: hidden;\n white-space: pre;\n text-overflow: ellipsis;\n &.temp {\n font-style: italic;\n }\n }\n\n .hide-icon {\n &.icon:before {\n display: none;\n }\n }\n\n .close-icon {\n .octicon(x, @close-icon-size);\n position: absolute;\n top: 1px;\n right: 10px;\n cursor: default;\n }\n\n &.modified:hover .close-icon {\n color: @background-color-info;\n }\n\n &.modified:not(:hover) .close-icon {\n &:before { display: none; }\n top: 11px;\n right: 11px;\n width: 8px;\n height: 8px;\n border: 2px solid @background-color-info;\n border-radius: 12px;\n }\n }\n\n /* Drag and Drop */\n .placeholder {\n position: relative;\n top: 0;\n padding: 0;\n height: @tab-height;\n z-index: 999;\n list-style: none;\n background: @background-color-info;\n pointer-events: none;\n\n // bar\n &:before {\n content: \"\";\n position: absolute;\n width: 2px;\n margin: -1px; padding: 0;\n height: inherit;\n background: inherit;\n }\n\n // dot\n &:after {\n content: \"\";\n position: absolute;\n top: @tab-height;\n margin-top: -1px;\n margin-left: -2px;\n z-index: 9999;\n width: 4px;\n height: 4px;\n background: inherit;\n border-radius: 4px;\n border: 1px solid transparent;\n }\n }\n\n &.hidden {\n display: none;\n }\n}\n","digest":"ef692077042a4fcc762e93a03d532c786c838578"},"node_modules/timecop/styles/timecop.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n.timecop {\n .timecop-panel {\n background-color: @tool-panel-background-color;\n }\n\n overflow: auto;\n\n .panels {\n display: flex;\n flex-direction: row;\n }\n\n .package-panel {\n display: flex;\n flex-direction: row;\n flex: 1;\n\n .list-group {\n overflow: hidden;\n }\n\n .inset-panel {\n width: 100%;\n }\n }\n\n .text-info {\n margin-bottom: @component-padding;\n }\n\n .timing,\n .list-item {\n display: flex;\n justify-content: space-between;\n .inline-block:last-child {\n margin-right: 0;\n }\n }\n\n .timing {\n margin-bottom: @component-padding;\n }\n\n .list-item {\n margin-top: @component-padding / 2;;\n margin-bottom: @component-padding / 2;\n }\n\n .package {\n color: @text-color;\n &:hover {\n text-decoration: none;\n color: @text-color-selected;\n }\n }\n .timecop-line {\n flex: 1 1 0;\n margin-right: @component-padding;\n margin-top: .80em;\n border-top: 1px dashed fade(@text-color, 20%);\n }\n\n .package:hover + .timecop-line {\n border-color: fade(@text-color, 60%);\n }\n\n}\n","digest":"b845d0ed2349c16314642b453287adff298368cc"},"node_modules/tree-view/styles/tree-view.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"ui-variables\";\n\n.project-root-header {\n -webkit-user-drag: element;\n}\n\n.tree-view {\n contain: size;\n overflow: auto;\n z-index: 2;\n -webkit-user-select: none;\n\n display: flex;\n flex-direction: column;\n\n .tree-view-root {\n padding-left: @component-icon-padding;\n padding-right: @component-padding;\n background-color: inherit;\n\n /*\n * Force a new stacking context to prevent a large, duplicate paint layer from\n * being created for tree-view's scrolling contents that can make the cost of\n * layer tree updates scale at 3x the size of the layer rather than the\n * optimal 1x.\n *\n * On high resolution displays, Chromium handles layers for scrolling content\n * differently and inadvertently creates a duplicate paint layer the size of\n * .tree-view-scroller because descendants of the scroller overlap the\n * auto-created layer.\n */\n isolation: isolate;\n\n // Expands tree-view root to take up full height.\n // This makes sure that the context menu can still be openend in the empty\n // area underneath the files.\n flex-grow: 1;\n\n // Expands tree-view root to take up as much width as needed by the content.\n // This makes sure that the selected item's \"bar/background\" expands to full width.\n position: relative;\n min-width: min-content;\n }\n\n .header {\n position: relative;\n }\n\n .tree-view-root .list-tree {\n // Keeps selections expanded while dragging\n position: static;\n }\n\n .entry {\n // This fixes #110, see that issue for more details\n &::before {\n content: '';\n position: absolute;\n }\n }\n\n /* Drag and Drop */\n .placeholder {\n position: absolute;\n left: @component-icon-padding;\n padding: 0;\n z-index: 999;\n display: inline-block;\n\n width: calc(~\"100% -\" @component-icon-padding);\n background: @background-color-info;\n\n list-style: none;\n pointer-events: none;\n\n // bar\n &:before {\n content: \"\";\n position: absolute;\n height: 2px;\n margin: -1px; padding: 0;\n width: inherit;\n background: inherit;\n }\n\n &:after {\n content: \"\";\n position: absolute;\n left: 0;\n margin-top: -2px;\n margin-left: -1px;\n width: 4px;\n height: 4px;\n background: @background-color-info;\n border-radius: 4px;\n border: 1px solid transparent;\n }\n\n // ensure that placeholder doesn't disappear above the top of the view\n &:first-child {\n margin-top: 1px;\n }\n }\n}\n","digest":"f1313ca5057287a2c8a9e1a62469ebd00e4b4474"},"node_modules/update-package-dependencies/styles/update-package-dependencies.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n.update-package-dependencies-status .loading.inline-block {\n vertical-align: text-bottom;\n}\n","digest":"d83c2f136f2a1dd45e3a6521e8a89d7e740277c1"},"node_modules/welcome/styles/welcome.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"octicon-mixins\";\n@import \"ui-variables\";\n\n.welcome {\n display: flex;\n font-size: 1.25em;\n line-height: 1.4;\n color: @text-color;\n background-color: @base-background-color;\n overflow-x: auto;\n\n // Overrides ----------------------\n\n p {\n line-height: inherit;\n }\n\n a {\n color: @text-color-info;\n }\n\n ul {\n padding-left: 2em;\n }\n\n label {\n margin-top: 1em;\n font-weight: normal;\n }\n\n .input-checkbox {\n margin-top: -.2em;\n margin-right: .5em;\n }\n\n // Components ----------------------\n\n &-container {\n width: 100%;\n max-width: 580px;\n min-width: 300px;\n margin: auto;\n padding: 3em 2em;\n }\n\n &-header {\n margin: 0 0 3em 0;\n }\n\n &-logo {\n display: block;\n width: 100%;\n max-width: 280px;\n margin: 0 auto 2em auto;\n color: @text-color-highlight;\n }\n\n &-title {\n font-size: 1.4em;\n text-align: center;\n line-height: 1.3;\n margin: 1em 0;\n }\n\n &-panel {\n }\n\n &-card {\n margin: 1em 0;\n\n border-radius: @component-border-radius*2;\n border: 1px solid @base-border-color;\n background-color: lighten(@base-background-color, 3%);\n }\n\n &-summary {\n padding: 1em 1.5em;\n font-size: 1.1em;\n font-weight: 300;\n line-height: 1.4;\n cursor: pointer;\n &:hover {\n color: lighten(@text-color, 4%);\n }\n &::-webkit-details-marker {\n display: none\n }\n &:before {\n width: 20px;\n color: @text-color-subtle;\n details[open] & {\n color: @text-color-highlight;\n }\n }\n details[open] & {\n color: @text-color-highlight;\n }\n }\n\n &-highlight {\n color: @text-color-highlight;\n }\n\n &-detail {\n border-top: 1px solid @base-border-color;\n padding: 1.5em;\n .welcome-note {\n margin-bottom: 0;\n }\n .btn {\n margin-top: @component-padding/3;\n margin-bottom: @component-padding/3;\n }\n }\n\n &-img {\n display: block;\n max-width: 100%;\n border-radius: 3px;\n margin: 0 0 1em 0;\n border: 1px solid @base-border-color;\n }\n\n &-consent {\n margin-top: 3em;\n\n &-choices {\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n margin: 1em -1em;\n\n button {\n width: 100%\n }\n\n div {\n margin: .5em 1em;\n flex: 1;\n }\n\n .welcome-note {\n margin-top: 1em;\n }\n }\n }\n\n &-key {\n display: inline-block;\n padding: .3em .4em;\n font-size: .8em;\n line-height: 1;\n border-radius: 3px;\n color: @text-color-highlight;\n border: 1px solid @text-color-subtle;\n background: hsla(0,0%,0%,.1);\n }\n\n &-love {\n color: @text-color-subtle;\n a { color: @text-color-subtle; }\n\n .icon::before {\n // Make these octicons look good inlined with text\n position: relative;\n top: 4px;\n width: auto;\n margin-right: 0;\n font-size: 1.5em;\n }\n\n .icon-logo-github::before {\n top: 2px;\n font-size: 3.6em;\n vertical-align: top;\n }\n }\n\n &-note {\n font-size: .86em;\n color: @text-color-subtle;\n\n .icon {\n margin-left: 5px;\n }\n\n .icon::before {\n margin-right: 0;\n }\n }\n\n &-footer {\n margin-top: 1em;\n text-align: center;\n }\n}\n","digest":"13f78956a7ccd8d76142e0f4c4466bd70f112ebd"},"node_modules/wrap-guide/styles/wrap-guide.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"syntax-variables\";\n\natom-text-editor {\n .wrap-guide {\n height: 100%;\n width: 1px;\n z-index: 3;\n position: absolute;\n top: 0;\n background-color: @syntax-wrap-guide-color;\n -webkit-transform: translateZ(0);\n pointer-events: none;\n }\n}\n","digest":"4f2ee93f69546025dc63fa9ef28b3e6d34bf6b4f"},"node_modules/atom-dark-ui/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"styles/atom\";\n@import \"styles/buttons\";\n@import \"styles/editor\";\n@import \"styles/git\";\n@import \"styles/lists\";\n@import \"styles/messages\";\n@import \"styles/nav\";\n@import \"styles/overlays\";\n@import \"styles/panels\";\n@import \"styles/panes\";\n@import \"styles/progress\";\n@import \"styles/sites\";\n@import \"styles/tabs\";\n@import \"styles/text\";\n@import \"styles/tooltips\";\n@import \"styles/tree-view\";\n@import \"styles/utilities\";\n","digest":"c50fb319f023e7bf055888583f20e937fdb4b774"},"node_modules/atom-dark-ui/styles/atom.less":{"content":"@import \"ui-variables\";\n\n* {\n\tbox-sizing: border-box;\n}\n\natom-workspace {\n background-color: @app-background-color;\n}\n\n.scrollbars-visible-always {\n ::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n }\n\n ::-webkit-scrollbar-track,\n ::-webkit-scrollbar-corner {\n background: @scrollbar-background-color;\n }\n\n ::-webkit-scrollbar-thumb {\n background: @scrollbar-color;\n border-radius: 5px;\n box-shadow: 0 0 1px black inset;\n }\n}\n","digest":"28f3cf3978401c26f1777c1ad145db7ec81510b0"},"node_modules/atom-dark-ui/styles/buttons.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n\n.btn-background (@color, @hover-color, @selected-color, @text-color) {\n color: @text-color;\n background-color: transparent;\n background-image: -webkit-linear-gradient(@color, darken(@color, 5%));\n\n &:focus {\n color: @text-color;\n }\n &:hover {\n color: @text-color-highlight;\n background-image: -webkit-linear-gradient(@hover-color, darken(@hover-color, 5%));\n }\n &.selected,\n &.selected:hover {\n color: @text-color-highlight;\n background-image: -webkit-linear-gradient(darken(@selected-color, 5%), @selected-color);\n &:hover {\n background-image: -webkit-linear-gradient(@selected-color, darken(@selected-color, 5%));\n }\n }\n}\n\n.btn-variant (@color) {\n @bg: darken(@color, 10%);\n @hover: @color;\n @selected: @color;\n .btn-background(@bg, @hover, @selected, @text-color-highlight);\n}\n\n.btn {\n .btn-background(@button-background-color, @button-background-color-hover, @button-background-color-selected, @text-color);\n}\n\n.btn.btn-primary {\n .btn-variant(@background-color-info);\n}\n.btn.btn-info {\n .btn-variant(@background-color-info);\n}\n.btn.btn-success {\n .btn-variant(@background-color-success);\n}\n.btn.btn-warning {\n .btn-variant(@background-color-warning);\n}\n.btn.btn-error {\n .btn-variant(@background-color-error);\n}\n\n.caret {\n border-top: 5px solid #fff;\n margin-top: -1px;\n}\n","digest":"221da8f027143ea00f267af3428769c0bf5ea413"},"node_modules/atom-dark-ui/styles/dropdowns.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n@import \"octicon-mixins\";\n\n.dropdown-menu {\n background-color: @overlay-background-color;\n border-radius: @component-border-radius;\n border: 1px solid @base-border-color;\n padding: 0;\n\n > li > a {\n .text(normal);\n }\n\n > li > a:hover {\n .text(highlight);\n background-color: @background-color-highlight;\n }\n}\n","digest":"5eb5a7b0215ce07692c224d826cf22b5258ae687"},"node_modules/atom-dark-ui/styles/editor.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n\natom-text-editor[mini] {\n color: @text-color-highlight;\n background-color: @input-background-color;\n border: 1px solid @input-border-color;\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n border-radius: @component-border-radius;\n padding-left: @component-padding/2;\n\n .cursor { border-color: #fff; }\n .selection .region { background-color: lighten(@input-background-color, 10%); }\n}\n\natom-text-editor[mini].is-focused {\n background-color: lighten(@input-background-color, 5%);\n .selection .region { background-color: desaturate(@background-color-info, 50%); }\n}\n\n// FIXME: these should go in syntax themes?\natom-text-editor {\n .gutter.drop-shadow {\n -webkit-box-shadow: -2px 0 10px 2px #222;\n }\n}\n","digest":"2bcacf458053cee640e5a58326e1912338521a33"},"node_modules/atom-dark-ui/styles/git.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\n.status { .text(normal); }\n.status-added { .text(success); }\n.status-ignored { .text(subtle); }\n.status-modified { .text(warning); }\n.status-removed { .text(error); }\n.status-renamed { .text(info); }\n","digest":"ed1ba6a0675bf1eb93fb84803c7830bc18adee6f"},"node_modules/atom-dark-ui/styles/lists.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n@import \"octicon-mixins\";\n\n.list-group, .list-tree {\n li:not(.list-nested-item),\n li.list-nested-item > .list-item {\n .text(normal);\n }\n\n .generate-list-item-text-color(@class) {\n li:not(.list-nested-item).text-@{class},\n li.list-nested-item.text-@{class} > .list-item {\n .text(@class);\n }\n }\n .generate-list-item-text-color(subtle);\n .generate-list-item-text-color(info);\n .generate-list-item-text-color(success);\n .generate-list-item-text-color(warning);\n .generate-list-item-text-color(error);\n .generate-list-item-text-color(selected);\n\n .generate-list-item-status-color(@color, @status) {\n li:not(.list-nested-item).status-@{status},\n li.list-nested-item.status-@{status} > .list-item {\n color: @color;\n }\n\n li:not(.list-nested-item).selected.status-@{status},\n li.list-nested-item.selected.status-@{status} > .list-item {\n color: @color;\n }\n }\n\n .generate-list-item-status-color(@text-color-subtle, ignored);\n .generate-list-item-status-color(@text-color-added, added);\n .generate-list-item-status-color(@text-color-renamed, renamed);\n .generate-list-item-status-color(@text-color-modified, modified);\n .generate-list-item-status-color(@text-color-removed, removed);\n\n li:not(.list-nested-item).selected,\n li.list-nested-item.selected > .list-item {\n .text(selected);\n }\n}\n\n.select-list ol.list-group,\n&.select-list ol.list-group {\n li.two-lines {\n .secondary-line { color: @text-color-subtle; }\n &.selected .secondary-line {\n color: @text-color;\n text-shadow: none;\n }\n }\n\n // We want to highlight the background of the list items because we dont\n // know their size.\n li.selected {\n background-color: @background-color-selected;\n &:before{ display: none; }\n }\n\n &.mark-active{\n @active-icon-size: 14px;\n\n // pad in front of the text where the icon would be We'll pad the non-\n // active items with a 'fake' icon so other classes can pad the item\n // without worrying about the icon padding.\n li:before {\n content: '';\n background-color: transparent;\n position: static;\n display: inline-block;\n left: auto; right: auto;\n height: @active-icon-size;\n width: @active-icon-size;\n }\n > li:not(.active):before {\n margin-right: @component-icon-padding;\n }\n li.active {\n .octicon(check, @active-icon-size);\n &:before {\n margin-right: @component-icon-padding;\n color: @text-color-success;\n }\n }\n }\n}\n\n.select-list.popover-list {\n background-color: @overlay-background-color;\n box-shadow: 0 0 10px @base-border-color;\n padding: @component-padding/2;\n border-radius: @component-border-radius;\n border: 1px solid @overlay-border-color;\n\n atom-text-editor {\n margin-bottom: @component-padding/2;\n }\n\n .list-group li {\n padding-left: @component-padding/2;\n }\n}\n\n.ui-sortable {\n li {\n line-height: 2.5;\n }\n\n // For sortable lists in the settings view\n li.ui-sortable-placeholder {\n visibility: visible !important;\n background-color: darken(@pane-item-background-color, 10%);\n }\n}\n\nli.ui-draggable-dragging, li.ui-sortable-helper {\n line-height: @component-line-height;\n height: @component-line-height;\n border: 0;\n border-radius: 0;\n list-style: none;\n padding: 0 @component-padding;\n background: @background-color-highlight;\n box-shadow: 0 0 1px @base-border-color;\n}\n","digest":"f5644d2b8c79033bcd93ed3c928a5d4a589bdee5"},"node_modules/atom-dark-ui/styles/messages.less":{"content":"@import \"ui-variables\";\n\nul.background-message {\n font-weight: bold;\n color: rgba(0, 0, 0, .2);\n}\n","digest":"7b7efbe5d0362474b77d2644e8f96733bc5c1a35"},"node_modules/atom-dark-ui/styles/nav.less":{"content":"@import \"ui-variables\";\n\n.nav-tabs {\n border-bottom: 1px solid @base-border-color;\n li {\n a,\n &.active a {\n border: none;\n margin-right: 0px;\n margin-bottom: 1px;\n }\n\n a:hover,\n &.active a,\n &.active a:hover {\n background-color: @background-color-highlight;\n border: none;\n color: @text-color-selected;\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n }\n\n &.active a {\n background-color: @tab-background-color-active;\n }\n }\n}\n","digest":"60bb7686432f454039ff613baf1d160665857393"},"node_modules/atom-dark-ui/styles/overlays.less":{"content":"@import \"ui-variables\";\n\natom-panel.modal, .overlay {\n color: @text-color;\n background-color: @overlay-background-color;\n padding: @component-padding;\n border: 1px solid @overlay-border-color;\n box-shadow: 0 0 10px @base-border-color;\n border-radius: @component-border-radius;\n\n atom-text-editor[mini] {\n margin-bottom: @component-padding;\n }\n\n .select-list ol.list-group,\n &.select-list ol.list-group {\n\n background-color: lighten(@overlay-background-color, 3%);\n\n li {\n padding: @component-padding;\n border-bottom: 1px solid @overlay-background-color;\n\n &.two-lines { padding: @component-padding/2 @component-padding; }\n\n .status.icon {\n float: right;\n margin-left: @component-icon-padding;\n &:before {\n margin-right: 0;\n }\n }\n\n &.selected {\n .status.icon {\n color: @text-color-selected;\n }\n }\n }\n }\n}\n","digest":"69fc28fc152ce1a5cc2ff0507c9816c8ac01cc60"},"node_modules/atom-dark-ui/styles/panels.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n@import \"buttons\";\n\n.panel {\n &.bordered {\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n}\n\natom-panel, .tool-panel {\n .text(normal);\n position: relative;\n\n background-color: @tool-panel-background-color;\n\n &.bottom, &.panel-bottom,\n &.footer, &.panel-footer {\n border-top: 1px solid @tool-panel-border-color;\n box-shadow: inset 0 1px 0 @background-color-highlight;\n }\n\n &.left, &.panel-left {\n border-right: 1px solid @tool-panel-border-color;\n }\n\n &.right, &.panel-right {\n border-left: 1px solid @tool-panel-border-color;\n }\n}\n\n.inset-panel {\n position: relative;\n background-color: @inset-panel-background-color;\n}\n\n.is-blurred {\n atom-panel,\n .inset-panel {\n }\n}\n\n.panel-heading {\n .text(normal);\n\n border-bottom: 1px solid @panel-heading-border-color;\n border-top: 1px solid fadein(@background-color-highlight, 10%);\n\n background-color: transparent;\n background-image: -webkit-linear-gradient(@panel-heading-background-color, darken(@panel-heading-background-color, 10%));\n\n .btn {\n padding-left: 8px;\n padding-right: 8px;\n\n @bg: lighten(@button-background-color, 10%);\n @hover: lighten(@button-background-color-hover, 10%);\n @selected: lighten(@button-background-color-selected, 10%);\n @text: lighten(@text-color, 10%);\n .btn-background(@bg, @hover, @selected, @text);\n }\n}\n","digest":"24edfdb16f6c025822e819f0322d3583b15f0258"},"node_modules/atom-dark-ui/styles/panes.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n@import \"buttons\";\n\n.pane-item {\n .panel {\n border-color: fadeout(@inset-panel-border-color, 30%);\n }\n}\n\natom-pane-container {\n atom-pane {\n background-color: lighten(@app-background-color, 4%);\n\n &:focus {\n background-color: @app-background-color;\n }\n }\n\n atom-pane-axis.horizontal > * {\n border-right: 1px solid @pane-item-border-color;\n &:last-child { border-right: none; }\n }\n\n atom-pane-axis.vertical > * {\n border-bottom: 1px solid @pane-item-border-color;\n &:last-child { border-bottom: none; }\n }\n}\n","digest":"6fe095a5aa088f37d0661af084801797231c140d"},"node_modules/atom-dark-ui/styles/progress.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n\n.loading-spinner(@size) {\n width: @size;\n height: @size;\n display: block;\n\n background-image: url(images/octocat-spinner-128.gif);\n background-repeat: no-repeat;\n background-size: cover;\n\n &.inline-block {\n display: inline-block;\n }\n}\n\n.loading-spinner-large {\n .loading-spinner(64px);\n}\n\n.loading-spinner-medium {\n .loading-spinner(50px);\n}\n\n.loading-spinner-small {\n .loading-spinner(32px);\n}\n\n.loading-spinner-tiny {\n .loading-spinner(20px);\n}\n\n// Much learning from:\n// http://css-tricks.com/html5-progress-element/\n\n@progress-height: 16px;\n@progress-shine-gradient: -webkit-linear-gradient(top, rgba(255, 255, 255, .15), rgba(0, 0, 0, .15));\n\nprogress {\n height: @progress-height;\n -webkit-appearance: none;\n border-radius: @component-border-radius;\n background-color: #666;\n background-image:\n -webkit-linear-gradient(-30deg,\n transparent 33%, rgba(0, 0, 0, .1) 33%,\n rgba(0,0, 0, .1) 66%, transparent 66%),\n @progress-shine-gradient;\n border-radius: 2px;\n background-size: 25px @progress-height, 100% 100%, 100% 100%;\n -webkit-animation: animate-stripes 5s linear 6; // stop animation after 6 runs (30s) to limit CPU usage\n}\n\nprogress::-webkit-progress-bar {\n background-color: transparent;\n}\n\nprogress::-webkit-progress-value {\n border-radius: @component-border-radius;\n background-image: @progress-shine-gradient;\n background-color: @background-color-success;\n}\n\nprogress[value] {\n background-image: @progress-shine-gradient;\n -webkit-animation: none;\n}\n\n@-webkit-keyframes animate-stripes {\n 100% { background-position: 100px 0px; }\n}\n","digest":"aac1a05afe50c9c4459db60b5490f3d04d47354b"},"node_modules/atom-dark-ui/styles/sites.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\n.ui-site(@num, @color) {\n .ui-site-@{num} {\n background-color: @color;\n }\n}\n\n.ui-site(1, @ui-site-color-1);\n.ui-site(2, @ui-site-color-2);\n.ui-site(3, @ui-site-color-3);\n.ui-site(4, @ui-site-color-4);\n.ui-site(5, @ui-site-color-5);\n","digest":"3d13f4d6504d0f8e86aa5b9971eb50a445303fdd"},"node_modules/atom-dark-ui/styles/tabs.less":{"content":"@import \"ui-variables\";\n@tab-radius: 3px;\n@modified-icon-width: 8px;\n@tab-skew: 30deg;\n@tab-top-padding: 5px;\n@tab-bottom-border-height: 5px;\n@tab-border: 1px solid @tab-border-color;\n@tab-bar-bottom-border-color: #111;\n@tab-max-width: 160px;\n\n.tab-bar {\n height: @tab-height + @tab-top-padding + @tab-bottom-border-height;\n background: @tab-bar-background-color;\n box-shadow: inset 0 -8px 8px -4px rgba(0,0,0, .15);\n padding: 0 10px 0 25px;\n overflow-x: auto;\n overflow-y: hidden;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n &:after {\n content: \"\";\n position: absolute;\n bottom: 0;\n height: @tab-bottom-border-height;\n left: 0;\n right: 0;\n background-color: @tab-background-color-active;\n border-top: 1px solid @tab-border-color;\n border-bottom: 1px solid @tab-bar-bottom-border-color;\n pointer-events: none;\n }\n\n .tab {\n position: relative;\n top: @tab-top-padding;\n max-width: @tab-max-width;\n height: @tab-height;\n line-height: @tab-height;\n padding: 0;\n margin: 0 20px 0 5px;\n color: @text-color;\n\n transition: color .1s ease-in;\n border: none;\n\n &, &:before, &:after {\n background-image: -webkit-linear-gradient(top, lighten(#333, 7%), #333);\n height: @tab-height;\n }\n\n &:before, &:after {\n content: '';\n position: absolute;\n top: 0px;\n width: 25px;\n height: @tab-height;\n }\n\n // left angled edge\n &:before {\n left: -14px;\n border-top-left-radius: @tab-radius;\n box-shadow: inset 1px 1px 0 @tab-border-color, -4px 0px 4px rgba(0,0,0,.1);\n -webkit-transform: skewX(-@tab-skew);\n }\n\n // right angled edge\n &:after {\n right: -14px;\n border-top-right-radius: @tab-radius;\n box-shadow: inset -1px 1px 0 @tab-border-color, 4px 0px 4px rgba(0,0,0,.1);\n -webkit-transform: skewX(@tab-skew);\n }\n\n .close-icon {\n right: 0;\n z-index: 3;\n text-align: right;\n line-height: @tab-height;\n color: @text-color;\n\n &:hover {\n color: inherit;\n }\n }\n\n &.modified:not(:hover) .close-icon {\n right: 0;\n top: @tab-height/2 - @modified-icon-width/2 + 1px;\n width: @modified-icon-width;\n height: @modified-icon-width;\n }\n\n &.modified:hover .close-icon:hover {\n color: @text-color-highlight;\n }\n\n .title {\n position: relative;\n z-index: 1;\n margin-top: -@tab-top-padding;\n padding-top: @tab-top-padding;\n padding-right: 10px;\n }\n }\n\n .tab.active {\n z-index: 1;\n color: @text-color-highlight;\n box-shadow: inset -1px 1px 0 @tab-border-color, 4px -4px 4px rgba(0,0,0,.1);\n\n .close-icon {\n line-height: @tab-height - 1px;\n color: @text-color;\n }\n\n &, &:before, &:after {\n background-image: -webkit-linear-gradient(top, lighten(@tab-background-color-active, 7%), @tab-background-color-active);\n height: @tab-height + 1px;\n }\n\n &:before {\n box-shadow: inset 1px 1px 0 @tab-border-color, -4px -4px 4px rgba(0,0,0,.1);\n }\n\n &:after {\n box-shadow: inset -1px 1px 0 @tab-border-color, 4px -4px 4px rgba(0,0,0,.1);\n }\n }\n\n .tab:hover {\n color: @text-color-highlight;\n }\n\n .tab.active:hover .close-icon {\n color: @text-color;\n\n &:hover {\n color: inherit;\n }\n }\n\n .placeholder {\n height: @tab-height + @tab-top-padding + @tab-bottom-border-height;\n margin-left: -9px; // center between tabs\n pointer-events: none;\n &:after {\n top: @tab-height + @tab-top-padding + @tab-bottom-border-height - 2px;\n }\n }\n}\n","digest":"09a8bff3b142e02ca29b5365dc3b6247177e3900"},"node_modules/atom-dark-ui/styles/text.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\nh1,\nh2,\nh3 {\n line-height: 1em;\n margin-bottom: 15px\n}\nh1 { font-size: 2em; }\nh2 { font-size: 1.5em; }\nh3 { font-size: 1.2em; }\n\np {\n line-height: 1.6;\n margin-bottom: 15px;\n}\n\nlabel {\n font-weight: normal;\n}\n\npre {\n box-shadow: none;\n color: @text-color;\n background: @inset-panel-background-color;\n border-radius: @component-border-radius;\n border: none;\n margin: 0;\n}\n\ncode {\n .text(highlight);\n background: @background-color-highlight;\n border-radius: @component-border-radius;\n}\n\n.markdown-preview code {\n text-shadow: none;\n}\n\n.selected { .text(highlight); }\n\n.text-smaller { font-size: 0.9em; }\n\n.text-subtle { .text(subtle); }\n.text-highlight { .text(highlight); }\n\n.text-error { .text(error); }\n.text-info {\n .text(info);\n &:hover { color: @text-color-info; }\n}\n.text-warning {\n .text(warning);\n &:hover { color: @text-color-warning; }\n}\n.text-success {\n .text(success);\n &:hover { color: @text-color-success; }\n}\n\n.highlight {\n color: @text-color-highlight;\n font-weight: bold;\n text-shadow: none;\n background-color: @background-color-highlight;\n border-radius: @component-border-radius;\n padding: 1px 3px;\n}\n\n.highlight-color(@name, @color, @text-color) {\n .highlight-@{name} {\n color: lighten(saturate(@text-color, 0%), 30%);\n font-weight: bold;\n text-shadow: none;\n background-color: fadeout(@color, 60%);\n border-radius: @component-border-radius;\n padding: 1px 3px;\n }\n}\n.highlight-color(info, @background-color-info, @text-color-info);\n.highlight-color(warning, @background-color-warning, @text-color-warning);\n.highlight-color(error, @background-color-error, @text-color-error);\n.highlight-color(success, @background-color-success, @text-color-success);\n\n.results-view .path-details.list-item {\n color: darken(@text-color-highlight, 18%);\n}\n","digest":"0790a5ddd2e69c251c0f577a0ebe0eb41c85bc22"},"node_modules/atom-dark-ui/styles/tooltips.less":{"content":"@import \"ui-variables\";\n\n.tooltip {\n @tip-background-color: #fff;\n @tip-text-color: #333;\n white-space: nowrap;\n\n .keystroke {\n font-family: Helvetica, Arial, sans-serif;\n font-size: 13px;\n color: #777;\n padding-left: 2px;\n }\n\n &.in { opacity: 1; }\n\n .tooltip-inner {\n line-height: 19px;\n border-radius: @component-border-radius;\n background-color: @tip-background-color;\n color: @tip-text-color;\n white-space: nowrap;\n max-width: none;\n }\n\n &.top .tooltip-arrow {\n border-top-color: @tip-background-color;\n }\n &.top-left .tooltip-arrow {\n border-top-color: @tip-background-color;\n }\n &.top-right .tooltip-arrow {\n border-top-color: @tip-background-color;\n }\n &.right .tooltip-arrow {\n border-right-color: @tip-background-color;\n }\n &.left .tooltip-arrow {\n border-left-color: @tip-background-color;\n }\n &.bottom .tooltip-arrow {\n border-bottom-color: @tip-background-color;\n }\n &.bottom-left .tooltip-arrow {\n border-bottom-color: @tip-background-color;\n }\n &.bottom-right .tooltip-arrow {\n border-bottom-color: @tip-background-color;\n }\n}\n","digest":"b443079aedbc164d14aa7673a2520a0476746baf"},"node_modules/atom-dark-ui/styles/tree-view.less":{"content":"@import \"ui-variables\";\n\n.tree-view {\n font-size: @font-size;\n background: @tree-view-background-color;\n\n .selected:before {\n background: #444;\n box-shadow: inset -3px 0 0 rgba(0,0,0, .05);\n }\n}\n\n.tree-view-resizer {\n .tree-view-resize-handle {\n width: 8px;\n }\n}\n\n.focusable-panel {\n opacity: 1;\n box-shadow: inset -3px 0 0 rgba(0,0,0, .05);\n\n &:focus {\n background: #282828;\n\n .selected:before {\n background: @background-color-selected;\n }\n }\n}\n\n[data-show-on-right-side=true] {\n .tree-view .selected:before,\n .focusable-panel {\n box-shadow: inset 3px 0 0 rgba(0,0,0, .05);\n }\n}\n","digest":"928b7169c4e5d346b8add6ff0815eabb98a9b0f1"},"node_modules/atom-dark-ui/styles/ui-mixins.less":{"content":"@import \"ui-variables\";\n\n// Pattern matching; ish is cray.\n// http://lesscss.org/#-pattern-matching-and-guard-expressions\n.text(normal) {\n font-weight: normal;\n color: @text-color;\n text-shadow: none;\n}\n.text(subtle) {\n font-weight: normal;\n color: @text-color-subtle;\n text-shadow: none;\n}\n.text(highlight) {\n font-weight: normal;\n color: @text-color-highlight;\n text-shadow: 0 1px 0 rgba(0,0,0, .5);\n}\n.text(selected) {\n .text(highlight)\n}\n\n.text(info) {\n color: @text-color-info;\n text-shadow: none;\n}\n.text(success) {\n color: @text-color-success;\n text-shadow: none;\n}\n.text(warning) {\n color: @text-color-warning;\n text-shadow: none;\n}\n.text(error) {\n color: @text-color-error;\n text-shadow: none;\n}\n","digest":"3f48cb5cad812dec73b6a807e88d40cba75fb46d"},"node_modules/atom-dark-ui/styles/ui-variables.less":{"content":"// Colors\n\n@text-color: #aaa;\n@text-color-subtle: #555;\n@text-color-highlight: #fff;\n@text-color-selected: @text-color-highlight;\n\n@text-color-info: #5293d8;\n@text-color-success: #2BDA77;\n@text-color-warning: #ff982d;\n@text-color-error: #c00;\n\n@text-color-ignored: @text-color-subtle;\n@text-color-added: @text-color-success;\n@text-color-renamed: @text-color-info;\n@text-color-modified: @text-color-warning;\n@text-color-removed: @text-color-error;\n\n@background-color-info: #0098ff;\n@background-color-success: #17ca65;\n@background-color-warning: #ffaa2c;\n@background-color-error: #c00;\n@background-color-highlight: rgba(255, 255, 255, 0.07);\n@background-color-selected: #4182C4;\n\n@app-background-color: #333;\n\n@base-background-color: lighten(@tool-panel-background-color, 5%);\n@base-border-color: rgba(0, 0, 0, 0.5);\n\n@pane-item-background-color: @base-background-color;\n@pane-item-border-color: rgba(0, 0, 0, 0.5);\n\n@input-background-color: #212224;\n@input-border-color: @base-border-color;\n\n@tool-panel-background-color: #1d1f21;\n@tool-panel-border-color: @base-border-color;\n\n@inset-panel-background-color: #161719;\n@inset-panel-border-color: @base-border-color;\n\n@panel-heading-background-color: #43484d;\n@panel-heading-border-color: fadein(@base-border-color, 10%);\n\n@overlay-background-color: #202123;\n@overlay-border-color: @background-color-highlight;\n\n@button-background-color: #43484d;\n@button-background-color-hover: lighten(@button-background-color, 5%);\n@button-background-color-selected: #5c6064;\n@button-border-color: @base-border-color;\n\n@tab-bar-background-color: #222;\n@tab-bar-border-color: darken(@tab-background-color-active, 10%);\n@tab-background-color: #333;\n@tab-background-color-active: #222;\n@tab-border-color: #484848;\n\n@tree-view-background-color: #303030;\n@tree-view-border-color: @tool-panel-border-color;\n\n@scrollbar-background-color: #222425; // Needs to be opaque -> atom/atom/issues/4578\n@scrollbar-color: rgba(92, 92, 92, 0.5);\n\n@ui-site-color-1: @background-color-success; // green\n@ui-site-color-2: @background-color-info; // blue\n@ui-site-color-3: @background-color-warning; // orange\n@ui-site-color-4: #db2ff4; // purple\n@ui-site-color-5: #f5e11d; // yellow\n\n\n// Sizes\n\n@font-size: 11px;\n@input-font-size: 14px;\n\n@disclosure-arrow-size: 12px;\n\n@component-padding: 10px;\n@component-icon-padding: 5px;\n@component-icon-size: 16px;\n@component-line-height: 25px;\n@component-border-radius: 2px;\n\n@tab-height: 26px;\n\n\n// Other\n\n@font-family: 'BlinkMacSystemFont', 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif;\n","digest":"0c243a8f3a5a84b2c9baeec134885f97c6ef0ca5"},"node_modules/atom-dark-ui/styles/utilities.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\n.key-binding {\n background: -webkit-linear-gradient(\n rgba(100, 100, 100, 0.5),\n rgba(70,70,70, 0.5));\n -webkit-box-shadow: inset 1px 1px 0 rgba(255, 255, 255, 0.1);\n display: inline-block;\n line-height: 100%;\n border-radius: @component-border-radius;\n margin-left: @component-icon-padding;\n font-family: Helvetica, Arial, sans-serif;\n font-size: @font-size - 1px;\n padding: @component-padding / 2;\n}\n\n.badge {\n .text(highlight);\n background: @background-color-highlight;\n}\n","digest":"c01d9f555dce350fb75d06da785e4a73b6143802"},"node_modules/atom-dark-syntax/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'syntax-variables';\n\natom-text-editor {\n background-color: @syntax-background-color;\n color: @syntax-text-color;\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .wrap-guide {\n background-color: @syntax-wrap-guide-color;\n }\n\n .gutter {\n background-color: @syntax-gutter-background-color;\n }\n .gutter .cursor-line {\n background-color: @syntax-gutter-background-color-selected;\n }\n .line-number.cursor-line-no-selection {\n background-color: @syntax-gutter-background-color-selected;\n }\n\n .gutter .line-number.folded,\n .gutter .line-number:after,\n .fold-marker:after {\n color: #fba0e3;\n }\n\n .invisible {\n color: @syntax-text-color;\n }\n\n .cursor {\n border-color: @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .bracket-matcher .region {\n border-bottom: 1px solid #f8de7e;\n margin-top: -1px;\n opacity: .7;\n }\n\n // Markdown Styles\n\n .syntax--source.syntax--gfm {\n color: #999;\n }\n\n .syntax--gfm {\n .syntax--markup.syntax--heading {\n color: #eee;\n }\n\n .syntax--link {\n color: #555;\n }\n\n .syntax--variable.syntax--list,\n .syntax--support.syntax--quote {\n color: #555;\n }\n\n .syntax--link .syntax--entity {\n color: #ddd;\n }\n\n .syntax--raw {\n color: #aaa;\n }\n }\n\n .syntax--markdown {\n .syntax--paragraph {\n color: #999;\n }\n\n .syntax--heading {\n color: #eee;\n }\n\n .syntax--raw {\n color: #aaa;\n }\n\n .syntax--link {\n color: #555;\n\n .syntax--string {\n color: #555;\n\n &.syntax--title {\n color: #ddd;\n }\n }\n }\n }\n}\n\n.syntax--comment {\n color: #7C7C7C;\n}\n\n.syntax--entity {\n color: #FFD2A7;\n\n &.syntax--name.syntax--type {\n text-decoration: underline;\n color: #FFFFB6;\n }\n\n &.syntax--other.syntax--inherited-class {\n color: #9B5C2E;\n }\n}\n\n.syntax--keyword {\n color: #96CBFE;\n\n &.syntax--control {\n color: #96CBFE;\n }\n\n &.syntax--operator {\n color: #EDEDED;\n }\n}\n\n.syntax--storage {\n color: #CFCB90;\n\n &.syntax--modifier {\n color: #96CBFE;\n }\n}\n\n.syntax--constant {\n color: #99CC99;\n\n &.syntax--numeric {\n color: #FF73FD;\n }\n}\n\n.syntax--variable {\n color: #C6C5FE;\n}\n\n.syntax--invalid.syntax--deprecated {\n text-decoration: underline;\n color: #FD5FF1;\n}\n\n.syntax--invalid.syntax--illegal {\n color: #FD5FF1;\n background-color: rgba(86, 45, 86, 0.75);\n}\n\n// String interpolation in Ruby, CoffeeScript, and others\n.syntax--string {\n .syntax--source,\n .syntax--meta.syntax--embedded.syntax--line {\n color: #EDEDED;\n }\n\n .syntax--punctuation.syntax--section.syntax--embedded {\n color: #00A0A0;\n\n .syntax--source {\n color: #00A0A0; // Required for the end of embedded strings in Ruby #716\n }\n }\n}\n\n.syntax--string {\n color: #A8FF60;\n\n .syntax--constant {\n color: #00A0A0;\n }\n\n &.syntax--regexp {\n color: #E9C062;\n\n .syntax--constant.syntax--character.syntax--escape,\n .syntax--source.syntax--ruby.syntax--embedded,\n .syntax--string.syntax--regexp.syntax--arbitrary-repetition {\n color: #FF8000;\n }\n\n &.syntax--group {\n color: #C6A24F;\n background-color: rgba(255, 255, 255, 0.06);\n }\n\n &.syntax--character-class {\n color: #B18A3D;\n }\n }\n\n .syntax--variable {\n color: #8A9A95;\n }\n}\n\n.syntax--support {\n color: #FFFFB6;\n\n &.syntax--function {\n color: #DAD085;\n }\n\n &.syntax--constant {\n color: #FFD2A7;\n }\n\n &.syntax--type.syntax--property-name.syntax--css {\n color: #EDEDED;\n }\n}\n\n.syntax--source .syntax--entity.syntax--name.syntax--tag,\n.syntax--source .syntax--punctuation.syntax--tag {\n color: #96CBFE;\n}\n.syntax--source .syntax--entity.syntax--other.syntax--attribute-name {\n color: #C6C5FE;\n}\n\n.syntax--entity {\n &.syntax--other.syntax--attribute-name {\n color: #C6C5FE;\n }\n\n &.syntax--name.syntax--tag.syntax--namespace,\n &.syntax--other.syntax--attribute-name.syntax--namespace {\n color: #E18964;\n }\n}\n\n.syntax--meta {\n &.syntax--preprocessor.syntax--c {\n color: #8996A8;\n }\n\n &.syntax--preprocessor.syntax--c .syntax--keyword {\n color: #AFC4DB;\n }\n\n &.syntax--cast {\n color: #676767;\n }\n\n &.syntax--sgml.syntax--html .syntax--meta.syntax--doctype,\n &.syntax--sgml.syntax--html .syntax--meta.syntax--doctype .syntax--entity,\n &.syntax--sgml.syntax--html .syntax--meta.syntax--doctype .syntax--string,\n &.syntax--xml-processing,\n &.syntax--xml-processing .syntax--entity,\n &.syntax--xml-processing .syntax--string {\n color: #494949;\n }\n\n &.syntax--tag .syntax--entity,\n &.syntax--tag > .syntax--punctuation,\n &.syntax--tag.syntax--inline .syntax--entity {\n color: #C6C5FE;\n }\n &.syntax--tag .syntax--name,\n &.syntax--tag.syntax--inline .syntax--name,\n &.syntax--tag > .syntax--punctuation {\n color: #96CBFE;\n }\n\n &.syntax--selector.syntax--css .syntax--entity.syntax--name.syntax--tag {\n text-decoration: underline;\n color: #96CBFE;\n }\n\n &.syntax--selector.syntax--css .syntax--entity.syntax--other.syntax--attribute-name.syntax--tag.syntax--pseudo-class {\n color: #8F9D6A;\n }\n\n &.syntax--selector.syntax--css .syntax--entity.syntax--other.syntax--attribute-name.syntax--id {\n color: #8B98AB;\n }\n\n &.syntax--selector.syntax--css .syntax--entity.syntax--other.syntax--attribute-name.syntax--class {\n color: #62B1FE;\n }\n\n &.syntax--property-group .syntax--support.syntax--constant.syntax--property-value.syntax--css,\n &.syntax--property-value .syntax--support.syntax--constant.syntax--property-value.syntax--css {\n color: #F9EE98;\n }\n\n &.syntax--preprocessor.syntax--at-rule .syntax--keyword.syntax--control.syntax--at-rule {\n color: #8693A5;\n }\n\n &.syntax--property-value .syntax--support.syntax--constant.syntax--named-color.syntax--css,\n &.syntax--property-value .syntax--constant {\n color: #87C38A;\n }\n\n &.syntax--constructor.syntax--argument.syntax--css {\n color: #8F9D6A;\n }\n\n &.syntax--diff,\n &.syntax--diff.syntax--header {\n color: #F8F8F8;\n background-color: #0E2231;\n }\n\n &.syntax--separator {\n color: #60A633;\n background-color: #242424;\n }\n\n &.syntax--line.syntax--entry.syntax--logfile,\n &.syntax--line.syntax--exit.syntax--logfile {\n background-color: rgba(238, 238, 238, 0.16);\n }\n\n &.syntax--line.syntax--error.syntax--logfile {\n background-color: #751012;\n }\n}\n","digest":"1c821a8c2a7eeead87c8d5f1418a77999fd54335"},"node_modules/atom-dark-syntax/styles/syntax-variables.less":{"content":"// This defines all syntax variables that syntax themes must implement when they\n// include a syntax-variables.less file.\n\n// General colors\n@syntax-text-color: #c5c8c6;\n@syntax-cursor-color: white;\n@syntax-selection-color: #444;\n@syntax-selection-flash-color: #eee;\n@syntax-background-color: #1d1f21;\n\n// Guide colors\n@syntax-wrap-guide-color: rgba(197, 200, 198, .1);\n@syntax-indent-guide-color: rgba(197, 200, 198, .2);\n@syntax-invisible-character-color: rgba(197, 200, 198, .2);\n\n// For find and replace markers\n@syntax-result-marker-color: #888;\n@syntax-result-marker-color-selected: white;\n\n// Gutter colors\n@syntax-gutter-text-color: @syntax-text-color;\n@syntax-gutter-text-color-selected: @syntax-gutter-text-color;\n@syntax-gutter-background-color: lighten(@syntax-background-color, 5%);\n@syntax-gutter-background-color-selected: rgba(255, 255, 255, 0.14);\n\n// For git diff info. i.e. in the gutter\n@syntax-color-renamed: #96CBFE;\n@syntax-color-added: #A8FF60;\n@syntax-color-modified: #E9C062;\n@syntax-color-removed: #CC6666;\n\n// For language entity colors\n@syntax-color-variable: #C6C5FE;\n@syntax-color-constant: #99CC99;\n@syntax-color-property: #EDEDED;\n@syntax-color-value: #F9EE98;\n@syntax-color-function: #DAD085;\n@syntax-color-method: @syntax-color-function;\n@syntax-color-class: #62B1FE;\n@syntax-color-keyword: #96CBFE;\n@syntax-color-tag: #96CBFE;\n@syntax-color-attribute: #C6C5FE;\n@syntax-color-import: @syntax-color-keyword;\n@syntax-color-snippet: @syntax-color-constant;\n","digest":"df71fe29adb4c75717824afcb98e8d17e62d9e5d"},"node_modules/atom-light-syntax/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import 'syntax-variables';\n\natom-text-editor {\n background-color: @syntax-background-color;\n color: @syntax-text-color;\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .wrap-guide {\n background-color: @syntax-wrap-guide-color;\n }\n\n .gutter {\n color: @syntax-gutter-text-color;\n background: @syntax-gutter-background-color;\n }\n\n .gutter .line-number.folded,\n .gutter .line-number:after,\n .fold-marker:after {\n color: #e87b00;\n }\n\n .invisible {\n color: #555;\n }\n\n .selection .region {\n background-color: #e1e1e1;\n }\n\n .bracket-matcher .region {\n background-color: #C9C9C9;\n opacity: .7;\n border-bottom: 0 none;\n }\n\n &.is-focused {\n .cursor {\n border-color: @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .line-number.cursor-line-no-selection,\n .line.cursor-line {\n background-color: @syntax-gutter-background-color-selected;\n }\n }\n\n // Markdown\n .syntax--source.syntax--gfm {\n color: #444;\n }\n\n .syntax--gfm {\n .syntax--markup.syntax--heading {\n color: #111;\n }\n\n & .syntax--link {\n color: #888;\n }\n\n .syntax--variable.syntax--list {\n color: #888;\n }\n }\n\n .syntax--markdown {\n .syntax--paragraph {\n color: #444;\n }\n\n .syntax--heading {\n color: #111;\n }\n\n .syntax--link {\n color: #888;\n\n .syntax--string {\n color: #888;\n }\n }\n }\n}\n\n.syntax--comment {\n color: #999988;\n font-style: italic;\n}\n\n.syntax--string {\n color: #D14;\n}\n\n// String interpolation in Ruby, CoffeeScript, and others\n.syntax--string {\n .syntax--source,\n .syntax--meta.syntax--embedded.syntax--line {\n color: #5A5A5A;\n }\n\n .syntax--punctuation.syntax--section.syntax--embedded {\n color: #920B2D;\n\n .syntax--source {\n color: #920B2D; // Required for the end of embedded strings in Ruby #716\n }\n }\n}\n\n.syntax--constant {\n &.syntax--numeric {\n color: #D14;\n }\n\n &.syntax--language {\n color: #606aa1;\n }\n\n &.syntax--character,\n &.syntax--other {\n color: #606aa1;\n }\n\n &.syntax--symbol {\n color: #990073;\n }\n\n &.syntax--numeric.syntax--line-number.syntax--find-in-files .syntax--match {\n color: rgba(143, 190, 0, 0.63);\n }\n}\n\n.syntax--variable {\n color: #008080;\n\n &.syntax--parameter {\n color: #606aa1;\n }\n}\n\n// Keywords\n.syntax--keyword {\n color: #222;\n font-weight: bold;\n\n &.syntax--unit {\n color: #445588;\n }\n\n &.syntax--special-method {\n color: #0086B3;\n }\n}\n\n.syntax--storage {\n color: #222;\n\n &.syntax--type {\n color: #222;\n }\n}\n\n.syntax--entity {\n &.syntax--name.syntax--class {\n text-decoration: underline;\n color: #606aa1;\n }\n\n &.syntax--other.syntax--inherited-class {\n text-decoration: underline;\n color: #606aa1;\n }\n\n &.syntax--name.syntax--function {\n color: #900;\n }\n\n &.syntax--name.syntax--tag {\n color: #008080;\n }\n\n &.syntax--other.syntax--attribute-name {\n color: #458;\n font-weight: bold;\n }\n\n &.syntax--name.syntax--filename.syntax--find-in-files {\n color: #E6DB74;\n }\n}\n\n.syntax--support {\n &.syntax--constant,\n &.syntax--function,\n &.syntax--type {\n color: #458;\n }\n\n &.syntax--class {\n color: #008080;\n }\n}\n\n.syntax--invalid {\n color: #F8F8F0;\n background-color: #00A8C6;\n\n &.syntax--deprecated {\n color: #F8F8F0;\n background-color: #8FBE00;\n }\n}\n\n\n.syntax--meta {\n &.syntax--structure.syntax--dictionary.syntax--json > .syntax--string.syntax--quoted.syntax--double.syntax--json,\n &.syntax--structure.syntax--dictionary.syntax--json > .syntax--string.syntax--quoted.syntax--double.syntax--json .syntax--punctuation.syntax--string {\n color: #000080;\n }\n\n &.syntax--structure.syntax--dictionary.syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--double.syntax--json {\n color: #d14;\n }\n\n &.syntax--diff,\n &.syntax--diff.syntax--header {\n color: #75715E;\n }\n}\n\n// CSS Styles\n.syntax--css {\n &.syntax--support.syntax--property-name {\n font-weight: bold;\n color: #333;\n }\n\n &.syntax--constant {\n color: #099;\n }\n}\n","digest":"02b83dbf2b55618e4b45afe8b3e615b819494907"},"node_modules/atom-light-syntax/styles/syntax-variables.less":{"content":"// This defines all syntax variables that syntax themes must implement when they\n// include a syntax-variables.less file.\n\n// General colors\n@syntax-text-color: #555;\n@syntax-cursor-color: black;\n@syntax-selection-color: #afc4da;\n@syntax-selection-flash-color: #69c;\n@syntax-background-color: white;\n\n// Guide colors\n@syntax-wrap-guide-color: rgba(85, 85, 85, .2);\n@syntax-indent-guide-color: rgba(85, 85, 85, .2);\n@syntax-invisible-character-color: rgba(85, 85, 85, .2);\n\n// For find and replace markers\n@syntax-result-marker-color: #999;\n@syntax-result-marker-color-selected: black;\n\n// Gutter colors\n@syntax-gutter-text-color: @syntax-text-color;\n@syntax-gutter-text-color-selected: @syntax-gutter-text-color;\n@syntax-gutter-background-color: white;\n@syntax-gutter-background-color-selected: rgba(255, 255, 134, 0.34);\n\n// For git diff info. i.e. in the gutter\n@syntax-color-renamed: #96CBFE;\n@syntax-color-added: #718C00;\n@syntax-color-modified: #ff982d;\n@syntax-color-removed: #D14;\n\n// For language entity colors\n@syntax-color-variable: #008080;\n@syntax-color-constant: #099;\n@syntax-color-property: #333;\n@syntax-color-value: @syntax-color-constant;\n@syntax-color-function: #900;\n@syntax-color-method: @syntax-color-function;\n@syntax-color-class: #606aa1;\n@syntax-color-keyword: #222;\n@syntax-color-tag: #008080;\n@syntax-color-attribute: #458;\n@syntax-color-import: @syntax-color-keyword;\n@syntax-color-snippet: @syntax-color-constant;\n","digest":"622c25b2fa9b894bc851f17b9229b5392852aebe"},"node_modules/base16-tomorrow-dark-theme/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Base16 Tomorrow Dark theme\n\n@import \"styles/syntax-variables.less\";\n\n@import \"styles/editor.less\";\n\n@import \"styles/syntax/_base.less\";\n@import \"styles/syntax/cs.less\";\n@import \"styles/syntax/json.less\";\n","digest":"dd476301964de421e40efac1cf8716e909a1d386"},"node_modules/base16-tomorrow-dark-theme/styles/colors.less":{"content":"\n// Base16 Tomorrow\n// A color scheme by Chris Kempson (http://chriskempson.com)\n\n// Grayscale\n@black: #1d1f21; // 00\n@very-dark-gray: #282a2e; // 01\n@dark-gray: #373b41; // 02\n@gray: #969896; // 03\n@light-gray: #b4b7b4; // 04\n@very-light-gray: #c5c8c6; // 05\n@almost-white: #e0e0e0; // 06\n@white: #ffffff; // 07\n\n// Colors\n@red: #cc6666; // 08\n@orange: #de935f; // 09\n@yellow: #f0c674; // 0A\n@green: #b5bd68; // 0B\n@cyan: #8abeb7; // 0C\n@blue: #81a2be; // 0D\n@purple: #b294bb; // 0E\n@brown: #a3685a; // 0F\n","digest":"7065bcfeb89ff1d1b5f71d142576133e451415d7"},"node_modules/base16-tomorrow-dark-theme/styles/editor.less":{"content":"\n// Editor styles (background, gutter, guides)\n\natom-text-editor {\n background-color: @syntax-background-color;\n color: @syntax-text-color;\n\n .wrap-guide {\n background-color: @syntax-wrap-guide-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .gutter {\n background-color: @syntax-gutter-background-color;\n color: @syntax-gutter-text-color;\n\n .line-number {\n padding: 0 0.25em 0 0.5em;\n -webkit-font-smoothing: antialiased;\n &.cursor-line {\n background-color: @syntax-gutter-background-color-selected;\n color: @syntax-gutter-text-color-selected;\n }\n\n &.cursor-line-no-selection {\n color: @syntax-gutter-text-color-selected;\n }\n }\n }\n\n .gutter .line-number.folded,\n .gutter .line-number:after,\n .fold-marker:after {\n color: @syntax-result-marker-color;\n }\n\n .invisible {\n color: @syntax-text-color;\n }\n\n .cursor {\n color: @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .bracket-matcher .region {\n border-color: @syntax-result-marker-color;\n }\n}\n","digest":"e169e4520f6a8966fbd8e49fc9f30aa162c85050"},"node_modules/base16-tomorrow-dark-theme/styles/syntax-variables.less":{"content":"@import \"colors.less\";\n\n// Official Syntax Variables\n\n// General colors\n@syntax-text-color: @very-light-gray;\n@syntax-cursor-color: @white;\n@syntax-selection-color: @dark-gray;\n@syntax-selection-flash-color: @very-light-gray;\n@syntax-background-color: @black;\n\n// Guide colors\n@syntax-wrap-guide-color: mix(@gray, @dark-gray);\n@syntax-indent-guide-color: mix(@gray, @dark-gray);\n@syntax-invisible-character-color: mix(@gray, @dark-gray);\n\n// For find and replace markers\n@syntax-result-marker-color: @gray;\n@syntax-result-marker-color-selected: @white;\n\n// Gutter colors\n@syntax-gutter-text-color: @gray;\n@syntax-gutter-text-color-selected: @very-light-gray;\n@syntax-gutter-background-color: @syntax-background-color;\n@syntax-gutter-background-color-selected: @syntax-selection-color;\n\n// For git diff info. i.e. in the gutter\n@syntax-color-renamed: @blue;\n@syntax-color-added: @green;\n@syntax-color-modified: @orange;\n@syntax-color-removed: @red;\n\n// For language entity colors\n@syntax-color-variable: @red;\n@syntax-color-constant: @orange;\n@syntax-color-property: @syntax-text-color;\n@syntax-color-value: @green;\n@syntax-color-function: @blue;\n@syntax-color-method: @blue;\n@syntax-color-class: @yellow;\n@syntax-color-keyword: @purple;\n@syntax-color-tag: @red;\n@syntax-color-attribute: @orange;\n@syntax-color-import: @purple;\n@syntax-color-snippet: @green;\n","digest":"9411e7e5f74fe122e80ee78f47c8deb31c6ec0b6"},"node_modules/base16-tomorrow-dark-theme/styles/syntax/_base.less":{"content":"\n// Language syntax highlighting\n\n.syntax--comment {\n color: @gray;\n\n .syntax--markup.syntax--link {\n color: @gray;\n }\n}\n\n.syntax--entity {\n\n &.syntax--name.syntax--type {\n color: @yellow;\n }\n\n &.syntax--other.syntax--inherited-class {\n color: @green;\n }\n}\n\n.syntax--keyword {\n color: @purple;\n\n &.syntax--control {\n color: @purple;\n }\n\n &.syntax--operator {\n color: @syntax-text-color;\n }\n\n &.syntax--other.syntax--special-method {\n color: @blue;\n }\n\n &.syntax--other.syntax--unit {\n color: @orange;\n }\n}\n\n.syntax--storage {\n color: @purple;\n}\n\n.syntax--constant {\n color: @orange;\n\n &.syntax--character.syntax--escape {\n color: @cyan;\n }\n\n &.syntax--numeric {\n color: @orange;\n }\n\n &.syntax--other.syntax--color {\n color: @cyan;\n }\n\n &.syntax--other.syntax--symbol {\n color: @green;\n }\n}\n\n.syntax--variable {\n color: @red;\n\n &.syntax--interpolation {\n color: @brown;\n }\n\n &.syntax--parameter.syntax--function {\n color: @syntax-text-color;\n }\n}\n\n.syntax--invalid.syntax--illegal {\n background-color: @red;\n color: @syntax-background-color;\n}\n\n.syntax--string {\n color: @green;\n\n\n &.syntax--regexp {\n color: @cyan;\n\n .syntax--source.syntax--ruby.syntax--embedded {\n color: @yellow;\n }\n }\n\n &.syntax--other.syntax--link {\n color: @red;\n }\n}\n\n.syntax--punctuation {\n &.syntax--definition {\n &.syntax--parameters,\n &.syntax--array {\n color: @syntax-text-color;\n }\n\n &.syntax--heading,\n &.syntax--identity {\n color: @blue;\n }\n\n &.syntax--bold {\n color: @yellow;\n font-weight: bold;\n }\n\n &.syntax--italic {\n color: @purple;\n font-style: italic;\n }\n }\n\n &.syntax--section {\n &.syntax--embedded {\n color: @brown;\n }\n\n &.syntax--method,\n &.syntax--class,\n &.syntax--inner-class {\n color: @syntax-text-color;\n }\n }\n}\n\n.syntax--support {\n &.syntax--class {\n color: @yellow;\n }\n\n &.syntax--function {\n color: @cyan;\n\n &.syntax--any-method {\n color: @blue;\n }\n }\n}\n\n.syntax--entity {\n\n &.syntax--name.syntax--function {\n color: @blue;\n }\n\n &.syntax--name.syntax--class, &.syntax--name.syntax--type.syntax--class {\n color: @yellow;\n }\n\n &.syntax--name.syntax--section {\n color: @blue;\n }\n\n &.syntax--name.syntax--tag {\n color: @red;\n }\n\n &.syntax--other.syntax--attribute-name {\n color: @orange;\n\n &.syntax--id {\n color: @blue;\n }\n }\n}\n\n.syntax--meta {\n &.syntax--class {\n color: @yellow;\n\n &.syntax--body {\n color: @syntax-text-color;\n }\n }\n\n &.syntax--link {\n color: @orange;\n }\n\n &.syntax--method-call,\n &.syntax--method {\n color: @syntax-text-color;\n }\n\n &.syntax--require {\n color: @blue;\n }\n\n &.syntax--selector {\n color: @purple;\n }\n\n &.syntax--separator {\n background-color: #373b41;\n color: @syntax-text-color;\n }\n\n &.syntax--tag {\n color: @syntax-text-color;\n }\n}\n\n.syntax--none {\n color: @syntax-text-color;\n}\n\n.syntax--markup {\n &.syntax--bold {\n color: @orange;\n font-weight: bold;\n }\n\n &.syntax--changed {\n color: @purple;\n }\n\n &.syntax--deleted {\n color: @red;\n }\n\n &.syntax--italic {\n color: @purple;\n font-style: italic;\n }\n\n &.syntax--heading {\n color: @red;\n\n .syntax--punctuation.syntax--definition.syntax--heading {\n color: @blue;\n }\n }\n\n &.syntax--link {\n color: @blue;\n }\n\n &.syntax--inserted {\n color: @green;\n }\n\n &.syntax--quote {\n color: @orange;\n }\n\n &.syntax--raw {\n color: @green;\n }\n}\n\n.syntax--source.syntax--gfm {\n .syntax--markup {\n -webkit-font-smoothing: auto;\n }\n\n .syntax--link .syntax--entity {\n color: @cyan;\n }\n}\n","digest":"d1306472e8c62c0f10a2cbac0b9eba5c4aa325d9"},"node_modules/base16-tomorrow-dark-theme/styles/syntax/cs.less":{"content":".syntax--source.syntax--cs {\n .syntax--keyword.syntax--operator {\n color: @purple;\n }\n}\n","digest":"ab8e60371daf69b881f4800e1ebbee4b27ca0596"},"node_modules/base16-tomorrow-dark-theme/styles/syntax/json.less":{"content":".syntax--source.syntax--json {\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json {\n & > .syntax--string.syntax--quoted.syntax--json {\n & > .syntax--punctuation.syntax--string {\n color: @red;\n }\n color: @red;\n }\n }\n\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json, .syntax--meta.syntax--structure.syntax--array.syntax--json {\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json,\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json > .syntax--punctuation {\n color: @green;\n }\n\n & > .syntax--constant.syntax--language.syntax--json {\n color: @cyan;\n }\n }\n}\n","digest":"98318eea0552874ff8e38add508f6b1f0b1cd0a5"},"node_modules/base16-tomorrow-light-theme/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Base16 Tomorrow Light\n\n@import \"styles/syntax-variables.less\";\n\n@import \"styles/editor.less\";\n\n@import \"styles/syntax/_base.less\";\n@import \"styles/syntax/cs.less\";\n@import \"styles/syntax/json.less\";\n","digest":"6892e2b19d038cf18f9f3a32e955dc02fe13c8b5"},"node_modules/base16-tomorrow-light-theme/styles/colors.less":{"content":"\n// Base16 Tomorrow\n// A color scheme by Chris Kempson (http://chriskempson.com)\n\n// Grayscale\n@black: #1d1f21; // 00\n@very-dark-gray: #282a2e; // 01\n@dark-gray: #373b41; // 02\n@gray: #969896; // 03\n@light-gray: #b4b7b4; // 04\n@very-light-gray: #c5c8c6; // 05\n@almost-white: #e0e0e0; // 06\n@white: #ffffff; // 07\n\n// Colors\n@red: #cc6666; // 08\n@orange: #de935f; // 09\n@yellow: #f0c674; // 0A\n@green: #b5bd68; // 0B\n@cyan: #8abeb7; // 0C\n@blue: #81a2be; // 0D\n@purple: #b294bb; // 0E\n@brown: #a3685a; // 0F\n","digest":"7065bcfeb89ff1d1b5f71d142576133e451415d7"},"node_modules/base16-tomorrow-light-theme/styles/editor.less":{"content":"\n// Editor styles (background, gutter, guides)\n\natom-text-editor {\n background-color: @syntax-background-color;\n color: @syntax-text-color;\n\n .wrap-guide {\n background-color: @syntax-wrap-guide-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .gutter {\n background-color: @syntax-gutter-background-color;\n color: @syntax-gutter-text-color;\n\n .line-number {\n padding: 0 0.25em 0 0.5em;\n -webkit-font-smoothing: antialiased;\n &.cursor-line {\n background-color: @syntax-gutter-background-color-selected;\n color: @syntax-gutter-text-color-selected;\n }\n\n &.cursor-line-no-selection {\n color: @syntax-gutter-text-color-selected;\n }\n }\n }\n\n .gutter .line-number.folded,\n .gutter .line-number:after,\n .fold-marker:after {\n color: @syntax-result-marker-color;\n }\n\n .invisible {\n color: @syntax-text-color;\n }\n\n .cursor {\n color: @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .bracket-matcher .region {\n border-color: @syntax-result-marker-color;\n }\n}\n","digest":"e169e4520f6a8966fbd8e49fc9f30aa162c85050"},"node_modules/base16-tomorrow-light-theme/styles/syntax-variables.less":{"content":"@import \"colors.less\";\n\n// Official Syntax Variables\n\n// General colors\n@syntax-text-color: @black;\n@syntax-cursor-color: @black;\n@syntax-selection-color: @almost-white;\n@syntax-selection-flash-color: @very-dark-gray;\n@syntax-background-color: @white;\n\n// Guide colors\n@syntax-wrap-guide-color: @very-light-gray;\n@syntax-indent-guide-color: @very-light-gray;\n@syntax-invisible-character-color: @very-light-gray;\n\n// For find and replace markers\n@syntax-result-marker-color: @light-gray;\n@syntax-result-marker-color-selected: @very-light-gray;\n\n// Gutter colors\n@syntax-gutter-text-color: @light-gray;\n@syntax-gutter-text-color-selected: @dark-gray;\n@syntax-gutter-background-color: @syntax-background-color;\n@syntax-gutter-background-color-selected: @syntax-selection-color;\n\n// For git diff info. i.e. in the gutter\n@syntax-color-renamed: @blue;\n@syntax-color-added: @green;\n@syntax-color-modified: @orange;\n@syntax-color-removed: @red;\n\n// For language entity colors\n@syntax-color-variable: @red;\n@syntax-color-constant: @orange;\n@syntax-color-property: @syntax-text-color;\n@syntax-color-value: @green;\n@syntax-color-function: @blue;\n@syntax-color-method: @blue;\n@syntax-color-class: @yellow;\n@syntax-color-keyword: @purple;\n@syntax-color-tag: @red;\n@syntax-color-attribute: @orange;\n@syntax-color-import: @purple;\n@syntax-color-snippet: @green;\n","digest":"d09bce39e451df301e4e01787640d3c81c19a0d8"},"node_modules/base16-tomorrow-light-theme/styles/syntax/_base.less":{"content":"\n// Language syntax highlighting\n\n.syntax--comment {\n color: @gray;\n\n .syntax--markup.syntax--link {\n color: @gray;\n }\n}\n\n.syntax--entity {\n\n &.syntax--name.syntax--type {\n color: @yellow;\n }\n\n &.syntax--other.syntax--inherited-class {\n color: @green;\n }\n}\n\n.syntax--keyword {\n color: @purple;\n\n &.syntax--control {\n color: @purple;\n }\n\n &.syntax--operator {\n color: @syntax-text-color;\n }\n\n &.syntax--other.syntax--special-method {\n color: @blue;\n }\n\n &.syntax--other.syntax--unit {\n color: @orange;\n }\n}\n\n.syntax--storage {\n color: @purple;\n}\n\n.syntax--constant {\n color: @orange;\n\n &.syntax--character.syntax--escape {\n color: @cyan;\n }\n\n &.syntax--numeric {\n color: @orange;\n }\n\n &.syntax--other.syntax--color {\n color: @cyan;\n }\n\n &.syntax--other.syntax--symbol {\n color: @green;\n }\n}\n\n.syntax--variable {\n color: @red;\n\n &.syntax--interpolation {\n color: @brown;\n }\n\n &.syntax--parameter.syntax--function {\n color: @syntax-text-color;\n }\n}\n\n.syntax--invalid.syntax--illegal {\n background-color: @red;\n color: @syntax-background-color;\n}\n\n.syntax--string {\n color: @green;\n\n\n &.syntax--regexp {\n color: @cyan;\n\n .syntax--source.syntax--ruby.syntax--embedded {\n color: @yellow;\n }\n }\n\n &.syntax--other.syntax--link {\n color: @red;\n }\n}\n\n.syntax--punctuation {\n &.syntax--definition {\n &.syntax--parameters,\n &.syntax--array {\n color: @syntax-text-color;\n }\n\n &.syntax--heading,\n &.syntax--identity {\n color: @blue;\n }\n\n &.syntax--bold {\n color: @yellow;\n font-weight: bold;\n }\n\n &.syntax--italic {\n color: @purple;\n font-style: italic;\n }\n }\n\n &.syntax--section {\n &.syntax--embedded {\n color: @brown;\n }\n\n &.syntax--method,\n &.syntax--class,\n &.syntax--inner-class {\n color: @syntax-text-color;\n }\n }\n}\n\n.syntax--support {\n &.syntax--class {\n color: @yellow;\n }\n\n &.syntax--function {\n color: @cyan;\n\n &.syntax--any-method {\n color: @blue;\n }\n }\n}\n\n.syntax--entity {\n\n &.syntax--name.syntax--function {\n color: @blue;\n }\n\n &.syntax--name.syntax--class, &.syntax--name.syntax--type.syntax--class {\n color: @yellow;\n }\n\n &.syntax--name.syntax--section {\n color: @blue;\n }\n\n &.syntax--name.syntax--tag {\n color: @red;\n }\n\n &.syntax--other.syntax--attribute-name {\n color: @orange;\n\n &.syntax--id {\n color: @blue;\n }\n }\n}\n\n.syntax--meta {\n &.syntax--class {\n color: @yellow;\n\n &.syntax--body {\n color: @syntax-text-color;\n }\n }\n\n &.syntax--link {\n color: @orange;\n }\n\n &.syntax--method-call,\n &.syntax--method {\n color: @syntax-text-color;\n }\n\n &.syntax--require {\n color: @blue;\n }\n\n &.syntax--selector {\n color: @purple;\n }\n\n &.syntax--separator {\n background-color: #373b41;\n color: @syntax-text-color;\n }\n\n &.syntax--tag {\n color: @syntax-text-color;\n }\n}\n\n.syntax--none {\n color: @syntax-text-color;\n}\n\n.syntax--markup {\n &.syntax--bold {\n color: @orange;\n font-weight: bold;\n }\n\n &.syntax--changed {\n color: @purple;\n }\n\n &.syntax--deleted {\n color: @red;\n }\n\n &.syntax--italic {\n color: @purple;\n font-style: italic;\n }\n\n &.syntax--heading {\n color: @red;\n\n .syntax--punctuation.syntax--definition.syntax--heading {\n color: @blue;\n }\n }\n\n &.syntax--link {\n color: @blue;\n }\n\n &.syntax--inserted {\n color: @green;\n }\n\n &.syntax--quote {\n color: @orange;\n }\n\n &.syntax--raw {\n color: @green;\n }\n}\n\n.syntax--source.syntax--gfm {\n .syntax--markup {\n -webkit-font-smoothing: auto;\n }\n\n .syntax--link .syntax--entity {\n color: @cyan;\n }\n}\n","digest":"d1306472e8c62c0f10a2cbac0b9eba5c4aa325d9"},"node_modules/base16-tomorrow-light-theme/styles/syntax/cs.less":{"content":".syntax--source.syntax--cs {\n .syntax--keyword.syntax--operator {\n color: @purple;\n }\n}\n","digest":"ab8e60371daf69b881f4800e1ebbee4b27ca0596"},"node_modules/base16-tomorrow-light-theme/styles/syntax/json.less":{"content":".syntax--source.syntax--json {\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json {\n & > .syntax--string.syntax--quoted.syntax--json {\n & > .syntax--punctuation.syntax--string {\n color: @red;\n }\n color: @red;\n }\n }\n\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json, .syntax--meta.syntax--structure.syntax--array.syntax--json {\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json,\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json > .syntax--punctuation {\n color: @green;\n }\n\n & > .syntax--constant.syntax--language.syntax--json {\n color: @cyan;\n }\n }\n}\n","digest":"98318eea0552874ff8e38add508f6b1f0b1cd0a5"},"node_modules/one-dark-syntax/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Atom Syntax Theme: One\n\n@import \"styles/syntax-variables.less\";\n\n@import \"styles/editor.less\";\n\n@import \"styles/syntax/_base.less\";\n@import \"styles/syntax/c.less\";\n@import \"styles/syntax/cpp.less\";\n@import \"styles/syntax/cs.less\";\n@import \"styles/syntax/css.less\";\n@import \"styles/syntax/elixir.less\";\n@import \"styles/syntax/gfm.less\";\n@import \"styles/syntax/go.less\";\n@import \"styles/syntax/ini.less\";\n@import \"styles/syntax/java.less\";\n@import \"styles/syntax/javascript.less\";\n@import \"styles/syntax/json.less\";\n@import \"styles/syntax/ruby.less\";\n@import \"styles/syntax/python.less\";\n","digest":"a916d5c6a5b8d6ea37a60088aa6e4eaab8e86ff2"},"node_modules/one-dark-syntax/styles/colors.less":{"content":"\n// Config -----------------------------------\n@syntax-hue: 220;\n@syntax-saturation: 13%;\n@syntax-brightness: 18%;\n\n\n// Monochrome -----------------------------------\n@mono-1: hsl(@syntax-hue, 14%, 71%); // default text\n@mono-2: hsl(@syntax-hue, 9%, 55%);\n@mono-3: hsl(@syntax-hue, 10%, 40%);\n\n// Colors -----------------------------------\n@hue-1: hsl(187, 47%, 55%); // <-cyan\n@hue-2: hsl(207, 82%, 66%); // <-blue\n@hue-3: hsl(286, 60%, 67%); // <-purple\n@hue-4: hsl( 95, 38%, 62%); // <-green\n\n@hue-5: hsl(355, 65%, 65%); // <-red 1\n@hue-5-2: hsl( 5, 48%, 51%); // <-red 2\n\n@hue-6: hsl( 29, 54%, 61%); // <-orange 1\n@hue-6-2: hsl( 39, 67%, 69%); // <-orange 2\n\n\n// Base colors -----------------------------------\n@syntax-fg: @mono-1;\n@syntax-bg: hsl(@syntax-hue, @syntax-saturation, @syntax-brightness);\n@syntax-gutter: darken(@syntax-fg, 26%);\n@syntax-guide: fade(@syntax-fg, 15%);\n@syntax-accent: hsl(@syntax-hue, 100%, 66% );\n","digest":"66bba03e9aabff000a84c2839a9d3e9a9fa08e0e"},"node_modules/one-dark-syntax/styles/editor.less":{"content":"\n// Editor styles (background, gutter, guides)\n\natom-text-editor {\n background-color: @syntax-background-color;\n color: @syntax-text-color;\n\n .line.cursor-line {\n background-color: @syntax-cursor-line;\n }\n\n .invisible {\n color: @syntax-text-color;\n }\n\n .cursor {\n border-left: 2px solid @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .bracket-matcher .region {\n border-bottom: 1px solid @syntax-cursor-color;\n box-sizing: border-box;\n }\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .wrap-guide {\n background-color: @syntax-wrap-guide-color;\n }\n\n // find + replace\n .find-result .region.region.region,\n .current-result .region.region.region {\n border-radius: 2px;\n background-color: @syntax-result-marker-color;\n transition: border-color .4s;\n }\n .find-result .region.region.region {\n border: 2px solid transparent;\n }\n .current-result .region.region.region {\n border: 2px solid @syntax-result-marker-color-selected;\n transition-duration: .1s;\n }\n\n .gutter {\n\n .line-number {\n color: @syntax-gutter-text-color;\n -webkit-font-smoothing: antialiased;\n\n &.cursor-line {\n color: @syntax-gutter-text-color-selected;\n background-color: @syntax-gutter-background-color-selected;\n }\n &.cursor-line-no-selection {\n background-color: transparent;\n }\n\n .icon-right {\n color: @syntax-text-color;\n }\n }\n\n &:not(.git-diff-icon) .line-number.git-line-removed {\n &.git-line-removed::before {\n bottom: -3px;\n }\n &::after {\n content: \"\";\n position: absolute;\n left: 0px;\n bottom: 0px;\n width: 25px;\n border-bottom: 1px dotted fade(@syntax-color-removed, 50%);\n pointer-events: none;\n }\n }\n }\n\n .gutter .line-number.folded,\n .gutter .line-number:after,\n .fold-marker:after {\n color: @syntax-gutter-text-color-selected;\n }\n}\n","digest":"1b282b3b38c12bf9fbb3431b172c69a70d5f81d1"},"node_modules/one-dark-syntax/styles/syntax-variables.less":{"content":"@import \"colors.less\";\n\n// Official Syntax Variables -----------------------------------\n\n// General colors\n@syntax-text-color: @syntax-fg;\n@syntax-cursor-color: @syntax-accent;\n@syntax-selection-color: lighten(@syntax-background-color, 10%);\n@syntax-selection-flash-color: @syntax-accent;\n@syntax-background-color: @syntax-bg;\n\n// Guide colors\n@syntax-wrap-guide-color: @syntax-guide;\n@syntax-indent-guide-color: @syntax-guide;\n@syntax-invisible-character-color: @syntax-guide;\n\n// For find and replace markers\n@syntax-result-marker-color: fade(@syntax-accent, 24%);\n@syntax-result-marker-color-selected: @syntax-accent;\n\n// Gutter colors\n@syntax-gutter-text-color: @syntax-gutter;\n@syntax-gutter-text-color-selected: @syntax-fg;\n@syntax-gutter-background-color: @syntax-bg; // unused\n@syntax-gutter-background-color-selected: lighten(@syntax-bg, 2%);\n\n// Git colors - For git diff info. i.e. in the gutter\n@syntax-color-renamed: hsl(208, 100%, 60%);\n@syntax-color-added: hsl(150, 60%, 54%);\n@syntax-color-modified: hsl(40, 60%, 70%);\n@syntax-color-removed: hsl(0, 70%, 60%);\n\n// For language entity colors\n@syntax-color-variable: @hue-5;\n@syntax-color-constant: @hue-6;\n@syntax-color-property: @syntax-fg;\n@syntax-color-value: @syntax-fg;\n@syntax-color-function: @hue-2;\n@syntax-color-method: @hue-2;\n@syntax-color-class: @hue-6-2;\n@syntax-color-keyword: @hue-3;\n@syntax-color-tag: @hue-5;\n@syntax-color-attribute: @hue-6;\n@syntax-color-import: @hue-3;\n@syntax-color-snippet: @hue-4;\n\n\n// Custom Syntax Variables -----------------------------------\n// Don't use in packages\n\n@syntax-cursor-line: hsla(@syntax-hue, 100%, 80%, .04); // needs to be semi-transparent to show search results\n\n@syntax-deprecated-fg: darken(@syntax-color-modified, 50%);\n@syntax-deprecated-bg: @syntax-color-modified;\n@syntax-illegal-fg: white;\n@syntax-illegal-bg: @syntax-color-removed;\n","digest":"27d6d6b87eb3e97ba0e8ef0abb31464437901513"},"node_modules/one-dark-syntax/styles/syntax/_base.less":{"content":"// Language syntax highlighting\n\n.syntax--comment {\n color: @mono-3;\n font-style: italic;\n\n .syntax--markup.syntax--link {\n color: @mono-3;\n }\n}\n\n.syntax--entity {\n\n &.syntax--name.syntax--type {\n color: @hue-6-2;\n }\n\n &.syntax--other.syntax--inherited-class {\n color: @hue-4;\n }\n}\n\n.syntax--keyword {\n color: @hue-3;\n\n &.syntax--control {\n color: @hue-3;\n }\n\n &.syntax--operator {\n color: @mono-1;\n }\n\n &.syntax--other.syntax--special-method {\n color: @hue-2;\n }\n\n &.syntax--other.syntax--unit {\n color: @hue-6;\n }\n}\n\n.syntax--storage {\n color: @hue-3;\n\n &.syntax--type {\n &.syntax--annotation,\n &.syntax--primitive {\n color: @hue-3;\n }\n }\n\n &.syntax--modifier {\n &.syntax--package,\n &.syntax--import {\n color: @mono-1;\n }\n }\n}\n\n.syntax--constant {\n color: @hue-6;\n\n &.syntax--variable {\n color: @hue-6;\n }\n\n &.syntax--character.syntax--escape {\n color: @hue-1;\n }\n\n &.syntax--numeric {\n color: @hue-6;\n }\n\n &.syntax--other.syntax--color {\n color: @hue-1;\n }\n\n &.syntax--other.syntax--symbol {\n color: @hue-1;\n }\n}\n\n.syntax--variable {\n color: @hue-5;\n\n &.syntax--interpolation {\n color: @hue-5-2;\n }\n\n &.syntax--parameter {\n color: @mono-1;\n }\n}\n\n.syntax--string {\n color: @hue-4;\n\n\n &.syntax--regexp {\n color: @hue-1;\n\n .syntax--source.syntax--ruby.syntax--embedded {\n color: @hue-6-2;\n }\n }\n\n &.syntax--other.syntax--link {\n color: @hue-5;\n }\n}\n\n.syntax--punctuation {\n &.syntax--definition {\n &.syntax--comment {\n color: @mono-3;\n }\n\n &.syntax--method-parameters,\n &.syntax--function-parameters,\n &.syntax--parameters,\n &.syntax--separator,\n &.syntax--seperator,\n &.syntax--array {\n color: @mono-1;\n }\n\n &.syntax--heading,\n &.syntax--identity {\n color: @hue-2;\n }\n\n &.syntax--bold {\n color: @hue-6-2;\n font-weight: bold;\n }\n\n &.syntax--italic {\n color: @hue-3;\n font-style: italic;\n }\n }\n\n &.syntax--section {\n &.syntax--embedded {\n color: @hue-5-2;\n }\n\n &.syntax--method,\n &.syntax--class,\n &.syntax--inner-class {\n color: @mono-1;\n }\n }\n}\n\n.syntax--support {\n &.syntax--class {\n color: @hue-6-2;\n }\n\n &.syntax--type {\n color: @hue-1;\n }\n\n &.syntax--function {\n color: @hue-1;\n\n &.syntax--any-method {\n color: @hue-2;\n }\n }\n}\n\n.syntax--entity {\n &.syntax--name.syntax--function {\n color: @hue-2;\n }\n\n &.syntax--name.syntax--class,\n &.syntax--name.syntax--type.syntax--class {\n color: @hue-6-2;\n }\n\n &.syntax--name.syntax--section {\n color: @hue-2;\n }\n\n &.syntax--name.syntax--tag {\n color: @hue-5;\n }\n\n &.syntax--other.syntax--attribute-name {\n color: @hue-6;\n\n &.syntax--id {\n color: @hue-2;\n }\n }\n}\n\n.syntax--meta {\n &.syntax--class {\n color: @hue-6-2;\n\n &.syntax--body {\n color: @mono-1;\n }\n }\n\n &.syntax--method-call,\n &.syntax--method {\n color: @mono-1;\n }\n\n &.syntax--definition {\n &.syntax--variable {\n color: @hue-5;\n }\n }\n\n &.syntax--link {\n color: @hue-6;\n }\n\n &.syntax--require {\n color: @hue-2;\n }\n\n &.syntax--selector {\n color: @hue-3;\n }\n\n &.syntax--separator {\n background-color: #373b41;\n color: @mono-1;\n }\n\n &.syntax--tag {\n color: @mono-1;\n }\n}\n\n.syntax--underline {\n text-decoration: underline;\n}\n\n.syntax--none {\n color: @mono-1;\n}\n\n.syntax--invalid {\n &.syntax--deprecated {\n color: @syntax-deprecated-fg !important;\n background-color: @syntax-deprecated-bg !important;\n }\n &.syntax--illegal {\n color: @syntax-illegal-fg !important;\n background-color: @syntax-illegal-bg !important;\n }\n}\n\n// Languages -------------------------------------------------\n\n.syntax--markup {\n &.syntax--bold {\n color: @hue-6;\n font-weight: bold;\n }\n\n &.syntax--changed {\n color: @hue-3;\n }\n\n &.syntax--deleted {\n color: @hue-5;\n }\n\n &.syntax--italic {\n color: @hue-3;\n font-style: italic;\n }\n\n &.syntax--heading {\n color: @hue-5;\n\n .syntax--punctuation.syntax--definition.syntax--heading {\n color: @hue-2;\n }\n }\n\n &.syntax--link {\n color: @hue-1;\n }\n\n &.syntax--inserted {\n color: @hue-4;\n }\n\n &.syntax--quote {\n color: @hue-6;\n }\n\n &.syntax--raw {\n color: @hue-4;\n }\n}\n","digest":"1b75db9c051ef98291f571966e03d51afb2586b3"},"node_modules/one-dark-syntax/styles/syntax/c.less":{"content":".syntax--source.syntax--c {\n .syntax--keyword.syntax--operator {\n color: @hue-3;\n }\n}\n","digest":"ad63462d9a7352e4cd1f4ec52ea6daced57a2e51"},"node_modules/one-dark-syntax/styles/syntax/cpp.less":{"content":".syntax--source.syntax--cpp {\n .syntax--keyword.syntax--operator {\n color: @hue-3;\n }\n}\n","digest":"3832ba5f453df1e76fee01bea74dbfd67d606c43"},"node_modules/one-dark-syntax/styles/syntax/cs.less":{"content":".syntax--source.syntax--cs {\n .syntax--keyword.syntax--operator {\n color: @hue-3;\n }\n}\n","digest":"c92e873b912bb6f727365589722e17220a862b65"},"node_modules/one-dark-syntax/styles/syntax/css.less":{"content":".syntax--source.syntax--css {\n // highlight properties/values if they are supported\n .syntax--property-name,\n .syntax--property-value {\n color: @mono-2;\n &.syntax--support {\n color: @mono-1;\n }\n }\n}\n","digest":"16298135832131cbf568bb0869c4019725fb5d3c"},"node_modules/one-dark-syntax/styles/syntax/elixir.less":{"content":".syntax--source.syntax--elixir {\n .syntax--source.syntax--embedded.syntax--source {\n color: @mono-1;\n }\n .syntax--constant.syntax--language,\n .syntax--constant.syntax--numeric,\n .syntax--constant.syntax--definition {\n color: @hue-2;\n }\n .syntax--variable.syntax--definition,\n .syntax--variable.syntax--anonymous{\n color: @hue-3;\n }\n .syntax--quoted{\n color: @hue-4;\n }\n .syntax--keyword.syntax--special-method,\n .syntax--embedded.syntax--section,\n .syntax--embedded.syntax--source.syntax--empty, {\n color: @hue-5;\n }\n .syntax--readwrite.syntax--module {\n .syntax--punctuation {\n color: @hue-5;\n }\n }\n .syntax--regexp.syntax--section,\n .syntax--regexp.syntax--string {\n color: @hue-5-2;\n }\n .syntax--separator,\n .syntax--keyword.syntax--operator {\n color: @hue-6;\n }\n .syntax--variable.syntax--constant {\n color: @hue-6-2;\n }\n .syntax--array,\n .syntax--scope,\n .syntax--section {\n color: @mono-2;\n }\n}\n","digest":"9c7a58879463690306239be47060f7f9ea80b85a"},"node_modules/one-dark-syntax/styles/syntax/gfm.less":{"content":".syntax--source.syntax--gfm {\n .syntax--markup {\n -webkit-font-smoothing: auto;\n }\n\n .syntax--link .syntax--entity {\n color: @hue-2;\n }\n}\n","digest":"c2da438ee70805f1b45524468243c2d97e711640"},"node_modules/one-dark-syntax/styles/syntax/go.less":{"content":".syntax--source.syntax--go {\n .syntax--storage.syntax--type.syntax--string {\n color: @hue-3;\n }\n}\n","digest":"a268ce9af009eaed960a681895dfdbb02c7e84a7"},"node_modules/one-dark-syntax/styles/syntax/ini.less":{"content":".syntax--source.syntax--ini {\n .syntax--keyword.syntax--other.syntax--definition.syntax--ini {\n color: @hue-5;\n }\n}\n","digest":"de894a7575d3add3eb4cc450e548334a674c2c43"},"node_modules/one-dark-syntax/styles/syntax/java.less":{"content":".syntax--source.syntax--java {\n .syntax--storage {\n &.syntax--modifier.syntax--import {\n color: @hue-6-2;\n }\n\n &.syntax--type {\n color: @hue-6-2;\n }\n }\n .syntax--keyword.syntax--operator.syntax--instanceof {\n color: @hue-3;\n }\n}\n\n.syntax--source.syntax--java-properties {\n .syntax--meta.syntax--key-pair {\n color: @hue-5;\n\n & > .syntax--punctuation {\n color: @mono-1;\n }\n }\n}\n","digest":"9d10d34cea50c9e3dfc500dcb00e671a564249ef"},"node_modules/one-dark-syntax/styles/syntax/javascript.less":{"content":".syntax--source.syntax--js {\n .syntax--keyword.syntax--operator {\n color: @hue-1;\n\n // keywords are definded in https://github.com/atom/language-javascript/blob/master/grammars/javascript.cson\n // search \"instanceof\" for location\n &.syntax--delete,\n &.syntax--in,\n &.syntax--of,\n &.syntax--instanceof,\n &.syntax--new,\n &.syntax--typeof,\n &.syntax--void {\n color: @hue-3;\n }\n }\n}\n","digest":"9f2eb70092bdcddf40197f0a028f437a5ee065d6"},"node_modules/one-dark-syntax/styles/syntax/json.less":{"content":".syntax--source.syntax--json {\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json {\n & > .syntax--string.syntax--quoted.syntax--json {\n & > .syntax--punctuation.syntax--string {\n color: @hue-5;\n }\n color: @hue-5;\n }\n }\n\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json, .syntax--meta.syntax--structure.syntax--array.syntax--json {\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json,\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json > .syntax--punctuation {\n color: @hue-4;\n }\n\n & > .syntax--constant.syntax--language.syntax--json {\n color: @hue-1;\n }\n }\n}\n","digest":"8e5404389094e83bbfce993ff30de61c512d2e80"},"node_modules/one-dark-syntax/styles/syntax/python.less":{"content":".syntax--source.syntax--python {\n .syntax--keyword.syntax--operator.syntax--logical.syntax--python {\n color: @hue-3;\n }\n\n .syntax--variable.syntax--parameter {\n color: @hue-6;\n }\n}\n","digest":"b2a19ed1dfdc9938fe3714e8903f756e3a61dd8e"},"node_modules/one-dark-syntax/styles/syntax/ruby.less":{"content":".syntax--source.syntax--ruby {\n .syntax--constant.syntax--other.syntax--symbol > .syntax--punctuation {\n color: inherit;\n }\n}\n","digest":"7037880883b3ecfe2912904f9e403271d293a4f0"},"node_modules/one-light-syntax/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Atom Syntax Theme: One\n\n@import \"styles/syntax-variables.less\";\n\n@import \"styles/editor.less\";\n\n@import \"styles/syntax/_base.less\";\n@import \"styles/syntax/c.less\";\n@import \"styles/syntax/cpp.less\";\n@import \"styles/syntax/cs.less\";\n@import \"styles/syntax/css.less\";\n@import \"styles/syntax/elixir.less\";\n@import \"styles/syntax/gfm.less\";\n@import \"styles/syntax/go.less\";\n@import \"styles/syntax/ini.less\";\n@import \"styles/syntax/java.less\";\n@import \"styles/syntax/javascript.less\";\n@import \"styles/syntax/json.less\";\n@import \"styles/syntax/ruby.less\";\n@import \"styles/syntax/python.less\";\n","digest":"a916d5c6a5b8d6ea37a60088aa6e4eaab8e86ff2"},"node_modules/one-light-syntax/styles/colors.less":{"content":"\n// Config -----------------------------------\n@syntax-hue: 230;\n@syntax-saturation: 1%;\n@syntax-brightness: 98%;\n\n\n// Monochrome -----------------------------------\n@mono-1: hsl(@syntax-hue, 8%, 24%);\n@mono-2: hsl(@syntax-hue, 6%, 44%);\n@mono-3: hsl(@syntax-hue, 4%, 64%);\n\n// Colors -----------------------------------\n@hue-1: hsl(198, 99%, 37%); // <-cyan\n@hue-2: hsl(221, 87%, 60%); // <-blue\n@hue-3: hsl(301, 63%, 40%); // <-purple\n@hue-4: hsl(119, 34%, 47%); // <-green\n\n@hue-5: hsl( 5, 74%, 59%); // <-red 1\n@hue-5-2: hsl(344, 84%, 43%); // <-red 2\n\n@hue-6: hsl(41, 99%, 30%); // <-orange 1\n@hue-6-2: hsl(41, 99%, 38%); // <-orange 2\n\n\n// Base colors -----------------------------------\n@syntax-fg: @mono-1;\n@syntax-bg: hsl(@syntax-hue, @syntax-saturation, @syntax-brightness);\n@syntax-gutter: darken(@syntax-bg, 36%);\n@syntax-guide: fade(@syntax-fg, 20%);\n@syntax-accent: hsl(@syntax-hue, 100%, 66% );\n","digest":"6e53c2e7473d04130f2592930c3470ed86daffdf"},"node_modules/one-light-syntax/styles/editor.less":{"content":"// Editor styles (background, gutter, guides)\n\natom-text-editor {\n background-color: @syntax-background-color;\n color: @syntax-text-color;\n\n .line.cursor-line {\n background-color: @syntax-cursor-line;\n }\n\n .invisible {\n color: @syntax-text-color;\n }\n\n .cursor {\n border-left: 2px solid @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .bracket-matcher .region {\n border-bottom: 1px solid @syntax-cursor-color;\n box-sizing: border-box;\n }\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .wrap-guide {\n background-color: @syntax-wrap-guide-color;\n }\n\n // find + replace\n .find-result .region.region.region,\n .current-result .region.region.region {\n border-radius: 2px;\n background-color: @syntax-result-marker-color;\n transition: border-color .4s;\n }\n .find-result .region.region.region {\n border: 2px solid transparent;\n }\n .current-result .region.region.region {\n border: 2px solid @syntax-result-marker-color-selected;\n transition-duration: .1s;\n }\n\n .gutter {\n .line-number {\n color: @syntax-gutter-text-color;\n -webkit-font-smoothing: antialiased;\n\n &.cursor-line {\n color: @syntax-gutter-text-color-selected;\n background-color: @syntax-gutter-background-color-selected;\n }\n &.cursor-line-no-selection {\n background-color: transparent;\n }\n\n .icon-right {\n color: @syntax-text-color;\n }\n }\n\n &:not(.git-diff-icon) .line-number.git-line-removed {\n &.git-line-removed::before {\n bottom: -3px;\n }\n &::after {\n content: \"\";\n position: absolute;\n left: 0px;\n bottom: 0px;\n width: 25px;\n border-bottom: 1px dotted fade(@syntax-color-removed, 50%);\n pointer-events: none;\n }\n }\n }\n\n .gutter .line-number.folded,\n .gutter .line-number:after,\n .fold-marker:after {\n color: @syntax-gutter-text-color-selected;\n }\n}\n","digest":"25e308c6140f46096a1f31e987ac6add9bf130f4"},"node_modules/one-light-syntax/styles/syntax-variables.less":{"content":"@import \"colors.less\";\n\n// Official Syntax Variables -----------------------------------\n\n// General colors\n@syntax-text-color: @syntax-fg;\n@syntax-cursor-color: @syntax-accent;\n@syntax-selection-color: darken(@syntax-bg, 8%);\n@syntax-selection-flash-color: @syntax-accent;\n@syntax-background-color: @syntax-bg;\n\n// Guide colors\n@syntax-wrap-guide-color: @syntax-guide;\n@syntax-indent-guide-color: @syntax-guide;\n@syntax-invisible-character-color: @syntax-guide;\n\n// For find and replace markers\n@syntax-result-marker-color: fade(@syntax-accent, 20%);\n@syntax-result-marker-color-selected: @syntax-accent;\n\n// Gutter colors -----------------------------------\n@syntax-gutter-text-color: @syntax-gutter;\n@syntax-gutter-text-color-selected: @syntax-fg;\n@syntax-gutter-background-color: @syntax-bg; // unused\n@syntax-gutter-background-color-selected: darken(@syntax-bg, 3%);\n\n// Git colors - For git diff info. i.e. in the gutter\n@syntax-color-renamed: hsl(208, 100%, 66%);\n@syntax-color-added: hsl(132, 60%, 44%);\n@syntax-color-modified: hsl( 40, 90%, 50%);\n@syntax-color-removed: hsl( 0, 100%, 54%);\n\n// For language entity colors\n@syntax-color-variable: @hue-5;\n@syntax-color-constant: @hue-6;\n@syntax-color-property: @syntax-fg;\n@syntax-color-value: @syntax-fg;\n@syntax-color-function: @hue-2;\n@syntax-color-method: @hue-2;\n@syntax-color-class: @hue-6-2;\n@syntax-color-keyword: @hue-3;\n@syntax-color-tag: @hue-5;\n@syntax-color-attribute: @hue-6;\n@syntax-color-import: @hue-3;\n@syntax-color-snippet: @hue-4;\n\n\n// Custom Syntax Variables -----------------------------------\n// Don't use in packages\n\n@syntax-cursor-line: fade(@syntax-fg, 5%); // needs to be semi-transparent to show search results\n\n@syntax-deprecated-fg: darken(@syntax-color-modified, 50%);\n@syntax-deprecated-bg: @syntax-color-modified;\n@syntax-illegal-fg: white;\n@syntax-illegal-bg: @syntax-color-removed;\n","digest":"53a4849f954b408b31964142490fe356135f4b41"},"node_modules/one-light-syntax/styles/syntax/_base.less":{"content":"// Language syntax highlighting\n\n.syntax--comment {\n color: @mono-3;\n font-style: italic;\n\n .syntax--markup.syntax--link {\n color: @mono-3;\n }\n}\n\n.syntax--entity {\n\n &.syntax--name.syntax--type {\n color: @hue-6-2;\n }\n\n &.syntax--other.syntax--inherited-class {\n color: @hue-4;\n }\n}\n\n.syntax--keyword {\n color: @hue-3;\n\n &.syntax--control {\n color: @hue-3;\n }\n\n &.syntax--operator {\n color: @mono-1;\n }\n\n &.syntax--other.syntax--special-method {\n color: @hue-2;\n }\n\n &.syntax--other.syntax--unit {\n color: @hue-6;\n }\n}\n\n.syntax--storage {\n color: @hue-3;\n\n &.syntax--type {\n &.syntax--annotation,\n &.syntax--primitive {\n color: @hue-3;\n }\n }\n\n &.syntax--modifier {\n &.syntax--package,\n &.syntax--import {\n color: @mono-1;\n }\n }\n}\n\n.syntax--constant {\n color: @hue-6;\n\n &.syntax--variable {\n color: @hue-6;\n }\n\n &.syntax--character.syntax--escape {\n color: @hue-1;\n }\n\n &.syntax--numeric {\n color: @hue-6;\n }\n\n &.syntax--other.syntax--color {\n color: @hue-1;\n }\n\n &.syntax--other.syntax--symbol {\n color: @hue-1;\n }\n}\n\n.syntax--variable {\n color: @hue-5;\n\n &.syntax--interpolation {\n color: @hue-5-2;\n }\n\n &.syntax--parameter {\n color: @mono-1;\n }\n}\n\n.syntax--string {\n color: @hue-4;\n\n &.syntax--regexp {\n color: @hue-1;\n\n .syntax--source.syntax--ruby.syntax--embedded {\n color: @hue-6-2;\n }\n }\n\n &.syntax--other.syntax--link {\n color: @hue-5;\n }\n}\n\n.syntax--punctuation {\n &.syntax--definition {\n &.syntax--comment {\n color: @mono-3;\n }\n\n &.syntax--method-parameters,\n &.syntax--function-parameters,\n &.syntax--parameters,\n &.syntax--separator,\n &.syntax--seperator,\n &.syntax--array {\n color: @mono-1;\n }\n\n &.syntax--heading,\n &.syntax--identity {\n color: @hue-2;\n }\n\n &.syntax--bold {\n color: @hue-6-2;\n font-weight: bold;\n }\n\n &.syntax--italic {\n color: @hue-3;\n font-style: italic;\n }\n }\n\n &.syntax--section {\n &.syntax--embedded {\n color: @hue-5-2;\n }\n\n &.syntax--method,\n &.syntax--class,\n &.syntax--inner-class {\n color: @mono-1;\n }\n }\n}\n\n.syntax--support {\n &.syntax--class {\n color: @hue-6-2;\n }\n\n &.syntax--type {\n color: @hue-1;\n }\n\n &.syntax--function {\n color: @hue-1;\n\n &.syntax--any-method {\n color: @hue-2;\n }\n }\n}\n\n.syntax--entity {\n &.syntax--name.syntax--function {\n color: @hue-2;\n }\n\n &.syntax--name.syntax--class,\n &.syntax--name.syntax--type.syntax--class {\n color: @hue-6-2;\n }\n\n &.syntax--name.syntax--section {\n color: @hue-2;\n }\n\n &.syntax--name.syntax--tag {\n color: @hue-5;\n }\n\n &.syntax--other.syntax--attribute-name {\n color: @hue-6;\n\n &.syntax--id {\n color: @hue-2;\n }\n }\n}\n\n.syntax--meta {\n &.syntax--class {\n color: @hue-6-2;\n\n &.syntax--body {\n color: @mono-1;\n }\n }\n\n &.syntax--method-call,\n &.syntax--method {\n color: @mono-1;\n }\n\n &.syntax--definition {\n &.syntax--variable {\n color: @hue-5;\n }\n }\n\n &.syntax--link {\n color: @hue-6;\n }\n\n &.syntax--require {\n color: @hue-2;\n }\n\n &.syntax--selector {\n color: @hue-3;\n }\n\n &.syntax--separator {\n background-color: #373b41;\n color: @mono-1;\n }\n\n &.syntax--tag {\n color: @mono-1;\n }\n}\n\n.syntax--underline {\n text-decoration: underline;\n}\n\n.syntax--none {\n color: @mono-1;\n}\n\n.syntax--invalid {\n &.syntax--deprecated {\n color: @syntax-deprecated-fg !important;\n background-color: @syntax-deprecated-bg !important;\n }\n &.syntax--illegal {\n color: @syntax-illegal-fg !important;\n background-color: @syntax-illegal-bg !important;\n }\n}\n\n// Languages -------------------------------------------------\n\n.syntax--markup {\n &.syntax--bold {\n color: @hue-6;\n font-weight: bold;\n }\n\n &.syntax--changed {\n color: @hue-3;\n }\n\n &.syntax--deleted {\n color: @hue-5;\n }\n\n &.syntax--italic {\n color: @hue-3;\n font-style: italic;\n }\n\n &.syntax--heading {\n color: @hue-5;\n\n .syntax--punctuation.syntax--definition.syntax--heading {\n color: @hue-2;\n }\n }\n\n &.syntax--link {\n color: @hue-1;\n }\n\n &.syntax--inserted {\n color: @hue-4;\n }\n\n &.syntax--quote {\n color: @hue-6;\n }\n\n &.syntax--raw {\n color: @hue-4;\n }\n}\n","digest":"d6152f31c84aa1185203c63ad7423d854c5eab0c"},"node_modules/one-light-syntax/styles/syntax/c.less":{"content":".syntax--source.syntax--c {\n .syntax--keyword.syntax--operator {\n color: @hue-3;\n }\n}\n","digest":"ad63462d9a7352e4cd1f4ec52ea6daced57a2e51"},"node_modules/one-light-syntax/styles/syntax/cpp.less":{"content":".syntax--source.syntax--cpp {\n .syntax--keyword.syntax--operator {\n color: @hue-3;\n }\n}\n","digest":"3832ba5f453df1e76fee01bea74dbfd67d606c43"},"node_modules/one-light-syntax/styles/syntax/cs.less":{"content":".syntax--source.syntax--cs {\n .syntax--keyword.syntax--operator {\n color: @hue-3;\n }\n}\n","digest":"c92e873b912bb6f727365589722e17220a862b65"},"node_modules/one-light-syntax/styles/syntax/css.less":{"content":".syntax--source.syntax--css {\n\n // highlight properties/values if they are supported\n .syntax--property-name,\n .syntax--property-value {\n color: @mono-2;\n &.syntax--support {\n color: @mono-1;\n }\n }\n\n}\n","digest":"d805d108e69c6469f8f840aa50d3ee9725164563"},"node_modules/one-light-syntax/styles/syntax/elixir.less":{"content":".syntax--source.syntax--elixir {\n .syntax--source.syntax--embedded.syntax--source {\n color: @mono-1;\n }\n .syntax--constant.syntax--language,\n .syntax--constant.syntax--numeric,\n .syntax--constant.syntax--definition {\n color: @hue-2;\n }\n .syntax--variable.syntax--definition,\n .syntax--variable.syntax--anonymous{\n color: @hue-3;\n }\n .syntax--quoted{\n color: @hue-4;\n }\n .syntax--keyword.syntax--special-method,\n .syntax--embedded.syntax--section,\n .syntax--embedded.syntax--source.syntax--empty, {\n color: @hue-5;\n }\n .syntax--readwrite.syntax--module {\n .syntax--punctuation {\n color: @hue-5;\n }\n }\n .syntax--regexp.syntax--section,\n .syntax--regexp.syntax--string {\n color: @hue-5-2;\n }\n .syntax--separator,\n .syntax--keyword.syntax--operator {\n color: @hue-6;\n }\n .syntax--variable.syntax--constant {\n color: @hue-6-2;\n }\n .syntax--array,\n .syntax--scope,\n .syntax--section {\n color: @mono-2;\n }\n}\n","digest":"9c7a58879463690306239be47060f7f9ea80b85a"},"node_modules/one-light-syntax/styles/syntax/gfm.less":{"content":".syntax--source.syntax--gfm {\n .syntax--markup {\n -webkit-font-smoothing: auto;\n }\n\n .syntax--link .syntax--entity {\n color: @hue-2;\n }\n}\n","digest":"c2da438ee70805f1b45524468243c2d97e711640"},"node_modules/one-light-syntax/styles/syntax/go.less":{"content":".syntax--source.syntax--go {\n .syntax--storage.syntax--type.syntax--string {\n color: @hue-3;\n }\n}\n","digest":"a268ce9af009eaed960a681895dfdbb02c7e84a7"},"node_modules/one-light-syntax/styles/syntax/ini.less":{"content":".syntax--source.syntax--ini {\n .syntax--keyword.syntax--other.syntax--definition.syntax--ini {\n color: @hue-5;\n }\n}\n","digest":"de894a7575d3add3eb4cc450e548334a674c2c43"},"node_modules/one-light-syntax/styles/syntax/java.less":{"content":".syntax--source.syntax--java {\n .syntax--storage {\n &.syntax--modifier.syntax--import {\n color: @hue-6-2;\n }\n\n &.syntax--type {\n color: @hue-6-2;\n }\n }\n .syntax--keyword.syntax--operator.syntax--instanceof {\n color: @hue-3;\n }\n}\n\n.syntax--source.syntax--java-properties {\n .syntax--meta.syntax--key-pair {\n color: @hue-5;\n\n & > .syntax--punctuation {\n color: @mono-1;\n }\n }\n}\n","digest":"9d10d34cea50c9e3dfc500dcb00e671a564249ef"},"node_modules/one-light-syntax/styles/syntax/javascript.less":{"content":".syntax--source.syntax--js {\n .syntax--keyword.syntax--operator {\n color: @hue-1;\n\n // keywords are definded in https://github.com/atom/language-javascript/blob/master/grammars/javascript.cson\n // search \"instanceof\" for location\n &.syntax--delete,\n &.syntax--in,\n &.syntax--of,\n &.syntax--instanceof,\n &.syntax--new,\n &.syntax--typeof,\n &.syntax--void {\n color: @hue-3;\n }\n }\n}\n","digest":"9f2eb70092bdcddf40197f0a028f437a5ee065d6"},"node_modules/one-light-syntax/styles/syntax/json.less":{"content":".syntax--source.syntax--json {\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json {\n & > .syntax--string.syntax--quoted.syntax--json {\n & > .syntax--punctuation.syntax--string {\n color: @hue-5;\n }\n color: @hue-5;\n }\n }\n\n .syntax--meta.syntax--structure.syntax--dictionary.syntax--json,\n .syntax--meta.syntax--structure.syntax--array.syntax--json {\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json,\n & > .syntax--value.syntax--json > .syntax--string.syntax--quoted.syntax--json > .syntax--punctuation {\n color: @hue-4;\n }\n\n & > .syntax--constant.syntax--language.syntax--json {\n color: @hue-1;\n }\n }\n}\n","digest":"b2e4cb0fef7a06bfc26a30a299f82650552363a4"},"node_modules/one-light-syntax/styles/syntax/python.less":{"content":".syntax--source.syntax--python {\n .syntax--keyword.syntax--operator.syntax--logical.syntax--python {\n color: @hue-3;\n }\n\n .syntax--variable.syntax--parameter {\n color: @hue-6;\n }\n}\n","digest":"b2a19ed1dfdc9938fe3714e8903f756e3a61dd8e"},"node_modules/one-light-syntax/styles/syntax/ruby.less":{"content":".syntax--source.syntax--ruby {\n .syntax--constant.syntax--other.syntax--symbol > .syntax--punctuation {\n color: inherit;\n }\n}\n","digest":"7037880883b3ecfe2912904f9e403271d293a4f0"},"node_modules/solarized-dark-syntax/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Solarized Syntax Theme\n\n@import \"styles/syntax-variables.less\";\n\n// Editor\n@import \"styles/editor.less\";\n\n// Languages\n@import \"styles/syntax/_base.less\";\n@import \"styles/syntax/c.less\";\n@import \"styles/syntax/coffee.less\";\n@import \"styles/syntax/css.less\";\n@import \"styles/syntax/go.less\";\n@import \"styles/syntax/java.less\";\n@import \"styles/syntax/javascript.less\";\n@import \"styles/syntax/markdown.less\";\n@import \"styles/syntax/markup.less\";\n@import \"styles/syntax/php.less\";\n@import \"styles/syntax/python.less\";\n@import \"styles/syntax/ruby.less\";\n@import \"styles/syntax/scala.less\";\n","digest":"a71910d7884e81ff362d6059ef1b0440c81f9223"},"node_modules/solarized-dark-syntax/styles/colors.less":{"content":"\n// Solarized color scheme\n// http://ethanschoonover.com/solarized#the-values\n\n// Background/Foreground Tones\n@base03: #002b36;\n@base02: #073642;\n\n// Content Tones\n@base01: #586e75;\n@base00: #657b83;\n@base0: #839496;\n@base1: #93a1a1;\n\n// Background/Foreground Tones\n@base2: #eee8d5;\n@base3: #fdf6e3;\n\n// Accent Colors\n@yellow: #b58900;\n@orange: #cb4b16;\n@red: #dc322f;\n@magenta: #d33682;\n@violet: #6c71c4;\n@blue: #268bd2;\n@cyan: #2aa198;\n@green: #859900;\n","digest":"b88cf362fd45cb5f470f88ca4bf885ed33b48652"},"node_modules/solarized-dark-syntax/styles/editor.less":{"content":"atom-text-editor {\n color: @syntax-text-color;\n background-color: @syntax-background-color;\n\n .gutter {\n color: @syntax-gutter-text-color;\n background-color: @syntax-gutter-background-color;\n\n .line-number {\n &.cursor-line {\n background-color: @syntax-gutter-background-color-selected;\n }\n }\n }\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .cursor {\n border-color: @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .fold-marker:after,\n .gutter .line-number.folded {\n color: @magenta;\n }\n\n .bracket-matcher .region {\n border-color: @magenta;\n }\n}\n","digest":"ecdc841891ddd65c51150615e73e588bad414e4e"},"node_modules/solarized-dark-syntax/styles/syntax-variables.less":{"content":"@import \"colors.less\";\n\n// This defines all syntax variables that syntax themes must implement when they\n// include a syntax-variables.less file.\n\n// General colors\n@syntax-text-color: @base0;\n@syntax-cursor-color: @base3;\n@syntax-selection-color: lighten(@base02, 1%);\n@syntax-selection-flash-color: @base1;\n@syntax-background-color: @base03;\n\n// Guide colors\n@syntax-wrap-guide-color: lighten(@base02, 6%);\n@syntax-indent-guide-color: lighten(@base02, 6%);\n@syntax-invisible-character-color: lighten(@base02, 6%);\n\n// For find and replace markers\n@syntax-result-marker-color: @cyan;\n@syntax-result-marker-color-selected: @base3;\n\n// Gutter colors\n@syntax-gutter-text-color: @base0;\n@syntax-gutter-text-color-selected: @syntax-gutter-text-color;\n@syntax-gutter-background-color: @base02;\n@syntax-gutter-background-color-selected: lighten(@base02, 3%);\n\n// For git diff info. i.e. in the gutter\n@syntax-color-added: @green;\n@syntax-color-renamed: @blue;\n@syntax-color-modified: @yellow;\n@syntax-color-removed: @red;\n\n// For language entity colors\n@syntax-color-variable: @blue;\n@syntax-color-constant: @yellow;\n@syntax-color-property: @yellow;\n@syntax-color-value: @cyan;\n@syntax-color-function: @blue;\n@syntax-color-method: @blue;\n@syntax-color-class: @blue;\n@syntax-color-keyword: @green;\n@syntax-color-tag: @blue;\n@syntax-color-attribute: @syntax-comment-color;\n@syntax-color-import: @red;\n@syntax-color-snippet: @syntax-color-keyword;\n\n\n// Custom variables\n// Warning: Don't use in packages\n\n@syntax-comment-color: @base01;\n@syntax-subtle-color: @base00;\n@syntax-emphasized-color: @base1;\n","digest":"3df6c20791fd3108a466d0b306dfaf78d5eb9797"},"node_modules/solarized-dark-syntax/styles/syntax/_base.less":{"content":"\n.syntax--comment {\n color: @syntax-comment-color;\n font-style: italic;\n\n .syntax--markup.syntax--link {\n color: @syntax-comment-color;\n }\n}\n\n.syntax--string {\n color: @cyan;\n &.syntax--regexp {\n color: @red;\n }\n}\n\n.syntax--constant {\n &.syntax--numeric {\n color: @magenta;\n }\n &.syntax--language {\n color: @yellow;\n }\n &.syntax--character,\n &.syntax--other {\n color: @orange;\n }\n}\n\n.syntax--variable {\n color: @blue;\n}\n\n.syntax--keyword {\n color: @green;\n}\n\n.syntax--storage {\n color: @green;\n}\n\n.syntax--entity {\n &.syntax--name {\n &.syntax--class,\n &.syntax--type,\n &.syntax--function {\n color: @blue;\n }\n }\n &.syntax--other.syntax--attribute-name {\n color: @syntax-subtle-color;\n }\n}\n\n.syntax--support {\n &.syntax--function {\n color: @blue;\n &.syntax--builtin {\n color: @green;\n }\n }\n &.syntax--type,\n &.syntax--class {\n color: @green;\n }\n}\n\n.syntax--tag {\n &.syntax--entity.syntax--name {\n color: @blue;\n }\n &.syntax--punctuation.syntax--definition {\n &.syntax--html,\n &.syntax--begin,\n &.syntax--end {\n color: @syntax-comment-color;\n }\n }\n}\n\n.syntax--invalid {\n &.syntax--deprecated {\n color: @yellow;\n text-decoration: underline;\n }\n &.syntax--illegal {\n color: @red;\n text-decoration: underline;\n }\n}\n\n.syntax--none {\n color: @syntax-text-color;\n}\n","digest":"b7422f8dafb69db51d42f6afa850388e558f4456"},"node_modules/solarized-dark-syntax/styles/syntax/c.less":{"content":".syntax--source.syntax--c,\n.syntax--source.syntax--cpp {\n .syntax--meta.syntax--preprocessor {\n color: @red;\n }\n .syntax--keyword.syntax--control.syntax--directive {\n color: @orange;\n }\n .syntax--punctuation.syntax--string {\n color: @cyan;\n }\n .syntax--constant {\n color: @orange;\n\n &.syntax--numeric, &.syntax--language.syntax--c {\n color: @cyan;\n }\n }\n .syntax--storage {\n color: @yellow;\n }\n .syntax--entity {\n color: @syntax-text-color;\n\n &.syntax--name.syntax--function.syntax--preprocessor {\n color: @red;\n }\n }\n .syntax--support.syntax--type {\n color: @yellow;\n\n &.syntax--posix-reserved {\n color: @syntax-text-color;\n }\n }\n .syntax--variable {\n &.syntax--other.syntax--dot-access {\n color: @syntax-text-color;\n }\n &.syntax--parameter.syntax--preprocessor {\n color: @red;\n }\n }\n}\n","digest":"839d65ac623e01b74b7e42269590d9feff8fa65c"},"node_modules/solarized-dark-syntax/styles/syntax/coffee.less":{"content":".syntax--source.syntax--coffee {\n .syntax--support.syntax--class {\n color: @green;\n }\n\n .syntax--variable,\n .syntax--entity.syntax--name.syntax--function,\n .syntax--entity.syntax--name.syntax--class {\n color: @blue;\n }\n .syntax--variable.syntax--parameter.syntax--function {\n color: @syntax-text-color;\n }\n .syntax--variable.syntax--other.syntax--readwrite {\n color: @green;\n }\n\n .syntax--storage.syntax--type.syntax--function {\n color: @green;\n }\n\n .syntax--entity.syntax--name {\n color: @syntax-text-color;\n }\n\n .syntax--meta.syntax--brace {\n &.syntax--round,\n &.syntax--square {\n color: @syntax-text-color;\n }\n }\n .syntax--meta.syntax--delimiter {\n color: @syntax-text-color;\n }\n\n .syntax--storage.syntax--type.syntax--class {\n color: @green;\n }\n\n .syntax--punctuation.syntax--terminator {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--section.syntax--embedded {\n color: @red;\n }\n .syntax--embedded.syntax--source {\n color: @syntax-text-color;\n }\n\n .syntax--constant.syntax--numeric {\n color: @magenta;\n }\n\n .syntax--constant.syntax--language.syntax--boolean {\n color: @yellow;\n }\n}\n","digest":"2736764cbf69f7adaac92819ca676cbce669b54b"},"node_modules/solarized-dark-syntax/styles/syntax/css.less":{"content":".syntax--source.syntax--css {\n\n .syntax--punctuation {\n &.syntax--separator,\n &.syntax--terminator {\n color: @syntax-text-color;\n }\n &.syntax--property-list.syntax--begin,\n &.syntax--property-list.syntax--end {\n color: @red;\n }\n &.syntax--section.syntax--function {\n color: @cyan;\n }\n }\n\n .syntax--entity.syntax--name {\n color: @green;\n }\n .syntax--attribute-name.syntax--class,\n .syntax--id {\n color: @blue;\n }\n .syntax--pseudo-element,\n .syntax--pseudo-class {\n color: @orange;\n }\n\n .syntax--property-value {\n color: @cyan;\n }\n .syntax--constant.syntax--numeric {\n color: @cyan;\n .syntax--unit {\n color: @cyan;\n }\n }\n .syntax--rgb-value {\n color: @cyan;\n }\n .syntax--support.syntax--constant {\n color: @cyan;\n &.syntax--media {\n color: @red;\n }\n }\n\n .syntax--keyword.syntax--important {\n color: @red;\n }\n\n}\n\n\n// Less/Sass should have their own files,\n// but for just a single override, here should be fine too\n\n.syntax--source.syntax--less,\n.syntax--source.syntax--scss {\n .syntax--keyword.syntax--unit {\n color: @cyan;\n }\n}\n","digest":"b6fac27e3e87d879c7bc7c62b4fb67106cdbb3c7"},"node_modules/solarized-dark-syntax/styles/syntax/go.less":{"content":".syntax--source.syntax--go {\n\n .syntax--operator {\n color: @syntax-text-color;\n &.syntax--assignment {\n color: @green;\n }\n }\n\n}\n","digest":"2a8e5aaf48786eb497de8fc9bf8f1003a8ece54b"},"node_modules/solarized-dark-syntax/styles/syntax/java.less":{"content":".syntax--source.syntax--java {\n .syntax--keyword.syntax--operator{\n color:@green;\n }\n .syntax--keyword.syntax--import{\n color: @orange;\n }\n .syntax--storage.syntax--modifier.syntax--import{\n color: @syntax-comment-color;\n }\n .syntax--meta.syntax--class{\n .syntax--storage.syntax--modifier{\n color: @yellow;\n }\n .syntax--meta.syntax--class.syntax--identifier{\n .syntax--entity.syntax--name.syntax--type.syntax--class{\n color: @blue;\n }\n }\n }\n .syntax--storage.syntax--type.syntax--primitive.syntax--array{\n color:@green;\n }\n .syntax--constant.syntax--numeric{\n color:@magenta;\n }\n .syntax--constant.syntax--other{\n color:@orange;\n }\n .syntax--storage.syntax--type{\n color:@green;\n }\n .syntax--meta.syntax--method-call{\n //@ibocon: method parameter's color\n color:@red;\n //@ibocon: method and variable use different hightlight\n .syntax--meta.syntax--method{\n color:@violet;\n }\n .syntax--punctuation.syntax--definition.syntax--seperator.syntax--parameter{\n color:@green;\n }\n }\n .syntax--punctuation.syntax--definition.syntax--method-parameters{\n color: @syntax-emphasized-color;\n }\n}\n","digest":"7ed0d0331bfcc2ca5bfa85dddaa51e547df18593"},"node_modules/solarized-dark-syntax/styles/syntax/javascript.less":{"content":".syntax--source.syntax--js {\n .syntax--constant {\n color: @green;\n }\n\n .syntax--comma {\n color: @syntax-text-color;\n }\n\n .syntax--support.syntax--class {\n color: @green;\n }\n\n .syntax--entity.syntax--name.syntax--type {\n color: @yellow;\n }\n .syntax--entity.syntax--name {\n color: @syntax-text-color;\n }\n\n .syntax--meta.syntax--brace {\n color: @syntax-text-color;\n }\n\n .syntax--keyword {\n color: @syntax-text-color;\n }\n .syntax--keyword.syntax--operator.syntax--new {\n color: @green;\n }\n .syntax--keyword.syntax--control {\n color: @green;\n }\n .syntax--keyword.syntax--control.syntax--regexp {\n color: @cyan;\n }\n\n .syntax--variable {\n color: @blue;\n }\n .syntax--variable.syntax--parameter {\n color: @syntax-text-color;\n }\n\n .syntax--regexp {\n color: @cyan;\n }\n\n .syntax--support.syntax--function {\n color: @violet;\n }\n .syntax--support.syntax--constant {\n color: @syntax-text-color;\n }\n\n .syntax--constant.syntax--numeric {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--terminator.syntax--statement {\n color: @syntax-text-color;\n }\n\n .syntax--meta.syntax--delimiter.syntax--method.syntax--period {\n color: @syntax-text-color;\n }\n .syntax--meta.syntax--brace.syntax--square {\n color: @blue;\n }\n .syntax--meta.syntax--brace.syntax--curly {\n color: @blue;\n }\n .syntax--string.syntax--quoted.syntax--template {\n .syntax--embedded.syntax--source {\n color: @syntax-text-color;\n & > .syntax--embedded.syntax--punctuation {\n color: @red;\n }\n }\n }\n &.syntax--embedded .syntax--entity.syntax--name.syntax--tag {\n color: @blue;\n }\n}\n.syntax--source.syntax--js.syntax--jsx {\n .syntax--entity.syntax--name.syntax--tag {\n color: @blue;\n }\n}\n","digest":"532bc7043760ab4871e93837007d95efa23dcb23"},"node_modules/solarized-dark-syntax/styles/syntax/markdown.less":{"content":".syntax--gfm {\n .syntax--link .syntax--entity {\n color: @violet;\n }\n\n .syntax--list {\n &.syntax--ordered {\n color: @green;\n }\n &.syntax--unordered {\n color: @yellow;\n }\n }\n\n .syntax--raw {\n font-style: italic;\n }\n\n &.syntax--support {\n color:@syntax-comment-color;\n &.syntax--quote {\n color: @violet;\n }\n }\n}\n","digest":"6a33df58ae2d94dc7b7e7264a72d39942acc0c9e"},"node_modules/solarized-dark-syntax/styles/syntax/markup.less":{"content":".syntax--markup {\n\n &.syntax--bold {\n font-weight: bold;\n }\n &.syntax--italic {\n font-style: italic;\n }\n\n &.syntax--heading {\n color: @blue;\n }\n\n &.syntax--link {\n color: @cyan;\n }\n\n &.syntax--deleted {\n color: @red;\n }\n\n &.syntax--changed {\n color: @yellow;\n }\n\n &.syntax--inserted {\n color: @cyan;\n }\n\n}\n","digest":"2b1893b8d2de8d42b582efbd90608833a8e26fdc"},"node_modules/solarized-dark-syntax/styles/syntax/php.less":{"content":".syntax--source.syntax--php {\n .syntax--storage {\n &.syntax--type {\n &.syntax--class {\n color: @yellow;\n }\n &.syntax--function {\n color: @orange;\n }\n }\n &.syntax--modifier {\n color: @yellow;\n }\n }\n .syntax--entity {\n &.syntax--name {\n &.syntax--type.syntax--class {\n color: @syntax-text-color;\n }\n &.syntax--function {\n color: @syntax-text-color;\n }\n }\n &.syntax--other {\n color: @syntax-text-color;\n }\n }\n .syntax--variable {\n color: @blue;\n }\n .syntax--punctuation.syntax--definition {\n color: @syntax-text-color;\n &.syntax--comment {\n color: @syntax-comment-color;\n }\n &.syntax--array {\n color: @red;\n }\n &.syntax--string {\n color: @syntax-text-color;\n }\n &.syntax--variable {\n color: @green;\n }\n }\n .syntax--support.syntax--function {\n &.syntax--construct {\n color: @yellow;\n }\n &.syntax--array {\n color: @green;\n }\n }\n .syntax--keyword {\n &.syntax--operator {\n &.syntax--class {\n color: @yellow;\n }\n &.syntax--assignment {\n color: @green;\n }\n }\n &.syntax--other {\n color: @red;\n }\n }\n}\n","digest":"4c57fce11fabe63d59d4e0d964477d7a54ee8f83"},"node_modules/solarized-dark-syntax/styles/syntax/python.less":{"content":".syntax--source.syntax--python {\n .syntax--entity {\n color: @syntax-text-color;\n\n &.syntax--name {\n color: @blue;\n }\n &.syntax--other {\n color: @blue;\n }\n }\n\n .syntax--function {\n color: @blue;\n\n &.syntax--magic {\n color: @blue;\n }\n }\n\n .syntax--punctuation.syntax--string {\n color: @cyan;\n }\n .syntax--keyword {\n &.syntax--operator {\n color: @syntax-text-color;\n &.syntax--quantifier {\n color: @cyan;\n }\n &.syntax--logical {\n color: @green;\n }\n }\n &.syntax--control.syntax--import {\n color: @orange;\n }\n &.syntax--other {\n color: @green;\n }\n }\n .syntax--constant {\n &.syntax--language {\n color: @blue;\n }\n &.syntax--character {\n color: @cyan;\n }\n &.syntax--other {\n color: @red;\n }\n }\n\n .syntax--entity.syntax--name.syntax--type.syntax--class {\n color: @blue;\n }\n .syntax--variable {\n color: @syntax-text-color;\n }\n .syntax--support {\n &.syntax--function.syntax--builtin {\n color: @blue;\n }\n &.syntax--type {\n &.syntax--exception.syntax--python {\n color: @yellow;\n }\n &.syntax--python {\n color: @blue;\n }\n }\n }\n .syntax--storage.syntax--type.syntax--string {\n color: @cyan;\n }\n\n .syntax--storage.syntax--type.syntax--class {\n color: @green;\n &.syntax--todo {\n color: @magenta;\n }\n }\n\n .syntax--storage.syntax--type.syntax--function {\n color: @green;\n }\n\n .syntax--punctuation.syntax--definition.syntax--parameters {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--section.syntax--function.syntax--begin {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--separator.syntax--parameters {\n color: @syntax-text-color;\n }\n\n\n}\n","digest":"33190f5b629f061f135b7bbd8be544b6c06ed4f8"},"node_modules/solarized-dark-syntax/styles/syntax/ruby.less":{"content":".syntax--source.syntax--ruby {\n\n .syntax--meta.syntax--embedded {\n .syntax--punctuation.syntax--section {\n color: @red;\n }\n }\n .syntax--punctuation.syntax--definition {\n color: @syntax-text-color;\n &.syntax--string {\n color: @red;\n }\n }\n .syntax--punctuation.syntax--definition.syntax--comment {\n color: @syntax-comment-color;\n }\n .syntax--entity.syntax--inherited-class {\n color: @yellow;\n }\n .syntax--variable {\n &.syntax--parameter {\n color: @syntax-text-color;\n }\n }\n .syntax--variable.syntax--constant {\n color: @yellow;\n }\n .syntax--constant.syntax--boolean {\n color: @cyan;\n }\n .syntax--instance {\n .syntax--punctuation.syntax--definition {\n color: @blue;\n }\n }\n .syntax--class {\n color: @yellow;\n &.syntax--control {\n color: @syntax-text-color;\n }\n }\n .syntax--module {\n color: @yellow;\n }\n .syntax--require {\n .syntax--keyword.syntax--other.syntax--special-method {\n color: @orange;\n }\n }\n .syntax--keyword.syntax--other.syntax--special-method {\n color: @orange;\n }\n .syntax--keyword.syntax--other {\n color: @green;\n }\n .syntax--keyword.syntax--control {\n color: @green;\n }\n .syntax--keyword.syntax--operator {\n color: @syntax-text-color;\n }\n .syntax--special-method {\n color: @blue;\n }\n .syntax--symbol {\n color: @cyan;\n .syntax--punctuation.syntax--definition {\n color: @cyan;\n }\n }\n .syntax--hashkey {\n color: @red;\n .syntax--punctuation.syntax--definition {\n color: @red;\n }\n }\n .syntax--string.syntax--regexp {\n color: @red;\n }\n .syntax--todo {\n color: @magenta;\n }\n .syntax--variable.syntax--ruby.syntax--global {\n color: @blue;\n .syntax--punctuation {\n color: @blue;\n }\n }\n .syntax--variable.syntax--block {\n color: @blue;\n }\n .syntax--variable.syntax--self {\n color: @cyan;\n }\n .syntax--punctuation.syntax--separator {\n color: @syntax-text-color;\n }\n .syntax--numeric {\n color: @cyan;\n }\n .syntax--punctuation.syntax--section.syntax--regexp {\n color: @red;\n }\n .syntax--string.syntax--interpolated {\n color: @cyan;\n }\n .syntax--string.syntax--interpolated {\n .syntax--embedded.syntax--line.syntax--ruby {\n .syntax--punctuation {\n .syntax--source.syntax--ruby {\n color: @red;\n }\n }\n .syntax--source.syntax--ruby {\n .syntax--punctuation.syntax--array,\n .syntax--punctuation.syntax--function {\n color: @syntax-text-color;\n }\n color: @syntax-text-color;\n }\n }\n }\n .syntax--support.syntax--function {\n color: @syntax-text-color;\n }\n .syntax--support.syntax--function.syntax--kernel {\n color: @green;\n }\n}\n","digest":"cfe9b7caebcae391298920cc1ad3ed4f945a1219"},"node_modules/solarized-dark-syntax/styles/syntax/scala.less":{"content":".syntax--source.syntax--scala {\n .syntax--variable {\n color: @syntax-emphasized-color;\n }\n\n .syntax--declaration {\n color: @syntax-emphasized-color;\n font-weight: bold;\n }\n .syntax--comparison {\n color: @syntax-emphasized-color;\n }\n .syntax--class, .syntax--type {\n color: @yellow;\n }\n .syntax--val {\n font-weight: normal;\n }\n .syntax--variable {\n font-weight: bold;\n }\n .syntax--variable.syntax--parameter {\n color: @violet;\n font-weight: normal;\n }\n .syntax--control.syntax--flow {\n color: @syntax-emphasized-color;\n font-weight: bold;\n }\n .syntax--constant.syntax--language {\n color: @syntax-emphasized-color;\n font-weight: bold;\n }\n .syntax--function.syntax--declaration {\n color: @violet;\n }\n .syntax--modifier.syntax--other {\n font-weight: bold;\n }\n .syntax--package {\n color: @syntax-emphasized-color;\n }\n .syntax--variable.syntax--import {\n font-weight: normal;\n }\n\n .syntax--type {\n .syntax--bounds, .syntax--class {\n color: @violet;\n }\n }\n\n .syntax--documentation {\n :not(.syntax--embedded) {\n // out of scope ?\n // https://github.syntax--com/atom/link\n &.syntax--link.syntax--entity {\n color: @blue;\n text-decoration: underline;\n }\n .syntax--class, .syntax--parameter {\n color: @syntax-emphasized-color;\n }\n .syntax--description {\n color: @syntax-comment-color;\n }\n }\n }\n\n .syntax--embedded {\n color: darken(@syntax-emphasized-color, 15%);\n\n // so we dont confused it with normal expressions\n font-style: italic;\n .syntax--margin, .syntax--delimiters {\n font-style: normal;\n }\n }\n}\n","digest":"6edaa134daab31cecf6827ac74b9ee9653d42dab"},"node_modules/solarized-light-syntax/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Solarized Syntax Theme\n\n@import \"styles/syntax-variables.less\";\n\n// Editor\n@import \"styles/editor.less\";\n\n// Languages\n@import \"styles/syntax/_base.less\";\n@import \"styles/syntax/c.less\";\n@import \"styles/syntax/coffee.less\";\n@import \"styles/syntax/css.less\";\n@import \"styles/syntax/go.less\";\n@import \"styles/syntax/java.less\";\n@import \"styles/syntax/javascript.less\";\n@import \"styles/syntax/markdown.less\";\n@import \"styles/syntax/markup.less\";\n@import \"styles/syntax/php.less\";\n@import \"styles/syntax/python.less\";\n@import \"styles/syntax/ruby.less\";\n@import \"styles/syntax/scala.less\";\n","digest":"a71910d7884e81ff362d6059ef1b0440c81f9223"},"node_modules/solarized-light-syntax/styles/colors.less":{"content":"\n// Solarized color scheme\n// http://ethanschoonover.com/solarized#the-values\n\n// Background/Foreground Tones\n@base03: #002b36;\n@base02: #073642;\n\n// Content Tones\n@base01: #586e75;\n@base00: #657b83;\n@base0: #839496;\n@base1: #93a1a1;\n\n// Background/Foreground Tones\n@base2: #eee8d5;\n@base3: #fdf6e3;\n\n// Accent Colors\n@yellow: #b58900;\n@orange: #cb4b16;\n@red: #dc322f;\n@magenta: #d33682;\n@violet: #6c71c4;\n@blue: #268bd2;\n@cyan: #2aa198;\n@green: #859900;\n","digest":"b88cf362fd45cb5f470f88ca4bf885ed33b48652"},"node_modules/solarized-light-syntax/styles/editor.less":{"content":"atom-text-editor {\n color: @syntax-text-color;\n background-color: @syntax-background-color;\n\n .gutter {\n color: @syntax-gutter-text-color;\n background-color: @syntax-gutter-background-color;\n\n .line-number {\n &.cursor-line {\n background-color: @syntax-gutter-background-color-selected;\n }\n }\n }\n\n .invisible-character {\n color: @syntax-invisible-character-color;\n }\n\n .indent-guide {\n color: @syntax-indent-guide-color;\n }\n\n .cursor {\n border-color: @syntax-cursor-color;\n }\n\n .selection .region {\n background-color: @syntax-selection-color;\n }\n\n .fold-marker:after,\n .gutter .line-number.folded {\n color: @magenta;\n }\n\n .bracket-matcher .region {\n border-color: @magenta;\n }\n}\n","digest":"ecdc841891ddd65c51150615e73e588bad414e4e"},"node_modules/solarized-light-syntax/styles/syntax-variables.less":{"content":"@import \"colors.less\";\n\n// This defines all syntax variables that syntax themes must implement when they\n// include a syntax-variables.less file.\n\n// General colors\n@syntax-text-color: @base00;\n@syntax-cursor-color: @base03;\n@syntax-selection-color: @base2;\n@syntax-selection-flash-color: @base0;\n@syntax-background-color: @base3;\n\n// Guide colors\n@syntax-wrap-guide-color: darken(@base2, 12%);\n@syntax-indent-guide-color: darken(@base2, 12%);\n@syntax-invisible-character-color: darken(@base2, 12%);\n\n// For find and replace markers\n@syntax-result-marker-color: @base1;\n@syntax-result-marker-color-selected: @base03;\n\n// Gutter colors\n@syntax-gutter-text-color: @base00;\n@syntax-gutter-text-color-selected: @base01;\n@syntax-gutter-background-color: @base2;\n@syntax-gutter-background-color-selected: darken(@syntax-gutter-background-color, 4%);\n\n// For git diff info. i.e. in the gutter\n@syntax-color-added: @green;\n@syntax-color-renamed: @blue;\n@syntax-color-modified: @yellow;\n@syntax-color-removed: @red;\n\n// For language entity colors\n@syntax-color-variable: @blue;\n@syntax-color-constant: @yellow;\n@syntax-color-property: @yellow;\n@syntax-color-value: @cyan;\n@syntax-color-function: @blue;\n@syntax-color-method: @blue;\n@syntax-color-class: @blue;\n@syntax-color-keyword: @green;\n@syntax-color-tag: @blue;\n@syntax-color-attribute: @syntax-comment-color;\n@syntax-color-import: @red;\n@syntax-color-snippet: @syntax-color-keyword;\n\n\n// Custom variables\n// Warning: Don't use in packages\n\n@syntax-comment-color: @base1;\n@syntax-subtle-color: @base00;\n@syntax-emphasized-color: @base01;\n","digest":"06ab8a6bd7281bba5402f79a968fafdada8e91c6"},"node_modules/solarized-light-syntax/styles/syntax/_base.less":{"content":"\n.syntax--comment {\n color: @syntax-comment-color;\n font-style: italic;\n\n .syntax--markup.syntax--link {\n color: @syntax-comment-color;\n }\n}\n\n.syntax--string {\n color: @cyan;\n &.syntax--regexp {\n color: @red;\n }\n}\n\n.syntax--constant {\n &.syntax--numeric {\n color: @magenta;\n }\n &.syntax--language {\n color: @yellow;\n }\n &.syntax--character,\n &.syntax--other {\n color: @orange;\n }\n}\n\n.syntax--variable {\n color: @blue;\n}\n\n.syntax--keyword {\n color: @green;\n}\n\n.syntax--storage {\n color: @green;\n}\n\n.syntax--entity {\n &.syntax--name {\n &.syntax--class,\n &.syntax--type,\n &.syntax--function {\n color: @blue;\n }\n }\n &.syntax--other.syntax--attribute-name {\n color: @syntax-subtle-color;\n }\n}\n\n.syntax--support {\n &.syntax--function {\n color: @blue;\n &.syntax--builtin {\n color: @green;\n }\n }\n &.syntax--type,\n &.syntax--class {\n color: @green;\n }\n}\n\n.syntax--tag {\n &.syntax--entity.syntax--name {\n color: @blue;\n }\n &.syntax--punctuation.syntax--definition {\n &.syntax--html,\n &.syntax--begin,\n &.syntax--end {\n color: @syntax-comment-color;\n }\n }\n}\n\n.syntax--invalid {\n &.syntax--deprecated {\n color: @yellow;\n text-decoration: underline;\n }\n &.syntax--illegal {\n color: @red;\n text-decoration: underline;\n }\n}\n\n.syntax--none {\n color: @syntax-text-color;\n}\n","digest":"b7422f8dafb69db51d42f6afa850388e558f4456"},"node_modules/solarized-light-syntax/styles/syntax/c.less":{"content":".syntax--source.syntax--c,\n.syntax--source.syntax--cpp {\n .syntax--meta.syntax--preprocessor {\n color: @red;\n }\n .syntax--keyword.syntax--control.syntax--directive {\n color: @orange;\n }\n .syntax--punctuation.syntax--string {\n color: @cyan;\n }\n .syntax--constant {\n color: @orange;\n\n &.syntax--numeric, &.syntax--language.syntax--c {\n color: @cyan;\n }\n }\n .syntax--storage {\n color: @yellow;\n }\n .syntax--entity {\n color: @syntax-text-color;\n\n &.syntax--name.syntax--function.syntax--preprocessor {\n color: @red;\n }\n }\n .syntax--support.syntax--type {\n color: @yellow;\n\n &.syntax--posix-reserved {\n color: @syntax-text-color;\n }\n }\n .syntax--variable {\n &.syntax--other.syntax--dot-access {\n color: @syntax-text-color;\n }\n &.syntax--parameter.syntax--preprocessor {\n color: @red;\n }\n }\n}\n","digest":"839d65ac623e01b74b7e42269590d9feff8fa65c"},"node_modules/solarized-light-syntax/styles/syntax/coffee.less":{"content":".syntax--source.syntax--coffee {\n .syntax--support.syntax--class {\n color: @green;\n }\n\n .syntax--variable,\n .syntax--entity.syntax--name.syntax--function,\n .syntax--entity.syntax--name.syntax--class {\n color: @blue;\n }\n .syntax--variable.syntax--parameter.syntax--function {\n color: @syntax-text-color;\n }\n .syntax--variable.syntax--other.syntax--readwrite {\n color: @green;\n }\n\n .syntax--storage.syntax--type.syntax--function {\n color: @green;\n }\n\n .syntax--entity.syntax--name {\n color: @syntax-text-color;\n }\n\n .syntax--meta.syntax--brace {\n &.syntax--round,\n &.syntax--square {\n color: @syntax-text-color;\n }\n }\n .syntax--meta.syntax--delimiter {\n color: @syntax-text-color;\n }\n\n .syntax--storage.syntax--type.syntax--class {\n color: @green;\n }\n\n .syntax--punctuation.syntax--terminator {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--section.syntax--embedded {\n color: @red;\n }\n .syntax--embedded.syntax--source {\n color: @syntax-text-color;\n }\n\n .syntax--constant.syntax--numeric {\n color: @magenta;\n }\n\n .syntax--constant.syntax--language.syntax--boolean {\n color: @yellow;\n }\n}\n","digest":"2736764cbf69f7adaac92819ca676cbce669b54b"},"node_modules/solarized-light-syntax/styles/syntax/css.less":{"content":".syntax--source.syntax--css {\n\n .syntax--punctuation {\n &.syntax--separator,\n &.syntax--terminator {\n color: @syntax-text-color;\n }\n &.syntax--property-list.syntax--begin,\n &.syntax--property-list.syntax--end {\n color: @red;\n }\n &.syntax--section.syntax--function {\n color: @cyan;\n }\n }\n\n .syntax--entity.syntax--name {\n color: @green;\n }\n .syntax--attribute-name.syntax--class,\n .syntax--id {\n color: @blue;\n }\n .syntax--pseudo-element,\n .syntax--pseudo-class {\n color: @orange;\n }\n\n .syntax--property-value {\n color: @cyan;\n }\n .syntax--constant.syntax--numeric {\n color: @cyan;\n .syntax--unit {\n color: @cyan;\n }\n }\n .syntax--rgb-value {\n color: @cyan;\n }\n .syntax--support.syntax--constant {\n color: @cyan;\n &.syntax--media {\n color: @red;\n }\n }\n\n .syntax--keyword.syntax--important {\n color: @red;\n }\n\n}\n\n\n// Less/Sass should have their own files,\n// but for just a single override, here should be fine too\n\n.syntax--source.syntax--less,\n.syntax--source.syntax--scss {\n .syntax--keyword.syntax--unit {\n color: @cyan;\n }\n}\n","digest":"b6fac27e3e87d879c7bc7c62b4fb67106cdbb3c7"},"node_modules/solarized-light-syntax/styles/syntax/go.less":{"content":".syntax--source.syntax--go {\n\n .syntax--operator {\n color: @syntax-text-color;\n &.syntax--assignment {\n color: @green;\n }\n }\n\n}\n","digest":"2a8e5aaf48786eb497de8fc9bf8f1003a8ece54b"},"node_modules/solarized-light-syntax/styles/syntax/java.less":{"content":".syntax--source.syntax--java {\n .syntax--keyword.syntax--operator{\n color:@green;\n }\n .syntax--keyword.syntax--import{\n color: @orange;\n }\n .syntax--storage.syntax--modifier.syntax--import{\n color: @syntax-comment-color;\n }\n .syntax--meta.syntax--class{\n .syntax--storage.syntax--modifier{\n color: @yellow;\n }\n .syntax--meta.syntax--class.syntax--identifier{\n .syntax--entity.syntax--name.syntax--type.syntax--class{\n color: @blue;\n }\n }\n }\n .syntax--storage.syntax--type.syntax--primitive.syntax--array{\n color:@green;\n }\n .syntax--constant.syntax--numeric{\n color:@magenta;\n }\n .syntax--constant.syntax--other{\n color:@orange;\n }\n .syntax--storage.syntax--type{\n color:@green;\n }\n .syntax--meta.syntax--method-call{\n //@ibocon: method parameter's color\n color:@red;\n //@ibocon: method and variable use different hightlight\n .syntax--meta.syntax--method{\n color:@violet;\n }\n .syntax--punctuation.syntax--definition.syntax--seperator.syntax--parameter{\n color:@green;\n }\n }\n .syntax--punctuation.syntax--definition.syntax--method-parameters{\n color: @syntax-emphasized-color;\n }\n}\n","digest":"7ed0d0331bfcc2ca5bfa85dddaa51e547df18593"},"node_modules/solarized-light-syntax/styles/syntax/javascript.less":{"content":".syntax--source.syntax--js {\n .syntax--constant {\n color: @green;\n }\n\n .syntax--comma {\n color: @syntax-text-color;\n }\n\n .syntax--support.syntax--class {\n color: @green;\n }\n\n .syntax--entity.syntax--name.syntax--type {\n color: @yellow;\n }\n .syntax--entity.syntax--name {\n color: @syntax-text-color;\n }\n\n .syntax--meta.syntax--brace {\n color: @syntax-text-color;\n }\n\n .syntax--keyword {\n color: @syntax-text-color;\n }\n .syntax--keyword.syntax--operator.syntax--new {\n color: @green;\n }\n .syntax--keyword.syntax--control {\n color: @green;\n }\n .syntax--keyword.syntax--control.syntax--regexp {\n color: @cyan;\n }\n\n .syntax--variable {\n color: @blue;\n }\n .syntax--variable.syntax--parameter {\n color: @syntax-text-color;\n }\n\n .syntax--regexp {\n color: @cyan;\n }\n\n .syntax--support.syntax--function {\n color: @violet;\n }\n .syntax--support.syntax--constant {\n color: @syntax-text-color;\n }\n\n .syntax--constant.syntax--numeric {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--terminator.syntax--statement {\n color: @syntax-text-color;\n }\n\n .syntax--meta.syntax--delimiter.syntax--method.syntax--period {\n color: @syntax-text-color;\n }\n .syntax--meta.syntax--brace.syntax--square {\n color: @blue;\n }\n .syntax--meta.syntax--brace.syntax--curly {\n color: @blue;\n }\n .syntax--string.syntax--quoted.syntax--template {\n .syntax--embedded.syntax--source {\n color: @syntax-text-color;\n & > .syntax--embedded.syntax--punctuation {\n color: @red;\n }\n }\n }\n &.syntax--embedded .syntax--entity.syntax--name.syntax--tag {\n color: @blue;\n }\n}\n.syntax--source.syntax--js.syntax--jsx {\n .syntax--entity.syntax--name.syntax--tag {\n color: @blue;\n }\n}\n","digest":"532bc7043760ab4871e93837007d95efa23dcb23"},"node_modules/solarized-light-syntax/styles/syntax/markdown.less":{"content":".syntax--gfm {\n .syntax--link .syntax--entity {\n color: @violet;\n }\n\n .syntax--list {\n &.syntax--ordered {\n color: @green;\n }\n &.syntax--unordered {\n color: @yellow;\n }\n }\n\n .syntax--raw {\n font-style: italic;\n }\n\n &.syntax--support {\n color:@syntax-comment-color;\n &.syntax--quote {\n color: @violet;\n }\n }\n}\n","digest":"6a33df58ae2d94dc7b7e7264a72d39942acc0c9e"},"node_modules/solarized-light-syntax/styles/syntax/markup.less":{"content":".syntax--markup {\n\n &.syntax--bold {\n font-weight: bold;\n }\n &.syntax--italic {\n font-style: italic;\n }\n\n &.syntax--heading {\n color: @blue;\n }\n\n &.syntax--link {\n color: @cyan;\n }\n\n &.syntax--deleted {\n color: @red;\n }\n\n &.syntax--changed {\n color: @yellow;\n }\n\n &.syntax--inserted {\n color: @cyan;\n }\n\n}\n","digest":"2b1893b8d2de8d42b582efbd90608833a8e26fdc"},"node_modules/solarized-light-syntax/styles/syntax/php.less":{"content":".syntax--source.syntax--php {\n .syntax--storage {\n &.syntax--type {\n &.syntax--class {\n color: @yellow;\n }\n &.syntax--function {\n color: @orange;\n }\n }\n &.syntax--modifier {\n color: @yellow;\n }\n }\n .syntax--entity {\n &.syntax--name {\n &.syntax--type.syntax--class {\n color: @syntax-text-color;\n }\n &.syntax--function {\n color: @syntax-text-color;\n }\n }\n &.syntax--other {\n color: @syntax-text-color;\n }\n }\n .syntax--variable {\n color: @blue;\n }\n .syntax--punctuation.syntax--definition {\n color: @syntax-text-color;\n &.syntax--comment {\n color: @syntax-comment-color;\n }\n &.syntax--array {\n color: @red;\n }\n &.syntax--string {\n color: @syntax-text-color;\n }\n &.syntax--variable {\n color: @green;\n }\n }\n .syntax--support.syntax--function {\n &.syntax--construct {\n color: @yellow;\n }\n &.syntax--array {\n color: @green;\n }\n }\n .syntax--keyword {\n &.syntax--operator {\n &.syntax--class {\n color: @yellow;\n }\n &.syntax--assignment {\n color: @green;\n }\n }\n &.syntax--other {\n color: @red;\n }\n }\n}\n","digest":"4c57fce11fabe63d59d4e0d964477d7a54ee8f83"},"node_modules/solarized-light-syntax/styles/syntax/python.less":{"content":".syntax--source.syntax--python {\n .syntax--entity {\n color: @syntax-text-color;\n\n &.syntax--name {\n color: @blue;\n }\n &.syntax--other {\n color: @blue;\n }\n }\n\n .syntax--function {\n color: @blue;\n\n &.syntax--magic {\n color: @blue;\n }\n }\n\n .syntax--punctuation.syntax--string {\n color: @cyan;\n }\n .syntax--keyword {\n &.syntax--operator {\n color: @syntax-text-color;\n &.syntax--quantifier {\n color: @cyan;\n }\n &.syntax--logical {\n color: @green;\n }\n }\n &.syntax--control.syntax--import {\n color: @orange;\n }\n &.syntax--other {\n color: @green;\n }\n }\n .syntax--constant {\n &.syntax--language {\n color: @blue;\n }\n &.syntax--character {\n color: @cyan;\n }\n &.syntax--other {\n color: @red;\n }\n }\n\n .syntax--entity.syntax--name.syntax--type.syntax--class {\n color: @blue;\n }\n .syntax--variable {\n color: @syntax-text-color;\n }\n .syntax--support {\n &.syntax--function.syntax--builtin {\n color: @blue;\n }\n &.syntax--type {\n &.syntax--exception.syntax--python {\n color: @yellow;\n }\n &.syntax--python {\n color: @blue;\n }\n }\n }\n .syntax--storage.syntax--type.syntax--string {\n color: @cyan;\n }\n\n .syntax--storage.syntax--type.syntax--class {\n color: @green;\n &.syntax--todo {\n color: @magenta;\n }\n }\n\n .syntax--storage.syntax--type.syntax--function {\n color: @green;\n }\n\n .syntax--punctuation.syntax--definition.syntax--parameters {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--section.syntax--function.syntax--begin {\n color: @syntax-text-color;\n }\n\n .syntax--punctuation.syntax--separator.syntax--parameters {\n color: @syntax-text-color;\n }\n\n\n}\n","digest":"33190f5b629f061f135b7bbd8be544b6c06ed4f8"},"node_modules/solarized-light-syntax/styles/syntax/ruby.less":{"content":".syntax--source.syntax--ruby {\n\n .syntax--meta.syntax--embedded {\n .syntax--punctuation.syntax--section {\n color: @red;\n }\n }\n .syntax--punctuation.syntax--definition {\n color: @syntax-text-color;\n &.syntax--string {\n color: @red;\n }\n }\n .syntax--punctuation.syntax--definition.syntax--comment {\n color: @syntax-comment-color;\n }\n .syntax--entity.syntax--inherited-class {\n color: @yellow;\n }\n .syntax--variable {\n &.syntax--parameter {\n color: @syntax-text-color;\n }\n }\n .syntax--variable.syntax--constant {\n color: @yellow;\n }\n .syntax--constant.syntax--boolean {\n color: @cyan;\n }\n .syntax--instance {\n .syntax--punctuation.syntax--definition {\n color: @blue;\n }\n }\n .syntax--class {\n color: @yellow;\n &.syntax--control {\n color: @syntax-text-color;\n }\n }\n .syntax--module {\n color: @yellow;\n }\n .syntax--require {\n .syntax--keyword.syntax--other.syntax--special-method {\n color: @orange;\n }\n }\n .syntax--keyword.syntax--other.syntax--special-method {\n color: @orange;\n }\n .syntax--keyword.syntax--other {\n color: @green;\n }\n .syntax--keyword.syntax--control {\n color: @green;\n }\n .syntax--keyword.syntax--operator {\n color: @syntax-text-color;\n }\n .syntax--special-method {\n color: @blue;\n }\n .syntax--symbol {\n color: @cyan;\n .syntax--punctuation.syntax--definition {\n color: @cyan;\n }\n }\n .syntax--hashkey {\n color: @red;\n .syntax--punctuation.syntax--definition {\n color: @red;\n }\n }\n .syntax--string.syntax--regexp {\n color: @red;\n }\n .syntax--todo {\n color: @magenta;\n }\n .syntax--variable.syntax--ruby.syntax--global {\n color: @blue;\n .syntax--punctuation {\n color: @blue;\n }\n }\n .syntax--variable.syntax--block {\n color: @blue;\n }\n .syntax--variable.syntax--self {\n color: @cyan;\n }\n .syntax--punctuation.syntax--separator {\n color: @syntax-text-color;\n }\n .syntax--numeric {\n color: @cyan;\n }\n .syntax--punctuation.syntax--section.syntax--regexp {\n color: @red;\n }\n .syntax--string.syntax--interpolated {\n color: @cyan;\n }\n .syntax--string.syntax--interpolated {\n .syntax--embedded.syntax--line.syntax--ruby {\n .syntax--punctuation {\n .syntax--source.syntax--ruby {\n color: @red;\n }\n }\n .syntax--source.syntax--ruby {\n .syntax--punctuation.syntax--array,\n .syntax--punctuation.syntax--function {\n color: @syntax-text-color;\n }\n color: @syntax-text-color;\n }\n }\n }\n .syntax--support.syntax--function {\n color: @syntax-text-color;\n }\n .syntax--support.syntax--function.syntax--kernel {\n color: @green;\n }\n}\n","digest":"cfe9b7caebcae391298920cc1ad3ed4f945a1219"},"node_modules/solarized-light-syntax/styles/syntax/scala.less":{"content":".syntax--source.syntax--scala {\n .syntax--variable {\n color: @syntax-emphasized-color;\n }\n\n .syntax--declaration {\n color: @syntax-emphasized-color;\n font-weight: bold;\n }\n .syntax--comparison {\n color: @syntax-emphasized-color;\n }\n .syntax--class, .syntax--type {\n color: @yellow;\n }\n .syntax--val {\n font-weight: normal;\n }\n .syntax--variable {\n font-weight: bold;\n }\n .syntax--variable.syntax--parameter {\n color: @violet;\n font-weight: normal;\n }\n .syntax--control.syntax--flow {\n color: @syntax-emphasized-color;\n font-weight: bold;\n }\n .syntax--constant.syntax--language {\n color: @syntax-emphasized-color;\n font-weight: bold;\n }\n .syntax--function.syntax--declaration {\n color: @violet;\n }\n .syntax--modifier.syntax--other {\n font-weight: bold;\n }\n .syntax--package {\n color: @syntax-emphasized-color;\n }\n .syntax--variable.syntax--import {\n font-weight: normal;\n }\n\n .syntax--type {\n .syntax--bounds, .syntax--class {\n color: @violet;\n }\n }\n\n .syntax--documentation {\n :not(.syntax--embedded) {\n // out of scope ?\n // https://github.syntax--com/atom/link\n &.syntax--link.syntax--entity {\n color: @blue;\n text-decoration: underline;\n }\n .syntax--class, .syntax--parameter {\n color: @syntax-emphasized-color;\n }\n .syntax--description {\n color: @syntax-comment-color;\n }\n }\n }\n\n .syntax--embedded {\n color: darken(@syntax-emphasized-color, 15%);\n\n // so we dont confused it with normal expressions\n font-style: italic;\n .syntax--margin, .syntax--delimiters {\n font-style: normal;\n }\n }\n}\n","digest":"6edaa134daab31cecf6827ac74b9ee9653d42dab"},"node_modules/atom-light-ui/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n@import \"styles/atom\";\n@import \"styles/utilities\";\n@import \"styles/text\";\n@import \"styles/git\";\n@import \"styles/sites\";\n@import \"styles/messages\";\n@import \"styles/progress\";\n@import \"styles/buttons\";\n@import \"styles/panels\";\n@import \"styles/panes\";\n@import \"styles/lists\";\n@import \"styles/overlays\";\n@import \"styles/editor\";\n@import \"styles/tabs\";\n@import \"styles/tooltips\";\n@import \"styles/tree-view\";\n","digest":"d25330939de17fc578686c2587d98d54c447a2d7"},"node_modules/atom-light-ui/styles/atom.less":{"content":"@import \"ui-variables\";\n\natom-workspace {\n background-color: @app-background-color;\n}\n\n.scrollbars-visible-always {\n ::-webkit-scrollbar {\n width: 10px;\n height: 10px;\n }\n\n ::-webkit-scrollbar-track,\n ::-webkit-scrollbar-corner {\n background: @scrollbar-background-color;\n }\n\n ::-webkit-scrollbar-thumb {\n background: @scrollbar-color;\n border-radius: 5px;\n\t\tbox-shadow: 0 0 1px white inset;\n }\n}\n","digest":"34f8850d50ad85ee0445f1c4b91efd2d227b9646"},"node_modules/atom-light-ui/styles/buttons.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n\n.btn-background (@color, @hover-color, @selected-color, @border-color, @text-color, @text-color-hover) {\n @border-shadow: inset 0 0 0 1px @border-color;\n @active-shadow: inset 0 3px 5px rgba(0, 0, 0, .125);\n color: @text-color;\n background-color: transparent;\n background-image: -webkit-linear-gradient(@color, darken(@color, 8%));\n box-shadow: @border-shadow;\n\n &:hover {\n color: @text-color-hover;\n background-image: -webkit-linear-gradient(@hover-color, darken(@hover-color, 8%));\n }\n &:active,\n &.selected:hover:active {\n box-shadow: @active-shadow, @border-shadow;\n }\n &.selected,\n &.selected:hover {\n color: @text-color-selected;\n box-shadow: inset 0 2px 5px rgba(0, 0, 0,.3), @border-shadow;\n text-shadow: 0 0 2px rgba(0, 0, 0, 0.3);\n background-image: -webkit-linear-gradient(darken(@selected-color, 8%), @selected-color);\n }\n &.selected:hover {\n box-shadow: @border-shadow;\n background-image: -webkit-linear-gradient(@selected-color, darken(@selected-color, 8%));\n }\n}\n\n.btn-variant (@color) {\n @bg: darken(@color, 10%);\n @hover: @color;\n @selected: @color;\n @border: fadeout(darken(@color, 20%), 50%);\n .btn-background(@bg, @hover, @selected, @border, @text-color-selected, @text-color-selected);\n}\n\n.btn {\n .btn-background(@button-background-color, @button-background-color-hover, @button-background-color-selected, @button-border-color, @text-color, @text-color-highlight);\n}\n\n.btn.btn-primary {\n .btn-variant(@background-color-info);\n}\n.btn.btn-info {\n .btn-variant(@background-color-info);\n}\n.btn.btn-success {\n .btn-variant(@background-color-success);\n}\n.btn.btn-warning {\n .btn-variant(@background-color-warning);\n}\n.btn.btn-error {\n .btn-variant(@background-color-error);\n}\n\n.btn-group > .btn {\n border: none;\n}\n","digest":"7aa58cf65c682c0342d3d7c8ae5eadc7b8cbf454"},"node_modules/atom-light-ui/styles/editor.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n\natom-text-editor[mini] {\n color: lighten(@text-color, 15%);\n background-color: darken(@input-background-color, 1%);\n border: 1px solid lighten(@input-border-color, 10%);\n\n box-shadow: inset 0 1px 1px rgba(0, 0, 0, .075);\n border-radius: @component-border-radius;\n padding-left: @component-padding/2;\n\n .cursor { border-color: #000; }\n .selection .region { background-color: rgba(0, 0, 0, .2); }\n .placeholder-text {\n color: lighten(@text-color-subtle, 10%);\n }\n}\n\natom-text-editor[mini].is-focused {\n color: @text-color;\n background-color: @input-background-color;\n border-color: @input-border-color;\n .placeholder-text {\n color: @text-color-subtle;\n }\n .selection .region {\n background-color: lighten(@background-color-info, 30%);\n }\n}\n\n// FIXME: these should go in syntax themes?\natom-text-editor {\n .gutter.drop-shadow {\n -webkit-box-shadow: -2px 0 10px 2px #222;\n }\n}\n","digest":"37bd11a43907a16e6b6251b5219a4a190ab1a3cc"},"node_modules/atom-light-ui/styles/git.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\n.status { .text(normal); }\n.status-added { .text(success); }\n.status-ignored { .text(subtle); }\n.status-modified { .text(warning); }\n.status-removed { .text(error); }\n.status-renamed { .text(info); }\n","digest":"ed1ba6a0675bf1eb93fb84803c7830bc18adee6f"},"node_modules/atom-light-ui/styles/lists.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n@import \"octicon-mixins\";\n\n.list-group, .list-tree {\n li:not(.list-nested-item),\n li.list-nested-item > .list-item {\n .text(normal);\n }\n\n .generate-list-item-text-color(@class) {\n li:not(.list-nested-item).text-@{class},\n li.list-nested-item.text-@{class} > .list-item {\n .text(@class);\n }\n }\n .generate-list-item-text-color(subtle);\n .generate-list-item-text-color(info);\n .generate-list-item-text-color(success);\n .generate-list-item-text-color(warning);\n .generate-list-item-text-color(error);\n .generate-list-item-text-color(selected);\n\n .generate-list-item-status-color(@color, @status) {\n li:not(.list-nested-item).status-@{status},\n li.list-nested-item.status-@{status} > .list-item {\n color: @color;\n }\n\n li:not(.list-nested-item).selected.status-@{status},\n li.list-nested-item.selected.status-@{status} > .list-item {\n color: darken(@color, 7%);\n }\n }\n .generate-list-item-status-color(@text-color-subtle, ignored);\n .generate-list-item-status-color(@text-color-added, added);\n .generate-list-item-status-color(@text-color-renamed, renamed);\n .generate-list-item-status-color(@text-color-modified, modified);\n .generate-list-item-status-color(@text-color-removed, removed);\n\n li:not(.list-nested-item).selected,\n li.list-nested-item.selected > .list-item {\n .text(selected);\n }\n}\n\n.select-list ol.list-group,\n&.select-list ol.list-group {\n li.two-lines {\n .secondary-line { color: @text-color-subtle; }\n &.selected .secondary-line {\n color: lighten(@text-color-subtle, 10%);\n text-shadow: none;\n }\n }\n\n // We want to highlight the background of the list items because we dont\n // know their size.\n li.selected {\n background-color: @background-color-selected;\n &:before{ display: none; }\n }\n\n &.mark-active{\n @active-icon-size: 14px;\n\n // pad in front of the text where the icon would be We'll pad the non-\n // active items with a 'fake' icon so other classes can pad the item\n // without worrying about the icon padding.\n li:before {\n content: '';\n background-color: transparent;\n position: static;\n display: inline-block;\n left: auto; right: auto;\n height: @active-icon-size;\n width: @active-icon-size;\n }\n > li:not(.active):before {\n margin-right: @component-icon-padding;\n }\n li.active {\n .octicon(check, @active-icon-size);\n &:before {\n margin-right: @component-icon-padding;\n color: @text-color-success;\n }\n }\n }\n}\n\n.select-list.popover-list {\n background-color: @overlay-background-color;\n box-shadow: 0 0 10px @base-border-color;\n padding: @component-padding/2;\n border-radius: @component-border-radius;\n border: 1px solid @overlay-border-color;\n\n atom-text-editor {\n margin-bottom: @component-padding/2;\n }\n\n .list-group li {\n padding-left: @component-padding/2;\n }\n}\n\n.ui-sortable {\n li {\n line-height: 2.5;\n }\n\n // For sortable lists in the settings view\n li.ui-sortable-placeholder {\n visibility: visible !important;\n background-color: darken(@pane-item-background-color, 10%);\n }\n}\n\nli.ui-draggable-dragging, li.ui-sortable-helper {\n line-height: @component-line-height;\n height: @component-line-height;\n border: 0;\n border-radius: 0;\n list-style: none;\n padding: 0 @component-padding;\n background: @background-color-highlight;\n box-shadow: 0 0 1px @base-border-color;\n}\n","digest":"dbe592a33984fd82e6f51ba6eb9f7d40a2e7f40e"},"node_modules/atom-light-ui/styles/messages.less":{"content":"@import \"ui-variables\";\n\nul.background-message {\n font-weight: bold;\n color: rgba(0, 0, 0, .18);\n}\n","digest":"eafecb0865fc91954f31cdc032e2037ae51a93b8"},"node_modules/atom-light-ui/styles/overlays.less":{"content":"@import \"ui-variables\";\n\natom-panel.modal, .overlay {\n color: @text-color;\n background-color: @overlay-background-color;\n padding: @component-padding;\n border: 1px solid @overlay-border-color;\n box-shadow: 0 0 10px @base-border-color;\n border-radius: @component-border-radius;\n\n atom-text-editor[mini] {\n margin-bottom: @component-padding;\n }\n\n .select-list ol.list-group,\n &.select-list ol.list-group {\n\n background-color: @inset-panel-background-color;\n\n li {\n padding: @component-padding;\n border-top: 1px solid @inset-panel-border-color;\n border-left: 1px solid @inset-panel-border-color;\n border-right: 1px solid @inset-panel-border-color;\n &:last-child { border-bottom: 1px solid @inset-panel-border-color; }\n\n &.two-lines { padding: @component-padding/2 @component-padding; }\n &.selected {\n color: @text-color;\n background-color: @background-color-highlight;\n }\n\n .status.icon {\n float: right;\n margin-left: @component-icon-padding;\n &:before {\n margin-right: 0;\n }\n }\n }\n\n }\n}\n","digest":"369ed7edbe06e3901a5786d751d7214583bfcc64"},"node_modules/atom-light-ui/styles/panels.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n@import \"buttons\";\n\n.panel {\n &.bordered {\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n}\n\natom-panel, .tool-panel {\n .text(normal);\n position: relative;\n\n background-color: @tool-panel-background-color;\n\n &.bottom, &.panel-bottom,\n &.footer, &.footer-bottom {\n border-top: 1px solid @tool-panel-border-color;\n }\n\n &.left, &.panel-left {\n border-right: 1px solid @tool-panel-border-color;\n }\n\n &.right, &.panel-right {\n border-left: 1px solid @tool-panel-border-color;\n }\n\n .inset-panel {\n border-radius: @component-border-radius;\n\n border: 1px solid @tool-panel-border-color;\n }\n}\n\n.inset-panel {\n position: relative;\n background-color: @inset-panel-background-color;\n}\n\n.panel-heading {\n border-bottom: none;\n padding: @component-padding - 2px @component-padding;\n\n background-color: transparent;\n background-image: -webkit-linear-gradient(@panel-heading-background-color, darken(@panel-heading-background-color, 10%));\n\n .btn {\n @bg: lighten(@button-background-color, 10%);\n @hover: lighten(@button-background-color-hover, 10%);\n @selected: lighten(@button-background-color-selected, 10%);\n @text: lighten(@text-color, 10%);\n .btn-background(@bg, @hover, @selected, @button-border-color, @text, @text);\n }\n}\n","digest":"b2cb423407ada7c4a0f0b3c9d817b0cffb577a4b"},"node_modules/atom-light-ui/styles/panes.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n@import \"buttons\";\n\natom-pane-container {\n atom-pane {\n background-color: lighten(@app-background-color, 3%);\n\n &:focus {\n background-color: @app-background-color;\n }\n }\n\n atom-pane-axis.horizontal > * {\n border-right: 1px solid @pane-item-border-color;\n &:last-child { border-right: none; }\n }\n\n atom-pane-axis.vertical > * {\n border-bottom: 1px solid @pane-item-border-color;\n &:last-child { border-bottom: none; }\n }\n}\n","digest":"4d99e32069dceadb0704ae10f4cbe2f50a94fded"},"node_modules/atom-light-ui/styles/progress.less":{"content":"@import \"ui-variables\";\n@import \"ui-mixins\";\n\n.loading-spinner(@size) {\n width: @size;\n height: @size;\n display: block;\n\n background-image: url(images/octocat-spinner-128.gif);\n background-repeat: no-repeat;\n background-size: cover;\n\n &.inline-block {\n display: inline-block;\n }\n}\n\n.loading-spinner-large {\n .loading-spinner(64px);\n}\n\n.loading-spinner-medium {\n .loading-spinner(50px);\n}\n\n.loading-spinner-small {\n .loading-spinner(32px);\n}\n\n.loading-spinner-tiny {\n .loading-spinner(20px);\n}\n\n// Much learning from:\n// http://css-tricks.com/html5-progress-element/\n\n@progress-height: 16px;\n@progress-shine-gradient: -webkit-linear-gradient(top, rgba(255, 255, 255, .15), rgba(0, 0, 0, .15));\n\nprogress {\n height: @progress-height;\n -webkit-appearance: none;\n border-radius: @component-border-radius;\n background-color: #ccc;\n background-image:\n -webkit-linear-gradient(-30deg,\n transparent 33%, rgba(0, 0, 0, .1) 33%,\n rgba(0,0, 0, .1) 66%, transparent 66%),\n @progress-shine-gradient;\n border-radius: 2px;\n background-size: 25px @progress-height, 100% 100%, 100% 100%;\n -webkit-animation: animate-stripes 5s linear 6; // stop animation after 6 runs (30s) to limit CPU usage\n}\n\nprogress::-webkit-progress-bar {\n background-color: transparent;\n}\n\nprogress::-webkit-progress-value {\n border-radius: @component-border-radius;\n background-image: @progress-shine-gradient;\n background-color: @background-color-info;\n}\n\nprogress[value] {\n background-image: @progress-shine-gradient;\n -webkit-animation: none;\n}\n\n@-webkit-keyframes animate-stripes {\n 100% { background-position: 100px 0px; }\n}\n","digest":"e8d84d52c7384e39fd5d1fa56af007ba7651b1b7"},"node_modules/atom-light-ui/styles/sites.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\n.ui-site(@num, @color) {\n .ui-site-@{num} {\n background-color: @color;\n }\n}\n\n.ui-site(1, @ui-site-color-1);\n.ui-site(2, @ui-site-color-2);\n.ui-site(3, @ui-site-color-3);\n.ui-site(4, @ui-site-color-4);\n.ui-site(5, @ui-site-color-5);\n","digest":"3d13f4d6504d0f8e86aa5b9971eb50a445303fdd"},"node_modules/atom-light-ui/styles/tabs.less":{"content":"@import \"ui-variables\";\n@tab-radius: 3px;\n@modified-icon-width: 8px;\n@tab-skew: 30deg;\n@tab-top-padding: 5px;\n@tab-bottom-border-height: 5px;\n@tab-border: 1px solid @tab-border-color;\n@tab-max-width: 160px;\n\n.tab-bar {\n height: @tab-height + @tab-top-padding + @tab-bottom-border-height;\n background-image: -webkit-linear-gradient(top, @tab-bar-background-color, lighten(@tab-bar-background-color, 9%));\n box-shadow: inset 0 -8px 8px -4px rgba(0,0,0, .15);\n padding: 0 10px 0 25px;\n overflow-x: auto;\n overflow-y: hidden;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n &:after {\n content: \"\";\n position: absolute;\n bottom: 0;\n height: @tab-bottom-border-height;\n left: 0;\n right: 0;\n background-color: @tab-background-color-active;\n border-bottom: 1px solid @tab-bar-border-color;\n border-top: 1px solid @tab-border-color;\n pointer-events: none;\n }\n\n .tab {\n position: relative;\n top: @tab-top-padding;\n max-width: @tab-max-width;\n height: @tab-height;\n line-height: @tab-height;\n color: @text-color;\n padding: 0;\n margin: 0 20px 0 5px;\n\n box-shadow: inset -1px -1px 1px rgba(0,0,0, .05);\n transition: color .1s ease-in;\n\n &, &:before, &:after {\n background-image: -webkit-linear-gradient(top, @tab-background-color, darken(@tab-background-color, 6%));\n border-top: @tab-border;\n }\n\n &:before, &:after {\n content: '';\n position: absolute;\n top: -1px;\n width: 25px;\n height: @tab-height;\n }\n\n // left angled edge\n &:before {\n left: -14px;\n border-top-left-radius: @tab-radius;\n border-left: @tab-border;\n box-shadow: inset 1px -1px 1px rgba(0,0,0, .05);\n -webkit-transform: skewX(-@tab-skew);\n }\n\n // right angled edge\n &:after {\n right: -14px;\n border-top-right-radius: @tab-radius;\n border-right: @tab-border;\n box-shadow: inset -1px -1px 1px rgba(0,0,0, .05);\n -webkit-transform: skewX(@tab-skew);\n }\n\n .close-icon {\n right: 0;\n z-index: 3;\n text-align: right;\n line-height: @tab-height;\n color: @text-color;\n\n &:hover {\n color: inherit;\n }\n }\n\n &.modified:not(:hover) .close-icon {\n right: 0;\n top: @tab-height/2 - @modified-icon-width/2 + 1px;\n width: @modified-icon-width;\n height: @modified-icon-width;\n }\n\n &.modified:hover .close-icon:hover {\n color: @text-color-highlight;\n }\n\n .title {\n position: relative;\n z-index: 1;\n margin-top: -@tab-top-padding - 1px;\n padding-top: @tab-top-padding + 1px;\n padding-right: 10px;\n }\n }\n\n .tab.active {\n z-index: 1;\n color: @text-color-highlight;\n\n .close-icon {\n line-height: @tab-height - 1px;\n color: @text-color;\n }\n\n &, &:before, &:after {\n background: @tab-background-color-active;\n height: @tab-height + 1px;\n box-shadow: none;\n }\n }\n\n .tab:hover {\n color: @text-color-highlight;\n }\n\n .tab.active:hover .close-icon {\n color: @text-color;\n\n &:hover {\n color: inherit;\n }\n }\n\n .placeholder {\n height: @tab-height + @tab-top-padding + @tab-bottom-border-height;\n margin-left: -9px; // center between tabs\n pointer-events: none;\n &:after {\n top: @tab-height + @tab-top-padding + @tab-bottom-border-height - 2px;\n }\n }\n}\n","digest":"78fa4fc0ad6954c8595d32643d774c3f23a2ce4e"},"node_modules/atom-light-ui/styles/text.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\nh1,\nh2,\nh3 {\n line-height: 1em;\n margin-bottom: 15px\n}\nh1 { font-size: 2em; }\nh2 { font-size: 1.5em; }\nh3 { font-size: 1.2em; }\n\np {\n line-height: 1.6;\n margin-bottom: 15px;\n}\n\nlabel {\n font-weight: normal;\n}\n\npre {\n box-shadow: none;\n color: @text-color;\n background: @inset-panel-background-color;\n border-radius: @component-border-radius;\n border: none;\n margin: 0;\n}\n\ncode {\n .text(highlight);\n background: @background-color-highlight;\n border-radius: @component-border-radius;\n}\n\n.selected { .text(highlight); }\n\n.text-smaller { font-size: 0.9em; }\n\n.text-subtle { .text(subtle); }\n.text-highlight { .text(highlight); }\n\n.text-error { .text(error); }\n.text-info {\n .text(info);\n &:hover { color: @text-color-info; }\n}\n.text-warning {\n .text(warning);\n &:hover { color: @text-color-warning; }\n}\n.text-success {\n .text(success);\n &:hover { color: @text-color-success; }\n}\n\n.highlight {\n color: @text-color-highlight;\n font-weight: bold;\n text-shadow: none;\n background-color: @background-color-highlight;\n border-radius: @component-border-radius;\n padding: 1px 3px;\n}\n\n.highlight-color(@name, @color) {\n .highlight-@{name} {\n color: @text-color-highlight;\n font-weight: bold;\n text-shadow: none;\n background-color: @color;\n border-radius: @component-border-radius;\n padding: 1px 3px;\n }\n}\n.highlight-color(info, @background-color-info);\n.highlight-color(warning, @background-color-warning);\n.highlight-color(error, @background-color-error);\n.highlight-color(success, @background-color-success);\n","digest":"7af63d586b405150455e954e6325962c821dc7d0"},"node_modules/atom-light-ui/styles/tooltips.less":{"content":"@import \"ui-variables\";\n\n.tooltip {\n @tip-background-color: #333;\n @tip-text-color: #fff;\n white-space: nowrap;\n\n .keystroke {\n font-family: Helvetica, Arial, sans-serif;\n font-size: 13px;\n color: #c0c0c0;\n padding-left: 2px;\n }\n\n &.in { opacity: 1; }\n\n .tooltip-inner {\n line-height: 19px;\n border-radius: @component-border-radius;\n background-color: @tip-background-color;\n color: @tip-text-color;\n white-space: nowrap;\n max-width: none;\n }\n\n &.top .tooltip-arrow {\n border-top-color: @tip-background-color;\n }\n &.top-left .tooltip-arrow {\n border-top-color: @tip-background-color;\n }\n &.top-right .tooltip-arrow {\n border-top-color: @tip-background-color;\n }\n &.right .tooltip-arrow {\n border-right-color: @tip-background-color;\n }\n &.left .tooltip-arrow {\n border-left-color: @tip-background-color;\n }\n &.bottom .tooltip-arrow {\n border-bottom-color: @tip-background-color;\n }\n &.bottom-left .tooltip-arrow {\n border-bottom-color: @tip-background-color;\n }\n &.bottom-right .tooltip-arrow {\n border-bottom-color: @tip-background-color;\n }\n}\n","digest":"39716f4a833592eaebb10d339ede6a3a1b22fc7f"},"node_modules/atom-light-ui/styles/tree-view.less":{"content":"@import \"ui-variables\";\n\n.tree-view {\n\tfont-size: @font-size;\n\tbackground: @tree-view-background-color;\n\n\t.selected:before {\n\t\tbackground: #d0d0d0;\n\t}\n}\n\n.tree-view-resizer {\n\t.tree-view-resize-handle {\n\t\twidth: 8px;\n\t}\n}\n\n.focusable-panel {\n\topacity: 1;\n\tbackground-image: -webkit-gradient(linear, left top, left bottom, from(#e8ecf1), to(#ebebeb));\n\tbackground-image: -webkit-linear-gradient(top, #e8ecf1, #ebebeb);\n\n\t&:focus {\n\t\tbackground-image: -webkit-gradient(linear, left top, left bottom, from(#e8ecf1),to(#d1d8e0));\n\t\tbackground-image: -webkit-linear-gradient(top, #e8ecf1, #d1d8e0);\n\n\t\t.selected:before {\n\t\t\tbackground: @background-color-selected;\n\t\t}\n\t}\n}\n","digest":"da6d8af99cf367ca2975e2c4053f59f7132e50ed"},"node_modules/atom-light-ui/styles/ui-mixins.less":{"content":"@import \"ui-variables\";\n\n// Pattern matching; ish is cray.\n// http://lesscss.org/#-pattern-matching-and-guard-expressions\n.text(normal) {\n font-weight: normal;\n color: @text-color;\n text-shadow: 0 1px 0 rgba(255, 255, 255, .5);\n}\n.text(subtle) {\n font-weight: normal;\n color: @text-color-subtle;\n text-shadow: none;\n}\n.text(highlight) {\n font-weight: normal;\n color: @text-color-highlight;\n}\n.text(selected) {\n font-weight: normal;\n color: @text-color-selected;\n text-shadow: none;\n}\n\n.text(info) {\n color: @text-color-info;\n text-shadow: none;\n}\n.text(success) {\n color: @text-color-success;\n text-shadow: none;\n}\n.text(warning) {\n color: @text-color-warning;\n text-shadow: none;\n}\n.text(error) {\n color: @text-color-error;\n text-shadow: none;\n}\n","digest":"a02a9bbae6400fae2138e41ebc5d3b4036a20060"},"node_modules/atom-light-ui/styles/ui-variables.less":{"content":"// Colors\n\n@text-color: #444;\n@text-color-subtle: #999;\n@text-color-highlight: #000;\n@text-color-selected: #fff;\n\n@text-color-info: #5293d8;\n@text-color-success: #45A815;\n@text-color-warning: #CD8E00;\n@text-color-error: #c00;\n\n@text-color-ignored: @text-color-subtle;\n@text-color-added: @text-color-success;\n@text-color-renamed: @text-color-info;\n@text-color-modified: @text-color-warning;\n@text-color-removed: @text-color-error;\n\n@background-color-info: #0098ff;\n@background-color-success: #17ca65;\n@background-color-warning: #ff4800;\n@background-color-error: #c00;\n@background-color-highlight: rgba(0, 0, 0, .1);\n@background-color-selected: #6aa5e9;\n\n@app-background-color: #ccc;\n\n@base-background-color: #f4f4f4;\n@base-border-color: #9f9f9f;\n\n@pane-item-background-color: @base-background-color;\n@pane-item-border-color: @base-border-color;\n\n@input-background-color: white;\n@input-border-color: fadeout(@base-border-color, 10%);\n\n@tool-panel-background-color: @base-background-color;\n@tool-panel-border-color: @base-border-color;\n\n@inset-panel-background-color: #fff;\n@inset-panel-border-color: fadeout(@base-border-color, 10%);\n\n@panel-heading-background-color: #c3c3c3;\n@panel-heading-border-color: transparent;\n\n@overlay-background-color: #ececec;\n@overlay-border-color: @base-border-color;\n\n@button-background-color: @base-background-color;\n@button-background-color-hover: lighten(@button-background-color, 5%);\n@button-background-color-selected: #888;\n@button-border-color: rgba(0, 0, 0, 0.15);\n\n@tab-bar-background-color: #d8d8d8;\n@tab-bar-border-color: #ddd;\n@tab-background-color: #e8e8e8;\n@tab-background-color-active: #f0f0f0;\n@tab-border-color: lighten(@base-border-color, 10%);\n\n@tree-view-background-color: #eee;\n@tree-view-border-color: @base-border-color;\n\n@scrollbar-background-color: #F9F9F9; // Needs to be opaque -> atom/atom/issues/4578\n@scrollbar-color: #C1C1C1;\n\n@ui-site-color-1: @background-color-success; // green\n@ui-site-color-2: @background-color-info; // blue\n@ui-site-color-3: @background-color-warning; // orange\n@ui-site-color-4: #db2ff4; // purple\n@ui-site-color-5: #f5e11d; // yellow\n\n\n// Sizes\n\n@font-size: 11px;\n@input-font-size: 14px;\n@disclosure-arrow-size: 12px;\n\n@component-padding: 10px;\n@component-icon-padding: 5px;\n@component-icon-size: 16px;\n@component-line-height: 25px;\n@component-border-radius: 2px;\n\n@tab-height: 26px;\n\n\n// Other\n\n@font-family: 'BlinkMacSystemFont', 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif;\n","digest":"1ea6d8a528089d6ed99a3e924ccb7fa2bdb7fce9"},"node_modules/atom-light-ui/styles/utilities.less":{"content":"@import \"ui-mixins\";\n@import \"ui-variables\";\n\n.key-binding {\n background: #fff;\n border: 1px solid lighten(@base-border-color, 20%);\n text-shadow: none;\n display: inline-block;\n line-height: 100%;\n border-radius: @component-border-radius;\n margin-left: @component-icon-padding;\n font-family: Helvetica, Arial, sans-serif;\n font-size: @font-size - 1px;\n padding: @component-padding / 2;\n}\n\n.badge {\n .text(highlight);\n background: @background-color-highlight;\n}\n","digest":"2412f22cf72e84bc5e18fa6d7a2d1667634e7748"},"node_modules/one-dark-ui/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Atom UI Theme: One\n\n@import \"styles/ui-variables.less\";\n@import \"styles/ui-mixins.less\";\n@import \"octicon-mixins.less\"; // https://github.com/atom/atom/blob/master/static/variables/octicon-mixins.less\n\n@import \"styles/atom.less\";\n@import \"styles/badges.less\";\n@import \"styles/buttons.less\";\n@import \"styles/docks.less\";\n@import \"styles/editor.less\";\n@import \"styles/git.less\";\n@import \"styles/inputs.less\";\n@import \"styles/lists.less\";\n@import \"styles/messages.less\";\n@import \"styles/nav.less\";\n@import \"styles/notifications.less\";\n@import \"styles/modal.less\";\n@import \"styles/panels.less\";\n@import \"styles/panes.less\";\n@import \"styles/progress.less\";\n@import \"styles/tabs.less\";\n@import \"styles/text.less\";\n@import \"styles/title-bar.less\";\n@import \"styles/tooltips.less\";\n@import \"styles/tree-view.less\";\n@import \"styles/status-bar.less\";\n@import \"styles/key-binding.less\";\n@import \"styles/sites.less\";\n\n@import \"styles/settings.less\";\n@import \"styles/packages.less\";\n@import \"styles/core.less\";\n@import \"styles/config.less\";\n","digest":"9ae52af555fe1bcd2721d52c1539ca092a07aafa"},"node_modules/one-dark-ui/styles/atom.less":{"content":"* {\n\tbox-sizing: border-box;\n}\n\nhtml {\n\tfont-size: @font-size;\n}\n\natom-workspace {\n\tbackground-color: @app-background-color;\n}\n\n\n// Scrollbars ------------------------------------\n\n.scrollbars-visible-always {\n\t::-webkit-scrollbar {\n\t\twidth: 10px;\n\t\theight: 10px;\n\t}\n\n\t::-webkit-scrollbar-track {\n\t\tbackground: @scrollbar-background-color;\n\t}\n\n\t::-webkit-scrollbar-thumb {\n\t\tborder-radius: 5px;\n\t\tborder: 3px solid @scrollbar-background-color;\n\t\tbackground: @scrollbar-color;\n\t\tbackground-clip: content-box;\n\t}\n\n\t::-webkit-scrollbar-corner {\n\t\tbackground: @scrollbar-background-color;\n\t}\n\n\t::-webkit-scrollbar-thumb:vertical:active {\n\t\tborder-radius: 0;\n\t\tborder-left-width: 0;\n\t\tborder-right-width: 0;\n\t}\n\n\t::-webkit-scrollbar-thumb:horizontal:active {\n\t\tborder-radius: 0;\n\t\tborder-top-width: 0;\n\t\tborder-bottom-width: 0;\n\t}\n\n\tatom-text-editor {\n\t\t::-webkit-scrollbar-track {\n\t\t\tbackground: @scrollbar-background-color-editor;\n\t\t}\n\t\t::-webkit-scrollbar-corner {\n\t\t\tbackground: @scrollbar-background-color-editor;\n\t\t}\n\t\t::-webkit-scrollbar-thumb {\n\t\t\tborder-color: @scrollbar-background-color-editor;\n\t\t\tbackground: @scrollbar-color-editor;\n\t\t}\n\t}\n}\n\n// TODO: Move to a better place, not sure where it gets used\n.caret {\n border-top: 5px solid #fff;\n margin-top: -1px;\n}\n","digest":"df4447499593550b61146e7af8d0f4cd17991112"},"node_modules/one-dark-ui/styles/badges.less":{"content":".badge {\n padding: @ui-padding/4 @ui-padding/2.5;\n min-width: @ui-padding*1.25;\n .text(highlight);\n border-radius: @ui-size*2;\n background-color: @badge-background-color;\n\n // Icon ----------------------\n &.icon {\n font-size: @ui-size;\n padding: @ui-padding-icon @ui-padding-icon*1.5;\n }\n\n}\n","digest":"bfb1f9e90af654b5baa53d74c36628140507a3f7"},"node_modules/one-dark-ui/styles/buttons.less":{"content":"\n@btn-border: 1px solid @button-border-color;\n@btn-padding: 0 @ui-size/1.25;\n\n// Mixins -----------------------\n\n.btn-default (@color, @hover-color, @selected-color, @text-color) {\n color: @text-color;\n text-shadow: none;\n border: @btn-border;\n background-color: @color;\n background-image: linear-gradient(lighten(@color, 2%), @color);\n\n &:hover {\n color: @text-color-highlight;\n background-image: linear-gradient(lighten(@hover-color, 2%), @hover-color);\n }\n &:active {\n background: darken(@color, 4%);\n box-shadow: none;\n }\n &.selected {\n background: @selected-color;\n }\n &.selected:focus,\n &.selected:hover {\n background: lighten(@selected-color, 2%);\n }\n &:focus {\n .focus(); // unfortunately :focus styles stay even after releasing mouse.\n }\n}\n\n.btn-variant (@color) {\n @_text-color: contrast(@color, white, hsl(0,0%,20%), 33% );\n .btn-default(\n @color,\n lighten(@color, 3%),\n saturate(darken(@color, 12%), 20%),\n @text-color-highlight\n );\n color: @_text-color;\n\n & when (@ui-lightness > 50%) {\n border-color: transparent; // hide border on light backgrounds\n }\n\n &:hover,\n &:focus {\n color: @_text-color;\n }\n &:focus {\n border-color: transparent;\n background-clip: padding-box;\n box-shadow: inset 0 0 0 1px fade(@base-border-color, 50%), 0 0 0 1px @color;\n }\n\n &.icon:before {\n color: @_text-color;\n }\n}\n\n\n// Buttons -----------------------\n\n.btn {\n height: initial;\n padding: @btn-padding;\n font-size: @ui-size;\n line-height: @ui-line-height;\n}\n\n.btn,\n.btn.btn-default {\n .btn-default(@button-background-color, @button-background-color-hover, @button-background-color-selected, @text-color);\n}\n\n.btn.btn-primary {\n .btn-variant(@accent-bg-color);\n}\n.btn.btn-info {\n .btn-variant(@background-color-info);\n}\n.btn.btn-success {\n .btn-variant(@background-color-success);\n}\n.btn.btn-warning {\n .btn-variant(@background-color-warning);\n}\n.btn.btn-error {\n .btn-variant(@background-color-error);\n}\n\n\n// Button Sizes -----------------------\n\n.btn.btn-xs,\n.btn-group-xs > .btn {\n font-size: @ui-size*.8;\n line-height: @ui-line-height;\n padding: @btn-padding;\n}\n.btn.btn-sm,\n.btn-group-sm > .btn {\n font-size: @ui-size*.9;\n line-height: @ui-line-height;\n padding: @btn-padding;\n}\n.btn.btn-lg,\n.btn-group-lg > .btn {\n font-size: @ui-size * 1.5;\n line-height: @ui-line-height;\n padding: @btn-padding;\n}\n\n\n// Button Group -----------------------\n\n.btn-group > .btn {\n z-index: 0;\n &:hover {\n z-index: 0;\n }\n &.btn:focus {\n z-index: 1;\n .focus();\n }\n\n &:first-child {\n border-left: @btn-border;\n }\n &:last-child,\n &.selected:last-child {\n border-right: @btn-border;\n }\n\n // hide border on light backgrounds\n & when (@ui-lightness > 50%) {\n &.btn-primary:first-child,\n &.btn-info:first-child,\n &.btn-success:first-child,\n &.btn-warning:first-child,\n &.btn-error:first-child {\n border-left-color: transparent;\n }\n\n &.btn-primary:last-child,\n &.btn-info:last-child,\n &.btn-success:last-child,\n &.btn-warning:last-child,\n &.btn-error:last-child {\n border-right-color: transparent;\n }\n }\n\n &.selected,\n &.selected:first-child,\n &.selected:last-child {\n color: @button-text-color-selected;\n border-color: @button-border-color-selected;\n }\n\n & when (@ui-lightness > 50%) {\n &.selected + .btn {\n border-left-color: @button-border-color-selected;\n }\n &.selected + .selected {\n border-left-color: mix(@button-border-color, @button-border-color-selected);\n }\n }\n\n &.selected:focus {\n border-color: @button-background-color-selected;\n box-shadow: inset 0 0 0 1px fade(@base-border-color, 50%), 0 0 0 1px @button-background-color-selected;\n }\n}\n\n\n// Button Icons -----------------------\n\n.btn.icon:before {\n width: auto;\n height: auto;\n font-size: 1.333333em;\n vertical-align: -.1em;\n}\n","digest":"771f75f5f119b4282fb0980b2c492e5cf15ad5d3"},"node_modules/one-dark-ui/styles/config.less":{"content":"\n// Tabs ----------------------------------------------\n\n@theme-tabsizing: ~'theme-@{ui-theme-name}-tabsizing';\n@theme-dockButtons: ~'theme-@{ui-theme-name}-dock-buttons';\n\n@tab-min-width: 7em; // ~ icon + 6 characters\n\n\n// Even (default) ---------------\n\n.tab-bar {\n .tab,\n .tab.active {\n flex: 1 1 0;\n max-width: 22em;\n min-width: @tab-min-width;\n }\n atom-dock & {\n .tab,\n .tab.active {\n max-width: none;\n }\n }\n\n // TODO: Turn this into a config\n // Truncates the beginning instead\n // .title.title.title {\n // direction: rtl; // change direction\n // }\n}\n\n\n// Maximum (full width) ---------------\n\n[@{theme-tabsizing}=\"maximum\"] .tab-bar {\n .tab,\n .tab.active {\n max-width: none;\n }\n}\n\n\n// Minimum (show long paths) ---------------\n\n[@{theme-tabsizing}=\"minimum\"] .tab-bar {\n .tab,\n .tab.active {\n flex: 0 0 auto;\n min-width: 2.75em;\n max-width: @tab-min-width * 3.3;\n }\n atom-dock {\n .tab,\n .tab.active {\n max-width: @tab-min-width * 2;\n }\n }\n}\n\n\n\n// Hide docks toggle buttons ------------------------------\n\n[@{theme-dockButtons}=\"hidden\"] {\n\n // Hide docks when not open\n .atom-dock-inner:not(.atom-dock-open) {\n display: none;\n }\n\n // Hide toggle buttons\n .atom-dock-toggle-button {\n display: none;\n }\n\n}\n","digest":"7b535b404a0238604350777668da209e6cb2f2b7"},"node_modules/one-dark-ui/styles/core.less":{"content":"// Misc\n\n.preview-pane .results-view .path-match-number {\n // show number also on selected item\n color: inherit;\n opacity: .6;\n}\n\n.tool-panel.incompatible-packages {\n // incompatible-packages isn't really a tool-panel and more a whole pane\n .text(normal);\n background-color: @level-2-color;\n}\n\n// Styleguide ----------------------------------------------\n\n.styleguide {\n // Modal\n atom-panel.modal:after {\n position: absolute; // prevent overlay backdrop from leaking outside\n left: -@ui-padding;\n right: -@ui-padding;\n bottom: -@ui-padding;\n }\n}\n","digest":"4ba9309f9e37001066e7f31b17f9ff985741a298"},"node_modules/one-dark-ui/styles/docks.less":{"content":"\n// Docks ------------------------------\n\n// Make handles not take up any space when dock is open\n.atom-dock-resize-handle {\n position: absolute;\n z-index: 11; // same as toggle buttons\n\n &.left {\n top: 0;\n right: 0;\n bottom: 0;\n }\n &.right {\n top: 0;\n left: 0;\n bottom: 0;\n }\n &.bottom {\n top: 0;\n left: 0;\n right: 0;\n }\n}\n\n// Add borders\n.atom-dock-inner.atom-dock-open.left {\n border-right: 1px solid @base-border-color;\n}\n.atom-dock-inner.atom-dock-open.right {\n border-left: 1px solid @base-border-color;\n}\n\n// Make toggle buttons cover ^ border\n.atom-dock-toggle-button.left {\n margin-left: -1px;\n}\n.atom-dock-toggle-button.right {\n margin-right: -1px;\n}\n.atom-dock-inner:not(.atom-dock-open) .atom-dock-toggle-button.bottom {\n margin-bottom: -1px;\n}\n","digest":"2d1e626354879323d3f61341a8e6f903ceec1f7a"},"node_modules/one-dark-ui/styles/dropdowns.less":{"content":".dropdown-menu {\n background-color: @overlay-background-color;\n border-radius: @component-border-radius;\n border: 1px solid @base-border-color;\n padding: 0;\n\n > li > a {\n .text(normal);\n }\n\n > li > a:hover {\n .text(highlight);\n background-color: @background-color-highlight;\n }\n}\n","digest":"344a6a3a32a0e115652f60c7626fc93e1d2220c1"},"node_modules/one-dark-ui/styles/editor.less":{"content":"\n// Editor in a panel\n\n// TODO: Find a better selector, maybe a new class like atom-text-editor[medium]\natom-panel-container atom-text-editor.is-focused {\n .focus();\n}\n\n\n// Mini\n// Usually just single line inputs\n\natom-text-editor[mini] {\n overflow: auto;\n font-size: @ui-input-size;\n line-height: @ui-line-height;\n max-height: @ui-line-height * 5; // rows\n padding-left: @ui-padding/3;\n border-radius: @component-border-radius;\n color: @text-color-highlight;\n border: 1px solid @input-border-color;\n background-color: @input-background-color;\n\n .placeholder-text {\n color: @text-color-subtle;\n }\n\n .selection .region {\n background-color: @input-selection-color;\n }\n\n .cursor {\n border-color: @accent-color;\n border-width: 2px;\n }\n\n &.is-focused {\n .focus();\n background-color: @input-background-color-focus;\n .selection .region {\n background-color: @input-selection-color-focus;\n }\n }\n}\n","digest":"c372db5e2182585e75a5dbc970c85d04f9ac94c9"},"node_modules/one-dark-ui/styles/git.less":{"content":".status { .text(normal); }\n.status-added { .text(success); } // green\n.status-ignored { .text(subtle); } // faded\n.status-modified { .text(warning); } // orange\n.status-removed { .text(error); } // red\n.status-renamed { .text(info); } // blue\n","digest":"4cc19322834e5e93b47fe889895e14e6a7576f8d"},"node_modules/one-dark-ui/styles/inputs.less":{"content":"\n//\n// Checkbox\n// -------------------------\n\n.input-checkbox {\n &:active {\n background-color: @accent-color;\n }\n &:before,\n &:after {\n background-color: @accent-text-color;\n }\n &:checked {\n background-color: @accent-color;\n }\n\n &:indeterminate {\n background-color: @accent-color;\n }\n}\n\n\n//\n// Radio\n// -------------------------\n\n.input-radio {\n &:before {\n background-color: @accent-text-color;\n }\n &:active {\n background-color: @accent-color;\n }\n &:checked {\n background-color: @accent-color;\n }\n}\n\n\n//\n// Range (Slider)\n// -------------------------\n\n.input-range {\n &::-webkit-slider-thumb {\n background-color: @accent-color;\n }\n}\n\n\n//\n// Toggle\n// -------------------------\n\n.input-toggle {\n &:checked {\n background-color: @accent-color;\n }\n &:before {\n background-color: @accent-text-color;\n }\n}\n\n\n\n// States -------------------------\n\n.input-text,\n.input-search,\n.input-number,\n.input-textarea,\n.input-select,\n.input-color {\n &:focus {\n .focus();\n }\n}\n","digest":"fcb0b948128bc844c8d5d19a0bbbf7debe9ecfb2"},"node_modules/one-dark-ui/styles/key-binding.less":{"content":".key-binding {\n display: inline-block;\n margin-left: @ui-padding-icon;\n padding: 0 @ui-padding/4;\n line-height: 2;\n font-family: inherit;\n font-size: max(1em, @ui-size*.85);\n letter-spacing: @ui-size/10;\n border-radius: @component-border-radius;\n color: @accent-bg-text-color;\n background-color: @accent-bg-color;\n}\n","digest":"2c7039e912c9a51bc17fdb5619d12da5192a1f6f"},"node_modules/one-dark-ui/styles/lists.less":{"content":".list-group,\n.list-tree {\n li:not(.list-nested-item),\n li.list-nested-item > .list-item {\n .text(normal);\n }\n\n .generate-list-item-text-color(@class) {\n li:not(.list-nested-item).text-@{class},\n li.list-nested-item.text-@{class} > .list-item {\n .text(@class);\n }\n }\n .generate-list-item-text-color(subtle);\n .generate-list-item-text-color(info);\n .generate-list-item-text-color(success);\n .generate-list-item-text-color(warning);\n .generate-list-item-text-color(error);\n .generate-list-item-text-color(selected);\n\n .generate-list-item-status-color(@color, @status) {\n li:not(.list-nested-item).status-@{status},\n li.list-nested-item.status-@{status} > .list-item {\n color: @color;\n }\n\n li:not(.list-nested-item).selected.status-@{status},\n li.list-nested-item.selected.status-@{status} > .list-item {\n color: @color;\n }\n\n }\n\n .generate-list-item-status-color(@text-color-added, added);\n .generate-list-item-status-color(@text-color-ignored, ignored);\n .generate-list-item-status-color(@text-color-modified, modified);\n .generate-list-item-status-color(@text-color-removed, removed);\n .generate-list-item-status-color(@text-color-renamed, renamed);\n\n li:not(.list-nested-item).selected,\n li.list-nested-item.selected > .list-item {\n .text(selected);\n }\n\n .no-icon {\n padding-left: calc(@ui-padding-icon ~\"+\" @component-icon-size);\n }\n}\n\n.list-tree.has-collapsable-children .list-nested-item > .list-item::before {\n text-align: center;\n}\n\n.select-list ol.list-group,\n&.select-list ol.list-group {\n li.two-lines {\n .secondary-line {\n color: @text-color-subtle;\n }\n &.selected .secondary-line {\n color: fade(@text-color-highlight, 50%);\n text-shadow: none;\n }\n }\n\n // We want to highlight the background of the list items because we dont\n // know their size.\n li.selected {\n background-color: @background-color-selected;\n &:before{ display: none; }\n }\n\n &.mark-active {\n @active-icon-size: 14px;\n\n // pad in front of the text where the icon would be We'll pad the non-\n // active items with a 'fake' icon so other classes can pad the item\n // without worrying about the icon padding.\n li:before {\n content: '';\n background-color: transparent;\n position: static;\n display: inline-block;\n left: auto; right: auto;\n height: @active-icon-size;\n width: @active-icon-size;\n font-size: @active-icon-size;\n }\n > li:not(.active):before {\n margin-right: @ui-padding-icon;\n }\n li.active {\n .octicon(check, @active-icon-size);\n &:before {\n margin-right: @ui-padding-icon;\n color: @text-color-success;\n }\n }\n }\n}\n\n.select-list.popover-list {\n @popover-list-padding: @ui-padding/4;\n background-color: @overlay-background-color;\n box-shadow: 0 2px 8px 1px rgba(0, 0, 0, 0.3);\n padding: @popover-list-padding;\n border-radius: @component-border-radius;\n\n atom-text-editor[mini] {\n margin-bottom: @popover-list-padding;\n }\n\n ol.list-group {\n margin-top: @popover-list-padding;\n }\n\n .list-group li {\n padding-left: @popover-list-padding;\n }\n}\n\n.ui-sortable {\n li {\n line-height: 2.5;\n }\n\n // For sortable lists in the settings view\n li.ui-sortable-placeholder {\n visibility: visible !important;\n background-color: darken(@pane-item-background-color, 10%);\n }\n}\n\nli.ui-draggable-dragging,\nli.ui-sortable-helper {\n line-height: @ui-line-height;\n height: @ui-line-height;\n border: 0;\n border-radius: 0;\n list-style: none;\n padding: 0 @ui-padding;\n background: @background-color-highlight;\n box-shadow: 0 0 1px @base-border-color;\n}\n","digest":"62e28d3f59d575bb09af38145920fb7dca076620"},"node_modules/one-dark-ui/styles/messages.less":{"content":"background-tips ul.background-message {\n font-weight: 500;\n font-size: 2em;\n color: @text-color-faded;\n\n .message {\n padding: 0 @component-padding * 10;\n\n .keystroke {\n white-space: nowrap;\n vertical-align: middle;\n line-height: 1;\n padding: .1em .4em;\n }\n }\n}\n","digest":"fbe98214c0578199506deb9b230c56019060194b"},"node_modules/one-dark-ui/styles/modal.less":{"content":"\n@modal-padding: @ui-padding/2 @ui-padding/1.5;\n@modal-width: @ui-size * 50;\n\natom-panel-container.modal {\n position: absolute;\n top: 0; left: 0; right: 0;\n}\n\natom-panel.modal {\n position: relative;\n width: 100%;\n max-width: @modal-width;\n margin: 0 auto;\n left: initial;\n color: @text-color;\n background-color: transparent;\n padding: @ui-padding/2;\n\n &.from-top {\n top: @component-padding * 5;\n }\n\n atom-text-editor[mini] {\n margin-bottom: @ui-padding/2;\n }\n\n .select-list ol.list-group,\n &.select-list ol.list-group {\n border: 1px solid @overlay-border-color;\n background-color: lighten(@overlay-background-color, 2%);\n\n &:empty {\n border: none;\n margin-top: 0;\n }\n\n li {\n padding: @modal-padding;\n line-height: @ui-line-height;\n border-bottom: 1px solid @overlay-border-color;\n\n &:last-of-type {\n border-bottom: none;\n }\n\n .icon::before {\n margin-left: 1px;\n }\n\n .icon.status {\n float: right;\n margin-left: @ui-padding-icon;\n &:before {\n margin-left: 0;\n margin-right: 0;\n }\n }\n\n &.selected {\n .status.icon {\n color: @text-color-selected;\n }\n }\n }\n\n }\n\n .select-list .key-binding {\n margin-top: -1px;\n margin-left: @ui-padding/2;\n margin-right: calc( -@ui-padding/3 ~\"+\" 1px);\n }\n\n .select-list .primary-line {\n display: block;\n }\n\n & > * {\n position: relative; // fixes stacking order\n }\n\n\n // Container\n &:before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 0;\n background-color: @overlay-background-color;\n border-radius: @component-border-radius*2;\n box-shadow: 0 6px 12px -2px hsla(0,0%,0%,.4);\n }\n\n // Backdrop\n // TODO: Add extra wrapper to translate individually or easier positioning\n\n &:after {\n content: \"\";\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: -1;\n background: @overlay-backdrop-color;\n opacity: @overlay-backdrop-opacity;\n backface-visibility: hidden; // fixes scrollbar on retina screens\n -webkit-animation: overlay-fade .24s cubic-bezier(0.215, 0.61, 0.355, 1);\n }\n\n @-webkit-keyframes overlay-fade {\n 0% { opacity: 0; }\n 100% { opacity: @overlay-backdrop-opacity; }\n }\n\n}\n","digest":"890e4f55f8035017d9f295a6a96247b398760fdf"},"node_modules/one-dark-ui/styles/nav.less":{"content":".nav-tabs {\n border-bottom: 1px solid @base-border-color;\n li {\n a,\n &.active a {\n border: none;\n margin-right: 0px;\n margin-bottom: 1px;\n }\n\n a:hover,\n &.active a,\n &.active a:hover {\n background-color: @background-color-highlight;\n border: none;\n color: @text-color-selected;\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n }\n\n &.active a {\n background-color: @tab-background-color-active;\n }\n }\n}\n","digest":"54ed0e49741845e8799c9513ae21ca7ae75f751d"},"node_modules/one-dark-ui/styles/notifications.less":{"content":"\natom-notifications {\n font-size: @ui-size * 1.2;\n\n atom-notification {\n width: 32em;\n &.has-detail {\n width: 32em;\n }\n\n &:first-child.has-close .message {\n padding-right: 9em;\n }\n &:only-child.has-close .message,\n &.has-close .message {\n padding-right: 2.5em;\n }\n .item {\n padding: @ui-padding/2;\n }\n\n .detail,\n .description {\n font-size: .85em;\n }\n\n &.icon:before {\n padding-top: .85em;\n }\n .close {\n width: 2.5em;\n height: 3em;\n line-height: 3em;\n font-size: inherit;\n }\n .close-all.btn {\n top: .5em;\n right: 2.5em;\n }\n .btn-copy-report {\n line-height: 2em;\n margin-left: .5em;\n }\n }\n}\n","digest":"2e08e0dc91ed0d4dcf79a1dcec241fd3ceac0cf4"},"node_modules/one-dark-ui/styles/packages.less":{"content":"// Overrides packages\n\n// find-and-replace + project-find ---------------------------\n\n.find-and-replace,\n.project-find {\n padding: @ui-padding/4;\n .input-block-item {\n padding: @ui-padding/4;\n }\n}\n\n// find-and-replace\n.find-and-replace {\n .header,\n .input-block {\n min-width: @ui-size*22;\n }\n\n .input-block-item {\n flex: 1 1 @ui-size*22;\n }\n .input-block-item--flex {\n flex: 100 1 @ui-size*22;\n }\n\n .btn,\n .btn-group-options .btn {\n font-size: @ui-size*1.1;\n padding: 0;\n }\n\n .btn-group-options .btn,\n .btn-group-options .btn.option-selection,\n .btn-group-options .btn.option-whole-word {\n padding: 0;\n font-size: @ui-input-size; // keep same as text input\n }\n\n .find-container atom-text-editor {\n padding-right: @ui-size*5; // leave some room for the results count\n }\n .find-meta-container {\n top: 0;\n font-size: @ui-size;\n line-height: @ui-size*2.5;\n }\n}\n\n// project-find\n.project-find {\n .header,\n .input-block {\n min-width: @ui-size*15;\n }\n\n .input-block-item {\n flex: 1 1 @ui-size*14;\n }\n .input-block-item--flex {\n flex: 100 1 @ui-size*20;\n }\n\n .btn {\n font-size: @ui-size*1.1;\n padding: 0;\n }\n .btn-group-options .btn {\n padding: 0;\n font-size: @ui-input-size; // keep same as text input\n }\n}\n\n// Colorize find-and-replace based on results\n& when (@ui-hue >= 190) and (@ui-hue <= 340) {\n .find-and-replace {\n &.has-no-results .find-container atom-text-editor[mini].is-focused {\n border-color: @text-color-error;\n box-shadow: 0 0 0 1px @text-color-error;\n background-color: mix(@text-color-error, @input-background-color, 10%);\n .selection .region {\n background-color: mix(@text-color-error, @input-background-color, 50%);\n }\n .cursor {\n border-color: @text-color-error;\n }\n }\n\n &.has-results .find-container atom-text-editor[mini].is-focused {\n border-color: @text-color-success;\n box-shadow: 0 0 0 1px @text-color-success;\n background-color: mix(@text-color-success, @input-background-color, 10%);\n .selection .region {\n background-color: mix(@text-color-success, @input-background-color, 50%);\n }\n .cursor {\n border-color: @text-color-success;\n }\n }\n\n &.has-results .find-container .result-counter { color: @text-color-success; }\n &.has-no-results .find-container .result-counter { color: @text-color-error; }\n }\n}\n\n\n\n\n// Timecop ---------------------------\n\n.timecop {\n .timecop-panel {\n padding: @component-padding/2;\n background-color: @level-2-color;\n }\n\n .tool-panel {\n padding: @component-padding/2;\n background-color: @level-2-color;\n }\n\n .inset-panel {\n border: 1px solid @base-border-color;\n }\n\n .panel-heading {\n .text(highlight);\n border-color: @base-border-color;\n background-color: @level-1-color;\n }\n\n .list-item .inline-block {\n line-height: 1.5;\n }\n}\n\n\n// Command Palette + Fuzzy Finder ---------------------------\n\n.command-palette .list-group .character-match,\n.fuzzy-finder .list-group .character-match {\n color: @accent-only-text-color;\n}\n\n\n// Deprecation Cop ---------------------------\n\n.deprecation-cop {\n .deprecation-overview {\n background-color: @level-2-color;\n border-bottom: 1px solid @base-border-color;\n }\n}\n\n\n// Tool Bar ---------------------------\n\n.tool-bar {\n // Make it look the same as other panels\n background-color: @level-3-color;\n border: none;\n\n // just a single border + more spacing\n &.tool-bar-horizontal .tool-bar-spacer {\n border-left: 0 none;\n margin-left: .5em;\n margin-right: .5em;\n }\n &.tool-bar-vertical .tool-bar-spacer {\n border-bottom: 0 none;\n margin-top: .5em;\n margin-bottom: .5em;\n }\n\n // only show button styles on hover\n button.tool-bar-btn {\n background-color: @level-3-color;\n background-image: none;\n border-color: @level-3-color;\n }\n}\n","digest":"ca6dd32da78f7a265151bdc16ad95616ee42c1b0"},"node_modules/one-dark-ui/styles/panels.less":{"content":"\n// Panels\n\natom-panel {\n .text(normal);\n position: relative;\n border-bottom: 1px solid @base-border-color;\n\n &.top {\n border-right: 1px solid @base-border-color;\n }\n &.left {\n border-right: 1px solid @base-border-color;\n }\n &.right {\n border-left: 1px solid @base-border-color;\n }\n &.bottom {\n border-right: 1px solid @base-border-color;\n }\n &.footer:last-child {\n border-bottom: none;\n }\n &.tool-panel:empty {\n border: none;\n }\n}\n\n.panel {\n &.bordered {\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n}\n\n.inset-panel {\n position: relative;\n background-color: @inset-panel-background-color;\n border-radius: @component-border-radius;\n &.bordered {\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n & .panel-heading {\n border-color: @inset-panel-border-color;\n }\n}\n\n.panel-heading {\n .text(normal);\n border-bottom: 1px solid @panel-heading-border-color;\n background-color: @panel-heading-background-color;\n\n .btn {\n padding-left: 8px;\n padding-right: 8px;\n .btn-default(\n lighten(@button-background-color, 10%),\n lighten(@button-background-color-hover, 10%),\n lighten(@button-background-color-selected, 10%),\n lighten(@text-color, 10%)\n );\n }\n}\n","digest":"78e95fe77592b096e829427a1a4c35c24f9baea6"},"node_modules/one-dark-ui/styles/panes.less":{"content":"\natom-pane-container {\n\n atom-pane {\n position: relative;\n border-right: 1px solid @base-border-color;\n border-bottom: 1px solid @base-border-color;\n\n .item-views {\n // prevent atom-text-editor from leaking ouside might improve performance\n overflow: hidden;\n }\n }\n\n}\n\n// Hide right-most border\natom-pane:only-child,\natom-pane-axis.pane-row > atom-pane:last-child,\natom-pane-axis.pane-column:last-child > atom-pane {\n border-right: none;\n}\n","digest":"517a4bfd51fba7919d84a7e89eef84db64f68d55"},"node_modules/one-dark-ui/styles/progress.less":{"content":"\n// Spinner ----------------------\n\n@spinner-duration: 1.2s;\n\n.loading-spinner(@size) {\n position: relative;\n display: block;\n width: 1em;\n height: 1em;\n font-size: @size;\n background: radial-gradient(@accent-color .1em, transparent .11em);\n\n &::before,\n &::after {\n content: \"\";\n position: absolute;\n z-index: 10; // prevent sibling elements from getting their own layers\n top: 0;\n left: 0;\n border-radius: 1em;\n width: inherit;\n height: inherit;\n border-radius: 1em;\n border: 2px solid;\n -webkit-animation: spinner-animation @spinner-duration infinite;\n -webkit-animation-fill-mode: backwards;\n }\n &::before {\n border-color: @accent-color transparent transparent transparent;\n }\n &::after {\n border-color: transparent lighten(@accent-color, 15%) transparent transparent;\n -webkit-animation-delay: @spinner-duration/2;\n }\n\n &.inline-block {\n display: inline-block;\n }\n}\n\n@-webkit-keyframes spinner-animation {\n 0% { transform: rotateZ( 0deg); -webkit-animation-timing-function: cubic-bezier(0, 0, .8, .2); }\n 50% { transform: rotateZ(180deg); -webkit-animation-timing-function: cubic-bezier(.2, .8, 1, 1); }\n 100% { transform: rotateZ(360deg); }\n}\n\n// Spinner sizes\n.loading-spinner-tiny { .loading-spinner(16px); &::before, &::after { border-width: 1px; } }\n.loading-spinner-small { .loading-spinner(32px); }\n.loading-spinner-medium { .loading-spinner(48px); }\n.loading-spinner-large { .loading-spinner(64px); }\n\n\n\n\n// Progress Bar ----------------------\n\n@progress-height: 8px;\n@progress-buffer-color: fade(@progress-background-color, 20%);\n\nprogress {\n -webkit-appearance: none;\n height: @progress-height;\n border-radius: @component-border-radius;\n background-color: @input-background-color;\n box-shadow: inset 0 0 0 1px @input-border-color;\n\n &::-webkit-progress-bar {\n background-color: transparent;\n }\n\n &::-webkit-progress-value {\n border-radius: @component-border-radius;\n background-color: @progress-background-color;\n }\n\n // Is buffering (when no value is set)\n &:indeterminate {\n background-image:\n linear-gradient(-45deg, transparent 33%, @progress-buffer-color 33%,\n @progress-buffer-color 66%, transparent 66%);\n background-size: 25px @progress-height, 100% 100%, 100% 100%;\n\n // Plays animation for 1min (12runs) at normal speed,\n // then slows down frame-rate for 9mins (108runs) to limit CPU usage\n -webkit-animation: progress-buffering 5s linear 12,\n progress-buffering 5s 60s steps(10) 108;\n }\n}\n\n@-webkit-keyframes progress-buffering {\n 100% { background-position: -100px 0px; }\n}\n","digest":"c51843dd15ee040fd7a60aaccf3e2d1071459cb0"},"node_modules/one-dark-ui/styles/settings.less":{"content":"\n// Settings\n\n// Modular Scale (1.125): http://www.modularscale.com/?1&em&1.125&web&table\n@ms-6: @ui-size * 2.027;\n@ms-5: @ui-size * 1.802;\n@ms-4: @ui-size * 1.602;\n@ms-3: @ui-size * 1.424;\n@ms-2: @ui-size * 1.266;\n@ms-1: @ui-size * 1.125;\n@ms-0: @ui-size * 1;\n@ms_1: @ui-size * 0.889;\n@ms_2: @ui-size * 0.790;\n\n\n\n.settings-view {\n\n\t// Menu ------------------------------\n\n\t.config-menu {\n\t\tposition: relative;\n\t\tmin-width: @ui-size * 15;\n\t\tmax-width: @ui-size * 20;\n\t\tborder-width: 0 1px 0 0;\n\t\tborder-image: linear-gradient(@level-2-color 10px, @base-border-color 200px) 0 1 0 0 stretch;\n\t\tbackground: @level-2-color;\n\n\t\t.btn {\n\t\t\twhite-space: initial;\n\t\t\tfont-size: @ms_1;\n\t\t\tline-height: 1;\n\t\t\tpadding: @ui-padding/3 @ui-padding/2;\n\t\t\t&::before {\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t}\n\n\n\t}\n\t.nav {\n\t\t& > li > a {\n\t\t\tpadding: @ui-padding/2 @ui-padding;\n\t\t\tline-height: @ui-line-height;\n\t\t}\n\t}\n\n\n\t// Sections ------------------------------\n\n\t& > .panels {\n\t\tbackground-color: @level-2-color;\n\t}\n\n\t.section-container {\n\t\tmax-width: @ui-size*60;\n\t}\n\t.sub-section {\n\t\tmargin: @ui-padding*3 0;\n\t}\n\n\t.section,\n\t.section:first-child,\n\t.section:last-child {\n\t\tpadding: @ui-padding*3;\n\t}\n\n\t.themes-panel .control-group {\n\t\tmargin-top: @ui-padding*2;\n\t}\n\n\n\t// Titles ------------------------------\n\n\t.section .section-heading {\n\t\tmargin-bottom: @ui-padding/1.5;\n\t}\n\n\t.sub-section-heading.icon:before,\n\t.section-heading.icon:before {\n\t\tmargin-right: @ui-padding-icon;\n\t}\n\n\n\n\t// Cards ------------------------------\n\n\t.package-card {\n\t\tpadding: @ui-padding;\n\t\t.meta-controls .status-indicator {\n\t\t\twidth: @ui-padding/4;\n\t\t\t&:before {\n\t\t\t\tcontent: \"\\00a0\"; // fixes 0 height\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// Components ------------------------------\n\n\t.icon::before {\n\t\tcolor: @text-color-subtle;\n\t}\n\n\t.editor-container {\n\t\tmargin: @ui-padding 0;\n\t}\n\n\t.form-control {\n\t\tfont-size: @ui-size*1.25;\n\t\theight: @ui-line-height;\n\t\tpadding-top: 0;\n\t\tpadding-bottom: 0;\n\t}\n\n\t.update-all-button {\n\t\tfont-size: .75em;\n\t}\n\n\t.install-button {\n\t\t.btn-variant(@accent-bg-color);\n\t}\n\n\tinput[type=\"checkbox\"] {\n\t\tbackground-color: @background-color-selected;\n\t\t&:active,\n\t\t&:checked {\n\t\t\tbackground-color: @accent-color;\n\t\t}\n\t\t&:before,\n\t\t&:after {\n\t\t\tbackground-color: @accent-text-color;\n\t\t}\n\t}\n\n\t.search-container .btn {\n\t\tfont-size: @ui-input-size;\n\t}\n\n}\n","digest":"83169623788115c290201ced548017a86c5f3e24"},"node_modules/one-dark-ui/styles/sites.less":{"content":"// Site Colors\n\n.ui-site(@num, @color) {\n .ui-site-@{num} {\n background-color: @color;\n }\n}\n\n.ui-site(1, @ui-site-color-1);\n.ui-site(2, @ui-site-color-2);\n.ui-site(3, @ui-site-color-3);\n.ui-site(4, @ui-site-color-4);\n.ui-site(5, @ui-site-color-5);\n","digest":"b27327b73cb57001e574b9d1db332766ac6d1e4e"},"node_modules/one-dark-ui/styles/status-bar.less":{"content":"\n@status-bar-height: @ui-tab-height; // same as tabs\n@status-bar-padding: @ui-padding;\n\n.status-bar {\n font-size: @ui-size;\n height: @status-bar-height;\n line-height: @status-bar-height;\n background-color: @level-3-color;\n\n .flexbox-repaint-hack {\n padding: 0; // override default\n }\n\n // underlines should only be used for external links\n a:hover,\n a:focus {\n text-decoration: none;\n cursor: default;\n }\n\n .inline-block {\n margin: 0; // override default\n padding: 0 @status-bar-padding/2;\n vertical-align: top;\n\n &:hover {\n background-color: @level-3-color-hover;\n }\n &:active {\n background-color: @level-3-color-active;\n }\n\n // reset on child inline-block\n .inline-block {\n margin: 0;\n padding: 0;\n }\n }\n\n .status-bar-right {\n .inline-block {\n margin-left: 0; // override default\n }\n }\n .icon {\n vertical-align: middle;\n }\n .icon::before {\n font-size: 1.33333em; // should be 16px with a default of 12px\n \twidth: auto; // use natural width\n line-height: 1;\n height: 1em; // same as line-height\n margin-right: .25em;\n top: auto;\n }\n}\n\n\n// Package overrides -------------------------------\n\n.status-bar.status-bar {\n\n // Read-only -> Remove hover effect\n .is-read-only, // <- use this class in packages\n status-bar-launch-mode,\n status-bar-cursor,\n busy-signal {\n &:hover,\n &:active,\n .inline-block:hover,\n .inline-block:active {\n background-color: transparent;\n }\n }\n\n // Remove underline\n .package-updates-status-view,\n .github-ChangedFilesCount {\n &:hover,\n &:focus {\n text-decoration: none;\n cursor: default;\n }\n }\n}\n","digest":"3ed78884247dbf0dcb19851c5663aae8c5da3169"},"node_modules/one-dark-ui/styles/tabs.less":{"content":"\n// Tabs\n\n@tab-border: 1px solid @tab-border-color;\n@title-padding: .66em;\n@icon-padding-top: .5em; // 2.5 (total) - 1.5 (text) / 2\n@icon-padding-right: .5em;\n\n.tab-bar {\n position: relative;\n height: @ui-tab-height;\n box-shadow: inset 0 -1px 0 @tab-border-color;\n background: @tab-bar-background-color;\n overflow-x: auto;\n overflow-y: hidden;\n border-radius: 0;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n &:empty {\n display: none;\n }\n\n\n // Tab ----------------------\n\n .tab {\n position: relative;\n top: 0;\n padding: 0;\n margin: 0;\n height: inherit;\n font-size: inherit;\n line-height: @ui-tab-height;\n color: @tab-text-color;\n background-color: @tab-background-color;\n box-shadow: inherit;\n border-left: @tab-border;\n &.active {\n color: @tab-text-color-active;\n background-color: @tab-background-color-active;\n box-shadow: none;\n }\n &:first-of-type {\n border-left-color: transparent;\n }\n &:last-of-type {\n // use box-shadow to not take up any space\n box-shadow: inset 0 -1px 0 @tab-border-color, 1px 0 0 @base-border-color;\n }\n &.active:last-of-type {\n box-shadow: 1px 0 0 @base-border-color;\n }\n\n\n // Title ----------------------\n\n .title {\n text-align: center;\n margin: 0 @title-padding;\n }\n\n\n // Icons ----------------------\n\n .title.title:before {\n margin-right: .3em;\n width: auto;\n height: auto;\n line-height: 1;\n font-size: 1.125em;\n vertical-align: -.0625em; // Adjust center for the 0.1em font-size increase\n }\n\n // Close icon ----------------------\n\n .close-icon {\n top: @icon-padding-top;\n right: @icon-padding-right;\n z-index: 2;\n font-size: 1em;\n width: 1.5em;\n height: 1.5em;\n line-height: 1.5;\n text-align: center;\n border-radius: @component-border-radius;\n background-color: inherit;\n overflow: hidden;\n transform: scale(0);\n transition: transform .08s;\n &:hover {\n color: @accent-text-color;\n background-color: @accent-color;\n }\n &:active {\n background-color: fade(@accent-color, 50%);\n }\n &::before {\n z-index: 1;\n font-size: 1.1em;\n vertical-align: -.05em; // Adjust center for the 0.1em font-size increase\n width: auto;\n height: auto;\n pointer-events: none;\n }\n }\n &:hover .close-icon {\n transform: scale(1);\n transition-duration: .16s;\n }\n }\n\n // Modified icon ----------------------\n\n .tab.modified {\n &:hover .close-icon {\n color: @accent-color;\n &:hover {\n color: @accent-bg-text-color;\n }\n }\n &:not(:hover) .close-icon {\n top: @icon-padding-top;\n right: @icon-padding-right;\n width: 1.5em;\n height: 1.5em;\n line-height: 1.5;\n color: @accent-color;\n border-radius: @component-border-radius;\n border: none;\n transform: scale(1);\n &::before {\n content: \"\\f052\";\n display: inline-block;\n }\n }\n }\n\n\n // Tabs in the docks ----------------------\n\n atom-dock & {\n .tab.active {\n background-color: @tool-panel-background-color;\n }\n }\n\n\n // Dragging ----------------------\n\n .tab.is-dragging {\n opacity: .5;\n\n .close-icon,\n &:before {\n visibility: hidden;\n }\n }\n\n .placeholder {\n position: relative;\n pointer-events: none;\n\n // bar\n &:before {\n z-index: 1;\n margin: 0;\n width: 2px;\n height: @ui-tab-height;\n background-color: @accent-color;\n }\n\n // arrow\n &:after {\n z-index: 0;\n top: @ui-tab-height/2;\n margin: -4px 0 0 -3px;\n border-radius: 0;\n border: 4px solid @accent-color;\n transform: rotate(45deg);\n background: transparent;\n }\n\n &:last-child {\n &:before {\n margin-left: -2px;\n }\n &:after {\n transform: none;\n margin-left: -10px;\n border-color: transparent @accent-color transparent transparent;\n }\n }\n }\n\n\n // Overrides ----------------------\n\n // keep tabs same size when active\n .tab,\n .tab.active {\n padding-right: 0;\n .title {\n padding: 0;\n }\n }\n}\n\n\n// Active pane marker --------------\n\natom-pane.active .tab.active:before {\n content: \"\";\n position: absolute;\n pointer-events: none;\n z-index: 2;\n top: 0;\n left: -1px; // cover left border\n bottom: 0;\n width: 2px;\n background: @accent-color;\n}\n\n// hide marker in docks\natom-dock .tab-bar .tab::before {\n display: none;\n}\n\n\n// Custom tabs --------------\n\n.tab-bar .tab.active {\n &[data-type$=\"Editor\"],\n &[data-type$=\"AboutView\"],\n &[data-type$=\"TimecopView\"],\n &[data-type$=\"StyleguideView\"],\n &[data-type=\"MarkdownPreviewView\"] {\n color: @tab-text-color-editor;\n background-color: @tab-background-color-editor; // Match syntax background color\n }\n}\n","digest":"1da2c3a580bb8d3f892a67d378eea1e887c22a64"},"node_modules/one-dark-ui/styles/text.less":{"content":"h1,\nh2,\nh3 {\n line-height: 1em;\n margin-bottom: 15px\n}\nh1 { font-size: 2em; }\nh2 { font-size: 1.5em; }\nh3 { font-size: 1.2em; }\n\np {\n line-height: 1.6;\n margin-bottom: 15px;\n}\n\nlabel {\n font-weight: normal;\n}\n\npre {\n box-shadow: none;\n color: @text-color;\n background: @inset-panel-background-color;\n border-radius: @component-border-radius;\n border: none;\n margin: 0;\n}\n\ncode {\n .text(highlight);\n background: @background-color-highlight;\n border-radius: @component-border-radius;\n}\n\n.selected { .text(highlight); }\n\n.text-smaller { font-size: 0.9em; }\n\n.text-subtle { .text(subtle); }\n.text-highlight { .text(highlight); }\n\n.text-error { .text(error); }\n.text-info {\n .text(info);\n &:hover { color: @text-color-info; }\n}\n.text-warning {\n .text(warning);\n &:hover { color: @text-color-warning; }\n}\n.text-success {\n .text(success);\n &:hover { color: @text-color-success; }\n}\n\n.highlight-mixin {\n padding: 1px 4px;\n border-radius: 2px;\n}\n\n.highlight {\n .highlight-mixin();\n font-weight: 700;\n color: @text-color-highlight;\n background-color: @background-color-highlight;\n}\n\n.highlight-color(@name, @background-color) {\n .highlight-@{name} {\n .highlight-mixin();\n font-weight: 500;\n color: white;\n text-shadow: 0 1px 0px hsla(0,0%,0%,.2);\n background-color: @background-color;\n }\n}\n.highlight-color( info, @background-color-info);\n.highlight-color(warning, @background-color-warning);\n.highlight-color( error, @background-color-error);\n.highlight-color(success, @background-color-success);\n\n.results-view .path-details.list-item {\n color: darken(@text-color-highlight, 18%);\n}\n","digest":"38471280be8bb348914ba7bf07bd03405facbd14"},"node_modules/one-dark-ui/styles/title-bar.less":{"content":".title-bar {\n height: 22px; // remove 1px since there is no border\n border-bottom: none;\n}\n","digest":"93638036e200a218636d7f1cdb32276c0c04ce0c"},"node_modules/one-dark-ui/styles/tooltips.less":{"content":".tooltip {\n white-space: nowrap;\n font-size: @ui-size*1.15;\n\n &.in {\n opacity: 1;\n transition: opacity .12s ease-out;\n }\n\n .tooltip-inner {\n line-height: 1;\n padding: @ui-padding*.5 @ui-padding*.65;\n border-radius: @component-border-radius;\n background-color: @tooltip-background-color;\n color: @tooltip-text-color;\n white-space: nowrap;\n max-width: none;\n }\n\n .keystroke {\n font-size: max(1em, @ui-size*.85);\n padding: .1em .4em;\n margin: 0 @ui-padding*-.35 0 @ui-padding*.25;\n border-radius: max(2px, @component-border-radius / 2);\n color: @tooltip-text-key-color;\n background: @tooltip-background-key-color;\n }\n\n &.top .tooltip-arrow {\n border-top-color: @tooltip-background-color;\n }\n &.top-left .tooltip-arrow {\n border-top-color: @tooltip-background-color;\n }\n &.top-right .tooltip-arrow {\n border-top-color: @tooltip-background-color;\n }\n &.right .tooltip-arrow {\n border-right-color: @tooltip-background-color;\n }\n &.left .tooltip-arrow {\n border-left-color: @tooltip-background-color;\n }\n &.bottom .tooltip-arrow {\n border-bottom-color: @tooltip-background-color;\n }\n &.bottom-left .tooltip-arrow {\n border-bottom-color: @tooltip-background-color;\n }\n &.bottom-right .tooltip-arrow {\n border-bottom-color: @tooltip-background-color;\n }\n}\n","digest":"d04c888a4ae472d7609d5ae9db25e2ded92049cc"},"node_modules/one-dark-ui/styles/tree-view.less":{"content":"@tree-view-height: @ui-line-height;\n\n.tree-view {\n font-size: @ui-size;\n background: @tree-view-background-color;\n\n .project-root.project-root {\n &:before {\n height: @ui-tab-height;\n background-clip: padding-box;\n }\n & > .header .name {\n line-height: @ui-tab-height;\n }\n }\n\n .selected:before {\n background: @tree-view-background-selected-color;\n }\n}\n\n.theme-one-dark-ui .tree-view .project-root.project-root::before {\n border-top: 1px solid transparent;\n background-clip: padding-box;\n}\n\n.tree-view-resizer {\n .tree-view-resize-handle {\n width: 8px;\n }\n}\n\n// Variable height, based on ems\n.list-group li:not(.list-nested-item),\n.list-tree li:not(.list-nested-item),\n.list-group li.list-nested-item > .list-item,\n.list-tree li.list-nested-item > .list-item {\n line-height: @tree-view-height;\n}\n\n.list-group .selected::before,\n.list-tree .selected::before {\n height: @tree-view-height;\n}\n\n// icon\n.list-group .icon,\n.list-tree .icon {\n display: inline-block;\n height: inherit;\n &::before {\n top: initial;\n line-height: inherit;\n height: inherit;\n vertical-align: top;\n }\n}\n\n// Arrow icon\n.list-group,\n.list-tree {\n .header.header.header.header::before {\n top: initial;\n line-height: inherit;\n height: inherit;\n vertical-align: top;\n }\n}\n.tree-view .project-root-header.project-root-header.project-root-header.project-root-header::before {\n line-height: 2.5em;\n}\n\n// Active tree-view marker --------------\n\n.tree-view::before {\n content: \"\";\n position: fixed;\n pointer-events: none;\n z-index: 1;\n height: @ui-tab-height;\n width: 2px;\n background: @accent-color;\n opacity: 0;\n transition: opacity .16s;\n}\n\n.tree-view:focus::before {\n opacity: 1;\n transition-duration: .32s;\n}\n","digest":"ad92d3ae03d42561e915df03447e87198f3e400c"},"node_modules/one-dark-ui/styles/ui-mixins.less":{"content":"// Pattern matching; ish is cray.\n// http://lesscss.org/#-pattern-matching-and-guard-expressions\n\n.text(normal) {\n font-weight: normal;\n color: @text-color;\n}\n.text(subtle) {\n font-weight: normal;\n color: @text-color-subtle;\n}\n.text(highlight) {\n font-weight: normal;\n color: @text-color-highlight;\n}\n.text(selected) {\n .text(highlight)\n}\n\n.text(info) {\n color: @text-color-info;\n}\n.text(success) {\n color: @text-color-success;\n}\n.text(warning) {\n color: @text-color-warning;\n}\n.text(error) {\n color: @text-color-error;\n}\n\n.focus() {\n outline: none;\n border-color: @accent-color;\n box-shadow: 0 0 0 1px @accent-color;\n}\n","digest":"64440a0c97fef0deb3fdf02973e6f8b131c5339e"},"node_modules/one-dark-ui/styles/ui-variables-custom.less":{"content":"\n// ONE dark UI colors\n// ----------------------------------------------\n\n@import \"syntax-variables\";\n\n.ui-syntax-color() { @syntax-background-color: hsl(220,24%,20%); } .ui-syntax-color(); // fallback color\n@ui-syntax-color: @syntax-background-color;\n\n// Color guards -----------------\n@ui-s-h: hue(@ui-syntax-color);\n@ui-s-s: saturation(@ui-syntax-color);\n@ui-s-l: lightness(@ui-syntax-color);\n@ui-inv: 10%; // inverse lightness if below\n\n.ui-hue() when (@ui-s-s = 0) { @ui-hue: 220; } // Use blue hue when no saturation\n.ui-hue() when (@ui-s-s > 0) { @ui-hue: @ui-s-h; }\n.ui-hue();\n\n.ui-saturation() when (@ui-s-h <= 80) { @ui-saturation: min(@ui-s-s, 5%); } // minimize saturation for brown\n.ui-saturation() when (@ui-s-h > 80) and (@ui-s-h < 160) { @ui-saturation: min(@ui-s-s, 12%); } // reduce saturation for green\n.ui-saturation() when (@ui-s-h >= 160) and (@ui-s-l < @ui-inv) { @ui-saturation: min(@ui-s-s, 48%); } // limit max saturation for very dark backgrounds\n.ui-saturation() when (@ui-s-h >= 160) and (@ui-s-l >= @ui-inv) { @ui-saturation: @ui-s-s; }\n.ui-saturation();\n\n.ui-lightness() when (@ui-s-l < @ui-inv) {\n @ui-lightness: @ui-s-l + 8%; // increase lightness when too dark\n @ui-lightness-border: @ui-lightness*.3;\n}\n.ui-lightness() when (@ui-s-l >= @ui-inv) {\n @ui-lightness: min(@ui-s-l, 20%); // limit max lightness (for light syntax themes)\n @ui-lightness-border: @ui-lightness*.6;\n}\n.ui-lightness();\n\n// Main colors -----------------\n@ui-fg: hsl(@ui-hue, min(@ui-saturation, 18%), max(@ui-lightness*3, 66%) );\n@ui-bg: hsl(@ui-hue, @ui-saturation, @ui-lightness); // normalized @syntax-background-color\n@ui-border: hsl(@ui-hue, @ui-saturation, @ui-lightness-border);\n\n\n\n\n// Custom variables\n// These variables are only used in this theme\n// ----------------------------------------------\n\n@ui-theme-name: one-dark-ui;\n\n// Text (Custom) -----------------\n@text-color-faded: fade(@text-color, 20%);\n\n@text-color-added: @text-color-success; // green\n@text-color-ignored: @text-color-subtle; // faded\n@text-color-modified: @text-color-warning; // orange\n@text-color-removed: @text-color-error; // red\n@text-color-renamed: @text-color-info; // blue\n\n\n// Background (Custom) -----------------\n@level-1-color: lighten(@base-background-color, 6%);\n@level-2-color: @base-background-color;\n@level-3-color: darken(@base-background-color, 3%);\n\n@level-3-color-hover: lighten(@level-3-color, 6%);\n@level-3-color-active: lighten(@level-3-color, 3%);\n\n\n// Accent (Custom) -----------------\n@accent-luma: luma( hsl(@ui-hue, 50%, 50%) ); // get lightness of current hue\n\n// used for marker, inputs (smaller things)\n@accent-color: mix( hsv( @ui-hue, 100%, 66%), hsl( @ui-hue, 100%, 70%), @accent-luma ); // mix hsv + hsl (favor mostly hsl)\n@accent-text-color: contrast(@accent-color, hsl(@ui-hue,100%,10%), #fff, 25% );\n\n// used for button, tooltip (larger things)\n@accent-bg-color: mix( hsv( @ui-hue, 66%, 66%), hsl( @ui-hue, 66%, 60%), @accent-luma * 2 ); // mix hsv + hsl (favor hsl for dark, hsv for light colors)\n@accent-bg-text-color: contrast(@accent-bg-color, hsl(@ui-hue,100%,10%), #fff, 30% );\n\n// used for text only\n@accent-only-text-color: mix( hsv( @ui-hue, 100%, 66%), hsl( @ui-hue, 100%, 77%), @accent-luma ); // mix hsv + hsl (favor mostly hsl)\n\n// Components (Custom) -----------------\n@badge-background-color: lighten(@background-color-highlight, 6%);\n\n@button-text-color-selected: @accent-bg-text-color;\n@button-border-color-selected: @base-border-color;\n\n@checkbox-background-color: fade(@accent-bg-color, 33%);\n\n@input-background-color-focus: mix(@accent-bg-color, @input-background-color, 10%);\n@input-selection-color: mix(@accent-color, @input-background-color, 25%);\n@input-selection-color-focus: mix(@accent-color, @input-background-color, 50%);\n\n@overlay-backdrop-color: hsl(@ui-hue,@ui-saturation,10%);\n@overlay-backdrop-opacity: .9;\n\n@progress-background-color: @accent-color;\n\n@scrollbar-color: @level-1-color;\n@scrollbar-background-color: @level-3-color; // replaced `transparent` with a solid color to test https://github.com/atom/one-light-ui/issues/4\n@scrollbar-color-editor: contrast(@ui-syntax-color, darken(@ui-syntax-color, 18%), lighten(@ui-syntax-color, 9%) );\n@scrollbar-background-color-editor: @ui-syntax-color;\n\n\n@tab-text-color: @text-color-subtle;\n@tab-text-color-active: @text-color-highlight;\n@tab-text-color-editor: contrast(@ui-syntax-color, darken(@ui-syntax-color, 50%), @text-color-highlight );\n@tab-background-color-editor: @ui-syntax-color;\n\n@tree-view-background-selected-color: lighten(@level-3-color, 5%);\n\n@tooltip-background-color: @accent-bg-color;\n@tooltip-text-color: @accent-bg-text-color;\n@tooltip-text-key-color: @tooltip-background-color;\n@tooltip-background-key-color: @tooltip-text-color;\n\n\n// Sizes (Custom) -----------------\n\n@ui-size: 1em;\n@ui-input-size: @ui-size*1.15;\n@ui-padding: @ui-size*1.5;\n@ui-padding-pane: @ui-size*.5;\n@ui-padding-icon: @ui-padding/3.3;\n@ui-line-height: @ui-size*2;\n@ui-tab-height: @ui-size*2.5;\n\n\n\n\n// Packages variables\n// These variables are used to override packages\n// ----------------------------------------------\n\n@settings-list-background-color: darken(@level-2-color, 1.5%);\n@theme-config-box-shadow: inset 0 0 3px hsla(0, 0%, 100%, .4), 0 1px 3px hsla(0, 0%, 0%, .2);\n@theme-config-box-shadow-selected: inset 0 1px 3px hsla(0, 0%, 0%, .1);\n@theme-config-border-selected: hsla(0, 0%, 100%, .75);\n\n\n\n// Debug\n// Output variables to the top of the UI\n// -------------------------------------\n\n// html:before {\n// content: \"@{variable}\";\n// }\n","digest":"21d3b5d6edf725579cfad45b4a5d081ffa888850"},"node_modules/one-dark-ui/styles/ui-variables.less":{"content":"\n@import \"ui-variables-custom.less\"; // import colors and custom variables\n\n// ONE dark UI variables\n// ----------------------------------------------\n\n// Official variables\n// These variables must be defined in every theme\n// Source: https://github.com/atom/atom/blob/master/static/variables/ui-variables.less\n// ----------------------------------------------\n\n\n// Text -----------------\n@text-color: @ui-fg;\n@text-color-subtle: fadeout(@text-color, 40%);\n@text-color-highlight: lighten(@text-color, 20%);\n@text-color-selected: white;\n\n@text-color-info: hsl(219, 79%, 66%);\n@text-color-success: hsl(140, 44%, 62%);\n@text-color-warning: hsl( 36, 60%, 72%);\n@text-color-error: hsl( 9, 100%, 64%);\n\n\n// Background -----------------\n@background-color-info: hsl(208, 88%, 48%);\n@background-color-success: hsl(132, 58%, 40%);\n@background-color-warning: hsl( 42, 88%, 36%);\n@background-color-error: hsl( 5, 64%, 50%);\n\n@background-color-highlight: lighten(@base-background-color, 4%);\n@background-color-selected: lighten(@base-background-color, 8%);\n\n@app-background-color: @level-3-color;\n\n\n// Base -----------------\n@base-background-color: @ui-bg;\n@base-border-color: @ui-border;\n\n\n// Components -----------------\n@pane-item-background-color: @base-background-color;\n@pane-item-border-color: @base-border-color;\n\n@input-background-color: darken(@base-background-color, 6%);\n@input-border-color: @base-border-color;\n\n@tool-panel-background-color: @level-3-color;\n@tool-panel-border-color: @base-border-color;\n\n@inset-panel-background-color: lighten(@level-2-color, 4%);\n@inset-panel-border-color: fadeout(@base-border-color, 15%);\n\n@panel-heading-background-color: @level-2-color;\n@panel-heading-border-color: @base-border-color;\n\n@overlay-background-color: @level-2-color;\n@overlay-border-color: @base-border-color;\n\n@button-background-color: @level-1-color;\n@button-background-color-hover: lighten(@button-background-color, 2%);\n@button-background-color-selected: @accent-bg-color;\n@button-border-color: @base-border-color;\n\n@tab-bar-background-color: @level-3-color;\n@tab-bar-border-color: @base-border-color;\n@tab-background-color: @level-3-color;\n@tab-background-color-active: @level-2-color;\n@tab-border-color: @base-border-color;\n\n@tree-view-background-color: @level-3-color;\n@tree-view-border-color: @base-border-color;\n\n@ui-site-color-1: hsl(208, 100%, 50%); // blue\n@ui-site-color-2: hsl(160, 70%, 42%); // green\n@ui-site-color-3: hsl(32, 60%, 50%); // orange\n@ui-site-color-4: #D831B0; // pink\n@ui-site-color-5: #EBDD5B; // yellow\n\n\n// Sizes -----------------\n@font-size: 12px;\n@input-font-size: 14px;\n@disclosure-arrow-size: 12px;\n\n@component-padding: 10px;\n@component-icon-padding: 5px;\n@component-icon-size: 16px; // needs to stay 16px to look sharpest\n@component-line-height: 25px;\n@component-border-radius: 3px;\n\n@tab-height: 30px;\n\n\n// Font -----------------\n@font-family: 'BlinkMacSystemFont', 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif;\n","digest":"ade239ee28a3515a891063cf32f6ab0f6abbee09"},"node_modules/one-light-ui/index.less":{"content":"@import \"variables/ui-variables\";\n@import \"variables/syntax-variables\";\n\n// Atom UI Theme: One\n\n@import \"styles/ui-variables.less\";\n@import \"styles/ui-mixins.less\";\n@import \"octicon-mixins.less\"; // https://github.com/atom/atom/blob/master/static/variables/octicon-mixins.less\n\n@import \"styles/atom.less\";\n@import \"styles/badges.less\";\n@import \"styles/buttons.less\";\n@import \"styles/docks.less\";\n@import \"styles/editor.less\";\n@import \"styles/git.less\";\n@import \"styles/inputs.less\";\n@import \"styles/lists.less\";\n@import \"styles/messages.less\";\n@import \"styles/nav.less\";\n@import \"styles/notifications.less\";\n@import \"styles/modal.less\";\n@import \"styles/panels.less\";\n@import \"styles/panes.less\";\n@import \"styles/progress.less\";\n@import \"styles/tabs.less\";\n@import \"styles/text.less\";\n@import \"styles/title-bar.less\";\n@import \"styles/tooltips.less\";\n@import \"styles/tree-view.less\";\n@import \"styles/status-bar.less\";\n@import \"styles/key-binding.less\";\n@import \"styles/sites.less\";\n\n@import \"styles/settings.less\";\n@import \"styles/packages.less\";\n@import \"styles/core.less\";\n@import \"styles/config.less\";\n","digest":"9ae52af555fe1bcd2721d52c1539ca092a07aafa"},"node_modules/one-light-ui/styles/atom.less":{"content":"* {\n\tbox-sizing: border-box;\n}\n\nhtml {\n\tfont-size: @font-size;\n}\n\natom-workspace {\n\tbackground-color: @app-background-color;\n}\n\n\n// Scrollbars ------------------------------------\n\n.scrollbars-visible-always {\n\t::-webkit-scrollbar {\n\t\twidth: 10px;\n\t\theight: 10px;\n\t}\n\n\t::-webkit-scrollbar-track {\n\t\tbackground: @scrollbar-background-color;\n\t}\n\n\t::-webkit-scrollbar-thumb {\n\t\tborder-radius: 5px;\n\t\tborder: 3px solid @scrollbar-background-color;\n\t\tbackground: @scrollbar-color;\n\t\tbackground-clip: content-box;\n\t}\n\n\t::-webkit-scrollbar-corner {\n\t\tbackground: @scrollbar-background-color;\n\t}\n\n\t::-webkit-scrollbar-thumb:vertical:active {\n\t\tborder-radius: 0;\n\t\tborder-left-width: 0;\n\t\tborder-right-width: 0;\n\t}\n\n\t::-webkit-scrollbar-thumb:horizontal:active {\n\t\tborder-radius: 0;\n\t\tborder-top-width: 0;\n\t\tborder-bottom-width: 0;\n\t}\n\n\tatom-text-editor {\n\t\t::-webkit-scrollbar-track {\n\t\t\tbackground: @scrollbar-background-color-editor;\n\t\t}\n\t\t::-webkit-scrollbar-corner {\n\t\t\tbackground: @scrollbar-background-color-editor;\n\t\t}\n\t\t::-webkit-scrollbar-thumb {\n\t\t\tborder-color: @scrollbar-background-color-editor;\n\t\t\tbackground: @scrollbar-color-editor;\n\t\t}\n\t}\n}\n\n// TODO: Move to a better place, not sure where it gets used\n.caret {\n border-top: 5px solid #fff;\n margin-top: -1px;\n}\n","digest":"df4447499593550b61146e7af8d0f4cd17991112"},"node_modules/one-light-ui/styles/badges.less":{"content":".badge {\n padding: @ui-padding/4 @ui-padding/2.5;\n min-width: @ui-padding*1.25;\n .text(highlight);\n border-radius: @ui-size*2;\n background-color: @badge-background-color;\n\n // Icon ----------------------\n &.icon {\n font-size: @ui-size;\n padding: @ui-padding-icon @ui-padding-icon*1.5;\n }\n\n}\n","digest":"bfb1f9e90af654b5baa53d74c36628140507a3f7"},"node_modules/one-light-ui/styles/buttons.less":{"content":"\n@btn-border: 1px solid @button-border-color;\n@btn-padding: 0 @ui-size/1.25;\n\n// Mixins -----------------------\n\n.btn-default (@color, @hover-color, @selected-color, @text-color) {\n color: @text-color;\n text-shadow: none;\n border: @btn-border;\n background-color: @color;\n background-image: linear-gradient(lighten(@color, 2%), @color);\n\n &:hover {\n color: @text-color-highlight;\n background-image: linear-gradient(lighten(@hover-color, 2%), @hover-color);\n }\n &:active {\n background: darken(@color, 4%);\n box-shadow: none;\n }\n &.selected {\n background: @selected-color;\n }\n &.selected:focus,\n &.selected:hover {\n background: lighten(@selected-color, 2%);\n }\n &:focus {\n .focus(); // unfortunately :focus styles stay even after releasing mouse.\n }\n}\n\n.btn-variant (@color) {\n @_text-color: contrast(@color, white, hsl(0,0%,20%), 33% );\n .btn-default(\n @color,\n lighten(@color, 3%),\n saturate(darken(@color, 12%), 20%),\n @text-color-highlight\n );\n color: @_text-color;\n\n & when (@ui-lightness > 50%) {\n border-color: transparent; // hide border on light backgrounds\n }\n\n &:hover,\n &:focus {\n color: @_text-color;\n }\n &:focus {\n border-color: transparent;\n background-clip: padding-box;\n box-shadow: inset 0 0 0 1px fade(@base-border-color, 50%), 0 0 0 1px @color;\n }\n\n &.icon:before {\n color: @_text-color;\n }\n}\n\n\n// Buttons -----------------------\n\n.btn {\n height: initial;\n padding: @btn-padding;\n font-size: @ui-size;\n line-height: @ui-line-height;\n}\n\n.btn,\n.btn.btn-default {\n .btn-default(@button-background-color, @button-background-color-hover, @button-background-color-selected, @text-color);\n}\n\n.btn.btn-primary {\n .btn-variant(@accent-bg-color);\n}\n.btn.btn-info {\n .btn-variant(@background-color-info);\n}\n.btn.btn-success {\n .btn-variant(@background-color-success);\n}\n.btn.btn-warning {\n .btn-variant(@background-color-warning);\n}\n.btn.btn-error {\n .btn-variant(@background-color-error);\n}\n\n\n// Button Sizes -----------------------\n\n.btn.btn-xs,\n.btn-group-xs > .btn {\n font-size: @ui-size*.8;\n line-height: @ui-line-height;\n padding: @btn-padding;\n}\n.btn.btn-sm,\n.btn-group-sm > .btn {\n font-size: @ui-size*.9;\n line-height: @ui-line-height;\n padding: @btn-padding;\n}\n.btn.btn-lg,\n.btn-group-lg > .btn {\n font-size: @ui-size * 1.5;\n line-height: @ui-line-height;\n padding: @btn-padding;\n}\n\n\n// Button Group -----------------------\n\n.btn-group > .btn {\n z-index: 0;\n &:hover {\n z-index: 0;\n }\n &.btn:focus {\n z-index: 1;\n .focus();\n }\n\n &:first-child {\n border-left: @btn-border;\n }\n &:last-child,\n &.selected:last-child {\n border-right: @btn-border;\n }\n\n // hide border on light backgrounds\n & when (@ui-lightness > 50%) {\n &.btn-primary:first-child,\n &.btn-info:first-child,\n &.btn-success:first-child,\n &.btn-warning:first-child,\n &.btn-error:first-child {\n border-left-color: transparent;\n }\n\n &.btn-primary:last-child,\n &.btn-info:last-child,\n &.btn-success:last-child,\n &.btn-warning:last-child,\n &.btn-error:last-child {\n border-right-color: transparent;\n }\n }\n\n &.selected,\n &.selected:first-child,\n &.selected:last-child {\n color: @button-text-color-selected;\n border-color: @button-border-color-selected;\n }\n\n & when (@ui-lightness > 50%) {\n &.selected + .btn {\n border-left-color: @button-border-color-selected;\n }\n &.selected + .selected {\n border-left-color: mix(@button-border-color, @button-border-color-selected);\n }\n }\n\n &.selected:focus {\n border-color: @button-background-color-selected;\n box-shadow: inset 0 0 0 1px fade(@base-border-color, 50%), 0 0 0 1px @button-background-color-selected;\n }\n}\n\n\n// Button Icons -----------------------\n\n.btn.icon:before {\n width: auto;\n height: auto;\n font-size: 1.333333em;\n vertical-align: -.1em;\n}\n","digest":"771f75f5f119b4282fb0980b2c492e5cf15ad5d3"},"node_modules/one-light-ui/styles/config.less":{"content":"\n// Tabs ----------------------------------------------\n\n@theme-tabsizing: ~'theme-@{ui-theme-name}-tabsizing';\n@theme-dockButtons: ~'theme-@{ui-theme-name}-dock-buttons';\n\n@tab-min-width: 7em; // ~ icon + 6 characters\n\n\n// Even (default) ---------------\n\n.tab-bar {\n .tab,\n .tab.active {\n flex: 1 1 0;\n max-width: 22em;\n min-width: @tab-min-width;\n }\n atom-dock & {\n .tab,\n .tab.active {\n max-width: none;\n }\n }\n\n // TODO: Turn this into a config\n // Truncates the beginning instead\n // .title.title.title {\n // direction: rtl; // change direction\n // }\n}\n\n\n// Maximum (full width) ---------------\n\n[@{theme-tabsizing}=\"maximum\"] .tab-bar {\n .tab,\n .tab.active {\n max-width: none;\n }\n}\n\n\n// Minimum (show long paths) ---------------\n\n[@{theme-tabsizing}=\"minimum\"] .tab-bar {\n .tab,\n .tab.active {\n flex: 0 0 auto;\n min-width: 2.75em;\n max-width: @tab-min-width * 3.3;\n }\n atom-dock {\n .tab,\n .tab.active {\n max-width: @tab-min-width * 2;\n }\n }\n}\n\n\n\n// Hide docks toggle buttons ------------------------------\n\n[@{theme-dockButtons}=\"hidden\"] {\n\n // Hide docks when not open\n .atom-dock-inner:not(.atom-dock-open) {\n display: none;\n }\n\n // Hide toggle buttons\n .atom-dock-toggle-button {\n display: none;\n }\n\n}\n","digest":"7b535b404a0238604350777668da209e6cb2f2b7"},"node_modules/one-light-ui/styles/core.less":{"content":"// Misc\n\n.preview-pane .results-view .path-match-number {\n // show number also on selected item\n color: inherit;\n opacity: .6;\n}\n\n.tool-panel.incompatible-packages {\n // incompatible-packages isn't really a tool-panel and more a whole pane\n .text(normal);\n background-color: @level-2-color;\n}\n\n// Styleguide ----------------------------------------------\n\n.styleguide {\n // Modal\n atom-panel.modal:after {\n position: absolute; // prevent overlay backdrop from leaking outside\n left: -@ui-padding;\n right: -@ui-padding;\n bottom: -@ui-padding;\n }\n}\n","digest":"4ba9309f9e37001066e7f31b17f9ff985741a298"},"node_modules/one-light-ui/styles/docks.less":{"content":"\n// Docks ------------------------------\n\n// Make handles not take up any space when dock is open\n.atom-dock-resize-handle {\n position: absolute;\n z-index: 11; // same as toggle buttons\n\n &.left {\n top: 0;\n right: 0;\n bottom: 0;\n }\n &.right {\n top: 0;\n left: 0;\n bottom: 0;\n }\n &.bottom {\n top: 0;\n left: 0;\n right: 0;\n }\n}\n\n// Add borders\n.atom-dock-inner.atom-dock-open.left {\n border-right: 1px solid @base-border-color;\n}\n.atom-dock-inner.atom-dock-open.right {\n border-left: 1px solid @base-border-color;\n}\n\n// Make toggle buttons cover ^ border\n.atom-dock-toggle-button.left {\n margin-left: -1px;\n}\n.atom-dock-toggle-button.right {\n margin-right: -1px;\n}\n.atom-dock-inner:not(.atom-dock-open) .atom-dock-toggle-button.bottom {\n margin-bottom: -1px;\n}\n","digest":"2d1e626354879323d3f61341a8e6f903ceec1f7a"},"node_modules/one-light-ui/styles/dropdowns.less":{"content":".dropdown-menu {\n background-color: @overlay-background-color;\n border-radius: @component-border-radius;\n border: 1px solid @base-border-color;\n padding: 0;\n\n > li > a {\n .text(normal);\n }\n\n > li > a:hover {\n .text(highlight);\n background-color: @background-color-highlight;\n }\n}\n","digest":"344a6a3a32a0e115652f60c7626fc93e1d2220c1"},"node_modules/one-light-ui/styles/editor.less":{"content":"\n// Editor in a panel\n\n// TODO: Find a better selector, maybe a new class like atom-text-editor[medium]\natom-panel-container atom-text-editor.is-focused {\n .focus();\n}\n\n\n// Mini\n// Usually just single line inputs\n\natom-text-editor[mini] {\n overflow: auto;\n font-size: @ui-input-size;\n line-height: @ui-line-height;\n max-height: @ui-line-height * 5; // rows\n padding-left: @ui-padding/3;\n border-radius: @component-border-radius;\n color: @text-color-highlight;\n border: 1px solid @input-border-color;\n background-color: @input-background-color;\n\n .placeholder-text {\n color: @text-color-subtle;\n }\n\n .selection .region {\n background-color: @input-selection-color;\n }\n\n .cursor {\n border-color: @accent-color;\n border-width: 2px;\n }\n\n &.is-focused {\n .focus();\n background-color: @input-background-color-focus;\n .selection .region {\n background-color: @input-selection-color-focus;\n }\n }\n}\n","digest":"c372db5e2182585e75a5dbc970c85d04f9ac94c9"},"node_modules/one-light-ui/styles/git.less":{"content":".status { .text(normal); }\n.status-added { .text(success); } // green\n.status-ignored { .text(subtle); } // faded\n.status-modified { .text(warning); } // orange\n.status-removed { .text(error); } // red\n.status-renamed { .text(info); } // blue\n","digest":"4cc19322834e5e93b47fe889895e14e6a7576f8d"},"node_modules/one-light-ui/styles/inputs.less":{"content":"\n//\n// Checkbox\n// -------------------------\n\n.input-checkbox {\n &:active {\n background-color: @accent-color;\n }\n &:before,\n &:after {\n background-color: @accent-text-color;\n }\n &:checked {\n background-color: @accent-color;\n }\n\n &:indeterminate {\n background-color: @accent-color;\n }\n}\n\n\n//\n// Radio\n// -------------------------\n\n.input-radio {\n &:before {\n background-color: @accent-text-color;\n }\n &:active {\n background-color: @accent-color;\n }\n &:checked {\n background-color: @accent-color;\n }\n}\n\n\n//\n// Range (Slider)\n// -------------------------\n\n.input-range {\n &::-webkit-slider-thumb {\n background-color: @accent-color;\n }\n}\n\n\n//\n// Toggle\n// -------------------------\n\n.input-toggle {\n &:checked {\n background-color: @accent-color;\n }\n &:before {\n background-color: @accent-text-color;\n }\n}\n\n\n\n// States -------------------------\n\n.input-text,\n.input-search,\n.input-number,\n.input-textarea,\n.input-select,\n.input-color {\n &:focus {\n .focus();\n }\n}\n","digest":"fcb0b948128bc844c8d5d19a0bbbf7debe9ecfb2"},"node_modules/one-light-ui/styles/key-binding.less":{"content":".key-binding {\n display: inline-block;\n margin-left: @ui-padding-icon;\n padding: 0 @ui-padding/4;\n line-height: 2;\n font-family: inherit;\n font-size: max(1em, @ui-size*.85);\n letter-spacing: @ui-size/10;\n border-radius: @component-border-radius;\n color: @accent-bg-text-color;\n background-color: @accent-bg-color;\n}\n","digest":"2c7039e912c9a51bc17fdb5619d12da5192a1f6f"},"node_modules/one-light-ui/styles/lists.less":{"content":".list-group,\n.list-tree {\n li:not(.list-nested-item),\n li.list-nested-item > .list-item {\n .text(normal);\n }\n\n .generate-list-item-text-color(@class) {\n li:not(.list-nested-item).text-@{class},\n li.list-nested-item.text-@{class} > .list-item {\n .text(@class);\n }\n }\n .generate-list-item-text-color(subtle);\n .generate-list-item-text-color(info);\n .generate-list-item-text-color(success);\n .generate-list-item-text-color(warning);\n .generate-list-item-text-color(error);\n .generate-list-item-text-color(selected);\n\n .generate-list-item-status-color(@color, @status) {\n li:not(.list-nested-item).status-@{status},\n li.list-nested-item.status-@{status} > .list-item {\n color: @color;\n }\n\n li:not(.list-nested-item).selected.status-@{status},\n li.list-nested-item.selected.status-@{status} > .list-item {\n color: @color;\n }\n\n }\n\n .generate-list-item-status-color(@text-color-added, added);\n .generate-list-item-status-color(@text-color-ignored, ignored);\n .generate-list-item-status-color(@text-color-modified, modified);\n .generate-list-item-status-color(@text-color-removed, removed);\n .generate-list-item-status-color(@text-color-renamed, renamed);\n\n li:not(.list-nested-item).selected,\n li.list-nested-item.selected > .list-item {\n .text(selected);\n }\n\n .no-icon {\n padding-left: calc(@ui-padding-icon ~\"+\" @component-icon-size);\n }\n}\n\n.list-tree.has-collapsable-children .list-nested-item > .list-item::before {\n text-align: center;\n}\n\n.select-list ol.list-group,\n&.select-list ol.list-group {\n li.two-lines {\n .secondary-line {\n color: @text-color-subtle;\n }\n &.selected .secondary-line {\n color: fade(@text-color-highlight, 50%);\n text-shadow: none;\n }\n }\n\n // We want to highlight the background of the list items because we dont\n // know their size.\n li.selected {\n background-color: @background-color-selected;\n &:before{ display: none; }\n }\n\n &.mark-active {\n @active-icon-size: 14px;\n\n // pad in front of the text where the icon would be We'll pad the non-\n // active items with a 'fake' icon so other classes can pad the item\n // without worrying about the icon padding.\n li:before {\n content: '';\n background-color: transparent;\n position: static;\n display: inline-block;\n left: auto; right: auto;\n height: @active-icon-size;\n width: @active-icon-size;\n font-size: @active-icon-size;\n }\n > li:not(.active):before {\n margin-right: @ui-padding-icon;\n }\n li.active {\n .octicon(check, @active-icon-size);\n &:before {\n margin-right: @ui-padding-icon;\n color: @text-color-success;\n }\n }\n }\n}\n\n.select-list.popover-list {\n @popover-list-padding: @ui-padding/4;\n background-color: @overlay-background-color;\n box-shadow: 0 2px 8px 1px rgba(0, 0, 0, 0.3);\n padding: @popover-list-padding;\n border-radius: @component-border-radius;\n\n atom-text-editor[mini] {\n margin-bottom: @popover-list-padding;\n }\n\n ol.list-group {\n margin-top: @popover-list-padding;\n }\n\n .list-group li {\n padding-left: @popover-list-padding;\n }\n}\n\n.ui-sortable {\n li {\n line-height: 2.5;\n }\n\n // For sortable lists in the settings view\n li.ui-sortable-placeholder {\n visibility: visible !important;\n background-color: darken(@pane-item-background-color, 10%);\n }\n}\n\nli.ui-draggable-dragging,\nli.ui-sortable-helper {\n line-height: @ui-line-height;\n height: @ui-line-height;\n border: 0;\n border-radius: 0;\n list-style: none;\n padding: 0 @ui-padding;\n background: @background-color-highlight;\n box-shadow: 0 0 1px @base-border-color;\n}\n","digest":"62e28d3f59d575bb09af38145920fb7dca076620"},"node_modules/one-light-ui/styles/messages.less":{"content":"background-tips ul.background-message {\n font-weight: 500;\n font-size: 2em;\n color: @text-color-faded;\n\n .message {\n padding: 0 @component-padding * 10;\n\n .keystroke {\n white-space: nowrap;\n vertical-align: middle;\n line-height: 1;\n padding: .1em .4em;\n }\n }\n}\n","digest":"fbe98214c0578199506deb9b230c56019060194b"},"node_modules/one-light-ui/styles/modal.less":{"content":"\n@modal-padding: @ui-padding/2 @ui-padding/1.5;\n@modal-width: @ui-size * 50;\n\natom-panel-container.modal {\n position: absolute;\n top: 0; left: 0; right: 0;\n}\n\natom-panel.modal {\n position: relative;\n width: 100%;\n max-width: @modal-width;\n margin: 0 auto;\n left: initial;\n color: @text-color;\n background-color: transparent;\n padding: @ui-padding/2;\n\n &.from-top {\n top: @component-padding * 5;\n }\n\n atom-text-editor[mini] {\n margin-bottom: @ui-padding/2;\n }\n\n .select-list ol.list-group,\n &.select-list ol.list-group {\n border: 1px solid @overlay-border-color;\n background-color: lighten(@overlay-background-color, 2%);\n\n &:empty {\n border: none;\n margin-top: 0;\n }\n\n li {\n padding: @modal-padding;\n line-height: @ui-line-height;\n border-bottom: 1px solid @overlay-border-color;\n\n &:last-of-type {\n border-bottom: none;\n }\n\n .icon::before {\n margin-left: 1px;\n }\n\n .icon.status {\n float: right;\n margin-left: @ui-padding-icon;\n &:before {\n margin-left: 0;\n margin-right: 0;\n }\n }\n\n &.selected {\n .status.icon {\n color: @text-color-selected;\n }\n }\n }\n\n }\n\n .select-list .key-binding {\n margin-top: -1px;\n margin-left: @ui-padding/2;\n margin-right: calc( -@ui-padding/3 ~\"+\" 1px);\n }\n\n .select-list .primary-line {\n display: block;\n }\n\n & > * {\n position: relative; // fixes stacking order\n }\n\n\n // Container\n &:before {\n content: \"\";\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 0;\n background-color: @overlay-background-color;\n border-radius: @component-border-radius*2;\n box-shadow: 0 6px 12px -2px hsla(0,0%,0%,.4);\n }\n\n // Backdrop\n // TODO: Add extra wrapper to translate individually or easier positioning\n\n &:after {\n content: \"\";\n position: fixed;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: -1;\n background: @overlay-backdrop-color;\n opacity: @overlay-backdrop-opacity;\n backface-visibility: hidden; // fixes scrollbar on retina screens\n -webkit-animation: overlay-fade .24s cubic-bezier(0.215, 0.61, 0.355, 1);\n }\n\n @-webkit-keyframes overlay-fade {\n 0% { opacity: 0; }\n 100% { opacity: @overlay-backdrop-opacity; }\n }\n\n}\n","digest":"890e4f55f8035017d9f295a6a96247b398760fdf"},"node_modules/one-light-ui/styles/nav.less":{"content":".nav-tabs {\n border-bottom: 1px solid @base-border-color;\n li {\n a,\n &.active a {\n border: none;\n margin-right: 0px;\n margin-bottom: 1px;\n }\n\n a:hover,\n &.active a,\n &.active a:hover {\n background-color: @background-color-highlight;\n border: none;\n color: @text-color-selected;\n border-bottom-left-radius: 0px;\n border-bottom-right-radius: 0px;\n }\n\n &.active a {\n background-color: @tab-background-color-active;\n }\n }\n}\n","digest":"54ed0e49741845e8799c9513ae21ca7ae75f751d"},"node_modules/one-light-ui/styles/notifications.less":{"content":"\natom-notifications {\n font-size: @ui-size * 1.2;\n\n atom-notification {\n width: 32em;\n &.has-detail {\n width: 32em;\n }\n\n &:first-child.has-close .message {\n padding-right: 9em;\n }\n &:only-child.has-close .message,\n &.has-close .message {\n padding-right: 2.5em;\n }\n .item {\n padding: @ui-padding/2;\n }\n\n .detail,\n .description {\n font-size: .85em;\n }\n\n &.icon:before {\n padding-top: .85em;\n }\n .close {\n width: 2.5em;\n height: 3em;\n line-height: 3em;\n font-size: inherit;\n }\n .close-all.btn {\n top: .5em;\n right: 2.5em;\n }\n .btn-copy-report {\n line-height: 2em;\n margin-left: .5em;\n }\n }\n}\n","digest":"2e08e0dc91ed0d4dcf79a1dcec241fd3ceac0cf4"},"node_modules/one-light-ui/styles/packages.less":{"content":"// Overrides packages\n\n// find-and-replace + project-find ---------------------------\n\n.find-and-replace,\n.project-find {\n padding: @ui-padding/4;\n .input-block-item {\n padding: @ui-padding/4;\n }\n}\n\n// find-and-replace\n.find-and-replace {\n .header,\n .input-block {\n min-width: @ui-size*22;\n }\n\n .input-block-item {\n flex: 1 1 @ui-size*22;\n }\n .input-block-item--flex {\n flex: 100 1 @ui-size*22;\n }\n\n .btn,\n .btn-group-options .btn {\n font-size: @ui-size*1.1;\n padding: 0;\n }\n\n .btn-group-options .btn,\n .btn-group-options .btn.option-selection,\n .btn-group-options .btn.option-whole-word {\n padding: 0;\n font-size: @ui-input-size; // keep same as text input\n }\n\n .find-container atom-text-editor {\n padding-right: @ui-size*5; // leave some room for the results count\n }\n .find-meta-container {\n top: 0;\n font-size: @ui-size;\n line-height: @ui-size*2.5;\n }\n}\n\n// project-find\n.project-find {\n .header,\n .input-block {\n min-width: @ui-size*15;\n }\n\n .input-block-item {\n flex: 1 1 @ui-size*14;\n }\n .input-block-item--flex {\n flex: 100 1 @ui-size*20;\n }\n\n .btn {\n font-size: @ui-size*1.1;\n padding: 0;\n }\n .btn-group-options .btn {\n padding: 0;\n font-size: @ui-input-size; // keep same as text input\n }\n}\n\n// Colorize find-and-replace based on results\n& when (@ui-hue >= 190) and (@ui-hue <= 340) {\n .find-and-replace {\n &.has-no-results .find-container atom-text-editor[mini].is-focused {\n border-color: @text-color-error;\n box-shadow: 0 0 0 1px @text-color-error;\n background-color: mix(@text-color-error, @input-background-color, 10%);\n .selection .region {\n background-color: mix(@text-color-error, @input-background-color, 50%);\n }\n .cursor {\n border-color: @text-color-error;\n }\n }\n\n &.has-results .find-container atom-text-editor[mini].is-focused {\n border-color: @text-color-success;\n box-shadow: 0 0 0 1px @text-color-success;\n background-color: mix(@text-color-success, @input-background-color, 10%);\n .selection .region {\n background-color: mix(@text-color-success, @input-background-color, 50%);\n }\n .cursor {\n border-color: @text-color-success;\n }\n }\n\n &.has-results .find-container .result-counter { color: @text-color-success; }\n &.has-no-results .find-container .result-counter { color: @text-color-error; }\n }\n}\n\n\n\n\n// Timecop ---------------------------\n\n.timecop {\n .timecop-panel {\n padding: @component-padding/2;\n background-color: @level-2-color;\n }\n\n .tool-panel {\n padding: @component-padding/2;\n background-color: @level-2-color;\n }\n\n .inset-panel {\n border: 1px solid @base-border-color;\n }\n\n .panel-heading {\n .text(highlight);\n border-color: @base-border-color;\n background-color: @level-1-color;\n }\n\n .list-item .inline-block {\n line-height: 1.5;\n }\n}\n\n\n// Command Palette + Fuzzy Finder ---------------------------\n\n.command-palette .list-group .character-match,\n.fuzzy-finder .list-group .character-match {\n color: @accent-only-text-color;\n}\n\n\n// Deprecation Cop ---------------------------\n\n.deprecation-cop {\n .deprecation-overview {\n background-color: @level-2-color;\n border-bottom: 1px solid @base-border-color;\n }\n}\n\n\n// Tool Bar ---------------------------\n\n.tool-bar {\n // Make it look the same as other panels\n background-color: @level-3-color;\n border: none;\n\n // just a single border + more spacing\n &.tool-bar-horizontal .tool-bar-spacer {\n border-left: 0 none;\n margin-left: .5em;\n margin-right: .5em;\n }\n &.tool-bar-vertical .tool-bar-spacer {\n border-bottom: 0 none;\n margin-top: .5em;\n margin-bottom: .5em;\n }\n\n // only show button styles on hover\n button.tool-bar-btn {\n background-color: @level-3-color;\n background-image: none;\n border-color: @level-3-color;\n }\n}\n","digest":"ca6dd32da78f7a265151bdc16ad95616ee42c1b0"},"node_modules/one-light-ui/styles/panels.less":{"content":"\n// Panels\n\natom-panel {\n .text(normal);\n position: relative;\n border-bottom: 1px solid @base-border-color;\n\n &.top {\n border-right: 1px solid @base-border-color;\n }\n &.left {\n border-right: 1px solid @base-border-color;\n }\n &.right {\n border-left: 1px solid @base-border-color;\n }\n &.bottom {\n border-right: 1px solid @base-border-color;\n }\n &.footer:last-child {\n border-bottom: none;\n }\n &.tool-panel:empty {\n border: none;\n }\n}\n\n.panel {\n &.bordered {\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n}\n\n.inset-panel {\n position: relative;\n background-color: @inset-panel-background-color;\n border-radius: @component-border-radius;\n &.bordered {\n border: 1px solid @base-border-color;\n border-radius: @component-border-radius;\n }\n & .panel-heading {\n border-color: @inset-panel-border-color;\n }\n}\n\n.panel-heading {\n .text(normal);\n border-bottom: 1px solid @panel-heading-border-color;\n background-color: @panel-heading-background-color;\n\n .btn {\n padding-left: 8px;\n padding-right: 8px;\n .btn-default(\n lighten(@button-background-color, 10%),\n lighten(@button-background-color-hover, 10%),\n lighten(@button-background-color-selected, 10%),\n lighten(@text-color, 10%)\n );\n }\n}\n","digest":"78e95fe77592b096e829427a1a4c35c24f9baea6"},"node_modules/one-light-ui/styles/panes.less":{"content":"\natom-pane-container {\n\n atom-pane {\n position: relative;\n border-right: 1px solid @base-border-color;\n border-bottom: 1px solid @base-border-color;\n\n .item-views {\n // prevent atom-text-editor from leaking ouside might improve performance\n overflow: hidden;\n }\n }\n\n}\n\n// Hide right-most border\natom-pane:only-child,\natom-pane-axis.pane-row > atom-pane:last-child,\natom-pane-axis.pane-column:last-child > atom-pane {\n border-right: none;\n}\n","digest":"517a4bfd51fba7919d84a7e89eef84db64f68d55"},"node_modules/one-light-ui/styles/progress.less":{"content":"\n// Spinner ----------------------\n\n@spinner-duration: 1.2s;\n\n.loading-spinner(@size) {\n position: relative;\n display: block;\n width: 1em;\n height: 1em;\n font-size: @size;\n background: radial-gradient(@accent-color .1em, transparent .11em);\n\n &::before,\n &::after {\n content: \"\";\n position: absolute;\n z-index: 10; // prevent sibling elements from getting their own layers\n top: 0;\n left: 0;\n border-radius: 1em;\n width: inherit;\n height: inherit;\n border-radius: 1em;\n border: 2px solid;\n -webkit-animation: spinner-animation @spinner-duration infinite;\n -webkit-animation-fill-mode: backwards;\n }\n &::before {\n border-color: @accent-color transparent transparent transparent;\n }\n &::after {\n border-color: transparent lighten(@accent-color, 15%) transparent transparent;\n -webkit-animation-delay: @spinner-duration/2;\n }\n\n &.inline-block {\n display: inline-block;\n }\n}\n\n@-webkit-keyframes spinner-animation {\n 0% { transform: rotateZ( 0deg); -webkit-animation-timing-function: cubic-bezier(0, 0, .8, .2); }\n 50% { transform: rotateZ(180deg); -webkit-animation-timing-function: cubic-bezier(.2, .8, 1, 1); }\n 100% { transform: rotateZ(360deg); }\n}\n\n// Spinner sizes\n.loading-spinner-tiny { .loading-spinner(16px); &::before, &::after { border-width: 1px; } }\n.loading-spinner-small { .loading-spinner(32px); }\n.loading-spinner-medium { .loading-spinner(48px); }\n.loading-spinner-large { .loading-spinner(64px); }\n\n\n\n\n// Progress Bar ----------------------\n\n@progress-height: 8px;\n@progress-buffer-color: fade(@progress-background-color, 20%);\n\nprogress {\n -webkit-appearance: none;\n height: @progress-height;\n border-radius: @component-border-radius;\n background-color: @input-background-color;\n box-shadow: inset 0 0 0 1px @input-border-color;\n\n &::-webkit-progress-bar {\n background-color: transparent;\n }\n\n &::-webkit-progress-value {\n border-radius: @component-border-radius;\n background-color: @progress-background-color;\n }\n\n // Is buffering (when no value is set)\n &:indeterminate {\n background-image:\n linear-gradient(-45deg, transparent 33%, @progress-buffer-color 33%,\n @progress-buffer-color 66%, transparent 66%);\n background-size: 25px @progress-height, 100% 100%, 100% 100%;\n\n // Plays animation for 1min (12runs) at normal speed,\n // then slows down frame-rate for 9mins (108runs) to limit CPU usage\n -webkit-animation: progress-buffering 5s linear 12,\n progress-buffering 5s 60s steps(10) 108;\n }\n}\n\n@-webkit-keyframes progress-buffering {\n 100% { background-position: -100px 0px; }\n}\n","digest":"c51843dd15ee040fd7a60aaccf3e2d1071459cb0"},"node_modules/one-light-ui/styles/settings.less":{"content":"\n// Settings\n\n// Modular Scale (1.125): http://www.modularscale.com/?1&em&1.125&web&table\n@ms-6: @ui-size * 2.027;\n@ms-5: @ui-size * 1.802;\n@ms-4: @ui-size * 1.602;\n@ms-3: @ui-size * 1.424;\n@ms-2: @ui-size * 1.266;\n@ms-1: @ui-size * 1.125;\n@ms-0: @ui-size * 1;\n@ms_1: @ui-size * 0.889;\n@ms_2: @ui-size * 0.790;\n\n\n\n.settings-view {\n\n\t// Menu ------------------------------\n\n\t.config-menu {\n\t\tposition: relative;\n\t\tmin-width: @ui-size * 15;\n\t\tmax-width: @ui-size * 20;\n\t\tborder-width: 0 1px 0 0;\n\t\tborder-image: linear-gradient(@level-2-color 10px, @base-border-color 200px) 0 1 0 0 stretch;\n\t\tbackground: @level-2-color;\n\n\t\t.btn {\n\t\t\twhite-space: initial;\n\t\t\tfont-size: @ms_1;\n\t\t\tline-height: 1;\n\t\t\tpadding: @ui-padding/3 @ui-padding/2;\n\t\t\t&::before {\n\t\t\t\tvertical-align: middle;\n\t\t\t}\n\t\t}\n\n\n\t}\n\t.nav {\n\t\t& > li > a {\n\t\t\tpadding: @ui-padding/2 @ui-padding;\n\t\t\tline-height: @ui-line-height;\n\t\t}\n\t}\n\n\n\t// Sections ------------------------------\n\n\t& > .panels {\n\t\tbackground-color: @level-2-color;\n\t}\n\n\t.section-container {\n\t\tmax-width: @ui-size*60;\n\t}\n\t.sub-section {\n\t\tmargin: @ui-padding*3 0;\n\t}\n\n\t.section,\n\t.section:first-child,\n\t.section:last-child {\n\t\tpadding: @ui-padding*3;\n\t}\n\n\t.themes-panel .control-group {\n\t\tmargin-top: @ui-padding*2;\n\t}\n\n\n\t// Titles ------------------------------\n\n\t.section .section-heading {\n\t\tmargin-bottom: @ui-padding/1.5;\n\t}\n\n\t.sub-section-heading.icon:before,\n\t.section-heading.icon:before {\n\t\tmargin-right: @ui-padding-icon;\n\t}\n\n\n\n\t// Cards ------------------------------\n\n\t.package-card {\n\t\tpadding: @ui-padding;\n\t\t.meta-controls .status-indicator {\n\t\t\twidth: @ui-padding/4;\n\t\t\t&:before {\n\t\t\t\tcontent: \"\\00a0\"; // fixes 0 height\n\t\t\t}\n\t\t}\n\t}\n\n\n\t// Components ------------------------------\n\n\t.icon::before {\n\t\tcolor: @text-color-subtle;\n\t}\n\n\t.editor-container {\n\t\tmargin: @ui-padding 0;\n\t}\n\n\t.form-control {\n\t\tfont-size: @ui-size*1.25;\n\t\theight: @ui-line-height;\n\t\tpadding-top: 0;\n\t\tpadding-bottom: 0;\n\t}\n\n\t.update-all-button {\n\t\tfont-size: .75em;\n\t}\n\n\t.install-button {\n\t\t.btn-variant(@accent-bg-color);\n\t}\n\n\tinput[type=\"checkbox\"] {\n\t\tbackground-color: @background-color-selected;\n\t\t&:active,\n\t\t&:checked {\n\t\t\tbackground-color: @accent-color;\n\t\t}\n\t\t&:before,\n\t\t&:after {\n\t\t\tbackground-color: @accent-text-color;\n\t\t}\n\t}\n\n\t.search-container .btn {\n\t\tfont-size: @ui-input-size;\n\t}\n\n}\n","digest":"83169623788115c290201ced548017a86c5f3e24"},"node_modules/one-light-ui/styles/sites.less":{"content":"// Site Colors\n\n.ui-site(@num, @color) {\n .ui-site-@{num} {\n background-color: @color;\n }\n}\n\n.ui-site(1, @ui-site-color-1);\n.ui-site(2, @ui-site-color-2);\n.ui-site(3, @ui-site-color-3);\n.ui-site(4, @ui-site-color-4);\n.ui-site(5, @ui-site-color-5);\n","digest":"b27327b73cb57001e574b9d1db332766ac6d1e4e"},"node_modules/one-light-ui/styles/status-bar.less":{"content":"\n@status-bar-height: @ui-tab-height; // same as tabs\n@status-bar-padding: @ui-padding;\n\n.status-bar {\n font-size: @ui-size;\n height: @status-bar-height;\n line-height: @status-bar-height;\n background-color: @level-3-color;\n\n .flexbox-repaint-hack {\n padding: 0; // override default\n }\n\n // underlines should only be used for external links\n a:hover,\n a:focus {\n text-decoration: none;\n cursor: default;\n }\n\n .inline-block {\n margin: 0; // override default\n padding: 0 @status-bar-padding/2;\n vertical-align: top;\n\n &:hover {\n background-color: @level-3-color-hover;\n }\n &:active {\n background-color: @level-3-color-active;\n }\n\n // reset on child inline-block\n .inline-block {\n margin: 0;\n padding: 0;\n }\n }\n\n .status-bar-right {\n .inline-block {\n margin-left: 0; // override default\n }\n }\n .icon {\n vertical-align: middle;\n }\n .icon::before {\n font-size: 1.33333em; // should be 16px with a default of 12px\n \twidth: auto; // use natural width\n line-height: 1;\n height: 1em; // same as line-height\n margin-right: .25em;\n top: auto;\n }\n}\n\n\n// Package overrides -------------------------------\n\n.status-bar.status-bar {\n\n // Read-only -> Remove hover effect\n .is-read-only, // <- use this class in packages\n status-bar-launch-mode,\n status-bar-cursor,\n busy-signal {\n &:hover,\n &:active,\n .inline-block:hover,\n .inline-block:active {\n background-color: transparent;\n }\n }\n\n // Remove underline\n .package-updates-status-view,\n .github-ChangedFilesCount {\n &:hover,\n &:focus {\n text-decoration: none;\n cursor: default;\n }\n }\n}\n","digest":"3ed78884247dbf0dcb19851c5663aae8c5da3169"},"node_modules/one-light-ui/styles/tabs.less":{"content":"\n// Tabs\n\n@tab-border: 1px solid @tab-border-color;\n@title-padding: .66em;\n@icon-padding-top: .5em; // 2.5 (total) - 1.5 (text) / 2\n@icon-padding-right: .5em;\n\n.tab-bar {\n position: relative;\n height: @ui-tab-height;\n box-shadow: inset 0 -1px 0 @tab-border-color;\n background: @tab-bar-background-color;\n overflow-x: auto;\n overflow-y: hidden;\n border-radius: 0;\n\n &::-webkit-scrollbar {\n display: none;\n }\n\n &:empty {\n display: none;\n }\n\n\n // Tab ----------------------\n\n .tab {\n position: relative;\n top: 0;\n padding: 0;\n margin: 0;\n height: inherit;\n font-size: inherit;\n line-height: @ui-tab-height;\n color: @tab-text-color;\n background-color: @tab-background-color;\n box-shadow: inherit;\n border-left: @tab-border;\n &.active {\n color: @tab-text-color-active;\n background-color: @tab-background-color-active;\n box-shadow: none;\n }\n &:first-of-type {\n border-left-color: transparent;\n }\n &:last-of-type {\n // use box-shadow to not take up any space\n box-shadow: inset 0 -1px 0 @tab-border-color, 1px 0 0 @base-border-color;\n }\n &.active:last-of-type {\n box-shadow: 1px 0 0 @base-border-color;\n }\n\n\n // Title ----------------------\n\n .title {\n text-align: center;\n margin: 0 @title-padding;\n }\n\n\n // Icons ----------------------\n\n .title.title:before {\n margin-right: .3em;\n width: auto;\n height: auto;\n line-height: 1;\n font-size: 1.125em;\n vertical-align: -.0625em; // Adjust center for the 0.1em font-size increase\n }\n\n // Close icon ----------------------\n\n .close-icon {\n top: @icon-padding-top;\n right: @icon-padding-right;\n z-index: 2;\n font-size: 1em;\n width: 1.5em;\n height: 1.5em;\n line-height: 1.5;\n text-align: center;\n border-radius: @component-border-radius;\n background-color: inherit;\n overflow: hidden;\n transform: scale(0);\n transition: transform .08s;\n &:hover {\n color: @accent-text-color;\n background-color: @accent-color;\n }\n &:active {\n background-color: fade(@accent-color, 50%);\n }\n &::before {\n z-index: 1;\n font-size: 1.1em;\n vertical-align: -.05em; // Adjust center for the 0.1em font-size increase\n width: auto;\n height: auto;\n pointer-events: none;\n }\n }\n &:hover .close-icon {\n transform: scale(1);\n transition-duration: .16s;\n }\n }\n\n // Modified icon ----------------------\n\n .tab.modified {\n &:hover .close-icon {\n color: @accent-color;\n &:hover {\n color: @accent-bg-text-color;\n }\n }\n &:not(:hover) .close-icon {\n top: @icon-padding-top;\n right: @icon-padding-right;\n width: 1.5em;\n height: 1.5em;\n line-height: 1.5;\n color: @accent-color;\n border-radius: @component-border-radius;\n border: none;\n transform: scale(1);\n &::before {\n content: \"\\f052\";\n display: inline-block;\n }\n }\n }\n\n\n // Tabs in the docks ----------------------\n\n atom-dock & {\n .tab.active {\n background-color: @tool-panel-background-color;\n }\n }\n\n\n // Dragging ----------------------\n\n .tab.is-dragging {\n opacity: .5;\n\n .close-icon,\n &:before {\n visibility: hidden;\n }\n }\n\n .placeholder {\n position: relative;\n pointer-events: none;\n\n // bar\n &:before {\n z-index: 1;\n margin: 0;\n width: 2px;\n height: @ui-tab-height;\n background-color: @accent-color;\n }\n\n // arrow\n &:after {\n z-index: 0;\n top: @ui-tab-height/2;\n margin: -4px 0 0 -3px;\n border-radius: 0;\n border: 4px solid @accent-color;\n transform: rotate(45deg);\n background: transparent;\n }\n\n &:last-child {\n &:before {\n margin-left: -2px;\n }\n &:after {\n transform: none;\n margin-left: -10px;\n border-color: transparent @accent-color transparent transparent;\n }\n }\n }\n\n\n // Overrides ----------------------\n\n // keep tabs same size when active\n .tab,\n .tab.active {\n padding-right: 0;\n .title {\n padding: 0;\n }\n }\n}\n\n\n// Active pane marker --------------\n\natom-pane.active .tab.active:before {\n content: \"\";\n position: absolute;\n pointer-events: none;\n z-index: 2;\n top: 0;\n left: -1px; // cover left border\n bottom: 0;\n width: 2px;\n background: @accent-color;\n}\n\n// hide marker in docks\natom-dock .tab-bar .tab::before {\n display: none;\n}\n\n\n// Custom tabs --------------\n\n.tab-bar .tab.active {\n &[data-type$=\"Editor\"],\n &[data-type$=\"AboutView\"],\n &[data-type$=\"TimecopView\"],\n &[data-type$=\"StyleguideView\"],\n &[data-type=\"MarkdownPreviewView\"] {\n color: @tab-text-color-editor;\n background-color: @tab-background-color-editor; // Match syntax background color\n }\n}\n","digest":"1da2c3a580bb8d3f892a67d378eea1e887c22a64"},"node_modules/one-light-ui/styles/text.less":{"content":"h1,\nh2,\nh3 {\n line-height: 1em;\n margin-bottom: 15px\n}\nh1 { font-size: 2em; }\nh2 { font-size: 1.5em; }\nh3 { font-size: 1.2em; }\n\np {\n line-height: 1.6;\n margin-bottom: 15px;\n}\n\nlabel {\n font-weight: normal;\n}\n\npre {\n box-shadow: none;\n color: @text-color;\n background: @inset-panel-background-color;\n border-radius: @component-border-radius;\n border: none;\n margin: 0;\n}\n\ncode {\n .text(highlight);\n background: @background-color-highlight;\n border-radius: @component-border-radius;\n}\n\n.selected { .text(highlight); }\n\n.text-smaller { font-size: 0.9em; }\n\n.text-subtle { .text(subtle); }\n.text-highlight { .text(highlight); }\n\n.text-error { .text(error); }\n.text-info {\n .text(info);\n &:hover { color: @text-color-info; }\n}\n.text-warning {\n .text(warning);\n &:hover { color: @text-color-warning; }\n}\n.text-success {\n .text(success);\n &:hover { color: @text-color-success; }\n}\n\n.highlight-mixin {\n padding: 1px 4px;\n border-radius: 2px;\n}\n\n.highlight {\n .highlight-mixin();\n font-weight: 700;\n color: @text-color-highlight;\n background-color: @background-color-highlight;\n}\n\n.highlight-color(@name, @background-color) {\n .highlight-@{name} {\n .highlight-mixin();\n font-weight: 500;\n color: white;\n text-shadow: 0 1px 0px hsla(0,0%,0%,.2);\n background-color: @background-color;\n }\n}\n.highlight-color( info, @background-color-info);\n.highlight-color(warning, @background-color-warning);\n.highlight-color( error, @background-color-error);\n.highlight-color(success, @background-color-success);\n\n.results-view .path-details.list-item {\n color: darken(@text-color-highlight, 18%);\n}\n","digest":"38471280be8bb348914ba7bf07bd03405facbd14"},"node_modules/one-light-ui/styles/title-bar.less":{"content":".title-bar {\n height: 22px; // remove 1px since there is no border\n border-bottom: none;\n}\n","digest":"93638036e200a218636d7f1cdb32276c0c04ce0c"},"node_modules/one-light-ui/styles/tooltips.less":{"content":".tooltip {\n white-space: nowrap;\n font-size: @ui-size*1.15;\n\n &.in {\n opacity: 1;\n transition: opacity .12s ease-out;\n }\n\n .tooltip-inner {\n line-height: 1;\n padding: @ui-padding*.5 @ui-padding*.65;\n border-radius: @component-border-radius;\n background-color: @tooltip-background-color;\n color: @tooltip-text-color;\n white-space: nowrap;\n max-width: none;\n }\n\n .keystroke {\n font-size: max(1em, @ui-size*.85);\n padding: .1em .4em;\n margin: 0 @ui-padding*-.35 0 @ui-padding*.25;\n border-radius: max(2px, @component-border-radius / 2);\n color: @tooltip-text-key-color;\n background: @tooltip-background-key-color;\n }\n\n &.top .tooltip-arrow {\n border-top-color: @tooltip-background-color;\n }\n &.top-left .tooltip-arrow {\n border-top-color: @tooltip-background-color;\n }\n &.top-right .tooltip-arrow {\n border-top-color: @tooltip-background-color;\n }\n &.right .tooltip-arrow {\n border-right-color: @tooltip-background-color;\n }\n &.left .tooltip-arrow {\n border-left-color: @tooltip-background-color;\n }\n &.bottom .tooltip-arrow {\n border-bottom-color: @tooltip-background-color;\n }\n &.bottom-left .tooltip-arrow {\n border-bottom-color: @tooltip-background-color;\n }\n &.bottom-right .tooltip-arrow {\n border-bottom-color: @tooltip-background-color;\n }\n}\n","digest":"d04c888a4ae472d7609d5ae9db25e2ded92049cc"},"node_modules/one-light-ui/styles/tree-view.less":{"content":"@tree-view-height: @ui-line-height;\n\n.tree-view {\n font-size: @ui-size;\n background: @tree-view-background-color;\n\n .project-root.project-root {\n &:before {\n height: @ui-tab-height;\n background-clip: padding-box;\n }\n & > .header .name {\n line-height: @ui-tab-height;\n }\n }\n\n .selected:before {\n background: @tree-view-background-selected-color;\n }\n}\n\n.theme-one-dark-ui .tree-view .project-root.project-root::before {\n border-top: 1px solid transparent;\n background-clip: padding-box;\n}\n\n.tree-view-resizer {\n .tree-view-resize-handle {\n width: 8px;\n }\n}\n\n// Variable height, based on ems\n.list-group li:not(.list-nested-item),\n.list-tree li:not(.list-nested-item),\n.list-group li.list-nested-item > .list-item,\n.list-tree li.list-nested-item > .list-item {\n line-height: @tree-view-height;\n}\n\n.list-group .selected::before,\n.list-tree .selected::before {\n height: @tree-view-height;\n}\n\n// icon\n.list-group .icon,\n.list-tree .icon {\n display: inline-block;\n height: inherit;\n &::before {\n top: initial;\n line-height: inherit;\n height: inherit;\n vertical-align: top;\n }\n}\n\n// Arrow icon\n.list-group,\n.list-tree {\n .header.header.header.header::before {\n top: initial;\n line-height: inherit;\n height: inherit;\n vertical-align: top;\n }\n}\n.tree-view .project-root-header.project-root-header.project-root-header.project-root-header::before {\n line-height: 2.5em;\n}\n\n// Active tree-view marker --------------\n\n.tree-view::before {\n content: \"\";\n position: fixed;\n pointer-events: none;\n z-index: 1;\n height: @ui-tab-height;\n width: 2px;\n background: @accent-color;\n opacity: 0;\n transition: opacity .16s;\n}\n\n.tree-view:focus::before {\n opacity: 1;\n transition-duration: .32s;\n}\n","digest":"ad92d3ae03d42561e915df03447e87198f3e400c"},"node_modules/one-light-ui/styles/ui-mixins.less":{"content":"// Pattern matching; ish is cray.\n// http://lesscss.org/#-pattern-matching-and-guard-expressions\n\n.text(normal) {\n font-weight: normal;\n color: @text-color;\n}\n.text(subtle) {\n font-weight: normal;\n color: @text-color-subtle;\n}\n.text(highlight) {\n font-weight: normal;\n color: @text-color-highlight;\n}\n.text(selected) {\n .text(highlight)\n}\n\n.text(info) {\n color: @text-color-info;\n}\n.text(success) {\n color: @text-color-success;\n}\n.text(warning) {\n color: @text-color-warning;\n}\n.text(error) {\n color: @text-color-error;\n}\n\n.focus() {\n outline: none;\n border-color: @accent-color;\n box-shadow: 0 0 0 1px @accent-color;\n}\n","digest":"64440a0c97fef0deb3fdf02973e6f8b131c5339e"},"node_modules/one-light-ui/styles/ui-variables-custom.less":{"content":"\n// ONE light UI variables\n// ----------------------------------------------\n\n@import \"syntax-variables\";\n\n.ui-syntax-color() { @syntax-background-color: hsl(220,1%,98%); } .ui-syntax-color(); // fallback color\n@ui-syntax-color: @syntax-background-color;\n\n// Color guards -----------------\n@ui-s-h: hue(@ui-syntax-color);\n.ui-hue() when (@ui-s-h = 0) { @ui-hue: 220; } // Use blue hue when no saturation\n.ui-hue() when (@ui-s-h > 0) { @ui-hue: @ui-s-h; }\n.ui-hue();\n\n@ui-saturation: min( saturation(@ui-syntax-color), 24%); // max saturation\n@ui-lightness: max( lightness(@ui-syntax-color), 92%); // min lightness\n\n// Main colors -----------------\n@ui-fg: hsl(@ui-hue, @ui-saturation, @ui-lightness - 72%);\n@ui-bg: hsl(@ui-hue, @ui-saturation, @ui-lightness); // normalized @syntax-background-color\n@ui-border: darken(@level-3-color, 6%);\n\n\n\n\n// Custom variables\n// These variables are only used in this theme\n// ----------------------------------------------\n\n@ui-theme-name: one-light-ui;\n\n// Text (Custom) -----------------\n@text-color-faded: fade(@text-color, 30%);\n\n@text-color-added: @text-color-success; // green\n@text-color-ignored: @text-color-subtle; // faded\n@text-color-modified: @text-color-warning; // orange\n@text-color-removed: @text-color-error; // red\n@text-color-renamed: @text-color-info; // blue\n\n\n// Background (Custom) -----------------\n@level-1-color: lighten(@base-background-color, 4%);\n@level-2-color: @base-background-color;\n@level-3-color: darken(@base-background-color, 6%);\n\n@level-3-color-hover: darken(@level-3-color, 6%);\n@level-3-color-active: darken(@level-3-color, 3%);\n\n\n// Accent (Custom) -----------------\n@accent-luma: luma( hsl(@ui-hue, 50%, 50%) ); // get lightness of current hue\n\n// used for marker, inputs (smaller things)\n@accent-color: mix( hsv( @ui-hue, 60%, 60%), hsl( @ui-hue, 100%, 68%), @accent-luma * 2 ); // mix hsv + hsl (favor hsl for dark, hsv for light colors)\n@accent-text-color: contrast(@accent-color, hsl(@ui-hue,100%,16%), #fff, 40% );\n\n// used for button, tooltip (larger things)\n@accent-bg-color: mix( hsv( @ui-hue, 40%, 72%), hsl( @ui-hue, 100%, 66%), @accent-luma * 2 ); // mix hsv + hsl (favor hsl for dark, hsv for light colors)\n@accent-bg-text-color: contrast(@accent-bg-color, hsl(@ui-hue,100%,10%), #fff, 40% );\n\n// used for text only\n@accent-only-text-color: mix( hsv( @ui-hue, 70%, 50%), hsl( @ui-hue, 100%, 60%), @accent-luma * 2 ); // mix hsv + hsl (favor hsl for dark, hsv for light colors)\n\n\n// Components (Custom) -----------------\n@badge-background-color: @background-color-selected;\n\n@button-text-color-selected: @accent-bg-text-color;\n@button-border-color-selected: @accent-color;\n\n@checkbox-background-color: fade(@accent-bg-color, 33%);\n\n@input-background-color-focus: hsl(@ui-hue, 100%, 96%);\n@input-selection-color: mix( hsv( @ui-hue, 33%, 95%), hsl( @ui-hue, 100%, 98%), @accent-luma * 2 ); // mix hsv + hsl (favor hsl for dark, hsv for light colors)\n@input-selection-color-focus: mix( hsv( @ui-hue, 44%, 90%), hsl( @ui-hue, 100%, 94%), @accent-luma * 2 ); // mix hsv + hsl (favor hsl for dark, hsv for light colors)\n\n@overlay-backdrop-color: hsl(@ui-hue, @ui-saturation*0.4, @ui-lightness*0.72);\n@overlay-backdrop-opacity: .8;\n\n@progress-background-color: @accent-color;\n\n@scrollbar-color: darken(@level-3-color, 14%);\n@scrollbar-background-color: @level-3-color; // replaced `transparent` with a solid color to test https://github.com/atom/one-light-ui/issues/4\n@scrollbar-color-editor: contrast(@ui-syntax-color, darken(@ui-syntax-color, 14%), lighten(@ui-syntax-color, 9%) );\n@scrollbar-background-color-editor: @ui-syntax-color;\n\n@tab-text-color: @text-color-subtle;\n@tab-text-color-active: @text-color-highlight;\n@tab-text-color-editor: contrast(@ui-syntax-color, lighten(@ui-syntax-color, 70%), @text-color-highlight );\n@tab-background-color-editor: @ui-syntax-color;\n\n@tree-view-background-selected-color: @background-color-selected;\n\n@tooltip-background-color: @accent-bg-color;\n@tooltip-text-color: @accent-bg-text-color;\n@tooltip-text-key-color: @tooltip-background-color;\n@tooltip-background-key-color: @tooltip-text-color;\n\n\n// Sizes (Custom) -----------------\n\n@ui-size: 1em;\n@ui-input-size: @ui-size*1.15;\n@ui-padding: @ui-size*1.5;\n@ui-padding-pane: @ui-size*.5;\n@ui-padding-icon: @ui-padding/3.3;\n@ui-line-height: @ui-size*2;\n@ui-tab-height: @ui-size*2.5;\n\n\n\n\n\n// Packages variables\n// These variables are used to override packages\n// ----------------------------------------------\n\n@settings-list-background-color: darken(@level-2-color, 3%);\n@theme-config-box-shadow: inset 0 1px 2px hsla(0, 0%, 0%, .2), 0 1px 0 hsla(0, 0%, 100%, .3);\n@theme-config-box-shadow-selected: inset 0 1px 3px hsla(0, 0%, 0%, .2);\n@theme-config-border-selected: hsla(0, 0%, 0%, .5);\n\n\n// Debug\n// Output variables to the top of the UI\n// -------------------------------------\n\n// html:before {\n// content: \"@{variable}\";\n// }\n","digest":"e30b99c7d8f11bca9e9060f4ed25ef7894edd199"},"node_modules/one-light-ui/styles/ui-variables.less":{"content":"\n@import \"ui-variables-custom.less\"; // import colors and custom variables\n\n// ONE light UI variables\n// ----------------------------------------------\n\n// Official variables\n// These variables must be defined in every theme\n// Source: https://github.com/atom/atom/blob/master/static/variables/ui-variables.less\n// ----------------------------------------------\n\n\n// Text -----------------\n@text-color: @ui-fg;\n@text-color-subtle: lighten(@text-color, 30%);\n@text-color-highlight: darken(@text-color, 12%);\n@text-color-selected: darken(@text-color-highlight, 12%);\n\n@text-color-info: hsl(208, 100%, 54%);\n@text-color-success: hsl(132, 60%, 44%);\n@text-color-warning: hsl( 37, 90%, 44%);\n@text-color-error: hsl( 0, 90%, 56%);\n\n\n// Background -----------------\n@background-color-info: hsl(208, 100%, 56%);\n@background-color-success: hsl(132, 52%, 48%);\n@background-color-warning: hsl( 40, 60%, 48%);\n@background-color-error: hsl( 5, 72%, 56%);\n\n@background-color-highlight: darken(@level-3-color, 2%);\n@background-color-selected: darken(@level-3-color, 6%);\n\n@app-background-color: @level-3-color;\n\n\n// Base -----------------\n@base-background-color: @ui-bg;\n@base-border-color: @ui-border;\n\n\n// Components -----------------\n@pane-item-background-color: @base-background-color;\n@pane-item-border-color: @base-border-color;\n\n@input-background-color: @level-1-color;\n@input-border-color: @base-border-color;\n\n@tool-panel-background-color: @level-3-color;\n@tool-panel-border-color: @base-border-color;\n\n@inset-panel-background-color: lighten(@level-2-color, 4%);\n@inset-panel-border-color: fadeout(@base-border-color, 15%);\n\n@panel-heading-background-color: @level-2-color;\n@panel-heading-border-color: @base-border-color;\n\n@overlay-background-color: @level-2-color;\n@overlay-border-color: @base-border-color;\n\n@button-background-color: @level-1-color;\n@button-background-color-hover: darken(@button-background-color, 4%);\n@button-background-color-selected: @accent-bg-color;\n@button-border-color: @base-border-color;\n\n@tab-bar-background-color: @level-3-color;\n@tab-bar-border-color: @base-border-color;\n@tab-background-color: @level-3-color;\n@tab-background-color-active: @level-2-color;\n@tab-border-color: @base-border-color;\n\n@tree-view-background-color: @level-3-color;\n@tree-view-border-color: @base-border-color;\n\n@ui-site-color-1: hsl(208, 100%, 56%); // blue\n@ui-site-color-2: hsl(132, 48%, 48%); // green\n@ui-site-color-3: hsl( 40, 60%, 52%); // orange\n@ui-site-color-4: #D831B0; // pink\n@ui-site-color-5: #EBDD5B; // yellow\n\n\n// Sizes -----------------\n@font-size: 12px;\n@input-font-size: 14px;\n@disclosure-arrow-size: 12px;\n\n@component-padding: 10px;\n@component-icon-padding: 5px;\n@component-icon-size: 16px; // needs to stay 16px to look sharpest\n@component-line-height: 25px;\n@component-border-radius: 3px;\n\n@tab-height: 30px;\n\n\n// Font -----------------\n@font-family: 'BlinkMacSystemFont', 'Lucida Grande', 'Segoe UI', Ubuntu, Cantarell, sans-serif;\n","digest":"0cb76ba5ed3ef48e55e784fca684bf2fad05b68d"},"node_modules/atom-ui/atom-ui.less":{"content":"// Atom UI\n\n// Private! Don't use these in packages.\n// If you need something, feel free to open an issue and it might can be made public\n@import \"styles/private/scaffolding.less\";\n\n@import \"styles/private/alerts.less\";\n@import \"styles/private/close.less\";\n@import \"styles/private/code.less\";\n@import \"styles/private/forms.less\";\n@import \"styles/private/links.less\";\n@import \"styles/private/navs.less\";\n@import \"styles/private/sections.less\";\n@import \"styles/private/tables.less\";\n@import \"styles/private/utilities.less\";\n\n\n// Public components\n// Open the Styleguide to see them in action\n@import \"styles/badges.less\";\n@import \"styles/button-groups.less\";\n@import \"styles/buttons.less\";\n@import \"styles/git-status.less\";\n@import \"styles/icons.less\";\n@import \"styles/inputs.less\";\n@import \"styles/layout.less\";\n@import \"styles/lists.less\";\n@import \"styles/loading.less\";\n@import \"styles/messages.less\";\n@import \"styles/modals.less\";\n@import \"styles/panels.less\";\n@import \"styles/select-list.less\";\n@import \"styles/site-colors.less\";\n@import \"styles/text.less\";\n@import \"styles/tooltip.less\";\n","digest":"f69b9488d6479f3be5c9e4bb947eb6785dd82c66"},"node_modules/atom-ui/styles/badges.less":{"content":"@import \"ui-variables\";\n\n.badge {\n display: inline-block;\n line-height: 1;\n vertical-align: middle;\n font-weight: normal;\n text-align: center;\n white-space: nowrap;\n border-radius: 1em;\n\n &:empty {\n display: none; // Hide when un-used\n }\n\n\n // Color ----------------------\n\n .badge-color( @fg: @text-color-selected;\n @bg: @background-color-selected; ) {\n color: @fg;\n background-color: @bg;\n }\n .badge-color();\n &.badge-info { .badge-color(white, @background-color-info); }\n &.badge-success { .badge-color(white, @background-color-success); }\n &.badge-warning { .badge-color(white, @background-color-warning); }\n &.badge-error { .badge-color(white, @background-color-error); }\n\n\n // Size ----------------------\n\n .badge-size( @size: @font-size; ) {\n @padding: round(@size/4);\n font-size: @size;\n min-width: @size + @padding*2;\n padding: @padding round(@padding*1.5);\n }\n .badge-size(); // default\n\n // Fixed size\n &.badge-large { .badge-size(18px); }\n &.badge-medium { .badge-size(14px); }\n &.badge-small { .badge-size(10px); }\n\n // Flexible size\n // The size changes depending on the parent element\n // Best used for larger sizes, since em's can cause rounding errors\n &.badge-flexible {\n @size: .8em;\n @padding: @size/2;\n font-size: @size;\n min-width: @size + @padding*2;\n padding: @padding @padding*1.5;\n }\n\n\n // Icon ----------------------\n\n &.icon {\n font-size: round(@component-icon-size*0.8);\n padding: @component-icon-padding @component-icon-padding*2;\n }\n\n}\n","digest":"2190c8d1f9a4e6bfe2a763652a857921ac526ded"},"node_modules/atom-ui/styles/button-groups.less":{"content":"@import \"variables/variables\";\n@import \"ui-variables\";\n@import \"mixins/mixins\";\n\n//\n// Button groups\n// --------------------------------------------------\n\n// Make the div behave like a button\n.btn-group,\n.btn-group-vertical {\n position: relative;\n display: inline-block;\n vertical-align: middle; // match .btn alignment given font-size hack above\n > .btn {\n position: relative;\n float: left;\n // Bring the \"active\" button to the front\n &:hover,\n &:focus,\n &:active,\n &.active {\n z-index: 2;\n }\n }\n}\n\n\n// Borders\n// ---------------------------------------------------------\n\n.btn-group > .btn {\n border-left: 1px solid @button-border-color;\n border-right: 1px solid @button-border-color;\n}\n.btn-group > .btn:first-child {\n border-left: none;\n border-top-left-radius: @component-border-radius;\n border-bottom-left-radius: @component-border-radius;\n}\n.btn-group > .btn:last-child,\n.btn-group > .btn.selected:last-child,\n.btn-group > .dropdown-toggle {\n border-right: none;\n border-top-right-radius: @component-border-radius;\n border-bottom-right-radius: @component-border-radius;\n}\n\n// Prevent double borders when buttons are next to each other\n.btn-group {\n .btn + .btn,\n .btn + .btn-group,\n .btn-group + .btn,\n .btn-group + .btn-group {\n margin-left: -1px;\n }\n}\n\n// Optional: Group multiple button groups together for a toolbar\n.btn-toolbar {\n margin-left: -5px; // Offset the first child's margin\n &:extend(.clearfix all);\n\n .btn,\n .btn-group,\n .input-group {\n float: left;\n }\n > .btn,\n > .btn-group,\n > .input-group {\n margin-left: 5px;\n }\n}\n\n.btn-group > .btn:not(:first-child):not(:last-child):not(.dropdown-toggle) {\n border-radius: 0;\n}\n\n// Set corners individual because sometimes a single button can be in a .btn-group and we need :first-child and :last-child to both match\n.btn-group > .btn:first-child {\n margin-left: 0;\n &:not(:last-child):not(.dropdown-toggle) {\n .border-right-radius(0);\n }\n}\n// Need .dropdown-toggle since :last-child doesn't apply given a .dropdown-menu immediately after it\n.btn-group > .btn:last-child:not(:first-child),\n.btn-group > .dropdown-toggle:not(:first-child) {\n .border-left-radius(0);\n}\n\n// Custom edits for including btn-groups within btn-groups (useful for including dropdown buttons within a btn-group)\n.btn-group > .btn-group {\n float: left;\n}\n.btn-group > .btn-group:not(:first-child):not(:last-child) > .btn {\n border-radius: 0;\n}\n.btn-group > .btn-group:first-child:not(:last-child) {\n > .btn:last-child,\n > .dropdown-toggle {\n .border-right-radius(0);\n }\n}\n.btn-group > .btn-group:last-child:not(:first-child) > .btn:first-child {\n .border-left-radius(0);\n}\n\n// On active and open, don't show outline\n.btn-group .dropdown-toggle:active,\n.btn-group.open .dropdown-toggle {\n outline: 0;\n}\n\n\n// Sizing\n//\n// Remix the default button sizing classes into new ones for easier manipulation.\n\n.btn-group-xs > .btn { &:extend(.btn-xs); }\n.btn-group-sm > .btn { &:extend(.btn-sm); }\n.btn-group-lg > .btn { &:extend(.btn-lg); }\n\n\n// Split button dropdowns\n// ----------------------\n\n// Give the line between buttons some depth\n.btn-group > .btn + .dropdown-toggle {\n padding-left: 8px;\n padding-right: 8px;\n}\n.btn-group > .btn-lg + .dropdown-toggle {\n padding-left: 12px;\n padding-right: 12px;\n}\n\n// The clickable button for toggling the menu\n// Remove the gradient and set the same inset shadow as the :active state\n.btn-group.open .dropdown-toggle {\n box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n\n // Show no shadow for `.btn-link` since it has no other button styles.\n &.btn-link {\n box-shadow: none;\n }\n}\n\n\n// Reposition the caret\n.btn .caret {\n margin-left: 0;\n}\n// Carets in other button sizes\n.btn-lg .caret {\n border-width: @caret-width-large @caret-width-large 0;\n border-bottom-width: 0;\n}\n// Upside down carets for .dropup\n.dropup .btn-lg .caret {\n border-width: 0 @caret-width-large @caret-width-large;\n}\n\n\n// Justified button groups\n// ----------------------\n\n.btn-group-justified {\n display: table;\n width: 100%;\n table-layout: fixed;\n border-collapse: separate;\n > .btn,\n > .btn-group {\n float: none;\n display: table-cell;\n width: 1%;\n }\n > .btn-group .btn {\n width: 100%;\n }\n\n > .btn-group .dropdown-menu {\n left: auto;\n }\n}\n","digest":"bb487c05d50cd0c463b14de9274deb1bb9507ac6"},"node_modules/atom-ui/styles/buttons.less":{"content":"@import \"variables/variables\";\n@import \"ui-variables\";\n@import \"mixins/mixins\";\n\n//\n// Buttons\n// --------------------------------------------------\n\n\n// Base styles\n// --------------------------------------------------\n\n.btn {\n display: inline-block;\n margin-bottom: 0; // For input.btn\n height: @component-line-height + 2px;\n padding: 0 @component-padding;\n font-size: @font-size;\n font-weight: normal;\n line-height: @component-line-height;\n text-align: center;\n vertical-align: middle;\n border: none;\n border-radius: @component-border-radius;\n background-color: @btn-default-bg;\n white-space: nowrap;\n cursor: pointer;\n z-index: 0;\n -webkit-user-select: none;\n\n &,\n &:active,\n &.active {\n &:focus,\n &.focus {\n .tab-focus();\n }\n }\n\n &:hover,\n &:focus,\n &.focus {\n color: @btn-default-color;\n text-decoration: none;\n background-color: @button-background-color-hover;\n }\n\n &:active,\n &.active {\n outline: 0;\n background-image: none;\n box-shadow: inset 0 3px 5px rgba(0,0,0,.125);\n }\n\n &.selected,\n &.selected:hover {\n // we want the selected button to behave like the :hover button; it's on top of the other buttons.\n z-index: 1;\n color: @text-color-selected;\n background-color: @button-background-color-selected;\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n opacity: .65;\n box-shadow: none;\n }\n\n a& {\n &.disabled,\n fieldset[disabled] & {\n pointer-events: none; // Future-proof disabling of clicks on `<a>` elements\n }\n }\n}\n\n\n// Button variants\n// --------------------------------------------------\n\n.button-variant(@color; @background;) {\n color: @color;\n background-color: @background;\n\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 10%);\n }\n &:hover {\n color: @color;\n background-color: darken(@background, 10%);\n }\n &:active,\n &.active {\n color: @color;\n background-color: darken(@background, 10%);\n\n &:hover,\n &:focus,\n &.focus {\n color: @color;\n background-color: darken(@background, 17%);\n }\n }\n &.selected,\n &.selected:hover {\n // we want the selected button to behave like the :hover button; it's on top of the other buttons.\n z-index: 1;\n background-color: darken(@background, 10%);\n }\n\n &.disabled,\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus,\n &.focus {\n background-color: @background;\n }\n }\n\n .badge {\n color: @background;\n background-color: @color;\n }\n}\n\n.btn-primary {\n .button-variant(@btn-primary-color; @btn-primary-bg;);\n}\n// Success appears as green\n.btn-success {\n .button-variant(@btn-success-color; @btn-success-bg;);\n}\n// Info appears as blue-green\n.btn-info {\n .button-variant(@btn-info-color; @btn-info-bg;);\n}\n// Warning appears as orange\n.btn-warning {\n .button-variant(@btn-warning-color; @btn-warning-bg;);\n}\n// Danger and error appear as red\n.btn-error {\n .button-variant(@btn-error-color; @btn-error-bg;);\n}\n\n\n// Button Sizes\n// --------------------------------------------------\n\n.btn-xs,\n.btn-group-xs > .btn {\n padding: @component-padding/4 @component-padding/2;\n font-size: @font-size - 2px;\n height: auto;\n line-height: 1.3em;\n &.icon:before {\n font-size: @font-size - 2px;\n }\n}\n.btn-sm,\n.btn-group-sm > .btn {\n padding: @component-padding/4 @component-padding/2;\n height: auto;\n line-height: 1.3em;\n &.icon:before {\n font-size: @font-size + 1px;\n }\n}\n.btn-lg,\n.btn-group-lg > .btn {\n font-size: @font-size + 2px;\n padding: @component-padding - 2px @component-padding + 2px;\n height: auto;\n line-height: 1.3em;\n &.icon:before {\n font-size: @font-size + 6px;\n }\n}\n\n\n// Link button\n// -------------------------\n\n// Make a button look and behave like a link\n.btn-link {\n color: @link-color;\n font-weight: normal;\n border-radius: 0;\n &,\n &:active,\n &.active,\n &[disabled],\n fieldset[disabled] & {\n background-color: transparent;\n box-shadow: none;\n }\n &:hover,\n &:focus {\n color: @link-hover-color;\n text-decoration: @link-hover-decoration;\n background-color: transparent;\n }\n &[disabled],\n fieldset[disabled] & {\n &:hover,\n &:focus {\n color: @btn-link-disabled-color;\n text-decoration: none;\n }\n }\n}\n\n\n// Block button\n// --------------------------------------------------\n\n.btn-block {\n display: block;\n width: 100%;\n}\n\n// Vertically space out multiple block buttons\n.btn-block + .btn-block {\n margin-top: 5px;\n}\n\n// Specificity overrides\ninput[type=\"submit\"],\ninput[type=\"reset\"],\ninput[type=\"button\"] {\n &.btn-block {\n width: 100%;\n }\n}\n\n\n// Icon buttons\n// --------------------------------------------------\n\n.btn.icon {\n &:before {\n width: initial;\n height: initial;\n margin-right: .3125em;\n }\n &:empty:before {\n margin-right: 0;\n }\n}\n\n\n// Button Toolbar\n// --------------------------------------------------\n\n.btn-toolbar {\n > .btn-group + .btn-group,\n > .btn-group + .btn,\n > .btn + .btn {\n float: none;\n display: inline-block;\n margin-left: 0;\n }\n > * {\n margin-right: @component-padding / 2;\n }\n > *:last-child {\n margin-right: 0;\n }\n}\n","digest":"950958d9762691dbebaa846ea0e5aa7afcd719a0"},"node_modules/atom-ui/styles/git-status.less":{"content":"@import \"ui-variables\";\n\n//\n// Git Status\n// --------------------------------------------------\n\n.status {\n &-ignored { color: @text-color-subtle; }\n &-added { color: @text-color-success; }\n &-modified { color: @text-color-warning; }\n &-removed { color: @text-color-error; }\n &-renamed { color: @text-color-info; }\n}\n","digest":"b447ce83f78f01b1fc2e7e9133882cc666559697"},"node_modules/atom-ui/styles/icons.less":{"content":"@import \"ui-variables\";\n\n.icon::before {\n margin-right: @component-icon-padding;\n}\n\na.icon {\n text-decoration: none;\n color: @text-color;\n &:hover{\n color: @text-color-highlight;\n }\n}\n","digest":"441039bd4f65e2ee4d541f3d5667b755cd68d839"},"node_modules/atom-ui/styles/inputs.less":{"content":"@import \"ui-variables\";\n\n@component-size: @component-icon-size; // use for text-less controls like radio, checkboxes etc.\n@component-margin-side: .3em;\n@text-component-height: 2em;\n@component-background-color: mix(@text-color, @base-background-color, 20%);\n\n\n//\n// Overrides\n// -------------------------\n\ninput.input-radio,\ninput.input-checkbox,\ninput.input-toggle {\n margin-top: 0; // Override Bootstrap's 4px\n}\n.input-label {\n margin-bottom: 0;\n}\n\n//\n// Mixins\n// -------------------------\n\n.input-field-mixin() {\n padding: .25em .4em;\n line-height: 1.5; // line-height + padding = @text-component-height\n border-radius: @component-border-radius;\n border: 1px solid @input-border-color;\n background-color: @input-background-color;\n &::-webkit-input-placeholder {\n color: @text-color-subtle;\n }\n &:invalid {\n color: @text-color-error;\n border-color: @background-color-error;\n }\n}\n\n.input-block-mixin() {\n display: block;\n width: 100%;\n}\n\n\n//\n// Checkbox\n// -------------------------\n\n.input-checkbox {\n vertical-align: middle;\n\n & when (@use-custom-controls) {\n -webkit-appearance: none;\n display: inline-block;\n position: relative;\n width: @component-size;\n height: @component-size;\n font-size: inherit;\n border-radius: @component-border-radius;\n background-color: @component-background-color;\n transition: background-color .16s cubic-bezier(0.5, 0.15, 0.2, 1);\n\n &&:focus {\n outline: 0; // TODO: Add it back\n }\n &:active {\n background-color: @background-color-info;\n }\n\n &:before,\n &:after {\n content: \"\";\n position: absolute;\n top: @component-size * .75;\n left: @component-size * .4;\n height: 2px;\n border-radius: 1px;\n background-color: @base-background-color;\n transform-origin: 0 0;\n opacity: 0;\n transition: transform .1s cubic-bezier(0.5, 0.15, 0.2, 1), opacity .1s cubic-bezier(0.5, 0.15, 0.2, 1);\n }\n &:before {\n width: @component-size * .33;\n transform: translate3d(0,0,0) rotate(225deg) scale(0);\n }\n &:after {\n width: @component-size * .66;\n margin: -1px;\n transform: translate3d(0,0,0) rotate(-45deg) scale(0);\n transition-delay: .05s;\n }\n\n &:checked {\n background-color: @background-color-info;\n &:active {\n background-color: @component-background-color;\n }\n &:before {\n opacity: 1;\n transform: translate3d(0,0,0) rotate(225deg) scale(1);\n transition-delay: .05s;\n }\n &:after {\n opacity: 1;\n transform: translate3d(0, 0, 0) rotate(-45deg) scale(1);\n transition-delay: 0;\n }\n }\n\n &:indeterminate {\n background-color: @background-color-info;\n &:active {\n background-color: @component-background-color;\n }\n &:after {\n opacity: 1;\n transform: translate3d(@component-size * -.14, @component-size * -.25, 0) rotate(0deg) scale(1);\n transition-delay: 0;\n }\n }\n }\n}\n\n\n//\n// Color\n// -------------------------\n\n\n.input-color {\n vertical-align: middle;\n\n & when (@use-custom-controls) {\n -webkit-appearance: none;\n padding: 0;\n width: @component-size * 2.5;\n height: @component-size * 2.5;\n border-radius: 50%;\n border: 2px solid @input-border-color;\n background-color: @input-background-color;\n &::-webkit-color-swatch-wrapper { padding: 0; }\n &::-webkit-color-swatch {\n border: 1px solid hsla(0,0%,0%,.1);\n border-radius: 50%;\n transition: transform .16s cubic-bezier(0.5, 0.15, 0.2, 1);\n &:active {\n transition-duration: 0s;\n transform: scale(.9);\n }\n }\n }\n}\n\n\n\n//\n// Label\n// -------------------------\n\n.input-label {\n .input-radio,\n .input-checkbox,\n .input-toggle {\n margin-top: -.25em; // Vertical center (visually) - since most labels are upper case.\n margin-right: @component-margin-side;\n }\n}\n\n\n//\n// Number\n// -------------------------\n\n.input-number {\n vertical-align: middle;\n\n & when (@use-custom-controls) {\n .input-field-mixin();\n position: relative;\n width: auto;\n .platform-darwin & {\n padding-right: 1.2em; // space for the spin button\n &::-webkit-inner-spin-button {\n -webkit-appearance: menulist-button;\n position: absolute;\n top: 1px;\n bottom: 1px;\n right: 1px;\n width: calc(.6em ~'+' 9px); // magic numbers, OMG!\n outline: 1px solid @input-background-color;\n outline-offset: -1px; // reduces border radius (that can't be changed)\n border-right: .2em solid @background-color-highlight; // a bit more padding\n background-color: @background-color-highlight;\n transition: transform .16s cubic-bezier(0.5, 0.15, 0.2, 1);\n &:active {\n transform: scale(.9);\n transition-duration: 0s;\n }\n }\n }\n }\n}\n\n\n//\n// Radio\n// -------------------------\n\n.input-radio {\n vertical-align: middle;\n\n & when (@use-custom-controls) {\n -webkit-appearance: none;\n display: inline-block;\n position: relative;\n width: @component-size;\n height: @component-size;\n font-size: inherit;\n border-radius: 50%;\n background-color: @component-background-color;\n transition: background-color .16s cubic-bezier(0.5, 0.15, 0.2, 1);\n\n &:before {\n content: \"\";\n position: absolute;\n width: inherit;\n height: inherit;\n border-radius: inherit;\n border: @component-size/3 solid transparent;\n background-clip: content-box;\n background-color: @base-background-color;\n transform: scale(0);\n transition: transform .1s cubic-bezier(0.5, 0.15, 0.2, 1);\n }\n &&:focus {\n outline: none;\n }\n &:active {\n background-color: @background-color-info;\n }\n &:checked {\n background-color: @background-color-info;\n &:before {\n transform: scale(1);\n }\n }\n }\n}\n\n\n//\n// Range (Slider)\n// -------------------------\n\n.input-range {\n & when (@use-custom-controls) {\n -webkit-appearance: none;\n margin: @component-padding 0;\n height: 4px;\n border-radius: @component-border-radius;\n background-color: @component-background-color;\n &::-webkit-slider-thumb {\n -webkit-appearance: none;\n width: @component-size;\n height: @component-size;\n border-radius: 50%;\n background-color: @background-color-info;\n transition: transform .16s;\n &:active {\n transition-duration: 0s;\n transform: scale(.9);\n }\n }\n }\n}\n\n\n//\n// Search\n// -------------------------\n\n.input-search {\n .input-block-mixin();\n &&::-webkit-search-cancel-button {\n -webkit-appearance: searchfield-cancel-button;\n }\n\n & when (@use-custom-controls) {\n .input-field-mixin();\n }\n}\n\n\n//\n// Select\n// -------------------------\n\n.input-select {\n vertical-align: middle;\n\n & when (@use-custom-controls) {\n height: calc(@text-component-height ~'+' 2px); // + 2px? Magic!\n border-radius: @component-border-radius;\n border: 1px solid @button-border-color;\n background-color: @button-background-color;\n }\n}\n\n\n//\n// Text\n// -------------------------\n\n.input-text {\n .input-block-mixin();\n\n & when (@use-custom-controls) {\n .input-field-mixin();\n }\n}\n\n\n//\n// Text Area\n// -------------------------\n\n.input-textarea {\n .input-block-mixin();\n\n & when (@use-custom-controls) {\n .input-field-mixin();\n }\n}\n\n\n//\n// Toggle\n// -------------------------\n\n.input-toggle {\n & when (@use-custom-controls) {\n -webkit-appearance: none;\n display: inline-block;\n position: relative;\n font-size: inherit;\n width: @component-size * 2;\n height: @component-size;\n vertical-align: middle;\n border-radius: 2em;\n background-color: @component-background-color;\n transition: background-color .2s cubic-bezier(0.5, 0.15, 0.2, 1);\n\n &&:focus {\n outline: 0;\n }\n &:checked {\n background-color: @background-color-info;\n }\n\n // Thumb\n &:before {\n content: \"\";\n position: absolute;\n width: @component-size;\n height: @component-size;\n border-radius: inherit;\n border: @component-size/4 solid transparent;\n background-clip: content-box;\n background-color: @base-background-color;\n transition: transform .2s cubic-bezier(0.5, 0.15, 0.2, 1);\n }\n &:active:before {\n opacity: .5;\n }\n &:checked:before {\n transform: translate3d(100%, 0, 0);\n }\n }\n}\n","digest":"c43b90a763c953cf7f351d7183515e841f36c0fe"},"node_modules/atom-ui/styles/layout.less":{"content":"@import \"ui-variables\";\n@import \"mixins/mixins\";\n\n.padded {\n padding: @component-padding;\n}\n\n// Blocks\n\n.center-block {\n display: block;\n margin-left: auto;\n margin-right: auto;\n}\n\n// Must be div.block so as not to affect syntax highlighting.\nul.block,\ndiv.block {\n margin-bottom: @component-padding;\n}\ndiv > ul.block:last-child,\ndiv > div.block:last-child {\n margin-bottom: 0;\n}\n\n// Inline Blocks\n\n.inline-block,\n.inline-block-tight {\n display: inline-block;\n vertical-align: middle;\n}\n.inline-block {\n margin-right: @component-padding;\n}\n.inline-block-tight {\n margin-right: @component-padding/2;\n}\ndiv > .inline-block:last-child,\ndiv > .inline-block-tight:last-child {\n margin-right: 0;\n}\n\n.inline-block .inline-block {\n vertical-align: top;\n}\n\n// Centering\n// -------------------------\n\n.pull-center {\n margin-left: auto;\n margin-right: auto;\n}\n\n// Floats\n// -------------------------\n\n// Use left margin when it's in a float: right element.\n// Sets the margin correctly when inline blocks are hidden and shown.\n.pull-right {\n float: right !important;\n\n .inline-block {\n margin-right: 0;\n margin-left: @component-padding;\n }\n .inline-block-tight {\n margin-right: 0;\n margin-left: @component-padding/2;\n }\n\n > .inline-block:first-child,\n > .inline-block-tight:first-child {\n margin-left: 0;\n }\n}\n\n.pull-left {\n float: left !important;\n}\n\n.clearfix {\n .clearfix();\n}\n","digest":"8abf0895a6d88f60a8fb1e7ecba0b217b7526aef"},"node_modules/atom-ui/styles/lists.less":{"content":"@import \"variables/variables\";\n@import \"ui-variables\";\n@import \"mixins/mixins\";\n\n@import \"octicon-mixins\";\n\n//\n// List options\n// --------------------------------------------------\n\n// Unstyled keeps list items block level, just removes default browser padding and list-style\n.list-unstyled {\n padding-left: 0;\n list-style: none;\n}\n\n// Inline turns list items into inline-block\n.list-inline {\n .list-unstyled();\n margin-left: -5px;\n\n > li {\n display: inline-block;\n padding-left: 5px;\n padding-right: 5px;\n }\n}\n\n\n//\n// List groups\n// --------------------------------------------------\n\n// Mixins\n\n.list-group-item-variant(@state; @background; @color) {\n .list-group-item-@{state} {\n color: @color;\n background-color: @background;\n\n a&,\n button& {\n color: @color;\n\n .list-group-item-heading {\n color: inherit;\n }\n\n &:hover,\n &:focus {\n color: @color;\n background-color: darken(@background, 5%);\n }\n &.active,\n &.active:hover,\n &.active:focus {\n color: #fff;\n background-color: @color;\n border-color: @color;\n }\n }\n }\n}\n\n\n\n// Individual list items\n//\n// Use on `li`s or `div`s within the `.list-group` parent.\n\n.list-group-item {\n position: relative;\n display: block;\n padding: 10px 15px;\n // Place the border on the list items and negative margin up for better styling\n margin-bottom: -1px;\n background-color: @list-group-bg;\n border: 1px solid @list-group-border;\n\n // Round the first and last items\n &:first-child {\n .border-top-radius(@list-group-border-radius);\n }\n &:last-child {\n margin-bottom: 0;\n .border-bottom-radius(@list-group-border-radius);\n }\n}\n\n\n// Interactive list items\n//\n// Use anchor or button elements instead of `li`s or `div`s to create interactive items.\n// Includes an extra `.active` modifier class for showing selected items.\n\na.list-group-item,\nbutton.list-group-item {\n color: @list-group-link-color;\n\n .list-group-item-heading {\n color: @list-group-link-heading-color;\n }\n\n // Hover state\n &:hover,\n &:focus {\n text-decoration: none;\n color: @list-group-link-hover-color;\n background-color: @list-group-hover-bg;\n }\n}\n\nbutton.list-group-item {\n width: 100%;\n text-align: left;\n}\n\n.list-group-item {\n // Disabled state\n &.disabled,\n &.disabled:hover,\n &.disabled:focus {\n background-color: @list-group-disabled-bg;\n color: @list-group-disabled-color;\n cursor: @cursor-disabled;\n\n // Force color to inherit for custom content\n .list-group-item-heading {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-disabled-text-color;\n }\n }\n\n // Active class on item itself, not parent\n &.active,\n &.active:hover,\n &.active:focus {\n z-index: 2; // Place active items above their siblings for proper border styling\n color: @list-group-active-color;\n background-color: @list-group-active-bg;\n border-color: @list-group-active-border;\n\n // Force color to inherit for custom content\n .list-group-item-heading,\n .list-group-item-heading > small,\n .list-group-item-heading > .small {\n color: inherit;\n }\n .list-group-item-text {\n color: @list-group-active-text-color;\n }\n }\n}\n\n\n// Contextual variants\n//\n// Add modifier classes to change text and background color on individual items.\n// Organizationally, this must come after the `:hover` states.\n\n.list-group-item-variant(success; @state-success-bg; @state-success-text);\n.list-group-item-variant(info; @state-info-bg; @state-info-text);\n.list-group-item-variant(warning; @state-warning-bg; @state-warning-text);\n.list-group-item-variant(danger; @state-danger-bg; @state-danger-text);\n\n\n// Custom content options\n//\n// Extra classes for creating well-formatted content within `.list-group-item`s.\n\n.list-group-item-heading {\n margin-top: 0;\n margin-bottom: 5px;\n}\n.list-group-item-text {\n margin-bottom: 0;\n line-height: 1.3;\n}\n\n\n\n// This is a bootstrap override\n// ---------------------------------------------\n\n.list-group,\n.list-group .list-group-item {\n background-color: transparent;\n border: none;\n padding: 0;\n margin: 0;\n position: static;\n}\n\n.list-group,\n.list-tree {\n margin: 0;\n padding: 0;\n list-style: none;\n cursor: default;\n\n li:not(.list-nested-item),\n li.list-nested-item > .list-item {\n line-height: @component-line-height;\n text-wrap: none;\n white-space: nowrap;\n }\n\n // The background highlight uses ::before rather than the item background so\n // it can span the entire width of the parent container rather than the size\n // of the list item.\n .selected::before {\n content: '';\n background-color: @background-color-selected;\n position: absolute;\n left: 0;\n right: 0;\n height: @component-line-height;\n }\n\n // Make sure the background highlight is below the content.\n .selected > * {\n position: relative;\n }\n\n .icon::before {\n margin-right: @component-icon-padding;\n position: relative;\n top: 1px;\n }\n .no-icon {\n padding-left: @component-icon-padding + @component-icon-size;\n }\n}\n\n\n\n//\n// List Tree\n// --------------------------------------------------\n\n// Handle indentation of the tree. Assume disclosure arrows.\n\n.list-tree {\n .list-nested-item > .list-tree > li,\n .list-nested-item > .list-group > li {\n padding-left: @component-icon-size + @component-icon-padding;\n }\n\n &.has-collapsable-children {\n @disclosure-arrow-padding: @disclosure-arrow-size + @component-icon-padding;\n li.list-item {\n margin-left: @disclosure-arrow-padding;\n }\n\n .list-nested-item.collapsed > .list-group,\n .list-nested-item.collapsed > .list-tree {\n display: none;\n }\n\n // Nested items always get disclosure arrows\n .list-nested-item > .list-item {\n .octicon(chevron-down, @disclosure-arrow-size);\n &::before{\n position: relative;\n top: -1px;\n margin-right: @component-icon-padding;\n }\n }\n .list-nested-item.collapsed > .list-item {\n .octicon(chevron-right, @disclosure-arrow-size);\n &::before{\n left: 1px;\n }\n }\n\n .list-nested-item > .list-tree > li,\n .list-nested-item > .list-group > li {\n padding-left: @disclosure-arrow-padding;\n }\n\n // You want a subtree to be flat -- no collapsable children\n .has-flat-children,\n &.has-flat-children {\n li.list-item {\n margin-left: 0;\n }\n }\n }\n}\n","digest":"3d35a95a6e5d74bb2cddfe5b704d89fc757ca962"},"node_modules/atom-ui/styles/loading.less":{"content":"//\n// Loading\n// --------------------------------------------------\n\n.loading-spinner(@size) {\n display: block;\n width: @size;\n height: @size;\n background-image: url(images/octocat-spinner-128.gif);\n background-repeat: no-repeat;\n background-size: cover;\n\n &.inline-block {\n display: inline-block;\n }\n}\n\n.loading-spinner-tiny { .loading-spinner(16px); }\n.loading-spinner-small { .loading-spinner(32px); }\n.loading-spinner-medium { .loading-spinner(48px); }\n.loading-spinner-large { .loading-spinner(64px); }\n","digest":"d7fac726ef76e0c8ba33629fc4551f97748bf83f"},"node_modules/atom-ui/styles/messages.less":{"content":"@import \"ui-variables\";\n\n.info-messages,\n.error-messages {\n margin: 0;\n padding: 0;\n list-style: none;\n}\n\n.error-messages {\n color: @text-color-error;\n}\n\nul.background-message {\n font-size: @font-size * 3;\n\n margin: 0;\n padding: 0;\n\n li {\n margin: 0;\n padding: 0;\n list-style: none;\n }\n\n &.centered {\n display: flex;\n position: absolute;\n top: 0;\n left: 0;\n right: 0;\n bottom: 0;\n\n align-items: center;\n text-align: center;\n\n li {\n width: 100%;\n }\n }\n}\n","digest":"b549523e13f2ad116c02a6dfb42db8e1e4891e43"},"node_modules/atom-ui/styles/mixins/mixins.less":{"content":"\n// Core mixins\n// ----------------------------------------\n\n// Focus\n//\n.tab-focus() {\n outline: 2px auto @text-color-info;\n outline-offset: -2px;\n}\n\n\n// Border-radius\n//\n.border-top-radius(@radius) {\n border-top-right-radius: @radius;\n border-top-left-radius: @radius;\n}\n.border-right-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-top-right-radius: @radius;\n}\n.border-bottom-radius(@radius) {\n border-bottom-right-radius: @radius;\n border-bottom-left-radius: @radius;\n}\n.border-left-radius(@radius) {\n border-bottom-left-radius: @radius;\n border-top-left-radius: @radius;\n}\n\n\n// Clearfix\n//\n// For modern browsers\n// 1. The space content is one way to avoid an Opera bug when the\n// contenteditable attribute is included anywhere else in the document.\n// Otherwise it causes space to appear at the top and bottom of elements\n// that are clearfixed.\n// 2. The use of `table` rather than `block` is only necessary if using\n// `:before` to contain the top-margins of child elements.\n//\n// Source: http://nicolasgallagher.com/micro-clearfix-hack/\n\n.clearfix() {\n &:before,\n &:after {\n content: \" \"; // 1\n display: table; // 2\n }\n &:after {\n clear: both;\n }\n}\n\n\n// CSS image replacement\n//\n// Heads up! v3 launched with only `.hide-text()`, but per our pattern for\n// mixins being reused as classes with the same name, this doesn't hold up. As\n// of v3.0.1 we have added `.text-hide()` and deprecated `.hide-text()`.\n//\n// Source: https://github.com/h5bp/html5-boilerplate/commit/aa0396eae757\n\n// Deprecated as of v3.0.1 (has been removed in v4)\n.hide-text() {\n font: ~\"0/0\" a;\n color: transparent;\n text-shadow: none;\n background-color: transparent;\n border: 0;\n}\n\n// New mixin to use as of v3.0.1\n.text-hide() {\n .hide-text();\n}\n\n\n// Text overflow\n// Requires inline-block or block for proper styling\n\n.text-overflow() {\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n","digest":"9ebec64c3f38543a74bae00d43a3e168d3e3673b"},"node_modules/atom-ui/styles/modals.less":{"content":"\n//\n// Modals\n// --------------------------------------------------\n\n.overlay, // deprecated .overlay\natom-panel.modal {\n position: absolute;\n display: block;\n top: 0;\n left: 50%;\n width: 500px;\n margin-left: -250px;\n z-index: 9999;\n box-sizing: border-box;\n border-top: none;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n\n color: @text-color;\n background-color: @overlay-background-color;\n\n padding: 10px;\n\n // shrink modals when window gets narrow\n @media (max-width: 500px) {\n & {\n width: 100%;\n left: 0;\n margin-left: 0;\n }\n }\n\n h1 {\n margin-top: 0;\n color: @text-color-highlight;\n font-size: 1.6em;\n font-weight: bold;\n }\n\n h2 {\n font-size: 1.3em;\n }\n\n atom-text-editor[mini] {\n margin-bottom: 10px;\n }\n\n .message {\n padding-top: 5px;\n font-size: 11px;\n }\n\n &.mini {\n width: 200px;\n margin-left: -100px;\n font-size: 12px;\n }\n}\n\n\n// Deprecated: overlay, from-top, from-bottom, floating\n// --------------------------------------------------\n// TODO: Remove these!\n\n.overlay.from-top {\n top: 0;\n border-top: none;\n border-top-left-radius: 0;\n border-top-right-radius: 0;\n}\n\n.overlay.from-bottom {\n bottom: 0;\n border-bottom: none;\n border-bottom-left-radius: 0;\n border-bottom-right-radius: 0;\n}\n\n.overlay.floating {\n left: auto;\n}\n","digest":"4eb1b3e5c96df8baaee12ec1d0440c5745f9daba"},"node_modules/atom-ui/styles/panels.less":{"content":"//\n// Panels\n// --------------------------------------------------\n\n.tool-panel, // deprecated: .tool-panel\n.panel, // deprecated: .panel\natom-panel {\n background-color: @tool-panel-background-color;\n}\n\n.inset-panel {\n border-radius: @component-border-radius;\n background-color: @inset-panel-background-color;\n}\n\n.panel-heading {\n margin: 0;\n padding: @component-padding;\n border-radius: 0;\n font-size: @font-size;\n line-height: 1;\n background-color: @panel-heading-background-color;\n\n .inset-panel & {\n border-radius: @component-border-radius @component-border-radius 0 0;\n }\n\n .btn {\n @btn-height: @component-line-height - 5px;\n height: @btn-height;\n line-height: @btn-height;\n font-size: @font-size - 2px;\n position: relative;\n top: -5px;\n }\n}\n","digest":"53e1680a8654d881be4c5e09d473dc4039702a77"},"node_modules/atom-ui/styles/private/alerts.less":{"content":"@import \"../variables/variables\";\n@import \"ui-variables\";\n\n//\n// Alerts\n// --------------------------------------------------\n\n//## Define alert colors, border radius, and padding.\n\n@alert-padding: 15px;\n@alert-border-radius: @border-radius-base;\n@alert-link-font-weight: bold;\n\n@alert-success-bg: @state-success-bg;\n@alert-success-text: @state-success-text;\n@alert-success-border: @state-success-border;\n\n@alert-info-bg: @state-info-bg;\n@alert-info-text: @state-info-text;\n@alert-info-border: @state-info-border;\n\n@alert-warning-bg: @state-warning-bg;\n@alert-warning-text: @state-warning-text;\n@alert-warning-border: @state-warning-border;\n\n@alert-danger-bg: @state-danger-bg;\n@alert-danger-text: @state-danger-text;\n@alert-danger-border: @state-danger-border;\n\n\n//## variant mixin\n\n.alert-variant(@background; @border; @text-color) {\n background-color: @background;\n border-color: @border;\n color: @text-color;\n\n hr {\n border-top-color: darken(@border, 5%);\n }\n .alert-link {\n color: darken(@text-color, 10%);\n }\n}\n\n\n// Base styles\n// -------------------------\n\n.alert {\n padding: @alert-padding;\n margin-bottom: @line-height-computed;\n border: 1px solid transparent;\n border-radius: @alert-border-radius;\n\n // Headings for larger alerts\n h4 {\n margin-top: 0;\n // Specified for the h4 to prevent conflicts of changing @headings-color\n color: inherit;\n }\n\n // Provide class for links that match alerts\n .alert-link {\n font-weight: @alert-link-font-weight;\n }\n\n // Improve alignment and spacing of inner content\n > p,\n > ul {\n margin-bottom: 0;\n }\n\n > p + p {\n margin-top: 5px;\n }\n}\n\n// Dismissible alerts\n//\n// Expand the right padding and account for the close button's positioning.\n\n.alert-dismissable, // The misspelled .alert-dismissable was deprecated in 3.2.0.\n.alert-dismissible {\n padding-right: (@alert-padding + 20);\n\n // Adjust close link position\n .close {\n position: relative;\n top: -2px;\n right: -21px;\n color: inherit;\n }\n}\n\n// Alternate styles\n//\n// Generate contextual modifier classes for colorizing the alert.\n\n.alert-success {\n .alert-variant(@alert-success-bg; @alert-success-border; @alert-success-text);\n}\n\n.alert-info {\n .alert-variant(@alert-info-bg; @alert-info-border; @alert-info-text);\n}\n\n.alert-warning {\n .alert-variant(@alert-warning-bg; @alert-warning-border; @alert-warning-text);\n}\n\n.alert-danger {\n .alert-variant(@alert-danger-bg; @alert-danger-border; @alert-danger-text);\n}\n","digest":"9419c3622f08e1c99a5eaa25196791f0f129219e"},"node_modules/atom-ui/styles/private/close.less":{"content":"//\n// Close icon (deprecated)\n// --------------------------------------------------\n\n.close {\n @font-size-base: 14px;\n @close-font-weight: bold;\n @close-color: #000;\n @close-text-shadow: 0 1px 0 #fff;\n\n float: right;\n font-size: (@font-size-base * 1.5);\n font-weight: @close-font-weight;\n line-height: 1;\n color: @close-color;\n text-shadow: @close-text-shadow;\n opacity: .2;\n\n &:hover,\n &:focus {\n color: @close-color;\n text-decoration: none;\n cursor: pointer;\n opacity: .5;\n }\n\n // Additional properties for button version\n // iOS requires the button element instead of an anchor tag.\n // If you want the anchor version, it requires `href=\"#\"`.\n // See https://developer.mozilla.org/en-US/docs/Web/Events/click#Safari_Mobile\n button& {\n padding: 0;\n cursor: pointer;\n background: transparent;\n border: 0;\n -webkit-appearance: none;\n }\n}\n","digest":"cea1d83a2d61e483c5e943877738d5c230ec2c1c"},"node_modules/atom-ui/styles/private/code.less":{"content":"@import \"../variables/variables\";\n@import \"ui-variables\";\n\n//\n// Code (inline and block)\n// --------------------------------------------------\n\n@code-color: @text-color-highlight;\n@code-bg: @background-color-highlight;\n\n@pre-color: @code-color;\n@pre-bg: @code-bg;\n@pre-border-color: @base-border-color;\n@pre-scrollable-max-height: 340px;\n\n// Inline and block code styles\ncode,\nkbd,\npre,\nsamp {\n font-family: @font-family-monospace;\n}\n\n// Inline code\ncode {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-base;\n}\n\n// User input typically entered via keyboard\nkbd {\n padding: 2px 4px;\n font-size: 90%;\n color: @code-color;\n background-color: @code-bg;\n border-radius: @border-radius-small;\n\n kbd {\n padding: 0;\n font-size: 100%;\n font-weight: bold;\n }\n}\n\n// Blocks of code\npre {\n display: block;\n padding: ((@line-height-computed - 1) / 2);\n margin: 0 0 (@line-height-computed / 2);\n font-size: (@font-size-base - 1); // 14px to 13px\n line-height: @line-height-base;\n word-break: break-all;\n word-wrap: break-word;\n color: @pre-color;\n background-color: @pre-bg;\n border: 1px solid @pre-border-color;\n border-radius: @border-radius-base;\n\n // Account for some code outputs that place code tags in pre tags\n code {\n padding: 0;\n font-size: inherit;\n color: inherit;\n white-space: pre-wrap;\n background-color: transparent;\n border-radius: 0;\n }\n}\n\n// Enable scrollable blocks of code\n.pre-scrollable {\n max-height: @pre-scrollable-max-height;\n overflow-y: scroll;\n}\n","digest":"117b7c504d7d217641262f1e6ffc95a850270333"},"node_modules/atom-ui/styles/private/forms.less":{"content":"@import \"../variables/variables\";\n@import \"ui-variables\";\n@import \"../mixins/mixins\";\n\n//\n// Forms\n// --------------------------------------------------\n\n\n@input-bg: #fff; //** `<input>` background color\n@input-bg-disabled: @gray-lighter; //** `<input disabled>` background color\n@input-color: @gray; //** Text color for `<input>`s\n@input-border: #ccc; //** `<input>` border color\n\n// TODO: Rename `@input-border-radius` to `@input-border-radius-base` in v4\n//** Default `.form-control` border radius\n// This has no effect on `<select>`s in some browsers, due to the limited stylability of `<select>`s in CSS.\n@input-border-radius: @border-radius-base; //** Large `.form-control` border radius\n@input-border-radius-large: @border-radius-large; //** Small `.form-control` border radius\n@input-border-radius-small: @border-radius-small;\n@input-border-focus: #66afe9; //** Border color for inputs on focus\n@input-color-placeholder: #999; //** Placeholder text color\n@input-height-base: (@line-height-computed + (@padding-base-vertical * 2) + 2); //** Default `.form-control` height\n@input-height-large: (ceil(@font-size-large * @line-height-large) + (@padding-large-vertical * 2) + 2); //** Large `.form-control` height\n@input-height-small: (floor(@font-size-small * @line-height-small) + (@padding-small-vertical * 2) + 2); //** Small `.form-control` height\n\n@form-group-margin-bottom: 15px; //** `.form-group` margin\n\n@legend-color: @gray-dark;\n@legend-border-color: #e5e5e5;\n\n@input-group-addon-bg: @gray-lighter; //** Background color for textual input addons\n@input-group-addon-border-color: @input-border; //** Border color for textual input addons\n\n@cursor-disabled: not-allowed; //** Disabled cursor for form controls and buttons.\n\n@grid-gutter-width: 30px; //** Padding between columns. Gets divided in half for the left and right.\n\n\n// Form validation states\n//\n// Used in forms.less to generate the form validation CSS for warnings, errors,\n// and successes.\n\n.form-control-validation(@text-color: #555; @border-color: #ccc; @background-color: #f5f5f5) {\n // Color the label and help text\n .help-block,\n .control-label,\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline,\n &.radio label,\n &.checkbox label,\n &.radio-inline label,\n &.checkbox-inline label {\n color: @text-color;\n }\n // Set the border and box shadow on specific inputs to match\n .form-control {\n border-color: @border-color;\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075); // Redeclare so transitions work\n &:focus {\n border-color: darken(@border-color, 10%);\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 6px lighten(@border-color, 20%);\n }\n }\n // Set validation states also for addons\n .input-group-addon {\n color: @text-color;\n border-color: @border-color;\n background-color: @background-color;\n }\n // Optional feedback icon\n .form-control-feedback {\n color: @text-color;\n }\n}\n\n\n// Form control focus state\n//\n// Generate a customized focus state and for any input with the specified color,\n// which defaults to the `@input-border-focus` variable.\n//\n// We highly encourage you to not customize the default value, but instead use\n// this to tweak colors on an as-needed basis. This aesthetic change is based on\n// WebKit's default styles, but applicable to a wider range of browsers. Its\n// usability and accessibility should be taken into account with any change.\n//\n// Example usage: change the default blue border and shadow to white for better\n// contrast against a dark gray background.\n.form-control-focus(@color: @input-border-focus) {\n @color-rgba: rgba(red(@color), green(@color), blue(@color), .6);\n &:focus {\n border-color: @color;\n outline: 0;\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px @color-rgba;\n }\n}\n\n// Form control sizing\n//\n// Relative text size, padding, and border-radii changes for form controls. For\n// horizontal sizing, wrap controls in the predefined grid classes. `<select>`\n// element gets special love because it's special, and that's a fact!\n.input-size(@input-height; @padding-vertical; @padding-horizontal; @font-size; @line-height; @border-radius) {\n height: @input-height;\n padding: @padding-vertical @padding-horizontal;\n font-size: @font-size;\n line-height: @line-height;\n border-radius: @border-radius;\n\n select& {\n height: @input-height;\n line-height: @input-height;\n }\n\n textarea&,\n select[multiple]& {\n height: auto;\n }\n}\n\n// Placeholder text\n.placeholder(@color: @input-color-placeholder) {\n &::-webkit-input-placeholder { color: @color; } // Safari and Chrome\n}\n\n// Creates a wrapper for a series of columns\n.make-row(@gutter: @grid-gutter-width) {\n margin-left: ceil((@gutter / -2));\n margin-right: floor((@gutter / -2));\n &:extend(.clearfix all);\n}\n\n\n// -----------------------------------------------------\n\n\n// Normalize non-controls\n//\n// Restyle and baseline non-control form elements.\n\nfieldset {\n padding: 0;\n margin: 0;\n border: 0;\n // Chrome and Firefox set a `min-width: min-content;` on fieldsets,\n // so we reset that to ensure it behaves more like a standard block element.\n // See https://github.com/twbs/bootstrap/issues/12359.\n min-width: 0;\n}\n\nlegend {\n display: block;\n width: 100%;\n padding: 0;\n margin-bottom: @line-height-computed;\n font-size: (@font-size-base * 1.5);\n line-height: inherit;\n color: @legend-color;\n border: 0;\n border-bottom: 1px solid @legend-border-color;\n}\n\nlabel {\n display: inline-block;\n max-width: 100%; // Force IE8 to wrap long content (see https://github.com/twbs/bootstrap/issues/13141)\n margin-bottom: 5px;\n font-weight: bold;\n}\n\n\n// Normalize form controls\n//\n// While most of our form styles require extra classes, some basic normalization\n// is required to ensure optimum display with or without those classes to better\n// address browser inconsistencies.\n\n// Override content-box in Normalize (* isn't specific enough)\ninput[type=\"search\"] {\n box-sizing: border-box;\n}\n\n// Position radios and checkboxes better\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n margin: 4px 0 0;\n margin-top: 1px \\9; // IE8-9\n line-height: normal;\n}\n\ninput[type=\"file\"] {\n display: block;\n}\n\n// Make range inputs behave like textual form controls\ninput[type=\"range\"] {\n display: block;\n width: 100%;\n}\n\n// Make multiple select elements height not fixed\nselect[multiple],\nselect[size] {\n height: auto;\n}\n\n// Focus for file, radio, and checkbox\ninput[type=\"file\"]:focus,\ninput[type=\"radio\"]:focus,\ninput[type=\"checkbox\"]:focus {\n .tab-focus();\n}\n\n// Adjust output element\noutput {\n display: block;\n padding-top: (@padding-base-vertical + 1);\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n}\n\n\n// Common form controls\n//\n// Shared size and type resets for form controls. Apply `.form-control` to any\n// of the following form controls:\n//\n// select\n// textarea\n// input[type=\"text\"]\n// input[type=\"password\"]\n// input[type=\"datetime\"]\n// input[type=\"datetime-local\"]\n// input[type=\"date\"]\n// input[type=\"month\"]\n// input[type=\"time\"]\n// input[type=\"week\"]\n// input[type=\"number\"]\n// input[type=\"email\"]\n// input[type=\"url\"]\n// input[type=\"search\"]\n// input[type=\"tel\"]\n// input[type=\"color\"]\n\n.form-control {\n display: block;\n width: 100%;\n height: @input-height-base; // Make inputs at least the height of their button counterpart (base line-height + padding + border)\n padding: @padding-base-vertical @padding-base-horizontal;\n font-size: @font-size-base;\n line-height: @line-height-base;\n color: @input-color;\n background-color: @input-bg;\n background-image: none; // Reset unusual Firefox-on-Android default style; see https://github.com/necolas/normalize.css/issues/214\n border: 1px solid @input-border;\n border-radius: @input-border-radius; // Note: This has no effect on <select>s in some browsers, due to the limited stylability of <select>s in CSS.\n box-shadow: inset 0 1px 1px rgba(0,0,0,.075);\n transition: border-color ease-in-out .15s, box-shadow ease-in-out .15s;\n\n // Customize the `:focus` state to imitate native WebKit styles.\n .form-control-focus();\n\n // Placeholder\n .placeholder();\n\n // Unstyle the caret on `<select>`s in IE10+.\n &::-ms-expand {\n border: 0;\n background-color: transparent;\n }\n\n // Disabled and read-only inputs\n //\n // HTML5 says that controls under a fieldset > legend:first-child won't be\n // disabled if the fieldset is disabled. Due to implementation difficulty, we\n // don't honor that edge case; we style them as disabled anyway.\n &[disabled],\n &[readonly],\n fieldset[disabled] & {\n background-color: @input-bg-disabled;\n opacity: 1; // iOS fix for unreadable disabled content; see https://github.com/twbs/bootstrap/issues/11655\n }\n\n &[disabled],\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n\n // Reset height for `textarea`s\n textarea& {\n height: auto;\n }\n}\n\n\n// Form groups\n//\n// Designed to help with the organization and spacing of vertical forms. For\n// horizontal forms, use the predefined grid classes.\n\n.form-group {\n margin-bottom: @form-group-margin-bottom;\n}\n\n\n// Checkboxes and radios\n//\n// Indent the labels to position radios/checkboxes as hanging controls.\n\n.radio,\n.checkbox {\n position: relative;\n display: block;\n margin-top: 10px;\n margin-bottom: 10px;\n\n label {\n min-height: @line-height-computed; // Ensure the input doesn't jump when there is no text\n padding-left: 20px;\n margin-bottom: 0;\n font-weight: normal;\n cursor: pointer;\n }\n}\n.radio input[type=\"radio\"],\n.radio-inline input[type=\"radio\"],\n.checkbox input[type=\"checkbox\"],\n.checkbox-inline input[type=\"checkbox\"] {\n position: absolute;\n margin-left: -20px;\n margin-top: 4px \\9;\n}\n\n.radio + .radio,\n.checkbox + .checkbox {\n margin-top: -5px; // Move up sibling radios or checkboxes for tighter spacing\n}\n\n// Radios and checkboxes on same line\n.radio-inline,\n.checkbox-inline {\n position: relative;\n display: inline-block;\n padding-left: 20px;\n margin-bottom: 0;\n vertical-align: middle;\n font-weight: normal;\n cursor: pointer;\n}\n.radio-inline + .radio-inline,\n.checkbox-inline + .checkbox-inline {\n margin-top: 0;\n margin-left: 10px; // space out consecutive inline controls\n}\n\n// Apply same disabled cursor tweak as for inputs\n// Some special care is needed because <label>s don't inherit their parent's `cursor`.\n//\n// Note: Neither radios nor checkboxes can be readonly.\ninput[type=\"radio\"],\ninput[type=\"checkbox\"] {\n &[disabled],\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used directly on <label>s\n.radio-inline,\n.checkbox-inline {\n &.disabled,\n fieldset[disabled] & {\n cursor: @cursor-disabled;\n }\n}\n// These classes are used on elements with <label> descendants\n.radio,\n.checkbox {\n &.disabled,\n fieldset[disabled] & {\n label {\n cursor: @cursor-disabled;\n }\n }\n}\n\n\n// Static form control text\n//\n// Apply class to a `p` element to make any string of text align with labels in\n// a horizontal form layout.\n\n.form-control-static {\n // Size it appropriately next to real form controls\n padding-top: (@padding-base-vertical + 1);\n padding-bottom: (@padding-base-vertical + 1);\n // Remove default margin from `p`\n margin-bottom: 0;\n min-height: (@line-height-computed + @font-size-base);\n\n &.input-lg,\n &.input-sm {\n padding-left: 0;\n padding-right: 0;\n }\n}\n\n\n// Form control sizing\n//\n// Build on `.form-control` with modifier classes to decrease or increase the\n// height and font-size of form controls.\n//\n// The `.form-group-* form-control` variations are sadly duplicated to avoid the\n// issue documented in https://github.com/twbs/bootstrap/issues/15074.\n\n.input-sm {\n .input-size(@input-height-small; @padding-small-vertical; @padding-small-horizontal; @font-size-small; @line-height-small; @input-border-radius-small);\n}\n.form-group-sm {\n .form-control {\n height: @input-height-small;\n padding: @padding-small-vertical @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n border-radius: @input-border-radius-small;\n }\n select.form-control {\n height: @input-height-small;\n line-height: @input-height-small;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-small;\n min-height: (@line-height-computed + @font-size-small);\n padding: (@padding-small-vertical + 1) @padding-small-horizontal;\n font-size: @font-size-small;\n line-height: @line-height-small;\n }\n}\n\n.input-lg {\n .input-size(@input-height-large; @padding-large-vertical; @padding-large-horizontal; @font-size-large; @line-height-large; @input-border-radius-large);\n}\n.form-group-lg {\n .form-control {\n height: @input-height-large;\n padding: @padding-large-vertical @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n border-radius: @input-border-radius-large;\n }\n select.form-control {\n height: @input-height-large;\n line-height: @input-height-large;\n }\n textarea.form-control,\n select[multiple].form-control {\n height: auto;\n }\n .form-control-static {\n height: @input-height-large;\n min-height: (@line-height-computed + @font-size-large);\n padding: (@padding-large-vertical + 1) @padding-large-horizontal;\n font-size: @font-size-large;\n line-height: @line-height-large;\n }\n}\n\n\n// Form control feedback states\n//\n// Apply contextual and semantic states to individual form controls.\n\n.has-feedback {\n // Enable absolute positioning\n position: relative;\n\n // Ensure icons don't overlap text\n .form-control {\n padding-right: (@input-height-base * 1.25);\n }\n}\n// Feedback icon (requires .glyphicon classes)\n.form-control-feedback {\n position: absolute;\n top: 0;\n right: 0;\n z-index: 2; // Ensure icon is above input groups\n display: block;\n width: @input-height-base;\n height: @input-height-base;\n line-height: @input-height-base;\n text-align: center;\n pointer-events: none;\n}\n.input-lg + .form-control-feedback,\n.input-group-lg + .form-control-feedback,\n.form-group-lg .form-control + .form-control-feedback {\n width: @input-height-large;\n height: @input-height-large;\n line-height: @input-height-large;\n}\n.input-sm + .form-control-feedback,\n.input-group-sm + .form-control-feedback,\n.form-group-sm .form-control + .form-control-feedback {\n width: @input-height-small;\n height: @input-height-small;\n line-height: @input-height-small;\n}\n\n// Feedback states\n.has-success {\n .form-control-validation(@state-success-text; @state-success-text; @state-success-bg);\n}\n.has-warning {\n .form-control-validation(@state-warning-text; @state-warning-text; @state-warning-bg);\n}\n.has-error {\n .form-control-validation(@state-danger-text; @state-danger-text; @state-danger-bg);\n}\n\n// Reposition feedback icon if input has visible label above\n.has-feedback label {\n\n & ~ .form-control-feedback {\n top: (@line-height-computed + 5); // Height of the `label` and its margin\n }\n &.sr-only ~ .form-control-feedback {\n top: 0;\n }\n}\n\n\n// Help text\n//\n// Apply to any element you wish to create light text for placement immediately\n// below a form control. Use for general help, formatting, or instructional text.\n\n.help-block {\n display: block; // account for any element using help-block\n margin-top: 5px;\n margin-bottom: 10px;\n color: lighten(@text-color, 25%); // lighten the text some for contrast\n}\n\n\n// Inline forms\n//\n// Make forms appear inline(-block) by adding the `.form-inline` class. Inline\n// forms begin stacked on extra small (mobile) devices and then go inline when\n// viewports reach <768px.\n//\n// Requires wrapping inputs and labels with `.form-group` for proper display of\n// default HTML form controls and our custom form controls (e.g., input groups).\n//\n// Heads up! This is mixin-ed into `.navbar-form` in navbars.less.\n\n.form-inline {\n\n // Kick in the inline\n @media (min-width: @screen-sm-min) {\n // Inline-block all the things for \"inline\"\n .form-group {\n display: inline-block;\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // In navbar-form, allow folks to *not* use `.form-group`\n .form-control {\n display: inline-block;\n width: auto; // Prevent labels from stacking above inputs in `.form-group`\n vertical-align: middle;\n }\n\n // Make static controls behave like regular ones\n .form-control-static {\n display: inline-block;\n }\n\n .input-group {\n display: inline-table;\n vertical-align: middle;\n\n .input-group-addon,\n .input-group-btn,\n .form-control {\n width: auto;\n }\n }\n\n // Input groups need that 100% width though\n .input-group > .form-control {\n width: 100%;\n }\n\n .control-label {\n margin-bottom: 0;\n vertical-align: middle;\n }\n\n // Remove default margin on radios/checkboxes that were used for stacking, and\n // then undo the floating of radios and checkboxes to match.\n .radio,\n .checkbox {\n display: inline-block;\n margin-top: 0;\n margin-bottom: 0;\n vertical-align: middle;\n\n label {\n padding-left: 0;\n }\n }\n .radio input[type=\"radio\"],\n .checkbox input[type=\"checkbox\"] {\n position: relative;\n margin-left: 0;\n }\n\n // Re-override the feedback icon.\n .has-feedback .form-control-feedback {\n top: 0;\n }\n }\n}\n\n\n// Horizontal forms\n//\n// Horizontal forms are built on grid classes and allow you to create forms with\n// labels on the left and inputs on the right.\n\n.form-horizontal {\n\n // Consistent vertical alignment of radios and checkboxes\n //\n // Labels also get some reset styles, but that is scoped to a media query below.\n .radio,\n .checkbox,\n .radio-inline,\n .checkbox-inline {\n margin-top: 0;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n // Account for padding we're adding to ensure the alignment and of help text\n // and other content below items\n .radio,\n .checkbox {\n min-height: (@line-height-computed + (@padding-base-vertical + 1));\n }\n\n // Make form groups behave like rows\n .form-group {\n .make-row();\n }\n\n // Reset spacing and right align labels, but scope to media queries so that\n // labels on narrow viewports stack the same as a default form example.\n @media (min-width: @screen-sm-min) {\n .control-label {\n text-align: right;\n margin-bottom: 0;\n padding-top: (@padding-base-vertical + 1); // Default padding plus a border\n }\n }\n\n // Validation states\n //\n // Reposition the icon because it's now within a grid column and columns have\n // `position: relative;` on them. Also accounts for the grid gutter padding.\n .has-feedback .form-control-feedback {\n right: floor((@grid-gutter-width / 2));\n }\n\n // Form group sizes\n //\n // Quick utility class for applying `.input-lg` and `.input-sm` styles to the\n // inputs and labels within a `.form-group`.\n .form-group-lg {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-large-vertical + 1);\n font-size: @font-size-large;\n }\n }\n }\n .form-group-sm {\n @media (min-width: @screen-sm-min) {\n .control-label {\n padding-top: (@padding-small-vertical + 1);\n font-size: @font-size-small;\n }\n }\n }\n}\n","digest":"3a89d47796311e302bdcee941d9f97a67f23e1bc"},"node_modules/atom-ui/styles/private/links.less":{"content":"@import \"ui-variables\";\n@import \"../mixins/mixins\";\n\n// Links\n\na {\n cursor: pointer;\n color: @text-color-highlight;\n text-decoration: none;\n &:hover,\n &:focus {\n color: @text-color-highlight;\n text-decoration: underline;\n }\n &:focus {\n .tab-focus();\n }\n}\n","digest":"1b67395c0f1c96d9b4af3d82db7246f7f76f5f38"},"node_modules/atom-ui/styles/private/navs.less":{"content":"@import \"../variables/variables\";\n@import \"ui-variables\";\n@import \"../mixins/mixins\";\n\n//\n// Navs\n// --------------------------------------------------\n\n//=== Shared nav styles\n@nav-link-padding: 10px 15px;\n@nav-link-hover-bg: @gray-lighter;\n@nav-disabled-link-color: @gray-light;\n@nav-disabled-link-hover-color: @gray-light;\n\n//== Tabs\n@nav-tabs-border-color: #ddd;\n@nav-tabs-link-hover-border-color: @gray-lighter;\n@nav-tabs-active-link-hover-bg: @body-bg;\n@nav-tabs-active-link-hover-color: @gray;\n@nav-tabs-active-link-hover-border-color: #ddd;\n@nav-tabs-justified-link-border-color: #ddd;\n@nav-tabs-justified-active-link-border-color: @body-bg;\n\n//== Pills\n@nav-pills-border-radius: @border-radius-base;\n@nav-pills-active-link-hover-bg: @component-active-bg;\n@nav-pills-active-link-hover-color: @component-active-color;\n\n\n.nav-divider(@color: #e5e5e5) {\n height: 1px;\n margin: ((@line-height-computed / 2) - 1) 0;\n overflow: hidden;\n background-color: @color;\n}\n\n\n// Base class\n// --------------------------------------------------\n\n.nav {\n margin-bottom: 0;\n padding-left: 0; // Override default ul/ol\n list-style: none;\n &:extend(.clearfix all);\n\n > li {\n position: relative;\n display: block;\n\n > a {\n position: relative;\n display: block;\n padding: @nav-link-padding;\n border-radius: @component-border-radius;\n &:hover,\n &:focus {\n text-decoration: none;\n background-color: @background-color-highlight;\n }\n }\n\n // Disabled state sets text to gray and nukes hover/tab effects\n &.disabled > a {\n color: @nav-disabled-link-color;\n\n &:hover,\n &:focus {\n color: @nav-disabled-link-hover-color;\n text-decoration: none;\n background-color: transparent;\n cursor: @cursor-disabled;\n }\n }\n }\n\n // Open dropdowns\n .open > a {\n &,\n &:hover,\n &:focus {\n background-color: @nav-link-hover-bg;\n border-color: @link-color;\n }\n }\n\n // Nav dividers (deprecated with v3.0.1)\n //\n // This should have been removed in v3 with the dropping of `.nav-list`, but\n // we missed it. We don't currently support this anywhere, but in the interest\n // of maintaining backward compatibility in case you use it, it's deprecated.\n .nav-divider {\n .nav-divider();\n }\n\n // Prevent IE8 from misplacing imgs\n //\n // See https://github.com/h5bp/html5-boilerplate/issues/984#issuecomment-3985989\n > li > a > img {\n max-width: none;\n }\n}\n\n\n// Tabs\n// -------------------------\n\n// Give the tabs something to sit on\n.nav-tabs {\n border-bottom: 1px solid @nav-tabs-border-color;\n > li {\n float: left;\n // Make the list-items overlay the bottom border\n margin-bottom: -1px;\n\n // Actual tabs (as links)\n > a {\n margin-right: 2px;\n line-height: @line-height-base;\n border: 1px solid transparent;\n border-radius: @border-radius-base @border-radius-base 0 0;\n &:hover {\n border-color: @nav-tabs-link-hover-border-color @nav-tabs-link-hover-border-color @nav-tabs-border-color;\n }\n }\n\n // Active state, and its :hover to override normal :hover\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-tabs-active-link-hover-color;\n background-color: @nav-tabs-active-link-hover-bg;\n border: 1px solid @nav-tabs-active-link-hover-border-color;\n border-bottom-color: transparent;\n cursor: default;\n }\n }\n }\n // pulling this in mainly for less shorthand\n &.nav-justified {\n .nav-justified();\n .nav-tabs-justified();\n }\n}\n\n\n// Pills\n// -------------------------\n.nav-pills {\n > li {\n float: left;\n\n // Links rendered as pills\n > a {\n border-radius: @nav-pills-border-radius;\n }\n + li {\n margin-left: 2px;\n }\n\n // Active state\n &.active > a {\n &,\n &:hover,\n &:focus {\n color: @nav-pills-active-link-hover-color;\n background-color: @background-color-selected;\n }\n }\n }\n}\n\n\n// Stacked pills\n.nav-stacked {\n > li {\n float: none;\n + li {\n margin-top: 2px;\n margin-left: 0; // no need for this gap between nav items\n }\n }\n}\n\n\n// Nav variations\n// --------------------------------------------------\n\n// Justified nav links\n// -------------------------\n\n.nav-justified {\n width: 100%;\n\n > li {\n float: none;\n > a {\n text-align: center;\n margin-bottom: 5px;\n }\n }\n\n > .dropdown .dropdown-menu {\n top: auto;\n left: auto;\n }\n\n @media (min-width: @screen-sm-min) {\n > li {\n display: table-cell;\n width: 1%;\n > a {\n margin-bottom: 0;\n }\n }\n }\n}\n\n// Move borders to anchors instead of bottom of list\n//\n// Mixin for adding on top the shared `.nav-justified` styles for our tabs\n.nav-tabs-justified {\n border-bottom: 0;\n\n > li > a {\n // Override margin from .nav-tabs\n margin-right: 0;\n border-radius: @border-radius-base;\n }\n\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border: 1px solid @nav-tabs-justified-link-border-color;\n }\n\n @media (min-width: @screen-sm-min) {\n > li > a {\n border-bottom: 1px solid @nav-tabs-justified-link-border-color;\n border-radius: @border-radius-base @border-radius-base 0 0;\n }\n > .active > a,\n > .active > a:hover,\n > .active > a:focus {\n border-bottom-color: @nav-tabs-justified-active-link-border-color;\n }\n }\n}\n\n\n// Tabbable tabs\n// -------------------------\n\n// Hide tabbable panes to start, show them when `.active`\n.tab-content {\n > .tab-pane {\n display: none;\n }\n > .active {\n display: block;\n }\n}\n\n\n// Dropdowns\n// -------------------------\n\n// Specific dropdowns\n.nav-tabs .dropdown-menu {\n // make dropdown border overlap tab border\n margin-top: -1px;\n // Remove the top rounded corners here since there is a hard edge above the menu\n .border-top-radius(0);\n}\n","digest":"b5935924a646fe81617f04f418e6fb77b6ad9393"},"node_modules/atom-ui/styles/private/scaffolding.less":{"content":"@import \"../variables/variables\";\n@import \"ui-variables\";\n@import \"../mixins/mixins\";\n\n//\n// Scaffolding\n// --------------------------------------------------\n\n// Remove focus style, be sure to add them back where useful\n:focus {\n outline: none;\n}\n\n// Reset fonts for relevant elements\ninput,\nbutton,\nselect,\ntextarea {\n font-family: inherit;\n font-size: inherit;\n line-height: inherit;\n}\n\n\n// Figures\n//\n// We reset this here because previously Normalize had no `figure` margins. This\n// ensures we don't break anyone's use of the element.\n\nfigure {\n margin: 0;\n}\n\n\n// Images\n\nimg {\n vertical-align: middle;\n}\n\n// Responsive images (ensure images don't scale beyond their parents)\n.img-responsive {\n display: block;\n max-width: 100%; // Set a maximum relative to the parent\n}\n\n\n// Horizontal rules\n\nhr {\n margin-top: @line-height-computed;\n margin-bottom: @line-height-computed;\n border: 0;\n border-top: 1px solid @hr-border;\n}\n","digest":"ecbeeca81d2b52e9af5ff5e988c2d1aeb73751aa"},"node_modules/atom-ui/styles/private/sections.less":{"content":"@import \"ui-variables\";\n\n// Deprecated\n// These selectors are too vague and should be used directly in Settings and Styleguide\n\nsection, .section {\n position: relative;\n margin-top: 0;\n &:last-child { margin-bottom: 0; }\n\n &.bordered {\n margin: 0;\n padding: @component-padding*2 0;\n border-top: 1px solid @background-color-highlight;\n border-bottom: 1px solid @tool-panel-border-color;\n }\n\n .section-heading:first-child {\n margin-top: 0;\n font-weight: bold;\n color: @text-color-highlight;\n }\n}\n\ndiv > section:first-child,\nform > section:first-child,\ndiv > .section:first-child,\nform > .section:first-child {\n border-top: none;\n padding-top: 0;\n}\ndiv > section:last-child,\nform > section:last-child,\ndiv > .section:last-child,\nform > .section:last-child {\n border-bottom: none;\n padding-bottom: 0;\n}\n","digest":"15cd6c2abed73f5339bd79465c7945ca6ce563c4"},"node_modules/atom-ui/styles/private/tables.less":{"content":"@import \"../variables/variables\";\n@import \"ui-variables\";\n\n//\n// Tables\n// --------------------------------------------------\n\n//## Customizes the `.table` component with basic values, each used across all table variations.\n\n@table-cell-padding: 8px; //** Padding for `<th>`s and `<td>`s.\n@table-condensed-cell-padding: 5px; //** Padding for cells in `.table-condensed`.\n@table-bg: transparent; //** Default background color used for all tables.\n@table-bg-accent: #f9f9f9; //** Background color used for `.table-striped`.\n@table-bg-hover: #f5f5f5; //** Background color used for `.table-hover`.\n@table-bg-active: @table-bg-hover;\n@table-border-color: #ddd; //** Border color for table and cell borders.\n\n\n\n// Variant mixin\n\n.table-row-variant(@state; @background) {\n // Exact selectors below required to override `.table-striped` and prevent\n // inheritance to nested tables.\n .table > thead > tr,\n .table > tbody > tr,\n .table > tfoot > tr {\n > td.@{state},\n > th.@{state},\n &.@{state} > td,\n &.@{state} > th {\n background-color: @background;\n }\n }\n\n // Hover states for `.table-hover`\n // Note: this is not available for cells or rows within `thead` or `tfoot`.\n .table-hover > tbody > tr {\n > td.@{state}:hover,\n > th.@{state}:hover,\n &.@{state}:hover > td,\n &:hover > .@{state},\n &.@{state}:hover > th {\n background-color: darken(@background, 5%);\n }\n }\n}\n\n\n// Global overrides\n\ntable {\n background-color: @table-bg;\n}\ncaption {\n padding-top: @table-cell-padding;\n padding-bottom: @table-cell-padding;\n color: @text-muted;\n text-align: left;\n}\nth {\n text-align: left;\n}\n\n\n// Baseline styles\n\n.table {\n width: 100%;\n max-width: 100%;\n margin-bottom: @line-height-computed;\n // Cells\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-cell-padding;\n line-height: @line-height-base;\n vertical-align: top;\n border-top: 1px solid @table-border-color;\n }\n }\n }\n // Bottom align for column headings\n > thead > tr > th {\n vertical-align: bottom;\n border-bottom: 2px solid @table-border-color;\n }\n // Remove top border from thead by default\n > caption + thead,\n > colgroup + thead,\n > thead:first-child {\n > tr:first-child {\n > th,\n > td {\n border-top: 0;\n }\n }\n }\n // Account for multiple tbody instances\n > tbody + tbody {\n border-top: 2px solid @table-border-color;\n }\n\n // Nesting\n .table {\n background-color: @body-bg;\n }\n}\n\n\n// Condensed table w/ half padding\n\n.table-condensed {\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n padding: @table-condensed-cell-padding;\n }\n }\n }\n}\n\n\n// Bordered version\n//\n// Add borders all around the table and between all the columns.\n\n.table-bordered {\n border: 1px solid @table-border-color;\n > thead,\n > tbody,\n > tfoot {\n > tr {\n > th,\n > td {\n border: 1px solid @table-border-color;\n }\n }\n }\n > thead > tr {\n > th,\n > td {\n border-bottom-width: 2px;\n }\n }\n}\n\n\n// Zebra-striping\n//\n// Default zebra-stripe styles (alternating gray and transparent backgrounds)\n\n.table-striped {\n > tbody > tr:nth-of-type(odd) {\n background-color: @table-bg-accent;\n }\n}\n\n\n// Hover effect\n//\n// Placed here since it has to come after the potential zebra striping\n\n.table-hover {\n > tbody > tr:hover {\n background-color: @table-bg-hover;\n }\n}\n\n\n// Table cell sizing\n//\n// Reset default table behavior\n\ntable col[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-column;\n}\ntable {\n td,\n th {\n &[class*=\"col-\"] {\n position: static; // Prevent border hiding in Firefox and IE9-11 (see https://github.com/twbs/bootstrap/issues/11623)\n float: none;\n display: table-cell;\n }\n }\n}\n\n\n// Table backgrounds\n//\n// Exact selectors below required to override `.table-striped` and prevent\n// inheritance to nested tables.\n\n// Generate the contextual variants\n.table-row-variant(active; @table-bg-active);\n.table-row-variant(success; @state-success-bg);\n.table-row-variant(info; @state-info-bg);\n.table-row-variant(warning; @state-warning-bg);\n.table-row-variant(danger; @state-danger-bg);\n","digest":"43ec0b62ed5ff57800040281069c44f9d177a599"},"node_modules/atom-ui/styles/private/utilities.less":{"content":"@import \"ui-variables\";\n@import \"../mixins/mixins\";\n\n// Toggling content\n// -------------------------\n\n// Note: Deprecated .hide in favor of .hidden or .sr-only (as appropriate) in v3.0.1\n.hide {\n display: none !important;\n}\n.show {\n display: block !important;\n}\n.invisible {\n visibility: hidden;\n}\n.text-hide {\n .text-hide();\n}\n\n\n// Hide from screenreaders and browsers\n//\n// Credit: HTML5 Boilerplate\n\n.hidden {\n display: none !important;\n}\n\n\n// Only display content to screen readers\n//\n// See: http://a11yproject.com/posts/how-to-hide-content/\n\n.sr-only {\n position: absolute;\n width: 1px;\n height: 1px;\n margin: -1px;\n padding: 0;\n overflow: hidden;\n clip: rect(0,0,0,0);\n border: 0;\n}\n\n// Use in conjunction with .sr-only to only display content when it's focused.\n// Useful for \"Skip to main content\" links; see http://www.w3.org/TR/2013/NOTE-WCAG20-TECHS-20130905/G1\n// Credit: HTML5 Boilerplate\n\n.sr-only-focusable {\n &:active,\n &:focus {\n position: static;\n width: auto;\n height: auto;\n margin: 0;\n overflow: visible;\n clip: auto;\n }\n}\n","digest":"d7308fc13c56e919be53b486744b05819a64fd40"},"node_modules/atom-ui/styles/select-list.less":{"content":"@import \"ui-variables\";\n@import \"octicon-mixins\";\n\n.select-list {\n .loading {\n .loading-message {\n .octicon(hourglass);\n\n &:before {\n font-size: 1.1em;\n width: 1.1em;\n height: 1.1em;\n margin-right: 5px;\n }\n }\n\n .badge {\n margin-left: 10px;\n }\n }\n\n ol.list-group {\n position: relative;\n overflow-y: auto;\n max-height: 312px;\n margin: @component-padding 0 0 0;\n padding: 0;\n\n li {\n display: block;\n\n .primary-line,\n .secondary-line {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n }\n }\n }\n}\n\n\n// Popover List\n\n.select-list.popover-list {\n width: 200px;\n min-width: 200px;\n margin-left: 0;\n position: relative;\n background-color: @overlay-background-color;\n\n ol.list-group {\n position: relative;\n overflow-y: scroll;\n max-height: 200px;\n }\n}\n","digest":"518848bc20eb40cc04f71321a2842ce354550fcf"},"node_modules/atom-ui/styles/site-colors.less":{"content":"//\n// Site colors\n// --------------------------------------------------\n\n.ui-site-1 { background-color: @ui-site-color-1; }\n.ui-site-2 { background-color: @ui-site-color-2; }\n.ui-site-3 { background-color: @ui-site-color-3; }\n.ui-site-4 { background-color: @ui-site-color-4; }\n.ui-site-5 { background-color: @ui-site-color-5; }\n","digest":"e44c2b7ce99bf5e19306f74e52078ce190fd8ea4"},"node_modules/atom-ui/styles/text.less":{"content":"@import \"variables/variables\";\n@import \"ui-variables\";\n@import \"mixins/mixins\";\n\n//\n// Typography\n// --------------------------------------------------\n\n@font-size-h1: floor((@font-size-base * 2.6)); // ~36px\n@font-size-h2: floor((@font-size-base * 2.15)); // ~30px\n@font-size-h3: ceil((@font-size-base * 1.7)); // ~24px\n@font-size-h4: ceil((@font-size-base * 1.25)); // ~18px\n@font-size-h5: @font-size-base;\n@font-size-h6: ceil((@font-size-base * 0.85)); // ~12px\n\n@headings-font-family: inherit;\n@headings-font-weight: 500;\n@headings-line-height: 1.1;\n@headings-color: inherit;\n\n// Mixins\n// -------------------------\n\n.text-variant(@type) {\n @text-color-name: \"text-color-@{type}\";\n @bg-color-name: \"background-color-@{type}\";\n\n @text-color: @@text-color-name;\n @bg-color: @@bg-color-name;\n\n color: @text-color;\n a&:hover,\n a&:focus {\n color: darken(@text-color, 10%);\n }\n\n code {\n color: @text-color;\n background: fadeout(@bg-color, 80%);\n }\n\n a, a code {\n text-decoration: underline;\n color: darken(@text-color, 10%);\n\n &:hover {\n color: darken(@text-color, 15%);\n }\n }\n}\n\n.bg-variant(@color) {\n background-color: @color;\n a&:hover,\n a&:focus {\n background-color: darken(@color, 10%);\n }\n}\n\n// Headings\n// -------------------------\n\nh1, h2, h3, h4, h5, h6,\n.h1, .h2, .h3, .h4, .h5, .h6 {\n font-family: @headings-font-family;\n font-weight: @headings-font-weight;\n line-height: @headings-line-height;\n color: @headings-color;\n\n small,\n .small {\n font-weight: normal;\n line-height: 1;\n color: @headings-small-color;\n }\n}\n\nh1, .h1,\nh2, .h2,\nh3, .h3 {\n margin-top: @line-height-computed;\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 65%;\n }\n}\nh4, .h4,\nh5, .h5,\nh6, .h6 {\n margin-top: (@line-height-computed / 2);\n margin-bottom: (@line-height-computed / 2);\n\n small,\n .small {\n font-size: 75%;\n }\n}\n\nh1, .h1 { font-size: @font-size-h1; }\nh2, .h2 { font-size: @font-size-h2; }\nh3, .h3 { font-size: @font-size-h3; }\nh4, .h4 { font-size: @font-size-h4; }\nh5, .h5 { font-size: @font-size-h5; }\nh6, .h6 { font-size: @font-size-h6; }\n\n\n// Body text\n// -------------------------\n\np {\n margin: 0 0 (@line-height-computed / 2);\n}\n\n\n// Emphasis & misc\n// -------------------------\n\n// Ex: (12px small font / 14px base font) * 100% = about 85%\n.text-smaller,\nsmall,\n.small {\n font-size: floor((100% * @font-size-small / @font-size-base));\n}\n\nmark,\n.mark {\n background-color: @state-warning-bg;\n padding: .2em;\n}\n\n// Alignment\n.text-left { text-align: left; }\n.text-right { text-align: right; }\n.text-center { text-align: center; }\n.text-justify { text-align: justify; }\n.text-nowrap { white-space: nowrap; }\n\n// Transformation\n.text-lowercase { text-transform: lowercase; }\n.text-uppercase { text-transform: uppercase; }\n.text-capitalize { text-transform: capitalize; }\n\n// text-classes\n.text-subtle, .text-muted { color: @text-color-subtle; }\n.text-highlight { color: @text-color-highlight; }\n\n// Contextual colors\n.text-info, .text-primary { .text-variant(info); }\n.text-success { .text-variant(success); }\n.text-warning { .text-variant(warning); }\n.text-error, .text-danger { .text-variant(error); }\n\n// Contextual backgrounds\n// For now we'll leave these alongside the text classes until v4 when we can\n// safely shift things around (per SemVer rules).\n.bg-primary {\n // Given the contrast here, this is the only class to have its color inverted\n // automatically.\n color: #fff;\n .bg-variant(@brand-primary);\n}\n.bg-success {\n .bg-variant(@state-success-bg);\n}\n.bg-info {\n .bg-variant(@state-info-bg);\n}\n.bg-warning {\n .bg-variant(@state-warning-bg);\n}\n.bg-danger {\n .bg-variant(@state-danger-bg);\n}\n\n\n// Highlight\n// -------------------------\n\n.highlight() {\n font-weight: bold;\n border-radius: @component-border-radius;\n}\n\n.highlight {\n .highlight();\n color: @text-color-highlight;\n background-color: @background-color-highlight;\n}\n\n.highlight-color(@name, @color) {\n .highlight-@{name} {\n .highlight();\n color: #fff;\n background-color: fadeout(@color, 50%);\n }\n}\n\n.highlight-color(info, @background-color-info);\n.highlight-color(warning, @background-color-warning);\n.highlight-color(error, @background-color-error);\n.highlight-color(success, @background-color-success);\n\n\n// Lists\n// -------------------------\n\n// Unordered and Ordered lists\nul,\nol {\n margin-top: 0;\n margin-bottom: (@line-height-computed / 2);\n ul,\n ol {\n margin-bottom: 0;\n }\n}\n\n// Description Lists\ndl {\n margin-top: 0; // Remove browser default\n margin-bottom: @line-height-computed;\n}\ndt,\ndd {\n line-height: @line-height-base;\n}\ndt {\n font-weight: bold;\n}\ndd {\n margin-left: 0; // Undo browser default\n}\n\n\n// Misc\n// -------------------------\n\n// Abbreviations and acronyms\nabbr[title],\n// Add data-* attribute to help out our tooltip plugin, per https://github.com/twbs/bootstrap/issues/5257\nabbr[data-original-title] {\n cursor: help;\n border-bottom: 1px dotted @abbr-border-color;\n}\n\n// Blockquotes\nblockquote {\n padding: (@line-height-computed / 2) @line-height-computed;\n margin: 0 0 @line-height-computed;\n font-size: @blockquote-font-size;\n border-left: 5px solid @blockquote-border-color;\n\n p,\n ul,\n ol {\n &:last-child {\n margin-bottom: 0;\n }\n }\n}\n\n// Addresses\naddress {\n margin-bottom: @line-height-computed;\n font-style: normal;\n line-height: @line-height-base;\n}\n","digest":"d7d7f46cfbf517e31d08e97d60eb3eb2d646c1d7"},"node_modules/atom-ui/styles/tooltip.less":{"content":"@import \"ui-variables\";\n\n//\n// Tooltips\n// --------------------------------------------------\n\n@tooltip-max-width: 200px; //** Tooltip max width\n@tooltip-color: #fff; //** Tooltip text color\n@tooltip-bg: @background-color-info; //** Tooltip background color\n@tooltip-opacity: .9;\n@tooltip-arrow-width: 5px; //** Tooltip arrow width\n@tooltip-arrow-color: @tooltip-bg; //** Tooltip arrow color\n@tooltip-zindex: 1070;\n\n\n// Base class\n.tooltip {\n // Our parent element can be arbitrary since tooltips are by default inserted as a sibling of their target element.\n // So reset our font and text properties to avoid inheriting weird values.\n all: initial;\n\n position: absolute;\n z-index: @tooltip-zindex;\n display: block;\n font-family: @font-family;\n font-size: @font-size;\n opacity: 0;\n\n &.in { opacity: @tooltip-opacity; }\n &.top { margin-top: -3px; padding: @tooltip-arrow-width 0; }\n &.right { margin-left: 3px; padding: 0 @tooltip-arrow-width; }\n &.bottom { margin-top: 3px; padding: @tooltip-arrow-width 0; }\n &.left { margin-left: -3px; padding: 0 @tooltip-arrow-width; }\n}\n\n// Wrapper for the tooltip content\n.tooltip-inner {\n max-width: @tooltip-max-width;\n padding: 3px 8px;\n color: @tooltip-color;\n text-align: center;\n background-color: @tooltip-bg;\n border-radius: @component-border-radius;\n}\n\n// Arrows\n.tooltip-arrow {\n position: absolute;\n width: 0;\n height: 0;\n border-color: transparent;\n border-style: solid;\n}\n// Note: Deprecated .top-left, .top-right, .bottom-left, and .bottom-right as of v3.3.1\n.tooltip {\n &.top .tooltip-arrow {\n bottom: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-left .tooltip-arrow {\n bottom: 0;\n right: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.top-right .tooltip-arrow {\n bottom: 0;\n left: @tooltip-arrow-width;\n margin-bottom: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width 0;\n border-top-color: @tooltip-arrow-color;\n }\n &.right .tooltip-arrow {\n top: 50%;\n left: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width @tooltip-arrow-width @tooltip-arrow-width 0;\n border-right-color: @tooltip-arrow-color;\n }\n &.left .tooltip-arrow {\n top: 50%;\n right: 0;\n margin-top: -@tooltip-arrow-width;\n border-width: @tooltip-arrow-width 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-left-color: @tooltip-arrow-color;\n }\n &.bottom .tooltip-arrow {\n top: 0;\n left: 50%;\n margin-left: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-left .tooltip-arrow {\n top: 0;\n right: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n &.bottom-right .tooltip-arrow {\n top: 0;\n left: @tooltip-arrow-width;\n margin-top: -@tooltip-arrow-width;\n border-width: 0 @tooltip-arrow-width @tooltip-arrow-width;\n border-bottom-color: @tooltip-arrow-color;\n }\n}\n","digest":"4a9234eaed3a3b47b953cdfd4cf4526070c05eea"},"node_modules/atom-ui/styles/variables/variables.less":{"content":"@import \"ui-variables\";\n\n//\n// Variables (Forked from Bootstrap 3.3.6)\n// Don't use these variables in packages/themes.\n// Only use the public ui-variables.less + syntax-variables.less\n// --------------------------------------------------\n\n\n//== Colors\n//\n//## Gray and brand colors for use across Bootstrap.\n\n@gray-base: #000;\n@gray-darker: lighten(@gray-base, 13.5%); // #222\n@gray-dark: lighten(@gray-base, 20%); // #333\n@gray: lighten(@gray-base, 33.5%); // #555\n@gray-light: lighten(@gray-base, 46.7%); // #777\n@gray-lighter: lighten(@gray-base, 93.5%); // #eee\n\n@brand-primary: @text-color-info;\n@brand-info: @text-color-info;\n@brand-success: @text-color-success;\n@brand-warning: @text-color-warning;\n@brand-danger: @text-color-error;\n\n\n//== Scaffolding\n//\n//## Settings for some of the most global styles.\n\n//** Background color for `<body>`.\n@body-bg: @app-background-color;\n//** Global textual link color.\n@link-color: @brand-primary;\n//** Link hover color set via `darken()` function.\n@link-hover-color: darken(@link-color, 15%);\n//** Link hover decoration.\n@link-hover-decoration: underline;\n\n\n//== Typography\n//\n//## Font, line-height, and color for body text, headings, and more.\n\n//** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.\n@font-family-monospace: Menlo, Monaco, Consolas, \"Courier New\", monospace;\n\n@font-size-base: @font-size;\n@font-size-large: ceil((@font-size-base * 1.25)); // ~18px\n@font-size-small: ceil((@font-size-base * 0.85)); // ~12px\n\n//** Unit-less `line-height` for use in components like buttons.\n@line-height-base: 1.428571429; // 20/14\n//** Computed \"line-height\" (`font-size` * `line-height`) for use with `margin`, `padding`, etc.\n@line-height-computed: floor((@font-size-base * @line-height-base)); // ~20px\n\n\n//== Components\n//\n//## Define common padding and border radius sizes and more. Values based on 14px text and 1.428 line-height (~20px to start).\n\n@padding-base-vertical: 6px;\n@padding-base-horizontal: 12px;\n\n@padding-large-vertical: 10px;\n@padding-large-horizontal: 16px;\n\n@padding-small-vertical: 5px;\n@padding-small-horizontal: 10px;\n\n@padding-xs-vertical: 1px;\n@padding-xs-horizontal: 5px;\n\n@line-height-large: 1.3333333; // extra decimals for Win 8.1 Chrome\n@line-height-small: 1.5;\n\n@border-radius-base: 4px;\n@border-radius-large: 6px;\n@border-radius-small: 3px;\n\n//** Global color for active items (e.g., navs or dropdowns).\n@component-active-color: #fff;\n//** Global background color for active items (e.g., navs or dropdowns).\n@component-active-bg: @brand-primary;\n\n//** Width of the `border` for generating carets that indicator dropdowns.\n@caret-width-base: 4px;\n//** Carets increase slightly in size for larger components.\n@caret-width-large: 5px;\n\n\n//== Buttons\n//\n//## For each of Bootstrap's buttons, define text, background and border color.\n\n@btn-default-color: @text-color;\n@btn-default-bg: @button-background-color;\n\n@btn-primary-color: #fff;\n@btn-primary-bg: @background-color-info;\n\n@btn-success-color: #fff;\n@btn-success-bg: @background-color-success;\n\n@btn-info-color: #fff;\n@btn-info-bg: @background-color-info;\n\n@btn-warning-color: #fff;\n@btn-warning-bg: @background-color-warning;\n\n@btn-error-color: #fff;\n@btn-error-bg: @background-color-error;\n\n@btn-link-disabled-color: @text-color-subtle;\n\n// Allows for customizing button radius independently from global border radius\n@btn-border-radius-base: @component-border-radius;\n@btn-border-radius-large: @component-border-radius * 2;\n@btn-border-radius-small: @component-border-radius / 2;\n\n\n\n//== Media queries breakpoints\n//\n//## Define the breakpoints at which your layout will change, adapting to different screen sizes\n\n@screen-sm: 768px;\n@screen-sm-min: @screen-sm;\n\n@screen-xs-max: (@screen-sm-min - 1);\n\n// //== Form states and alerts\n// //\n// //## Define colors for form feedback states and, by default, alerts.\n//\n@state-success-text: #3c763d;\n@state-success-bg: #dff0d8;\n@state-success-border: darken(spin(@state-success-bg, -10), 5%);\n\n@state-info-text: #31708f;\n@state-info-bg: #d9edf7;\n@state-info-border: darken(spin(@state-info-bg, -10), 7%);\n\n@state-warning-text: #8a6d3b;\n@state-warning-bg: #fcf8e3;\n@state-warning-border: darken(spin(@state-warning-bg, -10), 5%);\n\n@state-danger-text: #a94442;\n@state-danger-bg: #f2dede;\n@state-danger-border: darken(spin(@state-danger-bg, -10), 5%);\n\n\n// == List group\n//\n// ##\n\n//** Background color on `.list-group-item`\n@list-group-bg: #fff;\n//** `.list-group-item` border color\n@list-group-border: #ddd;\n//** List group border radius\n@list-group-border-radius: @border-radius-base;\n\n//** Background color of single list items on hover\n@list-group-hover-bg: #f5f5f5;\n//** Text color of active list items\n@list-group-active-color: @component-active-color;\n//** Background color of active list items\n@list-group-active-bg: @component-active-bg;\n//** Border color of active list elements\n@list-group-active-border: @list-group-active-bg;\n//** Text color for content within active list items\n@list-group-active-text-color: lighten(@list-group-active-bg, 40%);\n\n//** Text color of disabled list items\n@list-group-disabled-color: @gray-light;\n//** Background color of disabled list items\n@list-group-disabled-bg: @gray-lighter;\n//** Text color for content within disabled list items\n@list-group-disabled-text-color: @list-group-disabled-color;\n\n@list-group-link-color: #555;\n@list-group-link-hover-color: @list-group-link-color;\n@list-group-link-heading-color: #333;\n\n\n//== Thumbnails\n//\n//##\n\n//** Padding around the thumbnail image\n@thumbnail-padding: 4px;\n//** Thumbnail background color\n@thumbnail-bg: @body-bg;\n//** Thumbnail border color\n@thumbnail-border: #ddd;\n//** Thumbnail border radius\n@thumbnail-border-radius: @border-radius-base;\n\n\n//== Type\n//\n//##\n\n//** Horizontal offset for forms and lists.\n@component-offset-horizontal: 180px;\n//** Text muted color\n@text-muted: @gray-light;\n//** Abbreviations and acronyms border color\n@abbr-border-color: @gray-light;\n//** Headings small color\n@headings-small-color: @gray-light;\n//** Blockquote small color\n@blockquote-small-color: @gray-light;\n//** Blockquote font size\n@blockquote-font-size: (@font-size-base * 1.25);\n//** Blockquote border color\n@blockquote-border-color: @gray-lighter;\n//** Page header border color\n@page-header-border-color: @gray-lighter;\n//** Horizontal line color.\n@hr-border: @gray-lighter;\n\n\n//== Misc\n//\n//##\n\n//** Disabled cursor for form controls and buttons.\n@cursor-disabled: not-allowed;\n","digest":"e874519c3f95c02da4def52962c25490bf586713"}},"importedFilePathsByRelativeImportPath":{"node_modules/atom-dark-syntax/styles":["node_modules/atom-dark-syntax/styles/syntax-variables.less"],"node_modules/atom-dark-ui/styles":["node_modules/atom-dark-ui/styles/atom.less","node_modules/atom-dark-ui/styles/buttons.less","node_modules/atom-dark-ui/styles/dropdowns.less","node_modules/atom-dark-ui/styles/editor.less","node_modules/atom-dark-ui/styles/git.less","node_modules/atom-dark-ui/styles/lists.less","node_modules/atom-dark-ui/styles/messages.less","node_modules/atom-dark-ui/styles/nav.less","node_modules/atom-dark-ui/styles/overlays.less","node_modules/atom-dark-ui/styles/panels.less","node_modules/atom-dark-ui/styles/panes.less","node_modules/atom-dark-ui/styles/progress.less","node_modules/atom-dark-ui/styles/sites.less","node_modules/atom-dark-ui/styles/tabs.less","node_modules/atom-dark-ui/styles/text.less","node_modules/atom-dark-ui/styles/tooltips.less","node_modules/atom-dark-ui/styles/tree-view.less","node_modules/atom-dark-ui/styles/ui-mixins.less","node_modules/atom-dark-ui/styles/ui-variables.less","node_modules/atom-dark-ui/styles/utilities.less"],"static/variables":["static/variables/octicon-mixins.less","static/variables/octicon-utf-codes.less","static/variables/syntax-variables.less","static/variables/ui-variables.less"],"static":["static/atom.less","static/atomicons.woff","static/babelrc.json","static/cursors.less","static/docks.less","static/images/octocat-spinner-128.gif","static/images/transparent-background.gif","static/index.html","static/index.js","static/jasmine.less","static/linux.less","static/normalize.less","static/octicons-2.1.2.woff","static/octicons.less","static/octicons.woff","static/panels.less","static/panes.less","static/scaffolding.less","static/syntax.less","static/text-editor.less","static/title-bar.less","static/variables/octicon-mixins.less","static/variables/octicon-utf-codes.less","static/variables/syntax-variables.less","static/variables/ui-variables.less","static/workspace-view.less"],"node_modules/atom-light-syntax/styles":["node_modules/atom-light-syntax/styles/syntax-variables.less"],"node_modules/base16-tomorrow-dark-theme/styles":["node_modules/base16-tomorrow-dark-theme/styles/colors.less","node_modules/base16-tomorrow-dark-theme/styles/editor.less","node_modules/base16-tomorrow-dark-theme/styles/syntax/_base.less","node_modules/base16-tomorrow-dark-theme/styles/syntax/cs.less","node_modules/base16-tomorrow-dark-theme/styles/syntax/json.less","node_modules/base16-tomorrow-dark-theme/styles/syntax-variables.less"],"node_modules/base16-tomorrow-light-theme/styles":["node_modules/base16-tomorrow-light-theme/styles/colors.less","node_modules/base16-tomorrow-light-theme/styles/editor.less","node_modules/base16-tomorrow-light-theme/styles/syntax/_base.less","node_modules/base16-tomorrow-light-theme/styles/syntax/cs.less","node_modules/base16-tomorrow-light-theme/styles/syntax/json.less","node_modules/base16-tomorrow-light-theme/styles/syntax-variables.less"],"node_modules/one-dark-syntax/styles":["node_modules/one-dark-syntax/styles/colors.less","node_modules/one-dark-syntax/styles/editor.less","node_modules/one-dark-syntax/styles/syntax/_base.less","node_modules/one-dark-syntax/styles/syntax/c.less","node_modules/one-dark-syntax/styles/syntax/cpp.less","node_modules/one-dark-syntax/styles/syntax/cs.less","node_modules/one-dark-syntax/styles/syntax/css.less","node_modules/one-dark-syntax/styles/syntax/elixir.less","node_modules/one-dark-syntax/styles/syntax/gfm.less","node_modules/one-dark-syntax/styles/syntax/go.less","node_modules/one-dark-syntax/styles/syntax/ini.less","node_modules/one-dark-syntax/styles/syntax/java.less","node_modules/one-dark-syntax/styles/syntax/javascript.less","node_modules/one-dark-syntax/styles/syntax/json.less","node_modules/one-dark-syntax/styles/syntax/python.less","node_modules/one-dark-syntax/styles/syntax/ruby.less","node_modules/one-dark-syntax/styles/syntax-variables.less"],"node_modules/one-light-syntax/styles":["node_modules/one-light-syntax/styles/colors.less","node_modules/one-light-syntax/styles/editor.less","node_modules/one-light-syntax/styles/syntax/_base.less","node_modules/one-light-syntax/styles/syntax/c.less","node_modules/one-light-syntax/styles/syntax/cpp.less","node_modules/one-light-syntax/styles/syntax/cs.less","node_modules/one-light-syntax/styles/syntax/css.less","node_modules/one-light-syntax/styles/syntax/elixir.less","node_modules/one-light-syntax/styles/syntax/gfm.less","node_modules/one-light-syntax/styles/syntax/go.less","node_modules/one-light-syntax/styles/syntax/ini.less","node_modules/one-light-syntax/styles/syntax/java.less","node_modules/one-light-syntax/styles/syntax/javascript.less","node_modules/one-light-syntax/styles/syntax/json.less","node_modules/one-light-syntax/styles/syntax/python.less","node_modules/one-light-syntax/styles/syntax/ruby.less","node_modules/one-light-syntax/styles/syntax-variables.less"],"node_modules/solarized-dark-syntax/styles":["node_modules/solarized-dark-syntax/styles/colors.less","node_modules/solarized-dark-syntax/styles/editor.less","node_modules/solarized-dark-syntax/styles/syntax/_base.less","node_modules/solarized-dark-syntax/styles/syntax/c.less","node_modules/solarized-dark-syntax/styles/syntax/coffee.less","node_modules/solarized-dark-syntax/styles/syntax/css.less","node_modules/solarized-dark-syntax/styles/syntax/go.less","node_modules/solarized-dark-syntax/styles/syntax/java.less","node_modules/solarized-dark-syntax/styles/syntax/javascript.less","node_modules/solarized-dark-syntax/styles/syntax/markdown.less","node_modules/solarized-dark-syntax/styles/syntax/markup.less","node_modules/solarized-dark-syntax/styles/syntax/php.less","node_modules/solarized-dark-syntax/styles/syntax/python.less","node_modules/solarized-dark-syntax/styles/syntax/ruby.less","node_modules/solarized-dark-syntax/styles/syntax/scala.less","node_modules/solarized-dark-syntax/styles/syntax-variables.less"],"node_modules/solarized-light-syntax/styles":["node_modules/solarized-light-syntax/styles/colors.less","node_modules/solarized-light-syntax/styles/editor.less","node_modules/solarized-light-syntax/styles/syntax/_base.less","node_modules/solarized-light-syntax/styles/syntax/c.less","node_modules/solarized-light-syntax/styles/syntax/coffee.less","node_modules/solarized-light-syntax/styles/syntax/css.less","node_modules/solarized-light-syntax/styles/syntax/go.less","node_modules/solarized-light-syntax/styles/syntax/java.less","node_modules/solarized-light-syntax/styles/syntax/javascript.less","node_modules/solarized-light-syntax/styles/syntax/markdown.less","node_modules/solarized-light-syntax/styles/syntax/markup.less","node_modules/solarized-light-syntax/styles/syntax/php.less","node_modules/solarized-light-syntax/styles/syntax/python.less","node_modules/solarized-light-syntax/styles/syntax/ruby.less","node_modules/solarized-light-syntax/styles/syntax/scala.less","node_modules/solarized-light-syntax/styles/syntax-variables.less"],"node_modules/atom-light-ui/styles":["node_modules/atom-light-ui/styles/atom.less","node_modules/atom-light-ui/styles/buttons.less","node_modules/atom-light-ui/styles/editor.less","node_modules/atom-light-ui/styles/git.less","node_modules/atom-light-ui/styles/lists.less","node_modules/atom-light-ui/styles/messages.less","node_modules/atom-light-ui/styles/overlays.less","node_modules/atom-light-ui/styles/panels.less","node_modules/atom-light-ui/styles/panes.less","node_modules/atom-light-ui/styles/progress.less","node_modules/atom-light-ui/styles/sites.less","node_modules/atom-light-ui/styles/tabs.less","node_modules/atom-light-ui/styles/text.less","node_modules/atom-light-ui/styles/tooltips.less","node_modules/atom-light-ui/styles/tree-view.less","node_modules/atom-light-ui/styles/ui-mixins.less","node_modules/atom-light-ui/styles/ui-variables.less","node_modules/atom-light-ui/styles/utilities.less"],"node_modules/one-dark-ui/styles":["node_modules/one-dark-ui/styles/atom.less","node_modules/one-dark-ui/styles/badges.less","node_modules/one-dark-ui/styles/buttons.less","node_modules/one-dark-ui/styles/config.less","node_modules/one-dark-ui/styles/core.less","node_modules/one-dark-ui/styles/docks.less","node_modules/one-dark-ui/styles/dropdowns.less","node_modules/one-dark-ui/styles/editor.less","node_modules/one-dark-ui/styles/git.less","node_modules/one-dark-ui/styles/inputs.less","node_modules/one-dark-ui/styles/key-binding.less","node_modules/one-dark-ui/styles/lists.less","node_modules/one-dark-ui/styles/messages.less","node_modules/one-dark-ui/styles/modal.less","node_modules/one-dark-ui/styles/nav.less","node_modules/one-dark-ui/styles/notifications.less","node_modules/one-dark-ui/styles/packages.less","node_modules/one-dark-ui/styles/panels.less","node_modules/one-dark-ui/styles/panes.less","node_modules/one-dark-ui/styles/progress.less","node_modules/one-dark-ui/styles/settings.less","node_modules/one-dark-ui/styles/sites.less","node_modules/one-dark-ui/styles/status-bar.less","node_modules/one-dark-ui/styles/tabs.less","node_modules/one-dark-ui/styles/text.less","node_modules/one-dark-ui/styles/title-bar.less","node_modules/one-dark-ui/styles/tooltips.less","node_modules/one-dark-ui/styles/tree-view.less","node_modules/one-dark-ui/styles/ui-mixins.less","node_modules/one-dark-ui/styles/ui-variables-custom.less","node_modules/one-dark-ui/styles/ui-variables.less"],"node_modules/one-light-ui/styles":["node_modules/one-light-ui/styles/atom.less","node_modules/one-light-ui/styles/badges.less","node_modules/one-light-ui/styles/buttons.less","node_modules/one-light-ui/styles/config.less","node_modules/one-light-ui/styles/core.less","node_modules/one-light-ui/styles/docks.less","node_modules/one-light-ui/styles/dropdowns.less","node_modules/one-light-ui/styles/editor.less","node_modules/one-light-ui/styles/git.less","node_modules/one-light-ui/styles/inputs.less","node_modules/one-light-ui/styles/key-binding.less","node_modules/one-light-ui/styles/lists.less","node_modules/one-light-ui/styles/messages.less","node_modules/one-light-ui/styles/modal.less","node_modules/one-light-ui/styles/nav.less","node_modules/one-light-ui/styles/notifications.less","node_modules/one-light-ui/styles/packages.less","node_modules/one-light-ui/styles/panels.less","node_modules/one-light-ui/styles/panes.less","node_modules/one-light-ui/styles/progress.less","node_modules/one-light-ui/styles/settings.less","node_modules/one-light-ui/styles/sites.less","node_modules/one-light-ui/styles/status-bar.less","node_modules/one-light-ui/styles/tabs.less","node_modules/one-light-ui/styles/text.less","node_modules/one-light-ui/styles/title-bar.less","node_modules/one-light-ui/styles/tooltips.less","node_modules/one-light-ui/styles/tree-view.less","node_modules/one-light-ui/styles/ui-mixins.less","node_modules/one-light-ui/styles/ui-variables-custom.less","node_modules/one-light-ui/styles/ui-variables.less"]}};; | |
function generateSnapshot() { | |
let process = {}; | |
Object.defineProperties(process, { | |
'platform': { value: 'darwin', enumerable: false }, | |
'argv': { value: [], enumerable: false }, | |
'env': { value: { 'NODE_ENV': 'production' }, enumerable: false } | |
}); | |
function get_process() { | |
return process; | |
} | |
function createElement(_type) { | |
return { | |
innerHTML: '', | |
style: {} | |
}; | |
} | |
let documentElement = { | |
textContent: '', | |
style: { | |
cssFloat: '' | |
} | |
}; | |
let document = {}; | |
Object.defineProperties(document, { | |
'createElement': { value: createElement, enumerable: false }, | |
'addEventListener': { value: function () {}, enumerable: false }, | |
'documentElement': { value: documentElement, enumerable: false }, | |
'oninput': { value: {}, enumerable: false }, | |
'onchange': { value: {}, enumerable: false } | |
}); | |
function get_document() { | |
return document; | |
} | |
let global = {}; | |
Object.defineProperties(global, { | |
'document': { value: document, enumerable: false }, | |
'process': { value: process, enumerable: false }, | |
'WeakMap': { value: WeakMap, enumerable: false }, | |
'isGeneratingSnapshot': { value: true, enumerable: false } | |
}); | |
function get_global() { | |
return global; | |
} | |
let window = {}; | |
Object.defineProperties(window, { | |
'document': { value: document, enumerable: false }, | |
'location': { value: { href: '' }, enumerable: false }, | |
'addEventListener': { value: function () {}, enumerable: false }, | |
'screen': { value: {}, enumerable: false } | |
}); | |
function get_window() { | |
return window; | |
} | |
let console = {}; | |
function consoleNoop() { | |
throw new Error('Cannot use `console` functions in the snapshot.'); | |
} | |
Object.defineProperties(console, { | |
'debug': { value: consoleNoop, enumerable: false }, | |
'error': { value: consoleNoop, enumerable: false }, | |
'info': { value: consoleNoop, enumerable: false }, | |
'log': { value: consoleNoop, enumerable: false }, | |
'warn': { value: consoleNoop, enumerable: false }, | |
'time': { value: consoleNoop, enumerable: false }, | |
'timeEnd': { value: consoleNoop, enumerable: false } | |
}); | |
function get_console() { | |
return console; | |
} | |
let require = moduleName => { | |
throw new Error(`Cannot require module "${moduleName}".\n` + "To use Node's require you need to call `snapshotResult.setGlobals` first!"); | |
}; | |
function customRequire(modulePath) { | |
let module = customRequire.cache[modulePath]; | |
if (!module) { | |
module = { exports: {} }; | |
const dirname = modulePath.split('/').slice(0, -1).join('/'); | |
function define(callback) { | |
callback(customRequire, module.exports, module); | |
} | |
if (customRequire.definitions.hasOwnProperty(modulePath)) { | |
customRequire.cache[modulePath] = module; | |
customRequire.definitions[modulePath].apply(module.exports, [module.exports, module, modulePath, dirname, customRequire, define]); | |
} else { | |
module.exports = require(modulePath); | |
customRequire.cache[modulePath] = module; | |
} | |
} | |
return module.exports; | |
} | |
customRequire.extensions = {}; | |
customRequire.cache = {}; | |
customRequire.definitions = { | |
"../src/initialize-application-window.js": function (exports, module, __filename, __dirname, require, define) { | |
(function() { | |
var ApplicationDelegate, AtomEnvironment, Clipboard, CompileCache, FileSystemBlobStore, ModuleCache, NativeCompileCache, TextEditor, TextEditorComponent, clipboard; | |
AtomEnvironment = require("../src/atom-environment.js"); | |
ApplicationDelegate = require("../src/application-delegate.js"); | |
Clipboard = require("../src/clipboard.js"); | |
TextEditor = require("../src/text-editor.js"); | |
TextEditorComponent = require("../src/text-editor-component.js"); | |
FileSystemBlobStore = require("../src/file-system-blob-store.js"); | |
NativeCompileCache = require("../src/native-compile-cache.js"); | |
CompileCache = require("../src/compile-cache.js"); | |
ModuleCache = require("../src/module-cache.js"); | |
if (get_global().isGeneratingSnapshot) { | |
require("../node_modules/about/lib/main.js"); | |
require("../node_modules/archive-view/lib/archive-editor.js"); | |
require("../node_modules/autocomplete-atom-api/lib/main.js"); | |
require("../node_modules/autocomplete-css/lib/main.js"); | |
require("../node_modules/autocomplete-html/lib/main.js"); | |
require("../node_modules/autocomplete-plus/lib/main.js"); | |
require("../node_modules/autocomplete-snippets/lib/autocomplete-snippets.js"); | |
require("../node_modules/autoflow/lib/autoflow.js"); | |
require("../node_modules/autosave/lib/autosave.js"); | |
require("../node_modules/background-tips/lib/background-tips.js"); | |
require("../node_modules/bookmarks/lib/main.js"); | |
require("../node_modules/bracket-matcher/lib/main.js"); | |
require("../node_modules/command-palette/lib/command-palette-package.js"); | |
require("../node_modules/deprecation-cop/lib/main.js"); | |
require("../node_modules/dev-live-reload/lib/main.js"); | |
require("../node_modules/encoding-selector/lib/main.js"); | |
require("../node_modules/exception-reporting/lib/main.js"); | |
require("../node_modules/dalek/lib/main.js"); | |
require("../node_modules/find-and-replace/lib/find.js"); | |
require("../node_modules/fuzzy-finder/lib/main.js"); | |
require("../node_modules/github/lib/index.js"); | |
require("../node_modules/git-diff/lib/main.js"); | |
require("../node_modules/go-to-line/lib/go-to-line-view.js"); | |
require("../node_modules/grammar-selector/lib/main.js"); | |
require("../node_modules/image-view/lib/main.js"); | |
require("../node_modules/incompatible-packages/lib/main.js"); | |
require("../node_modules/keybinding-resolver/lib/main.js"); | |
require("../node_modules/line-ending-selector/lib/main.js"); | |
require("../node_modules/link/lib/link.js"); | |
require("../node_modules/markdown-preview/lib/main.js"); | |
require("../node_modules/metrics/lib/metrics.js"); | |
require("../node_modules/notifications/lib/main.js"); | |
require("../node_modules/open-on-github/lib/main.js"); | |
require("../node_modules/package-generator/lib/main.js"); | |
require("../node_modules/settings-view/lib/main.js"); | |
require("../node_modules/snippets/lib/snippets.js"); | |
require("../node_modules/spell-check/lib/main.js"); | |
require("../node_modules/status-bar/lib/main.js"); | |
require("../node_modules/styleguide/lib/styleguide.js"); | |
require("../node_modules/symbols-view/lib/main.js"); | |
require("../node_modules/tabs/lib/main.js"); | |
require("../node_modules/timecop/lib/main.js"); | |
require("../node_modules/tree-view/lib/main.js"); | |
require("../node_modules/update-package-dependencies/lib/update-package-dependencies.js"); | |
require("../node_modules/welcome/lib/main.js"); | |
require("../node_modules/whitespace/lib/main.js"); | |
require("../node_modules/wrap-guide/lib/main.js"); | |
} | |
clipboard = new Clipboard; | |
TextEditor.setClipboard(clipboard); | |
TextEditor.viewForItem = function(item) { | |
return atom.views.getView(item); | |
}; | |
get_global().atom = new AtomEnvironment({ | |
clipboard: clipboard, | |
applicationDelegate: new ApplicationDelegate, | |
enablePersistence: true | |
}); | |
TextEditor.setScheduler(get_global().atom.views); | |
get_global().atom.preloadPackages(); | |
module.exports = function(arg) { | |
var base, blobStore, devMode, env, exportsPath, getWindowLoadSettings, ipcRenderer, path, ref, resourcePath, updateProcessEnv; | |
blobStore = arg.blobStore; | |
updateProcessEnv = require("../src/update-process-env.js").updateProcessEnv; | |
path = require('path'); | |
require("../src/window.js"); | |
getWindowLoadSettings = require("../src/get-window-load-settings.js"); | |
ipcRenderer = require('electron').ipcRenderer; | |
ref = getWindowLoadSettings(), resourcePath = ref.resourcePath, devMode = ref.devMode, env = ref.env; | |
require("../src/electron-shims.js"); | |
exportsPath = path.join(resourcePath, 'exports'); | |
require('module').globalPaths.push(exportsPath); | |
get_process().env.NODE_PATH = exportsPath; | |
if (!devMode) { | |
if ((base = get_process().env).NODE_ENV == null) { | |
base.NODE_ENV = 'production'; | |
} | |
} | |
get_global().atom.initialize({ | |
window: get_window(), | |
document: get_document(), | |
blobStore: blobStore, | |
configDirPath: get_process().env.ATOM_HOME, | |
env: get_process().env | |
}); | |
return get_global().atom.startEditorWindow().then(function() { | |
var windowFocused; | |
windowFocused = function() { | |
get_window().removeEventListener('focus', windowFocused); | |
return setTimeout((function() { | |
return get_document().querySelector('atom-workspace').focus(); | |
}), 0); | |
}; | |
get_window().addEventListener('focus', windowFocused); | |
return ipcRenderer.on('environment', function(event, env) { | |
return updateProcessEnv(env); | |
}); | |
}); | |
}; | |
}).call(this); | |
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiL1VzZXJzL2xlcm9peC9naXRodWIvYXRvbS9vdXQvYXBwL3NyYy9pbml0aWFsaXplLWFwcGxpY2F0aW9uLXdpbmRvdy5jb2ZmZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQSxNQUFBOztFQUFBLGVBQUEsR0FBa0IsT0FBQSxDQUFRLG9CQUFSOztFQUNsQixtQkFBQSxHQUFzQixPQUFBLENBQVEsd0JBQVI7O0VBQ3RCLFNBQUEsR0FBWSxPQUFBLENBQVEsYUFBUjs7RUFDWixVQUFBLEdBQWEsT0FBQSxDQUFRLGVBQVI7O0VBQ2IsbUJBQUEsR0FBc0IsT0FBQSxDQUFRLHlCQUFSOztFQUN0QixtQkFBQSxHQUFzQixPQUFBLENBQVEsMEJBQVI7O0VBQ3RCLGtCQUFBLEdBQXFCLE9BQUEsQ0FBUSx3QkFBUjs7RUFDckIsWUFBQSxHQUFlLE9BQUEsQ0FBUSxpQkFBUjs7RUFDZixXQUFBLEdBQWMsT0FBQSxDQUFRLGdCQUFSOztFQUVkLElBQUcsTUFBTSxDQUFDLG9CQUFWO0lBQ0UsT0FBQSxDQUFRLE9BQVI7SUFDQSxPQUFBLENBQVEsY0FBUjtJQUNBLE9BQUEsQ0FBUSx1QkFBUjtJQUNBLE9BQUEsQ0FBUSxrQkFBUjtJQUNBLE9BQUEsQ0FBUSxtQkFBUjtJQUNBLE9BQUEsQ0FBUSxtQkFBUjtJQUNBLE9BQUEsQ0FBUSx1QkFBUjtJQUNBLE9BQUEsQ0FBUSxVQUFSO0lBQ0EsT0FBQSxDQUFRLFVBQVI7SUFDQSxPQUFBLENBQVEsaUJBQVI7SUFDQSxPQUFBLENBQVEsV0FBUjtJQUNBLE9BQUEsQ0FBUSxpQkFBUjtJQUNBLE9BQUEsQ0FBUSxpQkFBUjtJQUNBLE9BQUEsQ0FBUSxpQkFBUjtJQUNBLE9BQUEsQ0FBUSxpQkFBUjtJQUNBLE9BQUEsQ0FBUSxtQkFBUjtJQUNBLE9BQUEsQ0FBUSxxQkFBUjtJQUNBLE9BQUEsQ0FBUSxPQUFSO0lBQ0EsT0FBQSxDQUFRLGtCQUFSO0lBQ0EsT0FBQSxDQUFRLGNBQVI7SUFDQSxPQUFBLENBQVEsUUFBUjtJQUNBLE9BQUEsQ0FBUSxVQUFSO0lBQ0EsT0FBQSxDQUFRLFlBQVI7SUFDQSxPQUFBLENBQVEsa0JBQVI7SUFDQSxPQUFBLENBQVEsWUFBUjtJQUNBLE9BQUEsQ0FBUSx1QkFBUjtJQUNBLE9BQUEsQ0FBUSxxQkFBUjtJQUNBLE9BQUEsQ0FBUSxzQkFBUjtJQUNBLE9BQUEsQ0FBUSxNQUFSO0lBQ0EsT0FBQSxDQUFRLGtCQUFSO0lBQ0EsT0FBQSxDQUFRLFNBQVI7SUFDQSxPQUFBLENBQVEsZUFBUjtJQUNBLE9BQUEsQ0FBUSxnQkFBUjtJQUNBLE9BQUEsQ0FBUSxtQkFBUjtJQUNBLE9BQUEsQ0FBUSxlQUFSO0lBQ0EsT0FBQSxDQUFRLFVBQVI7SUFDQSxPQUFBLENBQVEsYUFBUjtJQUNBLE9BQUEsQ0FBUSxZQUFSO0lBQ0EsT0FBQSxDQUFRLFlBQVI7SUFDQSxPQUFBLENBQVEsY0FBUjtJQUNBLE9BQUEsQ0FBUSxNQUFSO0lBQ0EsT0FBQSxDQUFRLFNBQVI7SUFDQSxPQUFBLENBQVEsV0FBUjtJQUNBLE9BQUEsQ0FBUSw2QkFBUjtJQUNBLE9BQUEsQ0FBUSxTQUFSO0lBQ0EsT0FBQSxDQUFRLFlBQVI7SUFDQSxPQUFBLENBQVEsWUFBUixFQS9DRjs7O0VBaURBLFNBQUEsR0FBWSxJQUFJOztFQUNoQixVQUFVLENBQUMsWUFBWCxDQUF3QixTQUF4Qjs7RUFDQSxVQUFVLENBQUMsV0FBWCxHQUF5QixTQUFDLElBQUQ7V0FBVSxJQUFJLENBQUMsS0FBSyxDQUFDLE9BQVgsQ0FBbUIsSUFBbkI7RUFBVjs7RUFFekIsTUFBTSxDQUFDLElBQVAsR0FBYyxJQUFJLGVBQUosQ0FBb0I7SUFDaEMsV0FBQSxTQURnQztJQUVoQyxtQkFBQSxFQUFxQixJQUFJLG1CQUZPO0lBR2hDLGlCQUFBLEVBQW1CLElBSGE7R0FBcEI7O0VBTWQsVUFBVSxDQUFDLFlBQVgsQ0FBd0IsTUFBTSxDQUFDLElBQUksQ0FBQyxLQUFwQzs7RUFDQSxNQUFNLENBQUMsSUFBSSxDQUFDLGVBQVosQ0FBQTs7RUFHQSxNQUFNLENBQUMsT0FBUCxHQUFpQixTQUFDLEdBQUQ7QUFDZixRQUFBO0lBRGlCLFlBQUQ7SUFDZixtQkFBb0IsT0FBQSxDQUFRLHNCQUFSO0lBQ3JCLElBQUEsR0FBTyxPQUFBLENBQVEsTUFBUjtJQUNQLE9BQUEsQ0FBUSxVQUFSO0lBQ0EscUJBQUEsR0FBd0IsT0FBQSxDQUFRLDRCQUFSO0lBQ3ZCLGNBQWUsT0FBQSxDQUFRLFVBQVI7SUFDaEIsTUFBK0IscUJBQUEsQ0FBQSxDQUEvQixFQUFDLCtCQUFELEVBQWUscUJBQWYsRUFBd0I7SUFDeEIsT0FBQSxDQUFRLGtCQUFSO0lBR0EsV0FBQSxHQUFjLElBQUksQ0FBQyxJQUFMLENBQVUsWUFBVixFQUF3QixTQUF4QjtJQUNkLE9BQUEsQ0FBUSxRQUFSLENBQWlCLENBQUMsV0FBVyxDQUFDLElBQTlCLENBQW1DLFdBQW5DO0lBQ0EsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFaLEdBQXdCO0lBR3hCLElBQUEsQ0FBNEMsT0FBNUM7O1lBQVcsQ0FBQyxXQUFZO09BQXhCOztJQUVBLE1BQU0sQ0FBQyxJQUFJLENBQUMsVUFBWixDQUF1QjtNQUNyQixRQUFBLE1BRHFCO01BQ2IsVUFBQSxRQURhO01BQ0gsV0FBQSxTQURHO01BRXJCLGFBQUEsRUFBZSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBRk47TUFHckIsR0FBQSxFQUFLLE9BQU8sQ0FBQyxHQUhRO0tBQXZCO1dBTUEsTUFBTSxDQUFDLElBQUksQ0FBQyxpQkFBWixDQUFBLENBQStCLENBQUMsSUFBaEMsQ0FBcUMsU0FBQTtBQUVuQyxVQUFBO01BQUEsYUFBQSxHQUFnQixTQUFBO1FBQ2QsTUFBTSxDQUFDLG1CQUFQLENBQTJCLE9BQTNCLEVBQW9DLGFBQXBDO2VBQ0EsVUFBQSxDQUFXLENBQUMsU0FBQTtpQkFBRyxRQUFRLENBQUMsYUFBVCxDQUF1QixnQkFBdkIsQ0FBd0MsQ0FBQyxLQUF6QyxDQUFBO1FBQUgsQ0FBRCxDQUFYLEVBQWtFLENBQWxFO01BRmM7TUFHaEIsTUFBTSxDQUFDLGdCQUFQLENBQXdCLE9BQXhCLEVBQWlDLGFBQWpDO2FBQ0EsV0FBVyxDQUFDLEVBQVosQ0FBZSxhQUFmLEVBQThCLFNBQUMsS0FBRCxFQUFRLEdBQVI7ZUFDNUIsZ0JBQUEsQ0FBaUIsR0FBakI7TUFENEIsQ0FBOUI7SUFObUMsQ0FBckM7RUF2QmU7QUF6RWpCIiwic291cmNlc0NvbnRlbnQiOlsiQXRvbUVudmlyb25tZW50ID0gcmVxdWlyZSAnLi9hdG9tLWVudmlyb25tZW50J1xuQXBwbGljYXRpb25EZWxlZ2F0ZSA9IHJlcXVpcmUgJy4vYXBwbGljYXRpb24tZGVsZWdhdGUnXG5DbGlwYm9hcmQgPSByZXF1aXJlICcuL2NsaXBib2FyZCdcblRleHRFZGl0b3IgPSByZXF1aXJlICcuL3RleHQtZWRpdG9yJ1xuVGV4dEVkaXRvckNvbXBvbmVudCA9IHJlcXVpcmUgJy4vdGV4dC1lZGl0b3ItY29tcG9uZW50J1xuRmlsZVN5c3RlbUJsb2JTdG9yZSA9IHJlcXVpcmUgJy4vZmlsZS1zeXN0ZW0tYmxvYi1zdG9yZSdcbk5hdGl2ZUNvbXBpbGVDYWNoZSA9IHJlcXVpcmUgJy4vbmF0aXZlLWNvbXBpbGUtY2FjaGUnXG5Db21waWxlQ2FjaGUgPSByZXF1aXJlICcuL2NvbXBpbGUtY2FjaGUnXG5Nb2R1bGVDYWNoZSA9IHJlcXVpcmUgJy4vbW9kdWxlLWNhY2hlJ1xuXG5pZiBnbG9iYWwuaXNHZW5lcmF0aW5nU25hcHNob3RcbiAgcmVxdWlyZSgnYWJvdXQnKVxuICByZXF1aXJlKCdhcmNoaXZlLXZpZXcnKVxuICByZXF1aXJlKCdhdXRvY29tcGxldGUtYXRvbS1hcGknKVxuICByZXF1aXJlKCdhdXRvY29tcGxldGUtY3NzJylcbiAgcmVxdWlyZSgnYXV0b2NvbXBsZXRlLWh0bWwnKVxuICByZXF1aXJlKCdhdXRvY29tcGxldGUtcGx1cycpXG4gIHJlcXVpcmUoJ2F1dG9jb21wbGV0ZS1zbmlwcGV0cycpXG4gIHJlcXVpcmUoJ2F1dG9mbG93JylcbiAgcmVxdWlyZSgnYXV0b3NhdmUnKVxuICByZXF1aXJlKCdiYWNrZ3JvdW5kLXRpcHMnKVxuICByZXF1aXJlKCdib29rbWFya3MnKVxuICByZXF1aXJlKCdicmFja2V0LW1hdGNoZXInKVxuICByZXF1aXJlKCdjb21tYW5kLXBhbGV0dGUnKVxuICByZXF1aXJlKCdkZXByZWNhdGlvbi1jb3AnKVxuICByZXF1aXJlKCdkZXYtbGl2ZS1yZWxvYWQnKVxuICByZXF1aXJlKCdlbmNvZGluZy1zZWxlY3RvcicpXG4gIHJlcXVpcmUoJ2V4Y2VwdGlvbi1yZXBvcnRpbmcnKVxuICByZXF1aXJlKCdkYWxlaycpXG4gIHJlcXVpcmUoJ2ZpbmQtYW5kLXJlcGxhY2UnKVxuICByZXF1aXJlKCdmdXp6eS1maW5kZXInKVxuICByZXF1aXJlKCdnaXRodWInKVxuICByZXF1aXJlKCdnaXQtZGlmZicpXG4gIHJlcXVpcmUoJ2dvLXRvLWxpbmUnKVxuICByZXF1aXJlKCdncmFtbWFyLXNlbGVjdG9yJylcbiAgcmVxdWlyZSgnaW1hZ2UtdmlldycpXG4gIHJlcXVpcmUoJ2luY29tcGF0aWJsZS1wYWNrYWdlcycpXG4gIHJlcXVpcmUoJ2tleWJpbmRpbmctcmVzb2x2ZXInKVxuICByZXF1aXJlKCdsaW5lLWVuZGluZy1zZWxlY3RvcicpXG4gIHJlcXVpcmUoJ2xpbmsnKVxuICByZXF1aXJlKCdtYXJrZG93bi1wcmV2aWV3JylcbiAgcmVxdWlyZSgnbWV0cmljcycpXG4gIHJlcXVpcmUoJ25vdGlmaWNhdGlvbnMnKVxuICByZXF1aXJlKCdvcGVuLW9uLWdpdGh1YicpXG4gIHJlcXVpcmUoJ3BhY2thZ2UtZ2VuZXJhdG9yJylcbiAgcmVxdWlyZSgnc2V0dGluZ3MtdmlldycpXG4gIHJlcXVpcmUoJ3NuaXBwZXRzJylcbiAgcmVxdWlyZSgnc3BlbGwtY2hlY2snKVxuICByZXF1aXJlKCdzdGF0dXMtYmFyJylcbiAgcmVxdWlyZSgnc3R5bGVndWlkZScpXG4gIHJlcXVpcmUoJ3N5bWJvbHMtdmlldycpXG4gIHJlcXVpcmUoJ3RhYnMnKVxuICByZXF1aXJlKCd0aW1lY29wJylcbiAgcmVxdWlyZSgndHJlZS12aWV3JylcbiAgcmVxdWlyZSgndXBkYXRlLXBhY2thZ2UtZGVwZW5kZW5jaWVzJylcbiAgcmVxdWlyZSgnd2VsY29tZScpXG4gIHJlcXVpcmUoJ3doaXRlc3BhY2UnKVxuICByZXF1aXJlKCd3cmFwLWd1aWRlJylcblxuY2xpcGJvYXJkID0gbmV3IENsaXBib2FyZFxuVGV4dEVkaXRvci5zZXRDbGlwYm9hcmQoY2xpcGJvYXJkKVxuVGV4dEVkaXRvci52aWV3Rm9ySXRlbSA9IChpdGVtKSAtPiBhdG9tLnZpZXdzLmdldFZpZXcoaXRlbSlcblxuZ2xvYmFsLmF0b20gPSBuZXcgQXRvbUVudmlyb25tZW50KHtcbiAgY2xpcGJvYXJkLFxuICBhcHBsaWNhdGlvbkRlbGVnYXRlOiBuZXcgQXBwbGljYXRpb25EZWxlZ2F0ZSxcbiAgZW5hYmxlUGVyc2lzdGVuY2U6IHRydWVcbn0pXG5cblRleHRFZGl0b3Iuc2V0U2NoZWR1bGVyKGdsb2JhbC5hdG9tLnZpZXdzKVxuZ2xvYmFsLmF0b20ucHJlbG9hZFBhY2thZ2VzKClcblxuIyBMaWtlIHNhbmRzIHRocm91Z2ggdGhlIGhvdXJnbGFzcywgc28gYXJlIHRoZSBkYXlzIG9mIG91ciBsaXZlcy5cbm1vZHVsZS5leHBvcnRzID0gKHtibG9iU3RvcmV9KSAtPlxuICB7dXBkYXRlUHJvY2Vzc0Vudn0gPSByZXF1aXJlKCcuL3VwZGF0ZS1wcm9jZXNzLWVudicpXG4gIHBhdGggPSByZXF1aXJlICdwYXRoJ1xuICByZXF1aXJlICcuL3dpbmRvdydcbiAgZ2V0V2luZG93TG9hZFNldHRpbmdzID0gcmVxdWlyZSAnLi9nZXQtd2luZG93LWxvYWQtc2V0dGluZ3MnXG4gIHtpcGNSZW5kZXJlcn0gPSByZXF1aXJlICdlbGVjdHJvbidcbiAge3Jlc291cmNlUGF0aCwgZGV2TW9kZSwgZW52fSA9IGdldFdpbmRvd0xvYWRTZXR0aW5ncygpXG4gIHJlcXVpcmUgJy4vZWxlY3Ryb24tc2hpbXMnXG5cbiAgIyBBZGQgYXBwbGljYXRpb24tc3BlY2lmaWMgZXhwb3J0cyB0byBtb2R1bGUgc2VhcmNoIHBhdGguXG4gIGV4cG9ydHNQYXRoID0gcGF0aC5qb2luKHJlc291cmNlUGF0aCwgJ2V4cG9ydHMnKVxuICByZXF1aXJlKCdtb2R1bGUnKS5nbG9iYWxQYXRocy5wdXNoKGV4cG9ydHNQYXRoKVxuICBwcm9jZXNzLmVudi5OT0RFX1BBVEggPSBleHBvcnRzUGF0aFxuXG4gICMgTWFrZSBSZWFjdCBmYXN0ZXJcbiAgcHJvY2Vzcy5lbnYuTk9ERV9FTlYgPz0gJ3Byb2R1Y3Rpb24nIHVubGVzcyBkZXZNb2RlXG5cbiAgZ2xvYmFsLmF0b20uaW5pdGlhbGl6ZSh7XG4gICAgd2luZG93LCBkb2N1bWVudCwgYmxvYlN0b3JlLFxuICAgIGNvbmZpZ0RpclBhdGg6IHByb2Nlc3MuZW52LkFUT01fSE9NRSxcbiAgICBlbnY6IHByb2Nlc3MuZW52XG4gIH0pXG5cbiAgZ2xvYmFsLmF0b20uc3RhcnRFZGl0b3JXaW5kb3coKS50aGVuIC0+XG4gICAgIyBXb3JrYXJvdW5kIGZvciBmb2N1cyBnZXR0aW5nIGNsZWFyZWQgdXBvbiB3aW5kb3cgY3JlYXRpb25cbiAgICB3aW5kb3dGb2N1c2VkID0gLT5cbiAgICAgIHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCdmb2N1cycsIHdpbmRvd0ZvY3VzZWQpXG4gICAgICBzZXRUaW1lb3V0ICgtPiBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCdhdG9tLXdvcmtzcGFjZScpLmZvY3VzKCkpLCAwXG4gICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ2ZvY3VzJywgd2luZG93Rm9jdXNlZClcbiAgICBpcGNSZW5kZXJlci5vbignZW52aXJvbm1lbnQnLCAoZXZlbnQsIGVudikgLT5cbiAgICAgIHVwZGF0ZVByb2Nlc3NFbnYoZW52KVxuICAgIClcbiJdfQ== | |
}, | |
"../src/atom-environment.js": function (exports, module, __filename, __dirname, require, define) { | |
let crypto; | |
function get_crypto() { | |
return crypto = crypto || require('crypto'); | |
} | |
let path; | |
function get_path() { | |
return path = path || require('path'); | |
} | |
let {ipcRenderer} = {}; | |
function get_ipcRenderer() { | |
return ipcRenderer = ipcRenderer || require('electron').ipcRenderer; | |
} | |
const _ = require("../node_modules/underscore-plus/lib/underscore-plus.js") | |
const {deprecate} = require("../node_modules/grim/lib/grim.js") | |
const {CompositeDisposable, Disposable, Emitter} = require("../node_modules/event-kit/lib/event-kit.js") | |
const fs = require("../node_modules/fs-plus/lib/fs-plus.js") | |
const {mapSourcePosition} = require("../node_modules/@atom/source-map-support/source-map-support.js") | |
const WindowEventHandler = require("../src/window-event-handler.js") | |
const StateStore = require("../src/state-store.js") | |
const StorageFolder = require("../src/storage-folder.js") | |
const registerDefaultCommands = require("../src/register-default-commands.js") | |
const {updateProcessEnv} = require("../src/update-process-env.js") | |
const ConfigSchema = require("../src/config-schema.js") | |
const DeserializerManager = require("../src/deserializer-manager.js") | |
const ViewRegistry = require("../src/view-registry.js") | |
const NotificationManager = require("../src/notification-manager.js") | |
const Config = require("../src/config.js") | |
const KeymapManager = require("../src/keymap-extensions.js") | |
const TooltipManager = require("../src/tooltip-manager.js") | |
const CommandRegistry = require("../src/command-registry.js") | |
const URIHandlerRegistry = require("../src/uri-handler-registry.js") | |
const GrammarRegistry = require("../src/grammar-registry.js") | |
const {HistoryManager} = require("../src/history-manager.js") | |
const ReopenProjectMenuManager = require("../src/reopen-project-menu-manager.js") | |
const StyleManager = require("../src/style-manager.js") | |
const PackageManager = require("../src/package-manager.js") | |
const ThemeManager = require("../src/theme-manager.js") | |
const MenuManager = require("../src/menu-manager.js") | |
const ContextMenuManager = require("../src/context-menu-manager.js") | |
const CommandInstaller = require("../src/command-installer.js") | |
const CoreURIHandlers = require("../src/core-uri-handlers.js") | |
const ProtocolHandlerInstaller = require("../src/protocol-handler-installer.js") | |
const Project = require("../src/project.js") | |
const TitleBar = require("../src/title-bar.js") | |
const Workspace = require("../src/workspace.js") | |
const PaneContainer = require("../src/pane-container.js") | |
const PaneAxis = require("../src/pane-axis.js") | |
const Pane = require("../src/pane.js") | |
const Dock = require("../src/dock.js") | |
const TextEditor = require("../src/text-editor.js") | |
const TextBuffer = require("../node_modules/text-buffer/lib/text-buffer.js") | |
const TextEditorRegistry = require("../src/text-editor-registry.js") | |
const AutoUpdateManager = require("../src/auto-update-manager.js") | |
let nextId = 0 | |
// Essential: Atom global for dealing with packages, themes, menus, and the window. | |
// | |
// An instance of this class is always available as the `atom` global. | |
class AtomEnvironment { | |
/* | |
Section: Construction and Destruction | |
*/ | |
// Call .loadOrCreate instead | |
constructor (params = {}) { | |
this.id = (params.id != null) ? params.id : nextId++ | |
this.clipboard = params.clipboard | |
this.updateProcessEnv = params.updateProcessEnv || updateProcessEnv | |
this.enablePersistence = params.enablePersistence | |
this.applicationDelegate = params.applicationDelegate | |
this.nextProxyRequestId = 0 | |
this.unloaded = false | |
this.loadTime = null | |
this.emitter = new Emitter() | |
this.disposables = new CompositeDisposable() | |
this.deserializers = new DeserializerManager(this) | |
this.deserializeTimings = {} | |
this.views = new ViewRegistry(this) | |
this.notifications = new NotificationManager() | |
this.stateStore = new StateStore('AtomEnvironments', 1) | |
this.config = new Config({ | |
notificationManager: this.notifications, | |
enablePersistence: this.enablePersistence | |
}) | |
this.config.setSchema(null, {type: 'object', properties: _.clone(ConfigSchema)}) | |
this.keymaps = new KeymapManager({notificationManager: this.notifications}) | |
this.tooltips = new TooltipManager({keymapManager: this.keymaps, viewRegistry: this.views}) | |
this.commands = new CommandRegistry() | |
this.uriHandlerRegistry = new URIHandlerRegistry() | |
this.grammars = new GrammarRegistry({config: this.config}) | |
this.styles = new StyleManager() | |
this.packages = new PackageManager({ | |
config: this.config, | |
styleManager: this.styles, | |
commandRegistry: this.commands, | |
keymapManager: this.keymaps, | |
notificationManager: this.notifications, | |
grammarRegistry: this.grammars, | |
deserializerManager: this.deserializers, | |
viewRegistry: this.views, | |
uriHandlerRegistry: this.uriHandlerRegistry | |
}) | |
this.themes = new ThemeManager({ | |
packageManager: this.packages, | |
config: this.config, | |
styleManager: this.styles, | |
notificationManager: this.notifications, | |
viewRegistry: this.views | |
}) | |
this.menu = new MenuManager({keymapManager: this.keymaps, packageManager: this.packages}) | |
this.contextMenu = new ContextMenuManager({keymapManager: this.keymaps}) | |
this.packages.setMenuManager(this.menu) | |
this.packages.setContextMenuManager(this.contextMenu) | |
this.packages.setThemeManager(this.themes) | |
this.project = new Project({ | |
notificationManager: this.notifications, | |
packageManager: this.packages, | |
grammarRegistry: this.grammars, | |
config: this.config, | |
applicationDelegate: this.applicationDelegate | |
}) | |
this.commandInstaller = new CommandInstaller(this.applicationDelegate) | |
this.protocolHandlerInstaller = new ProtocolHandlerInstaller() | |
this.textEditors = new TextEditorRegistry({ | |
config: this.config, | |
grammarRegistry: this.grammars, | |
assert: this.assert.bind(this), | |
packageManager: this.packages | |
}) | |
this.workspace = new Workspace({ | |
config: this.config, | |
project: this.project, | |
packageManager: this.packages, | |
grammarRegistry: this.grammars, | |
deserializerManager: this.deserializers, | |
notificationManager: this.notifications, | |
applicationDelegate: this.applicationDelegate, | |
viewRegistry: this.views, | |
assert: this.assert.bind(this), | |
textEditorRegistry: this.textEditors, | |
styleManager: this.styles, | |
enablePersistence: this.enablePersistence | |
}) | |
this.themes.workspace = this.workspace | |
this.autoUpdater = new AutoUpdateManager({applicationDelegate: this.applicationDelegate}) | |
if (this.keymaps.canLoadBundledKeymapsFromMemory()) { | |
this.keymaps.loadBundledKeymaps() | |
} | |
this.registerDefaultCommands() | |
this.registerDefaultOpeners() | |
this.registerDefaultDeserializers() | |
this.windowEventHandler = new WindowEventHandler({atomEnvironment: this, applicationDelegate: this.applicationDelegate}) | |
this.history = new HistoryManager({project: this.project, commands: this.commands, stateStore: this.stateStore}) | |
// Keep instances of HistoryManager in sync | |
this.disposables.add(this.history.onDidChangeProjects(event => { | |
if (!event.reloaded) this.applicationDelegate.didChangeHistoryManager() | |
})) | |
} | |
initialize (params = {}) { | |
// This will force TextEditorElement to register the custom element, so that | |
// using `document.createElement('atom-text-editor')` works if it's called | |
// before opening a buffer. | |
require("../src/text-editor-element.js") | |
this.window = params.window | |
this.document = params.document | |
this.blobStore = params.blobStore | |
this.configDirPath = params.configDirPath | |
const {devMode, safeMode, resourcePath, clearWindowState} = this.getLoadSettings() | |
if (clearWindowState) { | |
this.getStorageFolder().clear() | |
this.stateStore.clear() | |
} | |
ConfigSchema.projectHome = { | |
type: 'string', | |
default: get_path().join(fs.getHomeDirectory(), 'github'), | |
description: 'The directory where projects are assumed to be located. Packages created using the Package Generator will be stored here by default.' | |
} | |
this.config.initialize({configDirPath: this.configDirPath, resourcePath, projectHomeSchema: ConfigSchema.projectHome}) | |
this.menu.initialize({resourcePath}) | |
this.contextMenu.initialize({resourcePath, devMode}) | |
this.keymaps.configDirPath = this.configDirPath | |
this.keymaps.resourcePath = resourcePath | |
this.keymaps.devMode = devMode | |
if (!this.keymaps.canLoadBundledKeymapsFromMemory()) { | |
this.keymaps.loadBundledKeymaps() | |
} | |
this.commands.attach(this.window) | |
this.styles.initialize({configDirPath: this.configDirPath}) | |
this.packages.initialize({devMode, configDirPath: this.configDirPath, resourcePath, safeMode}) | |
this.themes.initialize({configDirPath: this.configDirPath, resourcePath, safeMode, devMode}) | |
this.commandInstaller.initialize(this.getVersion()) | |
this.protocolHandlerInstaller.initialize(this.config, this.notifications) | |
this.uriHandlerRegistry.registerHostHandler('core', CoreURIHandlers.create(this)) | |
this.autoUpdater.initialize() | |
this.config.load() | |
this.themes.loadBaseStylesheets() | |
this.initialStyleElements = this.styles.getSnapshot() | |
if (params.onlyLoadBaseStyleSheets) this.themes.initialLoadComplete = true | |
this.setBodyPlatformClass() | |
this.stylesElement = this.styles.buildStylesElement() | |
this.document.head.appendChild(this.stylesElement) | |
this.keymaps.subscribeToFileReadFailure() | |
this.installUncaughtErrorHandler() | |
this.attachSaveStateListeners() | |
this.windowEventHandler.initialize(this.window, this.document) | |
const didChangeStyles = this.didChangeStyles.bind(this) | |
this.disposables.add(this.styles.onDidAddStyleElement(didChangeStyles)) | |
this.disposables.add(this.styles.onDidUpdateStyleElement(didChangeStyles)) | |
this.disposables.add(this.styles.onDidRemoveStyleElement(didChangeStyles)) | |
this.observeAutoHideMenuBar() | |
this.disposables.add(this.applicationDelegate.onDidChangeHistoryManager(() => this.history.loadState())) | |
} | |
preloadPackages () { | |
return this.packages.preloadPackages() | |
} | |
attachSaveStateListeners () { | |
const saveState = _.debounce(() => { | |
this.window.requestIdleCallback(() => { | |
if (!this.unloaded) this.saveState({isUnloading: false}) | |
}) | |
}, this.saveStateDebounceInterval) | |
this.document.addEventListener('mousedown', saveState, true) | |
this.document.addEventListener('keydown', saveState, true) | |
this.disposables.add(new Disposable(() => { | |
this.document.removeEventListener('mousedown', saveState, true) | |
this.document.removeEventListener('keydown', saveState, true) | |
})) | |
} | |
registerDefaultDeserializers () { | |
this.deserializers.add(Workspace) | |
this.deserializers.add(PaneContainer) | |
this.deserializers.add(PaneAxis) | |
this.deserializers.add(Pane) | |
this.deserializers.add(Dock) | |
this.deserializers.add(Project) | |
this.deserializers.add(TextEditor) | |
this.deserializers.add(TextBuffer) | |
} | |
registerDefaultCommands () { | |
registerDefaultCommands({commandRegistry: this.commands, config: this.config, commandInstaller: this.commandInstaller, notificationManager: this.notifications, project: this.project, clipboard: this.clipboard}) | |
} | |
registerDefaultOpeners () { | |
this.workspace.addOpener(uri => { | |
switch (uri) { | |
case 'atom://.atom/stylesheet': | |
return this.workspace.openTextFile(this.styles.getUserStyleSheetPath()) | |
case 'atom://.atom/keymap': | |
return this.workspace.openTextFile(this.keymaps.getUserKeymapPath()) | |
case 'atom://.atom/config': | |
return this.workspace.openTextFile(this.config.getUserConfigPath()) | |
case 'atom://.atom/init-script': | |
return this.workspace.openTextFile(this.getUserInitScriptPath()) | |
} | |
}) | |
} | |
registerDefaultTargetForKeymaps () { | |
this.keymaps.defaultTarget = this.workspace.getElement() | |
} | |
observeAutoHideMenuBar () { | |
this.disposables.add(this.config.onDidChange('core.autoHideMenuBar', ({newValue}) => { | |
this.setAutoHideMenuBar(newValue) | |
})) | |
if (this.config.get('core.autoHideMenuBar')) this.setAutoHideMenuBar(true) | |
} | |
async reset () { | |
this.deserializers.clear() | |
this.registerDefaultDeserializers() | |
this.config.clear() | |
this.config.setSchema(null, {type: 'object', properties: _.clone(ConfigSchema)}) | |
this.keymaps.clear() | |
this.keymaps.loadBundledKeymaps() | |
this.commands.clear() | |
this.registerDefaultCommands() | |
this.styles.restoreSnapshot(this.initialStyleElements) | |
this.menu.clear() | |
this.clipboard.reset() | |
this.notifications.clear() | |
this.contextMenu.clear() | |
await this.packages.reset() | |
this.workspace.reset(this.packages) | |
this.registerDefaultOpeners() | |
this.project.reset(this.packages) | |
this.workspace.subscribeToEvents() | |
this.grammars.clear() | |
this.textEditors.clear() | |
this.views.clear() | |
} | |
destroy () { | |
if (!this.project) return | |
this.disposables.dispose() | |
if (this.workspace) this.workspace.destroy() | |
this.workspace = null | |
this.themes.workspace = null | |
if (this.project) this.project.destroy() | |
this.project = null | |
this.commands.clear() | |
this.stylesElement.remove() | |
this.config.unobserveUserConfig() | |
this.autoUpdater.destroy() | |
this.uriHandlerRegistry.destroy() | |
this.uninstallWindowEventHandler() | |
} | |
/* | |
Section: Event Subscription | |
*/ | |
// Extended: Invoke the given callback whenever {::beep} is called. | |
// | |
// * `callback` {Function} to be called whenever {::beep} is called. | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidBeep (callback) { | |
return this.emitter.on('did-beep', callback) | |
} | |
// Extended: Invoke the given callback when there is an unhandled error, but | |
// before the devtools pop open | |
// | |
// * `callback` {Function} to be called whenever there is an unhandled error | |
// * `event` {Object} | |
// * `originalError` {Object} the original error object | |
// * `message` {String} the original error object | |
// * `url` {String} Url to the file where the error originated. | |
// * `line` {Number} | |
// * `column` {Number} | |
// * `preventDefault` {Function} call this to avoid popping up the dev tools. | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onWillThrowError (callback) { | |
return this.emitter.on('will-throw-error', callback) | |
} | |
// Extended: Invoke the given callback whenever there is an unhandled error. | |
// | |
// * `callback` {Function} to be called whenever there is an unhandled error | |
// * `event` {Object} | |
// * `originalError` {Object} the original error object | |
// * `message` {String} the original error object | |
// * `url` {String} Url to the file where the error originated. | |
// * `line` {Number} | |
// * `column` {Number} | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidThrowError (callback) { | |
return this.emitter.on('did-throw-error', callback) | |
} | |
// TODO: Make this part of the public API. We should make onDidThrowError | |
// match the interface by only yielding an exception object to the handler | |
// and deprecating the old behavior. | |
onDidFailAssertion (callback) { | |
return this.emitter.on('did-fail-assertion', callback) | |
} | |
// Extended: Invoke the given callback as soon as the shell environment is | |
// loaded (or immediately if it was already loaded). | |
// | |
// * `callback` {Function} to be called whenever there is an unhandled error | |
whenShellEnvironmentLoaded (callback) { | |
if (this.shellEnvironmentLoaded) { | |
callback() | |
return new Disposable() | |
} else { | |
return this.emitter.once('loaded-shell-environment', callback) | |
} | |
} | |
/* | |
Section: Atom Details | |
*/ | |
// Public: Returns a {Boolean} that is `true` if the current window is in development mode. | |
inDevMode () { | |
if (this.devMode == null) this.devMode = this.getLoadSettings().devMode | |
return this.devMode | |
} | |
// Public: Returns a {Boolean} that is `true` if the current window is in safe mode. | |
inSafeMode () { | |
if (this.safeMode == null) this.safeMode = this.getLoadSettings().safeMode | |
return this.safeMode | |
} | |
// Public: Returns a {Boolean} that is `true` if the current window is running specs. | |
inSpecMode () { | |
if (this.specMode == null) this.specMode = this.getLoadSettings().isSpec | |
return this.specMode | |
} | |
// Returns a {Boolean} indicating whether this the first time the window's been | |
// loaded. | |
isFirstLoad () { | |
if (this.firstLoad == null) this.firstLoad = this.getLoadSettings().firstLoad | |
return this.firstLoad | |
} | |
// Public: Get the version of the Atom application. | |
// | |
// Returns the version text {String}. | |
getVersion () { | |
if (this.appVersion == null) this.appVersion = this.getLoadSettings().appVersion | |
return this.appVersion | |
} | |
// Public: Gets the release channel of the Atom application. | |
// | |
// Returns the release channel as a {String}. Will return one of `dev`, `beta`, or `stable`. | |
getReleaseChannel () { | |
const version = this.getVersion() | |
if (version.includes('beta')) { | |
return 'beta' | |
} else if (version.includes('dev')) { | |
return 'dev' | |
} else { | |
return 'stable' | |
} | |
} | |
// Public: Returns a {Boolean} that is `true` if the current version is an official release. | |
isReleasedVersion () { | |
return !/\w{7}/.test(this.getVersion()) // Check if the release is a 7-character SHA prefix | |
} | |
// Public: Get the time taken to completely load the current window. | |
// | |
// This time include things like loading and activating packages, creating | |
// DOM elements for the editor, and reading the config. | |
// | |
// Returns the {Number} of milliseconds taken to load the window or null | |
// if the window hasn't finished loading yet. | |
getWindowLoadTime () { | |
return this.loadTime | |
} | |
// Public: Get the load settings for the current window. | |
// | |
// Returns an {Object} containing all the load setting key/value pairs. | |
getLoadSettings () { | |
return this.applicationDelegate.getWindowLoadSettings() | |
} | |
/* | |
Section: Managing The Atom Window | |
*/ | |
// Essential: Open a new Atom window using the given options. | |
// | |
// Calling this method without an options parameter will open a prompt to pick | |
// a file/folder to open in the new window. | |
// | |
// * `params` An {Object} with the following keys: | |
// * `pathsToOpen` An {Array} of {String} paths to open. | |
// * `newWindow` A {Boolean}, true to always open a new window instead of | |
// reusing existing windows depending on the paths to open. | |
// * `devMode` A {Boolean}, true to open the window in development mode. | |
// Development mode loads the Atom source from the locally cloned | |
// repository and also loads all the packages in ~/.atom/dev/packages | |
// * `safeMode` A {Boolean}, true to open the window in safe mode. Safe | |
// mode prevents all packages installed to ~/.atom/packages from loading. | |
open (params) { | |
return this.applicationDelegate.open(params) | |
} | |
// Extended: Prompt the user to select one or more folders. | |
// | |
// * `callback` A {Function} to call once the user has confirmed the selection. | |
// * `paths` An {Array} of {String} paths that the user selected, or `null` | |
// if the user dismissed the dialog. | |
pickFolder (callback) { | |
return this.applicationDelegate.pickFolder(callback) | |
} | |
// Essential: Close the current window. | |
close () { | |
return this.applicationDelegate.closeWindow() | |
} | |
// Essential: Get the size of current window. | |
// | |
// Returns an {Object} in the format `{width: 1000, height: 700}` | |
getSize () { | |
return this.applicationDelegate.getWindowSize() | |
} | |
// Essential: Set the size of current window. | |
// | |
// * `width` The {Number} of pixels. | |
// * `height` The {Number} of pixels. | |
setSize (width, height) { | |
return this.applicationDelegate.setWindowSize(width, height) | |
} | |
// Essential: Get the position of current window. | |
// | |
// Returns an {Object} in the format `{x: 10, y: 20}` | |
getPosition () { | |
return this.applicationDelegate.getWindowPosition() | |
} | |
// Essential: Set the position of current window. | |
// | |
// * `x` The {Number} of pixels. | |
// * `y` The {Number} of pixels. | |
setPosition (x, y) { | |
return this.applicationDelegate.setWindowPosition(x, y) | |
} | |
// Extended: Get the current window | |
getCurrentWindow () { | |
return this.applicationDelegate.getCurrentWindow() | |
} | |
// Extended: Move current window to the center of the screen. | |
center () { | |
return this.applicationDelegate.centerWindow() | |
} | |
// Extended: Focus the current window. | |
focus () { | |
this.applicationDelegate.focusWindow() | |
return this.window.focus() | |
} | |
// Extended: Show the current window. | |
show () { | |
return this.applicationDelegate.showWindow() | |
} | |
// Extended: Hide the current window. | |
hide () { | |
return this.applicationDelegate.hideWindow() | |
} | |
// Extended: Reload the current window. | |
reload () { | |
return this.applicationDelegate.reloadWindow() | |
} | |
// Extended: Relaunch the entire application. | |
restartApplication () { | |
return this.applicationDelegate.restartApplication() | |
} | |
// Extended: Returns a {Boolean} that is `true` if the current window is maximized. | |
isMaximized () { | |
return this.applicationDelegate.isWindowMaximized() | |
} | |
maximize () { | |
return this.applicationDelegate.maximizeWindow() | |
} | |
// Extended: Returns a {Boolean} that is `true` if the current window is in full screen mode. | |
isFullScreen () { | |
return this.applicationDelegate.isWindowFullScreen() | |
} | |
// Extended: Set the full screen state of the current window. | |
setFullScreen (fullScreen = false) { | |
return this.applicationDelegate.setWindowFullScreen(fullScreen) | |
} | |
// Extended: Toggle the full screen state of the current window. | |
toggleFullScreen () { | |
return this.setFullScreen(!this.isFullScreen()) | |
} | |
// Restore the window to its previous dimensions and show it. | |
// | |
// Restores the full screen and maximized state after the window has resized to | |
// prevent resize glitches. | |
async displayWindow () { | |
await this.restoreWindowDimensions() | |
const steps = [ | |
this.restoreWindowBackground(), | |
this.show(), | |
this.focus() | |
] | |
if (this.windowDimensions && this.windowDimensions.fullScreen) { | |
steps.push(this.setFullScreen(true)) | |
} | |
if (this.windowDimensions && this.windowDimensions.maximized && get_process().platform !== 'darwin') { | |
steps.push(this.maximize()) | |
} | |
await Promise.all(steps) | |
} | |
// Get the dimensions of this window. | |
// | |
// Returns an {Object} with the following keys: | |
// * `x` The window's x-position {Number}. | |
// * `y` The window's y-position {Number}. | |
// * `width` The window's width {Number}. | |
// * `height` The window's height {Number}. | |
getWindowDimensions () { | |
const browserWindow = this.getCurrentWindow() | |
const [x, y] = browserWindow.getPosition() | |
const [width, height] = browserWindow.getSize() | |
const maximized = browserWindow.isMaximized() | |
return {x, y, width, height, maximized} | |
} | |
// Set the dimensions of the window. | |
// | |
// The window will be centered if either the x or y coordinate is not set | |
// in the dimensions parameter. If x or y are omitted the window will be | |
// centered. If height or width are omitted only the position will be changed. | |
// | |
// * `dimensions` An {Object} with the following keys: | |
// * `x` The new x coordinate. | |
// * `y` The new y coordinate. | |
// * `width` The new width. | |
// * `height` The new height. | |
setWindowDimensions ({x, y, width, height}) { | |
const steps = [] | |
if (width != null && height != null) { | |
steps.push(this.setSize(width, height)) | |
} | |
if (x != null && y != null) { | |
steps.push(this.setPosition(x, y)) | |
} else { | |
steps.push(this.center()) | |
} | |
return Promise.all(steps) | |
} | |
// Returns true if the dimensions are useable, false if they should be ignored. | |
// Work around for https://github.com/atom/atom-shell/issues/473 | |
isValidDimensions ({x, y, width, height} = {}) { | |
return (width > 0) && (height > 0) && ((x + width) > 0) && ((y + height) > 0) | |
} | |
storeWindowDimensions () { | |
this.windowDimensions = this.getWindowDimensions() | |
if (this.isValidDimensions(this.windowDimensions)) { | |
localStorage.setItem('defaultWindowDimensions', JSON.stringify(this.windowDimensions)) | |
} | |
} | |
getDefaultWindowDimensions () { | |
const {windowDimensions} = this.getLoadSettings() | |
if (windowDimensions) return windowDimensions | |
let dimensions | |
try { | |
dimensions = JSON.parse(localStorage.getItem('defaultWindowDimensions')) | |
} catch (error) { | |
get_console().warn('Error parsing default window dimensions', error) | |
localStorage.removeItem('defaultWindowDimensions') | |
} | |
if (dimensions && this.isValidDimensions(dimensions)) { | |
return dimensions | |
} else { | |
const {width, height} = this.applicationDelegate.getPrimaryDisplayWorkAreaSize() | |
return {x: 0, y: 0, width: Math.min(1024, width), height} | |
} | |
} | |
async restoreWindowDimensions () { | |
if (!this.windowDimensions || !this.isValidDimensions(this.windowDimensions)) { | |
this.windowDimensions = this.getDefaultWindowDimensions() | |
} | |
await this.setWindowDimensions(this.windowDimensions) | |
return this.windowDimensions | |
} | |
restoreWindowBackground () { | |
const backgroundColor = get_window().localStorage.getItem('atom:window-background-color') | |
if (backgroundColor) { | |
this.backgroundStylesheet = get_document().createElement('style') | |
this.backgroundStylesheet.type = 'text/css' | |
this.backgroundStylesheet.innerText = `html, body { background: ${backgroundColor} !important; }` | |
get_document().head.appendChild(this.backgroundStylesheet) | |
} | |
} | |
storeWindowBackground () { | |
if (this.inSpecMode()) return | |
const backgroundColor = this.window.getComputedStyle(this.workspace.getElement())['background-color'] | |
this.window.localStorage.setItem('atom:window-background-color', backgroundColor) | |
} | |
// Call this method when establishing a real application window. | |
startEditorWindow () { | |
this.unloaded = false | |
const updateProcessEnvPromise = this.updateProcessEnvAndTriggerHooks() | |
const loadStatePromise = this.loadState().then(async state => { | |
this.windowDimensions = state && state.windowDimensions | |
await this.displayWindow() | |
this.commandInstaller.installAtomCommand(false, (error) => { | |
if (error) get_console().warn(error.message) | |
}) | |
this.commandInstaller.installApmCommand(false, (error) => { | |
if (error) get_console().warn(error.message) | |
}) | |
this.disposables.add(this.applicationDelegate.onDidOpenLocations(this.openLocations.bind(this))) | |
this.disposables.add(this.applicationDelegate.onApplicationMenuCommand(this.dispatchApplicationMenuCommand.bind(this))) | |
this.disposables.add(this.applicationDelegate.onContextMenuCommand(this.dispatchContextMenuCommand.bind(this))) | |
this.disposables.add(this.applicationDelegate.onURIMessage(this.dispatchURIMessage.bind(this))) | |
this.disposables.add(this.applicationDelegate.onDidRequestUnload(async () => { | |
try { | |
await this.saveState({isUnloading: true}) | |
} catch (error) { | |
get_console().error(error) | |
} | |
const closing = !this.workspace || await this.workspace.confirmClose({ | |
windowCloseRequested: true, | |
projectHasPaths: this.project.getPaths().length > 0 | |
}) | |
if (closing) await this.packages.deactivatePackages() | |
return closing | |
})) | |
this.listenForUpdates() | |
this.registerDefaultTargetForKeymaps() | |
this.packages.loadPackages() | |
const startTime = Date.now() | |
await this.deserialize(state) | |
this.deserializeTimings.atom = Date.now() - startTime | |
if (get_process().platform === 'darwin' && this.config.get('core.titleBar') === 'custom') { | |
this.workspace.addHeaderPanel({item: new TitleBar({workspace: this.workspace, themes: this.themes, applicationDelegate: this.applicationDelegate})}) | |
this.document.body.classList.add('custom-title-bar') | |
} | |
if (get_process().platform === 'darwin' && this.config.get('core.titleBar') === 'custom-inset') { | |
this.workspace.addHeaderPanel({item: new TitleBar({workspace: this.workspace, themes: this.themes, applicationDelegate: this.applicationDelegate})}) | |
this.document.body.classList.add('custom-inset-title-bar') | |
} | |
if (get_process().platform === 'darwin' && this.config.get('core.titleBar') === 'hidden') { | |
this.document.body.classList.add('hidden-title-bar') | |
} | |
this.document.body.appendChild(this.workspace.getElement()) | |
if (this.backgroundStylesheet) this.backgroundStylesheet.remove() | |
this.watchProjectPaths() | |
this.packages.activate() | |
this.keymaps.loadUserKeymap() | |
if (!this.getLoadSettings().safeMode) this.requireUserInitScript() | |
this.menu.update() | |
await this.openInitialEmptyEditorIfNecessary() | |
}) | |
const loadHistoryPromise = this.history.loadState().then(() => { | |
this.reopenProjectMenuManager = new ReopenProjectMenuManager({ | |
menu: this.menu, | |
commands: this.commands, | |
history: this.history, | |
config: this.config, | |
open: paths => this.open({pathsToOpen: paths}) | |
}) | |
this.reopenProjectMenuManager.update() | |
}) | |
return Promise.all([loadStatePromise, loadHistoryPromise, updateProcessEnvPromise]) | |
} | |
serialize (options) { | |
return { | |
version: this.constructor.version, | |
project: this.project.serialize(options), | |
workspace: this.workspace.serialize(), | |
packageStates: this.packages.serialize(), | |
grammars: this.grammars.serialize(), | |
fullScreen: this.isFullScreen(), | |
windowDimensions: this.windowDimensions | |
} | |
} | |
unloadEditorWindow () { | |
if (!this.project) return | |
this.storeWindowBackground() | |
this.saveBlobStoreSync() | |
this.unloaded = true | |
} | |
saveBlobStoreSync () { | |
if (this.enablePersistence) { | |
this.blobStore.save() | |
} | |
} | |
openInitialEmptyEditorIfNecessary () { | |
if (!this.config.get('core.openEmptyEditorOnStart')) return | |
const {initialPaths} = this.getLoadSettings() | |
if (initialPaths && initialPaths.length === 0 && this.workspace.getPaneItems().length === 0) { | |
return this.workspace.open(null) | |
} | |
} | |
installUncaughtErrorHandler () { | |
this.previousWindowErrorHandler = this.window.onerror | |
this.window.onerror = (message, url, line, column, originalError) => { | |
const mapping = mapSourcePosition({source: url, line, column}) | |
line = mapping.line | |
column = mapping.column | |
if (url === '<embedded>') url = mapping.source | |
const eventObject = {message, url, line, column, originalError} | |
let openDevTools = true | |
eventObject.preventDefault = () => { openDevTools = false } | |
this.emitter.emit('will-throw-error', eventObject) | |
if (openDevTools) { | |
this.openDevTools().then(() => | |
this.executeJavaScriptInDevTools('DevToolsAPI.showPanel("console")') | |
) | |
} | |
this.emitter.emit('did-throw-error', {message, url, line, column, originalError}) | |
} | |
} | |
uninstallUncaughtErrorHandler () { | |
this.window.onerror = this.previousWindowErrorHandler | |
} | |
installWindowEventHandler () { | |
this.windowEventHandler = new WindowEventHandler({atomEnvironment: this, applicationDelegate: this.applicationDelegate}) | |
this.windowEventHandler.initialize(this.window, this.document) | |
} | |
uninstallWindowEventHandler () { | |
if (this.windowEventHandler) { | |
this.windowEventHandler.unsubscribe() | |
} | |
this.windowEventHandler = null | |
} | |
didChangeStyles (styleElement) { | |
TextEditor.didUpdateStyles() | |
if (styleElement.textContent.indexOf('scrollbar') >= 0) { | |
TextEditor.didUpdateScrollbarStyles() | |
} | |
} | |
async updateProcessEnvAndTriggerHooks () { | |
await this.updateProcessEnv(this.getLoadSettings().env) | |
this.shellEnvironmentLoaded = true | |
this.emitter.emit('loaded-shell-environment') | |
this.packages.triggerActivationHook('core:loaded-shell-environment') | |
} | |
/* | |
Section: Messaging the User | |
*/ | |
// Essential: Visually and audibly trigger a beep. | |
beep () { | |
if (this.config.get('core.audioBeep')) this.applicationDelegate.playBeepSound() | |
this.emitter.emit('did-beep') | |
} | |
// Essential: A flexible way to open a dialog akin to an alert dialog. | |
// | |
// If the dialog is closed (via `Esc` key or `X` in the top corner) without selecting a button | |
// the first button will be clicked unless a "Cancel" or "No" button is provided. | |
// | |
// ## Examples | |
// | |
// ```coffee | |
// atom.confirm | |
// message: 'How you feeling?' | |
// detailedMessage: 'Be honest.' | |
// buttons: | |
// Good: -> window.alert('good to hear') | |
// Bad: -> window.alert('bummer') | |
// ``` | |
// | |
// * `options` An {Object} with the following keys: | |
// * `message` The {String} message to display. | |
// * `detailedMessage` (optional) The {String} detailed message to display. | |
// * `buttons` (optional) Either an array of strings or an object where keys are | |
// button names and the values are callbacks to invoke when clicked. | |
// | |
// Returns the chosen button index {Number} if the buttons option is an array or the return value of the callback if the buttons option is an object. | |
confirm (params = {}) { | |
return this.applicationDelegate.confirm(params) | |
} | |
/* | |
Section: Managing the Dev Tools | |
*/ | |
// Extended: Open the dev tools for the current window. | |
// | |
// Returns a {Promise} that resolves when the DevTools have been opened. | |
openDevTools () { | |
return this.applicationDelegate.openWindowDevTools() | |
} | |
// Extended: Toggle the visibility of the dev tools for the current window. | |
// | |
// Returns a {Promise} that resolves when the DevTools have been opened or | |
// closed. | |
toggleDevTools () { | |
return this.applicationDelegate.toggleWindowDevTools() | |
} | |
// Extended: Execute code in dev tools. | |
executeJavaScriptInDevTools (code) { | |
return this.applicationDelegate.executeJavaScriptInWindowDevTools(code) | |
} | |
/* | |
Section: Private | |
*/ | |
assert (condition, message, callbackOrMetadata) { | |
if (condition) return true | |
const error = new Error(`Assertion failed: ${message}`) | |
Error.captureStackTrace(error, this.assert) | |
if (callbackOrMetadata) { | |
if (typeof callbackOrMetadata === 'function') { | |
callbackOrMetadata(error) | |
} else { | |
error.metadata = callbackOrMetadata | |
} | |
} | |
this.emitter.emit('did-fail-assertion', error) | |
if (!this.isReleasedVersion()) throw error | |
return false | |
} | |
loadThemes () { | |
return this.themes.load() | |
} | |
// Notify the browser project of the window's current project path | |
watchProjectPaths () { | |
this.disposables.add(this.project.onDidChangePaths(() => { | |
this.applicationDelegate.setRepresentedDirectoryPaths(this.project.getPaths()) | |
})) | |
} | |
setDocumentEdited (edited) { | |
if (typeof this.applicationDelegate.setWindowDocumentEdited === 'function') { | |
this.applicationDelegate.setWindowDocumentEdited(edited) | |
} | |
} | |
setRepresentedFilename (filename) { | |
if (typeof this.applicationDelegate.setWindowRepresentedFilename === 'function') { | |
this.applicationDelegate.setWindowRepresentedFilename(filename) | |
} | |
} | |
addProjectFolder () { | |
this.pickFolder((selectedPaths = []) => { | |
this.addToProject(selectedPaths) | |
}) | |
} | |
async addToProject (projectPaths) { | |
const state = await this.loadState(this.getStateKey(projectPaths)) | |
if (state && (this.project.getPaths().length === 0)) { | |
this.attemptRestoreProjectStateForPaths(state, projectPaths) | |
} else { | |
projectPaths.map((folder) => this.project.addPath(folder)) | |
} | |
} | |
attemptRestoreProjectStateForPaths (state, projectPaths, filesToOpen = []) { | |
const center = this.workspace.getCenter() | |
const windowIsUnused = () => { | |
for (let container of this.workspace.getPaneContainers()) { | |
for (let item of container.getPaneItems()) { | |
if (item instanceof TextEditor) { | |
if (item.getPath() || item.isModified()) return false | |
} else { | |
if (container === center) return false | |
} | |
} | |
} | |
return true | |
} | |
if (windowIsUnused()) { | |
this.restoreStateIntoThisEnvironment(state) | |
return Promise.all(filesToOpen.map(file => this.workspace.open(file))) | |
} else { | |
const nouns = projectPaths.length === 1 ? 'folder' : 'folders' | |
const choice = this.confirm({ | |
message: 'Previous automatically-saved project state detected', | |
detailedMessage: `There is previously saved state for the selected ${nouns}. ` + | |
`Would you like to add the ${nouns} to this window, permanently discarding the saved state, ` + | |
`or open the ${nouns} in a new window, restoring the saved state?`, | |
buttons: [ | |
'&Open in new window and recover state', | |
'&Add to this window and discard state' | |
]}) | |
if (choice === 0) { | |
this.open({ | |
pathsToOpen: projectPaths.concat(filesToOpen), | |
newWindow: true, | |
devMode: this.inDevMode(), | |
safeMode: this.inSafeMode() | |
}) | |
return Promise.resolve(null) | |
} else if (choice === 1) { | |
for (let selectedPath of projectPaths) { | |
this.project.addPath(selectedPath) | |
} | |
return Promise.all(filesToOpen.map(file => this.workspace.open(file))) | |
} | |
} | |
} | |
restoreStateIntoThisEnvironment (state) { | |
state.fullScreen = this.isFullScreen() | |
for (let pane of this.workspace.getPanes()) { | |
pane.destroy() | |
} | |
return this.deserialize(state) | |
} | |
showSaveDialog (callback) { | |
callback(this.showSaveDialogSync()) | |
} | |
showSaveDialogSync (options = {}) { | |
this.applicationDelegate.showSaveDialog(options) | |
} | |
async saveState (options, storageKey) { | |
if (this.enablePersistence && this.project) { | |
const state = this.serialize(options) | |
if (!storageKey) storageKey = this.getStateKey(this.project && this.project.getPaths()) | |
if (storageKey) { | |
await this.stateStore.save(storageKey, state) | |
} else { | |
await this.applicationDelegate.setTemporaryWindowState(state) | |
} | |
} | |
} | |
loadState (stateKey) { | |
if (this.enablePersistence) { | |
if (!stateKey) stateKey = this.getStateKey(this.getLoadSettings().initialPaths) | |
if (stateKey) { | |
return this.stateStore.load(stateKey) | |
} else { | |
return this.applicationDelegate.getTemporaryWindowState() | |
} | |
} else { | |
return Promise.resolve(null) | |
} | |
} | |
async deserialize (state) { | |
if (!state) return Promise.resolve() | |
this.setFullScreen(state.fullScreen) | |
const missingProjectPaths = [] | |
this.packages.packageStates = state.packageStates || {} | |
let startTime = Date.now() | |
if (state.project) { | |
try { | |
await this.project.deserialize(state.project, this.deserializers) | |
} catch (error) { | |
if (error.missingProjectPaths) { | |
missingProjectPaths.push(...error.missingProjectPaths) | |
} else { | |
this.notifications.addError('Unable to deserialize project', { | |
description: error.message, | |
stack: error.stack | |
}) | |
} | |
} | |
} | |
this.deserializeTimings.project = Date.now() - startTime | |
if (state.grammars) this.grammars.deserialize(state.grammars) | |
startTime = Date.now() | |
if (state.workspace) this.workspace.deserialize(state.workspace, this.deserializers) | |
this.deserializeTimings.workspace = Date.now() - startTime | |
if (missingProjectPaths.length > 0) { | |
const count = missingProjectPaths.length === 1 ? '' : missingProjectPaths.length + ' ' | |
const noun = missingProjectPaths.length === 1 ? 'directory' : 'directories' | |
const toBe = missingProjectPaths.length === 1 ? 'is' : 'are' | |
const escaped = missingProjectPaths.map(projectPath => `\`${projectPath}\``) | |
let group | |
switch (escaped.length) { | |
case 1: | |
group = escaped[0] | |
break | |
case 2: | |
group = `${escaped[0]} and ${escaped[1]}` | |
break | |
default: | |
group = escaped.slice(0, -1).join(', ') + `, and ${escaped[escaped.length - 1]}` | |
} | |
this.notifications.addError(`Unable to open ${count}project ${noun}`, { | |
description: `Project ${noun} ${group} ${toBe} no longer on disk.` | |
}) | |
} | |
} | |
getStateKey (paths) { | |
if (paths && paths.length > 0) { | |
const sha1 = get_crypto().createHash('sha1').update(paths.slice().sort().join('\n')).digest('hex') | |
return `editor-${sha1}` | |
} else { | |
return null | |
} | |
} | |
getStorageFolder () { | |
if (!this.storageFolder) this.storageFolder = new StorageFolder(this.getConfigDirPath()) | |
return this.storageFolder | |
} | |
getConfigDirPath () { | |
if (!this.configDirPath) this.configDirPath = get_process().env.ATOM_HOME | |
return this.configDirPath | |
} | |
getUserInitScriptPath () { | |
const initScriptPath = fs.resolve(this.getConfigDirPath(), 'init', ['js', 'coffee']) | |
return initScriptPath || get_path().join(this.getConfigDirPath(), 'init.coffee'); | |
} | |
requireUserInitScript () { | |
const userInitScriptPath = this.getUserInitScriptPath() | |
if (userInitScriptPath) { | |
try { | |
if (fs.isFileSync(userInitScriptPath)) require(userInitScriptPath) | |
} catch (error) { | |
this.notifications.addError(`Failed to load \`${userInitScriptPath}\``, { | |
detail: error.message, | |
dismissable: true | |
}) | |
} | |
} | |
} | |
// TODO: We should deprecate the update events here, and use `atom.autoUpdater` instead | |
onUpdateAvailable (callback) { | |
return this.emitter.on('update-available', callback) | |
} | |
updateAvailable (details) { | |
return this.emitter.emit('update-available', details) | |
} | |
listenForUpdates () { | |
// listen for updates available locally (that have been successfully downloaded) | |
this.disposables.add(this.autoUpdater.onDidCompleteDownloadingUpdate(this.updateAvailable.bind(this))) | |
} | |
setBodyPlatformClass () { | |
this.document.body.classList.add(`platform-${get_process().platform}`) | |
} | |
setAutoHideMenuBar (autoHide) { | |
this.applicationDelegate.setAutoHideWindowMenuBar(autoHide) | |
this.applicationDelegate.setWindowMenuBarVisibility(!autoHide) | |
} | |
dispatchApplicationMenuCommand (command, arg) { | |
let {activeElement} = this.document | |
// Use the workspace element if body has focus | |
if (activeElement === this.document.body) { | |
activeElement = this.workspace.getElement() | |
} | |
this.commands.dispatch(activeElement, command, arg) | |
} | |
dispatchContextMenuCommand (command, ...args) { | |
this.commands.dispatch(this.contextMenu.activeElement, command, args) | |
} | |
dispatchURIMessage (uri) { | |
if (this.packages.hasLoadedInitialPackages()) { | |
this.uriHandlerRegistry.handleURI(uri) | |
} else { | |
let subscription = this.packages.onDidLoadInitialPackages(() => { | |
subscription.dispose() | |
this.uriHandlerRegistry.handleURI(uri) | |
}) | |
} | |
} | |
async openLocations (locations) { | |
const needsProjectPaths = this.project && this.project.getPaths().length === 0 | |
const foldersToAddToProject = [] | |
const fileLocationsToOpen = [] | |
function pushFolderToOpen (folder) { | |
if (!foldersToAddToProject.includes(folder)) { | |
foldersToAddToProject.push(folder) | |
} | |
} | |
for (var {pathToOpen, initialLine, initialColumn, forceAddToWindow} of locations) { | |
if (pathToOpen && (needsProjectPaths || forceAddToWindow)) { | |
if (fs.existsSync(pathToOpen)) { | |
pushFolderToOpen(this.project.getDirectoryForProjectPath(pathToOpen).getPath()) | |
} else if (fs.existsSync(get_path().dirname(pathToOpen))) { | |
pushFolderToOpen(this.project.getDirectoryForProjectPath(get_path().dirname(pathToOpen)).getPath()) | |
} else { | |
pushFolderToOpen(this.project.getDirectoryForProjectPath(pathToOpen).getPath()) | |
} | |
} | |
if (!fs.isDirectorySync(pathToOpen)) { | |
fileLocationsToOpen.push({pathToOpen, initialLine, initialColumn}) | |
} | |
} | |
let restoredState = false | |
if (foldersToAddToProject.length > 0) { | |
const state = await this.loadState(this.getStateKey(foldersToAddToProject)) | |
// only restore state if this is the first path added to the project | |
if (state && needsProjectPaths) { | |
const files = fileLocationsToOpen.map((location) => location.pathToOpen) | |
await this.attemptRestoreProjectStateForPaths(state, foldersToAddToProject, files) | |
restoredState = true | |
} else { | |
for (let folder of foldersToAddToProject) { | |
this.project.addPath(folder) | |
} | |
} | |
} | |
if (!restoredState) { | |
const fileOpenPromises = [] | |
for ({pathToOpen, initialLine, initialColumn} of fileLocationsToOpen) { | |
fileOpenPromises.push(this.workspace && this.workspace.open(pathToOpen, {initialLine, initialColumn})) | |
} | |
await Promise.all(fileOpenPromises) | |
} | |
get_ipcRenderer().send('window-command', 'window:locations-opened') | |
} | |
resolveProxy (url) { | |
return new Promise((resolve, reject) => { | |
const requestId = this.nextProxyRequestId++ | |
const disposable = this.applicationDelegate.onDidResolveProxy((id, proxy) => { | |
if (id === requestId) { | |
disposable.dispose() | |
resolve(proxy) | |
} | |
}) | |
return this.applicationDelegate.resolveProxy(requestId, url) | |
}) | |
} | |
} | |
AtomEnvironment.version = 1 | |
AtomEnvironment.prototype.saveStateDebounceInterval = 1000 | |
module.exports = AtomEnvironment | |
/* eslint-disable */ | |
// Preserve this deprecation until 2.0. Sorry. Should have removed Q sooner. | |
Promise.prototype.done = function (callback) { | |
deprecate('Atom now uses ES6 Promises instead of Q. Call promise.then instead of promise.done') | |
return this.then(callback) | |
} | |
/* eslint-enable */ | |
}, | |
"../src/application-delegate.js": function (exports, module, __filename, __dirname, require, define) { | |
(function() { | |
var ApplicationDelegate, Disposable, getWindowLoadSettings, ipcHelpers, ipcRenderer, ref, remote, shell, | |
slice = [].slice; | |
function get_ref() { | |
return ref = ref || require('electron'); | |
} | |
function get_ipcRenderer() { | |
return ipcRenderer = ipcRenderer || get_ref().ipcRenderer; | |
} | |
function get_remote() { | |
return remote = remote || get_ref().remote; | |
} | |
function get_shell() { | |
return shell = shell || get_ref().shell; | |
} | |
ipcHelpers = require("../src/ipc-helpers.js"); | |
Disposable = require("../node_modules/event-kit/lib/event-kit.js").Disposable; | |
getWindowLoadSettings = require("../src/get-window-load-settings.js"); | |
module.exports = ApplicationDelegate = (function() { | |
function ApplicationDelegate() {} | |
ApplicationDelegate.prototype.getWindowLoadSettings = function() { | |
return getWindowLoadSettings(); | |
}; | |
ApplicationDelegate.prototype.open = function(params) { | |
return get_ipcRenderer().send('open', params); | |
}; | |
ApplicationDelegate.prototype.pickFolder = function(callback) { | |
var responseChannel; | |
responseChannel = "atom-pick-folder-response"; | |
get_ipcRenderer().on(responseChannel, function(event, path) { | |
get_ipcRenderer().removeAllListeners(responseChannel); | |
return callback(path); | |
}); | |
return get_ipcRenderer().send("pick-folder", responseChannel); | |
}; | |
ApplicationDelegate.prototype.getCurrentWindow = function() { | |
return get_remote().getCurrentWindow(); | |
}; | |
ApplicationDelegate.prototype.closeWindow = function() { | |
return ipcHelpers.call('window-method', 'close'); | |
}; | |
ApplicationDelegate.prototype.getTemporaryWindowState = function() { | |
return ipcHelpers.call('get-temporary-window-state').then(function(stateJSON) { | |
return JSON.parse(stateJSON); | |
}); | |
}; | |
ApplicationDelegate.prototype.setTemporaryWindowState = function(state) { | |
return ipcHelpers.call('set-temporary-window-state', JSON.stringify(state)); | |
}; | |
ApplicationDelegate.prototype.getWindowSize = function() { | |
var height, ref1, width; | |
ref1 = get_remote().getCurrentWindow().getSize(), width = ref1[0], height = ref1[1]; | |
return { | |
width: width, | |
height: height | |
}; | |
}; | |
ApplicationDelegate.prototype.setWindowSize = function(width, height) { | |
return ipcHelpers.call('set-window-size', width, height); | |
}; | |
ApplicationDelegate.prototype.getWindowPosition = function() { | |
var ref1, x, y; | |
ref1 = get_remote().getCurrentWindow().getPosition(), x = ref1[0], y = ref1[1]; | |
return { | |
x: x, | |
y: y | |
}; | |
}; | |
ApplicationDelegate.prototype.setWindowPosition = function(x, y) { | |
return ipcHelpers.call('set-window-position', x, y); | |
}; | |
ApplicationDelegate.prototype.centerWindow = function() { | |
return ipcHelpers.call('center-window'); | |
}; | |
ApplicationDelegate.prototype.focusWindow = function() { | |
return ipcHelpers.call('focus-window'); | |
}; | |
ApplicationDelegate.prototype.showWindow = function() { | |
return ipcHelpers.call('show-window'); | |
}; | |
ApplicationDelegate.prototype.hideWindow = function() { | |
return ipcHelpers.call('hide-window'); | |
}; | |
ApplicationDelegate.prototype.reloadWindow = function() { | |
return ipcHelpers.call('window-method', 'reload'); | |
}; | |
ApplicationDelegate.prototype.restartApplication = function() { | |
return get_ipcRenderer().send("restart-application"); | |
}; | |
ApplicationDelegate.prototype.minimizeWindow = function() { | |
return ipcHelpers.call('window-method', 'minimize'); | |
}; | |
ApplicationDelegate.prototype.isWindowMaximized = function() { | |
return get_remote().getCurrentWindow().isMaximized(); | |
}; | |
ApplicationDelegate.prototype.maximizeWindow = function() { | |
return ipcHelpers.call('window-method', 'maximize'); | |
}; | |
ApplicationDelegate.prototype.unmaximizeWindow = function() { | |
return ipcHelpers.call('window-method', 'unmaximize'); | |
}; | |
ApplicationDelegate.prototype.isWindowFullScreen = function() { | |
return get_remote().getCurrentWindow().isFullScreen(); | |
}; | |
ApplicationDelegate.prototype.setWindowFullScreen = function(fullScreen) { | |
if (fullScreen == null) { | |
fullScreen = false; | |
} | |
return ipcHelpers.call('window-method', 'setFullScreen', fullScreen); | |
}; | |
ApplicationDelegate.prototype.onDidEnterFullScreen = function(callback) { | |
return ipcHelpers.on(get_ipcRenderer(), 'did-enter-full-screen', callback); | |
}; | |
ApplicationDelegate.prototype.onDidLeaveFullScreen = function(callback) { | |
return ipcHelpers.on(get_ipcRenderer(), 'did-leave-full-screen', callback); | |
}; | |
ApplicationDelegate.prototype.openWindowDevTools = function() { | |
return new Promise(get_process().nextTick).then(function() { | |
return ipcHelpers.call('window-method', 'openDevTools'); | |
}); | |
}; | |
ApplicationDelegate.prototype.closeWindowDevTools = function() { | |
return new Promise(get_process().nextTick).then(function() { | |
return ipcHelpers.call('window-method', 'closeDevTools'); | |
}); | |
}; | |
ApplicationDelegate.prototype.toggleWindowDevTools = function() { | |
return new Promise(get_process().nextTick).then(function() { | |
return ipcHelpers.call('window-method', 'toggleDevTools'); | |
}); | |
}; | |
ApplicationDelegate.prototype.executeJavaScriptInWindowDevTools = function(code) { | |
return get_ipcRenderer().send("execute-javascript-in-dev-tools", code); | |
}; | |
ApplicationDelegate.prototype.setWindowDocumentEdited = function(edited) { | |
return ipcHelpers.call('window-method', 'setDocumentEdited', edited); | |
}; | |
ApplicationDelegate.prototype.setRepresentedFilename = function(filename) { | |
return ipcHelpers.call('window-method', 'setRepresentedFilename', filename); | |
}; | |
ApplicationDelegate.prototype.addRecentDocument = function(filename) { | |
return get_ipcRenderer().send("add-recent-document", filename); | |
}; | |
ApplicationDelegate.prototype.setRepresentedDirectoryPaths = function(paths) { | |
return ipcHelpers.call('window-method', 'setRepresentedDirectoryPaths', paths); | |
}; | |
ApplicationDelegate.prototype.setAutoHideWindowMenuBar = function(autoHide) { | |
return ipcHelpers.call('window-method', 'setAutoHideMenuBar', autoHide); | |
}; | |
ApplicationDelegate.prototype.setWindowMenuBarVisibility = function(visible) { | |
return get_remote().getCurrentWindow().setMenuBarVisibility(visible); | |
}; | |
ApplicationDelegate.prototype.getPrimaryDisplayWorkAreaSize = function() { | |
return get_remote().screen.getPrimaryDisplay().workAreaSize; | |
}; | |
ApplicationDelegate.prototype.getUserDefault = function(key, type) { | |
return get_remote().systemPreferences.getUserDefault(key, type); | |
}; | |
ApplicationDelegate.prototype.confirm = function(arg) { | |
var buttonLabels, buttons, callback, chosen, detailedMessage, message; | |
message = arg.message, detailedMessage = arg.detailedMessage, buttons = arg.buttons; | |
if (buttons == null) { | |
buttons = {}; | |
} | |
if (Array.isArray(buttons)) { | |
buttonLabels = buttons; | |
} else { | |
buttonLabels = Object.keys(buttons); | |
} | |
chosen = get_remote().dialog.showMessageBox(get_remote().getCurrentWindow(), { | |
type: 'info', | |
message: message, | |
detail: detailedMessage, | |
buttons: buttonLabels, | |
normalizeAccessKeys: true | |
}); | |
if (Array.isArray(buttons)) { | |
return chosen; | |
} else { | |
callback = buttons[buttonLabels[chosen]]; | |
return typeof callback === "function" ? callback() : void 0; | |
} | |
}; | |
ApplicationDelegate.prototype.showMessageDialog = function(params) {}; | |
ApplicationDelegate.prototype.showSaveDialog = function(params) { | |
if (typeof params === 'string') { | |
params = { | |
defaultPath: params | |
}; | |
} | |
return this.getCurrentWindow().showSaveDialog(params); | |
}; | |
ApplicationDelegate.prototype.playBeepSound = function() { | |
return get_shell().beep(); | |
}; | |
ApplicationDelegate.prototype.onDidOpenLocations = function(callback) { | |
var outerCallback; | |
outerCallback = function(event, message, detail) { | |
if (message === 'open-locations') { | |
return callback(detail); | |
} | |
}; | |
get_ipcRenderer().on('message', outerCallback); | |
return new Disposable(function() { | |
return get_ipcRenderer().removeListener('message', outerCallback); | |
}); | |
}; | |
ApplicationDelegate.prototype.onUpdateAvailable = function(callback) { | |
var outerCallback; | |
outerCallback = function(event, message, detail) { | |
if (message === 'did-begin-downloading-update') { | |
return callback(detail); | |
} | |
}; | |
get_ipcRenderer().on('message', outerCallback); | |
return new Disposable(function() { | |
return get_ipcRenderer().removeListener('message', outerCallback); | |
}); | |
}; | |
ApplicationDelegate.prototype.onDidBeginDownloadingUpdate = function(callback) { | |
return this.onUpdateAvailable(callback); | |
}; | |
ApplicationDelegate.prototype.onDidBeginCheckingForUpdate = function(callback) { | |
var outerCallback; | |
outerCallback = function(event, message, detail) { | |
if (message === 'checking-for-update') { | |
return callback(detail); | |
} | |
}; | |
get_ipcRenderer().on('message', outerCallback); | |
return new Disposable(function() { | |
return get_ipcRenderer().removeListener('message', outerCallback); | |
}); | |
}; | |
ApplicationDelegate.prototype.onDidCompleteDownloadingUpdate = function(callback) { | |
var outerCallback; | |
outerCallback = function(event, message, detail) { | |
if (message === 'update-available') { | |
return callback(detail); | |
} | |
}; | |
get_ipcRenderer().on('message', outerCallback); | |
return new Disposable(function() { | |
return get_ipcRenderer().removeListener('message', outerCallback); | |
}); | |
}; | |
ApplicationDelegate.prototype.onUpdateNotAvailable = function(callback) { | |
var outerCallback; | |
outerCallback = function(event, message, detail) { | |
if (message === 'update-not-available') { | |
return callback(detail); | |
} | |
}; | |
get_ipcRenderer().on('message', outerCallback); | |
return new Disposable(function() { | |
return get_ipcRenderer().removeListener('message', outerCallback); | |
}); | |
}; | |
ApplicationDelegate.prototype.onUpdateError = function(callback) { | |
var outerCallback; | |
outerCallback = function(event, message, detail) { | |
if (message === 'update-error') { | |
return callback(detail); | |
} | |
}; | |
get_ipcRenderer().on('message', outerCallback); | |
return new Disposable(function() { | |
return get_ipcRenderer().removeListener('message', outerCallback); | |
}); | |
}; | |
ApplicationDelegate.prototype.onApplicationMenuCommand = function(callback) { | |
var outerCallback; | |
outerCallback = function() { | |
var args, event; | |
event = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : []; | |
return callback.apply(null, args); | |
}; | |
get_ipcRenderer().on('command', outerCallback); | |
return new Disposable(function() { | |
return get_ipcRenderer().removeListener('command', outerCallback); | |
}); | |
}; | |
ApplicationDelegate.prototype.onContextMenuCommand = function(callback) { | |
var outerCallback; | |
outerCallback = function() { | |
var args, event; | |
event = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : []; | |
return callback.apply(null, args); | |
}; | |
get_ipcRenderer().on('context-command', outerCallback); | |
return new Disposable(function() { | |
return get_ipcRenderer().removeListener('context-command', outerCallback); | |
}); | |
}; | |
ApplicationDelegate.prototype.onURIMessage = function(callback) { | |
var outerCallback; | |
outerCallback = function() { | |
var args, event; | |
event = arguments[0], args = 2 <= arguments.length ? slice.call(arguments, 1) : []; | |
return callback.apply(null, args); | |
}; | |
get_ipcRenderer().on('uri-message', outerCallback); | |
return new Disposable(function() { | |
return get_ipcRenderer().removeListener('uri-message', outerCallback); | |
}); | |
}; | |
ApplicationDelegate.prototype.onDidRequestUnload = function(callback) { | |
var outerCallback; | |
outerCallback = function(event, message) { | |
return callback(event).then(function(shouldUnload) { | |
return get_ipcRenderer().send('did-prepare-to-unload', shouldUnload); | |
}); | |
}; | |
get_ipcRenderer().on('prepare-to-unload', outerCallback); | |
return new Disposable(function() { | |
return get_ipcRenderer().removeListener('prepare-to-unload', outerCallback); | |
}); | |
}; | |
ApplicationDelegate.prototype.onDidChangeHistoryManager = function(callback) { | |
var outerCallback; | |
outerCallback = function(event, message) { | |
return callback(event); | |
}; | |
get_ipcRenderer().on('did-change-history-manager', outerCallback); | |
return new Disposable(function() { | |
return get_ipcRenderer().removeListener('did-change-history-manager', outerCallback); | |
}); | |
}; | |
ApplicationDelegate.prototype.didChangeHistoryManager = function() { | |
return get_ipcRenderer().send('did-change-history-manager'); | |
}; | |
ApplicationDelegate.prototype.openExternal = function(url) { | |
return get_shell().openExternal(url); | |
}; | |
ApplicationDelegate.prototype.checkForUpdate = function() { | |
return get_ipcRenderer().send('command', 'application:check-for-update'); | |
}; | |
ApplicationDelegate.prototype.restartAndInstallUpdate = function() { | |
return get_ipcRenderer().send('command', 'application:install-update'); | |
}; | |
ApplicationDelegate.prototype.getAutoUpdateManagerState = function() { | |
return get_ipcRenderer().sendSync('get-auto-update-manager-state'); | |
}; | |
ApplicationDelegate.prototype.getAutoUpdateManagerErrorMessage = function() { | |
return get_ipcRenderer().sendSync('get-auto-update-manager-error'); | |
}; | |
ApplicationDelegate.prototype.emitWillSavePath = function(path) { | |
return get_ipcRenderer().sendSync('will-save-path', path); | |
}; | |
ApplicationDelegate.prototype.emitDidSavePath = function(path) { | |
return get_ipcRenderer().sendSync('did-save-path', path); | |
}; | |
ApplicationDelegate.prototype.resolveProxy = function(requestId, url) { | |
return get_ipcRenderer().send('resolve-proxy', requestId, url); | |
}; | |
ApplicationDelegate.prototype.onDidResolveProxy = function(callback) { | |
var outerCallback; | |
outerCallback = function(event, requestId, proxy) { | |
return callback(requestId, proxy); | |
}; | |
get_ipcRenderer().on('did-resolve-proxy', outerCallback); | |
return new Disposable(function() { | |
return get_ipcRenderer().removeListener('did-resolve-proxy', outerCallback); | |
}); | |
}; | |
return ApplicationDelegate; | |
})(); | |
}).call(this); | |
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiL1VzZXJzL2xlcm9peC9naXRodWIvYXRvbS9vdXQvYXBwL3NyYy9hcHBsaWNhdGlvbi1kZWxlZ2F0ZS5jb2ZmZWUiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7QUFBQSxNQUFBLG1HQUFBO0lBQUE7O0VBQUEsTUFBK0IsT0FBQSxDQUFRLFVBQVIsQ0FBL0IsRUFBQyw2QkFBRCxFQUFjLG1CQUFkLEVBQXNCOztFQUN0QixVQUFBLEdBQWEsT0FBQSxDQUFRLGVBQVI7O0VBQ1osYUFBYyxPQUFBLENBQVEsV0FBUjs7RUFDZixxQkFBQSxHQUF3QixPQUFBLENBQVEsNEJBQVI7O0VBRXhCLE1BQU0sQ0FBQyxPQUFQLEdBQ007OztrQ0FDSixxQkFBQSxHQUF1QixTQUFBO2FBQUcscUJBQUEsQ0FBQTtJQUFIOztrQ0FFdkIsSUFBQSxHQUFNLFNBQUMsTUFBRDthQUNKLFdBQVcsQ0FBQyxJQUFaLENBQWlCLE1BQWpCLEVBQXlCLE1BQXpCO0lBREk7O2tDQUdOLFVBQUEsR0FBWSxTQUFDLFFBQUQ7QUFDVixVQUFBO01BQUEsZUFBQSxHQUFrQjtNQUNsQixXQUFXLENBQUMsRUFBWixDQUFlLGVBQWYsRUFBZ0MsU0FBQyxLQUFELEVBQVEsSUFBUjtRQUM5QixXQUFXLENBQUMsa0JBQVosQ0FBK0IsZUFBL0I7ZUFDQSxRQUFBLENBQVMsSUFBVDtNQUY4QixDQUFoQzthQUdBLFdBQVcsQ0FBQyxJQUFaLENBQWlCLGFBQWpCLEVBQWdDLGVBQWhDO0lBTFU7O2tDQU9aLGdCQUFBLEdBQWtCLFNBQUE7YUFDaEIsTUFBTSxDQUFDLGdCQUFQLENBQUE7SUFEZ0I7O2tDQUdsQixXQUFBLEdBQWEsU0FBQTthQUNYLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGVBQWhCLEVBQWlDLE9BQWpDO0lBRFc7O2tDQUdiLHVCQUFBLEdBQXlCLFNBQUE7YUFDdkIsVUFBVSxDQUFDLElBQVgsQ0FBZ0IsNEJBQWhCLENBQTZDLENBQUMsSUFBOUMsQ0FBbUQsU0FBQyxTQUFEO2VBQWUsSUFBSSxDQUFDLEtBQUwsQ0FBVyxTQUFYO01BQWYsQ0FBbkQ7SUFEdUI7O2tDQUd6Qix1QkFBQSxHQUF5QixTQUFDLEtBQUQ7YUFDdkIsVUFBVSxDQUFDLElBQVgsQ0FBZ0IsNEJBQWhCLEVBQThDLElBQUksQ0FBQyxTQUFMLENBQWUsS0FBZixDQUE5QztJQUR1Qjs7a0NBR3pCLGFBQUEsR0FBZSxTQUFBO0FBQ2IsVUFBQTtNQUFBLE9BQWtCLE1BQU0sQ0FBQyxnQkFBUCxDQUFBLENBQXlCLENBQUMsT0FBMUIsQ0FBQSxDQUFsQixFQUFDLGVBQUQsRUFBUTthQUNSO1FBQUMsT0FBQSxLQUFEO1FBQVEsUUFBQSxNQUFSOztJQUZhOztrQ0FJZixhQUFBLEdBQWUsU0FBQyxLQUFELEVBQVEsTUFBUjthQUNiLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGlCQUFoQixFQUFtQyxLQUFuQyxFQUEwQyxNQUExQztJQURhOztrQ0FHZixpQkFBQSxHQUFtQixTQUFBO0FBQ2pCLFVBQUE7TUFBQSxPQUFTLE1BQU0sQ0FBQyxnQkFBUCxDQUFBLENBQXlCLENBQUMsV0FBMUIsQ0FBQSxDQUFULEVBQUMsV0FBRCxFQUFJO2FBQ0o7UUFBQyxHQUFBLENBQUQ7UUFBSSxHQUFBLENBQUo7O0lBRmlCOztrQ0FJbkIsaUJBQUEsR0FBbUIsU0FBQyxDQUFELEVBQUksQ0FBSjthQUNqQixVQUFVLENBQUMsSUFBWCxDQUFnQixxQkFBaEIsRUFBdUMsQ0FBdkMsRUFBMEMsQ0FBMUM7SUFEaUI7O2tDQUduQixZQUFBLEdBQWMsU0FBQTthQUNaLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGVBQWhCO0lBRFk7O2tDQUdkLFdBQUEsR0FBYSxTQUFBO2FBQ1gsVUFBVSxDQUFDLElBQVgsQ0FBZ0IsY0FBaEI7SUFEVzs7a0NBR2IsVUFBQSxHQUFZLFNBQUE7YUFDVixVQUFVLENBQUMsSUFBWCxDQUFnQixhQUFoQjtJQURVOztrQ0FHWixVQUFBLEdBQVksU0FBQTthQUNWLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGFBQWhCO0lBRFU7O2tDQUdaLFlBQUEsR0FBYyxTQUFBO2FBQ1osVUFBVSxDQUFDLElBQVgsQ0FBZ0IsZUFBaEIsRUFBaUMsUUFBakM7SUFEWTs7a0NBR2Qsa0JBQUEsR0FBb0IsU0FBQTthQUNsQixXQUFXLENBQUMsSUFBWixDQUFpQixxQkFBakI7SUFEa0I7O2tDQUdwQixjQUFBLEdBQWdCLFNBQUE7YUFDZCxVQUFVLENBQUMsSUFBWCxDQUFnQixlQUFoQixFQUFpQyxVQUFqQztJQURjOztrQ0FHaEIsaUJBQUEsR0FBbUIsU0FBQTthQUNqQixNQUFNLENBQUMsZ0JBQVAsQ0FBQSxDQUF5QixDQUFDLFdBQTFCLENBQUE7SUFEaUI7O2tDQUduQixjQUFBLEdBQWdCLFNBQUE7YUFDZCxVQUFVLENBQUMsSUFBWCxDQUFnQixlQUFoQixFQUFpQyxVQUFqQztJQURjOztrQ0FHaEIsZ0JBQUEsR0FBa0IsU0FBQTthQUNoQixVQUFVLENBQUMsSUFBWCxDQUFnQixlQUFoQixFQUFpQyxZQUFqQztJQURnQjs7a0NBR2xCLGtCQUFBLEdBQW9CLFNBQUE7YUFDbEIsTUFBTSxDQUFDLGdCQUFQLENBQUEsQ0FBeUIsQ0FBQyxZQUExQixDQUFBO0lBRGtCOztrQ0FHcEIsbUJBQUEsR0FBcUIsU0FBQyxVQUFEOztRQUFDLGFBQVc7O2FBQy9CLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGVBQWhCLEVBQWlDLGVBQWpDLEVBQWtELFVBQWxEO0lBRG1COztrQ0FHckIsb0JBQUEsR0FBc0IsU0FBQyxRQUFEO2FBQ3BCLFVBQVUsQ0FBQyxFQUFYLENBQWMsV0FBZCxFQUEyQix1QkFBM0IsRUFBb0QsUUFBcEQ7SUFEb0I7O2tDQUd0QixvQkFBQSxHQUFzQixTQUFDLFFBQUQ7YUFDcEIsVUFBVSxDQUFDLEVBQVgsQ0FBYyxXQUFkLEVBQTJCLHVCQUEzQixFQUFvRCxRQUFwRDtJQURvQjs7a0NBR3RCLGtCQUFBLEdBQW9CLFNBQUE7YUFJbEIsSUFBSSxPQUFKLENBQVksT0FBTyxDQUFDLFFBQXBCLENBQTZCLENBQUMsSUFBOUIsQ0FBbUMsU0FBQTtlQUFHLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGVBQWhCLEVBQWlDLGNBQWpDO01BQUgsQ0FBbkM7SUFKa0I7O2tDQU1wQixtQkFBQSxHQUFxQixTQUFBO2FBSW5CLElBQUksT0FBSixDQUFZLE9BQU8sQ0FBQyxRQUFwQixDQUE2QixDQUFDLElBQTlCLENBQW1DLFNBQUE7ZUFBRyxVQUFVLENBQUMsSUFBWCxDQUFnQixlQUFoQixFQUFpQyxlQUFqQztNQUFILENBQW5DO0lBSm1COztrQ0FNckIsb0JBQUEsR0FBc0IsU0FBQTthQUlwQixJQUFJLE9BQUosQ0FBWSxPQUFPLENBQUMsUUFBcEIsQ0FBNkIsQ0FBQyxJQUE5QixDQUFtQyxTQUFBO2VBQUcsVUFBVSxDQUFDLElBQVgsQ0FBZ0IsZUFBaEIsRUFBaUMsZ0JBQWpDO01BQUgsQ0FBbkM7SUFKb0I7O2tDQU10QixpQ0FBQSxHQUFtQyxTQUFDLElBQUQ7YUFDakMsV0FBVyxDQUFDLElBQVosQ0FBaUIsaUNBQWpCLEVBQW9ELElBQXBEO0lBRGlDOztrQ0FHbkMsdUJBQUEsR0FBeUIsU0FBQyxNQUFEO2FBQ3ZCLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGVBQWhCLEVBQWlDLG1CQUFqQyxFQUFzRCxNQUF0RDtJQUR1Qjs7a0NBR3pCLHNCQUFBLEdBQXdCLFNBQUMsUUFBRDthQUN0QixVQUFVLENBQUMsSUFBWCxDQUFnQixlQUFoQixFQUFpQyx3QkFBakMsRUFBMkQsUUFBM0Q7SUFEc0I7O2tDQUd4QixpQkFBQSxHQUFtQixTQUFDLFFBQUQ7YUFDakIsV0FBVyxDQUFDLElBQVosQ0FBaUIscUJBQWpCLEVBQXdDLFFBQXhDO0lBRGlCOztrQ0FHbkIsNEJBQUEsR0FBOEIsU0FBQyxLQUFEO2FBQzVCLFVBQVUsQ0FBQyxJQUFYLENBQWdCLGVBQWhCLEVBQWlDLDhCQUFqQyxFQUFpRSxLQUFqRTtJQUQ0Qjs7a0NBRzlCLHdCQUFBLEdBQTBCLFNBQUMsUUFBRDthQUN4QixVQUFVLENBQUMsSUFBWCxDQUFnQixlQUFoQixFQUFpQyxvQkFBakMsRUFBdUQsUUFBdkQ7SUFEd0I7O2tDQUcxQiwwQkFBQSxHQUE0QixTQUFDLE9BQUQ7YUFDMUIsTUFBTSxDQUFDLGdCQUFQLENBQUEsQ0FBeUIsQ0FBQyxvQkFBMUIsQ0FBK0MsT0FBL0M7SUFEMEI7O2tDQUc1Qiw2QkFBQSxHQUErQixTQUFBO2FBQzdCLE1BQU0sQ0FBQyxNQUFNLENBQUMsaUJBQWQsQ0FBQSxDQUFpQyxDQUFDO0lBREw7O2tDQUcvQixjQUFBLEdBQWdCLFNBQUMsR0FBRCxFQUFNLElBQU47YUFDZCxNQUFNLENBQUMsaUJBQWlCLENBQUMsY0FBekIsQ0FBd0MsR0FBeEMsRUFBNkMsSUFBN0M7SUFEYzs7a0NBR2hCLE9BQUEsR0FBUyxTQUFDLEdBQUQ7QUFDUCxVQUFBO01BRFMsdUJBQVMsdUNBQWlCOztRQUNuQyxVQUFXOztNQUNYLElBQUcsS0FBSyxDQUFDLE9BQU4sQ0FBYyxPQUFkLENBQUg7UUFDRSxZQUFBLEdBQWUsUUFEakI7T0FBQSxNQUFBO1FBR0UsWUFBQSxHQUFlLE1BQU0sQ0FBQyxJQUFQLENBQVksT0FBWixFQUhqQjs7TUFLQSxNQUFBLEdBQVMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxjQUFkLENBQTZCLE1BQU0sQ0FBQyxnQkFBUCxDQUFBLENBQTdCLEVBQXdEO1FBQy9ELElBQUEsRUFBTSxNQUR5RDtRQUUvRCxPQUFBLEVBQVMsT0FGc0Q7UUFHL0QsTUFBQSxFQUFRLGVBSHVEO1FBSS9ELE9BQUEsRUFBUyxZQUpzRDtRQUsvRCxtQkFBQSxFQUFxQixJQUwwQztPQUF4RDtNQVFULElBQUcsS0FBSyxDQUFDLE9BQU4sQ0FBYyxPQUFkLENBQUg7ZUFDRSxPQURGO09BQUEsTUFBQTtRQUdFLFFBQUEsR0FBVyxPQUFRLENBQUEsWUFBYSxDQUFBLE1BQUEsQ0FBYjtnREFDbkIsb0JBSkY7O0lBZk87O2tDQXFCVCxpQkFBQSxHQUFtQixTQUFDLE1BQUQsR0FBQTs7a0NBRW5CLGNBQUEsR0FBZ0IsU0FBQyxNQUFEO01BQ2QsSUFBRyxPQUFPLE1BQVAsS0FBaUIsUUFBcEI7UUFDRSxNQUFBLEdBQVM7VUFBQyxXQUFBLEVBQWEsTUFBZDtVQURYOzthQUVBLElBQUMsQ0FBQSxnQkFBRCxDQUFBLENBQW1CLENBQUMsY0FBcEIsQ0FBbUMsTUFBbkM7SUFIYzs7a0NBS2hCLGFBQUEsR0FBZSxTQUFBO2FBQ2IsS0FBSyxDQUFDLElBQU4sQ0FBQTtJQURhOztrQ0FHZixrQkFBQSxHQUFvQixTQUFDLFFBQUQ7QUFDbEIsVUFBQTtNQUFBLGFBQUEsR0FBZ0IsU0FBQyxLQUFELEVBQVEsT0FBUixFQUFpQixNQUFqQjtRQUNkLElBQW9CLE9BQUEsS0FBVyxnQkFBL0I7aUJBQUEsUUFBQSxDQUFTLE1BQVQsRUFBQTs7TUFEYztNQUdoQixXQUFXLENBQUMsRUFBWixDQUFlLFNBQWYsRUFBMEIsYUFBMUI7YUFDQSxJQUFJLFVBQUosQ0FBZSxTQUFBO2VBQ2IsV0FBVyxDQUFDLGNBQVosQ0FBMkIsU0FBM0IsRUFBc0MsYUFBdEM7TUFEYSxDQUFmO0lBTGtCOztrQ0FRcEIsaUJBQUEsR0FBbUIsU0FBQyxRQUFEO0FBQ2pCLFVBQUE7TUFBQSxhQUFBLEdBQWdCLFNBQUMsS0FBRCxFQUFRLE9BQVIsRUFBaUIsTUFBakI7UUFJZCxJQUFvQixPQUFBLEtBQVcsOEJBQS9CO2lCQUFBLFFBQUEsQ0FBUyxNQUFULEVBQUE7O01BSmM7TUFNaEIsV0FBVyxDQUFDLEVBQVosQ0FBZSxTQUFmLEVBQTBCLGFBQTFCO2FBQ0EsSUFBSSxVQUFKLENBQWUsU0FBQTtlQUNiLFdBQVcsQ0FBQyxjQUFaLENBQTJCLFNBQTNCLEVBQXNDLGFBQXRDO01BRGEsQ0FBZjtJQVJpQjs7a0NBV25CLDJCQUFBLEdBQTZCLFNBQUMsUUFBRDthQUMzQixJQUFDLENBQUEsaUJBQUQsQ0FBbUIsUUFBbkI7SUFEMkI7O2tDQUc3QiwyQkFBQSxHQUE2QixTQUFDLFFBQUQ7QUFDM0IsVUFBQTtNQUFBLGFBQUEsR0FBZ0IsU0FBQyxLQUFELEVBQVEsT0FBUixFQUFpQixNQUFqQjtRQUNkLElBQW9CLE9BQUEsS0FBVyxxQkFBL0I7aUJBQUEsUUFBQSxDQUFTLE1BQVQsRUFBQTs7TUFEYztNQUdoQixXQUFXLENBQUMsRUFBWixDQUFlLFNBQWYsRUFBMEIsYUFBMUI7YUFDQSxJQUFJLFVBQUosQ0FBZSxTQUFBO2VBQ2IsV0FBVyxDQUFDLGNBQVosQ0FBMkIsU0FBM0IsRUFBc0MsYUFBdEM7TUFEYSxDQUFmO0lBTDJCOztrQ0FRN0IsOEJBQUEsR0FBZ0MsU0FBQyxRQUFEO0FBQzlCLFVBQUE7TUFBQSxhQUFBLEdBQWdCLFNBQUMsS0FBRCxFQUFRLE9BQVIsRUFBaUIsTUFBakI7UUFFZCxJQUFvQixPQUFBLEtBQVcsa0JBQS9CO2lCQUFBLFFBQUEsQ0FBUyxNQUFULEVBQUE7O01BRmM7TUFJaEIsV0FBVyxDQUFDLEVBQVosQ0FBZSxTQUFmLEVBQTBCLGFBQTFCO2FBQ0EsSUFBSSxVQUFKLENBQWUsU0FBQTtlQUNiLFdBQVcsQ0FBQyxjQUFaLENBQTJCLFNBQTNCLEVBQXNDLGFBQXRDO01BRGEsQ0FBZjtJQU44Qjs7a0NBU2hDLG9CQUFBLEdBQXNCLFNBQUMsUUFBRDtBQUNwQixVQUFBO01BQUEsYUFBQSxHQUFnQixTQUFDLEtBQUQsRUFBUSxPQUFSLEVBQWlCLE1BQWpCO1FBQ2QsSUFBb0IsT0FBQSxLQUFXLHNCQUEvQjtpQkFBQSxRQUFBLENBQVMsTUFBVCxFQUFBOztNQURjO01BR2hCLFdBQVcsQ0FBQyxFQUFaLENBQWUsU0FBZixFQUEwQixhQUExQjthQUNBLElBQUksVUFBSixDQUFlLFNBQUE7ZUFDYixXQUFXLENBQUMsY0FBWixDQUEyQixTQUEzQixFQUFzQyxhQUF0QztNQURhLENBQWY7SUFMb0I7O2tDQVF0QixhQUFBLEdBQWUsU0FBQyxRQUFEO0FBQ2IsVUFBQTtNQUFBLGFBQUEsR0FBZ0IsU0FBQyxLQUFELEVBQVEsT0FBUixFQUFpQixNQUFqQjtRQUNkLElBQW9CLE9BQUEsS0FBVyxjQUEvQjtpQkFBQSxRQUFBLENBQVMsTUFBVCxFQUFBOztNQURjO01BR2hCLFdBQVcsQ0FBQyxFQUFaLENBQWUsU0FBZixFQUEwQixhQUExQjthQUNBLElBQUksVUFBSixDQUFlLFNBQUE7ZUFDYixXQUFXLENBQUMsY0FBWixDQUEyQixTQUEzQixFQUFzQyxhQUF0QztNQURhLENBQWY7SUFMYTs7a0NBUWYsd0JBQUEsR0FBMEIsU0FBQyxRQUFEO0FBQ3hCLFVBQUE7TUFBQSxhQUFBLEdBQWdCLFNBQUE7QUFDZCxZQUFBO1FBRGUsc0JBQU87ZUFDdEIsUUFBQSxhQUFTLElBQVQ7TUFEYztNQUdoQixXQUFXLENBQUMsRUFBWixDQUFlLFNBQWYsRUFBMEIsYUFBMUI7YUFDQSxJQUFJLFVBQUosQ0FBZSxTQUFBO2VBQ2IsV0FBVyxDQUFDLGNBQVosQ0FBMkIsU0FBM0IsRUFBc0MsYUFBdEM7TUFEYSxDQUFmO0lBTHdCOztrQ0FRMUIsb0JBQUEsR0FBc0IsU0FBQyxRQUFEO0FBQ3BCLFVBQUE7TUFBQSxhQUFBLEdBQWdCLFNBQUE7QUFDZCxZQUFBO1FBRGUsc0JBQU87ZUFDdEIsUUFBQSxhQUFTLElBQVQ7TUFEYztNQUdoQixXQUFXLENBQUMsRUFBWixDQUFlLGlCQUFmLEVBQWtDLGFBQWxDO2FBQ0EsSUFBSSxVQUFKLENBQWUsU0FBQTtlQUNiLFdBQVcsQ0FBQyxjQUFaLENBQTJCLGlCQUEzQixFQUE4QyxhQUE5QztNQURhLENBQWY7SUFMb0I7O2tDQVF0QixZQUFBLEdBQWMsU0FBQyxRQUFEO0FBQ1osVUFBQTtNQUFBLGFBQUEsR0FBZ0IsU0FBQTtBQUNkLFlBQUE7UUFEZSxzQkFBTztlQUN0QixRQUFBLGFBQVMsSUFBVDtNQURjO01BR2hCLFdBQVcsQ0FBQyxFQUFaLENBQWUsYUFBZixFQUE4QixhQUE5QjthQUNBLElBQUksVUFBSixDQUFlLFNBQUE7ZUFDYixXQUFXLENBQUMsY0FBWixDQUEyQixhQUEzQixFQUEwQyxhQUExQztNQURhLENBQWY7SUFMWTs7a0NBUWQsa0JBQUEsR0FBb0IsU0FBQyxRQUFEO0FBQ2xCLFVBQUE7TUFBQSxhQUFBLEdBQWdCLFNBQUMsS0FBRCxFQUFRLE9BQVI7ZUFDZCxRQUFBLENBQVMsS0FBVCxDQUFlLENBQUMsSUFBaEIsQ0FBcUIsU0FBQyxZQUFEO2lCQUNuQixXQUFXLENBQUMsSUFBWixDQUFpQix1QkFBakIsRUFBMEMsWUFBMUM7UUFEbUIsQ0FBckI7TUFEYztNQUloQixXQUFXLENBQUMsRUFBWixDQUFlLG1CQUFmLEVBQW9DLGFBQXBDO2FBQ0EsSUFBSSxVQUFKLENBQWUsU0FBQTtlQUNiLFdBQVcsQ0FBQyxjQUFaLENBQTJCLG1CQUEzQixFQUFnRCxhQUFoRDtNQURhLENBQWY7SUFOa0I7O2tDQVNwQix5QkFBQSxHQUEyQixTQUFDLFFBQUQ7QUFDekIsVUFBQTtNQUFBLGFBQUEsR0FBZ0IsU0FBQyxLQUFELEVBQVEsT0FBUjtlQUNkLFFBQUEsQ0FBUyxLQUFUO01BRGM7TUFHaEIsV0FBVyxDQUFDLEVBQVosQ0FBZSw0QkFBZixFQUE2QyxhQUE3QzthQUNBLElBQUksVUFBSixDQUFlLFNBQUE7ZUFDYixXQUFXLENBQUMsY0FBWixDQUEyQiw0QkFBM0IsRUFBeUQsYUFBekQ7TUFEYSxDQUFmO0lBTHlCOztrQ0FRM0IsdUJBQUEsR0FBeUIsU0FBQTthQUN2QixXQUFXLENBQUMsSUFBWixDQUFpQiw0QkFBakI7SUFEdUI7O2tDQUd6QixZQUFBLEdBQWMsU0FBQyxHQUFEO2FBQ1osS0FBSyxDQUFDLFlBQU4sQ0FBbUIsR0FBbkI7SUFEWTs7a0NBR2QsY0FBQSxHQUFnQixTQUFBO2FBQ2QsV0FBVyxDQUFDLElBQVosQ0FBaUIsU0FBakIsRUFBNEIsOEJBQTVCO0lBRGM7O2tDQUdoQix1QkFBQSxHQUF5QixTQUFBO2FBQ3ZCLFdBQVcsQ0FBQyxJQUFaLENBQWlCLFNBQWpCLEVBQTRCLDRCQUE1QjtJQUR1Qjs7a0NBR3pCLHlCQUFBLEdBQTJCLFNBQUE7YUFDekIsV0FBVyxDQUFDLFFBQVosQ0FBcUIsK0JBQXJCO0lBRHlCOztrQ0FHM0IsZ0NBQUEsR0FBa0MsU0FBQTthQUNoQyxXQUFXLENBQUMsUUFBWixDQUFxQiwrQkFBckI7SUFEZ0M7O2tDQUdsQyxnQkFBQSxHQUFrQixTQUFDLElBQUQ7YUFDaEIsV0FBVyxDQUFDLFFBQVosQ0FBcUIsZ0JBQXJCLEVBQXVDLElBQXZDO0lBRGdCOztrQ0FHbEIsZUFBQSxHQUFpQixTQUFDLElBQUQ7YUFDZixXQUFXLENBQUMsUUFBWixDQUFxQixlQUFyQixFQUFzQyxJQUF0QztJQURlOztrQ0FHakIsWUFBQSxHQUFjLFNBQUMsU0FBRCxFQUFZLEdBQVo7YUFDWixXQUFXLENBQUMsSUFBWixDQUFpQixlQUFqQixFQUFrQyxTQUFsQyxFQUE2QyxHQUE3QztJQURZOztrQ0FHZCxpQkFBQSxHQUFtQixTQUFDLFFBQUQ7QUFDakIsVUFBQTtNQUFBLGFBQUEsR0FBZ0IsU0FBQyxLQUFELEVBQVEsU0FBUixFQUFtQixLQUFuQjtlQUNkLFFBQUEsQ0FBUyxTQUFULEVBQW9CLEtBQXBCO01BRGM7TUFHaEIsV0FBVyxDQUFDLEVBQVosQ0FBZSxtQkFBZixFQUFvQyxhQUFwQzthQUNBLElBQUksVUFBSixDQUFlLFNBQUE7ZUFDYixXQUFXLENBQUMsY0FBWixDQUEyQixtQkFBM0IsRUFBZ0QsYUFBaEQ7TUFEYSxDQUFmO0lBTGlCOzs7OztBQTlSckIiLCJzb3VyY2VzQ29udGVudCI6WyJ7aXBjUmVuZGVyZXIsIHJlbW90ZSwgc2hlbGx9ID0gcmVxdWlyZSAnZWxlY3Ryb24nXG5pcGNIZWxwZXJzID0gcmVxdWlyZSAnLi9pcGMtaGVscGVycydcbntEaXNwb3NhYmxlfSA9IHJlcXVpcmUgJ2V2ZW50LWtpdCdcbmdldFdpbmRvd0xvYWRTZXR0aW5ncyA9IHJlcXVpcmUgJy4vZ2V0LXdpbmRvdy1sb2FkLXNldHRpbmdzJ1xuXG5tb2R1bGUuZXhwb3J0cyA9XG5jbGFzcyBBcHBsaWNhdGlvbkRlbGVnYXRlXG4gIGdldFdpbmRvd0xvYWRTZXR0aW5nczogLT4gZ2V0V2luZG93TG9hZFNldHRpbmdzKClcblxuICBvcGVuOiAocGFyYW1zKSAtPlxuICAgIGlwY1JlbmRlcmVyLnNlbmQoJ29wZW4nLCBwYXJhbXMpXG5cbiAgcGlja0ZvbGRlcjogKGNhbGxiYWNrKSAtPlxuICAgIHJlc3BvbnNlQ2hhbm5lbCA9IFwiYXRvbS1waWNrLWZvbGRlci1yZXNwb25zZVwiXG4gICAgaXBjUmVuZGVyZXIub24gcmVzcG9uc2VDaGFubmVsLCAoZXZlbnQsIHBhdGgpIC0+XG4gICAgICBpcGNSZW5kZXJlci5yZW1vdmVBbGxMaXN0ZW5lcnMocmVzcG9uc2VDaGFubmVsKVxuICAgICAgY2FsbGJhY2socGF0aClcbiAgICBpcGNSZW5kZXJlci5zZW5kKFwicGljay1mb2xkZXJcIiwgcmVzcG9uc2VDaGFubmVsKVxuXG4gIGdldEN1cnJlbnRXaW5kb3c6IC0+XG4gICAgcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKVxuXG4gIGNsb3NlV2luZG93OiAtPlxuICAgIGlwY0hlbHBlcnMuY2FsbCgnd2luZG93LW1ldGhvZCcsICdjbG9zZScpXG5cbiAgZ2V0VGVtcG9yYXJ5V2luZG93U3RhdGU6IC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCdnZXQtdGVtcG9yYXJ5LXdpbmRvdy1zdGF0ZScpLnRoZW4gKHN0YXRlSlNPTikgLT4gSlNPTi5wYXJzZShzdGF0ZUpTT04pXG5cbiAgc2V0VGVtcG9yYXJ5V2luZG93U3RhdGU6IChzdGF0ZSkgLT5cbiAgICBpcGNIZWxwZXJzLmNhbGwoJ3NldC10ZW1wb3Jhcnktd2luZG93LXN0YXRlJywgSlNPTi5zdHJpbmdpZnkoc3RhdGUpKVxuXG4gIGdldFdpbmRvd1NpemU6IC0+XG4gICAgW3dpZHRoLCBoZWlnaHRdID0gcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5nZXRTaXplKClcbiAgICB7d2lkdGgsIGhlaWdodH1cblxuICBzZXRXaW5kb3dTaXplOiAod2lkdGgsIGhlaWdodCkgLT5cbiAgICBpcGNIZWxwZXJzLmNhbGwoJ3NldC13aW5kb3ctc2l6ZScsIHdpZHRoLCBoZWlnaHQpXG5cbiAgZ2V0V2luZG93UG9zaXRpb246IC0+XG4gICAgW3gsIHldID0gcmVtb3RlLmdldEN1cnJlbnRXaW5kb3coKS5nZXRQb3NpdGlvbigpXG4gICAge3gsIHl9XG5cbiAgc2V0V2luZG93UG9zaXRpb246ICh4LCB5KSAtPlxuICAgIGlwY0hlbHBlcnMuY2FsbCgnc2V0LXdpbmRvdy1wb3NpdGlvbicsIHgsIHkpXG5cbiAgY2VudGVyV2luZG93OiAtPlxuICAgIGlwY0hlbHBlcnMuY2FsbCgnY2VudGVyLXdpbmRvdycpXG5cbiAgZm9jdXNXaW5kb3c6IC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCdmb2N1cy13aW5kb3cnKVxuXG4gIHNob3dXaW5kb3c6IC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCdzaG93LXdpbmRvdycpXG5cbiAgaGlkZVdpbmRvdzogLT5cbiAgICBpcGNIZWxwZXJzLmNhbGwoJ2hpZGUtd2luZG93JylcblxuICByZWxvYWRXaW5kb3c6IC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCd3aW5kb3ctbWV0aG9kJywgJ3JlbG9hZCcpXG5cbiAgcmVzdGFydEFwcGxpY2F0aW9uOiAtPlxuICAgIGlwY1JlbmRlcmVyLnNlbmQoXCJyZXN0YXJ0LWFwcGxpY2F0aW9uXCIpXG5cbiAgbWluaW1pemVXaW5kb3c6IC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCd3aW5kb3ctbWV0aG9kJywgJ21pbmltaXplJylcblxuICBpc1dpbmRvd01heGltaXplZDogLT5cbiAgICByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLmlzTWF4aW1pemVkKClcblxuICBtYXhpbWl6ZVdpbmRvdzogLT5cbiAgICBpcGNIZWxwZXJzLmNhbGwoJ3dpbmRvdy1tZXRob2QnLCAnbWF4aW1pemUnKVxuXG4gIHVubWF4aW1pemVXaW5kb3c6IC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCd3aW5kb3ctbWV0aG9kJywgJ3VubWF4aW1pemUnKVxuXG4gIGlzV2luZG93RnVsbFNjcmVlbjogLT5cbiAgICByZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLmlzRnVsbFNjcmVlbigpXG5cbiAgc2V0V2luZG93RnVsbFNjcmVlbjogKGZ1bGxTY3JlZW49ZmFsc2UpIC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCd3aW5kb3ctbWV0aG9kJywgJ3NldEZ1bGxTY3JlZW4nLCBmdWxsU2NyZWVuKVxuXG4gIG9uRGlkRW50ZXJGdWxsU2NyZWVuOiAoY2FsbGJhY2spIC0+XG4gICAgaXBjSGVscGVycy5vbihpcGNSZW5kZXJlciwgJ2RpZC1lbnRlci1mdWxsLXNjcmVlbicsIGNhbGxiYWNrKVxuXG4gIG9uRGlkTGVhdmVGdWxsU2NyZWVuOiAoY2FsbGJhY2spIC0+XG4gICAgaXBjSGVscGVycy5vbihpcGNSZW5kZXJlciwgJ2RpZC1sZWF2ZS1mdWxsLXNjcmVlbicsIGNhbGxiYWNrKVxuXG4gIG9wZW5XaW5kb3dEZXZUb29sczogLT5cbiAgICAjIERlZmVyIERldlRvb2xzIGludGVyYWN0aW9uIHRvIHRoZSBuZXh0IHRpY2ssIGJlY2F1c2UgdXNpbmcgdGhlbSBkdXJpbmdcbiAgICAjIGV2ZW50IGhhbmRsaW5nIGNhdXNlcyBzb21lIHdyb25nIGlucHV0IGV2ZW50cyB0byBiZSB0cmlnZ2VyZWQgb25cbiAgICAjIGBUZXh0RWRpdG9yQ29tcG9uZW50YCAoUmVmLjogaHR0cHM6Ly9naXRodWIuY29tL2F0b20vYXRvbS9pc3N1ZXMvOTY5NykuXG4gICAgbmV3IFByb21pc2UocHJvY2Vzcy5uZXh0VGljaykudGhlbigtPiBpcGNIZWxwZXJzLmNhbGwoJ3dpbmRvdy1tZXRob2QnLCAnb3BlbkRldlRvb2xzJykpXG5cbiAgY2xvc2VXaW5kb3dEZXZUb29sczogLT5cbiAgICAjIERlZmVyIERldlRvb2xzIGludGVyYWN0aW9uIHRvIHRoZSBuZXh0IHRpY2ssIGJlY2F1c2UgdXNpbmcgdGhlbSBkdXJpbmdcbiAgICAjIGV2ZW50IGhhbmRsaW5nIGNhdXNlcyBzb21lIHdyb25nIGlucHV0IGV2ZW50cyB0byBiZSB0cmlnZ2VyZWQgb25cbiAgICAjIGBUZXh0RWRpdG9yQ29tcG9uZW50YCAoUmVmLjogaHR0cHM6Ly9naXRodWIuY29tL2F0b20vYXRvbS9pc3N1ZXMvOTY5NykuXG4gICAgbmV3IFByb21pc2UocHJvY2Vzcy5uZXh0VGljaykudGhlbigtPiBpcGNIZWxwZXJzLmNhbGwoJ3dpbmRvdy1tZXRob2QnLCAnY2xvc2VEZXZUb29scycpKVxuXG4gIHRvZ2dsZVdpbmRvd0RldlRvb2xzOiAtPlxuICAgICMgRGVmZXIgRGV2VG9vbHMgaW50ZXJhY3Rpb24gdG8gdGhlIG5leHQgdGljaywgYmVjYXVzZSB1c2luZyB0aGVtIGR1cmluZ1xuICAgICMgZXZlbnQgaGFuZGxpbmcgY2F1c2VzIHNvbWUgd3JvbmcgaW5wdXQgZXZlbnRzIHRvIGJlIHRyaWdnZXJlZCBvblxuICAgICMgYFRleHRFZGl0b3JDb21wb25lbnRgIChSZWYuOiBodHRwczovL2dpdGh1Yi5jb20vYXRvbS9hdG9tL2lzc3Vlcy85Njk3KS5cbiAgICBuZXcgUHJvbWlzZShwcm9jZXNzLm5leHRUaWNrKS50aGVuKC0+IGlwY0hlbHBlcnMuY2FsbCgnd2luZG93LW1ldGhvZCcsICd0b2dnbGVEZXZUb29scycpKVxuXG4gIGV4ZWN1dGVKYXZhU2NyaXB0SW5XaW5kb3dEZXZUb29sczogKGNvZGUpIC0+XG4gICAgaXBjUmVuZGVyZXIuc2VuZChcImV4ZWN1dGUtamF2YXNjcmlwdC1pbi1kZXYtdG9vbHNcIiwgY29kZSlcblxuICBzZXRXaW5kb3dEb2N1bWVudEVkaXRlZDogKGVkaXRlZCkgLT5cbiAgICBpcGNIZWxwZXJzLmNhbGwoJ3dpbmRvdy1tZXRob2QnLCAnc2V0RG9jdW1lbnRFZGl0ZWQnLCBlZGl0ZWQpXG5cbiAgc2V0UmVwcmVzZW50ZWRGaWxlbmFtZTogKGZpbGVuYW1lKSAtPlxuICAgIGlwY0hlbHBlcnMuY2FsbCgnd2luZG93LW1ldGhvZCcsICdzZXRSZXByZXNlbnRlZEZpbGVuYW1lJywgZmlsZW5hbWUpXG5cbiAgYWRkUmVjZW50RG9jdW1lbnQ6IChmaWxlbmFtZSkgLT5cbiAgICBpcGNSZW5kZXJlci5zZW5kKFwiYWRkLXJlY2VudC1kb2N1bWVudFwiLCBmaWxlbmFtZSlcblxuICBzZXRSZXByZXNlbnRlZERpcmVjdG9yeVBhdGhzOiAocGF0aHMpIC0+XG4gICAgaXBjSGVscGVycy5jYWxsKCd3aW5kb3ctbWV0aG9kJywgJ3NldFJlcHJlc2VudGVkRGlyZWN0b3J5UGF0aHMnLCBwYXRocylcblxuICBzZXRBdXRvSGlkZVdpbmRvd01lbnVCYXI6IChhdXRvSGlkZSkgLT5cbiAgICBpcGNIZWxwZXJzLmNhbGwoJ3dpbmRvdy1tZXRob2QnLCAnc2V0QXV0b0hpZGVNZW51QmFyJywgYXV0b0hpZGUpXG5cbiAgc2V0V2luZG93TWVudUJhclZpc2liaWxpdHk6ICh2aXNpYmxlKSAtPlxuICAgIHJlbW90ZS5nZXRDdXJyZW50V2luZG93KCkuc2V0TWVudUJhclZpc2liaWxpdHkodmlzaWJsZSlcblxuICBnZXRQcmltYXJ5RGlzcGxheVdvcmtBcmVhU2l6ZTogLT5cbiAgICByZW1vdGUuc2NyZWVuLmdldFByaW1hcnlEaXNwbGF5KCkud29ya0FyZWFTaXplXG5cbiAgZ2V0VXNlckRlZmF1bHQ6IChrZXksIHR5cGUpIC0+XG4gICAgcmVtb3RlLnN5c3RlbVByZWZlcmVuY2VzLmdldFVzZXJEZWZhdWx0KGtleSwgdHlwZSlcblxuICBjb25maXJtOiAoe21lc3NhZ2UsIGRldGFpbGVkTWVzc2FnZSwgYnV0dG9uc30pIC0+XG4gICAgYnV0dG9ucyA/PSB7fVxuICAgIGlmIEFycmF5LmlzQXJyYXkoYnV0dG9ucylcbiAgICAgIGJ1dHRvbkxhYmVscyA9IGJ1dHRvbnNcbiAgICBlbHNlXG4gICAgICBidXR0b25MYWJlbHMgPSBPYmplY3Qua2V5cyhidXR0b25zKVxuXG4gICAgY2hvc2VuID0gcmVtb3RlLmRpYWxvZy5zaG93TWVzc2FnZUJveChyZW1vdGUuZ2V0Q3VycmVudFdpbmRvdygpLCB7XG4gICAgICB0eXBlOiAnaW5mbydcbiAgICAgIG1lc3NhZ2U6IG1lc3NhZ2VcbiAgICAgIGRldGFpbDogZGV0YWlsZWRNZXNzYWdlXG4gICAgICBidXR0b25zOiBidXR0b25MYWJlbHNcbiAgICAgIG5vcm1hbGl6ZUFjY2Vzc0tleXM6IHRydWVcbiAgICB9KVxuXG4gICAgaWYgQXJyYXkuaXNBcnJheShidXR0b25zKVxuICAgICAgY2hvc2VuXG4gICAgZWxzZVxuICAgICAgY2FsbGJhY2sgPSBidXR0b25zW2J1dHRvbkxhYmVsc1tjaG9zZW5dXVxuICAgICAgY2FsbGJhY2s/KClcblxuICBzaG93TWVzc2FnZURpYWxvZzogKHBhcmFtcykgLT5cblxuICBzaG93U2F2ZURpYWxvZzogKHBhcmFtcykgLT5cbiAgICBpZiB0eXBlb2YgcGFyYW1zIGlzICdzdHJpbmcnXG4gICAgICBwYXJhbXMgPSB7ZGVmYXVsdFBhdGg6IHBhcmFtc31cbiAgICBAZ2V0Q3VycmVudFdpbmRvdygpLnNob3dTYXZlRGlhbG9nKHBhcmFtcylcblxuICBwbGF5QmVlcFNvdW5kOiAtPlxuICAgIHNoZWxsLmJlZXAoKVxuXG4gIG9uRGlkT3BlbkxvY2F0aW9uczogKGNhbGxiYWNrKSAtPlxuICAgIG91dGVyQ2FsbGJhY2sgPSAoZXZlbnQsIG1lc3NhZ2UsIGRldGFpbCkgLT5cbiAgICAgIGNhbGxiYWNrKGRldGFpbCkgaWYgbWVzc2FnZSBpcyAnb3Blbi1sb2NhdGlvbnMnXG5cbiAgICBpcGNSZW5kZXJlci5vbignbWVzc2FnZScsIG91dGVyQ2FsbGJhY2spXG4gICAgbmV3IERpc3Bvc2FibGUgLT5cbiAgICAgIGlwY1JlbmRlcmVyLnJlbW92ZUxpc3RlbmVyKCdtZXNzYWdlJywgb3V0ZXJDYWxsYmFjaylcblxuICBvblVwZGF0ZUF2YWlsYWJsZTogKGNhbGxiYWNrKSAtPlxuICAgIG91dGVyQ2FsbGJhY2sgPSAoZXZlbnQsIG1lc3NhZ2UsIGRldGFpbCkgLT5cbiAgICAgICMgVE9ETzogWWVzLCB0aGlzIGlzIHN0cmFuZ2UgdGhhdCBgb25VcGRhdGVBdmFpbGFibGVgIGlzIGxpc3RlbmluZyBmb3JcbiAgICAgICMgYGRpZC1iZWdpbi1kb3dubG9hZGluZy11cGRhdGVgLiBXZSBjdXJyZW50bHkgaGF2ZSBubyBtZWNoYW5pc20gdG8ga25vd1xuICAgICAgIyBpZiB0aGVyZSBpcyBhbiB1cGRhdGUsIHNvIGJlZ2luIG9mIGRvd25sb2FkaW5nIGlzIGEgZ29vZCBwcm94eS5cbiAgICAgIGNhbGxiYWNrKGRldGFpbCkgaWYgbWVzc2FnZSBpcyAnZGlkLWJlZ2luLWRvd25sb2FkaW5nLXVwZGF0ZSdcblxuICAgIGlwY1JlbmRlcmVyLm9uKCdtZXNzYWdlJywgb3V0ZXJDYWxsYmFjaylcbiAgICBuZXcgRGlzcG9zYWJsZSAtPlxuICAgICAgaXBjUmVuZGVyZXIucmVtb3ZlTGlzdGVuZXIoJ21lc3NhZ2UnLCBvdXRlckNhbGxiYWNrKVxuXG4gIG9uRGlkQmVnaW5Eb3dubG9hZGluZ1VwZGF0ZTogKGNhbGxiYWNrKSAtPlxuICAgIEBvblVwZGF0ZUF2YWlsYWJsZShjYWxsYmFjaylcblxuICBvbkRpZEJlZ2luQ2hlY2tpbmdGb3JVcGRhdGU6IChjYWxsYmFjaykgLT5cbiAgICBvdXRlckNhbGxiYWNrID0gKGV2ZW50LCBtZXNzYWdlLCBkZXRhaWwpIC0+XG4gICAgICBjYWxsYmFjayhkZXRhaWwpIGlmIG1lc3NhZ2UgaXMgJ2NoZWNraW5nLWZvci11cGRhdGUnXG5cbiAgICBpcGNSZW5kZXJlci5vbignbWVzc2FnZScsIG91dGVyQ2FsbGJhY2spXG4gICAgbmV3IERpc3Bvc2FibGUgLT5cbiAgICAgIGlwY1JlbmRlcmVyLnJlbW92ZUxpc3RlbmVyKCdtZXNzYWdlJywgb3V0ZXJDYWxsYmFjaylcblxuICBvbkRpZENvbXBsZXRlRG93bmxvYWRpbmdVcGRhdGU6IChjYWxsYmFjaykgLT5cbiAgICBvdXRlckNhbGxiYWNrID0gKGV2ZW50LCBtZXNzYWdlLCBkZXRhaWwpIC0+XG4gICAgICAjIFRPRE86IFdlIGNvdWxkIHJlbmFtZSB0aGlzIGV2ZW50IHRvIGBkaWQtY29tcGxldGUtZG93bmxvYWRpbmctdXBkYXRlYFxuICAgICAgY2FsbGJhY2soZGV0YWlsKSBpZiBtZXNzYWdlIGlzICd1cGRhdGUtYXZhaWxhYmxlJ1xuXG4gICAgaXBjUmVuZGVyZXIub24oJ21lc3NhZ2UnLCBvdXRlckNhbGxiYWNrKVxuICAgIG5ldyBEaXNwb3NhYmxlIC0+XG4gICAgICBpcGNSZW5kZXJlci5yZW1vdmVMaXN0ZW5lcignbWVzc2FnZScsIG91dGVyQ2FsbGJhY2spXG5cbiAgb25VcGRhdGVOb3RBdmFpbGFibGU6IChjYWxsYmFjaykgLT5cbiAgICBvdXRlckNhbGxiYWNrID0gKGV2ZW50LCBtZXNzYWdlLCBkZXRhaWwpIC0+XG4gICAgICBjYWxsYmFjayhkZXRhaWwpIGlmIG1lc3NhZ2UgaXMgJ3VwZGF0ZS1ub3QtYXZhaWxhYmxlJ1xuXG4gICAgaXBjUmVuZGVyZXIub24oJ21lc3NhZ2UnLCBvdXRlckNhbGxiYWNrKVxuICAgIG5ldyBEaXNwb3NhYmxlIC0+XG4gICAgICBpcGNSZW5kZXJlci5yZW1vdmVMaXN0ZW5lcignbWVzc2FnZScsIG91dGVyQ2FsbGJhY2spXG5cbiAgb25VcGRhdGVFcnJvcjogKGNhbGxiYWNrKSAtPlxuICAgIG91dGVyQ2FsbGJhY2sgPSAoZXZlbnQsIG1lc3NhZ2UsIGRldGFpbCkgLT5cbiAgICAgIGNhbGxiYWNrKGRldGFpbCkgaWYgbWVzc2FnZSBpcyAndXBkYXRlLWVycm9yJ1xuXG4gICAgaXBjUmVuZGVyZXIub24oJ21lc3NhZ2UnLCBvdXRlckNhbGxiYWNrKVxuICAgIG5ldyBEaXNwb3NhYmxlIC0+XG4gICAgICBpcGNSZW5kZXJlci5yZW1vdmVMaXN0ZW5lcignbWVzc2FnZScsIG91dGVyQ2FsbGJhY2spXG5cbiAgb25BcHBsaWNhdGlvbk1lbnVDb21tYW5kOiAoY2FsbGJhY2spIC0+XG4gICAgb3V0ZXJDYWxsYmFjayA9IChldmVudCwgYXJncy4uLikgLT5cbiAgICAgIGNhbGxiYWNrKGFyZ3MuLi4pXG5cbiAgICBpcGNSZW5kZXJlci5vbignY29tbWFuZCcsIG91dGVyQ2FsbGJhY2spXG4gICAgbmV3IERpc3Bvc2FibGUgLT5cbiAgICAgIGlwY1JlbmRlcmVyLnJlbW92ZUxpc3RlbmVyKCdjb21tYW5kJywgb3V0ZXJDYWxsYmFjaylcblxuICBvbkNvbnRleHRNZW51Q29tbWFuZDogKGNhbGxiYWNrKSAtPlxuICAgIG91dGVyQ2FsbGJhY2sgPSAoZXZlbnQsIGFyZ3MuLi4pIC0+XG4gICAgICBjYWxsYmFjayhhcmdzLi4uKVxuXG4gICAgaXBjUmVuZGVyZXIub24oJ2NvbnRleHQtY29tbWFuZCcsIG91dGVyQ2FsbGJhY2spXG4gICAgbmV3IERpc3Bvc2FibGUgLT5cbiAgICAgIGlwY1JlbmRlcmVyLnJlbW92ZUxpc3RlbmVyKCdjb250ZXh0LWNvbW1hbmQnLCBvdXRlckNhbGxiYWNrKVxuXG4gIG9uVVJJTWVzc2FnZTogKGNhbGxiYWNrKSAtPlxuICAgIG91dGVyQ2FsbGJhY2sgPSAoZXZlbnQsIGFyZ3MuLi4pIC0+XG4gICAgICBjYWxsYmFjayhhcmdzLi4uKVxuXG4gICAgaXBjUmVuZGVyZXIub24oJ3VyaS1tZXNzYWdlJywgb3V0ZXJDYWxsYmFjaylcbiAgICBuZXcgRGlzcG9zYWJsZSAtPlxuICAgICAgaXBjUmVuZGVyZXIucmVtb3ZlTGlzdGVuZXIoJ3VyaS1tZXNzYWdlJywgb3V0ZXJDYWxsYmFjaylcblxuICBvbkRpZFJlcXVlc3RVbmxvYWQ6IChjYWxsYmFjaykgLT5cbiAgICBvdXRlckNhbGxiYWNrID0gKGV2ZW50LCBtZXNzYWdlKSAtPlxuICAgICAgY2FsbGJhY2soZXZlbnQpLnRoZW4gKHNob3VsZFVubG9hZCkgLT5cbiAgICAgICAgaXBjUmVuZGVyZXIuc2VuZCgnZGlkLXByZXBhcmUtdG8tdW5sb2FkJywgc2hvdWxkVW5sb2FkKVxuXG4gICAgaXBjUmVuZGVyZXIub24oJ3ByZXBhcmUtdG8tdW5sb2FkJywgb3V0ZXJDYWxsYmFjaylcbiAgICBuZXcgRGlzcG9zYWJsZSAtPlxuICAgICAgaXBjUmVuZGVyZXIucmVtb3ZlTGlzdGVuZXIoJ3ByZXBhcmUtdG8tdW5sb2FkJywgb3V0ZXJDYWxsYmFjaylcblxuICBvbkRpZENoYW5nZUhpc3RvcnlNYW5hZ2VyOiAoY2FsbGJhY2spIC0+XG4gICAgb3V0ZXJDYWxsYmFjayA9IChldmVudCwgbWVzc2FnZSkgLT5cbiAgICAgIGNhbGxiYWNrKGV2ZW50KVxuXG4gICAgaXBjUmVuZGVyZXIub24oJ2RpZC1jaGFuZ2UtaGlzdG9yeS1tYW5hZ2VyJywgb3V0ZXJDYWxsYmFjaylcbiAgICBuZXcgRGlzcG9zYWJsZSAtPlxuICAgICAgaXBjUmVuZGVyZXIucmVtb3ZlTGlzdGVuZXIoJ2RpZC1jaGFuZ2UtaGlzdG9yeS1tYW5hZ2VyJywgb3V0ZXJDYWxsYmFjaylcblxuICBkaWRDaGFuZ2VIaXN0b3J5TWFuYWdlcjogLT5cbiAgICBpcGNSZW5kZXJlci5zZW5kKCdkaWQtY2hhbmdlLWhpc3RvcnktbWFuYWdlcicpXG5cbiAgb3BlbkV4dGVybmFsOiAodXJsKSAtPlxuICAgIHNoZWxsLm9wZW5FeHRlcm5hbCh1cmwpXG5cbiAgY2hlY2tGb3JVcGRhdGU6IC0+XG4gICAgaXBjUmVuZGVyZXIuc2VuZCgnY29tbWFuZCcsICdhcHBsaWNhdGlvbjpjaGVjay1mb3ItdXBkYXRlJylcblxuICByZXN0YXJ0QW5kSW5zdGFsbFVwZGF0ZTogLT5cbiAgICBpcGNSZW5kZXJlci5zZW5kKCdjb21tYW5kJywgJ2FwcGxpY2F0aW9uOmluc3RhbGwtdXBkYXRlJylcblxuICBnZXRBdXRvVXBkYXRlTWFuYWdlclN0YXRlOiAtPlxuICAgIGlwY1JlbmRlcmVyLnNlbmRTeW5jKCdnZXQtYXV0by11cGRhdGUtbWFuYWdlci1zdGF0ZScpXG5cbiAgZ2V0QXV0b1VwZGF0ZU1hbmFnZXJFcnJvck1lc3NhZ2U6IC0+XG4gICAgaXBjUmVuZGVyZXIuc2VuZFN5bmMoJ2dldC1hdXRvLXVwZGF0ZS1tYW5hZ2VyLWVycm9yJylcblxuICBlbWl0V2lsbFNhdmVQYXRoOiAocGF0aCkgLT5cbiAgICBpcGNSZW5kZXJlci5zZW5kU3luYygnd2lsbC1zYXZlLXBhdGgnLCBwYXRoKVxuXG4gIGVtaXREaWRTYXZlUGF0aDogKHBhdGgpIC0+XG4gICAgaXBjUmVuZGVyZXIuc2VuZFN5bmMoJ2RpZC1zYXZlLXBhdGgnLCBwYXRoKVxuXG4gIHJlc29sdmVQcm94eTogKHJlcXVlc3RJZCwgdXJsKSAtPlxuICAgIGlwY1JlbmRlcmVyLnNlbmQoJ3Jlc29sdmUtcHJveHknLCByZXF1ZXN0SWQsIHVybClcblxuICBvbkRpZFJlc29sdmVQcm94eTogKGNhbGxiYWNrKSAtPlxuICAgIG91dGVyQ2FsbGJhY2sgPSAoZXZlbnQsIHJlcXVlc3RJZCwgcHJveHkpIC0+XG4gICAgICBjYWxsYmFjayhyZXF1ZXN0SWQsIHByb3h5KVxuXG4gICAgaXBjUmVuZGVyZXIub24oJ2RpZC1yZXNvbHZlLXByb3h5Jywgb3V0ZXJDYWxsYmFjaylcbiAgICBuZXcgRGlzcG9zYWJsZSAtPlxuICAgICAgaXBjUmVuZGVyZXIucmVtb3ZlTGlzdGVuZXIoJ2RpZC1yZXNvbHZlLXByb3h5Jywgb3V0ZXJDYWxsYmFjaylcbiJdfQ== | |
}, | |
"../src/clipboard.js": function (exports, module, __filename, __dirname, require, define) { | |
Object.defineProperty(exports, '__esModule', { | |
value: true | |
}); | |
var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })(); | |
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; } | |
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } } | |
/** @babel */ | |
var _crypto; | |
function get__crypto() { | |
return _crypto = _crypto || require('crypto'); | |
} | |
var _crypto2; | |
function get__crypto2() { | |
return _crypto2 = _crypto2 || _interopRequireDefault(get__crypto()); | |
} | |
var _safeClipboard; | |
function get__safeClipboard() { | |
return _safeClipboard = _safeClipboard || require("../src/safe-clipboard.js"); | |
} | |
var _safeClipboard2; | |
function get__safeClipboard2() { | |
return _safeClipboard2 = _safeClipboard2 || _interopRequireDefault(get__safeClipboard()); | |
} | |
// Extended: Represents the clipboard used for copying and pasting in Atom. | |
// | |
// An instance of this class is always available as the `atom.clipboard` global. | |
// | |
// ## Examples | |
// | |
// ```coffee | |
// atom.clipboard.write('hello') | |
// | |
// console.log(atom.clipboard.read()) # 'hello' | |
// ``` | |
var Clipboard = (function () { | |
function Clipboard() { | |
_classCallCheck(this, Clipboard); | |
this.reset(); | |
} | |
_createClass(Clipboard, [{ | |
key: 'reset', | |
value: function reset() { | |
this.metadata = null; | |
this.signatureForMetadata = null; | |
} | |
// Creates an `md5` hash of some text. | |
// | |
// * `text` A {String} to hash. | |
// | |
// Returns a hashed {String}. | |
}, { | |
key: 'md5', | |
value: function md5(text) { | |
return get__crypto2()['default'].createHash('md5').update(text, 'utf8').digest('hex'); | |
} | |
// Public: Write the given text to the clipboard. | |
// | |
// The metadata associated with the text is available by calling | |
// {::readWithMetadata}. | |
// | |
// * `text` The {String} to store. | |
// * `metadata` (optional) The additional info to associate with the text. | |
}, { | |
key: 'write', | |
value: function write(text, metadata) { | |
this.signatureForMetadata = this.md5(text); | |
this.metadata = metadata; | |
get__safeClipboard2()['default'].writeText(text); | |
} | |
// Public: Read the text from the clipboard. | |
// | |
// Returns a {String}. | |
}, { | |
key: 'read', | |
value: function read() { | |
return get__safeClipboard2()['default'].readText(); | |
} | |
// Public: Read the text from the clipboard and return both the text and the | |
// associated metadata. | |
// | |
// Returns an {Object} with the following keys: | |
// * `text` The {String} clipboard text. | |
// * `metadata` The metadata stored by an earlier call to {::write}. | |
}, { | |
key: 'readWithMetadata', | |
value: function readWithMetadata() { | |
var text = this.read(); | |
if (this.signatureForMetadata === this.md5(text)) { | |
return { text: text, metadata: this.metadata }; | |
} else { | |
return { text: text }; | |
} | |
} | |
}]); | |
return Clipboard; | |
})(); | |
exports['default'] = Clipboard; | |
module.exports = exports['default']; | |
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi9Vc2Vycy9sZXJvaXgvZ2l0aHViL2F0b20vb3V0L2FwcC9zcmMvY2xpcGJvYXJkLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7OztzQkFFbUIsUUFBUTs7Ozs2QkFDTCxrQkFBa0I7Ozs7Ozs7Ozs7Ozs7Ozs7SUFhbkIsU0FBUztBQUNoQixXQURPLFNBQVMsR0FDYjswQkFESSxTQUFTOztBQUUxQixRQUFJLENBQUMsS0FBSyxFQUFFLENBQUE7R0FDYjs7ZUFIa0IsU0FBUzs7V0FLdEIsaUJBQUc7QUFDUCxVQUFJLENBQUMsUUFBUSxHQUFHLElBQUksQ0FBQTtBQUNwQixVQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFBO0tBQ2pDOzs7Ozs7Ozs7V0FPRyxhQUFDLElBQUksRUFBRTtBQUNULGFBQU8sb0JBQU8sVUFBVSxDQUFDLEtBQUssQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsTUFBTSxDQUFDLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFBO0tBQ25FOzs7Ozs7Ozs7OztXQVNLLGVBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRTtBQUNyQixVQUFJLENBQUMsb0JBQW9CLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUMxQyxVQUFJLENBQUMsUUFBUSxHQUFHLFFBQVEsQ0FBQTtBQUN4QixpQ0FBVSxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUE7S0FDMUI7Ozs7Ozs7V0FLSSxnQkFBRztBQUNOLGFBQU8sMkJBQVUsUUFBUSxFQUFFLENBQUE7S0FDNUI7Ozs7Ozs7Ozs7V0FRZ0IsNEJBQUc7QUFDbEIsVUFBSSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFBO0FBQ3RCLFVBQUksSUFBSSxDQUFDLG9CQUFvQixLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUU7QUFDaEQsZUFBTyxFQUFDLElBQUksRUFBSixJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUMsQ0FBQTtPQUN2QyxNQUFNO0FBQ0wsZUFBTyxFQUFDLElBQUksRUFBSixJQUFJLEVBQUMsQ0FBQTtPQUNkO0tBQ0Y7OztTQXBEa0IsU0FBUzs7O3FCQUFULFNBQVMiLCJmaWxlIjoiL1VzZXJzL2xlcm9peC9naXRodWIvYXRvbS9vdXQvYXBwL3NyYy9jbGlwYm9hcmQuanMiLCJzb3VyY2VzQ29udGVudCI6WyIvKiogQGJhYmVsICovXG5cbmltcG9ydCBjcnlwdG8gZnJvbSAnY3J5cHRvJ1xuaW1wb3J0IGNsaXBib2FyZCBmcm9tICcuL3NhZmUtY2xpcGJvYXJkJ1xuXG4vLyBFeHRlbmRlZDogUmVwcmVzZW50cyB0aGUgY2xpcGJvYXJkIHVzZWQgZm9yIGNvcHlpbmcgYW5kIHBhc3RpbmcgaW4gQXRvbS5cbi8vXG4vLyBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGFsd2F5cyBhdmFpbGFibGUgYXMgdGhlIGBhdG9tLmNsaXBib2FyZGAgZ2xvYmFsLlxuLy9cbi8vICMjIEV4YW1wbGVzXG4vL1xuLy8gYGBgY29mZmVlXG4vLyBhdG9tLmNsaXBib2FyZC53cml0ZSgnaGVsbG8nKVxuLy9cbi8vIGNvbnNvbGUubG9nKGF0b20uY2xpcGJvYXJkLnJlYWQoKSkgIyAnaGVsbG8nXG4vLyBgYGBcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENsaXBib2FyZCB7XG4gIGNvbnN0cnVjdG9yICgpIHtcbiAgICB0aGlzLnJlc2V0KClcbiAgfVxuXG4gIHJlc2V0ICgpIHtcbiAgICB0aGlzLm1ldGFkYXRhID0gbnVsbFxuICAgIHRoaXMuc2lnbmF0dXJlRm9yTWV0YWRhdGEgPSBudWxsXG4gIH1cblxuICAvLyBDcmVhdGVzIGFuIGBtZDVgIGhhc2ggb2Ygc29tZSB0ZXh0LlxuICAvL1xuICAvLyAqIGB0ZXh0YCBBIHtTdHJpbmd9IHRvIGhhc2guXG4gIC8vXG4gIC8vIFJldHVybnMgYSBoYXNoZWQge1N0cmluZ30uXG4gIG1kNSAodGV4dCkge1xuICAgIHJldHVybiBjcnlwdG8uY3JlYXRlSGFzaCgnbWQ1JykudXBkYXRlKHRleHQsICd1dGY4JykuZGlnZXN0KCdoZXgnKVxuICB9XG5cbiAgLy8gUHVibGljOiBXcml0ZSB0aGUgZ2l2ZW4gdGV4dCB0byB0aGUgY2xpcGJvYXJkLlxuICAvL1xuICAvLyBUaGUgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSB0ZXh0IGlzIGF2YWlsYWJsZSBieSBjYWxsaW5nXG4gIC8vIHs6OnJlYWRXaXRoTWV0YWRhdGF9LlxuICAvL1xuICAvLyAqIGB0ZXh0YCBUaGUge1N0cmluZ30gdG8gc3RvcmUuXG4gIC8vICogYG1ldGFkYXRhYCAob3B0aW9uYWwpIFRoZSBhZGRpdGlvbmFsIGluZm8gdG8gYXNzb2NpYXRlIHdpdGggdGhlIHRleHQuXG4gIHdyaXRlICh0ZXh0LCBtZXRhZGF0YSkge1xuICAgIHRoaXMuc2lnbmF0dXJlRm9yTWV0YWRhdGEgPSB0aGlzLm1kNSh0ZXh0KVxuICAgIHRoaXMubWV0YWRhdGEgPSBtZXRhZGF0YVxuICAgIGNsaXBib2FyZC53cml0ZVRleHQodGV4dClcbiAgfVxuXG4gIC8vIFB1YmxpYzogUmVhZCB0aGUgdGV4dCBmcm9tIHRoZSBjbGlwYm9hcmQuXG4gIC8vXG4gIC8vIFJldHVybnMgYSB7U3RyaW5nfS5cbiAgcmVhZCAoKSB7XG4gICAgcmV0dXJuIGNsaXBib2FyZC5yZWFkVGV4dCgpXG4gIH1cblxuICAvLyBQdWJsaWM6IFJlYWQgdGhlIHRleHQgZnJvbSB0aGUgY2xpcGJvYXJkIGFuZCByZXR1cm4gYm90aCB0aGUgdGV4dCBhbmQgdGhlXG4gIC8vIGFzc29jaWF0ZWQgbWV0YWRhdGEuXG4gIC8vXG4gIC8vIFJldHVybnMgYW4ge09iamVjdH0gd2l0aCB0aGUgZm9sbG93aW5nIGtleXM6XG4gIC8vICogYHRleHRgIFRoZSB7U3RyaW5nfSBjbGlwYm9hcmQgdGV4dC5cbiAgLy8gKiBgbWV0YWRhdGFgIFRoZSBtZXRhZGF0YSBzdG9yZWQgYnkgYW4gZWFybGllciBjYWxsIHRvIHs6OndyaXRlfS5cbiAgcmVhZFdpdGhNZXRhZGF0YSAoKSB7XG4gICAgbGV0IHRleHQgPSB0aGlzLnJlYWQoKVxuICAgIGlmICh0aGlzLnNpZ25hdHVyZUZvck1ldGFkYXRhID09PSB0aGlzLm1kNSh0ZXh0KSkge1xuICAgICAgcmV0dXJuIHt0ZXh0LCBtZXRhZGF0YTogdGhpcy5tZXRhZGF0YX1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIHt0ZXh0fVxuICAgIH1cbiAgfVxufVxuIl19 | |
}, | |
"../src/text-editor.js": function (exports, module, __filename, __dirname, require, define) { | |
const _ = require("../node_modules/underscore-plus/lib/underscore-plus.js") | |
let path; | |
function get_path() { | |
return path = path || require('path'); | |
} | |
const fs = require("../node_modules/fs-plus/lib/fs-plus.js") | |
const Grim = require("../node_modules/grim/lib/grim.js") | |
const dedent = require("../node_modules/dedent/dist/dedent.js") | |
const {CompositeDisposable, Disposable, Emitter} = require("../node_modules/event-kit/lib/event-kit.js") | |
const TextBuffer = require("../node_modules/text-buffer/lib/text-buffer.js") | |
const {Point, Range} = TextBuffer | |
const DecorationManager = require("../src/decoration-manager.js") | |
const Cursor = require("../src/cursor.js") | |
const Selection = require("../src/selection.js") | |
const NullGrammar = require("../src/null-grammar.js") | |
const TextMateLanguageMode = require("../src/text-mate-language-mode.js") | |
const TextMateScopeSelector = require("../node_modules/first-mate/lib/first-mate.js").ScopeSelector | |
const GutterContainer = require("../src/gutter-container.js") | |
let TextEditorComponent = null | |
let TextEditorElement = null | |
const {isDoubleWidthCharacter, isHalfWidthCharacter, isKoreanCharacter, isWrapBoundary} = require("../src/text-utils.js") | |
const SERIALIZATION_VERSION = 1 | |
const NON_WHITESPACE_REGEXP = /\S/ | |
const ZERO_WIDTH_NBSP = '\ufeff' | |
let nextId = 0 | |
const DEFAULT_NON_WORD_CHARACTERS = "/\\()\"':,.;<>~!@#$%^&*|+=[]{}`?-…" | |
// Essential: This class represents all essential editing state for a single | |
// {TextBuffer}, including cursor and selection positions, folds, and soft wraps. | |
// If you're manipulating the state of an editor, use this class. | |
// | |
// A single {TextBuffer} can belong to multiple editors. For example, if the | |
// same file is open in two different panes, Atom creates a separate editor for | |
// each pane. If the buffer is manipulated the changes are reflected in both | |
// editors, but each maintains its own cursor position, folded lines, etc. | |
// | |
// ## Accessing TextEditor Instances | |
// | |
// The easiest way to get hold of `TextEditor` objects is by registering a callback | |
// with `::observeTextEditors` on the `atom.workspace` global. Your callback will | |
// then be called with all current editor instances and also when any editor is | |
// created in the future. | |
// | |
// ```coffee | |
// atom.workspace.observeTextEditors (editor) -> | |
// editor.insertText('Hello World') | |
// ``` | |
// | |
// ## Buffer vs. Screen Coordinates | |
// | |
// Because editors support folds and soft-wrapping, the lines on screen don't | |
// always match the lines in the buffer. For example, a long line that soft wraps | |
// twice renders as three lines on screen, but only represents one line in the | |
// buffer. Similarly, if rows 5-10 are folded, then row 6 on screen corresponds | |
// to row 11 in the buffer. | |
// | |
// Your choice of coordinates systems will depend on what you're trying to | |
// achieve. For example, if you're writing a command that jumps the cursor up or | |
// down by 10 lines, you'll want to use screen coordinates because the user | |
// probably wants to skip lines *on screen*. However, if you're writing a package | |
// that jumps between method definitions, you'll want to work in buffer | |
// coordinates. | |
// | |
// **When in doubt, just default to buffer coordinates**, then experiment with | |
// soft wraps and folds to ensure your code interacts with them correctly. | |
module.exports = | |
class TextEditor { | |
static setClipboard (clipboard) { | |
this.clipboard = clipboard | |
} | |
static setScheduler (scheduler) { | |
if (TextEditorComponent == null) { TextEditorComponent = require("../src/text-editor-component.js") } | |
return TextEditorComponent.setScheduler(scheduler) | |
} | |
static didUpdateStyles () { | |
if (TextEditorComponent == null) { TextEditorComponent = require("../src/text-editor-component.js") } | |
return TextEditorComponent.didUpdateStyles() | |
} | |
static didUpdateScrollbarStyles () { | |
if (TextEditorComponent == null) { TextEditorComponent = require("../src/text-editor-component.js") } | |
return TextEditorComponent.didUpdateScrollbarStyles() | |
} | |
static viewForItem (item) { return item.element || item } | |
static deserialize (state, atomEnvironment) { | |
if (state.version !== SERIALIZATION_VERSION) return null | |
let bufferId = state.tokenizedBuffer | |
? state.tokenizedBuffer.bufferId | |
: state.bufferId | |
try { | |
state.buffer = atomEnvironment.project.bufferForIdSync(bufferId) | |
if (!state.buffer) return null | |
} catch (error) { | |
if (error.syscall === 'read') { | |
return // Error reading the file, don't deserialize an editor for it | |
} else { | |
throw error | |
} | |
} | |
state.assert = atomEnvironment.assert.bind(atomEnvironment) | |
const editor = new TextEditor(state) | |
if (state.registered) { | |
const disposable = atomEnvironment.textEditors.add(editor) | |
editor.onDidDestroy(() => disposable.dispose()) | |
} | |
return editor | |
} | |
constructor (params = {}) { | |
if (this.constructor.clipboard == null) { | |
throw new Error('Must call TextEditor.setClipboard at least once before creating TextEditor instances') | |
} | |
this.id = params.id != null ? params.id : nextId++ | |
this.initialScrollTopRow = params.initialScrollTopRow | |
this.initialScrollLeftColumn = params.initialScrollLeftColumn | |
this.decorationManager = params.decorationManager | |
this.selectionsMarkerLayer = params.selectionsMarkerLayer | |
this.mini = (params.mini != null) ? params.mini : false | |
this.placeholderText = params.placeholderText | |
this.showLineNumbers = params.showLineNumbers | |
this.assert = params.assert || (condition => condition) | |
this.showInvisibles = (params.showInvisibles != null) ? params.showInvisibles : true | |
this.autoHeight = params.autoHeight | |
this.autoWidth = params.autoWidth | |
this.scrollPastEnd = (params.scrollPastEnd != null) ? params.scrollPastEnd : false | |
this.scrollSensitivity = (params.scrollSensitivity != null) ? params.scrollSensitivity : 40 | |
this.editorWidthInChars = params.editorWidthInChars | |
this.invisibles = params.invisibles | |
this.showIndentGuide = params.showIndentGuide | |
this.softWrapped = params.softWrapped | |
this.softWrapAtPreferredLineLength = params.softWrapAtPreferredLineLength | |
this.preferredLineLength = params.preferredLineLength | |
this.showCursorOnSelection = (params.showCursorOnSelection != null) ? params.showCursorOnSelection : true | |
this.maxScreenLineLength = params.maxScreenLineLength | |
this.softTabs = (params.softTabs != null) ? params.softTabs : true | |
this.autoIndent = (params.autoIndent != null) ? params.autoIndent : true | |
this.autoIndentOnPaste = (params.autoIndentOnPaste != null) ? params.autoIndentOnPaste : true | |
this.undoGroupingInterval = (params.undoGroupingInterval != null) ? params.undoGroupingInterval : 300 | |
this.softWrapped = (params.softWrapped != null) ? params.softWrapped : false | |
this.softWrapAtPreferredLineLength = (params.softWrapAtPreferredLineLength != null) ? params.softWrapAtPreferredLineLength : false | |
this.preferredLineLength = (params.preferredLineLength != null) ? params.preferredLineLength : 80 | |
this.maxScreenLineLength = (params.maxScreenLineLength != null) ? params.maxScreenLineLength : 500 | |
this.showLineNumbers = (params.showLineNumbers != null) ? params.showLineNumbers : true | |
const {tabLength = 2} = params | |
this.alive = true | |
this.doBackgroundWork = this.doBackgroundWork.bind(this) | |
this.serializationVersion = 1 | |
this.suppressSelectionMerging = false | |
this.selectionFlashDuration = 500 | |
this.gutterContainer = null | |
this.verticalScrollMargin = 2 | |
this.horizontalScrollMargin = 6 | |
this.lineHeightInPixels = null | |
this.defaultCharWidth = null | |
this.height = null | |
this.width = null | |
this.registered = false | |
this.atomicSoftTabs = true | |
this.emitter = new Emitter() | |
this.disposables = new CompositeDisposable() | |
this.cursors = [] | |
this.cursorsByMarkerId = new Map() | |
this.selections = [] | |
this.hasTerminatedPendingState = false | |
if (params.buffer) { | |
this.buffer = params.buffer | |
} else { | |
this.buffer = new TextBuffer({ | |
shouldDestroyOnFileDelete () { return atom.config.get('core.closeDeletedFileTabs') } | |
}) | |
this.buffer.setLanguageMode(new TextMateLanguageMode({buffer: this.buffer, config: atom.config})) | |
} | |
const languageMode = this.buffer.getLanguageMode() | |
this.languageModeSubscription = languageMode.onDidTokenize && languageMode.onDidTokenize(() => { | |
this.emitter.emit('did-tokenize') | |
}) | |
if (this.languageModeSubscription) this.disposables.add(this.languageModeSubscription) | |
if (params.displayLayer) { | |
this.displayLayer = params.displayLayer | |
} else { | |
const displayLayerParams = { | |
invisibles: this.getInvisibles(), | |
softWrapColumn: this.getSoftWrapColumn(), | |
showIndentGuides: this.doesShowIndentGuide(), | |
atomicSoftTabs: params.atomicSoftTabs != null ? params.atomicSoftTabs : true, | |
tabLength, | |
ratioForCharacter: this.ratioForCharacter.bind(this), | |
isWrapBoundary, | |
foldCharacter: ZERO_WIDTH_NBSP, | |
softWrapHangingIndent: params.softWrapHangingIndentLength != null ? params.softWrapHangingIndentLength : 0 | |
} | |
this.displayLayer = this.buffer.getDisplayLayer(params.displayLayerId) | |
if (this.displayLayer) { | |
this.displayLayer.reset(displayLayerParams) | |
this.selectionsMarkerLayer = this.displayLayer.getMarkerLayer(params.selectionsMarkerLayerId) | |
} else { | |
this.displayLayer = this.buffer.addDisplayLayer(displayLayerParams) | |
} | |
} | |
this.backgroundWorkHandle = requestIdleCallback(this.doBackgroundWork) | |
this.disposables.add(new Disposable(() => { | |
if (this.backgroundWorkHandle != null) return cancelIdleCallback(this.backgroundWorkHandle) | |
})) | |
this.defaultMarkerLayer = this.displayLayer.addMarkerLayer() | |
if (!this.selectionsMarkerLayer) { | |
this.selectionsMarkerLayer = this.addMarkerLayer({maintainHistory: true, persistent: true}) | |
} | |
this.decorationManager = new DecorationManager(this) | |
this.decorateMarkerLayer(this.selectionsMarkerLayer, {type: 'cursor'}) | |
if (!this.isMini()) this.decorateCursorLine() | |
this.decorateMarkerLayer(this.displayLayer.foldsMarkerLayer, {type: 'line-number', class: 'folded'}) | |
for (let marker of this.selectionsMarkerLayer.getMarkers()) { | |
this.addSelection(marker) | |
} | |
this.subscribeToBuffer() | |
this.subscribeToDisplayLayer() | |
if (this.cursors.length === 0 && !params.suppressCursorCreation) { | |
const initialLine = Math.max(parseInt(params.initialLine) || 0, 0) | |
const initialColumn = Math.max(parseInt(params.initialColumn) || 0, 0) | |
this.addCursorAtBufferPosition([initialLine, initialColumn]) | |
} | |
this.gutterContainer = new GutterContainer(this) | |
this.lineNumberGutter = this.gutterContainer.addGutter({ | |
name: 'line-number', | |
priority: 0, | |
visible: params.lineNumberGutterVisible | |
}) | |
} | |
get element () { | |
return this.getElement() | |
} | |
get editorElement () { | |
Grim.deprecate(dedent`\ | |
\`TextEditor.prototype.editorElement\` has always been private, but now | |
it is gone. Reading the \`editorElement\` property still returns a | |
reference to the editor element but this field will be removed in a | |
later version of Atom, so we recommend using the \`element\` property instead.\ | |
`) | |
return this.getElement() | |
} | |
get displayBuffer () { | |
Grim.deprecate(dedent`\ | |
\`TextEditor.prototype.displayBuffer\` has always been private, but now | |
it is gone. Reading the \`displayBuffer\` property now returns a reference | |
to the containing \`TextEditor\`, which now provides *some* of the API of | |
the defunct \`DisplayBuffer\` class.\ | |
`) | |
return this | |
} | |
get languageMode () { return this.buffer.getLanguageMode() } | |
get tokenizedBuffer () { return this.buffer.getLanguageMode() } | |
get rowsPerPage () { | |
return this.getRowsPerPage() | |
} | |
decorateCursorLine () { | |
this.cursorLineDecorations = [ | |
this.decorateMarkerLayer(this.selectionsMarkerLayer, {type: 'line', class: 'cursor-line', onlyEmpty: true}), | |
this.decorateMarkerLayer(this.selectionsMarkerLayer, {type: 'line-number', class: 'cursor-line'}), | |
this.decorateMarkerLayer(this.selectionsMarkerLayer, {type: 'line-number', class: 'cursor-line-no-selection', onlyHead: true, onlyEmpty: true}) | |
] | |
} | |
doBackgroundWork (deadline) { | |
const previousLongestRow = this.getApproximateLongestScreenRow() | |
if (this.displayLayer.doBackgroundWork(deadline)) { | |
this.backgroundWorkHandle = requestIdleCallback(this.doBackgroundWork) | |
} else { | |
this.backgroundWorkHandle = null | |
} | |
if (this.component && this.getApproximateLongestScreenRow() !== previousLongestRow) { | |
this.component.scheduleUpdate() | |
} | |
} | |
update (params) { | |
const displayLayerParams = {} | |
for (let param of Object.keys(params)) { | |
const value = params[param] | |
switch (param) { | |
case 'autoIndent': | |
this.autoIndent = value | |
break | |
case 'autoIndentOnPaste': | |
this.autoIndentOnPaste = value | |
break | |
case 'undoGroupingInterval': | |
this.undoGroupingInterval = value | |
break | |
case 'scrollSensitivity': | |
this.scrollSensitivity = value | |
break | |
case 'encoding': | |
this.buffer.setEncoding(value) | |
break | |
case 'softTabs': | |
if (value !== this.softTabs) { | |
this.softTabs = value | |
} | |
break | |
case 'atomicSoftTabs': | |
if (value !== this.displayLayer.atomicSoftTabs) { | |
displayLayerParams.atomicSoftTabs = value | |
} | |
break | |
case 'tabLength': | |
if (value > 0 && value !== this.displayLayer.tabLength) { | |
displayLayerParams.tabLength = value | |
} | |
break | |
case 'softWrapped': | |
if (value !== this.softWrapped) { | |
this.softWrapped = value | |
displayLayerParams.softWrapColumn = this.getSoftWrapColumn() | |
this.emitter.emit('did-change-soft-wrapped', this.isSoftWrapped()) | |
} | |
break | |
case 'softWrapHangingIndentLength': | |
if (value !== this.displayLayer.softWrapHangingIndent) { | |
displayLayerParams.softWrapHangingIndent = value | |
} | |
break | |
case 'softWrapAtPreferredLineLength': | |
if (value !== this.softWrapAtPreferredLineLength) { | |
this.softWrapAtPreferredLineLength = value | |
displayLayerParams.softWrapColumn = this.getSoftWrapColumn() | |
} | |
break | |
case 'preferredLineLength': | |
if (value !== this.preferredLineLength) { | |
this.preferredLineLength = value | |
displayLayerParams.softWrapColumn = this.getSoftWrapColumn() | |
} | |
break | |
case 'maxScreenLineLength': | |
if (value !== this.maxScreenLineLength) { | |
this.maxScreenLineLength = value | |
displayLayerParams.softWrapColumn = this.getSoftWrapColumn() | |
} | |
break | |
case 'mini': | |
if (value !== this.mini) { | |
this.mini = value | |
this.emitter.emit('did-change-mini', value) | |
displayLayerParams.invisibles = this.getInvisibles() | |
displayLayerParams.softWrapColumn = this.getSoftWrapColumn() | |
displayLayerParams.showIndentGuides = this.doesShowIndentGuide() | |
if (this.mini) { | |
for (let decoration of this.cursorLineDecorations) { decoration.destroy() } | |
this.cursorLineDecorations = null | |
} else { | |
this.decorateCursorLine() | |
} | |
if (this.component != null) { | |
this.component.scheduleUpdate() | |
} | |
} | |
break | |
case 'placeholderText': | |
if (value !== this.placeholderText) { | |
this.placeholderText = value | |
this.emitter.emit('did-change-placeholder-text', value) | |
} | |
break | |
case 'lineNumberGutterVisible': | |
if (value !== this.lineNumberGutterVisible) { | |
if (value) { | |
this.lineNumberGutter.show() | |
} else { | |
this.lineNumberGutter.hide() | |
} | |
this.emitter.emit('did-change-line-number-gutter-visible', this.lineNumberGutter.isVisible()) | |
} | |
break | |
case 'showIndentGuide': | |
if (value !== this.showIndentGuide) { | |
this.showIndentGuide = value | |
displayLayerParams.showIndentGuides = this.doesShowIndentGuide() | |
} | |
break | |
case 'showLineNumbers': | |
if (value !== this.showLineNumbers) { | |
this.showLineNumbers = value | |
if (this.component != null) { | |
this.component.scheduleUpdate() | |
} | |
} | |
break | |
case 'showInvisibles': | |
if (value !== this.showInvisibles) { | |
this.showInvisibles = value | |
displayLayerParams.invisibles = this.getInvisibles() | |
} | |
break | |
case 'invisibles': | |
if (!_.isEqual(value, this.invisibles)) { | |
this.invisibles = value | |
displayLayerParams.invisibles = this.getInvisibles() | |
} | |
break | |
case 'editorWidthInChars': | |
if (value > 0 && value !== this.editorWidthInChars) { | |
this.editorWidthInChars = value | |
displayLayerParams.softWrapColumn = this.getSoftWrapColumn() | |
} | |
break | |
case 'width': | |
if (value !== this.width) { | |
this.width = value | |
displayLayerParams.softWrapColumn = this.getSoftWrapColumn() | |
} | |
break | |
case 'scrollPastEnd': | |
if (value !== this.scrollPastEnd) { | |
this.scrollPastEnd = value | |
if (this.component) this.component.scheduleUpdate() | |
} | |
break | |
case 'autoHeight': | |
if (value !== this.autoHeight) { | |
this.autoHeight = value | |
} | |
break | |
case 'autoWidth': | |
if (value !== this.autoWidth) { | |
this.autoWidth = value | |
} | |
break | |
case 'showCursorOnSelection': | |
if (value !== this.showCursorOnSelection) { | |
this.showCursorOnSelection = value | |
if (this.component) this.component.scheduleUpdate() | |
} | |
break | |
default: | |
if (param !== 'ref' && param !== 'key') { | |
throw new TypeError(`Invalid TextEditor parameter: '${param}'`) | |
} | |
} | |
} | |
this.displayLayer.reset(displayLayerParams) | |
if (this.component) { | |
return this.component.getNextUpdatePromise() | |
} else { | |
return Promise.resolve() | |
} | |
} | |
scheduleComponentUpdate () { | |
if (this.component) this.component.scheduleUpdate() | |
} | |
serialize () { | |
return { | |
deserializer: 'TextEditor', | |
version: SERIALIZATION_VERSION, | |
displayLayerId: this.displayLayer.id, | |
selectionsMarkerLayerId: this.selectionsMarkerLayer.id, | |
initialScrollTopRow: this.getScrollTopRow(), | |
initialScrollLeftColumn: this.getScrollLeftColumn(), | |
tabLength: this.displayLayer.tabLength, | |
atomicSoftTabs: this.displayLayer.atomicSoftTabs, | |
softWrapHangingIndentLength: this.displayLayer.softWrapHangingIndent, | |
id: this.id, | |
bufferId: this.buffer.id, | |
softTabs: this.softTabs, | |
softWrapped: this.softWrapped, | |
softWrapAtPreferredLineLength: this.softWrapAtPreferredLineLength, | |
preferredLineLength: this.preferredLineLength, | |
mini: this.mini, | |
editorWidthInChars: this.editorWidthInChars, | |
width: this.width, | |
maxScreenLineLength: this.maxScreenLineLength, | |
registered: this.registered, | |
invisibles: this.invisibles, | |
showInvisibles: this.showInvisibles, | |
showIndentGuide: this.showIndentGuide, | |
autoHeight: this.autoHeight, | |
autoWidth: this.autoWidth | |
} | |
} | |
subscribeToBuffer () { | |
this.buffer.retain() | |
this.disposables.add(this.buffer.onDidChangeLanguageMode(this.handleLanguageModeChange.bind(this))) | |
this.disposables.add(this.buffer.onDidChangePath(() => { | |
this.emitter.emit('did-change-title', this.getTitle()) | |
this.emitter.emit('did-change-path', this.getPath()) | |
})) | |
this.disposables.add(this.buffer.onDidChangeEncoding(() => { | |
this.emitter.emit('did-change-encoding', this.getEncoding()) | |
})) | |
this.disposables.add(this.buffer.onDidDestroy(() => this.destroy())) | |
this.disposables.add(this.buffer.onDidChangeModified(() => { | |
if (!this.hasTerminatedPendingState && this.buffer.isModified()) this.terminatePendingState() | |
})) | |
} | |
terminatePendingState () { | |
if (!this.hasTerminatedPendingState) this.emitter.emit('did-terminate-pending-state') | |
this.hasTerminatedPendingState = true | |
} | |
onDidTerminatePendingState (callback) { | |
return this.emitter.on('did-terminate-pending-state', callback) | |
} | |
subscribeToDisplayLayer () { | |
this.disposables.add(this.displayLayer.onDidChange(changes => { | |
this.mergeIntersectingSelections() | |
if (this.component) this.component.didChangeDisplayLayer(changes) | |
this.emitter.emit('did-change', changes.map(change => new ChangeEvent(change))) | |
})) | |
this.disposables.add(this.displayLayer.onDidReset(() => { | |
this.mergeIntersectingSelections() | |
if (this.component) this.component.didResetDisplayLayer() | |
this.emitter.emit('did-change', {}) | |
})) | |
this.disposables.add(this.selectionsMarkerLayer.onDidCreateMarker(this.addSelection.bind(this))) | |
return this.disposables.add(this.selectionsMarkerLayer.onDidUpdate(() => (this.component != null ? this.component.didUpdateSelections() : undefined))) | |
} | |
destroy () { | |
if (!this.alive) return | |
this.alive = false | |
this.disposables.dispose() | |
this.displayLayer.destroy() | |
for (let selection of this.selections.slice()) { | |
selection.destroy() | |
} | |
this.buffer.release() | |
this.gutterContainer.destroy() | |
this.emitter.emit('did-destroy') | |
this.emitter.clear() | |
if (this.component) this.component.element.component = null | |
this.component = null | |
this.lineNumberGutter.element = null | |
} | |
isAlive () { return this.alive } | |
isDestroyed () { return !this.alive } | |
/* | |
Section: Event Subscription | |
*/ | |
// Essential: Calls your `callback` when the buffer's title has changed. | |
// | |
// * `callback` {Function} | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidChangeTitle (callback) { | |
return this.emitter.on('did-change-title', callback) | |
} | |
// Essential: Calls your `callback` when the buffer's path, and therefore title, has changed. | |
// | |
// * `callback` {Function} | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidChangePath (callback) { | |
return this.emitter.on('did-change-path', callback) | |
} | |
// Essential: Invoke the given callback synchronously when the content of the | |
// buffer changes. | |
// | |
// Because observers are invoked synchronously, it's important not to perform | |
// any expensive operations via this method. Consider {::onDidStopChanging} to | |
// delay expensive operations until after changes stop occurring. | |
// | |
// * `callback` {Function} | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidChange (callback) { | |
return this.emitter.on('did-change', callback) | |
} | |
// Essential: Invoke `callback` when the buffer's contents change. It is | |
// emit asynchronously 300ms after the last buffer change. This is a good place | |
// to handle changes to the buffer without compromising typing performance. | |
// | |
// * `callback` {Function} | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidStopChanging (callback) { | |
return this.getBuffer().onDidStopChanging(callback) | |
} | |
// Essential: Calls your `callback` when a {Cursor} is moved. If there are | |
// multiple cursors, your callback will be called for each cursor. | |
// | |
// * `callback` {Function} | |
// * `event` {Object} | |
// * `oldBufferPosition` {Point} | |
// * `oldScreenPosition` {Point} | |
// * `newBufferPosition` {Point} | |
// * `newScreenPosition` {Point} | |
// * `textChanged` {Boolean} | |
// * `cursor` {Cursor} that triggered the event | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidChangeCursorPosition (callback) { | |
return this.emitter.on('did-change-cursor-position', callback) | |
} | |
// Essential: Calls your `callback` when a selection's screen range changes. | |
// | |
// * `callback` {Function} | |
// * `event` {Object} | |
// * `oldBufferRange` {Range} | |
// * `oldScreenRange` {Range} | |
// * `newBufferRange` {Range} | |
// * `newScreenRange` {Range} | |
// * `selection` {Selection} that triggered the event | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidChangeSelectionRange (callback) { | |
return this.emitter.on('did-change-selection-range', callback) | |
} | |
// Extended: Calls your `callback` when soft wrap was enabled or disabled. | |
// | |
// * `callback` {Function} | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidChangeSoftWrapped (callback) { | |
return this.emitter.on('did-change-soft-wrapped', callback) | |
} | |
// Extended: Calls your `callback` when the buffer's encoding has changed. | |
// | |
// * `callback` {Function} | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidChangeEncoding (callback) { | |
return this.emitter.on('did-change-encoding', callback) | |
} | |
// Extended: Calls your `callback` when the grammar that interprets and | |
// colorizes the text has been changed. Immediately calls your callback with | |
// the current grammar. | |
// | |
// * `callback` {Function} | |
// * `grammar` {Grammar} | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
observeGrammar (callback) { | |
callback(this.getGrammar()) | |
return this.onDidChangeGrammar(callback) | |
} | |
// Extended: Calls your `callback` when the grammar that interprets and | |
// colorizes the text has been changed. | |
// | |
// * `callback` {Function} | |
// * `grammar` {Grammar} | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidChangeGrammar (callback) { | |
return this.buffer.onDidChangeLanguageMode(() => { | |
callback(this.buffer.getLanguageMode().grammar) | |
}) | |
} | |
// Extended: Calls your `callback` when the result of {::isModified} changes. | |
// | |
// * `callback` {Function} | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidChangeModified (callback) { | |
return this.getBuffer().onDidChangeModified(callback) | |
} | |
// Extended: Calls your `callback` when the buffer's underlying file changes on | |
// disk at a moment when the result of {::isModified} is true. | |
// | |
// * `callback` {Function} | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidConflict (callback) { | |
return this.getBuffer().onDidConflict(callback) | |
} | |
// Extended: Calls your `callback` before text has been inserted. | |
// | |
// * `callback` {Function} | |
// * `event` event {Object} | |
// * `text` {String} text to be inserted | |
// * `cancel` {Function} Call to prevent the text from being inserted | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onWillInsertText (callback) { | |
return this.emitter.on('will-insert-text', callback) | |
} | |
// Extended: Calls your `callback` after text has been inserted. | |
// | |
// * `callback` {Function} | |
// * `event` event {Object} | |
// * `text` {String} text to be inserted | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidInsertText (callback) { | |
return this.emitter.on('did-insert-text', callback) | |
} | |
// Essential: Invoke the given callback after the buffer is saved to disk. | |
// | |
// * `callback` {Function} to be called after the buffer is saved. | |
// * `event` {Object} with the following keys: | |
// * `path` The path to which the buffer was saved. | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidSave (callback) { | |
return this.getBuffer().onDidSave(callback) | |
} | |
// Essential: Invoke the given callback when the editor is destroyed. | |
// | |
// * `callback` {Function} to be called when the editor is destroyed. | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidDestroy (callback) { | |
return this.emitter.once('did-destroy', callback) | |
} | |
// Extended: Calls your `callback` when a {Cursor} is added to the editor. | |
// Immediately calls your callback for each existing cursor. | |
// | |
// * `callback` {Function} | |
// * `cursor` {Cursor} that was added | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
observeCursors (callback) { | |
this.getCursors().forEach(callback) | |
return this.onDidAddCursor(callback) | |
} | |
// Extended: Calls your `callback` when a {Cursor} is added to the editor. | |
// | |
// * `callback` {Function} | |
// * `cursor` {Cursor} that was added | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidAddCursor (callback) { | |
return this.emitter.on('did-add-cursor', callback) | |
} | |
// Extended: Calls your `callback` when a {Cursor} is removed from the editor. | |
// | |
// * `callback` {Function} | |
// * `cursor` {Cursor} that was removed | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidRemoveCursor (callback) { | |
return this.emitter.on('did-remove-cursor', callback) | |
} | |
// Extended: Calls your `callback` when a {Selection} is added to the editor. | |
// Immediately calls your callback for each existing selection. | |
// | |
// * `callback` {Function} | |
// * `selection` {Selection} that was added | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
observeSelections (callback) { | |
this.getSelections().forEach(callback) | |
return this.onDidAddSelection(callback) | |
} | |
// Extended: Calls your `callback` when a {Selection} is added to the editor. | |
// | |
// * `callback` {Function} | |
// * `selection` {Selection} that was added | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidAddSelection (callback) { | |
return this.emitter.on('did-add-selection', callback) | |
} | |
// Extended: Calls your `callback` when a {Selection} is removed from the editor. | |
// | |
// * `callback` {Function} | |
// * `selection` {Selection} that was removed | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidRemoveSelection (callback) { | |
return this.emitter.on('did-remove-selection', callback) | |
} | |
// Extended: Calls your `callback` with each {Decoration} added to the editor. | |
// Calls your `callback` immediately for any existing decorations. | |
// | |
// * `callback` {Function} | |
// * `decoration` {Decoration} | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
observeDecorations (callback) { | |
return this.decorationManager.observeDecorations(callback) | |
} | |
// Extended: Calls your `callback` when a {Decoration} is added to the editor. | |
// | |
// * `callback` {Function} | |
// * `decoration` {Decoration} that was added | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidAddDecoration (callback) { | |
return this.decorationManager.onDidAddDecoration(callback) | |
} | |
// Extended: Calls your `callback` when a {Decoration} is removed from the editor. | |
// | |
// * `callback` {Function} | |
// * `decoration` {Decoration} that was removed | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidRemoveDecoration (callback) { | |
return this.decorationManager.onDidRemoveDecoration(callback) | |
} | |
// Called by DecorationManager when a decoration is added. | |
didAddDecoration (decoration) { | |
if (this.component && decoration.isType('block')) { | |
this.component.addBlockDecoration(decoration) | |
} | |
} | |
// Extended: Calls your `callback` when the placeholder text is changed. | |
// | |
// * `callback` {Function} | |
// * `placeholderText` {String} new text | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidChangePlaceholderText (callback) { | |
return this.emitter.on('did-change-placeholder-text', callback) | |
} | |
onDidChangeScrollTop (callback) { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::onDidChangeScrollTop instead.') | |
return this.getElement().onDidChangeScrollTop(callback) | |
} | |
onDidChangeScrollLeft (callback) { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::onDidChangeScrollLeft instead.') | |
return this.getElement().onDidChangeScrollLeft(callback) | |
} | |
onDidRequestAutoscroll (callback) { | |
return this.emitter.on('did-request-autoscroll', callback) | |
} | |
// TODO Remove once the tabs package no longer uses .on subscriptions | |
onDidChangeIcon (callback) { | |
return this.emitter.on('did-change-icon', callback) | |
} | |
onDidUpdateDecorations (callback) { | |
return this.decorationManager.onDidUpdateDecorations(callback) | |
} | |
// Essential: Retrieves the current {TextBuffer}. | |
getBuffer () { return this.buffer } | |
// Retrieves the current buffer's URI. | |
getURI () { return this.buffer.getUri() } | |
// Create an {TextEditor} with its initial state based on this object | |
copy () { | |
const displayLayer = this.displayLayer.copy() | |
const selectionsMarkerLayer = displayLayer.getMarkerLayer(this.buffer.getMarkerLayer(this.selectionsMarkerLayer.id).copy().id) | |
const softTabs = this.getSoftTabs() | |
return new TextEditor({ | |
buffer: this.buffer, | |
selectionsMarkerLayer, | |
softTabs, | |
suppressCursorCreation: true, | |
tabLength: this.getTabLength(), | |
initialScrollTopRow: this.getScrollTopRow(), | |
initialScrollLeftColumn: this.getScrollLeftColumn(), | |
assert: this.assert, | |
displayLayer, | |
grammar: this.getGrammar(), | |
autoWidth: this.autoWidth, | |
autoHeight: this.autoHeight, | |
showCursorOnSelection: this.showCursorOnSelection | |
}) | |
} | |
// Controls visibility based on the given {Boolean}. | |
setVisible (visible) { | |
if (visible) { | |
const languageMode = this.buffer.getLanguageMode() | |
if (languageMode.startTokenizing) languageMode.startTokenizing() | |
} | |
} | |
setMini (mini) { | |
this.update({mini}) | |
} | |
isMini () { return this.mini } | |
onDidChangeMini (callback) { | |
return this.emitter.on('did-change-mini', callback) | |
} | |
setLineNumberGutterVisible (lineNumberGutterVisible) { this.update({lineNumberGutterVisible}) } | |
isLineNumberGutterVisible () { return this.lineNumberGutter.isVisible() } | |
onDidChangeLineNumberGutterVisible (callback) { | |
return this.emitter.on('did-change-line-number-gutter-visible', callback) | |
} | |
// Essential: Calls your `callback` when a {Gutter} is added to the editor. | |
// Immediately calls your callback for each existing gutter. | |
// | |
// * `callback` {Function} | |
// * `gutter` {Gutter} that currently exists/was added. | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
observeGutters (callback) { | |
return this.gutterContainer.observeGutters(callback) | |
} | |
// Essential: Calls your `callback` when a {Gutter} is added to the editor. | |
// | |
// * `callback` {Function} | |
// * `gutter` {Gutter} that was added. | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidAddGutter (callback) { | |
return this.gutterContainer.onDidAddGutter(callback) | |
} | |
// Essential: Calls your `callback` when a {Gutter} is removed from the editor. | |
// | |
// * `callback` {Function} | |
// * `name` The name of the {Gutter} that was removed. | |
// | |
// Returns a {Disposable} on which `.dispose()` can be called to unsubscribe. | |
onDidRemoveGutter (callback) { | |
return this.gutterContainer.onDidRemoveGutter(callback) | |
} | |
// Set the number of characters that can be displayed horizontally in the | |
// editor. | |
// | |
// * `editorWidthInChars` A {Number} representing the width of the | |
// {TextEditorElement} in characters. | |
setEditorWidthInChars (editorWidthInChars) { this.update({editorWidthInChars}) } | |
// Returns the editor width in characters. | |
getEditorWidthInChars () { | |
if (this.width != null && this.defaultCharWidth > 0) { | |
return Math.max(0, Math.floor(this.width / this.defaultCharWidth)) | |
} else { | |
return this.editorWidthInChars | |
} | |
} | |
/* | |
Section: File Details | |
*/ | |
// Essential: Get the editor's title for display in other parts of the | |
// UI such as the tabs. | |
// | |
// If the editor's buffer is saved, its title is the file name. If it is | |
// unsaved, its title is "untitled". | |
// | |
// Returns a {String}. | |
getTitle () { | |
return this.getFileName() || 'untitled' | |
} | |
// Essential: Get unique title for display in other parts of the UI, such as | |
// the window title. | |
// | |
// If the editor's buffer is unsaved, its title is "untitled" | |
// If the editor's buffer is saved, its unique title is formatted as one | |
// of the following, | |
// * "<filename>" when it is the only editing buffer with this file name. | |
// * "<filename> — <unique-dir-prefix>" when other buffers have this file name. | |
// | |
// Returns a {String} | |
getLongTitle () { | |
if (this.getPath()) { | |
const fileName = this.getFileName() | |
let myPathSegments | |
const openEditorPathSegmentsWithSameFilename = [] | |
for (const textEditor of atom.workspace.getTextEditors()) { | |
if (textEditor.getFileName() === fileName) { | |
const pathSegments = fs.tildify(textEditor.getDirectoryPath()).split(get_path().sep) | |
openEditorPathSegmentsWithSameFilename.push(pathSegments) | |
if (textEditor === this) myPathSegments = pathSegments | |
} | |
} | |
if (!myPathSegments || openEditorPathSegmentsWithSameFilename.length === 1) return fileName | |
let commonPathSegmentCount | |
for (let i = 0, {length} = myPathSegments; i < length; i++) { | |
const myPathSegment = myPathSegments[i] | |
if (openEditorPathSegmentsWithSameFilename.some(segments => (segments.length === i + 1) || (segments[i] !== myPathSegment))) { | |
commonPathSegmentCount = i | |
break | |
} | |
} | |
return `${fileName} \u2014 ${get_path().join(...myPathSegments.slice(commonPathSegmentCount))}`; | |
} else { | |
return 'untitled' | |
} | |
} | |
// Essential: Returns the {String} path of this editor's text buffer. | |
getPath () { | |
return this.buffer.getPath() | |
} | |
getFileName () { | |
const fullPath = this.getPath() | |
if (fullPath) return get_path().basename(fullPath); | |
} | |
getDirectoryPath () { | |
const fullPath = this.getPath() | |
if (fullPath) return get_path().dirname(fullPath); | |
} | |
// Extended: Returns the {String} character set encoding of this editor's text | |
// buffer. | |
getEncoding () { return this.buffer.getEncoding() } | |
// Extended: Set the character set encoding to use in this editor's text | |
// buffer. | |
// | |
// * `encoding` The {String} character set encoding name such as 'utf8' | |
setEncoding (encoding) { this.buffer.setEncoding(encoding) } | |
// Essential: Returns {Boolean} `true` if this editor has been modified. | |
isModified () { return this.buffer.isModified() } | |
// Essential: Returns {Boolean} `true` if this editor has no content. | |
isEmpty () { return this.buffer.isEmpty() } | |
/* | |
Section: File Operations | |
*/ | |
// Essential: Saves the editor's text buffer. | |
// | |
// See {TextBuffer::save} for more details. | |
save () { return this.buffer.save() } | |
// Essential: Saves the editor's text buffer as the given path. | |
// | |
// See {TextBuffer::saveAs} for more details. | |
// | |
// * `filePath` A {String} path. | |
saveAs (filePath) { return this.buffer.saveAs(filePath) } | |
// Determine whether the user should be prompted to save before closing | |
// this editor. | |
shouldPromptToSave ({windowCloseRequested, projectHasPaths} = {}) { | |
if (windowCloseRequested && projectHasPaths && atom.stateStore.isConnected()) { | |
return this.buffer.isInConflict() | |
} else { | |
return this.isModified() && !this.buffer.hasMultipleEditors() | |
} | |
} | |
// Returns an {Object} to configure dialog shown when this editor is saved | |
// via {Pane::saveItemAs}. | |
getSaveDialogOptions () { return {} } | |
/* | |
Section: Reading Text | |
*/ | |
// Essential: Returns a {String} representing the entire contents of the editor. | |
getText () { return this.buffer.getText() } | |
// Essential: Get the text in the given {Range} in buffer coordinates. | |
// | |
// * `range` A {Range} or range-compatible {Array}. | |
// | |
// Returns a {String}. | |
getTextInBufferRange (range) { | |
return this.buffer.getTextInRange(range) | |
} | |
// Essential: Returns a {Number} representing the number of lines in the buffer. | |
getLineCount () { return this.buffer.getLineCount() } | |
// Essential: Returns a {Number} representing the number of screen lines in the | |
// editor. This accounts for folds. | |
getScreenLineCount () { return this.displayLayer.getScreenLineCount() } | |
getApproximateScreenLineCount () { return this.displayLayer.getApproximateScreenLineCount() } | |
// Essential: Returns a {Number} representing the last zero-indexed buffer row | |
// number of the editor. | |
getLastBufferRow () { return this.buffer.getLastRow() } | |
// Essential: Returns a {Number} representing the last zero-indexed screen row | |
// number of the editor. | |
getLastScreenRow () { return this.getScreenLineCount() - 1 } | |
// Essential: Returns a {String} representing the contents of the line at the | |
// given buffer row. | |
// | |
// * `bufferRow` A {Number} representing a zero-indexed buffer row. | |
lineTextForBufferRow (bufferRow) { return this.buffer.lineForRow(bufferRow) } | |
// Essential: Returns a {String} representing the contents of the line at the | |
// given screen row. | |
// | |
// * `screenRow` A {Number} representing a zero-indexed screen row. | |
lineTextForScreenRow (screenRow) { | |
const screenLine = this.screenLineForScreenRow(screenRow) | |
if (screenLine) return screenLine.lineText | |
} | |
logScreenLines (start = 0, end = this.getLastScreenRow()) { | |
for (let row = start; row <= end; row++) { | |
const line = this.lineTextForScreenRow(row) | |
get_console().log(row, this.bufferRowForScreenRow(row), line, line.length) | |
} | |
} | |
tokensForScreenRow (screenRow) { | |
const tokens = [] | |
let lineTextIndex = 0 | |
const currentTokenScopes = [] | |
const {lineText, tags} = this.screenLineForScreenRow(screenRow) | |
for (const tag of tags) { | |
if (this.displayLayer.isOpenTag(tag)) { | |
currentTokenScopes.push(this.displayLayer.classNameForTag(tag)) | |
} else if (this.displayLayer.isCloseTag(tag)) { | |
currentTokenScopes.pop() | |
} else { | |
tokens.push({ | |
text: lineText.substr(lineTextIndex, tag), | |
scopes: currentTokenScopes.slice() | |
}) | |
lineTextIndex += tag | |
} | |
} | |
return tokens | |
} | |
screenLineForScreenRow (screenRow) { | |
return this.displayLayer.getScreenLine(screenRow) | |
} | |
bufferRowForScreenRow (screenRow) { | |
return this.displayLayer.translateScreenPosition(Point(screenRow, 0)).row | |
} | |
bufferRowsForScreenRows (startScreenRow, endScreenRow) { | |
return this.displayLayer.bufferRowsForScreenRows(startScreenRow, endScreenRow + 1) | |
} | |
screenRowForBufferRow (row) { | |
return this.displayLayer.translateBufferPosition(Point(row, 0)).row | |
} | |
getRightmostScreenPosition () { return this.displayLayer.getRightmostScreenPosition() } | |
getApproximateRightmostScreenPosition () { return this.displayLayer.getApproximateRightmostScreenPosition() } | |
getMaxScreenLineLength () { return this.getRightmostScreenPosition().column } | |
getLongestScreenRow () { return this.getRightmostScreenPosition().row } | |
getApproximateLongestScreenRow () { return this.getApproximateRightmostScreenPosition().row } | |
lineLengthForScreenRow (screenRow) { return this.displayLayer.lineLengthForScreenRow(screenRow) } | |
// Returns the range for the given buffer row. | |
// | |
// * `row` A row {Number}. | |
// * `options` (optional) An options hash with an `includeNewline` key. | |
// | |
// Returns a {Range}. | |
bufferRangeForBufferRow (row, options) { | |
return this.buffer.rangeForRow(row, options && options.includeNewline) | |
} | |
// Get the text in the given {Range}. | |
// | |
// Returns a {String}. | |
getTextInRange (range) { return this.buffer.getTextInRange(range) } | |
// {Delegates to: TextBuffer.isRowBlank} | |
isBufferRowBlank (bufferRow) { return this.buffer.isRowBlank(bufferRow) } | |
// {Delegates to: TextBuffer.nextNonBlankRow} | |
nextNonBlankBufferRow (bufferRow) { return this.buffer.nextNonBlankRow(bufferRow) } | |
// {Delegates to: TextBuffer.getEndPosition} | |
getEofBufferPosition () { return this.buffer.getEndPosition() } | |
// Essential: Get the {Range} of the paragraph surrounding the most recently added | |
// cursor. | |
// | |
// Returns a {Range}. | |
getCurrentParagraphBufferRange () { | |
return this.getLastCursor().getCurrentParagraphBufferRange() | |
} | |
/* | |
Section: Mutating Text | |
*/ | |
// Essential: Replaces the entire contents of the buffer with the given {String}. | |
// | |
// * `text` A {String} to replace with | |
setText (text) { return this.buffer.setText(text) } | |
// Essential: Set the text in the given {Range} in buffer coordinates. | |
// | |
// * `range` A {Range} or range-compatible {Array}. | |
// * `text` A {String} | |
// * `options` (optional) {Object} | |
// * `normalizeLineEndings` (optional) {Boolean} (default: true) | |
// * `undo` (optional) {String} 'skip' will skip the undo system | |
// | |
// Returns the {Range} of the newly-inserted text. | |
setTextInBufferRange (range, text, options) { | |
return this.getBuffer().setTextInRange(range, text, options) | |
} | |
// Essential: For each selection, replace the selected text with the given text. | |
// | |
// * `text` A {String} representing the text to insert. | |
// * `options` (optional) See {Selection::insertText}. | |
// | |
// Returns a {Range} when the text has been inserted | |
// Returns a {Boolean} false when the text has not been inserted | |
insertText (text, options = {}) { | |
if (!this.emitWillInsertTextEvent(text)) return false | |
const groupingInterval = options.groupUndo ? this.undoGroupingInterval : 0 | |
if (options.autoIndentNewline == null) options.autoIndentNewline = this.shouldAutoIndent() | |
if (options.autoDecreaseIndent == null) options.autoDecreaseIndent = this.shouldAutoIndent() | |
return this.mutateSelectedText(selection => { | |
const range = selection.insertText(text, options) | |
const didInsertEvent = {text, range} | |
this.emitter.emit('did-insert-text', didInsertEvent) | |
return range | |
}, groupingInterval) | |
} | |
// Essential: For each selection, replace the selected text with a newline. | |
insertNewline (options) { | |
return this.insertText('\n', options) | |
} | |
// Essential: For each selection, if the selection is empty, delete the character | |
// following the cursor. Otherwise delete the selected text. | |
delete () { | |
return this.mutateSelectedText(selection => selection.delete()) | |
} | |
// Essential: For each selection, if the selection is empty, delete the character | |
// preceding the cursor. Otherwise delete the selected text. | |
backspace () { | |
return this.mutateSelectedText(selection => selection.backspace()) | |
} | |
// Extended: Mutate the text of all the selections in a single transaction. | |
// | |
// All the changes made inside the given {Function} can be reverted with a | |
// single call to {::undo}. | |
// | |
// * `fn` A {Function} that will be called once for each {Selection}. The first | |
// argument will be a {Selection} and the second argument will be the | |
// {Number} index of that selection. | |
mutateSelectedText (fn, groupingInterval = 0) { | |
return this.mergeIntersectingSelections(() => { | |
return this.transact(groupingInterval, () => { | |
return this.getSelectionsOrderedByBufferPosition().map((selection, index) => fn(selection, index)) | |
}) | |
}) | |
} | |
// Move lines intersecting the most recent selection or multiple selections | |
// up by one row in screen coordinates. | |
moveLineUp () { | |
const selections = this.getSelectedBufferRanges().sort((a, b) => a.compare(b)) | |
if (selections[0].start.row === 0) return | |
if (selections[selections.length - 1].start.row === this.getLastBufferRow() && this.buffer.getLastLine() === '') return | |
this.transact(() => { | |
const newSelectionRanges = [] | |
while (selections.length > 0) { | |
// Find selections spanning a contiguous set of lines | |
const selection = selections.shift() | |
const selectionsToMove = [selection] | |
while (selection.end.row === (selections[0] != null ? selections[0].start.row : undefined)) { | |
selectionsToMove.push(selections[0]) | |
selection.end.row = selections[0].end.row | |
selections.shift() | |
} | |
// Compute the buffer range spanned by all these selections, expanding it | |
// so that it includes any folded region that intersects them. | |
let startRow = selection.start.row | |
let endRow = selection.end.row | |
if (selection.end.row > selection.start.row && selection.end.column === 0) { | |
// Don't move the last line of a multi-line selection if the selection ends at column 0 | |
endRow-- | |
} | |
startRow = this.displayLayer.findBoundaryPrecedingBufferRow(startRow) | |
endRow = this.displayLayer.findBoundaryFollowingBufferRow(endRow + 1) | |
const linesRange = new Range(Point(startRow, 0), Point(endRow, 0)) | |
// If selected line range is preceded by a fold, one line above on screen | |
// could be multiple lines in the buffer. | |
const precedingRow = this.displayLayer.findBoundaryPrecedingBufferRow(startRow - 1) | |
const insertDelta = linesRange.start.row - precedingRow | |
// Any folds in the text that is moved will need to be re-created. | |
// It includes the folds that were intersecting with the selection. | |
const rangesToRefold = this.displayLayer | |
.destroyFoldsIntersectingBufferRange(linesRange) | |
.map(range => range.translate([-insertDelta, 0])) | |
// Delete lines spanned by selection and insert them on the preceding buffer row | |
let lines = this.buffer.getTextInRange(linesRange) | |
if (lines[lines.length - 1] !== '\n') { lines += this.buffer.lineEndingForRow(linesRange.end.row - 2) } | |
this.buffer.delete(linesRange) | |
this.buffer.insert([precedingRow, 0], lines) | |
// Restore folds that existed before the lines were moved | |
for (let rangeToRefold of rangesToRefold) { | |
this.displayLayer.foldBufferRange(rangeToRefold) | |
} | |
for (const selectionToMove of selectionsToMove) { | |
newSelectionRanges.push(selectionToMove.translate([-insertDelta, 0])) | |
} | |
} | |
this.setSelectedBufferRanges(newSelectionRanges, {autoscroll: false, preserveFolds: true}) | |
if (this.shouldAutoIndent()) this.autoIndentSelectedRows() | |
this.scrollToBufferPosition([newSelectionRanges[0].start.row, 0]) | |
}) | |
} | |
// Move lines intersecting the most recent selection or multiple selections | |
// down by one row in screen coordinates. | |
moveLineDown () { | |
const selections = this.getSelectedBufferRanges() | |
selections.sort((a, b) => b.compare(a)) | |
this.transact(() => { | |
this.consolidateSelections() | |
const newSelectionRanges = [] | |
while (selections.length > 0) { | |
// Find selections spanning a contiguous set of lines | |
const selection = selections.shift() | |
const selectionsToMove = [selection] | |
// if the current selection start row matches the next selections' end row - make them one selection | |
while (selection.start.row === (selections[0] != null ? selections[0].end.row : undefined)) { | |
selectionsToMove.push(selections[0]) | |
selection.start.row = selections[0].start.row | |
selections.shift() | |
} | |
// Compute the buffer range spanned by all these selections, expanding it | |
// so that it includes any folded region that intersects them. | |
let startRow = selection.start.row | |
let endRow = selection.end.row | |
if (selection.end.row > selection.start.row && selection.end.column === 0) { | |
// Don't move the last line of a multi-line selection if the selection ends at column 0 | |
endRow-- | |
} | |
startRow = this.displayLayer.findBoundaryPrecedingBufferRow(startRow) | |
endRow = this.displayLayer.findBoundaryFollowingBufferRow(endRow + 1) | |
const linesRange = new Range(Point(startRow, 0), Point(endRow, 0)) | |
// If selected line range is followed by a fold, one line below on screen | |
// could be multiple lines in the buffer. But at the same time, if the | |
// next buffer row is wrapped, one line in the buffer can represent many | |
// screen rows. | |
const followingRow = Math.min(this.buffer.getLineCount(), this.displayLayer.findBoundaryFollowingBufferRow(endRow + 1)) | |
const insertDelta = followingRow - linesRange.end.row | |
// Any folds in the text that is moved will need to be re-created. | |
// It includes the folds that were intersecting with the selection. | |
const rangesToRefold = this.displayLayer | |
.destroyFoldsIntersectingBufferRange(linesRange) | |
.map(range => range.translate([insertDelta, 0])) | |
// Delete lines spanned by selection and insert them on the following correct buffer row | |
let lines = this.buffer.getTextInRange(linesRange) | |
if (followingRow - 1 === this.buffer.getLastRow()) { | |
lines = `\n${lines}` | |
} | |
this.buffer.insert([followingRow, 0], lines) | |
this.buffer.delete(linesRange) | |
// Restore folds that existed before the lines were moved | |
for (let rangeToRefold of rangesToRefold) { | |
this.displayLayer.foldBufferRange(rangeToRefold) | |
} | |
for (const selectionToMove of selectionsToMove) { | |
newSelectionRanges.push(selectionToMove.translate([insertDelta, 0])) | |
} | |
} | |
this.setSelectedBufferRanges(newSelectionRanges, {autoscroll: false, preserveFolds: true}) | |
if (this.shouldAutoIndent()) this.autoIndentSelectedRows() | |
this.scrollToBufferPosition([newSelectionRanges[0].start.row - 1, 0]) | |
}) | |
} | |
// Move any active selections one column to the left. | |
moveSelectionLeft () { | |
const selections = this.getSelectedBufferRanges() | |
const noSelectionAtStartOfLine = selections.every(selection => selection.start.column !== 0) | |
const translationDelta = [0, -1] | |
const translatedRanges = [] | |
if (noSelectionAtStartOfLine) { | |
this.transact(() => { | |
for (let selection of selections) { | |
const charToLeftOfSelection = new Range(selection.start.translate(translationDelta), selection.start) | |
const charTextToLeftOfSelection = this.buffer.getTextInRange(charToLeftOfSelection) | |
this.buffer.insert(selection.end, charTextToLeftOfSelection) | |
this.buffer.delete(charToLeftOfSelection) | |
translatedRanges.push(selection.translate(translationDelta)) | |
} | |
this.setSelectedBufferRanges(translatedRanges) | |
}) | |
} | |
} | |
// Move any active selections one column to the right. | |
moveSelectionRight () { | |
const selections = this.getSelectedBufferRanges() | |
const noSelectionAtEndOfLine = selections.every(selection => { | |
return selection.end.column !== this.buffer.lineLengthForRow(selection.end.row) | |
}) | |
const translationDelta = [0, 1] | |
const translatedRanges = [] | |
if (noSelectionAtEndOfLine) { | |
this.transact(() => { | |
for (let selection of selections) { | |
const charToRightOfSelection = new Range(selection.end, selection.end.translate(translationDelta)) | |
const charTextToRightOfSelection = this.buffer.getTextInRange(charToRightOfSelection) | |
this.buffer.delete(charToRightOfSelection) | |
this.buffer.insert(selection.start, charTextToRightOfSelection) | |
translatedRanges.push(selection.translate(translationDelta)) | |
} | |
this.setSelectedBufferRanges(translatedRanges) | |
}) | |
} | |
} | |
duplicateLines () { | |
this.transact(() => { | |
const selections = this.getSelectionsOrderedByBufferPosition() | |
const previousSelectionRanges = [] | |
let i = selections.length - 1 | |
while (i >= 0) { | |
const j = i | |
previousSelectionRanges[i] = selections[i].getBufferRange() | |
if (selections[i].isEmpty()) { | |
const {start} = selections[i].getScreenRange() | |
selections[i].setScreenRange([[start.row, 0], [start.row + 1, 0]], {preserveFolds: true}) | |
} | |
let [startRow, endRow] = selections[i].getBufferRowRange() | |
endRow++ | |
while (i > 0) { | |
const [previousSelectionStartRow, previousSelectionEndRow] = selections[i - 1].getBufferRowRange() | |
if (previousSelectionEndRow === startRow) { | |
startRow = previousSelectionStartRow | |
previousSelectionRanges[i - 1] = selections[i - 1].getBufferRange() | |
i-- | |
} else { | |
break | |
} | |
} | |
const intersectingFolds = this.displayLayer.foldsIntersectingBufferRange([[startRow, 0], [endRow, 0]]) | |
let textToDuplicate = this.getTextInBufferRange([[startRow, 0], [endRow, 0]]) | |
if (endRow > this.getLastBufferRow()) textToDuplicate = `\n${textToDuplicate}` | |
this.buffer.insert([endRow, 0], textToDuplicate) | |
const insertedRowCount = endRow - startRow | |
for (let k = i; k <= j; k++) { | |
selections[k].setBufferRange(previousSelectionRanges[k].translate([insertedRowCount, 0])) | |
} | |
for (const fold of intersectingFolds) { | |
const foldRange = this.displayLayer.bufferRangeForFold(fold) | |
this.displayLayer.foldBufferRange(foldRange.translate([insertedRowCount, 0])) | |
} | |
i-- | |
} | |
}) | |
} | |
replaceSelectedText (options, fn) { | |
this.mutateSelectedText((selection) => { | |
selection.getBufferRange() | |
if (options && options.selectWordIfEmpty && selection.isEmpty()) { | |
selection.selectWord() | |
} | |
const text = selection.getText() | |
selection.deleteSelectedText() | |
const range = selection.insertText(fn(text)) | |
selection.setBufferRange(range) | |
}) | |
} | |
// Split multi-line selections into one selection per line. | |
// | |
// Operates on all selections. This method breaks apart all multi-line | |
// selections to create multiple single-line selections that cumulatively cover | |
// the same original area. | |
splitSelectionsIntoLines () { | |
this.mergeIntersectingSelections(() => { | |
for (const selection of this.getSelections()) { | |
const range = selection.getBufferRange() | |
if (range.isSingleLine()) continue | |
const {start, end} = range | |
this.addSelectionForBufferRange([start, [start.row, Infinity]]) | |
let {row} = start | |
while (++row < end.row) { | |
this.addSelectionForBufferRange([[row, 0], [row, Infinity]]) | |
} | |
if (end.column !== 0) this.addSelectionForBufferRange([[end.row, 0], [end.row, end.column]]) | |
selection.destroy() | |
} | |
}) | |
} | |
// Extended: For each selection, transpose the selected text. | |
// | |
// If the selection is empty, the characters preceding and following the cursor | |
// are swapped. Otherwise, the selected characters are reversed. | |
transpose () { | |
this.mutateSelectedText(selection => { | |
if (selection.isEmpty()) { | |
selection.selectRight() | |
const text = selection.getText() | |
selection.delete() | |
selection.cursor.moveLeft() | |
selection.insertText(text) | |
} else { | |
selection.insertText(selection.getText().split('').reverse().join('')) | |
} | |
}) | |
} | |
// Extended: Convert the selected text to upper case. | |
// | |
// For each selection, if the selection is empty, converts the containing word | |
// to upper case. Otherwise convert the selected text to upper case. | |
upperCase () { | |
this.replaceSelectedText({selectWordIfEmpty: true}, text => text.toUpperCase()) | |
} | |
// Extended: Convert the selected text to lower case. | |
// | |
// For each selection, if the selection is empty, converts the containing word | |
// to upper case. Otherwise convert the selected text to upper case. | |
lowerCase () { | |
this.replaceSelectedText({selectWordIfEmpty: true}, text => text.toLowerCase()) | |
} | |
// Extended: Toggle line comments for rows intersecting selections. | |
// | |
// If the current grammar doesn't support comments, does nothing. | |
toggleLineCommentsInSelection () { | |
this.mutateSelectedText(selection => selection.toggleLineComments()) | |
} | |
// Convert multiple lines to a single line. | |
// | |
// Operates on all selections. If the selection is empty, joins the current | |
// line with the next line. Otherwise it joins all lines that intersect the | |
// selection. | |
// | |
// Joining a line means that multiple lines are converted to a single line with | |
// the contents of each of the original non-empty lines separated by a space. | |
joinLines () { | |
this.mutateSelectedText(selection => selection.joinLines()) | |
} | |
// Extended: For each cursor, insert a newline at beginning the following line. | |
insertNewlineBelow () { | |
this.transact(() => { | |
this.moveToEndOfLine() | |
this.insertNewline() | |
}) | |
} | |
// Extended: For each cursor, insert a newline at the end of the preceding line. | |
insertNewlineAbove () { | |
this.transact(() => { | |
const bufferRow = this.getCursorBufferPosition().row | |
const indentLevel = this.indentationForBufferRow(bufferRow) | |
const onFirstLine = bufferRow === 0 | |
this.moveToBeginningOfLine() | |
this.moveLeft() | |
this.insertNewline() | |
if (this.shouldAutoIndent() && (this.indentationForBufferRow(bufferRow) < indentLevel)) { | |
this.setIndentationForBufferRow(bufferRow, indentLevel) | |
} | |
if (onFirstLine) { | |
this.moveUp() | |
this.moveToEndOfLine() | |
} | |
}) | |
} | |
// Extended: For each selection, if the selection is empty, delete all characters | |
// of the containing word that precede the cursor. Otherwise delete the | |
// selected text. | |
deleteToBeginningOfWord () { | |
this.mutateSelectedText(selection => selection.deleteToBeginningOfWord()) | |
} | |
// Extended: Similar to {::deleteToBeginningOfWord}, but deletes only back to the | |
// previous word boundary. | |
deleteToPreviousWordBoundary () { | |
this.mutateSelectedText(selection => selection.deleteToPreviousWordBoundary()) | |
} | |
// Extended: Similar to {::deleteToEndOfWord}, but deletes only up to the | |
// next word boundary. | |
deleteToNextWordBoundary () { | |
this.mutateSelectedText(selection => selection.deleteToNextWordBoundary()) | |
} | |
// Extended: For each selection, if the selection is empty, delete all characters | |
// of the containing subword following the cursor. Otherwise delete the selected | |
// text. | |
deleteToBeginningOfSubword () { | |
this.mutateSelectedText(selection => selection.deleteToBeginningOfSubword()) | |
} | |
// Extended: For each selection, if the selection is empty, delete all characters | |
// of the containing subword following the cursor. Otherwise delete the selected | |
// text. | |
deleteToEndOfSubword () { | |
this.mutateSelectedText(selection => selection.deleteToEndOfSubword()) | |
} | |
// Extended: For each selection, if the selection is empty, delete all characters | |
// of the containing line that precede the cursor. Otherwise delete the | |
// selected text. | |
deleteToBeginningOfLine () { | |
this.mutateSelectedText(selection => selection.deleteToBeginningOfLine()) | |
} | |
// Extended: For each selection, if the selection is not empty, deletes the | |
// selection; otherwise, deletes all characters of the containing line | |
// following the cursor. If the cursor is already at the end of the line, | |
// deletes the following newline. | |
deleteToEndOfLine () { | |
this.mutateSelectedText(selection => selection.deleteToEndOfLine()) | |
} | |
// Extended: For each selection, if the selection is empty, delete all characters | |
// of the containing word following the cursor. Otherwise delete the selected | |
// text. | |
deleteToEndOfWord () { | |
this.mutateSelectedText(selection => selection.deleteToEndOfWord()) | |
} | |
// Extended: Delete all lines intersecting selections. | |
deleteLine () { | |
this.mergeSelectionsOnSameRows() | |
this.mutateSelectedText(selection => selection.deleteLine()) | |
} | |
/* | |
Section: History | |
*/ | |
// Essential: Undo the last change. | |
undo () { | |
this.avoidMergingSelections(() => this.buffer.undo()) | |
this.getLastSelection().autoscroll() | |
} | |
// Essential: Redo the last change. | |
redo () { | |
this.avoidMergingSelections(() => this.buffer.redo()) | |
this.getLastSelection().autoscroll() | |
} | |
// Extended: Batch multiple operations as a single undo/redo step. | |
// | |
// Any group of operations that are logically grouped from the perspective of | |
// undoing and redoing should be performed in a transaction. If you want to | |
// abort the transaction, call {::abortTransaction} to terminate the function's | |
// execution and revert any changes performed up to the abortion. | |
// | |
// * `groupingInterval` (optional) The {Number} of milliseconds for which this | |
// transaction should be considered 'groupable' after it begins. If a transaction | |
// with a positive `groupingInterval` is committed while the previous transaction is | |
// still 'groupable', the two transactions are merged with respect to undo and redo. | |
// * `fn` A {Function} to call inside the transaction. | |
transact (groupingInterval, fn) { | |
return this.buffer.transact(groupingInterval, fn) | |
} | |
// Extended: Abort an open transaction, undoing any operations performed so far | |
// within the transaction. | |
abortTransaction () { return this.buffer.abortTransaction() } | |
// Extended: Create a pointer to the current state of the buffer for use | |
// with {::revertToCheckpoint} and {::groupChangesSinceCheckpoint}. | |
// | |
// Returns a checkpoint value. | |
createCheckpoint () { return this.buffer.createCheckpoint() } | |
// Extended: Revert the buffer to the state it was in when the given | |
// checkpoint was created. | |
// | |
// The redo stack will be empty following this operation, so changes since the | |
// checkpoint will be lost. If the given checkpoint is no longer present in the | |
// undo history, no changes will be made to the buffer and this method will | |
// return `false`. | |
// | |
// * `checkpoint` The checkpoint to revert to. | |
// | |
// Returns a {Boolean} indicating whether the operation succeeded. | |
revertToCheckpoint (checkpoint) { return this.buffer.revertToCheckpoint(checkpoint) } | |
// Extended: Group all changes since the given checkpoint into a single | |
// transaction for purposes of undo/redo. | |
// | |
// If the given checkpoint is no longer present in the undo history, no | |
// grouping will be performed and this method will return `false`. | |
// | |
// * `checkpoint` The checkpoint from which to group changes. | |
// | |
// Returns a {Boolean} indicating whether the operation succeeded. | |
groupChangesSinceCheckpoint (checkpoint) { return this.buffer.groupChangesSinceCheckpoint(checkpoint) } | |
/* | |
Section: TextEditor Coordinates | |
*/ | |
// Essential: Convert a position in buffer-coordinates to screen-coordinates. | |
// | |
// The position is clipped via {::clipBufferPosition} prior to the conversion. | |
// The position is also clipped via {::clipScreenPosition} following the | |
// conversion, which only makes a difference when `options` are supplied. | |
// | |
// * `bufferPosition` A {Point} or {Array} of [row, column]. | |
// * `options` (optional) An options hash for {::clipScreenPosition}. | |
// | |
// Returns a {Point}. | |
screenPositionForBufferPosition (bufferPosition, options) { | |
if (options && options.clip) { | |
Grim.deprecate('The `clip` parameter has been deprecated and will be removed soon. Please, use `clipDirection` instead.') | |
if (options.clipDirection) options.clipDirection = options.clip | |
} | |
if (options && options.wrapAtSoftNewlines != null) { | |
Grim.deprecate("The `wrapAtSoftNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.") | |
if (options.clipDirection) options.clipDirection = options.wrapAtSoftNewlines ? 'forward' : 'backward' | |
} | |
if (options && options.wrapBeyondNewlines != null) { | |
Grim.deprecate("The `wrapBeyondNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.") | |
if (options.clipDirection) options.clipDirection = options.wrapBeyondNewlines ? 'forward' : 'backward' | |
} | |
return this.displayLayer.translateBufferPosition(bufferPosition, options) | |
} | |
// Essential: Convert a position in screen-coordinates to buffer-coordinates. | |
// | |
// The position is clipped via {::clipScreenPosition} prior to the conversion. | |
// | |
// * `bufferPosition` A {Point} or {Array} of [row, column]. | |
// * `options` (optional) An options hash for {::clipScreenPosition}. | |
// | |
// Returns a {Point}. | |
bufferPositionForScreenPosition (screenPosition, options) { | |
if (options && options.clip) { | |
Grim.deprecate('The `clip` parameter has been deprecated and will be removed soon. Please, use `clipDirection` instead.') | |
if (options.clipDirection) options.clipDirection = options.clip | |
} | |
if (options && options.wrapAtSoftNewlines != null) { | |
Grim.deprecate("The `wrapAtSoftNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.") | |
if (options.clipDirection) options.clipDirection = options.wrapAtSoftNewlines ? 'forward' : 'backward' | |
} | |
if (options && options.wrapBeyondNewlines != null) { | |
Grim.deprecate("The `wrapBeyondNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.") | |
if (options.clipDirection) options.clipDirection = options.wrapBeyondNewlines ? 'forward' : 'backward' | |
} | |
return this.displayLayer.translateScreenPosition(screenPosition, options) | |
} | |
// Essential: Convert a range in buffer-coordinates to screen-coordinates. | |
// | |
// * `bufferRange` {Range} in buffer coordinates to translate into screen coordinates. | |
// | |
// Returns a {Range}. | |
screenRangeForBufferRange (bufferRange, options) { | |
bufferRange = Range.fromObject(bufferRange) | |
const start = this.screenPositionForBufferPosition(bufferRange.start, options) | |
const end = this.screenPositionForBufferPosition(bufferRange.end, options) | |
return new Range(start, end) | |
} | |
// Essential: Convert a range in screen-coordinates to buffer-coordinates. | |
// | |
// * `screenRange` {Range} in screen coordinates to translate into buffer coordinates. | |
// | |
// Returns a {Range}. | |
bufferRangeForScreenRange (screenRange) { | |
screenRange = Range.fromObject(screenRange) | |
const start = this.bufferPositionForScreenPosition(screenRange.start) | |
const end = this.bufferPositionForScreenPosition(screenRange.end) | |
return new Range(start, end) | |
} | |
// Extended: Clip the given {Point} to a valid position in the buffer. | |
// | |
// If the given {Point} describes a position that is actually reachable by the | |
// cursor based on the current contents of the buffer, it is returned | |
// unchanged. If the {Point} does not describe a valid position, the closest | |
// valid position is returned instead. | |
// | |
// ## Examples | |
// | |
// ```coffee | |
// editor.clipBufferPosition([-1, -1]) # -> `[0, 0]` | |
// | |
// # When the line at buffer row 2 is 10 characters long | |
// editor.clipBufferPosition([2, Infinity]) # -> `[2, 10]` | |
// ``` | |
// | |
// * `bufferPosition` The {Point} representing the position to clip. | |
// | |
// Returns a {Point}. | |
clipBufferPosition (bufferPosition) { return this.buffer.clipPosition(bufferPosition) } | |
// Extended: Clip the start and end of the given range to valid positions in the | |
// buffer. See {::clipBufferPosition} for more information. | |
// | |
// * `range` The {Range} to clip. | |
// | |
// Returns a {Range}. | |
clipBufferRange (range) { return this.buffer.clipRange(range) } | |
// Extended: Clip the given {Point} to a valid position on screen. | |
// | |
// If the given {Point} describes a position that is actually reachable by the | |
// cursor based on the current contents of the screen, it is returned | |
// unchanged. If the {Point} does not describe a valid position, the closest | |
// valid position is returned instead. | |
// | |
// ## Examples | |
// | |
// ```coffee | |
// editor.clipScreenPosition([-1, -1]) # -> `[0, 0]` | |
// | |
// # When the line at screen row 2 is 10 characters long | |
// editor.clipScreenPosition([2, Infinity]) # -> `[2, 10]` | |
// ``` | |
// | |
// * `screenPosition` The {Point} representing the position to clip. | |
// * `options` (optional) {Object} | |
// * `clipDirection` {String} If `'backward'`, returns the first valid | |
// position preceding an invalid position. If `'forward'`, returns the | |
// first valid position following an invalid position. If `'closest'`, | |
// returns the first valid position closest to an invalid position. | |
// Defaults to `'closest'`. | |
// | |
// Returns a {Point}. | |
clipScreenPosition (screenPosition, options) { | |
if (options && options.clip) { | |
Grim.deprecate('The `clip` parameter has been deprecated and will be removed soon. Please, use `clipDirection` instead.') | |
if (options.clipDirection) options.clipDirection = options.clip | |
} | |
if (options && options.wrapAtSoftNewlines != null) { | |
Grim.deprecate("The `wrapAtSoftNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.") | |
if (options.clipDirection) options.clipDirection = options.wrapAtSoftNewlines ? 'forward' : 'backward' | |
} | |
if (options && options.wrapBeyondNewlines != null) { | |
Grim.deprecate("The `wrapBeyondNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.") | |
if (options.clipDirection) options.clipDirection = options.wrapBeyondNewlines ? 'forward' : 'backward' | |
} | |
return this.displayLayer.clipScreenPosition(screenPosition, options) | |
} | |
// Extended: Clip the start and end of the given range to valid positions on screen. | |
// See {::clipScreenPosition} for more information. | |
// | |
// * `range` The {Range} to clip. | |
// * `options` (optional) See {::clipScreenPosition} `options`. | |
// | |
// Returns a {Range}. | |
clipScreenRange (screenRange, options) { | |
screenRange = Range.fromObject(screenRange) | |
const start = this.displayLayer.clipScreenPosition(screenRange.start, options) | |
const end = this.displayLayer.clipScreenPosition(screenRange.end, options) | |
return Range(start, end) | |
} | |
/* | |
Section: Decorations | |
*/ | |
// Essential: Add a decoration that tracks a {DisplayMarker}. When the | |
// marker moves, is invalidated, or is destroyed, the decoration will be | |
// updated to reflect the marker's state. | |
// | |
// The following are the supported decorations types: | |
// | |
// * __line__: Adds your CSS `class` to the line nodes within the range | |
// marked by the marker | |
// * __line-number__: Adds your CSS `class` to the line number nodes within the | |
// range marked by the marker | |
// * __highlight__: Adds a new highlight div to the editor surrounding the | |
// range marked by the marker. When the user selects text, the selection is | |
// visualized with a highlight decoration internally. The structure of this | |
// highlight will be | |
// ```html | |
// <div class="highlight <your-class>"> | |
// <!-- Will be one region for each row in the range. Spans 2 lines? There will be 2 regions. --> | |
// <div class="region"></div> | |
// </div> | |
// ``` | |
// * __overlay__: Positions the view associated with the given item at the head | |
// or tail of the given `DisplayMarker`. | |
// * __gutter__: A decoration that tracks a {DisplayMarker} in a {Gutter}. Gutter | |
// decorations are created by calling {Gutter::decorateMarker} on the | |
// desired `Gutter` instance. | |
// * __block__: Positions the view associated with the given item before or | |
// after the row of the given `TextEditorMarker`. | |
// | |
// ## Arguments | |
// | |
// * `marker` A {DisplayMarker} you want this decoration to follow. | |
// * `decorationParams` An {Object} representing the decoration e.g. | |
// `{type: 'line-number', class: 'linter-error'}` | |
// * `type` There are several supported decoration types. The behavior of the | |
// types are as follows: | |
// * `line` Adds the given `class` to the lines overlapping the rows | |
// spanned by the `DisplayMarker`. | |
// * `line-number` Adds the given `class` to the line numbers overlapping | |
// the rows spanned by the `DisplayMarker`. | |
// * `text` Injects spans into all text overlapping the marked range, | |
// then adds the given `class` or `style` properties to these spans. | |
// Use this to manipulate the foreground color or styling of text in | |
// a given range. | |
// * `highlight` Creates an absolutely-positioned `.highlight` div | |
// containing nested divs to cover the marked region. For example, this | |
// is used to implement selections. | |
// * `overlay` Positions the view associated with the given item at the | |
// head or tail of the given `DisplayMarker`, depending on the `position` | |
// property. | |
// * `gutter` Tracks a {DisplayMarker} in a {Gutter}. Created by calling | |
// {Gutter::decorateMarker} on the desired `Gutter` instance. | |
// * `block` Positions the view associated with the given item before or | |
// after the row of the given `TextEditorMarker`, depending on the `position` | |
// property. | |
// * `cursor` Renders a cursor at the head of the given marker. If multiple | |
// decorations are created for the same marker, their class strings and | |
// style objects are combined into a single cursor. You can use this | |
// decoration type to style existing cursors by passing in their markers | |
// or render artificial cursors that don't actually exist in the model | |
// by passing a marker that isn't actually associated with a cursor. | |
// * `class` This CSS class will be applied to the decorated line number, | |
// line, text spans, highlight regions, cursors, or overlay. | |
// * `style` An {Object} containing CSS style properties to apply to the | |
// relevant DOM node. Currently this only works with a `type` of `cursor` | |
// or `text`. | |
// * `item` (optional) An {HTMLElement} or a model {Object} with a | |
// corresponding view registered. Only applicable to the `gutter`, | |
// `overlay` and `block` decoration types. | |
// * `onlyHead` (optional) If `true`, the decoration will only be applied to | |
// the head of the `DisplayMarker`. Only applicable to the `line` and | |
// `line-number` decoration types. | |
// * `onlyEmpty` (optional) If `true`, the decoration will only be applied if | |
// the associated `DisplayMarker` is empty. Only applicable to the `gutter`, | |
// `line`, and `line-number` decoration types. | |
// * `onlyNonEmpty` (optional) If `true`, the decoration will only be applied | |
// if the associated `DisplayMarker` is non-empty. Only applicable to the | |
// `gutter`, `line`, and `line-number` decoration types. | |
// * `omitEmptyLastRow` (optional) If `false`, the decoration will be applied | |
// to the last row of a non-empty range, even if it ends at column 0. | |
// Defaults to `true`. Only applicable to the `gutter`, `line`, and | |
// `line-number` decoration types. | |
// * `position` (optional) Only applicable to decorations of type `overlay` and `block`. | |
// Controls where the view is positioned relative to the `TextEditorMarker`. | |
// Values can be `'head'` (the default) or `'tail'` for overlay decorations, and | |
// `'before'` (the default) or `'after'` for block decorations. | |
// * `avoidOverflow` (optional) Only applicable to decorations of type | |
// `overlay`. Determines whether the decoration adjusts its horizontal or | |
// vertical position to remain fully visible when it would otherwise | |
// overflow the editor. Defaults to `true`. | |
// | |
// Returns a {Decoration} object | |
decorateMarker (marker, decorationParams) { | |
return this.decorationManager.decorateMarker(marker, decorationParams) | |
} | |
// Essential: Add a decoration to every marker in the given marker layer. Can | |
// be used to decorate a large number of markers without having to create and | |
// manage many individual decorations. | |
// | |
// * `markerLayer` A {DisplayMarkerLayer} or {MarkerLayer} to decorate. | |
// * `decorationParams` The same parameters that are passed to | |
// {TextEditor::decorateMarker}, except the `type` cannot be `overlay` or `gutter`. | |
// | |
// Returns a {LayerDecoration}. | |
decorateMarkerLayer (markerLayer, decorationParams) { | |
return this.decorationManager.decorateMarkerLayer(markerLayer, decorationParams) | |
} | |
// Deprecated: Get all the decorations within a screen row range on the default | |
// layer. | |
// | |
// * `startScreenRow` the {Number} beginning screen row | |
// * `endScreenRow` the {Number} end screen row (inclusive) | |
// | |
// Returns an {Object} of decorations in the form | |
// `{1: [{id: 10, type: 'line-number', class: 'someclass'}], 2: ...}` | |
// where the keys are {DisplayMarker} IDs, and the values are an array of decoration | |
// params objects attached to the marker. | |
// Returns an empty object when no decorations are found | |
decorationsForScreenRowRange (startScreenRow, endScreenRow) { | |
return this.decorationManager.decorationsForScreenRowRange(startScreenRow, endScreenRow) | |
} | |
decorationsStateForScreenRowRange (startScreenRow, endScreenRow) { | |
return this.decorationManager.decorationsStateForScreenRowRange(startScreenRow, endScreenRow) | |
} | |
// Extended: Get all decorations. | |
// | |
// * `propertyFilter` (optional) An {Object} containing key value pairs that | |
// the returned decorations' properties must match. | |
// | |
// Returns an {Array} of {Decoration}s. | |
getDecorations (propertyFilter) { | |
return this.decorationManager.getDecorations(propertyFilter) | |
} | |
// Extended: Get all decorations of type 'line'. | |
// | |
// * `propertyFilter` (optional) An {Object} containing key value pairs that | |
// the returned decorations' properties must match. | |
// | |
// Returns an {Array} of {Decoration}s. | |
getLineDecorations (propertyFilter) { | |
return this.decorationManager.getLineDecorations(propertyFilter) | |
} | |
// Extended: Get all decorations of type 'line-number'. | |
// | |
// * `propertyFilter` (optional) An {Object} containing key value pairs that | |
// the returned decorations' properties must match. | |
// | |
// Returns an {Array} of {Decoration}s. | |
getLineNumberDecorations (propertyFilter) { | |
return this.decorationManager.getLineNumberDecorations(propertyFilter) | |
} | |
// Extended: Get all decorations of type 'highlight'. | |
// | |
// * `propertyFilter` (optional) An {Object} containing key value pairs that | |
// the returned decorations' properties must match. | |
// | |
// Returns an {Array} of {Decoration}s. | |
getHighlightDecorations (propertyFilter) { | |
return this.decorationManager.getHighlightDecorations(propertyFilter) | |
} | |
// Extended: Get all decorations of type 'overlay'. | |
// | |
// * `propertyFilter` (optional) An {Object} containing key value pairs that | |
// the returned decorations' properties must match. | |
// | |
// Returns an {Array} of {Decoration}s. | |
getOverlayDecorations (propertyFilter) { | |
return this.decorationManager.getOverlayDecorations(propertyFilter) | |
} | |
/* | |
Section: Markers | |
*/ | |
// Essential: Create a marker on the default marker layer with the given range | |
// in buffer coordinates. This marker will maintain its logical location as the | |
// buffer is changed, so if you mark a particular word, the marker will remain | |
// over that word even if the word's location in the buffer changes. | |
// | |
// * `range` A {Range} or range-compatible {Array} | |
// * `properties` A hash of key-value pairs to associate with the marker. There | |
// are also reserved property names that have marker-specific meaning. | |
// * `maintainHistory` (optional) {Boolean} Whether to store this marker's | |
// range before and after each change in the undo history. This allows the | |
// marker's position to be restored more accurately for certain undo/redo | |
// operations, but uses more time and memory. (default: false) | |
// * `reversed` (optional) {Boolean} Creates the marker in a reversed | |
// orientation. (default: false) | |
// * `invalidate` (optional) {String} Determines the rules by which changes | |
// to the buffer *invalidate* the marker. (default: 'overlap') It can be | |
// any of the following strategies, in order of fragility: | |
// * __never__: The marker is never marked as invalid. This is a good choice for | |
// markers representing selections in an editor. | |
// * __surround__: The marker is invalidated by changes that completely surround it. | |
// * __overlap__: The marker is invalidated by changes that surround the | |
// start or end of the marker. This is the default. | |
// * __inside__: The marker is invalidated by changes that extend into the | |
// inside of the marker. Changes that end at the marker's start or | |
// start at the marker's end do not invalidate the marker. | |
// * __touch__: The marker is invalidated by a change that touches the marked | |
// region in any way, including changes that end at the marker's | |
// start or start at the marker's end. This is the most fragile strategy. | |
// | |
// Returns a {DisplayMarker}. | |
markBufferRange (bufferRange, options) { | |
return this.defaultMarkerLayer.markBufferRange(bufferRange, options) | |
} | |
// Essential: Create a marker on the default marker layer with the given range | |
// in screen coordinates. This marker will maintain its logical location as the | |
// buffer is changed, so if you mark a particular word, the marker will remain | |
// over that word even if the word's location in the buffer changes. | |
// | |
// * `range` A {Range} or range-compatible {Array} | |
// * `properties` A hash of key-value pairs to associate with the marker. There | |
// are also reserved property names that have marker-specific meaning. | |
// * `maintainHistory` (optional) {Boolean} Whether to store this marker's | |
// range before and after each change in the undo history. This allows the | |
// marker's position to be restored more accurately for certain undo/redo | |
// operations, but uses more time and memory. (default: false) | |
// * `reversed` (optional) {Boolean} Creates the marker in a reversed | |
// orientation. (default: false) | |
// * `invalidate` (optional) {String} Determines the rules by which changes | |
// to the buffer *invalidate* the marker. (default: 'overlap') It can be | |
// any of the following strategies, in order of fragility: | |
// * __never__: The marker is never marked as invalid. This is a good choice for | |
// markers representing selections in an editor. | |
// * __surround__: The marker is invalidated by changes that completely surround it. | |
// * __overlap__: The marker is invalidated by changes that surround the | |
// start or end of the marker. This is the default. | |
// * __inside__: The marker is invalidated by changes that extend into the | |
// inside of the marker. Changes that end at the marker's start or | |
// start at the marker's end do not invalidate the marker. | |
// * __touch__: The marker is invalidated by a change that touches the marked | |
// region in any way, including changes that end at the marker's | |
// start or start at the marker's end. This is the most fragile strategy. | |
// | |
// Returns a {DisplayMarker}. | |
markScreenRange (screenRange, options) { | |
return this.defaultMarkerLayer.markScreenRange(screenRange, options) | |
} | |
// Essential: Create a marker on the default marker layer with the given buffer | |
// position and no tail. To group multiple markers together in their own | |
// private layer, see {::addMarkerLayer}. | |
// | |
// * `bufferPosition` A {Point} or point-compatible {Array} | |
// * `options` (optional) An {Object} with the following keys: | |
// * `invalidate` (optional) {String} Determines the rules by which changes | |
// to the buffer *invalidate* the marker. (default: 'overlap') It can be | |
// any of the following strategies, in order of fragility: | |
// * __never__: The marker is never marked as invalid. This is a good choice for | |
// markers representing selections in an editor. | |
// * __surround__: The marker is invalidated by changes that completely surround it. | |
// * __overlap__: The marker is invalidated by changes that surround the | |
// start or end of the marker. This is the default. | |
// * __inside__: The marker is invalidated by changes that extend into the | |
// inside of the marker. Changes that end at the marker's start or | |
// start at the marker's end do not invalidate the marker. | |
// * __touch__: The marker is invalidated by a change that touches the marked | |
// region in any way, including changes that end at the marker's | |
// start or start at the marker's end. This is the most fragile strategy. | |
// | |
// Returns a {DisplayMarker}. | |
markBufferPosition (bufferPosition, options) { | |
return this.defaultMarkerLayer.markBufferPosition(bufferPosition, options) | |
} | |
// Essential: Create a marker on the default marker layer with the given screen | |
// position and no tail. To group multiple markers together in their own | |
// private layer, see {::addMarkerLayer}. | |
// | |
// * `screenPosition` A {Point} or point-compatible {Array} | |
// * `options` (optional) An {Object} with the following keys: | |
// * `invalidate` (optional) {String} Determines the rules by which changes | |
// to the buffer *invalidate* the marker. (default: 'overlap') It can be | |
// any of the following strategies, in order of fragility: | |
// * __never__: The marker is never marked as invalid. This is a good choice for | |
// markers representing selections in an editor. | |
// * __surround__: The marker is invalidated by changes that completely surround it. | |
// * __overlap__: The marker is invalidated by changes that surround the | |
// start or end of the marker. This is the default. | |
// * __inside__: The marker is invalidated by changes that extend into the | |
// inside of the marker. Changes that end at the marker's start or | |
// start at the marker's end do not invalidate the marker. | |
// * __touch__: The marker is invalidated by a change that touches the marked | |
// region in any way, including changes that end at the marker's | |
// start or start at the marker's end. This is the most fragile strategy. | |
// * `clipDirection` {String} If `'backward'`, returns the first valid | |
// position preceding an invalid position. If `'forward'`, returns the | |
// first valid position following an invalid position. If `'closest'`, | |
// returns the first valid position closest to an invalid position. | |
// Defaults to `'closest'`. | |
// | |
// Returns a {DisplayMarker}. | |
markScreenPosition (screenPosition, options) { | |
return this.defaultMarkerLayer.markScreenPosition(screenPosition, options) | |
} | |
// Essential: Find all {DisplayMarker}s on the default marker layer that | |
// match the given properties. | |
// | |
// This method finds markers based on the given properties. Markers can be | |
// associated with custom properties that will be compared with basic equality. | |
// In addition, there are several special properties that will be compared | |
// with the range of the markers rather than their properties. | |
// | |
// * `properties` An {Object} containing properties that each returned marker | |
// must satisfy. Markers can be associated with custom properties, which are | |
// compared with basic equality. In addition, several reserved properties | |
// can be used to filter markers based on their current range: | |
// * `startBufferRow` Only include markers starting at this row in buffer | |
// coordinates. | |
// * `endBufferRow` Only include markers ending at this row in buffer | |
// coordinates. | |
// * `containsBufferRange` Only include markers containing this {Range} or | |
// in range-compatible {Array} in buffer coordinates. | |
// * `containsBufferPosition` Only include markers containing this {Point} | |
// or {Array} of `[row, column]` in buffer coordinates. | |
// | |
// Returns an {Array} of {DisplayMarker}s | |
findMarkers (params) { | |
return this.defaultMarkerLayer.findMarkers(params) | |
} | |
// Extended: Get the {DisplayMarker} on the default layer for the given | |
// marker id. | |
// | |
// * `id` {Number} id of the marker | |
getMarker (id) { | |
return this.defaultMarkerLayer.getMarker(id) | |
} | |
// Extended: Get all {DisplayMarker}s on the default marker layer. Consider | |
// using {::findMarkers} | |
getMarkers () { | |
return this.defaultMarkerLayer.getMarkers() | |
} | |
// Extended: Get the number of markers in the default marker layer. | |
// | |
// Returns a {Number}. | |
getMarkerCount () { | |
return this.defaultMarkerLayer.getMarkerCount() | |
} | |
destroyMarker (id) { | |
const marker = this.getMarker(id) | |
if (marker) marker.destroy() | |
} | |
// Essential: Create a marker layer to group related markers. | |
// | |
// * `options` An {Object} containing the following keys: | |
// * `maintainHistory` A {Boolean} indicating whether marker state should be | |
// restored on undo/redo. Defaults to `false`. | |
// * `persistent` A {Boolean} indicating whether or not this marker layer | |
// should be serialized and deserialized along with the rest of the | |
// buffer. Defaults to `false`. If `true`, the marker layer's id will be | |
// maintained across the serialization boundary, allowing you to retrieve | |
// it via {::getMarkerLayer}. | |
// | |
// Returns a {DisplayMarkerLayer}. | |
addMarkerLayer (options) { | |
return this.displayLayer.addMarkerLayer(options) | |
} | |
// Essential: Get a {DisplayMarkerLayer} by id. | |
// | |
// * `id` The id of the marker layer to retrieve. | |
// | |
// Returns a {DisplayMarkerLayer} or `undefined` if no layer exists with the | |
// given id. | |
getMarkerLayer (id) { | |
return this.displayLayer.getMarkerLayer(id) | |
} | |
// Essential: Get the default {DisplayMarkerLayer}. | |
// | |
// All marker APIs not tied to an explicit layer interact with this default | |
// layer. | |
// | |
// Returns a {DisplayMarkerLayer}. | |
getDefaultMarkerLayer () { | |
return this.defaultMarkerLayer | |
} | |
/* | |
Section: Cursors | |
*/ | |
// Essential: Get the position of the most recently added cursor in buffer | |
// coordinates. | |
// | |
// Returns a {Point} | |
getCursorBufferPosition () { | |
return this.getLastCursor().getBufferPosition() | |
} | |
// Essential: Get the position of all the cursor positions in buffer coordinates. | |
// | |
// Returns {Array} of {Point}s in the order they were added | |
getCursorBufferPositions () { | |
return this.getCursors().map((cursor) => cursor.getBufferPosition()) | |
} | |
// Essential: Move the cursor to the given position in buffer coordinates. | |
// | |
// If there are multiple cursors, they will be consolidated to a single cursor. | |
// | |
// * `position` A {Point} or {Array} of `[row, column]` | |
// * `options` (optional) An {Object} containing the following keys: | |
// * `autoscroll` Determines whether the editor scrolls to the new cursor's | |
// position. Defaults to true. | |
setCursorBufferPosition (position, options) { | |
return this.moveCursors(cursor => cursor.setBufferPosition(position, options)) | |
} | |
// Essential: Get a {Cursor} at given screen coordinates {Point} | |
// | |
// * `position` A {Point} or {Array} of `[row, column]` | |
// | |
// Returns the first matched {Cursor} or undefined | |
getCursorAtScreenPosition (position) { | |
const selection = this.getSelectionAtScreenPosition(position) | |
if (selection && selection.getHeadScreenPosition().isEqual(position)) { | |
return selection.cursor | |
} | |
} | |
// Essential: Get the position of the most recently added cursor in screen | |
// coordinates. | |
// | |
// Returns a {Point}. | |
getCursorScreenPosition () { | |
return this.getLastCursor().getScreenPosition() | |
} | |
// Essential: Get the position of all the cursor positions in screen coordinates. | |
// | |
// Returns {Array} of {Point}s in the order the cursors were added | |
getCursorScreenPositions () { | |
return this.getCursors().map((cursor) => cursor.getScreenPosition()) | |
} | |
// Essential: Move the cursor to the given position in screen coordinates. | |
// | |
// If there are multiple cursors, they will be consolidated to a single cursor. | |
// | |
// * `position` A {Point} or {Array} of `[row, column]` | |
// * `options` (optional) An {Object} combining options for {::clipScreenPosition} with: | |
// * `autoscroll` Determines whether the editor scrolls to the new cursor's | |
// position. Defaults to true. | |
setCursorScreenPosition (position, options) { | |
if (options && options.clip) { | |
Grim.deprecate('The `clip` parameter has been deprecated and will be removed soon. Please, use `clipDirection` instead.') | |
if (options.clipDirection) options.clipDirection = options.clip | |
} | |
if (options && options.wrapAtSoftNewlines != null) { | |
Grim.deprecate("The `wrapAtSoftNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.") | |
if (options.clipDirection) options.clipDirection = options.wrapAtSoftNewlines ? 'forward' : 'backward' | |
} | |
if (options && options.wrapBeyondNewlines != null) { | |
Grim.deprecate("The `wrapBeyondNewlines` parameter has been deprecated and will be removed soon. Please, use `clipDirection: 'forward'` instead.") | |
if (options.clipDirection) options.clipDirection = options.wrapBeyondNewlines ? 'forward' : 'backward' | |
} | |
return this.moveCursors(cursor => cursor.setScreenPosition(position, options)) | |
} | |
// Essential: Add a cursor at the given position in buffer coordinates. | |
// | |
// * `bufferPosition` A {Point} or {Array} of `[row, column]` | |
// | |
// Returns a {Cursor}. | |
addCursorAtBufferPosition (bufferPosition, options) { | |
this.selectionsMarkerLayer.markBufferPosition(bufferPosition, {invalidate: 'never'}) | |
if (!options || options.autoscroll !== false) this.getLastSelection().cursor.autoscroll() | |
return this.getLastSelection().cursor | |
} | |
// Essential: Add a cursor at the position in screen coordinates. | |
// | |
// * `screenPosition` A {Point} or {Array} of `[row, column]` | |
// | |
// Returns a {Cursor}. | |
addCursorAtScreenPosition (screenPosition, options) { | |
this.selectionsMarkerLayer.markScreenPosition(screenPosition, {invalidate: 'never'}) | |
if (!options || options.autoscroll !== false) this.getLastSelection().cursor.autoscroll() | |
return this.getLastSelection().cursor | |
} | |
// Essential: Returns {Boolean} indicating whether or not there are multiple cursors. | |
hasMultipleCursors () { | |
return this.getCursors().length > 1 | |
} | |
// Essential: Move every cursor up one row in screen coordinates. | |
// | |
// * `lineCount` (optional) {Number} number of lines to move | |
moveUp (lineCount) { | |
return this.moveCursors(cursor => cursor.moveUp(lineCount, {moveToEndOfSelection: true})) | |
} | |
// Essential: Move every cursor down one row in screen coordinates. | |
// | |
// * `lineCount` (optional) {Number} number of lines to move | |
moveDown (lineCount) { | |
return this.moveCursors(cursor => cursor.moveDown(lineCount, {moveToEndOfSelection: true})) | |
} | |
// Essential: Move every cursor left one column. | |
// | |
// * `columnCount` (optional) {Number} number of columns to move (default: 1) | |
moveLeft (columnCount) { | |
return this.moveCursors(cursor => cursor.moveLeft(columnCount, {moveToEndOfSelection: true})) | |
} | |
// Essential: Move every cursor right one column. | |
// | |
// * `columnCount` (optional) {Number} number of columns to move (default: 1) | |
moveRight (columnCount) { | |
return this.moveCursors(cursor => cursor.moveRight(columnCount, {moveToEndOfSelection: true})) | |
} | |
// Essential: Move every cursor to the beginning of its line in buffer coordinates. | |
moveToBeginningOfLine () { | |
return this.moveCursors(cursor => cursor.moveToBeginningOfLine()) | |
} | |
// Essential: Move every cursor to the beginning of its line in screen coordinates. | |
moveToBeginningOfScreenLine () { | |
return this.moveCursors(cursor => cursor.moveToBeginningOfScreenLine()) | |
} | |
// Essential: Move every cursor to the first non-whitespace character of its line. | |
moveToFirstCharacterOfLine () { | |
return this.moveCursors(cursor => cursor.moveToFirstCharacterOfLine()) | |
} | |
// Essential: Move every cursor to the end of its line in buffer coordinates. | |
moveToEndOfLine () { | |
return this.moveCursors(cursor => cursor.moveToEndOfLine()) | |
} | |
// Essential: Move every cursor to the end of its line in screen coordinates. | |
moveToEndOfScreenLine () { | |
return this.moveCursors(cursor => cursor.moveToEndOfScreenLine()) | |
} | |
// Essential: Move every cursor to the beginning of its surrounding word. | |
moveToBeginningOfWord () { | |
return this.moveCursors(cursor => cursor.moveToBeginningOfWord()) | |
} | |
// Essential: Move every cursor to the end of its surrounding word. | |
moveToEndOfWord () { | |
return this.moveCursors(cursor => cursor.moveToEndOfWord()) | |
} | |
// Cursor Extended | |
// Extended: Move every cursor to the top of the buffer. | |
// | |
// If there are multiple cursors, they will be merged into a single cursor. | |
moveToTop () { | |
return this.moveCursors(cursor => cursor.moveToTop()) | |
} | |
// Extended: Move every cursor to the bottom of the buffer. | |
// | |
// If there are multiple cursors, they will be merged into a single cursor. | |
moveToBottom () { | |
return this.moveCursors(cursor => cursor.moveToBottom()) | |
} | |
// Extended: Move every cursor to the beginning of the next word. | |
moveToBeginningOfNextWord () { | |
return this.moveCursors(cursor => cursor.moveToBeginningOfNextWord()) | |
} | |
// Extended: Move every cursor to the previous word boundary. | |
moveToPreviousWordBoundary () { | |
return this.moveCursors(cursor => cursor.moveToPreviousWordBoundary()) | |
} | |
// Extended: Move every cursor to the next word boundary. | |
moveToNextWordBoundary () { | |
return this.moveCursors(cursor => cursor.moveToNextWordBoundary()) | |
} | |
// Extended: Move every cursor to the previous subword boundary. | |
moveToPreviousSubwordBoundary () { | |
return this.moveCursors(cursor => cursor.moveToPreviousSubwordBoundary()) | |
} | |
// Extended: Move every cursor to the next subword boundary. | |
moveToNextSubwordBoundary () { | |
return this.moveCursors(cursor => cursor.moveToNextSubwordBoundary()) | |
} | |
// Extended: Move every cursor to the beginning of the next paragraph. | |
moveToBeginningOfNextParagraph () { | |
return this.moveCursors(cursor => cursor.moveToBeginningOfNextParagraph()) | |
} | |
// Extended: Move every cursor to the beginning of the previous paragraph. | |
moveToBeginningOfPreviousParagraph () { | |
return this.moveCursors(cursor => cursor.moveToBeginningOfPreviousParagraph()) | |
} | |
// Extended: Returns the most recently added {Cursor} | |
getLastCursor () { | |
this.createLastSelectionIfNeeded() | |
return _.last(this.cursors) | |
} | |
// Extended: Returns the word surrounding the most recently added cursor. | |
// | |
// * `options` (optional) See {Cursor::getBeginningOfCurrentWordBufferPosition}. | |
getWordUnderCursor (options) { | |
return this.getTextInBufferRange(this.getLastCursor().getCurrentWordBufferRange(options)) | |
} | |
// Extended: Get an Array of all {Cursor}s. | |
getCursors () { | |
this.createLastSelectionIfNeeded() | |
return this.cursors.slice() | |
} | |
// Extended: Get all {Cursors}s, ordered by their position in the buffer | |
// instead of the order in which they were added. | |
// | |
// Returns an {Array} of {Selection}s. | |
getCursorsOrderedByBufferPosition () { | |
return this.getCursors().sort((a, b) => a.compare(b)) | |
} | |
cursorsForScreenRowRange (startScreenRow, endScreenRow) { | |
const cursors = [] | |
for (let marker of this.selectionsMarkerLayer.findMarkers({intersectsScreenRowRange: [startScreenRow, endScreenRow]})) { | |
const cursor = this.cursorsByMarkerId.get(marker.id) | |
if (cursor) cursors.push(cursor) | |
} | |
return cursors | |
} | |
// Add a cursor based on the given {DisplayMarker}. | |
addCursor (marker) { | |
const cursor = new Cursor({editor: this, marker, showCursorOnSelection: this.showCursorOnSelection}) | |
this.cursors.push(cursor) | |
this.cursorsByMarkerId.set(marker.id, cursor) | |
return cursor | |
} | |
moveCursors (fn) { | |
return this.transact(() => { | |
this.getCursors().forEach(fn) | |
return this.mergeCursors() | |
}) | |
} | |
cursorMoved (event) { | |
return this.emitter.emit('did-change-cursor-position', event) | |
} | |
// Merge cursors that have the same screen position | |
mergeCursors () { | |
const positions = {} | |
for (let cursor of this.getCursors()) { | |
const position = cursor.getBufferPosition().toString() | |
if (positions.hasOwnProperty(position)) { | |
cursor.destroy() | |
} else { | |
positions[position] = true | |
} | |
} | |
} | |
/* | |
Section: Selections | |
*/ | |
// Essential: Get the selected text of the most recently added selection. | |
// | |
// Returns a {String}. | |
getSelectedText () { | |
return this.getLastSelection().getText() | |
} | |
// Essential: Get the {Range} of the most recently added selection in buffer | |
// coordinates. | |
// | |
// Returns a {Range}. | |
getSelectedBufferRange () { | |
return this.getLastSelection().getBufferRange() | |
} | |
// Essential: Get the {Range}s of all selections in buffer coordinates. | |
// | |
// The ranges are sorted by when the selections were added. Most recent at the end. | |
// | |
// Returns an {Array} of {Range}s. | |
getSelectedBufferRanges () { | |
return this.getSelections().map((selection) => selection.getBufferRange()) | |
} | |
// Essential: Set the selected range in buffer coordinates. If there are multiple | |
// selections, they are reduced to a single selection with the given range. | |
// | |
// * `bufferRange` A {Range} or range-compatible {Array}. | |
// * `options` (optional) An options {Object}: | |
// * `reversed` A {Boolean} indicating whether to create the selection in a | |
// reversed orientation. | |
// * `preserveFolds` A {Boolean}, which if `true` preserves the fold settings after the | |
// selection is set. | |
setSelectedBufferRange (bufferRange, options) { | |
return this.setSelectedBufferRanges([bufferRange], options) | |
} | |
// Essential: Set the selected ranges in buffer coordinates. If there are multiple | |
// selections, they are replaced by new selections with the given ranges. | |
// | |
// * `bufferRanges` An {Array} of {Range}s or range-compatible {Array}s. | |
// * `options` (optional) An options {Object}: | |
// * `reversed` A {Boolean} indicating whether to create the selection in a | |
// reversed orientation. | |
// * `preserveFolds` A {Boolean}, which if `true` preserves the fold settings after the | |
// selection is set. | |
setSelectedBufferRanges (bufferRanges, options = {}) { | |
if (!bufferRanges.length) throw new Error('Passed an empty array to setSelectedBufferRanges') | |
const selections = this.getSelections() | |
for (let selection of selections.slice(bufferRanges.length)) { | |
selection.destroy() | |
} | |
this.mergeIntersectingSelections(options, () => { | |
for (let i = 0; i < bufferRanges.length; i++) { | |
let bufferRange = bufferRanges[i] | |
bufferRange = Range.fromObject(bufferRange) | |
if (selections[i]) { | |
selections[i].setBufferRange(bufferRange, options) | |
} else { | |
this.addSelectionForBufferRange(bufferRange, options) | |
} | |
} | |
}) | |
} | |
// Essential: Get the {Range} of the most recently added selection in screen | |
// coordinates. | |
// | |
// Returns a {Range}. | |
getSelectedScreenRange () { | |
return this.getLastSelection().getScreenRange() | |
} | |
// Essential: Get the {Range}s of all selections in screen coordinates. | |
// | |
// The ranges are sorted by when the selections were added. Most recent at the end. | |
// | |
// Returns an {Array} of {Range}s. | |
getSelectedScreenRanges () { | |
return this.getSelections().map((selection) => selection.getScreenRange()) | |
} | |
// Essential: Set the selected range in screen coordinates. If there are multiple | |
// selections, they are reduced to a single selection with the given range. | |
// | |
// * `screenRange` A {Range} or range-compatible {Array}. | |
// * `options` (optional) An options {Object}: | |
// * `reversed` A {Boolean} indicating whether to create the selection in a | |
// reversed orientation. | |
setSelectedScreenRange (screenRange, options) { | |
return this.setSelectedBufferRange(this.bufferRangeForScreenRange(screenRange, options), options) | |
} | |
// Essential: Set the selected ranges in screen coordinates. If there are multiple | |
// selections, they are replaced by new selections with the given ranges. | |
// | |
// * `screenRanges` An {Array} of {Range}s or range-compatible {Array}s. | |
// * `options` (optional) An options {Object}: | |
// * `reversed` A {Boolean} indicating whether to create the selection in a | |
// reversed orientation. | |
setSelectedScreenRanges (screenRanges, options = {}) { | |
if (!screenRanges.length) throw new Error('Passed an empty array to setSelectedScreenRanges') | |
const selections = this.getSelections() | |
for (let selection of selections.slice(screenRanges.length)) { | |
selection.destroy() | |
} | |
this.mergeIntersectingSelections(options, () => { | |
for (let i = 0; i < screenRanges.length; i++) { | |
let screenRange = screenRanges[i] | |
screenRange = Range.fromObject(screenRange) | |
if (selections[i]) { | |
selections[i].setScreenRange(screenRange, options) | |
} else { | |
this.addSelectionForScreenRange(screenRange, options) | |
} | |
} | |
}) | |
} | |
// Essential: Add a selection for the given range in buffer coordinates. | |
// | |
// * `bufferRange` A {Range} | |
// * `options` (optional) An options {Object}: | |
// * `reversed` A {Boolean} indicating whether to create the selection in a | |
// reversed orientation. | |
// * `preserveFolds` A {Boolean}, which if `true` preserves the fold settings after the | |
// selection is set. | |
// | |
// Returns the added {Selection}. | |
addSelectionForBufferRange (bufferRange, options = {}) { | |
bufferRange = Range.fromObject(bufferRange) | |
if (!options.preserveFolds) { | |
this.displayLayer.destroyFoldsContainingBufferPositions([bufferRange.start, bufferRange.end], true) | |
} | |
this.selectionsMarkerLayer.markBufferRange(bufferRange, {invalidate: 'never', reversed: options.reversed != null ? options.reversed : false}) | |
if (options.autoscroll !== false) this.getLastSelection().autoscroll() | |
return this.getLastSelection() | |
} | |
// Essential: Add a selection for the given range in screen coordinates. | |
// | |
// * `screenRange` A {Range} | |
// * `options` (optional) An options {Object}: | |
// * `reversed` A {Boolean} indicating whether to create the selection in a | |
// reversed orientation. | |
// * `preserveFolds` A {Boolean}, which if `true` preserves the fold settings after the | |
// selection is set. | |
// Returns the added {Selection}. | |
addSelectionForScreenRange (screenRange, options = {}) { | |
return this.addSelectionForBufferRange(this.bufferRangeForScreenRange(screenRange), options) | |
} | |
// Essential: Select from the current cursor position to the given position in | |
// buffer coordinates. | |
// | |
// This method may merge selections that end up intersecting. | |
// | |
// * `position` An instance of {Point}, with a given `row` and `column`. | |
selectToBufferPosition (position) { | |
const lastSelection = this.getLastSelection() | |
lastSelection.selectToBufferPosition(position) | |
return this.mergeIntersectingSelections({reversed: lastSelection.isReversed()}) | |
} | |
// Essential: Select from the current cursor position to the given position in | |
// screen coordinates. | |
// | |
// This method may merge selections that end up intersecting. | |
// | |
// * `position` An instance of {Point}, with a given `row` and `column`. | |
selectToScreenPosition (position, options) { | |
const lastSelection = this.getLastSelection() | |
lastSelection.selectToScreenPosition(position, options) | |
if (!options || !options.suppressSelectionMerge) { | |
return this.mergeIntersectingSelections({reversed: lastSelection.isReversed()}) | |
} | |
} | |
// Essential: Move the cursor of each selection one character upward while | |
// preserving the selection's tail position. | |
// | |
// * `rowCount` (optional) {Number} number of rows to select (default: 1) | |
// | |
// This method may merge selections that end up intersecting. | |
selectUp (rowCount) { | |
return this.expandSelectionsBackward(selection => selection.selectUp(rowCount)) | |
} | |
// Essential: Move the cursor of each selection one character downward while | |
// preserving the selection's tail position. | |
// | |
// * `rowCount` (optional) {Number} number of rows to select (default: 1) | |
// | |
// This method may merge selections that end up intersecting. | |
selectDown (rowCount) { | |
return this.expandSelectionsForward(selection => selection.selectDown(rowCount)) | |
} | |
// Essential: Move the cursor of each selection one character leftward while | |
// preserving the selection's tail position. | |
// | |
// * `columnCount` (optional) {Number} number of columns to select (default: 1) | |
// | |
// This method may merge selections that end up intersecting. | |
selectLeft (columnCount) { | |
return this.expandSelectionsBackward(selection => selection.selectLeft(columnCount)) | |
} | |
// Essential: Move the cursor of each selection one character rightward while | |
// preserving the selection's tail position. | |
// | |
// * `columnCount` (optional) {Number} number of columns to select (default: 1) | |
// | |
// This method may merge selections that end up intersecting. | |
selectRight (columnCount) { | |
return this.expandSelectionsForward(selection => selection.selectRight(columnCount)) | |
} | |
// Essential: Select from the top of the buffer to the end of the last selection | |
// in the buffer. | |
// | |
// This method merges multiple selections into a single selection. | |
selectToTop () { | |
return this.expandSelectionsBackward(selection => selection.selectToTop()) | |
} | |
// Essential: Selects from the top of the first selection in the buffer to the end | |
// of the buffer. | |
// | |
// This method merges multiple selections into a single selection. | |
selectToBottom () { | |
return this.expandSelectionsForward(selection => selection.selectToBottom()) | |
} | |
// Essential: Select all text in the buffer. | |
// | |
// This method merges multiple selections into a single selection. | |
selectAll () { | |
return this.expandSelectionsForward(selection => selection.selectAll()) | |
} | |
// Essential: Move the cursor of each selection to the beginning of its line | |
// while preserving the selection's tail position. | |
// | |
// This method may merge selections that end up intersecting. | |
selectToBeginningOfLine () { | |
return this.expandSelectionsBackward(selection => selection.selectToBeginningOfLine()) | |
} | |
// Essential: Move the cursor of each selection to the first non-whitespace | |
// character of its line while preserving the selection's tail position. If the | |
// cursor is already on the first character of the line, move it to the | |
// beginning of the line. | |
// | |
// This method may merge selections that end up intersecting. | |
selectToFirstCharacterOfLine () { | |
return this.expandSelectionsBackward(selection => selection.selectToFirstCharacterOfLine()) | |
} | |
// Essential: Move the cursor of each selection to the end of its line while | |
// preserving the selection's tail position. | |
// | |
// This method may merge selections that end up intersecting. | |
selectToEndOfLine () { | |
return this.expandSelectionsForward(selection => selection.selectToEndOfLine()) | |
} | |
// Essential: Expand selections to the beginning of their containing word. | |
// | |
// Operates on all selections. Moves the cursor to the beginning of the | |
// containing word while preserving the selection's tail position. | |
selectToBeginningOfWord () { | |
return this.expandSelectionsBackward(selection => selection.selectToBeginningOfWord()) | |
} | |
// Essential: Expand selections to the end of their containing word. | |
// | |
// Operates on all selections. Moves the cursor to the end of the containing | |
// word while preserving the selection's tail position. | |
selectToEndOfWord () { | |
return this.expandSelectionsForward(selection => selection.selectToEndOfWord()) | |
} | |
// Extended: For each selection, move its cursor to the preceding subword | |
// boundary while maintaining the selection's tail position. | |
// | |
// This method may merge selections that end up intersecting. | |
selectToPreviousSubwordBoundary () { | |
return this.expandSelectionsBackward(selection => selection.selectToPreviousSubwordBoundary()) | |
} | |
// Extended: For each selection, move its cursor to the next subword boundary | |
// while maintaining the selection's tail position. | |
// | |
// This method may merge selections that end up intersecting. | |
selectToNextSubwordBoundary () { | |
return this.expandSelectionsForward(selection => selection.selectToNextSubwordBoundary()) | |
} | |
// Essential: For each cursor, select the containing line. | |
// | |
// This method merges selections on successive lines. | |
selectLinesContainingCursors () { | |
return this.expandSelectionsForward(selection => selection.selectLine()) | |
} | |
// Essential: Select the word surrounding each cursor. | |
selectWordsContainingCursors () { | |
return this.expandSelectionsForward(selection => selection.selectWord()) | |
} | |
// Selection Extended | |
// Extended: For each selection, move its cursor to the preceding word boundary | |
// while maintaining the selection's tail position. | |
// | |
// This method may merge selections that end up intersecting. | |
selectToPreviousWordBoundary () { | |
return this.expandSelectionsBackward(selection => selection.selectToPreviousWordBoundary()) | |
} | |
// Extended: For each selection, move its cursor to the next word boundary while | |
// maintaining the selection's tail position. | |
// | |
// This method may merge selections that end up intersecting. | |
selectToNextWordBoundary () { | |
return this.expandSelectionsForward(selection => selection.selectToNextWordBoundary()) | |
} | |
// Extended: Expand selections to the beginning of the next word. | |
// | |
// Operates on all selections. Moves the cursor to the beginning of the next | |
// word while preserving the selection's tail position. | |
selectToBeginningOfNextWord () { | |
return this.expandSelectionsForward(selection => selection.selectToBeginningOfNextWord()) | |
} | |
// Extended: Expand selections to the beginning of the next paragraph. | |
// | |
// Operates on all selections. Moves the cursor to the beginning of the next | |
// paragraph while preserving the selection's tail position. | |
selectToBeginningOfNextParagraph () { | |
return this.expandSelectionsForward(selection => selection.selectToBeginningOfNextParagraph()) | |
} | |
// Extended: Expand selections to the beginning of the next paragraph. | |
// | |
// Operates on all selections. Moves the cursor to the beginning of the next | |
// paragraph while preserving the selection's tail position. | |
selectToBeginningOfPreviousParagraph () { | |
return this.expandSelectionsBackward(selection => selection.selectToBeginningOfPreviousParagraph()) | |
} | |
// Extended: Select the range of the given marker if it is valid. | |
// | |
// * `marker` A {DisplayMarker} | |
// | |
// Returns the selected {Range} or `undefined` if the marker is invalid. | |
selectMarker (marker) { | |
if (marker.isValid()) { | |
const range = marker.getBufferRange() | |
this.setSelectedBufferRange(range) | |
return range | |
} | |
} | |
// Extended: Get the most recently added {Selection}. | |
// | |
// Returns a {Selection}. | |
getLastSelection () { | |
this.createLastSelectionIfNeeded() | |
return _.last(this.selections) | |
} | |
getSelectionAtScreenPosition (position) { | |
const markers = this.selectionsMarkerLayer.findMarkers({containsScreenPosition: position}) | |
if (markers.length > 0) return this.cursorsByMarkerId.get(markers[0].id).selection | |
} | |
// Extended: Get current {Selection}s. | |
// | |
// Returns: An {Array} of {Selection}s. | |
getSelections () { | |
this.createLastSelectionIfNeeded() | |
return this.selections.slice() | |
} | |
// Extended: Get all {Selection}s, ordered by their position in the buffer | |
// instead of the order in which they were added. | |
// | |
// Returns an {Array} of {Selection}s. | |
getSelectionsOrderedByBufferPosition () { | |
return this.getSelections().sort((a, b) => a.compare(b)) | |
} | |
// Extended: Determine if a given range in buffer coordinates intersects a | |
// selection. | |
// | |
// * `bufferRange` A {Range} or range-compatible {Array}. | |
// | |
// Returns a {Boolean}. | |
selectionIntersectsBufferRange (bufferRange) { | |
return this.getSelections().some(selection => selection.intersectsBufferRange(bufferRange)) | |
} | |
// Selections Private | |
// Add a similarly-shaped selection to the next eligible line below | |
// each selection. | |
// | |
// Operates on all selections. If the selection is empty, adds an empty | |
// selection to the next following non-empty line as close to the current | |
// selection's column as possible. If the selection is non-empty, adds a | |
// selection to the next line that is long enough for a non-empty selection | |
// starting at the same column as the current selection to be added to it. | |
addSelectionBelow () { | |
return this.expandSelectionsForward(selection => selection.addSelectionBelow()) | |
} | |
// Add a similarly-shaped selection to the next eligible line above | |
// each selection. | |
// | |
// Operates on all selections. If the selection is empty, adds an empty | |
// selection to the next preceding non-empty line as close to the current | |
// selection's column as possible. If the selection is non-empty, adds a | |
// selection to the next line that is long enough for a non-empty selection | |
// starting at the same column as the current selection to be added to it. | |
addSelectionAbove () { | |
return this.expandSelectionsBackward(selection => selection.addSelectionAbove()) | |
} | |
// Calls the given function with each selection, then merges selections | |
expandSelectionsForward (fn) { | |
this.mergeIntersectingSelections(() => this.getSelections().forEach(fn)) | |
} | |
// Calls the given function with each selection, then merges selections in the | |
// reversed orientation | |
expandSelectionsBackward (fn) { | |
this.mergeIntersectingSelections({reversed: true}, () => this.getSelections().forEach(fn)) | |
} | |
finalizeSelections () { | |
for (let selection of this.getSelections()) { selection.finalize() } | |
} | |
selectionsForScreenRows (startRow, endRow) { | |
return this.getSelections().filter(selection => selection.intersectsScreenRowRange(startRow, endRow)) | |
} | |
// Merges intersecting selections. If passed a function, it executes | |
// the function with merging suppressed, then merges intersecting selections | |
// afterward. | |
mergeIntersectingSelections (...args) { | |
return this.mergeSelections(...args, (previousSelection, currentSelection) => { | |
const exclusive = !currentSelection.isEmpty() && !previousSelection.isEmpty() | |
return previousSelection.intersectsWith(currentSelection, exclusive) | |
}) | |
} | |
mergeSelectionsOnSameRows (...args) { | |
return this.mergeSelections(...args, (previousSelection, currentSelection) => { | |
const screenRange = currentSelection.getScreenRange() | |
return previousSelection.intersectsScreenRowRange(screenRange.start.row, screenRange.end.row) | |
}) | |
} | |
avoidMergingSelections (...args) { | |
return this.mergeSelections(...args, () => false) | |
} | |
mergeSelections (...args) { | |
const mergePredicate = args.pop() | |
let fn = args.pop() | |
let options = args.pop() | |
if (typeof fn !== 'function') { | |
options = fn | |
fn = () => {} | |
} | |
if (this.suppressSelectionMerging) return fn() | |
this.suppressSelectionMerging = true | |
const result = fn() | |
this.suppressSelectionMerging = false | |
const selections = this.getSelectionsOrderedByBufferPosition() | |
let lastSelection = selections.shift() | |
for (const selection of selections) { | |
if (mergePredicate(lastSelection, selection)) { | |
lastSelection.merge(selection, options) | |
} else { | |
lastSelection = selection | |
} | |
} | |
return result | |
} | |
// Add a {Selection} based on the given {DisplayMarker}. | |
// | |
// * `marker` The {DisplayMarker} to highlight | |
// * `options` (optional) An {Object} that pertains to the {Selection} constructor. | |
// | |
// Returns the new {Selection}. | |
addSelection (marker, options = {}) { | |
const cursor = this.addCursor(marker) | |
let selection = new Selection(Object.assign({editor: this, marker, cursor}, options)) | |
this.selections.push(selection) | |
const selectionBufferRange = selection.getBufferRange() | |
this.mergeIntersectingSelections({preserveFolds: options.preserveFolds}) | |
if (selection.destroyed) { | |
for (selection of this.getSelections()) { | |
if (selection.intersectsBufferRange(selectionBufferRange)) return selection | |
} | |
} else { | |
this.emitter.emit('did-add-cursor', cursor) | |
this.emitter.emit('did-add-selection', selection) | |
return selection | |
} | |
} | |
// Remove the given selection. | |
removeSelection (selection) { | |
_.remove(this.cursors, selection.cursor) | |
_.remove(this.selections, selection) | |
this.cursorsByMarkerId.delete(selection.cursor.marker.id) | |
this.emitter.emit('did-remove-cursor', selection.cursor) | |
return this.emitter.emit('did-remove-selection', selection) | |
} | |
// Reduce one or more selections to a single empty selection based on the most | |
// recently added cursor. | |
clearSelections (options) { | |
this.consolidateSelections() | |
this.getLastSelection().clear(options) | |
} | |
// Reduce multiple selections to the least recently added selection. | |
consolidateSelections () { | |
const selections = this.getSelections() | |
if (selections.length > 1) { | |
for (let selection of selections.slice(1, (selections.length))) { selection.destroy() } | |
selections[0].autoscroll({center: true}) | |
return true | |
} else { | |
return false | |
} | |
} | |
// Called by the selection | |
selectionRangeChanged (event) { | |
if (this.component) this.component.didChangeSelectionRange() | |
this.emitter.emit('did-change-selection-range', event) | |
} | |
createLastSelectionIfNeeded () { | |
if (this.selections.length === 0) { | |
this.addSelectionForBufferRange([[0, 0], [0, 0]], {autoscroll: false, preserveFolds: true}) | |
} | |
} | |
/* | |
Section: Searching and Replacing | |
*/ | |
// Essential: Scan regular expression matches in the entire buffer, calling the | |
// given iterator function on each match. | |
// | |
// `::scan` functions as the replace method as well via the `replace` | |
// | |
// If you're programmatically modifying the results, you may want to try | |
// {::backwardsScanInBufferRange} to avoid tripping over your own changes. | |
// | |
// * `regex` A {RegExp} to search for. | |
// * `options` (optional) {Object} | |
// * `leadingContextLineCount` {Number} default `0`; The number of lines | |
// before the matched line to include in the results object. | |
// * `trailingContextLineCount` {Number} default `0`; The number of lines | |
// after the matched line to include in the results object. | |
// * `iterator` A {Function} that's called on each match | |
// * `object` {Object} | |
// * `match` The current regular expression match. | |
// * `matchText` A {String} with the text of the match. | |
// * `range` The {Range} of the match. | |
// * `stop` Call this {Function} to terminate the scan. | |
// * `replace` Call this {Function} with a {String} to replace the match. | |
scan (regex, options = {}, iterator) { | |
if (_.isFunction(options)) { | |
iterator = options | |
options = {} | |
} | |
return this.buffer.scan(regex, options, iterator) | |
} | |
// Essential: Scan regular expression matches in a given range, calling the given | |
// iterator function on each match. | |
// | |
// * `regex` A {RegExp} to search for. | |
// * `range` A {Range} in which to search. | |
// * `iterator` A {Function} that's called on each match with an {Object} | |
// containing the following keys: | |
// * `match` The current regular expression match. | |
// * `matchText` A {String} with the text of the match. | |
// * `range` The {Range} of the match. | |
// * `stop` Call this {Function} to terminate the scan. | |
// * `replace` Call this {Function} with a {String} to replace the match. | |
scanInBufferRange (regex, range, iterator) { return this.buffer.scanInRange(regex, range, iterator) } | |
// Essential: Scan regular expression matches in a given range in reverse order, | |
// calling the given iterator function on each match. | |
// | |
// * `regex` A {RegExp} to search for. | |
// * `range` A {Range} in which to search. | |
// * `iterator` A {Function} that's called on each match with an {Object} | |
// containing the following keys: | |
// * `match` The current regular expression match. | |
// * `matchText` A {String} with the text of the match. | |
// * `range` The {Range} of the match. | |
// * `stop` Call this {Function} to terminate the scan. | |
// * `replace` Call this {Function} with a {String} to replace the match. | |
backwardsScanInBufferRange (regex, range, iterator) { return this.buffer.backwardsScanInRange(regex, range, iterator) } | |
/* | |
Section: Tab Behavior | |
*/ | |
// Essential: Returns a {Boolean} indicating whether softTabs are enabled for this | |
// editor. | |
getSoftTabs () { return this.softTabs } | |
// Essential: Enable or disable soft tabs for this editor. | |
// | |
// * `softTabs` A {Boolean} | |
setSoftTabs (softTabs) { | |
this.softTabs = softTabs | |
this.update({softTabs: this.softTabs}) | |
} | |
// Returns a {Boolean} indicating whether atomic soft tabs are enabled for this editor. | |
hasAtomicSoftTabs () { return this.displayLayer.atomicSoftTabs } | |
// Essential: Toggle soft tabs for this editor | |
toggleSoftTabs () { this.setSoftTabs(!this.getSoftTabs()) } | |
// Essential: Get the on-screen length of tab characters. | |
// | |
// Returns a {Number}. | |
getTabLength () { return this.displayLayer.tabLength } | |
// Essential: Set the on-screen length of tab characters. Setting this to a | |
// {Number} This will override the `editor.tabLength` setting. | |
// | |
// * `tabLength` {Number} length of a single tab. Setting to `null` will | |
// fallback to using the `editor.tabLength` config setting | |
setTabLength (tabLength) { this.update({tabLength}) } | |
// Returns an {Object} representing the current invisible character | |
// substitutions for this editor. See {::setInvisibles}. | |
getInvisibles () { | |
if (!this.mini && this.showInvisibles && (this.invisibles != null)) { | |
return this.invisibles | |
} else { | |
return {} | |
} | |
} | |
doesShowIndentGuide () { return this.showIndentGuide && !this.mini } | |
getSoftWrapHangingIndentLength () { return this.displayLayer.softWrapHangingIndent } | |
// Extended: Determine if the buffer uses hard or soft tabs. | |
// | |
// Returns `true` if the first non-comment line with leading whitespace starts | |
// with a space character. Returns `false` if it starts with a hard tab (`\t`). | |
// | |
// Returns a {Boolean} or undefined if no non-comment lines had leading | |
// whitespace. | |
usesSoftTabs () { | |
const languageMode = this.buffer.getLanguageMode() | |
const hasIsRowCommented = languageMode.isRowCommented | |
for (let bufferRow = 0, end = Math.min(1000, this.buffer.getLastRow()); bufferRow <= end; bufferRow++) { | |
if (hasIsRowCommented && languageMode.isRowCommented(bufferRow)) continue | |
const line = this.buffer.lineForRow(bufferRow) | |
if (line[0] === ' ') return true | |
if (line[0] === '\t') return false | |
} | |
} | |
// Extended: Get the text representing a single level of indent. | |
// | |
// If soft tabs are enabled, the text is composed of N spaces, where N is the | |
// tab length. Otherwise the text is a tab character (`\t`). | |
// | |
// Returns a {String}. | |
getTabText () { return this.buildIndentString(1) } | |
// If soft tabs are enabled, convert all hard tabs to soft tabs in the given | |
// {Range}. | |
normalizeTabsInBufferRange (bufferRange) { | |
if (!this.getSoftTabs()) { return } | |
return this.scanInBufferRange(/\t/g, bufferRange, ({replace}) => replace(this.getTabText())) | |
} | |
/* | |
Section: Soft Wrap Behavior | |
*/ | |
// Essential: Determine whether lines in this editor are soft-wrapped. | |
// | |
// Returns a {Boolean}. | |
isSoftWrapped () { return this.softWrapped } | |
// Essential: Enable or disable soft wrapping for this editor. | |
// | |
// * `softWrapped` A {Boolean} | |
// | |
// Returns a {Boolean}. | |
setSoftWrapped (softWrapped) { | |
this.update({softWrapped}) | |
return this.isSoftWrapped() | |
} | |
getPreferredLineLength () { return this.preferredLineLength } | |
// Essential: Toggle soft wrapping for this editor | |
// | |
// Returns a {Boolean}. | |
toggleSoftWrapped () { return this.setSoftWrapped(!this.isSoftWrapped()) } | |
// Essential: Gets the column at which column will soft wrap | |
getSoftWrapColumn () { | |
if (this.isSoftWrapped() && !this.mini) { | |
if (this.softWrapAtPreferredLineLength) { | |
return Math.min(this.getEditorWidthInChars(), this.preferredLineLength) | |
} else { | |
return this.getEditorWidthInChars() | |
} | |
} else { | |
return this.maxScreenLineLength | |
} | |
} | |
/* | |
Section: Indentation | |
*/ | |
// Essential: Get the indentation level of the given buffer row. | |
// | |
// Determines how deeply the given row is indented based on the soft tabs and | |
// tab length settings of this editor. Note that if soft tabs are enabled and | |
// the tab length is 2, a row with 4 leading spaces would have an indentation | |
// level of 2. | |
// | |
// * `bufferRow` A {Number} indicating the buffer row. | |
// | |
// Returns a {Number}. | |
indentationForBufferRow (bufferRow) { | |
return this.indentLevelForLine(this.lineTextForBufferRow(bufferRow)) | |
} | |
// Essential: Set the indentation level for the given buffer row. | |
// | |
// Inserts or removes hard tabs or spaces based on the soft tabs and tab length | |
// settings of this editor in order to bring it to the given indentation level. | |
// Note that if soft tabs are enabled and the tab length is 2, a row with 4 | |
// leading spaces would have an indentation level of 2. | |
// | |
// * `bufferRow` A {Number} indicating the buffer row. | |
// * `newLevel` A {Number} indicating the new indentation level. | |
// * `options` (optional) An {Object} with the following keys: | |
// * `preserveLeadingWhitespace` `true` to preserve any whitespace already at | |
// the beginning of the line (default: false). | |
setIndentationForBufferRow (bufferRow, newLevel, {preserveLeadingWhitespace} = {}) { | |
let endColumn | |
if (preserveLeadingWhitespace) { | |
endColumn = 0 | |
} else { | |
endColumn = this.lineTextForBufferRow(bufferRow).match(/^\s*/)[0].length | |
} | |
const newIndentString = this.buildIndentString(newLevel) | |
return this.buffer.setTextInRange([[bufferRow, 0], [bufferRow, endColumn]], newIndentString) | |
} | |
// Extended: Indent rows intersecting selections by one level. | |
indentSelectedRows () { | |
return this.mutateSelectedText(selection => selection.indentSelectedRows()) | |
} | |
// Extended: Outdent rows intersecting selections by one level. | |
outdentSelectedRows () { | |
return this.mutateSelectedText(selection => selection.outdentSelectedRows()) | |
} | |
// Extended: Get the indentation level of the given line of text. | |
// | |
// Determines how deeply the given line is indented based on the soft tabs and | |
// tab length settings of this editor. Note that if soft tabs are enabled and | |
// the tab length is 2, a row with 4 leading spaces would have an indentation | |
// level of 2. | |
// | |
// * `line` A {String} representing a line of text. | |
// | |
// Returns a {Number}. | |
indentLevelForLine (line) { | |
const tabLength = this.getTabLength() | |
let indentLength = 0 | |
for (let i = 0, {length} = line; i < length; i++) { | |
const char = line[i] | |
if (char === '\t') { | |
indentLength += tabLength - (indentLength % tabLength) | |
} else if (char === ' ') { | |
indentLength++ | |
} else { | |
break | |
} | |
} | |
return indentLength / tabLength | |
} | |
// Extended: Indent rows intersecting selections based on the grammar's suggested | |
// indent level. | |
autoIndentSelectedRows () { | |
return this.mutateSelectedText(selection => selection.autoIndentSelectedRows()) | |
} | |
// Indent all lines intersecting selections. See {Selection::indent} for more | |
// information. | |
indent (options = {}) { | |
if (options.autoIndent == null) options.autoIndent = this.shouldAutoIndent() | |
this.mutateSelectedText(selection => selection.indent(options)) | |
} | |
// Constructs the string used for indents. | |
buildIndentString (level, column = 0) { | |
if (this.getSoftTabs()) { | |
const tabStopViolation = column % this.getTabLength() | |
return _.multiplyString(' ', Math.floor(level * this.getTabLength()) - tabStopViolation) | |
} else { | |
const excessWhitespace = _.multiplyString(' ', Math.round((level - Math.floor(level)) * this.getTabLength())) | |
return _.multiplyString('\t', Math.floor(level)) + excessWhitespace | |
} | |
} | |
/* | |
Section: Grammars | |
*/ | |
// Essential: Get the current {Grammar} of this editor. | |
getGrammar () { | |
const languageMode = this.buffer.getLanguageMode() | |
return languageMode.getGrammar && languageMode.getGrammar() || NullGrammar | |
} | |
// Deprecated: Set the current {Grammar} of this editor. | |
// | |
// Assigning a grammar will cause the editor to re-tokenize based on the new | |
// grammar. | |
// | |
// * `grammar` {Grammar} | |
setGrammar (grammar) { | |
const buffer = this.getBuffer() | |
buffer.setLanguageMode(atom.grammars.languageModeForGrammarAndBuffer(grammar, buffer)) | |
} | |
// Experimental: Get a notification when async tokenization is completed. | |
onDidTokenize (callback) { | |
return this.emitter.on('did-tokenize', callback) | |
} | |
/* | |
Section: Managing Syntax Scopes | |
*/ | |
// Essential: Returns a {ScopeDescriptor} that includes this editor's language. | |
// e.g. `['.source.ruby']`, or `['.source.coffee']`. You can use this with | |
// {Config::get} to get language specific config values. | |
getRootScopeDescriptor () { | |
return this.buffer.getLanguageMode().rootScopeDescriptor | |
} | |
// Essential: Get the syntactic scopeDescriptor for the given position in buffer | |
// coordinates. Useful with {Config::get}. | |
// | |
// For example, if called with a position inside the parameter list of an | |
// anonymous CoffeeScript function, the method returns the following array: | |
// `["source.coffee", "meta.inline.function.coffee", "variable.parameter.function.coffee"]` | |
// | |
// * `bufferPosition` A {Point} or {Array} of [row, column]. | |
// | |
// Returns a {ScopeDescriptor}. | |
scopeDescriptorForBufferPosition (bufferPosition) { | |
return this.buffer.getLanguageMode().scopeDescriptorForPosition(bufferPosition) | |
} | |
// Extended: Get the range in buffer coordinates of all tokens surrounding the | |
// cursor that match the given scope selector. | |
// | |
// For example, if you wanted to find the string surrounding the cursor, you | |
// could call `editor.bufferRangeForScopeAtCursor(".string.quoted")`. | |
// | |
// * `scopeSelector` {String} selector. e.g. `'.source.ruby'` | |
// | |
// Returns a {Range}. | |
bufferRangeForScopeAtCursor (scopeSelector) { | |
return this.bufferRangeForScopeAtPosition(scopeSelector, this.getCursorBufferPosition()) | |
} | |
bufferRangeForScopeAtPosition (scopeSelector, position) { | |
return this.buffer.getLanguageMode().bufferRangeForScopeAtPosition(scopeSelector, position) | |
} | |
// Extended: Determine if the given row is entirely a comment | |
isBufferRowCommented (bufferRow) { | |
const match = this.lineTextForBufferRow(bufferRow).match(/\S/) | |
if (match) { | |
if (!this.commentScopeSelector) this.commentScopeSelector = new TextMateScopeSelector('comment.*') | |
return this.commentScopeSelector.matches(this.scopeDescriptorForBufferPosition([bufferRow, match.index]).scopes) | |
} | |
} | |
// Get the scope descriptor at the cursor. | |
getCursorScope () { | |
return this.getLastCursor().getScopeDescriptor() | |
} | |
tokenForBufferPosition (bufferPosition) { | |
return this.buffer.getLanguageMode().tokenForPosition(bufferPosition) | |
} | |
/* | |
Section: Clipboard Operations | |
*/ | |
// Essential: For each selection, copy the selected text. | |
copySelectedText () { | |
let maintainClipboard = false | |
for (let selection of this.getSelectionsOrderedByBufferPosition()) { | |
if (selection.isEmpty()) { | |
const previousRange = selection.getBufferRange() | |
selection.selectLine() | |
selection.copy(maintainClipboard, true) | |
selection.setBufferRange(previousRange) | |
} else { | |
selection.copy(maintainClipboard, false) | |
} | |
maintainClipboard = true | |
} | |
} | |
// Private: For each selection, only copy highlighted text. | |
copyOnlySelectedText () { | |
let maintainClipboard = false | |
for (let selection of this.getSelectionsOrderedByBufferPosition()) { | |
if (!selection.isEmpty()) { | |
selection.copy(maintainClipboard, false) | |
maintainClipboard = true | |
} | |
} | |
} | |
// Essential: For each selection, cut the selected text. | |
cutSelectedText () { | |
let maintainClipboard = false | |
this.mutateSelectedText(selection => { | |
if (selection.isEmpty()) { | |
selection.selectLine() | |
selection.cut(maintainClipboard, true) | |
} else { | |
selection.cut(maintainClipboard, false) | |
} | |
maintainClipboard = true | |
}) | |
} | |
// Essential: For each selection, replace the selected text with the contents of | |
// the clipboard. | |
// | |
// If the clipboard contains the same number of selections as the current | |
// editor, each selection will be replaced with the content of the | |
// corresponding clipboard selection text. | |
// | |
// * `options` (optional) See {Selection::insertText}. | |
pasteText (options) { | |
options = Object.assign({}, options) | |
let {text: clipboardText, metadata} = this.constructor.clipboard.readWithMetadata() | |
if (!this.emitWillInsertTextEvent(clipboardText)) return false | |
if (!metadata) metadata = {} | |
if (options.autoIndent == null) options.autoIndent = this.shouldAutoIndentOnPaste() | |
this.mutateSelectedText((selection, index) => { | |
let fullLine, indentBasis, text | |
if (metadata.selections && metadata.selections.length === this.getSelections().length) { | |
({text, indentBasis, fullLine} = metadata.selections[index]) | |
} else { | |
({indentBasis, fullLine} = metadata) | |
text = clipboardText | |
} | |
if (indentBasis != null && (text.includes('\n') || !selection.cursor.hasPrecedingCharactersOnLine())) { | |
options.indentBasis = indentBasis | |
} else { | |
options.indentBasis = null | |
} | |
let range | |
if (fullLine && selection.isEmpty()) { | |
const oldPosition = selection.getBufferRange().start | |
selection.setBufferRange([[oldPosition.row, 0], [oldPosition.row, 0]]) | |
range = selection.insertText(text, options) | |
const newPosition = oldPosition.translate([1, 0]) | |
selection.setBufferRange([newPosition, newPosition]) | |
} else { | |
range = selection.insertText(text, options) | |
} | |
this.emitter.emit('did-insert-text', {text, range}) | |
}) | |
} | |
// Essential: For each selection, if the selection is empty, cut all characters | |
// of the containing screen line following the cursor. Otherwise cut the selected | |
// text. | |
cutToEndOfLine () { | |
let maintainClipboard = false | |
this.mutateSelectedText(selection => { | |
selection.cutToEndOfLine(maintainClipboard) | |
maintainClipboard = true | |
}) | |
} | |
// Essential: For each selection, if the selection is empty, cut all characters | |
// of the containing buffer line following the cursor. Otherwise cut the | |
// selected text. | |
cutToEndOfBufferLine () { | |
let maintainClipboard = false | |
this.mutateSelectedText(selection => { | |
selection.cutToEndOfBufferLine(maintainClipboard) | |
maintainClipboard = true | |
}) | |
} | |
/* | |
Section: Folds | |
*/ | |
// Essential: Fold the most recent cursor's row based on its indentation level. | |
// | |
// The fold will extend from the nearest preceding line with a lower | |
// indentation level up to the nearest following row with a lower indentation | |
// level. | |
foldCurrentRow () { | |
const {row} = this.getCursorBufferPosition() | |
const languageMode = this.buffer.getLanguageMode() | |
const range = ( | |
languageMode.getFoldableRangeContainingPoint && | |
languageMode.getFoldableRangeContainingPoint(Point(row, Infinity), this.getTabLength()) | |
) | |
if (range) return this.displayLayer.foldBufferRange(range) | |
} | |
// Essential: Unfold the most recent cursor's row by one level. | |
unfoldCurrentRow () { | |
const {row} = this.getCursorBufferPosition() | |
return this.displayLayer.destroyFoldsContainingBufferPositions([Point(row, Infinity)], false) | |
} | |
// Essential: Fold the given row in buffer coordinates based on its indentation | |
// level. | |
// | |
// If the given row is foldable, the fold will begin there. Otherwise, it will | |
// begin at the first foldable row preceding the given row. | |
// | |
// * `bufferRow` A {Number}. | |
foldBufferRow (bufferRow) { | |
let position = Point(bufferRow, Infinity) | |
const languageMode = this.buffer.getLanguageMode() | |
while (true) { | |
const foldableRange = ( | |
languageMode.getFoldableRangeContainingPoint && | |
languageMode.getFoldableRangeContainingPoint(position, this.getTabLength()) | |
) | |
if (foldableRange) { | |
const existingFolds = this.displayLayer.foldsIntersectingBufferRange(Range(foldableRange.start, foldableRange.start)) | |
if (existingFolds.length === 0) { | |
this.displayLayer.foldBufferRange(foldableRange) | |
} else { | |
const firstExistingFoldRange = this.displayLayer.bufferRangeForFold(existingFolds[0]) | |
if (firstExistingFoldRange.start.isLessThan(position)) { | |
position = Point(firstExistingFoldRange.start.row, 0) | |
continue | |
} | |
} | |
} | |
break | |
} | |
} | |
// Essential: Unfold all folds containing the given row in buffer coordinates. | |
// | |
// * `bufferRow` A {Number} | |
unfoldBufferRow (bufferRow) { | |
const position = Point(bufferRow, Infinity) | |
return this.displayLayer.destroyFoldsContainingBufferPositions([position]) | |
} | |
// Extended: For each selection, fold the rows it intersects. | |
foldSelectedLines () { | |
for (let selection of this.selections) { | |
selection.fold() | |
} | |
} | |
// Extended: Fold all foldable lines. | |
foldAll () { | |
const languageMode = this.buffer.getLanguageMode() | |
const foldableRanges = ( | |
languageMode.getFoldableRanges && | |
languageMode.getFoldableRanges(this.getTabLength()) | |
) | |
this.displayLayer.destroyAllFolds() | |
for (let range of foldableRanges || []) { | |
this.displayLayer.foldBufferRange(range) | |
} | |
} | |
// Extended: Unfold all existing folds. | |
unfoldAll () { | |
const result = this.displayLayer.destroyAllFolds() | |
this.scrollToCursorPosition() | |
return result | |
} | |
// Extended: Fold all foldable lines at the given indent level. | |
// | |
// * `level` A {Number}. | |
foldAllAtIndentLevel (level) { | |
const languageMode = this.buffer.getLanguageMode() | |
const foldableRanges = ( | |
languageMode.getFoldableRangesAtIndentLevel && | |
languageMode.getFoldableRangesAtIndentLevel(level, this.getTabLength()) | |
) | |
this.displayLayer.destroyAllFolds() | |
for (let range of foldableRanges || []) { | |
this.displayLayer.foldBufferRange(range) | |
} | |
} | |
// Extended: Determine whether the given row in buffer coordinates is foldable. | |
// | |
// A *foldable* row is a row that *starts* a row range that can be folded. | |
// | |
// * `bufferRow` A {Number} | |
// | |
// Returns a {Boolean}. | |
isFoldableAtBufferRow (bufferRow) { | |
const languageMode = this.buffer.getLanguageMode() | |
return languageMode.isFoldableAtRow && languageMode.isFoldableAtRow(bufferRow) | |
} | |
// Extended: Determine whether the given row in screen coordinates is foldable. | |
// | |
// A *foldable* row is a row that *starts* a row range that can be folded. | |
// | |
// * `bufferRow` A {Number} | |
// | |
// Returns a {Boolean}. | |
isFoldableAtScreenRow (screenRow) { | |
return this.isFoldableAtBufferRow(this.bufferRowForScreenRow(screenRow)) | |
} | |
// Extended: Fold the given buffer row if it isn't currently folded, and unfold | |
// it otherwise. | |
toggleFoldAtBufferRow (bufferRow) { | |
if (this.isFoldedAtBufferRow(bufferRow)) { | |
return this.unfoldBufferRow(bufferRow) | |
} else { | |
return this.foldBufferRow(bufferRow) | |
} | |
} | |
// Extended: Determine whether the most recently added cursor's row is folded. | |
// | |
// Returns a {Boolean}. | |
isFoldedAtCursorRow () { | |
return this.isFoldedAtBufferRow(this.getCursorBufferPosition().row) | |
} | |
// Extended: Determine whether the given row in buffer coordinates is folded. | |
// | |
// * `bufferRow` A {Number} | |
// | |
// Returns a {Boolean}. | |
isFoldedAtBufferRow (bufferRow) { | |
const range = Range( | |
Point(bufferRow, 0), | |
Point(bufferRow, this.buffer.lineLengthForRow(bufferRow)) | |
) | |
return this.displayLayer.foldsIntersectingBufferRange(range).length > 0 | |
} | |
// Extended: Determine whether the given row in screen coordinates is folded. | |
// | |
// * `screenRow` A {Number} | |
// | |
// Returns a {Boolean}. | |
isFoldedAtScreenRow (screenRow) { | |
return this.isFoldedAtBufferRow(this.bufferRowForScreenRow(screenRow)) | |
} | |
// Creates a new fold between two row numbers. | |
// | |
// startRow - The row {Number} to start folding at | |
// endRow - The row {Number} to end the fold | |
// | |
// Returns the new {Fold}. | |
foldBufferRowRange (startRow, endRow) { | |
return this.foldBufferRange(Range(Point(startRow, Infinity), Point(endRow, Infinity))) | |
} | |
foldBufferRange (range) { | |
return this.displayLayer.foldBufferRange(range) | |
} | |
// Remove any {Fold}s found that intersect the given buffer range. | |
destroyFoldsIntersectingBufferRange (bufferRange) { | |
return this.displayLayer.destroyFoldsIntersectingBufferRange(bufferRange) | |
} | |
// Remove any {Fold}s found that contain the given array of buffer positions. | |
destroyFoldsContainingBufferPositions (bufferPositions, excludeEndpoints) { | |
return this.displayLayer.destroyFoldsContainingBufferPositions(bufferPositions, excludeEndpoints) | |
} | |
/* | |
Section: Gutters | |
*/ | |
// Essential: Add a custom {Gutter}. | |
// | |
// * `options` An {Object} with the following fields: | |
// * `name` (required) A unique {String} to identify this gutter. | |
// * `priority` (optional) A {Number} that determines stacking order between | |
// gutters. Lower priority items are forced closer to the edges of the | |
// window. (default: -100) | |
// * `visible` (optional) {Boolean} specifying whether the gutter is visible | |
// initially after being created. (default: true) | |
// | |
// Returns the newly-created {Gutter}. | |
addGutter (options) { | |
return this.gutterContainer.addGutter(options) | |
} | |
// Essential: Get this editor's gutters. | |
// | |
// Returns an {Array} of {Gutter}s. | |
getGutters () { | |
return this.gutterContainer.getGutters() | |
} | |
getLineNumberGutter () { | |
return this.lineNumberGutter | |
} | |
// Essential: Get the gutter with the given name. | |
// | |
// Returns a {Gutter}, or `null` if no gutter exists for the given name. | |
gutterWithName (name) { | |
return this.gutterContainer.gutterWithName(name) | |
} | |
/* | |
Section: Scrolling the TextEditor | |
*/ | |
// Essential: Scroll the editor to reveal the most recently added cursor if it is | |
// off-screen. | |
// | |
// * `options` (optional) {Object} | |
// * `center` Center the editor around the cursor if possible. (default: true) | |
scrollToCursorPosition (options) { | |
this.getLastCursor().autoscroll({center: options && options.center !== false}) | |
} | |
// Essential: Scrolls the editor to the given buffer position. | |
// | |
// * `bufferPosition` An object that represents a buffer position. It can be either | |
// an {Object} (`{row, column}`), {Array} (`[row, column]`), or {Point} | |
// * `options` (optional) {Object} | |
// * `center` Center the editor around the position if possible. (default: false) | |
scrollToBufferPosition (bufferPosition, options) { | |
return this.scrollToScreenPosition(this.screenPositionForBufferPosition(bufferPosition), options) | |
} | |
// Essential: Scrolls the editor to the given screen position. | |
// | |
// * `screenPosition` An object that represents a screen position. It can be either | |
// an {Object} (`{row, column}`), {Array} (`[row, column]`), or {Point} | |
// * `options` (optional) {Object} | |
// * `center` Center the editor around the position if possible. (default: false) | |
scrollToScreenPosition (screenPosition, options) { | |
this.scrollToScreenRange(new Range(screenPosition, screenPosition), options) | |
} | |
scrollToTop () { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::scrollToTop instead.') | |
this.getElement().scrollToTop() | |
} | |
scrollToBottom () { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::scrollToTop instead.') | |
this.getElement().scrollToBottom() | |
} | |
scrollToScreenRange (screenRange, options = {}) { | |
if (options.clip !== false) screenRange = this.clipScreenRange(screenRange) | |
const scrollEvent = {screenRange, options} | |
if (this.component) this.component.didRequestAutoscroll(scrollEvent) | |
this.emitter.emit('did-request-autoscroll', scrollEvent) | |
} | |
getHorizontalScrollbarHeight () { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::getHorizontalScrollbarHeight instead.') | |
return this.getElement().getHorizontalScrollbarHeight() | |
} | |
getVerticalScrollbarWidth () { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::getVerticalScrollbarWidth instead.') | |
return this.getElement().getVerticalScrollbarWidth() | |
} | |
pageUp () { | |
this.moveUp(this.getRowsPerPage()) | |
} | |
pageDown () { | |
this.moveDown(this.getRowsPerPage()) | |
} | |
selectPageUp () { | |
this.selectUp(this.getRowsPerPage()) | |
} | |
selectPageDown () { | |
this.selectDown(this.getRowsPerPage()) | |
} | |
// Returns the number of rows per page | |
getRowsPerPage () { | |
if (this.component) { | |
const clientHeight = this.component.getScrollContainerClientHeight() | |
const lineHeight = this.component.getLineHeight() | |
return Math.max(1, Math.ceil(clientHeight / lineHeight)) | |
} else { | |
return 1 | |
} | |
} | |
/* | |
Section: Config | |
*/ | |
// Experimental: Is auto-indentation enabled for this editor? | |
// | |
// Returns a {Boolean}. | |
shouldAutoIndent () { return this.autoIndent } | |
// Experimental: Is auto-indentation on paste enabled for this editor? | |
// | |
// Returns a {Boolean}. | |
shouldAutoIndentOnPaste () { return this.autoIndentOnPaste } | |
// Experimental: Does this editor allow scrolling past the last line? | |
// | |
// Returns a {Boolean}. | |
getScrollPastEnd () { | |
if (this.getAutoHeight()) { | |
return false | |
} else { | |
return this.scrollPastEnd | |
} | |
} | |
// Experimental: How fast does the editor scroll in response to mouse wheel | |
// movements? | |
// | |
// Returns a positive {Number}. | |
getScrollSensitivity () { return this.scrollSensitivity } | |
// Experimental: Does this editor show cursors while there is a selection? | |
// | |
// Returns a positive {Boolean}. | |
getShowCursorOnSelection () { return this.showCursorOnSelection } | |
// Experimental: Are line numbers enabled for this editor? | |
// | |
// Returns a {Boolean} | |
doesShowLineNumbers () { return this.showLineNumbers } | |
// Experimental: Get the time interval within which text editing operations | |
// are grouped together in the editor's undo history. | |
// | |
// Returns the time interval {Number} in milliseconds. | |
getUndoGroupingInterval () { return this.undoGroupingInterval } | |
// Experimental: Get the characters that are *not* considered part of words, | |
// for the purpose of word-based cursor movements. | |
// | |
// Returns a {String} containing the non-word characters. | |
getNonWordCharacters (position) { | |
const languageMode = this.buffer.getLanguageMode() | |
return ( | |
languageMode.getNonWordCharacters && | |
languageMode.getNonWordCharacters(position || Point(0, 0)) | |
) || DEFAULT_NON_WORD_CHARACTERS | |
} | |
/* | |
Section: Event Handlers | |
*/ | |
handleLanguageModeChange () { | |
this.unfoldAll() | |
if (this.languageModeSubscription) { | |
this.languageModeSubscription.dispose() | |
this.disposables.remove(this.languageModeSubscription) | |
} | |
const languageMode = this.buffer.getLanguageMode() | |
if (this.component && this.component.visible && languageMode.startTokenizing) { | |
languageMode.startTokenizing() | |
} | |
this.languageModeSubscription = languageMode.onDidTokenize && languageMode.onDidTokenize(() => { | |
this.emitter.emit('did-tokenize') | |
}) | |
if (this.languageModeSubscription) this.disposables.add(this.languageModeSubscription) | |
this.emitter.emit('did-change-grammar', languageMode.grammar) | |
} | |
/* | |
Section: TextEditor Rendering | |
*/ | |
// Get the Element for the editor. | |
getElement () { | |
if (!this.component) { | |
if (!TextEditorComponent) TextEditorComponent = require("../src/text-editor-component.js") | |
if (!TextEditorElement) TextEditorElement = require("../src/text-editor-element.js") | |
this.component = new TextEditorComponent({ | |
model: this, | |
updatedSynchronously: TextEditorElement.prototype.updatedSynchronously, | |
initialScrollTopRow: this.initialScrollTopRow, | |
initialScrollLeftColumn: this.initialScrollLeftColumn | |
}) | |
} | |
return this.component.element | |
} | |
getAllowedLocations () { | |
return ['center'] | |
} | |
// Essential: Retrieves the greyed out placeholder of a mini editor. | |
// | |
// Returns a {String}. | |
getPlaceholderText () { return this.placeholderText } | |
// Essential: Set the greyed out placeholder of a mini editor. Placeholder text | |
// will be displayed when the editor has no content. | |
// | |
// * `placeholderText` {String} text that is displayed when the editor has no content. | |
setPlaceholderText (placeholderText) { this.update({placeholderText}) } | |
pixelPositionForBufferPosition (bufferPosition) { | |
Grim.deprecate('This method is deprecated on the model layer. Use `TextEditorElement::pixelPositionForBufferPosition` instead') | |
return this.getElement().pixelPositionForBufferPosition(bufferPosition) | |
} | |
pixelPositionForScreenPosition (screenPosition) { | |
Grim.deprecate('This method is deprecated on the model layer. Use `TextEditorElement::pixelPositionForScreenPosition` instead') | |
return this.getElement().pixelPositionForScreenPosition(screenPosition) | |
} | |
getVerticalScrollMargin () { | |
const maxScrollMargin = Math.floor(((this.height / this.getLineHeightInPixels()) - 1) / 2) | |
return Math.min(this.verticalScrollMargin, maxScrollMargin) | |
} | |
setVerticalScrollMargin (verticalScrollMargin) { | |
this.verticalScrollMargin = verticalScrollMargin | |
return this.verticalScrollMargin | |
} | |
getHorizontalScrollMargin () { | |
return Math.min(this.horizontalScrollMargin, Math.floor(((this.width / this.getDefaultCharWidth()) - 1) / 2)) | |
} | |
setHorizontalScrollMargin (horizontalScrollMargin) { | |
this.horizontalScrollMargin = horizontalScrollMargin | |
return this.horizontalScrollMargin | |
} | |
getLineHeightInPixels () { return this.lineHeightInPixels } | |
setLineHeightInPixels (lineHeightInPixels) { | |
this.lineHeightInPixels = lineHeightInPixels | |
return this.lineHeightInPixels | |
} | |
getKoreanCharWidth () { return this.koreanCharWidth } | |
getHalfWidthCharWidth () { return this.halfWidthCharWidth } | |
getDoubleWidthCharWidth () { return this.doubleWidthCharWidth } | |
getDefaultCharWidth () { return this.defaultCharWidth } | |
ratioForCharacter (character) { | |
if (isKoreanCharacter(character)) { | |
return this.getKoreanCharWidth() / this.getDefaultCharWidth() | |
} else if (isHalfWidthCharacter(character)) { | |
return this.getHalfWidthCharWidth() / this.getDefaultCharWidth() | |
} else if (isDoubleWidthCharacter(character)) { | |
return this.getDoubleWidthCharWidth() / this.getDefaultCharWidth() | |
} else { | |
return 1 | |
} | |
} | |
setDefaultCharWidth (defaultCharWidth, doubleWidthCharWidth, halfWidthCharWidth, koreanCharWidth) { | |
if (doubleWidthCharWidth == null) { doubleWidthCharWidth = defaultCharWidth } | |
if (halfWidthCharWidth == null) { halfWidthCharWidth = defaultCharWidth } | |
if (koreanCharWidth == null) { koreanCharWidth = defaultCharWidth } | |
if (defaultCharWidth !== this.defaultCharWidth || | |
(doubleWidthCharWidth !== this.doubleWidthCharWidth && | |
halfWidthCharWidth !== this.halfWidthCharWidth && | |
koreanCharWidth !== this.koreanCharWidth)) { | |
this.defaultCharWidth = defaultCharWidth | |
this.doubleWidthCharWidth = doubleWidthCharWidth | |
this.halfWidthCharWidth = halfWidthCharWidth | |
this.koreanCharWidth = koreanCharWidth | |
if (this.isSoftWrapped()) { | |
this.displayLayer.reset({ | |
softWrapColumn: this.getSoftWrapColumn() | |
}) | |
} | |
} | |
return defaultCharWidth | |
} | |
setHeight (height) { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::setHeight instead.') | |
this.getElement().setHeight(height) | |
} | |
getHeight () { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::getHeight instead.') | |
return this.getElement().getHeight() | |
} | |
getAutoHeight () { return this.autoHeight != null ? this.autoHeight : true } | |
getAutoWidth () { return this.autoWidth != null ? this.autoWidth : false } | |
setWidth (width) { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::setWidth instead.') | |
this.getElement().setWidth(width) | |
} | |
getWidth () { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::getWidth instead.') | |
return this.getElement().getWidth() | |
} | |
// Use setScrollTopRow instead of this method | |
setFirstVisibleScreenRow (screenRow) { | |
this.setScrollTopRow(screenRow) | |
} | |
getFirstVisibleScreenRow () { | |
return this.getElement().component.getFirstVisibleRow() | |
} | |
getLastVisibleScreenRow () { | |
return this.getElement().component.getLastVisibleRow() | |
} | |
getVisibleRowRange () { | |
return [this.getFirstVisibleScreenRow(), this.getLastVisibleScreenRow()] | |
} | |
// Use setScrollLeftColumn instead of this method | |
setFirstVisibleScreenColumn (column) { | |
return this.setScrollLeftColumn(column) | |
} | |
getFirstVisibleScreenColumn () { | |
return this.getElement().component.getFirstVisibleColumn() | |
} | |
getScrollTop () { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::getScrollTop instead.') | |
return this.getElement().getScrollTop() | |
} | |
setScrollTop (scrollTop) { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::setScrollTop instead.') | |
this.getElement().setScrollTop(scrollTop) | |
} | |
getScrollBottom () { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::getScrollBottom instead.') | |
return this.getElement().getScrollBottom() | |
} | |
setScrollBottom (scrollBottom) { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::setScrollBottom instead.') | |
this.getElement().setScrollBottom(scrollBottom) | |
} | |
getScrollLeft () { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::getScrollLeft instead.') | |
return this.getElement().getScrollLeft() | |
} | |
setScrollLeft (scrollLeft) { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::setScrollLeft instead.') | |
this.getElement().setScrollLeft(scrollLeft) | |
} | |
getScrollRight () { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::getScrollRight instead.') | |
return this.getElement().getScrollRight() | |
} | |
setScrollRight (scrollRight) { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::setScrollRight instead.') | |
this.getElement().setScrollRight(scrollRight) | |
} | |
getScrollHeight () { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::getScrollHeight instead.') | |
return this.getElement().getScrollHeight() | |
} | |
getScrollWidth () { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::getScrollWidth instead.') | |
return this.getElement().getScrollWidth() | |
} | |
getMaxScrollTop () { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::getMaxScrollTop instead.') | |
return this.getElement().getMaxScrollTop() | |
} | |
getScrollTopRow () { | |
return this.getElement().component.getScrollTopRow() | |
} | |
setScrollTopRow (scrollTopRow) { | |
this.getElement().component.setScrollTopRow(scrollTopRow) | |
} | |
getScrollLeftColumn () { | |
return this.getElement().component.getScrollLeftColumn() | |
} | |
setScrollLeftColumn (scrollLeftColumn) { | |
this.getElement().component.setScrollLeftColumn(scrollLeftColumn) | |
} | |
intersectsVisibleRowRange (startRow, endRow) { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::intersectsVisibleRowRange instead.') | |
return this.getElement().intersectsVisibleRowRange(startRow, endRow) | |
} | |
selectionIntersectsVisibleRowRange (selection) { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::selectionIntersectsVisibleRowRange instead.') | |
return this.getElement().selectionIntersectsVisibleRowRange(selection) | |
} | |
screenPositionForPixelPosition (pixelPosition) { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::screenPositionForPixelPosition instead.') | |
return this.getElement().screenPositionForPixelPosition(pixelPosition) | |
} | |
pixelRectForScreenRange (screenRange) { | |
Grim.deprecate('This is now a view method. Call TextEditorElement::pixelRectForScreenRange instead.') | |
return this.getElement().pixelRectForScreenRange(screenRange) | |
} | |
/* | |
Section: Utility | |
*/ | |
inspect () { | |
return `<TextEditor ${this.id}>` | |
} | |
emitWillInsertTextEvent (text) { | |
let result = true | |
const cancel = () => { result = false } | |
this.emitter.emit('will-insert-text', {cancel, text}) | |
return result | |
} | |
/* | |
Section: Language Mode Delegated Methods | |
*/ | |
suggestedIndentForBufferRow (bufferRow, options) { | |
const languageMode = this.buffer.getLanguageMode() | |
return ( | |
languageMode.suggestedIndentForBufferRow && | |
languageMode.suggestedIndentForBufferRow(bufferRow, this.getTabLength(), options) | |
) | |
} | |
// Given a buffer row, indent it. | |
// | |
// * bufferRow - The row {Number}. | |
// * options - An options {Object} to pass through to {TextEditor::setIndentationForBufferRow}. | |
autoIndentBufferRow (bufferRow, options) { | |
const indentLevel = this.suggestedIndentForBufferRow(bufferRow, options) | |
return this.setIndentationForBufferRow(bufferRow, indentLevel, options) | |
} | |
// Indents all the rows between two buffer row numbers. | |
// | |
// * startRow - The row {Number} to start at | |
// * endRow - The row {Number} to end at | |
autoIndentBufferRows (startRow, endRow) { | |
let row = startRow | |
while (row <= endRow) { | |
this.autoIndentBufferRow(row) | |
row++ | |
} | |
} | |
autoDecreaseIndentForBufferRow (bufferRow) { | |
const languageMode = this.buffer.getLanguageMode() | |
const indentLevel = ( | |
languageMode.suggestedIndentForEditedBufferRow && | |
languageMode.suggestedIndentForEditedBufferRow(bufferRow, this.getTabLength()) | |
) | |
if (indentLevel != null) this.setIndentationForBufferRow(bufferRow, indentLevel) | |
} | |
toggleLineCommentForBufferRow (row) { this.toggleLineCommentsForBufferRows(row, row) } | |
toggleLineCommentsForBufferRows (start, end) { | |
const languageMode = this.buffer.getLanguageMode() | |
let {commentStartString, commentEndString} = | |
languageMode.commentStringsForPosition && | |
languageMode.commentStringsForPosition(Point(start, 0)) || {} | |
if (!commentStartString) return | |
commentStartString = commentStartString.trim() | |
if (commentEndString) { | |
commentEndString = commentEndString.trim() | |
const startDelimiterColumnRange = columnRangeForStartDelimiter( | |
this.buffer.lineForRow(start), | |
commentStartString | |
) | |
if (startDelimiterColumnRange) { | |
const endDelimiterColumnRange = columnRangeForEndDelimiter( | |
this.buffer.lineForRow(end), | |
commentEndString | |
) | |
if (endDelimiterColumnRange) { | |
this.buffer.transact(() => { | |
this.buffer.delete([[end, endDelimiterColumnRange[0]], [end, endDelimiterColumnRange[1]]]) | |
this.buffer.delete([[start, startDelimiterColumnRange[0]], [start, startDelimiterColumnRange[1]]]) | |
}) | |
} | |
} else { | |
this.buffer.transact(() => { | |
const indentLength = this.buffer.lineForRow(start).match(/^\s*/)[0].length | |
this.buffer.insert([start, indentLength], commentStartString + ' ') | |
this.buffer.insert([end, this.buffer.lineLengthForRow(end)], ' ' + commentEndString) | |
}) | |
} | |
} else { | |
let hasCommentedLines = false | |
let hasUncommentedLines = false | |
for (let row = start; row <= end; row++) { | |
const line = this.buffer.lineForRow(row) | |
if (NON_WHITESPACE_REGEXP.test(line)) { | |
if (columnRangeForStartDelimiter(line, commentStartString)) { | |
hasCommentedLines = true | |
} else { | |
hasUncommentedLines = true | |
} | |
} | |
} | |
const shouldUncomment = hasCommentedLines && !hasUncommentedLines | |
if (shouldUncomment) { | |
for (let row = start; row <= end; row++) { | |
const columnRange = columnRangeForStartDelimiter( | |
this.buffer.lineForRow(row), | |
commentStartString | |
) | |
if (columnRange) this.buffer.delete([[row, columnRange[0]], [row, columnRange[1]]]) | |
} | |
} else { | |
let minIndentLevel = Infinity | |
let minBlankIndentLevel = Infinity | |
for (let row = start; row <= end; row++) { | |
const line = this.buffer.lineForRow(row) | |
const indentLevel = this.indentLevelForLine(line) | |
if (NON_WHITESPACE_REGEXP.test(line)) { | |
if (indentLevel < minIndentLevel) minIndentLevel = indentLevel | |
} else { | |
if (indentLevel < minBlankIndentLevel) minBlankIndentLevel = indentLevel | |
} | |
} | |
minIndentLevel = Number.isFinite(minIndentLevel) | |
? minIndentLevel | |
: Number.isFinite(minBlankIndentLevel) | |
? minBlankIndentLevel | |
: 0 | |
const indentString = this.buildIndentString(minIndentLevel) | |
for (let row = start; row <= end; row++) { | |
const line = this.buffer.lineForRow(row) | |
if (NON_WHITESPACE_REGEXP.test(line)) { | |
const indentColumn = columnForIndentLevel(line, minIndentLevel, this.getTabLength()) | |
this.buffer.insert(Point(row, indentColumn), commentStartString + ' ') | |
} else { | |
this.buffer.setTextInRange( | |
new Range(new Point(row, 0), new Point(row, Infinity)), | |
indentString + commentStartString + ' ' | |
) | |
} | |
} | |
} | |
} | |
} | |
rowRangeForParagraphAtBufferRow (bufferRow) { | |
if (!NON_WHITESPACE_REGEXP.test(this.lineTextForBufferRow(bufferRow))) return | |
const languageMode = this.buffer.getLanguageMode() | |
const isCommented = languageMode.isRowCommented(bufferRow) | |
let startRow = bufferRow | |
while (startRow > 0) { | |
if (!NON_WHITESPACE_REGEXP.test(this.lineTextForBufferRow(startRow - 1))) break | |
if (languageMode.isRowCommented(startRow - 1) !== isCommented) break | |
startRow-- | |
} | |
let endRow = bufferRow | |
const rowCount = this.getLineCount() | |
while (endRow < rowCount) { | |
if (!NON_WHITESPACE_REGEXP.test(this.lineTextForBufferRow(endRow + 1))) break | |
if (languageMode.isRowCommented(endRow + 1) !== isCommented) break | |
endRow++ | |
} | |
return new Range(new Point(startRow, 0), new Point(endRow, this.buffer.lineLengthForRow(endRow))) | |
} | |
} | |
function columnForIndentLevel (line, indentLevel, tabLength) { | |
let column = 0 | |
let indentLength = 0 | |
const goalIndentLength = indentLevel * tabLength | |
while (indentLength < goalIndentLength) { | |
const char = line[column] | |
if (char === '\t') { | |
indentLength += tabLength - (indentLength % tabLength) | |
} else if (char === ' ') { | |
indentLength++ | |
} else { | |
break | |
} | |
column++ | |
} | |
return column | |
} | |
function columnRangeForStartDelimiter (line, delimiter) { | |
const startColumn = line.search(NON_WHITESPACE_REGEXP) | |
if (startColumn === -1) return null | |
if (!line.startsWith(delimiter, startColumn)) return null | |
let endColumn = startColumn + delimiter.length | |
if (line[endColumn] === ' ') endColumn++ | |
return [startColumn, endColumn] | |
} | |
function columnRangeForEndDelimiter (line, delimiter) { | |
let startColumn = line.lastIndexOf(delimiter) | |
if (startColumn === -1) return null | |
const endColumn = startColumn + delimiter.length | |
if (NON_WHITESPACE_REGEXP.test(line.slice(endColumn))) return null | |
if (line[startColumn - 1] === ' ') startColumn-- | |
return [startColumn, endColumn] | |
} | |
class ChangeEvent { | |
constructor ({oldRange, newRange}) { | |
this.oldRange = oldRange | |
this.newRange = newRange | |
} | |
get start () { | |
return this.newRange.start | |
} | |
get oldExtent () { | |
return this.oldRange.getExtent() | |
} | |
get newExtent () { | |
return this.newRange.getExtent() | |
} | |
} | |
}, | |
"../src/text-editor-component.js": function (exports, module, __filename, __dirname, require, define) { | |
/* global ResizeObserver */ | |
const etch = require("../node_modules/etch/lib/index.js") | |
const {Point, Range} = require("../node_modules/text-buffer/lib/text-buffer.js") | |
const LineTopIndex = require("../node_modules/line-top-index/dist/line-top-index.js") | |
const TextEditor = require("../src/text-editor.js") | |
const {isPairedCharacter} = require("../src/text-utils.js") | |
let clipboard; | |
function get_clipboard() { | |
return clipboard = clipboard || require("../src/safe-clipboard.js"); | |
} | |
let electron; | |
function get_electron() { | |
return electron = electron || require('electron'); | |
} | |
const $ = etch.dom | |
let TextEditorElement | |
const DEFAULT_ROWS_PER_TILE = 6 | |
const NORMAL_WIDTH_CHARACTER = 'x' | |
const DOUBLE_WIDTH_CHARACTER = '我' | |
const HALF_WIDTH_CHARACTER = 'ハ' | |
const KOREAN_CHARACTER = '세' | |
const NBSP_CHARACTER = '\u00a0' | |
const ZERO_WIDTH_NBSP_CHARACTER = '\ufeff' | |
const MOUSE_DRAG_AUTOSCROLL_MARGIN = 40 | |
const CURSOR_BLINK_RESUME_DELAY = 300 | |
const CURSOR_BLINK_PERIOD = 800 | |
function scaleMouseDragAutoscrollDelta (delta) { | |
return Math.pow(delta / 3, 3) / 280 | |
} | |
module.exports = | |
class TextEditorComponent { | |
static setScheduler (scheduler) { | |
etch.setScheduler(scheduler) | |
} | |
static getScheduler () { | |
return etch.getScheduler() | |
} | |
static didUpdateStyles () { | |
if (this.attachedComponents) { | |
this.attachedComponents.forEach((component) => { | |
component.didUpdateStyles() | |
}) | |
} | |
} | |
static didUpdateScrollbarStyles () { | |
if (this.attachedComponents) { | |
this.attachedComponents.forEach((component) => { | |
component.didUpdateScrollbarStyles() | |
}) | |
} | |
} | |
constructor (props) { | |
this.props = props | |
if (!props.model) { | |
props.model = new TextEditor({mini: props.mini}) | |
} | |
this.props.model.component = this | |
if (props.element) { | |
this.element = props.element | |
} else { | |
if (!TextEditorElement) TextEditorElement = require("../src/text-editor-element.js") | |
this.element = new TextEditorElement() | |
} | |
this.element.initialize(this) | |
this.virtualNode = $('atom-text-editor') | |
this.virtualNode.domNode = this.element | |
this.refs = {} | |
this.updateSync = this.updateSync.bind(this) | |
this.didBlurHiddenInput = this.didBlurHiddenInput.bind(this) | |
this.didFocusHiddenInput = this.didFocusHiddenInput.bind(this) | |
this.didPaste = this.didPaste.bind(this) | |
this.didTextInput = this.didTextInput.bind(this) | |
this.didKeydown = this.didKeydown.bind(this) | |
this.didKeyup = this.didKeyup.bind(this) | |
this.didKeypress = this.didKeypress.bind(this) | |
this.didCompositionStart = this.didCompositionStart.bind(this) | |
this.didCompositionUpdate = this.didCompositionUpdate.bind(this) | |
this.didCompositionEnd = this.didCompositionEnd.bind(this) | |
this.updatedSynchronously = this.props.updatedSynchronously | |
this.didScrollDummyScrollbar = this.didScrollDummyScrollbar.bind(this) | |
this.didMouseDownOnContent = this.didMouseDownOnContent.bind(this) | |
this.debouncedResumeCursorBlinking = debounce( | |
this.resumeCursorBlinking.bind(this), | |
(this.props.cursorBlinkResumeDelay || CURSOR_BLINK_RESUME_DELAY) | |
) | |
this.lineTopIndex = new LineTopIndex() | |
this.lineNodesPool = new NodePool() | |
this.updateScheduled = false | |
this.suppressUpdates = false | |
this.hasInitialMeasurements = false | |
this.measurements = { | |
lineHeight: 0, | |
baseCharacterWidth: 0, | |
doubleWidthCharacterWidth: 0, | |
halfWidthCharacterWidth: 0, | |
koreanCharacterWidth: 0, | |
gutterContainerWidth: 0, | |
lineNumberGutterWidth: 0, | |
clientContainerHeight: 0, | |
clientContainerWidth: 0, | |
verticalScrollbarWidth: 0, | |
horizontalScrollbarHeight: 0, | |
longestLineWidth: 0 | |
} | |
this.derivedDimensionsCache = {} | |
this.visible = false | |
this.cursorsBlinking = false | |
this.cursorsBlinkedOff = false | |
this.nextUpdateOnlyBlinksCursors = null | |
this.linesToMeasure = new Map() | |
this.extraRenderedScreenLines = new Map() | |
this.horizontalPositionsToMeasure = new Map() // Keys are rows with positions we want to measure, values are arrays of columns to measure | |
this.horizontalPixelPositionsByScreenLineId = new Map() // Values are maps from column to horizontal pixel positions | |
this.blockDecorationsToMeasure = new Set() | |
this.blockDecorationsByElement = new WeakMap() | |
this.blockDecorationSentinel = get_document().createElement('div') | |
this.blockDecorationSentinel.style.height = '1px' | |
this.heightsByBlockDecoration = new WeakMap() | |
this.blockDecorationResizeObserver = new ResizeObserver(this.didResizeBlockDecorations.bind(this)) | |
this.lineComponentsByScreenLineId = new Map() | |
this.overlayComponents = new Set() | |
this.shouldRenderDummyScrollbars = true | |
this.remeasureScrollbars = false | |
this.pendingAutoscroll = null | |
this.scrollTopPending = false | |
this.scrollLeftPending = false | |
this.scrollTop = 0 | |
this.scrollLeft = 0 | |
this.previousScrollWidth = 0 | |
this.previousScrollHeight = 0 | |
this.lastKeydown = null | |
this.lastKeydownBeforeKeypress = null | |
this.accentedCharacterMenuIsOpen = false | |
this.remeasureGutterDimensions = false | |
this.guttersToRender = [this.props.model.getLineNumberGutter()] | |
this.guttersVisibility = [this.guttersToRender[0].visible] | |
this.idsByTileStartRow = new Map() | |
this.nextTileId = 0 | |
this.renderedTileStartRows = [] | |
this.showLineNumbers = this.props.model.doesShowLineNumbers() | |
this.lineNumbersToRender = { | |
maxDigits: 2, | |
bufferRows: [], | |
keys: [], | |
softWrappedFlags: [], | |
foldableFlags: [] | |
} | |
this.decorationsToRender = { | |
lineNumbers: null, | |
lines: null, | |
highlights: [], | |
cursors: [], | |
overlays: [], | |
customGutter: new Map(), | |
blocks: new Map(), | |
text: [] | |
} | |
this.decorationsToMeasure = { | |
highlights: [], | |
cursors: new Map() | |
} | |
this.textDecorationsByMarker = new Map() | |
this.textDecorationBoundaries = [] | |
this.pendingScrollTopRow = this.props.initialScrollTopRow | |
this.pendingScrollLeftColumn = this.props.initialScrollLeftColumn | |
this.measuredContent = false | |
this.queryGuttersToRender() | |
this.queryMaxLineNumberDigits() | |
this.observeBlockDecorations() | |
this.updateClassList() | |
etch.updateSync(this) | |
} | |
update (props) { | |
if (props.model !== this.props.model) { | |
this.props.model.component = null | |
props.model.component = this | |
} | |
this.props = props | |
this.scheduleUpdate() | |
} | |
pixelPositionForScreenPosition ({row, column}) { | |
const top = this.pixelPositionAfterBlocksForRow(row) | |
let left = column === 0 ? 0 : this.pixelLeftForRowAndColumn(row, column) | |
if (left == null) { | |
this.requestHorizontalMeasurement(row, column) | |
this.updateSync() | |
left = this.pixelLeftForRowAndColumn(row, column) | |
} | |
return {top, left} | |
} | |
scheduleUpdate (nextUpdateOnlyBlinksCursors = false) { | |
if (!this.visible) return | |
if (this.suppressUpdates) return | |
this.nextUpdateOnlyBlinksCursors = | |
this.nextUpdateOnlyBlinksCursors !== false && nextUpdateOnlyBlinksCursors === true | |
if (this.updatedSynchronously) { | |
this.updateSync() | |
} else if (!this.updateScheduled) { | |
this.updateScheduled = true | |
etch.getScheduler().updateDocument(() => { | |
if (this.updateScheduled) this.updateSync(true) | |
}) | |
} | |
} | |
updateSync (useScheduler = false) { | |
// Don't proceed if we know we are not visible | |
if (!this.visible) { | |
this.updateScheduled = false | |
return | |
} | |
// Don't proceed if we have to pay for a measurement anyway and detect | |
// that we are no longer visible. | |
if ((this.remeasureCharacterDimensions || this.remeasureAllBlockDecorations) && !this.isVisible()) { | |
if (this.resolveNextUpdatePromise) this.resolveNextUpdatePromise() | |
this.updateScheduled = false | |
return | |
} | |
const onlyBlinkingCursors = this.nextUpdateOnlyBlinksCursors | |
this.nextUpdateOnlyBlinksCursors = null | |
if (useScheduler && onlyBlinkingCursors) { | |
this.refs.cursorsAndInput.updateCursorBlinkSync(this.cursorsBlinkedOff) | |
if (this.resolveNextUpdatePromise) this.resolveNextUpdatePromise() | |
this.updateScheduled = false | |
return | |
} | |
if (this.remeasureCharacterDimensions) { | |
const originalLineHeight = this.getLineHeight() | |
const originalBaseCharacterWidth = this.getBaseCharacterWidth() | |
const scrollTopRow = this.getScrollTopRow() | |
const scrollLeftColumn = this.getScrollLeftColumn() | |
this.measureCharacterDimensions() | |
this.measureGutterDimensions() | |
this.queryLongestLine() | |
if (this.getLineHeight() !== originalLineHeight) { | |
this.setScrollTopRow(scrollTopRow) | |
} | |
if (this.getBaseCharacterWidth() !== originalBaseCharacterWidth) { | |
this.setScrollLeftColumn(scrollLeftColumn) | |
} | |
this.remeasureCharacterDimensions = false | |
} | |
this.measureBlockDecorations() | |
this.updateSyncBeforeMeasuringContent() | |
if (useScheduler === true) { | |
const scheduler = etch.getScheduler() | |
scheduler.readDocument(() => { | |
this.measureContentDuringUpdateSync() | |
scheduler.updateDocument(() => { |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment