feat: Initialize VitePress documentation system with multi-language content, custom theme, and assets.

This commit is contained in:
dyzulk
2026-01-16 15:05:45 +07:00
parent 1ae69f53f7
commit 0e38dcccc6
80 changed files with 73916 additions and 121 deletions

4
.gitignore vendored
View File

@@ -20,3 +20,7 @@ Thumbs.db
# Secrets and Environment
.env
# VitePress
docs/.vitepress/dist
docs/.vitepress/cache

84
CONTRIBUTING.md Normal file
View File

@@ -0,0 +1,84 @@
# Contributing to MIVO
First off, thank you for considering contributing to MIVO. It is people like you that make MIVO such a great tool.
## Code of Conduct
By participating in this project, you are expected to uphold our Code of Conduct. Please report unacceptable behavior to us.
## How Can I Contribute?
### Reporting Bugs
This section guides you through submitting a bug report for MIVO. Following these guidelines helps maintainers and the community understand your report, reproduce the behavior, and find related reports.
- **Use a clear and descriptive title** for the issue to identify the problem.
- **Describe the exact steps to reproduce the problem** in as many details as possible.
- **Provide specific examples** to demonstrate the steps.
- **Describe the behavior you observed** after following the steps and point out what exactly is the problem with that behavior.
- **Explain which behavior you expected to see instead** and why.
- **Include screenshots** if the issue is related to the User Interface.
### Suggesting Enhancements
This section guides you through submitting an enhancement suggestion for MIVO, including completely new features and minor improvements to existing functionality.
- **Use a clear and descriptive title** for the issue to identify the suggestion.
- **Provide a step-by-step description of the suggested enhancement** in as many details as possible.
- **Provide specific examples** to demonstrate the steps.
- **Describe the current behavior** and explain which behavior you expected to see instead and why.
### Pull Requests
The process described here has several goals:
- Maintain MIVO's quality.
- Fix problems that are important to users.
- Engage the community in working toward the best possible MIVO.
- Enable a sustainable system for MIVO's maintainers to review contributions.
Please follow these steps to have your contribution considered by the maintainers:
1. Follow all instructions in the template.
2. Follow the style guides.
3. After you submit your pull request, check that all status checks are passing.
## Development Setup
### Prerequisites
- PHP 8.1 or higher
- Composer
- Node.js and npm (for frontend assets and documentation)
### Installation
1. Clone the repository.
2. Run `composer install` to install PHP dependencies.
3. Run `npm install` to install frontend dependencies.
4. Copy `.env.example` to `.env` and configure your environment variables.
## Styleguides
### Git Commit Messages
- Use the present tense ("Add feature" not "Added feature").
- Use the imperative mood ("Move cursor to..." not "Moves cursor to...").
- Limit the first line to 72 characters or less.
- Reference issues and pull requests liberally after the first line.
### PHP Styleguide
- We follow PSR-12 coding standard.
- Use strict typing where possible.
### Documentation Styleguide
- Use Markdown.
- Limit line length to 80 characters.
- Use clear and concise language.
- **Do not use emojis.**
## License
By contributing, you agree that your contributions will be licensed under its MIT License.

View File

