From 003925d57a34bfc5edf670b497369ce7b281c971 Mon Sep 17 00:00:00 2001 From: bagus-arie05 Date: Mon, 8 Sep 2025 15:07:49 +0700 Subject: [PATCH] update homepage --- layouts/default.vue | 7 + nuxt.config.ts | 25 +- package-lock.json | 455 ++++++++++++++ package.json | 4 +- pages/Home.vue | 1430 +++++++++++++++++++++---------------------- pages/figma.vue | 119 ++++ plugins/vuetify.ts | 27 + stores/payment.ts | 180 +----- 8 files changed, 1354 insertions(+), 893 deletions(-) create mode 100644 layouts/default.vue create mode 100644 pages/figma.vue create mode 100644 plugins/vuetify.ts diff --git a/layouts/default.vue b/layouts/default.vue new file mode 100644 index 0000000..b89e1b5 --- /dev/null +++ b/layouts/default.vue @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/nuxt.config.ts b/nuxt.config.ts index 54a9dd2..a57d680 100644 --- a/nuxt.config.ts +++ b/nuxt.config.ts @@ -1,4 +1,5 @@ // https://nuxt.com/docs/api/configuration/nuxt-config +import vuetify, { transformAssetUrls } from 'vite-plugin-vuetify' export default defineNuxtConfig({ compatibilityDate: '2025-07-15', devtools: { enabled: true }, @@ -10,6 +11,26 @@ export default defineNuxtConfig({ '@nuxt/scripts', '@nuxt/test-utils', '@nuxt/ui', - '@pinia/nuxt' - ] + '@pinia/nuxt', + (_options, nuxt) => { + nuxt.hooks.hook('vite:extendConfig', (config) => { + // @ts-expect-error + config.plugins.push(vuetify({ autoImport: true })) + }) + }, + //... + ], + css: [ + 'vuetify/lib/styles/main.sass', + '@mdi/font/css/materialdesignicons.min.css', + ], + build: { + transpile: ['vuetify'], + }, + app: { + head: { + viewport: 'width=device-width,initial-scale=1', + charset: 'utf-8' + } + } }) \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 77ee4f3..1b577d6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -24,6 +24,7 @@ "vue-router": "^4.5.1" }, "devDependencies": { + "sass-embedded": "^1.92.1", "vite-plugin-vuetify": "^2.1.2", "vuetify": "^3.9.7" } @@ -489,6 +490,13 @@ "node": ">=6.9.0" } }, + "node_modules/@bufbuild/protobuf": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/@bufbuild/protobuf/-/protobuf-2.7.0.tgz", + "integrity": "sha512-qn6tAIZEw5i/wiESBF4nQxZkl86aY4KoO0IkUa2Lh+rya64oTOdJQFlZuMwI1Qz9VBJQrQC4QlSA2DNek5gCOA==", + "devOptional": true, + "license": "(Apache-2.0 AND BSD-3-Clause)" + }, "node_modules/@capsizecss/metrics": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/@capsizecss/metrics/-/metrics-3.5.0.tgz", @@ -6466,6 +6474,13 @@ "ieee754": "^1.2.1" } }, + "node_modules/buffer-builder": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/buffer-builder/-/buffer-builder-0.2.0.tgz", + "integrity": "sha512-7VPMEPuYznPSoR21NE1zvd2Xna6c/CloiZCfcMXR1Jny6PjX0N4Nsa38zcBFo/FMK+BlA+FLKbJCQ0i2yxp+Xg==", + "devOptional": true, + "license": "MIT/X11" + }, "node_modules/buffer-crc32": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", @@ -6967,6 +6982,13 @@ "integrity": "sha512-jeC1axXpnb0/2nn/Y1LPuLdgXBLH7aDcHu4KEKfqw3CUhX7ZpfBSlPKyqXE6btIgEzfWtrX3/tyBCaCvXvMkOw==", "license": "MIT" }, + "node_modules/colorjs.io": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/colorjs.io/-/colorjs.io-0.5.2.tgz", + "integrity": "sha512-twmVoizEW7ylZSN32OgKdXRmo1qg+wT5/6C3xu5b9QsWzSFAhHLn2xd8ro0diCsKfCj1RdaTP/nrcW+vAoQPIw==", + "devOptional": true, + "license": "MIT" + }, "node_modules/colortranslator": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/colortranslator/-/colortranslator-5.0.0.tgz", @@ -9698,6 +9720,13 @@ "integrity": "sha512-K6acvFaelNxx8wc2VjbIzXKDVB0Khs0QT35U6NkGfTdCmjLNcO2945m7RFNR9/RPVFm48hq7QPzK8uGH18HCGw==", "license": "MIT" }, + "node_modules/immutable": { + "version": "5.1.3", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.3.tgz", + "integrity": "sha512-+chQdDfvscSF1SJqv2gn4SRO2ZyS3xL3r7IW/wWEEzrzLisnOlKiQu5ytC/BVNcS15C39WT2Hg/bjKjDMcu+zg==", + "devOptional": true, + "license": "MIT" + }, "node_modules/import-fresh": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", @@ -14361,6 +14390,16 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rxjs": { + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", + "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", + "devOptional": true, + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -14381,6 +14420,392 @@ ], "license": "MIT" }, + "node_modules/sass": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.92.1.tgz", + "integrity": "sha512-ffmsdbwqb3XeyR8jJR6KelIXARM9bFQe8A6Q3W4Klmwy5Ckd5gz7jgUNHo4UOqutU5Sk1DtKLbpDP0nLCg1xqQ==", + "license": "MIT", + "optional": true, + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.0.2", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/sass-embedded": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded/-/sass-embedded-1.92.1.tgz", + "integrity": "sha512-28YwLnF5atAhogt3E4hXzz/NB9dwKffyw08a7DEasLh94P7+aELkG3ENSHYCWB9QFN14hYNLfwr9ozUsPDhcDQ==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "@bufbuild/protobuf": "^2.5.0", + "buffer-builder": "^0.2.0", + "colorjs.io": "^0.5.0", + "immutable": "^5.0.2", + "rxjs": "^7.4.0", + "supports-color": "^8.1.1", + "sync-child-process": "^1.0.2", + "varint": "^6.0.0" + }, + "bin": { + "sass": "dist/bin/sass.js" + }, + "engines": { + "node": ">=16.0.0" + }, + "optionalDependencies": { + "sass-embedded-all-unknown": "1.92.1", + "sass-embedded-android-arm": "1.92.1", + "sass-embedded-android-arm64": "1.92.1", + "sass-embedded-android-riscv64": "1.92.1", + "sass-embedded-android-x64": "1.92.1", + "sass-embedded-darwin-arm64": "1.92.1", + "sass-embedded-darwin-x64": "1.92.1", + "sass-embedded-linux-arm": "1.92.1", + "sass-embedded-linux-arm64": "1.92.1", + "sass-embedded-linux-musl-arm": "1.92.1", + "sass-embedded-linux-musl-arm64": "1.92.1", + "sass-embedded-linux-musl-riscv64": "1.92.1", + "sass-embedded-linux-musl-x64": "1.92.1", + "sass-embedded-linux-riscv64": "1.92.1", + "sass-embedded-linux-x64": "1.92.1", + "sass-embedded-unknown-all": "1.92.1", + "sass-embedded-win32-arm64": "1.92.1", + "sass-embedded-win32-x64": "1.92.1" + } + }, + "node_modules/sass-embedded-all-unknown": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-all-unknown/-/sass-embedded-all-unknown-1.92.1.tgz", + "integrity": "sha512-5t6/YZf+vhO3OY/49h8RCL6Cwo78luva0M+TnTM9gu9ASffRXAuOVLNKciSXa3loptyemDDS6IU5/dVH5w0KmA==", + "cpu": [ + "!arm", + "!arm64", + "!riscv64", + "!x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "dependencies": { + "sass": "1.92.1" + } + }, + "node_modules/sass-embedded-android-arm": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm/-/sass-embedded-android-arm-1.92.1.tgz", + "integrity": "sha512-4EjpVVzuksERdgAd4BqeSXFnWtWN3DSRyEIUPJ7BhcS9sfDh2Gf6miI2kNTvIQLJ2XIJynDDcEQ8a1U9KwKUTQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-arm64": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-arm64/-/sass-embedded-android-arm64-1.92.1.tgz", + "integrity": "sha512-Q+UruGb7yKawHagVmVDRRKsnc4mJZvWMBnuRCu2coJo2FofyqBmXohVGXbxko97sYceA9TJTrUEx3WVKQUNCbQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-riscv64": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-riscv64/-/sass-embedded-android-riscv64-1.92.1.tgz", + "integrity": "sha512-nCY5btLlX7W7Jc6cCL6D2Yklpiu540EJ2G08YVGu12DrAMCBzqM347CSRf2ojp1H8jyhvmLkaFwnrJWzh+6S+w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-android-x64": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-android-x64/-/sass-embedded-android-x64-1.92.1.tgz", + "integrity": "sha512-qYWR3bftJ77aLYwYDFuzDI4dcwVVixxqQxlIQWNGkHRCexj614qGSSHemr18C2eVj3mjXAQxTQxU68U7pkGPAA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-arm64": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-arm64/-/sass-embedded-darwin-arm64-1.92.1.tgz", + "integrity": "sha512-g2yQ3txjMYLKMjL2cW1xRO9nnV3ijf95NbX/QShtV6tiVUETZNWDsRMDEwBNGYY6PTE/UZerjJL1R/2xpQg6WA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-darwin-x64": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-darwin-x64/-/sass-embedded-darwin-x64-1.92.1.tgz", + "integrity": "sha512-eH+fgxLQhTEPjZPCgPAVuX5e514Qp/4DMAUMtlNShv4cr4TD5qOp1XlsPYR/b7uE7p2cKFkUpUn/bHNqJ2ay4A==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm/-/sass-embedded-linux-arm-1.92.1.tgz", + "integrity": "sha512-cT3w8yoQTqrtZvWLJeutEGmawITDTY4J6oSVQjeDcPnnoPt0gOFxem8YMznraACXvahw/2+KJDH33BTNgiPo0A==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-arm64": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-arm64/-/sass-embedded-linux-arm64-1.92.1.tgz", + "integrity": "sha512-dNmlpGeZkry1BofhAdGFBXrpM69y9LlYuNnncf+HfsOOUtj8j0q1RwS+zb5asknhKFUOAG8GCGRY1df7Rwu35g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm/-/sass-embedded-linux-musl-arm-1.92.1.tgz", + "integrity": "sha512-nPBos6lI31ef2zQhqTZhFOU7ar4impJbLIax0XsqS269YsiCwjhk11VmUloJTpFlJuKMiVXNo7dPx+katxhD/Q==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-arm64": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-arm64/-/sass-embedded-linux-musl-arm64-1.92.1.tgz", + "integrity": "sha512-TfiEBkCyNzVoOhjHXUT+vZ6+p0ueDbvRw6f4jHdkvljZzXdXMby4wh7BU1odl69rgRTkSvYKhgbErRLDR/F7pQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-riscv64": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-riscv64/-/sass-embedded-linux-musl-riscv64-1.92.1.tgz", + "integrity": "sha512-R+RcJA4EYpJDE9JM1GgPYgZo7x94FlxZ6jPodOQkEaZ1S9kvXVCuP5X/0PXRPhu08KJOfeMsAElzfdAjUf7KJg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-musl-x64": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-musl-x64/-/sass-embedded-linux-musl-x64-1.92.1.tgz", + "integrity": "sha512-/HolYRGXJjx8nLw6oj5ZrkR7PFM7X/5kE4MYZaFMpDIPIcw3bqB2fUXLo/MYlRLsw7gBAT6hJAMBrNdKuTphfw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-riscv64": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-riscv64/-/sass-embedded-linux-riscv64-1.92.1.tgz", + "integrity": "sha512-b9bxe0CMsbSsLx3nrR0cq8xpIkoAC6X36o4DGMITF3m2v3KsojC7ru9X0Gz+zUFr6rwpq/0lTNzFLNu6sPNo3w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-linux-x64": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-linux-x64/-/sass-embedded-linux-x64-1.92.1.tgz", + "integrity": "sha512-xuiK5Jp5NldW4bvlC7AuX1Wf7o0gLZ3md/hNg+bkTvxtCDgnUHtfdo8Q+xWP11bD9QX31xXFWpmUB8UDLi6XQQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-unknown-all": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-unknown-all/-/sass-embedded-unknown-all-1.92.1.tgz", + "integrity": "sha512-AT9oXvtNY4N+Nd0wvoWqq9A5HjdH/X3aUH4boQUtXyaJ/9DUwnQmBpP5Gtn028ZS8exOGBdobmmWAuigv0k/OA==", + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "!android", + "!darwin", + "!linux", + "!win32" + ], + "dependencies": { + "sass": "1.92.1" + } + }, + "node_modules/sass-embedded-win32-arm64": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-arm64/-/sass-embedded-win32-arm64-1.92.1.tgz", + "integrity": "sha512-KvmpQjY9yTBMtTYz4WBqetlv9bGaDW1aStcu7MSTbH7YiSybX/9fnxlCAEQv1WlIidQhcJAiyk0Eae+LGK7cIQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded-win32-x64": { + "version": "1.92.1", + "resolved": "https://registry.npmjs.org/sass-embedded-win32-x64/-/sass-embedded-win32-x64-1.92.1.tgz", + "integrity": "sha512-B6Nz/GbH7Vkpb2TkQHsGcczWM5t+70VWopWF1x5V5yxLpA8ZzVQ7NTKKi+jDoVY2Efu6ZyzgT9n5KgG2kWliXA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/sass-embedded/node_modules/supports-color": { + "version": "8.1.1", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", + "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, "node_modules/sax": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", @@ -15155,6 +15580,29 @@ "url": "https://opencollective.com/svgo" } }, + "node_modules/sync-child-process": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/sync-child-process/-/sync-child-process-1.0.2.tgz", + "integrity": "sha512-8lD+t2KrrScJ/7KXCSyfhT3/hRq78rC0wBFqNJXv3mZyn6hW2ypM05JmlSvtqRbeq6jqA94oHbxAr2vYsJ8vDA==", + "devOptional": true, + "license": "MIT", + "dependencies": { + "sync-message-port": "^1.0.0" + }, + "engines": { + "node": ">=16.0.0" + } + }, + "node_modules/sync-message-port": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sync-message-port/-/sync-message-port-1.1.3.tgz", + "integrity": "sha512-GTt8rSKje5FilG+wEdfCkOcLL7LWqpMlr2c3LRuKt/YXxcJ52aGSbGBAdI4L3aaqfrBt6y711El53ItyH1NWzg==", + "devOptional": true, + "license": "MIT", + "engines": { + "node": ">=16.0.0" + } + }, "node_modules/system-architecture": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", @@ -16185,6 +16633,13 @@ } } }, + "node_modules/varint": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/varint/-/varint-6.0.0.tgz", + "integrity": "sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==", + "devOptional": true, + "license": "MIT" + }, "node_modules/vaul-vue": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/vaul-vue/-/vaul-vue-0.4.1.tgz", diff --git a/package.json b/package.json index d1fce26..c7d9d0e 100644 --- a/package.json +++ b/package.json @@ -24,9 +24,11 @@ "pinia": "^3.0.3", "typescript": "^5.9.2", "vue": "^3.5.20", - "vue-router": "^4.5.1" + "vue-router": "^4.5.1", + "vuetify": "^3.4.0" }, "devDependencies": { + "sass-embedded": "^1.92.1", "vite-plugin-vuetify": "^2.1.2", "vuetify": "^3.9.7" } diff --git a/pages/Home.vue b/pages/Home.vue index 12e9c86..6f95b86 100644 --- a/pages/Home.vue +++ b/pages/Home.vue @@ -1,805 +1,775 @@ - \ No newline at end of file + .logo-item .v-img { + width: 40px !important; + height: 40px !important; + } + + .banner-content .v-img { + height: 150px !important; + } + + .hero-title { + font-size: 1.75rem; + } + + .contact-footer .v-row .v-col { + flex: 0 0 50%; + max-width: 50%; + } +} + diff --git a/pages/figma.vue b/pages/figma.vue new file mode 100644 index 0000000..284dd75 --- /dev/null +++ b/pages/figma.vue @@ -0,0 +1,119 @@ + + + + + \ No newline at end of file diff --git a/plugins/vuetify.ts b/plugins/vuetify.ts new file mode 100644 index 0000000..fc6a9fd --- /dev/null +++ b/plugins/vuetify.ts @@ -0,0 +1,27 @@ +import { createVuetify } from 'vuetify' +import * as components from 'vuetify/components' +import * as directives from 'vuetify/directives' + +export default defineNuxtPlugin((app) => { + const vuetify = createVuetify({ + components, + directives, + theme: { + defaultTheme: 'light', + themes: { + light: { + colors: { + primary: '#FF9800', + secondary: '#FFC107', + accent: '#FF5722', + error: '#F44336', + warning: '#FF9800', + info: '#2196F3', + success: '#4CAF50' + } + } + } + } + }) + app.vueApp.use(vuetify) +}) \ No newline at end of file diff --git a/stores/payment.ts b/stores/payment.ts index 36e1c7b..f12c6ab 100644 --- a/stores/payment.ts +++ b/stores/payment.ts @@ -1,171 +1,31 @@ -// stores/payment.ts import { defineStore } from 'pinia' -// Define a type for the store's state -export interface PaymentState { - payment: { - id: string | null - amount: number - description: string - patientName: string - qrCode: string - status: 'pending' | 'success' | 'failed' | 'expired' - expiryTime: string | null - } - loket: { - id: number | null - name: string - ipAddress: string - location: string - isActive: boolean - } - loading: boolean - error: string | null -} - export const usePaymentStore = defineStore('payment', { - state: (): PaymentState => ({ - payment: { - id: null, - amount: 0, - description: '', - patientName: '', - qrCode: '', - status: 'pending', - expiryTime: null, + state: () => ({ + currentStep: 1, // 1: info, 2: qr, 3: success + patientInfo: { + name: 'ALDY GUSTINARA', + amount: 'Rp 1.520.000', + expiry: '2025-08-24 12:30:00' }, - loket: { - id: null, - name: '', - ipAddress: '', - location: '', - isActive: false, - }, - loading: false, - error: null, + qrCode: 'data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cmVjdCB3aWR0aD0iMjAwIiBoZWlnaHQ9IjIwMCIgZmlsbD0iIzAwMCIvPjxyZWN0IHg9IjEwIiB5PSIxMCIgd2lkdGg9IjE4MCIgaGVpZ2h0PSIxODAiIGZpbGw9IiNmZmYiLz48L3N2Zz4=' }), - - getters: { - isSystemReady: (state) => { - return state.loket.id && state.loket.isActive - }, - paymentExpired: (state) => { - if (!state.payment.expiryTime) return false - return new Date() > new Date(state.payment.expiryTime) - }, - }, - + actions: { - setLoading(loading: boolean) { - this.loading = loading - }, - - setError(error: string | null) { - this.error = error - }, - - clearError() { - this.error = null - }, - - setPaymentData(data: Partial) { - this.payment = { ...this.payment, ...data } - }, - - setLoketInfo(data: Partial) { - this.loket = { ...this.loket, ...data } - }, - - resetPayment() { - this.payment = { - id: null, - amount: 0, - description: '', - patientName: '', - qrCode: '', - status: 'pending', - expiryTime: null, + nextStep() { + if (this.currentStep < 3) { + this.currentStep++ } }, - - // Actions for API calls - async fetchLoketInfo() { - try { - this.setLoading(true) - this.clearError() - - const { data } = await $fetch('/api/loket/info', { - headers: { - 'X-Client-IP': await this.getClientIP(), - }, - }) - - this.setLoketInfo(data) - return data - } catch (error: any) { - const errorMessage = error.data?.message || 'Gagal mengambil info loket' - this.setError(errorMessage) - throw error - } finally { - this.setLoading(false) + + prevStep() { + if (this.currentStep > 1) { + this.currentStep-- } }, - - async generatePayment(paymentData: { - patient_name: string - amount: number - description: string - loket_id: number - loket_ip: string - }) { - try { - this.setLoading(true) - this.clearError() - - const { data } = await $fetch('/api/payment/generate', { - method: 'POST', - body: paymentData, - headers: { - 'X-Client-IP': await this.getClientIP(), - }, - }) - - this.setPaymentData(data) - return data - } catch (error: any) { - const errorMessage = error.data?.message || 'Gagal generate pembayaran' - this.setError(errorMessage) - throw error - } finally { - this.setLoading(false) - } - }, - - async checkPaymentStatus(paymentId: string) { - try { - const { data } = await $fetch(`/api/payment/status/${paymentId}`) - this.setPaymentData({ status: data.status }) - return data - } catch (error) { - console.error('Error checking payment status:', error) - throw error - } - }, - - // Helper method to get client IP - async getClientIP(): Promise { - if (process.client) { - try { - const response = await fetch('https://api.ipify.org?format=json') - const data = await response.json() - return data.ip - } catch { - return window.location.hostname === 'localhost' - ? '127.0.0.1' - : window.location.hostname - } - } - return 'server-side' - }, - }, + + reset() { + this.currentStep = 1 + } + } }) \ No newline at end of file