markup::define! { OnboardingPage { h1[style="text-align: center"] { "Welcome to Kittybox" } script[type="module", src="/.kittybox/static/onboarding.js"] {} link[rel="stylesheet", href="/.kittybox/static/onboarding.css"]; form.onboarding[action="", method="POST"] { noscript { p { "Ok, let's be honest. Most of this software doesn't require JS to be enabled " "to view pages (and in some cases, even edit them if logged in)." } p { "This page is a little bit different. It uses JavaScript to provide interactive features, such as:" } ul { li { "Multiple-input questions" } li { "Answers spanning multiple fields" } li { "Preview of files being uploaded" } li { "Pretty pagination so you won't feel overwhelmed" } } p { "Sadly, it's very hard or even impossible to recreate this without any JavaScript. " "Good news though - the code is " b { "open-source AND free software" } " (under GNU AGPLv3) " "and I promise to not obfuscate it or minify it. " a[href="/.kittybox/static/onboarding.js"] { "Here" } "'s the link - you can try reading it so you'll be 200% sure " "it won't steal your cookies or turn your kitty into a soulless monster." @markup::raw("") } hr; p { "In other words: " b { "please enable JavaScript for this page to work properly." } small { "sorry T__T" } } hr; p { "Alternatively, you can POST a following JSON document to this URL:" } pre[class="language-json"] { code { r#"{ // An h-card with your profile information, in MF2-JSON format. "user": { "type": [ "h-card" ], "properties": { "name": [ "Aiden" ], "pronouns": [ "they/them" ], "note": [ "A new blogger on the street." ], "url": [ "https://example.com/" ] } }, // Your first post as an h-entry, in MF2-JSON format. "first_post": { "type": [ "h-entry" ], "properties": { "content": [ "Hello world! (_This supports Markdown, by the way._)" ], } }, // Self-explanatory. "blog_name": "Aiden's Kitty Box!", // Custom feeds to be created, if any. May be left empty. "feeds": [ { "name": "My adventures", "slug": "adventure-log" } ] }"# } } p { "This can be done using any tool you want, such as " code { "curl" } " or " code { "httpie" } "." } } ul #progressbar[style="display: none"] { li #intro { "Introduction" } li #hcard { "Your profile" } li #settings { "Your website" } li #firstpost { "Your first post" } } fieldset #intro[style="display: none"] { legend { "Introduction" } p { "Kittybox is a CMS that can act as a member of the IndieWeb. " "IndieWeb is a global distributed social network built on top of open Web standards " "and composed of blogs around the Internet supporting these standards." } p { "There is no registration or centralized database of any sort - everyone owns their data and is responsible for it." } p { "If you're seeing this page, it looks like your configuration is correct and we can proceed with the setup." } div.switch_card_buttons { button.switch_card.next_card[type="button", "data-card"="hcard"] { "Next" } } } fieldset #hcard[style="display: none"] { legend { "Your profile" } p { "An h-card is an IndieWeb social profile, and we're gonna make you one!" } p { "Thanks to some clever markup, it will be readable by both humans and machines looking at your homepage."} p { "If you make a mistake, don't worry, you're gonna be able to edit this later." "The only mandatory field is your name." } div.form_group { label[for="hcard_name"] { "Your name" } input #hcard_name[name="hcard_name", placeholder="Your name"]; small { "No need to write the name as in your passport, this is not a legal document " "- just write how you want to be called on the network. This name will be also " "shown whenever you leave a comment on someone else's post using your website." } } div.form_group { label[for="pronouns"] { "Your pronouns" } div.multi_input #pronouns { template { input #hcard_pronouns[name="hcard_pronouns", placeholder="they/them?"]; } button.add_more[type="button", "aria-label"="Add more"] { "[+] Add more" } } small { "Write which pronouns you use for yourself. It's a free-form field " "so don't feel constrained - but keep it compact, as it'll be shown in a lot of places." } } div.form_group { label[for="urls"] { "Links to other pages of you" } div.multi_input #urls { template { input #hcard_url[name="hcard_url", placeholder="https://example.com/"]; } button.add_more[type="button", "aria-label"="Add more"] { "[+] Add more" } } small { "These URLs will help your readers find you elsewhere and will help you that whoever owns these pages owns your website too" " in case the links are mutual. So make sure to put a link to your site in your other social profiles!" } } div.form_group { label[for="hcard_note"] { "A little about yourself" } textarea #hcard_note[name="hcard_note", placeholder="Loves cooking, plants, cats, dogs and racoons."] {} small { "A little bit of introduction. Just one paragraph, and note, you can't use HTML here (yet)." } // TODO: HTML e-note instead of p-note } // TODO: u-photo upload - needs media endpoint cooperation div.switch_card_buttons { button.switch_card.prev_card[type="button", "data-card"="intro"] { "Previous" } button.switch_card.next_card[type="button", "data-card"="settings"] { "Next" } } } fieldset #settings[style="display: none"] { legend { "Your website" } p { "Ok, it's nice to know you more. Tell me about what you'll be writing and how you want to name your blog." } // TODO: site-name, saved to settings div.form_group { label[for="blog_name"] { "Your website's name"} input #blog_name[name="blog_name", placeholder="Kitty Box!"]; small { "It'll get shown in the title of your blog, in the upper left corner!" } } div.form_group { label[for="custom_feeds"] { "Custom feeds" } small { p { "You can set up custom feeds to post your stuff to. " "This is a nice way to organize stuff into huge folders, like all your trips or your quantified-self data." } p { "Feeds can be followed individually, which makes it easy for users who are interested in certain types " "of content you produce to follow your adventures in certain areas of your life without cluttering their " "readers." } p { "We will automatically create some feeds for you aside from these so you won't have to - including a main feed, " "address book (for venues you go to and people you talk about), a cookbook for your recipes and some more." // TODO: Put a link to documentation explaining feeds in more detail. } } div.multi_input #custom_feeds { template { fieldset.feed { div.form_group { label[for="feed_name"] { "Name" } input #feed_name[name="feed_name", placeholder="My cool feed"]; small { "This is a name that will identify this feed to the user. Make it short and descriptive!" } } div.form_group { label[for="feed_slug"] { "Slug" } input #feed_slug[name="feed_slug", placeholder="my-cool-feed"]; small { "This will form a pretty URL for the feed. For example: https://example.com/feeds/my-cool-feed" } } } } button.add_more[type="button", "aria-label"="Add more"] { "[+] Add More" } } } div.switch_card_buttons { button.switch_card.prev_card[type="button", "data-card"="hcard"] { "Previous" } button.switch_card.next_card[type="button", "data-card"="firstpost"] { "Next" } } } fieldset #firstpost[style="display: none"] { legend { "Your first post" } p { "Maybe you should start writing your first posts now. How about a short note?" } p { "A note is a short-form post (not unlike a tweet - but without the actual character limit) that doesn't bear a title." } p { "Consider telling more about yourself, your skills and interests in this note " @markup::raw("—") " though you're free to write anything you want. (By the way, you can use " a[href="https://daringfireball.net/projects/markdown/syntax"] { "Markdown" } " here to spice up your note!)" } textarea #first_post_content[style="width: 100%; height: 8em", placeholder="Hello! I am really excited about #IndieWeb"] {} div.switch_card_buttons { button.switch_card.prev_card[type="button", "data-card"="settings"] { "Previous" } button[type="submit"] { "Finish" } } } } } }