diff --git a/kits/dashboard/app/package-lock.json b/kits/dashboard/app/package-lock.json
index 29febdb..f505bdc 100644
--- a/kits/dashboard/app/package-lock.json
+++ b/kits/dashboard/app/package-lock.json
@@ -779,9 +779,9 @@
}
},
"node_modules/@jridgewell/sourcemap-codec": {
- "version": "1.5.5",
- "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
- "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
+ "version": "1.6.0",
+ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.6.0.tgz",
+ "integrity": "sha512-T7jf+5zgsZHwNJ4lvQ7/aezbyk0nNX+zJVWpmHA7VYsEx7a7qr5Rg5IbtJFqkgze5Y2sruq1RUY8Q837Od7iFw==",
"dev": true,
"license": "MIT"
},
@@ -821,9 +821,9 @@
"license": "MIT"
},
"node_modules/@rollup/rollup-android-arm-eabi": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.62.4.tgz",
- "integrity": "sha512-RrPokAb7dmbxFoeO3TloqHyOjgye8RkBhSqmp4aJMIex4c9r46ZstPnleDQOq1t46VOVjwIuwNogIqbodV1Vvg==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.63.1.tgz",
+ "integrity": "sha512-UZ8sUxPTiHWYX9QNdJedb1kDZSpS1t/VPWBWGSgqHNi9w3Cu6IXvu2mzbhiTiPvtrqgTQJ+zqiAq2iPIPilpaQ==",
"cpu": [
"arm"
],
@@ -835,9 +835,9 @@
]
},
"node_modules/@rollup/rollup-android-arm64": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.62.4.tgz",
- "integrity": "sha512-JKuJc+pnpks2pjy7L/N3v/cAkZxYlnmuZoD840ldbMI5KDbC4iO9NKwPKYdjYFCMAIIlBzYSFHxIJVYzRo2/8A==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.63.1.tgz",
+ "integrity": "sha512-cQ4nFQABN5cDvDpbvJ7bMStCpnaVxynZrRMfUJYgxcIk9Sh54FIO1vtfkg0B69REjER77ioZ/ov+eAApx/KmLQ==",
"cpu": [
"arm64"
],
@@ -849,9 +849,9 @@
]
},
"node_modules/@rollup/rollup-darwin-arm64": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.62.4.tgz",
- "integrity": "sha512-krw5uS2STmvJ02x0uTXHbqQNuz+9eZ1iw+qXk9dmW2gvV4jV7O2hEoOnuhFrpOPiel1mBFtqbxYZZtC46hXLOw==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.63.1.tgz",
+ "integrity": "sha512-FQNqd1lRy/0QhDk3xeRIkSBiCpXCiDnZO3YLVdcDKN1UBiKToNftCzcXYNLshmPDUMlu2TdeS8tGcsU6f3YF1Q==",
"cpu": [
"arm64"
],
@@ -863,9 +863,9 @@
]
},
"node_modules/@rollup/rollup-darwin-x64": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.62.4.tgz",
- "integrity": "sha512-wsTxtgApb4PrOsNJIm0FZ1h3WvCC+k9uxLJ4ad75hgoS4NiRes2SoJFlDAyMwiUY8IssDqGcHbXuN0sx1tfF1A==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.63.1.tgz",
+ "integrity": "sha512-pvD16V939D3CloK0+qikpGaxiPrDUXTe7Y5cWOMkMSy7m1cawa8EGy/kXYi/G/cKAC4HDAbSnzCIk1WmsoOKXg==",
"cpu": [
"x64"
],
@@ -877,9 +877,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-arm64": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.62.4.tgz",
- "integrity": "sha512-GUOnQlyZe3yAXhWOtOMsn5Qkrv5E5mZXa0thbARWi5Ei2szlVXJFQhddZ4HbAzh8q92w5twp+CQvs/eFanz9YQ==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.63.1.tgz",
+ "integrity": "sha512-pcFGeL2345VwdTnJhA6zLbew+YgWB0qBG2+dMtXjCicf6+rm6kO6cOoh5VnTe0ZMrMRgRyuHmCJxZWrIdzYuOw==",
"cpu": [
"arm64"
],
@@ -891,9 +891,9 @@
]
},
"node_modules/@rollup/rollup-freebsd-x64": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.62.4.tgz",
- "integrity": "sha512-/Y7f3QuxjzPKsjA/rfEDa3+0vXqyjmJ50Ln8dPpCmWkKTrUoWHG1cWhTqaAMLob2m2nESWuC7yGrREz019Ztqg==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.63.1.tgz",
+ "integrity": "sha512-mRJlqSRulVzcKq/LKA6ICSIc3K/l4fzlVn/gePn2nXIHy8seRi5z/eeRE0d/XMBxcMldiXtQTSpRj0tkkC3g8Q==",
"cpu": [
"x64"
],
@@ -905,9 +905,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-gnueabihf": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.62.4.tgz",
- "integrity": "sha512-81wiiX3v7aqy+T+bT61TJ78yJjRquqFFTTbAPt08imfQQzkPIW8t6aJbkTagtCCrXMNc9D66+geqlK7ydLPNqA==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.63.1.tgz",
+ "integrity": "sha512-YDUNvVM85TI3g/1OpnqKP1h4NeW/j64DfWMf+G3M809xNk1bJSnpFp4sh83NpmVE5DXnkh8ULor4LTVZKoYLHw==",
"cpu": [
"arm"
],
@@ -919,9 +919,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm-musleabihf": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.62.4.tgz",
- "integrity": "sha512-9kmDIvNZqdoHOBZgNtpTBeLWYO/LVipM3H/j62P8848/l/VPEQL6N3uxU9pvP1oZAsXyC2MEnFP3ovRjo7WYNQ==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.63.1.tgz",
+ "integrity": "sha512-7Mcn71p9ZuQFAj+h+dhQXy/yeLePRS2yKRnmW1DijA9thKO5qap0GNOIQK4yQ6iP3SU0Mrb/yWo8h8vgRba8lw==",
"cpu": [
"arm"
],
@@ -933,9 +933,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-gnu": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.62.4.tgz",
- "integrity": "sha512-CcnXHWnXg69g+DX5VWL3FHts3qMRN2uVEHX+BZvGLdd07/gXkn3ePjYtO1LDJvxkGKVHMclKBRa1QUTH+6toYQ==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.63.1.tgz",
+ "integrity": "sha512-4YiLQTX6U4CSl0L9cluep9A9W6UmTfqBDc2/CH6wlu54pl4E7Jn3cOD8oxzvBDEGk/JMKgJ47C8g+radF7mwvg==",
"cpu": [
"arm64"
],
@@ -947,9 +947,9 @@
]
},
"node_modules/@rollup/rollup-linux-arm64-musl": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.62.4.tgz",
- "integrity": "sha512-iFOibiHnTRuhrWLlRsOQFdZJJIa7S8OwkneJr4ocALP16u5yk6lWLINFwhHaEqBFMsKDUZofLkGos7+CPzGB3g==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.63.1.tgz",
+ "integrity": "sha512-2ra8F7w8OquwZN9z2/fKFnli69wa8PLwaVzRMIPGb13ByMJwC28Fbp8YcVGoUhlYMTt7j5j9bNgpysrN2UM+vw==",
"cpu": [
"arm64"
],
@@ -961,9 +961,9 @@
]
},
"node_modules/@rollup/rollup-linux-loong64-gnu": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.62.4.tgz",
- "integrity": "sha512-XnWYMI7euHlb5a871xPja+Gm7DRCFU+FGRrtS2sMq9N8FvqtpagUy6gD4YOemC5MRk9xbh8+jYMEJbigFQwsgA==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.63.1.tgz",
+ "integrity": "sha512-Sy20ncyhjmBP0Ml+UvQbimjlk6VFgjW5uNP+qqwHB00mTE8Bl2C1TuHTlRwK2YoXeZbee5lP2XevBWVkAQAtSQ==",
"cpu": [
"loong64"
],
@@ -975,9 +975,9 @@
]
},
"node_modules/@rollup/rollup-linux-loong64-musl": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.62.4.tgz",
- "integrity": "sha512-qGDAlO0U8xedCcsdRm9oaoQY8DAx/QT7uIxJWhCdx0ceIWX783UC9QSYkdpzAe29wNiVfp24+bZdQmn49o45SQ==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.63.1.tgz",
+ "integrity": "sha512-noITLp8oNjYliPnGWmLyelIHwULGqbHloQHGw1rtxbWhTuWooRpnZarZQJ1y9EUC4szuCusCc+HEpUtxpIwYvA==",
"cpu": [
"loong64"
],
@@ -989,9 +989,9 @@
]
},
"node_modules/@rollup/rollup-linux-ppc64-gnu": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.62.4.tgz",
- "integrity": "sha512-ru4H6ezD7ysA5EiEK6qkkaEb4modH8CTej6kUy/gQi20u3kB3G7Zn8snXXkeJSCOFKG/rbPPtM/+9Wgas1961w==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.63.1.tgz",
+ "integrity": "sha512-hlxxXd+F1mWiAcaFR7Sv9ZQT6m6UfI8+Vy/kFJzztq2pDMU/0wZ9sish0iszNZvsQDo8Gc0i5yuFEOz5dDf6fA==",
"cpu": [
"ppc64"
],
@@ -1003,9 +1003,9 @@
]
},
"node_modules/@rollup/rollup-linux-ppc64-musl": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.62.4.tgz",
- "integrity": "sha512-2W4MO5WQVJnbJaZdvDb9rhBDuFU1nKIepPFpJUBsTh2k1YY2g+ODViaWuyOAjQ5cOP7NvrvLzt3wvHOoiAvc7w==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.63.1.tgz",
+ "integrity": "sha512-EF7OpqQTQ/BvGqLzUi4rEHuagCV9MugAUXSHemwPW5vxZ75RR+jxO/2j95Ph2dalMpFHSVECjRoioHZgA9zOYA==",
"cpu": [
"ppc64"
],
@@ -1017,9 +1017,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-gnu": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.62.4.tgz",
- "integrity": "sha512-+fxjfuoAmVMCYV5QyjoIpu0cp5DOiOTeqYFk1AVaxGr+/ravWLX89XfQmptsoWcaVy/TGf2hexzbUOrCQIL1CQ==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.63.1.tgz",
+ "integrity": "sha512-wQO3JesW9PRkwlabQ27y7sPfVOOTLRG73I4F2UYHG5PXun3J9U3y+b7ezVKSYbsvSKGQ1k1cq8Qlun4C9kLt3w==",
"cpu": [
"riscv64"
],
@@ -1031,9 +1031,9 @@
]
},
"node_modules/@rollup/rollup-linux-riscv64-musl": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.62.4.tgz",
- "integrity": "sha512-jTn8JfHGL4djjFxPuM06LmNUJDsst2jeVlsd9OmIH6zc5sC9K6rIuO4YajXatLUpBmBKl6b35ro1QZocLi+tcA==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.63.1.tgz",
+ "integrity": "sha512-ouAGwhO6wHRXdnOVCOsB0tRFkA7nhNB2Nwax6oECXN0YiN8EYUTBAOudADOB1PI+yDL61TeNx/u7MVCzksNbkQ==",
"cpu": [
"riscv64"
],
@@ -1045,9 +1045,9 @@
]
},
"node_modules/@rollup/rollup-linux-s390x-gnu": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.62.4.tgz",
- "integrity": "sha512-oCJCJL4pXsoDcP2QZ+JVlPTIRc6266zsIaeJJsWImmF7HO0W8nb6HuSgZlMWxJwaPf8ehbSw8yo0EUw925hKsA==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.63.1.tgz",
+ "integrity": "sha512-q2R38Sn+1J8RxhfJ+T54wSWmyKXWec+9jgDfqO2AtArEqHO5R2aeayp5H5OYLr5UYDVGsVaZPEFUooMhYCdz5A==",
"cpu": [
"s390x"
],
@@ -1059,9 +1059,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-gnu": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.62.4.tgz",
- "integrity": "sha512-W69hukhZ3KKNRCaMIEzKvcFye42hh0FE1+YoYaf5+Ikacuftoco6yO/xouz0hc5d5W/s3yBro5jRiuEE/Q5vUw==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.63.1.tgz",
+ "integrity": "sha512-gfI5T24WLLuFfSKw7Go/zDXjAAV0fny0swTaDv+WjK7vqcw4cRhFfdsyKL1n+ukI+ooBxn3bVQnyrn06WpI50w==",
"cpu": [
"x64"
],
@@ -1073,9 +1073,9 @@
]
},
"node_modules/@rollup/rollup-linux-x64-musl": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.62.4.tgz",
- "integrity": "sha512-qiXbGG2jkjXhzXpsFZSR2Xpb8DN/UaxYsbb/STbuR/6fpaDgRmmaq1B/LmtF2wQFOFOSsK2jdE0RZ3a0zHn4QA==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.63.1.tgz",
+ "integrity": "sha512-4h6XqthmB4Hspji84wvgk+ElodTsGj+dbZqHJHHtKxj4mYq0ANSEEPX9ys3moJueqsRjwpaJYH7874Itwnj2ow==",
"cpu": [
"x64"
],
@@ -1087,9 +1087,9 @@
]
},
"node_modules/@rollup/rollup-openbsd-x64": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.62.4.tgz",
- "integrity": "sha512-nWeM//hxv8mIo6jD7Hu4o48DVmV9pbV6gsKaWU+4NFyqHoPKwrkRiZGLKUhOBk8qNmDmpwFtPKg80Bo/Tn4xiQ==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.63.1.tgz",
+ "integrity": "sha512-dlfCOa87o1VAYegLQ9EKilx2JCeRofiyPGhTCmqnuXZ6bMPiycO1rq1+sKoulAp7pGLIsTIw+1x5R+zgh5LhhA==",
"cpu": [
"x64"
],
@@ -1101,9 +1101,9 @@
]
},
"node_modules/@rollup/rollup-openharmony-arm64": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.62.4.tgz",
- "integrity": "sha512-s62SQ/vgsRSvMwDkOEfTqfgASF0f26ZNaQuTA6Aok5lrikf89yI2W0gFHvZb2Jpgc6N8JnOKZgCK2iciO3CsxQ==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.63.1.tgz",
+ "integrity": "sha512-cjkLbOlfcm3QGhMM1J5zaZjsw1GggbN6rw9UTSSRrPrR1KkcXnN7Uq9rPw34xImQ9VOY9GN+6u2Zj80B9ptkcw==",
"cpu": [
"arm64"
],
@@ -1115,9 +1115,9 @@
]
},
"node_modules/@rollup/rollup-win32-arm64-msvc": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.62.4.tgz",
- "integrity": "sha512-J6wGf8TVGbXJq+HH+ttTvrcfNKPbuZecV6KT1B8I18BC5IURUh5kl4Yl5OEP5eFIUoI5BWxCsyYMhFsDx8kekw==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.63.1.tgz",
+ "integrity": "sha512-Li1KdUnWGE4N3e1F/B4RTB1ms+nG4WBgjByO46pkeBVX/2UBsY53xf5vK9WygVmnH3RwncIST7lkSdLSY6P9lg==",
"cpu": [
"arm64"
],
@@ -1129,9 +1129,9 @@
]
},
"node_modules/@rollup/rollup-win32-ia32-msvc": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.62.4.tgz",
- "integrity": "sha512-zmfrQd/0wu6oJs8Vq8KwY/YtsKSsLtKe/HwAP4Wqy8LhWjeT55fHRAkOhYQ12wI3ayS4Tt12d5CDRD7N96SAYQ==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.63.1.tgz",
+ "integrity": "sha512-t4ZYOSoLTgwhuFMrmTMLx/+i1DQVK7HYqMc6kY46EApwi8X0nIVphzdNoThU3xt6n+N5urG1/gxBdCaKDLavfg==",
"cpu": [
"ia32"
],
@@ -1143,9 +1143,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-gnu": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.62.4.tgz",
- "integrity": "sha512-qPzHqdj9rfUD+w79dtE07zi/kFwKyCJqplp5K5ygeLTp7jLpAoc16OAH39HSmRC9UpozaecsleI8uAdEj6v2yw==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.63.1.tgz",
+ "integrity": "sha512-RgroPfMmKlD1RzSDxvwgcPiy2HNQKoYV7OmwIXDsk73uKW5t6B/V8KIy27SMv/FNXFo/oSBtWc9J0X7t91ezZg==",
"cpu": [
"x64"
],
@@ -1157,9 +1157,9 @@
]
},
"node_modules/@rollup/rollup-win32-x64-msvc": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.62.4.tgz",
- "integrity": "sha512-zD6NdeWEByGE9QF9vCrlJ5YQB4oq9q91kPZS37Jwj5hOkvR1lTBSpsKhKDw4IJtbQ35LsTS1HD9DZYGKIshU1Q==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.63.1.tgz",
+ "integrity": "sha512-at8QVep6S3h5Y6gSbdGU06bRY5WJkf6WUduM9YtvYMbYhB1MOFfUgc6kehitQXzOtMSaT70q7f9ydPhpqu821w==",
"cpu": [
"x64"
],
@@ -1280,9 +1280,9 @@
"license": "MIT"
},
"node_modules/@ungap/structured-clone": {
- "version": "1.3.3",
- "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.3.tgz",
- "integrity": "sha512-60YRaenCQcVjYEKOcG824+DRGGIQ3VKErcBoAEDJZz5bKIs2ZG+X/H9Nk+Q6EVkwJk5QNApxbrc5QtBSwtrXAg==",
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.4.0.tgz",
+ "integrity": "sha512-1mEZtMKPM09vDmQt5y7YvmN2+DFTP7Tg0EWXdic8/C6VRnpb33e4ghisCIE3WZjsE2N8mf+QV1Zqh7ZFYLWInQ==",
"license": "ISC"
},
"node_modules/@vitejs/plugin-react": {
@@ -1317,9 +1317,9 @@
}
},
"node_modules/baseline-browser-mapping": {
- "version": "2.11.14",
- "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.14.tgz",
- "integrity": "sha512-JyJ954WzuIR8/FFzX0o5krdSTrBAkcCSRfWSleRsIHSWV+cZe2FI1PKggVkFke1hBldRs+LRxUczzE9iPmgZww==",
+ "version": "2.11.20",
+ "resolved": "https://registry.npmjs.org/baseline-browser-mapping/-/baseline-browser-mapping-2.11.20.tgz",
+ "integrity": "sha512-H0ulySigv6icDJ1F7SjtdCD6PrhTpdYCmP0CactWy1+ekh0AFd0o1Wn5T8b+hnTmdBx19u9yhL6wvCylXMY7zw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
@@ -1364,9 +1364,9 @@
}
},
"node_modules/caniuse-lite": {
- "version": "1.0.30001809",
- "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz",
- "integrity": "sha512-xxWVywk6a6Arlk+hymeycyn/VgqEfLDxupvhH/xiY5SJ/18kmi9o6MiO320DCUzypORHLtvh0I4i04tUhCNHNQ==",
+ "version": "1.0.30001810",
+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001810.tgz",
+ "integrity": "sha512-TITQPUkaz+aVk5GL6NhOdwk1aEaNTSDPsGFWrTuhKGtjTF70jL/Oht2W4c6rXUe5fu7Ie19VIahAXHIIiWWNeg==",
"dev": true,
"funding": [
{
@@ -1435,9 +1435,9 @@
}
},
"node_modules/colord": {
- "version": "2.9.3",
- "resolved": "https://registry.npmjs.org/colord/-/colord-2.9.3.tgz",
- "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==",
+ "version": "2.10.0",
+ "resolved": "https://registry.npmjs.org/colord/-/colord-2.10.0.tgz",
+ "integrity": "sha512-AidJptpBJmjTclAp9BkLwJi0T93fo5epJnbaZslpg6QVzpHjAiveF55mE9AcUJiGMqRHgMDY8soMsQtuNYMHfw==",
"license": "MIT"
},
"node_modules/comma-separated-tokens": {
@@ -1527,9 +1527,9 @@
}
},
"node_modules/electron-to-chromium": {
- "version": "1.5.406",
- "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.406.tgz",
- "integrity": "sha512-hWH5ORBi3d0IipnMh7BN5GDTaAmrSSSWmznwt2zltdiRNEWoEQyTwF0FFSBxzHO7hLSRT6loQu3IQGV0wg/Tvg==",
+ "version": "1.5.416",
+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.416.tgz",
+ "integrity": "sha512-K6bvB2BjnNrugtIih6ewlbBI9DXa976jIdiIlRLHhBoEI9a4JaQjjHyF+A1IQI543aQYR4LnmOrT/K5fZj0aPA==",
"dev": true,
"license": "ISC"
},
@@ -2719,9 +2719,9 @@
}
},
"node_modules/node-releases": {
- "version": "2.0.53",
- "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.53.tgz",
- "integrity": "sha512-D9UOmYG3UH1V+ENW56t5QXBwJw1YEY18ruVeus89Rw+SyIgjPkCO84bRzO3uNIYosJbNwiabWVn48o3uJLjxFQ==",
+ "version": "2.0.54",
+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.54.tgz",
+ "integrity": "sha512-YHs7BmmcsdAI5Ozuf8JZo6PT0mv2GIWC9vMfvUC3dp65M8hn7Ux8CPL+2oBI7juNuj9d0ndhTcznq2ODBps9cQ==",
"dev": true,
"license": "MIT",
"engines": {
@@ -2770,9 +2770,9 @@
"license": "ISC"
},
"node_modules/picomatch": {
- "version": "4.0.5",
- "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.5.tgz",
- "integrity": "sha512-RvwwcruNjI1ncT5xRakeyS9Lf8lcItv34KD+aif+VH9kduAyfYBipGh12274xtenIPZ119/R9BdTBa8gAwSh0A==",
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.7.tgz",
+ "integrity": "sha512-qcJu88Q2IWqJsDD529JKMdwGm/dvInW4HvQnRwiH9JtihJvzGOscDtHE3x1pBKeUOTysQ8kVmLnJ2kJu7yhcGA==",
"dev": true,
"license": "MIT",
"engines": {
@@ -3012,9 +3012,9 @@
}
},
"node_modules/rollup": {
- "version": "4.62.4",
- "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.62.4.tgz",
- "integrity": "sha512-RXOqwaPsBGjMNMa4sQjDjHieHEZDFoj/Rdr46l2MU5DfEs16wHJPC2RPTPHWhNl+M3aI472LLqFkFKut4SblOg==",
+ "version": "4.63.1",
+ "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.1.tgz",
+ "integrity": "sha512-3Df9jsstwhccuEfmAMi9l8XUh/GOkVObmFTU7CCVBysEbcOZLl84jCtaAZMcPiMz2EGKsATzQcU+Xr3n/wU6cg==",
"dev": true,
"license": "MIT",
"dependencies": {
@@ -3029,31 +3029,31 @@
},
"optionalDependencies": {
"@napi-rs/lzma-linux-x64-gnu": "1.5.1",
- "@rollup/rollup-android-arm-eabi": "4.62.4",
- "@rollup/rollup-android-arm64": "4.62.4",
- "@rollup/rollup-darwin-arm64": "4.62.4",
- "@rollup/rollup-darwin-x64": "4.62.4",
- "@rollup/rollup-freebsd-arm64": "4.62.4",
- "@rollup/rollup-freebsd-x64": "4.62.4",
- "@rollup/rollup-linux-arm-gnueabihf": "4.62.4",
- "@rollup/rollup-linux-arm-musleabihf": "4.62.4",
- "@rollup/rollup-linux-arm64-gnu": "4.62.4",
- "@rollup/rollup-linux-arm64-musl": "4.62.4",
- "@rollup/rollup-linux-loong64-gnu": "4.62.4",
- "@rollup/rollup-linux-loong64-musl": "4.62.4",
- "@rollup/rollup-linux-ppc64-gnu": "4.62.4",
- "@rollup/rollup-linux-ppc64-musl": "4.62.4",
- "@rollup/rollup-linux-riscv64-gnu": "4.62.4",
- "@rollup/rollup-linux-riscv64-musl": "4.62.4",
- "@rollup/rollup-linux-s390x-gnu": "4.62.4",
- "@rollup/rollup-linux-x64-gnu": "4.62.4",
- "@rollup/rollup-linux-x64-musl": "4.62.4",
- "@rollup/rollup-openbsd-x64": "4.62.4",
- "@rollup/rollup-openharmony-arm64": "4.62.4",
- "@rollup/rollup-win32-arm64-msvc": "4.62.4",
- "@rollup/rollup-win32-ia32-msvc": "4.62.4",
- "@rollup/rollup-win32-x64-gnu": "4.62.4",
- "@rollup/rollup-win32-x64-msvc": "4.62.4",
+ "@rollup/rollup-android-arm-eabi": "4.63.1",
+ "@rollup/rollup-android-arm64": "4.63.1",
+ "@rollup/rollup-darwin-arm64": "4.63.1",
+ "@rollup/rollup-darwin-x64": "4.63.1",
+ "@rollup/rollup-freebsd-arm64": "4.63.1",
+ "@rollup/rollup-freebsd-x64": "4.63.1",
+ "@rollup/rollup-linux-arm-gnueabihf": "4.63.1",
+ "@rollup/rollup-linux-arm-musleabihf": "4.63.1",
+ "@rollup/rollup-linux-arm64-gnu": "4.63.1",
+ "@rollup/rollup-linux-arm64-musl": "4.63.1",
+ "@rollup/rollup-linux-loong64-gnu": "4.63.1",
+ "@rollup/rollup-linux-loong64-musl": "4.63.1",
+ "@rollup/rollup-linux-ppc64-gnu": "4.63.1",
+ "@rollup/rollup-linux-ppc64-musl": "4.63.1",
+ "@rollup/rollup-linux-riscv64-gnu": "4.63.1",
+ "@rollup/rollup-linux-riscv64-musl": "4.63.1",
+ "@rollup/rollup-linux-s390x-gnu": "4.63.1",
+ "@rollup/rollup-linux-x64-gnu": "4.63.1",
+ "@rollup/rollup-linux-x64-musl": "4.63.1",
+ "@rollup/rollup-openbsd-x64": "4.63.1",
+ "@rollup/rollup-openharmony-arm64": "4.63.1",
+ "@rollup/rollup-win32-arm64-msvc": "4.63.1",
+ "@rollup/rollup-win32-ia32-msvc": "4.63.1",
+ "@rollup/rollup-win32-x64-gnu": "4.63.1",
+ "@rollup/rollup-win32-x64-msvc": "4.63.1",
"fsevents": "~2.3.2"
}
},
@@ -3259,9 +3259,9 @@
}
},
"node_modules/update-browserslist-db": {
- "version": "1.3.1",
- "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.1.tgz",
- "integrity": "sha512-ZZ61DsRsOnakl74HAmp3oSN4aXUmEWXf+i/yv0h7tIBfICc3VdrFErQKUUKPgu3AMsTUMbcongALEN4l6GSUrQ==",
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.3.2.tgz",
+ "integrity": "sha512-UQ+MSxlhRm1bzjhU+DcuXfjFO1FzNtqhK5+9Yvlp90ItDLk5vT932A0rFu619nf7RVS+Y/VeaUW1jaRDqZ8VJw==",
"dev": true,
"funding": [
{
diff --git a/kits/dashboard/app/package.json b/kits/dashboard/app/package.json
index 4b3ec09..0ff3c2e 100644
--- a/kits/dashboard/app/package.json
+++ b/kits/dashboard/app/package.json
@@ -6,7 +6,8 @@
"scripts": {
"dev": "vite",
"build": "vite build",
- "test": "node --test src/lib/dashboard.test.mjs src/lib/query.test.mjs src/lib/refresh.test.mjs src/lib/templates.test.mjs"
+ "test": "node --test src/lib/dashboard.test.mjs src/lib/query.test.mjs src/lib/refresh.test.mjs src/lib/templates.test.mjs",
+ "capture:thumbs": "node scripts/capture-template-thumbs.mjs"
},
"dependencies": {
"echarts": "^5.5.1",
diff --git a/kits/dashboard/app/scripts/capture-template-thumbs.mjs b/kits/dashboard/app/scripts/capture-template-thumbs.mjs
new file mode 100644
index 0000000..c4aee6d
--- /dev/null
+++ b/kits/dashboard/app/scripts/capture-template-thumbs.mjs
@@ -0,0 +1,94 @@
+/* Capture one PNG per template, from the template's own preview board.
+ *
+ * The card used to draw a grid of grey rectangles — the panel LAYOUT and nothing else. Every
+ * template has roughly the same layout, so the cards were indistinguishable and told nobody which
+ * template to pick. A captured board is the honest answer: it IS the thing being chosen, charts
+ * and all.
+ *
+ * Captured rather than rendered live because a board laid out at ~230px is not the same board
+ * shrunk: the canvas collapses its columns at that width, so a live miniature shows a layout
+ * nobody will ever get. It also keeps five chart-drawing boards off the landing page's first
+ * paint.
+ *
+ * The figures come from each template's `sample` block, which the copilot cannot reach — the same
+ * rule that lets the eye-preview show numbers at all.
+ *
+ * Usage: node scripts/capture-template-thumbs.mjs [baseUrl]
+ * HR_USER / HR_PASS log in first, for a console that gates the kit behind a session.
+ *
+ * Playwright is deliberately NOT a devDependency: this is a maintenance tool run by hand when a
+ * template changes, and adding it would make every install of the kit download browsers. Run it
+ * with `npx playwright@1.62 ...` available, or `npm i -D playwright` temporarily.
+ */
+import { chromium } from 'playwright';
+import { mkdir, readFile } from 'node:fs/promises';
+import path from 'node:path';
+import { fileURLToPath } from 'node:url';
+
+const HERE = path.dirname(fileURLToPath(import.meta.url));
+const KIT = path.resolve(HERE, '..', '..'); // scripts/ -> app/ -> kit root
+const OUT = path.join(KIT, 'templates', 'thumbs');
+const BASE = process.argv[2] || 'http://localhost:5173/kits/dashboard';
+const W = 1200; // board width; the card scales it down with object-fit
+
+const tpl = JSON.parse(await readFile(path.join(KIT, 'templates', 'templates.json'), 'utf8'));
+const templates = Array.isArray(tpl) ? tpl : (tpl.templates || []);
+await mkdir(OUT, { recursive: true });
+
+const browser = await chromium.launch();
+const ctx = await browser.newContext({ viewport: { width: 1600, height: 1200 }, deviceScaleFactor: 2,
+ ignoreHTTPSErrors: true });
+// A self-hosted console gates every page behind a session, so a headless run lands on /login and
+// finds no templates at all. Logging in through the same endpoint the login form posts to keeps
+// this a normal client rather than a special case in the app.
+if (process.env.HR_USER && process.env.HR_PASS) {
+ const origin = new URL(BASE).origin;
+ const r = await ctx.request.post(`${origin}/api/selfhost/login`, {
+ data: { username: process.env.HR_USER, password: process.env.HR_PASS },
+ });
+ if (!r.ok()) { console.error(`login failed: HTTP ${r.status()}`); process.exit(1); }
+}
+const page = await ctx.newPage();
+let ok = 0;
+
+for (const [i, t] of templates.entries()) {
+ await page.goto(BASE, { waitUntil: 'networkidle' });
+ await page.addStyleTag({ content: '*,*::before,*::after{animation:none!important;transition:none!important}' });
+ // The eye button is a hover overlay; click it directly rather than simulating the hover.
+ const opened = await page.evaluate((idx) => {
+ const eyes = document.querySelectorAll('.db-eye');
+ if (!eyes[idx]) return false;
+ eyes[idx].click();
+ return true;
+ }, i);
+ if (!opened) { console.error(`no preview control for ${t.id}`); continue; }
+ await page.waitForSelector('.uic-modal .db-preview-canvas', { timeout: 15000 });
+ // Isolate the board so a plain viewport capture IS the thumbnail: element screenshots time out
+ // waiting for "stable" while the charts settle, and cropping afterwards needs an image library.
+ const size = await page.evaluate((w) => {
+ const c = document.querySelector('.uic-modal .db-preview-canvas');
+ const host = document.createElement('div');
+ host.id = '__shot';
+ host.style.cssText = 'position:fixed;inset:0;z-index:2147483647;background:#fff;overflow:hidden';
+ c.style.width = `${w}px`;
+ c.style.maxHeight = 'none';
+ host.appendChild(c);
+ document.body.appendChild(host);
+ for (const el of [...document.body.children]) if (el.id !== '__shot') el.style.display = 'none';
+ const r = c.getBoundingClientRect();
+ return { w: Math.round(r.width), h: Math.round(r.height) };
+ }, W);
+ await page.setViewportSize({ width: size.w, height: size.h });
+ await page.waitForTimeout(600); // let the chart library settle
+ const file = path.join(OUT, `${t.id}.png`);
+ await page.screenshot({ path: file });
+ console.log(`${t.id} ${size.w}x${size.h} -> templates/thumbs/${t.id}.png`);
+ ok += 1;
+}
+
+await browser.close();
+if (ok !== templates.length) {
+ console.error(`captured ${ok}/${templates.length}`);
+ process.exit(1);
+}
+console.log(`captured ${ok}/${templates.length}`);
diff --git a/kits/dashboard/app/src/pages/Landing.jsx b/kits/dashboard/app/src/pages/Landing.jsx
index aa68a6c..c9f1e2c 100644
--- a/kits/dashboard/app/src/pages/Landing.jsx
+++ b/kits/dashboard/app/src/pages/Landing.jsx
@@ -68,7 +68,55 @@ function TemplateBoard({ template, rowHeight = 30, gap = 8 }) {
);
}
+/** The card thumbnail: the template drawn as the board it becomes, at thumbnail scale.
+ *
+ * This used to be a grid of grey rectangles — the panel LAYOUT and nothing else. Every template
+ * has roughly the same layout (a row of stats, two mid panels, a table), so the cards were
+ * indistinguishable and told nobody which template to pick. The board with its own illustrative
+ * figures is the thing being chosen, so that is what the card shows.
+ *
+ * It renders at a fixed board width and is scaled into the card with a transform, rather than
+ * laid out at card size: charts drawn into ~180px behave nothing like charts drawn at 520px and
+ * then shrunk — axes collapse, labels collide. Scaling a full-size render keeps the miniature
+ * faithful to the real board.
+ *
+ * The same honesty rules as the eye-preview apply, and for the same reason: the figures come from
+ * `sample`, which the copilot cannot reach, so they can never travel into someone's document.
+ * If a template ships without `sample`, its panels would draw empty — fall back to the shape. */
+/** The card thumbnail: a CAPTURED picture of the board this template becomes.
+ *
+ * This used to be a grid of grey rectangles — the panel LAYOUT and nothing else. Every template
+ * has roughly the same layout (a row of stats, two mid panels, a table), so the cards were
+ * indistinguishable and told nobody which template to pick. The board is the thing being chosen,
+ * so the card shows the board.
+ *
+ * A picture rather than a live miniature, for two reasons. A board laid out at card width is not
+ * the same board shrunk — the canvas collapses its columns at ~230px, so a live thumbnail would
+ * advertise a layout nobody will ever get. And five chart-drawing boards on the landing page cost
+ * a visibly slower first paint for something nobody interacts with.
+ *
+ * The pictures are generated by scripts/capture-template-thumbs.mjs from each template's own
+ * preview, so they cannot drift into showing a board the template does not build. A template
+ * whose picture is missing falls back to the shape rather than a broken image.
+ */
function TemplateArt({ template }) {
+ const [failed, setFailed] = useState(false);
+ if (failed) return ;
+ return (
+
setFailed(true)}
+ />
+ );
+}
+
+/** The layout-only fallback, for a template with no illustrative figures. */
+function TemplateShape({ template }) {
const panels = (template.dashboard?.panels || []).slice(0, 10);
return (
diff --git a/kits/dashboard/app/src/styles/app.css b/kits/dashboard/app/src/styles/app.css
index 84e2981..32edf44 100644
--- a/kits/dashboard/app/src/styles/app.css
+++ b/kits/dashboard/app/src/styles/app.css
@@ -131,6 +131,18 @@
.db-tpl-cell.is-stat { background: var(--brand-50); border-color: var(--brand-soft); }
.db-tpl-cell.is-chart { background: var(--surface-2); }
.db-tpl-cell.is-table { background: var(--surface-2); border-style: dashed; }
+
+/* The card thumbnail is a captured picture of the board (see TemplateArt).
+ *
+ * object-fit: cover with a top anchor: the captures are wide boards (~1200x476) and the card art
+ * box is a different aspect, so anchoring the top keeps the headline stats — the row that actually
+ * distinguishes one template from another — rather than centring on empty chart whitespace. */
+.db-tpl-shot {
+ display: block; width: 100%; height: 100%;
+ object-fit: cover; object-position: top center;
+ background: var(--bg);
+ pointer-events: none; /* the CARD takes the click */
+}
/* The preview control floats over the art, so it needs its own surface to stay legible. */
.db-eye { background: var(--surface); border: 1px solid var(--line); box-shadow: var(--shadow-1); }
diff --git a/kits/dashboard/app/vite.config.js b/kits/dashboard/app/vite.config.js
index 0cf89fb..dc2bc9a 100644
--- a/kits/dashboard/app/vite.config.js
+++ b/kits/dashboard/app/vite.config.js
@@ -1,4 +1,4 @@
-import { copyFileSync, mkdirSync } from 'node:fs';
+import { copyFileSync, cpSync, existsSync, mkdirSync } from 'node:fs';
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
@@ -10,6 +10,12 @@ const stageTemplates = {
buildStart() {
mkdirSync('public', { recursive: true });
copyFileSync('../templates/templates.json', 'public/templates.json');
+ // The card thumbnails are kit data too — captured pictures of each template's board, staged
+ // the same way and for the same reason. Optional: a checkout without them still builds, and
+ // the card falls back to the layout shape rather than a broken image.
+ if (existsSync('../templates/thumbs')) {
+ cpSync('../templates/thumbs', 'public/templates', { recursive: true });
+ }
},
};
diff --git a/kits/dashboard/templates/thumbs/executive-summary.png b/kits/dashboard/templates/thumbs/executive-summary.png
new file mode 100644
index 0000000..2b44c4f
Binary files /dev/null and b/kits/dashboard/templates/thumbs/executive-summary.png differ
diff --git a/kits/dashboard/templates/thumbs/saas-revenue.png b/kits/dashboard/templates/thumbs/saas-revenue.png
new file mode 100644
index 0000000..968fae8
Binary files /dev/null and b/kits/dashboard/templates/thumbs/saas-revenue.png differ
diff --git a/kits/dashboard/templates/thumbs/sales-pipeline.png b/kits/dashboard/templates/thumbs/sales-pipeline.png
new file mode 100644
index 0000000..dc9f6b4
Binary files /dev/null and b/kits/dashboard/templates/thumbs/sales-pipeline.png differ
diff --git a/kits/dashboard/templates/thumbs/support-ops.png b/kits/dashboard/templates/thumbs/support-ops.png
new file mode 100644
index 0000000..2e88721
Binary files /dev/null and b/kits/dashboard/templates/thumbs/support-ops.png differ
diff --git a/kits/dashboard/templates/thumbs/web-analytics.png b/kits/dashboard/templates/thumbs/web-analytics.png
new file mode 100644
index 0000000..dbce905
Binary files /dev/null and b/kits/dashboard/templates/thumbs/web-analytics.png differ