[object Object]

← back to Wallpaperdictionary

initial scaffold: wallpaperdictionary.com A-Z reference site

7fc56ff13e37991a75e3a0543eb6d386c082d33c · 2026-05-07 16:41:12 -0700 · Steve Abrams

Files touched

Diff

commit 7fc56ff13e37991a75e3a0543eb6d386c082d33c
Author: Steve Abrams <steve@designerwallcoverings.com>
Date:   Thu May 7 16:41:12 2026 -0700

    initial scaffold: wallpaperdictionary.com A-Z reference site
---
 .gitignore        |   7 +
 package-lock.json | 842 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
 package.json      |  12 +
 public/index.html | 780 ++++++++++++++++++++++++++++++++++++++++++++++++++
 server.js         |  14 +
 5 files changed, 1655 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..67c5e5a
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,842 @@
+{
+  "name": "wallpaperdictionary",
+  "version": "0.1.0",
+  "lockfileVersion": 3,
+  "requires": true,
+  "packages": {
+    "": {
+      "name": "wallpaperdictionary",
+      "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..da03545
--- /dev/null
+++ b/package.json
@@ -0,0 +1,12 @@
+{
+  "name": "wallpaperdictionary",
+  "version": "0.1.0",
+  "description": "A-Z dictionary of wallpaper terms — wallpaperdictionary.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..b3f6168
--- /dev/null
+++ b/public/index.html
@@ -0,0 +1,780 @@
+<!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 Dictionary | A-Z Guide to Wallcovering Terms | Designer Wallcoverings</title>
+<meta name="description" content="The definitive A-Z dictionary of wallpaper and wallcovering terms. Free expert guidance, trade samples, and hand-picked selections at Designer Wallcoverings.">
+<link rel="preconnect" href="https://fonts.googleapis.com">
+<link href="https://fonts.googleapis.com/css2?family=Cormorant+Garamond:ital,wght@0,300;0,400;0,500;0,600;0,700;1,300;1,400;1,500&display=swap" rel="stylesheet">
+<script type="application/ld+json">
+{
+  "@context": "https://schema.org",
+  "@type": "WebSite",
+  "name": "Wallpaper Dictionary",
+  "url": "https://wallpaperdictionary.com",
+  "description": "A-Z dictionary of wallpaper and wallcovering terms",
+  "publisher": {
+    "@type": "Organization",
+    "name": "Designer Wallcoverings",
+    "url": "https://designerwallcoverings.com"
+  }
+}
+</script>
+<style>
+/* ===== CSS VARIABLES / THEME ===== */
+: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: #c9a14b;
+  --accent-dim: rgba(201,161,75,0.18);
+  --accent-glow: rgba(201,161,75,0.30);
+  --rule: rgba(245,241,232,0.10);
+}
+[data-theme="light"] {
+  --bg: #faf8f3;
+  --ink: #1a1714;
+  --ink-soft: rgba(26,23,20,0.72);
+  --ink-faint: rgba(26,23,20,0.38);
+  --line: rgba(26,23,20,0.10);
+  --card-bg: rgba(26,23,20,0.04);
+  --header-bg: rgba(250,248,243,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%, #c9a14b 0%, #a07830 60%, #6b4d1a 100%);
+  box-shadow: 0 0 0 1px var(--line), 0 2px 12px var(--accent-glow);
+}
+.brand-name {
+  font-family: 'Cormorant Garamond', Georgia, serif;
+  font-size: 1.2rem; font-weight: 500;
+  color: var(--ink); letter-spacing: 0.02em;
+}
+.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); }
+
+/* ===== ALPHABET RIBBON ===== */
+.alphabet-ribbon {
+  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.6rem 2rem;
+  display: flex; gap: 0.5rem; flex-wrap: wrap; justify-content: center;
+}
+[data-theme="light"] .alphabet-ribbon { background: rgba(250,248,243,0.88); }
+.alpha-link {
+  width: 28px; height: 28px; border-radius: 4px;
+  display: flex; align-items: center; justify-content: center;
+  text-decoration: none; font-size: 0.78rem; font-weight: 600;
+  letter-spacing: 0.04em; color: var(--ink-soft);
+  border: 1px solid transparent;
+  transition: all 0.2s;
+}
+.alpha-link:hover {
+  background: var(--accent-dim); border-color: var(--accent);
+  color: var(--accent);
+}
+
+/* ===== HERO ===== */
+.hero {
+  position: relative; height: 85vh; min-height: 540px;
+  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/LesTapisseries_Floraison_97870_Roomshot_Web_LR-medium-two-thirds.jpg');
+  background-size: cover; background-position: center;
+  transform: scale(1.04);
+  transition: transform 8s ease-out;
+}
+.hero:hover .hero-img { transform: scale(1.0); }
+.hero-overlay {
+  position: absolute; inset: 0;
+  background: linear-gradient(to bottom,
+    rgba(10,10,10,0.55) 0%,
+    rgba(10,10,10,0.35) 40%,
+    rgba(10,10,10,0.80) 100%);
+}
+.hero-content {
+  position: relative; z-index: 2;
+  text-align: center; padding: 2rem;
+  max-width: 760px;
+}
+.hero-label {
+  font-size: 0.72rem; letter-spacing: 0.2em; text-transform: uppercase;
+  color: var(--accent); margin-bottom: 1rem;
+}
+.hero h1 {
+  font-family: 'Cormorant Garamond', Georgia, serif;
+  font-size: clamp(2.8rem, 6vw, 5.2rem);
+  font-weight: 300; line-height: 1.05;
+  color: #f5f1e8; margin-bottom: 1.2rem;
+  text-shadow: 0 2px 24px rgba(0,0,0,0.5);
+}
+.hero h1 em { font-style: italic; color: var(--accent); }
+.hero-tagline {
+  font-size: 1.1rem; color: rgba(245,241,232,0.82);
+  max-width: 480px; margin: 0 auto;
+  font-family: 'Cormorant Garamond', Georgia, serif;
+  font-style: italic;
+}
+
+/* ===== SECTIONS ===== */
+.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: 'Cormorant Garamond', Georgia, serif;
+  font-size: clamp(1.8rem, 3.5vw, 2.8rem);
+  font-weight: 400; margin-bottom: 1.5rem; line-height: 1.2;
+}
+.intro-text { font-size: 1.08rem; color: var(--ink-soft); max-width: 680px; line-height: 1.8; }
+
+/* ===== LETTER GROUP ===== */
+.letter-group { margin-bottom: 3.5rem; }
+.letter-anchor {
+  display: inline-block;
+  font-family: 'Cormorant Garamond', Georgia, serif;
+  font-size: 3.5rem; font-weight: 300; color: var(--accent);
+  line-height: 1; margin-bottom: 1rem;
+  border-bottom: 1px solid var(--accent-dim); padding-bottom: 0.4rem;
+  width: 100%;
+}
+.term-card {
+  background: var(--card-bg);
+  border: 1px solid var(--line);
+  border-radius: 8px;
+  padding: 1.2rem 1.5rem;
+  margin-bottom: 0.75rem;
+  backdrop-filter: blur(20px) saturate(180%);
+  -webkit-backdrop-filter: blur(20px) saturate(180%);
+  transition: transform 0.2s, box-shadow 0.2s, border-color 0.2s;
+}
+.term-card:hover {
+  transform: translateY(-1px);
+  box-shadow: 0 4px 24px var(--accent-glow);
+  border-color: rgba(201,161,75,0.25);
+}
+.term-word {
+  font-family: 'Cormorant Garamond', Georgia, serif;
+  font-size: 1.2rem; font-weight: 600; color: var(--accent);
+  margin-bottom: 0.4rem;
+}
+.term-def { font-size: 0.95rem; color: var(--ink-soft); line-height: 1.7; }
+
+/* ===== IMAGE BREAK ===== */
+.image-break {
+  margin: 3rem 0; border-radius: 12px; overflow: hidden;
+  position: relative;
+  border: 1px solid var(--line);
+}
+.image-break img {
+  width: 100%; height: 340px; 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: 'Cormorant Garamond', Georgia, serif;
+  font-style: italic;
+}
+[data-theme="light"] .image-break-caption { background: rgba(250,248,243,0.85); }
+
+/* ===== STICKY SECTION MARKER ===== */
+.section-marker {
+  position: sticky; top: calc(64px + 42px);
+  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); z-index: 80;
+}
+[data-theme="light"] .section-marker { background: rgba(250,248,243,0.88); }
+
+/* ===== 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: 'Cormorant Garamond', Georgia, serif;
+  font-size: 2.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: #0a0a0a;
+  text-decoration: none; border-radius: 4px;
+  font-weight: 600; font-size: 0.9rem; 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: 600px) {
+  .header-nav { display: none; }
+  .hero h1 { font-size: 2.4rem; }
+  .alphabet-ribbon { gap: 0.3rem; }
+  .cta-section { padding: 2.5rem 1.5rem; }
+}
+</style>
+<script>
+// Anti-flash theme init
+(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 Dictionary</span>
+  </a>
+  <nav class="header-nav">
+    <a href="#dictionary">A–Z Terms</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>
+
+<nav class="alphabet-ribbon" aria-label="Jump to letter">
+  <a href="#A" class="alpha-link">A</a><a href="#B" class="alpha-link">B</a>
+  <a href="#C" class="alpha-link">C</a><a href="#D" class="alpha-link">D</a>
+  <a href="#E" class="alpha-link">E</a><a href="#F" class="alpha-link">F</a>
+  <a href="#G" class="alpha-link">G</a><a href="#H" class="alpha-link">H</a>
+  <a href="#I" class="alpha-link">I</a><a href="#J" class="alpha-link">J</a>
+  <a href="#K" class="alpha-link">K</a><a href="#L" class="alpha-link">L</a>
+  <a href="#M" class="alpha-link">M</a><a href="#N" class="alpha-link">N</a>
+  <a href="#O" class="alpha-link">O</a><a href="#P" class="alpha-link">P</a>
+  <a href="#Q" class="alpha-link">Q</a><a href="#R" class="alpha-link">R</a>
+  <a href="#S" class="alpha-link">S</a><a href="#T" class="alpha-link">T</a>
+  <a href="#U" class="alpha-link">U</a><a href="#V" class="alpha-link">V</a>
+  <a href="#W" class="alpha-link">W</a><a href="#X" class="alpha-link">X</a>
+  <a href="#Y" class="alpha-link">Y</a><a href="#Z" class="alpha-link">Z</a>
+</nav>
+
+<section class="hero">
+  <div class="hero-img"></div>
+  <div class="hero-overlay"></div>
+  <div class="hero-content">
+    <p class="hero-label">The Definitive Reference</p>
+    <h1>Wallpaper <em>Dictionary</em></h1>
+    <p class="hero-tagline">Every term, from abrasion resistance to zinc white — clearly defined for homeowners, designers, and trade professionals alike.</p>
+  </div>
+</section>
+
+<div class="section-marker">Reference Guide</div>
+
+<section class="section" id="intro">
+  <p class="section-label">About This Resource</p>
+  <h2>A complete language for wallcoverings</h2>
+  <p class="intro-text">The wallcovering industry has developed a precise vocabulary over five centuries of craft and commerce. Whether you are a first-time buyer trying to understand what "paste-the-wall" means or a seasoned interior designer specifying a non-woven grasscloth for a hospitality project, this dictionary is your starting point. Every term here is used in trade specifications, installation guides, and product data sheets — and now defined in plain, authoritative English.</p>
+</section>
+
+<section class="section" id="dictionary">
+  <p class="section-label">A–Z Terms</p>
+  <h2>The Dictionary</h2>
+
+  <!-- A -->
+  <div class="letter-group" id="A">
+    <span class="letter-anchor">A</span>
+    <div class="term-card">
+      <div class="term-word">Abrasion Resistance</div>
+      <div class="term-def">The ability of a wallcovering surface to withstand rubbing without showing wear or color loss. Rated on a numerical scale; higher ratings suit high-traffic corridors, hotel lobbies, and commercial installations.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Acrylic Coating</div>
+      <div class="term-def">A water-based protective layer applied to the face of a wallcovering that improves washability and UV resistance without compromising breathability.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Architectural Panel</div>
+      <div class="term-def">An oversized wallcovering section, typically 54" or wider, designed to span an entire wall surface as a single seamless graphic or pattern.</div>
+    </div>
+  </div>
+
+  <!-- IMAGE BREAK 1 -->
+  <div class="image-break">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/Indienne_Agra_18310_Roomshot_Web_LR-medium-two-thirds.jpg" alt="Agra Indienne wallcovering in a styled room setting" loading="lazy">
+    <div class="image-break-caption">Arte International "Agra" — an example of block-printed allover pattern, a foundational term in this dictionary.</div>
+  </div>
+
+  <!-- B -->
+  <div class="letter-group" id="B">
+    <span class="letter-anchor">B</span>
+    <div class="term-card">
+      <div class="term-word">Backing</div>
+      <div class="term-def">The substrate layer of a wallcovering — typically paper, non-woven, or fabric — to which the decorative face material is laminated. Backing type determines installation method and strippability.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Block Print</div>
+      <div class="term-def">A hand-printing technique using carved wooden or linoleum blocks inked individually and pressed to the substrate. Each impression is slightly unique, giving block-printed wallcovering its prized artisanal character.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Book Match</div>
+      <div class="term-def">A hanging method where alternating strips are reversed ("flipped") before installation, mirroring the pattern at each seam like the facing pages of an open book. Required by many grasscloth, silk, and natural fiber wallcoverings to conceal shading differences between rolls.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Breathable Wallcovering</div>
+      <div class="term-def">A product whose face and backing allow moisture vapor to pass through, reducing the risk of mold growth behind the wall. Non-woven and paper-backed grasscloth are inherently breathable; solid vinyl is not.</div>
+    </div>
+  </div>
+
+  <!-- C -->
+  <div class="letter-group" id="C">
+    <span class="letter-anchor">C</span>
+    <div class="term-card">
+      <div class="term-word">Chinoiserie</div>
+      <div class="term-def">A decorative style evoking Chinese and East Asian art, featuring pagodas, flora, fauna, and fantastical landscapes. Arrived in European wallcovering via Jesuit trade routes in the early 16th century and remains perennially fashionable.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Colorway</div>
+      <div class="term-def">A single color variation of a pattern. A design may be offered in multiple colorways — for example, "sage," "cream," and "charcoal" — each produced as a separate SKU.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Contract Grade</div>
+      <div class="term-def">Wallcovering rated to meet the performance requirements of commercial installations: minimum Class A fire rating, tested abrasion and scrub resistance, and often Type I or Type II classification per ASTM standards.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Cork Wallcovering</div>
+      <div class="term-def">Thin slices of natural cork laminated to a woven or paper backing. Provides acoustic dampening and distinctive organic texture. Available in natural buff tones or stained to a range of earth hues.</div>
+    </div>
+  </div>
+
+  <!-- D -->
+  <div class="letter-group" id="D">
+    <span class="letter-anchor">D</span>
+    <div class="term-card">
+      <div class="term-word">Digital Print</div>
+      <div class="term-def">Wallcovering produced by large-format inkjet printers, enabling unlimited colorways and custom scale or sizing. Has largely replaced screen printing for short-run and custom mural work since the 2010s.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Double Cut</div>
+      <div class="term-def">A seaming technique where two overlapping strips are cut simultaneously with a sharp blade, removing the overlap from both at once. Produces a tighter, near-invisible seam, especially on thick or embossed materials.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Drop Match</div>
+      <div class="term-def">A pattern alignment method where the design motif drops by a fixed amount — typically half the vertical repeat — between adjacent strips. Requires more material than a straight match because each strip must be cut with the offset accounted for.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Dye Lot</div>
+      <div class="term-def">A batch of wallcovering printed or woven in a single production run. Natural variations between dye lots are normal; always order all rolls from the same lot number to ensure color consistency across a room.</div>
+    </div>
+  </div>
+
+  <!-- IMAGE BREAK 2 -->
+  <div class="image-break">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/LesTapisseries_Bouquet_97910_Mood_Web_LR-hero_fbee8df6-a478-4711-bf0f-ad3cad8d696d.jpg" alt="Bouquet Emerald wallcovering showing a lush floral pattern" loading="lazy">
+    <div class="image-break-caption">Arte International "Bouquet Emerald" — a classic example of drop-match pattern construction across a full-repeat floral design.</div>
+  </div>
+
+  <!-- E -->
+  <div class="letter-group" id="E">
+    <span class="letter-anchor">E</span>
+    <div class="term-card">
+      <div class="term-word">Embossing</div>
+      <div class="term-def">A mechanical process that creates a raised or recessed surface texture on vinyl or paper wallcovering, simulating the look and feel of leather, grasscloth, linen, or fabric weaves.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Engineered Stripe</div>
+      <div class="term-def">A vertical stripe pattern designed so that the seams between strips fall invisibly within the stripe cadence. Eliminates the need to match a seam and simplifies installation significantly.</div>
+    </div>
+  </div>
+
+  <!-- F -->
+  <div class="letter-group" id="F">
+    <span class="letter-anchor">F</span>
+    <div class="term-card">
+      <div class="term-word">Flock Wallpaper</div>
+      <div class="term-def">Wallcovering with a velvety pile surface created by adhering fine fibers (originally wool, now often rayon or polyester) to a pattern printed in adhesive. A technique dating to 17th-century England; associated with formal Georgian and Victorian interiors.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Fire Rating</div>
+      <div class="term-def">A standardized measure of a wallcovering's resistance to flame spread and smoke development. Class A (or Class 1) is the most stringent and is typically required for commercial, healthcare, and hospitality applications.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Flat Match</div>
+      <div class="term-def">Also called straight match. A pattern alignment where the design motif aligns identically at the same height across every strip, requiring no drop offset between adjacent lengths.</div>
+    </div>
+  </div>
+
+  <!-- G -->
+  <div class="letter-group" id="G">
+    <span class="letter-anchor">G</span>
+    <div class="term-card">
+      <div class="term-word">Grasscloth</div>
+      <div class="term-def">A natural wallcovering woven from grasses — jute, seagrass, sisal, or abaca — on a paper or woven backing. Distinctive for its organic texture and inherent color variations. Not washable; a defining characteristic rather than a defect.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Grout Line</div>
+      <div class="term-def">A hairline gap that can appear at the seam between two strips if the paste dries too quickly or the paper shrinks. Prevented by proper wall preparation, adequate soaking time, and correct paste viscosity.</div>
+    </div>
+  </div>
+
+  <!-- H -->
+  <div class="letter-group" id="H">
+    <span class="letter-anchor">H</span>
+    <div class="term-card">
+      <div class="term-word">Hand</div>
+      <div class="term-def">The tactile quality of a wallcovering — how it feels to the touch. A soft hand suggests a supple, textile-like surface; a firm hand indicates a stiffer substrate more resistant to tearing or stretching during installation.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Horizontal Repeat</div>
+      <div class="term-def">The width of a single complete pattern unit measured across the roll. Determines how the pattern lines up at vertical seams. A 27" repeat on a 27" roll width produces a seamless tile; a repeat wider than the roll creates more complex matching requirements.</div>
+    </div>
+  </div>
+
+  <!-- I -->
+  <div class="letter-group" id="I">
+    <span class="letter-anchor">I</span>
+    <div class="term-card">
+      <div class="term-word">Ingrain Paper</div>
+      <div class="term-def">An uncoated, subtly textured wallpaper made with colored fibers mixed throughout the pulp rather than printed on the surface. Color runs through the entire thickness, making small tears less visible.</div>
+    </div>
+  </div>
+
+  <!-- IMAGE BREAK 3 -->
+  <div class="image-break">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/EssentialsLuxor_Thebe_19460_Roomshot_Web_LR-og.jpg" alt="Thebe Terra wallcovering in a warm-toned room" loading="lazy">
+    <div class="image-break-caption">Arte International "Thebe Terra" — a geometric pattern with a consistent horizontal repeat, illustrating the flat-match alignment method.</div>
+  </div>
+
+  <!-- J -->
+  <div class="letter-group" id="J">
+    <span class="letter-anchor">J</span>
+    <div class="term-card">
+      <div class="term-word">Jute</div>
+      <div class="term-def">A natural bast fiber woven into grasscloth or used as backing material. Jute-backed wallcoverings are prone to shrinkage if over-saturated with paste; they require careful handling during installation.</div>
+    </div>
+  </div>
+
+  <!-- K -->
+  <div class="letter-group" id="K">
+    <span class="letter-anchor">K</span>
+    <div class="term-card">
+      <div class="term-word">KD (Knock-Down) Finish</div>
+      <div class="term-def">A wall surface treatment that creates a lightly textured, mottled appearance — often used as a base for plain or lightly textured wallcoverings. The surface must be smoothed or "skim-coated" before hanging most fine papers.</div>
+    </div>
+  </div>
+
+  <!-- L -->
+  <div class="letter-group" id="L">
+    <span class="letter-anchor">L</span>
+    <div class="term-card">
+      <div class="term-word">Linen Wallcovering</div>
+      <div class="term-def">A woven textile wallcovering made from flax yarn on a paper or non-woven backing. Offers a refined, slightly irregular surface that reads as texture rather than pattern. Often used in board rooms, libraries, and upscale residences.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Lot Number</div>
+      <div class="term-def">See Dye Lot. The production batch identifier printed on each roll's label. Always verify matching lot numbers before cutting.</div>
+    </div>
+  </div>
+
+  <!-- M -->
+  <div class="letter-group" id="M">
+    <span class="letter-anchor">M</span>
+    <div class="term-card">
+      <div class="term-word">Mural</div>
+      <div class="term-def">A large-scale, non-repeating image designed to cover a single focal wall. Panels are numbered and hung in sequence. Unlike tiled wallcovering, a mural cannot be trimmed or rearranged without disrupting the composition.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Mylar</div>
+      <div class="term-def">A metallic polyester film laminated to a paper or fabric backing to create a highly reflective wallcovering surface. Popularized in the 1970s; today's versions are more refined, with controlled sheens ranging from satin to mirror-bright.</div>
+    </div>
+  </div>
+
+  <!-- N -->
+  <div class="letter-group" id="N">
+    <span class="letter-anchor">N</span>
+    <div class="term-card">
+      <div class="term-word">Nondirectional Pattern</div>
+      <div class="term-def">A pattern with no inherent top, bottom, or directional orientation. Any strip can be hung right-side up or inverted without disrupting the design — which reduces waste and simplifies installation around doors and windows.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Non-Woven</div>
+      <div class="term-def">A substrate made from a blend of natural and synthetic fibers bonded together without weaving. Dimensionally stable, tear-resistant, and paste-the-wall compatible. Has largely replaced paper as the dominant wallcovering backing.</div>
+    </div>
+  </div>
+
+  <!-- O -->
+  <div class="letter-group" id="O">
+    <span class="letter-anchor">O</span>
+    <div class="term-card">
+      <div class="term-word">Overlap Seam</div>
+      <div class="term-def">A seaming method where one strip slightly overlaps the adjacent strip. Common in commercial-grade vinyl applications where dimensional stability at the seam is critical. Not appropriate for fine paper or fragile textile wallcoverings.</div>
+    </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-og_2018d1c6-6247-46e3-959d-95569075202b.jpg" alt="Poona Stone wallcovering in a room with warm natural lighting" loading="lazy">
+    <div class="image-break-caption">Arte International "Poona Stone" — a non-directional botanical pattern that can be book-matched or straight-hung without pattern interruption.</div>
+  </div>
+
+  <!-- P -->
+  <div class="letter-group" id="P">
+    <span class="letter-anchor">P</span>
+    <div class="term-card">
+      <div class="term-word">Panoramic Wallpaper</div>
+      <div class="term-def">A non-repeating scenic design that wraps continuously around a room, creating the illusion of a landscape, garden, or architectural interior. The French manufacturer Zuber popularized the format with hand-block-printed panoramics beginning in 1804.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Paste-the-Paper</div>
+      <div class="term-def">A traditional installation method where adhesive is applied directly to the back of each strip before hanging. Required for many natural fiber and paper-backed wallcoverings. Strips typically need a "booking" period to absorb paste and relax.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Paste-the-Wall</div>
+      <div class="term-def">An installation method where adhesive is applied to the prepared wall surface rather than the wallcovering strip. Suitable for non-woven backed wallcoverings. Faster and cleaner than paste-the-paper; the strip can be repositioned more easily.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Peelable</div>
+      <div class="term-def">A wallcovering whose decorative face can be peeled away from its backing, which remains on the wall. The backing must then be soaked and removed separately before rehanging. Compare with strippable.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Pre-Pasted</div>
+      <div class="term-def">Wallcovering with a factory-applied layer of dry adhesive on the backing. Activated by wetting — typically by running the strip through a water tray. Convenient for DIY applications; professional installers often supplement with additional paste for longer open time.</div>
+    </div>
+  </div>
+
+  <!-- Q -->
+  <div class="letter-group" id="Q">
+    <span class="letter-anchor">Q</span>
+    <div class="term-card">
+      <div class="term-word">Quarter Drop</div>
+      <div class="term-def">A pattern offset where each adjacent strip drops by one quarter of the vertical repeat. Less common than half-drop; used in diamond and diagonal lattice patterns where equal distribution creates a continuous geometric field.</div>
+    </div>
+  </div>
+
+  <!-- R -->
+  <div class="letter-group" id="R">
+    <span class="letter-anchor">R</span>
+    <div class="term-card">
+      <div class="term-word">Random Match</div>
+      <div class="term-def">A pattern — often a texture, solid, or natural material simulation — that requires no deliberate alignment at seams. Any point on one strip can butt against any point on the adjacent strip.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Repeat</div>
+      <div class="term-def">The vertical distance after which a pattern motif begins again, measured from any identifiable point on the design. A 24" repeat means every 24 inches of length is one complete pattern unit. Larger repeats increase material waste.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Roll Length</div>
+      <div class="term-def">The length of wallcovering in a single roll, typically expressed in yards (US) or meters (European). Standard single rolls are approximately 11 yards (10 meters); double rolls provide approximately 22 yards (20.5 meters). Always verify before calculating coverage.</div>
+    </div>
+  </div>
+
+  <!-- S -->
+  <div class="letter-group" id="S">
+    <span class="letter-anchor">S</span>
+    <div class="term-card">
+      <div class="term-word">Scenic Wallpaper</div>
+      <div class="term-def">A pictorial wallcovering depicting a landscape, garden, urban scene, or narrative composition. Distinguished from murals by their traditional, repeating character; distinguished from block prints by their pictorial rather than decorative intent.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Screen Print</div>
+      <div class="term-def">A printing technique using woven mesh screens — one per color — through which ink is forced onto the substrate. Screen printing delivers rich, opaque color and is used for the most precise, craft-quality wallcovering production.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Strippable</div>
+      <div class="term-def">A wallcovering designed to be removed cleanly in a single dry strip, leaving the wall surface ready for repainting or rehanging without soaking or scraping. The gold standard for renovation-friendly installations.</div>
+    </div>
+  </div>
+
+  <!-- IMAGE BREAK 5 -->
+  <div class="image-break">
+    <img src="https://cdn.shopify.com/s/files/1/0015/4117/7456/files/EssentialsLuxor_Horus_19436_Roomshot_Web_LR-og.jpg" alt="Horus Bone wallcovering in an elegant interior" loading="lazy">
+    <div class="image-break-caption">Arte International "Horus Bone" — strippable non-woven construction; a practical choice for clients who renovate on a regular cycle.</div>
+  </div>
+
+  <!-- T -->
+  <div class="letter-group" id="T">
+    <span class="letter-anchor">T</span>
+    <div class="term-card">
+      <div class="term-word">Toile de Jouy</div>
+      <div class="term-def">An 18th-century French print tradition featuring pastoral, romantic, or historical scenes rendered in a single color on a contrasting ground. Named for the town of Jouy-en-Josas, where Christophe-Philippe Oberkampf established his factory in 1760.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Trompe-l'Oeil</div>
+      <div class="term-def">Meaning "deceives the eye" in French. Wallcovering designs that create convincing three-dimensional illusions — faux windows, stone arches, draped fabric, or architectural molding — on a flat surface.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Type I / Type II</div>
+      <div class="term-def">Commercial performance classifications per ASTM F793. Type I (7 oz/sq yd face weight) is suitable for light commercial use; Type II (13 oz/sq yd) withstands heavier traffic and more rigorous maintenance protocols.</div>
+    </div>
+  </div>
+
+  <!-- U -->
+  <div class="letter-group" id="U">
+    <span class="letter-anchor">U</span>
+    <div class="term-card">
+      <div class="term-word">Unbacked Paper</div>
+      <div class="term-def">Traditional wallpaper without a separate backing layer — the decorative print or coating is applied directly to the paper substrate. More fragile than backed alternatives; requires a skilled installer experienced in handling delicate paper goods.</div>
+    </div>
+  </div>
+
+  <!-- V -->
+  <div class="letter-group" id="V">
+    <span class="letter-anchor">V</span>
+    <div class="term-card">
+      <div class="term-word">Vertical Repeat</div>
+      <div class="term-def">See Repeat. The standard term for the measurement of one complete pattern unit along the length of a roll. Printed on the product label as "V.R." followed by the dimension.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Vinyl</div>
+      <div class="term-def">Polyvinyl chloride (PVC) applied as a face material to a fabric or paper backing. Ranges from lightweight residential grades to heavy Type II commercial specification. Washable, scrubbable, and highly durable; widely used in hospitality and healthcare settings.</div>
+    </div>
+  </div>
+
+  <!-- W -->
+  <div class="letter-group" id="W">
+    <span class="letter-anchor">W</span>
+    <div class="term-card">
+      <div class="term-word">Wainscoting</div>
+      <div class="term-def">The lower portion of a wall — typically the bottom third — finished differently from the upper portion. Wallcovering is often applied above a wainscot chair rail, with painted board-and-batten or paneling below.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Washable</div>
+      <div class="term-def">A wallcovering whose surface can be gently cleaned with a damp cloth and mild detergent without damage. Distinguished from "scrubbable," which withstands more vigorous cleaning. Both terms refer to the face; the seams are always more vulnerable.</div>
+    </div>
+    <div class="term-card">
+      <div class="term-word">Width</div>
+      <div class="term-def">The horizontal measurement of a wallcovering roll in its flat, trimmed state. Standard US residential widths run 20.5" to 27"; European widths are typically 20.5" (52 cm). Wide-width commercial goods may be 48", 54", or broader.</div>
+    </div>
+  </div>
+
+  <!-- X -->
+  <div class="letter-group" id="X">
+    <span class="letter-anchor">X</span>
+    <div class="term-card">
+      <div class="term-word">Xuan Paper</div>
+      <div class="term-def">A traditional Chinese paper made from paper mulberry bark, prized for its longevity and absorbency. Used as a substrate for hand-painted silk wallcovering panels in high-end bespoke installations.</div>
+    </div>
+  </div>
+
+  <!-- Y -->
+  <div class="letter-group" id="Y">
+    <span class="letter-anchor">Y</span>
+    <div class="term-card">
+      <div class="term-word">Yardage</div>
+      <div class="term-def">The total length of wallcovering required for a project, calculated by dividing wall area by usable yield per roll (accounting for repeat waste). Standard practice adds 10–15% overage for cuts, pattern matching, and repairs.</div>
+    </div>
+  </div>
+
+  <!-- Z -->
+  <div class="letter-group" id="Z">
+    <span class="letter-anchor">Z</span>
+    <div class="term-card">
+      <div class="term-word">Zinc White Ground</div>
+      <div class="term-def">A historically significant base coat for fine paper wallcovering production — zinc oxide mixed with linseed oil provided a bright, non-yellowing ground for printing. Largely replaced by titanium dioxide formulations in modern production.</div>
+    </div>
+  </div>
+
+</section>
+
+<div class="section-marker">Find the Right Wallcovering</div>
+
+<section class="section" id="cta">
+  <div class="cta-section">
+    <h2>Browse 8,000+ wallcoverings with free memo samples</h2>
+    <p>Designer Wallcoverings carries the industry's deepest selection — from hand-printed grasscloth to digital murals to Type II commercial vinyl. Order a free memo sample and let our trade specialists help you specify the right product for your project.</p>
+    <a href="https://designerwallcoverings.com" target="_blank" class="cta-btn">Explore the Full Catalog</a>
+  </div>
+</section>
+
+<footer class="footer">
+  <p>&copy; 2026 Wallpaper Dictionary — A resource by <a href="https://designerwallcoverings.com">Designer Wallcoverings</a></p>
+  <p style="margin-top:0.5rem;"><a href="mailto:info@wallpaperdictionary.com">info@wallpaperdictionary.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..6cf9733
--- /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 || 9900;
+
+app.use(express.static(path.join(__dirname, 'public')));
+
+app.get('/health', (req, res) => res.json({ status: 'ok', site: 'wallpaperdictionary.com' }));
+
+app.get('/', (req, res) => {
+  res.sendFile(path.join(__dirname, 'public', 'index.html'));
+});
+
+app.listen(PORT, () => console.log(`wallpaperdictionary.com :${PORT}`));

(oldest)  ·  back to Wallpaperdictionary  ·  snapshot before hamburger nav rollout 2ca5e04 →