WordPress/wp-includes/css/media-views.css
Daryl Koopersmith 92823b8635 Streamlining media, part I.
The main goal here is to rearrange the media components in a modularized structure to support more linear workflows. This is that structure using the pre-existing workflows, which will be improved over the course of the next few commits.

This leaves a few pieces a bit rough around the edges: namely gallery editing and selecting a featured image.

The fine print follows.

----

'''Styles'''
* Tightened padding around the modal to optimize for a smaller default screen size.
* Added a light dashed line surrounding the modal to provide a subtle cue for the persistent dropzone (which is evolving into a power user feature since we now have a dedicated `upload` state).
* Add a size for `hero` buttons.
* Remove transitions from frame subviews (e.g. menu, content, sidebar, toolbar).

----

'''Code'''

`wp.media.controller.StateManager`
* Don't fire `activate` and `deactivate` if attempting to switch to the current state.

`wp.media.controller.State`
* Add a base state class to bind default methods (as not all states will inherit from the `Library` state).
* On `activate`, fire `activate()`, `menu()`, `content()`, `sidebar()`, and `toolbar()`.
* The menu view is often a shared object (as its most common use case is switching between states). Assign the view to the state's `menu` attribute.
* `menu()` automatically fetches the state's `menu` attribute, attaches the menu view to the frame, and attempts to select a menu item that matches the state's `id`.

`wp.media.controller.Library`
* Now inherits from `wp.media.controller.State`.

`wp.media.controller.Upload`
* A new state to improve the upload experience.
* Displays a large dropzone when empty (a `UploaderInline` view).
* When attachments are uploaded, displays management interface (a `library` state restricted to attachments uploaded during the current session).

`wp.media.view.Frame`
* In `menu()`, `content()`, `sidebar()`, and `toolbar()`, only change the view if it differs from the current view. Also, ensure `hide-*` classes are properly removed.
*

`wp.media.view.PriorityList`
* A new container view used to sort and render child views by the `priority` property.
* Used by `wp.media.view.Sidebar` and `wp.media.view.Menu`.
* Next step: Use two instances to power `wp.media.view.Toolbar`.

`wp.media.view.Menu` and `wp.media.view.MenuItem`
* A new `PriorityList` view that renders a list of views used to switch between states.
* `MenuItem` instances have `id` attributes that are tied directly to states.
* Separators can be added as plain `Backbone.View` instances with the `separator` class.
* Supports any type of `Backbone.View`.

`media.view.Menu.Landing`
* The landing menu for the 'insert media' workflow.
* Includes an inactive link to an "Embed from URL" state.
* Next steps: only use in select cases to allot for other workflows (such as featured images).

`wp.media.view.AttachmentsBrowser`
* A container to render an `Attachments` view with accompanying UI controls (similar to what the `Attachments` view was when it contained the `$list` property).
* Currently only renders a `Search` view as a control.
* Next steps: Add optional view counts (e.g. "21 images"), upload buttons, and collection filter UI.

`wp.media.view.Attachments`
* If the `Attachments` scroll buffer is not filled with `Attachment` views, continue loading more attachments.
* Use `this.model` instead of `this.controller.state()` to allow `Attachments` views to have differing `edge` and `gutter` properties.
* Add `edge()`, a method used to calculate the optimal dimensions for an attachment based on the current width of the `Attachments` container element.
* `edge()` is currently only enabled on resize, as the relative positioning and CSS transforms used to center thumbnails are suboptimal when coupled with frequent resizing.
* Next steps: For infinite scroll performance improvements, look into absolutely positioning attachment views and paging groups of attachment views.

`wp.media.view.UploaderWindow`
* Now generates a `$browser` element as the browse button (instead of a full `UploaderInline` view). Using a portable browse button prevents us from having to create a new `wp.Uploader` instance every time we want access to a browse button.

`wp.media.view.UploaderInline`
* No longer directly linked to the `UploaderWindow` view or its `wp.Uploader` instance.
* Used as the default `upload` state view.

