├── .eslintrc.js
├── .github
├── dependabot.yml
└── workflows
│ ├── Automerge.yml
│ └── CI.yml
├── .gitignore
├── CHANGELOG.md
├── LICENSE.md
├── README.md
├── lib
├── minimap-bookmarks-binding.js
└── minimap-bookmarks.js
├── package-lock.json
├── package.json
├── release.config.js
├── screenshot.gif
├── spec
├── fixtures
│ └── sample.js
├── minimap-bookmarks-spec.js
└── runner.js
└── styles
└── minimap-bookmarks.less
/.eslintrc.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | env: {
3 | es6: true,
4 | browser: true,
5 | node: true,
6 | jasmine: true,
7 | atomtest: true,
8 | },
9 | extends: [
10 | 'standard',
11 | ],
12 | globals: {
13 | atom: 'readonly',
14 | },
15 | parserOptions: {
16 | ecmaVersion: 2018,
17 | },
18 | rules: {
19 | 'no-warning-comments': 'warn',
20 | 'comma-dangle': ['error', 'always-multiline'],
21 | indent: ['error', 'tab', { SwitchCase: 1 }],
22 | 'no-tabs': ['error', { allowIndentationTabs: true }],
23 | 'no-restricted-globals': [
24 | 'error',
25 | {
26 | name: 'fit',
27 | message: 'Do not commit focused tests.',
28 | },
29 | {
30 | name: 'fdescribe',
31 | message: 'Do not commit focused tests.',
32 | },
33 | ],
34 | 'no-sync': 'error',
35 | },
36 | }
37 |
--------------------------------------------------------------------------------
/.github/dependabot.yml:
--------------------------------------------------------------------------------
1 | version: 2
2 | updates:
3 | - package-ecosystem: "github-actions"
4 | directory: "/"
5 | schedule:
6 | interval: "weekly"
7 | - package-ecosystem: "npm"
8 | versioning-strategy: "increase"
9 | directory: "/"
10 | schedule:
11 | interval: "weekly"
12 |
--------------------------------------------------------------------------------
/.github/workflows/Automerge.yml:
--------------------------------------------------------------------------------
1 | name: "Automerge"
2 | on:
3 | workflow_run:
4 | workflows:
5 | - CI
6 | types:
7 | - completed
8 |
9 | jobs:
10 | Automerge:
11 | runs-on: ubuntu-latest
12 | if: |
13 | github.event.workflow_run.event == 'pull_request' &&
14 | github.event.workflow_run.conclusion == 'success'
15 | steps:
16 | - name: 'Merge PR'
17 | uses: actions/github-script@v6
18 | with:
19 | github-token: ${{ secrets.GITHUB_TOKEN }}
20 | script: |
21 | const pr = await github.rest.pulls.get({
22 | owner: context.repo.owner,
23 | repo: context.repo.repo,
24 | pull_number: context.payload.workflow_run.pull_requests[0].number,
25 | });
26 | if (!pr.data.title.startsWith('chore(deps-dev):')) {
27 | console.log('Not Merged 🚫');
28 | console.log(`Title '${pr.data.title}' does not start with 'chore(deps-dev):'`);
29 | } else if (pr.data.user.login !== 'dependabot[bot]') {
30 | console.log('Not Merged 🚫');
31 | console.log(`User '${pr.data.user.login}' does not equal 'dependabot[bot]'`);
32 | } else {
33 | await github.rest.pulls.merge({
34 | owner: context.repo.owner,
35 | repo: context.repo.repo,
36 | pull_number: context.payload.workflow_run.pull_requests[0].number,
37 | });
38 | console.log('Merged 🎉');
39 | }
40 |
--------------------------------------------------------------------------------
/.github/workflows/CI.yml:
--------------------------------------------------------------------------------
1 | name: "CI"
2 | on:
3 | pull_request:
4 | push:
5 | branches:
6 | - master
7 |
8 | env:
9 | CI: true
10 |
11 | jobs:
12 | Test:
13 | if: "!contains(github.event.head_commit.message, '[skip ci]')"
14 | strategy:
15 | matrix:
16 | os: [ubuntu-latest, macos-latest, windows-latest]
17 | channel: [stable, beta]
18 | fail-fast: false
19 | runs-on: ${{ matrix.os }}
20 | steps:
21 | - uses: actions/checkout@v3
22 | - uses: UziTech/action-setup-atom@v1
23 | with:
24 | channel: ${{ matrix.channel }}
25 | - name: Atom version
26 | run: atom -v
27 | - name: APM version
28 | run: apm -v
29 | - name: Install package dependencies
30 | run: apm i minimap bookmarks
31 | - name: Install dependencies
32 | run: apm ci
33 | - name: Run tests 👩🏾💻
34 | run: atom --test spec
35 |
36 | Lint:
37 | if: "!contains(github.event.head_commit.message, '[skip ci]')"
38 | runs-on: ubuntu-latest
39 | steps:
40 | - uses: actions/checkout@v3
41 | - uses: actions/setup-node@v3
42 | with:
43 | node-version: '*'
44 | - name: NPM install
45 | run: npm ci
46 | - name: Lint ✨
47 | run: npm run lint
48 |
49 | Release:
50 | needs: [Test, Lint]
51 | if: |
52 | github.ref == 'refs/heads/master' &&
53 | github.event.repository.fork == false
54 | runs-on: ubuntu-latest
55 | steps:
56 | - uses: actions/checkout@v3
57 | - uses: UziTech/action-setup-atom@v1
58 | - uses: actions/setup-node@v3
59 | with:
60 | node-version: '*'
61 | - name: NPM install
62 | run: npm ci
63 | - name: Release 🎉
64 | env:
65 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
66 | ATOM_ACCESS_TOKEN: ${{ secrets.ATOM_ACCESS_TOKEN }}
67 | run: npx semantic-release
68 |
69 | Skip:
70 | if: contains(github.event.head_commit.message, '[skip ci]')
71 | runs-on: ubuntu-latest
72 | steps:
73 | - name: Skip CI 🚫
74 | run: echo skip ci
75 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | .DS_Store
2 | npm-debug.log
3 | node_modules
4 |
--------------------------------------------------------------------------------
/CHANGELOG.md:
--------------------------------------------------------------------------------
1 | ## [0.4.6](https://github.com/atom-minimap/minimap-bookmarks/compare/v0.4.5...v0.4.6) (2021-01-18)
2 |
3 |
4 | ### Bug Fixes
5 |
6 | * **deps:** bump atom-package-deps from 7.0.3 to 7.1.0 ([#23](https://github.com/atom-minimap/minimap-bookmarks/issues/23)) ([372097d](https://github.com/atom-minimap/minimap-bookmarks/commit/372097dc2a5adfc5ba4737a9d5d2a285ccd6d877))
7 |
8 | ## [0.4.5](https://github.com/atom-minimap/minimap-bookmarks/compare/v0.4.4...v0.4.5) (2020-12-14)
9 |
10 |
11 | ### Bug Fixes
12 |
13 | * **deps:** bump atom-package-deps from 7.0.2 to 7.0.3 ([#17](https://github.com/atom-minimap/minimap-bookmarks/issues/17)) ([cda4773](https://github.com/atom-minimap/minimap-bookmarks/commit/cda4773acdd56c1a0ff62a0d67cff2352e173d95))
14 |
15 | ## [0.4.4](https://github.com/atom-minimap/minimap-bookmarks/compare/v0.4.3...v0.4.4) (2020-12-10)
16 |
17 |
18 | ### Bug Fixes
19 |
20 | * Optimizations ([#14](https://github.com/atom-minimap/minimap-bookmarks/issues/14)) ([e71bd8d](https://github.com/atom-minimap/minimap-bookmarks/commit/e71bd8d8974cdd576aeccc9ec0938a8f5b70b193))
21 |
22 | ## [0.4.3](https://github.com/atom-minimap/minimap-bookmarks/compare/v0.4.2...v0.4.3) (2020-11-28)
23 |
24 |
25 | ### Bug Fixes
26 |
27 | * add minimap as dependency ([927c0ac](https://github.com/atom-minimap/minimap-bookmarks/commit/927c0ac31a5ce0b457aaa322209de724c6d04f3a))
28 | * decaffeinate ([d9ad626](https://github.com/atom-minimap/minimap-bookmarks/commit/d9ad626ab2a556290da613ee408e4e64ad524307))
29 |
30 |
31 | # v0.4.2 (2016-08-31)
32 |
33 | ## :bug: Bug Fixes
34 |
35 | - Fix access to bookmarks markers's layer ([22a5eef8](https://github.com/atom-minimap/minimap-bookmarks/commit/22a5eef8968f54b96373d57027779e55bfaa6d3f), [#5](https://github.com/atom-minimap/minimap-bookmarks/issues/5))
36 |
37 |
38 | # v0.4.1 (2016-08-23)
39 |
40 | ## :bug: Bug Fixes
41 |
42 | - Fix typo ([23a28d2e](https://github.com/atom-minimap/minimap-bookmarks/commit/23a28d2e9f5bb4c34ee41ea398df65551eceadcf))
43 |
44 |
45 |
46 | # v0.4.0 (2016-08-23)
47 |
48 | ## :bug: Bug Fixes
49 |
50 | - Fix raise error while checking editor.displayBuffer, because `TextEditor.prototype.displayBuffer` has always been private, #5 ([83c9217b](https://github.com/atom-minimap/minimap-bookmarks/commit/83c9217bb2ba12e3364dd9f6be6b9f2087f6801b))
51 | - Fix test cases, #5 ([15b05f71](https://github.com/atom-minimap/minimap-bookmarks/commit/15b05f71bd47eb1f0b2fe60fc8cf9f25e5be516e))
52 | - Fix bookmarks not appear, #5 ([f19d323d](https://github.com/atom-minimap/minimap-bookmarks/commit/f19d323dc12be92b143a8300c2373c20e08f8e62))
53 |
54 |
55 |
56 | # v0.3.1 (2016-05-07)
57 |
58 | ## :bug: Bug Fixes
59 |
60 | - Fix error raised with display layer version ([5de44c84](https://github.com/atom-minimap/minimap-bookmarks/commit/5de44c844a67c73380c6b71c1f9eebb4da3b518a))
61 |
62 |
63 |
64 | # v0.3.0 (2016-03-07)
65 |
66 | ## :sparkles: Features
67 |
68 | - Add plugin origin to created decorations ([0fef7557](https://github.com/atom-minimap/minimap-bookmarks/commit/0fef7557095d1c9f8a3dba00012ae6a7949aa7aa))
69 |
70 |
71 | # 0.2.0 (2015-12-11)
72 |
73 | ## :sparkles: Features
74 |
75 | - Implement destroying bindings on deactivation ([a58c8508](https://github.com/atom-minimap/minimap-bookmarks/commit/a58c8508dcf1e7e65bb1f86d6e07bb1639a26f9d))
76 | - Implement retrieving existing markers and destroying decorations along binding ([3dc7ae07](https://github.com/atom-minimap/minimap-bookmarks/commit/3dc7ae07d6179be70fc823c953c68cb8e0c986ff))
77 |
--------------------------------------------------------------------------------
/LICENSE.md:
--------------------------------------------------------------------------------
1 | Copyright (c) 2014
2 |
3 | Permission is hereby granted, free of charge, to any person obtaining
4 | a copy of this software and associated documentation files (the
5 | "Software"), to deal in the Software without restriction, including
6 | without limitation the rights to use, copy, modify, merge, publish,
7 | distribute, sublicense, and/or sell copies of the Software, and to
8 | permit persons to whom the Software is furnished to do so, subject to
9 | the following conditions:
10 |
11 | The above copyright notice and this permission notice shall be
12 | included in all copies or substantial portions of the Software.
13 |
14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
15 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
16 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
17 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
18 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
19 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
21 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # minimap-bookmarks package
2 |
3 | [](https://github.com/atom-minimap/minimap-bookmarks/actions)
4 |
5 | Displays Atom bookmarks in the minimap.
6 |
7 | 
8 |
9 | Customization
10 |
11 | If you want to change the color of the minimap bookmarks use the following CSS rules in your user stylesheet:
12 |
13 | ```css
14 | .minimap .bookmark {
15 | background: #09C;
16 | }
17 | ```
18 |
--------------------------------------------------------------------------------
/lib/minimap-bookmarks-binding.js:
--------------------------------------------------------------------------------
1 | const { CompositeDisposable } = require('atom')
2 |
3 | class MinimapBookmarksBinding {
4 | constructor (minimap, bookmarks) {
5 | this.minimap = minimap
6 | this.bookmarks = bookmarks
7 | if ((this.minimap == null) || (this.bookmarks == null)) { return }
8 |
9 | this.subscriptions = new CompositeDisposable()
10 | this.editor = this.minimap.getTextEditor()
11 | this.decorationsByMarkerId = new Map()
12 | this.decorationSubscriptionsByMarkerId = new Map()
13 |
14 | // We need to wait until the bookmarks package had created its marker
15 | // layer before retrieving its id from the state.
16 | requestAnimationFrame(() => {
17 | // Also, targeting private properties on atom.packages is very brittle.
18 | // DO NOT DO THAT!
19 | //
20 | // If we really have to get the marker layer id from the
21 | // state (which can already break easily) it's better to get it from the
22 | // package `serialize` method since it's an API that is public and is
23 | // unlikely to change in a near future.
24 | const bookmarks = this.bookmarks.serialize()[this.editor.id]
25 | if (!bookmarks) { return }
26 |
27 | const markerLayer = this.editor.getMarkerLayer(bookmarks.markerLayerId)
28 |
29 | if (!markerLayer) { return }
30 |
31 | this.subscriptions.add(markerLayer.onDidCreateMarker(marker => {
32 | this.handleMarker(marker)
33 | }))
34 |
35 | markerLayer.findMarkers().forEach(marker => this.handleMarker(marker))
36 | })
37 | }
38 |
39 | handleMarker (marker) {
40 | const { id } = marker
41 | const decoration = this.minimap.decorateMarker(marker, { type: 'line', class: 'bookmark', plugin: 'bookmarks' })
42 | this.decorationsByMarkerId.set(id, decoration)
43 | this.decorationSubscriptionsByMarkerId.set(id,
44 | decoration.onDidDestroy(() => {
45 | this.decorationSubscriptionsByMarkerId.get(id).dispose()
46 |
47 | this.decorationsByMarkerId.delete(id)
48 | this.decorationSubscriptionsByMarkerId.delete(id)
49 | }),
50 | )
51 | }
52 |
53 | destroy () {
54 | const ids = this.decorationsByMarkerId.keys()
55 | for (const id of ids) {
56 | const decoration = this.decorationsByMarkerId.get(id)
57 | this.decorationSubscriptionsByMarkerId.get(id).dispose()
58 | decoration.destroy()
59 |
60 | this.decorationsByMarkerId.delete(id)
61 | this.decorationSubscriptionsByMarkerId.delete(id)
62 | }
63 |
64 | this.subscriptions.dispose()
65 | }
66 | }
67 |
68 | module.exports = MinimapBookmarksBinding
69 |
--------------------------------------------------------------------------------
/lib/minimap-bookmarks.js:
--------------------------------------------------------------------------------
1 | /*
2 | * decaffeinate suggestions:
3 | * DS102: Remove unnecessary code created because of implicit returns
4 | * DS201: Simplify complex destructure assignments
5 | * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
6 | */
7 | const { CompositeDisposable } = require('atom')
8 | let MinimapBookmarksBinding
9 |
10 | module.exports = {
11 | isActive () {
12 | return this.active
13 | },
14 |
15 | activate () {
16 | this.active = false
17 | this.subscriptions = new CompositeDisposable()
18 | this.bindings = new Map()
19 | require('atom-package-deps').install('minimap-git-diff')
20 | },
21 |
22 | consumeMinimapServiceV1 (minimap) {
23 | this.minimap = minimap
24 | this.minimap.registerPlugin('bookmarks', this)
25 | },
26 |
27 | deactivate () {
28 | if (this.minimap) {
29 | this.minimap.unregisterPlugin('bookmarks')
30 | }
31 | this.minimap = null
32 | },
33 |
34 | activatePlugin () {
35 | if (this.active) {
36 | return
37 | }
38 |
39 | const bookmarksPkg = atom.packages.getLoadedPackage('bookmarks')
40 | if (!bookmarksPkg) {
41 | return
42 | }
43 | const bookmarks = bookmarksPkg.mainModule
44 | this.active = true
45 |
46 | this.minimapsSubscription = this.minimap.observeMinimaps(minimap => {
47 | if (!MinimapBookmarksBinding) {
48 | MinimapBookmarksBinding = require('./minimap-bookmarks-binding')
49 | }
50 |
51 | const binding = new MinimapBookmarksBinding(minimap, bookmarks)
52 | this.bindings.set(minimap.id, binding)
53 |
54 | const subscription = minimap.onDidDestroy(() => {
55 | binding.destroy()
56 | this.subscriptions.remove(subscription)
57 | subscription.dispose()
58 | this.bindings.delete(minimap.id)
59 | })
60 | this.subscriptions.add(subscription)
61 | })
62 | },
63 |
64 | deactivatePlugin () {
65 | if (!this.active) { return }
66 |
67 | const bindings = this.bindings.values()
68 | for (const binding of bindings) { binding.destroy() }
69 | this.bindings.clear()
70 | this.active = false
71 | this.minimapsSubscription.dispose()
72 | this.subscriptions.dispose()
73 | },
74 | }
75 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "minimap-bookmarks",
3 | "main": "./lib/minimap-bookmarks",
4 | "version": "0.4.6",
5 | "description": "Displays Atom bookmarks in the minimap",
6 | "repository": "https://github.com/atom-minimap/minimap-bookmarks",
7 | "license": "MIT",
8 | "keywords": [
9 | "minimap",
10 | "bookmarks",
11 | "bookmark"
12 | ],
13 | "engines": {
14 | "atom": ">=1.20.0"
15 | },
16 | "scripts": {
17 | "test": "atom --test spec",
18 | "lint": "eslint ."
19 | },
20 | "atomTestRunner": "./spec/runner.js",
21 | "package-deps": [
22 | {
23 | "name": "minimap"
24 | },
25 | {
26 | "name": "bookmarks"
27 | }
28 | ],
29 | "dependencies": {
30 | "atom-package-deps": "^8.0.0"
31 | },
32 | "devDependencies": {
33 | "@semantic-release/apm-config": "^8.0.0",
34 | "atom-jasmine3-test-runner": "^5.2.13",
35 | "eslint": "^7.32.0",
36 | "eslint-config-standard": "^16.0.3",
37 | "eslint-plugin-import": "^2.26.0",
38 | "eslint-plugin-node": "^11.1.0",
39 | "eslint-plugin-promise": "^5.2.0",
40 | "eslint-plugin-react": "^7.31.11",
41 | "semantic-release": "^19.0.5"
42 | },
43 | "consumedServices": {
44 | "minimap": {
45 | "versions": {
46 | "1.0.0": "consumeMinimapServiceV1"
47 | }
48 | }
49 | },
50 | "activationHooks": [
51 | "core:loaded-shell-environment"
52 | ]
53 | }
54 |
--------------------------------------------------------------------------------
/release.config.js:
--------------------------------------------------------------------------------
1 | module.exports = {
2 | extends: '@semantic-release/apm-config',
3 | }
4 |
--------------------------------------------------------------------------------
/screenshot.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/atom-minimap/minimap-bookmarks/1b27bd7bff7af1096b855892f15a4dc11f7d2bfc/screenshot.gif
--------------------------------------------------------------------------------
/spec/fixtures/sample.js:
--------------------------------------------------------------------------------
1 | /** @babel */
2 |
3 | export const a = 1
4 |
--------------------------------------------------------------------------------
/spec/minimap-bookmarks-spec.js:
--------------------------------------------------------------------------------
1 | const MinimapBookmarks = require('../lib/minimap-bookmarks')
2 |
3 | describe('MinimapBookmarks', () => {
4 | let editor, editorElement, bookmarks
5 |
6 | const bookmarkedRangesForEditor = (editor) => {
7 | const obj = editor.decorationsStateForScreenRowRange(0, editor.getLastScreenRow())
8 | return Object.keys(obj)
9 | .map(k => obj[k])
10 | .filter(decoration => decoration.properties.class === 'bookmarked')
11 | .map(decoration => decoration.screenRange)
12 | }
13 |
14 | beforeEach(async () => {
15 | const workspace = atom.views.getView(atom.workspace)
16 | jasmine.attachToDOM(workspace)
17 |
18 | // Package activation will be deferred to the configured, activation hook, which is then triggered
19 | // Activate activation hook
20 | atom.packages.triggerDeferredActivationHooks()
21 | atom.packages.triggerActivationHook('core:loaded-shell-environment')
22 |
23 | editor = await atom.workspace.open('sample.js')
24 | editorElement = atom.views.getView(editor)
25 |
26 | bookmarks = (await atom.packages.activatePackage('bookmarks')).mainModule
27 |
28 | await atom.packages.activatePackage('minimap')
29 | await atom.packages.activatePackage('minimap-bookmarks')
30 |
31 | atom.packages.packageStates.bookmarks = bookmarks.serialize()
32 | })
33 |
34 | it('should activate', () => {
35 | expect(MinimapBookmarks.isActive()).toBe(true)
36 | })
37 |
38 | describe('with an open editor that have a minimap', () => describe('when toggle switch bookmarks markers to the editor', () => {
39 | beforeEach(() => {
40 | editor.setCursorScreenPosition([2, 0])
41 | atom.commands.dispatch(editorElement, 'bookmarks:toggle-bookmark')
42 |
43 | editor.setCursorScreenPosition([3, 0])
44 | atom.commands.dispatch(editorElement, 'bookmarks:toggle-bookmark')
45 |
46 | editor.setCursorScreenPosition([1, 0])
47 | atom.commands.dispatch(editorElement, 'bookmarks:toggle-bookmark')
48 | atom.commands.dispatch(editorElement, 'bookmarks:toggle-bookmark')
49 | })
50 |
51 | it('creates tow markers', () => {
52 | expect(bookmarkedRangesForEditor(editor).length).toBe(2)
53 | })
54 |
55 | it('creates state of bookmarks', () => {
56 | expect(Object.keys(atom.packages.packageStates.bookmarks).length).toBe(1)
57 | })
58 |
59 | it('gets markerLayerId from state of bookmarks by editorId', () => {
60 | const { markerLayerId } = atom.packages.packageStates.bookmarks[editor.id]
61 |
62 | expect(markerLayerId).toBeDefined()
63 | })
64 |
65 | it('finds marks by markerLayerId', () => {
66 | const { markerLayerId } = atom.packages.packageStates.bookmarks[editor.id]
67 | const markerLayer = editor.getMarkerLayer(markerLayerId)
68 | expect(markerLayer.findMarkers().length).toBe(2)
69 | })
70 | }))
71 | })
72 |
--------------------------------------------------------------------------------
/spec/runner.js:
--------------------------------------------------------------------------------
1 | const { createRunner } = require('atom-jasmine3-test-runner')
2 |
3 | module.exports = createRunner({
4 | specHelper: {
5 | attachToDom: true,
6 | ci: true,
7 | },
8 | testPackages: ['minimap'],
9 | })
10 |
--------------------------------------------------------------------------------
/styles/minimap-bookmarks.less:
--------------------------------------------------------------------------------
1 | // The ui-variables file is provided by base themes provided by Atom.
2 | //
3 | // See https://github.com/atom/atom-dark-ui/blob/master/stylesheets/ui-variables.less
4 | // for a full listing of what's available.
5 | @import "ui-variables";
6 |
7 | .minimap .bookmark {
8 | contain: layout size paint style;
9 | background: @background-color-info;
10 | }
11 |
--------------------------------------------------------------------------------