chore: rename plugin to mdMenu

This commit is contained in:
Michael Makarov 2026-06-13 15:58:59 +03:00
parent 1c7fe6bac9
commit 734237584f
20 changed files with 204 additions and 204 deletions

View file

@ -61,7 +61,7 @@ jobs:
const fs = require("fs");
const tag = process.env.GITHUB_REF_NAME;
const pkg = JSON.parse(fs.readFileSync("package.json", "utf8"));
const manifest = JSON.parse(fs.readFileSync("dist/obmenu/manifest.json", "utf8"));
const manifest = JSON.parse(fs.readFileSync("dist/mdmenu/manifest.json", "utf8"));
if (pkg.version !== tag || manifest.version !== tag) {
console.error("Release tag " + tag + " must match package.json (" + pkg.version + ") and manifest.json (" + manifest.version + ").");
process.exit(1);
@ -70,17 +70,17 @@ jobs:
- name: Verify release assets
run: |
test -s dist/obmenu/main.js
test -s dist/obmenu/manifest.json
test -s dist/obmenu/styles.css
test -s dist/mdmenu/main.js
test -s dist/mdmenu/manifest.json
test -s dist/mdmenu/styles.css
- name: Attest release assets
uses: actions/attest@v4
with:
subject-path: |
dist/obmenu/main.js
dist/obmenu/manifest.json
dist/obmenu/styles.css
dist/mdmenu/main.js
dist/mdmenu/manifest.json
dist/mdmenu/styles.css
- name: Generate release notes
run: |
@ -96,7 +96,7 @@ jobs:
)"
{
echo "obMenu ${tag}"
echo "mdMenu ${tag}"
echo
if [ -n "${previous_tag}" ]; then
@ -116,7 +116,7 @@ jobs:
GH_TOKEN: ${{ github.token }}
run: |
tag="${GITHUB_REF_NAME}"
title="obMenu ${tag}"
title="mdMenu ${tag}"
if gh release view "${tag}" >/dev/null 2>&1; then
gh release edit "${tag}" \
@ -124,15 +124,15 @@ jobs:
--target "${GITHUB_SHA}" \
--notes-file RELEASE_NOTES.md
gh release upload "${tag}" \
dist/obmenu/main.js \
dist/obmenu/manifest.json \
dist/obmenu/styles.css \
dist/mdmenu/main.js \
dist/mdmenu/manifest.json \
dist/mdmenu/styles.css \
--clobber
else
gh release create "${tag}" \
dist/obmenu/main.js \
dist/obmenu/manifest.json \
dist/obmenu/styles.css \
dist/mdmenu/main.js \
dist/mdmenu/manifest.json \
dist/mdmenu/styles.css \
--title "${title}" \
--target "${GITHUB_SHA}" \
--notes-file RELEASE_NOTES.md \

View file

@ -1,10 +1,10 @@
# AGENTS.md
This file is the canonical project guide for coding agents working on obMenu.
This file is the canonical project guide for coding agents working on mdMenu.
## Project
obMenu is a clean-room Obsidian plugin that provides a compact, mini WYSIWYG-style Markdown formatting toolbar while keeping notes as plain Markdown.
mdMenu is a clean-room Obsidian plugin that provides a compact, mini WYSIWYG-style Markdown formatting toolbar while keeping notes as plain Markdown.
The implementation is inspired by cMenu as a product idea, but it must not copy cMenu source files.
@ -63,10 +63,10 @@ npm run check
`npm run build:dist` creates:
```text
dist/obmenu/main.js
dist/obmenu/manifest.json
dist/obmenu/styles.css
dist/obmenu/LICENSE
dist/mdmenu/main.js
dist/mdmenu/manifest.json
dist/mdmenu/styles.css
dist/mdmenu/LICENSE
```
`dist/` is ignored by Git. Rebuild it whenever a fresh copyable plugin folder is needed.
@ -75,13 +75,14 @@ dist/obmenu/LICENSE
- `.github/workflows/release.yml` follows the Grimoire-style tag release flow.
- Release tags use `x.y.z` without a `v` prefix.
- The workflow must verify that the tag matches `package.json` and `dist/obmenu/manifest.json`.
- Release assets are `dist/obmenu/main.js`, `dist/obmenu/manifest.json`, and `dist/obmenu/styles.css`.
- The workflow must verify that the tag matches `package.json` and `dist/mdmenu/manifest.json`.
- Release assets are `dist/mdmenu/main.js`, `dist/mdmenu/manifest.json`, and `dist/mdmenu/styles.css`.
- Keep `actions/attest` enabled for release assets.
## Community Plugin Review
- `manifest.json` description must not include the word "Obsidian"; the plugin directory context already implies it.
- Preferred Lucide icon for plugin listing or community metadata: `file-pen-line`.
- GitHub release assets should include artifact attestations for `main.js`, `manifest.json`, and `styles.css` so users can verify provenance from the source repository.
## Architecture

View file

@ -1,16 +1,16 @@
# obMenu
# mdMenu
Eine kleine WYSIWYG-aehnliche Markdown-Formatierungsebene fuer Obsidian-Nutzer.
[English](README.md) | [Русский](README.ru.md) | [Español](README.es.md) | [Deutsch](README.de.md) | [中文](README.zh.md) | [日本語](README.ja.md)
obMenu ist ein Clean-Room-Plugin mit einer Markdown-Werkzeugleiste, inspiriert von der Produktidee hinter cMenu. Es gibt dem Editor eine kleine WYSIWYG-aehnliche Ebene fuer haeufige Formatierungen, waehrend deine Notizen darunter reines Markdown bleiben. Ueberschriften, Checkboxen, Callouts, Links, Hervorhebungen, Code, Listen, Fett, Kursiv und ein paar leise Helfer bleiben direkt neben dem Text, den du schreibst.
mdMenu ist ein Clean-Room-Plugin mit einer Markdown-Werkzeugleiste, inspiriert von der Produktidee hinter cMenu. Es gibt dem Editor eine kleine WYSIWYG-aehnliche Ebene fuer haeufige Formatierungen, waehrend deine Notizen darunter reines Markdown bleiben. Ueberschriften, Checkboxen, Callouts, Links, Hervorhebungen, Code, Listen, Fett, Kursiv und ein paar leise Helfer bleiben direkt neben dem Text, den du schreibst.
Du kannst die Leiste unten anheften, neben der Auswahl anzeigen oder an eine bequeme Stelle ziehen. Du schreibst weiterhin Markdown, nur mit weniger Wegen zur command palette, weniger gemerkten Tastenkombinationen und etwas direkterer Formatierung.
> Status: bereit fuer GitHub-Releases. Einreichung fuer community plugins: in Arbeit.
![Screenshot der obMenu-Leiste](assets/readme/Screenshot%202026-06-12%20at%2015.28.52.png)
![Screenshot der mdMenu-Leiste](assets/readme/Screenshot%202026-06-12%20at%2015.28.52.png)
## Was jetzt funktioniert
@ -43,7 +43,7 @@ Die Standardleiste zeigt H1, H2, H3 und H4 als einzelne Buttons. H5, H6 und das
### Position der Leiste
obMenu hat vier Positionsmodi:
mdMenu hat vier Positionsmodi:
- `fixed`: die Leiste unten im Workspace halten.
- `selection`: die Leiste nahe am markierten Text anzeigen.
@ -81,7 +81,7 @@ Nach der Wahl eines Presets kannst du weiterhin Buttons hinzufuegen, entfernen u
- `default`: normale Obsidian-Werkzeugleisten-Dichte.
- `compact`: kleinere Buttons, wenn die Notiz mehr Platz braucht.
Beide Stile verwenden Obsidian theme variables. Dadurch folgt obMenu hellen und dunklen Themes ohne eigenes Farbsystem.
Beide Stile verwenden Obsidian theme variables. Dadurch folgt mdMenu hellen und dunklen Themes ohne eigenes Farbsystem.
### Bearbeitungsdetails
@ -94,7 +94,7 @@ Beide Stile verwenden Obsidian theme variables. Dadurch folgt obMenu hellen und
### Sichere Einstellungen
Gespeicherte Einstellungen werden beim Laden normalisiert. Wenn alte oder fehlerhafte Daten auftauchen, faellt obMenu auf Standardwerte zurueck, statt die Leiste zu brechen.
Gespeicherte Einstellungen werden beim Laden normalisiert. Wenn alte oder fehlerhafte Daten auftauchen, faellt mdMenu auf Standardwerte zurueck, statt die Leiste zu brechen.
### Release-Unterstuetzung
@ -128,10 +128,10 @@ styles.css
Lege sie in deinem Vault hier ab:
```text
.obsidian/plugins/obmenu
.obsidian/plugins/mdmenu
```
Aktiviere danach `obMenu` in den Einstellungen fuer community plugins.
Aktiviere danach `mdMenu` in den Einstellungen fuer community plugins.
## Lokal bauen
@ -144,16 +144,16 @@ npm run build:dist
Kopiere diesen Ordner:
```text
dist/obmenu
dist/mdmenu
```
in deinen Vault:
```text
.obsidian/plugins/obmenu
.obsidian/plugins/mdmenu
```
Aktiviere danach `obMenu` in den Einstellungen fuer community plugins.
Aktiviere danach `mdMenu` in den Einstellungen fuer community plugins.
## Entwicklung
@ -201,11 +201,11 @@ npm run check
## Datenschutz
obMenu laeuft lokal in Obsidian. Es sendet keine Notizen, Auswahlen, Einstellungen oder Telemetrie.
mdMenu laeuft lokal in Obsidian. Es sendet keine Notizen, Auswahlen, Einstellungen oder Telemetrie.
## Inspiration
obMenu ist von cMenu inspiriert, einem frueheren Formatierungsleisten-Plugin fuer Obsidian. Dieses Projekt kopiert keine cMenu-Quelldateien.
mdMenu ist von cMenu inspiriert, einem frueheren Formatierungsleisten-Plugin fuer Obsidian. Dieses Projekt kopiert keine cMenu-Quelldateien.
## Lizenz

View file

@ -1,16 +1,16 @@
# obMenu
# mdMenu
Una pequeña capa de formato Markdown estilo WYSIWYG para usuarios de Obsidian.
[English](README.md) | [Русский](README.ru.md) | [Español](README.es.md) | [Deutsch](README.de.md) | [中文](README.zh.md) | [日本語](README.ja.md)
obMenu es un plugin clean-room con una barra de herramientas Markdown inspirada en la idea de cMenu. Añade al editor una mini capa estilo WYSIWYG para el formato común, pero mantiene tus notas como Markdown plano por debajo. Encabezados, casillas, callouts, enlaces, resaltado, código, listas, negrita, cursiva y algunas ayudas discretas quedan junto al texto que estás escribiendo.
mdMenu es un plugin clean-room con una barra de herramientas Markdown inspirada en la idea de cMenu. Añade al editor una mini capa estilo WYSIWYG para el formato común, pero mantiene tus notas como Markdown plano por debajo. Encabezados, casillas, callouts, enlaces, resaltado, código, listas, negrita, cursiva y algunas ayudas discretas quedan junto al texto que estás escribiendo.
Puedes fijarla abajo, mostrarla cerca de la selección o arrastrarla a una posición cómoda. Sigues escribiendo Markdown, solo con menos viajes a la command palette, menos atajos memorizados y un poco más de manipulación directa.
> Estado: listo para releases de GitHub. Envío al catálogo de community plugins: en progreso.
![Captura de la barra obMenu](assets/readme/Screenshot%202026-06-12%20at%2015.28.52.png)
![Captura de la barra mdMenu](assets/readme/Screenshot%202026-06-12%20at%2015.28.52.png)
## Qué funciona ahora
@ -43,7 +43,7 @@ La barra predeterminada muestra H1, H2, H3 y H4 como botones separados. H5, H6 y
### Posición de la barra
obMenu tiene cuatro modos de posición:
mdMenu tiene cuatro modos de posición:
- `fixed`: mantener la barra en la parte inferior del workspace.
- `selection`: mostrarla cerca del texto seleccionado.
@ -81,7 +81,7 @@ Después de elegir un preset, puedes seguir añadiendo, quitando y reordenando b
- `default`: densidad normal de una barra de Obsidian.
- `compact`: botones más pequeños cuando la nota necesita más espacio.
Ambos estilos usan theme variables de Obsidian, así que obMenu sigue los temas claros y oscuros sin añadir su propio sistema de color.
Ambos estilos usan theme variables de Obsidian, así que mdMenu sigue los temas claros y oscuros sin añadir su propio sistema de color.
### Detalles de edición
@ -94,7 +94,7 @@ Ambos estilos usan theme variables de Obsidian, así que obMenu sigue los temas
### Seguridad de ajustes
Los ajustes guardados se normalizan al cargar. Si aparecen datos antiguos o malformados, obMenu vuelve a los valores predeterminados en vez de romper la barra.
Los ajustes guardados se normalizan al cargar. Si aparecen datos antiguos o malformados, mdMenu vuelve a los valores predeterminados en vez de romper la barra.
### Soporte de release
@ -128,10 +128,10 @@ styles.css
Colócalos aquí en tu vault:
```text
.obsidian/plugins/obmenu
.obsidian/plugins/mdmenu
```
Después activa `obMenu` desde los ajustes de community plugins.
Después activa `mdMenu` desde los ajustes de community plugins.
## Build local
@ -144,16 +144,16 @@ npm run build:dist
Copia esta carpeta:
```text
dist/obmenu
dist/mdmenu
```
a tu vault:
```text
.obsidian/plugins/obmenu
.obsidian/plugins/mdmenu
```
Después activa `obMenu` desde los ajustes de community plugins.
Después activa `mdMenu` desde los ajustes de community plugins.
## Desarrollo
@ -201,11 +201,11 @@ npm run check
## Privacidad
obMenu se ejecuta localmente dentro de Obsidian. No envía notas, selecciones, ajustes ni telemetría.
mdMenu se ejecuta localmente dentro de Obsidian. No envía notas, selecciones, ajustes ni telemetría.
## Inspiración
obMenu está inspirado en cMenu, un plugin anterior de barra de formato para Obsidian. Este proyecto no copia archivos fuente de cMenu.
mdMenu está inspirado en cMenu, un plugin anterior de barra de formato para Obsidian. Este proyecto no copia archivos fuente de cMenu.
## Licencia

View file

@ -1,16 +1,16 @@
# obMenu
# mdMenu
Obsidian ユーザーのための、小さな WYSIWYG 風 Markdown 書式レイヤーです。
[English](README.md) | [Русский](README.ru.md) | [Español](README.es.md) | [Deutsch](README.de.md) | [中文](README.zh.md) | [日本語](README.ja.md)
obMenu は、cMenu のプロダクトアイデアに着想を得た clean-room の Markdown ツールバープラグインです。よく使う書式操作のための小さな WYSIWYG 風レイヤーをエディタに加えつつ、ノート本体は plain Markdown のまま保ちます。見出し、チェックボックス、callout、リンク、ハイライト、コード、リスト、太字、斜体などを、書いているテキストのすぐ近くに置きます。
mdMenu は、cMenu のプロダクトアイデアに着想を得た clean-room の Markdown ツールバープラグインです。よく使う書式操作のための小さな WYSIWYG 風レイヤーをエディタに加えつつ、ノート本体は plain Markdown のまま保ちます。見出し、チェックボックス、callout、リンク、ハイライト、コード、リスト、太字、斜体などを、書いているテキストのすぐ近くに置きます。
下部に固定することも、選択範囲の近くに表示することも、使いやすい場所へドラッグして置いておくこともできます。Markdown を書く体験はそのままに、command palette を開く回数や覚えるショートカットを減らし、少しだけ直接操作に近い感覚で書式を扱えます。
> 状態GitHub release の準備済み。Community plugin への提出は進行中です。
![obMenu ツールバーのスクリーンショット](assets/readme/Screenshot%202026-06-12%20at%2015.28.52.png)
![mdMenu ツールバーのスクリーンショット](assets/readme/Screenshot%202026-06-12%20at%2015.28.52.png)
## 現在できること
@ -43,7 +43,7 @@ obMenu は、cMenu のプロダクトアイデアに着想を得た clean-room
### ツールバーの配置
obMenu には 4 つの配置モードがあります:
mdMenu には 4 つの配置モードがあります:
- `fixed`:ツールバーを workspace の下部に固定します。
- `selection`:選択したテキストの近くに表示します。
@ -81,7 +81,7 @@ Preset を選んだあとも、ボタンの追加、削除、区切りの追加
- `default`:通常の Obsidian ツールバー密度。
- `compact`:ノートにより多くのスペースが必要なときの小さめのボタン。
どちらのスタイルも Obsidian theme variables を使うため、obMenu は独自のカラーシステムを追加せず、ライトテーマとダークテーマに追従します。
どちらのスタイルも Obsidian theme variables を使うため、mdMenu は独自のカラーシステムを追加せず、ライトテーマとダークテーマに追従します。
### 編集の細部
@ -94,7 +94,7 @@ Preset を選んだあとも、ボタンの追加、削除、区切りの追加
### 設定の安全性
保存された設定は読み込み時に正規化されます。古いデータや不正なデータがあっても、obMenu はツールバーを壊さずデフォルトへ戻します。
保存された設定は読み込み時に正規化されます。古いデータや不正なデータがあっても、mdMenu はツールバーを壊さずデフォルトへ戻します。
### Release サポート
@ -128,10 +128,10 @@ styles.css
Vault の次の場所に置きます:
```text
.obsidian/plugins/obmenu
.obsidian/plugins/mdmenu
```
その後、community plugin 設定から `obMenu` を有効にします。
その後、community plugin 設定から `mdMenu` を有効にします。
## ローカルでビルド
@ -144,16 +144,16 @@ npm run build:dist
このフォルダをコピーします:
```text
dist/obmenu
dist/mdmenu
```
Vault の次の場所へ:
```text
.obsidian/plugins/obmenu
.obsidian/plugins/mdmenu
```
その後、community plugin 設定から `obMenu` を有効にします。
その後、community plugin 設定から `mdMenu` を有効にします。
## 開発
@ -201,11 +201,11 @@ npm run check
## プライバシー
obMenu は Obsidian 内でローカルに動作します。ノート、選択範囲、設定、テレメトリを送信しません。
mdMenu は Obsidian 内でローカルに動作します。ノート、選択範囲、設定、テレメトリを送信しません。
## Inspiration
obMenu は、以前の Obsidian 書式ツールバープラグインである cMenu から着想を得ています。このプロジェクトは cMenu のソースファイルをコピーしていません。
mdMenu は、以前の Obsidian 書式ツールバープラグインである cMenu から着想を得ています。このプロジェクトは cMenu のソースファイルをコピーしていません。
## License

View file

@ -1,16 +1,16 @@
# obMenu
# mdMenu
A tiny WYSIWYG-style Markdown formatting layer for Obsidian users.
[English](README.md) | [Русский](README.ru.md) | [Español](README.es.md) | [Deutsch](README.de.md) | [中文](README.zh.md) | [日本語](README.ja.md)
obMenu is a clean-room Obsidian Markdown toolbar inspired by cMenu. It gives the editor a mini WYSIWYG-style layer for common formatting while keeping your notes as plain Markdown underneath. Headings, checkboxes, callouts, links, highlights, code, lists, bold, italic, and a few quiet helpers stay right next to the text you are writing.
mdMenu is a clean-room Obsidian Markdown toolbar inspired by cMenu. It gives the editor a mini WYSIWYG-style layer for common formatting while keeping your notes as plain Markdown underneath. Headings, checkboxes, callouts, links, highlights, code, lists, bold, italic, and a few quiet helpers stay right next to the text you are writing.
Keep it pinned at the bottom. Let it follow the selection. Drag it somewhere comfortable and leave it there. You still write Markdown, just with fewer command palette trips, fewer memorized shortcuts, and a little more direct manipulation.
> Status: GitHub-release ready. Community plugin submission: in progress.
![obMenu toolbar screenshot](assets/readme/Screenshot%202026-06-12%20at%2015.28.52.png)
![mdMenu toolbar screenshot](assets/readme/Screenshot%202026-06-12%20at%2015.28.52.png)
## What works now
@ -43,11 +43,11 @@ The default toolbar shows H1, H2, H3, and H4 as separate buttons. H5, H6, and th
### Toolbar placement
obMenu has four placement modes:
mdMenu has four placement modes:
- `fixed`: keep the toolbar at the bottom of the workspace.
- `selection`: show it near selected text.
- `cursor`: place it near the current editor selection or caret when the browser gives obMenu a usable selection rectangle.
- `cursor`: place it near the current editor selection or caret when the browser gives mdMenu a usable selection rectangle.
- `manual`: drag it by the handle and keep the saved position.
Selection, cursor, and manual placement stay inside the viewport, even in small windows.
@ -81,7 +81,7 @@ After picking a preset, you can still add buttons, remove buttons, add separator
- `default`: regular Obsidian toolbar density.
- `compact`: smaller buttons when the note needs more room.
Both styles use Obsidian theme variables, so obMenu follows light and dark themes without adding its own color system.
Both styles use Obsidian theme variables, so mdMenu follows light and dark themes without adding its own color system.
### Editing details
@ -94,7 +94,7 @@ Both styles use Obsidian theme variables, so obMenu follows light and dark theme
### Settings safety
Saved settings are normalized on load. If old or malformed data shows up, obMenu falls back to defaults instead of breaking the toolbar.
Saved settings are normalized on load. If old or malformed data shows up, mdMenu falls back to defaults instead of breaking the toolbar.
### Release support
@ -128,10 +128,10 @@ styles.css
Put them here in your vault:
```text
.obsidian/plugins/obmenu
.obsidian/plugins/mdmenu
```
Then enable `obMenu` from Obsidian's community plugin settings.
Then enable `mdMenu` from Obsidian's community plugin settings.
## Build locally
@ -144,26 +144,26 @@ npm run build:dist
Copy this folder:
```text
dist/obmenu
dist/mdmenu
```
to your vault:
```text
.obsidian/plugins/obmenu
.obsidian/plugins/mdmenu
```
Then enable `obMenu` from Obsidian's community plugin settings.
Then enable `mdMenu` from Obsidian's community plugin settings.
## Release files
`npm run build:dist` creates:
```text
dist/obmenu/main.js
dist/obmenu/manifest.json
dist/obmenu/styles.css
dist/obmenu/LICENSE
dist/mdmenu/main.js
dist/mdmenu/manifest.json
dist/mdmenu/styles.css
dist/mdmenu/LICENSE
```
`dist/` is ignored by Git. Rebuild it when you need a fresh local package.
@ -177,7 +177,7 @@ git tag 1.0.0
git push origin 1.0.0
```
The release workflow runs on tags matching `x.y.z`. It installs dependencies with `npm ci`, runs `npm audit --omit=dev`, lints, typechecks, runs tests, builds `dist/obmenu`, checks that the tag matches `package.json` and `manifest.json`, verifies release assets, creates GitHub artifact attestations, and publishes `main.js`, `manifest.json`, and `styles.css`.
The release workflow runs on tags matching `x.y.z`. It installs dependencies with `npm ci`, runs `npm audit --omit=dev`, lints, typechecks, runs tests, builds `dist/mdmenu`, checks that the tag matches `package.json` and `manifest.json`, verifies release assets, creates GitHub artifact attestations, and publishes `main.js`, `manifest.json`, and `styles.css`.
## Development
@ -247,11 +247,11 @@ Next up:
## Privacy
obMenu runs locally inside Obsidian. It doesn't send notes, selections, settings, or telemetry anywhere.
mdMenu runs locally inside Obsidian. It doesn't send notes, selections, settings, or telemetry anywhere.
## Inspiration
obMenu is inspired by cMenu, an earlier Obsidian formatting toolbar plugin. This project doesn't copy cMenu source files.
mdMenu is inspired by cMenu, an earlier Obsidian formatting toolbar plugin. This project doesn't copy cMenu source files.
## License

View file

@ -1,16 +1,16 @@
# obMenu
# mdMenu
Небольшой WYSIWYG-подобный слой Markdown-форматирования для пользователей Obsidian.
[English](README.md) | [Русский](README.ru.md) | [Español](README.es.md) | [Deutsch](README.de.md) | [中文](README.zh.md) | [日本語](README.ja.md)
obMenu - clean-room плагин с Markdown-панелью инструментов, вдохновленный идеей cMenu. Он добавляет к редактору мини WYSIWYG-подобный слой для частого форматирования, но ваши заметки остаются обычным plain Markdown. Заголовки, чекбоксы, callout-блоки, ссылки, подсветка, код, списки, жирный, курсив и несколько спокойных помощников остаются рядом с текстом, который вы пишете.
mdMenu - clean-room плагин с Markdown-панелью инструментов, вдохновленный идеей cMenu. Он добавляет к редактору мини WYSIWYG-подобный слой для частого форматирования, но ваши заметки остаются обычным plain Markdown. Заголовки, чекбоксы, callout-блоки, ссылки, подсветка, код, списки, жирный, курсив и несколько спокойных помощников остаются рядом с текстом, который вы пишете.
Закрепите панель снизу, показывайте ее рядом с выделением или перетащите в удобное место. Вы по-прежнему пишете Markdown, просто с меньшим числом походов в command palette, меньшим количеством запомненных шорткатов и чуть более прямым управлением форматированием.
> Статус: готов к GitHub-релизам. Подача в каталог community plugins: в процессе.
![Скриншот панели obMenu](assets/readme/Screenshot%202026-06-12%20at%2015.28.52.png)
![Скриншот панели mdMenu](assets/readme/Screenshot%202026-06-12%20at%2015.28.52.png)
## Что уже работает
@ -43,7 +43,7 @@ obMenu - clean-room плагин с Markdown-панелью инструмент
### Размещение панели
obMenu поддерживает четыре режима размещения:
mdMenu поддерживает четыре режима размещения:
- `fixed`: держать панель снизу рабочей области.
- `selection`: показывать рядом с выделенным текстом.
@ -81,7 +81,7 @@ obMenu поддерживает четыре режима размещения:
- `default`: обычная плотность панели в стиле Obsidian.
- `compact`: кнопки меньше, когда заметке нужно больше места.
Оба стиля используют theme variables Obsidian, поэтому obMenu следует светлым и темным темам без собственной цветовой системы.
Оба стиля используют theme variables Obsidian, поэтому mdMenu следует светлым и темным темам без собственной цветовой системы.
### Детали редактирования
@ -94,7 +94,7 @@ obMenu поддерживает четыре режима размещения:
### Безопасность настроек
Сохраненные настройки нормализуются при загрузке. Если появятся старые или некорректные данные, obMenu вернется к значениям по умолчанию вместо поломки панели.
Сохраненные настройки нормализуются при загрузке. Если появятся старые или некорректные данные, mdMenu вернется к значениям по умолчанию вместо поломки панели.
### Поддержка релизов
@ -128,10 +128,10 @@ styles.css
Положите их в vault:
```text
.obsidian/plugins/obmenu
.obsidian/plugins/mdmenu
```
Затем включите `obMenu` в настройках community plugins.
Затем включите `mdMenu` в настройках community plugins.
## Локальная сборка
@ -144,16 +144,16 @@ npm run build:dist
Скопируйте папку:
```text
dist/obmenu
dist/mdmenu
```
в vault:
```text
.obsidian/plugins/obmenu
.obsidian/plugins/mdmenu
```
Затем включите `obMenu` в настройках community plugins.
Затем включите `mdMenu` в настройках community plugins.
## Разработка
@ -201,11 +201,11 @@ npm run check
## Privacy
obMenu работает локально внутри Obsidian. Он не отправляет заметки, выделения, настройки или телеметрию.
mdMenu работает локально внутри Obsidian. Он не отправляет заметки, выделения, настройки или телеметрию.
## Inspiration
obMenu вдохновлен cMenu, более ранним плагином панели форматирования для Obsidian. Этот проект не копирует исходные файлы cMenu.
mdMenu вдохновлен cMenu, более ранним плагином панели форматирования для Obsidian. Этот проект не копирует исходные файлы cMenu.
## License

View file

@ -1,16 +1,16 @@
# obMenu
# mdMenu
一个面向 Obsidian 用户的小巧类 WYSIWYG Markdown 格式层。
[English](README.md) | [Русский](README.ru.md) | [Español](README.es.md) | [Deutsch](README.de.md) | [中文](README.zh.md) | [日本語](README.ja.md)
obMenu 是一个 clean-room 的 Markdown 工具栏插件,灵感来自 cMenu 的产品想法。它给编辑器加上一层迷你的类 WYSIWYG 常用格式层,但你的笔记底层仍然是纯 Markdown。标题、复选框、callout、链接、高亮、代码、列表、粗体、斜体以及一些安静的小帮手都会留在你正在写的文字旁边。
mdMenu 是一个 clean-room 的 Markdown 工具栏插件,灵感来自 cMenu 的产品想法。它给编辑器加上一层迷你的类 WYSIWYG 常用格式层,但你的笔记底层仍然是纯 Markdown。标题、复选框、callout、链接、高亮、代码、列表、粗体、斜体以及一些安静的小帮手都会留在你正在写的文字旁边。
你可以把它固定在底部,让它跟随选区,也可以拖到顺手的位置。你仍然是在写 Markdown只是少打开几次 command palette少记几个快捷键并多一点直接操作格式的感觉。
> 状态:已准备好 GitHub release。Community plugin 提交正在进行中。
![obMenu 工具栏截图](assets/readme/Screenshot%202026-06-12%20at%2015.28.52.png)
![mdMenu 工具栏截图](assets/readme/Screenshot%202026-06-12%20at%2015.28.52.png)
## 现在可用的功能
@ -43,7 +43,7 @@ obMenu 是一个 clean-room 的 Markdown 工具栏插件,灵感来自 cMenu
### 工具栏位置
obMenu 支持四种位置模式:
mdMenu 支持四种位置模式:
- `fixed`:把工具栏固定在 workspace 底部。
- `selection`:显示在选中文本附近。
@ -81,7 +81,7 @@ Presets 是快速起点:
- `default`:常规 Obsidian 工具栏密度。
- `compact`:更小的按钮,在笔记需要更多空间时使用。
两个样式都使用 Obsidian theme variables所以 obMenu 会跟随浅色和深色主题,不引入自己的颜色系统。
两个样式都使用 Obsidian theme variables所以 mdMenu 会跟随浅色和深色主题,不引入自己的颜色系统。
### 编辑细节
@ -94,7 +94,7 @@ Presets 是快速起点:
### 设置安全
保存的设置会在加载时被规范化。如果出现旧数据或格式错误的数据,obMenu 会回退到默认值,而不是让工具栏失效。
保存的设置会在加载时被规范化。如果出现旧数据或格式错误的数据,mdMenu 会回退到默认值,而不是让工具栏失效。
### Release 支持
@ -128,10 +128,10 @@ styles.css
把它们放到 vault 的这里:
```text
.obsidian/plugins/obmenu
.obsidian/plugins/mdmenu
```
然后在 community plugin 设置中启用 `obMenu`。
然后在 community plugin 设置中启用 `mdMenu`。
## 本地构建
@ -144,16 +144,16 @@ npm run build:dist
复制这个文件夹:
```text
dist/obmenu
dist/mdmenu
```
到你的 vault
```text
.obsidian/plugins/obmenu
.obsidian/plugins/mdmenu
```
然后在 community plugin 设置中启用 `obMenu`。
然后在 community plugin 设置中启用 `mdMenu`。
## 开发
@ -201,11 +201,11 @@ npm run check
## 隐私
obMenu 只在 Obsidian 本地运行。它不会发送你的笔记、选区、设置或遥测数据。
mdMenu 只在 Obsidian 本地运行。它不会发送你的笔记、选区、设置或遥测数据。
## 灵感
obMenu 受到 cMenu 的启发cMenu 是一个较早的 Obsidian 格式工具栏插件。本项目不复制 cMenu 的源文件。
mdMenu 受到 cMenu 的启发cMenu 是一个较早的 Obsidian 格式工具栏插件。本项目不复制 cMenu 的源文件。
## 许可证

View file

@ -1,11 +1,15 @@
import esbuild from "esbuild";
import builtins from "builtin-modules";
import { builtinModules } from "node:module";
const prod = process.argv[2] === "production";
const nodeBuiltins = [
...builtinModules,
...builtinModules.map((moduleName) => `node:${moduleName}`),
];
const context = await esbuild.context({
banner: {
js: "/* obMenu - a clean-room Obsidian Markdown toolbar */",
js: "/* mdMenu - a clean-room Obsidian Markdown toolbar */",
},
entryPoints: ["src/main.ts"],
bundle: true,
@ -23,7 +27,7 @@ const context = await esbuild.context({
"@lezer/common",
"@lezer/highlight",
"@lezer/lr",
...builtins,
...nodeBuiltins,
],
format: "cjs",
target: "es2018",

View file

@ -1,6 +1,6 @@
{
"id": "obmenu",
"name": "obMenu",
"id": "mdmenu",
"name": "mdMenu",
"version": "1.0.0",
"minAppVersion": "1.5.0",
"description": "A mini WYSIWYG-style Markdown formatting toolbar.",

18
package-lock.json generated
View file

@ -1,16 +1,15 @@
{
"name": "obmenu",
"name": "mdmenu",
"version": "1.0.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "obmenu",
"name": "mdmenu",
"version": "1.0.0",
"license": "MIT",
"devDependencies": {
"@types/node": "^25.9.3",
"builtin-modules": "^5.2.0",
"esbuild": "^0.28.1",
"eslint": "^10.5.0",
"obsidian": "^1.13.1",
@ -1523,19 +1522,6 @@
"node": "18 || 20 || >=22"
}
},
"node_modules/builtin-modules": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-5.2.0.tgz",
"integrity": "sha512-02yxLeyxF4dNl6SlY6/5HfRSrSdZ/sCPoxy2kZNP5dZZX8LSAD9aE2gtJIUgWrsQTiMPl3mxESyrobSwvRGisQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=18.20"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/chai": {
"version": "6.2.2",
"resolved": "https://registry.npmjs.org/chai/-/chai-6.2.2.tgz",

View file

@ -1,5 +1,5 @@
{
"name": "obmenu",
"name": "mdmenu",
"version": "1.0.0",
"description": "A mini WYSIWYG-style Markdown formatting toolbar for Obsidian.",
"main": "main.js",
@ -25,11 +25,10 @@
"license": "MIT",
"repository": {
"type": "git",
"url": "https://github.com/sandsaber/obMenu.git"
"url": "https://github.com/sandsaber/mdMenu.git"
},
"devDependencies": {
"@types/node": "^25.9.3",
"builtin-modules": "^5.2.0",
"esbuild": "^0.28.1",
"eslint": "^10.5.0",
"obsidian": "^1.13.1",

View file

@ -1,16 +1,20 @@
import esbuild from "esbuild";
import builtins from "builtin-modules";
import { builtinModules } from "node:module";
import { copyFile, mkdir, rm } from "node:fs/promises";
import { join } from "node:path";
const distDir = "dist/obmenu";
const distDir = "dist/mdmenu";
const nodeBuiltins = [
...builtinModules,
...builtinModules.map((moduleName) => `node:${moduleName}`),
];
await rm(distDir, { recursive: true, force: true });
await mkdir(distDir, { recursive: true });
await esbuild.build({
banner: {
js: "/* obMenu - a clean-room Obsidian Markdown toolbar */",
js: "/* mdMenu - a clean-room Obsidian Markdown toolbar */",
},
entryPoints: ["src/main.ts"],
bundle: true,
@ -28,7 +32,7 @@ await esbuild.build({
"@lezer/common",
"@lezer/highlight",
"@lezer/lr",
...builtins,
...nodeBuiltins,
],
format: "cjs",
target: "es2018",

View file

@ -13,8 +13,8 @@ import {
applyInlineCommand,
} from "./commands/markdownCommands";
import { normalizeSettings } from "./settings";
import { ObMenuSettingTab } from "./settingsTab";
import type { ObMenuSettings, ToolbarItem } from "./types";
import { MdMenuSettingTab } from "./settingsTab";
import type { MdMenuSettings, ToolbarItem } from "./types";
import { ToolbarEvents } from "./toolbar/events";
import { clampPosition, positionNearRect } from "./toolbar/positioning";
import { ToolbarController } from "./toolbar/toolbar";
@ -36,8 +36,8 @@ const OBSIDIAN_COMMAND_MAP: Record<string, string> = {
wikilink: "editor:insert-wikilink",
};
export default class ObMenuPlugin extends Plugin {
settings!: ObMenuSettings;
export default class MdMenuPlugin extends Plugin {
settings!: MdMenuSettings;
private toolbar: ToolbarController | null = null;
private events: ToolbarEvents | null = null;
private unloaded = false;
@ -47,7 +47,7 @@ export default class ObMenuPlugin extends Plugin {
this.settings = normalizeSettings(await this.loadData());
await this.saveSettings();
this.registerBuiltInCommands();
this.addSettingTab(new ObMenuSettingTab(this.app, this));
this.addSettingTab(new MdMenuSettingTab(this.app, this));
this.app.workspace.onLayoutReady(() => {
if (this.unloaded) return;
@ -61,7 +61,7 @@ export default class ObMenuPlugin extends Plugin {
void this.saveSettings();
},
});
this.toolbar.mount(document.body);
this.toolbar.mount(activeDocument.body);
this.events = new ToolbarEvents(this.app.workspace, () =>
this.refreshToolbar(),
@ -241,13 +241,13 @@ export default class ObMenuPlugin extends Plugin {
const position = clampPosition(
this.settings.manualPosition ?? {
left: (window.innerWidth - toolbarSize.width) / 2,
top: window.innerHeight - toolbarSize.height - 16,
left: (activeWindow.innerWidth - toolbarSize.width) / 2,
top: activeWindow.innerHeight - toolbarSize.height - 16,
},
toolbarSize,
{
width: window.innerWidth,
height: window.innerHeight,
width: activeWindow.innerWidth,
height: activeWindow.innerHeight,
},
);
@ -274,15 +274,15 @@ export default class ObMenuPlugin extends Plugin {
}
const position = positionNearRect(triggerRect, toolbarSize, {
width: window.innerWidth,
height: window.innerHeight,
width: activeWindow.innerWidth,
height: activeWindow.innerHeight,
});
this.toolbar.setPosition(position.left, position.top);
}
private getTriggerRect(): DOMRect | null {
const selection = window.getSelection();
const selection = activeWindow.getSelection();
if (!selection || selection.rangeCount === 0) return null;
const range = selection.getRangeAt(0);

View file

@ -1,5 +1,5 @@
import type {
ObMenuSettings,
MdMenuSettings,
ToolbarItem,
ToolbarPosition,
ToolbarPositionMode,
@ -112,7 +112,7 @@ export const TOOLBAR_PRESETS: ToolbarPreset[] = [
},
];
export const DEFAULT_SETTINGS: ObMenuSettings = {
export const DEFAULT_SETTINGS: MdMenuSettings = {
enabled: true,
positionMode: "fixed",
visualStyle: "default",
@ -142,12 +142,12 @@ function isToolbarItem(value: unknown): value is ToolbarItem {
);
}
export function normalizeSettings(saved: unknown): ObMenuSettings {
export function normalizeSettings(saved: unknown): MdMenuSettings {
if (!saved || typeof saved !== "object") {
return structuredClone(DEFAULT_SETTINGS);
}
const input = saved as Partial<ObMenuSettings>;
const input = saved as Partial<MdMenuSettings>;
const toolbarItems = Array.isArray(input.toolbarItems)
? input.toolbarItems.filter(isToolbarItem)
: [];

View file

@ -1,7 +1,7 @@
import { PluginSettingTab, Setting, type App } from "obsidian";
import { BUILTIN_COMMANDS, getBuiltInCommand } from "./commands/registry";
import { DEFAULT_TOOLBAR_ITEMS, TOOLBAR_PRESETS } from "./settings";
import type ObMenuPlugin from "./main";
import type MdMenuPlugin from "./main";
import type {
ToolbarItem,
ToolbarPositionMode,
@ -26,10 +26,10 @@ function describeToolbarItemType(item: ToolbarItem): string {
return "Obsidian command";
}
export class ObMenuSettingTab extends PluginSettingTab {
export class MdMenuSettingTab extends PluginSettingTab {
private draggedToolbarIndex: number | null = null;
constructor(app: App, private readonly plugin: ObMenuPlugin) {
constructor(app: App, private readonly plugin: MdMenuPlugin) {
super(app, plugin);
}
@ -38,7 +38,7 @@ export class ObMenuSettingTab extends PluginSettingTab {
containerEl.empty();
new Setting(containerEl)
.setName("Enable obMenu")
.setName("Enable mdMenu")
.setDesc("Show the Markdown formatting toolbar while editing.")
.addToggle((toggle) => {
toggle.setValue(this.plugin.settings.enabled);
@ -116,7 +116,7 @@ export class ObMenuSettingTab extends PluginSettingTab {
}
await this.plugin.saveSettings();
this.plugin.refreshToolbar();
this.display();
this.update();
});
});
@ -134,13 +134,13 @@ export class ObMenuSettingTab extends PluginSettingTab {
];
await this.plugin.saveSettings();
this.plugin.refreshToolbar();
this.display();
this.update();
});
});
new Setting(containerEl)
.setName("Reset toolbar")
.setDesc("Restore the default obMenu toolbar items.")
.setDesc("Restore the default mdMenu toolbar items.")
.addButton((button) => {
button.setIcon("undo-2").setTooltip("Reset toolbar").onClick(async () => {
this.plugin.settings.toolbarItems = structuredClone(
@ -148,7 +148,7 @@ export class ObMenuSettingTab extends PluginSettingTab {
);
await this.plugin.saveSettings();
this.plugin.refreshToolbar();
this.display();
this.update();
});
});
@ -206,7 +206,7 @@ export class ObMenuSettingTab extends PluginSettingTab {
];
await this.plugin.saveSettings();
this.plugin.refreshToolbar();
this.display();
this.update();
});
});
}
@ -216,7 +216,7 @@ export class ObMenuSettingTab extends PluginSettingTab {
const setting = new Setting(containerEl)
.setName(describeToolbarItem(item))
.setDesc(describeToolbarItemType(item))
.setClass("obmenu-toolbar-setting-row");
.setClass("mdmenu-toolbar-setting-row");
setting.settingEl.draggable = true;
setting.settingEl.addEventListener("dragstart", (event) => {
@ -280,7 +280,7 @@ export class ObMenuSettingTab extends PluginSettingTab {
);
await this.plugin.saveSettings();
this.plugin.refreshToolbar();
this.display();
this.update();
});
});
});
@ -304,7 +304,7 @@ export class ObMenuSettingTab extends PluginSettingTab {
this.plugin.settings.toolbarItems = items;
await this.plugin.saveSettings();
this.plugin.refreshToolbar();
this.display();
this.update();
}
private nextSeparatorId(): string {

View file

@ -3,6 +3,7 @@ import type { EventRef, Workspace } from "obsidian";
export class ToolbarEvents {
private refs: EventRef[] = [];
private selectionHandler: (() => void) | null = null;
private selectionDocument: Document | null = null;
constructor(
private readonly workspace: Workspace,
@ -13,7 +14,8 @@ export class ToolbarEvents {
this.refs.push(this.workspace.on("active-leaf-change", this.refresh));
this.refs.push(this.workspace.on("layout-change", this.refresh));
this.selectionHandler = () => this.refresh();
document.addEventListener("selectionchange", this.selectionHandler);
this.selectionDocument = activeDocument;
this.selectionDocument.addEventListener("selectionchange", this.selectionHandler);
}
unregister(): void {
@ -23,10 +25,14 @@ export class ToolbarEvents {
this.refs = [];
if (this.selectionHandler) {
document.removeEventListener("selectionchange", this.selectionHandler);
if (this.selectionHandler && this.selectionDocument) {
this.selectionDocument.removeEventListener(
"selectionchange",
this.selectionHandler,
);
}
this.selectionHandler = null;
this.selectionDocument = null;
}
}

View file

@ -1,11 +1,11 @@
import { ButtonComponent, setIcon, type App, type Command } from "obsidian";
import { getBuiltInCommand } from "../commands/registry";
import type { ObMenuSettings, ToolbarItem, ToolbarPosition } from "../types";
import type { MdMenuSettings, ToolbarItem, ToolbarPosition } from "../types";
import { clampPosition } from "./positioning";
export interface ToolbarControllerOptions {
app: App;
settings: ObMenuSettings;
settings: MdMenuSettings;
onRunItem: (item: ToolbarItem, event: MouseEvent) => void;
onManualMove: (position: ToolbarPosition) => void;
}
@ -31,7 +31,7 @@ export class ToolbarController {
mount(parent: HTMLElement): void {
if (this.root) return;
this.root = createDiv({ cls: "obmenu-toolbar" });
this.root = createDiv({ cls: "mdmenu-toolbar" });
parent.appendChild(this.root);
this.render();
}
@ -63,7 +63,7 @@ export class ToolbarController {
for (const item of this.options.settings.toolbarItems) {
if (item.type === "separator") {
this.root.createDiv({
cls: "obmenu-separator",
cls: "mdmenu-separator",
attr: { role: "separator" },
});
continue;
@ -84,7 +84,7 @@ export class ToolbarController {
const tooltip = disabled ? `Missing command: ${commandId}` : label;
const button = new ButtonComponent(this.root);
button.setClass("obmenu-button");
button.setClass("mdmenu-button");
button.setTooltip(tooltip);
button.setDisabled(disabled);
button.buttonEl.setAttribute("aria-label", tooltip);
@ -101,7 +101,7 @@ export class ToolbarController {
if (!this.root) return;
const handle = this.root.createEl("button", {
cls: "obmenu-drag-handle",
cls: "mdmenu-drag-handle",
attr: {
"aria-label": "Drag toolbar",
type: "button",
@ -121,18 +121,16 @@ export class ToolbarController {
if (!this.root) return;
this.root.addClass("is-positioned");
this.root.style.bottom = "auto";
this.root.style.left = `${left}px`;
this.root.style.top = `${top}px`;
this.root.setCssProps({
"--mdmenu-left": `${left}px`,
"--mdmenu-top": `${top}px`,
});
}
clearPosition(): void {
if (!this.root) return;
this.root.removeClass("is-positioned");
this.root.style.left = "";
this.root.style.top = "";
this.root.style.bottom = "";
}
getSize(): { width: number; height: number } | null {
@ -172,7 +170,7 @@ export class ToolbarController {
top: startRect.top + moveEvent.clientY - startPointer.top,
},
toolbarSize,
{ width: window.innerWidth, height: window.innerHeight },
{ width: activeWindow.innerWidth, height: activeWindow.innerHeight },
);
this.setPosition(latestPosition.left, latestPosition.top);
@ -185,14 +183,14 @@ export class ToolbarController {
this.options.onManualMove(latestPosition);
};
document.addEventListener("pointermove", onPointerMove);
document.addEventListener("pointerup", stopDrag, { once: true });
document.addEventListener("pointercancel", stopDrag, { once: true });
activeDocument.addEventListener("pointermove", onPointerMove);
activeDocument.addEventListener("pointerup", stopDrag, { once: true });
activeDocument.addEventListener("pointercancel", stopDrag, { once: true });
this.dragCleanup = () => {
document.removeEventListener("pointermove", onPointerMove);
document.removeEventListener("pointerup", stopDrag);
document.removeEventListener("pointercancel", stopDrag);
activeDocument.removeEventListener("pointermove", onPointerMove);
activeDocument.removeEventListener("pointerup", stopDrag);
activeDocument.removeEventListener("pointercancel", stopDrag);
};
}
}

View file

@ -14,7 +14,7 @@ export interface ToolbarItem {
commandId?: string;
}
export interface ObMenuSettings {
export interface MdMenuSettings {
enabled: boolean;
positionMode: ToolbarPositionMode;
visualStyle: ToolbarVisualStyle;

View file

@ -1,4 +1,4 @@
.obmenu-toolbar {
.mdmenu-toolbar {
position: fixed;
z-index: var(--layer-popover);
left: 50%;
@ -16,21 +16,23 @@
transform: translateX(-50%);
}
.obmenu-toolbar.is-positioned {
.mdmenu-toolbar.is-positioned {
bottom: auto;
left: var(--mdmenu-left);
top: var(--mdmenu-top);
transform: none;
}
.obmenu-toolbar.is-hidden {
.mdmenu-toolbar.is-hidden {
display: none;
}
.obmenu-toolbar.is-compact {
.mdmenu-toolbar.is-compact {
gap: 2px;
padding: 3px;
}
.obmenu-drag-handle {
.mdmenu-drag-handle {
display: inline-flex;
align-items: center;
justify-content: center;
@ -43,15 +45,15 @@
cursor: grab;
}
.obmenu-toolbar.is-compact .obmenu-drag-handle {
.mdmenu-toolbar.is-compact .mdmenu-drag-handle {
height: 24px;
}
.obmenu-toolbar.is-dragging .obmenu-drag-handle {
.mdmenu-toolbar.is-dragging .mdmenu-drag-handle {
cursor: grabbing;
}
.obmenu-button {
.mdmenu-button {
width: 32px;
height: 32px;
min-width: 32px;
@ -59,28 +61,28 @@
border-radius: 6px;
}
.obmenu-toolbar.is-compact .obmenu-button {
.mdmenu-toolbar.is-compact .mdmenu-button {
width: 24px;
height: 24px;
min-width: 24px;
}
.obmenu-button svg {
.mdmenu-button svg {
width: 16px;
height: 16px;
}
.obmenu-drag-handle svg {
.mdmenu-drag-handle svg {
width: 14px;
height: 14px;
}
.obmenu-toolbar.is-compact .obmenu-button svg {
.mdmenu-toolbar.is-compact .mdmenu-button svg {
width: 14px;
height: 14px;
}
.obmenu-separator {
.mdmenu-separator {
width: 1px;
height: 20px;
margin: 0 2px;
@ -88,18 +90,18 @@
flex: 0 0 auto;
}
.obmenu-toolbar.is-compact .obmenu-separator {
.mdmenu-toolbar.is-compact .mdmenu-separator {
height: 16px;
}
.obmenu-toolbar-setting-row {
.mdmenu-toolbar-setting-row {
cursor: grab;
}
.obmenu-toolbar-setting-row.is-dragging {
.mdmenu-toolbar-setting-row.is-dragging {
opacity: 0.55;
}
.obmenu-toolbar-setting-row.is-drag-over {
.mdmenu-toolbar-setting-row.is-drag-over {
background: var(--background-modifier-hover);
}