create-fluxstack 1.13.0 → 1.15.0

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 (96) hide show
  1. package/LLMD/patterns/anti-patterns.md +100 -0
  2. package/LLMD/reference/routing.md +39 -39
  3. package/LLMD/resources/live-auth.md +20 -2
  4. package/LLMD/resources/live-components.md +300 -21
  5. package/LLMD/resources/live-logging.md +95 -33
  6. package/LLMD/resources/live-upload.md +59 -8
  7. package/app/client/.live-stubs/LiveAdminPanel.js +5 -0
  8. package/app/client/.live-stubs/LiveChat.js +7 -0
  9. package/app/client/.live-stubs/LiveCounter.js +9 -0
  10. package/app/client/.live-stubs/LiveForm.js +11 -0
  11. package/app/client/.live-stubs/LiveLocalCounter.js +8 -0
  12. package/app/client/.live-stubs/LiveRoomChat.js +10 -0
  13. package/app/client/.live-stubs/LiveTodoList.js +9 -0
  14. package/app/client/.live-stubs/LiveUpload.js +15 -0
  15. package/app/client/index.html +2 -2
  16. package/app/client/public/favicon.svg +46 -0
  17. package/app/client/src/App.tsx +13 -1
  18. package/app/client/src/assets/fluxstack-static.svg +46 -0
  19. package/app/client/src/assets/fluxstack.svg +183 -0
  20. package/app/client/src/components/AppLayout.tsx +146 -9
  21. package/app/client/src/components/BackButton.tsx +13 -13
  22. package/app/client/src/components/DemoPage.tsx +4 -4
  23. package/app/client/src/live/AuthDemo.tsx +23 -21
  24. package/app/client/src/live/ChatDemo.tsx +2 -2
  25. package/app/client/src/live/CounterDemo.tsx +12 -12
  26. package/app/client/src/live/FormDemo.tsx +2 -2
  27. package/app/client/src/live/LiveDebuggerPanel.tsx +779 -0
  28. package/app/client/src/live/RoomChatDemo.tsx +24 -16
  29. package/app/client/src/live/TodoListDemo.tsx +158 -0
  30. package/app/client/src/main.tsx +13 -13
  31. package/app/client/src/pages/ApiTestPage.tsx +6 -6
  32. package/app/client/src/pages/HomePage.tsx +80 -52
  33. package/app/server/auth/DevAuthProvider.ts +2 -2
  34. package/app/server/auth/JWTAuthProvider.example.ts +2 -2
  35. package/app/server/index.ts +2 -2
  36. package/app/server/live/LiveAdminPanel.ts +2 -1
  37. package/app/server/live/LiveChat.ts +78 -77
  38. package/app/server/live/LiveCounter.ts +1 -1
  39. package/app/server/live/LiveForm.ts +1 -0
  40. package/app/server/live/LiveLocalCounter.ts +38 -37
  41. package/app/server/live/LiveProtectedChat.ts +2 -1
  42. package/app/server/live/LiveRoomChat.ts +1 -0
  43. package/app/server/live/LiveTodoList.ts +110 -0
  44. package/app/server/live/LiveUpload.ts +1 -0
  45. package/app/server/live/register-components.ts +19 -19
  46. package/app/server/routes/room.routes.ts +1 -2
  47. package/config/system/runtime.config.ts +4 -0
  48. package/core/build/live-components-generator.ts +1 -1
  49. package/core/build/optimizer.ts +235 -235
  50. package/core/build/vite-plugins.ts +28 -0
  51. package/core/client/components/LiveDebugger.tsx +1324 -0
  52. package/core/client/hooks/useLiveUpload.ts +3 -4
  53. package/core/client/index.ts +41 -21
  54. package/core/framework/server.ts +1 -1
  55. package/core/plugins/built-in/index.ts +134 -134
  56. package/core/plugins/built-in/live-components/commands/create-live-component.ts +4 -0
  57. package/core/plugins/built-in/vite/index.ts +75 -21
  58. package/core/server/index.ts +14 -15
  59. package/core/server/live/auto-generated-components.ts +6 -3
  60. package/core/server/live/index.ts +95 -21
  61. package/core/server/live/websocket-plugin.ts +27 -862
  62. package/core/server/plugins/static-files-plugin.ts +179 -69
  63. package/core/types/build.ts +219 -219
  64. package/core/types/plugin.ts +107 -107
  65. package/core/types/types.ts +77 -890
  66. package/core/utils/logger/startup-banner.ts +82 -82
  67. package/core/utils/version.ts +6 -6
  68. package/create-fluxstack.ts +1 -1
  69. package/package.json +5 -1
  70. package/plugins/crypto-auth/index.ts +1 -1
  71. package/plugins/crypto-auth/server/CryptoAuthLiveProvider.ts +2 -2
  72. package/vite.config.ts +40 -12
  73. package/app/client/src/assets/react.svg +0 -1
  74. package/core/client/LiveComponentsProvider.tsx +0 -531
  75. package/core/client/components/Live.tsx +0 -105
  76. package/core/client/hooks/AdaptiveChunkSizer.ts +0 -215
  77. package/core/client/hooks/state-validator.ts +0 -130
  78. package/core/client/hooks/useChunkedUpload.ts +0 -359
  79. package/core/client/hooks/useLiveChunkedUpload.ts +0 -87
  80. package/core/client/hooks/useLiveComponent.ts +0 -843
  81. package/core/client/hooks/useRoom.ts +0 -409
  82. package/core/client/hooks/useRoomProxy.ts +0 -382
  83. package/core/server/live/ComponentRegistry.ts +0 -1099
  84. package/core/server/live/FileUploadManager.ts +0 -282
  85. package/core/server/live/LiveComponentPerformanceMonitor.ts +0 -931
  86. package/core/server/live/LiveLogger.ts +0 -111
  87. package/core/server/live/LiveRoomManager.ts +0 -262
  88. package/core/server/live/RoomEventBus.ts +0 -234
  89. package/core/server/live/RoomStateManager.ts +0 -172
  90. package/core/server/live/SingleConnectionManager.ts +0 -0
  91. package/core/server/live/StateSignature.ts +0 -645
  92. package/core/server/live/WebSocketConnectionManager.ts +0 -709
  93. package/core/server/live/auth/LiveAuthContext.ts +0 -71
  94. package/core/server/live/auth/LiveAuthManager.ts +0 -304
  95. package/core/server/live/auth/index.ts +0 -19
  96. package/core/server/live/auth/types.ts +0 -179
