{
 "$schema": "https://playground.wordpress.net/blueprint-schema.json",
 "meta": {
  "title": "Ace Login Block demo",
  "description": "A members sign-in page built with the Login block: passkeys, two-factor and lockout.",
  "author": "shanerounce",
  "categories": [
   "Security"
  ]
 },
 "landingPage": "/wp-login.php",
 "preferredVersions": {
  "php": "8.3",
  "wp": "latest"
 },
 "features": {
  "networking": true
 },
 "steps": [
  {
   "step": "installPlugin",
   "pluginData": {
    "resource": "wordpress.org/plugins",
    "slug": "acemedia-login-block"
   },
   "options": {
    "activate": true
   }
  },
  {
   "step": "installTheme",
   "themeData": {
    "resource": "wordpress.org/themes",
    "slug": "twentytwentyfive"
   },
   "options": {
    "activate": true
   }
  },
  {
   "step": "mkdir",
   "path": "/wordpress/wp-content/mu-plugins"
  },
  {
   "step": "writeFile",
   "path": "/wordpress/wp-content/mu-plugins/nightjar-demo-style.php",
   "data": "<?php\n/* Demo-only styling for the Nightjar Reading Room sign-in page. */\nadd_action('wp_head', function () {\n    if (!is_page('members-sign-in')) {\n        return;\n    }\n    ?>\n<style>\n:root{--nj-ink:#1d2b24;--nj-green:#24453a;--nj-cream:#f5efe4;--nj-clay:#c4643f;--nj-line:#ddd5c6}\nbody{background:var(--nj-cream)}\n.nj-hero{background:linear-gradient(160deg,#24453a 0%,#1a3329 100%);color:#f5efe4;border-radius:28px;overflow:hidden;position:relative}\n.nj-hero:before{content:\"\";position:absolute;inset:0;background:radial-gradient(600px 300px at 15% 10%,rgba(196,100,63,.35),transparent 70%);pointer-events:none}\n.nj-hero h1,.nj-hero h2,.nj-hero p,.nj-hero li{color:#f5efe4}\n.nj-eyebrow{letter-spacing:.14em;text-transform:uppercase;font-size:.8rem;font-weight:600;color:#e8a487!important}\n.nj-perks{list-style:none;padding:0;margin:1.5rem 0 0}\n.nj-perks li{padding:.55rem 0 .55rem 1.9rem;position:relative;border-top:1px solid rgba(245,239,228,.14)}\n.nj-perks li:before{content:\"\";position:absolute;left:0;top:1rem;width:.75rem;height:.75rem;border-radius:50%;background:var(--nj-clay)}\n.nj-card{background:#fff;color:var(--nj-ink);border-radius:22px;box-shadow:0 30px 70px rgba(10,20,15,.35)}\n.nj-card h2{color:var(--nj-ink)!important}\n.nj-card p{color:#5a6460!important}\n.nj-card .wp-block-login-form .wp-block-columns{display:block;margin:0 0 .9rem!important}\n.nj-card .wp-block-login-form .wp-block-column{flex-basis:100%!important;margin:0!important}\n.nj-card .wp-block-login-form .has-text-align-right{text-align:left!important;margin:0 0 .35rem;font-size:.92rem}\n.nj-card .wp-block-login-form .wp-block-columns:last-of-type>.wp-block-column:first-child{display:none}\n.nj-card .wp-block-login-form input[type=text],.nj-card .wp-block-login-form input[type=password],.nj-card .wp-block-login-form input[type=email]{width:100%;box-sizing:border-box;padding:.85rem 1rem;font:inherit;font-size:1rem;border:1px solid var(--nj-line);border-radius:12px;background:#fbf9f5;color:var(--nj-ink)}\n.nj-card .wp-block-login-form input:focus{outline:2px solid var(--nj-clay);outline-offset:1px;border-color:transparent}\n.nj-card .wp-block-login-form label{color:var(--nj-ink)}\n.nj-card .wp-block-login-form .wp-block-buttons{margin-top:1.1rem}\n.nj-card .wp-block-login-form .wp-block-button,.nj-card .wp-block-login-form .wp-block-button__link{width:100%;text-align:center}\n.nj-card .wp-block-login-form .wp-block-button__link{background:var(--nj-green);color:#fff;border-radius:12px;padding:.9rem 1rem;font-weight:600}\n.nj-card .wp-block-login-form .wp-block-button__link:hover{background:var(--nj-clay)}\n.nj-card .wp-block-login-form button.button{margin-top:.6rem;width:100%;padding:.75rem 1rem;border-radius:12px;border:1px solid var(--nj-line);background:#fff;font:inherit;font-weight:600;cursor:pointer}\n.nj-card .wp-block-login-form p[class*=status],.nj-card .wp-block-login-form .description{color:var(--nj-clay)!important;font-weight:500}\n.nj-demo-note{background:#fff3d6;border:1px dashed #d9b25f;border-radius:14px;color:#5b4613}\n.nj-card .wp-block-login-form label:not([for]),.nj-card .wp-block-login-form input[type=checkbox]+*{font-size:.95rem}\n.nj-card .wp-block-login-form p:has(input[type=checkbox]),.nj-card .wp-block-login-form label:has(input[type=checkbox]){font-size:.95rem;display:flex;align-items:center;gap:.5rem}\n@media (max-width:781px){\n.nj-hero{padding:36px 22px!important;border-radius:22px}\n.nj-hero h1{font-size:2.4rem!important}\n.nj-card{padding:28px 22px!important}\n.nj-demo-note{padding:16px 18px!important}\n}\n</style>\n    <?php\n});\n"
  },
  {
   "step": "runPHP",
   "code": "<?php\nrequire '/wordpress/wp-load.php';\nwp_set_current_user(1);\nkses_remove_filters();\n\n$action = esc_url(site_url('wp-login.php'));\n$label = function ($for, $text) {\n    return \"<!-- wp:paragraph {\\\"align\\\":\\\"right\\\",\\\"style\\\":{\\\"typography\\\":{\\\"textAlign\\\":\\\"right\\\"}}} -->\\n<p class=\\\"has-text-align-right\\\"><label for=\\\"{$for}\\\"><strong>{$text}</strong></label></p>\\n<!-- /wp:paragraph -->\";\n};\n$row = function ($left, $right, $rightAttrs = '', $rightStyle = '') {\n    return \"<!-- wp:columns {\\\"style\\\":{\\\"spacing\\\":{\\\"margin\\\":\\\"0px\\\"}}} -->\\n<div class=\\\"wp-block-columns\\\" style=\\\"margin:0px\\\"><!-- wp:column -->\\n<div class=\\\"wp-block-column\\\">{$left}</div>\\n<!-- /wp:column -->\\n\\n<!-- wp:column{$rightAttrs} -->\\n<div class=\\\"wp-block-column\\\"{$rightStyle}>{$right}</div>\\n<!-- /wp:column --></div>\\n<!-- /wp:columns -->\";\n};\n$form = $row($label('log', 'Username'), '<!-- wp:acemedia/username-block /-->')\n    . $row($label('pwd', 'Password'), '<!-- wp:acemedia/password-block /-->', ' {\"style\":{\"spacing\":{\"margin\":\"0px\"}}}', ' style=\"margin:0px\"')\n    . $row('', \"<!-- wp:acemedia/remember-me-block /-->\\n\\n<!-- wp:buttons -->\\n<div class=\\\"wp-block-buttons\\\"><!-- wp:button {\\\"className\\\":\\\"button\\\"} -->\\n<div class=\\\"wp-block-button button\\\"><a class=\\\"wp-block-button__link wp-element-button\\\">Sign in</a></div>\\n<!-- /wp:button --></div>\\n<!-- /wp:buttons -->\");\n$login = \"<!-- wp:acemedia/login-block -->\\n<div class=\\\"wp-block-acemedia-login-block wp-block-login-form\\\"><form action=\\\"{$action}\\\" method=\\\"post\\\">{$form}<button type=\\\"submit\\\" style=\\\"display:none\\\">Submit</button></form></div>\\n<!-- /wp:acemedia/login-block -->\";\n$lost = esc_url(wp_lostpassword_url());\n\n$content = <<<HTML\n<!-- wp:group {\"align\":\"wide\",\"className\":\"nj-hero\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"64px\",\"bottom\":\"64px\",\"left\":\"56px\",\"right\":\"56px\"}}},\"layout\":{\"type\":\"constrained\",\"contentSize\":\"100%\"}} -->\n<div class=\"wp-block-group alignwide nj-hero\" style=\"padding-top:64px;padding-right:56px;padding-bottom:64px;padding-left:56px\"><!-- wp:columns {\"verticalAlignment\":\"center\",\"style\":{\"spacing\":{\"blockGap\":{\"left\":\"64px\"}}}} -->\n<div class=\"wp-block-columns are-vertically-aligned-center\"><!-- wp:column {\"verticalAlignment\":\"center\",\"width\":\"52%\"} -->\n<div class=\"wp-block-column is-vertically-aligned-center\" style=\"flex-basis:52%\"><!-- wp:paragraph {\"className\":\"nj-eyebrow\"} -->\n<p class=\"nj-eyebrow\">Members</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:heading {\"level\":1,\"style\":{\"typography\":{\"fontSize\":\"3.4rem\",\"lineHeight\":\"1.05\"}}} -->\n<h1 class=\"wp-block-heading\" style=\"font-size:3.4rem;line-height:1.05\">Pull up a chair. Your shelf is waiting.</h1>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"style\":{\"typography\":{\"fontSize\":\"1.15rem\"}}} -->\n<p style=\"font-size:1.15rem\">Sign in to reserve books, save your seat at the next salon and pick up where you left off.</p>\n<!-- /wp:paragraph -->\n\n<!-- wp:list {\"className\":\"nj-perks\"} -->\n<ul class=\"wp-block-list nj-perks\"><!-- wp:list-item -->\n<li>Reserve up to six books at a time</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>First dibs on salon tickets</li>\n<!-- /wp:list-item -->\n\n<!-- wp:list-item -->\n<li>Your reading history, kept private</li>\n<!-- /wp:list-item --></ul>\n<!-- /wp:list --></div>\n<!-- /wp:column -->\n\n<!-- wp:column {\"verticalAlignment\":\"center\",\"width\":\"48%\"} -->\n<div class=\"wp-block-column is-vertically-aligned-center\" style=\"flex-basis:48%\"><!-- wp:group {\"className\":\"nj-card\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"40px\",\"bottom\":\"36px\",\"left\":\"40px\",\"right\":\"40px\"}}},\"layout\":{\"type\":\"constrained\"}} -->\n<div class=\"wp-block-group nj-card\" style=\"padding-top:40px;padding-right:40px;padding-bottom:36px;padding-left:40px\"><!-- wp:heading {\"style\":{\"typography\":{\"fontSize\":\"1.9rem\"}}} -->\n<h2 class=\"wp-block-heading\" style=\"font-size:1.9rem\">Welcome back</h2>\n<!-- /wp:heading -->\n\n<!-- wp:paragraph {\"style\":{\"typography\":{\"fontSize\":\"0.95rem\"}}} -->\n<p style=\"font-size:0.95rem\">Members sign in with their username and password.</p>\n<!-- /wp:paragraph -->\n\n{$login}\n\n<!-- wp:paragraph {\"style\":{\"typography\":{\"fontSize\":\"0.9rem\"}}} -->\n<p style=\"font-size:0.9rem\"><a href=\"{$lost}\">Forgotten your password?</a></p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group --></div>\n<!-- /wp:column --></div>\n<!-- /wp:columns --></div>\n<!-- /wp:group -->\n\n<!-- wp:group {\"align\":\"wide\",\"className\":\"nj-demo-note\",\"style\":{\"spacing\":{\"padding\":{\"top\":\"18px\",\"bottom\":\"18px\",\"left\":\"24px\",\"right\":\"24px\"},\"margin\":{\"top\":\"28px\"}}},\"layout\":{\"type\":\"constrained\",\"contentSize\":\"100%\"}} -->\n<div class=\"wp-block-group alignwide nj-demo-note\" style=\"margin-top:28px;padding-top:18px;padding-right:24px;padding-bottom:18px;padding-left:24px\"><!-- wp:paragraph -->\n<p><strong>Ace Login Block demo.</strong> This sign-in page is a normal page built with the Login block. Sign in as <strong>admin</strong> / <strong>password</strong>, or get it wrong five times to see the lockout (one minute here, thirty by default). Then look under Settings, Ace Login Block, Security.</p>\n<!-- /wp:paragraph --></div>\n<!-- /wp:group -->\nHTML;\n\n$id = wp_insert_post([\n    'post_type' => 'page', 'post_status' => 'publish', 'post_title' => 'Members',\n    'post_name' => 'members-sign-in', 'post_content' => $content, 'menu_order' => 3,\n    'page_template' => 'page-no-title',\n]);\nforeach (['Visit us' => 1, 'Salons' => 2] as $title => $order) {\n    wp_insert_post(['post_type' => 'page', 'post_status' => 'publish', 'post_title' => $title, 'menu_order' => $order, 'post_content' => '<!-- wp:paragraph --><p>Open Tuesday to Sunday, ten till late.</p><!-- /wp:paragraph -->']);\n}\nif ($sample = get_page_by_path('sample-page')) {\n    wp_delete_post($sample->ID, true);\n}\n\nupdate_option('acemedia_login_block_custom_page', $id);\nupdate_option('acemedia_login_lockout_duration_minutes', 1);\nupdate_option('blogname', 'Nightjar Reading Room');\nupdate_option('blogdescription', 'A quiet place for loud books');\nwp_set_current_user(0);\n"
  }
 ]
}