reorganized files

This commit is contained in:
Nico Melone
2025-09-18 16:59:30 -05:00
parent e5d6ed6e7e
commit 2617eade47
36 changed files with 811 additions and 4 deletions

118
app/static/css/motion.css Normal file
View File

@@ -0,0 +1,118 @@
.motion-test-1 {
width: 100px;
height: 100px;
background-color: red;
position: relative;
animation-name: color-move;
animation-duration: 4s;
animation-iteration-count: infinite; /* can be left off to run once, specify a number as desired or inifinite */
animation-direction: alternate; /* can be left off for forward, reverse, alternate (forward then reverse), alternate-reverse (reverse then forward) */
}
.motion-test-2 {
width: 100px;
height: 50px;
background-color: red;
position: relative;
animation: from-to 5s; /* combines multiple animation options together for shorthand (name, duration, timing, delay, interations, direction)*/
animation-iteration-count: infinite; /* can be left off to run once, specify a number as desired or inifinite */
animation-direction: alternate; /* can be left off for forward, reverse, alternate (forward then reverse), alternate-reverse (reverse then forward) */
}
.dot {
height: 3em;
width: 3em;
background-color: #bbb;
border-radius: 50%; /*this makes the circle*/
border: 3px solid blue;
display: inline-block;
position: relative;
animation: 3s ease-in infinite percent ;
}
#linear {
animation-timing-function: linear;
}
#ease {
animation-timing-function: ease;
}
#ease-in {
animation-timing-function: ease-in;
}
#ease-out {
animation-timing-function: ease-out;
}
#ease-in-out {
animation-timing-function: ease-in-out;
}
/* from-to pattern where from is 0% and to is 100% can only have these two options */
@keyframes from-to {
from {
left: 0px;
}
to {
left: 300px;
}
}
/* % pattern where each line denotes the starting percent of the style */
@keyframes percent {
0% {
background-color: red;
border: .25em solid green;
}
50% {
background-color: yellow;
border: .75em solid blue;
}
100% {
background-color: red;
border: .25em solid green;
}
}
/* uses pixel postions from 0,0 being top-left corner to move the element around
NEEDS: "position: relative;" on element to work
*/
@keyframes color-move {
0% {
background-color: red;
left: 0px;
top: 0px;
}
25% {
background-color: yellow;
left: 200px;
top: 0px;
transform: scale(1.5);
}
50% {
background-color: blue;
left: 200px;
top: 200px;
transform: scale(2);
}
75% {
background-color: green;
left: 0px;
top: 200px;
transform: scale(1.5);
}
100% {
background-color: red;
left: 0px;
top: 0px;
}
}

View File

