From fcd4d4743b0eb79e923f4e5cc637290ef019fbec Mon Sep 17 00:00:00 2001 From: Nikola Petrov Date: Fri, 11 Sep 2026 13:30:02 +0200 Subject: [PATCH] Theme switcher and BULMA --- README.md | 3 +-- bun.lock | 38 +++++++++++++++++++++++++--- index.html | 5 ++-- package.json | 5 ++-- typed-router.d.ts | 15 ----------- vue/app.vue | 17 ++++++++----- vue/components/LanguageSwitcher.vue | 22 +++++++++------- vue/components/ThemeSwitcher.vue | 23 +++++++++++++++++ vue/components/theme.js | 21 +++++++++++++++ vue/css/all.css | 14 ++++++++++ vue/favicon.ico | Bin 0 -> 318 bytes vue/main.js | 6 +---- vue/routes/test.vue | 8 ------ 13 files changed, 123 insertions(+), 54 deletions(-) create mode 100644 vue/components/ThemeSwitcher.vue create mode 100644 vue/components/theme.js create mode 100644 vue/css/all.css create mode 100644 vue/favicon.ico delete mode 100644 vue/routes/test.vue diff --git a/README.md b/README.md index 780e27a..042c9e6 100644 --- a/README.md +++ b/README.md @@ -4,5 +4,4 @@ session.use_strict_mode=1 ``` -https://github.com/ldaptools/ldaptools - +https://bulma.io/ \ No newline at end of file diff --git a/bun.lock b/bun.lock index e997f4d..a775316 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "portal-vue", "dependencies": { "@fortawesome/fontawesome-free": "7.3.1", - "bootstrap": "5.3.8", + "bulma": "^1.0.4", "vue": "^3.5.40", "vue-i18n": "^11.4.10", "vue-multiselect": "^3.5.0", @@ -150,7 +150,31 @@ "@oxc-project/types": ["@oxc-project/types@0.148.0", "", {}, "sha512-Nm4s/jB+4FpFsPhWGEC4h7rzksesmtnMXomo6rCMcg/b8zLQuOziRgkCS1fxDCXOlJB/6Q8oABOZ/OP6RIPj9A=="], - "@popperjs/core": ["@popperjs/core@2.11.8", "", {}, "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A=="], + "@parcel/watcher": ["@parcel/watcher@2.6.0", "", { "dependencies": { "detect-libc": "^2.0.3", "is-glob": "^4.0.3", "node-addon-api": "^7.0.0", "picomatch": "^4.0.4" }, "optionalDependencies": { "@parcel/watcher-android-arm64": "2.6.0", "@parcel/watcher-darwin-arm64": "2.6.0", "@parcel/watcher-darwin-x64": "2.6.0", "@parcel/watcher-freebsd-x64": "2.6.0", "@parcel/watcher-linux-arm-glibc": "2.6.0", "@parcel/watcher-linux-arm-musl": "2.6.0", "@parcel/watcher-linux-arm64-glibc": "2.6.0", "@parcel/watcher-linux-arm64-musl": "2.6.0", "@parcel/watcher-linux-x64-glibc": "2.6.0", "@parcel/watcher-linux-x64-musl": "2.6.0", "@parcel/watcher-win32-arm64": "2.6.0", "@parcel/watcher-win32-x64": "2.6.0" } }, "sha512-7FNeNl8NCE7aINx7WXiKQrPYZWC/hvrTsmk6zmxbI7LTXE7hVek/n8AfVgpe2y82zl3w0HvCHN0bVKMBoJcC0w=="], + + "@parcel/watcher-android-arm64": ["@parcel/watcher-android-arm64@2.6.0", "", { "os": "android", "cpu": "arm64" }, "sha512-trgpLSCKRC/huFjXX/Smh+0sWe4+YtKfktIToiMl59ghz7z+qkH6kMvNnUbLyRs9N11t8l4svSCs1+5B3rOAhA=="], + + "@parcel/watcher-darwin-arm64": ["@parcel/watcher-darwin-arm64@2.6.0", "", { "os": "darwin", "cpu": "arm64" }, "sha512-Y3QV0gl7Q1zbfueunkWIERICbEojQFCgpyG7YqOGNFLsckXyI1xu9mAIUpKY9QBYzBtSkN8dBPwd3yiAO9ovMw=="], + + "@parcel/watcher-darwin-x64": ["@parcel/watcher-darwin-x64@2.6.0", "", { "os": "darwin", "cpu": "x64" }, "sha512-Ohv6OpzhUfKYD7Beb8kDvG0jbIxORCYY1JRdZnaBtnjjkJxgD7ZVL0nw2sCYd0yTMKTvz3nnTnOF3cDifK+kvw=="], + + "@parcel/watcher-freebsd-x64": ["@parcel/watcher-freebsd-x64@2.6.0", "", { "os": "freebsd", "cpu": "x64" }, "sha512-5HmXvDgs8VK+74jF9y9/2FE3/OnlcKmc56tjmSrEuZjpSZOGL+fvAu+HKJBdPs9uwoP2hE6TlSUpXZ/C5jUFmQ=="], + + "@parcel/watcher-linux-arm-glibc": ["@parcel/watcher-linux-arm-glibc@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-Ps/hui3A+vMbjdqlqAowK2ZL8+BO8dBjxeWXj6npTBs3jx4wWmbPpaLuqwrQrSqIVMCnpWo238bJ1U37GhQOYg=="], + + "@parcel/watcher-linux-arm-musl": ["@parcel/watcher-linux-arm-musl@2.6.0", "", { "os": "linux", "cpu": "arm" }, "sha512-9c6AUHgHoG+IY88MRIHupztQiQnrbqHYQjkM2btA+Bf/wQnQMuiD0Wfk1EVv3TlNT3x41uU71rn6E4xh/+zvkw=="], + + "@parcel/watcher-linux-arm64-glibc": ["@parcel/watcher-linux-arm64-glibc@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-yHRqS2owEXe6Hic9z6Mh1ECsCd+ODVOGvZDyciqRd21+v+o+DnXMOrw50DSpIG2sb8GPEaPPmfeCAWKPJdq46g=="], + + "@parcel/watcher-linux-arm64-musl": ["@parcel/watcher-linux-arm64-musl@2.6.0", "", { "os": "linux", "cpu": "arm64" }, "sha512-WhB2e/V7rqdHHWZusBSPuy5Ei8S6lSz6FE5TKKQz5h3a0O+C+mhY7vxU9b/stqvMb8beLnPY82ZrFTLKs+SrKA=="], + + "@parcel/watcher-linux-x64-glibc": ["@parcel/watcher-linux-x64-glibc@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-ulGE6x6Oz6iAwg75T8YQSoguBWasniIbX+QWpaYPcCnDOpdWX3k+4xbEYPZVLxOuoJI+svJJPD3sEj8G7lrQ3A=="], + + "@parcel/watcher-linux-x64-musl": ["@parcel/watcher-linux-x64-musl@2.6.0", "", { "os": "linux", "cpu": "x64" }, "sha512-tkBYKt7YQrjIJWYDnto2YgO8MRkjlMTSNoRHzsXinBqbLdeOM3L32wPZJvIZxqaLMfSlS/4sUjH/6STVP/XDLw=="], + + "@parcel/watcher-win32-arm64": ["@parcel/watcher-win32-arm64@2.6.0", "", { "os": "win32", "cpu": "arm64" }, "sha512-gIZAP23jaHjGWasY/TY6yL7NHFClf0Ga7FN+iINvk+KN94rhm94lYZhFsbYFNcA04/onvGD9kKmiJLJB2HbNwQ=="], + + "@parcel/watcher-win32-x64": ["@parcel/watcher-win32-x64@2.6.0", "", { "os": "win32", "cpu": "x64" }, "sha512-cA+/pXV2YkfxlIcXOQ5fSWqAzzPyD78/x5qbK/I0vUkrlYHA8TIz+MXjAbGouguKVSI4bOmkTSJ1/poVSsgt+A=="], "@rolldown/binding-android-arm-eabi": ["@rolldown/binding-android-arm-eabi@1.2.7", "", { "os": "android", "cpu": "arm" }, "sha512-EypzgnYCwyVY4NDHKzGmNJT5b+XaQEBniHxsMdeIQLB/tcCzZnhqrzHpZFbX9iaxx+5RiB8caATBtfvZP7zVxQ=="], @@ -250,12 +274,12 @@ "birpc": ["birpc@2.9.0", "", {}, "sha512-KrayHS5pBi69Xi9JmvoqrIgYGDkD6mcSe/i6YKi3w5kekCLzrX4+nawcXqrj2tIp50Kw/mT/s3p+GVK0A0sKxw=="], - "bootstrap": ["bootstrap@5.3.8", "", { "peerDependencies": { "@popperjs/core": "^2.11.8" } }, "sha512-HP1SZDqaLDPwsNiqRqi5NcP0SSXciX2s9E+RyqJIIqGo+vJeN5AJVM98CXmW/Wux0nQ5L7jeWUdplCEf0Ee+tg=="], - "brace-expansion": ["brace-expansion@5.0.9", "", { "dependencies": { "balanced-match": "^4.0.2" } }, "sha512-ScQ4IuvIEF1TMlP7Zt+vjJ//9zlPb2SDcxWxM3bk8s6t6GGdJ7KO1dCcTidOPJKePW30LE/2cT7wCyPho9/Wxg=="], "braces": ["braces@3.0.3", "", { "dependencies": { "fill-range": "^7.1.1" } }, "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA=="], + "bulma": ["bulma@1.0.4", "", {}, "sha512-Ffb6YGXDiZYX3cqvSbHWqQ8+LkX6tVoTcZuVB3lm93sbAVXlO0D6QlOTMnV6g18gILpAXqkG2z9hf9z4hCjz2g=="], + "cacheable": ["cacheable@2.5.0", "", { "dependencies": { "@cacheable/memory": "^2.2.0", "@cacheable/utils": "^2.5.0", "hookified": "^1.15.0", "keyv": "^5.6.0", "qified": "^0.10.1" } }, "sha512-60cyAOytib/OzBw1JNSoSV/boK1AtHryDIjvVBk7XbN4ugfkM3+Sry7fEjNgPMGgOjuaZPAp8ruZ0Cxafwyq9g=="], "chalk": ["chalk@5.6.2", "", {}, "sha512-7NzBL0rN6fMUW+f7A6Io4h40qQlG+xGmtMxfbnH/K7TAtt8JQWVQK+6g0UXKMeVJoyV5EkkNsErQ8pVD3bLHbA=="], @@ -352,6 +376,8 @@ "ignore": ["ignore@5.3.2", "", {}, "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g=="], + "immutable": ["immutable@5.1.9", "", {}, "sha512-m8nVez3rwrgmWxtLMt1ZYXB2Lv7OKYn/disyxAlSDYAlKSlFoPPfIAmAM/M5xqL4m4C/wAPw7S2/CNaUii1Hxg=="], + "imurmurhash": ["imurmurhash@0.1.4", "", {}, "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA=="], "is-extglob": ["is-extglob@2.1.1", "", {}, "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ=="], @@ -420,6 +446,8 @@ "natural-compare": ["natural-compare@1.4.0", "", {}, "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw=="], + "node-addon-api": ["node-addon-api@7.1.1", "", {}, "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ=="], + "nostics": ["nostics@1.2.0", "", {}, "sha512-FGqEfhQjrvo1lL8KFifdTQiNwwQHJxC1jtYE1Rc54qF/jxONUNL+kC9gS1krX8Q65PgrQ5fCqH/I4NhWBvdSqg=="], "optionator": ["optionator@0.9.4", "", { "dependencies": { "deep-is": "^0.1.3", "fast-levenshtein": "^2.0.6", "levn": "^0.4.1", "prelude-ls": "^1.2.1", "type-check": "^0.4.0", "word-wrap": "^1.2.5" } }, "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g=="], @@ -464,6 +492,8 @@ "rxjs": ["rxjs@7.8.2", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA=="], + "sass": ["sass@1.104.0", "", { "dependencies": { "chokidar": "^5.0.0", "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "optionalDependencies": { "@parcel/watcher": "^2.4.1" }, "bin": { "sass": "sass.js" } }, "sha512-btHMApW2bgolvClhRW8AlQJzgI9lUB3pPSofBQQT+E46GWvf9o0TVQ13SYv5riWZVFyPN+JNz3TKW9XhBlc10w=="], + "scule": ["scule@1.3.0", "", {}, "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g=="], "semver": ["semver@7.8.5", "", { "bin": { "semver": "bin/semver.js" } }, "sha512-Y7/KDsb8LjooZpwaqGyulO6DQlksgCncchHGk+sZIY4SBvUocMBEFH5Ur1fI4dV+Jvl0w6cjvucaIi40puRioA=="], diff --git a/index.html b/index.html index 54fec6a..5f7e25a 100644 --- a/index.html +++ b/index.html @@ -4,8 +4,9 @@ - NASLOV - + CMMS + + diff --git a/package.json b/package.json index 9838d57..10843af 100644 --- a/package.json +++ b/package.json @@ -4,11 +4,12 @@ "type": "module", "scripts": { "build": "vite build && cp -R php dist/php && cp -R vendor dist/vendor", - "serve": "concurrently \"vite\" \"php -S localhost:8000\" \"mailpit\" \"caddy run --config Caddyfile\"" + "serve": "concurrently \"vite\" \"php -S localhost:8000\" \"mailpit\" \"caddy run --config Caddyfile\"", + "php": "concurrently \"php -t dist -S localhost:8000\" \"mailpit\" \"caddy reverse-proxy -t localhost:8000\"" }, "dependencies": { "@fortawesome/fontawesome-free": "7.3.1", - "bootstrap": "5.3.8", + "bulma": "^1.0.4", "vue": "^3.5.40", "vue-i18n": "^11.4.10", "vue-multiselect": "^3.5.0", diff --git a/typed-router.d.ts b/typed-router.d.ts index e066f60..2dfad76 100644 --- a/typed-router.d.ts +++ b/typed-router.d.ts @@ -38,13 +38,6 @@ declare module 'vue-router/auto-routes' { Record, | never >, - '/test': RouteRecordInfo< - '/test', - '/test', - Record, - Record, - | never - >, } /** @@ -66,14 +59,6 @@ declare module 'vue-router/auto-routes' { pathParamNames: | never } - 'vue/routes/test.vue': { - routes: - | '/test' - views: - | never - pathParamNames: - | never - } } /** diff --git a/vue/app.vue b/vue/app.vue index 830dcd0..0ccdd8c 100644 --- a/vue/app.vue +++ b/vue/app.vue @@ -1,15 +1,18 @@ \ No newline at end of file diff --git a/vue/components/LanguageSwitcher.vue b/vue/components/LanguageSwitcher.vue index 0b16f78..55510c6 100644 --- a/vue/components/LanguageSwitcher.vue +++ b/vue/components/LanguageSwitcher.vue @@ -1,13 +1,17 @@ diff --git a/vue/components/ThemeSwitcher.vue b/vue/components/ThemeSwitcher.vue new file mode 100644 index 0000000..be496f4 --- /dev/null +++ b/vue/components/ThemeSwitcher.vue @@ -0,0 +1,23 @@ + + + \ No newline at end of file diff --git a/vue/components/theme.js b/vue/components/theme.js new file mode 100644 index 0000000..44bf528 --- /dev/null +++ b/vue/components/theme.js @@ -0,0 +1,21 @@ +import { ref } from 'vue'; + + +const theme = ref(localStorage.getItem('theme') || 'auto'); +const prefersDark = window.matchMedia('(prefers-color-scheme: dark)'); + + +export function applyTheme() { + const resolved = theme.value === 'auto' ? (prefersDark.matches ? 'dark' : 'light') : theme.value; + document.documentElement.setAttribute('data-theme', resolved); +} + +export function setTheme(value) { + theme.value = value; + localStorage.setItem('theme', value); + applyTheme(); +} + +prefersDark.addEventListener('change', () => { + if (theme.value === 'auto') applyTheme(); +}); \ No newline at end of file diff --git a/vue/css/all.css b/vue/css/all.css new file mode 100644 index 0000000..ff35a98 --- /dev/null +++ b/vue/css/all.css @@ -0,0 +1,14 @@ + +@import 'vue-multiselect/dist/vue-multiselect.css'; +@import '@fortawesome/fontawesome-free/css/all.min.css'; + +@import 'bulma/css/bulma.min.css'; + +.dropdown { + --bulma-dropdown-menu-min-width: 4rem; +} + +a.dropdown-item, +button.dropdown-item { + padding-inline-end: 1rem; +} diff --git a/vue/favicon.ico b/vue/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..efad66c3701a9405128def6250240b0bd9bc15a7 GIT binary patch literal 318 zcmb`BAr1mT3`O50cv^!aAomj74Z$@y4+01Rg@KS28ypD+H~hcL8Z>R*Z|8S987Rt# zkWOd{%z#FOSPJ`&b+3bXHb&iy-9Ku{OubVq!nLG6S3*aV>YSdsdaCqXpO5d3Ol0-Q o((SbM8?}OYPoaH@J3NkX*urfE*EwAFaBgAOL3e`ZV%YKC2c$C|^Z)<= literal 0 HcmV?d00001 diff --git a/vue/main.js b/vue/main.js index 19ff1be..7ab6b78 100644 --- a/vue/main.js +++ b/vue/main.js @@ -3,11 +3,7 @@ import { createRouter, createWebHashHistory } from 'vue-router' import { routes, handleHotUpdate } from 'vue-router/auto-routes' import { i18n, setLocale, initialLocale } from './i18n.js' -import '@fortawesome/fontawesome-free/css/all.min.css' -import 'bootstrap/dist/css/bootstrap.min.css' -import 'bootstrap/dist/js/bootstrap.bundle.min.js' -import 'vue-multiselect/dist/vue-multiselect.css'; - +import './css/all.css' import App from './app.vue' diff --git a/vue/routes/test.vue b/vue/routes/test.vue deleted file mode 100644 index 11fa064..0000000 --- a/vue/routes/test.vue +++ /dev/null @@ -1,8 +0,0 @@ - - - \ No newline at end of file