Compare commits
14 commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e54aeb8e07 | ||
|
|
52cc4b257d | ||
|
|
0a7ab32e55 | ||
|
|
8b244adac3 | ||
|
|
979a8b9f51 | ||
|
|
8a1d0bf3be | ||
|
|
dd89fb199e | ||
|
|
42b0fe8bd2 | ||
|
|
e88c626f53 | ||
|
|
0d0c05b91f | ||
|
|
a6b5c74873 | ||
|
|
03d9c9f09b | ||
|
|
1d7a5be751 | ||
|
|
ded4e652e7 |
20
.gitignore
vendored
|
|
@ -1,11 +1,13 @@
|
|||
portfolio/mongo/data/
|
||||
portfolio/mongo/db_backups/
|
||||
portfolio/mongo/auth/
|
||||
portfolio/src/node_modules/
|
||||
# Docker data
|
||||
mysql-*
|
||||
session-ses_*.md
|
||||
forgejo/
|
||||
redis/
|
||||
nextcloud/
|
||||
|
||||
# Environment & secrets
|
||||
.env
|
||||
|
||||
# Nginx
|
||||
nginx/certs/
|
||||
nginx/conf.d/default.conf
|
||||
nextcloud/
|
||||
gitea/
|
||||
.env
|
||||
portfolio-nuxt/.nuxt/
|
||||
portfolio-nuxt/node_modules/
|
||||
|
|
|
|||
3
.gitmodules
vendored
Normal file
|
|
@ -0,0 +1,3 @@
|
|||
[submodule "portfolio"]
|
||||
path = portfolio
|
||||
url = https://unboundedpress.org/code/mwinter/portfolio.git
|
||||
158
AGENTS.md
Normal file
|
|
@ -0,0 +1,158 @@
|
|||
# Agent Guidelines for Unboundedpress Dev
|
||||
|
||||
## Project Overview
|
||||
|
||||
This repository contains two main projects:
|
||||
- **`portfolio-nuxt/`** - Primary Nuxt 3 application (Vue 3, TypeScript, Tailwind CSS, Pinia)
|
||||
- **`portfolio/`** - Legacy Express.js application (plain JavaScript)
|
||||
|
||||
The Nuxt project is the main focus for development.
|
||||
|
||||
## Build Commands
|
||||
|
||||
### portfolio-nuxt (Primary Project)
|
||||
```bash
|
||||
cd portfolio-nuxt
|
||||
npm install # Install dependencies
|
||||
npm run dev # Development server
|
||||
npm run build # Build for production
|
||||
npm run generate # Generate static site
|
||||
npm run preview # Preview production build
|
||||
```
|
||||
|
||||
### portfolio (Legacy Project)
|
||||
```bash
|
||||
cd portfolio/src
|
||||
npm run serve # Development with nodemon
|
||||
npm run format # Format code
|
||||
```
|
||||
|
||||
### Running a Single Test
|
||||
**No test framework is currently configured.** If you add tests:
|
||||
- For Nuxt: Use Vitest
|
||||
- Run a single test: `npx vitest run --testNamePattern="test name"`
|
||||
|
||||
## Code Style Guidelines
|
||||
|
||||
### General Principles
|
||||
- Use TypeScript in Vue components (`.vue` with `<script setup lang="ts">`)
|
||||
- Use JavaScript (`.js`) in Pinia stores under `stores/`
|
||||
- Follow Vue 3 Composition API with `<script setup>`
|
||||
- Use Tailwind CSS classes for styling
|
||||
|
||||
### TypeScript Conventions
|
||||
- Use `defineProps` and `defineEmits` with type-based syntax
|
||||
- Use `withDefaults` for optional props with default values
|
||||
- Prefer `ref` and `reactive` from Vue
|
||||
- Use `toRefs` when destructuring props
|
||||
|
||||
```typescript
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
modelValue?: boolean
|
||||
persistent?: boolean
|
||||
}>(),
|
||||
{
|
||||
modelValue: false,
|
||||
persistent: false,
|
||||
},
|
||||
)
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'update:modelValue', value: boolean): void
|
||||
}>()
|
||||
```
|
||||
|
||||
### Vue Component Structure
|
||||
1. `<script setup lang="ts">` - Logic (imports, props, emits, composables)
|
||||
2. `<template>` - Template with slots
|
||||
3. `<style>` - Scoped styles (if needed, Tailwind preferred)
|
||||
|
||||
### Imports
|
||||
- Use `@/` alias for imports (configured in Nuxt)
|
||||
- Import Vue core: `import { ref, watch } from 'vue'`
|
||||
- Import from stores: `import { useModalStore } from '@/stores/ModalStore'`
|
||||
- Import icons: `import Icon from 'nuxt-icon'` or `<Icon name="..." />` in template
|
||||
|
||||
### File Naming
|
||||
- Vue components: PascalCase (e.g., `IconButton.vue`, `Modal.vue`)
|
||||
- Component folders: PascalCase with index.vue (e.g., `components/Modal/`)
|
||||
- Stores: PascalCase with Store suffix (e.g., `AudioPlayerStore.js`, `ModalStore.js`)
|
||||
- Pages: kebab-case (e.g., `index.vue`, `about-us.vue`)
|
||||
|
||||
### Tailwind CSS
|
||||
- Use utility classes for all styling
|
||||
- Follow existing patterns in components (see `components/Modal/Modal.vue`)
|
||||
- Use `bg-`, `text-`, `p-`, `m-`, `flex-`, `grid-` prefixes
|
||||
|
||||
### State Management (Pinia)
|
||||
- Create stores in `stores/` directory
|
||||
- Use JavaScript (`.js`) for stores
|
||||
- Follow the pattern in `stores/ModalStore.js`:
|
||||
|
||||
```javascript
|
||||
import { defineStore } from "pinia"
|
||||
|
||||
export const useModalStore = defineStore("ModalStore", {
|
||||
state: () => ({ key: "value" }),
|
||||
actions: {
|
||||
setKey(value) {
|
||||
this.key = value
|
||||
}
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### API Data Fetching
|
||||
- Use Nuxt's `useFetch` and `useAsyncData` composables
|
||||
- Transform data in the `transform` option
|
||||
|
||||
```typescript
|
||||
const { data: works } = await useFetch('https://unboundedpress.org/api/works', {
|
||||
transform: (works) => {
|
||||
// transformation logic
|
||||
return transformedData
|
||||
}
|
||||
})
|
||||
```
|
||||
|
||||
### Error Handling
|
||||
- Handle null/undefined values in templates with `v-if` guards
|
||||
- Use optional chaining (`?.`) when accessing nested properties
|
||||
- Validate URLs before using them (see pattern in `pages/index.vue`)
|
||||
|
||||
### Head Management
|
||||
Use `useHead` for SEO metadata:
|
||||
|
||||
```typescript
|
||||
useHead({
|
||||
titleTemplate: 'Site Title - %s'
|
||||
})
|
||||
```
|
||||
|
||||
### Transition and Animation
|
||||
- Use Vue's built-in `<Transition>` and `<TransitionRoot>` components
|
||||
- Use Headless UI for complex components (already installed)
|
||||
|
||||
## Additional Conventions
|
||||
|
||||
### Composables
|
||||
- Place reusable logic in `composables/` directory
|
||||
- Use the `use` prefix (e.g., `useModal`)
|
||||
|
||||
### Server Routes
|
||||
- Place API routes in `server/api/` directory
|
||||
- Use `.ts` files for TypeScript routes
|
||||
|
||||
### Image Handling
|
||||
- Use `<NuxtImg>` component for optimized images
|
||||
- Configure domains in `nuxt.config.ts` under `image.domains`
|
||||
|
||||
## Environment Variables
|
||||
- Use `.env` files for local development
|
||||
- Template available in `.env_template`
|
||||
- Never commit secrets to version control
|
||||
|
||||
## Docker
|
||||
- `Dockerfile` provided for deployment
|
||||
- Multi-stage build available in `Dockerfile_upgrade`
|
||||
301
README.md
Normal file
|
|
@ -0,0 +1,301 @@
|
|||
# Unboundedpress
|
||||
|
||||
Self-hosted web infrastructure using Docker Compose.
|
||||
|
||||
## Overview
|
||||
|
||||
- **portfolio**: ⚠️ **MOST IMPORTANT** - Main Nuxt 3 website containing a majority of my life's work (replaced old Express.js portfolio)
|
||||
- **Nextcloud**: File storage and document editing
|
||||
- **Forgejo**: Code repository (migrated from Gitea)
|
||||
- **Collabora**: Online document editor (integrated with Nextcloud)
|
||||
- **nginx-proxy**: Reverse proxy with automatic HTTPS (Let's Encrypt)
|
||||
- **Redis**: Caching for Nextcloud
|
||||
|
||||
## Prerequisites
|
||||
|
||||
- Docker & Docker Compose installed
|
||||
- Ports 80 and 443 available
|
||||
- Domain DNS pointing to server
|
||||
|
||||
## Quick Start
|
||||
|
||||
```bash
|
||||
# 1. Clone repository
|
||||
git clone <repo-url>
|
||||
cd unboundedpress_dev
|
||||
|
||||
# 2. Create .env file
|
||||
cp .env_template .env
|
||||
# Edit .env with your values
|
||||
|
||||
# 3. Start services
|
||||
docker compose up -d
|
||||
|
||||
# 4. Verify
|
||||
docker compose ps
|
||||
```
|
||||
|
||||
## Environment Variables (.env)
|
||||
|
||||
| Variable | Description | Example |
|
||||
|----------|-------------|---------|
|
||||
| DOMAIN | Your domain | unboundedpress.org |
|
||||
| USER | Admin username | mwinter |
|
||||
| PASSWORD | Admin password | ************ |
|
||||
| EMAIL | Email for SSL certificates | admin@example.com |
|
||||
|
||||
## Services
|
||||
|
||||
| Service | URL | Description |
|
||||
|---------|-----|-------------|
|
||||
| portfolio | https://{domain}/ | Main website |
|
||||
| Nextcloud | https://{domain}/cloud/ | File storage & documents |
|
||||
| Forgejo | https://{domain}/code/ | Git repositories |
|
||||
| Collabora | https://{domain}/collab/ | Document editing (integrated with Nextcloud) |
|
||||
|
||||
## Production Deployment
|
||||
|
||||
### Step 1: Update Environment
|
||||
|
||||
Edit `.env`:
|
||||
```bash
|
||||
DOMAIN=unboundedpress.org
|
||||
# Comment out or remove: HTTPS_METHOD=noredirect
|
||||
```
|
||||
|
||||
### Step 2: Update Nextcloud Collabora URLs
|
||||
|
||||
```bash
|
||||
# Internal URL (Nextcloud uses to talk to Collabora)
|
||||
docker exec nextcloud php occ config:app:set richdocuments wopi_url --value="http://collabora:9980"
|
||||
|
||||
# External URL (browser uses to open Collabora)
|
||||
docker exec nextcloud php occ config:app:set richdocuments public_wopi_url --value="https://unboundedpress.org/collab"
|
||||
|
||||
# Callback URL (Collabora uses to connect back to Nextcloud)
|
||||
docker exec nextcloud php occ config:app:set richdocuments wopi_callback_url --value="https://unboundedpress.org/cloud"
|
||||
```
|
||||
|
||||
### Step 3: Restart Services
|
||||
|
||||
```bash
|
||||
docker compose restart
|
||||
```
|
||||
|
||||
### Step 4: Verify SSL
|
||||
|
||||
SSL certificates are automatically issued by acme-companion. Check status:
|
||||
```bash
|
||||
docker logs nginx-proxy-acme
|
||||
```
|
||||
|
||||
## Local Development
|
||||
|
||||
### HTTPS Setup (mkcert)
|
||||
|
||||
For local development with HTTPS, use mkcert to create locally-trusted certificates:
|
||||
|
||||
```bash
|
||||
# Install mkcert (Arch Linux)
|
||||
sudo pacman -S mkcert
|
||||
|
||||
# Install local CA
|
||||
mkcert -install
|
||||
|
||||
# Create certificates
|
||||
cd nginx/certs
|
||||
mkcert -key-file key.pem -cert-file cert.pem "localdev.unboundedpress.org" "*.localdev.unboundedpress.org"
|
||||
|
||||
# Rename to default certificate
|
||||
mv cert.pem default.crt
|
||||
mv key.pem default.key
|
||||
|
||||
# Restart proxy
|
||||
docker compose restart nginx-proxy
|
||||
```
|
||||
|
||||
### Access Local Services
|
||||
|
||||
After setup, access at:
|
||||
- Main site: https://localdev.unboundedpress.org/
|
||||
- Nextcloud: https://localdev.unboundedpress.org/cloud/
|
||||
- Forgejo: https://localdev.unboundedpress.org/code/
|
||||
|
||||
## Maintenance
|
||||
|
||||
### Bot Blocker Updates
|
||||
|
||||
The nginx-ultimate-bad-bot-blocker updates automatically via cron (monthly on the 1st at 3 AM).
|
||||
|
||||
Manual update:
|
||||
```bash
|
||||
docker exec nginx-proxy update-ngxblocker
|
||||
```
|
||||
|
||||
### Backup Nextcloud
|
||||
|
||||
```bash
|
||||
# Database backup
|
||||
docker exec mysql-nextcloud mysqldump -u root -p${PASSWORD} nextcloud > backup_nextcloud_db_$(date +%Y%m%d).sql
|
||||
|
||||
# Files backup (run on host)
|
||||
tar -czf nextcloud_backup_$(date +%Y%m%d).tar.gz nextcloud/html/data/
|
||||
```
|
||||
|
||||
### Backup Forgejo
|
||||
|
||||
```bash
|
||||
# Database backup
|
||||
docker exec mysql-forgejo mysqldump -u root -p${PASSWORD} forgejo > backup_forgejo_db_$(date +%Y%m%d).sql
|
||||
|
||||
# Files backup (run on host)
|
||||
tar -czf forgejo_backup_$(date +%Y%m%d).tar.gz forgejo/
|
||||
```
|
||||
|
||||
### Update Images
|
||||
|
||||
```bash
|
||||
# Pull latest images
|
||||
docker compose pull
|
||||
|
||||
# Restart services with new images
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
### View Logs
|
||||
|
||||
```bash
|
||||
# All services
|
||||
docker compose logs -f
|
||||
|
||||
# Specific service
|
||||
docker compose logs -f nginx-proxy
|
||||
docker compose logs -f nextcloud
|
||||
docker compose logs -f forgejo
|
||||
```
|
||||
|
||||
## Directory Structure
|
||||
|
||||
⚠️ **Important**: The `portfolio/` directory contains the majority of my life's work. Ensure backups are current before making any changes.
|
||||
|
||||
```
|
||||
.
|
||||
.
|
||||
├── docker-compose.yml # Main compose file
|
||||
├── .env # Environment variables (not in repo)
|
||||
├── .env_template # Template for .env
|
||||
├── nginx/
|
||||
│ ├── Dockerfile # nginx-proxy build with bot blocker
|
||||
│ ├── certs/ # SSL certificates
|
||||
│ ├── conf.d/ # nginx configuration
|
||||
│ ├── vhost.d/ # Virtual host configs
|
||||
│ ├── bots.d/ # Bot blocker rules
|
||||
│ └── crontab # Cron for bot blocker updates
|
||||
├── portfolio/
|
||||
│ ├── Dockerfile # Multi-stage production build
|
||||
│ └── ...
|
||||
├── nextcloud/
|
||||
│ ├── html/ # Nextcloud data
|
||||
│ └── mysql/ # Nextcloud database
|
||||
├── forgejo/
|
||||
│ └── ... # Forgejo data
|
||||
└── redis/
|
||||
└── ... # Redis data
|
||||
```
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Nextcloud Login Issues
|
||||
|
||||
If login redirects back to login page:
|
||||
1. Clear browser cookies
|
||||
2. Check trusted_domains in config
|
||||
3. Ensure HTTPS is properly configured
|
||||
|
||||
```bash
|
||||
# Check trusted domains
|
||||
docker exec nextcloud occ config:system:get trusted_domains
|
||||
|
||||
# Add domain if needed
|
||||
docker exec nextcloud occ config:system:set trusted_domains 4 --value="unboundedpress.org"
|
||||
```
|
||||
|
||||
### Collabora Not Opening Documents
|
||||
|
||||
1. Verify public_wopi_url is set correctly:
|
||||
```bash
|
||||
docker exec nextcloud occ config:app:get richdocuments public_wopi_url
|
||||
```
|
||||
|
||||
2. Check nginx config for /collab/ routing:
|
||||
```bash
|
||||
docker exec nginx-proxy cat /etc/nginx/vhost.d/unboundedpress.org | grep -A 5 "location /collab"
|
||||
```
|
||||
|
||||
3. Check Collabora logs:
|
||||
```bash
|
||||
docker logs collabora
|
||||
```
|
||||
|
||||
### SSL Certificate Issues
|
||||
|
||||
1. Check acme-companion logs:
|
||||
```bash
|
||||
docker logs nginx-proxy-acme
|
||||
```
|
||||
|
||||
2. Verify ports 80/443 are open:
|
||||
```bash
|
||||
sudo ufw status
|
||||
# or
|
||||
sudo iptables -L -n
|
||||
```
|
||||
|
||||
3. Check certificate files exist:
|
||||
```bash
|
||||
ls -la nginx/certs/
|
||||
```
|
||||
|
||||
### Container Won't Start
|
||||
|
||||
1. Check logs for errors:
|
||||
```bash
|
||||
docker compose logs [service-name]
|
||||
```
|
||||
|
||||
2. Verify .env file exists and has correct values
|
||||
|
||||
3. Check port conflicts:
|
||||
```bash
|
||||
sudo netstat -tlnp | grep ':80\|:443'
|
||||
```
|
||||
|
||||
## Architecture
|
||||
|
||||
```
|
||||
Internet
|
||||
│
|
||||
▼
|
||||
nginx-proxy (port 80/443)
|
||||
│
|
||||
├── portfolio ─────► :5000
|
||||
│
|
||||
├── nextcloud ──────────► :80 → /cloud/
|
||||
│ ├── mysql-nextcloud
|
||||
│ └── redis
|
||||
│
|
||||
├── forgejo ────────────► :4000 → /code/
|
||||
│ └── mysql-forgejo
|
||||
│
|
||||
└── collabora ──────────► :9980 → /collab/
|
||||
```
|
||||
|
||||
## Credits
|
||||
|
||||
- [nginx-proxy](https://github.com/nginx-proxy/nginx-proxy)
|
||||
- [acme-companion](https://github.com/nginx-proxy/acme-companion)
|
||||
- [nginx-ultimate-bad-bot-blocker](https://github.com/mitchellkrogza/nginx-ultimate-bad-bot-blocker)
|
||||
- [Collabora](https://www.collaboraoffice.com/)
|
||||
- [Forgejo](https://forgejo.org/)
|
||||
- [Nextcloud](https://nextcloud.com/)
|
||||
- [Redis](https://redis.io/)
|
||||
42
README.txt
|
|
@ -1,42 +0,0 @@
|
|||
# unboundedpress
|
||||
|
||||
Repo for my personal website.
|
||||
|
||||
If you have the keys to my castle, you should be able to archive the entire top level folder, move everything to another server and just deploy with:
|
||||
docker-compose up -d
|
||||
|
||||
But that is being pretty optimistic.
|
||||
|
||||
In the docker-compose.yml file, there are detailed notes of non-automatic steps that need to be taken, especially for deploying from scratch.
|
||||
|
||||
Here are some useful tips.
|
||||
|
||||
The current server is running on ubuntu server 22.04/
|
||||
|
||||
# Running on docker. Here are some install tips.
|
||||
# https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-ubuntu-22-04
|
||||
# https://www.digitalocean.com/community/tutorials/how-to-install-docker-compose-on-ubuntu-22-04
|
||||
|
||||
# There are two .env files that are the same and go at the top level folder and again in portfolio/src. Templates are provided.
|
||||
|
||||
# Here is a list of the services
|
||||
# Main components
|
||||
porfolio - node server and frontend for my porfilio that uses mongo backend
|
||||
mongo - houses the data of my portfolio
|
||||
restheart - api to feed data from mongo to portfolio (though there are some end points built into the node app)
|
||||
gitea - my code repository
|
||||
mysql-gitea - databse for gitea
|
||||
nginx-proxy - reverse proxy for everything
|
||||
acme-companion - lets encrypt certificate manager
|
||||
|
||||
# Extra components
|
||||
nextcloud
|
||||
mysql-nextcloud
|
||||
|
||||
# Here are some useful tips for mongo
|
||||
# dump and restore example:
|
||||
# this is done through the container: docker exec it mongo sh
|
||||
mongodump --host localhost --port 27017 -d portfolio -o /db_backups/db_dump_2025_02_04 -u username -p password --authenticationDatabase admin
|
||||
mongorestore --host localhost --port 27017 -d portfolio -u username -p password --authenticationDatabase admin /db_backups/db_dump_2025_02_04/portfolio
|
||||
# here is an example of a file upload through restheart:
|
||||
curl -v -u user:pass -X POST -F 'properties={"filename":"filename"}' -F "file=@filepath_here" https://unboundedpress.org/api/scores.files
|
||||
|
|
@ -1,34 +1,28 @@
|
|||
version: '3'
|
||||
services:
|
||||
|
||||
nginx-proxy:
|
||||
build: ./nginx
|
||||
# TODO: Note that this is built with ultimate-bad-bot-blocker scripts
|
||||
# that currently need to be run manually to update
|
||||
# (with the possibility that the bots.d folder has to be blown away first - not sure)
|
||||
# Eventually, this needs to be checked and put on a chron job
|
||||
# docker exec -t nginx-proxy bash
|
||||
# /usr/local/sbin/setup-ngxblocker -x
|
||||
# /usr/local/sbin/update-ngxblocker -x email
|
||||
container_name: nginx-proxy
|
||||
networks:
|
||||
default:
|
||||
ipv4_address: 172.18.0.5
|
||||
ports:
|
||||
- "80:80"
|
||||
- "443:443"
|
||||
restart: always
|
||||
#environment:
|
||||
# - HTTPS_METHOD=noredirect
|
||||
# - HTTPS_METHOD=noredirect
|
||||
volumes:
|
||||
- ./nginx/conf.d:/etc/nginx/conf.d
|
||||
- ./nginx/vhost.d:/etc/nginx/vhost.d
|
||||
- ./nginx/bots.d:/etc/nginx/bots.d
|
||||
- ./nginx/certs:/etc/nginx/certs:rw
|
||||
- nginx:/usr/share/nginx/html
|
||||
#- nginx:/app/nginx.tmpl
|
||||
- /var/run/docker.sock:/tmp/docker.sock:ro
|
||||
#- ./nginx/htpasswd:/etc/nginx/htpasswd
|
||||
- ./nginx/crontab:/etc/crontabs/root:ro
|
||||
|
||||
acme-companion:
|
||||
image: nginxproxy/acme-companion:2.2
|
||||
image: nginxproxy/acme-companion:2.6.2
|
||||
container_name: nginx-proxy-acme
|
||||
environment:
|
||||
- DEFAULT_EMAIL=${EMAIL}
|
||||
|
|
@ -48,208 +42,41 @@ services:
|
|||
restart: always
|
||||
|
||||
portfolio:
|
||||
# TODO: This will eventually be rewritten with something like VUE
|
||||
container_name: portfolio
|
||||
build: ./portfolio
|
||||
# To just server running the following command
|
||||
#command: bash -c "npm run serve"
|
||||
# To reinstall the packages run the following command instead
|
||||
command: bash -c "npm install && npm run serve"
|
||||
build:
|
||||
context: ./portfolio
|
||||
args:
|
||||
- PASSWORD=${PASSWORD}
|
||||
volumes:
|
||||
- portfolio:/src/node_modules
|
||||
- ./portfolio/src:/src
|
||||
environment:
|
||||
- VIRTUAL_HOST=${DOMAIN},www.${DOMAIN}
|
||||
#- VIRTUAL_PATH=/
|
||||
# For subdirectory baseURL needs to be set in app.js for static files and routes
|
||||
- VIRTUAL_PATH=/legacy
|
||||
- VIRTUAL_DEST=/legacy
|
||||
- VIRTUAL_PORT=3000
|
||||
#- LETSENCRYPT_HOST=${DOMAIN},www.${DOMAIN},gitea.${DOMAIN} #this last one is for legacy support
|
||||
#- LETSENCRYPT_EMAIL=${EMAIL}
|
||||
ports:
|
||||
- "3000:3000"
|
||||
restart: always
|
||||
depends_on:
|
||||
mongo:
|
||||
condition: service_healthy
|
||||
#restheart:
|
||||
#nginx-proxy:
|
||||
#labels:
|
||||
# com.github.nginx-proxy.nginx-proxy.keepalive: "64"
|
||||
|
||||
portfolio-nuxt:
|
||||
# NOTE: This is the rewrite of the frontend
|
||||
# NOTE: The build process for nuxt seems to require that sharp be reinstalled in the .output folder
|
||||
container_name: portfolio-nuxt
|
||||
build: ./portfolio-nuxt
|
||||
# To rebuild the site and the server run this
|
||||
command: bash -c "npm run build && node .output/server/index.mjs"
|
||||
# To just start the server run this
|
||||
#command: bash -c "node .output/server/index.mjs"
|
||||
# To start the server in dev mode
|
||||
#command: bash -c "npm run dev -o"
|
||||
volumes:
|
||||
- portfolio-nuxt:/src/node_modules
|
||||
- ./portfolio-nuxt:/src
|
||||
- ./portfolio/server/data:/src/server/data
|
||||
environment:
|
||||
- PASSWORD=${PASSWORD}
|
||||
- VIRTUAL_HOST=${DOMAIN},www.${DOMAIN}
|
||||
- VIRTUAL_PATH=/
|
||||
#- VIRTUAL_DEST=/dev
|
||||
# For subdirectory baseURL needs to be set in nuxt config
|
||||
#- VIRTUAL_PATH=/dev
|
||||
#- VIRTUAL_DEST=/dev
|
||||
- VIRTUAL_PORT=5000
|
||||
- LETSENCRYPT_HOST=${DOMAIN},www.${DOMAIN},gitea.${DOMAIN} #this last one is for legacy support
|
||||
- LETSENCRYPT_HOST=${DOMAIN},www.${DOMAIN},gitea.${DOMAIN}
|
||||
- LETSENCRYPT_EMAIL=${EMAIL}
|
||||
ports:
|
||||
- "5000:5000"
|
||||
restart: always
|
||||
depends_on:
|
||||
- restheart
|
||||
- nginx-proxy
|
||||
#labels:
|
||||
# com.github.nginx-proxy.nginx-proxy.keepalive: "64"
|
||||
|
||||
mongo:
|
||||
container_name: mongo
|
||||
# using mongo4 or mongo5 as opposed to mongo:6 for server status in mongo-express and because of bugs
|
||||
# mongo 5 requires avx support so if the machine is not capable of avx support use mongo4
|
||||
# NOTE: mongo 4 shell uses mongo and mongo 5 uses mongosh!
|
||||
# These need to be changed accordingly in the health check and the mongosetup.sh file for the container mongo-init
|
||||
image: mongo:5
|
||||
#image: mongo:4
|
||||
restart: always
|
||||
environment:
|
||||
- MONGO_INITDB_ROOT_USERNAME=${USER}
|
||||
- MONGO_INITDB_ROOT_PASSWORD=${PASSWORD}
|
||||
- MONGO_INITDB_DATABASE=portfolio
|
||||
command: ["--keyFile", "/auth/keyfile", "--replSet", "rs0", "--bind_ip_all"]
|
||||
# NOTE: If starting from scracth, create key for mongo then put it in ./mongo/auth/
|
||||
# openssl rand -base64 756 > keyfile
|
||||
# chmod 600 keyfile
|
||||
# sudo chown 999 keyfile
|
||||
# sudo chgrp 999 keyfile
|
||||
# NOTE: If you tar archive the site and move it without retaining permissions,
|
||||
# you will need to run the last 3 lines on the file to make it work
|
||||
ports:
|
||||
- 27017:27017
|
||||
volumes:
|
||||
- ./portfolio/mongo/data/db:/data/db
|
||||
- ./portfolio/mongo/data/configdb:/data/configdb
|
||||
- ./portfolio/mongo/auth/keyfile:/auth/keyfile
|
||||
- ./portfolio/mongo/db_backups:/db_backups
|
||||
healthcheck:
|
||||
# mongo 5
|
||||
test: echo 'rs.status().ok' | mongosh --host mongo:27017 -u $${MONGO_INITDB_ROOT_USERNAME} -p $${MONGO_INITDB_ROOT_PASSWORD} --quiet | grep 1
|
||||
# mongo 4
|
||||
#test: echo 'rs.status().ok' | mongo --host mongo:27017 -u $${MONGO_INITDB_ROOT_USERNAME} -p $${MONGO_INITDB_ROOT_PASSWORD} --quiet | grep 1
|
||||
interval: 15s
|
||||
start_period: 20s
|
||||
|
||||
mongo-init:
|
||||
container_name: mongo-init
|
||||
# using mongo5 as opposed to mongo:6 for server status in mongo-express and because of bugs
|
||||
image: mongo:5
|
||||
restart: on-failure
|
||||
volumes:
|
||||
# mongo 5
|
||||
- ./portfolio/mongo/scripts/mongo5setup.sh:/scripts/mongo5setup.sh
|
||||
# mongo 4
|
||||
#- ./portfolio/mongo/scripts/mongo4setup.sh:/scripts/mongo4setup.sh
|
||||
# these two are necessary otherwise they get created again as anonymous volumes
|
||||
- ./portfolio/mongo/data/db:/data/db
|
||||
- ./portfolio/mongo/data/configdb:/data/configdb
|
||||
# mongo 5
|
||||
entrypoint: ["bash", "/scripts/mongo5setup.sh" ]
|
||||
# mongo 4
|
||||
#entrypoint: ["bash", "/scripts/mongo4setup.sh" ]
|
||||
environment:
|
||||
- MONGO_INITDB_ROOT_USERNAME=${USER}
|
||||
- MONGO_INITDB_ROOT_PASSWORD=${PASSWORD}
|
||||
depends_on:
|
||||
mongo:
|
||||
nginx-proxy:
|
||||
condition: service_started
|
||||
|
||||
mongo-express:
|
||||
# using mongo-express:0.54 as opposed to mongo-express:1 for server status and because of bugs
|
||||
image: mongo-express:0.54
|
||||
container_name: mongo-express
|
||||
restart: always
|
||||
environment:
|
||||
- ME_CONFIG_MONGODB_URL=mongodb://${USER}:${PASSWORD}@mongo:27017/?replicaSet=rs0
|
||||
- ME_CONFIG_MONGODB_ADMINUSERNAME=${USER}
|
||||
- ME_CONFIG_MONGODB_ADMINPASSWORD=${PASSWORD}
|
||||
- ME_CONFIG_MONGODB_ENABLE_ADMIN=true
|
||||
- ME_CONFIG_BASICAUTH_USERNAME=${USER}
|
||||
- ME_CONFIG_BASICAUTH_PASSWORD=${PASSWORD}
|
||||
- ME_CONFIG_SITE_BASEURL=/admin
|
||||
- ME_CONFIG_SITE_GRIDFS_ENABLED=true
|
||||
- VIRTUAL_HOST=${DOMAIN},admin.${DOMAIN}
|
||||
- VIRTUAL_PATH=/admin/
|
||||
- VIRTUAL_PORT=8081
|
||||
#volumes:
|
||||
# - ./nginx/certs:/etc/nginx/certs:ro
|
||||
depends_on:
|
||||
mongo:
|
||||
condition: service_healthy
|
||||
ports:
|
||||
- "8081:8081"
|
||||
|
||||
restheart:
|
||||
image: softinstigate/restheart:7
|
||||
container_name: restheart
|
||||
# NOTE: the api_admin endpoint only works locally
|
||||
environment:
|
||||
- RHO=
|
||||
/mongo/mongo-mounts[1]->{'where':'/api','what':'portfolio'};
|
||||
/mongo/mongo-mounts[2]->{'where':'/api_admin','what':'restheart'};
|
||||
/mclient/connection-string->'mongodb://${USER}:${PASSWORD}@mongo:27017/?replicaSet=rs0';
|
||||
/http-listener/host->'0.0.0.0';
|
||||
# NOTE: If starting from scratch use must set admin password!
|
||||
# curl -u admin:secret -X PATCH localhost:8080/api_admin/users/admin -H "Content-Type: application/json" -d '{ "password": "my-strong-password" }'
|
||||
# NOTE: An ACL entry to allow unaunthenticated users to perform gets must be added
|
||||
# For now, it was added to the restheart db manually
|
||||
# by adding the following to the acl collection with curl or using mongo-express
|
||||
# {
|
||||
# predicate: 'path-prefix[/api] and method[GET]',
|
||||
# roles: ['$unauthenticated'],
|
||||
# priority: 50
|
||||
# }
|
||||
# This does not seem to do anything but should somehow use a file for the realm creations
|
||||
#/fileRealmAuthenticator/users[userid='admin']/password->'${PASSWORD}';
|
||||
- VIRTUAL_HOST=${DOMAIN},www.${DOMAIN}
|
||||
- VIRTUAL_PATH=/api/
|
||||
- VIRTUAL_DEST=/api/
|
||||
- VIRTUAL_PORT=8080
|
||||
depends_on:
|
||||
mongo:
|
||||
condition: service_healthy
|
||||
#command: ["--envFile", "/opt/restheart/etc/default.properties"]
|
||||
ports:
|
||||
- "8080:8080"
|
||||
restart: always
|
||||
#volumes:
|
||||
# - ./restheart:/opt/restheart/etc:ro
|
||||
|
||||
gitea:
|
||||
image: gitea/gitea:1
|
||||
container_name: gitea
|
||||
forgejo:
|
||||
image: codeberg.org/forgejo/forgejo:7
|
||||
container_name: forgejo
|
||||
environment:
|
||||
- USER_UID=1000
|
||||
- USER_GID=1000
|
||||
- GITEA__database__DB_TYPE=mysql
|
||||
- GITEA__database__HOST=mysql-gitea
|
||||
- GITEA__database__NAME=gitea
|
||||
- GITEA__database__USER=${USER}
|
||||
- GITEA__database__PASSWD=${PASSWORD}
|
||||
- GITEA__server__LANDING_PAGE=/${USER}
|
||||
- GITEA__attachment__MAX_SIZE=5000
|
||||
#- GITEA__repository.upload__FILE_MAX_SIZE=5000
|
||||
# NOTE: This next line can be commented out if you want to run the wizard locally
|
||||
# But it needs to be set properly as the base url to work remotely
|
||||
# no matter how you run the wizard
|
||||
- GITEA__server__ROOT_URL=https://${DOMAIN}/code/
|
||||
- FORGEJO__database__DB_TYPE=mysql
|
||||
- FORGEJO__database__HOST=mysql-forgejo
|
||||
- FORGEJO__database__NAME=forgejo
|
||||
- FORGEJO__database__USER=${USER}
|
||||
- FORGEJO__database__PASSWD=${PASSWORD}
|
||||
- FORGEJO__server__LANDING_PAGE=/${USER}
|
||||
- FORGEJO__attachment__MAX_SIZE=5000
|
||||
- FORGEJO__server__ROOT_URL=https://${DOMAIN}/code/
|
||||
- HTTP_PORT=4000
|
||||
- LFS_START_SERVER=true
|
||||
- DISABLE_REGISTRATION=true
|
||||
|
|
@ -260,19 +87,16 @@ services:
|
|||
- VIRTUAL_DEST=/
|
||||
restart: always
|
||||
volumes:
|
||||
- ./gitea:/data
|
||||
- ./forgejo:/data
|
||||
- /etc/timezone:/etc/timezone:ro
|
||||
- /etc/localtime:/etc/localtime:ro
|
||||
ports:
|
||||
- "4000:4000"
|
||||
- "222:22"
|
||||
depends_on:
|
||||
mysql-gitea:
|
||||
mysql-forgejo:
|
||||
condition: service_healthy
|
||||
|
||||
mysql-gitea:
|
||||
image: mariadb:10
|
||||
container_name: mysql-gitea
|
||||
mysql-forgejo:
|
||||
image: mariadb:10.11
|
||||
container_name: mysql-forgejo
|
||||
restart: always
|
||||
environment:
|
||||
- MYSQL_ROOT_PASSWORD=${PASSWORD}
|
||||
|
|
@ -280,21 +104,17 @@ services:
|
|||
- MYSQL_DATABASE=gitea
|
||||
- MYSQL_USER=${USER}
|
||||
volumes:
|
||||
- ./gitea/mysql:/var/lib/mysql
|
||||
#- ./mysql_gitea/etc:/etc/mysql/conf.d
|
||||
#- ./mysql_gitea/init:/docker-entrypoint-initdb.d
|
||||
- ./forgejo/mysql:/var/lib/mysql
|
||||
healthcheck:
|
||||
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
|
||||
interval: 15s
|
||||
start_period: 20s
|
||||
|
||||
nextcloud:
|
||||
image: nextcloud:25
|
||||
image: nextcloud:31-apache
|
||||
container_name: nextcloud
|
||||
restart: always
|
||||
volumes:
|
||||
#- ./nextcloud/data:/var/www/html/data
|
||||
#- nextcloud:/var/www/html
|
||||
- ./nextcloud/html:/var/www/html
|
||||
environment:
|
||||
- MYSQL_DATABASE=nextcloud
|
||||
|
|
@ -304,40 +124,43 @@ services:
|
|||
- NEXTCLOUD_ADMIN_USER=${USER}
|
||||
- NEXTCLOUD_ADMIN_PASSWORD=${PASSWORD}
|
||||
- NEXTCLOUD_TRUSTED_DOMAINS=${DOMAIN} www.${DOMAIN}
|
||||
#- NEXTCLOUD_INIT_LOCK=true
|
||||
- NEXTCLOUD_EXTRA_APPS=calendar,richdocuments
|
||||
- APACHE_DISABLE_REWRITE_IP=1
|
||||
- TRUSTED_PROXIES=nginx-proxy
|
||||
- REDIS_HOST=redis
|
||||
- OVERWRITEHOST=${DOMAIN}
|
||||
- OVERWRITEWEBROOT=/cloud
|
||||
- OVERWRITEPROTOCOL=https
|
||||
#- OVERWRITECLIURL=http://localhost/
|
||||
- OVERWRITECLIURL=https://unboundedpress.org
|
||||
# NOTE: These configurations above make it work with the subdirectory
|
||||
# but you cannot set VIRTUAL_PORT
|
||||
# for reasons I have no idea
|
||||
- VIRTUAL_HOST=${DOMAIN},www.${DOMAIN}
|
||||
- VIRTUAL_PATH=/cloud/
|
||||
- VIRTUAL_DEST=/
|
||||
# TODO: add redis and chron
|
||||
#- REDIS_HOST=redis
|
||||
extra_hosts:
|
||||
- "${DOMAIN}:172.18.0.5"
|
||||
depends_on:
|
||||
mysql-nextcloud:
|
||||
condition: service_healthy
|
||||
#redis:
|
||||
ports:
|
||||
- 8888:80
|
||||
redis:
|
||||
condition: service_started
|
||||
|
||||
collabora:
|
||||
image: collabora/code:22.05.14.3.1
|
||||
image: collabora/code:latest
|
||||
container_name: collabora
|
||||
depends_on:
|
||||
- nextcloud
|
||||
nginx-proxy:
|
||||
condition: service_started
|
||||
nextcloud:
|
||||
condition: service_started
|
||||
cap_add:
|
||||
- MKNOD
|
||||
extra_hosts:
|
||||
- "${DOMAIN}:172.18.0.5"
|
||||
environment:
|
||||
- username=${USER}
|
||||
- password=${PASSWORD}
|
||||
- domain=${DOMAIN}
|
||||
- server_name=${DOMAIN}
|
||||
- aliasgroup1=https://${DOMAIN}:443
|
||||
- VIRTUAL_HOST=${DOMAIN},www.${DOMAIN}
|
||||
- VIRTUAL_PATH=/collab/
|
||||
- VIRTUAL_DEST=/
|
||||
|
|
@ -347,23 +170,25 @@ services:
|
|||
- extra_params=--o:ssl.enable=false --o:ssl.termination=true
|
||||
# NOTE: The file nginx/vhosts.d/unboundedpress.org handles
|
||||
# routing for collabora on production only
|
||||
ports:
|
||||
- 9980:9980
|
||||
|
||||
cron-nextcloud:
|
||||
image: nextcloud:25
|
||||
image: nextcloud:31-apache
|
||||
container_name: cron-nextcloud
|
||||
restart: always
|
||||
volumes:
|
||||
- ./nextcloud/html:/var/www/html
|
||||
entrypoint: /cron.sh
|
||||
environment:
|
||||
- NEXTCLOUD_EXTRA_APPS=calendar,richdocuments
|
||||
- REDIS_HOST=redis
|
||||
depends_on:
|
||||
mysql-nextcloud:
|
||||
condition: service_healthy
|
||||
#redis:
|
||||
redis:
|
||||
condition: service_started
|
||||
|
||||
mysql-nextcloud:
|
||||
image: mariadb:10
|
||||
image: mariadb:10.11
|
||||
container_name: mysql-nextcloud
|
||||
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
|
||||
restart: always
|
||||
|
|
@ -379,9 +204,26 @@ services:
|
|||
interval: 15s
|
||||
start_period: 20s
|
||||
|
||||
redis:
|
||||
image: redis:alpine
|
||||
container_name: redis
|
||||
restart: always
|
||||
volumes:
|
||||
- ./redis:/data
|
||||
healthcheck:
|
||||
test: ["CMD", "redis-cli", "ping"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
|
||||
volumes:
|
||||
nginx:
|
||||
#nextcloud:
|
||||
acme:
|
||||
portfolio:
|
||||
portfolio-nuxt:
|
||||
|
||||
networks:
|
||||
default:
|
||||
ipam:
|
||||
driver: default
|
||||
config:
|
||||
- subnet: 172.18.0.0/16
|
||||
|
|
|
|||
|
|
@ -1,4 +1,6 @@
|
|||
FROM nginxproxy/nginx-proxy:1.2
|
||||
FROM nginxproxy/nginx-proxy:1.9.0
|
||||
|
||||
RUN apt-get update && apt-get install -y wget cron && rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# Install curl
|
||||
# RUN apk add --no-cache curl
|
||||
|
|
|
|||
12
nginx/bots.d/blacklist-domains.conf
Normal file
|
|
@ -0,0 +1,12 @@
|
|||
# DEPRECATED
|
||||
|
||||
# This file is no longer used
|
||||
|
||||
# ********************************************
|
||||
# ALL Blacklisting AND Whitelisting is done in
|
||||
# ********************************************
|
||||
|
||||
# include /etc/nginx/bots.d/whitelist-domains.conf; < whitelisting of domains (can also blacklist)
|
||||
# include /etc/nginx/bots.d/custom-bad-referrers.conf; < whitelisting AND blacklisting of domains and referrer domains
|
||||
|
||||
# DEPRECATED
|
||||
|
|
@ -5,8 +5,8 @@
|
|||
|
||||
# VERSION INFORMATION #
|
||||
#----------------------
|
||||
# Version: V4.2022.03
|
||||
# Updated: 2022-03-25
|
||||
# Version: V4.2024.01
|
||||
# Updated: 2024-04-23
|
||||
#----------------------
|
||||
# VERSION INFORMATION #
|
||||
|
||||
|
|
@ -53,12 +53,27 @@
|
|||
# "~*(?:\b)someverygooduseragentname2(?:\b)" 0;
|
||||
# "~*(?:\b)some\-very\-good\-useragentname2(?:\b)" 0;
|
||||
|
||||
# ----------------------
|
||||
# RATE LIMITING EXAMPLES
|
||||
# ----------------------
|
||||
# "~*(?:\b)someverybaduseragentname1(?:\b)" 2;
|
||||
# "~*(?:\b)someverybaduseragentname2(?:\b)" 2;
|
||||
# "~*(?:\b)some\-very\-bad\-useragentname3(?:\b)" 2;
|
||||
|
||||
# ---------------------
|
||||
# BLACKLISTING EXAMPLES
|
||||
# ---------------------
|
||||
# "~*(?:\b)someverybaduseragentname1(?:\b)" 3;
|
||||
# "~*(?:\b)someverybaduseragentname2(?:\b)" 3;
|
||||
# "~*(?:\b)some\-very\-bad\-useragentname2(?:\b)" 3;
|
||||
# "~*(?:\b)someverybaduseragentname4(?:\b)" 3;
|
||||
# "~*(?:\b)someverybaduseragentname5(?:\b)" 3;
|
||||
# "~*(?:\b)some\-very\-bad\-useragentname6(?:\b)" 3;
|
||||
|
||||
# ----------------------------
|
||||
# SUPER RATE LIMITING EXAMPLES
|
||||
# ----------------------------
|
||||
# "~*(?:\b)someverybaduseragentname7(?:\b)" 4;
|
||||
# "~*(?:\b)someverybaduseragentname8(?:\b)" 4;
|
||||
# "~*(?:\b)some\-very\-bad\-useragentname9(?:\b)" 4;
|
||||
|
||||
|
||||
# Here are some default things I block on my own server, these appear in various types of injection attacks
|
||||
# You can disable them if you have problems or don't agree by switching thir value to 0 or moving them into the whitelist section first and then making their value 0
|
||||
|
|
|
|||
|
|
@ -2,8 +2,8 @@
|
|||
|
||||
# VERSION INFORMATION #
|
||||
#----------------------
|
||||
# Version: V4.2019.04
|
||||
# Updated: 2019-06-28
|
||||
# Version: V5.2024.04
|
||||
# Updated: 2024-04-30
|
||||
#----------------------
|
||||
# VERSION INFORMATION #
|
||||
|
||||
|
|
@ -49,15 +49,19 @@
|
|||
# BLOCK BAD BOTS
|
||||
# --------------
|
||||
|
||||
# Section bot_1 Unused
|
||||
#limit_conn bot1_connlimit 100;
|
||||
#limit_req zone=bot1_reqlimitip burst=50;
|
||||
|
||||
limit_conn bot2_connlimit 10;
|
||||
limit_req zone=bot2_reqlimitip burst=10;
|
||||
|
||||
# Uncomment below lines for super rate limiting feature
|
||||
#limit_conn bot4_connlimit 10;
|
||||
#limit_req zone=bot4_reqlimitip burst=10;
|
||||
|
||||
if ($bad_bot = '3') {
|
||||
return 444; # << Response Code Issued May Be Modified to Whatever you Choose ie. 404 but 444 wastes less of Nginxs time
|
||||
}
|
||||
return 444;
|
||||
}
|
||||
|
||||
# ---------------------
|
||||
# BLOCK BAD REFER WORDS
|
||||
|
|
|
|||
1
nginx/crontab
Normal file
|
|
@ -0,0 +1 @@
|
|||
0 3 1 * * /usr/local/sbin/update-ngxblocker
|
||||
|
|
@ -1,12 +1,2 @@
|
|||
## Start of configuration add by letsencrypt container
|
||||
location ^~ /.well-known/acme-challenge/ {
|
||||
auth_basic off;
|
||||
auth_request off;
|
||||
allow all;
|
||||
root /usr/share/nginx/html;
|
||||
try_files $uri =404;
|
||||
break;
|
||||
}
|
||||
## End of configuration add by letsencrypt container
|
||||
include /etc/nginx/bots.d/ddos.conf;
|
||||
include /etc/nginx/bots.d/blockbots.conf;
|
||||
|
|
|
|||
|
|
@ -1,13 +1,3 @@
|
|||
## Start of configuration add by letsencrypt container
|
||||
location ^~ /.well-known/acme-challenge/ {
|
||||
auth_basic off;
|
||||
auth_request off;
|
||||
allow all;
|
||||
root /usr/share/nginx/html;
|
||||
try_files $uri =404;
|
||||
break;
|
||||
}
|
||||
## End of configuration add by letsencrypt container
|
||||
# This is needed for legacy support
|
||||
location = / {
|
||||
rewrite ^ http://gitea.unboundedpress.org/code/mwinter/ redirect;
|
||||
|
|
|
|||
58
nginx/vhost.d/localdev.unboundedpress.org
Normal file
|
|
@ -0,0 +1,58 @@
|
|||
# CSP headers for Nextcloud - scoped to /cloud/ only
|
||||
location ^~ /cloud {
|
||||
proxy_pass http://nextcloud:80;
|
||||
proxy_hide_header Content-Security-Policy;
|
||||
proxy_hide_header X-Content-Security-Policy;
|
||||
proxy_hide_header X-WebKit-CSP;
|
||||
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; frame-src 'self' https://localdev.unboundedpress.org https://localdev.unboundedpress.org/collab; img-src 'self' data: blob:; font-src 'self' data:; connect-src 'self' https://localdev.unboundedpress.org wss://localdev.unboundedpress.org; form-action 'self'; object-src 'none'; base-uri 'self'" always;
|
||||
}
|
||||
|
||||
# Collabora routing for localdev.unboundedpress.org
|
||||
|
||||
# Redirect /collab to Collabora
|
||||
location ^~ /collab {
|
||||
proxy_pass http://collabora:9980;
|
||||
proxy_set_header Host $http_host;
|
||||
}
|
||||
|
||||
# static files
|
||||
location ^~ /browser {
|
||||
proxy_pass http://collabora:9980;
|
||||
proxy_set_header Host $http_host;
|
||||
}
|
||||
|
||||
# WOPI discovery URL
|
||||
location ^~ /hosting/discovery {
|
||||
proxy_pass http://collabora:9980;
|
||||
proxy_set_header Host $http_host;
|
||||
}
|
||||
|
||||
# Capabilities
|
||||
location ^~ /hosting/capabilities {
|
||||
proxy_pass http://collabora:9980;
|
||||
proxy_set_header Host $http_host;
|
||||
}
|
||||
|
||||
# main websocket
|
||||
location ~ ^/cool/(.*)/ws$ {
|
||||
proxy_pass http://collabora:9980;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_read_timeout 36000s;
|
||||
}
|
||||
|
||||
# download, presentation and image upload
|
||||
location ~ ^/(c|l)ool {
|
||||
proxy_pass http://collabora:9980;
|
||||
proxy_set_header Host $http_host;
|
||||
}
|
||||
|
||||
# Admin Console websocket
|
||||
location ^~ /cool/adminws {
|
||||
proxy_pass http://collabora:9980;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host $http_host;
|
||||
proxy_read_timeout 36000s;
|
||||
}
|
||||
|
|
@ -1,46 +1,41 @@
|
|||
## Start of configuration add by letsencrypt container
|
||||
location ^~ /.well-known/acme-challenge/ {
|
||||
auth_basic off;
|
||||
auth_request off;
|
||||
allow all;
|
||||
root /usr/share/nginx/html;
|
||||
try_files $uri =404;
|
||||
break;
|
||||
}
|
||||
## End of configuration add by letsencrypt container
|
||||
|
||||
# This is to set the content type to prevent downloading until I actually implement a proper pdf viewer
|
||||
|
||||
location ~ ^/api/(scores|pubs)(.*)/binary$ {
|
||||
proxy_pass http://unboundedpress.org-357322ae39f93f572e23cd9edd3307e2ac5a321f;
|
||||
# types { } default_type application/pdf;
|
||||
proxy_hide_header Content-Type;
|
||||
add_header Content-Type "application/pdf";
|
||||
# CSP headers for Nextcloud - scoped to /cloud/ only
|
||||
location ^~ /cloud {
|
||||
proxy_pass http://nextcloud:80;
|
||||
proxy_hide_header Content-Security-Policy;
|
||||
proxy_hide_header X-Content-Security-Policy;
|
||||
proxy_hide_header X-WebKit-CSP;
|
||||
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval'; style-src 'self' 'unsafe-inline'; frame-src 'self' https://unboundedpress.org https://unboundedpress.org/collab; img-src 'self' data: blob:; font-src 'self' data:; connect-src 'self' https://unboundedpress.org wss://unboundedpress.org; form-action 'self'; object-src 'none'; base-uri 'self'" always;
|
||||
}
|
||||
|
||||
# The following are all for collabora routing
|
||||
# Collabora routing for unboundedpress.org
|
||||
|
||||
# Redirect /collab to Collabora
|
||||
location ^~ /collab {
|
||||
proxy_pass http://collabora:9980;
|
||||
proxy_set_header Host $http_host;
|
||||
}
|
||||
|
||||
# static files
|
||||
location ^~ /browser {
|
||||
proxy_pass http://unboundedpress.org-cd15914db06db1d6722abd3bcfd0beaa541bbc60;
|
||||
proxy_pass http://collabora:9980;
|
||||
proxy_set_header Host $http_host;
|
||||
}
|
||||
|
||||
# WOPI discovery URL
|
||||
location ^~ /hosting/discovery {
|
||||
proxy_pass http://unboundedpress.org-cd15914db06db1d6722abd3bcfd0beaa541bbc60;
|
||||
proxy_pass http://collabora:9980;
|
||||
proxy_set_header Host $http_host;
|
||||
}
|
||||
|
||||
# Capabilities
|
||||
location ^~ /hosting/capabilities {
|
||||
proxy_pass http://unboundedpress.org-cd15914db06db1d6722abd3bcfd0beaa541bbc60;
|
||||
proxy_pass http://collabora:9980;
|
||||
proxy_set_header Host $http_host;
|
||||
}
|
||||
|
||||
# main websocket
|
||||
location ~ ^/cool/(.*)/ws$ {
|
||||
proxy_pass http://unboundedpress.org-cd15914db06db1d6722abd3bcfd0beaa541bbc60;
|
||||
proxy_pass http://collabora:9980;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host $http_host;
|
||||
|
|
@ -49,13 +44,13 @@ location ~ ^/cool/(.*)/ws$ {
|
|||
|
||||
# download, presentation and image upload
|
||||
location ~ ^/(c|l)ool {
|
||||
proxy_pass http://unboundedpress.org-cd15914db06db1d6722abd3bcfd0beaa541bbc60;
|
||||
proxy_pass http://collabora:9980;
|
||||
proxy_set_header Host $http_host;
|
||||
}
|
||||
|
||||
# Admin Console websocket
|
||||
location ^~ /cool/adminws {
|
||||
proxy_pass http://unboundedpress.org-cd15914db06db1d6722abd3bcfd0beaa541bbc60;
|
||||
proxy_pass http://collabora:9980;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "Upgrade";
|
||||
proxy_set_header Host $http_host;
|
||||
|
|
|
|||
1
portfolio
Submodule
|
|
@ -0,0 +1 @@
|
|||
Subproject commit 96b5dc4ccf0f9ea473c01b01e44e63276c87c7de
|
||||
11
portfolio-nuxt/.gitignore
vendored
|
|
@ -1,11 +0,0 @@
|
|||
node_modules
|
||||
*.log*
|
||||
.nuxt
|
||||
.nitro
|
||||
.cache
|
||||
.output
|
||||
.env
|
||||
dist
|
||||
.DS_Store
|
||||
.fleet
|
||||
.idea
|
||||
|
|
@ -1,2 +0,0 @@
|
|||
shamefully-hoist=true
|
||||
strict-peer-dependencies=false
|
||||
|
|
@ -1,17 +0,0 @@
|
|||
FROM node:18-alpine
|
||||
|
||||
WORKDIR /src
|
||||
|
||||
COPY package*.json ./
|
||||
|
||||
COPY . .
|
||||
|
||||
RUN apk add bash
|
||||
RUN npm install
|
||||
|
||||
ENV NITRO_HOST=0.0.0.0
|
||||
ENV NITRO_PORT=5000
|
||||
|
||||
EXPOSE 5000
|
||||
|
||||
# ENTRYPOINT ["npm", "run", "build", "node", ".output/server/index.mjs"]
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
<template>
|
||||
<div class="bg-white min-w-[800px] min-h-[80vh]">
|
||||
<NuxtLayout>
|
||||
<NuxtPage/>
|
||||
</NuxtLayout>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
useHead({
|
||||
titleTemplate: 'Michael Winter'
|
||||
})
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.page-enter-active,
|
||||
.page-leave-active {
|
||||
transition: all 0.2s;
|
||||
}
|
||||
.page-enter-from,
|
||||
.page-leave-to {
|
||||
opacity: 0;
|
||||
filter: blur(1rem);
|
||||
}
|
||||
</style>
|
||||
|
Before Width: | Height: | Size: 4.1 MiB |
|
|
@ -1,313 +0,0 @@
|
|||
<script>
|
||||
export default {
|
||||
name: 'CollapseTransition',
|
||||
|
||||
props: {
|
||||
name: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: 'collapse',
|
||||
},
|
||||
dimension: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: 'height',
|
||||
validator: (value) => {
|
||||
return ['height', 'width'].includes(value)
|
||||
},
|
||||
},
|
||||
duration: {
|
||||
type: Number,
|
||||
required: false,
|
||||
default: 300,
|
||||
},
|
||||
easing: {
|
||||
type: String,
|
||||
required: false,
|
||||
default: 'ease-in-out',
|
||||
},
|
||||
},
|
||||
|
||||
emits: ['before-appear', 'appear', 'after-appear', 'appear-cancelled', 'before-enter', 'enter', 'after-enter', 'enter-cancelled', 'before-leave', 'leave', 'after-leave', 'leave-cancelled'],
|
||||
|
||||
data() {
|
||||
return {
|
||||
cachedStyles: null,
|
||||
}
|
||||
},
|
||||
|
||||
computed: {
|
||||
transition() {
|
||||
const transitions = []
|
||||
|
||||
Object.keys(this.cachedStyles).forEach((key) => {
|
||||
transitions.push(
|
||||
`${this.convertToCssProperty(key)} ${this.duration}ms ${this.easing}`,
|
||||
)
|
||||
})
|
||||
|
||||
return transitions.join(', ')
|
||||
},
|
||||
},
|
||||
|
||||
watch: {
|
||||
dimension() {
|
||||
this.clearCachedDimensions()
|
||||
},
|
||||
},
|
||||
|
||||
methods: {
|
||||
beforeAppear(el) {
|
||||
// Emit the event to the parent
|
||||
this.$emit('before-appear', el)
|
||||
},
|
||||
|
||||
appear(el) {
|
||||
// Emit the event to the parent
|
||||
this.$emit('appear', el)
|
||||
},
|
||||
|
||||
afterAppear(el) {
|
||||
// Emit the event to the parent
|
||||
this.$emit('after-appear', el)
|
||||
},
|
||||
|
||||
appearCancelled(el) {
|
||||
// Emit the event to the parent
|
||||
this.$emit('appear-cancelled', el)
|
||||
},
|
||||
|
||||
beforeEnter(el) {
|
||||
// Emit the event to the parent
|
||||
this.$emit('before-enter', el)
|
||||
},
|
||||
|
||||
enter(el, done) {
|
||||
// Because width and height may be 'auto',
|
||||
// first detect and cache the dimensions
|
||||
this.detectAndCacheDimensions(el)
|
||||
|
||||
// The order of applying styles is important:
|
||||
// - 1. Set styles for state before transition
|
||||
// - 2. Force repaint
|
||||
// - 3. Add transition style
|
||||
// - 4. Set styles for state after transition
|
||||
// If the order is not right and you open any 2nd level submenu
|
||||
// for the first time, the transition will not work.
|
||||
this.setClosedDimensions(el)
|
||||
this.hideOverflow(el)
|
||||
this.forceRepaint(el)
|
||||
this.setTransition(el)
|
||||
this.setOpenedDimensions(el)
|
||||
|
||||
// Emit the event to the parent
|
||||
this.$emit('enter', el, done)
|
||||
|
||||
// Call done() when the transition ends
|
||||
// to trigger the @after-enter event.
|
||||
setTimeout(done, this.duration)
|
||||
},
|
||||
|
||||
afterEnter(el) {
|
||||
// Clean up inline styles
|
||||
this.unsetOverflow(el)
|
||||
this.unsetTransition(el)
|
||||
this.unsetDimensions(el)
|
||||
this.clearCachedDimensions()
|
||||
|
||||
// Emit the event to the parent
|
||||
this.$emit('after-enter', el)
|
||||
},
|
||||
|
||||
enterCancelled(el) {
|
||||
// Emit the event to the parent
|
||||
this.$emit('enter-cancelled', el)
|
||||
},
|
||||
|
||||
beforeLeave(el) {
|
||||
// Emit the event to the parent
|
||||
this.$emit('before-leave', el)
|
||||
},
|
||||
|
||||
leave(el, done) {
|
||||
// For some reason, @leave triggered when starting
|
||||
// from open state on page load. So for safety,
|
||||
// check if the dimensions have been cached.
|
||||
this.detectAndCacheDimensions(el)
|
||||
|
||||
// The order of applying styles is less important
|
||||
// than in the enter phase, as long as we repaint
|
||||
// before setting the closed dimensions.
|
||||
// But it is probably best to use the same
|
||||
// order as the enter phase.
|
||||
this.setOpenedDimensions(el)
|
||||
this.hideOverflow(el)
|
||||
this.forceRepaint(el)
|
||||
this.setTransition(el)
|
||||
this.setClosedDimensions(el)
|
||||
|
||||
// Emit the event to the parent
|
||||
this.$emit('leave', el, done)
|
||||
|
||||
// Call done() when the transition ends
|
||||
// to trigger the @after-leave event.
|
||||
// This will also cause v-show
|
||||
// to reapply 'display: none'.
|
||||
setTimeout(done, this.duration)
|
||||
},
|
||||
|
||||
afterLeave(el) {
|
||||
// Clean up inline styles
|
||||
this.unsetOverflow(el)
|
||||
this.unsetTransition(el)
|
||||
this.unsetDimensions(el)
|
||||
this.clearCachedDimensions()
|
||||
|
||||
// Emit the event to the parent
|
||||
this.$emit('after-leave', el)
|
||||
},
|
||||
|
||||
leaveCancelled(el) {
|
||||
// Emit the event to the parent
|
||||
this.$emit('leave-cancelled', el)
|
||||
},
|
||||
|
||||
detectAndCacheDimensions(el) {
|
||||
// Cache actual dimensions
|
||||
// only once to void invalid values when
|
||||
// triggering during a transition
|
||||
if (this.cachedStyles)
|
||||
return
|
||||
|
||||
const visibility = el.style.visibility
|
||||
const display = el.style.display
|
||||
|
||||
// Trick to get the width and
|
||||
// height of a hidden element
|
||||
el.style.visibility = 'hidden'
|
||||
el.style.display = ''
|
||||
|
||||
this.cachedStyles = this.detectRelevantDimensions(el)
|
||||
|
||||
// Restore any original styling
|
||||
el.style.visibility = visibility
|
||||
el.style.display = display
|
||||
},
|
||||
|
||||
clearCachedDimensions() {
|
||||
this.cachedStyles = null
|
||||
},
|
||||
|
||||
detectRelevantDimensions(el) {
|
||||
// These properties will be transitioned
|
||||
if (this.dimension === 'height') {
|
||||
return {
|
||||
height: `${el.offsetHeight}px`,
|
||||
paddingTop:
|
||||
el.style.paddingTop || this.getCssValue(el, 'padding-top'),
|
||||
paddingBottom:
|
||||
el.style.paddingBottom || this.getCssValue(el, 'padding-bottom'),
|
||||
}
|
||||
}
|
||||
|
||||
if (this.dimension === 'width') {
|
||||
return {
|
||||
width: `${el.offsetWidth}px`,
|
||||
paddingLeft:
|
||||
el.style.paddingLeft || this.getCssValue(el, 'padding-left'),
|
||||
paddingRight:
|
||||
el.style.paddingRight || this.getCssValue(el, 'padding-right'),
|
||||
}
|
||||
}
|
||||
|
||||
return {}
|
||||
},
|
||||
|
||||
setTransition(el) {
|
||||
el.style.transition = this.transition
|
||||
},
|
||||
|
||||
unsetTransition(el) {
|
||||
el.style.transition = ''
|
||||
},
|
||||
|
||||
hideOverflow(el) {
|
||||
el.style.overflow = 'hidden'
|
||||
},
|
||||
|
||||
unsetOverflow(el) {
|
||||
el.style.overflow = ''
|
||||
},
|
||||
|
||||
setClosedDimensions(el) {
|
||||
Object.keys(this.cachedStyles).forEach((key) => {
|
||||
el.style[key] = '0'
|
||||
})
|
||||
},
|
||||
|
||||
setOpenedDimensions(el) {
|
||||
Object.keys(this.cachedStyles).forEach((key) => {
|
||||
el.style[key] = this.cachedStyles[key]
|
||||
})
|
||||
},
|
||||
|
||||
unsetDimensions(el) {
|
||||
Object.keys(this.cachedStyles).forEach((key) => {
|
||||
el.style[key] = ''
|
||||
})
|
||||
},
|
||||
|
||||
forceRepaint(el) {
|
||||
// Force repaint to make sure the animation is triggered correctly.
|
||||
// Thanks: https://markus.oberlehner.net/blog/transition-to-height-auto-with-vue/
|
||||
// eslint-disable-next-line no-unused-expressions
|
||||
getComputedStyle(el)[this.dimension]
|
||||
},
|
||||
|
||||
getCssValue(el, style) {
|
||||
return getComputedStyle(el, null).getPropertyValue(style)
|
||||
},
|
||||
|
||||
convertToCssProperty(style) {
|
||||
// Example: convert 'paddingTop' to 'padding-top'
|
||||
// Thanks: https://gist.github.com/tan-yuki/3450323
|
||||
const upperChars = style.match(/([A-Z])/g)
|
||||
|
||||
if (!upperChars)
|
||||
return style
|
||||
|
||||
for (let i = 0, n = upperChars.length; i < n; i++) {
|
||||
style = style.replace(
|
||||
new RegExp(upperChars[i]),
|
||||
`-${upperChars[i].toLowerCase()}`,
|
||||
)
|
||||
}
|
||||
|
||||
if (style.slice(0, 1) === '-')
|
||||
style = style.slice(1)
|
||||
|
||||
return style
|
||||
},
|
||||
},
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<transition
|
||||
:name="name"
|
||||
@before-appear="beforeAppear"
|
||||
@appear="appear"
|
||||
@after-appear="afterAppear"
|
||||
@appear-cancelled="appearCancelled"
|
||||
@before-enter="beforeEnter"
|
||||
@enter="enter"
|
||||
@after-enter="afterEnter"
|
||||
@enter-cancelled="enterCancelled"
|
||||
@before-leave="beforeLeave"
|
||||
@leave="leave"
|
||||
@after-leave="afterLeave"
|
||||
@leave-cancelled="leaveCancelled"
|
||||
>
|
||||
<slot />
|
||||
</transition>
|
||||
</template>
|
||||
|
|
@ -1,25 +0,0 @@
|
|||
import type { Story } from '@storybook/vue3'
|
||||
import Collapsible from './Collapsible.vue'
|
||||
|
||||
export default {
|
||||
title: 'Components/Collapsible',
|
||||
component: Collapsible,
|
||||
args: {
|
||||
modelValue: false,
|
||||
title: 'Item',
|
||||
content: 'lorem ipsum dolor sit amet',
|
||||
},
|
||||
}
|
||||
|
||||
const Template: Story = (args, { argTypes }) => ({
|
||||
components: { Collapsible },
|
||||
setup() {
|
||||
return { args, argTypes }
|
||||
},
|
||||
template: `
|
||||
<Collapsible v-bind="args"/>
|
||||
`,
|
||||
})
|
||||
|
||||
export const Default = Template.bind({})
|
||||
Default.args = {}
|
||||
|
|
@ -1,91 +0,0 @@
|
|||
<script lang="ts" setup>
|
||||
import { Disclosure, DisclosureButton, DisclosurePanel } from '@headlessui/vue'
|
||||
import { ref, toRefs, watch } from 'vue'
|
||||
import CollapseTransition from './CollapseTransition.vue'
|
||||
import Modal from '../Modal/Modal.vue';
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
modelValue?: boolean
|
||||
title: string
|
||||
content?: string
|
||||
classes?: {
|
||||
wrapper?: string
|
||||
button?: string
|
||||
title?: string
|
||||
panel?: string
|
||||
}
|
||||
}>(),
|
||||
{
|
||||
modelValue: false,
|
||||
},
|
||||
)
|
||||
|
||||
const emit = defineEmits([
|
||||
'update:modelValue',
|
||||
'change',
|
||||
'toggle',
|
||||
'open',
|
||||
'close',
|
||||
])
|
||||
|
||||
const { modelValue } = toRefs(props)
|
||||
const isOpen = ref(modelValue.value)
|
||||
|
||||
watch(modelValue, (val) => {
|
||||
isOpen.value = val
|
||||
})
|
||||
|
||||
watch(isOpen, (val) => {
|
||||
emit('update:modelValue', val)
|
||||
emit('change', val)
|
||||
|
||||
if (val)
|
||||
emit('open')
|
||||
else
|
||||
emit('close')
|
||||
})
|
||||
|
||||
const toggle = () => {
|
||||
emit('toggle')
|
||||
isOpen.value = !isOpen.value
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<Disclosure v-slot="{ open }" as="div">
|
||||
<DisclosureButton
|
||||
class="
|
||||
flex
|
||||
items-center
|
||||
justify-between
|
||||
w-full
|
||||
text-left
|
||||
rounded-lg
|
||||
focus:outline-none
|
||||
focus-visible:ring
|
||||
focus-visible:ring-blue-50
|
||||
focus-visible:ring-opacity-75
|
||||
"
|
||||
:class="classes?.button"
|
||||
type="button"
|
||||
@click="toggle"
|
||||
>
|
||||
<div class="inline-flex w-full">
|
||||
<Icon
|
||||
name="heroicons:chevron-down"
|
||||
:class="isOpen ? 'transform rotate-180' : ''"
|
||||
class="w-5 h-5"
|
||||
/>
|
||||
<slot name="title"></slot>
|
||||
</div>
|
||||
</DisclosureButton>
|
||||
<CollapseTransition>
|
||||
<div v-show="isOpen">
|
||||
<DisclosurePanel static class="pb-2 text-15" :class="classes?.panel">
|
||||
<slot name="content"></slot>
|
||||
</DisclosurePanel>
|
||||
</div>
|
||||
</CollapseTransition>
|
||||
</Disclosure>
|
||||
</template>
|
||||
|
|
@ -1,38 +0,0 @@
|
|||
import type { Story } from '@storybook/vue3'
|
||||
import CollapsibleGroup from './CollapsibleGroup.vue'
|
||||
|
||||
const genItems = (length = 5): any[] =>
|
||||
Array.from({ length }, (_, v) => ({
|
||||
title: `Item ${v + 1}`,
|
||||
content: `lorem ipsum ${v + 1}`,
|
||||
}))
|
||||
|
||||
const items = genItems(5)
|
||||
|
||||
export default {
|
||||
title: 'Components/CollapsibleGroup',
|
||||
component: CollapsibleGroup,
|
||||
args: {
|
||||
modelValue: false,
|
||||
accordion: false,
|
||||
items,
|
||||
},
|
||||
}
|
||||
|
||||
const Template: Story = (args, { argTypes }) => ({
|
||||
components: { CollapsibleGroup },
|
||||
setup() {
|
||||
return { args, argTypes }
|
||||
},
|
||||
template: `
|
||||
<CollapsibleGroup v-bind="args"/>
|
||||
`,
|
||||
})
|
||||
|
||||
export const Default = Template.bind({})
|
||||
Default.args = {}
|
||||
|
||||
export const Accordion = Template.bind({})
|
||||
Accordion.args = {
|
||||
accordion: true,
|
||||
}
|
||||
|
|
@ -1,55 +0,0 @@
|
|||
<script lang="ts" setup>
|
||||
import { Disclosure, DisclosureButton, DisclosurePanel } from '@headlessui/vue'
|
||||
import { ref, toRefs, watch } from 'vue'
|
||||
import Icon from '../Icon/index.vue'
|
||||
import Collapsible from './Collapsible.vue'
|
||||
|
||||
interface CollapsibleItem {
|
||||
title: string
|
||||
content: string
|
||||
isOpen?: boolean
|
||||
}
|
||||
|
||||
const props
|
||||
= defineProps<{
|
||||
items?: CollapsibleItem[]
|
||||
classes?: {
|
||||
wrapper?: string
|
||||
button?: string
|
||||
title?: string
|
||||
panel?: string
|
||||
}
|
||||
accordion?: boolean
|
||||
}>()
|
||||
|
||||
const { items } = toRefs(props)
|
||||
|
||||
const children = ref(props.items)
|
||||
|
||||
watch(items, (val) => {
|
||||
children.value = val
|
||||
})
|
||||
|
||||
const onToggle = (item: CollapsibleItem) => {
|
||||
if (props.accordion) {
|
||||
children.value.forEach((child) => {
|
||||
child.isOpen = false
|
||||
})
|
||||
item.isOpen = true
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="w-full p-2" :class="classes?.wrapper">
|
||||
<slot>
|
||||
<Collapsible
|
||||
v-for="(item, idx) in children"
|
||||
:key="idx"
|
||||
v-bind="item"
|
||||
v-model="item.isOpen"
|
||||
@toggle="onToggle(item)"
|
||||
/>
|
||||
</slot>
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -1,61 +0,0 @@
|
|||
<template>
|
||||
<Swiper
|
||||
:autoHeight="true"
|
||||
:loop="true"
|
||||
:spaceBetween="30"
|
||||
:centeredSlides="true"
|
||||
:autoplay="{
|
||||
delay: 6000,
|
||||
disableOnInteraction: false,
|
||||
pauseOnMouseEnter: true
|
||||
}"
|
||||
:effect="'fade'"
|
||||
:fadeEffect="{
|
||||
crossFade: true
|
||||
}"
|
||||
:pagination="{
|
||||
clickable: true,
|
||||
}"
|
||||
|
||||
:style="{
|
||||
'--swiper-navigation-color': 'rgb(71 85 105)',
|
||||
'--swiper-pagination-color': 'rgb(71 85 105)',
|
||||
'--swiper-pagination-bottom': '0%'
|
||||
}"
|
||||
:modules="[SwiperAutoplay, SwiperPagination, SwiperNavigation, SwiperEffectFade]"
|
||||
>
|
||||
|
||||
<SwiperSlide v-for="(item, index) in upcoming_events" class="bg-zinc-100 h-full">
|
||||
<div class="gap-1 w-[100%] mt-1 mb-1 text-sm h-full">
|
||||
<div>
|
||||
{{ item.formatted_date }}: {{item.venue.city}}, {{item.venue.state}}
|
||||
<div class="text-[#7F7F7F]">
|
||||
{{ item.venue.name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<!-- Comment
|
||||
<div v-for="performance in item.program">
|
||||
<div class="italic text-sm ml-16 pt-1">{{performance.work}}</div>
|
||||
<div v-if="performance.ensemble" class="ml-20">
|
||||
{{ performance.ensemble }}
|
||||
</div>
|
||||
<div v-for="performer in performance.performers" class="ml-20">
|
||||
{{ performer.name }} -
|
||||
<span v-for="(instrument, index) in performer.instrument_tags">
|
||||
<span v-if="index !== 0">, </span>
|
||||
{{ instrument }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
-->
|
||||
</SwiperSlide>
|
||||
|
||||
</Swiper>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ['upcoming_events']
|
||||
}
|
||||
</script>
|
||||
|
|
@ -1,54 +0,0 @@
|
|||
<template>
|
||||
<div class="inline-flex p-1 min-w-[25px]">
|
||||
<div v-show="visible" class="bg-black rounded-full text-xs inline-flex" >
|
||||
|
||||
<NuxtLink @click.native="audioPlayerStore.setSoundCloudTrackID(work.soundcloud_trackid)" v-if="type === 'score'" class="inline-flex p-1" :to="link">
|
||||
<Icon name="ion:book-sharp" color="white" />
|
||||
</NuxtLink>
|
||||
|
||||
<NuxtLink v-else-if="type === 'document'" class="inline-flex p-1" :to="link">
|
||||
<Icon name="ion:book-sharp" color="white" />
|
||||
</NuxtLink>
|
||||
|
||||
<NuxtLink v-else-if="type === 'buy'" class="inline-flex p-1" :to="link">
|
||||
<Icon name="bxs:purchase-tag" color="white" />
|
||||
</NuxtLink>
|
||||
|
||||
<NuxtLink v-else-if="type === 'email'" class="inline-flex p-1" :to="link">
|
||||
<Icon name="ic:baseline-email" color="white" />
|
||||
</NuxtLink>
|
||||
|
||||
<NuxtLink v-else-if="type === 'discogs'" class="inline-flex p-1" :to="link">
|
||||
<Icon name="simple-icons:discogs" color="white" />
|
||||
</NuxtLink>
|
||||
|
||||
<button @click="audioPlayerStore.setSoundCloudTrackID(work.soundcloud_trackid)" v-else-if="type === 'audio'" class="inline-flex p-1">
|
||||
<Icon name="wpf:speaker" color="white" />
|
||||
</button>
|
||||
|
||||
<button @click="modalStore.setModalProps('video', 'aspect-video', true, '', '', work.vimeo_trackid)" v-else-if="type === 'video'" class="inline-flex p-1">
|
||||
<Icon name="fluent:video-48-filled" color="white" />
|
||||
</button>
|
||||
|
||||
<button @click="modalStore.setModalProps('image', 'aspect-auto', true, 'images', work.gallery, '')" v-else="type === 'image'" class="inline-flex p-1">
|
||||
<Icon name="mdi:camera" color="white" />
|
||||
</button>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useAudioPlayerStore } from "@/stores/AudioPlayerStore"
|
||||
import { useModalStore } from "@/stores/ModalStore"
|
||||
|
||||
const audioPlayerStore = useAudioPlayerStore()
|
||||
const modalStore = useModalStore()
|
||||
|
||||
</script>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ['type', 'work', 'visible', 'link']
|
||||
}
|
||||
</script>
|
||||
|
|
@ -1,37 +0,0 @@
|
|||
<template>
|
||||
<Swiper
|
||||
:autoHeight="true"
|
||||
:loop="true"
|
||||
:spaceBetween="30"
|
||||
:centeredSlides="true"
|
||||
:autoplay="{
|
||||
delay: 4000,
|
||||
disableOnInteraction: false,
|
||||
pauseOnMouseEnter: true
|
||||
}"
|
||||
:pagination="{
|
||||
clickable: true,
|
||||
}"
|
||||
:navigation="true"
|
||||
:style="{
|
||||
'--swiper-navigation-color': 'rgb(71 85 105)',
|
||||
'--swiper-pagination-color': 'rgb(71 85 105)',
|
||||
'--swiper-pagination-bottom': 'auto',
|
||||
'--swiper-pagination-top': '1rem',
|
||||
'--swiper-navigation-top-offset': '5rem'
|
||||
}"
|
||||
:modules="[SwiperAutoplay, SwiperPagination, SwiperNavigation]"
|
||||
>
|
||||
|
||||
<SwiperSlide v-for="image in gallery" class="p-10 bg-zinc-100">
|
||||
<nuxt-img :src="'https://unboundedpress.org/api/' + bucket + '.files/' + image.image_id + '/binary'"
|
||||
quality="50"/>
|
||||
</SwiperSlide>
|
||||
</Swiper>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
props: ['gallery', 'bucket']
|
||||
}
|
||||
</script>
|
||||
|
|
@ -1,3 +0,0 @@
|
|||
<template>
|
||||
<div class="fixed inset-0 bg-black/50 z-15 transition duration-300" />
|
||||
</template>
|
||||
|
|
@ -1,110 +0,0 @@
|
|||
<script setup lang="ts">
|
||||
import { ref } from 'vue'
|
||||
import {
|
||||
Dialog,
|
||||
DialogPanel,
|
||||
TransitionChild,
|
||||
TransitionRoot,
|
||||
} from '@headlessui/vue'
|
||||
|
||||
const props = withDefaults(
|
||||
defineProps<{
|
||||
modelValue?: boolean
|
||||
persistent?: boolean
|
||||
fullscreen?: boolean
|
||||
}>(),
|
||||
{
|
||||
modelValue: false,
|
||||
persistent: false,
|
||||
fullscreen: false,
|
||||
},
|
||||
)
|
||||
|
||||
const emit = defineEmits<{
|
||||
(e: 'update:modelValue', value: boolean): void
|
||||
}>()
|
||||
|
||||
const { modelValue } = toRefs(props)
|
||||
|
||||
const isOpen = ref(modelValue.value)
|
||||
|
||||
watch(modelValue, (value) => {
|
||||
isOpen.value = value
|
||||
})
|
||||
|
||||
function closeModal() {
|
||||
isOpen.value = false
|
||||
}
|
||||
|
||||
function openModal() {
|
||||
isOpen.value = true
|
||||
}
|
||||
|
||||
function onModalClose() {
|
||||
if (!props.persistent)
|
||||
closeModal()
|
||||
}
|
||||
|
||||
watch(isOpen, (value) => {
|
||||
emit('update:modelValue', value)
|
||||
})
|
||||
|
||||
const api = {
|
||||
isOpen,
|
||||
open: openModal,
|
||||
close: closeModal,
|
||||
}
|
||||
|
||||
provide('modal', api)
|
||||
</script>
|
||||
|
||||
<template>
|
||||
|
||||
<slot name="activator" :open="openModal" :on="{ click: openModal }" />
|
||||
|
||||
<TransitionRoot appear :show="isOpen" as="template">
|
||||
<Dialog as="div" class="relative z-20" @close="onModalClose">
|
||||
<TransitionChild
|
||||
as="template"
|
||||
enter="duration-300 ease-out"
|
||||
enter-from="opacity-0"
|
||||
enter-to="opacity-100"
|
||||
leave="duration-200 ease-in"
|
||||
leave-from="opacity-100"
|
||||
leave-to="opacity-0"
|
||||
>
|
||||
<div class="fixed inset-0 bg-black bg-opacity-25" />
|
||||
</TransitionChild>
|
||||
|
||||
<div class="fixed inset-0 overflow-y-auto">
|
||||
<div
|
||||
class="flex min-h-full items-center justify-center text-center"
|
||||
:class="{
|
||||
'p-4': !fullscreen,
|
||||
}"
|
||||
>
|
||||
<TransitionChild
|
||||
as="template"
|
||||
enter="duration-300 ease-out"
|
||||
enter-from="opacity-0 scale-95"
|
||||
enter-to="opacity-100 scale-100"
|
||||
leave="duration-200 ease-in"
|
||||
leave-from="opacity-100 scale-100"
|
||||
leave-to="opacity-0 scale-95"
|
||||
>
|
||||
<DialogPanel
|
||||
class="w-full transform overflow-hidden bg-white text-left align-middle shadow-xl transition-all"
|
||||
:class="{
|
||||
'h-screen': fullscreen,
|
||||
'max-w-[85vw] rounded-lg': !fullscreen,
|
||||
}"
|
||||
>
|
||||
<slot />
|
||||
</DialogPanel>
|
||||
</TransitionChild>
|
||||
</div>
|
||||
</div>
|
||||
</Dialog>
|
||||
</TransitionRoot>
|
||||
|
||||
</template>
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
<script setup lang="ts">
|
||||
import { DialogDescription } from '@headlessui/vue'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<DialogDescription class="px-4 py-3 text-sm text-gray-800">
|
||||
<slot />
|
||||
</DialogDescription>
|
||||
</template>
|
||||
|
|
@ -1,9 +0,0 @@
|
|||
<script setup lang="ts">
|
||||
// import { ref } from 'vue'
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<div class="px-4 py-3">
|
||||
<slot />
|
||||
</div>
|
||||
</template>
|
||||
|
|
@ -1,34 +0,0 @@
|
|||
<script setup lang="ts">
|
||||
import { DialogTitle } from '@headlessui/vue'
|
||||
|
||||
interface Props {
|
||||
dismissable?: boolean
|
||||
titleClass?: string
|
||||
}
|
||||
|
||||
defineProps<Props>()
|
||||
|
||||
const api = inject('modal')
|
||||
</script>
|
||||
|
||||
<template>
|
||||
<DialogTitle
|
||||
as="div"
|
||||
class="flex gap-2 justify-between items-center px-4 pt-3"
|
||||
>
|
||||
<h3
|
||||
class="text-lg font-medium leading-6 text-gray-900"
|
||||
:class="titleClass"
|
||||
>
|
||||
<slot />
|
||||
</h3>
|
||||
<slot v-if="dismissable" name="dismissable">
|
||||
<button
|
||||
class="text-2xl text-gray-500 appearance-none px-2 -mr-2"
|
||||
@click="api.close"
|
||||
>
|
||||
×
|
||||
</button>
|
||||
</slot>
|
||||
</DialogTitle>
|
||||
</template>
|
||||
|
|
@ -1,79 +0,0 @@
|
|||
<template>
|
||||
<div class="grid grid-cols-[63%,35%] w-full font-thin sticky top-0 bg-white p-2 z-20">
|
||||
<div>
|
||||
<div class="text-5xl p-2"> <NuxtLink to='/'>michael winter</NuxtLink></div>
|
||||
<div class="inline-flex text-2xl ml-4">
|
||||
<NuxtLink class="px-3" to='/'>works</NuxtLink>
|
||||
<NuxtLink class="px-3" to='/events'>events</NuxtLink>
|
||||
<NuxtLink class="px-3" to='/about'>about</NuxtLink>
|
||||
<NuxtLink class="px-3" to='https://unboundedpress.org/code'>code</NuxtLink>
|
||||
<NuxtLink class="px-3 block" to='https://unboundedpress.org/legacy'>legacy</NuxtLink>
|
||||
</div>
|
||||
|
||||
<!-- hdp link while active -->
|
||||
<!------
|
||||
<div class="inline-flex text-2xl ml-4 font-bold">
|
||||
<NuxtLink class="px-3" to='/a_history_of_the_domino_problem'>A HISTORY OF THE DOMINO PROBLEM | 17.11 - 01.12.2023 </NuxtLink>
|
||||
</div>
|
||||
--->
|
||||
</div>
|
||||
|
||||
<!-- TODO: this needs to be automatically flipped off when there are no upcoming events-->
|
||||
<!------
|
||||
<div class="px-1 bg-zinc-100 rounded-lg text-center">
|
||||
<div class="text-sm">upcoming events</div>
|
||||
<EventSlider :upcoming_events="upcoming_events" class="max-w-[95%] min-h-[80%]"></EventSlider>
|
||||
</div>
|
||||
-->
|
||||
|
||||
</div>
|
||||
<slot /> <!-- required here only -->
|
||||
<div class="fixed bottom-0 bg-white p-2 w-full flex justify-center z-20">
|
||||
<iframe width="400rem" height="20px" scrolling="no" frameborder="no" allow="autoplay" v-if="audioPlayerStore.soundcloud_trackid !== 'undefined'"
|
||||
:src="'https://w.soundcloud.com/player/?url=https%3A//api.soundcloud.com/tracks/' + audioPlayerStore.soundcloud_trackid + '&inverse=false&auto_play=true&show_user=false'"></iframe>
|
||||
</div>
|
||||
|
||||
<Modal v-model="modalStore.isOpen">
|
||||
<ModalBody :class="modalStore.aspect">
|
||||
<ImageSlider v-if="modalStore.type === 'image'" :bucket="modalStore.bucket" :gallery="modalStore.gallery"></ImageSlider>
|
||||
<iframe v-if="modalStore.type === 'video'" :src="'https://player.vimeo.com/video/' + modalStore.vimeo_trackid" width="100%" height="100%" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>
|
||||
</ModalBody>
|
||||
</Modal>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { useAudioPlayerStore } from "@/stores/AudioPlayerStore"
|
||||
import { useModalStore } from "@/stores/ModalStore"
|
||||
|
||||
const audioPlayerStore = useAudioPlayerStore()
|
||||
const modalStore = useModalStore()
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
if(route.params.files == 'scores') {
|
||||
const { data: work } = await useFetch('https://unboundedpress.org/api/works?filter={"score":"' + route.params.filename + '"}', {
|
||||
transform: (work) => {
|
||||
|
||||
if(work[0].soundcloud_trackid){
|
||||
audioPlayerStore.setSoundCloudTrackID(work[0].soundcloud_trackid)
|
||||
} else {
|
||||
audioPlayerStore.clearSoundCloudTrackID()
|
||||
}
|
||||
return work[0]
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
//const today = Date.now(); //annoying this does not work
|
||||
const today = 1715247305793;
|
||||
const { data: upcoming_events } = await useFetch("https://unboundedpress.org/api/events?filter={'start_date':{'$gte':{'$date':" + today + "}}}", {
|
||||
transform: (upcoming_events) => {
|
||||
for (const event of upcoming_events) {
|
||||
let date = new Date(event.start_date.$date)
|
||||
event.formatted_date = ("0" + (date.getMonth() + 1)).slice(-2) + "." + ("0" + date.getDate()).slice(-2) + "." + date.getFullYear()
|
||||
}
|
||||
return upcoming_events.sort((a,b) => a.start_date.$date - b.start_date.$date)
|
||||
}
|
||||
})
|
||||
|
||||
</script>
|
||||
|
|
@ -1,35 +0,0 @@
|
|||
//import { defineNuxtConfig } from 'nuxt3'
|
||||
|
||||
// https://nuxt.com/docs/api/configuration/nuxt-config
|
||||
export default defineNuxtConfig({
|
||||
modules: ['@nuxtjs/tailwindcss', '@nuxt/image', 'nuxt-icon', '@pinia/nuxt', 'nuxt-headlessui', 'nuxt-swiper'],
|
||||
extends: ['nuxt-umami'],
|
||||
image: {
|
||||
domains: ['unboundedpress.org']
|
||||
},
|
||||
app: {
|
||||
//baseURL: "/dev/",
|
||||
pageTransition: { name: 'page', mode: 'out-in' },
|
||||
head: {
|
||||
viewport: 'width=device-width'
|
||||
},
|
||||
},
|
||||
appConfig: {
|
||||
umami: {
|
||||
id: '51f4f246-9c2e-4a86-9ffb-7a7967d9013d',
|
||||
host: 'https://cloud.umami.is/',
|
||||
version: 2
|
||||
},
|
||||
},
|
||||
routeRules: {
|
||||
'/cv': { redirect: '/legacy/cv' },
|
||||
'/works_list': { redirect: '/legacy/works_list' },
|
||||
'/hdp': { redirect: '/a_history_of_the_domino_problem' },
|
||||
},
|
||||
nitro: {
|
||||
prerender: { crawlLinks: true}
|
||||
},
|
||||
experimental: {
|
||||
payloadExtraction: true
|
||||
}
|
||||
})
|
||||
17705
portfolio-nuxt/package-lock.json
generated
|
|
@ -1,26 +0,0 @@
|
|||
{
|
||||
"name": "nuxt-app",
|
||||
"private": true,
|
||||
"scripts": {
|
||||
"build": "nuxt build",
|
||||
"dev": "nuxt dev",
|
||||
"generate": "nuxt generate",
|
||||
"preview": "nuxt preview",
|
||||
"postinstall": "nuxt prepare"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@nuxt/image": "^1.0.0-rc.1",
|
||||
"@nuxtjs/tailwindcss": "^6.7.0",
|
||||
"@types/node": "^18",
|
||||
"nuxt-headlessui": "^1.1.4",
|
||||
"nuxt-icon": "^0.4.1"
|
||||
},
|
||||
"dependencies": {
|
||||
"nuxt": "^3.6.0",
|
||||
"@pinia/nuxt": "^0.4.11",
|
||||
"nuxt-swiper": "^1.1.0",
|
||||
"nuxt-umami": "^2.4.2",
|
||||
"pinia": "^2.1.3",
|
||||
"sharp": "^0.32.1"
|
||||
}
|
||||
}
|
||||
|
|
@ -1,27 +0,0 @@
|
|||
<template>
|
||||
<div class="flex min-h-full items-center justify-center text-center">
|
||||
<embed v-if="route.params.filename.split('.').pop()==='pdf'" :src="'https://unboundedpress.org/api/' + route.params.files + '.files/' + file_metadata._id.$oid + '/binary'" class="w-[85%] h-[88vh]"/>
|
||||
<nuxt-img v-else-if="route.params.filename.split('.').pop()==='jpg'" :src="'https://unboundedpress.org/api/' + route.params.files + '.files/' + file_metadata._id.$oid + '/binary'" class="w-[85%]"/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
|
||||
import { useAudioPlayerStore } from "@/stores/AudioPlayerStore"
|
||||
|
||||
const audioPlayerStore = useAudioPlayerStore()
|
||||
|
||||
const route = useRoute()
|
||||
|
||||
const { data: file_metadata } = await useFetch('https://unboundedpress.org/api/' + route.params.files + '.files?filter={"filename":"' + route.params.filename + '"}', {
|
||||
//lazy: true,
|
||||
//server: false,
|
||||
transform: (file_metadata) => {
|
||||
return file_metadata[0]
|
||||
}
|
||||
})
|
||||
|
||||
useHead({
|
||||
titleTemplate: 'Michael Winter - Files - ' + route.params.filename
|
||||
})
|
||||
</script>
|
||||
|
|
@ -1,346 +0,0 @@
|
|||
<template>
|
||||
<div class="bg-contain bg-no-repeat bg-center rounded-lg m-5 gap-10 bg-[#0A0A19] py-4 text-2xl text-white py-4 mb-10 overflow-hidden" :style="{ backgroundImage: `url(${image})`}">
|
||||
<div class="rounded-lg w-full sticky top-[10px] grid grid-cols-[63%,35%]">
|
||||
<div>
|
||||
<div class="p-5 text-5xl font-bold">a history of the domino problem</div>
|
||||
|
||||
<div>
|
||||
<div class="inline-flex text-2xl ml-4 mb-5">
|
||||
<a href="#about" class="px-3">about</a>
|
||||
<a href="#exhibition" class="px-3">exhibition</a>
|
||||
<a href="#events" class="px-3">events</a>
|
||||
<a href="#participants" class="px-3">participants</a>
|
||||
</div>
|
||||
<div class="inline-flex text-2xl ml-4 mb-5">
|
||||
<a href="#media" class="px-3">media</a>
|
||||
<a href="#contributors" class="px-3">contributors</a>
|
||||
<a href="#resources" class="px-3">resources</a>
|
||||
<a href="#contact" class="px-3">contact/press</a>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
For the Lecture-Concert on 22 Nov 2023, Registration recommended. Sign up <NuxtLink class="text-2xl font-bold" to='https://www.eventbrite.de/e/a-history-of-the-domino-problem-lecture-concert-tickets-707700981687'>HERE</NuxtLink>.
|
||||
</div>
|
||||
</div>
|
||||
<!---
|
||||
<Swiper
|
||||
:loop="true"
|
||||
:spaceBetween="30"
|
||||
:centeredSlides="true"
|
||||
:pagination='{
|
||||
clickable: true,
|
||||
renderBullet: function (index, className) {
|
||||
return "<span class=" + className + ">" + ["about", "exhibition", "events", "participants"][index] + "</span>";
|
||||
}
|
||||
}'
|
||||
:navigation="false"
|
||||
:style="{
|
||||
'--swiper-pagination-color': 'rgb(255 255 255)',
|
||||
'--swiper-pagination-bullet-horizontal-gap': '80px',
|
||||
'--swiper-pagination-bullet-inactive-opacity': '0.8',
|
||||
'--swiper-pagination-bullet-size': '0px',
|
||||
'--swiper-pagination-bottom': 'auto',
|
||||
'--swiper-pagination-top': '1rem',
|
||||
'--swiper-pagination-margin-left': '0px',
|
||||
}"
|
||||
:hashNavigation="{
|
||||
watchState: true,
|
||||
}"
|
||||
:modules="[SwiperAutoplay, SwiperPagination, SwiperNavigation, SwiperHashNavigation]"
|
||||
class="max-w-[95vw]"
|
||||
>
|
||||
--->
|
||||
<Swiper
|
||||
:loop="true"
|
||||
:spaceBetween="30"
|
||||
:centeredSlides="true"
|
||||
:pagination="false"
|
||||
:navigation="false"
|
||||
:hashNavigation="{
|
||||
watchState: true,
|
||||
}"
|
||||
:modules="[SwiperAutoplay, SwiperPagination, SwiperNavigation, SwiperHashNavigation]"
|
||||
>
|
||||
<SwiperSlide data-hash="about" class="p-10 text-xl overflow-hidden">
|
||||
<span class="swiper-no-swiping">
|
||||
<div class="overflow-auto">
|
||||
<p class="mb-5">
|
||||
<span class="italic">a history of the domino problem</span> is a performance-installation that traces the history of an epistemological problem in mathematics about how things that one could never imagine fitting together, actually come together and unify in unexpected ways. The work comprises a set of musical compositions and a kinetic sculpture that sonify and visualize rare tilings (more commonly known as mosaics) constructed from dominoes. The dominoes in these tilings are similar yet slightly different than those used in the popular game of the same name. As opposed to rectangles divided into two regions with numbers between 1 and 6, they are squares where each of the 4 edges is assigned a number (typically represented by a corresponding color or alternatively, pattern) called <NuxtLink to='https://en.wikipedia.org/wiki/Wang_tile'>Wang tiles</NuxtLink>. Like in the game, the rule is that edges of adjacent dominoes in a tiling must match.
|
||||
</p>
|
||||
<p class="mb-5">
|
||||
The tilings sonified and visualized in <span class="italic">a history of the domino problem</span> are rare because there is no systematic way to find them. This is due to the fact that they are <NuxtLink to='https://en.wikipedia.org/wiki/Aperiodic_tiling'><span class="italic">aperiodic</span></NuxtLink>. One can think of an aperiodic tiling as an infinite puzzle with a peculiar characteristic: given unlimited copies of dominoes with a finite set of color/pattern combinations for the edges, on can form a tiling that expands infinitely. However, in that solution, any repeating structure in the tiling will eventually be interrupted. This phenomenon is one of the most intriguing aspects of the work. As the music and the visuals are derived from the tilings, the resulting textures are always shifting ever so slightly.
|
||||
</p>
|
||||
<p>
|
||||
The original Domino Problem asked if there exists an algorithm/computer program that, when given as input a finite set of dominoes with varying color combinations for the edges, can output a binary answer, `yes' or `no', whether or not copies of that set can form an infinite tiling. The problem was first posed by Hao Wang in 1961, who conjectured that the answer is positive and that such an algorithm does exist. The existence of aperiodic tilings would mean that such an algorithm <span class="italic">does not</span> exist. However, in 1964, his student, Robert Berger, proved him wrong by discovering an infinite, aperiodic tiling constructed with copies of a set of 20,426 dominoes. The resolution of Wang's original question led to new questions and mathematicians took on the challenge of finding the smallest set of dominoes that would construct an infinite aperiodic tiling. Over the past 60 years, this number has been continually reduced with the contributions of many different mathematicians until the most recent discovery of a set of 11 dominoes along with a proof that no smaller sets exist. It is a remarkable narrative/history of a particular epistemological problem that challenged a group of people not only to solve it, but to understand it to the extent possible.
|
||||
</p>
|
||||
</div>
|
||||
</span>
|
||||
</SwiperSlide>
|
||||
<SwiperSlide data-hash="exhibition" class="p-10 text-xl overflow-hidden">
|
||||
<span class="swiper-no-swiping">
|
||||
<div class="overflow-auto">
|
||||
<div class="mb-5 text-3xl italic font-bold">
|
||||
a few thoughts on how things fit together...
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
(free entrance)
|
||||
</div>
|
||||
<br>
|
||||
<div class="mb-5">
|
||||
in collaboration with MAREIKE YIN-YEE LEE
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
Exhibition Opening - 17 Nov 2023 | 19 Uhr
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
Exhibition Closing - 01 Dec 2023 | 19 Uhr
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
Gallery Hours - Wednesday to Friday | 13 - 19 Uhr & Saturday | 12 - 18 Uhr
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
Lichthof Ost, HU Berlin Hauptgebäude, Campus Mitte, Unter den Linden 6 (U-Bahn Unter den Linden oder Museuminsel)
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
<NuxtLink class="px-3" to='https://unboundedpress.org/pubs/a_few_thoughts_exhibition_poster.pdf'><nuxt-img class="w-[500px]" src="/hdp_images/hdp_exhibition_poster_digital.jpeg"/></NuxtLink>
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
<NuxtLink class="px-3" to='https://unboundedpress.org/hdp_images/lichthof_ost_map.jpeg'><nuxt-img class="w-[500px]" src="/hdp_images/lichthof_ost_map.jpeg"/></NuxtLink>
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
<span class="font-bold">About the Exhibition</span>
|
||||
<br>
|
||||
<br>
|
||||
The exhibition will feature individual and collaborative works by Michael Winter and Mareike Yin-Yee Lee in a constellation designed specifically for the Lichthof Ost exhibition room of the Humboldt University. The original kinetic sculpture Winter created to visualize the aperiodic tilings of the history of the domino problem will be juxtaposed with recent works by Yin-Yee Lee as well as collaboratively created realizations of the tilings. The works on display by Yin-Yee Lee will highlight selections from her Hidden Lakes and Missing Pieces series in which enigmatic outlines of lakes and various shapes encourage observers to perceive similarities and differences in form, pattern, and repetition between the pieces and to mentally fill in blank space. The collaborative realizations of the tilings will include prints generated by Winter with the aid of a computer that incorporate images and color schemes by Yin-Yee Lee as well as a floor mosaic of drawings on mirrors. The exhibition plays on the macro versus the micro, transformation, and how topologies of various color combinations, relationships between shapes and gradients reflect in space in order to illuminate "a few thoughts on how things fit together..."
|
||||
</div>
|
||||
<br>
|
||||
<div class="mb-5">
|
||||
<span class="font-bold">About the Kinetic Sculpture</span>
|
||||
<br>
|
||||
<br>
|
||||
The kinetic sculpture displays the mosaics using visual cryptography. In visual cryptography, a message is encrypted by dividing the information of the message into two `shadow' images, which look completely random and independent of each other. The message is decrypted and revealed when the shadow images are combined/overlayed in a precise orientation. In the kinetic sculpture of a history of the domino problem, the shadow images are printed on photomasks, which are essentially high-resolution transparencies: quartz wafers with a chrome coating etched at a pixel size ranging from nano- to micrometers. A high-precision, motorized multiaxis stage aligns the finely printed shadow images to reveal the mosaics (along with 3 other images of poetic texts inspired by the history of the Domino Problem).
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
</SwiperSlide>
|
||||
<SwiperSlide data-hash="events" class="p-10 text-xl overflow-hidden">
|
||||
<span class="swiper-no-swiping">
|
||||
<div class="overflow-auto">
|
||||
<div class="mb-5">
|
||||
<span class="font-bold">Exhibition Opening - 17 Nov 2023 | 19 Uhr</span>
|
||||
<br>
|
||||
Lichthof Ost, HU Berlin Hauptgebäude, Campus Mitte, Unter den Linden 6 (U-Bahn Unter den Linden oder Museuminsel)
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
<span class="font-bold">Exhibition Closing - 01 Dec 2023 | 19 Uhr</span>
|
||||
<br>
|
||||
Lichthof Ost, HU Berlin Hauptgebäude, Campus Mitte, Unter den Linden 6 (U-Bahn Unter den Linden oder Museuminsel)
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
<span class="font-bold">Public lecture + Concert (free entrance) - 22 Nov 2023 | 19:30 Uhr (doors open at 19:00 Uhr)</span>
|
||||
<br>
|
||||
with Prof. JARKKO KARI (Turku University), moderated by Prof. Dr. GAËTAN BOROT (HU Berlin)
|
||||
<br>
|
||||
the abstract of Prof. JARKKO KARI's Lecture is provided below
|
||||
<br>
|
||||
performance by KALI ENSEMBLE
|
||||
<br>
|
||||
Fritz-Reuter-Saal, HU Berlin Universitätsgebäude (am Hegelplatz), Dorotheenstraße 24 (U-Bahn Unter den Linden oder Museuminsel)
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
<span class="font-bold">Concert - 23 Nov 2023 | 20:30 Uhr (doors open at 20:00 Uhr)</span>
|
||||
<br>
|
||||
performance by KALI ENSEMBLE
|
||||
<br>
|
||||
<NuxtLink to='https://www.km28.de/'>KM28</NuxtLink>
|
||||
<br>
|
||||
Karl-Marx-Str. 28, 12043 Berlin (U-Bahn Karl-Marx-Platz)
|
||||
<br>
|
||||
(entry by donation, with proceeds going to the Kali Ensemble)
|
||||
</div>
|
||||
<br>
|
||||
<div class="mb-5">
|
||||
<br>
|
||||
About the Public lecture
|
||||
<br>
|
||||
<span class="font-bold">From Wang Tiles to the Domino Problem: A Tale of Aperiodicity</span>
|
||||
<br>
|
||||
<br>
|
||||
This presentation delves into the remarkable history of aperiodic tilings and the domino problem. Aperiodic tile sets refer to collections of tiles that can only tile the plane in a non-repeating, or non-periodic, manner. Such sets were not believed to exist until 1964 when R. Berger introduced the first aperiodic set consisting of an astonishing 20,426 Wang tiles. Over the years, ongoing research led to significant advancements, culminating in 2015 with the discovery of a mere 11 Wang tiles by E. Jeandel and M. Rao, alongside a computer-assisted proof of their minimality. Simultaneously, researchers found even smaller aperiodic sets composed of polygon-shaped tiles. Notably, Penrose's kite and dart tiles emerged as early examples, and most recently, a groundbreaking discovery was made - a solitary aperiodic tile known as the "hat" that can tile the plane exclusively in a non-periodic manner. Aperiodic tile sets are intimately connected with the domino problem that asserts how certain tile sets can tile the plane without us ever being able to establish their tiling nature with absolute certainty. Moreover, aperiodic tilings hold a distinct visual aesthetic allure. In today's musical presentation, their artistic appeal transcends the visual domain and extends into the realm of music.
|
||||
<br>
|
||||
-Jarkko Kari
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
</SwiperSlide>
|
||||
<SwiperSlide data-hash="participants" class="p-10 text-xl overflow-hidden">
|
||||
<span class="swiper-no-swiping">
|
||||
<div class="max-h-[800px] overflow-auto">
|
||||
<div class="mb-5 py-10">
|
||||
<NuxtLink class="text-3xl font-bold" to='https://unboundedpress.org/'>Michael Winter - composer | sound artist</NuxtLink>
|
||||
<div class="grid grid-cols-[20%,70%] p-5">
|
||||
<nuxt-img src="/hdp_images/michael.jpg"/>
|
||||
<div class="px-5">
|
||||
<p class="mb-5">
|
||||
My practice as a composer and sound artist is diverse, ranging from music created by digital and acoustic instruments to installations and kinetic sculptures. Each piece typically explores one simple process and often reflects various related interests of mine such as phenomenology, mathematics, epistemology, algorithmic information theory, and the history of science. To me, everything we experience is computable. Given this digital philosophy, I acknowledge even my most open works as algorithmic; and, while not always apparent on the surface of any given piece, the considerations of computability and epistemology are integral to my practice. I often reconcile epistemological limits with artistic practicality by considering and addressing the limits of computation from an artistic and experiential vantage point and by collaborating with other artists, mathematicians, and scientists in order to integrate objects, ideas, and texts from various domains as structural elements in my pieces. My work also aims to subvert discriminatory conventions and hierarchies by exploring alternative forms of presentation and interaction, often with minimal resources and low information.
|
||||
</p>
|
||||
<p>
|
||||
My work has been presented at venues and festivals throughout the world such as REDCAT, in Los Angeles; the Ostrava Festival of New Music in the Czech Republic; Tsonami Arte Sonoro Festival in Valparaiso, Chile; the Huddersfield New Music Festival in the United Kingdom; and Umbral Sesiones at the Museo de Arte Contemporáneo in Oaxaca, Mexico. Recordings of my music have been released by XI Records, Another Timbre, New World Records, Edition Wandelweiser, Bahn Mi Verlag, Tsonami Records, and Pogus Productions. In 2008, I co-founded the wulf., a Los Angeles-based organization dedicated to experimental performance and art. From 2018 to 2019, I was a fellow / artist-in-residence at the Akademie Schloss Solitude in Stuttgart, Germany. I currently reside in Berlin.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-5 py-10">
|
||||
<NuxtLink class="text-3xl font-bold" to='http://www.mareikelee.com/'>MAREIKE YIN-YEE LEE - visual artist</NuxtLink>
|
||||
<div class="grid grid-cols-[20%,70%] p-5">
|
||||
<nuxt-img src="/hdp_images/mareike.jpg"/>
|
||||
<div class="px-5">
|
||||
Mareike Yin‑Yee Lee’s multidisciplinary practice encompasses drawing, video, sculpture, found and made objects, printmaking, and artist books. Current works include installations, recordings and live performances produced in collaboration with musicians and composers with an emphasis on the relation between sight and sound. How we approach, perceive and respond to these form the basis of her recent works‘ manifestations. Her immersive, site-specific installations explore the complex and tenuous nature of communication and how we experience space, drawing on gesture, sound, and memory to elicit responses that cannot be put into words. She redefines the architecture and temporality of the spaces in which she works. Lee’s work plays with the spaces between, across, and beyond, embracing the undefinable and subtle gradations, forging a language of colour, tone and space that seeks to articulate microcosms of daily life and sustained contemplation. Lee studied at Universität der Künste, Berlin, Germany; University of Toronto, Toronto, Canada; and Nova Scotia College of Art and Design, Nova Scotia, Canada, where she was awarded the Joseph Beuys Scholarship and the Canada Millennium Award of Excellence. Recent projects include exhibitions and performances at Kunsthaus Kule Berlin (2020), Kunstmuseum Kloster Unser Lieben Frauen Magdeburg (2019), Galerie Kunstpunkt Berlin (2018), Kunstbezirk Stuttgart, Kunst(zeug)haus Rapperswil- Jona Switzerland (2017), Kunsthaus Interlaken (2017), Neuer Kunstverein, Aschaffenburg (2016), and KW Institute for Contemporary Art, Berlin (2016).
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-5 py-10">
|
||||
<NuxtLink class="text-3xl font-bold" to='https://www.facebook.com/KaliEnsemble'>KALI - performing ensemble</NuxtLink>
|
||||
<div class="grid grid-cols-[20%,70%] p-5">
|
||||
<nuxt-img src="/hdp_images/kali.jpg"/>
|
||||
<div class="px-5">
|
||||
Kali is a new music ensemble based in the Hague. They primarily work with composers with whom they can collaborate and experiment over long periods. They aim to develop an artistic practice unique to their relationship with their collaborators. Over the past years, they have formed close and active relationships with several composers based in The Hague and abroad realizing many large-scale projects with great attention to detail.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-5 py-10">
|
||||
<NuxtLink class="text-3xl font-bold" to='https://users.utu.fi/jkari/'>Jarkko Kari - mathematician | invited guest</NuxtLink>
|
||||
<div class="grid grid-cols-[20%,70%] p-5">
|
||||
<nuxt-img class="w-full" src="/hdp_images/jarkko.jpg"/>
|
||||
<div class="px-5">
|
||||
Jarkko Kari received his MSc and PhD degrees in mathematics from the University of Turku in Finland in 1986 and 1990, respectively. He then worked for the Academy of Finland, and for Iterated Systems Inc. and the University of Iowa in the USA. Since year 2000 he has been a professor of mathematics at the University of Turku. His research interests include automata theory and the theory of computation, with emphasis on cellular automata, tilings and symbolic dynamics. Jarkko Kari has supervised twelve PhD theses, published over one hundred peer reviewed research articles and edited twenty conference proceedings and special issues on these topics. He serves in the editorial boards of eight scientific journals, and is currently a co-editor-in-chief of the journal Natural Computing. Jarkko Kari is a member of the Finnish Academy of Science and Letters since 2014.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mb-5 py-10">
|
||||
<NuxtLink class="text-3xl font-bold" to='https://www.mathematik.hu-berlin.de/de/forschung/forschungsgebiete/mathematische-physik/borot-mp-homepage'>Gaëtan Borot - mathematician | organizer | moderator</NuxtLink>
|
||||
<div class="grid grid-cols-[20%,70%] p-5">
|
||||
<nuxt-img class="w-full" src="/hdp_images/gaetan.jpg"/>
|
||||
<div class="px-5">
|
||||
Gaëtan Borot was trained at École Normale Supérieure (Paris) in theoretical physicist and progressively moved to pure mathematics. He received his PhD from Universite d'Orsay / CEA Saclay in 2011. After a postdoctorate in Geneva and a visiting scholarship at MIT, he worked as a Group Leader at the Max Planck Institute for Mathematics in Bonn. Since 2020, he holds a bridge professorship between the Institute of Mathematics and the Institute of Physics of the Humboldt University of Berlin. He has worked on enumerative geometry, combinatorics, random matrix theory and mathematical aspects of quantum field theory, and likes to investigate the unexpected relations between seemingly different problems. He is also interested in scientific outreach.
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
</SwiperSlide>
|
||||
<SwiperSlide data-hash="media" class="p-20 text-xl overflow-hidden">
|
||||
|
||||
<div class="flex justify-center">
|
||||
<iframe src="https://player.vimeo.com/video/375784136" width="640" height="360" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen ></iframe>
|
||||
</div>
|
||||
|
||||
</SwiperSlide>
|
||||
<SwiperSlide data-hash="contributors" class="p-10 text-xl overflow-hidden">
|
||||
<div class="max-h-[calc(100vh-27rem)] overflow-auto">
|
||||
<div class="grid grid-cols-5 p-5 items-center">
|
||||
<NuxtLink class="px-3" to='https://www.hu-berlin.de/en'><nuxt-img class="w-[100px]" src="/hdp_images/hu_logo.png"/></NuxtLink>
|
||||
<NuxtLink class="px-3" to='https://www.km28.de/'><nuxt-img class="w-[100px]" src="/hdp_images/km28_logo.png"/></NuxtLink>
|
||||
<NuxtLink class="px-3" to='https://www.ims-chips.com/'><nuxt-img class="w-[250px]" src="/hdp_images/ims_chips_logo.png"/></NuxtLink>
|
||||
<NuxtLink class="px-3" to='https://www.akademie-solitude.de/'><nuxt-img class="w-[100px]" src="/hdp_images/akademie_schloss_solitude_logo.png"/></NuxtLink>
|
||||
<NuxtLink class="px-3" to='https://mathplus.de/'><nuxt-img class="w-[200px]" src="/hdp_images/mathplus_logo_gray.png"/></NuxtLink>
|
||||
</div>
|
||||
</div>
|
||||
</SwiperSlide>
|
||||
<SwiperSlide data-hash="resources" class="p-10 text-xl overflow-hidden">
|
||||
<span class="swiper-no-swiping">
|
||||
<div class="overflow-auto">
|
||||
|
||||
<div class="mb-5 text-2xl font-bold">
|
||||
a few selected articles:
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
Hao Wang (1961), Proving theorems by pattern recognition—II, Bell System Technical Journal, Volume: 40, Issue: 1.
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
Robert Berger (1966), The undecidability of the domino problem, American Mathematical Society, Volume 1, 1966.
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
Jarkko Kari (1996), A small aperiodic set of Wang tiles, Discrete Mathematics, Volume 160.
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
Emmanuel Jeandel and Michael Rao, An aperiodic set of 11 Wang tiles, Advances in Combinatorics, Volume 1.
|
||||
</div>
|
||||
|
||||
<br>
|
||||
|
||||
<div class="mb-5 text-2xl font-bold">
|
||||
a definitive book on tilings and patterns:
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
Branko Grunbaum and G.C. Shephard, Tilings and Patterns, Dover Books (originally published 1986)
|
||||
</div>
|
||||
|
||||
<br>
|
||||
|
||||
<div class="mb-5 text-2xl font-bold">
|
||||
a few useful links:
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
<NuxtLink to='https://grahamshawcross.com/2012/10/12/aperiodic-tiling/'>https://grahamshawcross.com/2012/10/12/aperiodic-tiling/</NuxtLink>
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
<NuxtLink to='https://grahamshawcross.com/2012/10/12/wang-tiles-and-aperiodic-tiling/'>https://grahamshawcross.com/2012/10/12/wang-tiles-and-aperiodic-tiling/</NuxtLink>
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
<NuxtLink to='https://en.wikipedia.org/wiki/Wang_tile'>https://en.wikipedia.org/wiki/Wang_tile</NuxtLink>
|
||||
</div>
|
||||
<div class="mb-5">
|
||||
<NuxtLink to='https://en.wikipedia.org/wiki/Aperiodic_tiling'>https://en.wikipedia.org/wiki/Aperiodic_tiling</NuxtLink>
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
</SwiperSlide>
|
||||
<SwiperSlide data-hash="contact" class="p-10 text-xl overflow-hidden">
|
||||
<span class="swiper-no-swiping">
|
||||
<div class="overflow-auto">
|
||||
|
||||
<div class="mb-5 text-2xl">
|
||||
For information or any inquiries email Michael Winter by clicking
|
||||
<NuxtLink class="inline-flex p-1" to='javascript:location="mailto:\u006d\u0077\u0069\u006e\u0074\u0065\u0072\u0040\u0075\u006e\u0062\u006f\u0075\u006e\u0064\u0065\u0064\u0070\u0072\u0065\u0073\u0073\u002e\u006f\u0072\u0067";void 0'>
|
||||
<span class="font-bold">HERE</span>
|
||||
</NuxtLink>
|
||||
</div>
|
||||
<div class="mb-5 text-2xl">
|
||||
To download the poster for the project, click
|
||||
<NuxtLink class="inline-flex p-1" to='https://unboundedpress.org/pubs/hdp_poster.pdf'>
|
||||
<span class="font-bold">HERE</span>
|
||||
</NuxtLink>
|
||||
</div>
|
||||
<div class="mb-5 text-2xl">
|
||||
To download the poster specifically for the exhibition, click
|
||||
<NuxtLink class="inline-flex p-1" to='https://unboundedpress.org/pubs/a_few_thoughts_exhibition_poster.pdf'>
|
||||
<span class="font-bold">HERE</span>
|
||||
</NuxtLink>
|
||||
</div>
|
||||
</div>
|
||||
</span>
|
||||
</SwiperSlide>
|
||||
</Swiper>
|
||||
</div>
|
||||
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import hdp_background from "assets/hdp_background.png";
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
image: hdp_background, };
|
||||
}
|
||||
};
|
||||
</script>
|
||||
|
||||
<script setup>
|
||||
import { useAudioPlayerStore } from "@/stores/AudioPlayerStore"
|
||||
|
||||
const audioPlayerStore = useAudioPlayerStore()
|
||||
audioPlayerStore.setSoundCloudTrackID(324252345)
|
||||
|
||||
</script>
|
||||
|
|
@ -1,100 +0,0 @@
|
|||
<template>
|
||||
<div class="bg-zinc-100 rounded-lg m-5 grid grid-cols-[60%,35%] gap-10 divide-x divide-solid divide-black py-4 min-h-[calc(100vh-10.5rem)]">
|
||||
<div class="px-5">
|
||||
<p class="text-lg">about</p>
|
||||
|
||||
<div class="leading-tight py-2 ml-3 text-sm">
|
||||
<div class="leading-tight py-2">
|
||||
My practice as a composer and sound artist is diverse, ranging from music created by digital and acoustic instruments to installations and kinetic sculptures. Each piece typically explores one simple process and often reflects various related interests of mine such as epistemology, mathematics, algorithmic information theory, and the history of science. Phenomenologically, I contemplate the possibility that everything is potentially computable, even our experiences. Given this digital philosophy, I acknowledge even my most open works as algorithmic; and, while not always apparent on the surface of any given piece, the considerations of computability and epistemology are integral to my practice. I often reconcile epistemological limits with artistic practicality by understanding the limits of computation from an artistic and experiential vantage point and by collaborating with other artists, mathematicians, and scientists in order to integrate objects, ideas, and texts from various domains as structural elements in my pieces. My work also aims to subvert discriminatory conventions and hierarchies by exploring alternative forms of presentation and interaction, often with minimal resources and low information.
|
||||
</div>
|
||||
<div class="leading-tight py-2">
|
||||
My music and installations have been presented at venues and festivals throughout the world such as REDCAT, in Los Angeles; the Ostrava Festival of New Music in the Czech Republic; Tsonami Arte Sonoro Festival in Valparaiso, Chile; the Huddersfield New Music Festival in the United Kingdom; and Umbral Sesiones at the Museo de Arte Contemporáneo in Oaxaca, Mexico. Recordings of my music have been released by XI Records, Another Timbre, New World Records, Edition Wandelweiser, Bahn Mi Verlag, Tsonami Records, and Pogus Productions. In 2008, I co-founded <em>the wulf.</em>, a Los Angeles-based organization dedicated to experimental performance and art that presented over 350 events in 8 years. From 2018 to 2019, I was a fellow / artist-in-residence at the Akademie Schloss Solitude in Stuttgart, Germany. I currently teach as University Professor of Sound and Intermedia at the Gustav Mahler Privatuniversität für Musik in Klagenfurt, Austria while maintaining my primary residence in Berlin, Germany.
|
||||
</div>
|
||||
<br>
|
||||
<br>
|
||||
<div id="mc_embed_signup">
|
||||
<form action="https://unboundedpress.us12.list-manage.com/subscribe/post?u=bdadd25738fedf704641f3a80&id=01c5761ebb&f_id=00f143e0f0" method="post" id="mc-embedded-subscribe-form" name="mc-embedded-subscribe-form" class="validate" target="_self">
|
||||
<label for="mce-EMAIL">subscribe to my mailing list to know about upcoming events</label>
|
||||
<input id="mce-EMAIL" type="email" value="" name="EMAIL" placeholder="email address" required="" class="email">
|
||||
<div style="position: absolute; left: -5000px;" aria-hidden="true">
|
||||
<input type="text" name="b_bdadd25738fedf704641f3a80_01c5761ebb" tabindex="-1" value="">
|
||||
</div>
|
||||
<div id="mce-responses" class="clear foot">
|
||||
<div class="response" id="mce-error-response" style="display:none"></div>
|
||||
<div class="response" id="mce-success-response" style="display:none"></div>
|
||||
</div> <!-- real people should not fill this in and expect good things - do not remove this or risk form bot signups-->
|
||||
<div class="clear">
|
||||
<input id="mc-embedded-subscribe" type="submit" value="subscribe" name="subscribe" class="button">
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
<br>
|
||||
<br>
|
||||
<div class="inline-flex place-items-center p-2">
|
||||
Contact
|
||||
<div>
|
||||
<IconButton :visible="true" type="email" work="placeholder" link="javascript:location='mailto:\u006d\u0077\u0069\u006e\u0074\u0065\u0072\u0040\u0075\u006e\u0062\u006f\u0075\u006e\u0064\u0065\u0064\u0070\u0072\u0065\u0073\u0073\u002e\u006f\u0072\u0067';void 0"></IconButton>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<div class="inline-flex place-items-center p-2">
|
||||
CV
|
||||
<div>
|
||||
<IconButton :visible="true" type="document" work="placeholder" link="https://unboundedpress.org/legacy/cv"></IconButton>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<div class="inline-flex place-items-center p-2">
|
||||
Works List with Presentation History
|
||||
<div>
|
||||
<IconButton :visible="true" type="document" work="placeholder" link="https://unboundedpress.org/legacy/works_list"></IconButton>
|
||||
</div>
|
||||
</div>
|
||||
<br>
|
||||
<br>
|
||||
</div>
|
||||
</div>
|
||||
<div class="px-5">
|
||||
<ImageSlider bucket="images" :gallery="gallery" class="max-w-[90%]"></ImageSlider>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
|
||||
const { data: images } = await useFetch('https://unboundedpress.org/api/images.files?pagesize=200')
|
||||
|
||||
const { data: gallery } = await useFetch('https://unboundedpress.org/api/my_image_gallery?pagesize=200', {
|
||||
transform: (gallery) => {
|
||||
for (const item of gallery) {
|
||||
item.image_id = images.value.find(obj => {return obj.filename === item.image})._id.$oid
|
||||
}
|
||||
return gallery //.sort((a,b) => a.priority - b.priority)
|
||||
}
|
||||
})
|
||||
|
||||
useHead({
|
||||
titleTemplate: 'Michael Winter - About - Short Bio, Contact, CV, Works List, and Mailing List'
|
||||
})
|
||||
</script>
|
||||
|
||||
<style>
|
||||
#mc_embed_signup form {text-align:left; padding:2px 0 2px 0;}
|
||||
.mc-field-group { display: inline-block; } /* positions input field horizontally */
|
||||
#mc_embed_signup input.email {border: 1px solid #ABB0B2; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; color: #343434; background-color: #fff; box-sizing:border-box; height:32px; padding: 0px 0.4em; display: inline-block; margin: 0; width:350px; vertical-align:top;}
|
||||
#mc_embed_signup label {display:block; padding-bottom:10px;}
|
||||
#mc_embed_signup .clear {display: inline-block;} /* positions button horizontally in line with input */
|
||||
#mc_embed_signup .button {font-size: 13px; border: none; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; letter-spacing: .03em; color: #fff; background-color: #aaa; box-sizing:border-box; height:32px; line-height:32px; padding:0 18px; display: inline-block; margin: 0; transition: all 0.23s ease-in-out 0s;}
|
||||
#mc_embed_signup .button:hover {background-color:#777; cursor:pointer;}
|
||||
#mc_embed_signup div#mce-responses {float:left; top:-1.4em; padding:0em .5em 0em .5em; overflow:hidden; width:90%;margin: 0 5%; clear: both;}
|
||||
#mc_embed_signup div.response {margin:1em 0; padding:1em .5em .5em 0; font-weight:bold; float:left; top:-1.5em; z-index:1; width:80%;}
|
||||
#mc_embed_signup #mce-error-response {display:none;}
|
||||
#mc_embed_signup #mce-success-response {color:#529214; display:none;}
|
||||
#mc_embed_signup label.error {display:block; float:none; width:auto; margin-left:1.05em; text-align:left; padding:.5em 0;}
|
||||
@media (max-width: 768px) {
|
||||
#mc_embed_signup input.email {width:100%; margin-bottom:5px;}
|
||||
#mc_embed_signup .clear {display: block; width: 100% }
|
||||
#mc_embed_signup .button {width: 100%; margin:0; }
|
||||
}
|
||||
#mc_embed_signup{clear:left; width:100%;}
|
||||
</style>
|
||||
|
|
@ -1,92 +0,0 @@
|
|||
<template>
|
||||
<div class="bg-zinc-100 rounded-lg m-5 grid grid-cols-2 gap-10 divide-x divide-solid divide-black py-4 mb-10">
|
||||
|
||||
<div class="px-5">
|
||||
<p class="text-lg">performances</p>
|
||||
|
||||
<div v-for="(item, index) in events">
|
||||
<Collapsible title='placeholder' :modelValue='index <= 10' class="leading-tight py-2 ml-3 text-sm">
|
||||
<template v-slot:title>
|
||||
<div class="gap-1 w-[95%] px-2">
|
||||
<div>
|
||||
{{ item.formatted_date }}: {{item.venue.city}}, {{item.venue.state}}
|
||||
<div class="ml-4 text-[#7F7F7F]">
|
||||
{{ item.venue.name }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
<template v-slot:content>
|
||||
<div v-for="performance in item.program">
|
||||
<div class="italic text-sm ml-16 pt-1">{{performance.work}}</div>
|
||||
<div v-if="performance.ensemble" class="ml-20">
|
||||
{{ performance.ensemble }}
|
||||
</div>
|
||||
<div v-for="performer in performance.performers" class="ml-20">
|
||||
{{ performer.name }} -
|
||||
<span v-for="(instrument, index) in performer.instrument_tags">
|
||||
<span v-if="index !== 0">, </span>
|
||||
{{ instrument }}
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="italic text-sm ml-16 pt-1">{{item.legacy_program}}</div>
|
||||
<div class="ml-20">{{item.legacy_performers}}</div>
|
||||
</template>
|
||||
</Collapsible>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="px-5">
|
||||
<p class="text-lg">lectures</p>
|
||||
|
||||
<div class="leading-tight py-2 ml-3 text-sm" v-for="item in lectures">
|
||||
<div class="gap-1">
|
||||
<div>
|
||||
{{ item.formatted_date }}: {{item.location}}
|
||||
<div v-for="talk in item.talks" class="ml-4 text-[#7F7F7F]">
|
||||
{{ talk.title }}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
|
||||
<script setup>
|
||||
const { data: events } = await useFetch('https://unboundedpress.org/api/events?pagesize=200', {
|
||||
transform: (events) => {
|
||||
for (const event of events) {
|
||||
let date = new Date(event.start_date.$date)
|
||||
event.formatted_date = ("0" + (date.getMonth() + 1)).slice(-2) + "." + ("0" + date.getDate()).slice(-2) + "." + date.getFullYear()
|
||||
}
|
||||
return events.sort((a,b) => b.start_date.$date - a.start_date.$date)
|
||||
}
|
||||
})
|
||||
|
||||
const { data: lectures } = await useFetch('https://unboundedpress.org/api/talks?pagesize=200', {
|
||||
transform: (events) => {
|
||||
for (const event of events) {
|
||||
let date = new Date(event.date)
|
||||
event.date = date
|
||||
event.formatted_date = ("0" + (date.getMonth() + 1)).slice(-2) + "." + ("0" + date.getDate()).slice(-2) + "." + date.getFullYear()
|
||||
if(typeof event.title === 'string' || event.title instanceof String) {event.talks = [{'title': event.title}]
|
||||
} else {
|
||||
let talks = []
|
||||
for(const talk of event.title){
|
||||
talks.push({"title": talk})
|
||||
}
|
||||
event.talks = talks
|
||||
}
|
||||
}
|
||||
return events.sort((a,b) => b.date - a.date)
|
||||
}
|
||||
})
|
||||
|
||||
useHead({
|
||||
titleTemplate: 'Michael Winter - Events - Performances and Lectures'
|
||||
})
|
||||
</script>
|
||||
|
||||
|
|
@ -1,198 +0,0 @@
|
|||
<template>
|
||||
<div class="bg-zinc-100 rounded-lg m-5 grid grid-cols-3 gap-10 divide-x divide-solid divide-black py-4 mb-10">
|
||||
|
||||
<div class="px-5">
|
||||
<p class="text-lg">pieces</p>
|
||||
|
||||
<div class="py-2 ml-3" v-for="item in works">
|
||||
<p class="font-thin">{{ item.year }}</p>
|
||||
<div class="leading-tight py-1 ml-3" v-for="work in item.works">
|
||||
<div class="grid grid-cols-[65%,30%] gap-1 font-thin">
|
||||
<div class="italic text-sm">{{ work.title }}</div>
|
||||
<div class="inline-flex">
|
||||
|
||||
<div>
|
||||
<IconButton :visible="work.score" type="score" :work="work" :link="work.score" class="inline-flex p-1"></IconButton>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<IconButton :visible="work.soundcloud_trackid" type="audio" :work="work" class="inline-flex p-1"></IconButton>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<IconButton :visible="work.vimeo_trackid" type="video" :work="work" class="inline-flex p-1"></IconButton>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<IconButton :visible="work.gallery" type="image" :work="work" class="inline-flex p-1"></IconButton>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="px-5">
|
||||
<p class="text-lg">writings</p>
|
||||
|
||||
<div class="leading-tight py-2 ml-3 text-sm" v-for="item in pubs">
|
||||
<div class="grid grid-cols-[95%,5%] gap-1">
|
||||
<div>
|
||||
<span v-html="item.entryTags.title"></span>
|
||||
<div class="ml-4 text-[#7F7F7F]">
|
||||
{{ item.entryTags.author }}
|
||||
<span v-if=item.entryTags.booktitle>{{ item.entryTags.booktitle}}. </span>
|
||||
<span v-if=item.entryTags.journal>{{item.entryTags.journal}}. </span>
|
||||
<span v-if=item.entryTags.editor>editors {{item.entryTags.editor}} </span>
|
||||
<span v-if=item.entryTags.volume>volume {{item.entryTags.volume}}.</span>
|
||||
<span v-if=item.entryTags.publisher>{{item.entryTags.publisher}}.</span>
|
||||
{{ item.entryTags.year }}.
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<IconButton :visible=item.entryTags.howpublished type="document" :link="item.entryTags.howpublished" class="inline-flex p-1"></IconButton>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="px-5">
|
||||
<p class="text-lg">albums</p>
|
||||
<div class="leading-tight py-4 ml-3 text-sm" v-for="item in releases">
|
||||
<p class="text-center leading-tight py-2">{{ item.title }}</p>
|
||||
<button @click="modalStore.setModalProps('image', 'aspect-auto', true, 'album_art', [{image_id: item.album_art_id}], '')">
|
||||
<nuxt-img :src="'https://unboundedpress.org/api/album_art.files/' + item.album_art_id + '/binary'"
|
||||
quality="50"/>
|
||||
</button>
|
||||
<div class="flex place-content-center place-items-center">
|
||||
<IconButton :visible="item.discogs_id" type="discogs" :link="'https://www.discogs.com/release/' + item.discogs_id"></IconButton>
|
||||
<IconButton :visible="item.buy_link" type="buy" :link="item.buy_link"></IconButton>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
|
||||
import { useModalStore } from "@/stores/ModalStore"
|
||||
|
||||
const modalStore = useModalStore()
|
||||
|
||||
const groupBy = (x,f)=>x.reduce((a,b,i)=>((a[f(b,i,x)]||=[]).push(b),a),{});
|
||||
|
||||
const isValidUrl = urlString => {
|
||||
/*
|
||||
var urlPattern = new RegExp('^(https?:\\/\\/)?'+ // validate protocol
|
||||
'((([a-z\\d]([a-z\\d-]*[a-z\\d])*)\\.)+[a-z]{2,}|'+ // validate domain name
|
||||
'((\\d{1,3}\\.){3}\\d{1,3}))'+ // validate OR ip (v4) address
|
||||
'(\\:\\d+)?(\\/[-a-z\\d%_.~+]*)*'+ // validate port and path
|
||||
'(\\?[;&a-z\\d%_.~+=-]*)?'+ // validate query string
|
||||
'(\\#[-a-z\\d_]*)?$','i'); // validate fragment locator
|
||||
return !!urlPattern.test(urlString);
|
||||
*/
|
||||
|
||||
var pattern = /^((http|https|ftp):\/\/)/;
|
||||
return pattern.test(urlString)
|
||||
}
|
||||
|
||||
|
||||
const { data: images } = await useFetch('https://unboundedpress.org/api/images.files?pagesize=200')
|
||||
|
||||
const { data: works } = await useFetch('https://unboundedpress.org/api/works?pagesize=200', {
|
||||
transform: (works) => {
|
||||
for (const work of works) {
|
||||
if(work.score){
|
||||
work.score = "/scores/" + work.score
|
||||
}
|
||||
/*
|
||||
if(work.images){
|
||||
let image_ids = [];
|
||||
for (const image of work.images){
|
||||
image_ids.push(images.value.find(obj => {return obj.filename === image.filename})._id.$oid)
|
||||
}
|
||||
work.image_ids = image_ids
|
||||
}
|
||||
*/
|
||||
if(work.images){
|
||||
let gallery = [];
|
||||
for (const image of work.images){
|
||||
gallery.push({
|
||||
image_id: images.value.find(obj => {return obj.filename === image.filename})._id.$oid,
|
||||
})
|
||||
}
|
||||
work.gallery = gallery
|
||||
}
|
||||
}
|
||||
let priorityGroups = groupBy(works, work => work.priority)
|
||||
let groups = groupBy(priorityGroups["1"], work => new Date(work.date.$date).getFullYear())
|
||||
groups = Object.keys(groups).map((year) => {
|
||||
return {
|
||||
year,
|
||||
works: groups[year].sort((a,b) => b.date.$date - a.date.$date)
|
||||
};
|
||||
});
|
||||
groups.sort((a,b) => b.year - a.year)
|
||||
groups.push({year: "miscellany", works: priorityGroups["2"].sort((a,b) => b.date.$date - a.date.$date)})
|
||||
return groups
|
||||
}
|
||||
})
|
||||
|
||||
//const { data: pubs } = await useFetch('https://unboundedpress.org/api/publications/_aggrs/publications?pagesize=200')
|
||||
//const { data: pubs } = await useFetch('https://unboundedpress.org/api/publications?sort=-entryTags.year&pagesize=200')
|
||||
const { data: pubs } = await useFetch('https://unboundedpress.org/api/publications?pagesize=200', {
|
||||
transform: (pubs) => {
|
||||
for (const pub of pubs) {
|
||||
if(pub.entryTags.howpublished && !(isValidUrl(pub.entryTags.howpublished))){
|
||||
pub.entryTags.howpublished = "/pubs/" + pub.entryTags.howpublished
|
||||
}
|
||||
}
|
||||
return pubs.sort((a,b) => (a.citationKey > b.citationKey) ? -1 : ((b.citationKey > a.citationKey) ? 1 : 0))
|
||||
/*
|
||||
return pubs.sort((a,b) => {
|
||||
let aPrime = 5000
|
||||
let bPrime = 5000
|
||||
if(a.entryTags.year === 'forthcoming'){aPrime = 5000} else {aPrime = a.entryTags.year}
|
||||
if(b.entryTags.year === 'forthcoming'){bPrime = 5000} else {bPrime = b.entryTags.year}
|
||||
return bPrime - aPrime
|
||||
})
|
||||
*/
|
||||
}
|
||||
})
|
||||
|
||||
const { data: album_art } = await useFetch('https://unboundedpress.org/api/album_art.files?pagesize=200')
|
||||
|
||||
const { data: releases } = await useFetch('https://unboundedpress.org/api/releases?pagesize=200', {
|
||||
//lazy: true,
|
||||
//server: false,
|
||||
transform: (releases) => {
|
||||
for (const release of releases) {
|
||||
release.album_art_id = album_art.value.find(obj => {return obj.filename === release.album_art})._id.$oid
|
||||
}
|
||||
return releases.sort((a,b) => b.date - a.date)
|
||||
}
|
||||
})
|
||||
|
||||
/*
|
||||
watch(releases, (response)=>{
|
||||
//console.log(response)
|
||||
for (const item of response) {
|
||||
useFetch(`https://unboundedpress.org/api/album_art.files?filter={"filename":"${item.album_art}"}`).then((response) => {
|
||||
item.album_art_id = response.data.value[0]._id.$oid
|
||||
})
|
||||
}
|
||||
return response
|
||||
|
||||
}, {
|
||||
//deep: true,
|
||||
immediate: true
|
||||
})
|
||||
*/
|
||||
|
||||
useHead({
|
||||
titleTemplate: 'Michael Winter - Home / Works - Pieces, Publications, and Albums'
|
||||
})
|
||||
|
||||
</script>
|
||||
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 367 KiB |
|
Before Width: | Height: | Size: 39 KiB |
|
Before Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 68 KiB |
|
Before Width: | Height: | Size: 33 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 70 KiB |
|
Before Width: | Height: | Size: 266 KiB |
|
Before Width: | Height: | Size: 25 KiB |
|
Before Width: | Height: | Size: 2.2 MiB |
|
|
@ -1,3 +0,0 @@
|
|||
{
|
||||
"extends": "../.nuxt/tsconfig.server.json"
|
||||
}
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
import {defineStore} from "pinia";
|
||||
|
||||
export const useAudioPlayerStore = defineStore("AudioPlayerStore", {
|
||||
state: () => ({"soundcloud_trackid": "1032587794"}),
|
||||
actions: {
|
||||
setSoundCloudTrackID(trackid) {
|
||||
if (typeof trackid !== 'undefined') {
|
||||
this.soundcloud_trackid = trackid
|
||||
}
|
||||
},
|
||||
clearSoundCloudTrackID() {
|
||||
this.soundcloud_trackid = 'undefined'
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
@ -1,15 +0,0 @@
|
|||
import {defineStore} from "pinia";
|
||||
|
||||
export const useModalStore = defineStore("ModalStore", {
|
||||
state: () => ({"type": "", "aspect":"", "isOpen":false, "bucket":"", "gallery":"", "vimeo_trackid":""}),
|
||||
actions: {
|
||||
setModalProps(type, aspect, isOpen, bucket, gallery, vimeo_trackid) {
|
||||
this.type = type
|
||||
this.aspect = aspect
|
||||
this.isOpen = isOpen
|
||||
this.bucket = bucket
|
||||
this.gallery = gallery
|
||||
this.vimeo_trackid = vimeo_trackid
|
||||
}
|
||||
}
|
||||
})
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
{
|
||||
// https://nuxt.com/docs/guide/concepts/typescript
|
||||
"extends": "./.nuxt/tsconfig.json"
|
||||
}
|
||||
|
|
@ -1,12 +0,0 @@
|
|||
# Ignore everything
|
||||
*
|
||||
|
||||
# Allow files and directories
|
||||
!/src
|
||||
|
||||
# Ignore unnecessary files inside allowed directories
|
||||
# This should go after the allowed directories
|
||||
**/*~
|
||||
**/*.log
|
||||
**/.DS_Store
|
||||
**/Thumbs.db
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
FROM node:19-bullseye-slim
|
||||
|
||||
WORKDIR /src
|
||||
|
||||
COPY src/package*.json ./
|
||||
|
||||
COPY . .
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
echo "**********************************************"
|
||||
echo "Waiting for startup.."
|
||||
sleep 15
|
||||
echo "done"
|
||||
|
||||
echo SETUP.sh time now: `date +"%T" `
|
||||
|
||||
mongo --host mongo:27017 -u ${MONGO_INITDB_ROOT_USERNAME} -p ${MONGO_INITDB_ROOT_PASSWORD} <<EOF
|
||||
|
||||
var cfg = {
|
||||
"_id": "rs0",
|
||||
"protocolVersion": 1,
|
||||
"version": 1,
|
||||
"members": [
|
||||
{
|
||||
"_id": 0,
|
||||
"host": "mongo:27017",
|
||||
"priority": 2
|
||||
}
|
||||
]
|
||||
};
|
||||
rs.initiate(cfg, { force: true });
|
||||
rs.secondaryOk();
|
||||
db.getMongo().setReadPref('primary');
|
||||
rs.status();
|
||||
EOF
|
||||
|
|
@ -1,26 +0,0 @@
|
|||
echo "**********************************************"
|
||||
echo "Waiting for startup.."
|
||||
sleep 15
|
||||
echo "done"
|
||||
|
||||
echo SETUP.sh time now: `date +"%T" `
|
||||
|
||||
mongosh --host mongo:27017 -u ${MONGO_INITDB_ROOT_USERNAME} -p ${MONGO_INITDB_ROOT_PASSWORD} <<EOF
|
||||
|
||||
var cfg = {
|
||||
"_id": "rs0",
|
||||
"protocolVersion": 1,
|
||||
"version": 1,
|
||||
"members": [
|
||||
{
|
||||
"_id": 0,
|
||||
"host": "mongo:27017",
|
||||
"priority": 2
|
||||
}
|
||||
]
|
||||
};
|
||||
rs.initiate(cfg, { force: true });
|
||||
rs.secondaryOk();
|
||||
db.getMongo().setReadPref('primary');
|
||||
rs.status();
|
||||
EOF
|
||||
|
|
@ -1,4 +0,0 @@
|
|||
USER=username
|
||||
PASSWORD=really_strong_password
|
||||
EMAIL=email
|
||||
DOMAIN=your_domain.tld
|
||||
|
|
@ -1,107 +0,0 @@
|
|||
var express = require('express');
|
||||
var path = require('path');
|
||||
var favicon = require('serve-favicon');
|
||||
var logger = require('morgan');
|
||||
var cookieParser = require('cookie-parser');
|
||||
var bodyParser = require('body-parser');
|
||||
var fs = require('fs');
|
||||
var engines = require('consolidate')
|
||||
var handlebars = require('handlebars');
|
||||
var bibtexParse = require('bibtex-parse-js');
|
||||
|
||||
// note that this is the same env variables of the docker project,
|
||||
// but you still need the .env file in both locations because everything is dockerized!!!
|
||||
require('dotenv').config();
|
||||
|
||||
const port = process.env.PORT || 3000;
|
||||
|
||||
var MongoClient = require('mongodb').MongoClient;
|
||||
var url = 'mongodb://' + process.env.USER + ':' + process.env.PASSWORD + '@mongo:27017/portfolio?authSource=admin';
|
||||
var dbName = "portfolio";
|
||||
var assert = require('assert');
|
||||
|
||||
|
||||
var client = MongoClient.connect(url, function (err, client) {
|
||||
assert.equal(null, err);
|
||||
console.log("Connected successfully to server");
|
||||
|
||||
// This runs on startup, which means bibtex entries are only updated when the server is restarted
|
||||
db = client.db(dbName);
|
||||
var pubdata = fs.readFileSync( path.join(__dirname, 'public/bibtex/bibtex.bib'), 'utf8');
|
||||
var pubs = bibtexParse.toJSON(pubdata);
|
||||
//pubs.sort(function(a, b){return a.entryTags.year-b.EntryTags.year})
|
||||
|
||||
// Create the collection
|
||||
db.collection('publications').remove();
|
||||
db.collection('publications').insert(pubs);
|
||||
|
||||
client
|
||||
});
|
||||
|
||||
// close client when app closes
|
||||
const cleanup = (event) => { // SIGINT is sent for example when you Ctrl+C a running process from the command line.
|
||||
client.close(); // Close MongodDB Connection when Process ends
|
||||
process.exit(); // Exit with default success-code '0'.
|
||||
}
|
||||
process.on('SIGINT', cleanup);
|
||||
process.on('SIGTERM', cleanup);
|
||||
|
||||
var routes = require('./routes/index');
|
||||
var app = express();
|
||||
|
||||
// view engine setup
|
||||
app.set('views', path.join(__dirname, 'views'));
|
||||
app.set('view engine', 'jade');
|
||||
app.set("view options", { layout: true });
|
||||
app.engine('.template', engines.handlebars);
|
||||
|
||||
// uncomment after placing your favicon in /public
|
||||
//app.use(favicon(__dirname + '/public/favicon.ico'));
|
||||
app.use(logger('dev'));
|
||||
app.use(bodyParser.json());
|
||||
app.use(bodyParser.urlencoded({ extended: false }));
|
||||
app.use(bodyParser());
|
||||
app.use(cookieParser());
|
||||
// change first argument here to be on subdirectory
|
||||
app.use('/legacy', express.static(path.join(__dirname, 'public')));
|
||||
|
||||
// Make our db accessible to our router
|
||||
app.use(function(req,res,next){
|
||||
req.db = db;
|
||||
next();
|
||||
});
|
||||
|
||||
// change first argument here to be on subdirectory
|
||||
app.use('/legacy/', routes);
|
||||
|
||||
// catch 404 and forward to error handler
|
||||
app.use(function(req, res, next) {
|
||||
var err = new Error('Not Found');
|
||||
err.status = 404;
|
||||
next(err);
|
||||
});
|
||||
|
||||
// development error handler
|
||||
// will print stacktrace
|
||||
if (app.get('env') === 'development') {
|
||||
app.use(function(err, req, res, next) {
|
||||
res.status(err.status || 500);
|
||||
res.render('error', {
|
||||
message: err.message,
|
||||
error: err
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// production error handler
|
||||
// no stacktraces leaked to user
|
||||
app.use(function(err, req, res, next) {
|
||||
res.status(err.status || 500);
|
||||
res.render('error', {
|
||||
message: err.message,
|
||||
error: {}
|
||||
});
|
||||
});
|
||||
|
||||
var server = app.listen(port);
|
||||
module.exports = app;
|
||||
7975
portfolio/src/package-lock.json
generated
|
|
@ -1,32 +0,0 @@
|
|||
{
|
||||
"name": "portfolio",
|
||||
"version": "2.0.0",
|
||||
"description": "node website for michael winter portfolio",
|
||||
"main": "app.js",
|
||||
"dependencies": {
|
||||
"async": "^3.1.0",
|
||||
"bibtex-parse-js": "0.0.24",
|
||||
"consolidate": "^0.15.1",
|
||||
"cookie-parser": "^1.4.4",
|
||||
"express": "^4.17.1",
|
||||
"handlebars": "^4.1.2",
|
||||
"jade": "^1.11.0",
|
||||
"moment": "^2.24.0",
|
||||
"mongodb": "^3.2.7",
|
||||
"morgan": "^1.9.1",
|
||||
"request": "^2.88.0",
|
||||
"serve-favicon": "^2.5.0",
|
||||
"dotenv": "^8.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"nodemon": "^1.18.3",
|
||||
"prettier": "^2.0.5"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "node app.js",
|
||||
"serve": "nodemon app.js",
|
||||
"format": "prettier app.js **/*.js --write"
|
||||
},
|
||||
"author": "michael winter",
|
||||
"license": "GPL-3.0-or-later"
|
||||
}
|
||||
|
|
@ -1,246 +0,0 @@
|
|||
|
||||
@article{Winter25c,
|
||||
author = {},
|
||||
title = {Tom Johnson and a Rational Theory of Harmony},
|
||||
year = {forthcoming in the Journal of Mathematics and Music},
|
||||
}
|
||||
|
||||
@article{Winter25a,
|
||||
author = {with Abrahão, F., Zenil, H., Porto, F., Wehmuth, K. and D'Ottaviano, I.},
|
||||
title = {A simplicity bubble problem in formal-theoretic learning systems},
|
||||
year = {forthcoming},
|
||||
}
|
||||
|
||||
|
||||
@incollection{Winter24a,
|
||||
author={with Abrahão, F., Cavassane, R., Rodrigues, M. and D'Ottaviano, I.},
|
||||
title={A simplicity bubble problem and zemblanity in digitally intermediated societies},
|
||||
booktitle="Model-Based Reasoning, Abductive Cognition, Creativity",
|
||||
year="2024",
|
||||
publisher="Springer Nature Switzerland",
|
||||
howpublished = {https://link.springer.com/chapter/10.1007/978-3-031-69300-7_20}
|
||||
}
|
||||
|
||||
@article{Winter23,
|
||||
author={with Lach Lau, J.S.},
|
||||
title={hidden gems: a few important ideas by C/K_l_r_n_e B_rl_w},
|
||||
year="2023",
|
||||
publisher="GMEA",
|
||||
howpublished = {barlow_hidden_gems.pdf}
|
||||
}
|
||||
|
||||
|
||||
@article{Winter20c,
|
||||
author = {with Dantas, P.},
|
||||
title = {Evolving curricula: reflections on The Quarantine Seminars},
|
||||
year = {2020},
|
||||
publisher = {Unbounded Press},
|
||||
howpublished = {reflections_on_the_quarantine_seminars.pdf}
|
||||
}
|
||||
|
||||
|
||||
@incollection{Winter20b,
|
||||
author = {},
|
||||
title = {Meta+phenomenology: primer towards a phenomenology formally based on algorithmic information theory and metabiology},
|
||||
editor = {Doria, F. and Wuppuluri, S.},
|
||||
booktitle = {Unravelling Complexity: Life and Work of Gregory Chaitin},
|
||||
publisher = {World Scientific},
|
||||
year = {2020},
|
||||
howpublished = {https://www.worldscientific.com/worldscibooks/10.1142/11270}
|
||||
}
|
||||
|
||||
@misc{Winter20a,
|
||||
author = {},
|
||||
title = {Liner notes to the album <em>the yggdrasil-soli</em> by Ulrich Krieger},
|
||||
publisher = {Winds Measures Recordings},
|
||||
year = {2020},
|
||||
howpublished = {krieger_yggdrasil_soli_liner_notes.pdf}
|
||||
}
|
||||
|
||||
@incollection{Winter19c,
|
||||
author = {},
|
||||
title = {A few more thoughts about Leibniz: the prediction of harmonic distance in harmonic space (with text to preliminary thoughts)},
|
||||
journal = {MusMat: Brazilian Journal of Music and Mathematics},
|
||||
volume = {3},
|
||||
number = {1},
|
||||
pages = {79–92},
|
||||
year = {2019},
|
||||
howpublished = {A_few_more_thoughts_about_Leibniz.pdf}
|
||||
}
|
||||
|
||||
@incollection{Winter19b,
|
||||
author = {},
|
||||
title = {steady state: a study in taxation},
|
||||
editor = {Vriezen, S.},
|
||||
volume = {38},
|
||||
journal = {nY},
|
||||
year = {2019},
|
||||
howpublished = {https://www.ny-web.be/tijdschrift/feb-2019/}
|
||||
}
|
||||
|
||||
@misc{Winter19a,
|
||||
author = {with Polansky, L.},
|
||||
title = {liner notes to the album <em>Changes</em> by James Tenney},
|
||||
publisher = {New World Records},
|
||||
year = {2019},
|
||||
howpublished = {tenney_changes_liner_notes.pdf}
|
||||
}
|
||||
|
||||
@incollection{Winter17a,
|
||||
author = {},
|
||||
title = {On minimal change musical morphologies},
|
||||
editor = {Pareyon, G., Pina-Romero, S., Agustin-Aquino, O.A., and Lluis-Puebla, E.},
|
||||
booktitle = {The Musical-Mathematical Mind},
|
||||
publisher = {Springer},
|
||||
year = {2017},
|
||||
howpublished = {On_minimal_change_musical_morphologies.pdf}
|
||||
}
|
||||
|
||||
|
||||
@misc{Winter16a,
|
||||
author = {},
|
||||
title = {Liner notes to the album <em>Three Pieces for Two Pianos</em> by Larry Polansky},
|
||||
publisher = {New World Records},
|
||||
year = {2016},
|
||||
howpublished = {polansky_piano_liner_notes.pdf}
|
||||
}
|
||||
|
||||
@Book{Winter15a,
|
||||
author = {Tenney, J.},
|
||||
title = {From Scratch: Writings in Music Theory},
|
||||
editor = {Polansky, L., Pratt, L., Wannamaker, R., and Winter, M.},
|
||||
publisher = {University of Illinois Press},
|
||||
year = {2015},
|
||||
howpublished = {https://www.press.uillinois.edu/books/catalog/78det5km.html}
|
||||
}
|
||||
|
||||
@misc{Winter14b,
|
||||
author = {},
|
||||
title = {Approximating Omega},
|
||||
journal = {Carbono (online)},
|
||||
volume = {7},
|
||||
year = {2014},
|
||||
howpublished = {https://revistacarbono.com/artigos/07-omega-michael-winter/}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@article{Winter14a,
|
||||
author = {with Akhmedov, A.},
|
||||
title = {Chordal and timbral morphologies using Hamiltonian cycles},
|
||||
journal = {Journal of Mathematics and Music},
|
||||
volume = {8},
|
||||
number = {1},
|
||||
pages = {1–24},
|
||||
year = {2014},
|
||||
howpublished = {Chordal_and_timbral_morphologies_using_Hamiltonian_cycles.pdf}
|
||||
}
|
||||
|
||||
@incollection{Winter12a,
|
||||
author = {},
|
||||
title = {Relativity and scalability with respect to sound and silence},
|
||||
editor = {Lely, J. and Saunders, M.},
|
||||
booktitle = {Word Events: Perspectives on Verbal Notation},
|
||||
publisher = {Bloomsbury},
|
||||
year = {2012},
|
||||
howpublished = {https://www.bloomsbury.com/us/word-events-9781441173102/}
|
||||
}
|
||||
|
||||
|
||||
@article{Winter11a,
|
||||
author = {with Polansky, L. and Barnett, A.},
|
||||
title = {A few more words about James Tenney: dissonant counterpoint and statistical feedback},
|
||||
journal = {Journal of Mathematics and Music},
|
||||
volume = {5},
|
||||
number = {2},
|
||||
pages = {63–82},
|
||||
year = {2011},
|
||||
howpublished = {Dissonant_counterpoint_and_statistical_feedback.pdf}
|
||||
}
|
||||
|
||||
@misc{Winter10d,
|
||||
author = {},
|
||||
title = {Notes on a new economics for a new music},
|
||||
journal = {Experimental Music Yearbook (online)},
|
||||
volume = {2},
|
||||
year = {2010},
|
||||
howpublished = {https://experimentalmusicyearbook.com/filter/Michael-Winter/notes-on-a-new-economics-for-a-new-art}
|
||||
}
|
||||
|
||||
@article{Winter10c,
|
||||
author = {with Barrett, G.D.},
|
||||
title = {LiveScore: real–time notation in the music of Harris Wulfson},
|
||||
journal = {Contemporary Music Review},
|
||||
volume = {29},
|
||||
number = {1},
|
||||
pages = {55–62},
|
||||
year = {2010},
|
||||
howpublished = {Livescore.pdf}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@phdthesis{Winter10b,
|
||||
type = {Dissertation},
|
||||
title = {Structural Metrics: an epistemology},
|
||||
author = {},
|
||||
publisher = {Dissertation},
|
||||
school = {University of California, Santa Barbara},
|
||||
year = {2010},
|
||||
howpublished = {Structural_Metrics.pdf}
|
||||
}
|
||||
|
||||
|
||||
@article{Winter10a,
|
||||
author = {},
|
||||
title = {James Tenney: Selected Works 1961–1969 (review)},
|
||||
journal = {Journal of the Society for American Music},
|
||||
volume = {4},
|
||||
number = {Special Issue 04},
|
||||
month = {11},
|
||||
year = {2010},
|
||||
pages = {531–533}
|
||||
}
|
||||
|
||||
@misc{Winter09a,
|
||||
author = {with Hanson, S., Streb, C., and Polansky, L.},
|
||||
title = {James Tenney biographical entry},
|
||||
booktitle = {Grove Dictionary of American Music},
|
||||
publisher = {Oxford University Press},
|
||||
year = {2009}
|
||||
}
|
||||
|
||||
@article{Winter08a,
|
||||
author = {},
|
||||
title = {On James Tenney's <em>Arbor Vitae</em> for string quartet},
|
||||
journal = {Contemporary Music Review},
|
||||
volume = {27},
|
||||
number = {1},
|
||||
pages = {131–150},
|
||||
year = {2008},
|
||||
howpublished = {On_Arbor_Vitae.pdf}
|
||||
}
|
||||
|
||||
@article{Winter07b,
|
||||
author = {},
|
||||
title = {Mavericks on mavericks: James Tenney’s last courses at CalArts},
|
||||
journal = {MusikTexte},
|
||||
volume = {112},
|
||||
pages = {66–69},
|
||||
year = {2007},
|
||||
howpublished = {https://musiktexte.de/epages/dc91cfee-4fdc-41fe-82da-0c2b88528c1e.sf/de_DE/?ObjectPath=/Shops/dc91cfee-4fdc-41fe-82da-0c2b88528c1e/Products/MT-112}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@inproceedings{Winter07a,
|
||||
author = {with Barrett, G.D. and Wulfson, H.},
|
||||
title = {Automatic Notation Generators},
|
||||
booktitle = {Proceedings of the 7th International NIME Conference},
|
||||
series = {NIME '07},
|
||||
year = {2007},
|
||||
pages = {346–351},
|
||||
acmid = {1279817},
|
||||
address = {New York, NY, USA},
|
||||
howpublished = {Automatic_notation_generators.pdf}
|
||||
}
|
||||
|
|
@ -1,244 +0,0 @@
|
|||
@article{Winter25c,
|
||||
author = {},
|
||||
title = {Tom Johnson and a Rational Theory of Harmony},
|
||||
year = {forthcoming in the Journal of Mathematics and Music},
|
||||
}
|
||||
|
||||
|
||||
@article{Winter25a,
|
||||
author = {with Abrahão, F., Zenil, H., Porto, F., Wehmuth, K. and D'Ottaviano, I.},
|
||||
title = {A simplicity bubble problem in formal-theoretic learning systems},
|
||||
year = {forthcoming},
|
||||
}
|
||||
|
||||
|
||||
@incollection{Winter24a,
|
||||
author={with Abrahão, F., Cavassane, R., Rodrigues, M. and D'Ottaviano, I.},
|
||||
title={A simplicity bubble problem and zemblanity in digitally intermediated societies},
|
||||
booktitle="Model-Based Reasoning, Abductive Cognition, Creativity",
|
||||
year="2024",
|
||||
publisher="Springer Nature Switzerland",
|
||||
howpublished = {https://link.springer.com/chapter/10.1007/978-3-031-69300-7_20}
|
||||
}
|
||||
|
||||
@article{Winter23,
|
||||
author={with Lach Lau, J.S.},
|
||||
title={hidden gems: a few important ideas by C/K_l_r_n_e B_rl_w},
|
||||
year="2023",
|
||||
publisher="GMEA",
|
||||
howpublished = {barlow_hidden_gems.pdf}
|
||||
}
|
||||
|
||||
@article{Winter20c,
|
||||
author = {with Dantas, P.},
|
||||
title = {Evolving curricula: reflections on The Quarantine Seminars},
|
||||
year = {2020},
|
||||
publisher = {Unbounded Press},
|
||||
howpublished = {reflections_on_the_quarantine_seminars.pdf}
|
||||
}
|
||||
|
||||
@incollection{Winter20b,
|
||||
author = {},
|
||||
title = {Meta+phenomenology: primer towards a phenomenology formally based on algorithmic information theory and metabiology},
|
||||
editor = {Doria, F. and Wuppuluri, S.},
|
||||
booktitle = {Unravelling Complexity: Life and Work of Gregory Chaitin},
|
||||
publisher = {World Scientific},
|
||||
year = {2020},
|
||||
howpublished = {https://www.worldscientific.com/worldscibooks/10.1142/11270}
|
||||
}
|
||||
|
||||
@misc{Winter20a,
|
||||
author = {},
|
||||
title = {Liner notes to the album <em>the yggdrasil-soli</em> by Ulrich Krieger},
|
||||
publisher = {Winds Measures Recordings},
|
||||
year = {2020},
|
||||
howpublished = {krieger_yggdrasil_soli_liner_notes.pdf}
|
||||
}
|
||||
|
||||
@incollection{Winter19c,
|
||||
author = {},
|
||||
title = {A few more thoughts about Leibniz: the prediction of harmonic distance in harmonic space (with text to preliminary thoughts)},
|
||||
journal = {MusMat: Brazilian Journal of Music and Mathematics},
|
||||
volume = {3},
|
||||
number = {1},
|
||||
pages = {79–92},
|
||||
year = {2019},
|
||||
howpublished = {A_few_more_thoughts_about_Leibniz.pdf}
|
||||
}
|
||||
|
||||
@incollection{Winter19b,
|
||||
author = {},
|
||||
title = {steady state: a study in taxation},
|
||||
editor = {Vriezen, S.},
|
||||
volume = {38},
|
||||
journal = {nY},
|
||||
year = {2019},
|
||||
howpublished = {https://www.ny-web.be/tijdschrift/feb-2019/}
|
||||
}
|
||||
|
||||
@misc{Winter19a,
|
||||
author = {with Polansky, L.},
|
||||
title = {Liner notes to the album <em>Changes</em> by James Tenney},
|
||||
publisher = {New World Records},
|
||||
year = {2019},
|
||||
howpublished = {tenney_changes_liner_notes.pdf}
|
||||
}
|
||||
|
||||
@incollection{Winter17a,
|
||||
author = {},
|
||||
title = {On minimal change musical morphologies},
|
||||
editor = {Pareyon, G., Pina-Romero, S., Agustin-Aquino, O.A., and Lluis-Puebla, E.},
|
||||
booktitle = {The Musical-Mathematical Mind},
|
||||
publisher = {Springer},
|
||||
year = {2017},
|
||||
howpublished = {On_minimal_change_musical_morphologies.pdf}
|
||||
}
|
||||
|
||||
|
||||
@misc{Winter16a,
|
||||
author = {},
|
||||
title = {Liner notes to the album <em>Three Pieces for Two Pianos</em> by Larry Polansky},
|
||||
publisher = {New World Records},
|
||||
year = {2016},
|
||||
howpublished = {polansky_piano_liner_notes.pdf}
|
||||
}
|
||||
|
||||
@Book{Winter15a,
|
||||
author = {Tenney, J.},
|
||||
title = {From Scratch: Writings in Music Theory},
|
||||
editor = {Polansky, L., Pratt, L., Wannamaker, R., and Winter, M.},
|
||||
publisher = {University of Illinois Press},
|
||||
year = {2015},
|
||||
howpublished = {https://www.press.uillinois.edu/books/catalog/78det5km.html}
|
||||
}
|
||||
|
||||
@misc{Winter14b,
|
||||
author = {},
|
||||
title = {Approximating Omega},
|
||||
journal = {Carbono (online)},
|
||||
volume = {7},
|
||||
year = {2014},
|
||||
howpublished = {https://revistacarbono.com/artigos/07-omega-michael-winter/}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@article{Winter14a,
|
||||
author = {with Akhmedov, A.},
|
||||
title = {Chordal and timbral morphologies using Hamiltonian cycles},
|
||||
journal = {Journal of Mathematics and Music},
|
||||
volume = {8},
|
||||
number = {1},
|
||||
pages = {1–24},
|
||||
year = {2014},
|
||||
howpublished = {Chordal_and_timbral_morphologies_using_Hamiltonian_cycles.pdf}
|
||||
}
|
||||
|
||||
@incollection{Winter12a,
|
||||
author = {},
|
||||
title = {Relativity and scalability with respect to sound and silence},
|
||||
editor = {Lely, J. and Saunders, M.},
|
||||
booktitle = {Word Events: Perspectives on Verbal Notation},
|
||||
publisher = {Bloomsbury},
|
||||
year = {2012},
|
||||
howpublished = {https://www.bloomsbury.com/us/word-events-9781441173102/}
|
||||
}
|
||||
|
||||
|
||||
@article{Winter11a,
|
||||
author = {with Polansky, L. and Barnett, A.},
|
||||
title = {A few more words about James Tenney: dissonant counterpoint and statistical feedback},
|
||||
journal = {Journal of Mathematics and Music},
|
||||
volume = {5},
|
||||
number = {2},
|
||||
pages = {63–82},
|
||||
year = {2011},
|
||||
howpublished = {Dissonant_counterpoint_and_statistical_feedback.pdf}
|
||||
}
|
||||
|
||||
@misc{Winter10d,
|
||||
author = {},
|
||||
title = {Notes on a new economics for a new music},
|
||||
journal = {Experimental Music Yearbook (online)},
|
||||
volume = {2},
|
||||
year = {2010},
|
||||
howpublished = {https://experimentalmusicyearbook.com/filter/Michael-Winter/notes-on-a-new-economics-for-a-new-art}
|
||||
}
|
||||
|
||||
@article{Winter10c,
|
||||
author = {with Barrett, G.D.},
|
||||
title = {LiveScore: real–time notation in the music of Harris Wulfson},
|
||||
journal = {Contemporary Music Review},
|
||||
volume = {29},
|
||||
number = {1},
|
||||
pages = {55–62},
|
||||
year = {2010},
|
||||
howpublished = {Livescore.pdf}
|
||||
}
|
||||
|
||||
|
||||
|
||||
@phdthesis{Winter10b,
|
||||
type = {Dissertation},
|
||||
title = {Structural Metrics: an epistemology},
|
||||
author = {},
|
||||
publisher = {Doctoral Dissertation},
|
||||
school = {University of California, Santa Barbara},
|
||||
year = {2010},
|
||||
howpublished = {Structural_Metrics.pdf}
|
||||
}
|
||||
|
||||
|
||||
@article{Winter10a,
|
||||
author = {},
|
||||
title = {James Tenney: Selected Works 1961–1969 (review)},
|
||||
journal = {Journal of the Society for American Music},
|
||||
volume = {4},
|
||||
number = {Special Issue 04},
|
||||
month = {11},
|
||||
year = {2010},
|
||||
pages = {531–533}
|
||||
}
|
||||
|
||||
@misc{Winter09a,
|
||||
author = {with Hanson, S., Streb, C., and Polansky, L.},
|
||||
title = {James Tenney biographical entry},
|
||||
booktitle = {Grove Dictionary of American Music},
|
||||
publisher = {Oxford University Press},
|
||||
year = {2009}
|
||||
}
|
||||
|
||||
@article{Winter078a,
|
||||
author = {},
|
||||
title = {On James Tenney's <em>Arbor Vitae</em> for string quartet},
|
||||
journal = {Contemporary Music Review},
|
||||
volume = {27},
|
||||
number = {1},
|
||||
pages = {131–150},
|
||||
year = {2008},
|
||||
howpublished = {On_Arbor_Vitae.pdf}
|
||||
}
|
||||
|
||||
@article{Winter07b,
|
||||
author = {},
|
||||
title = {Mavericks on mavericks: James Tenney’s last courses at CalArts},
|
||||
journal = {MusikTexte},
|
||||
volume = {112},
|
||||
pages = {66–69},
|
||||
year = {2007},
|
||||
howpublished = {https://musiktexte.de/epages/dc91cfee-4fdc-41fe-82da-0c2b88528c1e.sf/de_DE/?ObjectPath=/Shops/dc91cfee-4fdc-41fe-82da-0c2b88528c1e/Products/MT-112}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@inproceedings{Winter07a,
|
||||
author = {with Barrett, G.D. and Wulfson, H.},
|
||||
title = {Automatic Notation Generators},
|
||||
booktitle = {Proceedings of the 7th International NIME Conference},
|
||||
series = {NIME '07},
|
||||
year = {2007},
|
||||
pages = {346–351},
|
||||
acmid = {1279817},
|
||||
address = {New York, NY, USA},
|
||||
howpublished = {Automatic_notation_generators.pdf}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 28 KiB |
|
Before Width: | Height: | Size: 26 KiB |
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 37 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 3.2 KiB |
|
Before Width: | Height: | Size: 20 KiB |
|
|
@ -1,46 +0,0 @@
|
|||
|
||||
|
||||
$(document).ready(function() {
|
||||
|
||||
var split, filename, grid;
|
||||
split = window.location.href.split('/');
|
||||
filename = split[split.length-1];
|
||||
grid = split[split.length-2];
|
||||
displayPDF(grid, filename);
|
||||
|
||||
});
|
||||
|
||||
function displayPDF(grid, filename) {
|
||||
var BASE_URL='http://dev.unboundedpress.org';
|
||||
$.getJSON(BASE_URL+"/unboundedpress/"+grid+".files?filter={'filename':'"+filename+"'}", function(data){
|
||||
var score, details;
|
||||
score = data._embedded['rh:file'];
|
||||
console.log(score);
|
||||
if (score) {
|
||||
var details = $('<object>').attr({
|
||||
data: BASE_URL + score[0]._links['rh:data'].href,
|
||||
type: score.contentType,
|
||||
width:'100%',
|
||||
height:'100%'});
|
||||
$('#pdfdiv').html(details);
|
||||
} else {
|
||||
$('#pdfdiv').html("file not found")
|
||||
}
|
||||
/*else {
|
||||
$.getJSON(BASE_URL+"/unboundedpress/scores.files?filter={'legacy_filename':'"+filename+"'}", function(data){
|
||||
var score, details;
|
||||
score = data._embedded['rh:file'];
|
||||
if (score) {
|
||||
var details = $('<object>').attr({
|
||||
data: BASE_URL + score[0]._links['rh:data'].href,
|
||||
type:'application/pdf',
|
||||
width:'100%',
|
||||
height:'100%'});
|
||||
$('#pdfdiv').html(details);
|
||||
} else {
|
||||
$('#pdfdiv').html("file not found")
|
||||
}
|
||||
});
|
||||
}*/
|
||||
});
|
||||
}
|
||||
|
|
@ -1,944 +0,0 @@
|
|||
// TODO: see why you can not seek soundcloud player
|
||||
// TODO: make all file i/o rest independent
|
||||
// TODO: ditch restheart completely???
|
||||
// Userlist data array for filling in info box
|
||||
upcomingCount = 0
|
||||
upcomingLoadedCount = 0;
|
||||
|
||||
// DOM Ready =============================================================
|
||||
$(document).ready(function() {
|
||||
|
||||
if (window.location.href.split('/').pop().split('.').pop() != "pdf") {
|
||||
populatePieces('primary');
|
||||
populatePieces('secondary');
|
||||
populatePublications();
|
||||
populateReleases();
|
||||
populatePerformances(2025, 'composer', true);
|
||||
populateTalks(2025, true);
|
||||
populateAbout();
|
||||
|
||||
populateGallerySelector();
|
||||
|
||||
// I am not sure why I was changing the url here, but for legacy more I am taking this out
|
||||
/*
|
||||
if (window.location.href.split('/').pop().substring(0,3) != "#lg") {
|
||||
window.history.replaceState("object or string", "Title", "/");
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
$( window ).resize(function() {
|
||||
resetDivHeights();
|
||||
});
|
||||
|
||||
$(function() {
|
||||
$( document ).tooltip();
|
||||
});
|
||||
|
||||
$(document).on('click','.scroll-to-div', function(event) {
|
||||
event.preventDefault();
|
||||
var target = "#" + this.getAttribute('data-target');
|
||||
$('html, body').animate({
|
||||
scrollTop: $(target).offset().top - 210
|
||||
}, 500);
|
||||
//window.history.pushState("object or string", "Title", this.getAttribute('data-target'));
|
||||
});
|
||||
|
||||
$(window).scroll(function(event) {
|
||||
$(".header").css("margin-left", 0 - $(document).scrollLeft());
|
||||
});
|
||||
|
||||
$('ul#piecesmiscworkslist').hide();
|
||||
$('#pieces .btn_less').hide();
|
||||
$('#pieces .btn_more').click(function(){
|
||||
$('ul#piecesmiscworkslist').show();
|
||||
$('#pieces .btn_more').hide();
|
||||
$('#pieces .btn_less').show();
|
||||
resetDivHeights();
|
||||
});
|
||||
$('#pieces .btn_less').click(function(){
|
||||
$('ul#piecesmiscworkslist').hide();
|
||||
$('#pieces .btn_less').hide();
|
||||
$('#pieces .btn_more').show();
|
||||
resetDivHeights();
|
||||
});
|
||||
|
||||
embedAudioGallery(false);
|
||||
|
||||
for (i = new Date().getFullYear(); i > 2000; i--){
|
||||
$('#yearpicker').append($('<option />').val(i).html(i));
|
||||
}
|
||||
|
||||
$('#yearpicker').on('change', function() {
|
||||
$("#performanceeventslist").empty();
|
||||
//populatePerformances(parseInt(this.value), $('#eventtypepicker').val(), false);
|
||||
populatePerformances(parseInt(this.value), 'composer', false);
|
||||
});
|
||||
|
||||
/*
|
||||
$('#eventtypepicker').append($('<option />').val('composer').html('as composer/artist'));
|
||||
$('#eventtypepicker').append($('<option />').val('performer').html('as performer/guest'));
|
||||
|
||||
$('#eventtypepicker').on('change', function() {
|
||||
$("#performanceeventslist").empty();
|
||||
populatePerformances(parseInt($('#yearpicker').val()), this.value, false);
|
||||
});
|
||||
*/
|
||||
|
||||
$("img").load(function() {
|
||||
alert($(this).height());
|
||||
alert($(this).width());
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
// Functions =============================================================
|
||||
BASE_URL = window.location.origin + '/api'
|
||||
|
||||
function resetDivHeights(){
|
||||
|
||||
//$('#pieces').height($('#writings').height() + 100);
|
||||
//$('#pieces').height($('#releases').height());
|
||||
//$('#releases').height($('#writings').height());
|
||||
|
||||
$('#pieces').css('height', '2900px');
|
||||
//if($('#writings').height() >= $('#releases').height()){
|
||||
// $('#pieces').height($('#writings').height());
|
||||
//} else {
|
||||
// $('#pieces').height($('#releases').height());
|
||||
//}
|
||||
|
||||
$('#talks').css('height', 'auto');
|
||||
$('#performances').css('height', 'auto');
|
||||
if($('#talks').height() >= $('#performances').height()){
|
||||
$('#events').height($('#talks').height());
|
||||
$('#performances').css('height', '100%');
|
||||
} else {
|
||||
$('#events').height($('#performances').height());
|
||||
$('#talks').css('height', '100%');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function openAudioPlayer(data){
|
||||
|
||||
$('#galleryPlayer').css('background-color', '#FDFDFD')
|
||||
|
||||
if (data.soundcloud_secret){
|
||||
$('#galleryPlayer').html("<iframe id=sc_gallery width='325' height='110' scrolling='no' frameborder='no' src='https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/"+data.soundcloud_trackid+"?secret_token="+data.soundcloud_secret+"&show_artwork=true&auto_play=true&maxheight=110&'></iframe>");
|
||||
} else {
|
||||
$('#galleryPlayer').html("<iframe id=sc_gallery width='325' height='110' scrolling='no' frameborder='no' src='https://w.soundcloud.com/player/?url=https://api.soundcloud.com/tracks/"+data.soundcloud_trackid+"&show_artwork=true&auto_play=true&maxheight=110&'></iframe>");
|
||||
}
|
||||
|
||||
var widget = SC.Widget('sc_gallery');
|
||||
|
||||
widget.bind(SC.Widget.Events.FINISH, function() {
|
||||
embedAudioGallery(true);
|
||||
});
|
||||
}
|
||||
|
||||
function embedAudioGallery(autoplay) {
|
||||
|
||||
$('#galleryPlayer').css('background-color', '#FDFDFD')
|
||||
|
||||
var uniqueRandoms = [];
|
||||
var numRandoms = 15;
|
||||
function makeUniqueRandom() {
|
||||
// refill the array if needed
|
||||
if (!uniqueRandoms.length) {
|
||||
for (var i = 0; i < numRandoms; i++) {
|
||||
uniqueRandoms.push(i);
|
||||
}
|
||||
}
|
||||
var index = Math.floor(Math.random() * uniqueRandoms.length);
|
||||
var val = uniqueRandoms[index];
|
||||
|
||||
// now remove that value from the array
|
||||
uniqueRandoms.splice(index, 1);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
$('#galleryPlayer').html("<iframe id=sc_gallery class=audioGalleryFrame width='325' height='110' scrolling='yes' frameborder='no' src='https://w.soundcloud.com/player/?url=https://api.soundcloud.com/playlists/164294640&show_artwork=true&auto_play=true&maxheight=110&'></iframe>");
|
||||
|
||||
var widget = SC.Widget('sc_gallery');
|
||||
|
||||
widget.bind(SC.Widget.Events.READY, function() {
|
||||
widget.skip(makeUniqueRandom());
|
||||
if(!autoplay){
|
||||
widget.pause();
|
||||
widget.seekTo(0);
|
||||
}
|
||||
});
|
||||
|
||||
widget.bind(SC.Widget.Events.FINISH, function() {
|
||||
widget.skip(makeUniqueRandom());
|
||||
});
|
||||
}
|
||||
|
||||
function embedVideoGallery() {
|
||||
$.getScript('https://vimeo.com/api/v2/mwinter/videos.json?callback=embedVideoGallerySlider');
|
||||
}
|
||||
|
||||
function embedVideoGallerySlider(videos) {
|
||||
|
||||
$('#galleryPlayer').css('background-color', 'black')
|
||||
|
||||
$('#galleryPlayer').html("");
|
||||
$('#galleryPlayer').append("<ul id='videogallerylist'>");
|
||||
|
||||
for (var i = 0; i < videos.length; i++) {
|
||||
var iframe = "<div class='video-inner'><iframe id=vimeo_gallery class=videoGalleryFrame src='https://player.vimeo.com/video/"+videos[i].id+"?color=44bbff&background=000000&slideshow=0&video_title=true&video_byline=1' width='300px' height='140px' frameborder='0' webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe></div>";
|
||||
|
||||
var galleryli = $("<li id=videogallery_li_item_"+i+">").append(iframe);
|
||||
$('ul#videogallerylist').prepend(galleryli);
|
||||
}
|
||||
|
||||
$('ul#videogallerylist').lightSlider({
|
||||
item:1,
|
||||
loop:true,
|
||||
pager: false,
|
||||
enableDrag: false,
|
||||
auto:true,
|
||||
pauseOnHover: true
|
||||
});
|
||||
}
|
||||
|
||||
function openVideoPlayer(data){
|
||||
|
||||
$('#galleryPlayer').html("<iframe id=vimeo_gallery class=videoGalleryFrame src='//player.vimeo.com/video/"+data.vimeo_trackid+"?autoplay=1&portrait=0&color=44bbff&background=000000&video_title=1&video_byline=1' width='325' height='140' frameborder='0' webkitAllowFullScreen mozallowfullscreen allowFullScreen></iframe>");
|
||||
|
||||
}
|
||||
|
||||
function embedImageGallery() {
|
||||
|
||||
$('#galleryPlayer').css('background-color', 'black')
|
||||
$('#galleryPlayer').html("");
|
||||
$('#galleryPlayer').append("<ul id='imagegallerylist'>");
|
||||
|
||||
$.getJSON(BASE_URL + '/image_gallery/_aggrs/image_gallery?pagesize=200', function(data) {
|
||||
var objCount = 0
|
||||
var len=Object.keys(data).length;
|
||||
$.each(data, function(index, data){
|
||||
|
||||
var galleryli;
|
||||
|
||||
var img, thumb, head;
|
||||
img = data.img;
|
||||
thumb = data.thumb;
|
||||
if (typeof thumb === 'undefined' ) {
|
||||
thumb = img;
|
||||
} else if (thumb.length === 0 ) {
|
||||
thumb = img;
|
||||
}
|
||||
if (img) {
|
||||
var imgsrc = BASE_URL + "/images.files/" + img._id['$oid'] +"/binary";
|
||||
var thumbsrc = BASE_URL + "/images.files/" + thumb._id['$oid'] +"/binary";
|
||||
|
||||
galleryli = $("<li id=imagegallery_li_item"+index+" href='"+imgsrc+"' data-download-url='/images/"+data.image+"'>'");
|
||||
$('ul#imagegallerylist').prepend(galleryli);
|
||||
galleryli.append($('<div>').addClass('video-inner').append($('<img>').attr({src: thumbsrc}).css('max-height','100%').css('max-width','100%')));
|
||||
}
|
||||
|
||||
objCount++;
|
||||
if(objCount == len){
|
||||
|
||||
$('ul#imagegallerylist').lightSlider({
|
||||
item:1,
|
||||
loop:true,
|
||||
pager: false,
|
||||
enableDrag: false,
|
||||
auto:true,
|
||||
pauseOnHover: true,
|
||||
//adaptiveHeight:true,
|
||||
onSliderLoad: function(el) {
|
||||
el.lightGallery({
|
||||
selector: '#imagegallerylist .lslide',
|
||||
galleryId: 'images_gallery'
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function alterDate(date) {
|
||||
//this sets from given time
|
||||
//var offset = new Date().getTimezoneOffset();
|
||||
//date.setHours(date.getHours() + (offset / 60));
|
||||
|
||||
//this sets from end of day
|
||||
date.setHours(23, 59, 0, 0);
|
||||
//var offset = new Date().getTimezoneOffset();
|
||||
//date.setHours(date.getHours() + (offset / 60));
|
||||
return date;
|
||||
}
|
||||
|
||||
function formatISODate(isoDate) {
|
||||
var date = new Date(isoDate['$date']);
|
||||
//date = alterDate(date);
|
||||
return ("0" + (date.getMonth() + 1)).slice(-2) + "." + ("0" + date.getDate()).slice(-2) + "." + date.getFullYear();
|
||||
}
|
||||
|
||||
function formatISOYear(isoDate) {
|
||||
var date = new Date(isoDate['$date']);
|
||||
return date.getFullYear();
|
||||
}
|
||||
|
||||
function formatDate(date) {
|
||||
var date = new Date(date);
|
||||
var offset = new Date().getTimezoneOffset();
|
||||
|
||||
//not clear why we need to offet this one and not the other
|
||||
date.setHours(date.getHours() + (offset / 60));
|
||||
date = alterDate(date);
|
||||
|
||||
return ("0" + (date.getMonth() + 1)).slice(-2) + "." + ("0" + date.getDate()).slice(-2) + "." + date.getFullYear();
|
||||
//return ("0" + (date.getMonth() + 1)).slice(-2) + "." + date.getFullYear();
|
||||
}
|
||||
|
||||
function openToggle(toggle){
|
||||
if(toggle){
|
||||
toggle.text("-");
|
||||
}
|
||||
}
|
||||
|
||||
function closeToggle(toggle){
|
||||
if(toggle){
|
||||
toggle.text("+");
|
||||
}
|
||||
}
|
||||
|
||||
function populatePieces(type) {
|
||||
var apiurl, listid, yearCount = 2100, imageGalleryCount = 0;
|
||||
if(type == 'primary'){
|
||||
apiurl = BASE_URL + "/works/_aggrs/high_priority_works?pagesize=200";
|
||||
listid = 'ul#piecesworkslist'
|
||||
} else {
|
||||
apiurl = BASE_URL + "/works/_aggrs/low_priority_works?pagesize=200";
|
||||
listid = 'ul#piecesmiscworkslist'
|
||||
}
|
||||
$.getJSON(apiurl, function(data) {
|
||||
|
||||
if(type != 'primary'){
|
||||
$(listid).addClass('content-list').append($('<li>').append('miscellany').addClass('year_span'));
|
||||
}
|
||||
|
||||
var objCount = 0;
|
||||
var len=Object.keys(data).length;
|
||||
|
||||
$.each(data, function(index, data){
|
||||
|
||||
var head, year, workli, work_data, score_data, image_data;
|
||||
|
||||
work_data = data.work_data;
|
||||
score_data = data.score_data;
|
||||
image_data = data.image_data;
|
||||
|
||||
head = $('<div>').addClass('header_span').css('width','90%')
|
||||
.append($('<span>').addClass('header_piece').append($('<h4>').append('<i>'+work_data.title+'</i>')));
|
||||
|
||||
year = formatISOYear(work_data.date);
|
||||
if(type == 'primary' && yearCount > parseInt(year)) {
|
||||
$(listid).addClass('content-list').append($('<li>').append(year).addClass('year_span'));
|
||||
yearCount = parseInt(year);
|
||||
};
|
||||
|
||||
workli = $('<li id=work_li_item'+index+'>');
|
||||
$(listid).addClass('content-list').append(workli.append(head));
|
||||
|
||||
var audioButton, videoButton, documentButton, icons, doc;
|
||||
if (data.score_data) {
|
||||
documentButton = $('<button id=piece_document_button_'+index
|
||||
+" data-iframe='true' data-src='/scores/" + score_data.filename + "' data-download-url=''/scores/" + score_data.filename + "'>")
|
||||
.attr({title: "view"}).addClass('score_icon');
|
||||
|
||||
documentButton.lightGallery({
|
||||
selector: 'this',
|
||||
width: '90%',
|
||||
hash: false,
|
||||
galleryId: "score_viewer_"+index
|
||||
});
|
||||
|
||||
if(typeof doc != 'undefined'){
|
||||
} else{
|
||||
documentButton.on('onSlideItemLoad.lg', function(event, index){
|
||||
window.history.replaceState(null, null, "/scores/" + score_data.filename);
|
||||
});
|
||||
|
||||
documentButton.on('onCloseAfter.lg', function(event, prevIndex, index){
|
||||
window.history.replaceState("object or string", "Title", "/");
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
documentButton = $('<button id=piece_document_button_'+index+">").attr({title: "score"}).addClass('score_icon');
|
||||
documentButton.css('visibility', 'hidden');
|
||||
}
|
||||
|
||||
audioButton = $('<button id=piece_audio_button_'+index+'>').attr({title: "audio"}).addClass('audio_icon');
|
||||
if (typeof work_data.soundcloud_trackid === 'undefined') {
|
||||
audioButton.css('visibility', 'hidden')
|
||||
} else {
|
||||
audioButton.click(function() {
|
||||
openAudioPlayer(work_data);
|
||||
});
|
||||
};
|
||||
|
||||
videoButton = $('<button id=piece_video_button_'+index+'>').attr({title: "video"}).addClass('video_icon');
|
||||
if (typeof work_data.vimeo_trackid === 'undefined') {
|
||||
videoButton.css('visibility', 'hidden')
|
||||
} else {
|
||||
videoButton.click(function() {
|
||||
openVideoPlayer(work_data);
|
||||
});
|
||||
};
|
||||
|
||||
imageButton = $('<button id=piece_image_button_'+index+'>').attr({title: "images"}).addClass('photo_icon');
|
||||
if (typeof work_data.images === 'undefined') {
|
||||
imageButton.css('visibility', 'hidden')
|
||||
} else {
|
||||
imageButton.click(function() {
|
||||
|
||||
var objCount = 0;
|
||||
var len=image_data.length;
|
||||
var srcList=[];
|
||||
$.each(image_data, function(index, image){
|
||||
var src = BASE_URL + "/images.files/" + image._id['$oid'] +"/binary";
|
||||
srcList.push({"src":src})
|
||||
objCount++;
|
||||
if(objCount == len){
|
||||
$(this).lightGallery({
|
||||
dynamic: true,
|
||||
dynamicEl: srcList,
|
||||
galleryId: 'work_image_gallery_'+parseInt(imageGalleryCount)
|
||||
});
|
||||
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
|
||||
icons = $('<span>').addClass('icon_span_piece').append([documentButton, audioButton, videoButton, imageButton]);
|
||||
head.append(icons);
|
||||
|
||||
objCount++;
|
||||
if(objCount == len){
|
||||
resetDivHeights();
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function populateReleases() {
|
||||
|
||||
$.getJSON(BASE_URL + "/releases/_aggrs/releases?pagesize=200", function(data) {
|
||||
var objCount = 0
|
||||
var len=Object.keys(data).length;
|
||||
$.each(data, function(index, data){
|
||||
|
||||
var releaseli;
|
||||
|
||||
releaseli = $('<li id=release_li_item'+index+'>');
|
||||
$('ul#releaseslist').addClass('content-list').prepend(releaseli);
|
||||
|
||||
var img, thumb, head, title, caption, cartButton, infoButton, cartRef, infoRef;
|
||||
img = data.img;
|
||||
thumb = data.thumb;
|
||||
if (typeof thumb === 'undefined' ) {
|
||||
thumb = img;
|
||||
} else if (thumb.length === 0 ) {
|
||||
thumb = img;
|
||||
}
|
||||
if (img) {
|
||||
var imgsrc = BASE_URL + "/album_art.files/" + img._id['$oid'] +"/binary";
|
||||
var thumbsrc = BASE_URL + "/album_art.files/" + thumb._id['$oid'] +"/binary";
|
||||
|
||||
title = $('<div>').addClass('caption').append(data.title);
|
||||
title.css('text-align', 'center');
|
||||
caption = $('<div>').addClass('caption')
|
||||
caption.css('text-align', 'center');
|
||||
caption.css('padding-bottom', '25px');
|
||||
|
||||
if(data.discogs_id) {
|
||||
infoRef = 'https://www.discogs.com/release/' + data.discogs_id;
|
||||
infoButton = $('<button id=release_info_button_'+index+" data-iframe='true' data-src='"+ infoRef +"'>")
|
||||
.attr({title: "discogs info"}).addClass('info_icon');
|
||||
|
||||
infoButton.click(function() {
|
||||
window.open(infoRef);
|
||||
});
|
||||
}
|
||||
|
||||
if(data.buy_link) {
|
||||
cartRef = data.buy_link;
|
||||
cartButton = $('<button id=release_cart_button_'+index+" data-iframe='true' data-src='"+ cartRef +"'>")
|
||||
.attr({title: "buy"}).addClass('cart_icon');
|
||||
|
||||
cartButton.click(function() {
|
||||
window.open(cartRef);
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
caption.append([infoButton, cartButton]);
|
||||
head = $('<h4>').append($("<a href='"+imgsrc+"' data-download-url='/album_art/"+data.album_art+"'>")
|
||||
.append($('<img>').attr({src: thumbsrc}).css('width','100%')));
|
||||
releaseli.append(title).append(head).append(caption);
|
||||
}
|
||||
|
||||
objCount++;
|
||||
if(objCount == len){
|
||||
|
||||
$('ul#releaseslist').lightGallery({
|
||||
thumbnail:true,
|
||||
selector: 'li h4 a ',
|
||||
width: '70%',
|
||||
galleryId: 'release_gallery'
|
||||
});
|
||||
|
||||
resetDivHeights();
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
function programDetails(program, isDetailed) {
|
||||
|
||||
var text = "";
|
||||
for (i = 0; i < program.length; i++) {
|
||||
if(isDetailed){
|
||||
text += "<div class=event-pieces><i>"+program[i].work + "</i></div>";
|
||||
if(program[i].ensemble){
|
||||
text +="<div class=event-ensemble>" + program[i].ensemble + "</div>";
|
||||
};
|
||||
text+="<div class=event-performers>";
|
||||
var performers = program[i].performers;
|
||||
for (j = 0; j < performers.length; j++) {
|
||||
text += performers[j].name + " - ";
|
||||
var instruments = performers[j].instrument_tags;
|
||||
for (k = 0; k < instruments.length; k++) {
|
||||
text += instruments[k];
|
||||
if(k != instruments.length -1){
|
||||
text += ", ";
|
||||
}
|
||||
}
|
||||
if(j != performers.length -1){
|
||||
text += "; ";
|
||||
}
|
||||
}
|
||||
text += "</div>";
|
||||
} else {
|
||||
text += "<div class=upcoming-pieces><i>"+program[i].work + "</i>";
|
||||
if(program[i].ensemble){
|
||||
text += " - " + program[i].ensemble;
|
||||
};
|
||||
text += "</div>"
|
||||
}
|
||||
}
|
||||
|
||||
return text;
|
||||
|
||||
}
|
||||
|
||||
function sortList(list) {
|
||||
var mylist = $(list);
|
||||
var listitems = mylist.children('li').get();
|
||||
listitems.sort(function(a, b) {
|
||||
return $(a).text().trim().toUpperCase().localeCompare($(b).text().trim().toUpperCase());
|
||||
})
|
||||
$.each(listitems, function(idx, itm) { mylist.append(itm); });
|
||||
return mylist;
|
||||
}
|
||||
|
||||
|
||||
function populatePerformances(year, eventType, loadUpcoming) {
|
||||
|
||||
var currentToggle, currentDetailsDiv, col;
|
||||
|
||||
if(eventType == 'composer'){
|
||||
col ="events";
|
||||
} else {
|
||||
col ="performer_events";
|
||||
}
|
||||
|
||||
$.getJSON(BASE_URL + "/"+col+"?filter={'$and':[{'start_date':{'$gte':{'$date':'2001-01-01T08:00:00Z'}}},{'start_date':{'$lte':{'$date':'"+(year+1).toString()+"-01-01T08:00:00Z'}}}]}&sort_by=-start_date&pagesize=55", function(data) {
|
||||
var objCount = 0;
|
||||
var len=Object.keys(data).length;
|
||||
$.each(data, function(index, data){
|
||||
|
||||
var toggle, head, subHead, detailsdiv;
|
||||
|
||||
toggle = $('<span id=event_toggle_'+index+'>').addClass('toggle').text('+');
|
||||
head = $('<span>').addClass('header_span')
|
||||
.append($('<h4>').append([toggle, ' ' + formatISODate(data.start_date) + ': ' + data.venue.city + ', ' + data.venue.state]));
|
||||
subHead = $('<div>').addClass('venue').append(data.venue.name);
|
||||
detailsdiv = $('<div id=event_details_'+index+'>');
|
||||
$('ul#performanceeventslist').addClass('content-list').append($('<li>').append(head).append([subHead, detailsdiv]));
|
||||
|
||||
if(loadUpcoming && alterDate(new Date(data.start_date['$date'])) >= new Date()){
|
||||
//toggle.remove();
|
||||
var clonedHead = head.clone(true);
|
||||
clonedHead.find('#event_toggle_'+index).remove();
|
||||
clonedHead.css('white-space', 'nowrap');
|
||||
clonedHead.find('h4').append('<span style="color: #7F7F7F; margin-left: 10px;">(performance)</span>');
|
||||
$('ul#upcominglist').css('width','100%').prepend($('<li>').append($('<div class=upcoming-inner>').append([clonedHead, subHead.clone(true), programDetails(data.program, true)])));
|
||||
upcomingCount++;
|
||||
}
|
||||
|
||||
toggle.css('cursor', 'pointer'); head.css('cursor', 'pointer');
|
||||
|
||||
head.click(function() {
|
||||
if( toggle.text() == "-" ) {
|
||||
closeToggle(toggle);
|
||||
detailsdiv.html("");
|
||||
resetDivHeights();
|
||||
} else {
|
||||
if(currentToggle){
|
||||
closeToggle(currentToggle);
|
||||
currentDetailsDiv.html("");
|
||||
resetDivHeights();
|
||||
}
|
||||
currentDetailsDiv = detailsdiv;
|
||||
currentToggle = toggle;
|
||||
openToggle(toggle);
|
||||
|
||||
if(data.program){
|
||||
detailsdiv.append(programDetails(data.program, true));
|
||||
} else {
|
||||
detailsdiv.append(['<i>'+data.legacy_program+'</i>','<br>',data.legacy_performers]).addClass('event-details');
|
||||
}
|
||||
|
||||
resetDivHeights();
|
||||
}
|
||||
});
|
||||
|
||||
objCount++;
|
||||
if(objCount == len){
|
||||
resetDivHeights();
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
//$('ul#performanceeventslist').children('li:gt(15)').hide();
|
||||
//resetDivHeights();
|
||||
|
||||
if(loadUpcoming){
|
||||
upcomingLoadedCount++;
|
||||
//console.log(upcomingCount);
|
||||
if (upcomingLoadedCount==2) {
|
||||
|
||||
if(upcomingCount == 0 && year == 2025){
|
||||
|
||||
$('#upcoming').css('visibility', 'hidden')
|
||||
} else {
|
||||
|
||||
$('#upcominglist').replaceWith(sortList('#upcominglist'));
|
||||
|
||||
var autoplaySlider = $('#upcominglist').lightSlider({
|
||||
item:1,
|
||||
adaptiveHeight:false,
|
||||
auto:true,
|
||||
loop:true,
|
||||
pauseOnHover: true,
|
||||
pager: true,
|
||||
controls: false,
|
||||
dropOnHover:false,
|
||||
speed: 1000,
|
||||
pause: 5000,
|
||||
mode: 'fade'
|
||||
});
|
||||
$('#upcominglist').css('padding-bottom','0px')
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function populateTalks(year, loadUpcoming) {
|
||||
|
||||
$.getJSON(BASE_URL + '/talks?sort_by=date&pagesize=200', function(data) {
|
||||
var objCount = 0;
|
||||
var len=Object.keys(data).length;
|
||||
$.each(data, function(index, data){
|
||||
|
||||
var head, subHead;
|
||||
|
||||
head = $('<span>').addClass('header_span').append($('<h4>').append(formatDate(data.date) + ': ' + data.location));
|
||||
if (typeof data.title === 'string') {
|
||||
subHead = $('<div>').addClass('venue').append(data.title);
|
||||
$('ul#talkeventslist').addClass('content-list').prepend($('<li>').append([head, subHead]));
|
||||
} else {
|
||||
//assuming I do not give more than two talks a day
|
||||
subHead = $('<div>').addClass('venue').append(data.title[0]);
|
||||
subSubHead = $('<div>').addClass('venue').append(data.title[1]);
|
||||
$('ul#talkeventslist').addClass('content-list').prepend($('<li>').append([head, subHead, subSubHead]));
|
||||
}
|
||||
|
||||
if(loadUpcoming && alterDate(new Date(data.date)) >= new Date()){
|
||||
var clonedHead = head.clone(true);
|
||||
clonedHead.css('white-space', 'nowrap');
|
||||
clonedHead.find('h4').append('<span style="color: #7F7F7F; margin-left: 10px;">(talk)</span>');
|
||||
$('ul#upcominglist').css('width','100%').prepend($('<li>').append($('<div class=upcoming-inner>').append([clonedHead, subHead.clone(true)])));
|
||||
upcomingCount++;
|
||||
}
|
||||
|
||||
objCount++;
|
||||
if(objCount == len){
|
||||
resetDivHeights();
|
||||
}
|
||||
});
|
||||
|
||||
if(loadUpcoming){
|
||||
upcomingLoadedCount++;
|
||||
if (upcomingLoadedCount==2) {
|
||||
|
||||
if(upcomingCount == 0 && year == 2016){
|
||||
$('#upcoming').css('visibility', 'hidden')
|
||||
} else {
|
||||
|
||||
//console.log(sortList('#upcominglist'));
|
||||
$('#upcominglist').replaceWith(sortList('#upcominglist'));
|
||||
|
||||
var autoplaySlider = $('#upcominglist').lightSlider({
|
||||
item:1,
|
||||
adaptiveHeight:false,
|
||||
auto:true,
|
||||
loop:true,
|
||||
pauseOnHover: true,
|
||||
pager: true,
|
||||
controls: false,
|
||||
dropOnHover:false,
|
||||
speed: 1000,
|
||||
pause: 5000,
|
||||
mode: 'fade'
|
||||
});
|
||||
$('#upcominglist').css('padding-bottom','0px')
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
});
|
||||
}
|
||||
|
||||
function populatePublications() {
|
||||
|
||||
$.getJSON(BASE_URL + '/publications/_aggrs/publications?pagesize=200', function(data) {
|
||||
var objCount = 0;
|
||||
var len=Object.keys(data).length;
|
||||
$.each(data, function(index, data){
|
||||
|
||||
|
||||
var head, subHead, publi;
|
||||
|
||||
subHead = $('<div>').addClass('venue').append([data.entryTags.author, " "]);
|
||||
if (data.entryTags.booktitle){ subHead.append([data.entryTags.booktitle, ". "]) }
|
||||
if (data.entryTags.journal){ subHead.append([data.entryTags.journal, ". "]) }
|
||||
if (data.entryTags.editor){ subHead.append(["editors ", data.entryTags.editor, " "]) }
|
||||
if (data.entryTags.volume){ subHead.append(["volume ", data.entryTags.volume, ". "]) }
|
||||
//if (data.entryTags.pages){ subHead.append([data.entryTags.pages, ". "]) }
|
||||
if (data.entryTags.publisher){ subHead.append([data.entryTags.publisher, ". "]) }
|
||||
subHead.append([data.entryTags.year, "."]);
|
||||
head = $('<span>').addClass('header_span')
|
||||
.append($('<span>').addClass('header_pub').append($('<h4>').append(data.entryTags.title)));
|
||||
publi = $('<li id=pub_li_item'+index+'>');
|
||||
$('ul#writingsworkslist').addClass('content-list').prepend(publi.append(head));
|
||||
|
||||
var documentButton, icons, doc;
|
||||
|
||||
doc = data.doc;
|
||||
|
||||
if (typeof data.entryTags.howpublished != 'undefined') {
|
||||
var href = "";
|
||||
var download = "";
|
||||
if (typeof doc != 'undefined'){
|
||||
href = "/pubs/"+data.entryTags.howpublished;
|
||||
download = "' data-download-url='/pubs/"+data.entryTags.howpublished;
|
||||
} else {
|
||||
href = data.entryTags.howpublished;
|
||||
}
|
||||
if (false /*href.substring(0, 4) == "http"*/){
|
||||
console.log(href);
|
||||
documentButton = $('<button id=piece_document_button_'+index+" onclick=' window.open('" + href.replace(/\//g, '\/') + "','_blank')>")
|
||||
.attr({title: "view"}).addClass('score_icon');
|
||||
} else {
|
||||
|
||||
documentButton = $('<button id=piece_document_button_'+index+" data-iframe='true' data-src='"+href+download+"'>")
|
||||
.attr({title: "view"}).addClass('score_icon');
|
||||
|
||||
if(typeof doc != 'undefined'){
|
||||
|
||||
documentButton.lightGallery({
|
||||
selector: 'this',
|
||||
width: '90%',
|
||||
hash: false,
|
||||
galleryId: 'pub_viewer_'+index
|
||||
});
|
||||
|
||||
if(typeof doc != 'undefined'){
|
||||
documentButton.on('onSlideItemLoad.lg', function(event, index){
|
||||
window.history.replaceState(null, null, href);
|
||||
});
|
||||
|
||||
documentButton.on('onCloseAfter.lg', function(event, prevIndex, index){
|
||||
window.history.replaceState("object or string", "Title", "/");
|
||||
})
|
||||
|
||||
} else{
|
||||
documentButton.on('onBeforeSlide.lg', function(event, prevIndex, index){
|
||||
$('.lg-inner').css('background-color', 'white')
|
||||
});
|
||||
|
||||
documentButton.on('onSlideItemLoad.lg', function(event, index){
|
||||
window.history.replaceState("object or string", "Title", "/redirect=" + href);
|
||||
});
|
||||
|
||||
documentButton.on('onCloseAfter.lg', function(event, prevIndex, index){
|
||||
window.history.replaceState("object or string", "Title", "/");
|
||||
})
|
||||
|
||||
}
|
||||
} else {
|
||||
//documentButton = $('<button id=piece_document_button_'+index+">").attr({title: "view"}).addClass('score_icon');
|
||||
documentButton.click(function() {
|
||||
window.open(href);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} else {
|
||||
documentButton = $('<button id=piece_document_button_'+index+">").attr({title: "view"}).addClass('score_icon');
|
||||
documentButton.css('visibility', 'hidden');
|
||||
}
|
||||
|
||||
icons = $('<span>').addClass('icon_span_pub').append(documentButton);
|
||||
head.append(icons)
|
||||
publi.append(subHead.css('width', '80%').css('margin-top', '-3px'))
|
||||
|
||||
objCount++;
|
||||
if(objCount == len){
|
||||
resetDivHeights();
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function populateGallerySelector() {
|
||||
|
||||
audioButton = $('<button id=gallery_audio_button>').attr({title: "audio"}).addClass('audio_icon');
|
||||
audioButton.click(function() {
|
||||
embedAudioGallery(true);
|
||||
});
|
||||
|
||||
videoButton = $('<button id=gallery_video_button>').attr({title: "video"}).addClass('video_icon');
|
||||
videoButton.click(function() {
|
||||
embedVideoGallery();
|
||||
});
|
||||
|
||||
imageButton = $('<button id=gallery_image_button>').attr({title: "image"}).addClass('photo_icon');
|
||||
imageButton.click(function() {
|
||||
embedImageGallery();
|
||||
});
|
||||
|
||||
$('#gallerySelector').append([audioButton, videoButton, imageButton]);
|
||||
|
||||
}
|
||||
|
||||
function populateAbout() {
|
||||
|
||||
var cvHead = $('<h4>').append($('<div>').css('width', '50px').css('min-width', '50px').append('CV'));
|
||||
//var documentButton = $("<button id=cv_button data-iframe='true' data-src='/cv'>").attr({title: "CV"}).addClass('score_icon');
|
||||
var cvButton = $("<button id=cv_button>").attr({title: "CV"}).addClass('score_icon');
|
||||
|
||||
var wlHead = $('<h4>').append($('<div>').css('width', '300px').css('min-width', '300px').append('Works List with Presentation History'));
|
||||
var wlButton = $("<button id=cv_button>").attr({title: "Works List with Presentation History"}).addClass('score_icon');
|
||||
|
||||
cvButton.click(function() {
|
||||
window.open(window.location.href + 'cv');
|
||||
});
|
||||
|
||||
wlButton.click(function() {
|
||||
window.open(window.location.href + 'works_list');
|
||||
});
|
||||
|
||||
/*
|
||||
cvButton.lightGallery({
|
||||
selector: 'this',
|
||||
width: '90%',
|
||||
galleryId: 'cv'
|
||||
});
|
||||
*/
|
||||
|
||||
cvHead.append(cvButton).insertBefore('#mc_embed_signup');
|
||||
|
||||
wlHead.append(wlButton).insertBefore('#mc_embed_signup');
|
||||
|
||||
$('#my_image').html("");
|
||||
$('#my_image').append("<ul id='myimagegallerylist'>");
|
||||
|
||||
$.getJSON(BASE_URL + '/my_image_gallery/_aggrs/my_image_gallery?pagesize=200', function(data) {
|
||||
var objCount = 0
|
||||
var len=Object.keys(data).length;
|
||||
$.each(data, function(index, data){
|
||||
|
||||
var galleryli;
|
||||
|
||||
var img, thumb, head;
|
||||
img = data.img;
|
||||
thumb = data.thumb;
|
||||
if (typeof thumb === 'undefined' ) {
|
||||
thumb = img;
|
||||
} else if (thumb.length === 0 ) {
|
||||
thumb = img;
|
||||
}
|
||||
if (img) {
|
||||
var imgsrc = BASE_URL + "/images.files/" + img._id['$oid'] +"/binary";
|
||||
var thumbsrc = BASE_URL + "/images.files/" + thumb._id['$oid'] +"/binary";
|
||||
var caption = "<div class='caption'><p>photo credit: "+ data.credit +"</p></div>";
|
||||
galleryli = $("<li id=my_imagegallery_li_item"+index+" href='"+imgsrc+"' data-download-url='/images/"+data.image+"'>'");
|
||||
$('ul#myimagegallerylist').prepend(galleryli);
|
||||
galleryli.append($('<img>').attr({src: thumbsrc}).css('max-width','100%'))
|
||||
if (data.credit) {
|
||||
galleryli.append(caption);
|
||||
}
|
||||
}
|
||||
|
||||
objCount++;
|
||||
if(objCount == len){
|
||||
|
||||
$('ul#myimagegallerylist').lightSlider({
|
||||
item:1,
|
||||
loop:true,
|
||||
pager: false,
|
||||
dropOnHover:false,
|
||||
enableDrag: false,
|
||||
adaptiveHeight:true,
|
||||
//auto:true,
|
||||
onSliderLoad: function(el) {
|
||||
el.lightGallery({
|
||||
selector: '#myimagegallerylist .lslide',
|
||||
galleryId: 'portaits',
|
||||
//subHtmlSelectorRelative: true
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
}
|
||||
|
||||
});
|
||||
});
|
||||
|
||||
}
|
||||
|
|
@ -1,433 +0,0 @@
|
|||
/* global define */
|
||||
|
||||
(function (root, pluralize) {
|
||||
/* istanbul ignore else */
|
||||
if (typeof require === 'function' && typeof exports === 'object' && typeof module === 'object') {
|
||||
// Node.
|
||||
module.exports = pluralize();
|
||||
} else if (typeof define === 'function' && define.amd) {
|
||||
// AMD, registers as an anonymous module.
|
||||
define(function () {
|
||||
return pluralize();
|
||||
});
|
||||
} else {
|
||||
// Browser global.
|
||||
root.pluralize = pluralize();
|
||||
}
|
||||
})(this, function () {
|
||||
// Rule storage - pluralize and singularize need to be run sequentially,
|
||||
// while other rules can be optimized using an object for instant lookups.
|
||||
var pluralRules = [];
|
||||
var singularRules = [];
|
||||
var uncountables = {};
|
||||
var irregularPlurals = {};
|
||||
var irregularSingles = {};
|
||||
|
||||
/**
|
||||
* Title case a string.
|
||||
*
|
||||
* @param {string} str
|
||||
* @return {string}
|
||||
*/
|
||||
function toTitleCase (str) {
|
||||
return str.charAt(0).toUpperCase() + str.substr(1).toLowerCase();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sanitize a pluralization rule to a usable regular expression.
|
||||
*
|
||||
* @param {(RegExp|string)} rule
|
||||
* @return {RegExp}
|
||||
*/
|
||||
function sanitizeRule (rule) {
|
||||
if (typeof rule === 'string') {
|
||||
return new RegExp('^' + rule + '$', 'i');
|
||||
}
|
||||
|
||||
return rule;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pass in a word token to produce a function that can replicate the case on
|
||||
* another word.
|
||||
*
|
||||
* @param {string} word
|
||||
* @param {string} token
|
||||
* @return {Function}
|
||||
*/
|
||||
function restoreCase (word, token) {
|
||||
// Upper cased words. E.g. "HELLO".
|
||||
if (word === word.toUpperCase()) {
|
||||
return token.toUpperCase();
|
||||
}
|
||||
|
||||
// Title cased words. E.g. "Title".
|
||||
if (word[0] === word[0].toUpperCase()) {
|
||||
return toTitleCase(token);
|
||||
}
|
||||
|
||||
// Lower cased words. E.g. "test".
|
||||
return token.toLowerCase();
|
||||
}
|
||||
|
||||
/**
|
||||
* Interpolate a regexp string.
|
||||
*
|
||||
* @param {string} str
|
||||
* @param {Array} args
|
||||
* @return {string}
|
||||
*/
|
||||
function interpolate (str, args) {
|
||||
return str.replace(/\$(\d{1,2})/g, function (match, index) {
|
||||
return args[index] || '';
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Sanitize a word by passing in the word and sanitization rules.
|
||||
*
|
||||
* @param {String} token
|
||||
* @param {String} word
|
||||
* @param {Array} collection
|
||||
* @return {String}
|
||||
*/
|
||||
function sanitizeWord (token, word, collection) {
|
||||
// Empty string or doesn't need fixing.
|
||||
if (!token.length || uncountables.hasOwnProperty(token)) {
|
||||
return word;
|
||||
}
|
||||
|
||||
var len = collection.length;
|
||||
|
||||
// Iterate over the sanitization rules and use the first one to match.
|
||||
while (len--) {
|
||||
var rule = collection[len];
|
||||
|
||||
// If the rule passes, return the replacement.
|
||||
if (rule[0].test(word)) {
|
||||
return word.replace(rule[0], function (match, index, word) {
|
||||
var result = interpolate(rule[1], arguments);
|
||||
|
||||
if (match === '') {
|
||||
return restoreCase(word[index - 1], result);
|
||||
}
|
||||
|
||||
return restoreCase(match, result);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
return word;
|
||||
}
|
||||
|
||||
/**
|
||||
* Replace a word with the updated word.
|
||||
*
|
||||
* @param {Object} replaceMap
|
||||
* @param {Object} keepMap
|
||||
* @param {Array} rules
|
||||
* @return {Function}
|
||||
*/
|
||||
function replaceWord (replaceMap, keepMap, rules) {
|
||||
return function (word) {
|
||||
// Get the correct token and case restoration functions.
|
||||
var token = word.toLowerCase();
|
||||
|
||||
// Check against the keep object map.
|
||||
if (keepMap.hasOwnProperty(token)) {
|
||||
return restoreCase(word, token);
|
||||
}
|
||||
|
||||
// Check against the replacement map for a direct word replacement.
|
||||
if (replaceMap.hasOwnProperty(token)) {
|
||||
return restoreCase(word, replaceMap[token]);
|
||||
}
|
||||
|
||||
// Run all the rules against the word.
|
||||
return sanitizeWord(token, word, rules);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Pluralize or singularize a word based on the passed in count.
|
||||
*
|
||||
* @param {String} word
|
||||
* @param {Number} count
|
||||
* @param {Boolean} inclusive
|
||||
* @return {String}
|
||||
*/
|
||||
function pluralize (word, count, inclusive) {
|
||||
var pluralized = count === 1
|
||||
? pluralize.singular(word) : pluralize.plural(word);
|
||||
|
||||
return (inclusive ? count + ' ' : '') + pluralized;
|
||||
}
|
||||
|
||||
/**
|
||||
* Pluralize a word.
|
||||
*
|
||||
* @type {Function}
|
||||
*/
|
||||
pluralize.plural = replaceWord(
|
||||
irregularSingles, irregularPlurals, pluralRules
|
||||
);
|
||||
|
||||
/**
|
||||
* Singularize a word.
|
||||
*
|
||||
* @type {Function}
|
||||
*/
|
||||
pluralize.singular = replaceWord(
|
||||
irregularPlurals, irregularSingles, singularRules
|
||||
);
|
||||
|
||||
/**
|
||||
* Add a pluralization rule to the collection.
|
||||
*
|
||||
* @param {(string|RegExp)} rule
|
||||
* @param {string} replacement
|
||||
*/
|
||||
pluralize.addPluralRule = function (rule, replacement) {
|
||||
pluralRules.push([sanitizeRule(rule), replacement]);
|
||||
};
|
||||
|
||||
/**
|
||||
* Add a singularization rule to the collection.
|
||||
*
|
||||
* @param {(string|RegExp)} rule
|
||||
* @param {string} replacement
|
||||
*/
|
||||
pluralize.addSingularRule = function (rule, replacement) {
|
||||
singularRules.push([sanitizeRule(rule), replacement]);
|
||||
};
|
||||
|
||||
/**
|
||||
* Add an uncountable word rule.
|
||||
*
|
||||
* @param {(string|RegExp)} word
|
||||
*/
|
||||
pluralize.addUncountableRule = function (word) {
|
||||
if (typeof word === 'string') {
|
||||
uncountables[word.toLowerCase()] = true;
|
||||
return;
|
||||
}
|
||||
|
||||
// Set singular and plural references for the word.
|
||||
pluralize.addPluralRule(word, '$0');
|
||||
pluralize.addSingularRule(word, '$0');
|
||||
};
|
||||
|
||||
/**
|
||||
* Add an irregular word definition.
|
||||
*
|
||||
* @param {String} single
|
||||
* @param {String} plural
|
||||
*/
|
||||
pluralize.addIrregularRule = function (single, plural) {
|
||||
plural = plural.toLowerCase();
|
||||
single = single.toLowerCase();
|
||||
|
||||
irregularSingles[single] = plural;
|
||||
irregularPlurals[plural] = single;
|
||||
};
|
||||
|
||||
/**
|
||||
* Irregular rules.
|
||||
*/
|
||||
[
|
||||
// Pronouns.
|
||||
['I', 'we'],
|
||||
['me', 'us'],
|
||||
['he', 'they'],
|
||||
['she', 'they'],
|
||||
['them', 'them'],
|
||||
['myself', 'ourselves'],
|
||||
['yourself', 'yourselves'],
|
||||
['itself', 'themselves'],
|
||||
['herself', 'themselves'],
|
||||
['himself', 'themselves'],
|
||||
['themself', 'themselves'],
|
||||
['is', 'are'],
|
||||
['this', 'these'],
|
||||
['that', 'those'],
|
||||
// Words ending in with a consonant and `o`.
|
||||
['echo', 'echoes'],
|
||||
['dingo', 'dingoes'],
|
||||
['volcano', 'volcanoes'],
|
||||
['tornado', 'tornadoes'],
|
||||
['torpedo', 'torpedoes'],
|
||||
// Ends with `us`.
|
||||
['genus', 'genera'],
|
||||
['viscus', 'viscera'],
|
||||
// Ends with `ma`.
|
||||
['stigma', 'stigmata'],
|
||||
['stoma', 'stomata'],
|
||||
['dogma', 'dogmata'],
|
||||
['lemma', 'lemmata'],
|
||||
['schema', 'schemata'],
|
||||
['anathema', 'anathemata'],
|
||||
// Other irregular rules.
|
||||
['ox', 'oxen'],
|
||||
['axe', 'axes'],
|
||||
['die', 'dice'],
|
||||
['yes', 'yeses'],
|
||||
['foot', 'feet'],
|
||||
['eave', 'eaves'],
|
||||
['goose', 'geese'],
|
||||
['tooth', 'teeth'],
|
||||
['quiz', 'quizzes'],
|
||||
['human', 'humans'],
|
||||
['proof', 'proofs'],
|
||||
['carve', 'carves'],
|
||||
['valve', 'valves'],
|
||||
['thief', 'thieves'],
|
||||
['genie', 'genies'],
|
||||
['groove', 'grooves'],
|
||||
['pickaxe', 'pickaxes'],
|
||||
['whiskey', 'whiskies']
|
||||
].forEach(function (rule) {
|
||||
return pluralize.addIrregularRule(rule[0], rule[1]);
|
||||
});
|
||||
|
||||
/**
|
||||
* Pluralization rules.
|
||||
*/
|
||||
[
|
||||
[/s?$/i, 's'],
|
||||
[/([^aeiou]ese)$/i, '$1'],
|
||||
[/(ax|test)is$/i, '$1es'],
|
||||
[/(alias|[^aou]us|tlas|gas|ris)$/i, '$1es'],
|
||||
[/(e[mn]u)s?$/i, '$1s'],
|
||||
[/([^l]ias|[aeiou]las|[emjzr]as|[iu]am)$/i, '$1'],
|
||||
[/(alumn|syllab|octop|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i, '$1i'],
|
||||
[/(alumn|alg|vertebr)(?:a|ae)$/i, '$1ae'],
|
||||
[/(seraph|cherub)(?:im)?$/i, '$1im'],
|
||||
[/(her|at|gr)o$/i, '$1oes'],
|
||||
[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|automat|quor)(?:a|um)$/i, '$1a'],
|
||||
[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)(?:a|on)$/i, '$1a'],
|
||||
[/sis$/i, 'ses'],
|
||||
[/(?:(kni|wi|li)fe|(ar|l|ea|eo|oa|hoo)f)$/i, '$1$2ves'],
|
||||
[/([^aeiouy]|qu)y$/i, '$1ies'],
|
||||
[/([^ch][ieo][ln])ey$/i, '$1ies'],
|
||||
[/(x|ch|ss|sh|zz)$/i, '$1es'],
|
||||
[/(matr|cod|mur|sil|vert|ind|append)(?:ix|ex)$/i, '$1ices'],
|
||||
[/(m|l)(?:ice|ouse)$/i, '$1ice'],
|
||||
[/(pe)(?:rson|ople)$/i, '$1ople'],
|
||||
[/(child)(?:ren)?$/i, '$1ren'],
|
||||
[/eaux$/i, '$0'],
|
||||
[/m[ae]n$/i, 'men'],
|
||||
['thou', 'you']
|
||||
].forEach(function (rule) {
|
||||
return pluralize.addPluralRule(rule[0], rule[1]);
|
||||
});
|
||||
|
||||
/**
|
||||
* Singularization rules.
|
||||
*/
|
||||
[
|
||||
[/s$/i, ''],
|
||||
[/(ss)$/i, '$1'],
|
||||
[/((a)naly|(b)a|(d)iagno|(p)arenthe|(p)rogno|(s)ynop|(t)he)(?:sis|ses)$/i, '$1sis'],
|
||||
[/(^analy)(?:sis|ses)$/i, '$1sis'],
|
||||
[/(wi|kni|(?:after|half|high|low|mid|non|night|[^\w]|^)li)ves$/i, '$1fe'],
|
||||
[/(ar|(?:wo|[ae])l|[eo][ao])ves$/i, '$1f'],
|
||||
[/([^aeiouy]|qu)ies$/i, '$1y'],
|
||||
[/(^[pl]|zomb|^(?:neck)?t|[aeo][lt]|cut)ies$/i, '$1ie'],
|
||||
[/(\b(?:mon|smil))ies$/i, '$1ey'],
|
||||
[/(m|l)ice$/i, '$1ouse'],
|
||||
[/(seraph|cherub)im$/i, '$1'],
|
||||
[/(x|ch|ss|sh|zz|tto|go|cho|alias|[^aou]us|tlas|gas|(?:her|at|gr)o|ris)(?:es)?$/i, '$1'],
|
||||
[/(e[mn]u)s?$/i, '$1'],
|
||||
[/(movie|twelve)s$/i, '$1'],
|
||||
[/(cris|test|diagnos)(?:is|es)$/i, '$1is'],
|
||||
[/(alumn|syllab|octop|vir|radi|nucle|fung|cact|stimul|termin|bacill|foc|uter|loc|strat)(?:us|i)$/i, '$1us'],
|
||||
[/(agend|addend|millenni|dat|extrem|bacteri|desiderat|strat|candelabr|errat|ov|symposi|curricul|quor)a$/i, '$1um'],
|
||||
[/(apheli|hyperbat|periheli|asyndet|noumen|phenomen|criteri|organ|prolegomen|hedr|automat)a$/i, '$1on'],
|
||||
[/(alumn|alg|vertebr)ae$/i, '$1a'],
|
||||
[/(cod|mur|sil|vert|ind)ices$/i, '$1ex'],
|
||||
[/(matr|append)ices$/i, '$1ix'],
|
||||
[/(pe)(rson|ople)$/i, '$1rson'],
|
||||
[/(child)ren$/i, '$1'],
|
||||
[/(eau)x?$/i, '$1'],
|
||||
[/men$/i, 'man']
|
||||
].forEach(function (rule) {
|
||||
return pluralize.addSingularRule(rule[0], rule[1]);
|
||||
});
|
||||
|
||||
/**
|
||||
* Uncountable rules.
|
||||
*/
|
||||
[
|
||||
// Singular words with no plurals.
|
||||
'advice',
|
||||
'agenda',
|
||||
'bison',
|
||||
'bream',
|
||||
'buffalo',
|
||||
'carp',
|
||||
'chassis',
|
||||
'cod',
|
||||
'cooperation',
|
||||
'corps',
|
||||
'digestion',
|
||||
'debris',
|
||||
'diabetes',
|
||||
'energy',
|
||||
'equipment',
|
||||
'elk',
|
||||
'excretion',
|
||||
'expertise',
|
||||
'flounder',
|
||||
'gallows',
|
||||
'garbage',
|
||||
'graffiti',
|
||||
'headquarters',
|
||||
'health',
|
||||
'herpes',
|
||||
'highjinks',
|
||||
'homework',
|
||||
'information',
|
||||
'jeans',
|
||||
'justice',
|
||||
'kudos',
|
||||
'labour',
|
||||
'machinery',
|
||||
'mackerel',
|
||||
'media',
|
||||
'mews',
|
||||
'moose',
|
||||
'news',
|
||||
'pike',
|
||||
'plankton',
|
||||
'pliers',
|
||||
'pollution',
|
||||
'premises',
|
||||
'rain',
|
||||
'rice',
|
||||
'salmon',
|
||||
'scissors',
|
||||
'series',
|
||||
'sewage',
|
||||
'shambles',
|
||||
'shrimp',
|
||||
'species',
|
||||
'staff',
|
||||
'swine',
|
||||
'trout',
|
||||
'tuna',
|
||||
'whiting',
|
||||
'wildebeest',
|
||||
'wildlife',
|
||||
'you',
|
||||
// Regexes.
|
||||
/pox$/i, // "chickpox", "smallpox"
|
||||
/ois$/i,
|
||||
/deer$/i, // "deer", "reindeer"
|
||||
/fish$/i, // "fish", "blowfish", "angelfish"
|
||||
/sheep$/i,
|
||||
/measles$/i,
|
||||
/[^aeiou]ese$/i // "chinese", "japanese"
|
||||
].forEach(pluralize.addUncountableRule);
|
||||
|
||||
return pluralize;
|
||||
});
|
||||
|
|
@ -1,31 +0,0 @@
|
|||
.lg-outer.fb-comments .lg-img-wrap {
|
||||
padding-right: 400px !important; }
|
||||
.lg-outer.fb-comments .fb-comments {
|
||||
height: 100%;
|
||||
overflow-y: auto;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
top: 0;
|
||||
width: 420px;
|
||||
z-index: 99999;
|
||||
background: #fff url("../img/loading.gif") no-repeat scroll center center; }
|
||||
.lg-outer.fb-comments .fb-comments.fb_iframe_widget {
|
||||
background-image: none; }
|
||||
.lg-outer.fb-comments .fb-comments.fb_iframe_widget.fb_iframe_widget_loader {
|
||||
background: #fff url("../img/loading.gif") no-repeat scroll center center; }
|
||||
.lg-outer.fb-comments .lg-toolbar {
|
||||
right: 420px;
|
||||
width: auto; }
|
||||
.lg-outer.fb-comments .lg-actions .lg-next {
|
||||
right: 420px; }
|
||||
.lg-outer.fb-comments .lg-item {
|
||||
background-image: none; }
|
||||
.lg-outer.fb-comments .lg-item.lg-complete .lg-img-wrap {
|
||||
background-image: none; }
|
||||
.lg-outer.fb-comments .lg-img-wrap {
|
||||
background: url(../img/loading.gif) no-repeat scroll center center transparent; }
|
||||
.lg-outer.fb-comments .lg-sub-html {
|
||||
padding: 0;
|
||||
position: static; }
|
||||
|
||||
/*# sourceMappingURL=lg-fb-comment-box.css.map */
|
||||
|
|
@ -1,7 +0,0 @@
|
|||
{
|
||||
"version": 3,
|
||||
"mappings": "AAGI,kCAAa;EACT,aAAa,EAAE,gBAAgB;AAEnC,kCAAa;EACT,MAAM,EAAE,IAAI;EACZ,UAAU,EAAE,IAAI;EAChB,QAAQ,EAAE,QAAQ;EAClB,KAAK,EAAE,CAAC;EACR,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,KAAK;EACZ,OAAO,EAAE,KAAK;EACd,UAAU,EAAE,6DAA6D;EACzE,mDAAmB;IACf,gBAAgB,EAAE,IAAI;IACtB,2EAAyB;MACrB,UAAU,EAAE,6DAA6D;AAIrF,iCAAY;EACR,KAAK,EAAE,KAAK;EACZ,KAAK,EAAE,IAAI;AAEf,0CAAqB;EACjB,KAAK,EAAE,KAAK;AAEhB,8BAAS;EACL,gBAAgB,EAAE,IAAI;EAElB,uDAAY;IACR,gBAAgB,EAAE,IAAI;AAIlC,kCAAa;EACT,UAAU,EAAE,kEAAkE;AAGlF,kCAAa;EACT,OAAO,EAAE,CAAC;EACV,QAAQ,EAAE,MAAM",
|
||||
"sources": ["../sass/lg-fb-comment-box.scss"],
|
||||
"names": [],
|
||||
"file": "lg-fb-comment-box.css"
|
||||
}
|
||||
|
|
@ -1,776 +0,0 @@
|
|||
.lg-css3.lg-zoom-in .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-zoom-in .lg-item.lg-prev-slide {
|
||||
-webkit-transform: scale3d(1.3, 1.3, 1.3);
|
||||
transform: scale3d(1.3, 1.3, 1.3); }
|
||||
.lg-css3.lg-zoom-in .lg-item.lg-next-slide {
|
||||
-webkit-transform: scale3d(1.3, 1.3, 1.3);
|
||||
transform: scale3d(1.3, 1.3, 1.3); }
|
||||
.lg-css3.lg-zoom-in .lg-item.lg-current {
|
||||
-webkit-transform: scale3d(1, 1, 1);
|
||||
transform: scale3d(1, 1, 1);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-zoom-in .lg-item.lg-prev-slide, .lg-css3.lg-zoom-in .lg-item.lg-next-slide, .lg-css3.lg-zoom-in .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; }
|
||||
.lg-css3.lg-zoom-in-big .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-zoom-in-big .lg-item.lg-prev-slide {
|
||||
-webkit-transform: scale3d(2, 2, 2);
|
||||
transform: scale3d(2, 2, 2); }
|
||||
.lg-css3.lg-zoom-in-big .lg-item.lg-next-slide {
|
||||
-webkit-transform: scale3d(2, 2, 2);
|
||||
transform: scale3d(2, 2, 2); }
|
||||
.lg-css3.lg-zoom-in-big .lg-item.lg-current {
|
||||
-webkit-transform: scale3d(1, 1, 1);
|
||||
transform: scale3d(1, 1, 1);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-zoom-in-big .lg-item.lg-prev-slide, .lg-css3.lg-zoom-in-big .lg-item.lg-next-slide, .lg-css3.lg-zoom-in-big .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; }
|
||||
.lg-css3.lg-zoom-out .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-zoom-out .lg-item.lg-prev-slide {
|
||||
-webkit-transform: scale3d(0.7, 0.7, 0.7);
|
||||
transform: scale3d(0.7, 0.7, 0.7); }
|
||||
.lg-css3.lg-zoom-out .lg-item.lg-next-slide {
|
||||
-webkit-transform: scale3d(0.7, 0.7, 0.7);
|
||||
transform: scale3d(0.7, 0.7, 0.7); }
|
||||
.lg-css3.lg-zoom-out .lg-item.lg-current {
|
||||
-webkit-transform: scale3d(1, 1, 1);
|
||||
transform: scale3d(1, 1, 1);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-zoom-out .lg-item.lg-prev-slide, .lg-css3.lg-zoom-out .lg-item.lg-next-slide, .lg-css3.lg-zoom-out .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; }
|
||||
.lg-css3.lg-zoom-out-big .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-zoom-out-big .lg-item.lg-prev-slide {
|
||||
-webkit-transform: scale3d(0, 0, 0);
|
||||
transform: scale3d(0, 0, 0); }
|
||||
.lg-css3.lg-zoom-out-big .lg-item.lg-next-slide {
|
||||
-webkit-transform: scale3d(0, 0, 0);
|
||||
transform: scale3d(0, 0, 0); }
|
||||
.lg-css3.lg-zoom-out-big .lg-item.lg-current {
|
||||
-webkit-transform: scale3d(1, 1, 1);
|
||||
transform: scale3d(1, 1, 1);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-zoom-out-big .lg-item.lg-prev-slide, .lg-css3.lg-zoom-out-big .lg-item.lg-next-slide, .lg-css3.lg-zoom-out-big .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; }
|
||||
.lg-css3.lg-zoom-out-in .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-zoom-out-in .lg-item.lg-prev-slide {
|
||||
-webkit-transform: scale3d(0, 0, 0);
|
||||
transform: scale3d(0, 0, 0); }
|
||||
.lg-css3.lg-zoom-out-in .lg-item.lg-next-slide {
|
||||
-webkit-transform: scale3d(2, 2, 2);
|
||||
transform: scale3d(2, 2, 2); }
|
||||
.lg-css3.lg-zoom-out-in .lg-item.lg-current {
|
||||
-webkit-transform: scale3d(1, 1, 1);
|
||||
transform: scale3d(1, 1, 1);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-zoom-out-in .lg-item.lg-prev-slide, .lg-css3.lg-zoom-out-in .lg-item.lg-next-slide, .lg-css3.lg-zoom-out-in .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; }
|
||||
.lg-css3.lg-zoom-in-out .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-zoom-in-out .lg-item.lg-prev-slide {
|
||||
-webkit-transform: scale3d(2, 2, 2);
|
||||
transform: scale3d(2, 2, 2); }
|
||||
.lg-css3.lg-zoom-in-out .lg-item.lg-next-slide {
|
||||
-webkit-transform: scale3d(0, 0, 0);
|
||||
transform: scale3d(0, 0, 0); }
|
||||
.lg-css3.lg-zoom-in-out .lg-item.lg-current {
|
||||
-webkit-transform: scale3d(1, 1, 1);
|
||||
transform: scale3d(1, 1, 1);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-zoom-in-out .lg-item.lg-prev-slide, .lg-css3.lg-zoom-in-out .lg-item.lg-next-slide, .lg-css3.lg-zoom-in-out .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; }
|
||||
.lg-css3.lg-soft-zoom .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-soft-zoom .lg-item.lg-prev-slide {
|
||||
-webkit-transform: scale3d(1.1, 1.1, 1.1);
|
||||
transform: scale3d(1.1, 1.1, 1.1); }
|
||||
.lg-css3.lg-soft-zoom .lg-item.lg-next-slide {
|
||||
-webkit-transform: scale3d(0.9, 0.9, 0.9);
|
||||
transform: scale3d(0.9, 0.9, 0.9); }
|
||||
.lg-css3.lg-soft-zoom .lg-item.lg-current {
|
||||
-webkit-transform: scale3d(1, 1, 1);
|
||||
transform: scale3d(1, 1, 1);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-soft-zoom .lg-item.lg-prev-slide, .lg-css3.lg-soft-zoom .lg-item.lg-next-slide, .lg-css3.lg-soft-zoom .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; }
|
||||
.lg-css3.lg-scale-up .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-scale-up .lg-item.lg-prev-slide {
|
||||
-moz-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0);
|
||||
-o-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0);
|
||||
-ms-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0);
|
||||
-webkit-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0);
|
||||
transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0); }
|
||||
.lg-css3.lg-scale-up .lg-item.lg-next-slide {
|
||||
-moz-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0);
|
||||
-o-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0);
|
||||
-ms-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0);
|
||||
-webkit-transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0);
|
||||
transform: scale3d(0.8, 0.8, 0.8) translate3d(0%, 10%, 0); }
|
||||
.lg-css3.lg-scale-up .lg-item.lg-current {
|
||||
-moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-scale-up .lg-item.lg-prev-slide, .lg-css3.lg-scale-up .lg-item.lg-next-slide, .lg-css3.lg-scale-up .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; }
|
||||
.lg-css3.lg-slide-circular .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-circular .lg-item.lg-prev-slide {
|
||||
-moz-transform: scale3d(0, 0, 0) translate3d(-100%, 0, 0);
|
||||
-o-transform: scale3d(0, 0, 0) translate3d(-100%, 0, 0);
|
||||
-ms-transform: scale3d(0, 0, 0) translate3d(-100%, 0, 0);
|
||||
-webkit-transform: scale3d(0, 0, 0) translate3d(-100%, 0, 0);
|
||||
transform: scale3d(0, 0, 0) translate3d(-100%, 0, 0); }
|
||||
.lg-css3.lg-slide-circular .lg-item.lg-next-slide {
|
||||
-moz-transform: scale3d(0, 0, 0) translate3d(100%, 0, 0);
|
||||
-o-transform: scale3d(0, 0, 0) translate3d(100%, 0, 0);
|
||||
-ms-transform: scale3d(0, 0, 0) translate3d(100%, 0, 0);
|
||||
-webkit-transform: scale3d(0, 0, 0) translate3d(100%, 0, 0);
|
||||
transform: scale3d(0, 0, 0) translate3d(100%, 0, 0); }
|
||||
.lg-css3.lg-slide-circular .lg-item.lg-current {
|
||||
-moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-circular .lg-item.lg-prev-slide, .lg-css3.lg-slide-circular .lg-item.lg-next-slide, .lg-css3.lg-slide-circular .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; }
|
||||
.lg-css3.lg-slide-circular-up .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-circular-up .lg-item.lg-prev-slide {
|
||||
-moz-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0);
|
||||
-o-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0);
|
||||
-ms-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0);
|
||||
-webkit-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0);
|
||||
transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0); }
|
||||
.lg-css3.lg-slide-circular-up .lg-item.lg-next-slide {
|
||||
-moz-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0);
|
||||
-o-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0);
|
||||
-ms-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0);
|
||||
-webkit-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0);
|
||||
transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0); }
|
||||
.lg-css3.lg-slide-circular-up .lg-item.lg-current {
|
||||
-moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-circular-up .lg-item.lg-prev-slide, .lg-css3.lg-slide-circular-up .lg-item.lg-next-slide, .lg-css3.lg-slide-circular-up .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; }
|
||||
.lg-css3.lg-slide-circular-down .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-circular-down .lg-item.lg-prev-slide {
|
||||
-moz-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0);
|
||||
-o-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0);
|
||||
-ms-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0);
|
||||
-webkit-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0);
|
||||
transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0); }
|
||||
.lg-css3.lg-slide-circular-down .lg-item.lg-next-slide {
|
||||
-moz-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0);
|
||||
-o-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0);
|
||||
-ms-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0);
|
||||
-webkit-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0);
|
||||
transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0); }
|
||||
.lg-css3.lg-slide-circular-down .lg-item.lg-current {
|
||||
-moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-circular-down .lg-item.lg-prev-slide, .lg-css3.lg-slide-circular-down .lg-item.lg-next-slide, .lg-css3.lg-slide-circular-down .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; }
|
||||
.lg-css3.lg-slide-circular-vertical .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-circular-vertical .lg-item.lg-prev-slide {
|
||||
-moz-transform: scale3d(0, 0, 0) translate3d(0, -100%, 0);
|
||||
-o-transform: scale3d(0, 0, 0) translate3d(0, -100%, 0);
|
||||
-ms-transform: scale3d(0, 0, 0) translate3d(0, -100%, 0);
|
||||
-webkit-transform: scale3d(0, 0, 0) translate3d(0, -100%, 0);
|
||||
transform: scale3d(0, 0, 0) translate3d(0, -100%, 0); }
|
||||
.lg-css3.lg-slide-circular-vertical .lg-item.lg-next-slide {
|
||||
-moz-transform: scale3d(0, 0, 0) translate3d(0, 100%, 0);
|
||||
-o-transform: scale3d(0, 0, 0) translate3d(0, 100%, 0);
|
||||
-ms-transform: scale3d(0, 0, 0) translate3d(0, 100%, 0);
|
||||
-webkit-transform: scale3d(0, 0, 0) translate3d(0, 100%, 0);
|
||||
transform: scale3d(0, 0, 0) translate3d(0, 100%, 0); }
|
||||
.lg-css3.lg-slide-circular-vertical .lg-item.lg-current {
|
||||
-moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-circular-vertical .lg-item.lg-prev-slide, .lg-css3.lg-slide-circular-vertical .lg-item.lg-next-slide, .lg-css3.lg-slide-circular-vertical .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; }
|
||||
.lg-css3.lg-slide-circular-vertical-left .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-prev-slide {
|
||||
-moz-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0);
|
||||
-o-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0);
|
||||
-ms-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0);
|
||||
-webkit-transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0);
|
||||
transform: scale3d(0, 0, 0) translate3d(-100%, -100%, 0); }
|
||||
.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-next-slide {
|
||||
-moz-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0);
|
||||
-o-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0);
|
||||
-ms-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0);
|
||||
-webkit-transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0);
|
||||
transform: scale3d(0, 0, 0) translate3d(-100%, 100%, 0); }
|
||||
.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-current {
|
||||
-moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-circular-vertical-left .lg-item.lg-prev-slide, .lg-css3.lg-slide-circular-vertical-left .lg-item.lg-next-slide, .lg-css3.lg-slide-circular-vertical-left .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; }
|
||||
.lg-css3.lg-slide-circular-vertical-down .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-prev-slide {
|
||||
-moz-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0);
|
||||
-o-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0);
|
||||
-ms-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0);
|
||||
-webkit-transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0);
|
||||
transform: scale3d(0, 0, 0) translate3d(100%, -100%, 0); }
|
||||
.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-next-slide {
|
||||
-moz-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0);
|
||||
-o-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0);
|
||||
-ms-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0);
|
||||
-webkit-transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0);
|
||||
transform: scale3d(0, 0, 0) translate3d(100%, 100%, 0); }
|
||||
.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-current {
|
||||
-moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-circular-vertical-down .lg-item.lg-prev-slide, .lg-css3.lg-slide-circular-vertical-down .lg-item.lg-next-slide, .lg-css3.lg-slide-circular-vertical-down .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 1s ease 0s; }
|
||||
.lg-css3.lg-slide-vertical .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-vertical .lg-item.lg-prev-slide {
|
||||
-webkit-transform: translate3d(0, -100%, 0);
|
||||
transform: translate3d(0, -100%, 0); }
|
||||
.lg-css3.lg-slide-vertical .lg-item.lg-next-slide {
|
||||
-webkit-transform: translate3d(0, 100%, 0);
|
||||
transform: translate3d(0, 100%, 0); }
|
||||
.lg-css3.lg-slide-vertical .lg-item.lg-current {
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-vertical .lg-item.lg-prev-slide, .lg-css3.lg-slide-vertical .lg-item.lg-next-slide, .lg-css3.lg-slide-vertical .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-slide-vertical-growth .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-vertical-growth .lg-item.lg-prev-slide {
|
||||
-moz-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, -150%, 0);
|
||||
-o-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, -150%, 0);
|
||||
-ms-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, -150%, 0);
|
||||
-webkit-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, -150%, 0);
|
||||
transform: scale3d(0.5, 0.5, 0.5) translate3d(0, -150%, 0); }
|
||||
.lg-css3.lg-slide-vertical-growth .lg-item.lg-next-slide {
|
||||
-moz-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, 150%, 0);
|
||||
-o-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, 150%, 0);
|
||||
-ms-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, 150%, 0);
|
||||
-webkit-transform: scale3d(0.5, 0.5, 0.5) translate3d(0, 150%, 0);
|
||||
transform: scale3d(0.5, 0.5, 0.5) translate3d(0, 150%, 0); }
|
||||
.lg-css3.lg-slide-vertical-growth .lg-item.lg-current {
|
||||
-moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-vertical-growth .lg-item.lg-prev-slide, .lg-css3.lg-slide-vertical-growth .lg-item.lg-next-slide, .lg-css3.lg-slide-vertical-growth .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-slide-skew-only .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-skew-only .lg-item.lg-prev-slide {
|
||||
-moz-transform: skew(10deg, 0deg);
|
||||
-o-transform: skew(10deg, 0deg);
|
||||
-ms-transform: skew(10deg, 0deg);
|
||||
-webkit-transform: skew(10deg, 0deg);
|
||||
transform: skew(10deg, 0deg); }
|
||||
.lg-css3.lg-slide-skew-only .lg-item.lg-next-slide {
|
||||
-moz-transform: skew(10deg, 0deg);
|
||||
-o-transform: skew(10deg, 0deg);
|
||||
-ms-transform: skew(10deg, 0deg);
|
||||
-webkit-transform: skew(10deg, 0deg);
|
||||
transform: skew(10deg, 0deg); }
|
||||
.lg-css3.lg-slide-skew-only .lg-item.lg-current {
|
||||
-moz-transform: skew(0deg, 0deg);
|
||||
-o-transform: skew(0deg, 0deg);
|
||||
-ms-transform: skew(0deg, 0deg);
|
||||
-webkit-transform: skew(0deg, 0deg);
|
||||
transform: skew(0deg, 0deg);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-skew-only .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-only .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-only .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-slide-skew-only-rev .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-skew-only-rev .lg-item.lg-prev-slide {
|
||||
-moz-transform: skew(-10deg, 0deg);
|
||||
-o-transform: skew(-10deg, 0deg);
|
||||
-ms-transform: skew(-10deg, 0deg);
|
||||
-webkit-transform: skew(-10deg, 0deg);
|
||||
transform: skew(-10deg, 0deg); }
|
||||
.lg-css3.lg-slide-skew-only-rev .lg-item.lg-next-slide {
|
||||
-moz-transform: skew(-10deg, 0deg);
|
||||
-o-transform: skew(-10deg, 0deg);
|
||||
-ms-transform: skew(-10deg, 0deg);
|
||||
-webkit-transform: skew(-10deg, 0deg);
|
||||
transform: skew(-10deg, 0deg); }
|
||||
.lg-css3.lg-slide-skew-only-rev .lg-item.lg-current {
|
||||
-moz-transform: skew(0deg, 0deg);
|
||||
-o-transform: skew(0deg, 0deg);
|
||||
-ms-transform: skew(0deg, 0deg);
|
||||
-webkit-transform: skew(0deg, 0deg);
|
||||
transform: skew(0deg, 0deg);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-skew-only-rev .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-only-rev .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-only-rev .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-slide-skew-only-y .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-skew-only-y .lg-item.lg-prev-slide {
|
||||
-moz-transform: skew(0deg, 10deg);
|
||||
-o-transform: skew(0deg, 10deg);
|
||||
-ms-transform: skew(0deg, 10deg);
|
||||
-webkit-transform: skew(0deg, 10deg);
|
||||
transform: skew(0deg, 10deg); }
|
||||
.lg-css3.lg-slide-skew-only-y .lg-item.lg-next-slide {
|
||||
-moz-transform: skew(0deg, 10deg);
|
||||
-o-transform: skew(0deg, 10deg);
|
||||
-ms-transform: skew(0deg, 10deg);
|
||||
-webkit-transform: skew(0deg, 10deg);
|
||||
transform: skew(0deg, 10deg); }
|
||||
.lg-css3.lg-slide-skew-only-y .lg-item.lg-current {
|
||||
-moz-transform: skew(0deg, 0deg);
|
||||
-o-transform: skew(0deg, 0deg);
|
||||
-ms-transform: skew(0deg, 0deg);
|
||||
-webkit-transform: skew(0deg, 0deg);
|
||||
transform: skew(0deg, 0deg);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-skew-only-y .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-only-y .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-only-y .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-slide-skew-only-y-rev .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-prev-slide {
|
||||
-moz-transform: skew(0deg, -10deg);
|
||||
-o-transform: skew(0deg, -10deg);
|
||||
-ms-transform: skew(0deg, -10deg);
|
||||
-webkit-transform: skew(0deg, -10deg);
|
||||
transform: skew(0deg, -10deg); }
|
||||
.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-next-slide {
|
||||
-moz-transform: skew(0deg, -10deg);
|
||||
-o-transform: skew(0deg, -10deg);
|
||||
-ms-transform: skew(0deg, -10deg);
|
||||
-webkit-transform: skew(0deg, -10deg);
|
||||
transform: skew(0deg, -10deg); }
|
||||
.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-current {
|
||||
-moz-transform: skew(0deg, 0deg);
|
||||
-o-transform: skew(0deg, 0deg);
|
||||
-ms-transform: skew(0deg, 0deg);
|
||||
-webkit-transform: skew(0deg, 0deg);
|
||||
transform: skew(0deg, 0deg);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-only-y-rev .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-slide-skew .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-skew .lg-item.lg-prev-slide {
|
||||
-moz-transform: skew(20deg, 0deg) translate3d(-100%, 0%, 0px);
|
||||
-o-transform: skew(20deg, 0deg) translate3d(-100%, 0%, 0px);
|
||||
-ms-transform: skew(20deg, 0deg) translate3d(-100%, 0%, 0px);
|
||||
-webkit-transform: skew(20deg, 0deg) translate3d(-100%, 0%, 0px);
|
||||
transform: skew(20deg, 0deg) translate3d(-100%, 0%, 0px); }
|
||||
.lg-css3.lg-slide-skew .lg-item.lg-next-slide {
|
||||
-moz-transform: skew(20deg, 0deg) translate3d(100%, 0%, 0px);
|
||||
-o-transform: skew(20deg, 0deg) translate3d(100%, 0%, 0px);
|
||||
-ms-transform: skew(20deg, 0deg) translate3d(100%, 0%, 0px);
|
||||
-webkit-transform: skew(20deg, 0deg) translate3d(100%, 0%, 0px);
|
||||
transform: skew(20deg, 0deg) translate3d(100%, 0%, 0px); }
|
||||
.lg-css3.lg-slide-skew .lg-item.lg-current {
|
||||
-moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-skew .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew .lg-item.lg-next-slide, .lg-css3.lg-slide-skew .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-slide-skew-rev .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-skew-rev .lg-item.lg-prev-slide {
|
||||
-moz-transform: skew(-20deg, 0deg) translate3d(-100%, 0%, 0px);
|
||||
-o-transform: skew(-20deg, 0deg) translate3d(-100%, 0%, 0px);
|
||||
-ms-transform: skew(-20deg, 0deg) translate3d(-100%, 0%, 0px);
|
||||
-webkit-transform: skew(-20deg, 0deg) translate3d(-100%, 0%, 0px);
|
||||
transform: skew(-20deg, 0deg) translate3d(-100%, 0%, 0px); }
|
||||
.lg-css3.lg-slide-skew-rev .lg-item.lg-next-slide {
|
||||
-moz-transform: skew(-20deg, 0deg) translate3d(100%, 0%, 0px);
|
||||
-o-transform: skew(-20deg, 0deg) translate3d(100%, 0%, 0px);
|
||||
-ms-transform: skew(-20deg, 0deg) translate3d(100%, 0%, 0px);
|
||||
-webkit-transform: skew(-20deg, 0deg) translate3d(100%, 0%, 0px);
|
||||
transform: skew(-20deg, 0deg) translate3d(100%, 0%, 0px); }
|
||||
.lg-css3.lg-slide-skew-rev .lg-item.lg-current {
|
||||
-moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-skew-rev .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-rev .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-rev .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-slide-skew-cross .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-skew-cross .lg-item.lg-prev-slide {
|
||||
-moz-transform: skew(0deg, 60deg) translate3d(-100%, 0%, 0px);
|
||||
-o-transform: skew(0deg, 60deg) translate3d(-100%, 0%, 0px);
|
||||
-ms-transform: skew(0deg, 60deg) translate3d(-100%, 0%, 0px);
|
||||
-webkit-transform: skew(0deg, 60deg) translate3d(-100%, 0%, 0px);
|
||||
transform: skew(0deg, 60deg) translate3d(-100%, 0%, 0px); }
|
||||
.lg-css3.lg-slide-skew-cross .lg-item.lg-next-slide {
|
||||
-moz-transform: skew(0deg, 60deg) translate3d(100%, 0%, 0px);
|
||||
-o-transform: skew(0deg, 60deg) translate3d(100%, 0%, 0px);
|
||||
-ms-transform: skew(0deg, 60deg) translate3d(100%, 0%, 0px);
|
||||
-webkit-transform: skew(0deg, 60deg) translate3d(100%, 0%, 0px);
|
||||
transform: skew(0deg, 60deg) translate3d(100%, 0%, 0px); }
|
||||
.lg-css3.lg-slide-skew-cross .lg-item.lg-current {
|
||||
-moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-skew-cross .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-cross .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-cross .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-slide-skew-cross-rev .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-prev-slide {
|
||||
-moz-transform: skew(0deg, -60deg) translate3d(-100%, 0%, 0px);
|
||||
-o-transform: skew(0deg, -60deg) translate3d(-100%, 0%, 0px);
|
||||
-ms-transform: skew(0deg, -60deg) translate3d(-100%, 0%, 0px);
|
||||
-webkit-transform: skew(0deg, -60deg) translate3d(-100%, 0%, 0px);
|
||||
transform: skew(0deg, -60deg) translate3d(-100%, 0%, 0px); }
|
||||
.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-next-slide {
|
||||
-moz-transform: skew(0deg, -60deg) translate3d(100%, 0%, 0px);
|
||||
-o-transform: skew(0deg, -60deg) translate3d(100%, 0%, 0px);
|
||||
-ms-transform: skew(0deg, -60deg) translate3d(100%, 0%, 0px);
|
||||
-webkit-transform: skew(0deg, -60deg) translate3d(100%, 0%, 0px);
|
||||
transform: skew(0deg, -60deg) translate3d(100%, 0%, 0px); }
|
||||
.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-current {
|
||||
-moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-skew-cross-rev .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-cross-rev .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-cross-rev .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-slide-skew-ver .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-skew-ver .lg-item.lg-prev-slide {
|
||||
-moz-transform: skew(60deg, 0deg) translate3d(0, -100%, 0px);
|
||||
-o-transform: skew(60deg, 0deg) translate3d(0, -100%, 0px);
|
||||
-ms-transform: skew(60deg, 0deg) translate3d(0, -100%, 0px);
|
||||
-webkit-transform: skew(60deg, 0deg) translate3d(0, -100%, 0px);
|
||||
transform: skew(60deg, 0deg) translate3d(0, -100%, 0px); }
|
||||
.lg-css3.lg-slide-skew-ver .lg-item.lg-next-slide {
|
||||
-moz-transform: skew(60deg, 0deg) translate3d(0, 100%, 0px);
|
||||
-o-transform: skew(60deg, 0deg) translate3d(0, 100%, 0px);
|
||||
-ms-transform: skew(60deg, 0deg) translate3d(0, 100%, 0px);
|
||||
-webkit-transform: skew(60deg, 0deg) translate3d(0, 100%, 0px);
|
||||
transform: skew(60deg, 0deg) translate3d(0, 100%, 0px); }
|
||||
.lg-css3.lg-slide-skew-ver .lg-item.lg-current {
|
||||
-moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-skew-ver .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-ver .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-ver .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-slide-skew-ver-rev .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-prev-slide {
|
||||
-moz-transform: skew(-60deg, 0deg) translate3d(0, -100%, 0px);
|
||||
-o-transform: skew(-60deg, 0deg) translate3d(0, -100%, 0px);
|
||||
-ms-transform: skew(-60deg, 0deg) translate3d(0, -100%, 0px);
|
||||
-webkit-transform: skew(-60deg, 0deg) translate3d(0, -100%, 0px);
|
||||
transform: skew(-60deg, 0deg) translate3d(0, -100%, 0px); }
|
||||
.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-next-slide {
|
||||
-moz-transform: skew(-60deg, 0deg) translate3d(0, 100%, 0px);
|
||||
-o-transform: skew(-60deg, 0deg) translate3d(0, 100%, 0px);
|
||||
-ms-transform: skew(-60deg, 0deg) translate3d(0, 100%, 0px);
|
||||
-webkit-transform: skew(-60deg, 0deg) translate3d(0, 100%, 0px);
|
||||
transform: skew(-60deg, 0deg) translate3d(0, 100%, 0px); }
|
||||
.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-current {
|
||||
-moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-skew-ver-rev .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-ver-rev .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-ver-rev .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-slide-skew-ver-cross .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-prev-slide {
|
||||
-moz-transform: skew(0deg, 20deg) translate3d(0, -100%, 0px);
|
||||
-o-transform: skew(0deg, 20deg) translate3d(0, -100%, 0px);
|
||||
-ms-transform: skew(0deg, 20deg) translate3d(0, -100%, 0px);
|
||||
-webkit-transform: skew(0deg, 20deg) translate3d(0, -100%, 0px);
|
||||
transform: skew(0deg, 20deg) translate3d(0, -100%, 0px); }
|
||||
.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-next-slide {
|
||||
-moz-transform: skew(0deg, 20deg) translate3d(0, 100%, 0px);
|
||||
-o-transform: skew(0deg, 20deg) translate3d(0, 100%, 0px);
|
||||
-ms-transform: skew(0deg, 20deg) translate3d(0, 100%, 0px);
|
||||
-webkit-transform: skew(0deg, 20deg) translate3d(0, 100%, 0px);
|
||||
transform: skew(0deg, 20deg) translate3d(0, 100%, 0px); }
|
||||
.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-current {
|
||||
-moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-skew-ver-cross .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-ver-cross .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-ver-cross .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-slide-skew-ver-cross-rev .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-prev-slide {
|
||||
-moz-transform: skew(0deg, -20deg) translate3d(0, -100%, 0px);
|
||||
-o-transform: skew(0deg, -20deg) translate3d(0, -100%, 0px);
|
||||
-ms-transform: skew(0deg, -20deg) translate3d(0, -100%, 0px);
|
||||
-webkit-transform: skew(0deg, -20deg) translate3d(0, -100%, 0px);
|
||||
transform: skew(0deg, -20deg) translate3d(0, -100%, 0px); }
|
||||
.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-next-slide {
|
||||
-moz-transform: skew(0deg, -20deg) translate3d(0, 100%, 0px);
|
||||
-o-transform: skew(0deg, -20deg) translate3d(0, 100%, 0px);
|
||||
-ms-transform: skew(0deg, -20deg) translate3d(0, 100%, 0px);
|
||||
-webkit-transform: skew(0deg, -20deg) translate3d(0, 100%, 0px);
|
||||
transform: skew(0deg, -20deg) translate3d(0, 100%, 0px); }
|
||||
.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-current {
|
||||
-moz-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-o-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-ms-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
-webkit-transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
transform: skew(0deg, 0deg) translate3d(0%, 0%, 0px);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-prev-slide, .lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-next-slide, .lg-css3.lg-slide-skew-ver-cross-rev .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-lollipop .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-lollipop .lg-item.lg-prev-slide {
|
||||
-webkit-transform: translate3d(-100%, 0, 0);
|
||||
transform: translate3d(-100%, 0, 0); }
|
||||
.lg-css3.lg-lollipop .lg-item.lg-next-slide {
|
||||
-moz-transform: translate3d(0, 0, 0) scale(0.5);
|
||||
-o-transform: translate3d(0, 0, 0) scale(0.5);
|
||||
-ms-transform: translate3d(0, 0, 0) scale(0.5);
|
||||
-webkit-transform: translate3d(0, 0, 0) scale(0.5);
|
||||
transform: translate3d(0, 0, 0) scale(0.5); }
|
||||
.lg-css3.lg-lollipop .lg-item.lg-current {
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-lollipop .lg-item.lg-prev-slide, .lg-css3.lg-lollipop .lg-item.lg-next-slide, .lg-css3.lg-lollipop .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-lollipop-rev .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-lollipop-rev .lg-item.lg-prev-slide {
|
||||
-moz-transform: translate3d(0, 0, 0) scale(0.5);
|
||||
-o-transform: translate3d(0, 0, 0) scale(0.5);
|
||||
-ms-transform: translate3d(0, 0, 0) scale(0.5);
|
||||
-webkit-transform: translate3d(0, 0, 0) scale(0.5);
|
||||
transform: translate3d(0, 0, 0) scale(0.5); }
|
||||
.lg-css3.lg-lollipop-rev .lg-item.lg-next-slide {
|
||||
-webkit-transform: translate3d(100%, 0, 0);
|
||||
transform: translate3d(100%, 0, 0); }
|
||||
.lg-css3.lg-lollipop-rev .lg-item.lg-current {
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-lollipop-rev .lg-item.lg-prev-slide, .lg-css3.lg-lollipop-rev .lg-item.lg-next-slide, .lg-css3.lg-lollipop-rev .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-rotate .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-rotate .lg-item.lg-prev-slide {
|
||||
-moz-transform: rotate(-360deg);
|
||||
-o-transform: rotate(-360deg);
|
||||
-ms-transform: rotate(-360deg);
|
||||
-webkit-transform: rotate(-360deg);
|
||||
transform: rotate(-360deg); }
|
||||
.lg-css3.lg-rotate .lg-item.lg-next-slide {
|
||||
-moz-transform: rotate(360deg);
|
||||
-o-transform: rotate(360deg);
|
||||
-ms-transform: rotate(360deg);
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg); }
|
||||
.lg-css3.lg-rotate .lg-item.lg-current {
|
||||
-moz-transform: rotate(0deg);
|
||||
-o-transform: rotate(0deg);
|
||||
-ms-transform: rotate(0deg);
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-rotate .lg-item.lg-prev-slide, .lg-css3.lg-rotate .lg-item.lg-next-slide, .lg-css3.lg-rotate .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-rotate-rev .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-rotate-rev .lg-item.lg-prev-slide {
|
||||
-moz-transform: rotate(360deg);
|
||||
-o-transform: rotate(360deg);
|
||||
-ms-transform: rotate(360deg);
|
||||
-webkit-transform: rotate(360deg);
|
||||
transform: rotate(360deg); }
|
||||
.lg-css3.lg-rotate-rev .lg-item.lg-next-slide {
|
||||
-moz-transform: rotate(-360deg);
|
||||
-o-transform: rotate(-360deg);
|
||||
-ms-transform: rotate(-360deg);
|
||||
-webkit-transform: rotate(-360deg);
|
||||
transform: rotate(-360deg); }
|
||||
.lg-css3.lg-rotate-rev .lg-item.lg-current {
|
||||
-moz-transform: rotate(0deg);
|
||||
-o-transform: rotate(0deg);
|
||||
-ms-transform: rotate(0deg);
|
||||
-webkit-transform: rotate(0deg);
|
||||
transform: rotate(0deg);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-rotate-rev .lg-item.lg-prev-slide, .lg-css3.lg-rotate-rev .lg-item.lg-next-slide, .lg-css3.lg-rotate-rev .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
.lg-css3.lg-tube .lg-item {
|
||||
opacity: 0; }
|
||||
.lg-css3.lg-tube .lg-item.lg-prev-slide {
|
||||
-moz-transform: scale3d(1, 0, 1) translate3d(-100%, 0, 0);
|
||||
-o-transform: scale3d(1, 0, 1) translate3d(-100%, 0, 0);
|
||||
-ms-transform: scale3d(1, 0, 1) translate3d(-100%, 0, 0);
|
||||
-webkit-transform: scale3d(1, 0, 1) translate3d(-100%, 0, 0);
|
||||
transform: scale3d(1, 0, 1) translate3d(-100%, 0, 0); }
|
||||
.lg-css3.lg-tube .lg-item.lg-next-slide {
|
||||
-moz-transform: scale3d(1, 0, 1) translate3d(100%, 0, 0);
|
||||
-o-transform: scale3d(1, 0, 1) translate3d(100%, 0, 0);
|
||||
-ms-transform: scale3d(1, 0, 1) translate3d(100%, 0, 0);
|
||||
-webkit-transform: scale3d(1, 0, 1) translate3d(100%, 0, 0);
|
||||
transform: scale3d(1, 0, 1) translate3d(100%, 0, 0); }
|
||||
.lg-css3.lg-tube .lg-item.lg-current {
|
||||
-moz-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-o-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-ms-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
-webkit-transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
transform: scale3d(1, 1, 1) translate3d(0, 0, 0);
|
||||
opacity: 1; }
|
||||
.lg-css3.lg-tube .lg-item.lg-prev-slide, .lg-css3.lg-tube .lg-item.lg-next-slide, .lg-css3.lg-tube .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s; }
|
||||
|
||||
/*# sourceMappingURL=lg-transitions.css.map */
|
||||
|
|
@ -1,818 +0,0 @@
|
|||
@font-face {
|
||||
font-family: 'lg';
|
||||
src: url("../fonts/lg.eot?n1z373");
|
||||
src: url("../fonts/lg.eot?#iefixn1z373") format("embedded-opentype"), url("../fonts/lg.woff?n1z373") format("woff"), url("../fonts/lg.ttf?n1z373") format("truetype"), url("../fonts/lg.svg?n1z373#lg") format("svg");
|
||||
font-weight: normal;
|
||||
font-style: normal;
|
||||
}
|
||||
.lg-icon {
|
||||
font-family: 'lg';
|
||||
speak: none;
|
||||
font-style: normal;
|
||||
font-weight: normal;
|
||||
font-variant: normal;
|
||||
text-transform: none;
|
||||
line-height: 1;
|
||||
/* Better Font Rendering =========== */
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.lg-actions .lg-next, .lg-actions .lg-prev {
|
||||
background-color: rgba(0, 0, 0, 0.45);
|
||||
border-radius: 2px;
|
||||
color: #999;
|
||||
cursor: pointer;
|
||||
display: block;
|
||||
font-size: 22px;
|
||||
margin-top: -10px;
|
||||
padding: 8px 10px 9px;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
z-index: 1080;
|
||||
}
|
||||
.lg-actions .lg-next.disabled, .lg-actions .lg-prev.disabled {
|
||||
pointer-events: none;
|
||||
opacity: 0.5;
|
||||
}
|
||||
.lg-actions .lg-next:hover, .lg-actions .lg-prev:hover {
|
||||
color: #FFF;
|
||||
}
|
||||
.lg-actions .lg-next {
|
||||
right: 20px;
|
||||
}
|
||||
.lg-actions .lg-next:before {
|
||||
content: "\e095";
|
||||
}
|
||||
.lg-actions .lg-prev {
|
||||
left: 20px;
|
||||
}
|
||||
.lg-actions .lg-prev:after {
|
||||
content: "\e094";
|
||||
}
|
||||
|
||||
@-webkit-keyframes lg-right-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: -30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
@-moz-keyframes lg-right-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: -30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
@-ms-keyframes lg-right-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: -30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
@keyframes lg-right-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: -30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
@-webkit-keyframes lg-left-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: 30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
@-moz-keyframes lg-left-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: 30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
@-ms-keyframes lg-left-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: 30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
@keyframes lg-left-end {
|
||||
0% {
|
||||
left: 0;
|
||||
}
|
||||
50% {
|
||||
left: 30px;
|
||||
}
|
||||
100% {
|
||||
left: 0;
|
||||
}
|
||||
}
|
||||
.lg-outer.lg-right-end .lg-object {
|
||||
-webkit-animation: lg-right-end 0.3s;
|
||||
-o-animation: lg-right-end 0.3s;
|
||||
animation: lg-right-end 0.3s;
|
||||
position: relative;
|
||||
}
|
||||
.lg-outer.lg-left-end .lg-object {
|
||||
-webkit-animation: lg-left-end 0.3s;
|
||||
-o-animation: lg-left-end 0.3s;
|
||||
animation: lg-left-end 0.3s;
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.lg-toolbar {
|
||||
z-index: 1080;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
background-color: rgba(0, 0, 0, 0.45);
|
||||
}
|
||||
.lg-toolbar .lg-icon {
|
||||
color: #999;
|
||||
cursor: pointer;
|
||||
float: right;
|
||||
font-size: 24px;
|
||||
height: 47px;
|
||||
line-height: 27px;
|
||||
padding: 10px 0;
|
||||
text-align: center;
|
||||
width: 50px;
|
||||
text-decoration: none !important;
|
||||
outline: medium none;
|
||||
}
|
||||
.lg-toolbar .lg-icon:hover {
|
||||
color: #FFF;
|
||||
}
|
||||
.lg-toolbar .lg-close:after {
|
||||
content: "\e070";
|
||||
}
|
||||
.lg-toolbar .lg-download:after {
|
||||
content: "\e0f2";
|
||||
}
|
||||
|
||||
.lg-sub-html {
|
||||
background-color: rgba(0, 0, 0, 0.45);
|
||||
bottom: 0;
|
||||
color: #EEE;
|
||||
font-size: 16px;
|
||||
left: 0;
|
||||
padding: 10px 40px;
|
||||
position: fixed;
|
||||
right: 0;
|
||||
text-align: center;
|
||||
z-index: 1080;
|
||||
}
|
||||
.lg-sub-html h4 {
|
||||
margin: 0;
|
||||
font-size: 13px;
|
||||
font-weight: bold;
|
||||
}
|
||||
.lg-sub-html p {
|
||||
font-size: 12px;
|
||||
margin: 5px 0 0;
|
||||
}
|
||||
|
||||
#lg-counter {
|
||||
color: #999;
|
||||
display: inline-block;
|
||||
font-size: 16px;
|
||||
padding-left: 20px;
|
||||
padding-top: 12px;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
.lg-toolbar, .lg-prev, .lg-next {
|
||||
opacity: 1;
|
||||
-webkit-transition: -webkit-transform 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.35s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
-moz-transition: -moz-transform 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.35s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
-o-transition: -o-transform 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.35s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
transition: transform 0.35s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.35s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
}
|
||||
|
||||
.lg-hide-items .lg-prev {
|
||||
opacity: 0;
|
||||
-webkit-transform: translate3d(-10px, 0, 0);
|
||||
transform: translate3d(-10px, 0, 0);
|
||||
}
|
||||
.lg-hide-items .lg-next {
|
||||
opacity: 0;
|
||||
-webkit-transform: translate3d(10px, 0, 0);
|
||||
transform: translate3d(10px, 0, 0);
|
||||
}
|
||||
.lg-hide-items .lg-toolbar {
|
||||
opacity: 0;
|
||||
-webkit-transform: translate3d(0, -10px, 0);
|
||||
transform: translate3d(0, -10px, 0);
|
||||
}
|
||||
|
||||
body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-object {
|
||||
-webkit-transform: scale3d(0.5, 0.5, 0.5);
|
||||
transform: scale3d(0.5, 0.5, 0.5);
|
||||
opacity: 0;
|
||||
-webkit-transition: -webkit-transform 250ms ease 0s, opacity 250ms !important;
|
||||
-moz-transition: -moz-transform 250ms ease 0s, opacity 250ms !important;
|
||||
-o-transition: -o-transform 250ms ease 0s, opacity 250ms !important;
|
||||
transition: transform 250ms ease 0s, opacity 250ms !important;
|
||||
-webkit-transform-origin: 50% 50%;
|
||||
-moz-transform-origin: 50% 50%;
|
||||
-ms-transform-origin: 50% 50%;
|
||||
transform-origin: 50% 50%;
|
||||
}
|
||||
body:not(.lg-from-hash) .lg-outer.lg-start-zoom .lg-item.lg-complete .lg-object {
|
||||
-webkit-transform: scale3d(1, 1, 1);
|
||||
transform: scale3d(1, 1, 1);
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.lg-outer .lg-thumb-outer {
|
||||
background-color: #0D0A0A;
|
||||
bottom: 0;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
z-index: 1080;
|
||||
max-height: 350px;
|
||||
-webkit-transform: translate3d(0, 100%, 0);
|
||||
transform: translate3d(0, 100%, 0);
|
||||
-webkit-transition: -webkit-transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
-moz-transition: -moz-transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
-o-transition: -o-transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
transition: transform 0.25s cubic-bezier(0, 0, 0.25, 1) 0s;
|
||||
}
|
||||
.lg-outer .lg-thumb-outer.lg-grab .lg-thumb-item {
|
||||
cursor: -webkit-grab;
|
||||
cursor: -moz-grab;
|
||||
cursor: -o-grab;
|
||||
cursor: -ms-grab;
|
||||
cursor: grab;
|
||||
}
|
||||
.lg-outer .lg-thumb-outer.lg-grabbing .lg-thumb-item {
|
||||
cursor: move;
|
||||
cursor: -webkit-grabbing;
|
||||
cursor: -moz-grabbing;
|
||||
cursor: -o-grabbing;
|
||||
cursor: -ms-grabbing;
|
||||
cursor: grabbing;
|
||||
}
|
||||
.lg-outer .lg-thumb-outer.lg-dragging .lg-thumb {
|
||||
-webkit-transition-duration: 0s !important;
|
||||
transition-duration: 0s !important;
|
||||
}
|
||||
.lg-outer.lg-thumb-open .lg-thumb-outer {
|
||||
-webkit-transform: translate3d(0, 0%, 0);
|
||||
transform: translate3d(0, 0%, 0);
|
||||
}
|
||||
.lg-outer .lg-thumb {
|
||||
padding: 10px 0;
|
||||
height: 100%;
|
||||
margin-bottom: -5px;
|
||||
}
|
||||
.lg-outer .lg-thumb-item {
|
||||
border-radius: 5px;
|
||||
cursor: pointer;
|
||||
float: left;
|
||||
overflow: hidden;
|
||||
height: 100%;
|
||||
border: 2px solid #FFF;
|
||||
border-radius: 4px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
@media (min-width: 1025px) {
|
||||
.lg-outer .lg-thumb-item {
|
||||
-webkit-transition: border-color 0.25s ease;
|
||||
-o-transition: border-color 0.25s ease;
|
||||
transition: border-color 0.25s ease;
|
||||
}
|
||||
}
|
||||
.lg-outer .lg-thumb-item.active, .lg-outer .lg-thumb-item:hover {
|
||||
border-color: #a90707;
|
||||
}
|
||||
.lg-outer .lg-thumb-item img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.lg-outer.lg-has-thumb .lg-item {
|
||||
padding-bottom: 120px;
|
||||
}
|
||||
.lg-outer.lg-can-toggle .lg-item {
|
||||
padding-bottom: 0;
|
||||
}
|
||||
.lg-outer.lg-pull-caption-up .lg-sub-html {
|
||||
-webkit-transition: bottom 0.25s ease;
|
||||
-o-transition: bottom 0.25s ease;
|
||||
transition: bottom 0.25s ease;
|
||||
}
|
||||
.lg-outer.lg-pull-caption-up.lg-thumb-open .lg-sub-html {
|
||||
bottom: 100px;
|
||||
}
|
||||
.lg-outer .lg-toogle-thumb {
|
||||
background-color: #0D0A0A;
|
||||
border-radius: 2px 2px 0 0;
|
||||
color: #999;
|
||||
cursor: pointer;
|
||||
font-size: 24px;
|
||||
height: 39px;
|
||||
line-height: 27px;
|
||||
padding: 5px 0;
|
||||
position: absolute;
|
||||
right: 20px;
|
||||
text-align: center;
|
||||
top: -39px;
|
||||
width: 50px;
|
||||
}
|
||||
.lg-outer .lg-toogle-thumb:after {
|
||||
content: "\e1ff";
|
||||
}
|
||||
.lg-outer .lg-toogle-thumb:hover {
|
||||
color: #FFF;
|
||||
}
|
||||
|
||||
.lg-outer .lg-video-cont {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
max-width: 1140px;
|
||||
max-height: 100%;
|
||||
width: 100%;
|
||||
padding: 0 5px;
|
||||
}
|
||||
.lg-outer .lg-video {
|
||||
width: 100%;
|
||||
height: 0;
|
||||
padding-bottom: 56.25%;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
}
|
||||
.lg-outer .lg-video .lg-object {
|
||||
display: inline-block;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
width: 100% !important;
|
||||
height: 100% !important;
|
||||
}
|
||||
.lg-outer .lg-video .lg-video-play {
|
||||
width: 84px;
|
||||
height: 59px;
|
||||
position: absolute;
|
||||
left: 50%;
|
||||
top: 50%;
|
||||
margin-left: -42px;
|
||||
margin-top: -30px;
|
||||
z-index: 1080;
|
||||
cursor: pointer;
|
||||
}
|
||||
.lg-outer .lg-has-vimeo .lg-video-play {
|
||||
background: url("../img/vimeo-play.png") no-repeat scroll 0 0 transparent;
|
||||
}
|
||||
.lg-outer .lg-has-vimeo:hover .lg-video-play {
|
||||
background: url("../img/vimeo-play.png") no-repeat scroll 0 -58px transparent;
|
||||
}
|
||||
.lg-outer .lg-has-html5 .lg-video-play {
|
||||
background: transparent url("../img/video-play.png") no-repeat scroll 0 0;
|
||||
height: 64px;
|
||||
margin-left: -32px;
|
||||
margin-top: -32px;
|
||||
width: 64px;
|
||||
opacity: 0.8;
|
||||
}
|
||||
.lg-outer .lg-has-html5:hover .lg-video-play {
|
||||
opacity: 1;
|
||||
}
|
||||
.lg-outer .lg-has-youtube .lg-video-play {
|
||||
background: url("../img/youtube-play.png") no-repeat scroll 0 0 transparent;
|
||||
}
|
||||
.lg-outer .lg-has-youtube:hover .lg-video-play {
|
||||
background: url("../img/youtube-play.png") no-repeat scroll 0 -60px transparent;
|
||||
}
|
||||
.lg-outer .lg-video-object {
|
||||
width: 100% !important;
|
||||
height: 100% !important;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
}
|
||||
.lg-outer .lg-has-video .lg-video-object {
|
||||
visibility: hidden;
|
||||
}
|
||||
.lg-outer .lg-has-video.lg-video-palying .lg-object, .lg-outer .lg-has-video.lg-video-palying .lg-video-play {
|
||||
display: none;
|
||||
}
|
||||
.lg-outer .lg-has-video.lg-video-palying .lg-video-object {
|
||||
visibility: visible;
|
||||
}
|
||||
|
||||
.lg-progress-bar {
|
||||
background-color: #333;
|
||||
height: 5px;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
top: 0;
|
||||
width: 100%;
|
||||
z-index: 1080;
|
||||
opacity: 0;
|
||||
-webkit-transition: opacity 0.08s ease 0s;
|
||||
-moz-transition: opacity 0.08s ease 0s;
|
||||
-o-transition: opacity 0.08s ease 0s;
|
||||
transition: opacity 0.08s ease 0s;
|
||||
}
|
||||
.lg-progress-bar .lg-progress {
|
||||
background-color: #a90707;
|
||||
height: 5px;
|
||||
width: 0;
|
||||
}
|
||||
.lg-progress-bar.lg-start .lg-progress {
|
||||
width: 100%;
|
||||
}
|
||||
.lg-show-autoplay .lg-progress-bar {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.lg-autoplay-button:after {
|
||||
content: "\e01d";
|
||||
}
|
||||
.lg-show-autoplay .lg-autoplay-button:after {
|
||||
content: "\e01a";
|
||||
}
|
||||
|
||||
.lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-img-wrap, .lg-outer.lg-css3.lg-zoom-dragging .lg-item.lg-complete.lg-zoomable .lg-image {
|
||||
-webkit-transition-duration: 0s;
|
||||
transition-duration: 0s;
|
||||
}
|
||||
.lg-outer .lg-item.lg-complete.lg-zoomable .lg-img-wrap {
|
||||
-webkit-transition: -webkit-transform 0.3s ease 0s;
|
||||
-moz-transition: -moz-transform 0.3s ease 0s;
|
||||
-o-transition: -o-transform 0.3s ease 0s;
|
||||
transition: transform 0.3s ease 0s;
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
.lg-outer .lg-item.lg-complete.lg-zoomable .lg-image {
|
||||
-webkit-transform: scale3d(1, 1, 1);
|
||||
transform: scale3d(1, 1, 1);
|
||||
-webkit-transition: -webkit-transform 0.3s ease 0s, opacity 0.15s !important;
|
||||
-moz-transition: -moz-transform 0.3s ease 0s, opacity 0.15s !important;
|
||||
-o-transition: -o-transform 0.3s ease 0s, opacity 0.15s !important;
|
||||
transition: transform 0.3s ease 0s, opacity 0.15s !important;
|
||||
-webkit-transform-origin: 0 0;
|
||||
-moz-transform-origin: 0 0;
|
||||
-ms-transform-origin: 0 0;
|
||||
transform-origin: 0 0;
|
||||
}
|
||||
|
||||
#lg-zoom-in:after {
|
||||
content: "\e311";
|
||||
}
|
||||
|
||||
#lg-zoom-out {
|
||||
opacity: 0.5;
|
||||
pointer-events: none;
|
||||
}
|
||||
#lg-zoom-out:after {
|
||||
content: "\e312";
|
||||
}
|
||||
.lg-zoomed #lg-zoom-out {
|
||||
opacity: 1;
|
||||
pointer-events: auto;
|
||||
}
|
||||
|
||||
.lg-outer .lg-pager-outer {
|
||||
bottom: 60px;
|
||||
left: 0;
|
||||
position: absolute;
|
||||
right: 0;
|
||||
text-align: center;
|
||||
z-index: 1080;
|
||||
height: 10px;
|
||||
}
|
||||
.lg-outer .lg-pager-outer.lg-pager-hover .lg-pager-cont {
|
||||
overflow: visible;
|
||||
}
|
||||
.lg-outer .lg-pager-cont {
|
||||
cursor: pointer;
|
||||
display: inline-block;
|
||||
overflow: hidden;
|
||||
position: relative;
|
||||
vertical-align: top;
|
||||
margin: 0 5px;
|
||||
}
|
||||
.lg-outer .lg-pager-cont:hover .lg-pager-thumb-cont {
|
||||
opacity: 1;
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
}
|
||||
.lg-outer .lg-pager-cont.lg-pager-active .lg-pager {
|
||||
box-shadow: 0 0 0 2px white inset;
|
||||
}
|
||||
.lg-outer .lg-pager-thumb-cont {
|
||||
background-color: #fff;
|
||||
color: #FFF;
|
||||
bottom: 100%;
|
||||
height: 83px;
|
||||
left: 0;
|
||||
margin-bottom: 20px;
|
||||
margin-left: -60px;
|
||||
opacity: 0;
|
||||
padding: 5px;
|
||||
position: absolute;
|
||||
width: 120px;
|
||||
border-radius: 3px;
|
||||
-webkit-transition: opacity 0.15s ease 0s, -webkit-transform 0.15s ease 0s;
|
||||
-moz-transition: opacity 0.15s ease 0s, -moz-transform 0.15s ease 0s;
|
||||
-o-transition: opacity 0.15s ease 0s, -o-transform 0.15s ease 0s;
|
||||
transition: opacity 0.15s ease 0s, transform 0.15s ease 0s;
|
||||
-webkit-transform: translate3d(0, 5px, 0);
|
||||
transform: translate3d(0, 5px, 0);
|
||||
}
|
||||
.lg-outer .lg-pager-thumb-cont img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.lg-outer .lg-pager {
|
||||
background-color: rgba(255, 255, 255, 0.5);
|
||||
border-radius: 50%;
|
||||
box-shadow: 0 0 0 8px rgba(255, 255, 255, 0.7) inset;
|
||||
display: block;
|
||||
height: 12px;
|
||||
-webkit-transition: box-shadow 0.3s ease 0s;
|
||||
-o-transition: box-shadow 0.3s ease 0s;
|
||||
transition: box-shadow 0.3s ease 0s;
|
||||
width: 12px;
|
||||
}
|
||||
.lg-outer .lg-pager:hover, .lg-outer .lg-pager:focus {
|
||||
box-shadow: 0 0 0 8px white inset;
|
||||
}
|
||||
.lg-outer .lg-caret {
|
||||
border-left: 10px solid transparent;
|
||||
border-right: 10px solid transparent;
|
||||
border-top: 10px dashed;
|
||||
bottom: -10px;
|
||||
display: inline-block;
|
||||
height: 0;
|
||||
left: 50%;
|
||||
margin-left: -5px;
|
||||
position: absolute;
|
||||
vertical-align: middle;
|
||||
width: 0;
|
||||
}
|
||||
|
||||
.lg-fullscreen:after {
|
||||
content: "\e20c";
|
||||
}
|
||||
.lg-fullscreen-on .lg-fullscreen:after {
|
||||
content: "\e20d";
|
||||
}
|
||||
|
||||
.group {
|
||||
*zoom: 1;
|
||||
}
|
||||
|
||||
.group:before, .group:after {
|
||||
display: table;
|
||||
content: "";
|
||||
line-height: 0;
|
||||
}
|
||||
|
||||
.group:after {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.lg-outer {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
z-index: 1050;
|
||||
opacity: 0;
|
||||
-webkit-transition: opacity 0.15s ease 0s;
|
||||
-o-transition: opacity 0.15s ease 0s;
|
||||
transition: opacity 0.15s ease 0s;
|
||||
}
|
||||
.lg-outer * {
|
||||
-webkit-box-sizing: border-box;
|
||||
-moz-box-sizing: border-box;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
.lg-outer.lg-visible {
|
||||
opacity: 1;
|
||||
}
|
||||
.lg-outer.lg-css3 .lg-item.lg-prev-slide, .lg-outer.lg-css3 .lg-item.lg-next-slide, .lg-outer.lg-css3 .lg-item.lg-current {
|
||||
-webkit-transition-duration: inherit !important;
|
||||
transition-duration: inherit !important;
|
||||
-webkit-transition-timing-function: inherit !important;
|
||||
transition-timing-function: inherit !important;
|
||||
}
|
||||
.lg-outer.lg-css3.lg-dragging .lg-item.lg-prev-slide, .lg-outer.lg-css3.lg-dragging .lg-item.lg-next-slide, .lg-outer.lg-css3.lg-dragging .lg-item.lg-current {
|
||||
-webkit-transition-duration: 0s !important;
|
||||
transition-duration: 0s !important;
|
||||
opacity: 1;
|
||||
}
|
||||
.lg-outer.lg-grab img.lg-object {
|
||||
cursor: -webkit-grab;
|
||||
cursor: -moz-grab;
|
||||
cursor: -o-grab;
|
||||
cursor: -ms-grab;
|
||||
cursor: grab;
|
||||
}
|
||||
.lg-outer.lg-grabbing img.lg-object {
|
||||
cursor: move;
|
||||
cursor: -webkit-grabbing;
|
||||
cursor: -moz-grabbing;
|
||||
cursor: -o-grabbing;
|
||||
cursor: -ms-grabbing;
|
||||
cursor: grabbing;
|
||||
}
|
||||
.lg-outer .lg {
|
||||
height: 100%;
|
||||
width: 100%;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
}
|
||||
.lg-outer .lg-inner {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 0;
|
||||
white-space: nowrap;
|
||||
}
|
||||
.lg-outer .lg-item {
|
||||
background: url(../img/loading.gif) no-repeat scroll center center transparent;
|
||||
display: none !important;
|
||||
}
|
||||
.lg-outer.lg-css3 .lg-prev-slide, .lg-outer.lg-css3 .lg-current, .lg-outer.lg-css3 .lg-next-slide {
|
||||
display: inline-block !important;
|
||||
}
|
||||
.lg-outer.lg-css .lg-current {
|
||||
display: inline-block !important;
|
||||
}
|
||||
.lg-outer .lg-item, .lg-outer .lg-img-wrap {
|
||||
display: inline-block;
|
||||
text-align: center;
|
||||
position: absolute;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
.lg-outer .lg-item:before, .lg-outer .lg-img-wrap:before {
|
||||
content: "";
|
||||
display: inline-block;
|
||||
height: 50%;
|
||||
width: 1px;
|
||||
margin-right: -1px;
|
||||
}
|
||||
.lg-outer .lg-img-wrap {
|
||||
top: 0;
|
||||
bottom: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
padding: 0 5px;
|
||||
}
|
||||
.lg-outer .lg-item.lg-complete {
|
||||
background-image: none;
|
||||
}
|
||||
.lg-outer .lg-item.lg-current {
|
||||
z-index: 1060;
|
||||
}
|
||||
.lg-outer .lg-image {
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
max-width: 100%;
|
||||
max-height: 100%;
|
||||
width: auto !important;
|
||||
height: auto !important;
|
||||
}
|
||||
.lg-outer.lg-show-after-load .lg-item .lg-object, .lg-outer.lg-show-after-load .lg-item .lg-video-play {
|
||||
opacity: 0;
|
||||
-webkit-transition: opacity 0.15s ease 0s;
|
||||
-o-transition: opacity 0.15s ease 0s;
|
||||
transition: opacity 0.15s ease 0s;
|
||||
}
|
||||
.lg-outer.lg-show-after-load .lg-item.lg-complete .lg-object, .lg-outer.lg-show-after-load .lg-item.lg-complete .lg-video-play {
|
||||
opacity: 1;
|
||||
}
|
||||
.lg-outer .lg-empty-html {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.lg-backdrop {
|
||||
position: fixed;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
z-index: 1040;
|
||||
background-color: #000;
|
||||
opacity: 0;
|
||||
-webkit-transition: opacity 0.15s ease 0s;
|
||||
-o-transition: opacity 0.15s ease 0s;
|
||||
transition: opacity 0.15s ease 0s;
|
||||
}
|
||||
.lg-backdrop.in {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.lg-css3.lg-no-trans .lg-prev-slide, .lg-css3.lg-no-trans .lg-next-slide, .lg-css3.lg-no-trans .lg-current {
|
||||
-webkit-transition: none 0s ease 0s !important;
|
||||
-moz-transition: none 0s ease 0s !important;
|
||||
-o-transition: none 0s ease 0s !important;
|
||||
transition: none 0s ease 0s !important;
|
||||
}
|
||||
.lg-css3.lg-use-css3 .lg-item {
|
||||
will-change: transform, opacity;
|
||||
}
|
||||
.lg-css3.lg-use-left .lg-item {
|
||||
will-change: left, opacity;
|
||||
}
|
||||
.lg-css3.lg-fade .lg-item {
|
||||
opacity: 0;
|
||||
}
|
||||
.lg-css3.lg-fade .lg-item.lg-current {
|
||||
opacity: 1;
|
||||
}
|
||||
.lg-css3.lg-fade .lg-item.lg-prev-slide, .lg-css3.lg-fade .lg-item.lg-next-slide, .lg-css3.lg-fade .lg-item.lg-current {
|
||||
-webkit-transition: opacity 0.1s ease 0s;
|
||||
-moz-transition: opacity 0.1s ease 0s;
|
||||
-o-transition: opacity 0.1s ease 0s;
|
||||
transition: opacity 0.1s ease 0s;
|
||||
}
|
||||
.lg-css3.lg-slide.lg-use-css3 .lg-item {
|
||||
opacity: 0;
|
||||
}
|
||||
.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide {
|
||||
-webkit-transform: translate3d(-100%, 0, 0);
|
||||
transform: translate3d(-100%, 0, 0);
|
||||
}
|
||||
.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide {
|
||||
-webkit-transform: translate3d(100%, 0, 0);
|
||||
transform: translate3d(100%, 0, 0);
|
||||
}
|
||||
.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current {
|
||||
-webkit-transform: translate3d(0, 0, 0);
|
||||
transform: translate3d(0, 0, 0);
|
||||
opacity: 1;
|
||||
}
|
||||
.lg-css3.lg-slide.lg-use-css3 .lg-item.lg-prev-slide, .lg-css3.lg-slide.lg-use-css3 .lg-item.lg-next-slide, .lg-css3.lg-slide.lg-use-css3 .lg-item.lg-current {
|
||||
-webkit-transition: -webkit-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: -moz-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: -o-transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: transform 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
}
|
||||
.lg-css3.lg-slide.lg-use-left .lg-item {
|
||||
opacity: 0;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
}
|
||||
.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide {
|
||||
left: -100%;
|
||||
}
|
||||
.lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide {
|
||||
left: 100%;
|
||||
}
|
||||
.lg-css3.lg-slide.lg-use-left .lg-item.lg-current {
|
||||
left: 0;
|
||||
opacity: 1;
|
||||
}
|
||||
.lg-css3.lg-slide.lg-use-left .lg-item.lg-prev-slide, .lg-css3.lg-slide.lg-use-left .lg-item.lg-next-slide, .lg-css3.lg-slide.lg-use-left .lg-item.lg-current {
|
||||
-webkit-transition: left 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-moz-transition: left 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
-o-transition: left 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
transition: left 1s cubic-bezier(0, 0, 0.25, 1) 0s, opacity 0.1s ease 0s;
|
||||
}
|
||||
|
||||
/*# sourceMappingURL=lightgallery.css.map */
|
||||
|
|
@ -1,41 +0,0 @@
|
|||
<?xml version="1.0" standalone="no"?>
|
||||
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" >
|
||||
<svg xmlns="http://www.w3.org/2000/svg">
|
||||
<metadata>
|
||||
<json>
|
||||
<![CDATA[
|
||||
{
|
||||
"fontFamily": "lg",
|
||||
"majorVersion": 1,
|
||||
"minorVersion": 0,
|
||||
"fontURL": "https://github.com/sachinchoolur/lightGallery",
|
||||
"copyright": "sachin",
|
||||
"license": "MLT",
|
||||
"licenseURL": "http://opensource.org/licenses/MIT",
|
||||
"version": "Version 1.0",
|
||||
"fontId": "lg",
|
||||
"psName": "lg",
|
||||
"subFamily": "Regular",
|
||||
"fullName": "lg",
|
||||
"description": "Font generated by IcoMoon."
|
||||
}
|
||||
]]>
|
||||
</json>
|
||||
</metadata>
|
||||
<defs>
|
||||
<font id="lg" horiz-adv-x="1024">
|
||||
<font-face units-per-em="1024" ascent="960" descent="-64" />
|
||||
<missing-glyph horiz-adv-x="1024" />
|
||||
<glyph unicode=" " horiz-adv-x="512" d="" />
|
||||
<glyph unicode="" glyph-name="pause_circle_outline" data-tags="pause_circle_outline" d="M554 256.667v340h86v-340h-86zM512 84.667q140 0 241 101t101 241-101 241-241 101-241-101-101-241 101-241 241-101zM512 852.667q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125zM384 256.667v340h86v-340h-86z" />
|
||||
<glyph unicode="" glyph-name="play_circle_outline" data-tags="play_circle_outline" d="M512 84.667q140 0 241 101t101 241-101 241-241 101-241-101-101-241 101-241 241-101zM512 852.667q176 0 301-125t125-301-125-301-301-125-301 125-125 301 125 301 301 125zM426 234.667v384l256-192z" />
|
||||
<glyph unicode="" glyph-name="clear" data-tags="clear" d="M810 664.667l-238-238 238-238-60-60-238 238-238-238-60 60 238 238-238 238 60 60 238-238 238 238z" />
|
||||
<glyph unicode="" glyph-name="arrow-left" data-tags="arrow-left" d="M426.667 768q17.667 0 30.167-12.5t12.5-30.167q0-18-12.667-30.333l-225.667-225.667h665q17.667 0 30.167-12.5t12.5-30.167-12.5-30.167-30.167-12.5h-665l225.667-225.667q12.667-12.333 12.667-30.333 0-17.667-12.5-30.167t-30.167-12.5q-18 0-30.333 12.333l-298.667 298.667q-12.333 13-12.333 30.333t12.333 30.333l298.667 298.667q12.667 12.333 30.333 12.333z" />
|
||||
<glyph unicode="" glyph-name="arrow-right" data-tags="arrow-right" d="M597.333 768q18 0 30.333-12.333l298.667-298.667q12.333-12.333 12.333-30.333t-12.333-30.333l-298.667-298.667q-12.333-12.333-30.333-12.333-18.333 0-30.5 12.167t-12.167 30.5q0 18 12.333 30.333l226 225.667h-665q-17.667 0-30.167 12.5t-12.5 30.167 12.5 30.167 30.167 12.5h665l-226 225.667q-12.333 12.333-12.333 30.333 0 18.333 12.167 30.5t30.5 12.167z" />
|
||||
<glyph unicode="" glyph-name="vertical_align_bottom" data-tags="vertical_align_bottom" d="M170 128.667h684v-86h-684v86zM682 384.667l-170-172-170 172h128v426h84v-426h128z" />
|
||||
<glyph unicode="" glyph-name="apps" data-tags="apps" d="M682 84.667v172h172v-172h-172zM682 340.667v172h172v-172h-172zM426 596.667v172h172v-172h-172zM682 768.667h172v-172h-172v172zM426 340.667v172h172v-172h-172zM170 340.667v172h172v-172h-172zM170 84.667v172h172v-172h-172zM426 84.667v172h172v-172h-172zM170 596.667v172h172v-172h-172z" />
|
||||
<glyph unicode="" glyph-name="fullscreen" data-tags="fullscreen" d="M598 724.667h212v-212h-84v128h-128v84zM726 212.667v128h84v-212h-212v84h128zM214 512.667v212h212v-84h-128v-128h-84zM298 340.667v-128h128v-84h-212v212h84z" />
|
||||
<glyph unicode="" glyph-name="fullscreen_exit" data-tags="fullscreen_exit" d="M682 596.667h128v-84h-212v212h84v-128zM598 128.667v212h212v-84h-128v-128h-84zM342 596.667v128h84v-212h-212v84h128zM214 256.667v84h212v-212h-84v128h-128z" />
|
||||
<glyph unicode="" glyph-name="zoom_in" data-tags="zoom_in" d="M512 512.667h-86v-86h-42v86h-86v42h86v86h42v-86h86v-42zM406 340.667q80 0 136 56t56 136-56 136-136 56-136-56-56-136 56-136 136-56zM662 340.667l212-212-64-64-212 212v34l-12 12q-76-66-180-66-116 0-197 80t-81 196 81 197 197 81 196-81 80-197q0-104-66-180l12-12h34z" />
|
||||
<glyph unicode="" glyph-name="zoom_out" data-tags="zoom_out" d="M298 554.667h214v-42h-214v42zM406 340.667q80 0 136 56t56 136-56 136-136 56-136-56-56-136 56-136 136-56zM662 340.667l212-212-64-64-212 212v34l-12 12q-76-66-180-66-116 0-197 80t-81 196 81 197 197 81 196-81 80-197q0-104-66-180l12-12h34z" />
|
||||
</font></defs></svg>
|
||||
|
Before Width: | Height: | Size: 4 KiB |
|
Before Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 5.3 KiB |
|
Before Width: | Height: | Size: 5.1 KiB |
|
|
@ -1,188 +0,0 @@
|
|||
/**
|
||||
* Autoplay Plugin
|
||||
* @version 1.2.0
|
||||
* @author Sachin N - @sachinchoolur
|
||||
* @license MIT License (MIT)
|
||||
*/
|
||||
|
||||
(function($, window, document, undefined) {
|
||||
|
||||
'use strict';
|
||||
|
||||
var defaults = {
|
||||
autoplay: false,
|
||||
pause: 5000,
|
||||
progressBar: true,
|
||||
fourceAutoplay: false,
|
||||
autoplayControls: true,
|
||||
appendAutoplayControlsTo: '.lg-toolbar'
|
||||
};
|
||||
|
||||
/**
|
||||
* Creates the autoplay plugin.
|
||||
* @param {object} element - lightGallery element
|
||||
*/
|
||||
var Autoplay = function(element) {
|
||||
|
||||
this.core = $(element).data('lightGallery');
|
||||
|
||||
this.$el = $(element);
|
||||
|
||||
// Exicute only if items are above 1
|
||||
if (this.core.$items.length < 2) {
|
||||
return false;
|
||||
}
|
||||
|
||||
this.core.s = $.extend({}, defaults, this.core.s);
|
||||
this.interval = false;
|
||||
|
||||
// Identify if slide happened from autoplay
|
||||
this.fromAuto = true;
|
||||
|
||||
// Identify if autoplay canceled from touch/drag
|
||||
this.canceledOnTouch = false;
|
||||
|
||||
// save fourceautoplay value
|
||||
this.fourceAutoplayTemp = this.core.s.fourceAutoplay;
|
||||
|
||||
// do not allow progress bar if browser does not support css3 transitions
|
||||
if (!this.core.doCss()) {
|
||||
this.core.s.progressBar = false;
|
||||
}
|
||||
|
||||
this.init();
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
Autoplay.prototype.init = function() {
|
||||
var _this = this;
|
||||
|
||||
// append autoplay controls
|
||||
if (_this.core.s.autoplayControls) {
|
||||
_this.controls();
|
||||
}
|
||||
|
||||
// Create progress bar
|
||||
if (_this.core.s.progressBar) {
|
||||
_this.core.$outer.find('.lg').append('<div class="lg-progress-bar"><div class="lg-progress"></div></div>');
|
||||
}
|
||||
|
||||
// set progress
|
||||
_this.progress();
|
||||
|
||||
// Start autoplay
|
||||
if (_this.core.s.autoplay) {
|
||||
_this.startlAuto();
|
||||
}
|
||||
|
||||
// cancel interval on touchstart and dragstart
|
||||
_this.$el.on('onDragstart.lg.tm touchstart.lg.tm', function() {
|
||||
if (_this.interval) {
|
||||
_this.cancelAuto();
|
||||
_this.canceledOnTouch = true;
|
||||
}
|
||||
});
|
||||
|
||||
// restore autoplay if autoplay canceled from touchstart / dragstart
|
||||
_this.$el.on('onDragend.lg.tm touchend.lg.tm onSlideClick.lg.tm', function() {
|
||||
if (!_this.interval && _this.canceledOnTouch) {
|
||||
_this.startlAuto();
|
||||
_this.canceledOnTouch = false;
|
||||
}
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
Autoplay.prototype.progress = function() {
|
||||
|
||||
var _this = this;
|
||||
var _$progressBar;
|
||||
var _$progress;
|
||||
|
||||
_this.$el.on('onBeforeSlide.lg.tm', function() {
|
||||
|
||||
// start progress bar animation
|
||||
if (_this.core.s.progressBar && _this.fromAuto) {
|
||||
_$progressBar = _this.core.$outer.find('.lg-progress-bar');
|
||||
_$progress = _this.core.$outer.find('.lg-progress');
|
||||
if (_this.interval) {
|
||||
_$progress.removeAttr('style');
|
||||
_$progressBar.removeClass('lg-start');
|
||||
setTimeout(function() {
|
||||
_$progress.css('transition', 'width ' + (_this.core.s.speed + _this.core.s.pause) + 'ms ease 0s');
|
||||
_$progressBar.addClass('lg-start');
|
||||
}, 20);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove setinterval if slide is trigered manualy and fourceautoplay is false
|
||||
if (!_this.fromAuto && !_this.core.s.fourceAutoplay) {
|
||||
_this.cancelAuto();
|
||||
}
|
||||
|
||||
_this.fromAuto = false;
|
||||
|
||||
});
|
||||
};
|
||||
|
||||
// Manage autoplay via play/stop buttons
|
||||
Autoplay.prototype.controls = function() {
|
||||
var _this = this;
|
||||
var _html = '<span class="lg-autoplay-button lg-icon"></span>';
|
||||
|
||||
// Append autoplay controls
|
||||
$(this.core.s.appendAutoplayControlsTo).append(_html);
|
||||
|
||||
_this.core.$outer.find('.lg-autoplay-button').on('click.lg', function() {
|
||||
if ($(_this.core.$outer).hasClass('lg-show-autoplay')) {
|
||||
_this.cancelAuto();
|
||||
_this.core.s.fourceAutoplay = false;
|
||||
} else {
|
||||
if (!_this.interval) {
|
||||
_this.startlAuto();
|
||||
_this.core.s.fourceAutoplay = _this.fourceAutoplayTemp;
|
||||
}
|
||||
}
|
||||
});
|
||||
};
|
||||
|
||||
// Autostart gallery
|
||||
Autoplay.prototype.startlAuto = function() {
|
||||
var _this = this;
|
||||
|
||||
_this.core.$outer.find('.lg-progress').css('transition', 'width ' + (_this.core.s.speed + _this.core.s.pause) + 'ms ease 0s');
|
||||
_this.core.$outer.addClass('lg-show-autoplay');
|
||||
_this.core.$outer.find('.lg-progress-bar').addClass('lg-start');
|
||||
|
||||
_this.interval = setInterval(function() {
|
||||
if (_this.core.index + 1 < _this.core.$items.length) {
|
||||
_this.core.index = _this.core.index;
|
||||
} else {
|
||||
_this.core.index = -1;
|
||||
}
|
||||
|
||||
_this.core.index++;
|
||||
_this.fromAuto = true;
|
||||
_this.core.slide(_this.core.index, false, false);
|
||||
}, _this.core.s.speed + _this.core.s.pause);
|
||||
};
|
||||
|
||||
// cancel Autostart
|
||||
Autoplay.prototype.cancelAuto = function() {
|
||||
clearInterval(this.interval);
|
||||
this.interval = false;
|
||||
this.core.$outer.find('.lg-progress').removeAttr('style');
|
||||
this.core.$outer.removeClass('lg-show-autoplay');
|
||||
this.core.$outer.find('.lg-progress-bar').removeClass('lg-start');
|
||||
};
|
||||
|
||||
Autoplay.prototype.destroy = function() {
|
||||
|
||||
this.cancelAuto();
|
||||
this.core.$outer.find('.lg-progress-bar').remove();
|
||||
};
|
||||
|
||||
$.fn.lightGallery.modules.autoplay = Autoplay;
|
||||
|
||||
})(jQuery, window, document);
|
||||
|
|
@ -1,94 +0,0 @@
|
|||
(function($, window, document, undefined) {
|
||||
|
||||
'use strict';
|
||||
|
||||
var defaults = {
|
||||
fullScreen: true
|
||||
};
|
||||
|
||||
var Fullscreen = function(element) {
|
||||
|
||||
// get lightGallery core plugin data
|
||||
this.core = $(element).data('lightGallery');
|
||||
|
||||
this.$el = $(element);
|
||||
|
||||
// extend module defalut settings with lightGallery core settings
|
||||
this.core.s = $.extend({}, defaults, this.core.s);
|
||||
|
||||
this.init();
|
||||
|
||||
return this;
|
||||
};
|
||||
|
||||
Fullscreen.prototype.init = function() {
|
||||
var fullScreen = '';
|
||||
if (this.core.s.fullScreen) {
|
||||
|
||||
// check for fullscreen browser support
|
||||
if (!document.fullscreenEnabled && !document.webkitFullscreenEnabled &&
|
||||
!document.mozFullScreenEnabled && !document.msFullscreenEnabled) {
|
||||
return;
|
||||
} else {
|
||||
fullScreen = '<span class="lg-fullscreen lg-icon"></span>';
|
||||
this.core.$outer.find('.lg-toolbar').append(fullScreen);
|
||||
this.fullScreen();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
Fullscreen.prototype.reuestFullscreen = function() {
|
||||
var el = document.documentElement;
|
||||
if (el.requestFullscreen) {
|
||||
el.requestFullscreen();
|
||||
} else if (el.msRequestFullscreen) {
|
||||
el.msRequestFullscreen();
|
||||
} else if (el.mozRequestFullScreen) {
|
||||
el.mozRequestFullScreen();
|
||||
} else if (el.webkitRequestFullscreen) {
|
||||
el.webkitRequestFullscreen();
|
||||
}
|
||||
};
|
||||
|
||||
Fullscreen.prototype.exitFullscreen = function() {
|
||||
if (document.exitFullscreen) {
|
||||
document.exitFullscreen();
|
||||
} else if (document.msExitFullscreen) {
|
||||
document.msExitFullscreen();
|
||||
} else if (document.mozCancelFullScreen) {
|
||||
document.mozCancelFullScreen();
|
||||
} else if (document.webkitExitFullscreen) {
|
||||
document.webkitExitFullscreen();
|
||||
}
|
||||
};
|
||||
|
||||
// https://developer.mozilla.org/en-US/docs/Web/Guide/API/DOM/Using_full_screen_mode
|
||||
Fullscreen.prototype.fullScreen = function() {
|
||||
var _this = this;
|
||||
|
||||
$(document).on('fullscreenchange.lg webkitfullscreenchange.lg mozfullscreenchange.lg MSFullscreenChange.lg', function() {
|
||||
_this.core.$outer.toggleClass('lg-fullscreen-on');
|
||||
});
|
||||
|
||||
this.core.$outer.find('.lg-fullscreen').on('click.lg', function() {
|
||||
if (!document.fullscreenElement &&
|
||||
!document.mozFullScreenElement && !document.webkitFullscreenElement && !document.msFullscreenElement) {
|
||||
_this.reuestFullscreen();
|
||||
} else {
|
||||
_this.exitFullscreen();
|
||||
}
|
||||
});
|
||||
|
||||
};
|
||||
|
||||
Fullscreen.prototype.destroy = function() {
|
||||
|
||||
// exit from fullscreen if activated
|
||||
this.exitFullscreen();
|
||||
|
||||
$(document).off('fullscreenchange.lg webkitfullscreenchange.lg mozfullscreenchange.lg MSFullscreenChange.lg');
|
||||
};
|
||||
|
||||
$.fn.lightGallery.modules.fullscreen = Fullscreen;
|
||||
|
||||
})(jQuery, window, document);
|
||||