@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.
Files changed (332) hide show
  1. package/README.md +122 -0
  2. package/REGISTRIES.md +189 -0
  3. package/env.d.ts +11 -0
  4. package/host-shims.d.ts +30 -0
  5. package/package.json +88 -0
  6. package/src/extension-marketplace/api-types.ts +141 -0
  7. package/src/extension-marketplace/client.ts +296 -0
  8. package/src/extension-marketplace/index.ts +22 -0
  9. package/src/extension-marketplace/schemas.ts +178 -0
  10. package/src/extensions/ExtensionRoutePage.vue +17 -0
  11. package/src/extensions/context.ts +37 -0
  12. package/src/extensions/disabled-folder.ts +21 -0
  13. package/src/extensions/extension-expose-map.ts +5 -0
  14. package/src/extensions/extension-expose.ts +48 -0
  15. package/src/extensions/graph.ts +67 -0
  16. package/src/extensions/index.ts +251 -0
  17. package/src/extensions/invite-handler/types.ts +20 -0
  18. package/src/extensions/launcher-entities/create-launcher-entity.ts +25 -0
  19. package/src/extensions/launcher-entities/keys.ts +46 -0
  20. package/src/extensions/launcher-entities/launcher-entity-components.ts +177 -0
  21. package/src/extensions/launcher-entities/props-map.ts +69 -0
  22. package/src/extensions/launcher-entities/registry.ts +32 -0
  23. package/src/extensions/launcher-models/apis/accounts-contracts.ts +102 -0
  24. package/src/extensions/launcher-models/apis/launcher-model-apis.ts +553 -0
  25. package/src/extensions/launcher-models/keys.ts +23 -0
  26. package/src/extensions/launcher-models/public.ts +9 -0
  27. package/src/extensions/launcher-models/registry-core.ts +34 -0
  28. package/src/extensions/manifest-types.ts +22 -0
  29. package/src/extensions/manifest.ts +46 -0
  30. package/src/extensions/marketplace-open-key.ts +26 -0
  31. package/src/extensions/plugin-types.ts +44 -0
  32. package/src/extensions/plugin.ts +62 -0
  33. package/src/extensions/registries/bootstrap.ts +11 -0
  34. package/src/extensions/registries/builtins/account-provider.ts +6 -0
  35. package/src/extensions/registries/builtins/app-topbar-left-widgets.ts +6 -0
  36. package/src/extensions/registries/builtins/app-topbar-right-widgets.ts +6 -0
  37. package/src/extensions/registries/builtins/app-topbar-status-widgets.ts +6 -0
  38. package/src/extensions/registries/builtins/build-card-actions.ts +6 -0
  39. package/src/extensions/registries/builtins/build-card-after-meta.ts +6 -0
  40. package/src/extensions/registries/builtins/build-card-before-media.ts +6 -0
  41. package/src/extensions/registries/builtins/build-card-before-meta.ts +6 -0
  42. package/src/extensions/registries/builtins/build-card-footer-actions.ts +6 -0
  43. package/src/extensions/registries/builtins/build-detail-after-content.ts +6 -0
  44. package/src/extensions/registries/builtins/build-detail-before-content.ts +6 -0
  45. package/src/extensions/registries/builtins/build-detail-before-hero.ts +6 -0
  46. package/src/extensions/registries/builtins/build-detail-header-actions.ts +6 -0
  47. package/src/extensions/registries/builtins/build-detail-mod-row-actions.ts +6 -0
  48. package/src/extensions/registries/builtins/build-detail-resourcepack-row-actions.ts +6 -0
  49. package/src/extensions/registries/builtins/build-detail-right-column-bottom.ts +6 -0
  50. package/src/extensions/registries/builtins/build-detail-right-column-top.ts +6 -0
  51. package/src/extensions/registries/builtins/dialog-footer-actions.ts +6 -0
  52. package/src/extensions/registries/builtins/feed-after-content.ts +6 -0
  53. package/src/extensions/registries/builtins/feed-before-content.ts +6 -0
  54. package/src/extensions/registries/builtins/file-editor.ts +19 -0
  55. package/src/extensions/registries/builtins/friends-after-list.ts +6 -0
  56. package/src/extensions/registries/builtins/friends-before-list.ts +6 -0
  57. package/src/extensions/registries/builtins/index.ts +141 -0
  58. package/src/extensions/registries/builtins/invite-handler.ts +7 -0
  59. package/src/extensions/registries/builtins/library-after-content.ts +6 -0
  60. package/src/extensions/registries/builtins/library-before-content.ts +6 -0
  61. package/src/extensions/registries/builtins/loader.ts +8 -0
  62. package/src/extensions/registries/builtins/map-card-actions.ts +6 -0
  63. package/src/extensions/registries/builtins/map-card-after-meta.ts +6 -0
  64. package/src/extensions/registries/builtins/map-card-before-meta.ts +6 -0
  65. package/src/extensions/registries/builtins/map-card-footer-actions.ts +6 -0
  66. package/src/extensions/registries/builtins/map-detail-after-content.ts +6 -0
  67. package/src/extensions/registries/builtins/map-detail-before-content.ts +6 -0
  68. package/src/extensions/registries/builtins/map-detail-header-actions.ts +6 -0
  69. package/src/extensions/registries/builtins/markdown-editor-tiptap-extensions.ts +7 -0
  70. package/src/extensions/registries/builtins/markdown-editor-toolbar-actions.ts +6 -0
  71. package/src/extensions/registries/builtins/markdown-renderer-after-content.ts +6 -0
  72. package/src/extensions/registries/builtins/markdown-renderer-before-content.ts +6 -0
  73. package/src/extensions/registries/builtins/mod-details-footer-actions.ts +6 -0
  74. package/src/extensions/registries/builtins/mod-manage-actions.ts +6 -0
  75. package/src/extensions/registries/builtins/mod-provider.ts +5 -0
  76. package/src/extensions/registries/builtins/nav.ts +7 -0
  77. package/src/extensions/registries/builtins/page.ts +13 -0
  78. package/src/extensions/registries/builtins/projects-after-content.ts +6 -0
  79. package/src/extensions/registries/builtins/projects-before-content.ts +6 -0
  80. package/src/extensions/registries/builtins/resourcepack-manage-actions.ts +7 -0
  81. package/src/extensions/registries/builtins/server-card-actions.ts +6 -0
  82. package/src/extensions/registries/builtins/server-card-after-meta.ts +6 -0
  83. package/src/extensions/registries/builtins/server-card-before-meta.ts +6 -0
  84. package/src/extensions/registries/builtins/server-card-footer-actions.ts +6 -0
  85. package/src/extensions/registries/builtins/server-detail-after-content.ts +6 -0
  86. package/src/extensions/registries/builtins/server-detail-before-content.ts +6 -0
  87. package/src/extensions/registries/builtins/server-detail-header-actions.ts +6 -0
  88. package/src/extensions/registries/builtins/settings-after-sections.ts +6 -0
  89. package/src/extensions/registries/builtins/settings-before-sections.ts +6 -0
  90. package/src/extensions/registries/builtins/settings-section-widgets.ts +6 -0
  91. package/src/extensions/registries/builtins/shaderpack-manage-actions.ts +7 -0
  92. package/src/extensions/registries/builtins/shell.ts +5 -0
  93. package/src/extensions/registries/builtins/sidebar-after-content.ts +6 -0
  94. package/src/extensions/registries/builtins/sidebar-before-content.ts +6 -0
  95. package/src/extensions/registries/builtins/sidebar-footer-widgets.ts +6 -0
  96. package/src/extensions/registries/builtins/sidebar-header-widgets.ts +6 -0
  97. package/src/extensions/registries/builtins/sidebar.ts +11 -0
  98. package/src/extensions/registries/builtins/theme.ts +5 -0
  99. package/src/extensions/registries/builtins/user-card-after-meta.ts +6 -0
  100. package/src/extensions/registries/builtins/user-card-before-meta.ts +6 -0
  101. package/src/extensions/registries/builtins/user-menu-actions.ts +6 -0
  102. package/src/extensions/registries/builtins/user-menu-after-actions.ts +6 -0
  103. package/src/extensions/registries/builtins/user-menu-before-actions.ts +6 -0
  104. package/src/extensions/registries/builtins/user-strip.ts +5 -0
  105. package/src/extensions/registries/clear-extension-ui-registries.ts +15 -0
  106. package/src/extensions/registries/define-extension-registry.ts +58 -0
  107. package/src/extensions/registries/extension-host-api.ts +41 -0
  108. package/src/extensions/registries/extension-registry-api.ts +103 -0
  109. package/src/extensions/registries/extension-registry-payload-map.ts +9 -0
  110. package/src/extensions/registries/extension-scope.ts +41 -0
  111. package/src/extensions/registries/get-registry.ts +23 -0
  112. package/src/extensions/registries/index.ts +58 -0
  113. package/src/extensions/registries/manifest-rynt.ts +193 -0
  114. package/src/extensions/registries/registry-slot.ts +40 -0
  115. package/src/extensions/registries/registry-value-map.ts +89 -0
  116. package/src/extensions/registries/store.ts +206 -0
  117. package/src/extensions/resolve-extensions.ts +245 -0
  118. package/src/extensions/router-bridge.ts +103 -0
  119. package/src/extensions/session.ts +6 -0
  120. package/src/extensions/slug.ts +23 -0
  121. package/src/extensions/version.ts +147 -0
  122. package/src/host/extensions-composables.ts +33 -0
  123. package/src/host/extensions-init.ts +194 -0
  124. package/src/host/index.ts +11 -0
  125. package/src/host/launcher-models/index.ts +4 -0
  126. package/src/index.ts +229 -0
  127. package/src/minecraft-loader/base-loader.ts +102 -0
  128. package/src/minecraft-loader/index.ts +11 -0
  129. package/src/minecraft-loader/loader-registry.ts +72 -0
  130. package/src/shared/api/assets.ts +112 -0
  131. package/src/shared/api/auth.ts +283 -0
  132. package/src/shared/api/builds.ts +647 -0
  133. package/src/shared/api/config.ts +19 -0
  134. package/src/shared/api/download-stats.ts +103 -0
  135. package/src/shared/api/downloads.ts +36 -0
  136. package/src/shared/api/entity-authorship.ts +60 -0
  137. package/src/shared/api/events.ts +393 -0
  138. package/src/shared/api/friends.ts +140 -0
  139. package/src/shared/api/graphql.ts +87 -0
  140. package/src/shared/api/index.ts +23 -0
  141. package/src/shared/api/invites.ts +262 -0
  142. package/src/shared/api/library.ts +44 -0
  143. package/src/shared/api/maps.ts +385 -0
  144. package/src/shared/api/notify-websocket.ts +140 -0
  145. package/src/shared/api/posts.ts +357 -0
  146. package/src/shared/api/projectServers.ts +379 -0
  147. package/src/shared/api/serverMembers.ts +173 -0
  148. package/src/shared/api/users.ts +294 -0
  149. package/src/shared/composables/buildEditor/useBuildEditor.ts +66 -0
  150. package/src/shared/composables/buildManifest/buildManifest.ts +447 -0
  151. package/src/shared/composables/filesEditor/filesEditor.ts +346 -0
  152. package/src/shared/composables/index.ts +10 -0
  153. package/src/shared/composables/modsEditor/modsEditor.ts +1678 -0
  154. package/src/shared/composables/registrySlot/registry-slot-utils.ts +25 -0
  155. package/src/shared/composables/registrySlot/useRegistrySlotMissing.ts +35 -0
  156. package/src/shared/composables/resourcePacksEditor/resourcePacksEditor.ts +448 -0
  157. package/src/shared/composables/shaderPacksEditor/shaderPacksEditor.ts +395 -0
  158. package/src/shared/composables/useSkinRender.ts +70 -0
  159. package/src/shared/composables/useZlDeepLink.ts +178 -0
  160. package/src/shared/definitions/defineGraphCache.ts +216 -0
  161. package/src/shared/definitions/defineStore.ts +32 -0
  162. package/src/shared/definitions/index.ts +2 -0
  163. package/src/shared/minecraft-types/build-manifest.ts +611 -0
  164. package/src/shared/minecraft-types/index.ts +3 -0
  165. package/src/shared/minecraft-types/launcher-versions.ts +32 -0
  166. package/src/shared/minecraft-types/minecraft-launcher-types.ts +276 -0
  167. package/src/shared/mocks/index.ts +1 -0
  168. package/src/shared/mocks/navigation.ts +17 -0
  169. package/src/shared/mods/http.ts +45 -0
  170. package/src/shared/mods/index.ts +5 -0
  171. package/src/shared/mods/marketplace-editor-search.ts +266 -0
  172. package/src/shared/mods/marketplace-search-utils.ts +42 -0
  173. package/src/shared/mods/mod-marketplace-registry.ts +66 -0
  174. package/src/shared/mods/mod-marketplace-types.ts +28 -0
  175. package/src/shared/mods/providers/curseforge.ts +464 -0
  176. package/src/shared/mods/providers/index.ts +8 -0
  177. package/src/shared/mods/providers/modrinth.ts +402 -0
  178. package/src/shared/mods/resolve-mods-provider-loader-ids.ts +77 -0
  179. package/src/shared/mods/types.ts +76 -0
  180. package/src/shared/styles/index.css +713 -0
  181. package/src/shared/themes/index.ts +23 -0
  182. package/src/shared/themes/theme-tokens-black.json +126 -0
  183. package/src/shared/themes/theme-tokens-classic.json +126 -0
  184. package/src/shared/themes/theme-tokens-pink.json +126 -0
  185. package/src/shared/themes/theme-tokens.json +126 -0
  186. package/src/shared/themes/types.ts +85 -0
  187. package/src/shared/types/API_DOCUMENTATION.md +422 -0
  188. package/src/shared/types/account.ts +40 -0
  189. package/src/shared/types/build.ts +8 -0
  190. package/src/shared/types/entities.ts +181 -0
  191. package/src/shared/types/index.ts +6 -0
  192. package/src/shared/types/invite-payloads.ts +60 -0
  193. package/src/shared/types/navigation.ts +16 -0
  194. package/src/shared/types/running-build.ts +51 -0
  195. package/src/shared/types/serverMember.ts +17 -0
  196. package/src/shared/types/user.ts +55 -0
  197. package/src/shared/ui/base/Avatar.vue +262 -0
  198. package/src/shared/ui/base/Badge.vue +47 -0
  199. package/src/shared/ui/base/Button.vue +78 -0
  200. package/src/shared/ui/base/Divider.vue +42 -0
  201. package/src/shared/ui/base/Icon.vue +597 -0
  202. package/src/shared/ui/base/StatusIndicator.vue +44 -0
  203. package/src/shared/ui/base/index.ts +7 -0
  204. package/src/shared/ui/cards/InviteCard.vue +47 -0
  205. package/src/shared/ui/cards/index.ts +2 -0
  206. package/src/shared/ui/dialog/Dialog.vue +71 -0
  207. package/src/shared/ui/dialog/DialogContent.vue +31 -0
  208. package/src/shared/ui/dialog/DialogFooter.vue +14 -0
  209. package/src/shared/ui/dialog/DialogHeader.vue +41 -0
  210. package/src/shared/ui/dialog/index.ts +5 -0
  211. package/src/shared/ui/editors/AttachmentImagesEditor.vue +133 -0
  212. package/src/shared/ui/editors/ContentAttachmentsDisplay.vue +76 -0
  213. package/src/shared/ui/editors/MarkdownEditor.vue +956 -0
  214. package/src/shared/ui/editors/MarkdownRenderer.vue +299 -0
  215. package/src/shared/ui/editors/RichContentImageViewer.vue +85 -0
  216. package/src/shared/ui/editors/SocialPostMediaZone.vue +320 -0
  217. package/src/shared/ui/editors/index.ts +6 -0
  218. package/src/shared/ui/editors/markdown-editor-gallery.ts +234 -0
  219. package/src/shared/ui/editors/markdown-editor-image.ts +178 -0
  220. package/src/shared/ui/form/Checkbox.vue +38 -0
  221. package/src/shared/ui/form/FormField.vue +30 -0
  222. package/src/shared/ui/form/FormGrid.vue +38 -0
  223. package/src/shared/ui/form/ImageEditor.vue +598 -0
  224. package/src/shared/ui/form/Input.vue +72 -0
  225. package/src/shared/ui/form/Range.vue +65 -0
  226. package/src/shared/ui/form/Select.vue +76 -0
  227. package/src/shared/ui/form/Switch.vue +38 -0
  228. package/src/shared/ui/form/Textarea.vue +144 -0
  229. package/src/shared/ui/form/index.ts +9 -0
  230. package/src/shared/ui/index.ts +9 -0
  231. package/src/shared/ui/layout/BusyOverlay.vue +31 -0
  232. package/src/shared/ui/layout/Callout.vue +44 -0
  233. package/src/shared/ui/layout/Card.vue +38 -0
  234. package/src/shared/ui/layout/Container.vue +36 -0
  235. package/src/shared/ui/layout/EmptyState.vue +99 -0
  236. package/src/shared/ui/layout/EntityMediaRow.vue +54 -0
  237. package/src/shared/ui/layout/FilterResultsLayout.vue +22 -0
  238. package/src/shared/ui/layout/FloatingPanel.vue +37 -0
  239. package/src/shared/ui/layout/FullscreenDimmer.vue +11 -0
  240. package/src/shared/ui/layout/Grid.vue +40 -0
  241. package/src/shared/ui/layout/Inline.vue +59 -0
  242. package/src/shared/ui/layout/LoadingState.vue +39 -0
  243. package/src/shared/ui/layout/MediaBox.vue +47 -0
  244. package/src/shared/ui/layout/OverlayPanel.vue +28 -0
  245. package/src/shared/ui/layout/OverlayWaitPanel.vue +22 -0
  246. package/src/shared/ui/layout/PageSection.vue +43 -0
  247. package/src/shared/ui/layout/PageToolbar.vue +29 -0
  248. package/src/shared/ui/layout/Panel.vue +39 -0
  249. package/src/shared/ui/layout/ProgressBar.vue +49 -0
  250. package/src/shared/ui/layout/Section.vue +30 -0
  251. package/src/shared/ui/layout/SegmentedControl.vue +43 -0
  252. package/src/shared/ui/layout/SelectableCard.vue +46 -0
  253. package/src/shared/ui/layout/SelectableRow.vue +41 -0
  254. package/src/shared/ui/layout/Skeleton.vue +25 -0
  255. package/src/shared/ui/layout/SkeletonAvatar.vue +30 -0
  256. package/src/shared/ui/layout/SkeletonEntityCard.vue +20 -0
  257. package/src/shared/ui/layout/SkeletonFeedPost.vue +22 -0
  258. package/src/shared/ui/layout/SkeletonGrid.vue +18 -0
  259. package/src/shared/ui/layout/SkeletonListRow.vue +31 -0
  260. package/src/shared/ui/layout/SkeletonText.vue +25 -0
  261. package/src/shared/ui/layout/Stack.vue +42 -0
  262. package/src/shared/ui/layout/StateBlock.vue +44 -0
  263. package/src/shared/ui/layout/TwoPaneLayout.vue +35 -0
  264. package/src/shared/ui/layout/VirtualList.vue +160 -0
  265. package/src/shared/ui/layout/index.ts +35 -0
  266. package/src/shared/ui/layout/skeletonSurfaceStyles.ts +24 -0
  267. package/src/shared/ui/navigation/NavItem.vue +139 -0
  268. package/src/shared/ui/navigation/Tab.vue +61 -0
  269. package/src/shared/ui/navigation/Tabs.vue +37 -0
  270. package/src/shared/ui/navigation/index.ts +4 -0
  271. package/src/shared/ui/primitives/Action.vue +19 -0
  272. package/src/shared/ui/primitives/Block.vue +28 -0
  273. package/src/shared/ui/primitives/CanvasView.vue +19 -0
  274. package/src/shared/ui/primitives/Control.vue +24 -0
  275. package/src/shared/ui/primitives/ControlSelect.vue +19 -0
  276. package/src/shared/ui/primitives/ControlTextarea.vue +17 -0
  277. package/src/shared/ui/primitives/FieldLabel.vue +19 -0
  278. package/src/shared/ui/primitives/Form.vue +19 -0
  279. package/src/shared/ui/primitives/Heading.vue +29 -0
  280. package/src/shared/ui/primitives/Image.vue +17 -0
  281. package/src/shared/ui/primitives/LineBreak.vue +3 -0
  282. package/src/shared/ui/primitives/Link.vue +19 -0
  283. package/src/shared/ui/primitives/List.vue +28 -0
  284. package/src/shared/ui/primitives/ListItem.vue +19 -0
  285. package/src/shared/ui/primitives/OptionItem.vue +19 -0
  286. package/src/shared/ui/primitives/Text.vue +28 -0
  287. package/src/shared/ui/primitives/VideoView.vue +19 -0
  288. package/src/shared/ui/primitives/index.ts +19 -0
  289. package/src/shared/ui/primitives/resolveElement.ts +25 -0
  290. package/src/shared/ui/special/AngularAccent.vue +106 -0
  291. package/src/shared/ui/special/ExtensionRegistrySlotButton.vue +143 -0
  292. package/src/shared/ui/special/InfoRow.vue +39 -0
  293. package/src/shared/ui/special/LogViewer.vue +53 -0
  294. package/src/shared/ui/special/PageHeader.vue +23 -0
  295. package/src/shared/ui/special/RegistrySlotMissingCallout.vue +48 -0
  296. package/src/shared/ui/special/WelcomeCard.vue +32 -0
  297. package/src/shared/ui/special/index.ts +9 -0
  298. package/src/shared/utils/app-paths.ts +50 -0
  299. package/src/shared/utils/attachments.ts +16 -0
  300. package/src/shared/utils/autostart.ts +213 -0
  301. package/src/shared/utils/build-files.ts +439 -0
  302. package/src/shared/utils/build-manifest-init.ts +176 -0
  303. package/src/shared/utils/cloudinary.ts +67 -0
  304. package/src/shared/utils/cn.ts +7 -0
  305. package/src/shared/utils/download-stats-week.ts +165 -0
  306. package/src/shared/utils/entity-api-to-cache.ts +84 -0
  307. package/src/shared/utils/entity-build-from-api.ts +1 -0
  308. package/src/shared/utils/entity-display.ts +27 -0
  309. package/src/shared/utils/entity-map-from-api.ts +1 -0
  310. package/src/shared/utils/file-hash.ts +65 -0
  311. package/src/shared/utils/formatSize.ts +5 -0
  312. package/src/shared/utils/formatTime.ts +157 -0
  313. package/src/shared/utils/getAccountSkinRender.ts +32 -0
  314. package/src/shared/utils/index.ts +34 -0
  315. package/src/shared/utils/local-mods.ts +678 -0
  316. package/src/shared/utils/local-settings.ts +217 -0
  317. package/src/shared/utils/member-join-stats.ts +35 -0
  318. package/src/shared/utils/platform.ts +86 -0
  319. package/src/shared/utils/play-host-slug.ts +92 -0
  320. package/src/shared/utils/rich-content.ts +294 -0
  321. package/src/shared/utils/safeRequest.ts +23 -0
  322. package/src/shared/utils/semver.ts +81 -0
  323. package/src/shared/utils/serverPermissions.ts +155 -0
  324. package/src/shared/utils/skin-render-cache.ts +372 -0
  325. package/src/shared/utils/stripMarkdown.ts +45 -0
  326. package/src/shared/utils/transliterate.ts +74 -0
  327. package/src/shared/utils/updateAccountSkinRender.ts +64 -0
  328. package/src/shared/utils/updater.ts +218 -0
  329. package/src/shared/utils/uploadImage.ts +195 -0
  330. package/src/shared/utils/user-status.ts +9 -0
  331. package/src/tiptap/index.ts +7 -0
  332. 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
+