diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index fabc816..0000000 --- a/.eslintrc +++ /dev/null @@ -1,41 +0,0 @@ -{ - "env": { - "browser": true, - "node": true, - "es6": true - }, - "parserOptions": { - "sourceType": "module", - "ecmaFeatures": { - "jsx": true, - "experimentalObjectRestSpread": true - }, - }, - "plugins": [ - "react" - ], - "rules": { - "comma-dangle": [0], - "no-dupe-args": [2], - "no-dupe-keys": [2], - "no-duplicate-case": [2], - "no-extra-semi": [2], - "no-irregular-whitespace": [0], - "no-undef": [2], - "valid-typeof": [2], - "curly": [0], - "dot-notation": [1], - "eqeqeq": [2], - "semi": [2, "always"], - "quotes": [1, "single"], - "no-unused-vars": [1], - "array-bracket-spacing": [2, "never"], - "brace-style": [2], - "comma-spacing": [2], - "comma-style": [2], - "one-var": [2, "never"], - "no-shadow": 0, - "arrow-body-style": 0, - "react/jsx-max-props-per-line": [2, {"maximum": 5}] - } -} diff --git a/api/routes/index.json b/api/routes/index.json index 39456cc..b6f10f0 100644 --- a/api/routes/index.json +++ b/api/routes/index.json @@ -22,7 +22,7 @@ "options": { "modules": [ { - "type": "commercial-dfp-ads", + "type": "dns-banner", "options": { "prop1": "prop1value", "prop2": "prop2value" diff --git a/config.js b/config.js index db2fc56..96d5f59 100644 --- a/config.js +++ b/config.js @@ -2,6 +2,7 @@ const config = { port: process.env.PORT || 3000, hostname: process.env.HOSTNAME || 'localhost', apiUrl: process.env.API_URL || 'http://localhost:3000/api', + staticUrl: process.env.STATIC_URL || 'http://localhost:3000/', nodeEnv: process.env.NODE_ENV || 'development', }; diff --git a/package.json b/package.json index 43a424e..32c137a 100644 --- a/package.json +++ b/package.json @@ -4,7 +4,7 @@ "description": "SOL frontpage frontend application", "main": "app.js", "engines": { - "node": "7.7.4" + "node": "7.9.0" }, "scripts": { "test": "npm run test:server && npm run test:client", @@ -29,26 +29,27 @@ }, "homepage": "https://github.com/soldotno/aurora-demo-frontend", "dependencies": { - "aurora-core": "2.0.2", + "aurora-core": "2.2.0", "aurora-sass-loader": "github:soldotno/aurora-sass-loader#master", "autoprefixer": "6.7.7", - "axios": "0.16.0", - "babel": "6.0.15", - "babel-cli": "6.24.0", - "babel-core": "6.24.0", - "babel-eslint": "7.2.1", - "babel-loader": "6.4.1", + "axios": "0.16.1", + "babel": "6.23.0", + "babel-cli": "6.24.1", + "babel-core": "6.24.1", + "babel-eslint": "7.2.3", + "babel-loader": "7.0.0", "babel-polyfill": "6.23.0", - "babel-preset-es2015": "6.24.0", - "babel-preset-react": "6.23.0", - "babel-preset-stage-0": "6.22.0", + "babel-preset-es2015": "6.24.1", + "babel-preset-react": "6.24.1", + "babel-preset-stage-0": "6.24.1", "babel-runtime": "6.23.0", "bluebird": "3.5.0", "classnames": "2.2.5", "compression": "1.6.2", "cookie-parser": "1.4.3", + "cors": "2.8.3", "css-loader": "0.28.0", - "debug": "2.6.3", + "debug": "2.6.4", "es5-shim": "4.5.9", "express": "4.15.2", "express-useragent": "1.0.7", @@ -67,12 +68,13 @@ "node-sass": "4.5.2", "postcss-loader": "1.3.3", "progress-bar-webpack-plugin": "1.9.3", + "prop-types": "15.5.8", "qs": "6.4.0", - "query-string": "4.2.2", - "react": "15.4.2", - "react-dom": "15.4.2", + "query-string": "4.3.4", + "react": "15.5.4", + "react-dom": "15.5.4", "react-hot-loader": "1.3.1", - "react-redux": "5.0.3", + "react-redux": "5.0.4", "redis": "2.7.1", "redux": "3.6.0", "redux-logger": "3.0.1", @@ -81,11 +83,12 @@ "serve-favicon": "2.4.2", "stringify-clone": "2.0.0", "style-loader": "0.16.1", - "url-join": "1.1.0", + "styled-components": "2.0.0-15", + "url-join": "2.0.1", "url-parse": "1.1.8", "uuid": "3.0.1", "uuid-validate": "0.0.2", - "webpack": "2.3.3" + "webpack": "2.4.1" }, "devDependencies": { "eslint": "3.19.0", @@ -103,8 +106,8 @@ "karma-mocha-reporter": "2.2.3", "karma-sourcemap-loader": "0.3.7", "karma-webpack": "2.0.3", - "mocha": "3.2.0", + "mocha": "3.3.0", "mockery": "2.0.0", - "webpack-dev-server": "2.4.2" + "webpack-dev-server": "2.4.4" } } diff --git a/public/img/dns-logo.png b/public/img/dns-logo.png new file mode 100644 index 0000000..946e714 Binary files /dev/null and b/public/img/dns-logo.png differ diff --git a/public/img/some-pigs-are-more-equal.jpg b/public/img/some-pigs-are-more-equal.jpg new file mode 100644 index 0000000..31c9894 Binary files /dev/null and b/public/img/some-pigs-are-more-equal.jpg differ diff --git a/public/static/index.html b/public/static/index.html index 72cf307..f109c9d 100644 --- a/public/static/index.html +++ b/public/static/index.html @@ -4,6 +4,8 @@ Aurora Frontend Demo (development) + +
diff --git a/src/api-handler.js b/src/api-handler.js index 5f377c9..2f34483 100644 --- a/src/api-handler.js +++ b/src/api-handler.js @@ -1,6 +1,7 @@ const express = require('express'); const fs = require('fs'); const path = require('path'); +const cors = require('cors'); const handleApi = function(req, res, next) { // eslint-disable-line console.log('api route handler'); @@ -39,6 +40,7 @@ const handleApi = function(req, res, next) { // eslint-disable-line }; const apiHandler = express(); +apiHandler.use(cors()); apiHandler.get('/routes/(:page)?', handleApi); module.exports = apiHandler; diff --git a/src/client-bootstrap.js b/src/client-bootstrap.js index a0db276..a135d17 100644 --- a/src/client-bootstrap.js +++ b/src/client-bootstrap.js @@ -20,7 +20,7 @@ if (__DEVELOPMENT__) { * harmless and non-applicative (but annyoing) warnings.. */ Promise.config({ - warnings: false + warnings: false, }); /** diff --git a/src/modules/DoesNotExist/DoesNotExist.jsx b/src/modules/DoesNotExist/DoesNotExist.jsx index 71ef045..4729ba6 100644 --- a/src/modules/DoesNotExist/DoesNotExist.jsx +++ b/src/modules/DoesNotExist/DoesNotExist.jsx @@ -1,15 +1,6 @@ -/** - * Dependencies - */ -const React = require('react'); - /** * Default empty component for graceful failing */ -const DoesNotExist = React.createClass({ - render() { - return null; - } -}); +const DoesNotExist = () => null; module.exports = DoesNotExist; diff --git a/src/modules/Grisefest2017App/Grisefest2017App.jsx b/src/modules/Grisefest2017App/Grisefest2017App.jsx new file mode 100644 index 0000000..0331f24 --- /dev/null +++ b/src/modules/Grisefest2017App/Grisefest2017App.jsx @@ -0,0 +1,127 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import styled, { injectGlobal } from 'styled-components'; +import renderChildren from 'aurora-core/dist/utils/render-children'; + +import DnsBanner from '../../shared-components/DnsBanner'; +import GreatBigHero from '../../shared-components/GreatBigHero'; +import Program from '../../shared-components/Program'; +import Historie from '../../shared-components/Historie'; +import Annonsere from '../../shared-components/Annonsere'; +import KjoepBillett from '../../shared-components/KjoepBillett'; +import DetTapteSverdet from '../../shared-components/DetTapteSverdet'; +import BliFrivillig from '../../shared-components/BliFrivillig'; + +injectGlobal` + @import url('https://fonts.googleapis.com/css?family=Roboto'); + @import url('https://fonts.googleapis.com/css?family=Julius+Sans+One'); + + html, body, div, span, applet, object, iframe, + h1, h2, h3, h4, h5, h6, p, blockquote, pre, + a, abbr, acronym, address, big, cite, code, + del, dfn, em, img, ins, kbd, q, s, samp, + small, strike, strong, sub, sup, tt, var, + b, u, i, center, + dl, dt, dd, ol, ul, li, + fieldset, form, label, legend, + table, caption, tbody, tfoot, thead, tr, th, td, + article, aside, canvas, details, embed, + figure, figcaption, footer, header, hgroup, + menu, nav, output, ruby, section, summary, + time, mark, audio, video { + margin: 0; + padding: 0; + border: 0; + font-size: 100%; + font: inherit; + vertical-align: baseline; + box-sizing: border-box; + } + /* HTML5 display-role reset for older browsers */ + article, aside, details, figcaption, figure, + footer, header, hgroup, menu, nav, section { + display: block; + } + body { + line-height: 1; + } + ol, ul { + list-style: none; + } + blockquote, q { + quotes: none; + } + blockquote:before, blockquote:after, + q:before, q:after { + content: ''; + content: none; + } + table { + border-collapse: collapse; + border-spacing: 0; + } + + html { + font-size: 62.5%; + } + body { + font-size: 4vw; + font-family: Roboto, Helvetica, Arial, sans-serif; + + @media (min-width: 750px) { + font-size: 2vw; + } + @media (min-width: 1280px) { + font-size: 2.4rem; + } + } + + p, + h3, + blockquote, + cite { + line-height: 1.5; + margin: 0 auto 1em; + padding: 0 4vw; + + @media (min-width: 750px) { + width: 66vw; + width: 90vw; + max-width: 100.0rem; + } + } + + em { + font-style: italic; + } +`; + +class Grisefest2017App extends React.Component { + static propTypes = { + modules: PropTypes.array, // eslint-disable-line react/forbid-prop-types + } + + static defaultProps = { + modules: [], + } + + render() { + const { modules } = this.props; + + return ( +
+ + + + + + + + + {renderChildren(modules)} +
+ ); + } +} + +module.exports = Grisefest2017App; diff --git a/src/modules/get-module.js b/src/modules/get-module.js index bece3f7..ddc3cbe 100644 --- a/src/modules/get-module.js +++ b/src/modules/get-module.js @@ -17,44 +17,9 @@ if (typeof require.ensure !== 'function') { * The map of modules available to resolve to */ const moduleMap = { - 'demo-app': (callback) => { + 'grisefest-app': (callback) => { require.ensure([], (require) => { - callback(null, require('./DemoAppModule/DemoAppModule.jsx')); - }); - }, - 'demo-hom': (callback) => { - require.ensure([], (require) => { - callback(null, require('./DemoHigherOrderModule/DemoHigherOrderModule.jsx')); - }); - }, - 'demo-module': (callback) => { - require.ensure([], (require) => { - callback(null, require('./DemoModule/DemoModule.jsx')); - }); - }, - 'demo-module-with-data': (callback) => { - require.ensure([], (require) => { - callback(null, require('./DemoModuleWithData/DemoModuleWithData.jsx')); - }); - }, - 'demo-module-with-geolocation': (callback) => { - require.ensure([], (require) => { - callback(null, require('./DemoModuleWithGeolocation/DemoModuleWithGeolocation.jsx')); - }); - }, - 'demo-module-with-personalization': (callback) => { - require.ensure([], (require) => { - callback(null, require('./DemoModuleWithPersonalization/DemoModuleWithPersonalization.jsx')); - }); - }, - 'demo-module-with-randomization': (callback) => { - require.ensure([], (require) => { - callback(null, require('./DemoModuleWithRandomization/DemoModuleWithRandomization.jsx')); - }); - }, - 'demo-module-with-redux': (callback) => { - require.ensure([], (require) => { - callback(null, require('./DemoModuleWithRedux/DemoModuleWithRedux.jsx')); + callback(null, require('./Grisefest2017App/Grisefest2017App.jsx')); }); }, 'does-not-exist': (callback) => { @@ -77,6 +42,7 @@ module.exports = (type) => { */ return new Promise((resolve, reject) => { setImmediate(() => { + console.log('MODULE: ', type); if (!moduleMap[type]) { debug(`You are trying to render a module with type *${type}* which does not exist`); } diff --git a/src/shared-components/Annonsere.jsx b/src/shared-components/Annonsere.jsx new file mode 100644 index 0000000..69bfecb --- /dev/null +++ b/src/shared-components/Annonsere.jsx @@ -0,0 +1,22 @@ +import React from 'react'; +import styled from 'styled-components'; + +import TextSection from './TextSection'; +import Heading from './Heading'; + +export default props => ( + + Annonsere +

Det Norske Studentersamfunds store prosjekter, fra den første grisefest til eget Chateau, ville aldri latt seg gjennomføre uten private gaver. Derfor har vi gjort det mulig å donere noe til festen generelt ved å sette inn annonser til seremoniens programblad. Behovet for akademikere er stadig større i arbeidslivet, så en annonse i vårt program trenger ikke kun være en uegennyttig handling.

+

Ønske om annonseplass og generelle henvendelser kan sendes til:

+
+ E-post: grisefest@studentersamfundet.no

+ Fysisk post:
+ Det Norske Studentersamfund
+ Slemdalsveien 15
+ 0369 Oslo
+
+

Merk konvolutten «Grisefest».

+
+ +); diff --git a/src/shared-components/BliFrivillig.jsx b/src/shared-components/BliFrivillig.jsx new file mode 100644 index 0000000..301063e --- /dev/null +++ b/src/shared-components/BliFrivillig.jsx @@ -0,0 +1,21 @@ +import React from 'react'; +import styled from 'styled-components'; + +const Iframe = styled.iframe` + width: 100%; +`; + +const BliFrivillig = (props) => { + return ( + + ); +}; + +export default BliFrivillig; diff --git a/src/shared-components/DetTapteSverdet.jsx b/src/shared-components/DetTapteSverdet.jsx new file mode 100644 index 0000000..4e21e56 --- /dev/null +++ b/src/shared-components/DetTapteSverdet.jsx @@ -0,0 +1,64 @@ +import React from 'react'; +import styled from 'styled-components'; + +import TextSection from './TextSection'; +import Heading from './Heading'; + +const H3 = styled.h3` + font-family: 'Julius Sans One', Georgia, serif; + font-variant: small-caps; + font-size: 1.5em; + margin-top: 2em; + margin-bottom: .5em; +`; + +const Blockquote = styled.blockquote` + padding: 0 2vw; + font-size: .8em; + + * { + max-width: 100%; + } +`; + +const Cite = styled.cite` + font-style: italic; + text-align: right; +`; + +export default props => ( + + Det tapte sverdet +

I oktober 2013 feiret Det Norske Studentersamfund 200 år. Vi er en gammel organisasjon med gamle tradisjoner og skatter. Venner fra fjernt og nær var samlet i Universitetets aula for å hedre Hans Majestet den Gylne Gris og hans nye Riddere, kommandører og storkors. Dog gikk ikke alt etter planen denne kvelden. Hans Majestets egne sverd, som skulle brukes til at slå våre utvalgte til riddere, var i hui og hast forlagt i grisebingen. Villig lot Skatmester Thomas Michelet Hans Majestet låne hans private sverd , slik at seremonien kunne gjennomføres som planlagt.

+ +
+

Kringsatt av venner, gikk
+ han inn på sin fest!
+ Men blant de innbudte –
+ var en slu gjest!

+ +

Grisen spør nå i angst,
+ udekket, åpen:
+ hva skal jeg kjempe med,
+ hvor er mitt våpen?

+ +

Hvor er mitt vern mot vold,
+ hvor er mitt sverd?
+ troen på livet vårt,
+ menneskets verd.

+ +

For festens fremtids skyld,
+ søk og lever det,
+ Billetter til grisefest:
+ Det skal du få med!

+
+ +

Sverdet som på mystisk vis forsvant har vært i slektens eie lengre enn DNS har eksistert og er av stor affeksjonsverdi for eieren og hans familie. Ikke minst er det pinlig for Hans Majestet å ikke være i stand til å levere tilbake noe han har lånt.

+ +

Vi har full forståelse for at ”bergingskulturen” rår. Og at sverdets nå 4 årige bortkommenhet, kun var ment som et pek i beste mening. Men nå håper altså Hans Majestet at de ”skyldige” har kost seg lenge nok med vår angst, og at de vil levere sverdet tilbake.

+ +

Som takk for dette vil Hans Majestet grisen garantere fullt amnesti for udåden og samtidig invitere røverne til grisefest på hans regning. Sågar et trynfoto med Hans Majestet kan der fikses.

+ +

Anonyme tips som kan oppklare saken kan sendes til formand@studentersamfundet.no. Belønningen vil i så tilfelle tilfalle tipseren.

+
+); diff --git a/src/shared-components/DnsBanner.jsx b/src/shared-components/DnsBanner.jsx new file mode 100644 index 0000000..9d9746e --- /dev/null +++ b/src/shared-components/DnsBanner.jsx @@ -0,0 +1,18 @@ +import React from 'react'; +import styled from 'styled-components'; +import urlJoin from 'url-join'; + +import { staticUrl } from '../../config'; + +const DnsBanner = styled.a` + display: block; + width: 100%; + height: 3.2rem; + background: url('${urlJoin(staticUrl, '/img/dns-logo.png')}') center no-repeat, rgb(255, 170, 46); + background-size: contain; + color: #111; + text-align: center; + z-index: 666; +`; + +export default props => ; diff --git a/src/shared-components/GreatBigHero.jsx b/src/shared-components/GreatBigHero.jsx new file mode 100644 index 0000000..6659cd0 --- /dev/null +++ b/src/shared-components/GreatBigHero.jsx @@ -0,0 +1,26 @@ +import React from 'react'; +import styled from 'styled-components'; +import urlJoin from 'url-join'; + +import { staticUrl } from '../../config'; + +const GreatBigHero = styled.section` + width: 100%; + margin: auto; + padding: 50vh 5vw 4vh; + background: url('${urlJoin(staticUrl, 'img/some-pigs-are-more-equal.jpg')}') center, darkgray; + background-size: cover; + + color: white; + text-align: center; + text-shadow: .1rem .1rem .2rem black; + font-size: 7vw; + + @media (min-width: 750px) { + font-size: 5vw; + padding-left: 10vw; + padding-right: 10vw; + } +`; + +export default props => Det Norske Studentersamfund inviterer deg herved til den 21. Grisefest!; diff --git a/src/shared-components/Heading.jsx b/src/shared-components/Heading.jsx new file mode 100644 index 0000000..96deb71 --- /dev/null +++ b/src/shared-components/Heading.jsx @@ -0,0 +1,16 @@ +import styled from 'styled-components'; + +export default styled.h1` + color: darkGray; + font-size: 12vw; + line-height: 1.3; + text-align: center; + margin: 4vw auto 0; + + font-family: 'Julius Sans One', Georgia, serif; + font-variant: small-caps; + + @media (min-width: 750px) { + font-size: 6vw; + } +`; diff --git a/src/shared-components/Historie.jsx b/src/shared-components/Historie.jsx new file mode 100644 index 0000000..7e0b643 --- /dev/null +++ b/src/shared-components/Historie.jsx @@ -0,0 +1,109 @@ +import React from 'react'; +import styled from 'styled-components'; + +import TextSection from './TextSection'; +import Heading from './Heading'; + +/* +const Historie = styled(TextSection)` + background: rgb(255, 170, 46); + overflow: hidden; +`; +*/ +const H3 = styled.h3` + font-family: 'Julius Sans One', Georgia, serif; + font-variant: small-caps; + font-size: 1.5em; + margin-top: 2em; + margin-bottom: .5em; +`; + +const Blockquote = styled.blockquote` + padding: 0 2vw; + font-size: .8em; + + * { + max-width: 100%; + } +`; + +const Cite = styled.cite` + font-style: italic; + text-align: right; +`; + +export default props => ( + + Historie +

Det er lett å la seg forundre over hvordan et halvgodt påfunn under en fest i 1859 kunne bli utgangspunktet for den desidert mest kuriøse, men også en av de viktigste akademiske tradisjonene i Norge. Med over 150 år på labbene, har Hans Majestet Grisen satt et sterkt preg på Det Norske Studentersamfund og norsk studentkultur.

+ +

Men historien om Grisen er ikke bare en historie om fest og moro – den er også historien om studentenes hus, og ikke minst mangel på hus. Helt siden stiftelsen i 1813, hadde Studentersamfundet ført en omstreifende tilværelse, dels med tilhold i små kvistværelser, dels ved å leie seg inn i halvbekvemmelige lokaler. Like før Grisen gjorde sitt inntog på 1850-tallet, holdt Samfundet til på hjørnet av Øvre slottsgate og Prinsens gate. Men heller ikke dette lokalet var tilfredsstillende i lengden. Allerede i 1850 ble det satt i gang et arbeid for å finne finansiering til et eget hus.

+ +

Gjennom en storstilt innsamlingsaksjon skulle man reise et byggefond – og innsatsen var imponerende! Innsamlingen ble den direkte foranledning for H.M. Grisens tronbestigelse. Ledelsen av innsamlingsarbeidet ble betrodd den sagnomsuste Fireskillingskomiteen, som skulle få studenter og andre av byens borgere til å avstå en fireskilling så ofte som mulig. Og det kom ikke til å mangle på fantasifulle virkemidler for å lokke frem både fireskillinger og andre valører; man solgte livsvarige medlemskap, oppfordret til lån, ga offentlige fester, forestillinger, kunstutstilling etc. Studentersamfundets teater kom med viktige bidrag. Stykket Gildet paa Mærrahaugen, eller den fortryllede Agurk (høsten 1858) brakte inn store penger og har blitt stående som et høydepunkt. Og bidragene lot ikke vente på seg – Fireskillingskomiteen møtte suksess. 10. juni 1859 kunne grunnsteinen legges ned for den nye Samfundsbygning i Universitetsgaten 26.

+ +

Å gjøre majestet av gris

+ +

Studentersamfundet var på denne tiden tydelig preget av menn (kvinnene hadde ikke adgang til medlemskap før i 1884) med et særskilt anlegg for å komme opp med kuriøse ideer – og en egen evne til å sette de ut i live. Under juletrefesten 1857 ble Grisen første gang konfrontert med sitt folk. Grisen, en sparegris av porselen, hadde akkurat kommet til Studentersamfundet som en gave fra studentene i København, og skulle være et virkemiddel i reisingen av byggefondet. Grisen avløste nå sin forgjenger i arbeidet med å samle inn penger, en lurvete hatt. Formannen, Ferdinand Roll, ønsket å hedre de energiske medlemmene av fireskillingskomiteen, og med et kort avertissement i Morgenbladet ble det innkalt til fest 9. april 1859: ”Studentersamfundet. Iaften Lag for Fireskillingsmændene”. Sparegrisen hadde allerede fått sin apoteose, formann Roll hadde utropt ham til Studentersamfundets majestet.

+ +

Men på denne festen grunnla H. M. sitt ordensvesen ved den velkjente samfundsgriselige kunngjørelse av 9. april 1859:

+ +
+

Vi, Samfundsgris, har fundet det tjenligt uden Henhold til nogen § i Samfundsloven at oprette en Samfundsgriselig studenterlig Ridderorden, hvilken Vi til ihukommelse af Os selv har besluttet at kalde Den Gyldne Gris og for hvilken Orden Vi erklærer os som Herre og Stormester.

+
+ +

Dermed var griseordenen etablert. Statutter for ordenen, en parodi på statuttene for den Kongelige Norske St. Olavs Orden, ble vedtatt, og ordensregnet rislet for første gang over de håpefulle. Det var Fireskillingens medlemmer som ble de første i rekken av Grisens ranke ridderskare. Grisen ble for øvrig båret rundt i høytidelig prosesjon mens alle fikk anledning til å slippe sine skillinger ned i den. Til denne anledning var ”God save the Gris” skrevet, fortsatt den fremste av grisehymnene.

+ +

Den neste store grisefest fulgte allerede to år senere, og i 1867 den 3. grisefest. Det var ved disse festene ordenens seremoniell ble grunnlagt. Særlig den 3. grisefesten var betydningsfull og grunnleggende for den form festene skulle få heretter. Det var til denne festen Karl Falk Wasserfall skrev sin udødelige grisehymne:

+ +
+

Søn af Dit Ophav!
+ Frugt af stærke Lænder!
+ Deiligste Krop af
+ Guld med hvide Tænder!
+ Huldt ifra oven
+ Du vort Svin paa Skoven
+ Smil til os svinepolisk!

+
+ +

Ordenens seremoniell og grisefestenes form har blitt utviklet og tilpasset nye generasjoner studenter helt frem mot den 20. store grisefest i 2013. Det har blitt lagt adskillig vekt på at festene ikke skulle stivne og miste den humoristiske brodden, samtidig som man har holdt hardt på mange faste elementer.

+ +

Flere av grisehymnene har blitt sunget helt fra de første festene; prosesjonen, kantaten og ridderslaget med deklamasjon av deviser har vært sentrale ledd i seremoniene helt siden starten; og ordenen innrettes fortsatt etter statuttene som ble utformet i 1867. En fellesnevner har vært den enorme innsatsen som har blitt lagt i å forfatte kantater og andre tekster, utforme kulisser, kostymer og effekter, og alt annet som må til for at en grisefest skal bli så overmåte grandios og burlesk-pompøs som den må være.

+ +

Død og oppstandelse

+ +

Det har ikke manglet på faretruende situasjoner – fatale øyeblikk hvor hele grisetradisjonen kunne gått tapt. I 1865, under en uvanlig belivet punsjefest, styrtet H. M. ut av vinduet og knuste mot gaten. I et sørgekvad het det:

+ +
+

Sorgen ruged som natten sort;
+ Grisen vandred mod dødens port;
+ alt var jammer kun og kvide,
+ tyst var ved sottesengen,
+ sørgerlig lød bulletinen:

+ +

«Gylden svands hænger mat og slap;
+ Søvn urolig og pulsen knap,
+ Og i skinken fin’s trichiner.
+ Grisen gaar bagud af dansen.»

+ + Underskrev Wilhelm Hansen +
+ +

Men det tok ikke lang tid før Grisen gjenoppstod i fornyet og forsterket drakt. Wilhelm Faye-Hansen, en utrettelig innsamler til byggefondet og en av samfundshistoriens varmeste grisevenner, fikk billedhuggeren Brynjulv Bergslien til å modellere Grisen i ny drakt. Den ble så skåret ut i tre av fanger på Botsfengslet (hvis direktør var den tro venn av Grisen og evige samfundsstøtte, Richard Petersen). Det er i denne skikkelsen vi kjenner Grisen i dag.

+ +

Udødelig tradisjon

+ +

Grisen har også måttet slite med sviktende oppslutning hos egne undersåtter. På 1920-tallet og på 1970-tallet så det ut til at de alvorstyngede studentene hadde latt sitt tungsinn trenge H. M. fullstendig ut i glemselen. Han har til og med flere ganger blitt fordrevet i eksil og erklært avsatt, endog brutalt bortført. Men tiden har vist at Grisen trenger sitt folk og folket trenger ham. I periodene Studentersamfundet har vært sentrum for sterke politiske motsetninger, har Grisen blitt stuet bort – men så snart stemningen har roet seg igjen, har Grisen atter dukket opp som sosialt samlingspunkt.

+ +

Man kan spørre seg hvordan grisetradisjonen har blitt så gammel. Svaret må vel ligge i Grisens egenart – som et unikt uttrykk for en akademisk satirisk humor, med en anelse av akademisk selvhøytidelighet.

+ +

Som storkors av DGG, Knut Bøckman, uttrykte det: ”Det er i denne balansegangen mellom det grinaktige sludder og det seriøse snev av egendyrkelse, kombinert med et kritisk, men dog velvillig blikk på samfunnet og verden, at Grisens egenart ligger.” Men Grisens viktigste funksjon og overlevelseskraft må først og fremst være som symbol på Studentersamfundet som oslostudentenes fremste sosiale arena, på tvers av faglig tilknytning, interesser og politisk orientering – gjennom hele 200 år.

+ +

Samfundsbygningen i Universitetsgaten 26 ble solgt i forfallen tilstand i 1918 av et Samfund som hadde vokst ut av bygget. Studentersamfundet gikk så ut i en ny husvill periode, før det endelig i 1973 kunne flytte inn i sitt Chateau Neuf. Selv om få mynter finner veien til H.M.s buk i dag, kan Studentersamfundet fortsatt nyte godt av det som ble grunnlagt i Grisens svennsdager.

+ +

+ Hans Maiestet D.G. Grisens hoffhistoriker og Vokter af Svinets perler
+ Tor Ivar Hansen
+

+

Skrevet til Studentersamfundets 200-årsjubileum, 2013

+
+); diff --git a/src/shared-components/KjoepBillett.jsx b/src/shared-components/KjoepBillett.jsx new file mode 100644 index 0000000..456fefb --- /dev/null +++ b/src/shared-components/KjoepBillett.jsx @@ -0,0 +1,44 @@ +import React from 'react'; +import styled from 'styled-components'; + +import TextSection from './TextSection'; +// import Heading from './Heading'; + +const KjoepBillett = styled(TextSection)` + /* background: rgb(255, 170, 46); */ + overflow: hidden; + text-align: center; + padding: 16vh 5vw 11vh; +`; + +const ShadowP = styled.p` + text-shadow: .1rem .1rem .4rem rgba(255,255,255,0.5); +`; + +const BuyButton = styled.a` + display: inline-flex; + align-items: center; + border: 0 none; + padding: 3vh 3vw; + border-radius: 1.2rem; + background: mediumseagreen; + color: white; + cursor: pointer; + transition: background .2s ease-in-out; + text-shadow: none; + text-decoration: none; + + &:hover { + background-color: darkGreen; + } +`; + +// @TODO Ta med resten av historien +export default props => ( + + 23. september 2017, Chateau Neuf
+

+ Kjøp billett +

+
+); diff --git a/src/shared-components/Program.jsx b/src/shared-components/Program.jsx new file mode 100644 index 0000000..691148a --- /dev/null +++ b/src/shared-components/Program.jsx @@ -0,0 +1,14 @@ +import React from 'react'; +import styled from 'styled-components'; + +import TextSection from './TextSection'; +import Heading from './Heading'; + +export default props => ( + + Program +

Grisefesten er todelt. Først en åpen seremoni kl 16.00, der ordenspromosjonen vil finne sted. Dette er en seremoni hvor medlemmer og/eller venner av Studentersamfundet som har utmerket seg spesielt, blir beæret av Hans Majestet Grisen og slått til ridder, kommandør eller storkorsinnehaver av ordenen «Den Gyldne Gris». Seremonien vil finne sted i Gamle Festsal til Universitetet i Oslo (Domus Media i universitets urbygning på Karl Johan) og er åpen og gratis for alle interesserte. Det er dog begrenset med plasser.

+

Deretter fortsetter Grisefesten med tre-retters middag for påmeldte på Grisens slott, Chateau Neuf, som har huset flere gallaer og grisefester ved tidligere anledninger. Efter måltidet bys det opp til dans. Åpent med førdrink fra kl 18.00 og til bords kl 19.00. På invitasjonslisten står studenter og ordensinnehavere, gamle pamper, storfolk og kulturpersoner. +Etter en trivelig festaften vil kvelden utarte seg til en hyggelig efterfest rundt midnatt.

+
+); diff --git a/src/shared-components/TextSection.jsx b/src/shared-components/TextSection.jsx new file mode 100644 index 0000000..a947995 --- /dev/null +++ b/src/shared-components/TextSection.jsx @@ -0,0 +1,98 @@ +import React from 'react'; +import PropTypes from 'prop-types'; +import styled from 'styled-components'; + +const colors = { + main: 'rgb(255, 170, 46)', + alt: 'papayawhip', +}; + +const Section = styled.section` + background: ${props => (props.alt ? colors.main : colors.alt)}; + color: #333; + padding: 2vh 2vw 5vh; + overflow: hidden; + position: relative; + + text-shadow: .1rem .1rem ${props => (props.alt || true ? '.4rem rgba(255,255,255,0.5)': '.3rem transparent')}; + + max-height: ${props => (props.expanded ? 'none' : props.expandAfter)}; + + h1 { + color: ${props => (props.alt ? 'white': 'palevioletred')}; + text-shadow: .1rem .1rem ${props => (props.alt ? '.4rem rgba(0,0,0,0.5)': '.3rem white')}; + } + + address { + max-width: 70rem; + margin: 1em auto; + padding: 0 7vw; + } +`; + +const ExpanderA = styled.a` + display: block; + width: 100%; + padding: 5.5em 2vw 1em; + + cursor: pointer; + text-decoration: none; + color: inherit; + + position: absolute; + bottom:0; + left: 0; + text-align: center; + + background: linear-gradient(to bottom, transparent, ${props => (props.alt ? colors.main : colors.alt)} 5em); + + &:hover, + &:focus { + text-decoration: underline; + } +`; + +const Expander = props => Vis resten; +Expander.propTypes = { + expand: PropTypes.func.isRequired, +}; + +class TextSection extends React.Component { + static propTypes = { + alt: PropTypes.bool, + children: PropTypes.node, + expandAfter: PropTypes.string, + } + + static defaultProps = { + alt: false, + children: null, + expandAfter: '', + } + + constructor(props) { + super(props); + + this.state = { + expandAfter: this.props.expandAfter, + expanded: !this.props.expandAfter, + }; + } + + expandSection = () => { + this.setState({ + expanded: true, + }); + } + + render() { + return ( +
+ {this.props.children} + {!this.state.expanded && } +
+ ); + } +} + +export default TextSection; diff --git a/webpack.config.js b/webpack.config.js index b70499c..215d609 100644 --- a/webpack.config.js +++ b/webpack.config.js @@ -58,14 +58,14 @@ module.exports = Object.assign({}, auroraWebpackConfig, { * we want to ignore in our * webpack bundle * - * NOTE: We just replace any - * server specific modules - * with a no-op (from npm) + * NOTE: We just replace any server specific modules with a no-op (from npm) */ - resolve: Object.assign({}, auroraWebpackConfig.resolve, { alias: Object.assign({}, (auroraWebpackConfig.resolve || {}).alias, { - redis: 'no-op', + 'redis': 'no-op', + 'mmdb-reader': 'no-op', + 'big-integer': 'no-op', }), + extensions: ['.js', '.jsx', '.json'], }), });