Initial import. master
authorJoe Wreschnig <joe.wreschnig@gmail.com>
Sun, 14 Sep 2014 18:23:00 +0000 (20:23 +0200)
committerJoe Wreschnig <joe.wreschnig@gmail.com>
Sun, 14 Sep 2014 18:23:00 +0000 (20:23 +0200)
README.md [new file with mode: 0644]
choice.css [new file with mode: 0644]
choicecss.html [new file with mode: 0644]
yukkuri.css [new file with mode: 0644]

diff --git a/README.md b/README.md
new file mode 100644 (file)
index 0000000..4c8ff65
--- /dev/null
+++ b/README.md
@@ -0,0 +1,6 @@
+# choice.css - Plain CSS Gamebooks
+
+choice.css is a stylesheet you can use to make CYOA-style gamebooks
+using plain HTML and no JavaScript.
+
+Open [choicecss.html] in a browser to see it working.
diff --git a/choice.css b/choice.css
new file mode 100644 (file)
index 0000000..bb47122
--- /dev/null
@@ -0,0 +1,174 @@
+/* The person who associated a work with this deed has dedicated the
+   work to the public domain by waiving all of his or her rights to
+   the work worldwide under copyright law, including all related and
+   neighboring rights, to the extent allowed by law.
+
+   You can copy, modify, distribute and perform the work, even for
+   commercial purposes, all without asking permission.
+
+   See https://creativecommons.org/publicdomain/zero/1.0/ for details.
+*/
+
+/* However, we would appreciate it if you kept this link in the file,
+   to help inform other people about what it does and how they can use
+   it -- https://yukkurigames.com/choicecss/choicecss.html#0
+*/
+
+/* These properties are set to values required for choice.css to
+   function. Do not override them. */
+
+html, body {
+    width: 100%;
+    height: 100%;
+    margin: 0;
+    padding: 0;
+}
+
+html, body, main {
+    overflow: hidden;
+}    
+
+nav, main, section, header {
+    display: block;
+}
+
+main {
+    position: absolute;
+}
+
+section {
+    position: absolute;
+    overflow: auto;
+    -webkit-overflow-scrolling: touch;
+    visibility: hidden;
+    -webkit-box-sizing: border-box;
+    -moz-box-sizing: border-box;
+    box-sizing: border-box;
+    top: 50%;
+    margin: auto;
+    -webkit-transition: all 0.333s, -webkit-transform 0.333s;
+    -moz-transition: all 0.333s;
+    -o-transition: all 0.333s;
+    transition: all 0.333s;
+    -webkit-transition-timing-function: ease-in-out;
+    -moz-transition-timing-function: ease-in-out;
+    -o-transition-timing-function: ease-in-out;
+    transition-timing-function: ease-in-out;
+    opacity: 1;
+    -webkit-transform: translate(0, -50%) scale(1, 1) rotate(0);
+    -moz-transform: translate(0, -50%) scale(1, 1) rotate(0);
+    -ms-transform: translate(0, -50%) scale(1, 1) rotate(0);
+    -o-transform: translate(0, -50%) scale(1, 1) rotate(0);
+    transform: translate(0, -50%) scale(1, 1) rotate(0);
+}
+/* These are three possible appearance transitions for sections.
+   Sections receive a default transition for variety, but may also be
+   manually specified to override the default. */
+
+section:nth-child(3n), section.hpop {
+    /* Horizontal pop-in */
+    -webkit-transform: translate(0, -50%) scale(0, 1) rotate(0);
+    -moz-transform: translate(0, -50%) scale(0, 1) rotate(0);
+    -ms-transform: translate(0, -50%) scale(0, 1) rotate(0);
+    -o-transform: translate(0, -50%) scale(0, 1) rotate(0);
+    transform: translate(0, -50%) scale(0, 1) rotate(0);
+}
+
+section:nth-child(3n+1), section.vpop {
+    /* Vertical pop-in */
+    -webkit-transform: translate(0, -50%) scale(1, 0) rotate(0);
+    -moz-transform: translate(0, -50%) scale(1, 0) rotate(0);
+    -ms-transform: translate(0, -50%) scale(1, 0) rotate(0);
+    -o-transform: translate(0, -50%) scale(1, 0) rotate(0);
+    transform: translate(0, -50%) scale(1, 0) rotate(0);
+}
+
+section:nth-child(3n+2), section.fade {
+    /* Fade in */
+    opacity: 0;
+}
+
+section:target, section:last-child {
+    /* Delay new appearance until the previous section is finishing. */
+    -webkit-transition-delay: 0.25s;
+    -moz-transition-delay: 0.25s;
+    -o-transition-delay: 0.25s;
+    transition-delay: 0.25s;
+
+    /* Reset everything set in the animation styles. */
+    opacity: 1;
+    visibility: visible;
+    -webkit-transform: translate(0, -50%) scale(1, 1) rotate(0);
+    -moz-transform: translate(0, -50%) scale(1, 1) rotate(0);
+    -ms-transform: translate(0, -50%) scale(1, 1) rotate(0);
+    -o-transform: translate(0, -50%) scale(1, 1) rotate(0);
+    transform: translate(0, -50%) scale(1, 1) rotate(0);
+}
+
+
+section:target ~ section:last-child {
+    display: none;
+}
+
+/* These properties may be modified within limits. */
+
+main {
+    /* This needs to be big enough for a reasonable amount of text. */
+    padding: 0.5em;
+    top: 0;
+    bottom: 0;
+    left: 0;
+    right: 0;
+}
+
+section {
+    /* The left and right margins and maximum size may be modified, but
+       must be set (and less than 100%). */
+    left: 0.5em;
+    right: 0.5em;
+    max-width: 35em;
+    max-height: 90%;
+}
+
+@media print {
+    html, body, main {
+        height: auto;
+        width: auto;
+    }
+
+    main {
+        position: static;
+        overflow: auto;
+    }
+
+    section {
+        max-height: none;
+        height: auto;
+        position: static;
+        margin-top: 1em;
+        margin-bottom: 1em;
+        top: auto;
+        -webkit-transform: translate(0, 0) scale(1, 1) rotate(0) !important;
+        -moz-transform: translate(0, 0) scale(1, 1) rotate(0) !important;
+        -ms-transform: translate(0, 0) scale(1, 1) rotate(0) !important;
+        -o-transform: translate(0, 0) scale(1, 1) rotate(0) !important;
+        transform: translate(0, 0) scale(1, 1) rotate(0) !important;
+        opacity: 1 !important;
+        visibility: visible !important;
+    }
+
+    section[id]:before {
+        display: block;
+        content: "(Section #" attr(id) ")";
+    }
+
+    section a[href^="#"]:not(.no-section):after {
+        content: " (section " attr(href) ")";
+    }
+
+    .no-print {
+        display: none;
+    }
+}
+
+/* Most other properties may be modified freely. */
diff --git a/choicecss.html b/choicecss.html
new file mode 100644 (file)
index 0000000..c6e3d3d
--- /dev/null
@@ -0,0 +1,256 @@
+<!DOCTYPE html>
+<html>
+  <!--
+  The person who associated a work with this deed has dedicated the
+  work to the public domain by waiving all of his or her rights to
+  the work worldwide under copyright law, including all related and
+  neighboring rights, to the extent allowed by law.
+  
+  You can copy, modify, distribute and perform the work, even for
+  commercial purposes, all without asking permission.
+
+  See https://creativecommons.org/publicdomain/zero/1.0/ for details.
+  -->
+  <head>
+    <link rel=stylesheet href=choice.css>
+    <link rel=stylesheet href=yukkuri.css>
+    <meta name=description content="choice.css is a stylesheet you can use to make CYOA-style gamebooks using plain HTML and no JavaScript.">
+    <meta name="viewport" content="width=device-width, user-scalable=no">
+    <title>choice.css - Plain HTML Gamebooks ~ Yukkuri Games</title>
+  </head>
+  <body>
+    <header>
+      <nav>
+        <h1><a class=title href="#0">choice.css</a></h1>
+        <a href='https://yukkurigames.com' style="float: left">&#8962;</a>
+        <a href='#license' style="float: right" class=flipX>&copy;</a>
+      </nav>
+    </header>
+    <main>
+      <section id=0>
+        <p>
+          This page is powered by a
+          <a target=_blank href=choice.css>single stylesheet</a> which turns
+          ordinary HTML into a
+          <a href="http://en.wikipedia.org/wiki/Choose_Your_Own_Adventure">
+            <em>Choose Your Own Adventure</em></a>-like
+          <a href="http://en.wikipedia.org/wiki/Gamebook">gamebook</a>,
+          and another that describes its colors. No JavaScript is
+          involved, and the HTML is kept nearly undisturbed.
+        </p>
+        <ul>
+          <li><a href="#how">How do I use it?</a></li>
+          <li><a href="#why">What's the point?</a></li>
+          <li><a href="#why-not">What can't it do?</a></li>
+          <li><a target=_blank href=choice.css>Download <code>choice.css</code></a></li>
+        </ul>
+      </section>
+      <section id=how>
+        <h1><a href="#0" class=no-print>&#9664;</a> How to Use It</h1>
+        <p>
+          To use <code>choice.css</code> you'll need to be at least
+          a little familiar with CSS and HTML.
+        </p>
+        <p>
+          (If you're not comfortable with HTML, consider trying
+          <a href="http://twinery.org/">Twine</a> instead. It's got a
+          graphical interface and a simpler markup format. It's also a
+          good choice if you want to do something more complicated
+          than CYOA.)
+        </p>
+        <h2>Writing Your HTML</h2>
+        <p>
+          The first thing you need is a bare HTML page, including
+          <code>choice.css</code> as a stylesheet. (You can also include
+          it inline between a <code>&lt;style>...&lt;/style></code>
+          block.)
+        </p>
+        <pre>&lt;!DOCTYPE html>
+&lt;html>
+  &lt;head>
+    &lt;link rel=stylesheet href=<a target=_blank href=choice.css>choice.css</a>>
+    &lt;title>...&lt;/title>
+  &lt;/head>
+  &lt;body>
+    &lt;main>
+          ...
+    &lt;/main>
+  &lt;/body>
+&lt;/body></pre>
+        <p>
+          Inside the main block, place a series
+          of <code>&lt;section></code> elements with your writing, and
+          give them each an <code>id</code>:
+        </p>
+        <pre>&lt;section id=example>
+  This is an example section.
+&lt;/section></pre>
+        <p>
+          Then inside each section, you can create links to the other
+          sections with standard HTML links:
+        </p>
+        <pre>&lt;section id=other-example>
+  This is a &lt;a href='#example'>link to that section&lt;/a>.
+&lt;/section></pre>
+        <h2>Transitions</h2>
+        <p>
+          The three different transition styles you'll see on this
+          page (horizontal pop-in, vertical pop-in, and fade) will be
+          applied automatically to create some variety in transitions.
+        </p>
+        <p>
+          If you'd like more manual control, you can use the
+          <code>vpop</code>, <code>hpop</code>, and <code>fade</code>
+          classes on your sections, or write your own using standard
+          <a href="https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Using_CSS_transitions">CSS transitions</a>.
+        </p>
+        <h2>Styling</h2>
+        <p>
+          You can style the rest of the page using CSS normally,
+          as long as you keep the main display structure
+          from <code>choice.css</code> &mdash; the absolutely-positioned,
+          overflow-hiding <code>&lt;main></code> element, and the
+          selectors for <code>&lt;section></code> elements.
+        </p>
+        <p>
+          You can also add more elements. For example, this page adds
+          a header with some navigation links. And while JavaScript
+          isn't required, you can include JavaScript code in your page
+          for more advanced effects.
+        </p>
+        <h2>Errors</h2>
+        <p>
+          If you link to a section that doesn't exist, or the
+          reader types one in manually, you'll see
+          <a href='#busted'>the last section in the page</a>
+          even if you didn't give it an ID. You might want to write
+          your last section with this in mind.
+        </p>
+      </section>
+      <section id=why>
+        <h1><a href="#0" class=no-print>&#9664;</a> Why Bother?</h1>
+        <p>
+          Because...
+        </p>
+        <ul>
+          <li>
+            Modern websites are too complicated. A decade ago, you
+            could open up nearly any site and see how it was made. Now
+            all you get is a mass of minified HTML, CSS, and
+            JavaScript, patching weird features over each other into
+            an unintelligible mess. But today's sites
+            <a onclick='window.open("view-source:" + location.href)'>
+              can still be intelligible</a> while doing new things.
+          </li>
+          <li>
+            <a href="javascript:window.print()">Pages can be printed
+              to paper (or PDF) intact</a>.
+          </li>
+          <li>
+            Bookmarks and sharing links always go to the right part.
+          </li>
+          <li>
+            It works, in an CPU/energy-efficient way, on a wide variety of
+            browser interfaces and input devices.
+          </li>
+          <li>
+            The page's full content can be indexed by search engines,
+            <a href="https://archive.org/">the Internet Archive</a>,
+            and other tools and services.
+          </li>
+          <li>
+            It still works with CSS <em>completely disabled</em>, or
+            in browsers that never supported CSS or JavaScript like
+            <a href="http://lynx.isc.org/">Lynx</a>.
+            You'll just see the sections before and after the current
+            one.
+          </li>
+          <li>
+            Despite their problems, HTML and CSS still strike one
+            of the best balances in computing between ease of writing,
+            ease of learning, and features.
+            <a href='http://www.w3.org/2001/tag/doc/leastPower.html'>The
+              rule of least power</a> remains a good design maxim,
+            and the above are some of its benefits.
+          </li>
+        </ul>
+      </section>
+      <section id=why-not>
+        <h1><a href="#0" class=no-print>&#9664;</a> Why Not?</h1>
+        <ul>
+          <li>
+            It doesn't work in old-but-not-too-old versions
+            of Internet Explorer. (It works in <em>very old</em>
+            versions that don't support CSS or CSS visibility
+            but doesn't work in <em>recently-old</em> versions that
+            support CSS visibility but not CSS transforms.)
+          </li>
+          <li>
+            It's awkward in some mobile browsers, older ones
+            especially. (But so is almost anything not designed
+            specifically for them.)
+          </li>
+          <li>
+            Error handling <a href="#busted">doesn't work very well</a>.
+          </li>
+          <li>
+            Direct links to the page without a #fragment are the same
+            as an error.
+          </li>
+          <li>
+            Without more scripting, it can't do anything like track
+            variables or dynamic content. You could write your own
+            JavaScript, but it might be easier to just
+            <a href="http://twinery.org/">use Twine</a>
+            if you want to do that.
+          </li>
+        </ul>
+      </section>
+      <section id=license>
+        <h1><a href="#0" class=no-print>&#9664;</a> License</h1>
+        <p>
+          <code><a target=_blank href=choice.css>choice.css</a></code> and
+          this demonstration page are
+          <a href="https://creativecommons.org/publicdomain/zero/1.0/">released
+            into the public domain</a>,
+          or as close as possible in your jurisdiction. We waive all our
+          rights to the work worldwide under copyright law, including
+          all related and neighboring rights, to the extent allowed by
+          law.
+        </p>
+        <p>
+          You can copy, modify, distribute and perform the work, even for
+          commercial purposes, all without asking permission.
+        </p>
+        <p>
+          However, we would appreciate it if you kept
+          <a href='#0'>a link to this page</a> in the file when you
+          use it, to help inform other people about what it does and
+          how they can use it too.
+        </p>
+      </section>
+      <section>
+        <p>
+          If the target location is invalid, the last section &mdash;
+          this section &mdash; is displayed, even if it doesn't have
+          an ID. You can put any link you want here, like
+          <a href="#0">back to the first section</a>, or
+          <a href="javascript:history.back()">just plain back</a>.
+        </p>
+        <p>
+          It'd be nicer if the default was the first section, or a
+          special section, but that's not currently possible in CSS.
+          At times <a href="http://dev.w3.org/csswg/selectors4/">CSS Selectors
+          Level 4</a> has included features that would help with this,
+          but they don't work in any browser yet.
+        </p>
+        <p>
+          Or, you could write your page so that the last section is
+          the first one people should read. But that will mess up the
+          order when printing or reading the page without the special
+          stylesheet. And it's just confusing.
+        </p>
+      </section>
+    </main>
+  </body>
+</html>
diff --git a/yukkuri.css b/yukkuri.css
new file mode 100644 (file)
index 0000000..a1984fd
--- /dev/null
@@ -0,0 +1,114 @@
+html {
+    background-color: #E2C0F2;
+    background-image: linear-gradient(#E2C0F2, #F4C7C7 100%);
+    font-size: 16px;
+}
+
+@media (max-width: 320px) {
+    html { font-size: 10px; }
+}
+
+main {
+    top: 1.5em;
+}
+
+[onclick] {
+    cursor: pointer;
+    text-decoration: underline;
+}
+
+section {
+    padding: 1em;
+    box-shadow: 0 0 0 #50257c;
+    border-radius: 0.3333em;
+    background-color: white;
+    font-family: serif;
+    border-bottom: 0.3333em solid #CE84F2;
+    border-top: 0.3333em solid #F47E7E;
+    border-radius: 2em;
+}
+
+section:target {
+    box-shadow: 0 0 0.667em #50257c;
+}
+
+section:before {
+    font-weight: 100;
+    font-size: 0.8em;
+    margin-bottom: 1em;
+}
+
+header {
+    z-index: 1;
+    padding-top: 0.5em;
+    padding-bottom: 0.5em;
+    height: 1em;
+    position: fixed;
+    left: 0;
+    right: 0;
+    background: #9d6bd0;
+    color: white;
+    text-align: center;
+    font-family: sans-serif;
+}
+
+header h1 {
+    display: inline-block;
+    margin: 0;
+    padding: 0;
+    font-size: 1em;
+}
+
+header a {
+    color: white;
+    text-decoration: none;
+}
+
+main a {
+    color: #50257c;
+}
+
+h1, h2 {
+    font-family: sans-serif;
+}
+
+h1 { font-size: 1.5em; font-weight: bold; margin: 0.5em 0; }
+h2 { font-size: 1.0em; font-weight: bold; margin: 0; margin-top: 1em; }
+p { margin: 0.5em; }
+li { margin: 0.5em; }
+
+h1 a {
+    text-decoration: none;
+}
+
+nav {
+    margin: 0 0.25em;
+    font-size: 1.125em;
+    line-height: 1em;
+}
+
+section:before {
+    font-family: sans-serif;
+}
+
+pre, code {
+    font-size: 0.75em;
+}
+
+.flipX {
+    transform: scaleX(-1);
+    -webkit-transform: scaleX(-1);
+}
+    
+@media print {
+    header { position: static; }
+    html {
+        background-color: white;
+        background-image: none;
+    }
+    section {
+        border-left: 0.1667em solid #CE84F2;
+        border-right: 0.1667em solid #F47E7E;
+        box-shadow: 0 0 0.667em #50257c;
+    }
+}