mirror of
https://github.com/hanblade67-cloud/media-layout.git
synced 2026-07-22 06:41:50 +00:00
Compare commits
13 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
366ed3eea1 | ||
|
|
02018ed216 | ||
|
|
d3558efb60 | ||
|
|
4109db5ba2 | ||
|
|
9900873b01 | ||
|
|
eba49c57ae | ||
|
|
f9ed93992a | ||
|
|
7ba495c36a | ||
|
|
fa1767d617 | ||
|
|
da22e7f575 | ||
|
|
4943998d97 | ||
|
|
9c941d52e2 | ||
|
|
401eaa416a |
6 changed files with 8585 additions and 94 deletions
21
LICENSE
Normal file
21
LICENSE
Normal file
|
|
@ -0,0 +1,21 @@
|
|||
MIT License
|
||||
|
||||
Copyright (c) 2025 Hanblade
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
245
README.md
245
README.md
|
|
@ -1,94 +1,151 @@
|
|||
# Media Layout
|
||||
### A plugin that lets you freely arrange videos, images, and audio — with **clone-only presets** for rock-solid layouts
|
||||
|
||||
Break out of Markdown’s linear flow: **drag, resize, and position media anywhere on the page** in Live Preview. You can edit both **originals in the text flow** and **clones** (recommended). Presets and page saves are now **clone-only**: they store and restore clones (with their size/position/background) and leave originals in the flow, which avoids fragile edge cases.
|
||||
|
||||

|
||||
|
||||
---
|
||||
|
||||
## Features
|
||||
- **Free move & resize** for videos, images, and audio in **Live Preview** — works for **originals** (in-flow) and **clones**.
|
||||
- **Clone-only presets** — save/apply page layouts that include **only clones** (their geometry, backgrounds, locks). Originals remain in the text flow.
|
||||
- **Optional detaching of originals** — you *can* detach originals to reposition them, but it’s disabled by default and not recommended (see **Important notes**).
|
||||
- **Backgrounds**
|
||||
- **Global** background & opacity for all media,
|
||||
- **Local** per-item background, with **“Only for this file”** to limit styling to the current note.
|
||||
- **Lock / Unlock** any item to avoid accidental moves.
|
||||
- **Persistence** — layouts (clones, settings) persist across reloads.
|
||||
- **Smooth modal animation** (can be disabled) for a pleasant, non-jittery UI.
|
||||
- **Customization timing** — tune panel **hide duration**, clone **restore delay**, and note-box **restore delay**.
|
||||
- **Localization** built-in: de, pl, es, fr, it, be, uk, uz, vi, zh-CN, zh-TW (and expandable).
|
||||
- **Audio UX** — resize/position works; handles are **invisible but active**.
|
||||
- **Safety** — designed to avoid text selection during drag and keep cursor behavior stable.
|
||||
|
||||
---
|
||||
|
||||
## Why this exists
|
||||
Plain Markdown keeps media glued to the text flow. *Media Layout* provides a floating control layer and **clones** so you can **compose pages visually** while your notes remain simple and portable. By making presets **clone-only**, the plugin avoids flow corruption and stays robust on complex pages.
|
||||
|
||||
---
|
||||
|
||||
## How to use
|
||||
1. **Enable** the plugin.
|
||||
2. Insert media into a note (video / image / audio).
|
||||
3. Create a **Clone** (recommended). You can also work with **originals in flow**; to **reposition originals** by detaching them, enable the setting in **`Media Layout: Settings`** (see Important notes).
|
||||
4. **Drag & resize** to precise positions.
|
||||

|
||||
5. Open the item menu to set **Background** / **Opacity**; toggle **Only for this file** for local styling.
|
||||

|
||||
6. **Lock** items when ready.
|
||||
7. **Save a Preset** — this now saves **clones only**. **Apply** will restore clones (sizes/positions/backgrounds); originals stay in the flow.
|
||||

|
||||
|
||||
---
|
||||
|
||||
## Core concepts
|
||||
### Originals (in-flow) vs Clones
|
||||
- **Originals** live in the Markdown flow. You can resize them; to change their **position on page**, you must enable **Detach originals** in **`Media Layout: Settings`** (off by default).
|
||||
- **Clones** are independent visual instances referencing the same file, with their **own** size, position, background, and lock.
|
||||
|
||||
> **Recommendation:** Use **clones** for production layouts. Presets are clone-only by design; originals remain stable in the text flow.
|
||||
|
||||
---
|
||||
|
||||
## Important notes & limitations
|
||||
- **Detaching originals** can cause **incorrect flow or visual glitches** depending on surrounding content or other plugins.
|
||||
**Best practice:** keep originals in the flow and build your layout with **clones**.
|
||||
- **Reset all** truly resets **everything**: clones, their positions, and any detached originals (restores originals to normal flow).
|
||||
- Heavy pages (many large videos/GIFs) may impact performance — keep sizes reasonable.
|
||||
- Aggressive custom CSS or third-party media enhancers may affect overlays/backgrounds.
|
||||
|
||||
---
|
||||
|
||||
## Settings & options
|
||||
- **Detach originals (off by default)** — allows repositioning originals outside the flow; use with caution.
|
||||
- **Presets** — **clone-only** save/apply; include clone geometry, backgrounds, locks.
|
||||
- **Backgrounds** — global defaults; per-item local background & opacity with **Only for this file**.
|
||||
- **Timing & animation**
|
||||
- **Panel hide duration** (how long the panel waits before hiding),
|
||||
- **Clone restore delay** (stagger clone appearance),
|
||||
- **Note-box restore delay**,
|
||||
- **Modal animation** — smooth open/close (can be disabled).
|
||||
- **Reset & restore** tools for quick cleanup.
|
||||
- **Language selection** (localization).
|
||||
|
||||
---
|
||||
|
||||
## Where data is stored
|
||||
The plugin uses Obsidian’s standard plugin storage (`.obsidian/plugins/media-layout/`), keeping:
|
||||
- clone layouts (positions/sizes),
|
||||
- per-item/local backgrounds & opacity,
|
||||
- **clone-only** preset definitions.
|
||||
|
||||
---
|
||||
|
||||
## FAQ
|
||||
**Do clones duplicate files?**
|
||||
No. They reference the same media file — only geometry/styling is duplicated.
|
||||
|
||||
**Will my layout persist after restart?**
|
||||
Yes. Clones and their presets are restored automatically.
|
||||
|
||||
**Can I edit in Reading Mode?**
|
||||
Editing is meant for **Live Preview**. Reading Mode shows the arranged result; interactions are limited.
|
||||
# Media Layout
|
||||
|
||||
A plugin that allows you to freely arrange and resize media elements (videos, images, audio) and note boxes directly on the page. Create visual compositions while maintaining the simplicity and portability of your notes.
|
||||
|
||||
---
|
||||