@@ -0,0 +1,673 @@
@import url(https://unpkg.com/leaflet@1.9.4/dist/leaflet.css);
body {
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
font-family: -apple-system, BlinkMacSystemFont, Segoe UI, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif;
margin: 0;
}
code {
font-family: source-code-pro, Menlo, Monaco, Consolas, Courier New, monospace;
}
.leaflet-image-layer,
.leaflet-layer,
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-pane,
.leaflet-pane > canvas,
.leaflet-pane > svg,
.leaflet-tile,
.leaflet-tile-container,
.leaflet-zoom-box {
left: 0;
position: absolute;
top: 0;
}
.leaflet-container {
overflow: hidden;
}
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-tile {
-webkit-user-drag: none;
-webkit-user-select: none;
user-select: none;
}
.leaflet-tile::selection {
background: #0000;
}
.leaflet-safari .leaflet-tile {
image-rendering: -webkit-optimize-contrast;
}
.leaflet-safari .leaflet-tile-container {
height: 1600px;
-webkit-transform-origin: 0 0;
width: 1600px;
}
.leaflet-marker-icon,
.leaflet-marker-shadow {
display: block;
}
.leaflet-container .leaflet-overlay-pane svg {
max-height: none !important;
max-width: none !important;
}
.leaflet-container .leaflet-marker-pane img,
.leaflet-container .leaflet-shadow-pane img,
.leaflet-container .leaflet-tile,
.leaflet-container .leaflet-tile-pane img,
.leaflet-container img.leaflet-image-layer {
max-height: none !important;
max-width: none !important;
padding: 0;
width: auto;
}
.leaflet-container img.leaflet-tile {
mix-blend-mode: plus-lighter;
}
.leaflet-container.leaflet-touch-zoom {
touch-action: pan-x pan-y;
}
.leaflet-container.leaflet-touch-drag {
touch-action: none;
touch-action: pinch-zoom;
}
.leaflet-container.leaflet-touch-drag.leaflet-touch-zoom {
touch-action: none;
}
.leaflet-container {
-webkit-tap-highlight-color: transparent;
}
.leaflet-container a {
-webkit-tap-highlight-color: rgba(51, 181, 229, 0.4);
}
.leaflet-tile {
filter: inherit;
visibility: hidden;
}
.leaflet-tile-loaded {
visibility: inherit;
}
.leaflet-zoom-box {
box-sizing: border-box;
height: 0;
width: 0;
z-index: 800;
}
.leaflet-overlay-pane svg {
-moz-user-select: none;
}
.leaflet-pane {
z-index: 400;
}
.leaflet-tile-pane {
z-index: 200;
}
.leaflet-overlay-pane {
z-index: 400;
}
.leaflet-shadow-pane {
z-index: 500;
}
.leaflet-marker-pane {
z-index: 600;
}
.leaflet-tooltip-pane {
z-index: 650;
}
.leaflet-popup-pane {
z-index: 700;
}
.leaflet-map-pane canvas {
z-index: 100;
}
.leaflet-map-pane svg {
z-index: 200;
}
.leaflet-vml-shape {
height: 1px;
width: 1px;
}
.lvml {
behavior: url(#default#VML);
display: inline-block;
position: absolute;
}
.leaflet-control {
pointer-events: visiblePainted;
pointer-events: auto;
position: relative;
z-index: 800;
}
.leaflet-bottom,
.leaflet-top {
pointer-events: none;
position: absolute;
z-index: 1000;
}
.leaflet-top {
top: 0;
}
.leaflet-right {
right: 0;
}
.leaflet-bottom {
bottom: 0;
}
.leaflet-left {
left: 0;
}
.leaflet-control {
clear: both;
float: left;
}
.leaflet-right .leaflet-control {
float: right;
}
.leaflet-top .leaflet-control {
margin-top: 10px;
}
.leaflet-bottom .leaflet-control {
margin-bottom: 10px;
}
.leaflet-left .leaflet-control {
margin-left: 10px;
}
.leaflet-right .leaflet-control {
margin-right: 10px;
}
.leaflet-fade-anim .leaflet-popup {
opacity: 0;
transition: opacity 0.2s linear;
}
.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
opacity: 1;
}
.leaflet-zoom-animated {
transform-origin: 0 0;
}
svg.leaflet-zoom-animated {
will-change: transform;
}
.leaflet-zoom-anim .leaflet-zoom-animated {
transition: transform 0.25s cubic-bezier(0, 0, 0.25, 1);
}
.leaflet-pan-anim .leaflet-tile,
.leaflet-zoom-anim .leaflet-tile {
transition: none;
}
.leaflet-zoom-anim .leaflet-zoom-hide {
visibility: hidden;
}
.leaflet-interactive {
cursor: pointer;
}
.leaflet-grab {
cursor: grab;
}
.leaflet-crosshair,
.leaflet-crosshair .leaflet-interactive {
cursor: crosshair;
}
.leaflet-control,
.leaflet-popup-pane {
cursor: auto;
}
.leaflet-dragging .leaflet-grab,
.leaflet-dragging .leaflet-grab .leaflet-interactive,
.leaflet-dragging .leaflet-marker-draggable {
cursor: move;
cursor: grabbing;
}
.leaflet-image-layer,
.leaflet-marker-icon,
.leaflet-marker-shadow,
.leaflet-pane > svg path,
.leaflet-tile-container {
pointer-events: none;
}
.leaflet-image-layer.leaflet-interactive,
.leaflet-marker-icon.leaflet-interactive,
.leaflet-pane > svg path.leaflet-interactive,
svg.leaflet-image-layer.leaflet-interactive path {
pointer-events: visiblePainted;
pointer-events: auto;
}
.leaflet-container {
background: #ddd;
outline-offset: 1px;
}
.leaflet-container a {
color: #0078a8;
}
.leaflet-zoom-box {
background: #ffffff80;
border: 2px dotted #38f;
}
.leaflet-container {
font-family: Helvetica Neue, Arial, Helvetica, sans-serif;
font-size: 12px;
font-size: 0.75rem;
line-height: 1.5;
}
.leaflet-bar {
border-radius: 4px;
box-shadow: 0 1px 5px #000000a6;
}
.leaflet-bar a {
background-color: #fff;
border-bottom: 1px solid #ccc;
color: #000;
display: block;
height: 26px;
line-height: 26px;
text-align: center;
text-decoration: none;
width: 26px;
}
.leaflet-bar a,
.leaflet-control-layers-toggle {
background-position: 50% 50%;
background-repeat: no-repeat;
display: block;
}
.leaflet-bar a:focus,
.leaflet-bar a:hover {
background-color: #f4f4f4;
}
.leaflet-bar a:first-child {
border-top-left-radius: 4px;
border-top-right-radius: 4px;
}
.leaflet-bar a:last-child {
border-bottom: none;
border-bottom-left-radius: 4px;
border-bottom-right-radius: 4px;
}
.leaflet-bar a.leaflet-disabled {
background-color: #f4f4f4;
color: #bbb;
cursor: default;
}
.leaflet-touch .leaflet-bar a {
height: 30px;
line-height: 30px;
width: 30px;
}
.leaflet-touch .leaflet-bar a:first-child {
border-top-left-radius: 2px;
border-top-right-radius: 2px;
}
.leaflet-touch .leaflet-bar a:last-child {
border-bottom-left-radius: 2px;
border-bottom-right-radius: 2px;
}
.leaflet-control-zoom-in,
.leaflet-control-zoom-out {
font: 700 18px Lucida Console, Monaco, monospace;
text-indent: 1px;
}
.leaflet-touch .leaflet-control-zoom-in,
.leaflet-touch .leaflet-control-zoom-out {
font-size: 22px;
}
.leaflet-control-layers {
background: #fff;
border-radius: 5px;
box-shadow: 0 1px 5px #0006;
}
.leaflet-control-layers-toggle {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABoAAAAaCAQAAAADQ4RFAAACf0lEQVR4AY1UM3gkARTePdvdoTxXKc+qTl3aU5U6b2Kbkz3Gtq3Zw6ziLGNPzrYx7946Tr6/ee/XeCQ4D3ykPtL5tHno4n0d/h3+xfuWHGLX81cn7r0iTNzjr7LrlxCqPtkbTQEHeqOrTy4Yyt3VCi/IOB0v7rVC7q45Q3Gr5K6jt+3Gl5nCoDD4MtO+j96Wu8atmhGqcNGHObuf8OM/x3AMx38+4Z2sPqzCxRFK2aF2e5Jol56XTLyggAMTL56XOMoS1W4pOyjUcGGQdZxU6qRh7B9Zp+PfpOFlqt0zyDZckPi1ttmIp03jX8gyJ8a/PG2yutpS/Vol7peZIbZcKBAEEheEIAgFbDkz5H6Zrkm2hVWGiXKiF4Ycw0RWKdtC16Q7qe3X4iOMxruonzegJzWaXFrU9utOSsLUmrc0YjeWYjCW4PDMADElpJSSQ0vQvA1Tm6/JlKnqFs1EGyZiFCqnRZTEJJJiKRYzVYzJck2Rm6P4iH+cmSY0YzimYa8l0EtTODFWhcMIMVqdsI2uiTvKmTisIDHJ3od5GILVhBCarCfVRmo4uTjkhrhzkiBV7SsaqS+TzrzM1qpGGUFt28pIySQHR6h7F6KSwGWm97ay+Z+ZqMcEjEWebE7wxCSQwpkhJqoZA5ivCdZDjJepuJ9IQjGGUmuXJdBFUygxVqVsxFsLMbDe8ZbDYVCGKxs+W080max1hFCarCfV+C1KATwcnvE9gRRuMP2prdbWGowm1KB1y+zwMMENkM755cJ2yPDtqhTI6ED1M/82yIDtC/4j4BijjeObflpO9I9MwXTCsSX8jWAFeHr05WoLTJ5G8IQVS/7vwR6ohirYM7f6HzYpogfS3R2OAAAAAElFTkSuQmCC);
height: 36px;
width: 36px;
}
.leaflet-retina .leaflet-control-layers-toggle {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAADQAAAA0CAQAAABvcdNgAAAEsklEQVR4AWL4TydIhpZK1kpWOlg0w3ZXP6D2soBtG42jeI6ZmQTHzAxiTbSJsYLjO9HhP+WOmcuhciVnmHVQcJnp7DFvScowZorad/+V/fVzMdMT2g9Cv9guXGv/7pYOrXh2U+RRR3dSd9JRx6bIFc/ekqHI29JC6pJ5ZEh1yWkhkbcFeSjxgx3L2m1cb1C7bceyxA+CNjT/Ifff+/kDk2u/w/33/IeCMOSaWZ4glosqT3DNnNZQ7Cs58/3Ce5HL78iZH/vKVIaYlqzfdLu8Vi7dnvUbEza5Idt36tquZFldl6N5Z/POLof0XLK61mZCmJSWjVF9tEjUluu74IUXvgttuVIHE7YxSkaYhJZam7yiM9Pv82JYfl9nptxZaxMJE4YSPty+vF0+Y2up9d3wwijfjZbabqm/3bZ9ecKHsiGmRflnn1MW4pjHf9oLufyn2z3y1D6n8g8TZhxyzipLNPnAUpsOiuWimg52psrTZYnOWYNDTMuWBWa0tJb4rgq1UvmutpaYEbZlwU3CLJm/ayYjHW5/h7xWLn9Hh1vepDkyf7dE7MtT5LR4e7yYpHrkhOUpEfssBLq2pPhAqoSWKUkk7EDqkmK6RrCEzqDjhNDWNE+XSMvkJRDWlZTmCW0l0PHQGRZY5t1L83kT0Y3l2SItk5JAWHl2dCOBm+fPu3fo5/3v61RMCO9Jx2EEYYhb0rmNQMX/vm7gqOEJLcXTGw3CAuRNeyaPWwjR8PRqKQ1PDA/dpv+on9Shox52WFnx0KY8onHayrJzm87i5h9xGw/tfkev0jGsQizqezUKjk12hBMKJ4kbCqGPVNXudyyrShovGw5CgxsRICxF6aRmSjlBnHRzg7Gx8fKqEubI2rahQYdR1YgDIRQO7JvQyD52hoIQx0mxa0ODtW2Iozn1le2iIRdzwWewedyZzewidueOGqlsn1MvcnQpuVwLGG3/IR1hIKxCjelIDZ8ldqWz25jWAsnldEnK0Zxro19TGVb2ffIZEsIO89EIEDvKMPrzmBOQcKQ+rroye6NgRRxqR4U8EAkz0CL6uSGOm6KQCdWjvjRiSP1BPalCRS5iQYiEIvxuBMJEWgzSoHADcVMuN7IuqqTeyUPq22qFimFtxDyBBJEwNyt6TM88blFHao/6tWWhuuOM4SAK4EI4QmFHA+SEyWlp4EQoJ13cYGzMu7yszEIBOm2rVmHUNqwAIQabISNMRstmdhNWcFLsSm+0tjJH1MdRxO5Nx0WDMhCtgD6OKgZeljJqJKc9po8juskR9XN0Y1lZ3mWjLR9JCO1jRDMd0fpYC2VnvjBSEFg7wBENc0R9HFlb0xvF1+TBEpF68d+DHR6IOWVv2BECtxo46hOFUBd/APU57WIoEwJhIi2CdpyZX0m93BZicktMj1AS9dClteUFAUNUIEygRZCtik5zSxI9MubTBH1GOiHsiLJ3OCoSZkILa9PxiN0EbvhsAo8tdAf9Seepd36lGWHmtNANTv5Jd0z4QYyeo/UEJqxKRpg5LZx6btLPsOaEmdMyxYdlc8LMaJnikDlhclqmPiQnTEpLUIZEwkRagjYkEibQErwhkTAKCLQEbUgkzJQWc/0PstHHcfEdQ+UAAAAASUVORK5CYII=);
background-size: 26px 26px;
}
.leaflet-touch .leaflet-control-layers-toggle {
height: 44px;
width: 44px;
}
.leaflet-control-layers .leaflet-control-layers-list,
.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
display: none;
}
.leaflet-control-layers-expanded .leaflet-control-layers-list {
display: block;
position: relative;
}
.leaflet-control-layers-expanded {
background: #fff;
color: #333;
padding: 6px 10px 6px 6px;
}
.leaflet-control-layers-scrollbar {
overflow-x: hidden;
overflow-y: scroll;
padding-right: 5px;
}
.leaflet-control-layers-selector {
margin-top: 2px;
position: relative;
top: 1px;
}
.leaflet-control-layers label {
display: block;
font-size: 13px;
font-size: 1.08333em;
}
.leaflet-control-layers-separator {
border-top: 1px solid #ddd;
height: 0;
margin: 5px -10px 5px -6px;
}
.leaflet-default-icon-path {
background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII=);
}
.leaflet-container .leaflet-control-attribution {
background: #fff;
background: #fffc;
margin: 0;
}
.leaflet-control-attribution,
.leaflet-control-scale-line {
color: #333;
line-height: 1.4;
padding: 0 5px;
}
.leaflet-control-attribution a {
text-decoration: none;
}
.leaflet-control-attribution a:focus,
.leaflet-control-attribution a:hover {
text-decoration: underline;
}
.leaflet-attribution-flag {
display: inline !important;
height: 0.6669em;
vertical-align: initial !important;
width: 1em;
}
.leaflet-left .leaflet-control-scale {
margin-left: 5px;
}
.leaflet-bottom .leaflet-control-scale {
margin-bottom: 5px;
}
.leaflet-control-scale-line {
background: #fffc;
border: 2px solid #777;
border-top: none;
box-sizing: border-box;
line-height: 1.1;
padding: 2px 5px 1px;
text-shadow: 1px 1px #fff;
white-space: nowrap;
}
.leaflet-control-scale-line:not(:first-child) {
border-bottom: none;
border-top: 2px solid #777;
margin-top: -2px;
}
.leaflet-control-scale-line:not(:first-child):not(:last-child) {
border-bottom: 2px solid #777;
}
.leaflet-touch .leaflet-bar,
.leaflet-touch .leaflet-control-attribution,
.leaflet-touch .leaflet-control-layers {
box-shadow: none;
}
.leaflet-touch .leaflet-bar,
.leaflet-touch .leaflet-control-layers {
background-clip: padding-box;
border: 2px solid #0003;
}
.leaflet-popup {
margin-bottom: 20px;
position: absolute;
text-align: center;
}
.leaflet-popup-content-wrapper {
border-radius: 12px;
padding: 1px;
text-align: left;
}
.leaflet-popup-content {
font-size: 13px;
font-size: 1.08333em;
line-height: 1.3;
margin: 13px 24px 13px 20px;
min-height: 1px;
}
.leaflet-popup-content p {
margin: 1.3em 0;
}
.leaflet-popup-tip-container {
height: 20px;
left: 50%;
margin-left: -20px;
margin-top: -1px;
overflow: hidden;
pointer-events: none;
position: absolute;
width: 40px;
}
.leaflet-popup-tip {
height: 17px;
margin: -10px auto 0;
padding: 1px;
pointer-events: auto;
transform: rotate(45deg);
width: 17px;
}
.leaflet-popup-content-wrapper,
.leaflet-popup-tip {
background: #fff;
box-shadow: 0 3px 14px #0006;
color: #333;
}
.leaflet-container a.leaflet-popup-close-button {
background: #0000;
border: none;
color: #757575;
font: 16px/24px Tahoma, Verdana, sans-serif;
height: 24px;
position: absolute;
right: 0;
text-align: center;
text-decoration: none;
top: 0;
width: 24px;
}
.leaflet-container a.leaflet-popup-close-button:focus,
.leaflet-container a.leaflet-popup-close-button:hover {
color: #585858;
}
.leaflet-popup-scrolled {
overflow: auto;
}
.leaflet-oldie .leaflet-popup-content-wrapper {
-ms-zoom: 1;
}
.leaflet-oldie .leaflet-popup-tip {
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678,M12=0.70710678,M21=-0.70710678,M22=0.70710678);
margin: 0 auto;
width: 24px;
}
.leaflet-oldie .leaflet-control-layers,
.leaflet-oldie .leaflet-control-zoom,
.leaflet-oldie .leaflet-popup-content-wrapper,
.leaflet-oldie .leaflet-popup-tip {
border: 1px solid #999;
}
.leaflet-div-icon {
background: #fff;
border: 1px solid #666;
}
.leaflet-tooltip {
background-color: #fff;
border: 1px solid #fff;
border-radius: 3px;
box-shadow: 0 1px 3px #0006;
color: #222;
padding: 6px;
pointer-events: none;
position: absolute;
-webkit-user-select: none;
user-select: none;
white-space: nowrap;
}
.leaflet-tooltip.leaflet-interactive {
cursor: pointer;
pointer-events: auto;
}
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before,
.leaflet-tooltip-top:before {
background: #0000;
border: 6px solid #0000;
content: "";
pointer-events: none;
position: absolute;
}
.leaflet-tooltip-bottom {
margin-top: 6px;
}
.leaflet-tooltip-top {
margin-top: -6px;
}
.leaflet-tooltip-bottom:before,
.leaflet-tooltip-top:before {
left: 50%;
margin-left: -6px;
}
.leaflet-tooltip-top:before {
border-top-color: #fff;
bottom: 0;
margin-bottom: -12px;
}
.leaflet-tooltip-bottom:before {
border-bottom-color: #fff;
margin-left: -6px;
margin-top: -12px;
top: 0;
}
.leaflet-tooltip-left {
margin-left: -6px;
}
.leaflet-tooltip-right {
margin-left: 6px;
}
.leaflet-tooltip-left:before,
.leaflet-tooltip-right:before {
margin-top: -6px;
top: 50%;
}
.leaflet-tooltip-left:before {
border-left-color: #fff;
margin-right: -12px;
right: 0;
}
.leaflet-tooltip-right:before {
border-right-color: #fff;
left: 0;
margin-left: -12px;
}
@media print {
.leaflet-control {
-webkit-print-color-adjust: exact;
print-color-adjust: exact;
}
}
.App {
background: #f5f5f5;
display: flex;
flex-direction: column;
font-family: system-ui, sans-serif;
height: 100vh;
}
ul {
list-style: none;
padding: 0;
}
li {
margin-bottom: 0.5rem;
}
.main-content {
display: flex;
flex: 1 1 auto;
overflow-y: auto;
overflow: hidden;
z-index: 1;
}
.park-list {
background: #fff;
border-radius: 10px;
border-right: 1px solid #ddd;
overflow-x: hidden;
overflow-y: auto;
padding: 0 0.5rem;
width: 20%;
}
.map-section {
display: flex;
flex: 1 1 auto;
flex-direction: column;
overflow: hidden;
padding: 0 0.5rem;
}
.sticky-header {
background: #fff;
box-shadow: 0 2px 4px #0000001a;
justify-content: space-between;
padding: 0.75rem 1rem;
position: -webkit-sticky;
position: sticky;
top: 0;
z-index: 999;
}
.controls,
.sticky-header {
align-items: center;
display: flex;
}
.controls {
flex-wrap: wrap;
gap: 1rem;
}
.leaflet-container {
border-radius: 10px;
flex: 1 1 auto;
height: 100%;
width: 100%;
}
ul.park-list {
display: flex;
flex-wrap: wrap;
gap: 1rem;
list-style: none;
margin: 0;
padding: 0;
}
.park-card {
background: #fff;
border-radius: 8px;
box-shadow: 0 2px 6px #0000001a;
display: flex;
flex: 1 0 250px;
flex-direction: column;
overflow: hidden;
}
.park-card__img {
display: block;
height: 140px;
object-fit: cover;
width: 100%;
}
.park-card__label {
font-size: 0.9rem;
padding: 0.75rem 0.75rem 1rem;
}
/*# sourceMappingURL=main.149f127c.css.map*/