@@ -12,7 +12,7 @@ This Docker image is built on **Alpine Linux** and **Nginx**, optimized for high
![Status](https://img.shields.io/badge/Status-Beta-orange) ![PHP](https://img.shields.io/badge/PHP-8.2+-777BB4) ![License](https://img.shields.io/badge/License-MIT-green)
## 🚀 Quick Start
## Quick Start
Run MIVO in a single command:
@@ -32,7 +32,7 @@ Open your browser and navigate to `http://localhost:8080`.
**Initial Setup:**
If this is your first run, you will be redirected to the **Web Installer**. Follow the on-screen instructions to create the database and admin account.
## 🛠️ Docker Compose
## Docker Compose
For a more permanent setup, use `docker-compose.yml`:
@@ -51,13 +51,13 @@ services:
- ./mivo-data:/var/www/html/app/Database
```
## 📦 Tags
## Tags
- `latest`: Stable release (recommended).
- `edge`: Bleeding edge build from the `main` branch.
- `v1.x.x`: Specific released versions.
## 🔧 Environment Variables
## Environment Variables
| Variable | Description | Default |
| :--- | :--- | :--- |
@@ -66,18 +66,18 @@ services:
| `APP_KEY` | 32-character random string (base64). Auto-generated on first install if not provided. | |
| `TZ` | Timezone for the container. | `UTC` |
## 📂 Volumes
## Volumes
Persist your data by mounting these paths:
- `/var/www/html/app/Database`: Stores the SQLite database and session files. **(Critical)**
- `/var/www/html/public/assets/img/logos`: Stores uploaded custom logos.
## 🤝 Support the Project
## Support the Project
If you find MIVO useful, please consider supporting its development. Your contribution helps keep the project alive!
[![SociaBuzz Tribe](https://img.shields.io/badge/SociaBuzz-Tribe-green?style=for-the-badge&logo=sociabuzz&logoColor=white)](https://sociabuzz.com/dyzulkdev/tribe)
---
*Created with ❤️ by DyzulkDev*
*Created by DyzulkDev*

View File

@@ -10,16 +10,16 @@ MIVO is a complete rewrite of the legendary **Mikhmon v3**, re-engineered with a
![Status](https://img.shields.io/badge/Status-Beta-orange) ![PHP](https://img.shields.io/badge/PHP-8.0+-777BB4) ![License](https://img.shields.io/badge/License-MIT-green)
## 🚀 Key Features
## Key Features
* **Lightweight Core**: Built on a custom minimal MVC framework (~50KB core) optimized for speed.
* **🎨 Modern UI/UX**: Fresh Glassmorphism design system using TailwindCSS and Alpine.js.
* **📱 Responsive**: Fully optimized mobile experience with touch-friendly navigation.
* **🔒 Secure**: Environment-based configuration (`.env`), encrypted credentials, and secure session management.
* **🔌 API Ready**: Built-in REST API support with CORS management for external integrations.
* **🛠️ CLI Tool**: Includes `mivo` CLI helper for easy management and installation.
* **Lightweight Core**: Built on a custom minimal MVC framework (~50KB core) optimized for speed.
* **Modern UI/UX**: Fresh Glassmorphism design system using TailwindCSS and Alpine.js.
* **Responsive**: Fully optimized mobile experience with touch-friendly navigation.
* **Secure**: Environment-based configuration (`.env`), encrypted credentials, and secure session management.
* **API Ready**: Built-in REST API support with CORS management for external integrations.
* **CLI Tool**: Includes `mivo` CLI helper for easy management and installation.
## 🛠️ Installation
## Installation
### Requirements
* PHP 8.0 or higher
@@ -59,7 +59,7 @@ MIVO is a complete rewrite of the legendary **Mikhmon v3**, re-engineered with a
* **Option B: Web Installer**
Open `http://localhost:8000/install` in your browser and follow the instructions.
## 📂 Structure
## Structure
* `app/` - Core application logic (Controllers, Models, Views).
* `public/` - Web root and assets.
@@ -67,20 +67,20 @@ MIVO is a complete rewrite of the legendary **Mikhmon v3**, re-engineered with a
* `mivo` - CLI executable entry point.
## 🤝 Contributing
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## Support the Project
## Support the Project
If you find MIVO useful, please consider supporting its development. Your contribution helps keep the project alive!
[![SociaBuzz Tribe](https://img.shields.io/badge/SociaBuzz-Tribe-green?style=for-the-badge&logo=sociabuzz&logoColor=white)](https://sociabuzz.com/dyzulkdev/tribe)
## 📄 License
## License
This project is open-sourced software licensed under the [MIT license](https://opensource.org/licenses/MIT).
---
*Created with ❤️ by DyzulkDev*
*Created by DyzulkDev*

View File

@@ -0,0 +1,61 @@
{
"hash": "351ebb31",
"configHash": "9f61585a",
"lockfileHash": "a8ce03f4",
"browserHash": "3a62ec11",
"optimized": {
"vue": {
"src": "../../../../node_modules/vue/dist/vue.runtime.esm-bundler.js",
"file": "vue.js",
"fileHash": "5b1d304c",
"needsInterop": false
},
"vitepress > @vue/devtools-api": {
"src": "../../../../node_modules/@vue/devtools-api/dist/index.js",
"file": "vitepress___@vue_devtools-api.js",
"fileHash": "b482c46a",
"needsInterop": false
},
"vitepress > @vueuse/core": {
"src": "../../../../node_modules/@vueuse/core/index.mjs",
"file": "vitepress___@vueuse_core.js",
"fileHash": "a5c5890d",
"needsInterop": false
},
"vitepress > @vueuse/integrations/useFocusTrap": {
"src": "../../../../node_modules/@vueuse/integrations/useFocusTrap.mjs",
"file": "vitepress___@vueuse_integrations_useFocusTrap.js",
"fileHash": "95f44bf0",
"needsInterop": false
},
"vitepress > mark.js/src/vanilla.js": {
"src": "../../../../node_modules/mark.js/src/vanilla.js",
"file": "vitepress___mark__js_src_vanilla__js.js",
"fileHash": "9dc093d4",
"needsInterop": false
},
"vitepress > minisearch": {
"src": "../../../../node_modules/minisearch/dist/es/index.js",
"file": "vitepress___minisearch.js",
"fileHash": "55d2ce5f",
"needsInterop": false
},
"lucide-vue-next": {
"src": "../../../../node_modules/lucide-vue-next/dist/esm/lucide-vue-next.js",
"file": "lucide-vue-next.js",
"fileHash": "d70b9ca5",
"needsInterop": false
}
},
"chunks": {
"chunk-2CLQ7TTZ": {
"file": "chunk-2CLQ7TTZ.js"
},
"chunk-LE5NDSFD": {
"file": "chunk-LE5NDSFD.js"
},
"chunk-PZ5AY32C": {
"file": "chunk-PZ5AY32C.js"
}
}
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,10 @@
var __defProp = Object.defineProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
export {
__export
};
//# sourceMappingURL=chunk-PZ5AY32C.js.map

View File

@@ -0,0 +1,7 @@
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,3 @@
{
"type": "module"
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,584 @@
import {
DefaultMagicKeysAliasMap,
StorageSerializers,
TransitionPresets,
assert,
breakpointsAntDesign,
breakpointsBootstrapV5,
breakpointsElement,
breakpointsMasterCss,
breakpointsPrimeFlex,
breakpointsQuasar,
breakpointsSematic,
breakpointsTailwind,
breakpointsVuetify,
breakpointsVuetifyV2,
breakpointsVuetifyV3,
bypassFilter,
camelize,
clamp,
cloneFnJSON,
computedAsync,
computedEager,
computedInject,
computedWithControl,
containsProp,
controlledRef,
createEventHook,
createFetch,
createFilterWrapper,
createGlobalState,
createInjectionState,
createRef,
createReusableTemplate,
createSharedComposable,
createSingletonPromise,
createTemplatePromise,
createUnrefFn,
customStorageEventName,
debounceFilter,
defaultDocument,
defaultLocation,
defaultNavigator,
defaultWindow,
executeTransition,
extendRef,
formatDate,
formatTimeAgo,
get,
getLifeCycleTarget,
getSSRHandler,
hasOwn,
hyphenate,
identity,
increaseWithUnit,
injectLocal,
invoke,
isClient,
isDef,
isDefined,
isIOS,
isObject,
isWorker,
makeDestructurable,
mapGamepadToXbox360Controller,
noop,
normalizeDate,
notNullish,
now,
objectEntries,
objectOmit,
objectPick,
onClickOutside,
onElementRemoval,
onKeyDown,
onKeyPressed,
onKeyStroke,
onKeyUp,
onLongPress,
onStartTyping,
pausableFilter,
promiseTimeout,
provideLocal,
provideSSRWidth,
pxValue,
rand,
reactify,
reactifyObject,
reactiveComputed,
reactiveOmit,
reactivePick,
refAutoReset,
refDebounced,
refDefault,
refThrottled,
refWithControl,
resolveRef,
resolveUnref,
set,
setSSRHandler,
syncRef,
syncRefs,
templateRef,
throttleFilter,
timestamp,
toArray,
toReactive,
toRef,
toRefs,
toValue,
tryOnBeforeMount,
tryOnBeforeUnmount,
tryOnMounted,
tryOnScopeDispose,
tryOnUnmounted,
unrefElement,
until,
useActiveElement,
useAnimate,
useArrayDifference,
useArrayEvery,
useArrayFilter,
useArrayFind,
useArrayFindIndex,
useArrayFindLast,
useArrayIncludes,
useArrayJoin,
useArrayMap,
useArrayReduce,
useArraySome,
useArrayUnique,
useAsyncQueue,
useAsyncState,
useBase64,
useBattery,
useBluetooth,
useBreakpoints,
useBroadcastChannel,
useBrowserLocation,
useCached,
useClipboard,
useClipboardItems,
useCloned,
useColorMode,
useConfirmDialog,
useCountdown,
useCounter,
useCssVar,
useCurrentElement,
useCycleList,
useDark,
useDateFormat,
useDebounceFn,
useDebouncedRefHistory,
useDeviceMotion,
useDeviceOrientation,
useDevicePixelRatio,
useDevicesList,
useDisplayMedia,
useDocumentVisibility,
useDraggable,
useDropZone,
useElementBounding,
useElementByPoint,
useElementHover,
useElementSize,
useElementVisibility,
useEventBus,
useEventListener,
useEventSource,
useEyeDropper,
useFavicon,
useFetch,
useFileDialog,
useFileSystemAccess,
useFocus,
useFocusWithin,
useFps,
useFullscreen,
useGamepad,
useGeolocation,
useIdle,
useImage,
useInfiniteScroll,
useIntersectionObserver,
useInterval,
useIntervalFn,
useKeyModifier,
useLastChanged,
useLocalStorage,
useMagicKeys,
useManualRefHistory,
useMediaControls,
useMediaQuery,
useMemoize,
useMemory,
useMounted,
useMouse,
useMouseInElement,
useMousePressed,
useMutationObserver,
useNavigatorLanguage,
useNetwork,
useNow,
useObjectUrl,
useOffsetPagination,
useOnline,
usePageLeave,
useParallax,
useParentElement,
usePerformanceObserver,
usePermission,
usePointer,
usePointerLock,
usePointerSwipe,
usePreferredColorScheme,
usePreferredContrast,
usePreferredDark,
usePreferredLanguages,
usePreferredReducedMotion,
usePreferredReducedTransparency,
usePrevious,
useRafFn,
useRefHistory,
useResizeObserver,
useSSRWidth,
useScreenOrientation,
useScreenSafeArea,
useScriptTag,
useScroll,
useScrollLock,
useSessionStorage,
useShare,
useSorted,
useSpeechRecognition,
useSpeechSynthesis,
useStepper,
useStorage,
useStorageAsync,
useStyleTag,
useSupported,
useSwipe,
useTemplateRefsList,
useTextDirection,
useTextSelection,
useTextareaAutosize,
useThrottleFn,
useThrottledRefHistory,
useTimeAgo,
useTimeout,
useTimeoutFn,
useTimeoutPoll,
useTimestamp,
useTitle,
useToNumber,
useToString,
useToggle,
useTransition,
useUrlSearchParams,
useUserMedia,
useVModel,
useVModels,
useVibrate,
useVirtualList,
useWakeLock,
useWebNotification,
useWebSocket,
useWebWorker,
useWebWorkerFn,
useWindowFocus,
useWindowScroll,
useWindowSize,
watchArray,
watchAtMost,
watchDebounced,
watchDeep,
watchIgnorable,
watchImmediate,
watchOnce,
watchPausable,
watchThrottled,
watchTriggerable,
watchWithFilter,
whenever
} from "./chunk-2CLQ7TTZ.js";
import "./chunk-LE5NDSFD.js";
import "./chunk-PZ5AY32C.js";
export {
DefaultMagicKeysAliasMap,
StorageSerializers,
TransitionPresets,
assert,
computedAsync as asyncComputed,
refAutoReset as autoResetRef,
breakpointsAntDesign,
breakpointsBootstrapV5,
breakpointsElement,
breakpointsMasterCss,
breakpointsPrimeFlex,
breakpointsQuasar,
breakpointsSematic,
breakpointsTailwind,
breakpointsVuetify,
breakpointsVuetifyV2,
breakpointsVuetifyV3,
bypassFilter,
camelize,
clamp,
cloneFnJSON,
computedAsync,
computedEager,
computedInject,
computedWithControl,
containsProp,
computedWithControl as controlledComputed,
controlledRef,
createEventHook,
createFetch,
createFilterWrapper,
createGlobalState,
createInjectionState,
reactify as createReactiveFn,
createRef,
createReusableTemplate,
createSharedComposable,
createSingletonPromise,
createTemplatePromise,
createUnrefFn,
customStorageEventName,
debounceFilter,
refDebounced as debouncedRef,
watchDebounced as debouncedWatch,
defaultDocument,
defaultLocation,
defaultNavigator,
defaultWindow,
computedEager as eagerComputed,
executeTransition,
extendRef,
formatDate,
formatTimeAgo,
get,
getLifeCycleTarget,
getSSRHandler,
hasOwn,
hyphenate,
identity,
watchIgnorable as ignorableWatch,
increaseWithUnit,
injectLocal,
invoke,
isClient,
isDef,
isDefined,
isIOS,
isObject,
isWorker,
makeDestructurable,
mapGamepadToXbox360Controller,
noop,
normalizeDate,
notNullish,
now,
objectEntries,
objectOmit,
objectPick,
onClickOutside,
onElementRemoval,
onKeyDown,
onKeyPressed,
onKeyStroke,
onKeyUp,
onLongPress,
onStartTyping,
pausableFilter,
watchPausable as pausableWatch,
promiseTimeout,
provideLocal,
provideSSRWidth,
pxValue,
rand,
reactify,
reactifyObject,
reactiveComputed,
reactiveOmit,
reactivePick,
refAutoReset,
refDebounced,
refDefault,
refThrottled,
refWithControl,
resolveRef,
resolveUnref,
set,
setSSRHandler,
syncRef,
syncRefs,
templateRef,
throttleFilter,
refThrottled as throttledRef,
watchThrottled as throttledWatch,
timestamp,
toArray,
toReactive,
toRef,
toRefs,
toValue,
tryOnBeforeMount,
tryOnBeforeUnmount,
tryOnMounted,
tryOnScopeDispose,
tryOnUnmounted,
unrefElement,
until,
useActiveElement,
useAnimate,
useArrayDifference,
useArrayEvery,
useArrayFilter,
useArrayFind,
useArrayFindIndex,
useArrayFindLast,
useArrayIncludes,
useArrayJoin,
useArrayMap,
useArrayReduce,
useArraySome,
useArrayUnique,
useAsyncQueue,
useAsyncState,
useBase64,
useBattery,
useBluetooth,
useBreakpoints,
useBroadcastChannel,
useBrowserLocation,
useCached,
useClipboard,
useClipboardItems,
useCloned,
useColorMode,
useConfirmDialog,
useCountdown,
useCounter,
useCssVar,
useCurrentElement,
useCycleList,
useDark,
useDateFormat,
refDebounced as useDebounce,
useDebounceFn,
useDebouncedRefHistory,
useDeviceMotion,
useDeviceOrientation,
useDevicePixelRatio,
useDevicesList,
useDisplayMedia,
useDocumentVisibility,
useDraggable,
useDropZone,
useElementBounding,
useElementByPoint,
useElementHover,
useElementSize,
useElementVisibility,
useEventBus,
useEventListener,
useEventSource,
useEyeDropper,
useFavicon,
useFetch,
useFileDialog,
useFileSystemAccess,
useFocus,
useFocusWithin,
useFps,
useFullscreen,
useGamepad,
useGeolocation,
useIdle,
useImage,
useInfiniteScroll,
useIntersectionObserver,
useInterval,
useIntervalFn,
useKeyModifier,
useLastChanged,
useLocalStorage,
useMagicKeys,
useManualRefHistory,
useMediaControls,
useMediaQuery,
useMemoize,
useMemory,
useMounted,
useMouse,
useMouseInElement,
useMousePressed,
useMutationObserver,
useNavigatorLanguage,
useNetwork,
useNow,
useObjectUrl,
useOffsetPagination,
useOnline,
usePageLeave,
useParallax,
useParentElement,
usePerformanceObserver,
usePermission,
usePointer,
usePointerLock,
usePointerSwipe,
usePreferredColorScheme,
usePreferredContrast,
usePreferredDark,
usePreferredLanguages,
usePreferredReducedMotion,
usePreferredReducedTransparency,
usePrevious,
useRafFn,
useRefHistory,
useResizeObserver,
useSSRWidth,
useScreenOrientation,
useScreenSafeArea,
useScriptTag,
useScroll,
useScrollLock,
useSessionStorage,
useShare,
useSorted,
useSpeechRecognition,
useSpeechSynthesis,
useStepper,
useStorage,
useStorageAsync,
useStyleTag,
useSupported,
useSwipe,
useTemplateRefsList,
useTextDirection,
useTextSelection,
useTextareaAutosize,
refThrottled as useThrottle,
useThrottleFn,
useThrottledRefHistory,
useTimeAgo,
useTimeout,
useTimeoutFn,
useTimeoutPoll,
useTimestamp,
useTitle,
useToNumber,
useToString,
useToggle,
useTransition,
useUrlSearchParams,
useUserMedia,
useVModel,
useVModels,
useVibrate,
useVirtualList,
useWakeLock,
useWebNotification,
useWebSocket,
useWebWorker,
useWebWorkerFn,
useWindowFocus,
useWindowScroll,
useWindowSize,
watchArray,
watchAtMost,
watchDebounced,
watchDeep,
watchIgnorable,
watchImmediate,
watchOnce,
watchPausable,
watchThrottled,
watchTriggerable,
watchWithFilter,
whenever
};
//# sourceMappingURL=vitepress___@vueuse_core.js.map

View File

@@ -0,0 +1,7 @@
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

348
docs/.vitepress/cache/deps/vue.js vendored Normal file
View File

@@ -0,0 +1,348 @@
import {
BaseTransition,
BaseTransitionPropsValidators,
Comment,
DeprecationTypes,
EffectScope,
ErrorCodes,
ErrorTypeStrings,
Fragment,
KeepAlive,
ReactiveEffect,
Static,
Suspense,
Teleport,
Text,
TrackOpTypes,
Transition,
TransitionGroup,
TriggerOpTypes,
VueElement,
assertNumber,
callWithAsyncErrorHandling,
callWithErrorHandling,
camelize,
capitalize,
cloneVNode,
compatUtils,
compile,
computed,
createApp,
createBaseVNode,
createBlock,
createCommentVNode,
createElementBlock,
createHydrationRenderer,
createPropsRestProxy,
createRenderer,
createSSRApp,
createSlots,
createStaticVNode,
createTextVNode,
createVNode,
customRef,
defineAsyncComponent,
defineComponent,
defineCustomElement,
defineEmits,
defineExpose,
defineModel,
defineOptions,
defineProps,
defineSSRCustomElement,
defineSlots,
devtools,
effect,
effectScope,
getCurrentInstance,
getCurrentScope,
getCurrentWatcher,
getTransitionRawChildren,
guardReactiveProps,
h,
handleError,
hasInjectionContext,
hydrate,
hydrateOnIdle,
hydrateOnInteraction,
hydrateOnMediaQuery,
hydrateOnVisible,
initCustomFormatter,
initDirectivesForSSR,
inject,
isMemoSame,
isProxy,
isReactive,
isReadonly,
isRef,
isRuntimeOnly,
isShallow,
isVNode,
markRaw,
mergeDefaults,
mergeModels,
mergeProps,
nextTick,
nodeOps,
normalizeClass,
normalizeProps,
normalizeStyle,
onActivated,
onBeforeMount,
onBeforeUnmount,
onBeforeUpdate,
onDeactivated,
onErrorCaptured,
onMounted,
onRenderTracked,
onRenderTriggered,
onScopeDispose,
onServerPrefetch,
onUnmounted,
onUpdated,
onWatcherCleanup,
openBlock,
patchProp,
popScopeId,
provide,
proxyRefs,
pushScopeId,
queuePostFlushCb,
reactive,
readonly,
ref,
registerRuntimeCompiler,
render,
renderList,
renderSlot,
resolveComponent,
resolveDirective,
resolveDynamicComponent,
resolveFilter,
resolveTransitionHooks,
setBlockTracking,
setDevtoolsHook,
setTransitionHooks,
shallowReactive,
shallowReadonly,
shallowRef,
ssrContextKey,
ssrUtils,
stop,
toDisplayString,
toHandlerKey,
toHandlers,
toRaw,
toRef,
toRefs,
toValue,
transformVNodeArgs,
triggerRef,
unref,
useAttrs,
useCssModule,
useCssVars,
useHost,
useId,
useModel,
useSSRContext,
useShadowRoot,
useSlots,
useTemplateRef,
useTransitionState,
vModelCheckbox,
vModelDynamic,
vModelRadio,
vModelSelect,
vModelText,
vShow,
version,
warn,
watch,
watchEffect,
watchPostEffect,
watchSyncEffect,
withAsyncContext,
withCtx,
withDefaults,
withDirectives,
withKeys,
withMemo,
withModifiers,
withScopeId
} from "./chunk-LE5NDSFD.js";
import "./chunk-PZ5AY32C.js";
export {
BaseTransition,
BaseTransitionPropsValidators,
Comment,
DeprecationTypes,
EffectScope,
ErrorCodes,
ErrorTypeStrings,
Fragment,
KeepAlive,
ReactiveEffect,
Static,
Suspense,
Teleport,
Text,
TrackOpTypes,
Transition,
TransitionGroup,
TriggerOpTypes,
VueElement,
assertNumber,
callWithAsyncErrorHandling,
callWithErrorHandling,
camelize,
capitalize,
cloneVNode,
compatUtils,
compile,
computed,
createApp,
createBlock,
createCommentVNode,
createElementBlock,
createBaseVNode as createElementVNode,
createHydrationRenderer,
createPropsRestProxy,
createRenderer,
createSSRApp,
createSlots,
createStaticVNode,
createTextVNode,
createVNode,
customRef,
defineAsyncComponent,
defineComponent,
defineCustomElement,
defineEmits,
defineExpose,
defineModel,
defineOptions,
defineProps,
defineSSRCustomElement,
defineSlots,
devtools,
effect,
effectScope,
getCurrentInstance,
getCurrentScope,
getCurrentWatcher,
getTransitionRawChildren,
guardReactiveProps,
h,
handleError,
hasInjectionContext,
hydrate,
hydrateOnIdle,
hydrateOnInteraction,
hydrateOnMediaQuery,
hydrateOnVisible,
initCustomFormatter,
initDirectivesForSSR,
inject,
isMemoSame,
isProxy,
isReactive,
isReadonly,
isRef,
isRuntimeOnly,
isShallow,
isVNode,
markRaw,
mergeDefaults,
mergeModels,
mergeProps,
nextTick,
nodeOps,
normalizeClass,
normalizeProps,
normalizeStyle,
onActivated,
onBeforeMount,
onBeforeUnmount,
onBeforeUpdate,
onDeactivated,
onErrorCaptured,
onMounted,
onRenderTracked,
onRenderTriggered,
onScopeDispose,
onServerPrefetch,
onUnmounted,
onUpdated,
onWatcherCleanup,
openBlock,
patchProp,
popScopeId,
provide,
proxyRefs,
pushScopeId,
queuePostFlushCb,
reactive,
readonly,
ref,
registerRuntimeCompiler,
render,
renderList,
renderSlot,
resolveComponent,
resolveDirective,
resolveDynamicComponent,
resolveFilter,
resolveTransitionHooks,
setBlockTracking,
setDevtoolsHook,
setTransitionHooks,
shallowReactive,
shallowReadonly,
shallowRef,
ssrContextKey,
ssrUtils,
stop,
toDisplayString,
toHandlerKey,
toHandlers,
toRaw,
toRef,
toRefs,
toValue,
transformVNodeArgs,
triggerRef,
unref,
useAttrs,
useCssModule,
useCssVars,
useHost,
useId,
useModel,
useSSRContext,
useShadowRoot,
useSlots,
useTemplateRef,
useTransitionState,
vModelCheckbox,
vModelDynamic,
vModelRadio,
vModelSelect,
vModelText,
vShow,
version,
warn,
watch,
watchEffect,
watchPostEffect,
watchSyncEffect,
withAsyncContext,
withCtx,
withDefaults,
withDirectives,
withKeys,
withMemo,
withModifiers,
withScopeId
};
//# sourceMappingURL=vue.js.map

7
docs/.vitepress/cache/deps/vue.js.map vendored Normal file
View File

@@ -0,0 +1,7 @@
{
"version": 3,
"sources": [],
"sourcesContent": [],
"mappings": "",
"names": []
}

View File

@@ -1,4 +1,6 @@
import { defineConfig } from 'vitepress'
import { sidebarEn, sidebarId } from './config/sidebars'
import { navEn, navId } from './config/nav'
export default defineConfig({
title: "MIVO",
@@ -8,45 +10,17 @@ export default defineConfig({
lastUpdated: true,
head: [
['link', { rel: 'icon', href: '/logo.png' }]
['link', { rel: 'icon', href: '/logo-m.svg' }]
],
// Shared theme config
themeConfig: {
logo: '/logo.png',
logo: {
light: '/logo-m.svg',
dark: '/logo-m-dark.svg'
},
siteTitle: 'MIVO',
nav: [
{ text: 'Home', link: '/' },
{ text: 'Guide', link: '/guide/installation' },
{ text: 'Docker', link: '/guide/docker' },
{ text: 'GitHub', link: 'https://github.com/dyzulk/mivo' }
],
sidebar: [
{
text: 'Introduction',
items: [
{ text: 'What is MIVO?', link: '/' },
{ text: 'Installation', link: '/guide/installation' }
]
},
{
text: 'Deployment',
items: [
{ text: 'Docker Guide', link: '/guide/docker' },
{ text: 'Manual Installation', link: '/guide/installation#manual-installation' },
{ text: 'PaaS / Cloud', link: '/guide/installation#paas-cloud-railway-render-heroku' }
]
},
{
text: 'Support',
items: [
{ text: 'Contribution', link: 'https://github.com/dyzulk/mivo/blob/main/CONTRIBUTING.md' },
{ text: 'Donate', link: 'https://sociabuzz.com/dyzulkdev/tribe' }
]
}
],
socialLinks: [
{ icon: 'github', link: 'https://github.com/dyzulk/mivo' }
],
@@ -59,5 +33,25 @@ export default defineConfig({
search: {
provider: 'local'
}
},
locales: {
root: {
label: 'English',
lang: 'en',
themeConfig: {
nav: navEn,
sidebar: sidebarEn
}
},
id: {
label: 'Indonesia',
lang: 'id',
themeConfig: {
nav: navId,
sidebar: sidebarId
}
}
}
})

View File

@@ -0,0 +1,27 @@
import { DefaultTheme } from 'vitepress'
export const navEn: DefaultTheme.NavItem[] = [
{ text: 'Home', link: '/' },
{ text: 'Guide', link: '/guide/installation' },
{ text: 'Manual', link: '/manual/' },
{
text: 'Community',
items: [
{ text: 'Changelog', link: 'https://github.com/dyzulk/mivo/releases' },
{ text: 'Contributing', link: 'https://github.com/dyzulk/mivo/blob/main/CONTRIBUTING.md' }
]
}
]
export const navId: DefaultTheme.NavItem[] = [
{ text: 'Beranda', link: '/id/' },
{ text: 'Panduan', link: '/id/guide/installation' },
{ text: 'Buku Manual', link: '/id/manual/' },
{
text: 'Komunitas',
items: [
{ text: 'Catatan Rilis', link: 'https://github.com/dyzulk/mivo/releases' },
{ text: 'Kontribusi', link: 'https://github.com/dyzulk/mivo/blob/main/CONTRIBUTING.md' }
]
}
]

View File

@@ -0,0 +1,145 @@
import { DefaultTheme } from 'vitepress'
// English Sidebars
export const sidebarEn: DefaultTheme.Sidebar = {
// Sidebar for /guide/ path
'/guide/': [
{
text: 'Getting Started',
collapsed: false,
items: [
{ text: 'Introduction', link: '/guide/' },
{ text: 'Requirements', link: '/guide/installation#requirements' }
]
},
{
text: 'Installation',
collapsed: false,
items: [
{ text: 'Docker', link: '/guide/docker' },
{ text: 'Web Server', link: '/guide/installation#web-servers' },
{ text: 'Shared Hosting', link: '/guide/installation#shared-hosting' },
{ text: 'VPS & Cloud', link: '/guide/installation#vps-cloud' },
{ text: 'Mobile & STB', link: '/guide/installation#mobile-stb' }
]
},
{
text: 'Configuration',
items: [
{ text: 'Post-Installation', link: '/guide/installation#post-installation' }
]
},
{
text: 'Support',
items: [
{ text: 'Contribution', link: 'https://github.com/dyzulk/mivo/blob/main/CONTRIBUTING.md' },
{ text: 'Donate', link: 'https://sociabuzz.com/dyzulkdev/tribe' }
]
}
],
// Sidebar for /manual/ path
'/manual/': [
{
text: 'User Manual',
items: [
{ text: 'Overview', link: '/manual/' }
]
},
{
text: 'Global Settings',
items: [
{ text: 'Introduction', link: '/manual/settings/' },
{ text: 'Routers', link: '/manual/settings/routers' },
{ text: 'Templates', link: '/manual/settings/templates' },
{ text: 'Logos', link: '/manual/settings/logos' },
{ text: 'API & CORS', link: '/manual/settings/api-cors' },
{ text: 'System', link: '/manual/settings/system' }
]
},
{
text: 'Router Operations',
items: [
{ text: 'Introduction', link: '/manual/router/' },
{ text: 'Dashboard', link: '/manual/router/dashboard' },
{ text: 'Quick Print', link: '/manual/router/quick-print' },
{ text: 'Hotspot Management', link: '/manual/router/hotspot' },
{ text: 'Reports & Logs', link: '/manual/router/reports' },
{ text: 'Network & System', link: '/manual/router/tools' }
]
}
]
}
// Indonesian Sidebars
export const sidebarId: DefaultTheme.Sidebar = {
// Sidebar for /id/guide/ path
'/id/guide/': [
{
text: 'Pengenalan',
collapsed: false,
items: [
{ text: 'Apa itu MIVO?', link: '/id/guide/' },
{ text: 'Persyaratan', link: '/id/guide/installation#persyaratan' }
]
},
{
text: 'Instalasi',
collapsed: false,
items: [
{ text: 'Docker', link: '/id/guide/docker' },
{ text: 'Web Server', link: '/id/guide/installation#web-server' },
{ text: 'Shared Hosting', link: '/id/guide/installation#shared-hosting' },
{ text: 'VPS & Cloud', link: '/id/guide/installation#vps-cloud' },
{ text: 'Mobile & STB', link: '/id/guide/installation#mobile-stb' }
]
},
{
text: 'Konfigurasi',
items: [
{ text: 'Pasca-Instalasi', link: '/id/guide/installation#pasca-instalasi' }
]
},
{
text: 'Dukungan',
items: [
{ text: 'Kontribusi', link: 'https://github.com/dyzulk/mivo/blob/main/CONTRIBUTING.md' },
{ text: 'Donasi', link: 'https://sociabuzz.com/dyzulkdev/tribe' }
]
}
],
// Sidebar for /id/manual/ path
'/id/manual/': [
{
text: 'Buku Manual',
items: [
{ text: 'Ringkasan', link: '/id/manual/' }
]
},
{
text: 'Pengaturan Global',
items: [
{ text: 'Pendahuluan', link: '/id/manual/settings/' },
{ text: 'Router', link: '/id/manual/settings/routers' },
{ text: 'Template', link: '/id/manual/settings/templates' },
{ text: 'Logo', link: '/id/manual/settings/logos' },
{ text: 'API & CORS', link: '/id/manual/settings/api-cors' },
{ text: 'Sistem', link: '/id/manual/settings/system' }
]
},
{
text: 'Operasional Router',
items: [
{ text: 'Pendahuluan', link: '/id/manual/router/' },
{ text: 'Dashboard', link: '/id/manual/router/dashboard' },
{ text: 'Cetak Cepat', link: '/id/manual/router/quick-print' },
{ text: 'Manajemen Hotspot', link: '/id/manual/router/hotspot' },
{ text: 'Laporan & Log', link: '/id/manual/router/reports' },
{ text: 'Jaringan & Sistem', link: '/id/manual/router/tools' }
]
}
]
}

View File

@@ -0,0 +1,82 @@
<script setup>
import DefaultTheme from 'vitepress/theme'
const { Layout } = DefaultTheme
</script>
<template>
<Layout>
<template #layout-bottom>
<div class="mivo-bg">
<!-- Subtle Grid Pattern -->
<div class="mivo-grid"></div>
<!-- Glowing Orbs -->
<div class="mivo-orb orb-1"></div>
<div class="mivo-orb orb-2"></div>
</div>
</template>
</Layout>
</template>
<style scoped>
.mivo-bg {
position: fixed;
inset: 0;
z-index: -1;
pointer-events: none;
overflow: hidden;
}
.mivo-grid {
position: absolute;
inset: 0;
background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBjeD0iMSIgY3k9IjEiIHI9IjEiIGZpbGw9InJnYmEoMCwwLDAsMC4zKSIvPjwvc3ZnPg==');
mask-image: linear-gradient(to bottom, white, transparent);
-webkit-mask-image: linear-gradient(to bottom, white, transparent);
}
:root.dark .mivo-grid {
background-image: url('data:image/svg+xml;base64,PHN2ZyB3aWR0aD0iMjAiIGhlaWdodD0iMjAiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGNpcmNsZSBjeD0iMSIgY3k9IjEiIHI9IjEiIGZpbGw9InJnYmEoMjU1LDI1NSwyNTUsMC4wNSkiLz48L3N2Zz4=');
}
.mivo-orb {
position: absolute;
border-radius: 9999px;
filter: blur(100px);
opacity: 0.2;
animation: pulse 8s cubic-bezier(0.4, 0, 0.6, 1) infinite;
}
:root.dark .mivo-orb {
opacity: 0.05;
}
.orb-1 {
top: -20%;
left: -10%;
width: 70vw;
height: 70vw;
background-color: #3b82f6; /* blue-500 */
animation-duration: 4s;
}
.orb-2 {
top: 30%;
right: -15%;
width: 60vw;
height: 60vw;
background-color: #a855f7; /* purple-500 */
animation-duration: 6s;
animation-delay: 1s;
}
@keyframes pulse {
0%, 100% { opacity: 0.2; }
50% { opacity: 0.15; }
}
:root.dark @keyframes pulse {
0%, 100% { opacity: 0.05; }
50% { opacity: 0.03; }
}
</style>

View File

@@ -0,0 +1,60 @@
<template>
<component
:is="iconComponent"
v-if="iconComponent"
:size="size || 20"
:stroke-width="strokeWidth || 2"
class="lucide-icon"
:style="{ color: resolvedColor }"
v-bind="$attrs"
/>
</template>
<script setup>
import { computed } from 'vue'
import * as icons from 'lucide-vue-next'
const props = defineProps({
name: {
type: String,
required: true
},
size: [Number, String],
strokeWidth: [Number, String],
color: {
type: String,
default: 'base'
}
})
const semanticColors = {
base: 'var(--mivo-icon-base)',
muted: 'var(--mivo-icon-muted)',
primary: 'var(--mivo-icon-primary)',
info: 'var(--mivo-icon-info)',
success: 'var(--mivo-icon-success)',
warning: 'var(--mivo-icon-warning)',
danger: 'var(--mivo-icon-danger)'
}
const resolvedColor = computed(() => {
return semanticColors[props.color] || props.color
})
const iconComponent = computed(() => {
// Handle both PascalCase (Search) and kebab-case (search-icon)
const pascalName = props.name
.split('-')
.map(word => word.charAt(0).toUpperCase() + word.slice(1))
.join('')
return icons[pascalName] || icons[props.name]
})
</script>
<style scoped>
.lucide-icon {
display: inline-block;
vertical-align: middle;
}
</style>

View File

@@ -0,0 +1,13 @@
import DefaultTheme from 'vitepress/theme'
import Layout from './Layout.vue'
import Icon from './components/Icon.vue'
import 'flag-icons/css/flag-icons.min.css'
import './style.css'
export default {
extends: DefaultTheme,
Layout: Layout,
enhanceApp({ app }) {
app.component('Icon', Icon)
}
}

View File

@@ -0,0 +1,429 @@
/* Fonts Setup */
@font-face {
font-family: 'Geist';
src: url('/assets/fonts/Geist-Regular.woff2') format('woff2');
font-weight: 400;
font-style: normal;
}
@font-face {
font-family: 'Geist';
src: url('/assets/fonts/Geist-Bold.woff2') format('woff2');
font-weight: 700;
font-style: normal;
}
@font-face {
font-family: 'Geist Mono';
src: url('/assets/fonts/GeistMono-Regular.woff2') format('woff2');
font-weight: 400;
font-style: normal;
}
:root {
/* Fonts */
--vp-font-family-base: "Geist", sans-serif;
--vp-font-family-mono: "Geist Mono", monospace;
/* Colors Override to match MIVO */
--vp-c-bg: #ffffff;
--vp-c-bg-alt: #fafafa;
--vp-c-bg-elv: #ffffff;
--vp-c-text-1: #000000;
--vp-c-text-2: #666666;
--vp-c-brand-1: #000000;
--vp-c-brand-2: #333333;
--vp-c-brand-3: #666666;
/* Icon Colors - Light */
--mivo-icon-base: var(--vp-c-text-1);
--mivo-icon-muted: var(--vp-c-text-2);
--mivo-icon-primary: var(--vp-c-brand-1);
--mivo-icon-info: #3b82f6;
--mivo-icon-success: #22c55e;
--mivo-icon-warning: #eab308;
--mivo-icon-danger: #ef4444;
}
.dark {
--vp-c-bg: #000000;
--vp-c-bg-alt: #111111;
--vp-c-bg-elv: #111111;
--vp-c-text-1: #ffffff;
--vp-c-text-2: #888888;
--vp-c-brand-1: #ffffff;
--vp-c-brand-2: #eaeaea;
--vp-c-brand-3: #999999;
/* Icon Colors - Dark */
--mivo-icon-base: var(--vp-c-text-1);
--mivo-icon-muted: var(--vp-c-text-2);
--mivo-icon-primary: var(--vp-c-brand-1);
--mivo-icon-info: #60a5fa;
--mivo-icon-success: #4ade80;
--mivo-icon-warning: #facc15;
--mivo-icon-danger: #f87171;
}
/* Glassmorphism Overrides */
/* Navbar Glass */
.VPNav {
background-color: rgba(255, 255, 255, 0.6) !important;
backdrop-filter: blur(12px);
border-bottom: 1px solid rgba(0,0,0,0.05);
}
.dark .VPNav {
background-color: rgba(0, 0, 0, 0.6) !important;
border-bottom: 1px solid rgba(255,255,255,0.1);
}
/* Sidebar Glass */
.VPSidebar {
background-color: rgba(255, 255, 255, 0.3) !important;
backdrop-filter: blur(12px);
border-right: 1px solid rgba(0,0,0,0.05);
}
.dark .VPSidebar {
background-color: rgba(0, 0, 0, 0.3) !important;
border-right: 1px solid rgba(255,255,255,0.1);
}
/* Content Container - Transparent to show particles */
.VPContent {
background: transparent !important;
}
/* Footer Glass */
.VPFooter {
background-color: transparent !important;
border-top: 1px solid rgba(0,0,0,0.05);
}
.dark .VPFooter {
border-top: 1px solid rgba(255,255,255,0.1);
}
/* Local Search Box Glass */
.VPLocalSearchBox {
background-color: rgba(255, 255, 255, 0.8) !important;
backdrop-filter: blur(12px);
}
.dark .VPLocalSearchBox {
background-color: rgba(0, 0, 0, 0.8) !important;
}
/* Glassmorphism Cards (Feature Cards) */
.VPFeature {
background-color: rgba(255, 255, 255, 0.25) !important;
backdrop-filter: blur(40px);
border: 2px solid rgba(255, 255, 255, 0.2) !important;
border-radius: 1rem !important; /* rounded-2xl */
transition: all 0.3s ease;
}
.dark .VPFeature {
background-color: rgba(0, 0, 0, 0.4) !important;
border-color: rgba(255, 255, 255, 0.1) !important;
}
.VPFeature:hover {
border-color: rgba(255, 255, 255, 0.4) !important;
background-color: rgba(255, 255, 255, 0.4) !important;
transform: translateY(-4px);
box-shadow: 0 10px 30px -10px rgba(0,0,0,0.1);
}
.dark .VPFeature:hover {
border-color: rgba(255, 255, 255, 0.2) !important;
background-color: rgba(0, 0, 0, 0.6) !important;
}
/* Fix text colors inside cards if needed */
/* Global Button Styling (MIVO Style) */
.VPButton {
border-radius: 0.375rem !important; /* rounded-md */
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1) !important;
font-weight: 500 !important;
text-transform: none !important;
letter-spacing: normal !important;
}
.VPButton:hover {
transform: translateY(-2px);
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.1), 0 2px 4px -1px rgba(0, 0, 0, 0.06);
}
.VPButton:active {
transform: scale(0.95);
}
/* Primary Button (Brand) */
.VPButton.brand {
background-color: var(--vp-c-brand-1) !important;
border-color: var(--vp-c-brand-1) !important;
color: var(--vp-c-bg) !important;
}
.dark .VPButton.brand {
color: #000 !important; /* Ensure black text on white button in dark mode */
}
/* Secondary Button (Alt) */
.VPButton.alt {
background-color: transparent !important;
border: 1px solid var(--vp-c-brand-2) !important;
color: var(--vp-c-text-1) !important;
}
/* Mobile Navigation (Glass Overlay) */
.VPNavScreen {
background-color: rgba(255, 255, 255, 0.95) !important;
backdrop-filter: blur(20px);
position: fixed !important;
top: var(--vp-nav-height, 64px) !important;
bottom: 0 !important;
left: 0 !important;
right: 0 !important;
width: 100% !important;
height: calc(100vh - var(--vp-nav-height, 64px)) !important; /* Force Height */
z-index: 90 !important;
overflow-y: auto !important;
opacity: 1 !important; /* Always opacity 1 if visible */
pointer-events: auto !important;
/* Remove transition that might delay visibility */
transition: background-color 0.25s !important;
}
/* Rely on VitePress/Vue to toggle 'display' property */
/* We just ensure that IF it is displayed, it looks right */
.dark .VPNavScreen {
background-color: rgba(0, 0, 0, 0.95) !important;
}
/* Mobile Sidebar (Slide-out) */
@media (max-width: 960px) {
.VPSidebar {
background-color: rgba(255, 255, 255, 0.9) !important; /* Less transparent on mobile for readability */
backdrop-filter: blur(20px);
border-right: none !important;
box-shadow: 10px 0 30px rgba(0,0,0,0.1);
}
.dark .VPSidebar {
background-color: rgba(20, 20, 20, 0.9) !important;
}
}
/* Fix Hamburger Menu Icon Color & Interaction */
.VPNavBarHamburger {
cursor: pointer !important;
pointer-events: auto !important;
z-index: 100 !important;
}
.VPNavBarHamburger .container .top,
.VPNavBarHamburger .container .middle,
.VPNavBarHamburger .container .bottom {
background-color: var(--vp-c-text-1) !important;
}
/* Ensure Logo Text is Visible on Mobile */
/* High Contrast Sidebar & TOC */
/* High Contrast Sidebar & TOC */
.VPSidebarItem .text {
color: var(--vp-c-text-2) !important;
opacity: 1 !important;
font-weight: 400 !important;
}
/* Level 0 Parent Headers (Collapsible) */
.VPSidebarItem.level-0 > .item > .text,
.VPSidebarItem.level-0 > .item > .VPLink > .text {
color: var(--vp-c-text-1) !important;
font-weight: 700 !important; /* Bold for headers */
}
/* Level 1+ Sub-items explicitly regular */
.VPSidebarItem.level-1 .text,
.VPSidebarItem.level-2 .text {
font-weight: 400 !important;
}
/* Sidebar Lines (GitBook Style) */
.VPSidebarItem.level-0 > .items {
border-left: 1px solid rgba(0, 0, 0, 0.05); /* Light vertical line */
margin-left: 1.15rem;
padding-left: 0.5rem;
}
.dark .VPSidebarItem.level-0 > .items {
border-left: 1px solid rgba(255, 255, 255, 0.1);
}
/* Active Sidebar Item Differentiation */
.VPSidebarItem.is-active > .item {
border-left: 2px solid var(--vp-c-brand-1); /* Bold indicator line */
margin-left: calc(-0.5rem - 1px); /* Overlap the group line */
padding-left: calc(0.5rem - 1px);
}
.VPSidebarItem.is-active > .item > .text,
.VPSidebarItem.is-active > .item > .VPLink > .text {
color: var(--vp-c-brand-1) !important;
font-weight: 400 !important; /* Keep active sub-item thinner than collapsible header */
background-color: transparent !important; /* Clean style */
}
/* Navbar Active Underline */
.VPNavBarMenuLink.active {
color: var(--vp-c-brand-1) !important;
position: relative;
}
.VPNavBarMenuLink.active::after {
content: "";
position: absolute;
bottom: -4px;
left: 0;
width: 100%;
height: 2px;
background-color: var(--vp-c-brand-1);
}
.VPDocOutlineItem .text {
color: var(--vp-c-text-2) !important;
font-size: 0.85rem;
font-weight: 400 !important;
}
.VPDocOutlineItem.active .text {
color: var(--vp-c-brand-1) !important;
font-weight: 600 !important;
}
/* Dark Mode Specific Contrast Boost */
.dark .VPSidebarItem .text,
.dark .VPDocOutlineItem .text {
color: #b0b0b0 !important; /* Brighter than default gray */
}
.dark .VPSidebarItem.is-active > .item > .text,
.dark .VPSidebarItem.is-active > .item > .VPLink > .text,
.dark .VPDocOutlineItem.active .text,
.dark .VPSidebarItem.level-0 > .item > .text,
.dark .VPSidebarItem.level-0 > .item > .VPLink > .text {
color: #ffffff !important;
/* Font weights are already inherited or set above */
}
/* Fix Code Block Background to be Glassy too */
.vp-code-group .tabs {
background-color: rgba(255,255,255,0.5) !important;
}
.dark .vp-code-group .tabs {
background-color: rgba(0,0,0,0.5) !important;
}
/* Markdown Divider Contrast */
.vp-doc hr {
border: none;
border-top: 1px solid rgba(0, 0, 0, 0.15); /* Stronger in light mode */
margin: 3rem 0;
}
.dark .vp-doc hr {
border-top: 1px solid rgba(255, 255, 255, 0.2); /* Stronger in dark mode */
}
/* Pagination Cards */
.pager-link {
background-color: rgba(255, 255, 255, 0.4) !important;
backdrop-filter: blur(8px);
border: 1px solid rgba(0, 0, 0, 0.05) !important;
border-radius: 0.75rem !important; /* rounded-xl */
padding: 1.5rem !important;
transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1) !important;
box-shadow: 0 4px 6px -1px rgba(0, 0, 0, 0.05);
text-decoration: none !important;
display: flex !important;
flex-direction: column !important;
}
.dark .pager-link {
background-color: rgba(255, 255, 255, 0.03) !important;
border-color: rgba(255, 255, 255, 0.1) !important;
}
.pager-link:hover {
border-color: var(--vp-c-brand-1) !important;
transform: translateY(-4px);
box-shadow: 0 10px 15px -3px rgba(0, 0, 0, 0.1);
background-color: rgba(255, 255, 255, 0.6) !important;
}
.dark .pager-link:hover {
background-color: rgba(255, 255, 255, 0.08) !important;
}
.pager-link .desc {
color: var(--vp-c-text-2) !important;
font-size: 0.8rem !important;
font-weight: 500 !important;
margin-bottom: 4px !important;
display: block !important;
}
.pager-link .title {
color: var(--vp-c-brand-1) !important;
font-size: 1.1rem !important;
font-weight: 700 !important;
}
.pager-link.next {
text-align: right !important;
align-items: flex-end !important;
}
/* Language Switcher Flags Integration */
.VPNavBarTranslations .items .title::before,
.VPNavBarTranslations .items .VPMenuLink .VPLink.link span::before {
content: "";
display: inline-block;
width: 1.33333333em;
height: 1em;
margin-right: 0.6rem;
vertical-align: middle;
background-size: contain;
background-repeat: no-repeat;
background-position: center;
}
/* --- English Flag (US) --- */
/* 1. Target the link to English (Any link NOT starting with /id/) */
.VPNavBarTranslations a:not([href^="/id/"])::before,
.VPNavBarTranslations a:not([href^="/id/"]) span::before {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 480'%3E%3Cpath fill='%23bd3d44' d='M0 0h640v480H0z'/%3E%3Cpath stroke='%23fff' stroke-width='37' d='M0 74h640M0 148h640M0 222h640M0 296h640M0 370h640M0 444h640'/%3E%3Cpath fill='%23192f5d' d='M0 0h364v258.5H0z'/%3E%3Cg fill='%23fff'%3E%3Cg id='a'%3E%3Cg id='b'%3E%3Cpath id='c' d='M31 23l5 15.5-13.1-9.5H44l-13.1 9.5'/%3E%3Cuse href='%23c' x='62'/%3E%3Cuse href='%23c' x='124'/%3E%3Cuse href='%23c' x='186'/%3E%3Cuse href='%23c' x='248'/%3E%3C/g%3E%3Cuse href='%23b' x='31' y='21'/%3E%3C/g%3E%3Cuse href='%23a' y='42'/%3E%3Cuse href='%23a' y='84'/%3E%3Cuse href='%23a' y='126'/%3E%3Cuse href='%23a' y='168'/%3E%3C/g%3E%3C/svg%3E");
}
/* 2. Target the active English title (when on /) */
html[lang="en"] .VPNavBarTranslations .items .title::before {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 480'%3E%3Cpath fill='%23bd3d44' d='M0 0h640v480H0z'/%3E%3Cpath stroke='%23fff' stroke-width='37' d='M0 74h640M0 148h640M0 222h640M0 296h640M0 370h640M0 444h640'/%3E%3Cpath fill='%23192f5d' d='M0 0h364v258.5H0z'/%3E%3Cg fill='%23fff'%3E%3Cg id='a'%3E%3Cg id='b'%3E%3Cpath id='c' d='M31 23l5 15.5-13.1-9.5H44l-13.1 9.5'/%3E%3Cuse href='%23c' x='62'/%3E%3Cuse href='%23c' x='124'/%3E%3Cuse href='%23c' x='186'/%3E%3Cuse href='%23c' x='248'/%3E%3C/g%3E%3Cuse href='%23b' x='31' y='21'/%3E%3C/g%3E%3Cuse href='%23a' y='42'/%3E%3Cuse href='%23a' y='84'/%3E%3Cuse href='%23a' y='126'/%3E%3Cuse href='%23a' y='168'/%3E%3C/g%3E%3C/svg%3E");
}
/* --- Indonesia Flag (ID) --- */
/* 1. Target the link to Indonesia (Any link starting with /id/) */
.VPNavBarTranslations a[href^="/id/"]::before,
.VPNavBarTranslations a[href^="/id/"] span::before {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 480'%3E%3Cpath fill='%23e12127' d='M0 0h640v240H0z'/%3E%3Cpath fill='%23fff' d='M0 240h640v240H0z'/%3E%3C/svg%3E");
}
/* 2. Target the active Indonesia title (when on /id/) */
html[lang="id"] .VPNavBarTranslations .items .title::before {
background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 640 480'%3E%3Cpath fill='%23e12127' d='M0 0h640v240H0z'/%3E%3Cpath fill='%23fff' d='M0 240h640v240H0z'/%3E%3C/svg%3E");
}

View File

@@ -2,14 +2,14 @@
This guide covers installation on various platforms. MIVO is designed to be lightweight and runs on almost any PHP-capable server.
## 📋 General Requirements
## General Requirements
* **PHP**: 8.0 or higher
* **Extensions**: `sqlite3`, `openssl`, `mbstring`, `json`
* **Database**: SQLite (File based, no server needed)
---
## 🐋 Docker (Recommended)
## Docker (Recommended)
The easiest way to run MIVO.
1. **Build & Run**
@@ -30,7 +30,7 @@ The easiest way to run MIVO.
---
## 🪶 Apache / OpenLiteSpeed
## Apache / OpenLiteSpeed
1. **Document Root**: Set your web server's document root to the `public/` folder.
2. **Rewrite Rules**: Ensure `mod_rewrite` is enabled. MIVO includes a `.htaccess` file in `public/` that handles URL routing automatically.
3. **Permissions**: Ensure the web server user (e.g., `www-data`) has **write** access to:
@@ -40,7 +40,7 @@ The easiest way to run MIVO.
---
## 🟢 Nginx
## Nginx
Nginx does not read `.htaccess`. Use this configuration block in your `server` block:
```nginx
@@ -67,14 +67,14 @@ server {
---
## 🪟 IIS (Windows)
## IIS (Windows)
1. **Document Root**: Point the site to the `public/` folder.
2. **Web Config**: A `web.config` file has been provided in `public/` to handle URL Rewriting.
3. **Requirements**: Ensure **URL Rewrite Module 2.0** is installed on IIS.
---
## 📱 STB / Android (Awebserver / Termux)
## STB / Android (Awebserver / Termux)
### Awebserver
1. Copy the MIVO files to `/htdocs`.
@@ -95,7 +95,7 @@ server {
---
## 🌐 Shared Hosting (cPanel / DirectAdmin)
## Shared Hosting (cPanel / DirectAdmin)
Most shared hosting uses Apache or OpenLiteSpeed, which is fully compatible.
1. **Upload Files**: Upload the MIVO files to `public_html/mivo` (or a subdomain folder).
@@ -107,7 +107,7 @@ Most shared hosting uses Apache or OpenLiteSpeed, which is fully compatible.
---
## 🎛️ aaPanel (VPS)
## aaPanel (VPS)
1. **Create Website**: Add site -> PHP-8.x.
2. **Site Directory**:
* Set **Running Directory** (bukan Site Directory) to `/public`.
@@ -117,7 +117,7 @@ Most shared hosting uses Apache or OpenLiteSpeed, which is fully compatible.
---
## ☁️ PaaS Cloud (Railway / Render / Heroku)
## PaaS Cloud (Railway / Render / Heroku)
**WARNING**: MIVO uses SQLite (File Database). Most PaaS cloud have **Ephemeral Filesytem** (Reset on restart).
* **Requirement**: You MUST mount a **Persistent Volume/Disk**.
@@ -126,7 +126,7 @@ Most shared hosting uses Apache or OpenLiteSpeed, which is fully compatible.
---
## 📥 Post-Installation
## Post-Installation
After setting up the server:
1. Copy `.env.example` to `.env` (if not already done).
2. **Install Application**

View File

@@ -6,7 +6,7 @@ title: Docker Guide
This Docker image is built on **Alpine Linux** and **Nginx**, optimized for high performance and low resource usage.
## 🚀 Quick Start
## <Icon name="Zap" color="warning" /> Quick Start
Run MIVO in a single command:
@@ -26,7 +26,7 @@ Open your browser and navigate to `http://localhost:8080`.
**Initial Setup:**
If this is your first run, you will be redirected to the **Web Installer**. Follow the on-screen instructions to create the database and admin account.
## 🛠️ Docker Compose
## <Icon name="Wrench" color="primary" /> Docker Compose
For a more permanent setup, use `docker-compose.yml`:
@@ -45,13 +45,13 @@ services:
- ./mivo-data:/var/www/html/app/Database
```
## 📦 Tags
## <Icon name="Tags" color="info" /> Tags
- `latest`: Stable release (recommended).
- `edge`: Bleeding edge build from the `main` branch.
- `v1.x.x`: Specific released versions.
## 🔧 Environment Variables
## <Icon name="Sliders" color="success" /> Environment Variables
| Variable | Description | Default |
| :--- | :--- | :--- |
@@ -60,18 +60,19 @@ services:
| `APP_KEY` | 32-character random string (base64). Auto-generated on first install if not provided. | |
| `TZ` | Timezone for the container. | `UTC` |
## 📂 Volumes
## <Icon name="Folder" color="primary" /> Volumes
Persist your data by mounting these paths:
- `/var/www/html/app/Database`: Stores the SQLite database and session files. **(Critical)**
- `/var/www/html/public/assets/img/logos`: Stores uploaded custom logos.
## 🤝 Support the Project
## <Icon name="Heart" color="danger" /> Support the Project
If you find MIVO useful, please consider supporting its development. Your contribution helps keep the project alive!
[![SociaBuzz Tribe](https://img.shields.io/badge/SociaBuzz-Tribe-green?style=for-the-badge&logo=sociabuzz&logoColor=white)](https://sociabuzz.com/dyzulkdev/tribe)
---
*Created with ❤️ by DyzulkDev*
*Created with <Icon name="Heart" color="danger" /> by DyzulkDev*

23
docs/guide/index.md Normal file
View File

@@ -0,0 +1,23 @@
---
title: Introduction
---
# Introduction
Welcome to the MIVO Guide. This section will help you understand what MIVO is and how to get it running on your system.
## <Icon name="Zap" color="warning" /> What is MIVO?
MIVO is a modern, lightweight Mikrotik Voucher Management system. It's a complete rewrite of the legendary Mikhmon v3, re-engineered for better performance and a premium user experience.
## <Icon name="BookOpen" color="primary" /> Navigation
Explore the following sections to get started:
- **[Installation Guide](/guide/installation)**: Learn how to install MIVO on various platforms.
- **[Docker Guide](/guide/docker)**: The recommended way to run MIVO using containers.
- **[Manual](/manual/)**: Detailed instructions on how to use MIVO features.
## <Icon name="Heart" color="danger" /> Support
MIVO is an open-source project. If you find it useful, please consider supporting the development through [donations](https://sociabuzz.com/dyzulkdev/tribe) or [contributing](https://github.com/dyzulk/mivo) to the codebase.

View File

@@ -6,14 +6,14 @@ title: Installation Guide
This guide covers installation on various platforms. MIVO is designed to be lightweight and runs on almost any PHP-capable server.
## 📋 General Requirements
## <Icon name="ClipboardList" color="primary" /> General Requirements {#requirements}
* **PHP**: 8.0 or higher
* **Extensions**: `sqlite3`, `openssl`, `mbstring`, `json`
* **Database**: SQLite (File based, no server needed)
---
## 🐋 Docker (Recommended)
## <Icon name="Container" color="info" /> Docker (Recommended)
The easiest way to run MIVO.
1. **Build & Run**
@@ -34,7 +34,9 @@ The easiest way to run MIVO.
---
## 🪶 Apache / OpenLiteSpeed
## <Icon name="Server" color="success" /> Web Servers {#web-servers}
### Apache / OpenLiteSpeed
1. **Document Root**: Set your web server's document root to the `public/` folder.
2. **Rewrite Rules**: Ensure `mod_rewrite` is enabled. MIVO includes a `.htaccess` file in `public/` that handles URL routing automatically.
3. **Permissions**: Ensure the web server user (e.g., `www-data`) has **write** access to:
@@ -42,9 +44,7 @@ The easiest way to run MIVO.
* `app/Config/` (if using installer)
* `.env` file
---
## 🟢 Nginx
### Nginx
Nginx does not read `.htaccess`. Use this configuration block in your `server` block:
```nginx
@@ -69,16 +69,14 @@ server {
}
```
---
## 🪟 IIS (Windows)
### IIS (Windows)
1. **Document Root**: Point the site to the `public/` folder.
2. **Web Config**: A `web.config` file has been provided in `public/` to handle URL Rewriting.
3. **Requirements**: Ensure **URL Rewrite Module 2.0** is installed on IIS.
---
## 📱 STB / Android (Awebserver / Termux)
## <Icon name="Smartphone" color="warning" /> Mobile / STB {#mobile-stb}
### Awebserver
1. Copy the MIVO files to `/htdocs`.
@@ -96,10 +94,7 @@ server {
---
---
## 🌐 Shared Hosting (cPanel / DirectAdmin)
## <Icon name="Globe" color="info" /> Shared Hosting {#shared-hosting}
Most shared hosting uses Apache or OpenLiteSpeed, which is fully compatible.
1. **Upload Files**: Upload the MIVO files to `public_html/mivo` (or a subdomain folder).
@@ -111,7 +106,9 @@ Most shared hosting uses Apache or OpenLiteSpeed, which is fully compatible.
---
## 🎛️ aaPanel (VPS)
## <Icon name="Cloud" color="primary" /> VPS & Cloud {#vps-cloud}
### aaPanel
1. **Create Website**: Add site -> PHP-8.x.
2. **Site Directory**:
* Set **Running Directory** (bukan Site Directory) to `/public`.
@@ -119,10 +116,9 @@ Most shared hosting uses Apache or OpenLiteSpeed, which is fully compatible.
3. **URL Rewrite**: Select `thinkphp` or `laravel` template (compatible) OR just use the Nginx config provided above.
4. **Permissions**: Chown `www` user to the site directory.
---
## ☁️ PaaS Cloud (Railway / Render / Heroku)
**WARNING**: MIVO uses SQLite (File Database). Most PaaS cloud have **Ephemeral Filesytem** (Reset on restart).
### PaaS Cloud (Railway / Render / Heroku)
> [!WARNING]
> MIVO uses SQLite (File Database). Most PaaS cloud have **Ephemeral Filesytem** (Reset on restart).
* **Requirement**: You MUST mount a **Persistent Volume/Disk**.
* **Mount Path**: Mount your volume to `/var/www/html/app/Database` (or wherever you put MIVO).
@@ -130,7 +126,7 @@ Most shared hosting uses Apache or OpenLiteSpeed, which is fully compatible.
---
## 📥 Post-Installation
## <Icon name="Settings" color="success" /> Post-Installation {#post-installation}
After setting up the server:
1. Copy `.env.example` to `.env` (if not already done).
2. **Install Application**
@@ -138,3 +134,4 @@ After setting up the server:
Run `php mivo install` in your terminal.
* **Option B: Web Installer**
Open `http://your-domain.com/install` in your browser.

33
docs/icon-test.md Normal file
View File

@@ -0,0 +1,33 @@
# Icons Test Page
This page verifies that **Lucide Icons** and **Flag Icons** are correctly integrated.
## Lucide Icons
Using the global `<Icon />` component:
- <Icon name="Search" /> Search (Default)
- <Icon name="Settings" :size="32" stroke-width="3" color="danger" /> Settings (Semantic: danger)
- <Icon name="check-circle" color="success" /> Check Circle (Semantic: success)
- <Icon name="Github" color="primary" /> Github (Semantic: primary)
- <Icon name="Zap" color="warning" /> Zap (Semantic: warning)
- <Icon name="Info" color="info" /> Info (Semantic: info)
- <Icon name="HelpCircle" color="muted" /> Help (Semantic: muted)
## Flag Icons
Using standard `flag-icons` CSS classes:
- <span class="fi fi-id"></span> Indonesia
- <span class="fi fi-us"></span> United States
- <span class="fi fi-gb"></span> Great Britain
- <span class="fi fi-jp"></span> Japan
## Combined Usage
<div style="display: flex; gap: 10px; align-items: center; padding: 10px; background: rgba(0,0,0,0.05); border-radius: 8px;">
<Icon name="Globe" />
<span>Selected Language:</span>
<span class="fi fi-id"></span>
<strong>Bahasa Indonesia</strong>
</div>

77
docs/id/guide/docker.md Normal file
View File

@@ -0,0 +1,77 @@
---
title: Panduan Docker
---
# Panduan Docker
Image Docker ini dibangun di atas **Alpine Linux** dan **Nginx**, dioptimalkan untuk performa tinggi dan penggunaan sumber daya rendah.
## <Icon name="Zap" color="warning" /> Mulai Cepat
Jalankan MIVO dengan satu perintah:
```bash
docker run -d \
--name mivo \
-p 8080:80 \
-e APP_KEY=base64:YOUR_GENERATED_KEY \
-e APP_ENV=production \
-v mivo_data:/var/www/html/app/Database \
-v mivo_config:/var/www/html/.env \
dyzulk/mivo:latest
```
Buka browser Anda dan navigasi ke `http://localhost:8080`.
**Pengaturan Awal:**
Jika ini adalah pertama kali dijalankan, Anda akan diarahkan ke **Web Installer**. Ikuti instruksi di layar untuk membuat database dan akun admin.
## <Icon name="Wrench" color="primary" /> Docker Compose
Untuk pengaturan yang lebih permanen, gunakan `docker-compose.yml`:
```yaml
services:
mivo:
image: dyzulk/mivo:latest
container_name: mivo
restart: unless-stopped
ports:
- "8080:80"
environment:
- APP_ENV=production
- TZ=Asia/Jakarta
volumes:
- ./mivo-data:/var/www/html/app/Database
```
## <Icon name="Tags" color="info" /> Tags
- `latest`: Rilis stabil (direkomendasikan).
- `edge`: Build terbaru dari branch `main` (bleeding edge).
- `v1.x.x`: Versi rilis spesifik.
## <Icon name="Sliders" color="success" /> Variabel Lingkungan
| Variabel | Deskripsi | Default |
| :--- | :--- | :--- |
| `APP_ENV` | Lingkungan aplikasi (`production` atau `local`). | `production` |
| `APP_DEBUG` | Aktifkan mode debug (`true` atau `false`). | `false` |
| `APP_KEY` | String acak ca 32-karakter (base64). Dibuat otomatis saat install pertama kali jika kosong. | |
| `TZ` | Zona waktu untuk container. | `UTC` |
## <Icon name="Folder" color="primary" /> Volume
Persist data Anda dengan me-mount path ini:
- `/var/www/html/app/Database`: Menyimpan database SQLite dan file sesi. **(Penting)**
- `/var/www/html/public/assets/img/logos`: Menyimpan logo kustom yang diupload.
## <Icon name="Heart" color="danger" /> Dukung Proyek Ini
Jika Anda merasa MIVO bermanfaat, harap pertimbangkan untuk mendukung pengembangannya. Kontribusi Anda sangat berarti untuk kelangsungan proyek ini!
[![SociaBuzz Tribe](https://img.shields.io/badge/SociaBuzz-Tribe-green?style=for-the-badge&logo=sociabuzz&logoColor=white)](https://sociabuzz.com/dyzulkdev/tribe)
---
*Dibuat dengan <Icon name="Heart" color="danger" /> oleh DyzulkDev*

23
docs/id/guide/index.md Normal file
View File

@@ -0,0 +1,23 @@
---
title: Pengenalan
---
# Pengenalan
Selamat datang di Panduan MIVO. Bagian ini akan membantu Anda memahami apa itu MIVO dan bagaimana cara menjalankannya di sistem Anda.
## <Icon name="Zap" color="warning" /> Apa itu MIVO?
MIVO adalah sistem Manajemen Voucher Mikrotik yang modern dan ringan. MIVO merupakan penulisan ulang total dari Mikhmon v3 yang legendaris, dirancang ulang untuk performa yang lebih baik dan pengalaman pengguna yang premium.
## <Icon name="BookOpen" color="primary" /> Navigasi
Jelajahi bagian berikut untuk memulai:
- **[Panduan Instalasi](/id/guide/installation)**: Pelajari cara menginstal MIVO di berbagai platform.
- **[Panduan Docker](/id/guide/docker)**: Cara yang direkomendasikan untuk menjalankan MIVO menggunakan container.
- **[Buku Manual](/id/manual/)**: Instruksi detail tentang cara menggunakan fitur-fitur MIVO.
## <Icon name="Heart" color="danger" /> Dukungan
MIVO adalah proyek open-source. Jika Anda merasa MIVO bermanfaat, harap pertimbangkan untuk mendukung pengembangannya melalui [donasi](https://sociabuzz.com/dyzulkdev/tribe) atau [berkontribusi](https://github.com/dyzulk/mivo) langsung ke kode program.

View File

@@ -0,0 +1,121 @@
---
title: Panduan Instalasi
---
# Panduan Instalasi
Panduan ini mencakup instalasi di berbagai platform. MIVO dirancang agar ringan dan berjalan di hampir semua server yang mendukung PHP.
## <Icon name="ClipboardList" color="primary" /> Persyaratan Umum {#persyaratan}
* **PHP**: 8.0 atau lebih tinggi
* **Ekstensi**: `sqlite3`, `openssl`, `mbstring`, `json`
* **Database**: SQLite (Berbasis file, tidak perlu server database)
---
## <Icon name="Container" color="info" /> Docker (Direkomendasikan) {#docker}
Cara termudah untuk menjalankan MIVO.
1. **Build & Run**
```bash
docker-compose up -d --build
```
Buka `http://localhost:8080`
2. **Manual Pull (Alternatif)**
Jika Anda lebih suka menarik image secara manual:
```bash
docker pull dyzulk/mivo:latest # Stable
docker pull dyzulk/mivo:v1.0.0 # Versi Spesifik
docker pull dyzulk/mivo:edge # Bleeding Edge
```
*Catatan: Database disimpan secara permanen di `app/Database` melalui volume.*
---
## <Icon name="Server" color="success" /> Web Server {#web-server}
### Nginx
Nginx tidak membaca `.htaccess`. Gunakan blok konfigurasi ini di blok `server` Anda:
```nginx
server {
listen 80;
server_name domain-anda.com;
root /path/to/mivo/public;
index index.php;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
include snippets/fastcgi-php.conf;
fastcgi_pass unix:/run/php/php8.2-fpm.sock; # Sesuaikan versi
}
location ~ /\.ht {
deny all;
}
}
```
---
## <Icon name="Smartphone" color="warning" /> Mobile / STB {#mobile-stb}
### Awebserver
1. Salin file MIVO ke folder `/htdocs`.
2. Arahkan document root ke `public` jika didukung, atau akses via `http://localhost:8080/public`.
3. Pastikan versi PHP kompatibel.
### Termux
1. Install PHP: `pkg install php`
2. Masuk ke direktori MIVO: `cd mivo`
3. Gunakan built-in server:
```bash
php mivo serve --host=0.0.0.0 --port=8080
```
4. Akses melalui browser.
---
## <Icon name="Globe" color="info" /> Shared Hosting {#shared-hosting}
Kebanyakan shared hosting menggunakan Apache atau OpenLiteSpeed, yang didukung penuh.
1. **Upload File**: Upload file MIVO ke `public_html/mivo` (atau folder subdomain).
2. **Arahkan Domain**:
* **Direkomendasikan**: Pergi ke "Domains" atau "Subdomains" di cPanel dan set **Document Root** agar menunjuk langsung ke folder `public/` (contoh: `public_html/mivo/public`).
* **Alternatif**: Jika tidak bisa mengubah Document Root, Anda bisa memindahkan isi `public/` ke root `public_html` dan memindahkan `app/`, `routes/`, dll satu level ke atas (tidak disarankan untuk keamanan).
3. **Versi PHP**: Pilih PHP 8.0+ di menu "Select PHP Version".
4. **Ekstensi**: Pastikan `sqlite3` dan `fileinfo` dicentang.
---
## <Icon name="Cloud" color="primary" /> VPS & Cloud {#vps-cloud}
### aaPanel
1. **Buat Website**: Tambah situs -> PHP-8.x.
2. **Direktori Situs**:
* Set **Running Directory** ke `/public`.
* Hapus centang "Anti-XSS" (terkadang memblokir penyimpanan konfigurasi).
3. **URL Rewrite**: Pilih template `thinkphp` atau `laravel` yang kompatibel.
4. **Izin File**: Chown user `www` ke direktori situs.
### PaaS Cloud (Railway / Render / Heroku)
> [!WARNING]
> MIVO menggunakan SQLite. Kebanyakan PaaS Cloud menggunakan **Ephemeral Filesytem** (Data hilang saat restart).
> Anda WAJIB menggunakan **Persistent Volume/Disk**.
---
## <Icon name="Settings" color="success" /> Pasca-Instalasi {#pasca-instalasi}
Setelah menyiapkan server:
1. Salin `.env.example` ke `.env` (jika belum dilakukan).
2. **Install Aplikasi**
* **Opsi A: CLI**
Jalankan `php mivo install` di terminal Anda.
* **Opsi B: Web Installer**
Buka `http://domain-anda.com/install` di browser.

40
docs/id/index.md Normal file
View File

@@ -0,0 +1,40 @@
---
layout: home
hero:
name: "MIVO"
text: "Manajemen Voucher Mikrotik"
tagline: Modern, Ringan, dan Efisien. Dibuat untuk perangkat spesifikasi rendah dengan UX premium.
image:
light: /logo-m.svg
dark: /logo-m-dark.svg
alt: Logo MIVO
actions:
- theme: brand
text: Mulai Sekarang
link: /id/guide/installation
- theme: alt
text: Docker Image
link: /id/guide/docker
features:
- title: Core Ringan
details: Dibangun di atas framework MVC minimal (~50KB core) yang dioptimalkan untuk STB/Android.
- title: UI/UX Modern
details: Desain Glassmorphism segar menggunakan TailwindCSS dan Alpine.js.
- title: Docker Ready
details: Image resmi berbasis Alpine (~50MB) dengan Nginx dan Supervisor.
- title: Aman
details: Konfigurasi berbasis environment (.env), kredensial terenkripsi, dan sesi aman.
---
## Mengapa MIVO?
MIVO adalah penulisan ulang total dari **Mikhmon v3** yang legendaris, direkayasa ulang untuk memecahkan masalah performa umum pada perangkat keras spesifikasi rendah.
### Sorotan Utama
- <Icon name="Zap" color="warning" /> **Sangat Cepat**: Tanpa framework berat seperti Laravel. Murni performa PHP 8.0+.
- <Icon name="Smartphone" color="info" /> **Mobile First**: Desain responsif sepenuhnya yang terasa seperti aplikasi native.
- <Icon name="Plug" color="success" /> **API First**: REST API bawaan dengan dukungan CORS untuk integrasi pihak ketiga.
- <Icon name="Wrench" color="primary" /> **Ramah Developer**: Arsitektur bersih, CLI tools (`php mivo`), dan mudah dikembangkan.

29
docs/id/manual/index.md Normal file
View File

@@ -0,0 +1,29 @@
---
title: Buku Panduan
---
# Buku Panduan
Selamat datang di **Buku Panduan MIVO**. Bagian ini mencakup aspek fungsional penggunaan aplikasi untuk mengelola jaringan Anda.
## <Icon name="BookOpen" color="primary" /> Topik
### <Icon name="Settings" color="info" /> [Pengaturan Global](/id/manual/settings/)
Konfigurasikan pengaturan tingkat sistem:
- **Manajemen Router**: Hubungkan dan kelola perangkat Mikrotik Anda.
- **Template Voucher**: Desain dan sesuaikan tata letak voucher Anda.
- **Logo Brand**: Unggah logo khusus untuk hotspot Anda.
- **API & CORS**: Ekspos data router Anda dengan aman ke aplikasi pihak ketiga.
### <Icon name="Activity" color="success" /> [Operasional Router](/id/manual/router/)
Kelola tugas harian router Anda setelah terhubung:
- **Dashboard**: Pantau traffic real-time dan kesehatan sistem.
- **Manajemen Hotspot**: Buat user, profil, dan generate voucher.
- **Laporan**: Lacak penjualan Anda dan lihat log sistem.
- **Tools Sistem**: Reboot, scheduler, dan manajemen DHCP.
---
> [!TIP]
> Panduan ini fokus pada **penggunaan** aplikasi. Untuk instalasi dan konfigurasi server, silakan merujuk ke [Panduan](/id/guide/installation).

View File

@@ -0,0 +1,28 @@
# Dashboard & Pemantauan
Dashboard berfungsi sebagai pusat kendali real-time untuk router Mikrotik Anda. Fitur ini mengumpulkan data penting dari API Mikrotik untuk memberikan gambaran instan tentang kesehatan jaringan Anda.
## <Icon name="LineChart" color="primary" /> Monitor Traffic Real-time
MIVO dilengkapi dengan monitor trafik langsung yang berkomunikasi langsung dengan interface Mikrotik Anda.
- **Pemilihan Interface**: Pilih interface fisik atau virtual apa pun (contoh: `ether1`, `wlan1`, `bridge-hotspot`).
- **Grafik Langsung**: Lihat trafik masuk dan keluar dalam satuan bits/sec atau bytes/sec.
- **Pelacakan Puncak**: Identifikasi lonjakan bandwidth dengan cepat.
## <Icon name="Cpu" color="warning" /> Sumber Daya Router
Pantau kesehatan fisik perangkat keras Mikrotik Anda:
- **Beban CPU**: Ditampilkan dalam persentase. Beban CPU yang tinggi mungkin menunjukkan perlunya pemutakhiran perangkat keras atau optimasi konfigurasi.
- **Memori**: Melacak RAM yang bebas vs total RAM.
- **Uptime**: Menunjukkan berapa lama router telah berjalan sejak reboot terakhir.
- **Penyimpanan**: Pantau ruang yang tersedia pada memori flash router Anda.
## <Icon name="Smartphone" color="success" /> Sesi Aktif
Ringkasan cepat pengguna yang saat ini terautentikasi:
- **Total Online**: Hitungan real-time pengguna yang sedang menggunakan hotspot.
- **IP/MAC Aktif**: Pantau perangkat yang terhubung secara garis besar.
> [!TIP]
> Biarkan Dashboard tetap terbuka selama jam sibuk untuk memantau kepadatan atau upaya akses yang tidak sah.

View File

@@ -0,0 +1,40 @@
# Manajemen Hotspot
Alat komprehensif untuk mengelola server Hotspot Mikrotik Anda, mulai dari pembuatan user hingga kontrol akses tingkat lanjut.
## <Icon name="Users" color="primary" /> User Hotspot {#users}
Halaman User (`/hotspot/users`) adalah database pusat untuk semua akun wifi Anda.
- **Pembuatan Manual**: Tambah user tunggal dengan username dan password spesifik.
- **Cetak Satuan**: Arahkan kursor ke user untuk melihat ikon cetak. Ini menggunakan template default yang ditetapkan pada profil mereka.
- **Cetak Massal**: Pilih beberapa user dan gunakan menu **Batch Actions** untuk mencetak semuanya sekaligus dalam satu halaman.
- **Monitor Status**: Lihat apakah user sedang login (Aktif) secara langsung di dalam daftar.
## <Icon name="Layers" color="info" /> Profil User {#profiles}
Profil User (`/hotspot/profiles`) menentukan aturan untuk setiap jenis voucher (contoh: 1 Jam, 1 Hari).
- **Rate Limit**: Kontrol kecepatan unggah dan unduh (contoh: `512k/1M`).
- **Shared Users**: Batasi berapa banyak perangkat yang dapat menggunakan akun yang sama secara bersamaan.
- **Validity**: Atur berapa lama akun tetap aktif setelah login pertama.
- **Harga**: Simpan harga jual untuk keperluan laporan.
## <Icon name="Ticket" color="success" /> Generator Voucher {#generate}
Generate ratusan voucher dalam hitungan detik (`/hotspot/generate`).
1. **Jumlah**: Pilih berapa banyak voucher yang akan dibuat.
2. **Server**: Pilih server hotspot mana yang dituju (biasanya `all`).
3. **User Mode**: Pilih antara `Username & Password` atau `Username = Password`.
4. **Prefix**: Tambahkan awalan (prefix) tetap pada setiap username yang dibuat.
## <Icon name="Zap" color="warning" /> Sesi Aktif & Cookies {#active}
Pantau dan kontrol koneksi saat ini (`/hotspot/active` dan `/hotspot/cookies`).
- **Kick User**: Putuskan sesi user yang sedang aktif secara paksa.
- **Cookies**: Kelola token 'remember me'. Menghapus cookie memaksa user untuk login kembali pada koneksi berikutnya.
## <Icon name="ShieldCheck" color="danger" /> Keamanan & Akses {#security}
Pengaturan lanjutan untuk akses jaringan tanpa persyaratan voucher biasa.
- **IP Bindings**: Lewati login hotspot untuk alamat MAC atau IP tertentu (contoh: untuk printer kantor atau server).
- **Walled Garden**: Izinkan akses ke situs web atau domain tertentu (contoh: portal bank Anda) bahkan sebelum user login.

View File

@@ -0,0 +1,16 @@
# Operasional Router
Operasional router adalah tugas-tugas spesifik dalam sesi setelah terhubung ke perangkat Mikrotik. Pengaturan ini bervariasi tergantung pada sesi router mana yang sedang Anda gunakan.
## <Icon name="Activity" color="primary" /> Ikhtisar
Setelah Anda memilih sesi dari sidebar, Anda mendapatkan akses ke alat-alat berikut:
- **[Dashboard](/id/manual/router/dashboard)**: Pemantauan traffic secara real-time.
- **[Manajemen Hotspot](/id/manual/router/hotspot)**: User, Profil, dan Voucher.
- **[Laporan](/id/manual/router/reports)**: Laporan penjualan dan log sistem.
- **[Tools Sistem](/id/manual/router/tools)**: Reboot, Scheduler, dan DHCP.
## <Icon name="Zap" color="warning" /> Sinkronisasi Real-time
MIVO berkomunikasi langsung dengan API Mikrotik Anda. Sebagian besar perubahan akan langsung diterapkan pada perangkat Anda.

View File

@@ -0,0 +1,27 @@
# Cetak Cepat (Quick Print)
Quick Print adalah modul khusus untuk penjualan voucher kecepatan tinggi. Fitur ini memungkinkan Anda untuk menampilkan paket tertentu yang ingin dijual dan mencetaknya dengan satu klik.
## <Icon name="BarChart2" color="primary" /> Dashboard Penjualan
Halaman utama (`/quick-print`) menampilkan "Paket" Anda dalam bentuk kartu besar yang dapat diklik.
- **Generate Instan**: Mengklik paket akan langsung memerintahkan router untuk membuat user baru.
- **Cetak Otomatis**: Setelah user dibuat, dialog cetak untuk voucher tersebut akan terbuka secara otomatis.
## <Icon name="Library" color="info" /> Manajemen Paket
Akses bagian **Kelola** (`/quick-print/manage`) untuk mempersonalisasi dashboard penjualan Anda.
### <Icon name="PlusCircle" color="success" /> Menambah Paket
- **Profil**: Pilih profil user Mikrotik.
- **Harga**: Tentukan harga tampilan (bisa berbeda dengan komentar di Mikrotik).
- **Template**: Tetapkan template voucher khusus untuk paket ini.
### <Icon name="Trash2" color="danger" /> Menghapus Paket
Menghapus paket di sini hanya menghapusnya dari dashboard Quick Print; **tidak** menghapus profil dari router Mikrotik Anda.
## <Icon name="Printer" color="warning" /> Alur Kerja
1. **Admin** memilih paket dari dashboard.
2. **MIVO** membuat akun username/password acak di Mikrotik.
3. **MIVO** mengambil template yang ditentukan dan mengirimkannya ke engine cetak browser.

View File

@@ -0,0 +1,28 @@
# Laporan & Log
Analisis performa bisnis Anda dan pantau aktivitas sistem melalui alat pelaporan yang mendetail.
## <Icon name="BarChart" color="success" /> Laporan Penjualan {#selling}
Halaman Laporan Penjualan (`/reports/selling`) memberikan rincian pendapatan Anda secara mendetail.
- **Garis Waktu**: Lihat penjualan berdasarkan hari, bulan, atau rentang tanggal khusus.
- **Detail**: Lihat profil mana yang terjual, stempel waktu (timestamp), dan harganya.
- **Ekspor**: (Jika tersedia) Ekspor data Anda untuk keperluan akuntansi offline.
## <Icon name="BarChart2" color="primary" /> Resume Penjualan {#resume}
Halaman Resume (`/reports/resume`) menawarkan pandangan tingkat tinggi yang disederhanakan tentang pertumbuhan bisnis Anda.
- **Total Pendapatan**: Gabungan pendapatan dari seluruh penjualan voucher.
- **Jumlah Voucher**: Total voucher yang terjual vs yang dibuat (generated).
- **Perbandingan Sesi**: Bandingkan performa di berbagai sesi router yang berbeda.
## <Icon name="ClipboardList" color="info" /> Log Sistem {#logs}
Pantau peristiwa real-time dari router Mikrotik Anda (`/reports/user-log`).
- **Peristiwa**: Lacak login user, logout, eksekusi script, dan error sistem.
- **Pemecahan Masalah**: Gunakan log ini untuk mengidentifikasi mengapa user tidak dapat terhubung atau kapan sesi terputus.
- **Live Stream**: Log diperbarui secara otomatis saat peristiwa terjadi di router.
> [!NOTE]
> MIVO mengambil log ini langsung dari circular buffer Mikrotik. Bersihkan log Anda pada terminal Mikrotik jika buffer menjadi terlalu besar.

View File

@@ -0,0 +1,26 @@
# Tools Sistem
Utilitas penting untuk memelihara, menjadwalkan, dan memantau fungsi inti router Mikrotik Anda.
## <Icon name="Network" color="info" /> DHCP Leases
Halaman DHCP Leases (`/network/dhcp`) memungkinkan Anda memantau semua perangkat yang terhubung ke jaringan LAN atau Hotspot Anda, bahkan sebelum mereka login.
- **Pelacakan Lease**: Lihat penetapan IP, alamat MAC, dan hostname dari perangkat yang terhubung.
- **Monitor Pra-Login**: Berguna untuk mengidentifikasi perangkat yang terhubung tetapi kesulitan mencapai halaman login hotspot.
## <Icon name="Clock" color="primary" /> Scheduler Router
MIVO menyediakan antarmuka lengkap (`/system/scheduler`) untuk mengelola script dan jadwal internal Mikrotik.
- **Daftar Tugas**: Lihat semua tugas terjadwal yang aktif dan dinonaktifkan di router Anda.
- **Kelola Tugas**: Tambah, ubah, atau hapus tugas langsung dari MIVO.
- **Otomatisasi**: Gunakan ini untuk eksekusi script berkala, seperti menghapus user yang kedaluwarsa atau menghasilkan laporan otomatis.
## <Icon name="Zap" color="warning" /> Tindakan Kritis
Picukan perintah tingkat sistem secara langsung dari antarmuka MIVO:
- **<Icon name="RefreshCw" color="info" /> Reboot**: Muat ulang perangkat keras Mikrotik Anda dengan aman.
- **<Icon name="Power" color="danger" /> Shutdown**: Matikan perangkat. Perhatikan bahwa Anda memerlukan akses fisik ke router untuk menghidupkannya kembali.
> [!WARNING]
> Tindakan ini segera dieksekusi pada router Mikrotik Anda. Pastikan tidak ada operasi kritis yang sedang berjalan sebelum melakukan reboot.

View File

@@ -0,0 +1,15 @@
# API & CORS
MIVO memungkinkan aplikasi eksternal untuk mengakses data router Anda secara aman melalui REST API.
## <Icon name="Unlock" color="warning" /> Kebijakan CORS
Untuk memungkinkan situs web Anda (misal: pengecek status) memanggil API MIVO, Anda harus memasukkan domain tersebut ke daftar putih (whitelist).
1. Buka **Pengaturan** > **API & CORS**.
2. Tambahkan URL situs web Anda (termasuk `https://`).
3. Simpan perubahan.
## <Icon name="Terminal" color="info" /> Dokumentasi
Dokumentasi API mendetail tersedia di bagian pengembang.

View File

@@ -0,0 +1,16 @@
# Pengaturan Global
Pengaturan global mengontrol instance MIVO Anda secara sistem lunak. Ini adalah konfigurasi tingkat sistem yang tidak bergantung pada koneksi Mikrotik tertentu.
## <Icon name="Settings" color="primary" /> Ikhtisar
Akses pengaturan ini dari menu kanan atas atau sidebar utama.
- **[Router](/id/manual/settings/routers)**: Kelola koneksi Mikrotik Anda.
- **[Template](/id/manual/settings/templates)**: Kustomisasi desain voucher.
- **[Logo](/id/manual/settings/logos)**: Unggah logo brand.
- **[API & CORS](/id/manual/settings/api-cors)**: Konfigurasi akses API.
## <Icon name="Shield" color="info" /> Administrasi
Anda juga dapat mengelola administrator MIVO dan perilaku sistem umum (Zona Waktu, Bahasa) di sini.

View File

@@ -0,0 +1,29 @@
# Logo Brand
Manajemen Logo memungkinkan Anda untuk mengelola galeri aset brand yang digunakan untuk kustomisasi voucher Hotspot Mikrotik dan antarmuka aplikasi.
## <Icon name="Image" color="primary" /> Tujuan
Dengan mengunggah logo bisnis Anda di sini, Anda dapat menciptakan pengalaman brand yang profesional bagi pelanggan Anda. Logo-logo ini disimpan terpusat dan dapat dipanggil secara dinamis di berbagai bagian MIVO.
## <Icon name="UploadCloud" color="success" /> Proses Mengunggah
1. Buka **Pengaturan** > **Logo**.
2. **Drag & Drop** atau klik area unggah untuk memilih file Anda.
3. **Format yang Didukung**: PNG, JPG, SVG, dan GIF didukung. Disarankan menggunakan PNG transparan atau SVG untuk tampilan terbaik di voucher.
## <Icon name="Hash" color="info" /> Logo ID & Fitur Copy
Setiap logo yang Anda unggah akan diberikan **Short ID** yang unik (contoh: `lg01`, `logo_wifi`).
### <Icon name="Copy" color="primary" /> Cara Menggunakan Copy ID
Di galeri logo, arahkan kursor ke logo apapun untuk memunculkan tombol **Copy ID**.
- **Fungsi**: Mengklik tombol ini akan menyalin ID unik tersebut ke clipboard Anda.
- **Integrasi**: Gunakan ID ini di dalam **Voucher Template Editor** (contoh: `&#123;&#123;logo:lg01&#125;&#125;`) untuk menampilkan logo spesifik tersebut pada voucher yang dicetak.
## <Icon name="Trash2" color="danger" /> Manajemen
Anda dapat menghapus logo yang tidak digunakan kapan saja.
> [!WARNING]
> Menghapus logo akan menyebabkan template voucher yang mereferensikan ID-nya menampilkan gambar yang rusak (placeholder).

View File

@@ -0,0 +1,28 @@
# Manajemen Router
Untuk mulai mengelola Mikrotik Anda, pertama-tama Anda perlu menghubungkannya ke MIVO.
## <Icon name="PlusCircle" color="success" /> Menghubungkan Router
1. Buka **Pengaturan** > **Router**.
2. Klik **Tambah Router**.
3. Isi detailnya:
- **Nama Sesi**: Identitas unik untuk koneksi ini.
- **Alamat IP**: IP Mikrotik atau nama DNS Anda.
- **Username/Password**: Akun API Mikrotik Anda.
- **Port**: Biasanya 8728 (API).
## <Icon name="Activity" color="info" /> Status Koneksi
MIVO akan mencoba terhubung ke router secara real-time. Jika status berwarna hijau, Anda siap memulai pengelolaan!
## <Icon name="Database" color="warning" /> Backup & Restore
Lindungi konfigurasi Anda dengan membuat cadangan (backup) database MIVO Anda.
- **Backup**: Membuat file JSON yang berisi semua sesi router dan pengaturan global.
- **Restore**: Unggah file cadangan MIVO yang telah disimpan sebelumnya untuk memulihkan data Anda.
> [!CAUTION]
> Melakukan restore akan menimpa pengaturan dan sesi Anda yang ada saat ini.

View File

@@ -0,0 +1,20 @@
# Pengaturan Sistem
Kelola akun administrator MIVO Anda dan perilaku aplikasi secara global.
## <Icon name="UserCheck" color="primary" /> Akun Admin
Ubah kredensial administrator MIVO Anda untuk menjaga keamanan sistem.
- **Username**: Nama yang digunakan untuk login.
- **Password**: Kata sandi aman untuk akses.
## <Icon name="Globe" color="info" /> Konfigurasi Global
Sesuaikan pengaturan lingkungan untuk seluruh aplikasi:
- **Bahasa**: Pilih bahasa antarmuka pilihan Anda (Inggris/Indonesia).
- **Zona Waktu**: Atur waktu lokal untuk laporan dan log yang akurat.
- **Mata Uang**: Tentukan simbol mata uang yang digunakan dalam voucher dan laporan.
## <Icon name="ShieldAlert" color="warning" /> Keamanan
MIVO menggunakan autentikasi berbasis sesi. Pastikan Anda melakukan logout saat menggunakan terminal publik.

View File

@@ -0,0 +1,14 @@
# Template Voucher
MIVO memiliki engine template yang mumpuni untuk membuat voucher yang cantik dan siap cetak.
## <Icon name="FileCode" color="primary" /> Kustomisasi Template
Template menggunakan HTML dan placeholder khusus untuk menampilkan data voucher.
- **Variabel**: `{{username}}`, `{{password}}`, `{{price}}`, dll.
- **Preview**: Uji template Anda secara instan dari editor.
## <Icon name="Printer" color="info" /> Cetak Cepat
Setelah template disimpan, template tersebut akan tersedia di menu **Cetak Cepat** (Quick Print) di dalam sesi router Anda.

View File

@@ -6,7 +6,8 @@ hero:
text: "Mikrotik Voucher Management"
tagline: Modern, Lightweight, and Efficient. Built for low-end devices with premium UX.
image:
src: /logo.png
light: /logo-m.svg
dark: /logo-m-dark.svg
alt: MIVO Logo
actions:
- theme: brand
@@ -33,7 +34,7 @@ MIVO is a complete rewrite of the legendary **Mikhmon v3**, re-engineered to sol
### Key Highlights
- **Blazing Fast**: No heavy frameworks like Laravel. Pure PHP 8.0+ performance.
- **📱 Mobile First**: Fully responsive design that feels like a native app.
- **🔌 API First**: Built-in REST API with CORS support for 3rd party integrations.
- **🛠️ Developer Friendly**: Clean architecture, CLI tools (`php mivo`), and easy extension.
- <Icon name="Zap" color="warning" /> **Blazing Fast**: No heavy frameworks like Laravel. Pure PHP 8.0+ performance.
- <Icon name="Smartphone" color="info" /> **Mobile First**: Fully responsive design that feels like a native app.
- <Icon name="Plug" color="success" /> **API First**: Built-in REST API with CORS support for 3rd party integrations.
- <Icon name="Wrench" color="primary" /> **Developer Friendly**: Clean architecture, CLI tools (`php mivo`), and easy extension.

29
docs/manual/index.md Normal file
View File

@@ -0,0 +1,29 @@
---
title: User Manual
---
# User Manual
Welcome to the **MIVO User Manual**. This section covers the functional aspects of using the application to manage your network.
## <Icon name="BookOpen" color="primary" /> Topics
### <Icon name="Settings" color="info" /> [Global Settings](/manual/settings/)
Configure your system-wide settings:
- **Managing Routers**: Connect and manage your Mikrotik devices.
- **Voucher Templates**: Design and customize your voucher layouts.
- **Brand Logos**: Upload custom logos for your hotspot.
- **API & CORS**: Securely expose your router data to 3rd party apps.
### <Icon name="Activity" color="success" /> [Router Operations](/manual/router/)
Manage your everyday router tasks after connecting:
- **Dashboard**: Monitor real-time traffic and system health.
- **Hotspot Management**: Create users, profiles, and generate vouchers.
- **Reports**: Track your sales and view system logs.
- **System Tools**: Reboot, scheduler, and DHCP management.
---
> [!TIP]
> This manual focuses on **using** the application. For installation and server configuration, please refer to the [Guide](/guide/installation).

View File

@@ -0,0 +1,28 @@
# Dashboard & Monitoring
The Dashboard provides a real-time command center for your Mikrotik router. It aggregates critical data from the Mikrotik API to give you an immediate overview of your network's health.
## <Icon name="LineChart" color="primary" /> Real-time Traffic Monitor
MIVO features a live traffic monitor that communicates directly with your Mikrotik interfaces.
- **Interface Selection**: Choose any physical or virtual interface (e.g., `ether1`, `wlan1`, `bridge-hotspot`).
- **Live Graphing**: View incoming and outgoing traffic in bits/sec or bytes/sec.
- **Peak Tracking**: Quickly identify bandwidth spikes.
## <Icon name="Cpu" color="warning" /> Router Resources
Monitor the physical health of your Mikrotik hardware:
- **CPU Load**: Displayed as a percentage. High CPU load may indicate the need for hardware upgrades or configuration optimization.
- **Memory**: Tracks free vs. total RAM.
- **Uptime**: Shows how long the router has been running since the last reboot.
- **Disk/Storage**: Monitor available space on your router's flash memory.
## <Icon name="Smartphone" color="success" /> Active Sessions
A quick summary of currently authenticated users:
- **Total Online**: Real-time count of users currently using the hotspot.
- **Active IP/MAC**: Monitor connected devices on a high level.
> [!TIP]
> Keep the Dashboard open during peak hours to monitor for congestion or unauthorized access attempts.

View File

@@ -0,0 +1,40 @@
# Hotspot Management
Comprehensive tools to manage your Mikrotik Hotspot server, from user creation to advanced access control.
## <Icon name="Users" color="primary" /> Hotspot Users {#users}
The Users page (`/hotspot/users`) is the central database for all your wifi accounts.
- **Manual Creation**: Add individual users with specific usernames and passwords.
- **Individual Printing**: Hover over a user to see the print icon. It uses the default template assigned to their profile.
- **Batch Printing**: Select multiple users and use the **Batch Actions** menu to print them all at once on a single page.
- **Status Monitor**: See if a user is currently logged in (Active) directly in the list.
## <Icon name="Layers" color="info" /> User Profiles {#profiles}
User Profiles (`/hotspot/profiles`) define the rules for each type of voucher (e.g., 1 Hour, 1 Day).
- **Rate Limit**: Control upload and download speeds (e.g., `512k/1M`).
- **Shared Users**: Limit how many devices can use the same account simultaneously.
- **Validity**: Set how long the account remains active after the first login.
- **Price**: Store the selling price for reporting purposes.
## <Icon name="Ticket" color="success" /> Voucher Generator {#generate}
Generate hundreds of vouchers in seconds (`/hotspot/generate`).
1. **Quantity**: Choose how many vouchers to create.
2. **Server**: Select which hotspot server to target (usually `all`).
3. **User Mode**: Choose between `Username & Password` or `Username = Password`.
4. **Prefix**: Add a constant prefix to every generated username.
## <Icon name="Zap" color="warning" /> Active Sessions & Cookies {#active}
Monitor and control current connections (`/hotspot/active` and `/hotspot/cookies`).
- **Kick User**: Forcefully disconnect an active user session.
- **Cookies**: Manage 'remember me' tokens. Deleting a cookie forces the user to log in again on their next connection.
## <Icon name="ShieldCheck" color="danger" /> Security & Access {#security}
Advanced settings for network access without typical voucher requirements.
- **IP Bindings**: Bypass the hotspot login for specific MAC or IP addresses (e.g., for office printers or servers).
- **Walled Garden**: Allow access to specific websites or domains (e.g., your bank's portal) even before users log in.

View File

@@ -0,0 +1,16 @@
# Router Operations
Router operations are session-specific tasks performed once connected to a Mikrotik device. These settings vary depending on which router session you are currently in.
## <Icon name="Activity" color="primary" /> Overview
Once you select a session from the sidebar, you gain access to these tools:
- **[Dashboard](/manual/router/dashboard)**: Real-time traffic monitoring.
- **[Hotspot Management](/manual/router/hotspot)**: Users, Profiles, and Vouchers.
- **[Reports](/manual/router/reports)**: Sales reports and system logs.
- **[System Tools](/manual/router/tools)**: Reboot, Scheduler, and DHCP.
## <Icon name="Zap" color="warning" /> Real-time Sync
MIVO communicates directly with your Mikrotik API. Most changes take effect immediately on your device.

View File

@@ -0,0 +1,27 @@
# Quick Print
Quick Print is a specialized module for high-speed voucher vending. It allows you to display only the specific packages you want to sell and print them with a single click.
## <Icon name="BarChart2" color="primary" /> Vending Dashboard
The main page (`/quick-print`) displays your "Packets" as large, clickable cards.
- **Instant Generation**: Clicking a packet immediately requests the router to create a new user.
- **Auto-Print**: Once the user is created, the print dialog for that voucher opens automatically.
## <Icon name="Library" color="info" /> Packet Management
Access the **Manage** section (`/quick-print/manage`) to customize your vending dashboard.
### <Icon name="PlusCircle" color="success" /> Adding Packets
- **Profile**: Choose a Mikrotik user profile.
- **Price**: Set the display price (can differ from Mikrotik comment).
- **Template**: Assign a specific voucher template for this packet.
### <Icon name="Trash2" color="danger" /> Removing Packets
Deleting a packet here only removes it from the Quick Print dashboard; it does **not** delete the profile from your Mikrotik router.
## <Icon name="Printer" color="warning" /> Workflow
1. **Admin** chooses a packet from the dashboard.
2. **MIVO** creates a random username/password account on the Mikrotik.
3. **MIVO** fetches the assigned template and sends it to the browser's print engine.

View File

@@ -0,0 +1,28 @@
# Reports & Logs
Analyze your business performance and monitor system activity through detailed reporting tools.
## <Icon name="BarChart" color="success" /> Selling Reports {#selling}
The Selling Reports page (`/reports/selling`) provides a detailed breakdown of your revenue.
- **Timeline**: View sales by day, month, or a custom date range.
- **Details**: See which profile was sold, the timestamp, and the price.
- **Export**: (If available) Export your data for offline accounting.
## <Icon name="BarChart2" color="primary" /> Sales Resume {#resume}
The Resume page (`/reports/resume`) offers a simplified high-level view of your business growth.
- **Total Income**: Combined revenue from all voucher sales.
- **Voucher Count**: Total number of vouchers sold vs. generated.
- **Session Comparison**: Compare performance across different router sessions.
## <Icon name="ClipboardList" color="info" /> System Logs {#logs}
Monitor real-time events from your Mikrotik router (`/reports/user-log`).
- **Events**: Track user logins, logouts, script executions, and system errors.
- **Troubleshooting**: Use these logs to identify why a user cannot connect or when a session was disconnected.
- **Live Stream**: The logs update automatically as events occur on the router.
> [!NOTE]
> MIVO fetches these logs directly from the Mikrotik circular buffer. Clear your logs on the Mikrotik terminal if the buffer becomes too large.

View File

@@ -0,0 +1,26 @@
# System Tools
Essential utilities for maintaining, scheduling, and monitoring your Mikrotik router's core functions.
## <Icon name="Network" color="info" /> DHCP Leases
The DHCP Leases page (`/network/dhcp`) allows you to monitor all devices connected to your LAN or Hotspot network, even before they log in.
- **Lease Tracking**: View IP assignments, MAC addresses, and hostnames of connected devices.
- **Pre-Login Monitor**: Useful for identifying devices that are connected but having trouble reaching the hotspot login page.
## <Icon name="Clock" color="primary" /> Router Scheduler
MIVO provides a full interface (`/system/scheduler`) to manage Mikrotik's internal scripts and schedules.
- **Tasks List**: View all active and disabled scheduled tasks on your router.
- **Manage Tasks**: Add, edit, or delete tasks directly from MIVO.
- **Automation**: Use this for periodic script execution, such as clearing expired users or generating automated reports.
## <Icon name="Zap" color="warning" /> Critical Actions
Directly trigger system-level commands from the MIVO interface:
- **<Icon name="RefreshCw" color="info" /> Reboot**: Safely restart your Mikrotik hardware.
- **<Icon name="Power" color="danger" /> Shutdown**: Power off the device. Note that you will need physical access to the router to turn it back on.
> [!WARNING]
> These actions are executed immediately on your Mikrotik router. Ensure no critical operations are running before rebooting.

View File

@@ -0,0 +1,15 @@
# API & CORS
MIVO allows external applications to securely access your router data via a REST API.
## <Icon name="Unlock" color="warning" /> CORS Policy
To allow your website (e.g., a status checker) to call the MIVO API, you must whitelist its domain.
1. Go to **Settings** > **API & CORS**.
2. Add your website URL (including `https://`).
3. Save changes.
## <Icon name="Terminal" color="info" /> Documentation
Detailed API documentation is available in the developers section.

View File

@@ -0,0 +1,16 @@
# Global Settings
Global settings control your MIVO instance across all sessions. These are system-wide configurations that don't depend on a specific Mikrotik connection.
## <Icon name="Settings" color="primary" /> Overview
Access these settings from the top-right menu or the main sidebar.
- **[Routers](/manual/settings/routers)**: Manage your Mikrotik connections.
- **[Templates](/manual/settings/templates)**: Customize voucher designs.
- **[Logos](/manual/settings/logos)**: Upload brand logos.
- **[API & CORS](/manual/settings/api-cors)**: Configure API access.
## <Icon name="Shield" color="info" /> Administration
You can also manage your MIVO administrators and general system behavior (Timezones, Language) here.

View File

@@ -0,0 +1,29 @@
# Brand Logos
Logo Management allows you to maintain a gallery of brand assets used for customizing your Mikrotik Hotspot vouchers and the application interface.
## <Icon name="Image" color="primary" /> Purpose
By uploading your business logos here, you can create a professional brand experience for your customers. These logos are centrally stored and can be referenced dynamically in various parts of MIVO.
## <Icon name="UploadCloud" color="success" /> Uploading Process
1. Navigate to **Settings** > **Logos**.
2. **Drag & Drop** or click the upload area to select your file.
3. **Supported Formats**: PNG, JPG, SVG, and GIF are supported. Transparent PNG or SVG is recommended for the best look on vouchers.
## <Icon name="Hash" color="info" /> Logo ID & Copy Feature
Every logo you upload is assigned a unique **Short ID** (e.g., `lg01`, `wifi_logo`).
### <Icon name="Copy" color="primary" /> How to use Copy ID
In the logo gallery, hover over any logo to reveal the **Copy ID** button.
- **Function**: Clicking this button copies the unique ID to your clipboard.
- **Integration**: Use this ID inside the **Voucher Template Editor** (e.g., `&#123;&#123;logo:lg01&#125;&#125;`) to display the specific logo on your printed vouchers.
## <Icon name="Trash2" color="danger" /> Management
You can delete unused logos at any time.
> [!WARNING]
> Deleting a logo will cause any voucher templates referencing its ID to show a broken image placeholder.

View File

@@ -0,0 +1,28 @@
# Managing Routers
To start managing your Mikrotik, you first need to connect it to MIVO.
## <Icon name="PlusCircle" color="success" /> Connecting a Router
1. Go to **Settings** > **Routers**.
2. Click **Add Router**.
3. Fill in the details:
- **Session Name**: A unique identifier for this connection.
- **IP Address**: Your Mikrotik IP or DNS name.
- **Username/Password**: Your Mikrotik API credentials.
- **Port**: Usually 8728 (API).
## <Icon name="Activity" color="info" /> Connection Status
MIVO will attempt to connect to the router in real-time. If the status is green, you're ready to start managing!
## <Icon name="Database" color="warning" /> Backup & Restore
Protect your configuration by creating backups of your MIVO database.
- **Backup**: Creates a JSON file containing all router sessions and global settings.
- **Restore**: Upload a previously saved MIVO backup file to recover your data.
> [!CAUTION]
> Restoring a backup will overwrite your current settings and sessions.

View File

@@ -0,0 +1,20 @@
# System Settings
Manage your MIVO administrator account and global application behavior.
## <Icon name="UserCheck" color="primary" /> Admin Account
Change your MIVO administrator credentials to ensure system security.
- **Username**: The name used for login.
- **Password**: Secure password for access.
## <Icon name="Globe" color="info" /> Global Config
Adjust the environment settings for the entire application:
- **Language**: Choose your preferred interface language (English/Indonesian).
- **Timezone**: Set the local time for accurate reports and logs.
- **Currency**: Define the currency symbol used in vouchers and reports.
## <Icon name="ShieldAlert" color="warning" /> Security
MIVO uses session-based authentication. Ensure you log out when using public terminals.

View File

@@ -0,0 +1,14 @@
# Voucher Templates
MIVO features a powerful template engine to create beautiful, printable vouchers.
## <Icon name="FileCode" color="primary" /> Customizing Templates
Templates use HTML and specialized placeholders to display voucher data.
- **Variables**: `{{username}}`, `{{password}}`, `{{price}}`, etc.
- **Preview**: Test your template instantly from the editor.
## <Icon name="Printer" color="info" /> Quick Print
Once a template is saved, it becomes available in the **Quick Print** menu within your router sessions.

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
docs/public/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 550 KiB

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="512" height="512">
<path d="M0 0 C40.59 0 81.18 0 123 0 C128.94 9.9 128.94 9.9 135 20 C137.46577512 23.98910833 139.93737241 27.97040257 142.4375 31.9375 C143.71783436 33.97762211 144.99777509 36.01799131 146.27734375 38.05859375 C146.90237793 39.05487793 147.52741211 40.05116211 148.17138672 41.07763672 C150.96446678 45.54134411 153.73307277 50.02005064 156.5 54.5 C161.0792303 61.91158465 165.68818082 69.30397167 170.3125 76.6875 C176.26318836 86.19138864 182.15150549 95.73229223 188.01879883 105.2878418 C193.08709306 113.53496427 198.208198 121.74780885 203.34887695 129.94995117 C208.00076575 137.38038241 212.60177706 144.84108448 217.1875 152.3125 C221.7457377 159.73815683 226.3289587 167.14474569 231 174.5 C236.37297853 182.96055964 241.62451084 191.49338078 246.8671875 200.03515625 C251.37750651 207.37833217 255.92338863 214.69797726 260.5 222 C265.77200627 230.41153127 270.99463848 238.85188721 276.1875 247.3125 C280.74574404 254.73816715 285.32948761 262.14440277 290 269.5 C294.5525814 276.67922327 299.0626269 283.88437921 303.53466797 291.11401367 C304.25463221 292.27682202 304.97596045 293.43878708 305.69873047 294.59985352 C306.71188663 296.22822455 307.71932676 297.86014774 308.7265625 299.4921875 C309.31002441 300.43433105 309.89348633 301.37647461 310.49462891 302.34716797 C313.29448494 307.28119905 313.29448494 307.28119905 314 310 C313.10742187 312.33886719 313.10742187 312.33886719 311.46875 314.796875 C310.85410889 315.73821289 310.23946777 316.67955078 309.60620117 317.64941406 C308.91115479 318.67260742 308.2161084 319.69580078 307.5 320.75 C306.42359253 322.38146973 306.42359253 322.38146973 305.32543945 324.04589844 C303.33059412 327.06821098 301.312855 330.07460252 299.29058838 333.07861328 C297.08153396 336.36738288 294.89143772 339.6687451 292.69921875 342.96875 C289.93705235 347.12519373 287.17076618 351.27866178 284.38696289 355.4206543 C279.69084095 362.41374195 275.05797703 369.43667567 270.546875 376.55078125 C269.67715056 377.91328474 268.80712089 379.27559345 267.93676758 380.63769531 C266.69343815 382.58352582 265.45644896 384.53196515 264.23886108 386.49401855 C263.1314603 388.27830807 262.00378362 390.04810218 260.87109375 391.81640625 C260.24130615 392.82131104 259.61151855 393.82621582 258.96264648 394.86157227 C257 397 257 397 254.55784607 397.3649292 C252 397 252 397 250.43936157 395.46855164 C250.00127167 394.75278458 249.56318176 394.03701752 249.11181641 393.29956055 C248.60661469 392.49629837 248.10141296 391.69303619 247.5809021 390.86543274 C247.05147003 389.98558212 246.52203796 389.10573151 245.9765625 388.19921875 C244.81884975 386.34633241 243.66030081 384.49396831 242.50097656 382.64208984 C241.91658813 381.69622009 241.33219971 380.75035034 240.73010254 379.77581787 C238.15263697 375.6404705 235.46629193 371.58029076 232.7734375 367.51953125 C231.72553934 365.92993275 230.67801875 364.34008528 229.63085938 362.75 C228.54557801 361.1041633 227.46029141 359.45833007 226.375 357.8125 C225.20371001 356.03519977 224.03248774 354.2578549 222.86132812 352.48046875 C220.44133946 348.80793487 218.02106714 345.13558818 215.60058594 341.46337891 C210.45583874 333.65758543 205.31468042 325.84942899 200.17340088 318.04135132 C197.36576183 313.77746136 194.55786745 309.51373955 191.75 305.25 C190.62499879 303.54166746 189.49999879 301.83333413 188.375 300.125 C187.818125 299.279375 187.26125 298.43375 186.6875 297.5625 C181.62499997 289.87499995 181.62499997 289.87499995 179.93762207 287.31268311 C178.81221794 285.6037376 177.68681104 283.89479391 176.56140137 282.18585205 C173.75506191 277.92439992 170.94877005 273.66291647 168.14257812 269.40136719 C163.00738565 261.60304695 157.87180924 253.80498071 152.73449707 246.00805664 C150.38571799 242.44323839 148.03721141 238.87824066 145.6887207 235.31323242 C144.60145193 233.66291655 143.51405939 232.01268221 142.42651367 230.36254883 C132.25421049 214.9279819 122.13043857 199.46224835 112 184 C111.67 292.24 111.34 400.48 111 512 C74.37 512 37.74 512 0 512 C0 343.04 0 174.08 0 0 Z " fill="#ffffff" transform="translate(0,0)"/>
<path d="M0 0 C40.59 0 81.18 0 123 0 C123 168.96 123 337.92 123 512 C86.04 512 49.08 512 11 512 C10.67 402.77 10.34 293.54 10 181 C4.72 189.25 -0.56 197.5 -6 206 C-9.39444207 211.15548467 -12.78716673 216.30779963 -16.22192383 221.43579102 C-17.599304 223.49245466 -18.97271714 225.55172895 -20.34570312 227.61132812 C-22.50073142 230.84064053 -24.66547146 234.06319701 -26.83917236 237.27996826 C-27.94230355 238.91450952 -29.03943552 240.55309486 -30.13623047 242.19189453 C-30.76029785 243.1095459 -31.38436523 244.02719727 -32.02734375 244.97265625 C-32.559646 245.760354 -33.09194824 246.54805176 -33.64038086 247.35961914 C-34.08905518 247.90094482 -34.53772949 248.44227051 -35 249 C-35.66 249 -36.32 249 -37 249 C-38.35009766 247.20947266 -38.35009766 247.20947266 -39.9140625 244.6640625 C-40.501875 243.7153125 -41.0896875 242.7665625 -41.6953125 241.7890625 C-42.33210938 240.74492187 -42.96890625 239.70078125 -43.625 238.625 C-44.29015625 237.54734375 -44.9553125 236.4696875 -45.640625 235.359375 C-47.41266874 232.48561118 -49.17847981 229.6082147 -50.94104004 226.7286377 C-52.63090725 223.9701121 -54.32738918 221.21566567 -56.0234375 218.4609375 C-58.01919588 215.21887138 -60.01443826 211.97649876 -62.00732422 208.73266602 C-66.55995548 201.32481658 -71.14231268 193.93622184 -75.75 186.5625 C-76.66652344 185.09151855 -76.66652344 185.09151855 -77.6015625 183.59082031 C-80.57044721 178.83646363 -83.57016988 174.10746656 -86.640625 169.41796875 C-87.20813477 168.54390381 -87.77564453 167.66983887 -88.36035156 166.76928711 C-89.42453538 165.1341899 -90.49885882 163.50563072 -91.58496094 161.88500977 C-92.05192383 161.16498779 -92.51888672 160.44496582 -93 159.703125 C-93.4125 159.08083008 -93.825 158.45853516 -94.25 157.81738281 C-95.23752366 155.42443811 -94.91065312 154.39823636 -94 152 C-93.28247855 150.60752627 -92.51012761 149.24258512 -91.69921875 147.90234375 C-90.98511841 146.71560059 -90.98511841 146.71560059 -90.2565918 145.50488281 C-89.7387915 144.65764648 -89.22099121 143.81041016 -88.6875 142.9375 C-88.14843018 142.04772461 -87.60936035 141.15794922 -87.05395508 140.24121094 C-82.51613674 132.77957799 -77.86646672 125.39067843 -73.18359375 118.01953125 C-63.57216547 102.88747676 -54.1487842 87.63834556 -44.77050781 72.36108398 C-40.88941569 66.04649596 -36.97338141 59.75688711 -33 53.5 C-21.76980025 35.81118073 -10.92512644 17.87747962 0 0 Z " fill="#ffffff" transform="translate(389,0)"/>
<path d="M0 0 C4.62276577 4.14454862 7.47322448 8.77374995 10.5625 14.125 C11.62963614 15.93860414 12.69869312 17.75107923 13.76953125 19.5625 C14.30916504 20.47644531 14.84879883 21.39039063 15.40478516 22.33203125 C17.78240918 26.30856558 20.25885329 30.21891917 22.75 34.125 C28.22964988 42.73406002 33.58176135 51.41803925 38.89916992 60.12817383 C42.24750462 65.59578939 45.64232668 71.01967842 49.16796875 76.375 C49.82361816 77.37684326 50.47926758 78.37868652 51.15478516 79.41088867 C52.39829787 81.30225655 53.6539539 83.18571316 54.92333984 85.05981445 C55.47586426 85.9024585 56.02838867 86.74510254 56.59765625 87.61328125 C57.08758057 88.34329346 57.57750488 89.07330566 58.08227539 89.82543945 C59.28133227 92.66662052 58.92600786 94.09059312 58 97 C57.01611328 99.00463867 57.01611328 99.00463867 55.8203125 100.91796875 C55.38589844 101.61470703 54.95148438 102.31144531 54.50390625 103.02929688 C54.04886719 103.74150391 53.59382813 104.45371094 53.125 105.1875 C52.67769531 105.91130859 52.23039062 106.63511719 51.76953125 107.38085938 C49.65391647 110.73526333 48.36691842 112.75538772 45 115 C44.37508667 113.98353394 44.37508667 113.98353394 43.73754883 112.9465332 C27.17658577 86.00544711 27.17658577 86.00544711 10.46337891 59.15869141 C2.53411428 46.50404945 -5.26881404 33.77655539 -13 21 C-4.738041 6.21867882 -4.738041 6.21867882 0 0 Z " fill="#ffffff" transform="translate(281,175)"/>
</svg>

After

Width:  |  Height:  |  Size: 7.9 KiB

6
docs/public/logo-m.svg Normal file
View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="512" height="512">
<path d="M0 0 C40.59 0 81.18 0 123 0 C128.94 9.9 128.94 9.9 135 20 C137.46577512 23.98910833 139.93737241 27.97040257 142.4375 31.9375 C143.71783436 33.97762211 144.99777509 36.01799131 146.27734375 38.05859375 C146.90237793 39.05487793 147.52741211 40.05116211 148.17138672 41.07763672 C150.96446678 45.54134411 153.73307277 50.02005064 156.5 54.5 C161.0792303 61.91158465 165.68818082 69.30397167 170.3125 76.6875 C176.26318836 86.19138864 182.15150549 95.73229223 188.01879883 105.2878418 C193.08709306 113.53496427 198.208198 121.74780885 203.34887695 129.94995117 C208.00076575 137.38038241 212.60177706 144.84108448 217.1875 152.3125 C221.7457377 159.73815683 226.3289587 167.14474569 231 174.5 C236.37297853 182.96055964 241.62451084 191.49338078 246.8671875 200.03515625 C251.37750651 207.37833217 255.92338863 214.69797726 260.5 222 C265.77200627 230.41153127 270.99463848 238.85188721 276.1875 247.3125 C280.74574404 254.73816715 285.32948761 262.14440277 290 269.5 C294.5525814 276.67922327 299.0626269 283.88437921 303.53466797 291.11401367 C304.25463221 292.27682202 304.97596045 293.43878708 305.69873047 294.59985352 C306.71188663 296.22822455 307.71932676 297.86014774 308.7265625 299.4921875 C309.31002441 300.43433105 309.89348633 301.37647461 310.49462891 302.34716797 C313.29448494 307.28119905 313.29448494 307.28119905 314 310 C313.10742187 312.33886719 313.10742187 312.33886719 311.46875 314.796875 C310.85410889 315.73821289 310.23946777 316.67955078 309.60620117 317.64941406 C308.91115479 318.67260742 308.2161084 319.69580078 307.5 320.75 C306.42359253 322.38146973 306.42359253 322.38146973 305.32543945 324.04589844 C303.33059412 327.06821098 301.312855 330.07460252 299.29058838 333.07861328 C297.08153396 336.36738288 294.89143772 339.6687451 292.69921875 342.96875 C289.93705235 347.12519373 287.17076618 351.27866178 284.38696289 355.4206543 C279.69084095 362.41374195 275.05797703 369.43667567 270.546875 376.55078125 C269.67715056 377.91328474 268.80712089 379.27559345 267.93676758 380.63769531 C266.69343815 382.58352582 265.45644896 384.53196515 264.23886108 386.49401855 C263.1314603 388.27830807 262.00378362 390.04810218 260.87109375 391.81640625 C260.24130615 392.82131104 259.61151855 393.82621582 258.96264648 394.86157227 C257 397 257 397 254.55784607 397.3649292 C252 397 252 397 250.43936157 395.46855164 C250.00127167 394.75278458 249.56318176 394.03701752 249.11181641 393.29956055 C248.60661469 392.49629837 248.10141296 391.69303619 247.5809021 390.86543274 C247.05147003 389.98558212 246.52203796 389.10573151 245.9765625 388.19921875 C244.81884975 386.34633241 243.66030081 384.49396831 242.50097656 382.64208984 C241.91658813 381.69622009 241.33219971 380.75035034 240.73010254 379.77581787 C238.15263697 375.6404705 235.46629193 371.58029076 232.7734375 367.51953125 C231.72553934 365.92993275 230.67801875 364.34008528 229.63085938 362.75 C228.54557801 361.1041633 227.46029141 359.45833007 226.375 357.8125 C225.20371001 356.03519977 224.03248774 354.2578549 222.86132812 352.48046875 C220.44133946 348.80793487 218.02106714 345.13558818 215.60058594 341.46337891 C210.45583874 333.65758543 205.31468042 325.84942899 200.17340088 318.04135132 C197.36576183 313.77746136 194.55786745 309.51373955 191.75 305.25 C190.62499879 303.54166746 189.49999879 301.83333413 188.375 300.125 C187.818125 299.279375 187.26125 298.43375 186.6875 297.5625 C181.62499997 289.87499995 181.62499997 289.87499995 179.93762207 287.31268311 C178.81221794 285.6037376 177.68681104 283.89479391 176.56140137 282.18585205 C173.75506191 277.92439992 170.94877005 273.66291647 168.14257812 269.40136719 C163.00738565 261.60304695 157.87180924 253.80498071 152.73449707 246.00805664 C150.38571799 242.44323839 148.03721141 238.87824066 145.6887207 235.31323242 C144.60145193 233.66291655 143.51405939 232.01268221 142.42651367 230.36254883 C132.25421049 214.9279819 122.13043857 199.46224835 112 184 C111.67 292.24 111.34 400.48 111 512 C74.37 512 37.74 512 0 512 C0 343.04 0 174.08 0 0 Z " fill="#000000" transform="translate(0,0)"/>
<path d="M0 0 C40.59 0 81.18 0 123 0 C123 168.96 123 337.92 123 512 C86.04 512 49.08 512 11 512 C10.67 402.77 10.34 293.54 10 181 C4.72 189.25 -0.56 197.5 -6 206 C-9.39444207 211.15548467 -12.78716673 216.30779963 -16.22192383 221.43579102 C-17.599304 223.49245466 -18.97271714 225.55172895 -20.34570312 227.61132812 C-22.50073142 230.84064053 -24.66547146 234.06319701 -26.83917236 237.27996826 C-27.94230355 238.91450952 -29.03943552 240.55309486 -30.13623047 242.19189453 C-30.76029785 243.1095459 -31.38436523 244.02719727 -32.02734375 244.97265625 C-32.559646 245.760354 -33.09194824 246.54805176 -33.64038086 247.35961914 C-34.08905518 247.90094482 -34.53772949 248.44227051 -35 249 C-35.66 249 -36.32 249 -37 249 C-38.35009766 247.20947266 -38.35009766 247.20947266 -39.9140625 244.6640625 C-40.501875 243.7153125 -41.0896875 242.7665625 -41.6953125 241.7890625 C-42.33210938 240.74492187 -42.96890625 239.70078125 -43.625 238.625 C-44.29015625 237.54734375 -44.9553125 236.4696875 -45.640625 235.359375 C-47.41266874 232.48561118 -49.17847981 229.6082147 -50.94104004 226.7286377 C-52.63090725 223.9701121 -54.32738918 221.21566567 -56.0234375 218.4609375 C-58.01919588 215.21887138 -60.01443826 211.97649876 -62.00732422 208.73266602 C-66.55995548 201.32481658 -71.14231268 193.93622184 -75.75 186.5625 C-76.66652344 185.09151855 -76.66652344 185.09151855 -77.6015625 183.59082031 C-80.57044721 178.83646363 -83.57016988 174.10746656 -86.640625 169.41796875 C-87.20813477 168.54390381 -87.77564453 167.66983887 -88.36035156 166.76928711 C-89.42453538 165.1341899 -90.49885882 163.50563072 -91.58496094 161.88500977 C-92.05192383 161.16498779 -92.51888672 160.44496582 -93 159.703125 C-93.4125 159.08083008 -93.825 158.45853516 -94.25 157.81738281 C-95.23752366 155.42443811 -94.91065312 154.39823636 -94 152 C-93.28247855 150.60752627 -92.51012761 149.24258512 -91.69921875 147.90234375 C-90.98511841 146.71560059 -90.98511841 146.71560059 -90.2565918 145.50488281 C-89.7387915 144.65764648 -89.22099121 143.81041016 -88.6875 142.9375 C-88.14843018 142.04772461 -87.60936035 141.15794922 -87.05395508 140.24121094 C-82.51613674 132.77957799 -77.86646672 125.39067843 -73.18359375 118.01953125 C-63.57216547 102.88747676 -54.1487842 87.63834556 -44.77050781 72.36108398 C-40.88941569 66.04649596 -36.97338141 59.75688711 -33 53.5 C-21.76980025 35.81118073 -10.92512644 17.87747962 0 0 Z " fill="#000000" transform="translate(389,0)"/>
<path d="M0 0 C4.62276577 4.14454862 7.47322448 8.77374995 10.5625 14.125 C11.62963614 15.93860414 12.69869312 17.75107923 13.76953125 19.5625 C14.30916504 20.47644531 14.84879883 21.39039063 15.40478516 22.33203125 C17.78240918 26.30856558 20.25885329 30.21891917 22.75 34.125 C28.22964988 42.73406002 33.58176135 51.41803925 38.89916992 60.12817383 C42.24750462 65.59578939 45.64232668 71.01967842 49.16796875 76.375 C49.82361816 77.37684326 50.47926758 78.37868652 51.15478516 79.41088867 C52.39829787 81.30225655 53.6539539 83.18571316 54.92333984 85.05981445 C55.47586426 85.9024585 56.02838867 86.74510254 56.59765625 87.61328125 C57.08758057 88.34329346 57.57750488 89.07330566 58.08227539 89.82543945 C59.28133227 92.66662052 58.92600786 94.09059312 58 97 C57.01611328 99.00463867 57.01611328 99.00463867 55.8203125 100.91796875 C55.38589844 101.61470703 54.95148438 102.31144531 54.50390625 103.02929688 C54.04886719 103.74150391 53.59382813 104.45371094 53.125 105.1875 C52.67769531 105.91130859 52.23039062 106.63511719 51.76953125 107.38085938 C49.65391647 110.73526333 48.36691842 112.75538772 45 115 C44.37508667 113.98353394 44.37508667 113.98353394 43.73754883 112.9465332 C27.17658577 86.00544711 27.17658577 86.00544711 10.46337891 59.15869141 C2.53411428 46.50404945 -5.26881404 33.77655539 -13 21 C-4.738041 6.21867882 -4.738041 6.21867882 0 0 Z " fill="#000000" transform="translate(281,175)"/>
</svg>

After

Width:  |  Height:  |  Size: 7.9 KiB

33
package-lock.json generated
View File

@@ -12,6 +12,7 @@
"chart.js": "^4.5.1",
"flag-icons": "^7.5.0",
"lucide": "^0.562.0",
"lucide-vue-next": "^0.562.0",
"qrious": "^4.0.2"
},
"devDependencies": {
@@ -297,7 +298,6 @@
"version": "7.27.1",
"resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
"integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -307,7 +307,6 @@
"version": "7.28.5",
"resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz",
"integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=6.9.0"
@@ -317,7 +316,6 @@
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.6.tgz",
"integrity": "sha512-TeR9zWR18BvbfPmGbLampPMW+uW1NZnJlRuuHso8i87QZNq2JRF9i6RgxRqtEq+wQGsS19NNTWr2duhnE49mfQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/types": "^7.28.6"
@@ -333,7 +331,6 @@
"version": "7.28.6",
"resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.6.tgz",
"integrity": "sha512-0ZrskXVEHSWIqZM/sQZ4EV3jZJXRkio/WCxaqKZP1g//CEWEPSfeZFcms4XeKBCHU0ZKnIkdJeU/kF+eRp5lBg==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/helper-string-parser": "^7.27.1",
@@ -827,7 +824,6 @@
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
"dev": true,
"license": "MIT"
},
"node_modules/@jridgewell/trace-mapping": {
@@ -1413,7 +1409,6 @@
"version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.26.tgz",
"integrity": "sha512-vXyI5GMfuoBCnv5ucIT7jhHKl55Y477yxP6fc4eUswjP8FG3FFVFd41eNDArR+Uk3QKn2Z85NavjaxLxOC19/w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.28.5",
@@ -1427,7 +1422,6 @@
"version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.26.tgz",
"integrity": "sha512-y1Tcd3eXs834QjswshSilCBnKGeQjQXB6PqFn/1nxcQw4pmG42G8lwz+FZPAZAby6gZeHSt/8LMPfZ4Rb+Bd/A==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vue/compiler-core": "3.5.26",
@@ -1438,7 +1432,6 @@
"version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.26.tgz",
"integrity": "sha512-egp69qDTSEZcf4bGOSsprUr4xI73wfrY5oRs6GSgXFTiHrWj4Y3X5Ydtip9QMqiCMCPVwLglB9GBxXtTadJ3mA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@babel/parser": "^7.28.5",
@@ -1456,7 +1449,6 @@
"version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.26.tgz",
"integrity": "sha512-lZT9/Y0nSIRUPVvapFJEVDbEXruZh2IYHMk2zTtEgJSlP5gVOqeWXH54xDKAaFS4rTnDeDBQUYDtxKyoW9FwDw==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vue/compiler-dom": "3.5.26",
@@ -1503,7 +1495,6 @@
"version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.26.tgz",
"integrity": "sha512-9EnYB1/DIiUYYnzlnUBgwU32NNvLp/nhxLXeWRhHUEeWNTn1ECxX8aGO7RTXeX6PPcxe3LLuNBFoJbV4QZ+CFQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vue/shared": "3.5.26"
@@ -1513,7 +1504,6 @@
"version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.26.tgz",
"integrity": "sha512-xJWM9KH1kd201w5DvMDOwDHYhrdPTrAatn56oB/LRG4plEQeZRQLw0Bpwih9KYoqmzaxF0OKSn6swzYi84e1/Q==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vue/reactivity": "3.5.26",
@@ -1524,7 +1514,6 @@
"version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.26.tgz",
"integrity": "sha512-XLLd/+4sPC2ZkN/6+V4O4gjJu6kSDbHAChvsyWgm1oGbdSO3efvGYnm25yCjtFm/K7rrSDvSfPDgN1pHgS4VNQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vue/reactivity": "3.5.26",
@@ -1537,7 +1526,6 @@
"version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.26.tgz",
"integrity": "sha512-TYKLXmrwWKSodyVuO1WAubucd+1XlLg4set0YoV+Hu8Lo79mp/YMwWV5mC5FgtsDxX3qo1ONrxFaTP1OQgy1uA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vue/compiler-ssr": "3.5.26",
@@ -1551,7 +1539,6 @@
"version": "3.5.26",
"resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.26.tgz",
"integrity": "sha512-7Z6/y3uFI5PRoKeorTOSXKcDj0MSasfNNltcslbFrPpcw6aXRUALq4IfJlaTRspiWIUOEZbrpM+iQGmCOiWe4A==",
"dev": true,
"license": "MIT"
},
"node_modules/@vueuse/core": {
@@ -1999,7 +1986,6 @@
"version": "3.2.3",
"resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz",
"integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==",
"dev": true,
"license": "MIT"
},
"node_modules/dequal": {
@@ -2058,7 +2044,6 @@
"version": "7.0.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-7.0.0.tgz",
"integrity": "sha512-FDWG5cmEYf2Z00IkYRhbFrwIwvdFKH07uV8dvNy0omp/Qb1xcyCWp2UDtcwJF4QZZvk0sLudP6/hAu42TaqVhQ==",
"dev": true,
"license": "BSD-2-Clause",
"engines": {
"node": ">=0.12"
@@ -2120,7 +2105,6 @@
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz",
"integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==",
"dev": true,
"license": "MIT"
},
"node_modules/fast-glob": {
@@ -2424,11 +2408,19 @@
"integrity": "sha512-k1Fb8ZMnRQovWRlea7Jr0b9UKA29IM7/cu79+mJrhVohvA2YC/Ti3Sk+G+h/SIu3IlrKT4RAbWMHUBBQd1O6XA==",
"license": "ISC"
},
"node_modules/lucide-vue-next": {
"version": "0.562.0",
"resolved": "https://registry.npmjs.org/lucide-vue-next/-/lucide-vue-next-0.562.0.tgz",
"integrity": "sha512-LN0BLGKMFulv0lnfK29r14DcngRUhIqdcaL0zXTt2o0oS9odlrjCGaU3/X9hIihOjjN8l8e+Y9G/famcNYaI7Q==",
"license": "ISC",
"peerDependencies": {
"vue": ">=3.0.1"
}
},
"node_modules/magic-string": {
"version": "0.30.21",
"resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz",
"integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jridgewell/sourcemap-codec": "^1.5.5"
@@ -2611,7 +2603,6 @@
"version": "3.3.11",
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz",
"integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==",
"dev": true,
"funding": [
{
"type": "github",
@@ -2693,7 +2684,6 @@
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz",
"integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==",
"dev": true,
"license": "ISC"
},
"node_modules/picomatch": {
@@ -2733,7 +2723,6 @@
"version": "8.5.6",
"resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.6.tgz",
"integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
"dev": true,
"funding": [
{
"type": "opencollective",
@@ -3121,7 +3110,6 @@
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz",
"integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==",
"dev": true,
"license": "BSD-3-Clause",
"engines": {
"node": ">=0.10.0"
@@ -3606,7 +3594,6 @@
"version": "3.5.26",
"resolved": "https://registry.npmjs.org/vue/-/vue-3.5.26.tgz",
"integrity": "sha512-SJ/NTccVyAoNUJmkM9KUqPcYlY+u8OVL1X5EW9RIs3ch5H2uERxyyIUI4MRxVCSOiEcupX9xNGde1tL9ZKpimA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@vue/compiler-dom": "3.5.26",

View File

@@ -19,6 +19,7 @@
"chart.js": "^4.5.1",
"flag-icons": "^7.5.0",
"lucide": "^0.562.0",
"lucide-vue-next": "^0.562.0",
"qrious": "^4.0.2"
},
"devDependencies": {

2
public/assets/img/logos/.gitignore vendored Normal file
View File

@@ -0,0 +1,2 @@
*
!.gitignore

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 88 KiB