first commit
This commit is contained in:
1243
media/com_media/css/media-manager.css
Normal file
1243
media/com_media/css/media-manager.css
Normal file
File diff suppressed because it is too large
Load Diff
1
media/com_media/css/media-manager.min.css
vendored
Normal file
1
media/com_media/css/media-manager.min.css
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
media/com_media/css/media-manager.min.css.gz
Normal file
BIN
media/com_media/css/media-manager.min.css.gz
Normal file
Binary file not shown.
40
media/com_media/joomla.asset.json
Normal file
40
media/com_media/joomla.asset.json
Normal file
@ -0,0 +1,40 @@
|
||||
{
|
||||
"$schema": "https://developer.joomla.org/schemas/json-schema/web_assets.json",
|
||||
"name": "com_media",
|
||||
"version": "4.0.0",
|
||||
"description": "Joomla CMS",
|
||||
"license": "GPL-2.0-or-later",
|
||||
"assets": [
|
||||
{
|
||||
"name": "com_media.edit-images",
|
||||
"type": "script",
|
||||
"uri": "com_media/edit-images.min.js",
|
||||
"dependencies": [
|
||||
"core"
|
||||
],
|
||||
"attributes": {
|
||||
"type": "module"
|
||||
},
|
||||
"version": "e17b83"
|
||||
},
|
||||
{
|
||||
"name": "com_media.mediamanager",
|
||||
"type": "style",
|
||||
"uri": "com_media/media-manager.min.css",
|
||||
"version": "1c8c8f"
|
||||
},
|
||||
{
|
||||
"name": "com_media.mediamanager",
|
||||
"type": "script",
|
||||
"uri": "com_media/media-manager.min.js",
|
||||
"dependencies": [
|
||||
"core",
|
||||
"messages"
|
||||
],
|
||||
"attributes": {
|
||||
"type": "module"
|
||||
},
|
||||
"version": "faed8e"
|
||||
}
|
||||
]
|
||||
}
|
||||
298
media/com_media/js/edit-images.js
Normal file
298
media/com_media/js/edit-images.js
Normal file
@ -0,0 +1,298 @@
|
||||
/**
|
||||
* @copyright (C) 2018 Open Source Matters, Inc. <https://www.joomla.org>
|
||||
* @license GNU General Public License version 2 or later; see LICENSE.txt
|
||||
*/
|
||||
if (!Joomla) {
|
||||
throw new Error('Joomla API is not properly initialized');
|
||||
}
|
||||
Joomla.MediaManager = Joomla.MediaManager || {};
|
||||
class Edit {
|
||||
constructor() {
|
||||
// Get the options from Joomla.optionStorage
|
||||
this.options = Joomla.getOptions('com_media', {});
|
||||
if (!this.options) {
|
||||
throw new Error('Initialization error "edit-images.js"');
|
||||
}
|
||||
this.extension = this.options.uploadPath.split('.').pop();
|
||||
this.fileType = ['jpeg', 'jpg'].includes(this.extension) ? 'jpeg' : this.extension;
|
||||
this.options.currentUrl = new URL(window.location.href);
|
||||
|
||||
// Initiate the registry
|
||||
this.original = {
|
||||
filename: this.options.uploadPath.split('/').pop(),
|
||||
extension: this.extension,
|
||||
contents: `data:image/${this.fileType};base64,${this.options.contents}`
|
||||
};
|
||||
// eslint-disable-next-line no-promise-executor-return
|
||||
this.previousPluginDeactivated = new Promise(resolve => resolve);
|
||||
this.history = {};
|
||||
this.current = this.original;
|
||||
this.plugins = {};
|
||||
this.baseContainer = document.getElementById('media-manager-edit-container');
|
||||
if (!this.baseContainer) {
|
||||
throw new Error('The image preview container is missing');
|
||||
}
|
||||
this.createImageContainer(this.original);
|
||||
Joomla.MediaManager.Edit = this;
|
||||
window.dispatchEvent(new CustomEvent('media-manager-edit-init'));
|
||||
|
||||
// Once the DOM is ready, initialize everything
|
||||
customElements.whenDefined('joomla-tab').then(async () => {
|
||||
const tabContainer = document.getElementById('myTab');
|
||||
const tabsUlElement = tabContainer.firstElementChild;
|
||||
const links = [].slice.call(tabsUlElement.querySelectorAll('button[aria-controls]'));
|
||||
|
||||
// Couple the tabs with the plugin objects
|
||||
links.forEach((link, index) => {
|
||||
const tab = document.getElementById(link.getAttribute('aria-controls'));
|
||||
if (index === 0) {
|
||||
tab.insertAdjacentElement('beforeend', this.baseContainer);
|
||||
}
|
||||
link.addEventListener('joomla.tab.hidden', ({
|
||||
target
|
||||
}) => {
|
||||
if (!target) {
|
||||
// eslint-disable-next-line no-promise-executor-return
|
||||
this.previousPluginDeactivated = new Promise(resolve => resolve);
|
||||
return;
|
||||
}
|
||||
this.previousPluginDeactivated = new Promise((resolve, reject) => {
|
||||
this.plugins[target.getAttribute('aria-controls').replace('attrib-', '')].Deactivate(this.imagePreview).then(resolve).catch(e => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(e);
|
||||
reject();
|
||||
});
|
||||
});
|
||||
});
|
||||
link.addEventListener('joomla.tab.shown', ({
|
||||
target
|
||||
}) => {
|
||||
// Move the image container to the correct tab
|
||||
tab.insertAdjacentElement('beforeend', this.baseContainer);
|
||||
this.previousPluginDeactivated.then(() => this.plugins[target.getAttribute('aria-controls').replace('attrib-', '')].Activate(this.imagePreview)).catch(e => {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(e);
|
||||
});
|
||||
});
|
||||
});
|
||||
tabContainer.activateTab(0, false);
|
||||
});
|
||||
this.addHistoryPoint = this.addHistoryPoint.bind(this);
|
||||
this.createImageContainer = this.createImageContainer.bind(this);
|
||||
this.Reset = this.Reset.bind(this);
|
||||
this.Undo = this.Undo.bind(this);
|
||||
this.Redo = this.Redo.bind(this);
|
||||
this.createProgressBar = this.createProgressBar.bind(this);
|
||||
this.updateProgressBar = this.updateProgressBar.bind(this);
|
||||
this.removeProgressBar = this.removeProgressBar.bind(this);
|
||||
this.upload = this.upload.bind(this);
|
||||
|
||||
// Create history entry
|
||||
window.addEventListener('mediaManager.history.point', this.addHistoryPoint.bind(this));
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates a history snapshot
|
||||
* PRIVATE
|
||||
*/
|
||||
addHistoryPoint() {
|
||||
if (this.original !== this.current) {
|
||||
const key = Object.keys(this.history).length;
|
||||
if (this.history[key] && this.history[key - 1] && this.history[key] === this.history[key - 1]) {
|
||||
return;
|
||||
}
|
||||
this.history[key + 1] = this.current;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Creates the images for edit and preview
|
||||
* PRIVATE
|
||||
*/
|
||||
createImageContainer(data) {
|
||||
if (!data.contents) {
|
||||
throw new Error('Initialization error "edit-images.js"');
|
||||
}
|
||||
this.imagePreview = document.createElement('img');
|
||||
this.imagePreview.src = data.contents;
|
||||
this.imagePreview.id = 'image-preview';
|
||||
this.imagePreview.style.height = 'auto';
|
||||
this.imagePreview.style.maxWidth = '100%';
|
||||
this.baseContainer.appendChild(this.imagePreview);
|
||||
}
|
||||
|
||||
// Reset the image to the initial state
|
||||
Reset( /* current */
|
||||
) {
|
||||
this.current.contents = `data:image/${this.fileType};base64,${this.options.contents}`;
|
||||
this.imagePreview.setAttribute('src', this.current.contents);
|
||||
requestAnimationFrame(() => {
|
||||
requestAnimationFrame(() => {
|
||||
this.imagePreview.setAttribute('width', this.imagePreview.naturalWidth);
|
||||
this.imagePreview.setAttribute('height', this.imagePreview.naturalHeight);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// @TODO History
|
||||
// eslint-disable-next-line class-methods-use-this
|
||||
Undo() {}
|
||||
|
||||
// @TODO History
|
||||
// eslint-disable-next-line class-methods-use-this
|
||||
Redo() {}
|
||||
|
||||
// @TODO Create the progress bar
|
||||
// eslint-disable-next-line class-methods-use-this
|
||||
createProgressBar() {}
|
||||
|
||||
// @TODO Update the progress bar
|
||||
// eslint-disable-next-line class-methods-use-this
|
||||
updateProgressBar( /* position */) {}
|
||||
|
||||
// @TODO Remove the progress bar
|
||||
// eslint-disable-next-line class-methods-use-this
|
||||
removeProgressBar() {}
|
||||
|
||||
/**
|
||||
* Uploads
|
||||
* Public
|
||||
*/
|
||||
upload(url, stateChangeCallback) {
|
||||
let format = Joomla.MediaManager.Edit.original.extension === 'jpg' ? 'jpeg' : Joomla.MediaManager.Edit.original.extension;
|
||||
if (!format) {
|
||||
// eslint-disable-next-line prefer-destructuring
|
||||
format = /data:image\/(.+);/gm.exec(Joomla.MediaManager.Edit.original.contents)[1];
|
||||
}
|
||||
if (!format) {
|
||||
throw new Error('Unable to determine image format');
|
||||
}
|
||||
this.xhr = new XMLHttpRequest();
|
||||
if (typeof stateChangeCallback === 'function') {
|
||||
this.xhr.onreadystatechange = stateChangeCallback;
|
||||
}
|
||||
this.xhr.upload.onprogress = e => {
|
||||
this.updateProgressBar(e.loaded / e.total * 100);
|
||||
};
|
||||
this.xhr.onload = () => {
|
||||
let resp;
|
||||
try {
|
||||
resp = JSON.parse(this.xhr.responseText);
|
||||
} catch (er) {
|
||||
resp = null;
|
||||
}
|
||||
if (resp) {
|
||||
if (this.xhr.status === 200) {
|
||||
if (resp.success === true) {
|
||||
this.removeProgressBar();
|
||||
}
|
||||
if (resp.status === '1') {
|
||||
Joomla.renderMessages({
|
||||
success: [resp.message]
|
||||
}, 'true');
|
||||
this.removeProgressBar();
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this.removeProgressBar();
|
||||
}
|
||||
this.xhr = null;
|
||||
};
|
||||
this.xhr.onerror = () => {
|
||||
this.removeProgressBar();
|
||||
this.xhr = null;
|
||||
};
|
||||
this.xhr.open('PUT', url, true);
|
||||
this.xhr.setRequestHeader('Content-Type', 'application/json');
|
||||
this.createProgressBar();
|
||||
this.xhr.send(JSON.stringify({
|
||||
name: Joomla.MediaManager.Edit.options.uploadPath.split('/').pop(),
|
||||
content: Joomla.MediaManager.Edit.current.contents.replace(`data:image/${format};base64,`, ''),
|
||||
[Joomla.MediaManager.Edit.options.csrfToken]: 1
|
||||
}));
|
||||
}
|
||||
}
|
||||
|
||||
// Initiate the Editor API
|
||||
// eslint-disable-next-line no-new
|
||||
new Edit();
|
||||
|
||||
/**
|
||||
* Compute the current URL
|
||||
*
|
||||
* @param {boolean} isModal is the URL for a modal window
|
||||
*
|
||||
* @return {{}} the URL object
|
||||
*/
|
||||
const getUrl = isModal => {
|
||||
const newUrl = Joomla.MediaManager.Edit.options.currentUrl;
|
||||
const params = new URLSearchParams(newUrl.search);
|
||||
params.set('view', 'media');
|
||||
params.delete('path');
|
||||
params.delete('mediatypes');
|
||||
const {
|
||||
uploadPath
|
||||
} = Joomla.MediaManager.Edit.options;
|
||||
let fileDirectory = uploadPath.split('/');
|
||||
fileDirectory.pop();
|
||||
fileDirectory = fileDirectory.join('/');
|
||||
|
||||
// If we are in root add a backslash
|
||||
if (fileDirectory.endsWith(':')) {
|
||||
fileDirectory = `${fileDirectory}/`;
|
||||
}
|
||||
params.set('path', fileDirectory);
|
||||
|
||||
// Respect the images_only URI param
|
||||
const mediaTypes = document.querySelector('input[name="mediatypes"]');
|
||||
params.set('mediatypes', mediaTypes && mediaTypes.value ? mediaTypes.value : '0');
|
||||
if (isModal) {
|
||||
params.set('tmpl', 'component');
|
||||
}
|
||||
newUrl.search = params;
|
||||
return newUrl;
|
||||
};
|
||||
|
||||
// Customize the Toolbar buttons behavior
|
||||
Joomla.submitbutton = task => {
|
||||
const url = new URL(`${Joomla.MediaManager.Edit.options.apiBaseUrl}&task=api.files&path=${Joomla.MediaManager.Edit.options.uploadPath}`);
|
||||
switch (task) {
|
||||
case 'apply':
|
||||
Joomla.MediaManager.Edit.upload(url, null);
|
||||
Joomla.MediaManager.Edit.imagePreview.src = Joomla.MediaManager.Edit.current.contents;
|
||||
Joomla.MediaManager.Edit.original = Joomla.MediaManager.Edit.current;
|
||||
Joomla.MediaManager.Edit.history = {};
|
||||
(async () => {
|
||||
const activeTab = [].slice.call(document.querySelectorAll('joomla-tab-element')).filter(tab => tab.hasAttribute('active'));
|
||||
try {
|
||||
await Joomla.MediaManager.Edit.plugins[activeTab[0].id.replace('attrib-', '')].Deactivate(Joomla.MediaManager.Edit.imagePreview);
|
||||
await Joomla.MediaManager.Edit.plugins[activeTab[0].id.replace('attrib-', '')].Activate(Joomla.MediaManager.Edit.imagePreview);
|
||||
} catch (e) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.log(e);
|
||||
}
|
||||
})();
|
||||
break;
|
||||
case 'save':
|
||||
Joomla.MediaManager.Edit.upload(url, () => {
|
||||
if (Joomla.MediaManager.Edit.xhr.readyState === XMLHttpRequest.DONE) {
|
||||
if (window.self !== window.top) {
|
||||
window.location = getUrl(true);
|
||||
} else {
|
||||
window.location = getUrl();
|
||||
}
|
||||
}
|
||||
});
|
||||
break;
|
||||
case 'cancel':
|
||||
if (window.self !== window.top) {
|
||||
window.location = getUrl(true);
|
||||
} else {
|
||||
window.location = getUrl();
|
||||
}
|
||||
break;
|
||||
case 'reset':
|
||||
Joomla.MediaManager.Edit.Reset('initial');
|
||||
break;
|
||||
}
|
||||
};
|
||||
1
media/com_media/js/edit-images.min.js
vendored
Normal file
1
media/com_media/js/edit-images.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
media/com_media/js/edit-images.min.js.gz
Normal file
BIN
media/com_media/js/edit-images.min.js.gz
Normal file
Binary file not shown.
14012
media/com_media/js/media-manager.js
Normal file
14012
media/com_media/js/media-manager.js
Normal file
File diff suppressed because it is too large
Load Diff
1
media/com_media/js/media-manager.min.js
vendored
Normal file
1
media/com_media/js/media-manager.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
BIN
media/com_media/js/media-manager.min.js.gz
Normal file
BIN
media/com_media/js/media-manager.min.js.gz
Normal file
Binary file not shown.
95
media/com_media/scss/_variables.scss
Normal file
95
media/com_media/scss/_variables.scss
Normal file
@ -0,0 +1,95 @@
|
||||
// Defaults
|
||||
$gutter-width: 15px;
|
||||
$highlight-color: #2a69b8;
|
||||
$border-color: var(--template-bg-dark-7);
|
||||
$border-radius: .25rem;
|
||||
$box-shadow-color: var(--template-bg-dark-50);
|
||||
$container-bg: var(--com-media-manager-content-bg, #fff);
|
||||
|
||||
// Layout
|
||||
$col-main-panel-width: 83.3333%;
|
||||
$col-side-panel-width: 16.6667%;
|
||||
$col-gutter-width: $gutter-width;
|
||||
$col-box-shadow: 0 2px 10px -8px $box-shadow-color;
|
||||
|
||||
// Sidebar
|
||||
$sidebar-drive-bg: var(--com-media-manager-content-bg, #fff);
|
||||
$sidebar-tree-line-color: $border-color;
|
||||
$sidebar-tree-icon-color: var(--template-bg-dark-60);
|
||||
$sidebar-tree-line-height: 26px;
|
||||
$sidebar-tree-folder-icon: "\f07b";
|
||||
$sidebar-tree-item-hover-bg: #e1e1e1;
|
||||
$sidebar-active-icon-color: $highlight-color;
|
||||
$sidebar-disk-name-color: var(--com-media-manager-disk-name-color, var(--template-bg-dark));
|
||||
|
||||
// Toolbar
|
||||
$toolbar-height: 46px;
|
||||
$toolbar-bg: var(--com-media-manager-content-bg, #fff);
|
||||
$toolbar-icon-width: 50px;
|
||||
$toolbar-icon-color: var(--template-bg-dark-60);
|
||||
$toolbar-icon-bg-hover: #f0f0f0;
|
||||
$toolbar-loader-color: linear-gradient(to right, #59afff 0, #59daff 100%);
|
||||
$toolbar-loader-height: 2px;
|
||||
$toolbar-icon-active-bg-color: var(--template-bg-dark-60);
|
||||
$toolbar-icon-active-bg-color-hover: var(--template-bg-dark-80);
|
||||
|
||||
// Breadcrumbs
|
||||
$breadcrumbs-bg: var(--com-media-manager-overlay-bg, var(--template-bg-dark-3));
|
||||
$breadcrumbs-current-bg: var(--com-media-manager-content-bg, #fff);
|
||||
|
||||
// Media Browser
|
||||
$browser-background-color: var(--com-media-manager-overlay-bg, var(--template-bg-dark-3));
|
||||
|
||||
// Media Browser Grid
|
||||
$grid-gutter-width: $col-gutter-width;
|
||||
$grid-outside-padding: $col-gutter-width;
|
||||
$grid-item-hover-color: rgba(#000, .5);
|
||||
$grid-item-border-radius: $border-radius;
|
||||
$grid-item-icon-size: 1.3rem;
|
||||
$grid-item-icon-color: #fff;
|
||||
$grid-item-icon-bg-color: rgba(0,0,0,.8);
|
||||
$grid-item-icon-color-hover: rgba(0,0,0,.8);
|
||||
$grid-item-icon-bg-color-hover: var(--template-bg-dark-10);
|
||||
$grid-item-icon-warning-icon-bg: #d9534f;
|
||||
$grid-item-no-preview-bg: #f5f5f5;
|
||||
$grid-item-width-sm: 13%;
|
||||
$grid-item-width-md: 18%;
|
||||
$grid-item-width-lg: 26%;
|
||||
$grid-item-width-xl: 40%;
|
||||
|
||||
// Media Browser Table
|
||||
$table-item-height: 30px;
|
||||
$table-item-icon-size: 1.2rem;
|
||||
$table-item-icon-color: #656565;
|
||||
$table-item-icon-bg: rgba(0, 0, 0, .015);
|
||||
$table-item-icon-color-selected: #fff;
|
||||
$table-item-icon-bg-selected: #006898;
|
||||
$table-item-bg-hover: rgba(0, 0, 0, .03);
|
||||
|
||||
// Media Info bar
|
||||
$info-bg: var(--com-media-manager-overlay-bg, var(--template-bg-dark-3));
|
||||
$info-title-bg: var(--com-media-manager-overlay-header-bg, var(--template-bg-dark-5));
|
||||
$info-dt-width: 33.33333%;
|
||||
$info-dt-color: var(--com-media-manager-infobar-dt-color, rgba(0, 0, 0, .54));
|
||||
$info-dd-width: 66.66667%;
|
||||
$info-close-color: var(--template-bg-dark-60);
|
||||
$info-close-color-hover: var(--template-bg-dark-40);
|
||||
|
||||
// Table Icon Mapping
|
||||
$icon-type-default: "\f016";
|
||||
$icon-type-folder: "\f07b";
|
||||
$icon-type-images: "\f1c5";
|
||||
$icon-type-video: "\f1c8";
|
||||
$icon-type-audio: "\f1c7";
|
||||
$icon-type-docs: "\f1c1";
|
||||
$icon-type-code: "\f1c9";
|
||||
|
||||
// Drag n Drop Upload
|
||||
$dnd-bg: rgba(245, 245, 245, .8);
|
||||
$dnd-icon-color: #1c3d5c;
|
||||
$dnd-border: 3px dashed #999;
|
||||
|
||||
// Modal
|
||||
$modal-backdrop-color: rgba(0, 0, 0, .7);
|
||||
$modal-box-shadow: 0 0 10px rgba(0, 0, 0, .5);
|
||||
$modal-preview-text-color: #fff;
|
||||
73
media/com_media/scss/components/_animations.scss
Normal file
73
media/com_media/scss/components/_animations.scss
Normal file
@ -0,0 +1,73 @@
|
||||
// Animations
|
||||
|
||||
// slide-fade
|
||||
.slide-fade-enter-active {
|
||||
transition: all .3s cubic-bezier(.4, 0, .2, 1);
|
||||
}
|
||||
|
||||
.slide-fade-leave-active {
|
||||
transition: all .2s cubic-bezier(.4, 0, .2, 1);
|
||||
}
|
||||
|
||||
.slide-fade-enter, .slide-fade-leave-to {
|
||||
opacity: 0;
|
||||
transform: translateY(-10px);
|
||||
}
|
||||
|
||||
// Infobar
|
||||
.infobar-enter-active {
|
||||
animation: slideOutRight .2s reverse;
|
||||
}
|
||||
|
||||
.infobar-leave-active {
|
||||
animation: slideOutRight .2s;
|
||||
}
|
||||
|
||||
html[dir=rtl] .infobar-enter-active {
|
||||
animation: slideOutLeft .2s reverse;
|
||||
}
|
||||
|
||||
html[dir=rtl] .infobar-leave-active {
|
||||
animation: slideOutLeft .2s;
|
||||
}
|
||||
|
||||
// Slide out right animation
|
||||
@keyframes slideOutRight {
|
||||
from {
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
|
||||
to {
|
||||
visibility: hidden;
|
||||
transform: translate3d(100%, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes slideOutLeft {
|
||||
from {
|
||||
transform: translateX(0);
|
||||
}
|
||||
|
||||
to {
|
||||
visibility: hidden;
|
||||
transform: translate3d(-100%, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
// Bounce in animation
|
||||
.fade-in-enter-active {
|
||||
animation: fadeIn .2s;
|
||||
}
|
||||
|
||||
.fade-in-leave-active {
|
||||
animation: fadeIn .2s reverse;
|
||||
}
|
||||
|
||||
@keyframes fadeIn {
|
||||
from {
|
||||
opacity: 0;
|
||||
}
|
||||
to {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
50
media/com_media/scss/components/_layout.scss
Normal file
50
media/com_media/scss/components/_layout.scss
Normal file
@ -0,0 +1,50 @@
|
||||
// General layout
|
||||
.media-container {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin-top: 1rem;
|
||||
background-color: $container-bg;
|
||||
border-radius: $border-radius;
|
||||
box-shadow: $col-box-shadow;
|
||||
|
||||
.contentpane & {
|
||||
margin: 0 -20px;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
.media-col-main-panel {
|
||||
flex: 0 0 $col-main-panel-width;
|
||||
max-width: $col-main-panel-width;
|
||||
}
|
||||
|
||||
.media-col-side-panel {
|
||||
flex: 0 0 $col-side-panel-width;
|
||||
max-width: $col-side-panel-width;
|
||||
}
|
||||
|
||||
[class^="media-col"], [class*=" media-col"] {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
min-height: 1px;
|
||||
padding-right: $col-gutter-width * .5;
|
||||
padding-left: $col-gutter-width * .5;
|
||||
}
|
||||
|
||||
@media (min-width: var(--breakpoint-md)) {
|
||||
[class^="media-col"], [class*=" media-col"] {
|
||||
flex: 0 0 100%;
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.media-main {
|
||||
position: relative;
|
||||
flex: 1 1 600px;
|
||||
min-height: 75vh;
|
||||
}
|
||||
|
||||
.media-sidebar {
|
||||
flex: 0 0 280px;
|
||||
padding: 1rem;
|
||||
}
|
||||
63
media/com_media/scss/components/_media-breadcrumb.scss
Normal file
63
media/com_media/scss/components/_media-breadcrumb.scss
Normal file
@ -0,0 +1,63 @@
|
||||
.media-breadcrumb {
|
||||
display: flex;
|
||||
padding: 0;
|
||||
margin-inline-end: auto;
|
||||
font-size: .9rem;
|
||||
line-height: $toolbar-height;
|
||||
background: transparent;
|
||||
border-inline-start: 1px solid $border-color;
|
||||
|
||||
ol {
|
||||
display: flex;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
list-style: outside none none;
|
||||
|
||||
> li > a {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.media-breadcrumb-item {
|
||||
padding-inline-end: 8px;
|
||||
padding-inline-start: 22px;
|
||||
background-color: $breadcrumbs-bg;
|
||||
&:first-of-type {
|
||||
padding-inline-start: 16px;
|
||||
}
|
||||
&:last-of-type {
|
||||
background-color: $breadcrumbs-current-bg;
|
||||
&::after {
|
||||
border-inline-start-color: $breadcrumbs-current-bg;
|
||||
}
|
||||
}
|
||||
&:hover {
|
||||
color: $highlight-color;
|
||||
}
|
||||
}
|
||||
|
||||
.media-breadcrumb-item {
|
||||
position: relative;
|
||||
&::before, &::after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
inset-inline-start: 100%;
|
||||
z-index: 2;
|
||||
display: block;
|
||||
width: 0;
|
||||
height: 0;
|
||||
margin: auto;
|
||||
content: "" !important;
|
||||
border-top: 23px solid transparent;
|
||||
border-bottom: 23px solid transparent;
|
||||
border-inline-start: 10px solid transparent;
|
||||
}
|
||||
&::before {
|
||||
border-inline-start-color: $border-color;
|
||||
}
|
||||
&::after {
|
||||
border-inline-start-color: $breadcrumbs-bg;
|
||||
}
|
||||
}
|
||||
456
media/com_media/scss/components/_media-browser.scss
Normal file
456
media/com_media/scss/components/_media-browser.scss
Normal file
@ -0,0 +1,456 @@
|
||||
// Media browser
|
||||
.media-browser {
|
||||
position: relative;
|
||||
min-height: 70vh;
|
||||
transition: width .3s cubic-bezier(.4, 0, .2, 1);
|
||||
}
|
||||
|
||||
// Grid View
|
||||
.media-browser-grid {
|
||||
padding: $grid-outside-padding;
|
||||
}
|
||||
|
||||
.media-browser-items {
|
||||
display: grid;
|
||||
gap: $grid-gutter-width;
|
||||
&.media-browser-items-sm {
|
||||
grid-template-columns: repeat(auto-fill, minmax($grid-item-width-sm, 1fr));
|
||||
}
|
||||
&.media-browser-items-md {
|
||||
grid-template-columns: repeat(auto-fill, minmax($grid-item-width-md, 1fr));
|
||||
}
|
||||
&.media-browser-items-lg {
|
||||
grid-template-columns: repeat(auto-fill, minmax($grid-item-width-lg, 1fr));
|
||||
}
|
||||
&.media-browser-items-xl {
|
||||
grid-template-columns: repeat(auto-fill, minmax($grid-item-width-xl, 1fr));
|
||||
}
|
||||
}
|
||||
|
||||
.media-browser-item {
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.media-browser-item-preview {
|
||||
position: relative;
|
||||
font-size: 60px;
|
||||
color: #007eb7;
|
||||
border: 1px solid hsl(var(--hue),35%,95%);
|
||||
border-radius: $grid-item-border-radius;
|
||||
&::after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
content: "";
|
||||
background-color: $grid-item-hover-color;
|
||||
border-radius: $grid-item-border-radius;
|
||||
opacity: 0;
|
||||
transition: opacity .2s cubic-bezier(.4, 0, .2, 1);
|
||||
.media-browser-item.active &, .selected & {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.media-browser-item-info {
|
||||
padding: 0 2px;
|
||||
overflow: hidden;
|
||||
font-size: .9rem;
|
||||
line-height: 28px;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.media-browser-select {
|
||||
position: absolute;
|
||||
top: 6px;
|
||||
left: 6px;
|
||||
width: calc(#{$grid-item-icon-size} * 1.54);
|
||||
height: calc(#{$grid-item-icon-size} * 1.54);
|
||||
content: "";
|
||||
background-color: $grid-item-icon-bg-color;
|
||||
border: 2px solid $grid-item-icon-bg-color-hover;
|
||||
border-radius: $grid-item-border-radius;
|
||||
box-shadow: inset 0 0 0 0 $grid-item-icon-color;
|
||||
opacity: 0;
|
||||
transition: all .3s cubic-bezier(.4, 0, .2, 1);
|
||||
.media-browser-item.active & {
|
||||
opacity: 1;
|
||||
}
|
||||
&::after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: calc(#{$grid-item-icon-size} * 1.3);
|
||||
height: calc(#{$grid-item-icon-size} * 1.3);
|
||||
font-family: "Font Awesome 6 Free";
|
||||
font-size: $grid-item-icon-size;
|
||||
font-weight: 900;
|
||||
line-height: calc(#{$grid-item-icon-size} * 1.3);
|
||||
text-align: center;
|
||||
content: "\f00c";
|
||||
opacity: 0;
|
||||
transition: all .3s cubic-bezier(.4, 0, .2, 1);
|
||||
transform: scale(.5);
|
||||
.selected & {
|
||||
opacity: 1;
|
||||
transform: scale(1);
|
||||
}
|
||||
}
|
||||
.selected & {
|
||||
color: $grid-item-icon-color-hover;
|
||||
background-color: $grid-item-icon-bg-color-hover;
|
||||
box-shadow: inset 0 0 0 15px $grid-item-icon-bg-color-hover;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
.media-browser-actions {
|
||||
position: absolute;
|
||||
top: 4px;
|
||||
right: 0;
|
||||
padding: 2px;
|
||||
overflow: hidden;
|
||||
> button {
|
||||
opacity: 0;
|
||||
.media-browser-item.active & {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
&.active {
|
||||
top: 0;
|
||||
z-index: 1;
|
||||
width: max-content;
|
||||
min-width: 100%;
|
||||
background-color: $browser-background-color;
|
||||
border: 1px solid hsl(var(--hue), 35%, 95%);
|
||||
border-radius: .25rem;
|
||||
box-shadow: 0 2px 10px -8px $box-shadow-color;
|
||||
> button {
|
||||
display: none;
|
||||
}
|
||||
@media (max-width: 576px) {
|
||||
.actions & {
|
||||
height: 100%;
|
||||
overflow: visible;
|
||||
.media-browser-actions-list {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
overflow: auto;
|
||||
background-color: $browser-background-color;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.media-browser-actions-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
margin-top: 2px;
|
||||
.media-browser-actions-item-name {
|
||||
padding: 2px;
|
||||
margin-block-end: 3px;
|
||||
}
|
||||
button, a {
|
||||
position: relative;
|
||||
top: 0;
|
||||
padding: 2px;
|
||||
margin-block-end: 3px;
|
||||
visibility: hidden;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
opacity: 0;
|
||||
transition: all 0s ease;
|
||||
transition-delay: 0s;
|
||||
.media-browser-actions.active & {
|
||||
top: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
width: 100%;
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
transition-duration: .2s;
|
||||
&:hover, &:focus {
|
||||
color: $grid-item-icon-color-hover;
|
||||
background-color: $grid-item-icon-bg-color-hover;
|
||||
&.action-delete {
|
||||
color: $grid-item-icon-color;
|
||||
background-color: $grid-item-icon-warning-icon-bg;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.image-browser-action {
|
||||
width: calc(#{$grid-item-icon-size} * 1.55);
|
||||
height: calc(#{$grid-item-icon-size} * 1.55);
|
||||
margin-inline: 4px;
|
||||
color: $grid-item-icon-color;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
background-color: $grid-item-icon-bg-color;
|
||||
border-radius: $grid-item-border-radius;
|
||||
flex-shrink: 0;
|
||||
transition-duration: .2s;
|
||||
.action-delete & {
|
||||
background-color: $grid-item-icon-warning-icon-bg;
|
||||
}
|
||||
&::before {
|
||||
font-size: $grid-item-icon-size;
|
||||
line-height: calc(#{$grid-item-icon-size} * 1.55);
|
||||
}
|
||||
&:hover, &:focus,
|
||||
button:hover &,
|
||||
button:focus & {
|
||||
color: $grid-item-icon-color-hover;
|
||||
background-color: $grid-item-icon-bg-color-hover;
|
||||
}
|
||||
}
|
||||
.action-text {
|
||||
flex-shrink: 0;
|
||||
text-align: start;
|
||||
padding-inline: 5px;
|
||||
}
|
||||
|
||||
.image-background {
|
||||
background-color: #fff;
|
||||
background-image: linear-gradient(45deg, hsl(var(--hue), 20%, 97%) 25%, transparent 25%, transparent 75%, #eee 75%, hsl(var(--hue), 20%, 97%) 100%), linear-gradient(45deg, #eee 25%, transparent 25%, transparent 75%, hsl(var(--hue), 20%, 97%) 75%, hsl(var(--hue), 20%, 97%) 100%);
|
||||
background-position: 0 0, 10px 10px;
|
||||
background-size: 20px 20px;
|
||||
}
|
||||
|
||||
.image-cropped {
|
||||
aspect-ratio: 1/1;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
object-fit: contain;
|
||||
border-radius: $grid-item-border-radius;
|
||||
}
|
||||
|
||||
.image-placeholder {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
aspect-ratio: 1/1;
|
||||
max-width: 100%;
|
||||
height: auto;
|
||||
color: #9d9d9d;
|
||||
}
|
||||
|
||||
.file-background, .folder-background {
|
||||
padding-bottom: 100%;
|
||||
background-color: hsl(var(--hue), 20%, 97%);
|
||||
border: 1px solid hsl(var(--hue), 35%, 95%);
|
||||
border-radius: $grid-item-border-radius;
|
||||
}
|
||||
|
||||
.file-icon, .folder-icon {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
color: hsl(var(--hue), 20%, 60%);
|
||||
}
|
||||
|
||||
.media-dragoutline {
|
||||
position: absolute;
|
||||
top: 6px;
|
||||
right: 6px;
|
||||
bottom: 1px;
|
||||
left: 6px;
|
||||
z-index: 1040;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
visibility: hidden;
|
||||
content: "";
|
||||
background-color: $dnd-bg;
|
||||
border: $dnd-border;
|
||||
border-radius: $border-radius;
|
||||
opacity: 0;
|
||||
transition: all .2s ease;
|
||||
transition-delay: .2s;
|
||||
transform: scale(.6);
|
||||
.upload-icon {
|
||||
font-size: 8rem;
|
||||
color: $dnd-icon-color;
|
||||
opacity: 0;
|
||||
transition: all .2s ease;
|
||||
transition-delay: .1s;
|
||||
transform: translateY(50%);
|
||||
}
|
||||
p {
|
||||
font-size: 1.4rem;
|
||||
opacity: 0;
|
||||
transition: all .2s ease;
|
||||
transition-delay: 0s;
|
||||
}
|
||||
&.active {
|
||||
visibility: visible;
|
||||
opacity: 1;
|
||||
transition-delay: 0s;
|
||||
transform: scale(1);
|
||||
.upload-icon {
|
||||
opacity: 1;
|
||||
transform: translateY(0);
|
||||
}
|
||||
p {
|
||||
opacity: 1;
|
||||
transition-delay: .2s;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Table View
|
||||
.media-browser-table-head {
|
||||
.type {
|
||||
margin-left: 1px;
|
||||
&::before {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.media-browser-table {
|
||||
.size {
|
||||
width: 10%;
|
||||
text-align: right;
|
||||
}
|
||||
.dimension {
|
||||
width: 15%;
|
||||
}
|
||||
.created {
|
||||
width: 15%;
|
||||
}
|
||||
.modified {
|
||||
width: 15%;
|
||||
}
|
||||
.type {
|
||||
position: relative;
|
||||
z-index: 0;
|
||||
width: 49px;
|
||||
min-width: 49px;
|
||||
padding: .6rem 0;
|
||||
font-size: $table-item-icon-size;
|
||||
line-height: $table-item-height;
|
||||
text-align: center;
|
||||
background-color: $table-item-icon-bg;
|
||||
border-right: 1px solid rgba(0, 0, 0, .03);
|
||||
&::before, &::after {
|
||||
transition: all .2s cubic-bezier(.4, 0, .2, 1);
|
||||
}
|
||||
&::before {
|
||||
font-family: "Font Awesome 6 Free";
|
||||
color: $table-item-icon-color;
|
||||
.selected & {
|
||||
color: $table-item-icon-color-selected;
|
||||
}
|
||||
}
|
||||
&::after {
|
||||
position: absolute;
|
||||
top: -1px;
|
||||
right: 100%;
|
||||
bottom: -1px;
|
||||
left: 0;
|
||||
z-index: -1;
|
||||
content: "";
|
||||
background-color: $table-item-icon-bg-selected;
|
||||
}
|
||||
span {
|
||||
visibility: hidden;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.action-toggle {
|
||||
padding: 0;
|
||||
background: transparent;
|
||||
border: 0;
|
||||
}
|
||||
|
||||
.selected {
|
||||
.type {
|
||||
&::before {
|
||||
color: #fff;
|
||||
}
|
||||
&::after {
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.type {
|
||||
&[data-type] {
|
||||
&::before {
|
||||
content: $icon-type-default;
|
||||
}
|
||||
}
|
||||
// Folder
|
||||
&[data-type=""] {
|
||||
&::before {
|
||||
content: $icon-type-folder;
|
||||
}
|
||||
}
|
||||
// Images
|
||||
&[data-type="jpg" i],
|
||||
&[data-type="png" i],
|
||||
&[data-type="gif" i],
|
||||
&[data-type="jpeg" i],
|
||||
&[data-type="tiff" i],
|
||||
&[data-type="bmp" i],
|
||||
&[data-type="svg" i],
|
||||
&[data-type="webp" i] {
|
||||
&::before {
|
||||
content: $icon-type-images;
|
||||
}
|
||||
}
|
||||
// Video
|
||||
&[data-type="mov" i],
|
||||
&[data-type="mkv" i],
|
||||
&[data-type="mp4" i],
|
||||
&[data-type="mpg" i],
|
||||
&[data-type="mpeg" i] {
|
||||
&::before {
|
||||
content: $icon-type-video;
|
||||
}
|
||||
}
|
||||
// Audio
|
||||
&[data-type="mp3" i],
|
||||
&[data-type="wav" i],
|
||||
&[data-type="raw" i],
|
||||
&[data-type="wma" i] {
|
||||
&::before {
|
||||
content: $icon-type-audio;
|
||||
}
|
||||
}
|
||||
// Docs
|
||||
&[data-type="doc" i],
|
||||
&[data-type="xls" i],
|
||||
&[data-type="pdf" i],
|
||||
&[data-type="txt" i] {
|
||||
&::before {
|
||||
content: $icon-type-docs;
|
||||
}
|
||||
}
|
||||
// Code
|
||||
&[data-type="html" i],
|
||||
&[data-type="htm" i] {
|
||||
&::before {
|
||||
content: $icon-type-code;
|
||||
}
|
||||
}
|
||||
}
|
||||
74
media/com_media/scss/components/_media-edit.scss
Normal file
74
media/com_media/scss/components/_media-edit.scss
Normal file
@ -0,0 +1,74 @@
|
||||
.media-form {
|
||||
joomla-tab > joomla-tab-element {
|
||||
padding: 0;
|
||||
|
||||
&[active] {
|
||||
display: grid;
|
||||
}
|
||||
}
|
||||
|
||||
joomla-tab-element {
|
||||
grid-template-columns: repeat(auto-fit, minmax(240px, 1fr));
|
||||
|
||||
> fieldset {
|
||||
padding: 2rem;
|
||||
&.options-form {
|
||||
border: none;
|
||||
}
|
||||
|
||||
legend {
|
||||
float: left;
|
||||
padding: 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.cropper-modal,
|
||||
.cropper-bg {
|
||||
background: none;
|
||||
}
|
||||
|
||||
.control-group {
|
||||
.control-label {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.input-group-addon {
|
||||
font-size: .9rem;
|
||||
}
|
||||
|
||||
.spacer hr {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.form-select {
|
||||
min-width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.media-manager-edit {
|
||||
grid-column-start: 2;
|
||||
grid-column-end: 5;
|
||||
background-color: #fff;
|
||||
background-image: linear-gradient(45deg,hsl(var(--hue), 20%, 97%) 25%,transparent 0,transparent 75%,#fafafa 0,hsl(var(--hue),20%,97%)),linear-gradient(45deg,#fafafa 25%,transparent 0,transparent 75%,hsl(var(--hue), 20%, 97%) 0,hsl(var(--hue), 20%, 97%));
|
||||
background-position: 0 0,10px 10px;
|
||||
background-size: 20px 20px;
|
||||
border-left: 1px solid $border-color;
|
||||
|
||||
> div > img {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
&,
|
||||
> *:not(.hidden) {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
}
|
||||
}
|
||||
|
||||
.tab-pane {
|
||||
background-color: #fafafa;
|
||||
border-left: 1px solid #f0f0f0;
|
||||
}
|
||||
82
media/com_media/scss/components/_media-infobar.scss
Normal file
82
media/com_media/scss/components/_media-infobar.scss
Normal file
@ -0,0 +1,82 @@
|
||||
$jicon-css-prefix: icon;
|
||||
$fa-css-prefix: fa;
|
||||
|
||||
.media-infobar {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
inset-inline-end: 0;
|
||||
bottom: 0;
|
||||
z-index: 4;
|
||||
float: none;
|
||||
width: 25%;
|
||||
padding: $gutter-width;
|
||||
overflow-y: auto;
|
||||
background-color: $info-bg;
|
||||
border-inline-start: 1px solid $border-color;
|
||||
h2 {
|
||||
padding-block-start: 8px;
|
||||
padding-block-end: 8px;
|
||||
padding-inline-start: ($gutter-width - 5px);
|
||||
padding-inline-end: ($gutter-width + 15px);
|
||||
margin: (-$gutter-width) (-$gutter-width) $gutter-width;
|
||||
font-weight: normal;
|
||||
word-wrap: break-word;
|
||||
background-color: $info-title-bg;
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
dl {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
margin-right: -($col-gutter-width * .5);
|
||||
margin-left: -($col-gutter-width * .5);
|
||||
}
|
||||
dt, dd {
|
||||
position: relative;
|
||||
direction: ltr;
|
||||
width: 100%;
|
||||
min-height: 1px;
|
||||
padding-right: $col-gutter-width * .5;
|
||||
padding-left: $col-gutter-width * .5;
|
||||
[dir=rtl] & {
|
||||
text-align: end;
|
||||
}
|
||||
}
|
||||
dt {
|
||||
font-weight: normal;
|
||||
color: $info-dt-color;
|
||||
}
|
||||
}
|
||||
|
||||
.infobar-close {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
inset-inline-end: 0;
|
||||
z-index: 2;
|
||||
padding: 5px $gutter-width;
|
||||
font-size: 2.6rem;
|
||||
line-height: 2rem;
|
||||
color: $info-close-color;
|
||||
text-indent: 0;
|
||||
text-shadow: none;
|
||||
&:hover {
|
||||
color: $info-close-color-hover;
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
[class^="#{$jicon-css-prefix}-"],
|
||||
[class*=" #{$jicon-css-prefix}-"],
|
||||
[class^="#{$fa-css-prefix}-"],
|
||||
[class*=" #{$fa-css-prefix}-"] {
|
||||
&.placeholder-icon {
|
||||
display: block;
|
||||
width: 4rem;
|
||||
height: 4rem;
|
||||
margin: 20px auto 15px;
|
||||
font-size: 2rem;
|
||||
line-height: calc(4rem - 4px);
|
||||
color: #ccc;
|
||||
border: 2px solid #ccc;
|
||||
border-radius: 50%;
|
||||
}
|
||||
}
|
||||
97
media/com_media/scss/components/_media-modal.scss
Normal file
97
media/com_media/scss/components/_media-modal.scss
Normal file
@ -0,0 +1,97 @@
|
||||
.media-modal-backdrop {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 1049;
|
||||
display: table;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
background-color: $modal-backdrop-color;
|
||||
|
||||
.modal {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
animation: .5s ease 0s normal none 1 running fadeIn;
|
||||
}
|
||||
|
||||
.modal-body {
|
||||
width: auto;
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
box-shadow: $modal-box-shadow;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
.media-preview-modal {
|
||||
color: $modal-preview-text-color;
|
||||
|
||||
.modal {
|
||||
display: grid !important;
|
||||
align-items: center !important;
|
||||
justify-content: center !important;
|
||||
}
|
||||
|
||||
.modal-content {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: flex-start;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
box-shadow: none;
|
||||
}
|
||||
.modal-header {
|
||||
padding: 0;
|
||||
border: 0;
|
||||
}
|
||||
.modal-body {
|
||||
padding: 0;
|
||||
background-color: #fff;
|
||||
box-shadow: $modal-box-shadow;
|
||||
img {
|
||||
max-width: 100%;
|
||||
}
|
||||
}
|
||||
.modal-footer {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.media-preview-close {
|
||||
position: absolute;
|
||||
top: -2rem;
|
||||
right: 0;
|
||||
font-size: 2rem;
|
||||
color: inherit;
|
||||
background: none;
|
||||
border: 0;
|
||||
opacity: .7;
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
|
||||
@media (min-width: 576px) {
|
||||
.media-preview-modal {
|
||||
.modal-dialog {
|
||||
max-width: unset !important;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@keyframes fadeInUp {
|
||||
from {
|
||||
opacity: 0;
|
||||
transition: transform .3s ease-out;
|
||||
transform: translate(0, -25%);
|
||||
}
|
||||
|
||||
to {
|
||||
opacity: 1;
|
||||
transform: none;
|
||||
}
|
||||
}
|
||||
82
media/com_media/scss/components/_media-toolbar.scss
Normal file
82
media/com_media/scss/components/_media-toolbar.scss
Normal file
@ -0,0 +1,82 @@
|
||||
.media-toolbar {
|
||||
position: sticky;
|
||||
top: 67px;
|
||||
z-index: 10;
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
padding: 0;
|
||||
background-color: $toolbar-bg;
|
||||
border-bottom: 1px solid $border-color;
|
||||
border-inline-start: 1px solid $border-color;
|
||||
border-radius: 0 $border-radius 0 0;
|
||||
box-shadow: 0 -1px 0 0 $border-color;
|
||||
input {
|
||||
padding: .3rem .75rem;
|
||||
}
|
||||
&-icon {
|
||||
display: inline-block;
|
||||
width: $toolbar-icon-width;
|
||||
font-size: 1.3rem;
|
||||
line-height: $toolbar-height;
|
||||
color: $toolbar-icon-color;
|
||||
text-align: center;
|
||||
background-color: transparent;
|
||||
border: 0;
|
||||
border-inline-start: 1px solid $border-color;
|
||||
&.active {
|
||||
color: #fff;
|
||||
background-color: $toolbar-icon-active-bg-color;
|
||||
&:hover {
|
||||
background-color: $toolbar-icon-active-bg-color-hover;
|
||||
}
|
||||
}
|
||||
&:hover {
|
||||
background-color: $toolbar-icon-bg-hover;
|
||||
box-shadow: none;
|
||||
}
|
||||
}
|
||||
&-select-all {
|
||||
width: 1.1rem;
|
||||
margin: 1rem;
|
||||
}
|
||||
}
|
||||
|
||||
.media-view-icons {
|
||||
display: flex;
|
||||
.disabled {
|
||||
span {
|
||||
opacity: .3;
|
||||
}
|
||||
&:hover, span:hover {
|
||||
cursor: default;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.media-view-search-input {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
padding: 0 5px;
|
||||
}
|
||||
|
||||
.media-loader {
|
||||
position: absolute;
|
||||
right: 100%;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
z-index: 10;
|
||||
height: $toolbar-loader-height;
|
||||
background-image: $toolbar-loader-color;
|
||||
animation: 10s ease 0s normal none 1 running mediaLoader;
|
||||
animation-fill-mode: forwards;
|
||||
}
|
||||
|
||||
@keyframes mediaLoader {
|
||||
from {
|
||||
right: 100%;
|
||||
}
|
||||
|
||||
to {
|
||||
right: 0;
|
||||
}
|
||||
}
|
||||
162
media/com_media/scss/components/_media-tree.scss
Normal file
162
media/com_media/scss/components/_media-tree.scss
Normal file
@ -0,0 +1,162 @@
|
||||
// Media Tree
|
||||
|
||||
ul.media-tree {
|
||||
padding: 0 0 5px;
|
||||
margin: 0;
|
||||
overflow-x: visible;
|
||||
list-style: none;
|
||||
ul {
|
||||
margin-left: 2px;
|
||||
}
|
||||
&:empty {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.media-disk {
|
||||
position: sticky;
|
||||
top: 75px;
|
||||
left: 0;
|
||||
display: block;
|
||||
margin-bottom: 10px;
|
||||
}
|
||||
|
||||
.media-drive {
|
||||
overflow-x: auto;
|
||||
background-color: $sidebar-drive-bg;
|
||||
border: 1px solid $border-color;
|
||||
+ .media-drive {
|
||||
border-top: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.media-disk-name {
|
||||
padding: 4px 1px;
|
||||
font-size: 1rem;
|
||||
color: $sidebar-disk-name-color;
|
||||
|
||||
&:empty {
|
||||
display: none;
|
||||
}
|
||||
}
|
||||
|
||||
.media-tree-item {
|
||||
position: relative;
|
||||
display: block;
|
||||
&::before {
|
||||
position: absolute;
|
||||
top: $sidebar-tree-line-height * .5;
|
||||
left: 0;
|
||||
width: 10px;
|
||||
height: 1px;
|
||||
margin: auto;
|
||||
content: "";
|
||||
background-color: $sidebar-tree-line-color;
|
||||
}
|
||||
&::after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
width: 1px;
|
||||
height: 100%;
|
||||
content: "";
|
||||
background-color: $sidebar-tree-line-color;
|
||||
}
|
||||
&:last-child {
|
||||
&::after {
|
||||
height: $sidebar-tree-line-height * .5;
|
||||
}
|
||||
}
|
||||
li {
|
||||
padding-left: 10px;
|
||||
&::before, &::after {
|
||||
left: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.media-drive-name {
|
||||
padding: 4px 10px;
|
||||
&::before {
|
||||
content: none;
|
||||
}
|
||||
&::after {
|
||||
content: none;
|
||||
}
|
||||
&:hover {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
|
||||
.media-tree-item a {
|
||||
display: block;
|
||||
padding: 0 7px;
|
||||
line-height: $sidebar-tree-line-height;
|
||||
text-decoration: none;
|
||||
white-space: nowrap;
|
||||
cursor: pointer;
|
||||
}
|
||||
|
||||
.media-tree-item.active > a {
|
||||
&:hover {
|
||||
text-decoration: none;
|
||||
background-color: $sidebar-tree-item-hover-bg;
|
||||
}
|
||||
}
|
||||
|
||||
.media-tree-item .item-icon {
|
||||
display: inline-block;
|
||||
padding-right: 2px;
|
||||
font-size: 15px;
|
||||
line-height: normal;
|
||||
color: $sidebar-tree-icon-color;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.media-tree-item.active > a .item-icon {
|
||||
color: $sidebar-active-icon-color;
|
||||
}
|
||||
|
||||
.item-name {
|
||||
display: inline-block;
|
||||
overflow: hidden;
|
||||
font-size: .9em;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.media-tree-item.active > a .item-name {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
// RTL override
|
||||
html[dir=rtl] {
|
||||
.media-browser-table .dimension, .media-browser-table .size {
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
.media-browser-table .created, .media-browser-table .modified {
|
||||
direction: ltr;
|
||||
}
|
||||
|
||||
.media-drive-name {
|
||||
padding-right: 2px;
|
||||
}
|
||||
|
||||
.media-tree-item li::before, .media-tree-item li::after {
|
||||
right: 5px;
|
||||
left: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.media-tree-item .item-icon {
|
||||
padding-right: 10px;
|
||||
padding-left: 2px;
|
||||
}
|
||||
|
||||
ul.media-tree ul {
|
||||
margin-right: 15px;
|
||||
}
|
||||
}
|
||||
14
media/com_media/scss/media-manager.scss
Normal file
14
media/com_media/scss/media-manager.scss
Normal file
@ -0,0 +1,14 @@
|
||||
// Imports
|
||||
@import "variables";
|
||||
|
||||
// Components
|
||||
@import "components/animations";
|
||||
@import "components/layout";
|
||||
@import "components/media-breadcrumb";
|
||||
@import "components/media-browser";
|
||||
@import "components/media-edit";
|
||||
@import "components/media-infobar";
|
||||
@import "components/media-toolbar";
|
||||
@import "components/media-tree";
|
||||
@import "components/media-modal";
|
||||
|
||||
Reference in New Issue
Block a user