View File

@@ -0,0 +1,86 @@
.item {
border: 1px solid lightgrey;
min-width: 6em;
width: fit-content;
list-style: none;
padding: 5px;
margin: 5px 0;
border-radius: 5px;
}
.rank {
list-style: none;
margin-top: 10px;
min-width: 6em;
width: 120px;
height: 10px;
background: red;
position: relative;
border-radius: 10px;
}
.rank::before {
content: "";
position: absolute;
right: 0%;
top: -7.5px;
width: 25px;
height: 25px;
border-radius: 50%;
background: red;
}
.flex-container {
display: flex;
flex-wrap: wrap;
justify-content: space-around;
}
.unranked-items {
flex-grow: 1;
text-align: center;
}
.ranked-items {
flex-grow: 1;
text-align: center;
}
#unranked-items {
display: inline-block;
min-height: 7rem;
min-width: 7em;
justify-content: center;
}
#ranked-items {
display: inline-block;
min-height: 7rem;
min-width: 12em;
}
#add-btn {
background: #03df4d;
border: none;
border-radius: 5px;
}
#clear-btn {
background: #e62d2d;
border: none;
border-radius: 5px;
}
.delete {
border: none;
background: none;
}
.delete:hover {
border: none;
background: darkgray;
}
.rank-btns {
border: none;
border-radius: 5px;
background: #03df4d;
}

