← back to Wallpaperdefinitions
initial scaffold: wallpaperdefinitions.com plain-language definitions
4a4f47b28d5c5db03c165e6480e270575a8c1add · 2026-05-07 16:43:34 -0700 · Steve Abrams
Files touched
A .gitignoreA package-lock.jsonA package.jsonA public/index.htmlA server.js
Diff
commit 4a4f47b28d5c5db03c165e6480e270575a8c1add
Author: Steve Abrams <steve@designerwallcoverings.com>
Date: Thu May 7 16:43:34 2026 -0700
initial scaffold: wallpaperdefinitions.com plain-language definitions
---
.gitignore | 7 +
package-lock.json | 842 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
package.json | 12 +
public/index.html | 523 +++++++++++++++++++++++++++++++++
server.js | 14 +
5 files changed, 1398 insertions(+)
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..08240ae
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,7 @@
+node_modules/
+.env*
+tmp/
+*.log
+.DS_Store
+dist/
+build/
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..d162c2a
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,842 @@
+{
+ "name": "wallpaperdefinitions",
+ "version": "0.1.0",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "wallpaperdefinitions",
+ "version": "0.1.0",
+ "dependencies": {
+ "express": "^4.22.1"
+ }
+ },
+ "node_modules/accepts": {
+ "version": "1.3.8",
+ "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz",
+ "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "~2.1.34",
+ "negotiator": "0.6.3"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/array-flatten": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
+ "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==",
+ "license": "MIT"
+ },
+ "node_modules/body-parser": {
+ "version": "1.20.5",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.5.tgz",
+ "integrity": "sha512-3grm+/2tUOvu2cjJkvsIxrv/wVpfXQW4PsQHYm7yk4vfpu7Ekl6nEsYBoJUL6qDwZUx8wUhQ8tR2qz+ad9c9OA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "content-type": "~1.0.5",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "~1.2.0",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "on-finished": "~2.4.1",
+ "qs": "~6.15.1",
+ "raw-body": "~2.5.3",
+ "type-is": "~1.6.18",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/body-parser/node_modules/qs": {
+ "version": "6.15.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.1.tgz",
+ "integrity": "sha512-6YHEFRL9mfgcAvql/XhwTvf5jKcOiiupt2FiJxHkiX1z4j7WL8J/jRHYLluORvc1XxB5rV20KoeK00gVJamspg==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz",
+ "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz",
+ "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz",
+ "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/content-disposition": {
+ "version": "0.5.4",
+ "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.4.tgz",
+ "integrity": "sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz",
+ "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.7.2",
+ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz",
+ "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.7.tgz",
+ "integrity": "sha512-NXdYc3dLr47pBkpUCHtKSwIOQXLVn8dZEuywboCOJY/osA0wFSLlSawr3KN8qXJEyX66FcONTH8EIlVuK0yyFA==",
+ "license": "MIT"
+ },
+ "node_modules/debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "2.0.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
+ "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/destroy": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
+ "integrity": "sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8",
+ "npm": "1.2.8000 || >= 1.4.16"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz",
+ "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==",
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz",
+ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz",
+ "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz",
+ "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz",
+ "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
+ "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==",
+ "license": "MIT"
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
+ "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express": {
+ "version": "4.22.1",
+ "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz",
+ "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "~1.3.8",
+ "array-flatten": "1.1.1",
+ "body-parser": "~1.20.3",
+ "content-disposition": "~0.5.4",
+ "content-type": "~1.0.4",
+ "cookie": "~0.7.1",
+ "cookie-signature": "~1.0.6",
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "finalhandler": "~1.3.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.0",
+ "merge-descriptors": "1.0.3",
+ "methods": "~1.1.2",
+ "on-finished": "~2.4.1",
+ "parseurl": "~1.3.3",
+ "path-to-regexp": "~0.1.12",
+ "proxy-addr": "~2.0.7",
+ "qs": "~6.14.0",
+ "range-parser": "~1.2.1",
+ "safe-buffer": "5.2.1",
+ "send": "~0.19.0",
+ "serve-static": "~1.16.2",
+ "setprototypeof": "1.2.0",
+ "statuses": "~2.0.1",
+ "type-is": "~1.6.18",
+ "utils-merge": "1.0.1",
+ "vary": "~1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.10.0"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.2.tgz",
+ "integrity": "sha512-aA4RyPcd3badbdABGDuTXCMTtOneUCAYH/gxoYRTZlIJdF0YPWuGqiAsIrhNnnqdXGswYk6dGujem4w80UJFhg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "on-finished": "~2.4.1",
+ "parseurl": "~1.3.3",
+ "statuses": "~2.0.2",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz",
+ "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "0.5.2",
+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
+ "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz",
+ "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz",
+ "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz",
+ "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz",
+ "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz",
+ "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz",
+ "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz",
+ "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "~2.0.0",
+ "inherits": "~2.0.4",
+ "setprototypeof": "~1.2.0",
+ "statuses": "~2.0.2",
+ "toidentifier": "~1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.4.24",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
+ "license": "ISC"
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz",
+ "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz",
+ "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz",
+ "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==",
+ "license": "MIT"
+ },
+ "node_modules/negotiator": {
+ "version": "0.6.3",
+ "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz",
+ "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz",
+ "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz",
+ "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "0.1.13",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.13.tgz",
+ "integrity": "sha512-A/AGNMFN3c8bOlvV9RreMdrv7jsmF9XIfDeCd87+I8RNg6s78BhJxMu69NEMHBSJFxKidViTEdruRwEk/WIKqA==",
+ "license": "MIT"
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz",
+ "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==",
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.14.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.2.tgz",
+ "integrity": "sha512-V/yCWTTF7VJ9hIh18Ugr2zhJMP01MY7c5kh4J870L7imm6/DIzBsNLTXzMwUA3yZ5b/KBqLx8Kp3uRvd7xSe3Q==",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "2.5.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz",
+ "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "~3.1.2",
+ "http-errors": "~2.0.1",
+ "iconv-lite": "~0.4.24",
+ "unpipe": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "license": "MIT"
+ },
+ "node_modules/send": {
+ "version": "0.19.2",
+ "resolved": "https://registry.npmjs.org/send/-/send-0.19.2.tgz",
+ "integrity": "sha512-VMbMxbDeehAxpOtWJXlcUS5E8iXh6QmN+BkRX1GARS3wRaXEEgzCcB10gTQazO42tpNIya8xIyNx8fll1OFPrg==",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "2.6.9",
+ "depd": "2.0.0",
+ "destroy": "1.2.0",
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "etag": "~1.8.1",
+ "fresh": "~0.5.2",
+ "http-errors": "~2.0.1",
+ "mime": "1.6.0",
+ "ms": "2.1.3",
+ "on-finished": "~2.4.1",
+ "range-parser": "~1.2.1",
+ "statuses": "~2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/send/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==",
+ "license": "MIT"
+ },
+ "node_modules/serve-static": {
+ "version": "1.16.3",
+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
+ "integrity": "sha512-x0RTqQel6g5SY7Lg6ZreMmsOzncHFU7nhnRWkKgWuMTu5NN0DR5oruckMqRvacAN9d5w6ARnRBXl9xhDCgfMeA==",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "~2.0.0",
+ "escape-html": "~1.0.3",
+ "parseurl": "~1.3.3",
+ "send": "~0.19.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz",
+ "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==",
+ "license": "ISC"
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz",
+ "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.1.tgz",
+ "integrity": "sha512-mjn/0bi/oUURjc5Xl7IaWi/OJJJumuoJFQJfDDyO46+hBWsfaVM65TBHq2eoZBhzl9EchxOijpkbRC8SVBQU0w==",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz",
+ "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz",
+ "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
+ "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz",
+ "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "1.6.18",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz",
+ "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==",
+ "license": "MIT",
+ "dependencies": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.24"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/utils-merge": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz",
+ "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz",
+ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..35a5360
--- /dev/null
+++ b/package.json
@@ -0,0 +1,12 @@
+{
+ "name": "wallpaperdefinitions",
+ "version": "0.1.0",
+ "description": "Plain-language wallpaper definitions — wallpaperdefinitions.com",
+ "main": "server.js",
+ "scripts": {
+ "start": "node server.js"
+ },
+ "dependencies": {
+ "express": "^4.22.1"
+ }
+}
diff --git a/public/index.html b/public/index.html
new file mode 100644
index 0000000..107006f
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,523 @@
+<!DOCTYPE html>
+<html lang="en" data-theme="dark">
+<head>
+<meta charset="UTF-8">
+<meta name="viewport" content="width=device-width, initial-scale=1.0">
+<title>Wallpaper Definitions | Plain-English Guide to Wallcovering | Designer Wallcoverings</title>
+<meta name="description" content="Plain-language definitions for every wallpaper concept — from paste-the-wall to non-woven. Free samples and expert service at Designer Wallcoverings.">
+<link rel="preconnect" href="https://fonts.googleapis.com">
+<link href="https://fonts.googleapis.com/css2?family=Playfair+Display:ital,wght@0,400;0,500;0,600;0,700;1,400;1,500&display=swap" rel="stylesheet">
+<script type="application/ld+json">
+{
+ "@context": "https://schema.org",
+ "@type": "WebSite",
+ "name": "Wallpaper Definitions",
+ "url": "https://wallpaperdefinitions.com",
+ "description": "Plain-language definitions for wallpaper and wallcovering concepts",
+ "publisher": {
+ "@type": "Organization",
+ "name": "Designer Wallcoverings",
+ "url": "https://designerwallcoverings.com"
+ }
+}
+</script>
+<style>
+/* ===== THEME VARS ===== */
+:root {
+ --bg: #0a0a0a;
+ --ink: #f5f1e8;
+ --ink-soft: rgba(245,241,232,0.72);
+ --ink-faint: rgba(245,241,232,0.38);
+ --line: rgba(245,241,232,0.10);
+ --card-bg: rgba(245,241,232,0.04);
+ --header-bg: rgba(10,10,10,0.92);
+ --accent: #7a9b6e;
+ --accent-dim: rgba(122,155,110,0.18);
+ --accent-glow: rgba(122,155,110,0.28);
+ --rule: rgba(245,241,232,0.10);
+}
+[data-theme="light"] {
+ --bg: #f4f7f2;
+ --ink: #1a2018;
+ --ink-soft: rgba(26,32,24,0.72);
+ --ink-faint: rgba(26,32,24,0.38);
+ --line: rgba(26,32,24,0.10);
+ --card-bg: rgba(26,32,24,0.04);
+ --header-bg: rgba(244,247,242,0.92);
+}
+
+*, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }
+html { scroll-behavior: smooth; }
+
+body {
+ background: var(--bg);
+ color: var(--ink);
+ font-family: -apple-system, "SF Pro Display", system-ui, sans-serif;
+ line-height: 1.6;
+ transition: background 0.3s, color 0.3s;
+}
+
+/* ===== HEADER ===== */
+.header {
+ position: sticky; top: 0; z-index: 100;
+ background: var(--header-bg);
+ backdrop-filter: blur(8px);
+ -webkit-backdrop-filter: blur(8px);
+ border-bottom: 1px solid var(--line);
+ padding: 0 2rem;
+ height: 64px;
+ display: flex; align-items: center; justify-content: space-between;
+}
+.header-brand { display: flex; align-items: center; gap: 12px; text-decoration: none; }
+.brand-dot {
+ width: 28px; height: 28px; border-radius: 50%; flex-shrink: 0;
+ background: radial-gradient(circle at 35% 35%, #7a9b6e 0%, #558048 60%, #2e5228 100%);
+ box-shadow: 0 0 0 1px var(--line), 0 2px 12px var(--accent-glow);
+}
+.brand-name {
+ font-family: 'Playfair Display', Georgia, serif;
+ font-size: 1.1rem; font-weight: 500;
+ color: var(--ink); letter-spacing: 0.01em;
+}
+.header-nav { display: flex; align-items: center; gap: 1.5rem; }
+.header-nav a {
+ color: var(--ink-soft); text-decoration: none; font-size: 0.85rem;
+ letter-spacing: 0.06em; text-transform: uppercase; transition: color 0.2s;
+}
+.header-nav a:hover { color: var(--accent); }
+.theme-toggle {
+ background: none; border: 1px solid var(--line); border-radius: 50%;
+ width: 36px; height: 36px; cursor: pointer; display: flex;
+ align-items: center; justify-content: center;
+ color: var(--ink-soft); transition: border-color 0.2s, color 0.2s;
+}
+.theme-toggle:hover { border-color: var(--accent); color: var(--accent); }
+
+/* ===== HERO ===== */
+.hero {
+ position: relative; height: 88vh; min-height: 560px;
+ overflow: hidden; display: flex; align-items: center; justify-content: center;
+}
+.hero-img {
+ position: absolute; inset: 0;
+ background-image: url('https://cdn.shopify.com/s/files/1/0015/4117/7456/files/2022101_5_060796c6-a8c9-450d-a5b7-c0e35f41109a.jpg');
+ background-size: cover; background-position: center 30%;
+}
+.hero-overlay {
+ position: absolute; inset: 0;
+ background: linear-gradient(135deg,
+ rgba(10,10,10,0.75) 0%,
+ rgba(10,10,10,0.30) 60%,
+ rgba(10,10,10,0.70) 100%);
+}
+.hero-content {
+ position: relative; z-index: 2;
+ max-width: 700px; padding: 2rem;
+ text-align: left;
+}
+.hero-pill {
+ display: inline-block; padding: 0.3rem 1rem;
+ border: 1px solid var(--accent); border-radius: 100px;
+ font-size: 0.72rem; letter-spacing: 0.18em; text-transform: uppercase;
+ color: var(--accent); margin-bottom: 1.4rem;
+ background: rgba(122,155,110,0.12);
+ backdrop-filter: blur(8px);
+ -webkit-backdrop-filter: blur(8px);
+}
+.hero h1 {
+ font-family: 'Playfair Display', Georgia, serif;
+ font-size: clamp(2.8rem, 5.5vw, 4.8rem);
+ font-weight: 400; line-height: 1.1;
+ color: #f5f1e8; margin-bottom: 1.2rem;
+ text-shadow: 0 2px 20px rgba(0,0,0,0.5);
+}
+.hero-tagline {
+ font-size: 1.05rem; color: rgba(245,241,232,0.80);
+ max-width: 440px; line-height: 1.7;
+}
+
+/* ===== SECTION MARKER ===== */
+.section-marker {
+ position: sticky; top: 64px; z-index: 90;
+ background: rgba(10,10,10,0.85);
+ backdrop-filter: blur(12px);
+ -webkit-backdrop-filter: blur(12px);
+ border-bottom: 1px solid var(--rule);
+ padding: 0.5rem 2rem;
+ font-size: 0.72rem; letter-spacing: 0.18em; text-transform: uppercase;
+ color: var(--accent);
+}
+[data-theme="light"] .section-marker { background: rgba(244,247,242,0.88); }
+
+/* ===== INTRO ===== */
+.section { padding: 5rem 2rem; max-width: 960px; margin: 0 auto; }
+.section-label {
+ font-size: 0.7rem; letter-spacing: 0.22em; text-transform: uppercase;
+ color: var(--accent); margin-bottom: 0.6rem;
+}
+.section h2 {
+ font-family: 'Playfair Display', Georgia, serif;
+ font-size: clamp(1.8rem, 3vw, 2.6rem);
+ font-weight: 400; margin-bottom: 1.5rem; line-height: 1.2;
+}
+.intro-text { font-size: 1.05rem; color: var(--ink-soft); max-width: 680px; line-height: 1.85; }
+
+/* ===== CARD STACK (scroll-snap) ===== */
+.card-stack {
+ display: grid;
+ grid-template-columns: 1fr;
+ gap: 0;
+}
+.def-card {
+ scroll-snap-align: start;
+ background: var(--card-bg);
+ border: 1px solid var(--line);
+ border-radius: 12px;
+ padding: 2rem 2.2rem;
+ margin-bottom: 1rem;
+ backdrop-filter: blur(20px) saturate(180%);
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
+ transition: transform 0.25s, box-shadow 0.25s, border-color 0.25s;
+ display: grid;
+ grid-template-columns: 3fr 5fr;
+ gap: 1.5rem;
+ align-items: start;
+}
+.def-card:hover {
+ transform: translateY(-2px);
+ box-shadow: 0 8px 32px var(--accent-glow);
+ border-color: rgba(122,155,110,0.28);
+}
+.def-term {
+ font-family: 'Playfair Display', Georgia, serif;
+ font-size: 1.3rem; font-weight: 500; color: var(--accent);
+ line-height: 1.3;
+ padding-top: 0.1rem;
+}
+.def-body { font-size: 0.97rem; color: var(--ink-soft); line-height: 1.8; }
+.def-tag {
+ display: inline-block; margin-top: 0.6rem; padding: 0.2rem 0.7rem;
+ border: 1px solid var(--accent-dim); border-radius: 100px;
+ font-size: 0.7rem; letter-spacing: 0.12em; text-transform: uppercase;
+ color: var(--accent);
+}
+
+/* ===== IMAGE BREAK ===== */
+.image-break {
+ margin: 2.5rem 0; border-radius: 12px; overflow: hidden;
+ border: 1px solid var(--line); position: relative;
+}
+.image-break img {
+ width: 100%; height: 300px; object-fit: cover; display: block;
+}
+.image-break-caption {
+ position: absolute; bottom: 0; left: 0; right: 0;
+ background: rgba(10,10,10,0.78);
+ backdrop-filter: blur(12px);
+ -webkit-backdrop-filter: blur(12px);
+ padding: 0.9rem 1.2rem;
+ font-size: 0.82rem; color: var(--ink-soft);
+ font-family: 'Playfair Display', Georgia, serif;
+ font-style: italic;
+}
+[data-theme="light"] .image-break-caption { background: rgba(244,247,242,0.85); }
+
+/* ===== CTA ===== */
+.cta-section {
+ background: var(--card-bg);
+ border: 1px solid var(--line);
+ border-radius: 16px;
+ padding: 4rem 3rem; text-align: center;
+ backdrop-filter: blur(20px) saturate(180%);
+ -webkit-backdrop-filter: blur(20px) saturate(180%);
+ margin: 4rem auto; max-width: 760px;
+}
+.cta-section h2 {
+ font-family: 'Playfair Display', Georgia, serif;
+ font-size: 2rem; font-weight: 400; margin-bottom: 1rem;
+}
+.cta-section p { color: var(--ink-soft); margin-bottom: 2rem; }
+.cta-btn {
+ display: inline-block; padding: 0.9rem 2.5rem;
+ background: var(--accent); color: #fff;
+ text-decoration: none; border-radius: 4px;
+ font-weight: 600; font-size: 0.88rem; letter-spacing: 0.08em;
+ text-transform: uppercase; transition: opacity 0.2s, transform 0.2s;
+}
+.cta-btn:hover { opacity: 0.88; transform: translateY(-1px); }
+
+/* ===== FOOTER ===== */
+.footer {
+ border-top: 1px solid var(--line);
+ padding: 2.5rem 2rem; text-align: center;
+ color: var(--ink-faint); font-size: 0.82rem;
+}
+.footer a { color: var(--accent); text-decoration: none; }
+
+@media (max-width: 680px) {
+ .header-nav { display: none; }
+ .def-card { grid-template-columns: 1fr; }
+ .hero h1 { font-size: 2.2rem; }
+}
+</style>
+<script>
+(function(){
+ var t = localStorage.getItem('theme') || 'dark';
+ document.documentElement.setAttribute('data-theme', t);
+})();
+</script>
+</head>
+<body>
+
+<header class="header">
+ <a href="/" class="header-brand">
+ <div class="brand-dot"></div>
+ <span class="brand-name">Wallpaper Definitions</span>
+ </a>
+ <nav class="header-nav">
+ <a href="#definitions">Definitions</a>
+ <a href="#cta">Browse Catalog</a>
+ <a href="https://designerwallcoverings.com" target="_blank">DW</a>
+ </nav>
+ <button class="theme-toggle" id="themeToggle" aria-label="Toggle dark/light mode">
+ <svg id="iconSun" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" style="display:none"><circle cx="12" cy="12" r="5"/><line x1="12" y1="1" x2="12" y2="3"/><line x1="12" y1="21" x2="12" y2="23"/><line x1="4.22" y1="4.22" x2="5.64" y2="5.64"/><line x1="18.36" y1="18.36" x2="19.78" y2="19.78"/><line x1="1" y1="12" x2="3" y2="12"/><line x1="21" y1="12" x2="23" y2="12"/><line x1="4.22" y1="19.78" x2="5.64" y2="18.36"/><line x1="18.36" y1="5.64" x2="19.78" y2="4.22"/></svg>
+ <svg id="iconMoon" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2"><path d="M21 12.79A9 9 0 1 1 11.21 3 7 7 0 0 0 21 12.79z"/></svg>
+ </button>
+</header>
+
+<section class="hero">
+ <div class="hero-img"></div>
+ <div class="hero-overlay"></div>
+ <div class="hero-content">
+ <span class="hero-pill">Plain English</span>
+ <h1>Wallpaper<br>Definitions</h1>
+ <p class="hero-tagline">The wallcovering world has its own language. We've translated every concept into plain English — so you can shop, specify, and install with confidence.</p>
+ </div>
+</section>
+
+<div class="section-marker">Plain-Language Concepts</div>
+
+<section class="section" id="intro">
+ <p class="section-label">About This Guide</p>
+ <h2>Wallpaper, explained simply</h2>
+ <p class="intro-text">You should not need a trade degree to understand a product data sheet. This reference translates the twenty most important wallcovering concepts — from material types to installation methods to pattern specifications — into language that is precise without being jargon-heavy. Each definition is written for the reader who is smart but not yet specialized.</p>
+</section>
+
+<section class="section" id="definitions">
+ <p class="section-label">20 Core Concepts</p>
+ <h2>What does it mean?</h2>
+
+ <div class="card-stack">
+
+ <div class="def-card">
+ <div class="def-term">Non-Woven</div>
+ <div>
+ <div class="def-body">A non-woven backing is made by bonding fibers together with heat and pressure, rather than weaving or knitting them. Think of it as a very precise felt. It is dimensionally stable, which means it does not stretch or shrink when wet — making it the easiest substrate to hang and the easiest to remove when you want to redecorate.</div>
+ <span class="def-tag">Installation</span>
+ </div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Paste-the-Wall</div>
+ <div>
+ <div class="def-body">Instead of pasting the back of each wallpaper strip, you spread adhesive directly onto the wall. The dry strip goes up and can be slid into position before it sticks. This method works only with non-woven wallcoverings and is significantly faster and less messy than traditional paste-the-paper installation.</div>
+ <span class="def-tag">Installation</span>
+ </div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Paste-the-Paper</div>
+ <div>
+ <div class="def-body">The traditional method: you paste the back of each cut strip, fold it loosely (called "booking") to let the adhesive absorb, and then hang it. Required for many natural fiber, grasscloth, and fine paper wallcoverings whose backing would swell unevenly if paste were applied to the wall first.</div>
+ <span class="def-tag">Installation</span>
+ </div>
+ </div>
+
+ <!-- IMAGE BREAK 1 -->
+ <div class="image-break">
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/2020205_50_a98ae134-3d4e-44a9-91a1-1e0e93c34a22.jpg" alt="Marion Print Indigo wallcovering in a styled room" loading="lazy">
+ <div class="image-break-caption">Lee Jofa "Marion Print Indigo" — a paste-the-wall compatible non-woven product with a straight-match pattern repeat.</div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Strippable</div>
+ <div>
+ <div class="def-body">A strippable wallcovering comes off the wall in one dry piece when you pull it from a corner. No soaking, no scraping, no mess. If you plan to redecorate in a few years, strippable is the feature to look for. Most modern non-woven wallcoverings are strippable.</div>
+ <span class="def-tag">Removal</span>
+ </div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Pattern Repeat</div>
+ <div>
+ <div class="def-body">The vertical distance after which the pattern starts again. A 24-inch repeat means every 24 inches of wallpaper length is one complete design cycle. When calculating how many rolls you need, larger repeats mean more material waste — because each strip has to be cut at the right point in the pattern regardless of ceiling height.</div>
+ <span class="def-tag">Pattern</span>
+ </div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Drop Match</div>
+ <div>
+ <div class="def-body">In a drop-match pattern, the design on the left edge of one strip does not align at the same height as the right edge of the adjacent strip. Instead, it drops — usually by half the repeat distance. This is the most common match type for floral, diagonal, and organic patterns. It requires more material than a straight match but creates a more naturalistic, less grid-like wall.</div>
+ <span class="def-tag">Pattern</span>
+ </div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Book Match</div>
+ <div>
+ <div class="def-body">A hanging technique where every other strip is flipped before installation. The result mirrors the pattern at each seam, like the two facing pages of an open book. Required for grasscloth, seagrass, sisal, and many natural fiber wallcoverings to disguise the fact that the weave direction reverses slightly between rolls.</div>
+ <span class="def-tag">Installation</span>
+ </div>
+ </div>
+
+ <!-- IMAGE BREAK 2 -->
+ <div class="image-break">
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/2006101_517_86aa6f6e-b809-41ef-903c-7aa4fd878a79.jpg" alt="Chinese Lantern Coral wallcovering in a light-filled room" loading="lazy">
+ <div class="image-break-caption">Lee Jofa "Chinese Lantern Coral" — a classic drop-match pattern requiring careful alignment at each strip seam.</div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Grasscloth</div>
+ <div>
+ <div class="def-body">Natural plant fibers — jute, seagrass, sisal, or abaca — woven into a mat and laminated to a paper or non-woven backing. The defining characteristic is its organic texture: no two sections look identical, and color naturally varies between rolls. This is a feature, not a flaw. Grasscloth is not washable; it handles humidity gracefully but does not tolerate direct moisture or grease.</div>
+ <span class="def-tag">Material</span>
+ </div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Vinyl</div>
+ <div>
+ <div class="def-body">Polyvinyl chloride applied as a face coating over a backing substrate. The most washable and durable category of wallcovering. Ranges from thin residential grades (scrubbable, good for bathrooms and kitchens) to heavy commercial Type II vinyl (used in hospitals and hotels). Vinyl is moisture-resistant but not breathable.</div>
+ <span class="def-tag">Material</span>
+ </div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Flock</div>
+ <div>
+ <div class="def-body">Flock wallpaper has a raised, velvety surface created by embedding tiny fibers into an adhesive-printed pattern. The technique originated in 17th-century England and was used to mimic expensive silk cut velvet. Modern flock ranges from historically accurate reproductions to contemporary sculptural designs.</div>
+ <span class="def-tag">Material</span>
+ </div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Dye Lot</div>
+ <div>
+ <div class="def-body">Every batch of wallcovering produced in a single print run has a dye lot number. Natural color variation between batches is normal and inevitable. Always order enough rolls from the same dye lot to complete your project — and add at least one extra roll for repairs. Mixing lots on a single wall will be visible.</div>
+ <span class="def-tag">Ordering</span>
+ </div>
+ </div>
+
+ <!-- IMAGE BREAK 3 -->
+ <div class="image-break">
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/GWF-3733_151_8c242f7c-5c7d-4f82-878d-09235ca682d0.jpg" alt="Brink Delft Blue wallcovering in a contemporary interior" loading="lazy">
+ <div class="image-break-caption">Groundworks "Brink Delft" — a screen-printed geometric pattern; each colorway is a separate dye lot.</div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Roll Length</div>
+ <div>
+ <div class="def-body">How many linear yards (or meters) of wallcovering come in one roll. Standard single rolls in the US are approximately 11 yards (10 meters). European single rolls are often identical. Double rolls — the most common retail package — provide about 22 yards. Always check the product label: a "double roll" sold as a single priced unit is the norm, not a buy-one-get-one.</div>
+ <span class="def-tag">Ordering</span>
+ </div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Colorway</div>
+ <div>
+ <div class="def-body">A single color version of a wallcovering pattern. The same design printed in sage green is a different colorway from the same design printed in charcoal. Each colorway has its own SKU and its own dye lot. When ordering, confirm you have the correct colorway number — not just the pattern name.</div>
+ <span class="def-tag">Pattern</span>
+ </div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Screen Print</div>
+ <div>
+ <div class="def-body">A printing method where ink is forced through a fine mesh screen — one screen per color — onto the wallcovering substrate. Screen printing delivers dense, opaque color with sharp edges. The more colors in a design, the more screens required, which is why high-color-count screen-print wallcoverings command a premium price.</div>
+ <span class="def-tag">Production</span>
+ </div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Digital Print</div>
+ <div>
+ <div class="def-body">A large-format inkjet process that prints directly onto wallcovering substrate. Unlike screen printing, digital has no setup costs and can produce an unlimited number of colors and gradients. It has revolutionized custom mural and small-run production. Most digital wallcovering today is printed on non-woven substrates and is paste-the-wall compatible.</div>
+ <span class="def-tag">Production</span>
+ </div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Mural</div>
+ <div>
+ <div class="def-body">A single, non-repeating image designed to cover one specific wall surface. The artwork is divided into numbered panels (typically 2 to 8, depending on wall width) that must be hung in sequence. Unlike tiled wallcovering, a mural cannot be rearranged or trimmed on any edge without disrupting the composition.</div>
+ <span class="def-tag">Format</span>
+ </div>
+ </div>
+
+ <!-- IMAGE BREAK 4 -->
+ <div class="image-break">
+ <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Indienne_Poona_18300_Roomshot_Web_LR-medium-two-thirds.jpg" alt="Poona Cinnamon wallcovering with warm botanical tones" loading="lazy">
+ <div class="image-break-caption">Arte International "Poona Cinnamon" — a digitally printed natural-look pattern on a paste-the-wall non-woven backing.</div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Pre-Pasted</div>
+ <div>
+ <div class="def-body">Wallcovering with a dry adhesive coating already applied at the factory. You activate it by running each strip through a water tray or by dampening it with a sponge. Pre-pasted is convenient for DIY projects. Professional installers often apply additional adhesive to extend working time and improve adhesion on challenging surfaces.</div>
+ <span class="def-tag">Installation</span>
+ </div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Width</div>
+ <div>
+ <div class="def-body">The horizontal dimension of the wallcovering roll in its trimmed state. US residential standard is typically 20.5 to 27 inches. European standard is 20.5 inches (52 cm). Commercial wide-width goods can reach 48 or 54 inches, reducing the number of seams on a large wall. Width, combined with roll length and repeat, determines how many rolls a project requires.</div>
+ <span class="def-tag">Specification</span>
+ </div>
+ </div>
+
+ <div class="def-card">
+ <div class="def-term">Memo Sample</div>
+ <div>
+ <div class="def-body">A full-width cutting of a wallcovering — typically 8 to 18 inches long — sent to a designer or consumer before a purchase commitment. Memo samples show the true color, texture, and scale of the pattern in your actual space and lighting. Designer Wallcoverings ships memo samples at no charge.</div>
+ <span class="def-tag">Trade Practice</span>
+ </div>
+ </div>
+
+ </div>
+</section>
+
+<div class="section-marker">Ready to Choose?</div>
+
+<section class="section" id="cta">
+ <div class="cta-section">
+ <h2>See it in your space before you commit</h2>
+ <p>Every wallcovering in the Designer Wallcoverings catalog is available as a free memo sample. Our trade service team helps you calculate yardage, confirm dye lots, and match finishes to your specification.</p>
+ <a href="https://designerwallcoverings.com" target="_blank" class="cta-btn">Browse the Catalog</a>
+ </div>
+</section>
+
+<footer class="footer">
+ <p>© 2026 Wallpaper Definitions — A resource by <a href="https://designerwallcoverings.com">Designer Wallcoverings</a></p>
+ <p style="margin-top:0.5rem;"><a href="mailto:info@wallpaperdefinitions.com">info@wallpaperdefinitions.com</a></p>
+</footer>
+
+<script>
+const toggle = document.getElementById('themeToggle');
+const sun = document.getElementById('iconSun');
+const moon = document.getElementById('iconMoon');
+function applyTheme(t) {
+ document.documentElement.setAttribute('data-theme', t);
+ localStorage.setItem('theme', t);
+ sun.style.display = t === 'light' ? 'block' : 'none';
+ moon.style.display = t === 'dark' ? 'block' : 'none';
+}
+applyTheme(localStorage.getItem('theme') || 'dark');
+toggle.addEventListener('click', () => {
+ const current = document.documentElement.getAttribute('data-theme');
+ applyTheme(current === 'dark' ? 'light' : 'dark');
+});
+</script>
+</body>
+</html>
diff --git a/server.js b/server.js
new file mode 100644
index 0000000..8de717d
--- /dev/null
+++ b/server.js
@@ -0,0 +1,14 @@
+const express = require('express');
+const path = require('path');
+const app = express();
+const PORT = process.env.PORT || 9901;
+
+app.use(express.static(path.join(__dirname, 'public')));
+
+app.get('/health', (req, res) => res.json({ status: 'ok', site: 'wallpaperdefinitions.com' }));
+
+app.get('/', (req, res) => {
+ res.sendFile(path.join(__dirname, 'public', 'index.html'));
+});
+
+app.listen(PORT, () => console.log(`wallpaperdefinitions.com :${PORT}`));
(oldest)
·
back to Wallpaperdefinitions
·
snapshot before hamburger nav rollout 6c9f50f →