Add surrounding page

This commit is contained in:
Quantum 2022-02-12 21:16:00 -05:00
parent 83b99e06f7
commit 9b5ac6d53b
7 changed files with 214 additions and 40 deletions

31
package-lock.json generated
View file

@ -1901,6 +1901,12 @@
} }
} }
}, },
"@popperjs/core": {
"version": "2.11.2",
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.2.tgz",
"integrity": "sha512-92FRmppjjqz29VMJ2dn+xdyXZBrMlE42AV6Kq6BwjWV7CNUW1hs2FtxSNLQE+gJhaZ6AAmYuO9y8dshhcBl7vA==",
"dev": true
},
"@rollup/plugin-babel": { "@rollup/plugin-babel": {
"version": "5.3.0", "version": "5.3.0",
"resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz", "resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.0.tgz",
@ -2307,6 +2313,16 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"@types/bootstrap": {
"version": "5.1.9",
"resolved": "https://registry.npmjs.org/@types/bootstrap/-/bootstrap-5.1.9.tgz",
"integrity": "sha512-Tembe6lt7819EUzV5LSG9uuwULm4hdEGV9LZ8QBYpWc0J+a+9DdmJEwZ4FMaXGVJWwumTPSkJ8JQF0/KDAmXYg==",
"dev": true,
"requires": {
"@popperjs/core": "^2.9.2",
"@types/jquery": "*"
}
},
"@types/connect": { "@types/connect": {
"version": "3.4.35", "version": "3.4.35",
"resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz", "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.35.tgz",
@ -2419,6 +2435,15 @@
"pretty-format": "^27.0.0" "pretty-format": "^27.0.0"
} }
}, },
"@types/jquery": {
"version": "3.5.13",
"resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.13.tgz",
"integrity": "sha512-ZxJrup8nz/ZxcU0vantG+TPdboMhB24jad2uSap50zE7Q9rUeYlCF25kFMSmHR33qoeOgqcdHEp3roaookC0Sg==",
"dev": true,
"requires": {
"@types/sizzle": "*"
}
},
"@types/json-schema": { "@types/json-schema": {
"version": "7.0.9", "version": "7.0.9",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.9.tgz",
@ -2522,6 +2547,12 @@
"@types/node": "*" "@types/node": "*"
} }
}, },
"@types/sizzle": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.3.tgz",
"integrity": "sha512-JYM8x9EGF163bEyhdJBpR2QX1R5naCJHC8ucJylJ3w9/CVBaskdQ8WqBf8MmQrd1kRvp/a4TS8HJ+bxzR7ZJYQ==",
"dev": true
},
"@types/sockjs": { "@types/sockjs": {
"version": "0.3.33", "version": "0.3.33",
"resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz", "resolved": "https://registry.npmjs.org/@types/sockjs/-/sockjs-0.3.33.tgz",

View file

@ -42,5 +42,8 @@
"last 1 firefox version", "last 1 firefox version",
"last 1 safari version" "last 1 safari version"
] ]
},
"devDependencies": {
"@types/bootstrap": "^5.1.9"
} }
} }

View file