View File

@@ -0,0 +1,7 @@
h2 {
text-align: center;
}
li {
list-style: none;
}

75
app/static/css/styles.css Normal file
View File

@@ -0,0 +1,75 @@
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
}
header {
background-color: #008C2F;
color: white;
padding: 1em 0;
text-align: center;
}
nav a {
color: white;
margin: 0 15px;
text-decoration: none;
}
main {
padding: 20px;
}
.arrow {
width: 0;
height: 0;
border-left: 8px solid transparent;
border-right: 8px solid transparent;
border-bottom: 20px solid black;
margin: 20px auto;
transform-origin: center;
transition: transform 0.3s ease;
margin-left: 10px;
}
.wind-container {
display: flex; /* Align items horizontally */
align-items: center; /* Vertically center the arrow with the text */
gap: 10px; /* Add spacing between the items */
}
.s-tier {
background-color: #ffeb3b; /* Bright yellow for S-Tier */
color: #000;
}
.a-tier {
background-color: #4caf50; /* Green for A-Tier */
color: #fff;
}
.other-tier {
background-color: #f44336; /* Red for other items */
color: #fff;
}
.mb-2{
list-style-type: none;
}
/* styles.css */
li .nav {
list-style: none;
}
ul .nav {
white-space:nowrap;
text-align: center;
}
nav{
display: inline-block;
}

BIN
app/static/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 MiB

File diff suppressed because one or more lines are too long

147
app/static/js/ranking.js Normal file
View File

@@ -0,0 +1,147 @@
const unranked = document.getElementById("unranked-items");
const ranked = document.getElementById("ranked-items");
const ranks = document.getElementById("ranks");
const addItemButton = document.getElementById("add-btn");
const clearButton = document.getElementById("clear-btn");
const lockButton = document.getElementById("lock-rank-btn");
const addRankButton = document.getElementById("add-rank-btn");
const saveButton = document.getElementById("save-rank-btn");
let locked = false;
const unrankedPool = new Sortable(unranked, {
group: 'items',
animation: 100,
sort: false
})
const rankedPool = new Sortable(ranked, {
group: 'items',
animation: 100
})
const ranksPool = new Sortable(ranks, {
group: {
name: 'items-sorted',
},
animation: 100,
sort: false
})
addItemButton.addEventListener("click", () => {
const newItem = prompt("Name of new item: ");
if (newItem) {
let total = Array.from(unranked.children).length + Array.from(ranked.children).length;
const li = document.createElement("li");
li.className = "item";
li.textContent = newItem;
li.draggable = true;
li.id = String(total) + "-item";
const btn = document.createElement("button");
btn.className = "delete";
btn.textContent = "X";
btn.id = String(total) + "-delete";
btn.setAttribute("onClick", "deleteItem(id);");
li.appendChild(btn);
unranked.appendChild(li);
}
})
clearButton.addEventListener("click", () => {
const userConsent = confirm("Are you sure you want to clear all items from Unranked List?");
if (userConsent) {
Array.from(unranked.children).forEach((value) => {
document.getElementById(value.id).remove()
})
}
})
lockButton.addEventListener("click", () => {
if (locked) {
rankedPool.options.group.name = "items";
rankedPool.options.filter = ".rank";
lockButton.innerText = "Lock Ranks";
Array.from(ranked.children).forEach((value) => {
if (value.className === "item") {
value.children[0].hidden = false;
}
})
locked = false;
} else {
rankedPool.options.group.name = "items-sorted";
rankedPool.options.filter = ".item";
lockButton.innerText = "Unlock Ranks";
Array.from(ranked.children).forEach((value) => {
if (value.className === "item") {
value.children[0].hidden = true;
}
})
locked = true;
}
})
function deleteItem(id) {
//console.log("kill me ("+ id + ")")
const userConsent = confirm("Are you sure?");
if (userConsent) {
let liId = id.split("-")[0] + "-item";
document.getElementById(liId).remove()
//need to handle the id's naming
let index = 0;
Array.from(unranked.children).forEach((value) => {
value.id = index + "-item";
value.children[0].id = index + "-delete";
index++;
})
Array.from(ranked.children).forEach((value) => {
if(value.className === "item"){
value.id = index + "-item";
value.children[0].id = index + "-delete";
index++;
}
})
}
}
/* Basic dragging list options
function dragstart_handler(ev) {
console.log("dragStart");
// Change the source element's background color to signify drag has started
//ev.currentTarget.style.border = "dashed";
// Add the id of the drag source element to the drag data payload so
// it is available when the drop event is fired
ev.dataTransfer.setData("text", ev.target.id);
// Tell the browser both copy and move are possible
ev.effectAllowed = "copyMove";
}
function dragover_handler(ev) {
//console.log("dragOver");
// Change the target element's border to signify a drag over event
// has occurred
ev.currentTarget.style.background = "lightblue";
ev.preventDefault();
}
function drop_handler(ev) {
//console.log("Drop");
ev.preventDefault();
// Get the id of drag source element (that was added to the drag data
// payload by the dragstart event handler)
var id = ev.dataTransfer.getData("text");
// Only Move the element if the source and destination ids are both "move"
if (id.includes("src_move") && ev.target.id == "drop-target"){
ev.target.appendChild(document.getElementById(id));
ev.target.style.background = "white";
}
// Copy the element if the source and destination ids are both "copy"
if (id == "src_copy" && ev.target.id == "dest_copy") {
var nodeCopy = document.getElementById(id).cloneNode(true);
nodeCopy.id = "newId";
ev.target.appendChild(nodeCopy);
}
}
function dragend_handler(ev) {
//console.log("dragEnd");
// Restore source's border
//ev.target.style.border = "solid black";
ev.target.style.background = "white";
} */