@@ -1,82 +1,82 @@
1
- /**
2
- * FluxStack Logger - Startup Banner
3
- * Clean and beautiful startup display
4
- *
5
- * Developers can customize the banner by:
6
- * 1. Setting showBanner: false in server config
7
- * 2. Using displayStartupBanner() in app.listen() callback
8
- * 3. Creating completely custom banners with chalk
9
- */
10
-
11
- import chalk from 'chalk'
12
- import { LOG } from './index'
13
- import { FLUXSTACK_VERSION } from '../version'
14
-
15
- export interface StartupInfo {
16
- port: number
17
- host?: string
18
- apiPrefix?: string
19
- environment: string
20
- pluginCount?: number
21
- vitePort?: number
22
- viteEmbedded?: boolean // true when Vite runs programmatically with backend
23
- swaggerPath?: string
24
- liveComponents?: string[]
25
- }
26
-
27
- /**
28
- * Display clean startup banner
29
- */
30
- export function displayStartupBanner(info: StartupInfo): void {
31
- const {
32
- port,
33
- host = 'localhost',
34
- apiPrefix = '/api',
35
- environment,
36
- pluginCount = 0,
37
- vitePort,
38
- viteEmbedded = false,
39
- liveComponents = [],
40
- } = info
41
-
42
- // Build server URL
43
- const displayHost = host === '0.0.0.0' ? 'localhost' : host
44
- const serverUrl = `http://${displayHost}:${port}`
45
-
46
- // Simple ready message with URL
47
- console.log(chalk.green('\nServer ready!') + chalk.gray(` Environment: ${environment}${viteEmbedded ? ' | Vite: embedded' : ''}`))
48
- console.log(chalk.cyan(` → ${serverUrl}`))
49
-
50
- // Display Live Components
51
- if (liveComponents.length > 0) {
52
- console.log(chalk.gray(` Live Components (${liveComponents.length}): `) + chalk.yellow(liveComponents.join(', ')))
53
- }
54
-
55
- // Display plugins in compact format
56
- const plugins = (global as any).__fluxstackPlugins || []
57
- if (plugins.length > 0) {
58
- const pluginList = plugins.map((p: any) => p.name).join(', ')
59
- console.log(chalk.gray(` Plugins (${plugins.length}): `) + chalk.magenta(pluginList))
60
- }
61
-
62
- console.log('') // Empty line at the end
63
- }
64
-
65
- /**
66
- * Display simple plugin loaded message
67
- */
68
- export function logPluginLoaded(name: string, version?: string): void {
69
- const versionStr = version ? chalk.gray(`v${version}`) : ''
70
- LOG(`${chalk.green('✓')} Plugin loaded: ${chalk.cyan(name)} ${versionStr}`)
71
- }
72
-
73
- /**
74
- * Display plugin count summary
75
- */
76
- export function logPluginsSummary(count: number): void {
77
- if (count === 0) {
78
- LOG(chalk.yellow('⚠ No plugins loaded'))
79
- } else {
80
- LOG(chalk.green(`✓ ${count} plugin${count > 1 ? 's' : ''} loaded successfully`))
81
- }
82
- }
1
+ /**
2
+ * FluxStack Logger - Startup Banner
3
+ * Clean and beautiful startup display
4
+ *
5
+ * Developers can customize the banner by:
6
+ * 1. Setting showBanner: false in server config
7
+ * 2. Using displayStartupBanner() in app.listen() callback
8
+ * 3. Creating completely custom banners with chalk
9
+ */
10
+
11
+ import chalk from 'chalk'
12
+ import { LOG } from './index'
13
+ import { FLUXSTACK_VERSION } from '../version'
14
+
15
+ export interface StartupInfo {
16
+ port: number
17
+ host?: string
18
+ apiPrefix?: string
19
+ environment: string
20
+ pluginCount?: number
21
+ vitePort?: number
22
+ viteEmbedded?: boolean // true when Vite runs programmatically with backend
23
+ swaggerPath?: string
24
+ liveComponents?: string[]
25
+ }
26
+
27
+ /**
28
+ * Display clean startup banner
29
+ */
30
+ export function displayStartupBanner(info: StartupInfo): void {
31
+ const {
32
+ port,
33
+ host = 'localhost',
34
+ apiPrefix = '/api',
35
+ environment,
36
+ pluginCount = 0,
37
+ vitePort,
38
+ viteEmbedded = false,
39
+ liveComponents = [],
40
+ } = info
41
+
42
+ // Build server URL
43
+ const displayHost = host === '0.0.0.0' ? 'localhost' : host
44
+ const serverUrl = `http://${displayHost}:${port}`
45
+
46
+ // Simple ready message with URL
47
+ console.log(chalk.green('\nServer ready!') + chalk.gray(` Environment: ${environment}${viteEmbedded ? ' | Vite: embedded' : ''}`))
48
+ console.log(chalk.cyan(` → ${serverUrl}`))
49
+
50
+ // Display Live Components
51
+ if (liveComponents.length > 0) {
52
+ console.log(chalk.gray(` Live Components (${liveComponents.length}): `) + chalk.yellow(liveComponents.join(', ')))
53
+ }
54
+
55
+ // Display plugins in compact format
56
+ const plugins = (global as any).__fluxstackPlugins || []
57
+ if (plugins.length > 0) {
58
+ const pluginList = plugins.map((p: any) => p.name).join(', ')
59
+ console.log(chalk.gray(` Plugins (${plugins.length}): `) + chalk.magenta(pluginList))
60
+ }
61
+
62
+ console.log('') // Empty line at the end
63
+ }
64
+
65
+ /**
66
+ * Display simple plugin loaded message
67
+ */
68
+ export function logPluginLoaded(name: string, version?: string): void {
69
+ const versionStr = version ? chalk.gray(`v${version}`) : ''
70
+ LOG(`${chalk.green('✓')} Plugin loaded: ${chalk.cyan(name)} ${versionStr}`)
71
+ }
72
+
73
+ /**
74
+ * Display plugin count summary
75
+ */
76
+ export function logPluginsSummary(count: number): void {
77
+ if (count === 0) {
78
+ LOG(chalk.yellow('⚠ No plugins loaded'))
79
+ } else {
80
+ LOG(chalk.green(`✓ ${count} plugin${count > 1 ? 's' : ''} loaded successfully`))
81
+ }
82
+ }
@@ -1,6 +1,6 @@
1
- /**
2
- * FluxStack Framework Version
3
- * Single source of truth for version number
4
- * Auto-synced with package.json
5
- */
6
- export const FLUXSTACK_VERSION = '1.13.0'
1
+ /**
2
+ * FluxStack Framework Version
3
+ * Single source of truth for version number
4
+ * Auto-synced with package.json
5
+ */
6
+ export const FLUXSTACK_VERSION = '1.15.0'
@@ -344,7 +344,7 @@ bun.lockb
344
344
 