|
||||
## 🎯 Key Features
|
||||
|
||||
### Working with Media
|
||||
- **Editing** — freely edit videos, images, and audio in Live Preview mode
|
||||
- **In-flow Files** — edit the size and shape of media directly in the text flow
|
||||
- **Clones** — create visual copies of media with their own size and position
|
||||
|
||||
---
|
||||
|
||||
## 👥 Clones
|
||||
## <sup>Files in the flow can be detached for free movement throughout the note, but instead it's recommended to clone the desired file and position it where needed. Clones are loaded directly from your disk, so after cloning you can delete the original element from the note—the clone will be independent of it, but the file itself must exist on disk in your vault.</sup>
|
||||
#### CLONE CAPABILITIES:
|
||||
- **📐 Sizing** — change the size of photos, videos, and audio by dragging special handles or set the desired size using the menu
|
||||
<img width="393" height="301" alt="screen for ML1" src="https://github.com/user-attachments/assets/4309cf3d-12e7-49bd-bac5-10a48f47ac68" />
|
||||
|
||||
- **✨ Transformation** — unlike audio and video, image files can be transformed by holding ctrl and dragging the handles
|
||||
- **🗺️ Movement** — unlike files in the flow, clones can be freely placed anywhere in the note
|
||||
- **📋 Presets** — by pressing a special button, you can save all clones and note boxes currently in the note to a preset
|
||||
<img width="356" height="225" alt="сохранение страницы" src="https://github.com/user-attachments/assets/7024dc7c-f935-4b5f-8951-50e4962f47ae" />
|
||||
|
||||
- **✅ Page Save** — after saving a page, you can insert it into any other (all clone and note box data is saved, including current position and all presets)
|
||||
- **🔄 Rotation** — clones and note boxes can not only be freely moved but also rotated (grid-snapped if holding shift)
|
||||
|
||||

|
||||
|
||||
- **🔗 Link** — insert a link into an image clone and it will open when clicked (just like a YouTube thumbnail)
|
||||
- **🎨 Customization** — customize clones and note boxes as you like, you can edit background color, text color, transparency, and more
|
||||
<img width="564" height="336" alt="Screenshot_5" src="https://github.com/user-attachments/assets/1d0f3003-9c8e-402d-b889-4b81a1a75f55" />
|
||||
|
||||
## <sub></sub>
|
||||
#### CLONE STYLING:
|
||||