102
app/static/js/ranking_ai.js Normal file
View File

@@ -0,0 +1,102 @@
// Make items draggable
const itemsPool = document.getElementById("items-pool");
const rankingArea = document.getElementById("ranking-area");
const ranksPool = document.getElementById("ranks");
const addItemBtn = document.getElementById("add-item-btn");
const addRankBtn = document.getElementById("add-rank-btn");
// Enable drag-and-drop between the pool and ranking area
const sortablePool = new Sortable(itemsPool, {
group: {
name: "shared", // Group name must match between lists
pull: true, // Allow items to be dragged out
put: true, // Allow items to be dropped in
},
animation: 150,
});
const sortableRanking = new Sortable(rankingArea, {
group: {
name: "shared", // Same group name as itemsPool
pull: true, // Allow items to be dragged out
put: true, // Allow items to be dropped in
},
animation: 150,
});
// Add new item functionality
addItemBtn.addEventListener("click", () => {
const newItemText = prompt("Enter new item name:");
if (newItemText) {
const li = document.createElement("li");
li.className = "list-group-item";
li.textContent = newItemText;
li.draggable = true;
itemsPool.appendChild(li);
}
});
// Add new item functionality
addRankBtn.addEventListener("click", () => {
const newItemText = prompt("Enter new rank name:");
if (newItemText) {
const li = document.createElement("li");
li.className = "mb-2";
label = document.createElement('label');
label.innerHTML = newItemText;
input = document.createElement('input');
input.setAttribute("type", "number");
input.setAttribute("class", "form-control");
input.setAttribute("placeholder", "Enter last rank for " + newItemText);
li.appendChild(label)
li.appendChild(input);
//li.draggable = true;
ranksPool.appendChild(li);
}
});
// Save rankings and tier ranges
document.getElementById("save-btn").addEventListener("click", () => {
// Get ranked items
const rankedItems = Array.from(rankingArea.children).map((item) => item.textContent.trim());
const ranks = Array.from(ranksPool.children).map((item) => parseInt(item.lastElementChild.value || "0"));
Array.from(ranks).forEach((item, index) => {
console.log([item, index])
});
const sTierEnd = parseInt(document.getElementById("s-tier-end").value || "0");
const aTierEnd = parseInt(document.getElementById("a-tier-end").value || "0");
// Tier categories
const tiers = {
"S-Tier": rankedItems.slice(0, sTierEnd),
"A-Tier": rankedItems.slice(sTierEnd, aTierEnd),
"Other": rankedItems.slice(aTierEnd),
};
// Apply colors to items based on tiers
Array.from(rankingArea.children).forEach((item, index) => {
item.classList.remove("s-tier", "a-tier", "other-tier"); // Remove existing classes
if (index < sTierEnd) {
item.classList.add("s-tier");
} else if (index < aTierEnd) {
item.classList.add("a-tier");
} else {
item.classList.add("other-tier");
}
});
// Disable dragging
sortableRanking.option("disabled", true); // Disable drag-and-drop for ranking area
sortablePool.option("disabled", true); // Optionally disable pool area too
// Send rankings to the server
fetch("/save-rankings", {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({ rankedItems, tiers }),
})
.then((response) => response.json())
.catch((error) => console.error("Error:", error));
});

77
app/static/stories.json Normal file
View File