@ -5,39 +5,100 @@
<link rel="icon" href="%PUBLIC_URL%/favicon.ico"/> <link rel="icon" href="%PUBLIC_URL%/favicon.ico"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/> <meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta name="theme-color" content="#000000"/> <meta name="theme-color" content="#000000"/>
<meta <meta name="description" content="Interactive French Republican Calendar (a.k.a. French Revolutionary Calendar)."/>
name="description"
content="Web site created using create-react-app"
/>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png"/> <link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png"/>
<!--
manifest.json provides metadata used when your web app is installed on a
user's mobile device or desktop. See https://developers.google.com/web/fundamentals/web-app-manifest/
-->
<link rel="manifest" href="%PUBLIC_URL%/manifest.json"/> <link rel="manifest" href="%PUBLIC_URL%/manifest.json"/>
<!-- <title>French Republican Calendar (a.k.a. French Revolutionary Calendar)</title>
Notice the use of %PUBLIC_URL% in the tags above.
It will be replaced with the URL of the `public` folder during the build.
Only files inside the `public` folder can be referenced from the HTML.
Unlike "/favicon.ico" or "favicon.ico", "%PUBLIC_URL%/favicon.ico" will
work correctly both with client-side routing and a non-root public URL.
Learn how to configure a non-root public URL by running `npm run build`.
-->
<title>React App</title>
</head> </head>
<body> <body>
<nav class="navbar navbar-expand-lg navbar-light">
<div class="container">
<a class="navbar-brand" href="#">French Republican Calendar</a>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#nav-anchors"
aria-controls="nav-anchors" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="nav-anchors">
<ul class="nav navbar-nav mr-auto">
<li class="nav-item">
<a class="nav-link" href="#explanation">Explanation</a>
</li>
</ul>
</div>
</div>
</nav>
<noscript>You need to enable JavaScript to run this app.</noscript> <noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div> <div id="root"></div>
<!-- <div class="main">
This HTML file is a template. <h2 id="explanation">Explanation</h2>
If you open it directly in the browser, you will see an empty page. <div class="card">
<div class="card-body">
You can add webfonts, meta tags, or analytics to this file. <h4 class="card-title">What is this?</h4>
The build step will place the bundled scripts into the <body> tag. <p class="lead">The <a href="https://en.wikipedia.org/wiki/French_Republican_calendar">French Republican
calendar</a> was a calendar created and implemented during the French Revolution.</p>
To begin the development, run `npm start` or `yarn start`. <p>It was also frequently known as the <em>French Republican Calendar</em>, but this was a misnomer: year 1
To create a production bundle, use `npm run build` or `yarn build`. of the calendar started on 22 September 1792, the day after the
--> <a href="https://en.wikipedia.org/wiki/Proclamation_of_the_abolition_of_the_monarchy">abolition of the
monarchy</a> and the founding of the <a href="https://en.wikipedia.org/wiki/French_First_Republic">French
First Republic</a>.</p>
</div>
</div>
<div class="card">
<div class="card-body">
<h4 class="card-title">How does it work?</h4>
<p class="lead">A year consists of 12 months of 30 days each, divided into three <em>décades</em> of 10 days
each, followed by 5 complementary days (6 in leap years).</p>
<p>The year starts on the day of the autumnal equinox at the Paris Observatory (longitude 2°2014.03″ E). A
leap year follow directly from this definition: a year is a leap year when the next autumnal equinox
happens 366 days later instead of the normal 365. By this definition, the year will <b>never</b> drift
with respect to the seasons.</p>
<p>The 12 months are: <em>Vendémiaire</em>, <em>Brumaire</em>, <em>Frimaire</em>, <em>Nivôse</em>, <em>Pluviôse</em>,
<em>Ventôse</em>, <em>Germinal</em>, <em>Floréal</em>, <em>Prairial</em>, <em>Messidor</em>, <em>Thermidor</em>,
<em>Fructidor.</em></p>
<p>The complementary days are: <em>la Fête de la Vertu</em>, <em>la Fête du Génie</em>, <em>la Fête du
Travail</em>, <em>la Fête de l'Opinion</em>, <em>la Fête des Récompenses,</em> and <em>la Fête de la
Révolution</em> (leap years only).</p>
</div>
</div>
<div class="card">
<div class="card-body">
<h4 class="card-title">What's so special about this version?</h4>
<p class="lead">Most versions of the calendar floating around doesn't use the original definition above.</p>
<p>Most versions uses the so-called <em>Romme</em> method for leap years, using the same leap year rules as
the Gregorian calendar, i.e. every year divisible by four, except century years not divisible by 400.
This method might make sense, except years 3, 7, and 11 were leap years under the original rules and
were observed as such in real life, but the <em>Romme</em> method instead makes years 4, 6, 11 leap
years instead.</p>
<p>This version uses the original rules. The <a href="https://ssd.jpl.nasa.gov/planets/eph_export.html">JPL's
DE440 and DE441 ephemerides</a> were used to calculate the exact timings of the autumnal equinoxes
between the Gregorian years 13201 BCE and 17191 CE (corresponding to the French Republican years -14991
to 15399). The times were then converted to UT1+00:09:21, the exact local time at the Paris Observatory.
UT1 was chosen to keep track of the Earth's rotation without having to worry about the issues posed by
leap seconds in UTC. Note that due to the uncertainty over
<a href="https://en.wikipedia.org/wiki/%CE%94T_(timekeeping)">ΔT</a> — the difference between UT1 and
Terrestrial Time (TT) used in the ephemerides — it is theoretically possible for there to be
inaccuracies when the equinox occurs very close to midnight.</p>
</div>
</div>
<div class="card">
<div class="card-body">
<h4 class="card-title">What are those numbers below the Gregorian date?</h4>
<p>The five (or more) numbers separated by dots is the corresponding
<a href="https://en.wikipedia.org/wiki/Mesoamerican_Long_Count_calendar">Mesoamerican Long Count
calendar</a> date. This is commonly known as the &ldquo;Mayan calendar.&rdquo; This calendar is not
available for dates before August 11, 3114 BCE (25 Thermidor -4905).</p>
</div>
</div>
</div>
<footer class="footer">
<div class="container">
<p class="text-muted">Copyright &copy; 2018-<%= new Date().getFullYear() %> <a href="https://quantum5.ca">Quantum</a>.
Licensed under
<a href="https://www.gnu.org/licenses/agpl-3.0.en.html">GNU AGPLv3</a>. Source code available on
<a href="https://github.com/quantum5/frcal">GitHub</a>.<br>
</p>
</div>
</footer>
</body> </body>
</html> </html>