|
||||
#### Backgrounds
|
||||
- **Global Background** — set background and opacity for all media
|
||||
- **Local Background ("Only for this file")** — customize background for individual elements
|
||||
- **Transparency** — make the background transparent, leaving only the content
|
||||
|
||||
### Element Management
|
||||
|
||||
#### Multi-Select and Selection
|
||||
- **Select Elements** — `Ctrl + Click` to select clones and tables
|
||||
- **Area Selection** — `Ctrl + Drag` to select multiple elements with a box
|
||||
- **Group Movement** — drag any selected element to move the entire group
|
||||
- **Bulk Delete** — delete all selected elements with one action
|
||||
|
||||
#### Locking
|
||||
- **Protection from Accidental Changes** — lock elements after configuration
|
||||
|
||||
## Note Boxes
|
||||
|
||||
Create a note box to add text anywhere in the note (background can be removed leaving only text)
|
||||
<img width="264" height="105" alt="добавление талички" src="https://github.com/user-attachments/assets/8186f6b2-e84a-4d80-a886-01de3ce52b95" />
|
||||
|
||||
- **Font Size on the Fly:**
|
||||
- `Ctrl + Mouse Wheel` — 10 px step
|
||||
- `Shift + Mouse Wheel` — precise 1 px adjustment
|
||||
- **Color Settings:**
|
||||
- Table background
|
||||
- Header color
|
||||
- Text color
|
||||
- Border color (uses the currently selected color)
|
||||
|
||||
## Presets
|
||||
- **Save Layouts** — save clones and note boxes together with all their data (positions, sizes, backgrounds, locks, etc.)
|
||||
- **Apply Presets** — quickly restore saved compositions
|
||||
- **Reliability** — originals remain in the text flow, avoiding conflicts and not interacting with presets at all
|
||||
|
||||
---
|
||||
|
||||
## ⚙️ Settings
|
||||
|
||||
Open via Command Palette: **`Media Layout: Settings`**
|
||||
|
||||
### List
|
||||
- **Detach Originals** (off by default) — allows moving original media outside the flow
|
||||
- **Handle Visibility** — make resize handles invisible but active
|
||||
- **Panel Hide Duration**
|
||||
- **Clone Restore Delay**
|
||||
- **Table Restore Delay**
|
||||
- **Modal Animation** — smooth open/close
|
||||
|
||||
---
|
||||
|
||||
### 🌍 Localization
|
||||
Built-in language support: de, pl, es, fr, it, be, uk, uz, vi, zh-CN, zh-TW
|
||||
|
||||
---
|
||||
|
||||
## 💾 Data Storage
|
||||
|
||||
**Location:** `.obsidian/plugins/media-layout/`
|
||||
|
||||
**What's Stored:**
|
||||
Absolutely all data, including sizes of original files in the flow, clones, settings, backgrounds, note boxes, text, etc.
|
||||
|
||||
### Automatic Backups
|
||||
- **Interval:** every 10 minutes (when changes are made)
|
||||
- **Retention:** up to 4 files with rotation
|
||||
- **Format:** `DD_MM_YYYY_HH꞉MM_data_backup.json`
|
||||
- **Recovery:** replace `data.json` with the desired backup (with Obsidian closed)
|
||||
|
||||
---
|
||||
|
||||
## 📖 How to Use the Plugin
|
||||
|
||||
1. **Enable the plugin** in Obsidian settings
|
||||
2. **Insert media** into a note (video/image/audio) or add a note box
|
||||
3. **Create a clone** (recommended for free placement) and work with it as you like
|
||||
4. **Adjust size and position** — drag and resize elements
|
||||
5. **Style** — set background, opacity, colors (via element menu)
|
||||
6. **Lock** — protect elements from accidental changes
|
||||
|
||||
<img width="298" height="146" alt="блокировка" src="https://github.com/user-attachments/assets/53d80f04-7a6a-4633-ae77-d1faa5042078" />
|
||||
|
||||
7. **Save a preset** — save the composition so you don't lose it if you accidentally delete any elements, or to try a different composition variant and have the ability to restore the previous one
|
||||
|
||||

