Initial commit with a few early examples and documentation.

master
Zed A. Shaw 3 years ago
parent 22e7e6090f
commit 0ef101b1e7
  1. 679
      package-lock.json
  2. 18
      package.json
  3. 196
      public/blockstart.css
  4. 111
      public/demos/asana.html
  5. 158
      public/demos/canva.html
  6. 367
      public/index.html
  7. 18
      public/template.html

679
package-lock.json generated

@ -0,0 +1,679 @@
{
"name": "blockstart",
"version": "1.0.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "blockstart",
"version": "1.0.0",
"license": "MIT",
"dependencies": {
"http-server": "^14.1.1"
}
},
"node_modules/ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"dependencies": {
"color-convert": "^2.0.1"
},
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/chalk/ansi-styles?sponsor=1"
}
},
"node_modules/async": {
"version": "2.6.4",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
"integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
"dependencies": {
"lodash": "^4.17.14"
}
},
"node_modules/basic-auth": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
"integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
"dependencies": {
"safe-buffer": "5.1.2"
},
"engines": {
"node": ">= 0.8"
}
},
"node_modules/call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"dependencies": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"dependencies": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
},
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/chalk/chalk?sponsor=1"
}
},
"node_modules/color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"dependencies": {
"color-name": "~1.1.4"
},
"engines": {
"node": ">=7.0.0"
}
},
"node_modules/color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"node_modules/corser": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz",
"integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ==",
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"dependencies": {
"ms": "^2.1.1"
}
},
"node_modules/eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
},
"node_modules/follow-redirects": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
"integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
"funding": [
{
"type": "individual",
"url": "https://github.com/sponsors/RubenVerborgh"
}
],
"engines": {
"node": ">=4.0"
},
"peerDependenciesMeta": {
"debug": {
"optional": true
}
}
},
"node_modules/function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"node_modules/get-intrinsic": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
"integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
"dependencies": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.3"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"dependencies": {
"function-bind": "^1.1.1"
},
"engines": {
"node": ">= 0.4.0"
}
},
"node_modules/has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
"engines": {
"node": ">=8"
}
},
"node_modules/has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==",
"engines": {
"node": ">= 0.4"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
"bin": {
"he": "bin/he"
}
},
"node_modules/html-encoding-sniffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
"integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
"dependencies": {
"whatwg-encoding": "^2.0.0"
},
"engines": {
"node": ">=12"
}
},
"node_modules/http-proxy": {
"version": "1.18.1",
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
"integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
"dependencies": {
"eventemitter3": "^4.0.0",
"follow-redirects": "^1.0.0",
"requires-port": "^1.0.0"
},
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/http-server": {
"version": "14.1.1",
"resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz",
"integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==",
"dependencies": {
"basic-auth": "^2.0.1",
"chalk": "^4.1.2",
"corser": "^2.0.1",
"he": "^1.2.0",
"html-encoding-sniffer": "^3.0.0",
"http-proxy": "^1.18.1",
"mime": "^1.6.0",
"minimist": "^1.2.6",
"opener": "^1.5.1",
"portfinder": "^1.0.28",
"secure-compare": "3.0.1",
"union": "~0.5.0",
"url-join": "^4.0.1"
},
"bin": {
"http-server": "bin/http-server"
},
"engines": {
"node": ">=12"
}
},
"node_modules/iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"dependencies": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"node_modules/mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
"bin": {
"mime": "cli.js"
},
"engines": {
"node": ">=4"
}
},
"node_modules/minimist": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
},
"node_modules/mkdirp": {
"version": "0.5.6",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
"dependencies": {
"minimist": "^1.2.6"
},
"bin": {
"mkdirp": "bin/cmd.js"
}
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"node_modules/object-inspect": {
"version": "1.12.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
"integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/opener": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
"integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A==",
"bin": {
"opener": "bin/opener-bin.js"
}
},
"node_modules/portfinder": {
"version": "1.0.28",
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
"integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
"dependencies": {
"async": "^2.6.2",
"debug": "^3.1.1",
"mkdirp": "^0.5.5"
},
"engines": {
"node": ">= 0.12.0"
}
},
"node_modules/qs": {
"version": "6.10.5",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.10.5.tgz",
"integrity": "sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==",
"dependencies": {
"side-channel": "^1.0.4"
},
"engines": {
"node": ">=0.6"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
},
"node_modules/safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"node_modules/safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"node_modules/secure-compare": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz",
"integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw=="
},
"node_modules/side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"dependencies": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
},
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"dependencies": {
"has-flag": "^4.0.0"
},
"engines": {
"node": ">=8"
}
},
"node_modules/union": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz",
"integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==",
"dependencies": {
"qs": "^6.4.0"
},
"engines": {
"node": ">= 0.8.0"
}
},
"node_modules/url-join": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
"integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="
},
"node_modules/whatwg-encoding": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
"integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
"dependencies": {
"iconv-lite": "0.6.3"
},
"engines": {
"node": ">=12"
}
}
},
"dependencies": {
"ansi-styles": {
"version": "4.3.0",
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
"integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
"requires": {
"color-convert": "^2.0.1"
}
},
"async": {
"version": "2.6.4",
"resolved": "https://registry.npmjs.org/async/-/async-2.6.4.tgz",
"integrity": "sha512-mzo5dfJYwAn29PeiJ0zvwTo04zj8HDJj0Mn8TD7sno7q12prdbnasKJHhkm2c1LgrhlJ0teaea8860oxi51mGA==",
"requires": {
"lodash": "^4.17.14"
}
},
"basic-auth": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz",
"integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==",
"requires": {
"safe-buffer": "5.1.2"
}
},
"call-bind": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz",
"integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==",
"requires": {
"function-bind": "^1.1.1",
"get-intrinsic": "^1.0.2"
}
},
"chalk": {
"version": "4.1.2",
"resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
"integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
"requires": {
"ansi-styles": "^4.1.0",
"supports-color": "^7.1.0"
}
},
"color-convert": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
"integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
"requires": {
"color-name": "~1.1.4"
}
},
"color-name": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
"integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA=="
},
"corser": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/corser/-/corser-2.0.1.tgz",
"integrity": "sha512-utCYNzRSQIZNPIcGZdQc92UVJYAhtGAteCFg0yRaFm8f0P+CPtyGyHXJcGXnffjCybUCEx3FQ2G7U3/o9eIkVQ=="
},
"debug": {
"version": "3.2.7",
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz",
"integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==",
"requires": {
"ms": "^2.1.1"
}
},
"eventemitter3": {
"version": "4.0.7",
"resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
"integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw=="
},
"follow-redirects": {
"version": "1.15.1",
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
"integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA=="
},
"function-bind": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
"integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A=="
},
"get-intrinsic": {
"version": "1.1.2",
"resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz",
"integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==",
"requires": {
"function-bind": "^1.1.1",
"has": "^1.0.3",
"has-symbols": "^1.0.3"
}
},
"has": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
"integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
"requires": {
"function-bind": "^1.1.1"
}
},
"has-flag": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
"integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ=="
},
"has-symbols": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz",
"integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A=="
},
"he": {
"version": "1.2.0",
"resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
"integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw=="
},
"html-encoding-sniffer": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz",
"integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==",
"requires": {
"whatwg-encoding": "^2.0.0"
}
},
"http-proxy": {
"version": "1.18.1",
"resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
"integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
"requires": {
"eventemitter3": "^4.0.0",
"follow-redirects": "^1.0.0",
"requires-port": "^1.0.0"
}
},
"http-server": {
"version": "14.1.1",
"resolved": "https://registry.npmjs.org/http-server/-/http-server-14.1.1.tgz",
"integrity": "sha512-+cbxadF40UXd9T01zUHgA+rlo2Bg1Srer4+B4NwIHdaGxAGGv59nYRnGGDJ9LBk7alpS0US+J+bLLdQOOkJq4A==",
"requires": {
"basic-auth": "^2.0.1",
"chalk": "^4.1.2",
"corser": "^2.0.1",
"he": "^1.2.0",
"html-encoding-sniffer": "^3.0.0",
"http-proxy": "^1.18.1",
"mime": "^1.6.0",
"minimist": "^1.2.6",
"opener": "^1.5.1",
"portfinder": "^1.0.28",
"secure-compare": "3.0.1",
"union": "~0.5.0",
"url-join": "^4.0.1"
}
},
"iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
"integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==",
"requires": {
"safer-buffer": ">= 2.1.2 < 3.0.0"
}
},
"lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg=="
},
"mime": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
"integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg=="
},
"minimist": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
},
"mkdirp": {
"version": "0.5.6",
"resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz",
"integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==",
"requires": {
"minimist": "^1.2.6"
}
},
"ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA=="
},
"object-inspect": {
"version": "1.12.2",
"resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz",
"integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ=="
},
"opener": {
"version": "1.5.2",
"resolved": "https://registry.npmjs.org/opener/-/opener-1.5.2.tgz",
"integrity": "sha512-ur5UIdyw5Y7yEj9wLzhqXiy6GZ3Mwx0yGI+5sMn2r0N0v3cKJvUmFH5yPP+WXh9e0xfyzyJX95D8l088DNFj7A=="
},
"portfinder": {
"version": "1.0.28",
"resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.28.tgz",
"integrity": "sha512-Se+2isanIcEqf2XMHjyUKskczxbPH7dQnlMjXX6+dybayyHvAf/TCgyMRlzf/B6QDhAEFOGes0pzRo3by4AbMA==",
"requires": {
"async": "^2.6.2",
"debug": "^3.1.1",
"mkdirp": "^0.5.5"
}
},
"qs": {
"version": "6.10.5",
"resolved": "https://registry.npmjs.org/qs/-/qs-6.10.5.tgz",
"integrity": "sha512-O5RlPh0VFtR78y79rgcgKK4wbAI0C5zGVLztOIdpWX6ep368q5Hv6XRxDvXuZ9q3C6v+e3n8UfZZJw7IIG27eQ==",
"requires": {
"side-channel": "^1.0.4"
}
},
"requires-port": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
"integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ=="
},
"safe-buffer": {
"version": "5.1.2",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
},
"safer-buffer": {
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
},
"secure-compare": {
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/secure-compare/-/secure-compare-3.0.1.tgz",
"integrity": "sha512-AckIIV90rPDcBcglUwXPF3kg0P0qmPsPXAj6BBEENQE1p5yA1xfmDJzfi1Tappj37Pv2mVbKpL3Z1T+Nn7k1Qw=="
},
"side-channel": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz",
"integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==",
"requires": {
"call-bind": "^1.0.0",
"get-intrinsic": "^1.0.2",
"object-inspect": "^1.9.0"
}
},
"supports-color": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
"integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
"requires": {
"has-flag": "^4.0.0"
}
},
"union": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/union/-/union-0.5.0.tgz",
"integrity": "sha512-N6uOhuW6zO95P3Mel2I2zMsbsanvvtgn6jVqJv4vbVcz/JN0OkL9suomjQGmWtxJQXOCqUJvquc1sMeNz/IwlA==",
"requires": {
"qs": "^6.4.0"
}
},
"url-join": {
"version": "4.0.1",
"resolved": "https://registry.npmjs.org/url-join/-/url-join-4.0.1.tgz",
"integrity": "sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA=="
},
"whatwg-encoding": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz",
"integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==",
"requires": {
"iconv-lite": "0.6.3"
}
}
}
}

