@rynt/sdk 0.9.53
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +122 -0
- package/REGISTRIES.md +189 -0
- package/env.d.ts +11 -0
- package/host-shims.d.ts +30 -0
- package/package.json +88 -0
- package/src/extension-marketplace/api-types.ts +141 -0
- package/src/extension-marketplace/client.ts +296 -0
- package/src/extension-marketplace/index.ts +22 -0
- package/src/extension-marketplace/schemas.ts +178 -0
- package/src/extensions/ExtensionRoutePage.vue +17 -0
- package/src/extensions/context.ts +37 -0
- package/src/extensions/disabled-folder.ts +21 -0
- package/src/extensions/extension-expose-map.ts +5 -0
- package/src/extensions/extension-expose.ts +48 -0
- package/src/extensions/graph.ts +67 -0
- package/src/extensions/index.ts +251 -0
- package/src/extensions/invite-handler/types.ts +20 -0
- package/src/extensions/launcher-entities/create-launcher-entity.ts +25 -0
- package/src/extensions/launcher-entities/keys.ts +46 -0
- package/src/extensions/launcher-entities/launcher-entity-components.ts +177 -0
- package/src/extensions/launcher-entities/props-map.ts +69 -0
- package/src/extensions/launcher-entities/registry.ts +32 -0
- package/src/extensions/launcher-models/apis/accounts-contracts.ts +102 -0
- package/src/extensions/launcher-models/apis/launcher-model-apis.ts +553 -0
- package/src/extensions/launcher-models/keys.ts +23 -0
- package/src/extensions/launcher-models/public.ts +9 -0
- package/src/extensions/launcher-models/registry-core.ts +34 -0
- package/src/extensions/manifest-types.ts +22 -0
- package/src/extensions/manifest.ts +46 -0
- package/src/extensions/marketplace-open-key.ts +26 -0
- package/src/extensions/plugin-types.ts +44 -0
- package/src/extensions/plugin.ts +62 -0
- package/src/extensions/registries/bootstrap.ts +11 -0
- package/src/extensions/registries/builtins/account-provider.ts +6 -0
- package/src/extensions/registries/builtins/app-topbar-left-widgets.ts +6 -0
- package/src/extensions/registries/builtins/app-topbar-right-widgets.ts +6 -0
- package/src/extensions/registries/builtins/app-topbar-status-widgets.ts +6 -0
- package/src/extensions/registries/builtins/build-card-actions.ts +6 -0
- package/src/extensions/registries/builtins/build-card-after-meta.ts +6 -0
- package/src/extensions/registries/builtins/build-card-before-media.ts +6 -0
- package/src/extensions/registries/builtins/build-card-before-meta.ts +6 -0
- package/src/extensions/registries/builtins/build-card-footer-actions.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-after-content.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-before-content.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-before-hero.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-header-actions.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-mod-row-actions.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-resourcepack-row-actions.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-right-column-bottom.ts +6 -0
- package/src/extensions/registries/builtins/build-detail-right-column-top.ts +6 -0
- package/src/extensions/registries/builtins/dialog-footer-actions.ts +6 -0
- package/src/extensions/registries/builtins/feed-after-content.ts +6 -0
- package/src/extensions/registries/builtins/feed-before-content.ts +6 -0
- package/src/extensions/registries/builtins/file-editor.ts +19 -0
- package/src/extensions/registries/builtins/friends-after-list.ts +6 -0
- package/src/extensions/registries/builtins/friends-before-list.ts +6 -0
- package/src/extensions/registries/builtins/index.ts +141 -0
- package/src/extensions/registries/builtins/invite-handler.ts +7 -0
- package/src/extensions/registries/builtins/library-after-content.ts +6 -0
- package/src/extensions/registries/builtins/library-before-content.ts +6 -0
- package/src/extensions/registries/builtins/loader.ts +8 -0
- package/src/extensions/registries/builtins/map-card-actions.ts +6 -0
- package/src/extensions/registries/builtins/map-card-after-meta.ts +6 -0
- package/src/extensions/registries/builtins/map-card-before-meta.ts +6 -0
- package/src/extensions/registries/builtins/map-card-footer-actions.ts +6 -0
- package/src/extensions/registries/builtins/map-detail-after-content.ts +6 -0
- package/src/extensions/registries/builtins/map-detail-before-content.ts +6 -0
- package/src/extensions/registries/builtins/map-detail-header-actions.ts +6 -0
- package/src/extensions/registries/builtins/markdown-editor-tiptap-extensions.ts +7 -0
- package/src/extensions/registries/builtins/markdown-editor-toolbar-actions.ts +6 -0
- package/src/extensions/registries/builtins/markdown-renderer-after-content.ts +6 -0
- package/src/extensions/registries/builtins/markdown-renderer-before-content.ts +6 -0
- package/src/extensions/registries/builtins/mod-details-footer-actions.ts +6 -0
- package/src/extensions/registries/builtins/mod-manage-actions.ts +6 -0
- package/src/extensions/registries/builtins/mod-provider.ts +5 -0
- package/src/extensions/registries/builtins/nav.ts +7 -0
- package/src/extensions/registries/builtins/page.ts +13 -0
- package/src/extensions/registries/builtins/projects-after-content.ts +6 -0
- package/src/extensions/registries/builtins/projects-before-content.ts +6 -0
- package/src/extensions/registries/builtins/resourcepack-manage-actions.ts +7 -0
- package/src/extensions/registries/builtins/server-card-actions.ts +6 -0
- package/src/extensions/registries/builtins/server-card-after-meta.ts +6 -0
- package/src/extensions/registries/builtins/server-card-before-meta.ts +6 -0
- package/src/extensions/registries/builtins/server-card-footer-actions.ts +6 -0
- package/src/extensions/registries/builtins/server-detail-after-content.ts +6 -0
- package/src/extensions/registries/builtins/server-detail-before-content.ts +6 -0
- package/src/extensions/registries/builtins/server-detail-header-actions.ts +6 -0
- package/src/extensions/registries/builtins/settings-after-sections.ts +6 -0
- package/src/extensions/registries/builtins/settings-before-sections.ts +6 -0
- package/src/extensions/registries/builtins/settings-section-widgets.ts +6 -0
- package/src/extensions/registries/builtins/shaderpack-manage-actions.ts +7 -0
- package/src/extensions/registries/builtins/shell.ts +5 -0
- package/src/extensions/registries/builtins/sidebar-after-content.ts +6 -0
- package/src/extensions/registries/builtins/sidebar-before-content.ts +6 -0
- package/src/extensions/registries/builtins/sidebar-footer-widgets.ts +6 -0
- package/src/extensions/registries/builtins/sidebar-header-widgets.ts +6 -0
- package/src/extensions/registries/builtins/sidebar.ts +11 -0
- package/src/extensions/registries/builtins/theme.ts +5 -0
- package/src/extensions/registries/builtins/user-card-after-meta.ts +6 -0
- package/src/extensions/registries/builtins/user-card-before-meta.ts +6 -0
- package/src/extensions/registries/builtins/user-menu-actions.ts +6 -0
- package/src/extensions/registries/builtins/user-menu-after-actions.ts +6 -0
- package/src/extensions/registries/builtins/user-menu-before-actions.ts +6 -0
- package/src/extensions/registries/builtins/user-strip.ts +5 -0
- package/src/extensions/registries/clear-extension-ui-registries.ts +15 -0
- package/src/extensions/registries/define-extension-registry.ts +58 -0
- package/src/extensions/registries/extension-host-api.ts +41 -0
- package/src/extensions/registries/extension-registry-api.ts +103 -0
- package/src/extensions/registries/extension-registry-payload-map.ts +9 -0
- package/src/extensions/registries/extension-scope.ts +41 -0
- package/src/extensions/registries/get-registry.ts +23 -0
- package/src/extensions/registries/index.ts +58 -0
- package/src/extensions/registries/manifest-rynt.ts +193 -0
- package/src/extensions/registries/registry-slot.ts +40 -0
- package/src/extensions/registries/registry-value-map.ts +89 -0
- package/src/extensions/registries/store.ts +206 -0
- package/src/extensions/resolve-extensions.ts +245 -0
- package/src/extensions/router-bridge.ts +103 -0
- package/src/extensions/session.ts +6 -0
- package/src/extensions/slug.ts +23 -0
- package/src/extensions/version.ts +147 -0
- package/src/host/extensions-composables.ts +33 -0
- package/src/host/extensions-init.ts +194 -0
- package/src/host/index.ts +11 -0
- package/src/host/launcher-models/index.ts +4 -0
- package/src/index.ts +229 -0
- package/src/minecraft-loader/base-loader.ts +102 -0
- package/src/minecraft-loader/index.ts +11 -0
- package/src/minecraft-loader/loader-registry.ts +72 -0
- package/src/shared/api/assets.ts +112 -0
- package/src/shared/api/auth.ts +283 -0
- package/src/shared/api/builds.ts +647 -0
- package/src/shared/api/config.ts +19 -0
- package/src/shared/api/download-stats.ts +103 -0
- package/src/shared/api/downloads.ts +36 -0
- package/src/shared/api/entity-authorship.ts +60 -0
- package/src/shared/api/events.ts +393 -0
- package/src/shared/api/friends.ts +140 -0
- package/src/shared/api/graphql.ts +87 -0
- package/src/shared/api/index.ts +23 -0
- package/src/shared/api/invites.ts +262 -0
- package/src/shared/api/library.ts +44 -0
- package/src/shared/api/maps.ts +385 -0
- package/src/shared/api/notify-websocket.ts +140 -0
- package/src/shared/api/posts.ts +357 -0
- package/src/shared/api/projectServers.ts +379 -0
- package/src/shared/api/serverMembers.ts +173 -0
- package/src/shared/api/users.ts +294 -0
- package/src/shared/composables/buildEditor/useBuildEditor.ts +66 -0
- package/src/shared/composables/buildManifest/buildManifest.ts +447 -0
- package/src/shared/composables/filesEditor/filesEditor.ts +346 -0
- package/src/shared/composables/index.ts +10 -0
- package/src/shared/composables/modsEditor/modsEditor.ts +1678 -0
- package/src/shared/composables/registrySlot/registry-slot-utils.ts +25 -0
- package/src/shared/composables/registrySlot/useRegistrySlotMissing.ts +35 -0
- package/src/shared/composables/resourcePacksEditor/resourcePacksEditor.ts +448 -0
- package/src/shared/composables/shaderPacksEditor/shaderPacksEditor.ts +395 -0
- package/src/shared/composables/useSkinRender.ts +70 -0
- package/src/shared/composables/useZlDeepLink.ts +178 -0
- package/src/shared/definitions/defineGraphCache.ts +216 -0
- package/src/shared/definitions/defineStore.ts +32 -0
- package/src/shared/definitions/index.ts +2 -0
- package/src/shared/minecraft-types/build-manifest.ts +611 -0
- package/src/shared/minecraft-types/index.ts +3 -0
- package/src/shared/minecraft-types/launcher-versions.ts +32 -0
- package/src/shared/minecraft-types/minecraft-launcher-types.ts +276 -0
- package/src/shared/mocks/index.ts +1 -0
- package/src/shared/mocks/navigation.ts +17 -0
- package/src/shared/mods/http.ts +45 -0
- package/src/shared/mods/index.ts +5 -0
- package/src/shared/mods/marketplace-editor-search.ts +266 -0
- package/src/shared/mods/marketplace-search-utils.ts +42 -0
- package/src/shared/mods/mod-marketplace-registry.ts +66 -0
- package/src/shared/mods/mod-marketplace-types.ts +28 -0
- package/src/shared/mods/providers/curseforge.ts +464 -0
- package/src/shared/mods/providers/index.ts +8 -0
- package/src/shared/mods/providers/modrinth.ts +402 -0
- package/src/shared/mods/resolve-mods-provider-loader-ids.ts +77 -0
- package/src/shared/mods/types.ts +76 -0
- package/src/shared/styles/index.css +713 -0
- package/src/shared/themes/index.ts +23 -0
- package/src/shared/themes/theme-tokens-black.json +126 -0
- package/src/shared/themes/theme-tokens-classic.json +126 -0
- package/src/shared/themes/theme-tokens-pink.json +126 -0
- package/src/shared/themes/theme-tokens.json +126 -0
- package/src/shared/themes/types.ts +85 -0
- package/src/shared/types/API_DOCUMENTATION.md +422 -0
- package/src/shared/types/account.ts +40 -0
- package/src/shared/types/build.ts +8 -0
- package/src/shared/types/entities.ts +181 -0
- package/src/shared/types/index.ts +6 -0
- package/src/shared/types/invite-payloads.ts +60 -0
- package/src/shared/types/navigation.ts +16 -0
- package/src/shared/types/running-build.ts +51 -0
- package/src/shared/types/serverMember.ts +17 -0
- package/src/shared/types/user.ts +55 -0
- package/src/shared/ui/base/Avatar.vue +262 -0
- package/src/shared/ui/base/Badge.vue +47 -0
- package/src/shared/ui/base/Button.vue +78 -0
- package/src/shared/ui/base/Divider.vue +42 -0
- package/src/shared/ui/base/Icon.vue +597 -0
- package/src/shared/ui/base/StatusIndicator.vue +44 -0
- package/src/shared/ui/base/index.ts +7 -0
- package/src/shared/ui/cards/InviteCard.vue +47 -0
- package/src/shared/ui/cards/index.ts +2 -0
- package/src/shared/ui/dialog/Dialog.vue +71 -0
- package/src/shared/ui/dialog/DialogContent.vue +31 -0
- package/src/shared/ui/dialog/DialogFooter.vue +14 -0
- package/src/shared/ui/dialog/DialogHeader.vue +41 -0
- package/src/shared/ui/dialog/index.ts +5 -0
- package/src/shared/ui/editors/AttachmentImagesEditor.vue +133 -0
- package/src/shared/ui/editors/ContentAttachmentsDisplay.vue +76 -0
- package/src/shared/ui/editors/MarkdownEditor.vue +956 -0
- package/src/shared/ui/editors/MarkdownRenderer.vue +299 -0
- package/src/shared/ui/editors/RichContentImageViewer.vue +85 -0
- package/src/shared/ui/editors/SocialPostMediaZone.vue +320 -0
- package/src/shared/ui/editors/index.ts +6 -0
- package/src/shared/ui/editors/markdown-editor-gallery.ts +234 -0
- package/src/shared/ui/editors/markdown-editor-image.ts +178 -0
- package/src/shared/ui/form/Checkbox.vue +38 -0
- package/src/shared/ui/form/FormField.vue +30 -0
- package/src/shared/ui/form/FormGrid.vue +38 -0
- package/src/shared/ui/form/ImageEditor.vue +598 -0
- package/src/shared/ui/form/Input.vue +72 -0
- package/src/shared/ui/form/Range.vue +65 -0
- package/src/shared/ui/form/Select.vue +76 -0
- package/src/shared/ui/form/Switch.vue +38 -0
- package/src/shared/ui/form/Textarea.vue +144 -0
- package/src/shared/ui/form/index.ts +9 -0
- package/src/shared/ui/index.ts +9 -0
- package/src/shared/ui/layout/BusyOverlay.vue +31 -0
- package/src/shared/ui/layout/Callout.vue +44 -0
- package/src/shared/ui/layout/Card.vue +38 -0
- package/src/shared/ui/layout/Container.vue +36 -0
- package/src/shared/ui/layout/EmptyState.vue +99 -0
- package/src/shared/ui/layout/EntityMediaRow.vue +54 -0
- package/src/shared/ui/layout/FilterResultsLayout.vue +22 -0
- package/src/shared/ui/layout/FloatingPanel.vue +37 -0
- package/src/shared/ui/layout/FullscreenDimmer.vue +11 -0
- package/src/shared/ui/layout/Grid.vue +40 -0
- package/src/shared/ui/layout/Inline.vue +59 -0
- package/src/shared/ui/layout/LoadingState.vue +39 -0
- package/src/shared/ui/layout/MediaBox.vue +47 -0
- package/src/shared/ui/layout/OverlayPanel.vue +28 -0
- package/src/shared/ui/layout/OverlayWaitPanel.vue +22 -0
- package/src/shared/ui/layout/PageSection.vue +43 -0
- package/src/shared/ui/layout/PageToolbar.vue +29 -0
- package/src/shared/ui/layout/Panel.vue +39 -0
- package/src/shared/ui/layout/ProgressBar.vue +49 -0
- package/src/shared/ui/layout/Section.vue +30 -0
- package/src/shared/ui/layout/SegmentedControl.vue +43 -0
- package/src/shared/ui/layout/SelectableCard.vue +46 -0
- package/src/shared/ui/layout/SelectableRow.vue +41 -0
- package/src/shared/ui/layout/Skeleton.vue +25 -0
- package/src/shared/ui/layout/SkeletonAvatar.vue +30 -0
- package/src/shared/ui/layout/SkeletonEntityCard.vue +20 -0
- package/src/shared/ui/layout/SkeletonFeedPost.vue +22 -0
- package/src/shared/ui/layout/SkeletonGrid.vue +18 -0
- package/src/shared/ui/layout/SkeletonListRow.vue +31 -0
- package/src/shared/ui/layout/SkeletonText.vue +25 -0
- package/src/shared/ui/layout/Stack.vue +42 -0
- package/src/shared/ui/layout/StateBlock.vue +44 -0
- package/src/shared/ui/layout/TwoPaneLayout.vue +35 -0
- package/src/shared/ui/layout/VirtualList.vue +160 -0
- package/src/shared/ui/layout/index.ts +35 -0
- package/src/shared/ui/layout/skeletonSurfaceStyles.ts +24 -0
- package/src/shared/ui/navigation/NavItem.vue +139 -0
- package/src/shared/ui/navigation/Tab.vue +61 -0
- package/src/shared/ui/navigation/Tabs.vue +37 -0
- package/src/shared/ui/navigation/index.ts +4 -0
- package/src/shared/ui/primitives/Action.vue +19 -0
- package/src/shared/ui/primitives/Block.vue +28 -0
- package/src/shared/ui/primitives/CanvasView.vue +19 -0
- package/src/shared/ui/primitives/Control.vue +24 -0
- package/src/shared/ui/primitives/ControlSelect.vue +19 -0
- package/src/shared/ui/primitives/ControlTextarea.vue +17 -0
- package/src/shared/ui/primitives/FieldLabel.vue +19 -0
- package/src/shared/ui/primitives/Form.vue +19 -0
- package/src/shared/ui/primitives/Heading.vue +29 -0
- package/src/shared/ui/primitives/Image.vue +17 -0
- package/src/shared/ui/primitives/LineBreak.vue +3 -0
- package/src/shared/ui/primitives/Link.vue +19 -0
- package/src/shared/ui/primitives/List.vue +28 -0
- package/src/shared/ui/primitives/ListItem.vue +19 -0
- package/src/shared/ui/primitives/OptionItem.vue +19 -0
- package/src/shared/ui/primitives/Text.vue +28 -0
- package/src/shared/ui/primitives/VideoView.vue +19 -0
- package/src/shared/ui/primitives/index.ts +19 -0
- package/src/shared/ui/primitives/resolveElement.ts +25 -0
- package/src/shared/ui/special/AngularAccent.vue +106 -0
- package/src/shared/ui/special/ExtensionRegistrySlotButton.vue +143 -0
- package/src/shared/ui/special/InfoRow.vue +39 -0
- package/src/shared/ui/special/LogViewer.vue +53 -0
- package/src/shared/ui/special/PageHeader.vue +23 -0
- package/src/shared/ui/special/RegistrySlotMissingCallout.vue +48 -0
- package/src/shared/ui/special/WelcomeCard.vue +32 -0
- package/src/shared/ui/special/index.ts +9 -0
- package/src/shared/utils/app-paths.ts +50 -0
- package/src/shared/utils/attachments.ts +16 -0
- package/src/shared/utils/autostart.ts +213 -0
- package/src/shared/utils/build-files.ts +439 -0
- package/src/shared/utils/build-manifest-init.ts +176 -0
- package/src/shared/utils/cloudinary.ts +67 -0
- package/src/shared/utils/cn.ts +7 -0
- package/src/shared/utils/download-stats-week.ts +165 -0
- package/src/shared/utils/entity-api-to-cache.ts +84 -0
- package/src/shared/utils/entity-build-from-api.ts +1 -0
- package/src/shared/utils/entity-display.ts +27 -0
- package/src/shared/utils/entity-map-from-api.ts +1 -0
- package/src/shared/utils/file-hash.ts +65 -0
- package/src/shared/utils/formatSize.ts +5 -0
- package/src/shared/utils/formatTime.ts +157 -0
- package/src/shared/utils/getAccountSkinRender.ts +32 -0
- package/src/shared/utils/index.ts +34 -0
- package/src/shared/utils/local-mods.ts +678 -0
- package/src/shared/utils/local-settings.ts +217 -0
- package/src/shared/utils/member-join-stats.ts +35 -0
- package/src/shared/utils/platform.ts +86 -0
- package/src/shared/utils/play-host-slug.ts +92 -0
- package/src/shared/utils/rich-content.ts +294 -0
- package/src/shared/utils/safeRequest.ts +23 -0
- package/src/shared/utils/semver.ts +81 -0
- package/src/shared/utils/serverPermissions.ts +155 -0
- package/src/shared/utils/skin-render-cache.ts +372 -0
- package/src/shared/utils/stripMarkdown.ts +45 -0
- package/src/shared/utils/transliterate.ts +74 -0
- package/src/shared/utils/updateAccountSkinRender.ts +64 -0
- package/src/shared/utils/updater.ts +218 -0
- package/src/shared/utils/uploadImage.ts +195 -0
- package/src/shared/utils/user-status.ts +9 -0
- package/src/tiptap/index.ts +7 -0
- package/tsconfig.json +13 -0
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Содержимое `Invite.config` для лаунчер-инвайтов — тот же shape, что payload
|
|
3
|
+
* специальных сообщений чата (`sendMessageRaw` / `Message.vue`).
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
export type InvitePayloadInviteServer = {
|
|
7
|
+
type: 'invite_server';
|
|
8
|
+
serverId: string;
|
|
9
|
+
name: string;
|
|
10
|
+
image: string;
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type InvitePayloadBuild = {
|
|
14
|
+
type: 'build';
|
|
15
|
+
buildId: string;
|
|
16
|
+
name: string;
|
|
17
|
+
image: string;
|
|
18
|
+
minecraftVersion: string;
|
|
19
|
+
version?: string;
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
export type InvitePayloadMap = {
|
|
23
|
+
type: 'map';
|
|
24
|
+
mapId: string;
|
|
25
|
+
name: string;
|
|
26
|
+
image: string;
|
|
27
|
+
minecraftVersion?: string;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
export type InvitePayloadLocalBuild = {
|
|
31
|
+
type: 'local_build';
|
|
32
|
+
/** Полный манифест, как в чате (размер ограничивается тем же путём, что и сообщения). */
|
|
33
|
+
manifest: Record<string, unknown>;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
export type InvitePayloadRequestJoinLocal = {
|
|
37
|
+
type: 'request_join_local';
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/** Локальная сборка + адрес play-туннеля для присоединения к открытому миру. */
|
|
41
|
+
export type InvitePayloadLocalGame = {
|
|
42
|
+
type: 'local_game';
|
|
43
|
+
manifest: Record<string, unknown>;
|
|
44
|
+
name: string;
|
|
45
|
+
image?: string;
|
|
46
|
+
minecraftVersion: string;
|
|
47
|
+
localServer: {
|
|
48
|
+
host: string;
|
|
49
|
+
port: number;
|
|
50
|
+
hostManifestUuid?: string;
|
|
51
|
+
};
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
export type InviteLauncherConfigPayload =
|
|
55
|
+
| InvitePayloadInviteServer
|
|
56
|
+
| InvitePayloadBuild
|
|
57
|
+
| InvitePayloadMap
|
|
58
|
+
| InvitePayloadLocalBuild
|
|
59
|
+
| InvitePayloadRequestJoinLocal
|
|
60
|
+
| InvitePayloadLocalGame;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { ComputedRef, Ref } from 'vue';
|
|
2
|
+
|
|
3
|
+
export interface NavigationSection {
|
|
4
|
+
link: string;
|
|
5
|
+
label: string;
|
|
6
|
+
icon: string;
|
|
7
|
+
/** Бейдж для пункта меню (в т.ч. из расширений). */
|
|
8
|
+
badgeCount?: Ref<number> | ComputedRef<number>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export interface MenuItem {
|
|
12
|
+
id: string;
|
|
13
|
+
label: string;
|
|
14
|
+
icon: string;
|
|
15
|
+
}
|
|
16
|
+
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
export type RunningBuildStatus =
|
|
2
|
+
| 'preparing'
|
|
3
|
+
| 'downloading'
|
|
4
|
+
| 'launching'
|
|
5
|
+
| 'running'
|
|
6
|
+
| 'stopping'
|
|
7
|
+
| 'cancelled'
|
|
8
|
+
| 'error'
|
|
9
|
+
| 'completed';
|
|
10
|
+
|
|
11
|
+
export type RunningBuildPipelineStageStatus = 'pending' | 'running' | 'success' | 'error' | 'cancelled';
|
|
12
|
+
|
|
13
|
+
export interface RunningBuildPipelineStage {
|
|
14
|
+
key: string;
|
|
15
|
+
title: string;
|
|
16
|
+
status: RunningBuildPipelineStageStatus;
|
|
17
|
+
progress: {
|
|
18
|
+
current: number;
|
|
19
|
+
total: number;
|
|
20
|
+
text?: string;
|
|
21
|
+
};
|
|
22
|
+
logs: string[];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export type RunningBuildTunnelState =
|
|
26
|
+
| 'off'
|
|
27
|
+
| 'connecting'
|
|
28
|
+
| 'connected'
|
|
29
|
+
| 'error';
|
|
30
|
+
|
|
31
|
+
export interface RunningBuild {
|
|
32
|
+
/** Локальный id сборки в runningBuildsMap */
|
|
33
|
+
buildId: string;
|
|
34
|
+
uuid: string;
|
|
35
|
+
name: string;
|
|
36
|
+
version: string;
|
|
37
|
+
playTime: string;
|
|
38
|
+
status: RunningBuildStatus;
|
|
39
|
+
image?: string;
|
|
40
|
+
logs?: string[];
|
|
41
|
+
canStop?: boolean;
|
|
42
|
+
error?: string;
|
|
43
|
+
pipeline?: RunningBuildPipelineStage[];
|
|
44
|
+
currentStageKey?: string;
|
|
45
|
+
/** Порт integrated server из логов Minecraft */
|
|
46
|
+
lanPort?: number;
|
|
47
|
+
shareForFriends?: boolean;
|
|
48
|
+
tunnelState?: RunningBuildTunnelState;
|
|
49
|
+
tunnelError?: string;
|
|
50
|
+
}
|
|
51
|
+
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type ServerMemberRole = 'player' | 'moderator' | 'admin';
|
|
2
|
+
|
|
3
|
+
export interface ServerMember {
|
|
4
|
+
id: string;
|
|
5
|
+
user: {
|
|
6
|
+
id: string;
|
|
7
|
+
username: string;
|
|
8
|
+
avatar?: string;
|
|
9
|
+
};
|
|
10
|
+
role: ServerMemberRole;
|
|
11
|
+
joinedAt: string;
|
|
12
|
+
invitedBy?: {
|
|
13
|
+
id: string;
|
|
14
|
+
username: string;
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export type UserStatus = 'online' | 'offline' | 'away' | 'busy';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Детали статуса пользователя: во что играет (сборка или сервер) или пусто.
|
|
5
|
+
* В API приходит как JSON; пустой объект или отсутствие = null.
|
|
6
|
+
*/
|
|
7
|
+
export type UserStatusDetail = UserStatusDetailBuild | UserStatusDetailServer | null;
|
|
8
|
+
|
|
9
|
+
/** Играет в сборку (локальную или облачную) */
|
|
10
|
+
export interface UserStatusDetailBuild {
|
|
11
|
+
type: 'build';
|
|
12
|
+
/** URL изображения сборки */
|
|
13
|
+
image?: string;
|
|
14
|
+
/** Название сборки */
|
|
15
|
+
name: string;
|
|
16
|
+
/** Версия Minecraft */
|
|
17
|
+
minecraftVersion: string;
|
|
18
|
+
/** Время начала игры (ISO 8601) */
|
|
19
|
+
startedAt: string;
|
|
20
|
+
/** Публичный ID сборки (только для публичных облачных; у приватных и локальных нет) */
|
|
21
|
+
buildId?: string;
|
|
22
|
+
/** Локальная пользовательская сборка — друзья могут запросить присоединение без buildId */
|
|
23
|
+
local?: boolean;
|
|
24
|
+
/** Хост включил «Для друзей» и туннель активен */
|
|
25
|
+
shareForFriends?: boolean;
|
|
26
|
+
/** Публичный адрес локального integrated server для друзей */
|
|
27
|
+
localServer?: {
|
|
28
|
+
host: string;
|
|
29
|
+
port: number;
|
|
30
|
+
localPort?: number;
|
|
31
|
+
/** UUID сборки хоста — друг ищет совпадение локально */
|
|
32
|
+
hostManifestUuid?: string;
|
|
33
|
+
};
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
/** Играет на сервере */
|
|
37
|
+
export interface UserStatusDetailServer {
|
|
38
|
+
type: 'server';
|
|
39
|
+
/** URL изображения сервера */
|
|
40
|
+
image?: string;
|
|
41
|
+
/** Название сервера */
|
|
42
|
+
name: string;
|
|
43
|
+
/** Время начала игры (ISO 8601) */
|
|
44
|
+
startedAt: string;
|
|
45
|
+
/** ID сервера (только для публичных; у приватных нет) */
|
|
46
|
+
serverId?: string;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
export interface User {
|
|
50
|
+
username: string;
|
|
51
|
+
avatar?: string;
|
|
52
|
+
status: UserStatus;
|
|
53
|
+
level: number;
|
|
54
|
+
}
|
|
55
|
+
|
|
@@ -0,0 +1,262 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div :class="avatarClasses" :style="avatarMergedStyle">
|
|
3
|
+
<!-- Minecraft голова из скина -->
|
|
4
|
+
<template v-if="skin">
|
|
5
|
+
<!-- Слой 1: Лицо -->
|
|
6
|
+
<div
|
|
7
|
+
:class="[
|
|
8
|
+
'w-full h-full absolute inset-0 rounded',
|
|
9
|
+
rounded ? 'rounded-full' : '',
|
|
10
|
+
]"
|
|
11
|
+
:style="{
|
|
12
|
+
backgroundImage: `url(${skin})`,
|
|
13
|
+
backgroundSize: '800%',
|
|
14
|
+
backgroundPosition: '14.28% 14.28%',
|
|
15
|
+
backgroundRepeat: 'no-repeat',
|
|
16
|
+
'image-rendering': 'pixelated',
|
|
17
|
+
}"
|
|
18
|
+
/>
|
|
19
|
+
<!-- Слой 2: Шлем -->
|
|
20
|
+
<div
|
|
21
|
+
:class="[
|
|
22
|
+
'w-full h-full absolute inset-0 rounded',
|
|
23
|
+
rounded ? 'rounded-full' : '',
|
|
24
|
+
]"
|
|
25
|
+
:style="{
|
|
26
|
+
backgroundImage: `url(${skin})`,
|
|
27
|
+
backgroundSize: '800%',
|
|
28
|
+
backgroundPosition: '71.42% 14.28%',
|
|
29
|
+
backgroundRepeat: 'no-repeat',
|
|
30
|
+
'image-rendering': 'pixelated',
|
|
31
|
+
}"
|
|
32
|
+
/>
|
|
33
|
+
</template>
|
|
34
|
+
<!-- Обычный аватар -->
|
|
35
|
+
<div
|
|
36
|
+
v-else-if="src"
|
|
37
|
+
:class="[
|
|
38
|
+
'w-full h-full rounded border-zinc-400',
|
|
39
|
+
rounded ? 'rounded-full' : '',
|
|
40
|
+
]"
|
|
41
|
+
:style="{
|
|
42
|
+
backgroundImage: `url(${src})`,
|
|
43
|
+
backgroundSize: 'cover',
|
|
44
|
+
backgroundPosition: 'center',
|
|
45
|
+
backgroundRepeat: 'no-repeat',
|
|
46
|
+
}"
|
|
47
|
+
/>
|
|
48
|
+
<!-- Сокращённое наименование из title -->
|
|
49
|
+
<div
|
|
50
|
+
v-else-if="title"
|
|
51
|
+
:class="[
|
|
52
|
+
'w-full h-full flex items-center justify-center text-primary-foreground font-semibold rounded',
|
|
53
|
+
rounded ? 'rounded-full' : '',
|
|
54
|
+
]"
|
|
55
|
+
>
|
|
56
|
+
<span :class="titleTextSize">{{ initials }}</span>
|
|
57
|
+
</div>
|
|
58
|
+
<div
|
|
59
|
+
v-else
|
|
60
|
+
:class="[
|
|
61
|
+
'w-full h-full flex items-center justify-center rounded',
|
|
62
|
+
rounded ? 'rounded-full' : '',
|
|
63
|
+
]"
|
|
64
|
+
>
|
|
65
|
+
<slot>
|
|
66
|
+
<Icon name="user" :size="iconSize" class="text-primary-foreground" />
|
|
67
|
+
</slot>
|
|
68
|
+
</div>
|
|
69
|
+
</div>
|
|
70
|
+
</template>
|
|
71
|
+
|
|
72
|
+
<script setup lang="ts">
|
|
73
|
+
import { computed } from 'vue';
|
|
74
|
+
import { cn } from '../../utils/cn';
|
|
75
|
+
import Icon from './Icon.vue';
|
|
76
|
+
|
|
77
|
+
interface Props {
|
|
78
|
+
src?: string;
|
|
79
|
+
skin?: string; // URL скина Minecraft для отображения головы
|
|
80
|
+
size?: 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
|
|
81
|
+
status?: 'online' | 'offline';
|
|
82
|
+
angular?: boolean;
|
|
83
|
+
rounded?: boolean;
|
|
84
|
+
title?: string; // Текст для отображения инициалов
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
88
|
+
size: 'md',
|
|
89
|
+
angular: true,
|
|
90
|
+
rounded: false,
|
|
91
|
+
});
|
|
92
|
+
|
|
93
|
+
/** Размеры инлайном: утилиты w-* из SDK могут отсутствовать в билде; xxl был с опечаткой w-42. */
|
|
94
|
+
const avatarBoxPx = {
|
|
95
|
+
sm: '1.5rem',
|
|
96
|
+
md: '2rem',
|
|
97
|
+
lg: '2.5rem',
|
|
98
|
+
xl: '3rem',
|
|
99
|
+
xxl: '8.5rem',
|
|
100
|
+
} as const satisfies Record<NonNullable<Props['size']>, string>;
|
|
101
|
+
|
|
102
|
+
const avatarBoxStyle = computed(() => {
|
|
103
|
+
const s = avatarBoxPx[props.size];
|
|
104
|
+
return {
|
|
105
|
+
width: s,
|
|
106
|
+
height: s,
|
|
107
|
+
minWidth: s,
|
|
108
|
+
minHeight: s,
|
|
109
|
+
flexShrink: 0,
|
|
110
|
+
boxSizing: 'border-box' as const,
|
|
111
|
+
};
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
const avatarMergedStyle = computed(() => ({
|
|
115
|
+
...avatarGradientStyle.value,
|
|
116
|
+
...avatarBoxStyle.value,
|
|
117
|
+
}));
|
|
118
|
+
|
|
119
|
+
const iconSizeMap = {
|
|
120
|
+
sm: 'xs',
|
|
121
|
+
md: 'sm',
|
|
122
|
+
lg: 'md',
|
|
123
|
+
xl: 'lg',
|
|
124
|
+
xxl: 'xxl',
|
|
125
|
+
} as const;
|
|
126
|
+
|
|
127
|
+
const avatarClasses = computed(() => {
|
|
128
|
+
return cn(
|
|
129
|
+
'relative overflow-hidden rounded',
|
|
130
|
+
props.rounded && 'rounded-full',
|
|
131
|
+
!props.src &&
|
|
132
|
+
!props.skin &&
|
|
133
|
+
!props.title &&
|
|
134
|
+
'bg-gradient-to-br from-primary to-accent-secondary',
|
|
135
|
+
);
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
const iconSize = computed(() => iconSizeMap[props.size]);
|
|
139
|
+
|
|
140
|
+
// Палитра красивых градиентов для аватаров (RGB значения из Tailwind)
|
|
141
|
+
const gradientPalette = [
|
|
142
|
+
{ from: 'rgb(99, 102, 241)', to: 'rgb(147, 51, 234)' }, // indigo-500 to purple-600
|
|
143
|
+
{ from: 'rgb(59, 130, 246)', to: 'rgb(6, 182, 212)' }, // blue-500 to cyan-500
|
|
144
|
+
{ from: 'rgb(236, 72, 153)', to: 'rgb(244, 63, 94)' }, // pink-500 to rose-500
|
|
145
|
+
{ from: 'rgb(16, 185, 129)', to: 'rgb(20, 184, 166)' }, // emerald-500 to teal-500
|
|
146
|
+
{ from: 'rgb(245, 158, 11)', to: 'rgb(249, 115, 22)' }, // amber-500 to orange-500
|
|
147
|
+
{ from: 'rgb(139, 92, 246)', to: 'rgb(217, 70, 239)' }, // violet-500 to fuchsia-500
|
|
148
|
+
{ from: 'rgb(239, 68, 68)', to: 'rgb(236, 72, 153)' }, // red-500 to pink-500
|
|
149
|
+
{ from: 'rgb(34, 197, 94)', to: 'rgb(16, 185, 129)' }, // green-500 to emerald-500
|
|
150
|
+
{ from: 'rgb(234, 179, 8)', to: 'rgb(245, 158, 11)' }, // yellow-500 to amber-500
|
|
151
|
+
{ from: 'rgb(37, 99, 235)', to: 'rgb(79, 70, 229)' }, // blue-600 to indigo-600
|
|
152
|
+
{ from: 'rgb(168, 85, 247)', to: 'rgb(236, 72, 153)' }, // purple-500 to pink-500
|
|
153
|
+
{ from: 'rgb(6, 182, 212)', to: 'rgb(59, 130, 246)' }, // cyan-500 to blue-500
|
|
154
|
+
{ from: 'rgb(20, 184, 166)', to: 'rgb(34, 197, 94)' }, // teal-500 to green-500
|
|
155
|
+
{ from: 'rgb(249, 115, 22)', to: 'rgb(239, 68, 68)' }, // orange-500 to red-500
|
|
156
|
+
{ from: 'rgb(244, 63, 94)', to: 'rgb(236, 72, 153)' }, // rose-500 to pink-500
|
|
157
|
+
{ from: 'rgb(14, 165, 233)', to: 'rgb(59, 130, 246)' }, // sky-500 to blue-500
|
|
158
|
+
];
|
|
159
|
+
|
|
160
|
+
// Простая хеш-функция для генерации числа из строки
|
|
161
|
+
const hashString = (str: string): number => {
|
|
162
|
+
let hash = 0;
|
|
163
|
+
for (let i = 0; i < str.length; i++) {
|
|
164
|
+
const char = str.charCodeAt(i);
|
|
165
|
+
hash = (hash << 5) - hash + char;
|
|
166
|
+
hash = hash & hash; // Конвертируем в 32-битное число
|
|
167
|
+
}
|
|
168
|
+
return Math.abs(hash);
|
|
169
|
+
};
|
|
170
|
+
|
|
171
|
+
// Генерируем градиент на основе title
|
|
172
|
+
const avatarGradientStyle = computed(() => {
|
|
173
|
+
if (props.src || props.skin || !props.title) {
|
|
174
|
+
return {};
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
const hash = hashString(props.title);
|
|
178
|
+
const gradientIndex = hash % gradientPalette.length;
|
|
179
|
+
const gradient = gradientPalette[gradientIndex];
|
|
180
|
+
|
|
181
|
+
return {
|
|
182
|
+
background: `linear-gradient(to bottom right, ${gradient.from}, ${gradient.to})`,
|
|
183
|
+
};
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
// Функция для получения инициалов из title
|
|
187
|
+
const getInitials = (text: string): string => {
|
|
188
|
+
if (!text) return '';
|
|
189
|
+
|
|
190
|
+
const trimmed = text.trim();
|
|
191
|
+
if (!trimmed) return '';
|
|
192
|
+
|
|
193
|
+
// 1. По пробелу (если есть минимум 2 слова - первые буквы)
|
|
194
|
+
const words = trimmed.split(/\s+/).filter((w) => w.length > 0);
|
|
195
|
+
if (words.length >= 2) {
|
|
196
|
+
const first = words[0][0] || '';
|
|
197
|
+
const second = words[1][0] || '';
|
|
198
|
+
if (first && second) {
|
|
199
|
+
return (first + second).toUpperCase();
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
// 2. По "-"
|
|
204
|
+
const dashParts = trimmed.split('-').filter((p) => p.length > 0);
|
|
205
|
+
if (dashParts.length >= 2) {
|
|
206
|
+
const first = dashParts[0][0] || '';
|
|
207
|
+
const second = dashParts[1][0] || '';
|
|
208
|
+
if (first && second) {
|
|
209
|
+
return (first + second).toUpperCase();
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// 3. По "_"
|
|
214
|
+
const underscoreParts = trimmed.split('_').filter((p) => p.length > 0);
|
|
215
|
+
if (underscoreParts.length >= 2) {
|
|
216
|
+
const first = underscoreParts[0][0] || '';
|
|
217
|
+
const second = underscoreParts[1][0] || '';
|
|
218
|
+
if (first && second) {
|
|
219
|
+
return (first + second).toUpperCase();
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// 4. По CamelCase (заглавные буквы) - ищем заглавные буквы
|
|
224
|
+
const camelCaseMatches = trimmed.match(/[A-ZА-ЯЁ]/g);
|
|
225
|
+
if (camelCaseMatches && camelCaseMatches.length >= 2) {
|
|
226
|
+
return camelCaseMatches.slice(0, 2).join('').toUpperCase();
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Если есть хотя бы одна заглавная буква, берем её и следующую букву после неё
|
|
230
|
+
const firstCapital = trimmed.match(/[A-ZА-ЯЁ]/);
|
|
231
|
+
if (firstCapital && firstCapital.index !== undefined) {
|
|
232
|
+
const index = firstCapital.index;
|
|
233
|
+
if (index + 1 < trimmed.length) {
|
|
234
|
+
return (trimmed[index] + trimmed[index + 1]).toUpperCase();
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// 5. В крайнем случае первые 2 символа
|
|
239
|
+
if (trimmed.length >= 2) {
|
|
240
|
+
return trimmed.substring(0, 2).toUpperCase();
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// Если только один символ, возвращаем его
|
|
244
|
+
return trimmed.substring(0, 1).toUpperCase();
|
|
245
|
+
};
|
|
246
|
+
|
|
247
|
+
const initials = computed(() => {
|
|
248
|
+
if (!props.title) return '';
|
|
249
|
+
return getInitials(props.title);
|
|
250
|
+
});
|
|
251
|
+
|
|
252
|
+
const titleTextSize = computed(() => {
|
|
253
|
+
const sizeMap = {
|
|
254
|
+
sm: 'text-xs',
|
|
255
|
+
md: 'text-sm',
|
|
256
|
+
lg: 'text-base',
|
|
257
|
+
xl: 'text-lg',
|
|
258
|
+
xxl: 'text-4xl',
|
|
259
|
+
};
|
|
260
|
+
return sizeMap[props.size];
|
|
261
|
+
});
|
|
262
|
+
</script>
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<span :class="badgeClasses" :style="angularStyle">
|
|
3
|
+
<slot />
|
|
4
|
+
</span>
|
|
5
|
+
</template>
|
|
6
|
+
|
|
7
|
+
<script setup lang="ts">
|
|
8
|
+
import { computed } from 'vue';
|
|
9
|
+
import { cn } from '../../utils/cn';
|
|
10
|
+
|
|
11
|
+
interface Props {
|
|
12
|
+
variant?: 'default' | 'success' | 'warning' | 'error' | 'info';
|
|
13
|
+
size?: 'sm' | 'md';
|
|
14
|
+
angular?: boolean;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
18
|
+
variant: 'default',
|
|
19
|
+
size: 'md',
|
|
20
|
+
angular: false,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
const badgeClasses = computed(() => {
|
|
24
|
+
const baseClasses = 'inline-flex items-center font-medium';
|
|
25
|
+
|
|
26
|
+
const variantClasses = {
|
|
27
|
+
default: 'bg-muted text-muted-foreground',
|
|
28
|
+
success: 'bg-success/15 text-success',
|
|
29
|
+
warning: 'bg-warning/15 text-warning',
|
|
30
|
+
error: 'bg-destructive/15 text-destructive',
|
|
31
|
+
info: 'bg-accent-secondary/18 text-accent-secondary',
|
|
32
|
+
};
|
|
33
|
+
|
|
34
|
+
const sizeClasses = {
|
|
35
|
+
sm: 'px-1.5 py-0.5 text-xs',
|
|
36
|
+
md: 'px-2 py-0.5 text-xs',
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
return cn(baseClasses, variantClasses[props.variant], sizeClasses[props.size]);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const angularStyle = computed(() => {
|
|
43
|
+
// Убрали clip-path для бейджей
|
|
44
|
+
return '';
|
|
45
|
+
});
|
|
46
|
+
</script>
|
|
47
|
+
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<button
|
|
3
|
+
:class="buttonClasses"
|
|
4
|
+
:style="angularStyle"
|
|
5
|
+
:disabled="disabled"
|
|
6
|
+
@click="$emit('click', $event)"
|
|
7
|
+
>
|
|
8
|
+
<slot />
|
|
9
|
+
</button>
|
|
10
|
+
</template>
|
|
11
|
+
|
|
12
|
+
<script setup lang="ts">
|
|
13
|
+
import { computed } from 'vue';
|
|
14
|
+
import { cn } from '../../utils/cn';
|
|
15
|
+
|
|
16
|
+
interface Props {
|
|
17
|
+
variant?:
|
|
18
|
+
| 'primary'
|
|
19
|
+
| 'secondary'
|
|
20
|
+
| 'danger'
|
|
21
|
+
| 'ghost'
|
|
22
|
+
| 'success'
|
|
23
|
+
| 'warning'
|
|
24
|
+
/** Только базовый layout без rnt-btn-* цветов (под утилиты вроде активного звонка в сайдбаре). */
|
|
25
|
+
| 'plain';
|
|
26
|
+
size?: 'sm' | 'md' | 'lg';
|
|
27
|
+
angular?: boolean;
|
|
28
|
+
disabled?: boolean;
|
|
29
|
+
fullWidth?: boolean;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
33
|
+
variant: 'primary',
|
|
34
|
+
size: 'md',
|
|
35
|
+
angular: true,
|
|
36
|
+
disabled: false,
|
|
37
|
+
fullWidth: false,
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
const emit = defineEmits<{
|
|
41
|
+
click: [event: MouseEvent];
|
|
42
|
+
}>();
|
|
43
|
+
|
|
44
|
+
const buttonClasses = computed(() => {
|
|
45
|
+
const baseClasses =
|
|
46
|
+
'relative overflow-hidden transition-all duration-200 flex items-center justify-center rounded gap-1.5 cursor-pointer';
|
|
47
|
+
|
|
48
|
+
const variantClasses = {
|
|
49
|
+
primary: 'rnt-btn-primary',
|
|
50
|
+
secondary: 'rnt-btn-secondary',
|
|
51
|
+
danger: 'rnt-btn-danger',
|
|
52
|
+
ghost: 'rnt-btn-ghost',
|
|
53
|
+
success: 'rnt-btn-success',
|
|
54
|
+
warning: 'rnt-btn-warning',
|
|
55
|
+
plain: '',
|
|
56
|
+
};
|
|
57
|
+
|
|
58
|
+
const sizeClasses = {
|
|
59
|
+
sm: 'px-2 py-1 text-xs',
|
|
60
|
+
md: 'px-3 py-1.5 text-xs',
|
|
61
|
+
lg: 'px-4 py-2 text-sm',
|
|
62
|
+
};
|
|
63
|
+
|
|
64
|
+
return cn(
|
|
65
|
+
baseClasses,
|
|
66
|
+
variantClasses[props.variant],
|
|
67
|
+
sizeClasses[props.size],
|
|
68
|
+
props.disabled && 'opacity-50 cursor-not-allowed',
|
|
69
|
+
props.fullWidth && 'w-full',
|
|
70
|
+
props.variant === 'primary' && props.angular && 'group/btn',
|
|
71
|
+
);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
const angularStyle = computed(() => {
|
|
75
|
+
// Убрали clip-path для кнопок
|
|
76
|
+
return {};
|
|
77
|
+
});
|
|
78
|
+
</script>
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div :class="dividerClasses" :style="angularStyle" />
|
|
3
|
+
</template>
|
|
4
|
+
|
|
5
|
+
<script setup lang="ts">
|
|
6
|
+
import { computed } from 'vue';
|
|
7
|
+
import { cn } from '../../utils/cn';
|
|
8
|
+
|
|
9
|
+
interface Props {
|
|
10
|
+
variant?: 'default' | 'gradient';
|
|
11
|
+
size?: 'sm' | 'md' | 'lg';
|
|
12
|
+
orientation?: 'horizontal' | 'vertical';
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const props = withDefaults(defineProps<Props>(), {
|
|
16
|
+
variant: 'gradient',
|
|
17
|
+
size: 'md',
|
|
18
|
+
orientation: 'horizontal',
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
const sizeMap = {
|
|
22
|
+
sm: props.orientation === 'horizontal' ? 'h-[1px] w-6' : 'w-[1px] h-6',
|
|
23
|
+
md: props.orientation === 'horizontal' ? 'h-[2px] w-8' : 'w-[2px] h-8',
|
|
24
|
+
lg: props.orientation === 'horizontal' ? 'h-[2px] w-12' : 'w-[2px] h-12',
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
const variantClasses = {
|
|
28
|
+
default: 'bg-border',
|
|
29
|
+
gradient: 'bg-gradient-to-r from-transparent via-primary/70 to-transparent',
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const dividerClasses = computed(() => {
|
|
33
|
+
return cn(sizeMap[props.size], variantClasses[props.variant]);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
const angularStyle = computed(() => {
|
|
37
|
+
return {};
|
|
38
|
+
});
|
|
39
|
+
</script>
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|