|
||||
---
|
||||
|
||||
## ⚠️ Important to Know
|
||||
|
||||
### Originals vs Clones
|
||||
- **Originals** — located in the Markdown text flow; can be resized; repositioning requires detachment (not recommended)
|
||||
- **Clones** — independent visual copies with their own parameters; don't affect the text flow
|
||||
|
||||
**Recommendation:** use **clones** for creating layouts. It's safer and more stable, as detaching files from the flow can narrow the content display in the note—this happens due to Obsidian's CodeMirror 6 optimization system.
|
||||
|
||||
### Limitations and Features
|
||||
- **Detaching originals** may cause visual bugs due to CM6 specifics
|
||||
- **Reset all settings** removes clones and restores originals to the flow
|
||||
- Large amounts of heavy media (videos, GIFs) may reduce performance
|
||||
- Aggressive CSS or third-party plugins may affect display
|
||||
|
||||
---
|
||||
|
||||
## ❓ FAQ
|
||||
|
||||
**Do clones duplicate files?**
|
||||
No. Clones reference the same file — only display parameters are duplicated.
|
||||
|
||||
**Will the layout persist after restart?**
|
||||
Yes. Clones and presets are restored automatically.
|
||||
|
||||
**Can I edit in Reading Mode?**
|
||||
Editing is only available in **Live Preview**. Reading Mode shows the result with limited interaction.
|
||||
9
manifest.json
Normal file
9
manifest.json
Normal file
|
|
@ -0,0 +1,9 @@
|
|||
{
|
||||
"id": "media-layout",
|
||||
"name": "Media Layout",
|
||||
"version": "5.6.1",
|
||||
"minAppVersion": "1.8.0",
|
||||
"author": "Hanblade",
|
||||
"description": "Drag, resize, and arrange media elements with floating notes and presets.",
|
||||
"isDesktopOnly": true
|
||||
}
|
||||
826
styles.css
Normal file
826
styles.css
Normal file
|
|
@ -0,0 +1,826 @@
|
|||
/* Media Layout Plugin Styles */
|
||||
|
||||
/* ========== Modal Styles ========== */
|
||||
|
||||
/* Background Color Modal */
|
||||
.ms-bgcolor-wrap {
|
||||
display: grid;
|
||||
grid-template-columns: auto 1fr;
|
||||
gap: 12px;
|
||||
align-items: center;
|
||||
margin: 6px 0 12px;
|
||||
}
|
||||
|
||||
.ms-bgcolor-wrap input[type="color"] {
|
||||
width: 64px;
|
||||
height: 64px;
|
||||
border: 0;
|
||||
padding: 0;
|
||||
background: transparent;
|
||||
}
|
||||
|
||||
.ms-bgcolor-wrap input[type="text"] {
|
||||
width: 120px;
|
||||
}
|
||||
|
||||
/* Width Preset Modal */
|
||||
.ms-width-preset-modal-content {}
|
||||
|
||||
.ms-width-preset-modal-content .modal-button-container {
|
||||
position: relative;
|
||||
right: 20px;
|
||||
}
|
||||
|
||||
/* Rename Modal */
|
||||
.ms-rename-modal .ms-rename-form {
|
||||
margin-top: 8px;
|
||||
}
|
||||
|
||||
.ms-rename-modal .ms-rename-form input {
|
||||
width: 100%;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.ms-rename-modal .ms-rename-actions {
|
||||
display: flex;
|
||||
gap: 8px;
|
||||
margin-top: 20px;
|
||||
}
|
||||
|
||||
/* Clone Settings Modal */
|
||||
.ms-clone-settings-modal .setting-item-control span {
|
||||
display: inline-block;
|
||||
width: 3.5em;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
/* Image Size Modal */
|
||||
.ms-imgsz-form .ms-row {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
margin: 8px 0;
|
||||
}
|
||||
|
||||
.ms-imgsz-form input[type="number"] {
|
||||
width: 120px;
|
||||
}
|
||||
|
||||
/* ========== Modal Width Classes ========== */
|
||||
.ms-modal-width-355 {
|
||||
width: 355px;
|
||||
}
|
||||
|
||||
/* ========== Input Size Classes ========== */
|
||||
.ms-input-width-300 {
|
||||
width: 300px;
|
||||
max-width: 100%;
|
||||
min-width: 260px;
|
||||
}
|
||||
|
||||
/* ========== Position Classes ========== */
|
||||
.ms-position-relative-bottom-0 {
|
||||
position: relative;
|
||||
bottom: 0px;
|
||||
}
|
||||
|
||||
.ms-margin-bottom-12 {
|
||||
margin-bottom: 12px;
|
||||
}
|
||||
|
||||
.ms-margin-bottom-8 {
|
||||
margin-bottom: 8px;
|
||||
}
|
||||
|
||||
.ms-margin-right-6 {
|
||||
margin-right: 6px;
|
||||
}
|
||||
|
||||
/* ========== Display & Visibility Classes ========== */
|
||||
.ms-display-block {
|
||||
display: block;
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
.ms-display-none {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* ========== Cursor Classes ========== */
|
||||
.ms-cursor-default {
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
/* ========== Local Background ========== */
|
||||
.ms-local-bg {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
z-index: 1;
|
||||
border-radius: inherit;
|
||||
}
|
||||
|
||||
/* ========== Media Background ========== */
|
||||
.ms-media-bg {
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
z-index: -1;
|
||||
border-radius: inherit;
|
||||
}
|
||||
|
||||
/* ========== Dynamic Media Background (uses CSS variables) ========== */
|
||||
.mx-media-embed .bg-slate-900,
|
||||
.media-extended .bg-slate-900,
|
||||
.media-embed .bg-slate-900,
|
||||
.ms-host[data-ms-kind="audio"] .ms-media-bg,
|
||||
.ms-host[data-ms-kind="video"][data-ms-parent-key] .ms-media-bg {
|
||||
background-color: var(--ms-media-bg-color, #242424) !important;
|
||||
}
|
||||
|
||||
.ms-host[data-ms-locked="1"] .ms-handle {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.ms-host[data-ms-locked="1"] {
|
||||
cursor: default !important;
|
||||
}
|
||||
|
||||
/* Selection Marquee */
|
||||
#ms-marquee {
|
||||
position: fixed;
|
||||
border: 1px dashed var(--interactive-accent);
|
||||
background-color: rgba(128, 0, 128, 0.1);
|
||||
pointer-events: none;
|
||||
z-index: 9999;
|
||||
display: none;
|
||||
}
|
||||
|
||||
.ms-host.--selected {
|
||||
outline: 2px solid var(--interactive-accent) !important;
|
||||
outline-offset: 2px;
|
||||
box-shadow: 0 0 12px rgba(128, 0, 128, 0.5);
|
||||
}
|
||||
|
||||
.mx-media-embed,
|
||||
.media-extended,
|
||||
.media-embed {
|
||||
background-color: #0000 !important;
|
||||
}
|
||||
|
||||
.mx-media-embed .media-controls,
|
||||
.media-extended .media-controls {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.media-embed video,
|
||||
.mx-media-embed video,
|
||||
.media-extended video {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
/* ========== Clone Hide Delay (uses CSS variables) ========== */
|
||||
.ms-host[data-ms-kind="video"][data-ms-parent-key][data-ms-animation="popup"] .ms-clone-controls {
|
||||
transition: transform 0.2s ease-out var(--ms-clone-hide-delay, 2s), opacity 0.2s ease-out var(--ms-clone-hide-delay, 2s);
|
||||
}
|
||||
|
||||
.ms-host[data-ms-kind="video"][data-ms-parent-key][data-ms-animation="fade"] .ms-clone-controls {
|
||||
transition: opacity 0.2s ease-out var(--ms-clone-hide-delay, 2s);
|
||||
}
|
||||
|
||||
/* ========== Modal Animation (uses CSS variables) ========== */
|
||||
@keyframes ms-modal-bg-fade-in {
|
||||
from { opacity: 0; }
|
||||
to { opacity: 0.85; }
|
||||
}
|
||||
|
||||
html[style*="--ms-modal-animation: enabled"] .modal-bg {
|
||||
animation: ms-modal-bg-fade-in 0.5s ease forwards !important;
|
||||
}
|
||||
|
||||
@keyframes ms-modal-scale-in {
|
||||
from { opacity: 0; transform: scale(0.9); }
|
||||
to { opacity: 1; transform: scale(1); }
|
||||
}
|
||||
|
||||
html[style*="--ms-modal-animation: enabled"] .modal:has(.ms-clone-settings-modal),
|
||||
html[style*="--ms-modal-animation: enabled"] .modal:has(.ms-bgcolor-modal-content),
|
||||
html[style*="--ms-modal-animation: enabled"] .modal:has(.ms-layout-settings-modal),
|
||||
html[style*="--ms-modal-animation: enabled"] .modal:has(.ms-rename-modal) {
|
||||
animation: ms-modal-scale-in 0.15s cubic-bezier(0.25, 0.1, 0.25, 1.0);
|
||||
}
|
||||
|
||||
/* ========== Global Handle Styles (uses CSS variables) ========== */
|
||||
html[style*="--ms-handles-opacity: 0"] .ms-handle {
|
||||
opacity: 0 !important;
|
||||
}
|
||||
|
||||
/* ========== Main Plugin Styles ========== */
|
||||
|
||||
.ms-host {
|
||||
position: relative;
|
||||
display: block;
|
||||
will-change: transform;
|
||||
isolation: isolate;
|
||||
z-index: 20;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
.ms-host[data-ms-detached="1"] {
|
||||
z-index: 2500;
|
||||
}
|
||||
|
||||
.ms-float-layer {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
border: 0;
|
||||
pointer-events: none;
|
||||
z-index: 2000;
|
||||
transform: none;
|
||||
display: block !important;
|
||||
visibility: visible !important;
|
||||
}
|
||||
|
||||
.workspace-leaf.is-readable .cm-sizer {
|
||||
visibility: visible !important;
|
||||
display: block !important;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.markdown-preview-sizer,
|
||||
.cm-sizer {
|
||||
position: relative;
|
||||
display: block !important;
|
||||
}
|
||||
|
||||
.markdown-source-view,
|
||||
.cm-scroller,
|
||||
.markdown-reading-view {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.ms-float-layer .ms-host {
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
/* ========== Dock Styles ========== */
|
||||
|
||||
.ms-dock {
|
||||
position: absolute;
|
||||
z-index: 2001;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
width: 320px;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.ms-dock .ms-host {
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
.ms-dock.ms-dock--right {
|
||||
right: 0;
|
||||
}
|
||||
|
||||
.ms-dock.ms-dock--left {
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.ms-dock.ms-dock--top {
|
||||
left: 0;
|
||||
right: 0;
|
||||
height: 220px;
|
||||
width: auto;
|
||||
}
|
||||
|
||||
/* ========== Overlay Styles ========== */
|
||||
|
||||
.ms-overlay {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
z-index: 2600;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.ms-overlay.--drag,
|
||||
.ms-overlay.--dragmove {
|
||||
pointer-events: all;
|
||||
}
|
||||
|
||||
.ms-overlay .ms-handle {
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
.ms-overlay .ms-handle,
|
||||
.ms-overlay .ms-header,
|
||||
.ms-overlay .ms-btn,
|
||||
.ms-clone-controls {
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
.ms-noselect {
|
||||
user-select: none !important;
|
||||
}
|
||||
|
||||
/* ========== Link Overlay ========== */
|
||||
.ms-link-overlay {}
|
||||
|
||||
/* ========== Clone Styles ========== */
|
||||
|
||||
.ms-host[data-ms-parent-key] .mejs__controls,
|
||||
.ms-host[data-ms-parent-key] .plyr__controls,
|
||||
.ms-host[data-ms-parent-key] .vjs-control-bar {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.ms-host:fullscreen .ms-handle {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.ms-host[data-ms-kind="video"][data-ms-parent-key],
|
||||
.ms-host[data-ms-kind="audio"][data-ms-parent-key] {
|
||||
border-radius: 8px;
|
||||
}
|
||||
|
||||
.ms-host[data-ms-parent-key] > video,
|
||||
.ms-host[data-ms-parent-key] > audio,
|
||||
.ms-host[data-ms-parent-key] .ms-clone-controls {
|
||||
clip-path: inset(0 0 0 0 round 8px);
|
||||
}
|
||||
|
||||
.ms-host[data-ms-kind="audio"][data-ms-parent-key] {
|
||||
height: 70px;
|
||||
padding-bottom: 0 !important;
|
||||
}
|
||||
|
||||
/* Clone Controls Animation - Popup */
|
||||
.ms-host[data-ms-kind="video"][data-ms-parent-key][data-ms-animation="popup"] .ms-clone-controls {
|
||||
opacity: 0;
|
||||
transform: translateY(5px) scaleY(0.1);
|
||||
transform-origin: bottom;
|
||||
will-change: transform, opacity;
|
||||
}
|
||||
|
||||
.ms-host[data-ms-kind="video"][data-ms-parent-key][data-ms-animation="popup"]:hover .ms-clone-controls {
|
||||
opacity: 1;
|
||||
transform: translateY(0) scaleY(1);
|
||||
transition-delay: 0s;
|
||||
}
|
||||
|
||||
.ms-host[data-ms-kind="video"][data-ms-parent-key]:hover .ms-clone-controls:hover {
|
||||
opacity: 1;
|
||||
transition-delay: 0s;
|
||||
}
|
||||
|
||||
/* Clone Controls Animation - Fade */
|
||||
.ms-host[data-ms-kind="video"][data-ms-parent-key][data-ms-animation="fade"] .ms-clone-controls {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
.ms-host[data-ms-kind="video"][data-ms-parent-key][data-ms-animation="fade"]:hover .ms-clone-controls {
|
||||
opacity: 1;
|
||||
transition-delay: 0s;
|
||||
}
|
||||
|
||||
/* Fullscreen Clone Controls */
|
||||
.ms-host[data-ms-kind="video"][data-ms-parent-key]:fullscreen.ms-fs-inactive .ms-clone-controls {
|
||||
opacity: 0;
|
||||
transition-delay: 0.5s;
|
||||
}
|
||||
|
||||
.ms-host[data-ms-kind="video"][data-ms-parent-key][data-ms-animation="popup"]:fullscreen.ms-fs-inactive .ms-clone-controls {
|
||||
transform: translateY(100%);
|
||||
}
|
||||
|
||||
/* Audio Clone Controls */
|
||||
.ms-host[data-ms-kind="audio"][data-ms-parent-key] .ms-clone-controls {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.ms-clone-controls.ms-cc-compact .ms-cc-hide-compact {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* ========== Proxy Control Styles ========== */
|
||||
|
||||
.ms-proxy-ctrl {
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
pointer-events: none;
|
||||
z-index: 2147483647;
|
||||
}
|
||||
|
||||
.ms-proxy-btn {
|
||||
position: absolute;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
/* ========== Handle Styles ========== */
|
||||
|
||||
.ms-handle {
|
||||
position: absolute;
|
||||
width: 8px;
|
||||
height: 8px;
|
||||
border-radius: 2.5px;
|
||||
background: var(--interactive-accent);
|
||||
box-shadow: 0 0 0 2px rgba(0, 0, 0, .25);
|
||||
display: none;
|
||||
pointer-events: auto;
|
||||
cursor: nwse-resize;
|
||||
touch-action: none;
|
||||
}
|
||||
|
||||
.ms-handle--rb {
|
||||
right: 0px;
|
||||
bottom: 0px;
|
||||
}
|
||||
|
||||
.ms-handle--lb {
|
||||
left: 0px;
|
||||
bottom: 0px;
|
||||
}
|
||||
|
||||
.ms-handle--rt {
|
||||
right: 0px;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
.ms-handle--lt {
|
||||
left: 0px;
|
||||
top: 0px;
|
||||
}
|
||||
|
||||
.ms-handle--t {
|
||||
top: 0px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
opacity: 0 !important;
|
||||
}
|
||||
|
||||
.ms-handle--b {
|
||||
bottom: 0px;
|
||||
left: 50%;
|
||||
transform: translateX(-50%);
|
||||
opacity: 0 !important;
|
||||
}
|
||||
|
||||
.ms-handle--l {
|
||||
left: 0px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
opacity: 0 !important;
|
||||
}
|
||||
|
||||
.ms-handle--r {
|
||||
right: 0px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
opacity: 0 !important;
|
||||
}
|
||||
|
||||
/* Expanded touch areas for edge handles */
|
||||
.ms-host[data-ms-parent-key] .ms-handle--t::before,
|
||||
.ms-host[data-ms-parent-key] .ms-handle--b::before,
|
||||
.ms-host[data-ms-parent-key] .ms-handle--l::before,
|
||||
.ms-host[data-ms-parent-key] .ms-handle--r::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -20px;
|
||||
left: -20px;
|
||||
right: -20px;
|
||||
bottom: -20px;
|
||||
}
|
||||
|
||||
.ms-note-host .ms-handle--t::before,
|
||||
.ms-note-host .ms-handle--b::before,
|
||||
.ms-note-host .ms-handle--l::before,
|
||||
.ms-note-host .ms-handle--r::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
top: -5px;
|
||||
left: -5px;
|
||||
right: -5px;
|
||||
bottom: -5px;
|
||||
}
|
||||
|
||||
/* Handle Cursors */
|
||||
.ms-handle--rb,
|
||||
.ms-handle--lt {
|
||||
cursor: nwse-resize;
|
||||
}
|
||||
|
||||
.ms-handle--lb,
|
||||
.ms-handle--rt {
|
||||
cursor: nesw-resize;
|
||||
}
|
||||
|
||||
.ms-handle--t,
|
||||
.ms-handle--b,
|
||||
.ms-handle--l,
|
||||
.ms-handle--r {
|
||||
cursor: grab !important;
|
||||
}
|
||||
|
||||
.ms-handle--t::before,
|
||||
.ms-handle--b::before,
|
||||
.ms-handle--l::before,
|
||||
.ms-handle--r::before {
|
||||
cursor: inherit;
|
||||
}
|
||||
|
||||
/* Handle Visibility */
|
||||
.workspace-leaf.mod-active .markdown-source-view .ms-host:hover .ms-handle {
|
||||
display: block;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.markdown-reading-view .ms-handle {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.markdown-reading-view .ms-float-layer .ms-host {
|
||||
pointer-events: none !important;
|
||||
cursor: default !important;
|
||||
}
|
||||
|
||||
.markdown-reading-view .ms-note-host .ms-note {
|
||||
pointer-events: none !important;
|
||||
user-select: none !important;
|
||||
}
|
||||
|
||||
.markdown-reading-view .ms-overlay {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* Audio Handle Visibility */
|
||||
.ms-host[data-ms-kind="audio"][data-ms-show-handles="true"]:hover .ms-handle:not(.ms-handle--t):not(.ms-handle--b):not(.ms-handle--l):not(.ms-handle--r) {
|
||||
opacity: 1 !important;
|
||||
}
|
||||
|
||||
.ms-host[data-ms-kind="audio"] .ms-handle--t,
|
||||
.ms-host[data-ms-kind="audio"] .ms-handle--b,
|
||||
.ms-host[data-ms-kind="audio"] .ms-handle--l,
|
||||
.ms-host[data-ms-kind="audio"] .ms-handle--r {
|
||||
opacity: 0 !important;
|
||||
}
|
||||
|
||||
.ms-host[data-ms-kind="audio"][data-ms-locked="1"] .ms-handle {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
/* ========== Menu Preset Item Styles ========== */
|
||||
|
||||
.menu .menu-item.ms-preset-item {
|
||||
position: relative;
|
||||
padding-right: 54px;
|
||||
}
|
||||
|
||||
.menu .menu-item.ms-preset-item .ms-preset-del {
|
||||
position: absolute;
|
||||
right: 6px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 6px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
opacity: .6;
|
||||
pointer-events: auto;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.menu .menu-item.ms-preset-item .ms-preset-del:hover {
|
||||
opacity: 1;
|
||||
background: var(--background-modifier-hover);
|
||||
}
|
||||
|
||||
.menu .menu-item.ms-preset-item .ms-preset-del::before {
|
||||
content: "×";
|
||||
font-size: 14px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.menu .menu-item.ms-preset-item .ms-preset-edit {
|
||||
position: absolute;
|
||||
right: 30px;
|
||||
top: 50%;
|
||||
transform: translateY(-50%);
|
||||
width: 20px;
|
||||
height: 20px;
|
||||
border-radius: 6px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
opacity: .6;
|
||||
pointer-events: auto;
|
||||
cursor: pointer;
|
||||
background-repeat: no-repeat;
|
||||
background-position: center;
|
||||
background-size: 16px 16px;
|
||||
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAYAAABzenr0AAAACXBIWXMAAA7DAAAOwwHHb6hkAAAAGXRFWHRTb2Z0d2FyZQB3d3cuaW5rc2NhcGUub3Jnm+48GgAAAydJREFUWIXVl09oHFUcxz+/+bMGnajRg3iRGEpFtBdF7EHQS5KiKO1l2N23GwiBxKIn679DoV6V1J4UEoQlu/uedgX1UpHaWkEk/sP6hwoWrIrgxWqUjQZ22/l56CyI2Ozsv4JfGGbezON9Pr8H82aecAXinNujqgeBHcC3wHPGmFMA3qjh9Xr9aVV9W0QmgXVV3QmctNY+DiCjhovI8yLy/tbW1iMLCwtNa+0EcAzYDcwIQKPRiNrt9kFgBrjucgOKyJvFYvHJXuBp87UwDEtxHF8EqFQq1+dyuTPAj561dqLdbp8GngGuAs5tc/zca+XAKpBvtVq1RqPhA8zPz/8OnALuCIAXgCkgNsa8ngWQFd5sNh9aXFzccs5dFJH9rVaLRqNRjqIo2NjYuBf4Tqy1vwKfGWNmhw1fWlr6C0BVxTn3ErBfVV/1PG9MVfepaj4AblDV70cFBxARVdXHnHMiIo+qKsByqVQ66nU6DAg/kMI/CILg4X/CO1ldXQ1E5Ka0+aIx5ikYwjqQwpdT+INxHG/+u8/Kyko4Pj5+VFX3pfADnWcDCQwKH0hgGPC+BYYF70tgmPCeBfqAH9kO3pOAc64gIsvAerPZ3NMNLiKHjTFPdBs3s4CqltPL26MounM7OHAk60crk0ClUhkD7gc+ARLgHWvt3f8Fz1p5J0GWTrlc7j7galVdEZHPgRPACWvt7Obm5ul+Ku8k0wyo6gyA7/vvGmO+8DxvmnQmoig61k/lnWSaARGZBb4pFAo/WWsnkiTZISJfqeoDwLSIHM5aebVavdX3/feSJNlbLpe/7CpQq9VuBnYBZ62168A9gK+qF4APRcQVi8WXs8ABPM+bAiY9z9sJdBcQkd1c+ne8DfhBVV8RkeNhGJ6M4/iPrODLpatAkiTHfd+f833/43w+f3ZQYM8Cc3NzfwK1YYM7Gfm+4P8hoKoj3aB0E/gt3TZdqUyl5/MAnoi8BUw75/aOmlytVm8RkWeB82EYfgQga2trNwZB8Ckwma5uv4yIPwbcxaU3r2CMeQPSzWm9Xr9WRA4B08A1IxK4ICJnkiQ5VCqVvu7c/BudLKDOrJMMjwAAAABJRU5ErkJggg==);
|
||||
}
|
||||
|
||||
.menu .menu-item.ms-preset-item .ms-preset-edit:hover {
|
||||
opacity: 1;
|
||||
background-color: var(--background-modifier-hover);
|
||||
}
|
||||
|
||||
.menu .menu-item.ms-preset-item .ms-preset-del:hover {
|
||||
opacity: 1;
|
||||
background-color: var(--background-modifier-hover);
|
||||
}
|
||||
|
||||
/* ========== Note Box Styles ========== */
|
||||
|
||||
.ms-note-host {
|
||||
position: absolute;
|
||||
z-index: 3000;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.ms-note {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
background: var(--background-secondary);
|
||||
border: 1px solid var(--background-modifier-border);
|
||||
border-radius: 6px;
|
||||
box-shadow: 0 2px 8px rgba(0, 0, 0, .25);
|
||||
}
|
||||
|
||||
.ms-note-top {
|
||||
height: 24px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: flex-end;
|
||||
padding: 0 6px;
|
||||
cursor: grab;
|
||||
background: var(--background-modifier-hover);
|
||||
border-top-left-radius: 5px;
|
||||
border-top-right-radius: 5px;
|
||||
}
|
||||
|
||||
.ms-note-top:active {
|
||||
cursor: grabbing;
|
||||
}
|
||||
|
||||
.ms-note-close {
|
||||
width: 18px;
|
||||
height: 18px;
|
||||
border-radius: 4px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
cursor: pointer;
|
||||
opacity: .75;
|
||||
}
|
||||
|
||||
.ms-note-close:hover {
|
||||
opacity: 1;
|
||||
background: var(--background-modifier-hover);
|
||||
}
|
||||
|
||||
.ms-note-close::before {
|
||||
content: "×";
|
||||
font-weight: 700;
|
||||
font-size: 14px;
|
||||
line-height: 1;
|
||||
}
|
||||
|
||||
.ms-note-body {
|
||||
flex: 1;
|
||||
padding: 8px;
|
||||
overflow: auto;
|
||||
white-space: pre-wrap;
|
||||
outline: none;
|
||||
--note-stroke: 1px;
|
||||
--note-stroke-color: #000000;
|
||||
}
|
||||
|
||||
/* Transparent Note Box */
|
||||
.ms-note-host.ms-note-transparent .ms-note {
|
||||
background: transparent !important;
|
||||
border-color: transparent !important;
|
||||
box-shadow: none !important;
|
||||
}
|
||||
|
||||
.ms-note-host.ms-note-transparent .ms-note-top {
|
||||
background: transparent !important;
|
||||
}
|
||||
|
||||
.ms-note-host.ms-note-transparent .ms-note-close {
|
||||
opacity: 0;
|
||||
transition: opacity 0.2s ease-out;
|
||||
}
|
||||
|
||||
.ms-note-host.ms-note-transparent:hover .ms-note {
|
||||
border-color: var(--background-modifier-border) !important;
|
||||
}
|
||||
|
||||
.ms-note-host.ms-note-transparent:hover .ms-note-close {
|
||||
opacity: 0.75;
|
||||
}
|
||||
|
||||
/* Text Stroke */
|
||||
.ms-note-body.ms-note-text-stroked {
|
||||
filter: drop-shadow(calc(-1 * var(--note-stroke) * .7071) calc(var(--note-stroke) * .7071) 0 var(--note-stroke-color)) drop-shadow(calc(var(--note-stroke) * .7071) calc(-1 * var(--note-stroke) * .7071) 0 var(--note-stroke-color)) drop-shadow(var(--note-stroke) 0 0 var(--note-stroke-color)) drop-shadow(0 var(--note-stroke) 0 var(--note-stroke-color));
|
||||
}
|
||||
|
||||
.workspace-leaf.mod-active .markdown-source-view .ms-note-host:hover .ms-handle {
|
||||
display: block;
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.ms-note-host .ms-overlay {
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
.ms-note-host .ms-handle {
|
||||
opacity: 0 !important;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
/* ========== Custom Control Button Styles (for Clone Controls) ========== */
|
||||
.ms-cc-btn {
|
||||
background: rgba(255, 255, 255, .15);
|
||||
}
|
||||
|
||||
.ms-cc-btn:hover {
|
||||
background: rgba(255, 255, 255, .25);
|
||||
}
|
||||
|
||||
/* ========== Video Wrapper for Clones ========== */
|
||||
.ms-video-wrapper {
|
||||
position: relative;
|
||||
z-index: 2;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
/* ========== Clone Controls Positioning ========== */
|
||||
.ms-clone-controls-bottom-70 {
|
||||
position: absolute;
|
||||
top: auto;
|
||||
bottom: 0;
|
||||
height: 70px;
|
||||
}
|
||||
|
||||
/* ========== Flex & Alignment Utility Classes ========== */
|
||||
.ms-flex {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.ms-flex-align-center {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.ms-flex-column {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
}
|
||||
|
||||
.ms-margin-left-auto {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.ms-margin-right-15 {
|
||||
margin-right: 15px;
|
||||
}
|
||||
|
||||
.ms-margin-right-8 {
|
||||
margin-right: 8px;
|
||||
}
|
||||
|
||||
.ms-margin-right-10 {
|
||||
margin-right: 10px;
|
||||
}
|
||||
|
||||
.ms-margin-left-0 {
|
||||
margin-left: 0px;
|
||||
}
|
||||
|
||||
/* ========== Clone Controls Center Group ========== */
|
||||
.ms-cc-center-group {
|
||||
flex: 1 1 auto;
|
||||
min-width: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
pointer-events: none;
|
||||
}
|
||||
|
||||
/* ========== Clone Controls Time Label ========== */
|
||||
.ms-cc-time-label {
|
||||
color: rgba(255, 255, 255, .7);
|
||||
font-size: 12px;
|
||||
white-space: nowrap;
|
||||
padding-right: 8px;
|
||||
}
|
||||
32
versions.json
Normal file
32
versions.json
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
{
|
||||
"1.0.0": "1.5.0",
|
||||
"1.1.0": "1.5.0",
|
||||
"1.2.0": "1.5.0",
|
||||
"2.0.0": "1.5.0",
|
||||
"2.1.0": "1.5.0",
|
||||
"2.2.0": "1.5.0",
|
||||
"2.3.0": "1.5.0",
|
||||
"2.4.0": "1.5.0",
|
||||
"2.5.0": "1.5.0",
|
||||
"3.0.0": "1.5.0",
|
||||
"3.1.0": "1.5.0",
|
||||
"3.2.0": "1.5.0",
|
||||
"3.3.0": "1.5.0",
|
||||
"3.4.0": "1.5.0",
|
||||
"3.5.0": "1.5.0",
|
||||
"4.0.0": "1.5.0",
|
||||
"4.1.0": "1.5.0",
|
||||
"4.2.0": "1.5.0",
|
||||
"4.3.0": "1.5.0",
|
||||
"4.4.0": "1.5.0",
|
||||
"4.5.0": "1.5.0",
|
||||
"5.0.0": "1.5.0",
|
||||
"5.1.0": "1.5.0",
|
||||
"5.2.0": "1.5.0",
|
||||
"5.3.0": "1.5.0",
|
||||
"5.4.0": "1.5.0",
|
||||
"5.5.0": "1.5.0",
|
||||
"5.6.0": "1.5.0",
|
||||
"5.6.1": "1.5.0"
|
||||
}
|
||||
|
||||
Loading…
Reference in a new issue