summaryrefslogtreecommitdiff
path: root/animism-align/frontend/app/views/viewer/player/components.media
diff options
context:
space:
mode:
Diffstat (limited to 'animism-align/frontend/app/views/viewer/player/components.media')
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.media/index.js29
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.media/media.carousel.js36
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.media/media.citation.js33
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.media/media.css157
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.media/media.gallery.js47
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.media/media.grid.js42
-rw-r--r--animism-align/frontend/app/views/viewer/player/components.media/media.vitrine.js38
7 files changed, 382 insertions, 0 deletions
diff --git a/animism-align/frontend/app/views/viewer/player/components.media/index.js b/animism-align/frontend/app/views/viewer/player/components.media/index.js
new file mode 100644
index 0000000..4fcf649
--- /dev/null
+++ b/animism-align/frontend/app/views/viewer/player/components.media/index.js
@@ -0,0 +1,29 @@
+import React from 'react'
+
+import {
+ MediaCitation
+} from './media.citation'
+
+import {
+ Vitrine
+} from './media.vitrine'
+
+import {
+ Gallery
+} from './media.gallery'
+
+import {
+ Carousel
+} from './media.carousel'
+
+import {
+ Grid
+} from './media.grid'
+
+export {
+ MediaCitation,
+ Vitrine,
+ Gallery,
+ Carousel,
+ Grid,
+} \ No newline at end of file
diff --git a/animism-align/frontend/app/views/viewer/player/components.media/media.carousel.js b/animism-align/frontend/app/views/viewer/player/components.media/media.carousel.js
new file mode 100644
index 0000000..cfd1e48
--- /dev/null
+++ b/animism-align/frontend/app/views/viewer/player/components.media/media.carousel.js
@@ -0,0 +1,36 @@
+import React, { Component } from 'react'
+import { useKeenSlider } from "keen-slider/react"
+import "keen-slider/keen-slider.min.css"
+
+export const Carousel = ({ media }) => {
+ const { image_order, image_lookup, display_lookup, thumbnail_lookup } = media.settings
+
+ const [sliderRef] = useKeenSlider({
+ slidesPerView: 2,
+ mode: "free-snap",
+ spacing: 15,
+ centered: true,
+ loop: false
+ });
+ // console.log(display_lookup)
+ // console.log(width)
+ return (
+ <div ref={sliderRef} className='keen-slider carousel-items'>
+ {image_order.map(id => {
+ const image = display_lookup[id]
+ console.log(image)
+ return (
+ <CarouselItem key={id} image={image} />
+ )
+ })}
+ </div>
+ )
+}
+
+const CarouselItem = ({ image }) => {
+ return (
+ <div className='keen-slider__slide carousel-item' style={{
+ backgroundImage: 'url(' + image.url + ')',
+ }} />
+ )
+}
diff --git a/animism-align/frontend/app/views/viewer/player/components.media/media.citation.js b/animism-align/frontend/app/views/viewer/player/components.media/media.citation.js
new file mode 100644
index 0000000..14c8c53
--- /dev/null
+++ b/animism-align/frontend/app/views/viewer/player/components.media/media.citation.js
@@ -0,0 +1,33 @@
+import React, { Component } from 'react'
+
+export const MediaCitation = ({ media }) => {
+ if (media.settings.bibliography) {
+ return (
+ <div className='citation' dangerouslySetInnerHTML={{ __html: media.settings.bibliography }} />
+ )
+ }
+ return (
+ <div className='citation'>
+ {media.author}
+ {', '}
+ {media.pre_title && (
+ media.pre_title + ' '
+ )}
+ <i>{media.title}</i>
+ {media.post_title && (
+ ' ' + media.post_title
+ )}
+ {'. '}
+ {media.date && (
+ ' ' + media.date + '.'
+ )}
+ {media.medium && (
+ ' ' + media.medium + '.'
+ )}
+ {media.source && (
+ ' ' + media.source.trim()
+ )}
+ </div>
+ )
+}
+
diff --git a/animism-align/frontend/app/views/viewer/player/components.media/media.css b/animism-align/frontend/app/views/viewer/player/components.media/media.css
new file mode 100644
index 0000000..62eb9af
--- /dev/null
+++ b/animism-align/frontend/app/views/viewer/player/components.media/media.css
@@ -0,0 +1,157 @@
+/* carousel */
+
+.carousel-container {
+ margin-top: 0.5rem;
+ margin-bottom: 1.5rem;
+ padding: 1rem;
+}
+.carousel-item {
+ height: calc(100vh - 9rem);
+ width: 50vw;
+ background-size: contain;
+ background-position: center center;
+ background-repeat: no-repeat;
+}
+
+/* gallery */
+
+.gallery-container {
+ overflow-x: scroll;
+ width: 100%;
+ padding: 1rem 1rem 0.5rem 1rem;
+ margin-bottom: 1.5rem;
+}
+.gallery-scroll {
+ display: flex;
+ flex-direction: row nowrap;
+ justify-content: flex-start;
+ align-items: flex-start;
+}
+.gallery-item {
+ padding-right: 1rem;
+}
+.gallery-image {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ height: 25rem;
+}
+.gallery-image img {
+ display: block;
+ max-height: 25rem;
+}
+.gallery-caption {
+ margin-top: 0.5rem;
+ color: #888;
+}
+
+.gallery-container::-webkit-scrollbar {
+ cursor: pointer;
+ user-select: none;
+ height: 4px
+}
+.gallery-container::-webkit-scrollbar-button {
+ display: block;
+ width: 0;
+ height: 0;
+}
+.gallery-container::-webkit-scrollbar-track-piece {
+ background:rgba(211,211,211,0.8);
+}
+.gallery-container::-webkit-scrollbar-thumb {
+ display: block;
+ background: #000;
+}
+
+/* grid */
+
+.grid-container {
+ margin: 0 auto 1.5rem auto;
+ width: 45rem;
+ display: flex;
+ flex-flow: row wrap;
+ align-items: flex-start;
+ justify-content: flex-start;
+}
+.grid-item {
+ width: 22rem;
+ margin-bottom: 0.5rem;
+}
+.grid-item:nth-child(odd) {
+ margin-right: 1rem;
+}
+.grid-item img {
+ display: block;
+ width: 22rem;
+}
+.grid-caption {
+ margin-top: 0.5rem;
+ color: #888;
+}
+
+/* vitrine */
+
+.vitrine .heading {
+ font-family: "Freight Text", serif;
+ font-size: 3rem;
+ line-height: 1.28;
+ width: 80%;
+ margin: 0 auto;
+ padding-bottom: 2rem;
+ text-align: center;
+}
+.vitrine .citation {
+ width: 45rem;
+ margin: 0 auto;
+ padding: 1rem 0;
+ font-family: "Neue Haas Unica";
+ color: #888;
+}
+.vitrine-items {
+ display: flex;
+ flex-flow: row wrap;
+ align-items: center;
+ justify-content: space-between;
+ padding: 0 1rem;
+}
+.vitrine-items .vitrine-item {
+ display: flex;
+ flex-flow: column nowrap;
+ align-items: center;
+ justify-content: space-between;
+ height: calc(45vh - 6rem);
+}
+.vitrine-items .vitrine-item .vitrine-image {
+ display: flex;
+ justify-content: center;
+ align-items: center;
+ width: 100%;
+ height: 80%;
+ cursor: pointer;
+}
+.vitrine-items .vitrine-item .vitrine-image img {
+ max-width: 100%;
+ max-height: 100%;
+ pointer-events: none;
+}
+.vitrine-items .vitrine-item .zoomPlus {
+ cursor: pointer;
+}
+.vitrine-items .vitrine-item:hover .zoomPlus .cross {
+ stroke: #000;
+ stroke-width: 0.5;
+}
+.vitrine-items .vitrine-item:hover .zoomPlus .ring {
+ fill: #fff;
+}
+.vitrine-items .vitrine-item .zoomPlus .ring-inner {
+ stroke: transparent;
+ fill: transparent;
+}
+.vitrine-items .vitrine-item:hover .zoomPlus .ring-inner {
+ fill: #fff;
+ stroke: #fff;
+}
+.inline-element.vitrine .heading {
+ padding-top: 8rem;
+}
diff --git a/animism-align/frontend/app/views/viewer/player/components.media/media.gallery.js b/animism-align/frontend/app/views/viewer/player/components.media/media.gallery.js
new file mode 100644
index 0000000..da83c4f
--- /dev/null
+++ b/animism-align/frontend/app/views/viewer/player/components.media/media.gallery.js
@@ -0,0 +1,47 @@
+import React, { Component } from 'react'
+
+import { CURTAIN_COLOR_LOOKUP } from 'app/constants'
+
+export const Gallery = ({ media, annotation }) => {
+ const { image_order, image_lookup, display_lookup, thumbnail_lookup, caption_lookup } = media.settings
+ const color = CURTAIN_COLOR_LOOKUP[annotation.settings.color] || CURTAIN_COLOR_LOOKUP.white
+ const style = {
+ backgroundColor: color.backgroundColor,
+ // color: color.textColor,
+ }
+
+ // console.log(display_lookup)
+ // console.log(width)
+ return (
+ <div style={style} className='gallery-container'>
+ <div className='gallery-items'>
+ <div className='gallery-scroll'>
+ {image_order.map(id => {
+ const image = display_lookup[id]
+ const caption = (caption_lookup && caption_lookup[id]) || {}
+ // console.log(image)
+ return (
+ <GalleryItem key={id} image={image} caption={caption} />
+ )
+ })}
+ </div>
+ </div>
+ </div>
+ )
+}
+
+const GalleryItem = ({ image, caption }) => {
+ // console.log(image)
+ return (
+ <div className='gallery-item'>
+ <div className='gallery-image'>
+ <img src={image.url} />
+ </div>
+ {caption.caption && (
+ <div className='gallery-caption'>
+ {caption.caption}
+ </div>
+ )}
+ </div>
+ )
+}
diff --git a/animism-align/frontend/app/views/viewer/player/components.media/media.grid.js b/animism-align/frontend/app/views/viewer/player/components.media/media.grid.js
new file mode 100644
index 0000000..93b8696
--- /dev/null
+++ b/animism-align/frontend/app/views/viewer/player/components.media/media.grid.js
@@ -0,0 +1,42 @@
+import React, { Component } from 'react'
+
+import { CURTAIN_COLOR_LOOKUP } from 'app/constants'
+
+export const Grid = ({ media, annotation }) => {
+ const { image_order, image_lookup, display_lookup, thumbnail_lookup, caption_lookup } = media.settings
+ const color = CURTAIN_COLOR_LOOKUP[annotation.settings.color] || CURTAIN_COLOR_LOOKUP.white
+ const style = {
+ // backgroundColor: color.backgroundColor,
+ // color: color.textColor,
+ }
+ // console.log(display_lookup)
+ // console.log(width)
+ return (
+ <div style={style} className='grid-container'>
+ {image_order.map(id => {
+ const image = display_lookup[id]
+ const caption = (caption_lookup && caption_lookup[id]) || {}
+ // console.log(image)
+ return (
+ <GridItem key={id} image={image} caption={caption} />
+ )
+ })}
+ </div>
+ )
+}
+
+const GridItem = ({ image, caption }) => {
+ // console.log(image)
+ return (
+ <div className='grid-item'>
+ <div className='grid-image'>
+ <img src={image.url} />
+ </div>
+ {caption.caption && (
+ <div className='grid-caption'>
+ {caption.caption}
+ </div>
+ )}
+ </div>
+ )
+}
diff --git a/animism-align/frontend/app/views/viewer/player/components.media/media.vitrine.js b/animism-align/frontend/app/views/viewer/player/components.media/media.vitrine.js
new file mode 100644
index 0000000..2033465
--- /dev/null
+++ b/animism-align/frontend/app/views/viewer/player/components.media/media.vitrine.js
@@ -0,0 +1,38 @@
+import React, { Component } from 'react'
+
+import { ZoomPlus } from '../../nav/viewer.icons.js'
+
+import actions from 'app/actions'
+
+export const Vitrine = ({ media }) => {
+ const { image_order, image_lookup, thumbnail_lookup } = media.settings
+ const width = (Math.floor(100 / image_order.length * 2) - 2) + 'vw'
+ // console.log(width)
+ return (
+ <div className='vitrine-items'>
+ {image_order.map(id => {
+ const thumbnail = thumbnail_lookup[id]
+ return (
+ <VitrineItem
+ key={id}
+ media={media}
+ id={id}
+ image={thumbnail}
+ width={width}
+ />
+ )
+ })}
+ </div>
+ )
+}
+
+const VitrineItem = ({ media, id, image, width }) => {
+ return (
+ <div className='vitrine-item' style={{ width }} onClick={() => actions.viewer.openVitrineModal(media, id)}>
+ <div className='vitrine-image'>
+ <img src={image.url} />
+ </div>
+ {ZoomPlus}
+ </div>
+ )
+}