@ -0,0 +1,18 @@
{
"name": "blockstart",
"version": "1.0.0",
"description": "A CSS file for doing initial layouts quickly.",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"repository": {
"type": "git",
"url": "git@git.learnjsthehardway.com:zedshaw/blockstart.git"
},
"author": "Zed A. Shaw",
"license": "MIT",
"dependencies": {
"http-server": "^14.1.1"
}
}

@ -0,0 +1,196 @@
:root {
--color-border: hsl(0, 0%, 50%);
--border-radius: 5px;
--value0: hsl(0, 0%, 0%);
--value1: hsl(0, 0%, 11%);
--value2: hsl(0, 0%, 22%);
--value3: hsl(0, 0%, 33%);
--value4: hsl(0, 0%, 44%);
--value5: hsl(0, 0%, 55%);
--value6: hsl(0, 0%, 66%);
--value7: hsl(0, 0%, 77%);
--value8: hsl(0, 0%, 88%);
--value9: hsl(0, 0%, 100%);
--text: 0;
}
body {
color: hsl(0, 0%, calc(var(--text) * 11%));
display: flex;
flex-direction: column;
justify-content: flex-start;
padding: 0px;
margin: 0px;
}
content {
display: flex;
flex-direction: column;
}
a {
color: hsl(0, 0%, calc(var(--text) * 11%));
}
block {
color: hsl(0, 0%, calc(var(--text) * 11%));
display: flex;
--spacing: space-evenly;
justify-content: var(--spacing);
flex-direction: column;
}
block > * {
color: hsl(0, 0%, calc(var(--text) * 11%));
display: flex;
flex: 1 1 auto;
--spacing: flex-start;
justify-content: var(--spacing);
align-self: stretch;
flex-direction: column;
margin: 2px;
}
.wide {
width: 100%;
}
.no-flex {
display: block;
flex: unset;
flex-direction: unset;
align-self: unset;
}
.center {
justify-content: center;
align-items: center;
align-self: center;
}
.center-text > * {
text-align: center;
}
.center-self {
align-self: center;
}
.vertical {
flex-direction: column;
}
.horizontal {
flex-direction: row;
}
grid {
--cols: 1fr 1fr;
--rows: auto;
--gap: 0.5rem;
color: hsl(0, 0%, calc(var(--text) * 11%));
display: grid;
grid-gap: var(--gap);
grid-template-columns: var(--cols);
grid-template-rows: var(--rows);
}
stack {
color: hsl(0, 0%, calc(var(--text) * 11%));
display: grid;
grid-template-rows: 1fr;
grid-template-columns: 1fr;
grid-template-areas: "cover";
}
stack > * {
color: hsl(0, 0%, calc(var(--text) * 11%));
width: 100%;
height: 100%;
position: relative;
grid-area: cover;
}
stack > .top {
z-index: 10;
}
hr {
--height: 1rem;
min-height: var(--height);
visibility: hidden;
}
shape {
--w: 100%;
--h: 100%;
--value: 4;
color: hsl(0, 0%, calc(var(--text) * 11%));
background-color: hsl(0, 0%, calc(var(--value) * 11%));
display: flex;
width: var(--w);
min-width: var(--w);
max-width: var(--w);
height: var(--h);
min-height: var(--h);
max-height: var(--h);
text-align: center;
justify-content: center;
align-items: center;
align-self: center;
}
.debug {
border: 1px solid red;
}
.debug > * {
border: 1px solid blue;
}
.pad {
--pad: 1rem;
padding: var(--pad);
}
.sized {
--w: 100%;
--h: 100%;
width: var(--w);
min-width: var(--w);
max-width: var(--w);
height: var(--h);
min-height: var(--h);
max-height: var(--h);
}
.border {
border: 1px solid var(--color-border);
border-radius: var(--border-radius);
}
.solid {
--value: 8;
background-color: hsl(0, 0%, calc(var(--value) * 11%));
}
.dots {
--pat-val: 7;
background-image: radial-gradient(hsl(0, 0%, calc(var(--pat-val) * 11%)) 1px, transparent 1px);
background-size: calc(10 * 1px) calc(10 * 1px);
}
.lines {
--pat-val: 7;
background-image: linear-gradient(hsl(0, 0%, calc(var(--pat-val) * 11%)) 1px, transparent 1px), linear-gradient(to right, hsl(0, 0%, calc(var(--pat-val) * 11%)) 1px, transparent 1px);
background-size: 10px 10px;
}
.stripes {
--pat-val: 7;
background-image: linear-gradient(90deg, transparent 50%, hsl(0, 0%, calc(var(--pat-val) * 11%)) 50%);
background-size: 10px 10px;
}