345
345
  // Customize package.json with project name
346
346
  const packageJsonPath = join(projectPath, 'package.json')
347
- const actualProjectName = isCurrentDir ? basename(projectPath) : normalizedName
347
+ const actualProjectName = basename(projectPath)
348
348
 
349
349
  if (existsSync(packageJsonPath)) {
350
350
  const packageContent = readFileSync(packageJsonPath, 'utf-8')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "create-fluxstack",
3
- "version": "1.13.0",
3
+ "version": "1.15.0",
4
4
  "description": "⚡ Revolutionary full-stack TypeScript framework with Declarative Config System, Elysia + React + Bun",
5
5
  "keywords": [
6
6
  "framework",
@@ -70,6 +70,10 @@
70
70
  "vitest": "^3.2.4"
71
71
  },
72
72
  "dependencies": {
73
+ "@fluxstack/live": "^0.2.0",
74
+ "@fluxstack/live-elysia": "^0.2.0",
75
+ "@fluxstack/live-client": "^0.2.0",
76
+ "@fluxstack/live-react": "^0.2.0",
73
77
  "@elysiajs/eden": "^1.3.2",
74
78
  "@elysiajs/swagger": "^1.3.1",
75
79
  "@vitejs/plugin-react": "^4.6.0",
@@ -9,7 +9,7 @@ type Plugin = FluxStack.Plugin
9
9
  import { Elysia, t } from "elysia"
10
10
  import { CryptoAuthService, AuthMiddleware } from "./server"
11
11
  import { CryptoAuthLiveProvider } from "./server/CryptoAuthLiveProvider"
12
- import { liveAuthManager } from "@core/server/live/auth"
12
+ import { liveAuthManager } from "@core/server/live"
13
13
  import { makeProtectedRouteCommand } from "./cli/make-protected-route.command"
14
14
 
15
15
  // ✅ Plugin carrega sua própria configuração (da pasta config/ do plugin)
@@ -14,8 +14,8 @@ import type {
14
14
  LiveAuthProvider,
15
15
  LiveAuthCredentials,
16
16
  LiveAuthContext,
17
- } from '@core/server/live/auth/types'
18
- import { AuthenticatedContext, ANONYMOUS_CONTEXT } from '@core/server/live/auth/LiveAuthContext'
17
+ } from '@fluxstack/live'
18
+ import { AuthenticatedContext, ANONYMOUS_CONTEXT } from '@fluxstack/live'
19
19
 
20
20
  export class CryptoAuthLiveProvider implements LiveAuthProvider {
21
21
  readonly name = 'crypto-auth'
package/vite.config.ts CHANGED
@@ -1,34 +1,54 @@
1
1
  import { defineConfig } from 'vite'
2
2
  import react from '@vitejs/plugin-react'
3
3
  import tailwindcss from '@tailwindcss/vite'
4
- import tsconfigPaths from 'vite-tsconfig-paths'
5
- import checker from 'vite-plugin-checker'
6
4
  import { resolve } from 'path'
5
+ import { existsSync } from 'fs'
7
6
  import { clientConfig } from './config/system/client.config'
8
- import { helpers } from './core/utils/env'
7
+ import { fluxstackVitePlugins } from './core/build/vite-plugins'
9
8
 
10
9
  // Root directory (vite.config.ts is in project root)
11
10
  const rootDir = import.meta.dirname
12
11
 
12
+ // When using bun-linked @fluxstack/live-* packages locally, point Vite at the
13
+ // TypeScript source instead of pre-built dist. This ensures a single React
14
+ // context (no dual-instance problem) and gives us HMR for the library code.
15
+ // In CI or when the sibling repo doesn't exist, resolve from node_modules.
16
+ const liveMonorepoRoot = resolve(rootDir, '../fluxstack-live/packages')
17
+ const hasLocalLiveMonorepo = existsSync(resolve(liveMonorepoRoot, 'core/src/index.ts'))
18
+
19
+ const liveAliases: Record<string, string> = hasLocalLiveMonorepo
20
+ ? {
21
+ '@fluxstack/live-react': resolve(liveMonorepoRoot, 'react/src/index.ts'),
22
+ '@fluxstack/live-client': resolve(liveMonorepoRoot, 'client/src/index.ts'),
23
+ '@fluxstack/live': resolve(liveMonorepoRoot, 'core/src/index.ts'),
24
+ }
25
+ : {}
26
+
13
27
  // https://vite.dev/config/
14
28
  export default defineConfig({
15
29
  plugins: [
30
+ // FluxStack internal plugins (live-strip, tsconfig-paths, type-checker)
31
+ ...fluxstackVitePlugins(),
16
32
  react(),
17
33
  tailwindcss(),
18
- tsconfigPaths({
19
- projects: [resolve(rootDir, 'tsconfig.json')]
20
- }),
21
- // Only run type checker in development (saves ~5+ minutes in Docker builds)
22
- helpers.isDevelopment() && checker({
23
- typescript: true,
24
- overlay: true
25
- })
26
- ].filter(Boolean),
34
+ ],
27
35
 
28
36
  root: resolve(rootDir, 'app/client'),
29
37
 
30
38
  // Aliases são lidos do tsconfig.json pelo plugin vite-tsconfig-paths
31
39
 
40
+ resolve: {
41
+ dedupe: ['react', 'react-dom', 'react/jsx-runtime'],
42
+ alias: liveAliases,
43
+ },
44
+
45
+ // Exclude linked packages from dep optimization when aliased to source
46
+ optimizeDeps: {
47
+ exclude: hasLocalLiveMonorepo
48
+ ? ['@fluxstack/live', '@fluxstack/live-client', '@fluxstack/live-react']
49
+ : [],
50
+ },
51
+
32
52
  server: {
33
53
  port: clientConfig.vite.port, // ✅ From config
34
54
  host: clientConfig.vite.host, // ✅ From config
@@ -36,6 +56,14 @@ export default defineConfig({
36
56
  open: clientConfig.vite.open, // ✅ From config
37
57
  allowedHosts: clientConfig.vite.allowedHosts, // ✅ From config (VITE_ALLOWED_HOSTS)
38
58
 
59
+ // Allow Vite to serve files outside the client root (needed for monorepo aliases)
60
+ fs: {
61
+ allow: [
62
+ rootDir,
63
+ ...(hasLocalLiveMonorepo ? [liveMonorepoRoot] : []),
64
+ ],
65
+ },
66
+
39
67
  hmr: {
40
68
  protocol: 'ws',
41
69
  host: clientConfig.vite.host,
@@ -1 +0,0 @@
1
- <svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="35.93" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 228"><path fill="#00D8FF" d="M210.483 73.824a171.49 171.49 0 0 0-8.24-2.597c.465-1.9.893-3.777 1.273-5.621c6.238-30.281 2.16-54.676-11.769-62.708c-13.355-7.7-35.196.329-57.254 19.526a171.23 171.23 0 0 0-6.375 5.848a155.866 155.866 0 0 0-4.241-3.917C100.759 3.829 77.587-4.822 63.673 3.233C50.33 10.957 46.379 33.89 51.995 62.588a170.974 170.974 0 0 0 1.892 8.48c-3.28.932-6.445 1.924-9.474 2.98C17.309 83.498 0 98.307 0 113.668c0 15.865 18.582 31.778 46.812 41.427a145.52 145.52 0 0 0 6.921 2.165a167.467 167.467 0 0 0-2.01 9.138c-5.354 28.2-1.173 50.591 12.134 58.266c13.744 7.926 36.812-.22 59.273-19.855a145.567 145.567 0 0 0 5.342-4.923a168.064 168.064 0 0 0 6.92 6.314c21.758 18.722 43.246 26.282 56.54 18.586c13.731-7.949 18.194-32.003 12.4-61.268a145.016 145.016 0 0 0-1.535-6.842c1.62-.48 3.21-.974 4.76-1.488c29.348-9.723 48.443-25.443 48.443-41.52c0-15.417-17.868-30.326-45.517-39.844Zm-6.365 70.984c-1.4.463-2.836.91-4.3 1.345c-3.24-10.257-7.612-21.163-12.963-32.432c5.106-11 9.31-21.767 12.459-31.957c2.619.758 5.16 1.557 7.61 2.4c23.69 8.156 38.14 20.213 38.14 29.504c0 9.896-15.606 22.743-40.946 31.14Zm-10.514 20.834c2.562 12.94 2.927 24.64 1.23 33.787c-1.524 8.219-4.59 13.698-8.382 15.893c-8.067 4.67-25.32-1.4-43.927-17.412a156.726 156.726 0 0 1-6.437-5.87c7.214-7.889 14.423-17.06 21.459-27.246c12.376-1.098 24.068-2.894 34.671-5.345a134.17 134.17 0 0 1 1.386 6.193ZM87.276 214.515c-7.882 2.783-14.16 2.863-17.955.675c-8.075-4.657-11.432-22.636-6.853-46.752a156.923 156.923 0 0 1 1.869-8.499c10.486 2.32 22.093 3.988 34.498 4.994c7.084 9.967 14.501 19.128 21.976 27.15a134.668 134.668 0 0 1-4.877 4.492c-9.933 8.682-19.886 14.842-28.658 17.94ZM50.35 144.747c-12.483-4.267-22.792-9.812-29.858-15.863c-6.35-5.437-9.555-10.836-9.555-15.216c0-9.322 13.897-21.212 37.076-29.293c2.813-.98 5.757-1.905 8.812-2.773c3.204 10.42 7.406 21.315 12.477 32.332c-5.137 11.18-9.399 22.249-12.634 32.792a134.718 134.718 0 0 1-6.318-1.979Zm12.378-84.26c-4.811-24.587-1.616-43.134 6.425-47.789c8.564-4.958 27.502 2.111 47.463 19.835a144.318 144.318 0 0 1 3.841 3.545c-7.438 7.987-14.787 17.08-21.808 26.988c-12.04 1.116-23.565 2.908-34.161 5.309a160.342 160.342 0 0 1-1.76-7.887Zm110.427 27.268a347.8 347.8 0 0 0-7.785-12.803c8.168 1.033 15.994 2.404 23.343 4.08c-2.206 7.072-4.956 14.465-8.193 22.045a381.151 381.151 0 0 0-7.365-13.322Zm-45.032-43.861c5.044 5.465 10.096 11.566 15.065 18.186a322.04 322.04 0 0 0-30.257-.006c4.974-6.559 10.069-12.652 15.192-18.18ZM82.802 87.83a323.167 323.167 0 0 0-7.227 13.238c-3.184-7.553-5.909-14.98-8.134-22.152c7.304-1.634 15.093-2.97 23.209-3.984a321.524 321.524 0 0 0-7.848 12.897Zm8.081 65.352c-8.385-.936-16.291-2.203-23.593-3.793c2.26-7.3 5.045-14.885 8.298-22.6a321.187 321.187 0 0 0 7.257 13.246c2.594 4.48 5.28 8.868 8.038 13.147Zm37.542 31.03c-5.184-5.592-10.354-11.779-15.403-18.433c4.902.192 9.899.29 14.978.29c5.218 0 10.376-.117 15.453-.343c-4.985 6.774-10.018 12.97-15.028 18.486Zm52.198-57.817c3.422 7.8 6.306 15.345 8.596 22.52c-7.422 1.694-15.436 3.058-23.88 4.071a382.417 382.417 0 0 0 7.859-13.026a347.403 347.403 0 0 0 7.425-13.565Zm-16.898 8.101a358.557 358.557 0 0 1-12.281 19.815a329.4 329.4 0 0 1-23.444.823c-7.967 0-15.716-.248-23.178-.732a310.202 310.202 0 0 1-12.513-19.846h.001a307.41 307.41 0 0 1-10.923-20.627a310.278 310.278 0 0 1 10.89-20.637l-.001.001a307.318 307.318 0 0 1 12.413-19.761c7.613-.576 15.42-.876 23.31-.876H128c7.926 0 15.743.303 23.354.883a329.357 329.357 0 0 1 12.335 19.695a358.489 358.489 0 0 1 11.036 20.54a329.472 329.472 0 0 1-11 20.722Zm22.56-122.124c8.572 4.944 11.906 24.881 6.52 51.026c-.344 1.668-.73 3.367-1.15 5.09c-10.622-2.452-22.155-4.275-34.23-5.408c-7.034-10.017-14.323-19.124-21.64-27.008a160.789 160.789 0 0 1 5.888-5.4c18.9-16.447 36.564-22.941 44.612-18.3ZM128 90.808c12.625 0 22.86 10.235 22.86 22.86s-10.235 22.86-22.86 22.86s-22.86-10.235-22.86-22.86s10.235-22.86 22.86-22.86Z"></path></svg>