@@ -0,0 +1,77 @@
[
{
"chapter": "CHAPTER 1",
"title": "電車/Train",
"text": ["アヤコは毎日電車に乗ります。仕事に行くとき、買い物に行くとき、友達に会うとき、英会話のレッスンに行くとき、映画を見に行くとき、電車に乗ります。","平日に仕事へ行くとき、アヤコは毎日同じ人達と同じ電車に乗ります。週末に出かけるとき、いつも違う人達が電車に乗ります。 アヤコは電車に乗るとき、いつも不思議に思うことがあります。この人達は、どこから来て、どこへ行くのかな? ","今日は6月15日、日曜日の朝です。もうすぐ夏です。とてもいい天気です。今日、アヤコは電車に乗って新しい映画を見に行きます。 アヤコはゆっくり電車の中を見ました。日曜日の朝なので、電車に乗っている人は少ないです。","アヤコの目の前には、小さな男の子と若い男の人が一緒に座っています。男の子はタブレットでビデオを見ています。若い男の人は電車の窓の外を眺めています。この二人は親子かな?生徒と先生かな?","アヤコの隣に、女の人が一人で座っています。その女の人は青いワンピースを着ています。そして、携帯電話でだれかにメッセージを送っています。青いワンピースを着て、どこに行くんだろう?仕事の面接かな?それとも、友達の結婚式かな?","アヤコの隣に、女の人が一人で座っています。その女の人は青いワンピースを着ています。そして、携帯電話でだれかにメッセージを送っています。青いワンピースを着て、どこに行くんだろう?仕事の面接かな?それとも、友達の結婚式かな?", "アヤコは周りを見ます。見たことがある女の人がいます。その女の人はドアの近くに立って、本を読んでいます。", "アヤコは仕事に行くとき、毎日その人を見ます。でも、その女の人と話したことはありません。その女の人はいつも本を読んでいます。", "どうしよう?話してみようかな?", "でも、何を話そうかな?", "アヤコは一生懸命考えます。一分、三分、そして十分が経ちました。次の駅で、アヤコは降りなければいけません。","どうしよう?何を言おう?時間がない。", "電車は次の駅に到着します。その女の人も同じ駅で降りました。","アヤコは急いで電車を降りて、大きな声でその人に話しかけました。","「あの、こんにちは!」","その人は返事をしませんでした。そして、歩いていきました。","アヤコはがっかりしました。","そして、アヤコは映画館に行きました。","アヤコが映画館に着いたとき、その女の人も映画館にいました。","アヤコは、その女の人にあいさつをしようと思いました。","その人は、字幕の映画を見たいので、映画館のスタッフと話していました。","その人は、耳が不自由でした。だから、アヤコがあいさつしたとき、聞こえませんでした。","そして、アヤコはその女の人に手紙を書きました。「一緒に映画を見ませんか?」","今、アヤコは毎日電車でその女の人とノートとペンを使って映画の話をします。"]
},
{
"chapter": "CHAPTER 2",
"title": "登山家 - Mountaineer",
"text": ["登山家は、山にある小屋で暮らしています。一人で元気に暮らしています。","毎朝、三時間山を登ります。そして、野菜を育てて、食べています。","登山家は、病院に行ったことがありません。とても元気なので、病気になったことがありません。","今日も昼にキノコをとりに行きます。登山家は、キノコについてよく知っています。食べられるキノコと食べられないキノコがあります。","その夜、登山家は病気になって、初めて救急車を電話で呼びました。","病院に着いたとき、医者は言いました。","「食べられないキノコを食べましたか?キノコはとても危険なので、気を付けてください。でも、もう大丈夫です。でも、目が悪くなっています。知っていましたか?休んだ方がいいですよ。」","そして、登山家は毎年病院に行って、健康診断を受けます"]
},
{
"chapter": "CHAPTER 3",
"title": "秘密 - Secret",
"text": ["ぼくは、人に言えない秘密があります。この秘密を人に話してはいけません。たぶん、このアパートには住めなくなるでしょう。だから、大家さんにバレてはいけません", "その秘密は、ぼくが飼っているねこです。ねこの名前はトラさんです。黄色と黒の縞模様なので、トラさんと名付けました。","ぼくのアパートは、ペットを飼ってはいけません。大家さんは動物が好きじゃないかもしれません。大家さんは少し怖いので、トラさんは秘密にしたほうがいいです。","トラさんは、三ヶ月前に上司にもらいました。上司は子ねこを三匹飼っていました。だから、ぼくに子ねこを一匹くれました。それがトラさんでした。","ある日、上司はぼくに「ねこは好き?」と聞きました。ぼくは「犬よりねこのほうが好きです」と言いました。そして、次の日、上司はぼくにトラさんをくれました。","ぼくは、半年前にこの町に来ました。家族も友達もいなかったので、少し寂しかったです。でも、今はトラさんがいるので、寂しくありません。","ぼくとトラさんは毎日一緒にご飯を食べます。そして、毎日一緒に寝ます。","「ニャーニャー」","「ただいま」","トラさんはいつも玄関で待っています。家で待っているとき、トラさんは寂しいのかもしれません。もしかしたら、家族と兄弟に会いたいのかもしれません。","今日も家に帰って、玄関のドアを開けました。トラさんがいつものように玄関で待っていました。","「ニャーニャー」","「ただいま」","ぼくはトラさんと話していました。","「かわいいねこですね」","ぼくの後ろに大家さんが立っていました。ぼくはびっくりしました。大家さんはトラさんを見て、言いました。","「一人暮らしは寂しいでしょう」","「すみません。このねこは上司にもらいました。すぐに上司に返します」とぼくは言いました。","「いいですよ。大事にしなさい」","と、大家さんは言って、家に帰りました。"]
},
{
"chapter": "CHAPTER 4",
"title": "発明 - Invention",
"text": ["物語が大好きな科学者は、毎日十冊も小説を読みます。だから、一年で一万冊も本を読みます。そして、毎月新しい小説を買います。でも、すぐに全部読んでしまいます。","ある日、科学者は物語を書く機械を発明しました。その機械は人工知能を持っていて、人間が好きな物語をたくさん書きます。","科学者は喜びました。でも、機械が物語を書くより科学者が読むほうが速いので、科学者はもっと物語がほしいと思います。そして、科学者は機械に言いました。","「もっとたくさん物語を書いて!」","科学者が発明した機械は、物語を書く機械を発明しました。この新しい機械も人間が好きな物語を書くことができます。","科学者は、この新しい機械に頼んでみました。","「たくさん物語を書いて!」","でも、まだ2台の機械が物語を書くより科学者が物語を読むほうが速いです。","科学者が発明した機械は、また物語を書く機械を発明しました。今、科学者は物語を書く機械を3台も持っています。","科学者はいつも新しい物語を読むことができるので、とても幸せです。"]
},
{
"chapter": "CHAPTER 5",
"title": "幼馴染 - Childhood Friends",
"text": ["リコとマイは幼馴染です。リコが三歳になったとき、リコの家族はマイの家の近くに引っ越しました。同い年のリコとマイは、すぐに仲良くなりました。","二人は同じ保育園に行き、同じ小学校に行きました。そして、小学校を卒業して、また同じ中学校に入学しました。","リコとマイはいつも一緒でした。家が近いので、リコとマイはいつも一緒に遊びました。","でも、二人は中学校を卒業して、違う高校に入学しました。","違う高校に入学したけれど、マイとリコはいつも一緒でした。家で一緒に宿題をしたり、ビデオゲームをしたり、流行りのレストランに行ったり、高校の同級生について話したりしました。","二人は高校を卒業しました。リコは看護師の専門学校に進学して、マイは違う町にある大学に進学しました。","リコとマイはだんだん会わなくなりました。そして、マイが一年間オーストラリアに留学して、 話さなくなりました。","リコは、今、病院で働いています。仕事の昼休みに、リコはフェイスブックでマイの写真を見つけました。","「マイは今、何をしているんだろう?」","マイは、東京にある大きな会社で働いていて、彼氏がいるみたいです。","リコはマイにメッセージを送りました。","「マイ、元気?久しぶり!マイが東京から帰ってきたとき、会いたいな」","その日の夜、マイから電話がかかってきました。","「リコ、元気?メッセージありがとう」","二人は、たくさん話をしました。そして、マイは言いました。","「仕事がとても忙しいの。そして、彼氏とケンカをしたの」","マイはそう言って、泣いてしまいました。リコはとても悲しくなりました。","次の日、リコはマイにメッセージを送りました。","「今度、東京に行きたいな。すごくマイに会いたい!」","マイからすぐに返事がきました。","「もちろん!」"]
},
{
"chapter": "CHAPTER 6",
"title": "エレベーター - Elevator",
"text": ["このショッピングモールには、お客さんがたくさんいます。スーツをきた女の人とニット帽をかぶった女の子がエレベーターに乗っています。","エレベーターが突然止まって、電気が消えました。","女性はエレベーターのボタンを全部押しました。でも、ドアは開きませんでした。緊急ボタンも押しました。でも、誰も答えませんでした。","女性は携帯電話をかばんから出して、電話をかけました。「おつかれさまです。警察署の田村です。今、ショッピングモールのエレベーターの中にいます。でも、エレベーターが止まって動きません。少し遅くなります」","「事件ですか?」と、女の子は聞きました。","「ああ、はい、そうです。でも、心配しないでください。ただのスリです」と、女性は言いました。","女の子は「ごくろうさまです」と言いました。","そして、すぐに電気がついて、エレベーターが動きました。","女性が「何階ですか?」と聞きました。女の子は「二階です」と言いました。","二階に着くと、女の子は「さようなら」と言って、エレベーターを降りました。女性がスーツのポケットに手を入れると、女性の携帯電話と財布がありませんでした。","女性が女の子に「待ちなさい!」と言ったとき、エレベーターのドアが閉まりました。","女の子は笑って手を振りました。"]
},
{
"chapter": "CHAPTER 7",
"title": "趣味 - Hobby",
"text": ["「趣味はなんですか?」","ぼくは彼女がほしいので、マッチングアプリに登録しました。だから、最近、この質問をたくさんします。","女の子に会うとき、ぼくはいつも「趣味はなんですか?」と聞きます。女の子が「私はボーリングが趣味です」と答えると、ぼくも「そうですか。ぼくもボーリングが趣味です。一緒にボーリングに行きませんか?」と言って、デートにさそいます。","そして、たくさんボーリングを練習します。","また違う女の子にも「趣味はなんですか?」と聞いて、その女の子が「私は料理が好きです」と答えると、ぼくも「そうですか。ぼくも料理が趣味です。一緒に料理教室に行きませんか?」とデートにさそいます。","そして、一生懸命、料理を練習します。","デートは毎回楽しいです。でも、まだ彼女はいません。","ぼくは、今日もマッチングアプリを見ました。可愛い女の子を見つけたので、メッセージを送りました。","「こんにちは。趣味はなんですか?」","すると、女の子は言いました。","「私の趣味は、なんだろう?とくに趣味はありません。あなたの趣味はなんですか?」","ぼくは、いつも女の子の好きなことを好きだと言うので、困りました。","ぼくの趣味はなんだろう?ぼくは自分の趣味がよくわかりません。","五分考えて、ぼくは言いました。","「ぼくは自分の趣味がわかりません」と、正直に答えました。","女の子からメッセージが来ました。","「私も自分の趣味がわかりません。気が合いそうですね。今度、会いませんか?」","ぼくはびっくりしました。この女の子はうそをついているのかな?でも、会いたいな。","そして、ぼくは「ぜひ、デートしましょう」とメッセージを送りました。"]
},
{
"chapter": "CHAPTER 8",
"title": "働き者 - Hard Worker",
"text": ["このスーパーには、とても真面目で働き者の店員がいます。この店員は、このスーパーがとても好きです。だから、毎日、一生懸命働きます。","でも、この店員には一つだけ不満があります。このスーパーの店長が優しすぎることです。","店長はいつも「いいよ」と言います。ある店員が遅刻したとき、店長は「いいよ」と言いました。そして、他の店員が値段を間違えたときも「いいよ」と言いました。","ある日、真面目な店員は店長に言いました。","「店長は、優しすぎると思います。もっと厳しくなった方がいいと思います」","店長はうなずいて、「そうだね。これからはもう少し厳しくなるね」と答えました。","一週間後、真面目な店員は風邪をひきました。熱があって、頭が痛いので、店長に電話をかけました。「おはようございます。風邪をひいたので、今日は仕事を休んでもいいですか?」と聞きました。","すると、店長は「風邪で休んではいけません。私は厳しい店長ですから」と答えました。","店員は一週間前に言ったことを後悔して「わかりました、これからスーパーに行きます」と言いました。"]
},
{
"chapter": "CHAPTER 9",
"title": "夢 - Dream",
"text": ["コウタは、十八歳になりました。","コウタは料理をするのが好きなので、寿司屋で働いています。コウタの夢は、いつか自分の店を持つことです。","コウタはこの寿司屋で一年も働いています。でも、まだ寿司を握ったことがありません。","コウタは料理長に「寿司を握りたいです」と言いました。","料理長は「まだ寿司を握ってはいけない」と言いました。","一ヵ月後、コウタは寿司屋をやめました。そして、コウタは漁師になりました。","二年経って、コウタは二十歳になりました。","コウタは立派な漁師になりました。コウタは、今、釣った魚を切って、寿司を握ることができます。","コウタは海がとても好きです。海には色んな生き物が住んでいます。","コウタは一度、イルカを見たことがあります。","コウタはベテランの漁師に「イルカについてもっと知りたいです」と言いました。","すると、ベテランの漁師は「大学で勉強しなくちゃいけない」と言いました。","半年後、コウタは漁師をやめて、大学に入りました。","それから九年経ちました。コウタは三十歳になりました。","コウタはイルカの研究者になりました。そして、時々外国に出張します。","色んな国に出張します。そして、外国に行くと色んな人に会います。","コウタは友達に「世界中を旅したい」と言いました。","五年後、コウタは研究者をやめました。コウタは船を買って、世界中を旅しました。そして、毎日日記を書いて、小説も書きました。","それから十五年経ちました。コウタは五十歳になりました。","コウタは今、インドネシアの隣にある島に住んでいます。","その島で、コウタは小さな寿司屋を始めました。そして、小説も書いています。"]
},
{
"chapter": "CHAPTER 10",
"title": "泣き虫 - Crybaby",
"text": ["私は一度も泣いたことがありません。泣くことができないんです。","私の弟は小さいとき、とても泣き虫でした。私は泣くことができないので、弟がうらやましかったです。","弟が泣くと、私の両親は弟に優しくて、それがとてもうらやましかったです。","私もたくさん泣きたかったです。泣こうと思いました。でも、泣けませんでした。","色んな方法を試しました。","感動する映画を見てみました。","『トイストーリー』を見たり、『戦場のピアニスト』を見たり、『おくりびと』を見たりしました。","私の家族は、みんな泣いていました。でも、やっぱり私は泣けませんでした。","私は、玉ねぎをたくさん切ってみました。","お母さんは玉ねぎを切っているとき、たくさん泣きます。でも、やっぱり私は泣けません。","友達や家族の死も想像してみました。","例えば、夜、寝るときに、目を閉じて、おじいちゃんのお葬式を想像してみました。もちろん、このことはおじいちゃんには言ってはいけません。","私はおじいちゃんが大好きなので、とても悲しくなりました。でも、やっぱり泣けませんでした。","私は、どうしても泣けませんでした。弟は、「泣かない方がいいよ」と言いました。でも、私はどうしても泣いてみたいのです。","私は、神様にお願いしました。“一度だけ泣いてみたいです”","すると、神様が「願いを叶えよう」と言いました。","そして、次の日、私は『トイストーリー』を見ました。そして、泣きました。玉ねぎを切ると、涙が出てきました。私はたくさん泣きました。","私はとても嬉しくて、またたくさん泣きました。涙がたくさん出てきました。","やっと泣けました。","嬉しいとき、悲しいとき、楽しいとき、怒ったとき、私はいつも泣きました。私は、世界で一番幸せな人になりました。"]
},
{
"chapter": "CHAPTER 11",
"title": "ある冬の朝 - A Winter Morning",
"text": ["ある冬の朝、私はコーヒーを飲んでいました。","ガタン!ベランダで大きな物音がしました。","「なんだろう?」と思いました。私はベランダに行き、窓を開けました。そこには小さな男が座っていました。","その男は私を見て、言いました。","「助けてください!」","「どうしたんですか?」と、私は聞きました。その男は「しっ!静かに」と言いました。","その男は「助けて!助けて!」と言っているので、私はアパートの中に入れてあげました。","その男は、「やつらが来る、やつらが来る」と言って、アパートに入ってきました。","「誰が来るんですか?」と聞いたけれど、答えてくれません。その男はとても小さかったので、スーツケースの中に隠しました。","そしてすぐに、アパートの玄関のベルが鳴りました。ドアを開けると、背が高くて大きな男が二人立っていました。","「どうしたんですか?」と私は聞きました。その二人の男は、何も言いませんでした。そして、アパートの中へ入ってきました。","その二人の男は、寝室、浴室、トイレ、台所、そして全ての部屋を確認しました。","私はもう一度、「何かあったんですか?」と聞きました。","すると、一人の男が「すみません、説明していませんでした。私たちは刑事です」と言いました。","「この建物に非常に危険な男がいます。この男は一人暮らしのお年寄りを狙います。","さっき、その男がこの建物にいたと電話がありました。","その男は一人暮らしのお年寄りからお金を盗むんです」","私は「その男はここにいます!」と言いました。","そして、私は急いでスーツケースを開けました。しかし、あの小さな男はいませんでした。","「この中にいたんです。まだこのアパートの中にいるかもしれません」","刑事は「気を付けてください」と言って、出ていきました。","ガタン!また大きな音がベランダでしました。","怖かったので、今度はベランダの鍵を閉めました。"]
},
{
"chapter": "CHAPTER 12",
"title": "迷惑メール - Spam Emails",
"text": ["「迷惑メールのフォルダーの中に一通のメールがあります」","私は、いつも迷惑メールはすぐに「ゴミ箱」へ捨てます。でも、今日は少し読みたくて、迷惑メールを開きました。","「明日、私の銀行口座に百万円を入れてください。百万円を入れないと、あなたの秘密をインターネットに公開します」","私は変なメールだと思いました。でも、返信してみようかな?","「メールを読みました。もう少し上手に書いた方がいいと思います。私は大学でライティングを教えています。ライティングを教えてあげますよ」","そして、すぐに返事がきました。","「ぼくは高校生です。将来、作家になりたいと思っています。迷惑メールは練習で、お金をもらえるので書いています。","本当は、このアルバイトは好きじゃありません。どうか、ライティングを教えてくれませんか?」","迷惑なアルバイトだなと思いました。そして、すぐにやめた方がいいと思いました。","「わかりました。でも、まず、そのアルバイトをやめましょう。そのあとで、ライティングを教えてあげます」と返信しました。"]
},
{
"chapter": "CHAPTER 13",
"title": "落とし物 - Lost Item",
"text": ["今日は歯医者の日だったので、隣町にある歯医者までバスで行かなくてはいけませんでした。マリはお昼ご飯を食べて家を出ました。少し前をおじいさんが歩いていました。","マリがバス停に着くと、前を歩いていたおじいさんが列に並んでいました。そして、マリはおじいさんの後ろに並びました。","そのおじいさんは、背が高く、髪が真っ白でした。そして、スーツを着て、帽子を被っていました。","マリは、「このおじいさんはどこへ行くんだろう?」と思いました。","ところが、おじいさんは突然列を離れて、どこかへ歩いていきました。その時、何かが地面に落ちました。","マリはそれを拾って、「落とし物です!」と言いました。でも、おじいさんはもういませんでした。","拾った物を見ると、それは指輪でした。すると、隣町に行くバスが来ました。","マリはとりあえずバスに乗って考えました。どうやっておじいさんに指輪を返そうかな。歯医者さんにいるときも、指輪のことを考えていました。おじいさんは困っているかな?それとも泣いているかな?","夕方、マリはバスに乗って帰ってきて来ました。","マリが指輪を拾ったバス停で降りると、あのおじいさんがバス停のベンチに座っていました。","マリはおじいさんに「すみません」と言いました。「このバス停で指輪を落としませんでしたか?」","おじいさんは驚いてマリの顔を見ました。","「ここで、この指輪を拾ったんです」とマリは言いました。","すると、おじいさんは泣きました。","そして、「ありがとう」と言いました。","「これは、昔、恋人に買ってあげた指輪なんです。","その人は結婚していて、子どももいます。だから、私がこの指輪をずっと持っていました。","その人は、今、不幸にも病気で入院しています。あと一週間しか生きることができません。だから、今から病院に行って、この指輪をあげてきます」","そして、バスが来ました。おじいさんは、マリにもう一度「ありがとう」と言って、バスに乗りました。"]
},
{
"chapter": "CHAPTER 14",
"title": "厄介な住民 - Annoying Neighbor",
"text": ["静かで穏やかな生活を送っているおじいさんがいました。しかし、最近、新しい住民がおじいさんの家の隣に引っ越してきて、おじいさんは悩んでいました。新しい住民は、パーティーが大好きだったのです。","パーティーの日は、一日中ずっと大きな音で音楽をかけました。一週間に三日もパーティーを開きます。","パーティーの日はうるさすぎるので、おじいさんは困りました。","辛抱強いおじいさんは、一年間、我慢しました。でも、隣の住民は毎週パーティーをします。おじいさんは、この問題を解決することを心に決めました。","次の日、隣の住民はまたパーティーを開きました。おじいさんは補聴器を外して、パーティーに行きました。","隣の住民はびっくりしました。でも、パーティーに来ていた友達におじいさんを紹介しました。大きな音で音楽が鳴っていましたが、おじいさんは補聴器をしていないので、聞こえませんでした。","おじいさんは昔話を始めました。つまらなくて、長い話をしました。","おじいさんの話がとてもつまらないので、パーティーに来ていた人たちは家に帰ってしまいました。","それから、おじいさんはパーティーの日は隣の住民の家に行って、つまらない話をしました。いつもおじいさんがつまらない話をするので、隣の住民は、だんだんパーティーは開かなくなりました。","やっと、おじいさんは静かで穏やかな生活を取り戻すことができました。"]
},
{
"chapter": "CHAPTER 15",
"title": "仮説 - Hypothesis",
"text": ["「いってきます」と元気よく言って、ぼくは家を出ました。妻は「いってらっしゃい」と言いました。","ぼくは会社に行かないで、家の後ろにある小さな丘に行きました。そこで、妻を観察しようと思いました。","最近、妻がおかしい。妻はぼくに言えない秘密があるのかもしれない。","キッチンに普段は飲まない高いワインがあった。そして、近所の人が、毎日、色んな人がぼくの家に来ると言っていた。","だから、今日はこっそり妻を観察しようと思った。","ぼくは丘の上で色んな仮説を立ててみた。","妻はインターネットでたくさん買い物をしているのかもしれない。お金をたくさん使ったので、ぼくに言えな","のかもしれない。","もしかしたら、毎日家で高いお酒を飲んでいるのかもしれない。ぼくは毎日会社で働いているので、妻は寂しいのかもしれない。だから、高いワインを買ったのかもしれない。","もしかしたら、浮気をしているのかもしれない。だから、毎日色んな人がぼくの家にくるのかもしれない。","ぼくはたくさん考えて、とても不安になってしまった。","家を見ると、ぼくの妹が来ました。10分後、ぼくの両親も来ました。そして、古い友人や同僚も来ました。","どうしてみんな来たんだろう?何をしているんだろう?ぼくは寂しくなりました。","たくさん考えていると、夜になってしまいました。そして、ぼくは家に帰りました。","家について、ドアを開けました、","「おたんじょうびおめでとう!!」","と、みんなが言いました。","ぼくは驚きました。そして、台所に行くと、テーブルの上に大きなケーキや赤ワインのボトルがありました。","そうだ。今日はぼくの誕生日だ!","「びっくりした?みんな待ってたんだよ!」と、妻が言いました。","「いや、実はね…」ぼくは今日立てた仮説を妻に話しました。妻は笑って「今日はあなたの誕生日だから、許してあげる」と言いました。"]
}
]

1137
app/static/vocab.csv Normal file

File diff suppressed because it is too large Load Diff