@ -0,0 +1,111 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Blockstart Test</title>
<link rel="stylesheet" href="/blockstart.css">
<style>
</style>
</head>
<body>
<block class="horizontal pad" style="width: unset">
<span>asana</span>
<span class="no-flex">G | M U <button>Get Started</button></span>
</block>
<block class="solid center center-text sized" style="--value: 8; --h: 400px;">
<div class="no-flex">
<h1>Bring products to market faster with Asana</h1>
<p>Asana is the easiest way for product managers to track their team's work—and get results.</p>
</div>
<button class="no-flex" style="width: unset">Get Started</button>
</block>
<hr>
<block class="center center-text" style="max-width: 80vw">
<h1>Asana is the easiest way for product teams to...</h1>
<hr>
<block class="center center-text">
<shape style="--w: 25px; --h: 25px;"></shape>
<p>Plan product roadmaps</p>
<p>Use Asana as a source of truth to set goals, align on priorities, and track product milestones.</p>
</block>
<hr>
<block class="center center-text">
<shape style="--w: 25px; --h: 25px;"></shape>
<p>Plan product roadmaps</p>
<p>Use Asana as a source of truth to set goals, align on priorities, and track product milestones.</p>
</block>
<hr>
<block class="center center-text">
<shape style="--w: 25px; --h: 25px;"></shape>
<p>Plan product roadmaps</p>
<p>Use Asana as a source of truth to set goals, align on priorities, and track product milestones.</p>
</block>
<hr>
<button class="center" style="max-width: 220px;">More ways to Asana</button>
</block>
<hr>
<block class="center" style="max-width: 580px;">
<shape style="--w: 580px; --h: 380px">
<h1>Screenshot</h1>
</shape>
<block>
<h4>Move fast without breaking things</h4>
<p>Using Asana as your product roadmap tool helps you track project progress, identify blockers, and shift resources on the fly.</p>
<button style="max-width: 220px;">Learn more about Asana</button>
</block>
</block>
<hr>
<block class="center center-text" style="max-width: 80vw;">
<h4>Product team use cases</h4>
<select class="no-flex" style="min-width: 300px; margin: 1rem;"><option>Product roadmaps</option></select>
<shape style="--w: 580px; --h: 380px">
<h1>Screenshot</h1>
</shape>
<p>Typewriter seitan selvage stumptown jean shorts. Messenger bag art party lo-fi, readymade vaporware drinking vinegar lomo pour-over fanny pack DIY kogi whatever.</p>
</block>
<hr>
<shape style="--w: 681px; --h: 384px;" >
<h1>Video</h1>
</shape>
<hr>
<block class="center solid sized" style="--value: 8; --h: 500px; --w: 100vw;">
<div class="no-flex">
<h1>Product Quotes</h1>
<blockquote>"Some dude says that some dude is great."</blockquote>
</div>
</block>
<hr>
<block class="center center-text">
<h1>Ship product faster with Asana today</h1>
<p style="margin-top: 1rem; margin-bottom: 1rem;">See why millions of people use asana...</p>
<button class="no-flex" style="max-width: 220px">Get started</button>
</block>
<hr>
<block class="sized solid" style="--h: 500px; --value: 0; color: var(--value9);">
<h1>Footer</h1>
</block>
</body>
</html>

