port to egui (WIP)
This commit is contained in:
20
www/bootstrap.js
vendored
20
www/bootstrap.js
vendored
@@ -1,20 +0,0 @@
|
||||
init();
|
||||
|
||||
async function init() {
|
||||
if (typeof process == "object") {
|
||||
const [{ChartManager}, {main, setup}] = await Promise.all([
|
||||
import("integral_site"),
|
||||
import("./index.js"),
|
||||
]);
|
||||
setup(ChartManager);
|
||||
main();
|
||||
} else {
|
||||
const [{ChartManager, default: init}, {main, setup}] = await Promise.all([
|
||||
import("../pkg/integral_site.js"),
|
||||
import("./index.js"),
|
||||
]);
|
||||
await init();
|
||||
setup(ChartManager);
|
||||
main();
|
||||
}
|
||||
}
|
||||
@@ -1,5 +1,8 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<!-- Disable zooming: -->
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=no">
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
@@ -8,34 +11,25 @@
|
||||
</head>
|
||||
<body>
|
||||
<noscript>Please enable Javascript, this page uses both WebAssembly and Javascript to run.</noscript>
|
||||
<script src="bootstrap.js"></script>
|
||||
<main>
|
||||
<h1>Integral Demonstration</h1>
|
||||
<div id="coord"></div>
|
||||
<canvas id="canvas" width="600" height="400"></canvas>
|
||||
<div id="status">Loading WebAssembly...</div>
|
||||
<div id="control">
|
||||
<label for="math_function">y=</label> <input type="string" id="math_function" value="x^2">
|
||||
<p></p>
|
||||
<label for="minX">MinX: </label> <input type="number" id="minX" value="-10">
|
||||
<p></p>
|
||||
<label for="maxX">MaxX: </label> <input type="number" id="maxX" value="10">
|
||||
<p></p>
|
||||
<label for="minY">MinY: </label> <input type="number" id="minY" value="-10">
|
||||
<p></p>
|
||||
<label for="maxY">MaxY: </label> <input type="number" id="maxY" value="10">
|
||||
<p></p>
|
||||
<label for="num_interval">Interval: </label> <input type="number" id="num_interval" value="100" min="0" step="1">
|
||||
<p></p>
|
||||
<label for="resolution">Number of Points </label> <input type="number" id="resolution" value="10000" min="0" step="1">
|
||||
<p></p>
|
||||
</div>
|
||||
<div id="area-msg">Area:</div>
|
||||
</main>
|
||||
|
||||
<canvas id="canvas"></canvas>
|
||||
|
||||
<script type="module">
|
||||
import init, { start } from '../pkg/integral_site.js';
|
||||
|
||||
async function run() {
|
||||
await init();
|
||||
|
||||
start("canvas");
|
||||
}
|
||||
run();
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
<h4><a href="https://github.com/Titaniumtown/meval-rs#supported-expressions">Supported Expressions</a></h4>
|
||||
|
||||
<!-- Todo: port this to egui -->
|
||||
<!-- <h4><a href="https://github.com/Titaniumtown/meval-rs#supported-expressions">Supported Expressions</a></h4>
|
||||
|
||||
|
||||
<h3 id="%3Ca%20href=%22https://github.com/Titaniumtown/integral_site%22%3EI&#8217;m%20Open%20Source!%3C/a%3E%20(and%20licensed%20under%20AGPLv3)"><a href="https://github.com/Titaniumtown/integral_site">I’m Open Source!</a> (and licensed under AGPLv3)</h3>
|
||||
<h3 id="%3Ca%20href=%22https://github.com/Titaniumtown/integral_site%22%3EI&#8217;m%20Open%20Source!%3C/a%3E%20(and%20licensed%20under%20AGPLv3)"><a href="https://github.com/Titaniumtown/integral_site">I’m Open Source!</a> (and licensed under AGPLv3)</h3> -->
|
||||
|
||||
167
www/index.js
167
www/index.js
@@ -1,167 +0,0 @@
|
||||
class ChartManager {}
|
||||
|
||||
const canvas = document.getElementById("canvas");
|
||||
const coord = document.getElementById("coord");
|
||||
const math_function = document.getElementById("math_function");
|
||||
const status = document.getElementById("status");
|
||||
|
||||
const minX = document.getElementById("minX");
|
||||
const maxX = document.getElementById("maxX");
|
||||
const minY = document.getElementById("minY");
|
||||
const maxY = document.getElementById("maxY");
|
||||
const num_interval = document.getElementById("num_interval");
|
||||
const area_msg = document.getElementById("area-msg");
|
||||
const resolution = document.getElementById("resolution");
|
||||
|
||||
let darkMode = false;
|
||||
|
||||
let chart = null;
|
||||
let chart_manager = null;
|
||||
|
||||
/** Main entry point */
|
||||
export function main() {
|
||||
setupUI();
|
||||
setupCanvas();
|
||||
}
|
||||
|
||||
/** This function is used in `bootstrap.js` to setup imports. */
|
||||
export function setup(WasmChart) {
|
||||
ChartManager = WasmChart;
|
||||
}
|
||||
|
||||
/** Add event listeners. */
|
||||
function setupUI() {
|
||||
status.innerText = "WebAssembly loaded!";
|
||||
|
||||
// Handles browser color preferences
|
||||
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
|
||||
darkMode = true;
|
||||
}
|
||||
|
||||
// Watches for changes in color preferences
|
||||
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
|
||||
darkMode = event.matches;
|
||||
updatePlot();
|
||||
});
|
||||
|
||||
math_function.addEventListener("change", updatePlot);
|
||||
minX.addEventListener("input", updatePlot);
|
||||
maxX.addEventListener("input", updatePlot);
|
||||
minY.addEventListener("input", updatePlot);
|
||||
maxY.addEventListener("input", updatePlot);
|
||||
num_interval.addEventListener("input", updatePlot);
|
||||
resolution.addEventListener("input", updatePlot);
|
||||
|
||||
|
||||
window.addEventListener("resize", setupCanvas);
|
||||
window.addEventListener("mousemove", onMouseMove);
|
||||
}
|
||||
|
||||
function setupCanvas() {
|
||||
const aspectRatio = canvas.width / canvas.height;
|
||||
const size = canvas.parentNode.offsetWidth * 0.8;
|
||||
canvas.style.width = size + "px";
|
||||
canvas.style.height = size / aspectRatio + "px";
|
||||
canvas.width = size;
|
||||
canvas.height = size / aspectRatio;
|
||||
updatePlot();
|
||||
}
|
||||
|
||||
function onMouseMove(event) {
|
||||
if (chart) {
|
||||
var text = "Mouse is outside Chart.";
|
||||
|
||||
if (event.target == canvas) {
|
||||
let actualRect = canvas.getBoundingClientRect();
|
||||
let logicX = event.offsetX * canvas.width / actualRect.width;
|
||||
let logicY = event.offsetY * canvas.height / actualRect.height;
|
||||
const point = chart.coord(logicX, logicY);
|
||||
text = (point)
|
||||
? `(${point.x.toFixed(3)}, ${point.y.toFixed(3)})`
|
||||
: text;
|
||||
}
|
||||
coord.innerText = text;
|
||||
}
|
||||
}
|
||||
|
||||
function postErrorStatus(string) {
|
||||
status.style.color = "red";
|
||||
status.innerText = string;
|
||||
}
|
||||
|
||||
function postNormalStatus(string) {
|
||||
status.style.color = "grey";
|
||||
status.innerText = string;
|
||||
}
|
||||
|
||||
// Checks variables put in input fields
|
||||
function checkVariables() {
|
||||
if (minX.value >= maxX.value) {
|
||||
postErrorStatus("minX must be smaller than maxX!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (minY.value >= maxY.value) {
|
||||
postErrorStatus("minY must be smaller than maxY!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (0 > num_interval.value) {
|
||||
postErrorStatus("Interval is smaller than 0!");
|
||||
return;
|
||||
}
|
||||
|
||||
if (0 > resolution.value) {
|
||||
postErrorStatus("Number of Points is smaller than 0!");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
// Generates a possible "tip" to assist the user when an error occurs.
|
||||
function errorRecommend(error_string) {
|
||||
if (error_string.includes("Evaluation error: unknown variable ")) {
|
||||
return "This variable is not considered valid. Make sure you used a valid variable.";
|
||||
} else if (error_string == "Factorials are unsupported") {
|
||||
return "";
|
||||
} else {
|
||||
return "Make sure you're using proper syntax! Check console log (press F12) as well for more details.";
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
function updatePlot() {
|
||||
checkVariables();
|
||||
|
||||
if (chart_manager == null) {
|
||||
try {
|
||||
chart_manager = ChartManager.new(math_function.value, Number(minX.value), Number(maxX.value), Number(minY.value), Number(maxY.value), Number(num_interval.value), Number(resolution.value));
|
||||
} catch(err) {
|
||||
postErrorStatus("Error during ChartManager creation! Check logs for details.");
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
const test_result = ChartManager.test_func(math_function.value);
|
||||
if (test_result != "") {
|
||||
const error_recommendation = errorRecommend(test_result);
|
||||
let error_status_str = test_result;
|
||||
if (error_recommendation != "") {
|
||||
error_status_str += `\nTip: ${error_recommendation}`;
|
||||
}
|
||||
postErrorStatus(error_status_str);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
postNormalStatus(`Rendering y=${math_function.value}...`);
|
||||
const start = performance.now();
|
||||
chart = chart_manager.update(canvas, math_function.value, Number(minX.value), Number(maxX.value), Number(minY.value), Number(maxY.value), Number(num_interval.value), Number(resolution.value), false); // TODO: improve darkmode support
|
||||
const end = performance.now();
|
||||
|
||||
area_msg.innerText = `Estimated Area: ${chart.get_area()}`;
|
||||
|
||||
postNormalStatus(`Rendered ${math_function.innerText} in ${Math.ceil(end - start)}ms`);
|
||||
} catch(err) {
|
||||
postErrorStatus(`Error! check console logs for more detail`);
|
||||
}
|
||||
}
|
||||
@@ -1,18 +0,0 @@
|
||||
{
|
||||
"name": "integral_site",
|
||||
"version": "0.1.0",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"build": "webpack --config webpack.config.js",
|
||||
"start": "webpack-dev-server"
|
||||
},
|
||||
"dependencies": {
|
||||
"integral_site": "file:../pkg"
|
||||
},
|
||||
"devDependencies": {
|
||||
"webpack": "^4.43.0",
|
||||
"webpack-cli": "^3.3.11",
|
||||
"webpack-dev-server": "^3.10.3",
|
||||
"copy-webpack-plugin": "^5.0.0"
|
||||
}
|
||||
}
|
||||
102
www/style.css
102
www/style.css
@@ -1,55 +1,81 @@
|
||||
html, body, main {
|
||||
width: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
html {
|
||||
/* Remove touch delay: */
|
||||
touch-action: manipulation;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: auto;
|
||||
max-width: 800px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
/* Light mode background color for what is not covered by the egui canvas,
|
||||
or where the egui canvas is translucent. */
|
||||
background: #909090;
|
||||
}
|
||||
|
||||
@media (max-width: 800px) {
|
||||
@media (prefers-color-scheme: dark) {
|
||||
body {
|
||||
padding: 10px;
|
||||
box-sizing: border-box;
|
||||
/* Dark mode background color for what is not covered by the egui canvas,
|
||||
or where the egui canvas is translucent. */
|
||||
background: #404040;
|
||||
}
|
||||
}
|
||||
|
||||
main {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
align-items: center;
|
||||
/* Allow canvas to fill entire web page: */
|
||||
html,
|
||||
body {
|
||||
overflow: hidden;
|
||||
margin: 0 !important;
|
||||
padding: 0 !important;
|
||||
}
|
||||
|
||||
#coord, #status {
|
||||
color: grey;
|
||||
font-size: 10px;
|
||||
height: 15px
|
||||
/* Position canvas in center-top: */
|
||||
canvas {
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 0%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, 0%);
|
||||
}
|
||||
|
||||
#control {
|
||||
margin-top: 1em;
|
||||
}
|
||||
|
||||
#control label {
|
||||
font-weight: bold;
|
||||
margin-right: 1em;
|
||||
}
|
||||
|
||||
#control select {
|
||||
padding: 0.25em 0.5em;
|
||||
}
|
||||
|
||||
footer {
|
||||
margin-top: 2em;
|
||||
font-size: 12px;
|
||||
.centered {
|
||||
margin-right: auto;
|
||||
margin-left: auto;
|
||||
display: block;
|
||||
position: absolute;
|
||||
top: 50%;
|
||||
left: 50%;
|
||||
transform: translate(-50%, -50%);
|
||||
color: #f0f0f0;
|
||||
font-size: 24px;
|
||||
font-family: Ubuntu-Light, Helvetica, sans-serif;
|
||||
text-align: center;
|
||||
}
|
||||
|
||||
.hide {
|
||||
visibility: hidden;
|
||||
height: 0px;
|
||||
/* ---------------------------------------------- */
|
||||
/* Loading animation from https://loading.io/css/ */
|
||||
.lds-dual-ring {
|
||||
display: inline-block;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
}
|
||||
|
||||
.lds-dual-ring:after {
|
||||
content: " ";
|
||||
display: block;
|
||||
width: 24px;
|
||||
height: 24px;
|
||||
margin: 0px;
|
||||
border-radius: 50%;
|
||||
border: 3px solid #fff;
|
||||
border-color: #fff transparent #fff transparent;
|
||||
animation: lds-dual-ring 1.2s linear infinite;
|
||||
}
|
||||
|
||||
@keyframes lds-dual-ring {
|
||||
0% {
|
||||
transform: rotate(0deg);
|
||||
}
|
||||
|
||||
100% {
|
||||
transform: rotate(360deg);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,498 +0,0 @@
|
||||
html {
|
||||
font-size: 100%;
|
||||
overflow-y: scroll;
|
||||
-webkit-text-size-adjust: 100%;
|
||||
-ms-text-size-adjust: 100%;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
input,
|
||||
body {
|
||||
color: #c9d1d9;
|
||||
font-family: 'Open Sans', sans-serif;
|
||||
font-size: 12px;
|
||||
line-height: 1.5em;
|
||||
padding: 1em;
|
||||
margin: auto;
|
||||
max-width: 52em;
|
||||
/* github dark color:
|
||||
background: #0d1117; */
|
||||
|
||||
/* duckduckgo dark color */
|
||||
background: #1c1c1c;
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
input,
|
||||
body {
|
||||
color: #444;
|
||||
font-family: 'Open Sans', sans-serif;
|
||||
font-size: 12px;
|
||||
line-height: 1.5em;
|
||||
padding: 1em;
|
||||
margin: auto;
|
||||
max-width: 52em;
|
||||
background: #fefefe;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
/* Links */
|
||||
a {
|
||||
color: #58a6ff;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Visited Links */
|
||||
a:visited {
|
||||
color: #58a6ff;
|
||||
}
|
||||
|
||||
/* Links that are being hovered over */
|
||||
a:hover {
|
||||
color: #58a6ff;
|
||||
cursor:pointer;
|
||||
}
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: light) {
|
||||
/* Links */
|
||||
a {
|
||||
color: #0645ad;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Visited Links */
|
||||
a:visited {
|
||||
color: #0b0080;
|
||||
}
|
||||
|
||||
/* Links that are being hovered over */
|
||||
a:hover {
|
||||
color: #06e;
|
||||
cursor:pointer;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
a:active {
|
||||
color: #faa700;
|
||||
}
|
||||
|
||||
a:focus {
|
||||
outline: thin dotted;
|
||||
}
|
||||
|
||||
a:hover,
|
||||
a:active {
|
||||
outline: 0;
|
||||
}
|
||||
|
||||
/* Paragraph selected (Legacy firefox 61 and below) */
|
||||
::-moz-selection {
|
||||
background: rgba(255, 255, 0, 0.3);
|
||||
color: #000;
|
||||
}
|
||||
|
||||
/* Paragraph selected */
|
||||
::selection {
|
||||
background: rgba(255, 255, 0, 0.3);
|
||||
color: #000;
|
||||
}
|
||||
|
||||
/* Paragraph selected (Legacy firefox 61 and below) */
|
||||
a::-moz-selection {
|
||||
background: rgba(255, 255, 0, 0.3);
|
||||
color: #0645ad;
|
||||
}
|
||||
|
||||
/* Paragraph selected */
|
||||
a::selection {
|
||||
background: rgba(255, 255, 0, 0.3);
|
||||
color: #0645ad;
|
||||
}
|
||||
|
||||
|
||||
p {
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
|
||||
/* Inline code snippets */
|
||||
@media (prefers-color-scheme: dark) {
|
||||
code {
|
||||
border-radius: 5px;
|
||||
-moz-border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
border: 1px solid #2f333a;
|
||||
padding: 2px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Inline code snippets */
|
||||
@media (prefers-color-scheme: light) {
|
||||
code {
|
||||
border-radius: 5px;
|
||||
-moz-border-radius: 5px;
|
||||
-webkit-border-radius: 5px;
|
||||
border: 1px solid #BCBEC0;
|
||||
padding: 2px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Post-Inline code snippets */
|
||||
pre code {
|
||||
border-radius: 0px;
|
||||
-moz-border-radius: 0px;
|
||||
-webkit-border-radius: 0px;
|
||||
border: 0px;
|
||||
padding: 2px;
|
||||
}
|
||||
|
||||
|
||||
/* Headers */
|
||||
@media (prefers-color-scheme: dark) {
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-weight: 600;
|
||||
color: #c9d1d9;
|
||||
line-height: 1em;
|
||||
}
|
||||
}
|
||||
|
||||
/* Headers */
|
||||
@media (prefers-color-scheme: light) {
|
||||
h1,
|
||||
h2,
|
||||
h3,
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-weight: 600;
|
||||
color: #111;
|
||||
line-height: 1em;
|
||||
}
|
||||
}
|
||||
|
||||
h4,
|
||||
h5,
|
||||
h6 {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-size: 2em;
|
||||
}
|
||||
|
||||
h2 {
|
||||
font-size: 1.3em;
|
||||
padding-top: 30px;
|
||||
}
|
||||
|
||||
h3 {
|
||||
font-size: 1.1em;
|
||||
padding-top: 10px;
|
||||
}
|
||||
|
||||
h4 {
|
||||
font-size: 0.9em;
|
||||
padding-top: 5px;
|
||||
}
|
||||
|
||||
h5 {
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
h6 {
|
||||
font-size: 0.9em;
|
||||
}
|
||||
|
||||
|
||||
blockquote {
|
||||
color: #666666;
|
||||
margin: 0;
|
||||
padding-left: 3em;
|
||||
border-left: 0.5em #eee solid;
|
||||
}
|
||||
|
||||
hr {
|
||||
display: block;
|
||||
border: 0;
|
||||
border-top: 1px solid #aaa;
|
||||
border-bottom: 1px solid #eee;
|
||||
margin: 1em 0;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
pre,
|
||||
code,
|
||||
kbd,
|
||||
samp {
|
||||
font-family: 'Fira Code', monospace;
|
||||
font-size: 0.98em;
|
||||
}
|
||||
|
||||
/* Markdown code block */
|
||||
@media (prefers-color-scheme: dark) {
|
||||
pre {
|
||||
white-space: pre;
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
/* Use with "github dark" background: */
|
||||
/* background-color: #1f2227; */
|
||||
/* Use with "duckduckgo dark" background: */
|
||||
background-color: #202325;
|
||||
padding: 10px 15px;
|
||||
}
|
||||
}
|
||||
|
||||
/* Markdown code block */
|
||||
@media (prefers-color-scheme: light) {
|
||||
pre {
|
||||
white-space: pre;
|
||||
white-space: pre-wrap;
|
||||
word-wrap: break-word;
|
||||
background-color: #eee;
|
||||
padding: 10px 15px;
|
||||
}
|
||||
}
|
||||
|
||||
b,
|
||||
strong {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
dfn {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
ins {
|
||||
background: #ff9;
|
||||
color: #000;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
mark {
|
||||
background: #ff0;
|
||||
color: #000;
|
||||
font-style: italic;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
sub,
|
||||
sup {
|
||||
font-size: 75%;
|
||||
line-height: 0;
|
||||
position: relative;
|
||||
vertical-align: baseline;
|
||||
}
|
||||
|
||||
sup {
|
||||
top: -0.5em;
|
||||
}
|
||||
|
||||
sub {
|
||||
bottom: -0.25em;
|
||||
}
|
||||
|
||||
ul,
|
||||
ol {
|
||||
margin: 1em 0;
|
||||
padding: 0 0 0 2em;
|
||||
}
|
||||
|
||||
li p:last-child {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
dd {
|
||||
margin: 0 0 0 2em;
|
||||
}
|
||||
|
||||
img {
|
||||
border: 0;
|
||||
-ms-interpolation-mode: bicubic;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0;
|
||||
}
|
||||
|
||||
td {
|
||||
vertical-align: top;
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 480px) {
|
||||
body {
|
||||
font-size: 14px;
|
||||
}
|
||||
.logo {
|
||||
max-height: 30px
|
||||
}
|
||||
}
|
||||
|
||||
@media only screen and (min-width: 768px) {
|
||||
body {
|
||||
font-size: 16px;
|
||||
}
|
||||
.logo {
|
||||
max-height: 40px;
|
||||
}
|
||||
article {
|
||||
margin: 50px 0;
|
||||
}
|
||||
}
|
||||
|
||||
@media print {
|
||||
* {
|
||||
background: transparent !important;
|
||||
color: black !important;
|
||||
filter: none !important;
|
||||
-ms-filter: none !important;
|
||||
}
|
||||
|
||||
body {
|
||||
font-size: 12pt;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
a,
|
||||
a:visited {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
hr {
|
||||
height: 1px;
|
||||
border: 0;
|
||||
border-bottom: 1px solid black;
|
||||
}
|
||||
|
||||
a[href]:after {
|
||||
content: " (" attr(href) ")";
|
||||
}
|
||||
|
||||
abbr[title]:after {
|
||||
content: " (" attr(title) ")";
|
||||
}
|
||||
|
||||
.ir a:after,
|
||||
a[href^="javascript:"]:after,
|
||||
a[href^="#"]:after {
|
||||
content: "";
|
||||
}
|
||||
|
||||
pre,
|
||||
blockquote {
|
||||
border: 1px solid #999;
|
||||
padding-right: 1em;
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
|
||||
tr,
|
||||
img {
|
||||
page-break-inside: avoid;
|
||||
}
|
||||
|
||||
img {
|
||||
max-width: 100% !important;
|
||||
}
|
||||
|
||||
@page :left {
|
||||
margin: 15mm 20mm 15mm 10mm;
|
||||
}
|
||||
|
||||
@page :right {
|
||||
margin: 15mm 10mm 15mm 20mm;
|
||||
}
|
||||
|
||||
p,
|
||||
h2,
|
||||
h3 {
|
||||
orphans: 3;
|
||||
widows: 3;
|
||||
}
|
||||
|
||||
h2,
|
||||
h3 {
|
||||
page-break-after: avoid;
|
||||
}
|
||||
}
|
||||
|
||||
nav ul {
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
list-style-type: none;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
nav ul li {
|
||||
/* This allow us to arrange list items in a row, without using float */
|
||||
display: inline-block;
|
||||
list-style-type: none;
|
||||
}
|
||||
/* Create a style for the first level items */
|
||||
nav > div > ul > li > a {
|
||||
color: #333 !important;
|
||||
display: block;
|
||||
line-height: 2em;
|
||||
padding: 0.5em 0em;
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
nav > div.nav-right > ul > li > a {
|
||||
padding: 0.5em 0.5em;
|
||||
}
|
||||
|
||||
nav > div > ul > li > a:hover {
|
||||
color: #aaa !important;
|
||||
}
|
||||
|
||||
.nav-left {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.nav-left ul li {
|
||||
float: left;
|
||||
}
|
||||
|
||||
.nav-right ul li {
|
||||
float: right;
|
||||
}
|
||||
|
||||
.logo {
|
||||
margin-right: 0.5em
|
||||
}
|
||||
|
||||
article img {
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
p.date {
|
||||
font-size: 13px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
ul.articles {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
#Articles {
|
||||
margin-top: 2em;
|
||||
}
|
||||
|
||||
footer {
|
||||
font-size: 13px;
|
||||
}
|
||||
@@ -1,14 +0,0 @@
|
||||
const CopyWebpackPlugin = require("copy-webpack-plugin");
|
||||
const path = require('path');
|
||||
|
||||
module.exports = {
|
||||
entry: "./bootstrap.js",
|
||||
output: {
|
||||
path: path.resolve(__dirname, "dist"),
|
||||
filename: "bootstrap.js",
|
||||
},
|
||||
mode: "development",
|
||||
plugins: [
|
||||
new CopyWebpackPlugin(['index.html'])
|
||||
],
|
||||
};
|
||||
Reference in New Issue
Block a user