`wp.media.view.Selection`
* An interactive representation of the selected `Attachments`.
* Based on the improved workflows, this is likely overkill. For simplicity's sake, will probably remove this in favor of `SelectionPreview`.

----

see #21390.



git-svn-id: http://core.svn.wordpress.org/trunk@22362 1a063a9b-81f0-0310-95a4-ce76da25c4cd
2012-11-04 22:59:12 +00:00

814 lines
13 KiB
CSS

/**
* Modal
*/
.media-modal {
position: fixed;
top: 60px;
left: 40px;
right: 40px;
bottom: 40px;
z-index: 125000;
}
.media-modal-backdrop {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: #000;
opacity: 0.8;
z-index: 120000;
}
.media-modal-backdrop div {
position: absolute;
top: 10px;
left: 10px;
right: 10px;
bottom: 10px;
border: 1px dashed rgba( 255, 255, 255, 0.5 );
}
.media-modal-title,
.media-modal-close {
position: absolute;
top: -40px;
height: 40px;
line-height: 40px;
color: #fff;
font-weight: 200;
text-shadow: 0 0 16px rgba( 0, 0, 0, 0.6 );
}
.media-modal-title {
left: 0;
float: left;
padding: 0;
margin: 0;
font-size: 16px;
}
.media-modal-close {
right: 0;
float: right;
text-decoration: none;
font-size: 1.8em;
}
.media-modal-close:hover,
.media-modal-close:focus {
color: #fff;
text-shadow: 0 0 16px rgba( 255, 255, 255, 0.8 );
}
.media-modal-close:active {
outline: 0;
}
.media-modal-content {
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
overflow: auto;
background: #fff;
}
/**
* Toolbar
*/
.media-toolbar {
position: absolute;
top: 0;
left: 0;
right: 0;
z-index: 100;
height: 60px;
padding: 0 16px;
border: 0 solid #dfdfdf;
}
.media-frame > .media-toolbar {
top: auto;
left: 200px;
bottom: 0;
border-width: 1px 0 0 0;
}
.media-frame.hide-toolbar > .media-toolbar {
bottom: -61px;
}
.media-toolbar-primary {
float: right;
}
.media-toolbar-secondary {
float: left;
}
.media-toolbar-primary > .media-button,
.media-toolbar-primary > .media-button-group {
margin-left: 10px;
float: left;
margin-top: 15px;
}
.media-toolbar-secondary > .media-button,
.media-toolbar-secondary > .media-button-group {
margin-right: 10px;
float: left;
margin-top: 15px;
}
/**
* Sidebar
*/
.media-sidebar {
position: absolute;
top: 0;
right: 0;
bottom: 61px;
width: 247px;
padding: 0 16px;
z-index: 75;
background: #f5f5f5;
border-left: 1px solid #dfdfdf;
}
.hide-sidebar .media-sidebar {
right: -280px;
}
.hide-toolbar .media-sidebar {
bottom: 0;
}
.media-sidebar .sidebar-title {
font-weight: 200;
font-size: 20px;
margin: 0;
padding: 12px 10px 10px;
line-height: 28px;
/*border-bottom: 1px solid #dfdfdf;*/
}
.media-sidebar .sidebar-content {
padding: 0 10px;
margin-bottom: 130px;
}
.media-sidebar .search {
display: block;
width: 100%;
}
.media-sidebar .selection-preview {
display: block;
padding-top: 5px;
}
/**
* Menu
*/
.media-menu {
position: absolute;
top: 0;
left: 0;
bottom: 0;
width: 199px;
margin: 0;
padding: 16px 0;
z-index: 200;
box-shadow: inset -6px 0 6px -6px rgba( 0, 0, 0, 0.4 );
}
.media-menu li {
position: relative;
padding: 4px 20px;
margin: 0;
line-height: 18px;
font-size: 14px;
color: #21759B;
text-shadow: 0 1px 0 #fff;
}
.media-menu-item {
cursor: pointer;
}
.media-menu li:hover {
background: rgba( 0, 0, 0, 0.04 );
}
.media-menu .active,
.media-menu .active:hover {
color: #333;
font-weight: bold;
}
.media-menu .separator {
height: 0;
margin: 12px 20px;
padding: 0;
border-top: 1px solid #dfdfdf;
border-bottom: 1px solid #fff;
}
/**
* Frame
*/
.media-frame {
overflow: hidden;
}
.media-frame .media-content {
position: absolute;
top: 0;
left: 200px;
right: 280px;
bottom: 61px;
height: auto;
width: auto;
margin: 0;
overflow: auto;
}
.media-frame.hide-sidebar .media-content {
right: 0;
}
.media-frame.hide-toolbar .media-content {
bottom: 0;
}
.media-frame .media-toolbar .add-to-gallery {
display: none;
}
/**
* Search
*/
.media-frame .search {
margin-top: 11px;
padding: 4px;
line-height: 18px;
font-size: 13px;
color: #464646;
font-family: sans-serif;
}
/**
* Attachments
*/
.attachments {
margin: 0;
padding-right: 16px;
}
/**
* Attachment
*/
.attachment {
position: relative;
float: left;
padding: 0;
margin: 0 10px 20px;
color: #464646;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
-o-user-select: none;
user-select: none;
}
.selected.attachment {
box-shadow:
0 0 0 1px #fff,
0 0 0 4px #777;
}
.details.attachment {
box-shadow:
0 0 0 1px #fff,
0 0 0 4px #1e8cbe;
}
.attachment.library.selected:after {
content: '\2713';
display: block;
height: 24px;
width: 24px;
position: absolute;
top: -1px;
right: -1px;
line-height: 24px;
font-size: 18px;
text-align: center;
color: #fff;
text-shadow: 0 1px 0 rgba( 0, 0, 0, 0.5 );
background: #777;
border: 1px solid #fff;
border-width: 0 0 1px 1px;
box-shadow: -1px 1px 0 rgba( 0, 0, 0, 0.1 );
}
.attachment.library.details:after {
background: #1e8cbe;
}
.attachment-preview {
position: relative;
width: 199px;
height: 199px;
overflow: hidden;
box-shadow:
inset 0 0 15px rgba( 0, 0, 0, 0.1 ),
inset 0 0 0 1px rgba( 0, 0, 0, 0.05 );
background: #eee;
cursor: pointer;
}
.attachment .icon,
.attachment .thumbnail {
display: block;
position: absolute;
top: 0;
left: 0;
margin: 0 auto;
}
/* Vertically center the icons. */
.attachment .icon {
top: 50%;
left: 50%;
}
.attachment-preview .thumbnail:after {
content: '';
display: block;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 );
overflow: hidden;
}
.attachment .thumbnail img {
top: 0;
left: 0;
}
.attachment .thumbnail .centered {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
-webkit-transform: translate( 50%, 50% );
-moz-transform: translate( 50%, 50% );
-ms-transform: translate( 50%, 50% );
-o-transform: translate( 50%, 50% );
transform: translate( 50%, 50% );
}
.attachment .icon,
.attachment .thumbnail .centered img {
-webkit-transform: translate( -50%, -50% );
-moz-transform: translate( -50%, -50% );
-ms-transform: translate( -50%, -50% );
-o-transform: translate( -50%, -50% );
transform: translate( -50%, -50% );
}
.attachment .filename {
position: absolute;
left: 0;
right: 0;
bottom: 0;
padding: 5px 10px;
text-align: center;
font-weight: bold;
background: rgba( 255, 255, 255, 0.8 );
box-shadow: 0 0 2px rgba( 0, 0, 0, 0.2 );
}
.attachment-preview .thumbnail {
width: 199px;
height: 199px;
}
.attachment .thumbnail img {
position: absolute;
}
.attachment .insert {
display: none;
position: absolute;
left: 7px;
bottom: 7px;
}
.attachment:hover .insert {
display: block;
}
.attachment .close {
display: none;
position: absolute;
top: 5px;
right: 5px;
height: 22px;
width: 22px;
padding: 0;
font-size: 20px;
line-height: 20px;
text-align: center;
text-decoration: none;
color: #464646;
background: #fff;
border-width: 0;
box-shadow: 0 0 0 1px rgba( 0, 0, 0, 0.3 );
}
.attachment .close:hover {
box-shadow: 0 0 0 1px rgba( 0, 0, 0, 0.6 );
}
.attachment:hover .close {
display: block;
}
.media-frame .describe {
position: relative;
display: block;
width: 100%;
height: 50px;
margin: -1px 0 0;
padding: 8px;
font-size: 12px;
resize: none;
border-radius: 0;
}
/**
* Attachments Browser
*/
.media-frame .attachments-browser {
overflow: hidden;
}
.attachments-browser .media-toolbar {
height: 50px;
}
.attachments-browser .attachments {
position: absolute;
top: 50px;
left: 0;
right: 0;
bottom: 0;
overflow: auto;
}
/**
* Progress Bar
*/
.media-progress-bar {
position: relative;
height: 8px;
width: 70%;
margin: 10px auto;
padding: 2px;
border: 2px solid #ccc;
border-radius: 8px;
background: #fff;
}
.media-progress-bar div {
height: 8px;
min-width: 8px;
width: 0;
background: #ccc;
border-radius: 10px;
-webkit-transition: width 300ms;
-moz-transition: width 300ms;
-ms-transition: width 300ms;
-o-transition: width 300ms;
transition: width 300ms;
}
.attachment-preview .media-progress-bar {
position: absolute;
top: 50%;
left: 15%;
width: 70%;
margin: -8px 0 0 -4px;
}
.uploader-window {
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
background: rgba( 0, 86, 132, 0.9 );
z-index: 250000;
display: none;
text-align: center;
opacity: 0;
-webkit-transition: opacity 250ms;
-moz-transition: opacity 250ms;
-ms-transition: opacity 250ms;
-o-transition: opacity 250ms;
transition: opacity 250ms;
}
.uploader-window-content {
position: absolute;
top: 10px;
left: 10px;
right: 10px;
bottom: 10px;
border: 1px dashed #fff;
}
.uploader-window h3 {
position: absolute;
top: 50%;
left: 0;
right: 0;
-webkit-transform: translateY( -50% );
-moz-transform: translateY( -50% );
-ms-transform: translateY( -50% );
-o-transform: translateY( -50% );
transform: translateY( -50% );
font-size: 20px;
font-weight: 200;
color: #fff;
padding: 0;
}
.uploader-window .media-progress-bar {
margin-top: 20px;
max-width: 300px;
background: transparent;
border-color: #fff;
display: none;
}
.uploader-window .media-progress-bar div {
background: #fff;
}
.uploading .uploader-window .media-progress-bar {
display: block;
}
.media-content.uploader-inline {
margin: 20px;
padding: 20px;
border: 1px dashed #aaa;
text-align: center;
}
.uploader-inline-content {
position: absolute;
top: 30%;
left: 0;
right: 0;
}
.uploader-inline h3 {
font-size: 20px;
font-weight: 200;
margin-bottom: 1.6em;
}
.uploader-inline .media-progress-bar {
display: none;
}
.uploading.uploader-inline .media-progress-bar {
display: block;
}
.uploader-inline .browser {
display: inline-block !important;
}
/**
* Selection
*/
.media-selection {
position: absolute;
top: 0;
left: 0;
right: 350px;
height: 60px;
padding: 0 0 0 16px;
overflow: hidden;
white-space: nowrap;
}
.media-selection .selection-info {
display: inline-block;
height: 60px;
margin-right: 10px;
vertical-align: top;
}
.media-selection.empty {
display: none;
}
.media-selection .count {
display: block;
padding-top: 12px;
font-size: 14px;
line-height: 20px;
font-weight: bold;
}
.media-selection .clear-selection {
display: block;
text-decoration: none;
line-height: 16px;
}
.media-selection .attachments {
display: inline-block;
height: 60px;
margin-top: 5px;
overflow: hidden;
vertical-align: top;
}
.media-selection .selected.attachment {
box-shadow: none;
}
.media-selection .details.attachment {
box-shadow:
0 0 0 1px #fff,
0 0 0 3px #1e8cbe;
}
.media-selection:after {
content: '';
display: block;
position: absolute;
top: 0;
right: 0;
bottom: 0;
width: 25px;
background-image: -webkit-gradient(linear, right top, right top, from( rgba( 255, 255, 255, 1 ) ), to( rgba( 255, 255, 255, 0 ) ));
background-image: -webkit-linear-gradient(right, rgba( 255, 255, 255, 1 ) , rgba( 255, 255, 255, 0 ) );
background-image: -moz-linear-gradient(right, rgba( 255, 255, 255, 1 ) , rgba( 255, 255, 255, 0 ) );
background-image: -o-linear-gradient(right, rgba( 255, 255, 255, 1 ) , rgba( 255, 255, 255, 0 ) );
background-image: linear-gradient(to left, rgba( 255, 255, 255, 1 ) , rgba( 255, 255, 255, 0 ) );
}
.media-selection .attachment .filename {
display: none;
}
/**
* Selection Preview
*/
.selection-preview {
position: relative;
height: 60px;
overflow: hidden;
}
.selected-img {
float: left;
position: relative;
margin-right: 14px;
}
.selection-preview img {
max-width: 40px;
max-height: 40px;
float: left;
margin-top: 6px;
margin-left: 1px;
border: 2px solid white;
box-shadow:
0 0 0 1px #ccc,
3px 3px 0 0 #fff,
3px 3px 0 1px #ccc,
6px 6px 0 0 #fff,
6px 6px 0 1px #ccc;
}
.selection-preview .selected-count-1 img {
margin-top: 8px;
box-shadow: 0 0 0 1px #ccc;
}
.selection-preview .selected-count-2 img {
margin-top: 7px;
box-shadow:
0 0 0 1px #ccc,
3px 3px 0 0 #fff,
3px 3px 0 1px #ccc;
}
.selection-preview .count {
position: absolute;
bottom: 0;
right: 0;
height: 16px;
min-width: 8px;
padding: 0 4px;
font-size: 12px;
text-align: center;
font-weight: bold;
color: #999;
background: #fff;
box-shadow: -1px -1px 2px -1px rgba( 0, 0, 0, 0.2 );
}
.selection-preview .clear-selection {
float: left;
line-height: 60px;
}
/**
* Attachment Details
*/
.attachment-details-preview {
cursor: default;
}
.attachment-details-preview {
width: auto;
height: auto;
position: relative;
}
.attachment-details-preview .thumbnail {
width: 100%;
height: auto;
}
.attachment-details-preview .thumbnail:after {
content: '';
display: block;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
box-shadow: inset 0 0 0 1px rgba( 0, 0, 0, 0.1 );
overflow: hidden;
}
.attachment-details-preview .thumbnail img {
display: block;
max-width: 100%;
max-height: 132px;
margin: 0 auto;
}
.attachment-details .describe {
float: left;
margin: 10px 0 0;
border-radius: 3px;
}
/**
* Attachment Display Settings
*/
.attachment-display-settings,
.button div.attachment-display-settings {
padding: 0 1em 1em;
}
.attachment-display-settings h3 {
font-weight: 200;
margin: 1.4em 0 0.4em;
}
.attachment-display-settings h4 {
margin: 1.4em 0 0.4em;
}