@ -0,0 +1,158 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Blockstart Test</title>
<link rel="stylesheet" href="/blockstart.css">
<style>
</style>
</head>
<body>
<block class="horizontal pad" style="border-bottom: 1px solid var(--value6); --spacing: space-around; width: unset;">
<div>Canva</div>
<input type="text">
<span>?</span>
<button>Log In</button>
<button>Sign Up</button>
</block>
<block class="center-text sized center" style="--w: 80vw; --h: 400px; padding-top: 2rem; padding-bottom: 2rem">
<h1>Canva. Design for everyone.</h1>
<p>Iceland bespoke polaroid pug raclette kinfolk tumblr lo-fi asymmetrical chillwave church-key. Bespoke sustainable +1 cred, heirloom chicharrones kitsch tousled. Mixtape schlitz air plant iceland hot chicken, bicycle rights poutine austin bespoke. Stumptown schlitz keytar meggings taiyaki vice next level ugh. Fam vaporware cliche jean shorts listicle narwhal gluten-free vape. Af godard health goth, iPhone edison bulb shaman you probably haven't heard of them mustache photo booth etsy gochujang subway tile cronut. Helvetica ugh seitan, semiotics before they sold out hella hot chicken gastropub try-hard.</p>
<block class="horizontal center" style="max-width: 50vw; max-height: min-content;">
<button class="no-flex">Start your free Pro trial</button>
<button class="no-flex">Get Canva Free</button>
</block>
</block>
<hr/>
<block>
<block class="solid sized center" style="--value: 3; --w: 450px; --h: 300px">
<h1>Demo Image</h1>
</block>
</block>
<hr/>
<grid class="center" style="max-width: 80vw; --cols: 1fr 1fr; --gap: 1rem;">
<shape style="--w: 250px; --h: 150px"></shape>
<div>Letterpress leggings bitters drinking vinegar asymmetrical godard slow-carb tumeric.</div>
<div>Tote bag bespoke whatever, godard stumptown hammock selvage hot chicken vinyl 3 wolf moon asymmetrical roof party farm-to-table. </div>
<shape style="--w: 250px; --h: 150px"></shape>
<shape style="--w: 250px; --h: 150px"></shape>
<div>Fixie wayfarers fingerstache drinking vinegar, marfa flannel art party cray pour-over coloring book.</div>
</grid>
<hr/>
<block class="center-text">
<h1>Templates</h1>
<grid class="center" style="--cols: 1fr 1fr 1fr;">
<shape style="--w: 150px; --h: 150px"></shape>
<shape style="--w: 150px; --h: 150px"></shape>
<shape style="--w: 150px; --h: 150px"></shape>
<shape style="--w: 150px; --h: 150px"></shape>
<shape style="--w: 150px; --h: 150px"></shape>
<shape style="--w: 150px; --h: 150px"></shape>
<shape style="--w: 150px; --h: 150px"></shape>
<shape style="--w: 150px; --h: 150px"></shape>
<shape style="--w: 150px; --h: 150px"></shape>
<shape style="--w: 150px; --h: 150px"></shape>
<shape style="--w: 150px; --h: 150px"></shape>
<shape style="--w: 150px; --h: 150px"></shape>
</grid>
</block>
<hr/>
<block class="center sized" style="--w: 80vw;">
<block class="center center-text sized" style="--w: 80%">
<h1>Work solo, or as a team</h1>
<p>Letterpress leggings bitters drinking vinegar asymmetrical godard slow-carb tumeric.</p>
</block>
<hr/>
<block class="horizontal">
<left class="sized" style="--w: 50%">
<p>Team folders to help you stay organized, store brand assets, and manage content</p>
<p>Plan, create, schedule and publish your social media posts directly from Canva</p>
<p>Real-time collaboration across countries, companies, and departments</p>
<p>Built-in comments to communicate, work, and resolve suggestions in real-time</p>
</left>
<right class="center">
<shape style="--w: 150px; --h: 150px;"></shape>
</right>
</block>
<button class="center sized" style="--w: 150px">See work solutions</button>
</block>
<hr/>
<block class="center center-text sized" style="--w: 80vw">
<h1>A perfect fit for every team</h1>
<hr/>
<grid style="--cols: 1fr 1fr 1fr">
<block>
<h4>Canva Free</h4>
<p>Bitters DIY semiotics, banjo tilde fingerstache church-key woke pitchfork yr pickled tattooed yuccie. vetica vegan, chartreuse intelligentsia affogato craft beer poutine viral health got</p>
<hr>
<button class="no-flex">Get Canva Free</button>
</block>
<block>
<h4>Canva Pro</h4>
<p>vetica vegan, chartreuse intelligentsia affogato craft beer poutine viral health got meggings poke keffiyeh chambray forage swag bicycle rights.</p>
<hr>
<button class="no-flex">Get Canva Free</button>
</block>
<block>
<h4>Canva Enterprise</h4>
<p>Bitters DIY semiotics, banjo tilde fingerstache church-key woke pitchfork yr pickled tattooed yuccie.</p>
<hr>
<button class="no-flex">Get Canva Free</button>
</block>
</grid>
</block>
<hr/>
<block class="center" style="max-width: 90vw;">
<h1 style="text-align: center;">Loved by people and businesses around the world</h1>
<block class="horizontal">
<block>
<shape style="--w: 250px; --h: 150px;"></shape>
<span>Ennui af cred, raw denim lo-fi +1 meggings poke keffiyeh chambray forage swag bicycle rights.</span>
</block>
<block>
<shape style="--w: 250px; --h: 150px;"></shape>
<span>Bitters DIY semiotics, banjo tilde fingerstache church-key woke pitchfork yr pickled tattooed yuccie.</span>
</block>
<block>
<shape style="--w: 250px; --h: 150px;"></shape>
<span>Microdosing aesthetic poke helvetica vegan, chartreuse intelligentsia affogato craft beer poutine viral health goth.</span>
</block>
</block>
</block>
<hr/>
<block class="sized" style="--h: 400px; border-top: 1px solid var(--value5);">
<h1>Footer</h1>
</block>
</body>
</html>