View file

@ -11,8 +11,18 @@
.Calendar-head { .Calendar-head {
display: flex; display: flex;
justify-content: center;
font-size: 2em; font-size: 2em;
font-weight: 600; font-weight: 600;
position: sticky;
top: 0;
background: white;
margin-top: -$spacer * 4;
margin-left: -$spacer;
margin-right: -$spacer;
padding-top: $spacer * 4;
padding-left: $spacer;
padding-right: $spacer;
.btn { .btn {
margin: 0 1px; margin: 0 1px;
@ -29,6 +39,7 @@
.Calendar-month-name { .Calendar-month-name {
flex: 1; flex: 1;
max-width: 30rem;
text-align: center; text-align: center;
} }
@ -39,7 +50,6 @@
@include media-breakpoint-up(md) { @include media-breakpoint-up(md) {
.Month-decade { .Month-decade {
@include make-row(); @include make-row();
padding: 0 0.5em;
> * { > * {
@include make-col-ready(); @include make-col-ready();

1
src/consts.scss Normal file
View file

@ -0,0 +1 @@
$calendar-width: 1600px;

View file

@ -2,3 +2,70 @@
@import 'bootstrap/scss/variables'; @import 'bootstrap/scss/variables';
@import 'bootstrap/scss/mixins'; @import 'bootstrap/scss/mixins';
@import 'bootstrap/scss/reboot'; @import 'bootstrap/scss/reboot';
@import 'bootstrap/scss/navbar';
@import 'bootstrap/scss/transitions';
@import 'bootstrap/scss/type';
@import 'bootstrap/scss/card';
@import './consts';
body {
padding-top: $spacer * 4;
position: relative;
}
#root {
max-width: $calendar-width;
margin: 0 auto;
}
nav.navbar {
background: $light;
position: fixed;
top: 0;
z-index: 1;
left: 0;
right: 0;
.container {
width: $calendar-width;
margin: 0 auto;
padding: 0 1em;
}
}
.main {
max-width: $calendar-width;
margin-top: $spacer;
@include make-container();
.card {
margin-bottom: $spacer;
}
}
html {
scroll-padding-top: $spacer * 4;
}
@supports not (scroll-padding-top: 80px) {
h1, h2, h3, h4, h5, h6, .footnotes li {
margin-top: -$spacer * 4;
padding-top: $spacer * 4;
}
}
a {
text-decoration: none;
}
.footer {
background: $light;
min-height: $spacer * 4;
padding: ($spacer * 4 - $font-size-base) / 2;
.container {
width: $calendar-width;
margin: 0 auto;
padding: 0 1em;
}
}

View file

@ -1,5 +1,6 @@
import React from 'react'; import React from 'react';
import ReactDOM from 'react-dom'; import ReactDOM from 'react-dom';
import 'bootstrap/js/dist/collapse';
import './index.scss'; import './index.scss';
import App from './App'; import App from './App';
import reportWebVitals from './reportWebVitals'; import reportWebVitals from './reportWebVitals';