@ -0,0 +1,367 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Starting Template</title>
<link rel="stylesheet" href="/blockstart.css">
<style>
code, pre {
background-color: var(--value8);
}
pre {
padding-left: 0.5rem;
padding-right: 0.5rem;
border-radius: var(--border-radius);
font-size: 1.1em;
}
</style>
</head>
<body>
<block class="horizontal pad" style="border-bottom: 1px solid var(--value6); --spacing: space-around; width: unset;">
<div>blockstart.css</div>
<div class="horizontal" style="--spacing: end;">
<a href="#about">About</a> &nbsp;|&nbsp;
<a href="#docs">Docs</a> &nbsp;|&nbsp;
<a href="/demos/">Demos</a> &nbsp;|&nbsp;
<a href="/theory.html">Theory</a> &nbsp;|&nbsp;
<a href="/blockstart.css">Download</a>
</div>
</block>
<block class="solid center center-text sized" style="--value: 8; --h: 400px;">
<div class="no-flex">
<h1>The blockstart.css</h1>
<p>Quickly get your initial layout idea done with minimal CSS and HTML.</p>
</div>
</block>
<content class="pad">
<h1 id="#about">About blockstart.css</h1>
<p>The <a href="/blockstart.css">blockstart.css</a> file gives you a simple set of basic layout primitives to get started. It allows you to follow a process similar to painters:</p>
<ol>
<li>Organize the big "gross" structure without details in monochrome.</li>
<li>Develop a first statement with a meaningful structure and a simplified monochrome design.</li>
<li>Refine a second statement by filling in the structure with content and additional refinements for that content.</li>
<li>Complete a third statement with further refined details, fonts, and color schemes.</li>
</ol>
<p>In practical terms this means:</p>
<ol>
<li>Use <a href="/blockstart.css">blockstart.css</a> to get a "chunky" boxes and grids layout.</li>
<li>Replace the <a href="/blockstart.css">blockstart.css</a> with semantic HTML tags and your own CSS, adding first refinements.</li>
<li>Fill in your blocks with media so you have something to design around that's real, refining further.</li>
<li>Develop this last stage of the design with font choices, color, and other details that fit the content.</li>
</ol>
<p>The <a href="/blockstart.css">blockstart.css</a> file helps with this process by giving you the minimum necessary blocks to create the first statement. There is almost nothing in the CSS, making it easy to replace in later stages...if you want.</p>
<h2 id="docs">Blocks</h2>
<p>The <code>&lt;block&gt;</code> is the main structure. It's a block. When you put things in it, they stay in there. That's how a block should work:</p>
<block>
<p>I am inside a block.</p>
</block>
<h2>Debugging</h2>
<p>Not sure where the boxes are? Add <code>class="debug"</code> to the <code>block</code> (or <code>grid</code>) and it will put a red border around the outer box, then a blue border around the children:</p>
<block class="debug">
<p>I am inside a block, see it now?.</p>
</block>
<h2>Blocks Propagate</h2>
<p>The first children in a block become a blocks too. In the beginning that's usually what you want. This means you don't need to put blocks inside blocks unless you want to. You can remove this on an element with <code>class="no-flex"</code>:</p>
<block class="debug">
<top>
<p>Line 1</p>
<p>Line 2</p>
</top>
<bottom class="no-flex">
<p>No Flex Line 1</p>
<p>No Flex Line 2</p>
</bottom>
</block>
<p>In that example, the "No Flex" lines are spaced normally because the code has <code>class="no-flex"</code> on that block.</p>
<h2>Solid Blocks</h2>
<p>You can make a block solid with <code>class="solid"</code></p>
<block class="solid">
<p>I am inside a solid block.</p>
</block>
<p>Notice how it takes up the whole page? Notice how it is monochrome? That's all you need. You can change the "value" of a solid block with a variable <code>style="--value: 3"</code>:</p>
<block class="solid" style="--value: 3">
<p>I am inside a solid dark block.</p>
</block>
<p>We can't read that text so we need something called a "Value."</p>
<h2>Values</h2>
<p>What's a value? A value represents a simple number for the "light" and "dark" of something. Think of it as a measure of the amount of light produced. A value 9 object gives off a lot of light, so it's white. A value 0 object gives off no light, so it's black. You can do most initial designs with only 5 values, but <a href="/blockstart.css">blockstart.css</a> has 10 (0-9) to help with contrast. You can usually change the background with <code>--value: 0</code> and the text with <code>--text: 9</code> in most places.</p>
<p>We can fix that last block's contrast with value 9 text using <code>style="--text: 9;"</code>:</p>
<block class="solid" style="--value: 3; --text: 9;">
<p>I am inside a solid dark block too.</p>
</block>
<p>If we use <code>style="--value: 0; --text: 9;"</code> we can get a high contast dark block:</p>
<block class="solid" style="--value: 0; --text: 9;">
<p>I am inside a solid black block.</p>
</block>
<p>Values make it easier to solve contrast in your designs because you don't have to think about thousands of colors and their luminance levels. Just make the difference in value between your text (the subject) and background (the ground) to increase contrast. In the previous block the difference was 9 because background is value 0 and text is value 9.</p>
<h2>Shapes</h2>
<p>You always need some kind of rectangle shape to represent where a photo might go, and the <code>shape</code> tag handles that:</p>
<shape style="--w: 300px; --h: 300px;">
<h1>Image</h1>
</shape>
<p>You set the shape's size with <code>style="--w: 300px; --h: 300px;"</code>.</p>
<h2>Padding</h2>
<p>Just add <code>class="pad"</code> to give a simple 1rem padding to a block. Use the variable <code>style="--pad: 1rem"</code> to change its padding.</p>
<h2>Borders</h2>
<p>Things need borders and you can add a border with <code>class="border"</code>:</p>
<block class="center border">
<h3>This box has a border</h3>
</block>
<h2>Center</h2>
<p>Many times in the beginning you'll want to say something is centered, and you mean the whole thing, not just randomly the box but not its content. Add <code>class="center"</code> and it will be centered:</p>
<block class="center border">
<h2>This Block Is Center</h2>
<p>You say it's centered, it's centered.</p>
</block>
<p>Notice the text isn't centered, because many times you don't want centered text. On landing pages it seems that <b>everything</b> is centered, so you can add <code>center-text</code> to also center the text. You can place this on anything too, not just blocks:</p>
<block class="center center-text border">
<h2>This Text is Center Too</h2>
<p>Ok, now it's totally centered.</p>
</block>
<p>You can also add <code>class="center-self"</code> on
elements that you want to center but not really the contents, and when it's not explicitly a <code>block</code> tag but you want it centered.</p>
<block class="solid pad">
<demo class="pad solid border center-self" style="--value: 10;">
DEMO
</demo>
</block>
<h2>Patterns</h2>
<p>Sometimes you need a little indicator for a block to make it different for later changes. You can use three patterns of <code>stripes</code>, <code>lines</code>, and <code>dots</code>.</p>
<grid style="--rows: auto; --cols: 1fr 1fr 1fr; --gap: 1rem;">
<block class="solid center stripes border">
<h1>Solid</h1>
</block>
<block class="solid center dots border">
<h1>Dots</h1>
</block>
<block class="solid center lines border">
<h1>Lines</h1>
</block>
</grid>
<p>You can change the line/dot/stripe color with <code>--pat-val</code>, and combine it with the block background setting <code>--value</code>. For example, these are all white patterns on black blocks:</p>
<grid style="--rows: auto; --cols: 1fr 1fr 1fr; --gap: 1rem;">
<block class="solid center dots border"
style="--value: 0; --pat-val: 9; --text: 9;">
<h1>Dots</h1>
</block>
<block class="solid center lines border"
style="--value: 0; --pat-val: 9; --text: 9">
<h1>Lines</h1>
</block>
<block class="solid center stripes border"
style="--value: 0; --pat-val: 9; --text: 8">
<h1>Stripes</h1>
</grid>
<h2>Horizontal</h2>
<p>By default blocks are vertical, like a web page, because blocks being horizontal by default is stupid. You can make a block horizontal with <code>class="horizontal"</code>, and then make it vertical again with <code>class="vertical"</code>. Here's a side-by-side block using <code>horizontal</code>:</p>
<block class="border horizontal">
<left class="solid vertical">
<h3>I'm Left</h3>
<p>Everything is set to flex, 'cause
that's easier.</p>
</left>
<right class="vertical">
<h4>I'm Right</h4>
<p>That makes doing left and right oriented
content that actually contains what it holds
easier.
</p>
</right>
</block>
<h2>Spacer</h2>
<p>You can add a basic spacing between blocks with <code>&lt;hr&gt;</code> tags. The line is hidden.</p>
<h2>Grids</h2>
<p>
You can make a grid, and it'll actually be a grid, that
contains its contents. Amazing. Your boxes can also have
solid backgrounds or dots, stripes, and lines.
</p>
<p>You set the rows, columns, and gap with style variables <code>--rows</code>, <code>--columns</code>, and <code>--gap</code> like so:
<pre><code class="pad">&lt;grid style="--rows: auto; --cols: 1fr 1fr 1fr; --gap: 1rem;"&gt;</code></pre>
<p>Here is that grid setting using blocks inside for each of the patterns:</p>
<grid style="--rows: auto; --cols: 1fr 1fr 1fr; --gap: 1rem;">
<block class="border center">
<h1>Grids</h1>
</block>
<block class="solid center border">
<h1>Solid</h1>
</block>
<block class="solid center dots border">
<h1>Dots</h1>
</block>
<block class="solid center lines border">
<h1>Lines</h1>
</block>
<block class="solid center stripes border">
<h1>Stripes</h1>
</block>
<block class="solid center border"
style="--value: 0; --text: 9;">
<h1>Solid</h1>
</block>
<block class="solid center dots border"
style="--value: 0; --text: 9;">
<h1>Dots</h1>
</block>
<block class="solid center lines border"
style="--value: 0; --text: 9;">
<h1>Lines</h1>
</block>
<block class="solid center stripes border"
style="--value: 0; --text: 9;">
<h1>Stripes</h1>
</block>
</grid>
<h2>Stacked Layers</h2>
<p>Frequently you need to use multiple layers as in an image with text on top. You might not need this in the layout phase, but in the first statement it does come up. The <code>stack</code> tag will position all of it's children on top of each other in order, and you can set one as the top with <code>class="top"</code>.</p>
<p>In this demo I have a block with "I'm on Bottom" that I cover with another block that uses a stripes pattern. This gives the effect of putting the text behind bars. Remember that these stack in the reverse order you write them, unless you tag one with <code>class="top"</code>.
</p>
<stack class="center" style="width: 300px; height: 150px;">
<block class="solid center">
<h2>I'm on Bottom</h2>
</block>
<block class="stripes debug" style="--spacing: flex-end;">
<h1 class="no-flex">I'm on Top</h1>
</block>
</stack>
<p>I put <code>class="debug"</code> around the "I'm on Top" class so you can see where it gets placed. The "top" block has the lines and you can read the text clearly. The "I'm on Bottom" text is hiding behined these lines.
</p>
<h2>Content</h2>
<p>Many times you want one section to take up the whole page width, but then content under that to be padded. You can just manually set the width most of the time, or use the <code>content</code> tag. Add on the <code>class="pad"</code> to give it padding, or <code>class="sized"</code> to set its width or height.
</p>
<h2>Getting Started</h2>
<p>Once you download the <a href="/blockstart.css">blockstart.css</a> you need a web server. For people who use Node.js you can run the <a href="https://www.npmjs.com/package/http-server">http-server</a> package to get a simple one. Here's the commands that I use to get a project started:</p>
<pre>
<code>
mkdir myproject
cd myproject
npm init
# Answer all the questions
npm install http-server
mkdir public
npx http-server -d -c-1 public
</code>
</pre>
<p>Once you do that you can place the <a href="/blockstart.css">blockstart.css</a> in the <code>public/</code> directory and start putting your <code>.html</code> files in the same place. Here's a decen starter template:</p>
<pre>
<code>
&lt;!doctype html&gt;
&lt;html lang="en"&gt;
&lt;head&gt;
&lt;meta charset="utf-8"&gt;
&lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;
&lt;title&gt;Blockstart Template&lt;/title&gt;
&lt;link rel="stylesheet" href="/blockstart.css"&gt;
&lt;style&gt;
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;/body&gt;
&lt;/html&gt;
</code>
</pre>
<p>There's a lot you can add to an HTML page to make it work on different platforms, including all the icons ever invented by Apple, but this file gets you started when using the <a href="/blockstart.css">blockstart.css</a>.
</p>
</content>
</body>
</html>

@ -0,0 +1,18 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>Blockstart Template</title>
<link rel="stylesheet" href="/blockstart.css">
<style>
</style>
</head>
<body>
</body>
</html>
Loading…
Cancel
Save