@xxmachina/components 19.33.0 → 19.34.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.
@@ -70,6 +70,22 @@ class WebGLParticleSystem {
70
70
  velocities;
71
71
  isRunning = false;
72
72
  frameCount = 0; // 接続線更新頻度制御用
73
+ onResize = () => {
74
+ const { width, height } = this.getSize();
75
+ this.camera.aspect = width / height;
76
+ this.camera.updateProjectionMatrix();
77
+ this.renderer.setSize(width, height);
78
+ const material = this.particles.material;
79
+ material.uniforms['uBounds'].value.set(width / 2, height / 2);
80
+ };
81
+ onVisibilityChange = () => {
82
+ if (document.hidden) {
83
+ this.stop();
84
+ }
85
+ else {
86
+ this.start();
87
+ }
88
+ };
73
89
  constructor(config) {
74
90
  this.config = {
75
91
  container: config.container,
@@ -284,24 +300,10 @@ class WebGLParticleSystem {
284
300
  };
285
301
  }
286
302
  setupResizeHandler() {
287
- window.addEventListener('resize', () => {
288
- const { width, height } = this.getSize();
289
- this.camera.aspect = width / height;
290
- this.camera.updateProjectionMatrix();
291
- this.renderer.setSize(width, height);
292
- const material = this.particles.material;
293
- material.uniforms['uBounds'].value.set(width / 2, height / 2);
294
- });
303
+ window.addEventListener('resize', this.onResize);
295
304
  }
296
305
  setupVisibilityHandler() {
297
- document.addEventListener('visibilitychange', () => {
298
- if (document.hidden) {
299
- this.stop();
300
- }
301
- else {
302
- this.start();
303
- }
304
- });
306
+ document.addEventListener('visibilitychange', this.onVisibilityChange);
305
307
  }
306
308
  start() {
307
309
  if (this.isRunning)
@@ -316,6 +318,8 @@ class WebGLParticleSystem {
316
318
  }
317
319
  dispose() {
318
320
  this.stop();
321
+ window.removeEventListener('resize', this.onResize);
322
+ document.removeEventListener('visibilitychange', this.onVisibilityChange);
319
323
  this.particles.geometry.dispose();
320
324
  this.particles.material.dispose();
321
325
  this.lines.geometry.dispose();
@@ -1 +1 @@
1
- {"version":3,"file":"xxmachina-components-templates-background.mjs","sources":["../../../../../packages/@xxmachina/components/src/lib/templates/background/shaders/particle.vert.ts","../../../../../packages/@xxmachina/components/src/lib/templates/background/shaders/particle.frag.ts","../../../../../packages/@xxmachina/components/src/lib/templates/background/utils/webgl-particle-system.ts","../../../../../packages/@xxmachina/components/src/lib/templates/background/lain-background.template.ts","../../../../../packages/@xxmachina/components/src/lib/templates/background/background.template.ts","../../../../../packages/@xxmachina/components/src/lib/templates/background/index.ts","../../../../../packages/@xxmachina/components/src/lib/templates/background/xxmachina-components-templates-background.ts"],"sourcesContent":["export const particleVertexShader = /* glsl */ `\nattribute vec3 velocity;\nattribute float size;\n\nuniform float uTime;\nuniform vec2 uBounds;\n\nvarying vec3 vColor;\nvarying float vAlpha;\n\nvoid main() {\n vColor = color;\n vAlpha = 1.0;\n\n // GPU上で位置更新(時間ベース)\n vec3 pos = position;\n pos.x += velocity.x * uTime * 0.01;\n pos.y += velocity.y * uTime * 0.01;\n\n // 境界でラップアラウンド\n pos.x = mod(pos.x + uBounds.x, uBounds.x * 2.0) - uBounds.x;\n pos.y = mod(pos.y + uBounds.y, uBounds.y * 2.0) - uBounds.y;\n\n vec4 mvPosition = modelViewMatrix * vec4(pos, 1.0);\n gl_PointSize = size * (300.0 / -mvPosition.z);\n gl_Position = projectionMatrix * mvPosition;\n}\n`;\n","export const particleFragmentShader = /* glsl */ `\nvarying vec3 vColor;\nvarying float vAlpha;\n\nvoid main() {\n // 中心からの距離\n float dist = length(gl_PointCoord - vec2(0.5));\n\n // 円形にクリップ\n if (dist > 0.5) discard;\n\n // 強いグロー効果(Canvas版のshadowBlur=15を再現)\n float coreBrightness = exp(-dist * 8.0); // コア部分(非常に明るい)\n float glowBrightness = exp(-dist * 2.5) * 0.6; // 外側のソフトグロー\n float outerGlow = exp(-dist * 1.5) * 0.3; // さらに外側の淡いグロー\n float glow = coreBrightness + glowBrightness + outerGlow;\n\n // 色を強くブースト(黒背景で映える明るさに)\n vec3 boostedColor = vColor * 1.5;\n float alpha = min(glow * vAlpha, 1.0);\n\n gl_FragColor = vec4(boostedColor, alpha);\n}\n`;\n","import * as THREE from 'three';\nimport { particleVertexShader, particleFragmentShader } from '../shaders';\n\nexport interface ParticleSystemConfig {\n container: HTMLElement;\n particleCount?: number;\n connectionDistance?: number;\n /** 固定色相を使用する場合に指定(未指定で全色相ランダム) */\n baseHue?: number;\n /** 接続線のhue変化速度(デフォルト: 30) */\n hueSpeed?: number;\n}\n\nexport class WebGLParticleSystem {\n private scene: THREE.Scene;\n private camera: THREE.PerspectiveCamera;\n private renderer: THREE.WebGLRenderer;\n private particles: THREE.Points;\n private lines: THREE.LineSegments;\n private clock: THREE.Clock;\n private config: Required<ParticleSystemConfig>;\n private positions: Float32Array;\n private velocities: Float32Array;\n private isRunning = false;\n private frameCount = 0; // 接続線更新頻度制御用\n\n constructor(config: ParticleSystemConfig) {\n this.config = {\n container: config.container,\n particleCount: config.particleCount ?? this.getOptimalParticleCount(),\n connectionDistance: config.connectionDistance ?? 100, // パフォーマンス優先で短縮\n baseHue: config.baseHue ?? -1, // -1 = 全色相ランダム\n hueSpeed: config.hueSpeed ?? 30,\n };\n\n this.scene = new THREE.Scene();\n this.scene.background = new THREE.Color(0x000000);\n this.clock = new THREE.Clock();\n this.positions = new Float32Array(this.config.particleCount * 3);\n this.velocities = new Float32Array(this.config.particleCount * 3);\n\n this.camera = this.createCamera();\n this.renderer = this.createRenderer();\n this.particles = this.createParticles();\n this.lines = this.createLines();\n\n this.scene.add(this.particles);\n this.scene.add(this.lines);\n\n this.setupResizeHandler();\n this.setupVisibilityHandler();\n }\n\n private getOptimalParticleCount(): number {\n const isMobile = /iPhone|iPad|Android/i.test(navigator.userAgent);\n // パフォーマンス優先:パーティクル数を削減\n return isMobile ? 60 : 100;\n }\n\n private createCamera(): THREE.PerspectiveCamera {\n const { width, height } = this.getSize();\n const camera = new THREE.PerspectiveCamera(75, width / height, 1, 2000);\n camera.position.z = 400;\n return camera;\n }\n\n private createRenderer(): THREE.WebGLRenderer {\n const { width, height } = this.getSize();\n const renderer = new THREE.WebGLRenderer({\n antialias: true,\n alpha: false, // 黒背景を強制(透明にしない)\n });\n renderer.setSize(width, height);\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n renderer.setClearColor(0x000000, 1); // 明示的に黒背景を設定\n this.config.container.appendChild(renderer.domElement);\n\n // Canvas styling - コンテナ内に配置(position: absoluteに変更)\n renderer.domElement.style.position = 'absolute';\n renderer.domElement.style.top = '0';\n renderer.domElement.style.left = '0';\n renderer.domElement.style.width = '100%';\n renderer.domElement.style.height = '100%';\n\n return renderer;\n }\n\n private createParticles(): THREE.Points {\n const { particleCount, baseHue } = this.config;\n const { width, height } = this.getSize();\n\n const geometry = new THREE.BufferGeometry();\n const colors = new Float32Array(particleCount * 3);\n const sizes = new Float32Array(particleCount);\n\n for (let i = 0; i < particleCount; i++) {\n const i3 = i * 3;\n\n // ランダム位置\n this.positions[i3] = (Math.random() - 0.5) * width;\n this.positions[i3 + 1] = (Math.random() - 0.5) * height;\n this.positions[i3 + 2] = (Math.random() - 0.5) * 100;\n\n // ランダム速度\n this.velocities[i3] = (Math.random() - 0.5) * 50;\n this.velocities[i3 + 1] = (Math.random() - 0.5) * 50;\n this.velocities[i3 + 2] = 0;\n\n // HSLカラー(baseHue < 0 なら全色相ランダム)\n const hue = baseHue < 0\n ? Math.random() // 0-1 (全色相)\n : (baseHue + Math.random() * 60) / 360;\n // 彩度70%、明度60%で鮮やかに(Canvas版のshadowBlur効果を再現)\n const color = new THREE.Color().setHSL(hue, 0.7, 0.6);\n colors[i3] = color.r;\n colors[i3 + 1] = color.g;\n colors[i3 + 2] = color.b;\n\n sizes[i] = Math.random() * 2 + 2; // サイズ2-4(パフォーマンス優先)\n }\n\n geometry.setAttribute('position', new THREE.BufferAttribute(this.positions, 3));\n geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3));\n geometry.setAttribute('velocity', new THREE.BufferAttribute(this.velocities, 3));\n geometry.setAttribute('size', new THREE.BufferAttribute(sizes, 1));\n\n const material = new THREE.ShaderMaterial({\n vertexShader: particleVertexShader,\n fragmentShader: particleFragmentShader,\n uniforms: {\n uTime: { value: 0 },\n uBounds: { value: new THREE.Vector2(width / 2, height / 2) },\n },\n transparent: true,\n vertexColors: true,\n blending: THREE.AdditiveBlending,\n depthWrite: false,\n });\n\n return new THREE.Points(geometry, material);\n }\n\n private createLines(): THREE.LineSegments {\n const geometry = new THREE.BufferGeometry();\n const material = new THREE.LineBasicMaterial({\n vertexColors: true,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthWrite: false,\n });\n return new THREE.LineSegments(geometry, material);\n }\n\n private updateConnections() {\n const { particleCount, connectionDistance, baseHue, hueSpeed } = this.config;\n const positions: number[] = [];\n const colors: number[] = [];\n\n // 空間分割グリッド\n const cellSize = connectionDistance;\n const grid = new Map<string, number[]>();\n\n // パーティクルをグリッドに配置\n for (let i = 0; i < particleCount; i++) {\n const x = this.positions[i * 3];\n const y = this.positions[i * 3 + 1];\n const cellX = Math.floor(x / cellSize);\n const cellY = Math.floor(y / cellSize);\n const key = `${cellX},${cellY}`;\n if (!grid.has(key)) grid.set(key, []);\n grid.get(key)!.push(i);\n }\n\n // 接続線のhue(全色相でゆっくり変化)\n const elapsed = this.clock.getElapsedTime();\n const lineHue = baseHue < 0\n ? ((elapsed * hueSpeed) % 360) / 360\n : (baseHue + (elapsed * hueSpeed) % 60) / 360;\n // 色計算をキャッシュ(パフォーマンス向上)\n const lineColor = new THREE.Color().setHSL(lineHue, 0.8, 0.65);\n\n // 近傍セルのみ探索\n for (const [key, indices] of grid.entries()) {\n const [cx, cy] = key.split(',').map(Number);\n\n for (let dx = -1; dx <= 1; dx++) {\n for (let dy = -1; dy <= 1; dy++) {\n const neighborKey = `${cx + dx},${cy + dy}`;\n const neighborIndices = grid.get(neighborKey);\n if (!neighborIndices) continue;\n\n for (const i of indices) {\n for (const j of neighborIndices) {\n if (i >= j) continue;\n\n const i3 = i * 3;\n const j3 = j * 3;\n const pdx = this.positions[i3] - this.positions[j3];\n const pdy = this.positions[i3 + 1] - this.positions[j3 + 1];\n const dist = Math.sqrt(pdx * pdx + pdy * pdy);\n\n if (dist < connectionDistance) {\n const alpha = (1 - dist / connectionDistance) * 0.7;\n\n positions.push(\n this.positions[i3], this.positions[i3 + 1], this.positions[i3 + 2],\n this.positions[j3], this.positions[j3 + 1], this.positions[j3 + 2]\n );\n // キャッシュした色を使用(パフォーマンス向上)\n colors.push(\n lineColor.r * alpha, lineColor.g * alpha, lineColor.b * alpha,\n lineColor.r * alpha, lineColor.g * alpha, lineColor.b * alpha\n );\n }\n }\n }\n }\n }\n }\n\n this.lines.geometry.dispose();\n this.lines.geometry = new THREE.BufferGeometry();\n if (positions.length > 0) {\n this.lines.geometry.setAttribute('position',\n new THREE.Float32BufferAttribute(positions, 3));\n this.lines.geometry.setAttribute('color',\n new THREE.Float32BufferAttribute(colors, 3));\n }\n }\n\n private updateParticlePositions(delta: number) {\n const { width, height } = this.getSize();\n const halfW = width / 2;\n const halfH = height / 2;\n\n for (let i = 0; i < this.config.particleCount; i++) {\n const i3 = i * 3;\n\n // 速度による移動\n this.positions[i3] += this.velocities[i3] * delta;\n this.positions[i3 + 1] += this.velocities[i3 + 1] * delta;\n\n // 境界でラップアラウンド\n if (this.positions[i3] > halfW) this.positions[i3] = -halfW;\n if (this.positions[i3] < -halfW) this.positions[i3] = halfW;\n if (this.positions[i3 + 1] > halfH) this.positions[i3 + 1] = -halfH;\n if (this.positions[i3 + 1] < -halfH) this.positions[i3 + 1] = halfH;\n }\n\n this.particles.geometry.attributes['position'].needsUpdate = true;\n }\n\n private animate = () => {\n if (!this.isRunning) return;\n\n const delta = this.clock.getDelta();\n const elapsed = this.clock.getElapsedTime();\n\n // パーティクル位置更新\n this.updateParticlePositions(delta);\n\n // シェーダーuniform更新\n const material = this.particles.material as THREE.ShaderMaterial;\n material.uniforms['uTime'].value = elapsed;\n\n // 接続線更新(3フレームに1回にしてパフォーマンス向上)\n this.frameCount++;\n if (this.frameCount % 3 === 0) {\n this.updateConnections();\n }\n\n // 描画\n this.renderer.render(this.scene, this.camera);\n requestAnimationFrame(this.animate);\n };\n\n private getSize() {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n }\n\n private setupResizeHandler() {\n window.addEventListener('resize', () => {\n const { width, height } = this.getSize();\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n this.renderer.setSize(width, height);\n\n const material = this.particles.material as THREE.ShaderMaterial;\n material.uniforms['uBounds'].value.set(width / 2, height / 2);\n });\n }\n\n private setupVisibilityHandler() {\n document.addEventListener('visibilitychange', () => {\n if (document.hidden) {\n this.stop();\n } else {\n this.start();\n }\n });\n }\n\n start() {\n if (this.isRunning) return;\n this.isRunning = true;\n this.clock.start();\n requestAnimationFrame(this.animate);\n }\n\n stop() {\n this.isRunning = false;\n this.clock.stop();\n }\n\n dispose() {\n this.stop();\n this.particles.geometry.dispose();\n (this.particles.material as THREE.Material).dispose();\n this.lines.geometry.dispose();\n (this.lines.material as THREE.Material).dispose();\n this.renderer.dispose();\n this.config.container.removeChild(this.renderer.domElement);\n }\n}\n","import { Component, input, ElementRef, afterNextRender, OnDestroy, viewChild } from '@angular/core';\nimport { WebGLParticleSystem } from './utils';\n\n@Component({\n selector: 'app-background-template',\n standalone: true,\n template: `\n <div #container></div>\n <div class=\"overlay\">\n <div class=\"scanlines\"></div>\n <div class=\"glitch-text\" [class.glitch]=\"isGlitching\">\n {{ currentMessage }}\n </div>\n </div>\n <div class=\"content\">\n @if (title()) {\n <h1 class=\"title\">{{ title() }}</h1>\n }\n <ng-content></ng-content>\n </div>\n `,\n styles: `\n :host {\n display: block;\n position: fixed;\n width: 100%;\n height: 100vh;\n color: white;\n z-index: -1;\n }\n\n .overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 0;\n }\n\n .scanlines {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: repeating-linear-gradient(\n 0deg,\n rgba(0, 0, 0, 0.1) 0px,\n rgba(0, 0, 0, 0.1) 1px,\n transparent 1px,\n transparent 2px\n );\n opacity: 0.3;\n }\n\n .glitch-text {\n position: absolute;\n top: 20px;\n left: 20px;\n font-family: \"Courier New\", monospace;\n font-size: 14px;\n color: rgba(0, 255, 255, 0.8);\n text-shadow: 0 0 10px rgba(0, 255, 255, 0.5);\n white-space: pre-line;\n transition: transform 0.1s;\n }\n\n .glitch-text.glitch {\n animation: glitch 0.3s ease-in-out;\n }\n\n @keyframes glitch {\n 0%, 100% { transform: translate(0); }\n 20% { transform: translate(-2px, 2px); }\n 40% { transform: translate(2px, -2px); }\n 60% { transform: translate(-1px, -1px); }\n 80% { transform: translate(1px, 1px); }\n }\n\n .content {\n position: relative;\n z-index: 1;\n padding: 2rem;\n }\n\n .title {\n font-size: 2rem;\n margin-bottom: 1rem;\n font-family: \"Courier New\", monospace;\n text-shadow: 0 0 10px rgba(0, 255, 255, 0.5);\n }\n `\n})\nexport class BackgroundTemplate implements OnDestroy {\n title = input<string>('');\n\n private container = viewChild.required<ElementRef<HTMLDivElement>>('container');\n private particleSystem: WebGLParticleSystem | null = null;\n private glitchInterval: number | null = null;\n\n protected currentMessage = '(x_x) PROTOCOL.7 (x_x)';\n protected isGlitching = false;\n\n private messages = [\n '(x_x) PROTOCOL.7 (x_x)',\n '[MACHINA:01] INITIALIZING...',\n '(>_<) SYSTEM OVERLOAD (>_<)',\n '▓▓▒▒░░W I R E D░░▒▒▓▓',\n '【=◈︿◈=】LAYER:13【=◈︿◈=】',\n '[▀▄▀▄▀▄] NAV¡GATOR [▄▀▄▀▄▀]',\n '(╥﹏╥) ERROR_404 (╥﹏╥)',\n '▌│█║▌║▌║ CONNECTING... ║▌║▌║█│▌'\n ];\n private messageIndex = 0;\n\n constructor() {\n afterNextRender(() => {\n this.particleSystem = new WebGLParticleSystem({\n container: this.container().nativeElement,\n baseHue: 180, // シアン〜グリーン系(Lainテーマ)\n connectionDistance: 80,\n });\n this.particleSystem.start();\n\n // グリッチエフェクト(5秒ごと)\n this.glitchInterval = window.setInterval(() => this.triggerGlitch(), 5000);\n });\n }\n\n private triggerGlitch() {\n this.isGlitching = true;\n this.messageIndex = (this.messageIndex + 1) % this.messages.length;\n this.currentMessage = this.messages[this.messageIndex];\n\n setTimeout(() => {\n this.isGlitching = false;\n }, 300);\n }\n\n ngOnDestroy() {\n this.particleSystem?.dispose();\n if (this.glitchInterval !== null) {\n clearInterval(this.glitchInterval);\n }\n }\n}\n","import { Component, ElementRef, afterNextRender, OnDestroy, viewChild } from '@angular/core';\nimport { WebGLParticleSystem } from './utils';\n\n@Component({\n selector: 'machina-templates-background',\n standalone: true,\n template: `<div #container></div>`,\n styles: `\n :host {\n display: block;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: -1;\n pointer-events: none;\n }\n `\n})\nexport class MachinaBackgroundTemplate implements OnDestroy {\n private container = viewChild.required<ElementRef<HTMLDivElement>>('container');\n private particleSystem: WebGLParticleSystem | null = null;\n\n constructor() {\n afterNextRender(() => {\n this.particleSystem = new WebGLParticleSystem({\n container: this.container().nativeElement,\n // baseHue未指定 = 全色相ランダム(元の実装と同じ)\n });\n this.particleSystem.start();\n });\n }\n\n ngOnDestroy() {\n this.particleSystem?.dispose();\n }\n}\n","import { provideComponent } from '@ng-atomic/core';\nimport { BackgroundTemplate as LainBapBackgroundTemplate } from './lain-background.template';\nimport { BackgroundTemplateStore } from '@ng-atomic/components/templates/background';\nimport { MachinaBackgroundTemplate } from './background.template';\n\nexport * from './background.template';\n\nexport function provideMachinaBackgroundTemplate() {\n return provideComponent(BackgroundTemplateStore, () => MachinaBackgroundTemplate);\n}\n\nexport function provideLainBackgroundTemplate() {\n return provideComponent(BackgroundTemplateStore, () => LainBapBackgroundTemplate);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["LainBapBackgroundTemplate"],"mappings":";;;;;;AAAO,MAAM,oBAAoB,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2B9C;;AC3BM,MAAM,sBAAsB,cAAc;;;;;;;;;;;;;;;;;;;;;;;CAuBhD;;MCVY,mBAAmB,CAAA;AACtB,IAAA,KAAK;AACL,IAAA,MAAM;AACN,IAAA,QAAQ;AACR,IAAA,SAAS;AACT,IAAA,KAAK;AACL,IAAA,KAAK;AACL,IAAA,MAAM;AACN,IAAA,SAAS;AACT,IAAA,UAAU;IACV,SAAS,GAAG,KAAK;AACjB,IAAA,UAAU,GAAG,CAAC,CAAC;AAEvB,IAAA,WAAA,CAAY,MAA4B,EAAA;QACtC,IAAI,CAAC,MAAM,GAAG;YACZ,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,aAAa,EAAE,MAAM,CAAC,aAAa,IAAI,IAAI,CAAC,uBAAuB,EAAE;AACrE,YAAA,kBAAkB,EAAE,MAAM,CAAC,kBAAkB,IAAI,GAAG;YACpD,OAAO,EAAE,MAAM,CAAC,OAAO,IAAI,CAAC,CAAC;AAC7B,YAAA,QAAQ,EAAE,MAAM,CAAC,QAAQ,IAAI,EAAE;SAChC;QAED,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,QAAA,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC;QACjD,IAAI,CAAC,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE;AAC9B,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC;AAChE,QAAA,IAAI,CAAC,UAAU,GAAG,IAAI,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,aAAa,GAAG,CAAC,CAAC;AAEjE,QAAA,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,YAAY,EAAE;AACjC,QAAA,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,cAAc,EAAE;AACrC,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,eAAe,EAAE;AACvC,QAAA,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE;QAE/B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC;QAC9B,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC;QAE1B,IAAI,CAAC,kBAAkB,EAAE;QACzB,IAAI,CAAC,sBAAsB,EAAE;IAC/B;IAEQ,uBAAuB,GAAA;QAC7B,MAAM,QAAQ,GAAG,sBAAsB,CAAC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC;;QAEjE,OAAO,QAAQ,GAAG,EAAE,GAAG,GAAG;IAC5B;IAEQ,YAAY,GAAA;QAClB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;AACxC,QAAA,MAAM,MAAM,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC,EAAE,EAAE,KAAK,GAAG,MAAM,EAAE,CAAC,EAAE,IAAI,CAAC;AACvE,QAAA,MAAM,CAAC,QAAQ,CAAC,CAAC,GAAG,GAAG;AACvB,QAAA,OAAO,MAAM;IACf;IAEQ,cAAc,GAAA;QACpB,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;AACxC,QAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,aAAa,CAAC;AACvC,YAAA,SAAS,EAAE,IAAI;YACf,KAAK,EAAE,KAAK;AACb,SAAA,CAAC;AACF,QAAA,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;AAC/B,QAAA,QAAQ,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,gBAAgB,EAAE,CAAC,CAAC,CAAC;QAC5D,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;QACpC,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC;;QAGtD,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,QAAQ,GAAG,UAAU;QAC/C,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG;QACnC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG;QACpC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK,GAAG,MAAM;QACxC,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM;AAEzC,QAAA,OAAO,QAAQ;IACjB;IAEQ,eAAe,GAAA;QACrB,MAAM,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC,MAAM;QAC9C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;AAExC,QAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,cAAc,EAAE;QAC3C,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC,aAAa,GAAG,CAAC,CAAC;AAClD,QAAA,MAAM,KAAK,GAAG,IAAI,YAAY,CAAC,aAAa,CAAC;AAE7C,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;AACtC,YAAA,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC;;AAGhB,YAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,KAAK;AAClD,YAAA,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,MAAM;AACvD,YAAA,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,GAAG;;AAGpD,YAAA,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,EAAE;AAChD,YAAA,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,IAAI,EAAE;YACpD,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC;;AAG3B,YAAA,MAAM,GAAG,GAAG,OAAO,GAAG;AACpB,kBAAE,IAAI,CAAC,MAAM,EAAE;AACf,kBAAE,CAAC,OAAO,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,EAAE,IAAI,GAAG;;AAExC,YAAA,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC;AACrD,YAAA,MAAM,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,CAAC;YACpB,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;YACxB,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC;AAExB,YAAA,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC;AAEA,QAAA,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AAC/E,QAAA,QAAQ,CAAC,YAAY,CAAC,OAAO,EAAE,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;AACpE,QAAA,QAAQ,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,KAAK,CAAC,eAAe,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;AAChF,QAAA,QAAQ,CAAC,YAAY,CAAC,MAAM,EAAE,IAAI,KAAK,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;AAElE,QAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,cAAc,CAAC;AACxC,YAAA,YAAY,EAAE,oBAAoB;AAClC,YAAA,cAAc,EAAE,sBAAsB;AACtC,YAAA,QAAQ,EAAE;AACR,gBAAA,KAAK,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE;AACnB,gBAAA,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC,EAAE;AAC7D,aAAA;AACD,YAAA,WAAW,EAAE,IAAI;AACjB,YAAA,YAAY,EAAE,IAAI;YAClB,QAAQ,EAAE,KAAK,CAAC,gBAAgB;AAChC,YAAA,UAAU,EAAE,KAAK;AAClB,SAAA,CAAC;QAEF,OAAO,IAAI,KAAK,CAAC,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC7C;IAEQ,WAAW,GAAA;AACjB,QAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,cAAc,EAAE;AAC3C,QAAA,MAAM,QAAQ,GAAG,IAAI,KAAK,CAAC,iBAAiB,CAAC;AAC3C,YAAA,YAAY,EAAE,IAAI;AAClB,YAAA,WAAW,EAAE,IAAI;YACjB,QAAQ,EAAE,KAAK,CAAC,gBAAgB;AAChC,YAAA,UAAU,EAAE,KAAK;AAClB,SAAA,CAAC;QACF,OAAO,IAAI,KAAK,CAAC,YAAY,CAAC,QAAQ,EAAE,QAAQ,CAAC;IACnD;IAEQ,iBAAiB,GAAA;AACvB,QAAA,MAAM,EAAE,aAAa,EAAE,kBAAkB,EAAE,OAAO,EAAE,QAAQ,EAAE,GAAG,IAAI,CAAC,MAAM;QAC5E,MAAM,SAAS,GAAa,EAAE;QAC9B,MAAM,MAAM,GAAa,EAAE;;QAG3B,MAAM,QAAQ,GAAG,kBAAkB;AACnC,QAAA,MAAM,IAAI,GAAG,IAAI,GAAG,EAAoB;;AAGxC,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,aAAa,EAAE,CAAC,EAAE,EAAE;YACtC,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC;AAC/B,YAAA,MAAM,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC;YACtC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,QAAQ,CAAC;AACtC,YAAA,MAAM,GAAG,GAAG,CAAA,EAAG,KAAK,CAAA,CAAA,EAAI,KAAK,EAAE;AAC/B,YAAA,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;AAAE,gBAAA,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,CAAC;YACrC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACxB;;QAGA,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;AAC3C,QAAA,MAAM,OAAO,GAAG,OAAO,GAAG;cACtB,CAAC,CAAC,OAAO,GAAG,QAAQ,IAAI,GAAG,IAAI;AACjC,cAAE,CAAC,OAAO,GAAG,CAAC,OAAO,GAAG,QAAQ,IAAI,EAAE,IAAI,GAAG;;AAE/C,QAAA,MAAM,SAAS,GAAG,IAAI,KAAK,CAAC,KAAK,EAAE,CAAC,MAAM,CAAC,OAAO,EAAE,GAAG,EAAE,IAAI,CAAC;;AAG9D,QAAA,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE;AAC3C,YAAA,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC;AAE3C,YAAA,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE;AAC/B,gBAAA,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC,EAAE,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,EAAE;oBAC/B,MAAM,WAAW,GAAG,CAAA,EAAG,EAAE,GAAG,EAAE,CAAA,CAAA,EAAI,EAAE,GAAG,EAAE,CAAA,CAAE;oBAC3C,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC;AAC7C,oBAAA,IAAI,CAAC,eAAe;wBAAE;AAEtB,oBAAA,KAAK,MAAM,CAAC,IAAI,OAAO,EAAE;AACvB,wBAAA,KAAK,MAAM,CAAC,IAAI,eAAe,EAAE;4BAC/B,IAAI,CAAC,IAAI,CAAC;gCAAE;AAEZ,4BAAA,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC;AAChB,4BAAA,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC;AAChB,4BAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;AACnD,4BAAA,MAAM,GAAG,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC;AAC3D,4BAAA,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC;AAE7C,4BAAA,IAAI,IAAI,GAAG,kBAAkB,EAAE;gCAC7B,MAAM,KAAK,GAAG,CAAC,CAAC,GAAG,IAAI,GAAG,kBAAkB,IAAI,GAAG;gCAEnD,SAAS,CAAC,IAAI,CACZ,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAClE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,CACnE;;AAED,gCAAA,MAAM,CAAC,IAAI,CACT,SAAS,CAAC,CAAC,GAAG,KAAK,EAAE,SAAS,CAAC,CAAC,GAAG,KAAK,EAAE,SAAS,CAAC,CAAC,GAAG,KAAK,EAC7D,SAAS,CAAC,CAAC,GAAG,KAAK,EAAE,SAAS,CAAC,CAAC,GAAG,KAAK,EAAE,SAAS,CAAC,CAAC,GAAG,KAAK,CAC9D;4BACH;wBACF;oBACF;gBACF;YACF;QACF;AAEA,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE;QAC7B,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,KAAK,CAAC,cAAc,EAAE;AAChD,QAAA,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,EAAE;AACxB,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,UAAU,EACzC,IAAI,KAAK,CAAC,sBAAsB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AACjD,YAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,YAAY,CAAC,OAAO,EACtC,IAAI,KAAK,CAAC,sBAAsB,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAChD;IACF;AAEQ,IAAA,uBAAuB,CAAC,KAAa,EAAA;QAC3C,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;AACxC,QAAA,MAAM,KAAK,GAAG,KAAK,GAAG,CAAC;AACvB,QAAA,MAAM,KAAK,GAAG,MAAM,GAAG,CAAC;AAExB,QAAA,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,aAAa,EAAE,CAAC,EAAE,EAAE;AAClD,YAAA,MAAM,EAAE,GAAG,CAAC,GAAG,CAAC;;AAGhB,YAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,GAAG,KAAK;AACjD,YAAA,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK;;AAGzD,YAAA,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,KAAK;gBAAE,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK;YAC3D,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK;AAAE,gBAAA,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC,GAAG,KAAK;YAC3D,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK;gBAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK;YACnE,IAAI,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK;gBAAE,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,CAAC,CAAC,GAAG,KAAK;QACrE;AAEA,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC,WAAW,GAAG,IAAI;IACnE;IAEQ,OAAO,GAAG,MAAK;QACrB,IAAI,CAAC,IAAI,CAAC,SAAS;YAAE;QAErB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,cAAc,EAAE;;AAG3C,QAAA,IAAI,CAAC,uBAAuB,CAAC,KAAK,CAAC;;AAGnC,QAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAgC;QAChE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,GAAG,OAAO;;QAG1C,IAAI,CAAC,UAAU,EAAE;QACjB,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,KAAK,CAAC,EAAE;YAC7B,IAAI,CAAC,iBAAiB,EAAE;QAC1B;;AAGA,QAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;AAC7C,QAAA,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;AACrC,IAAA,CAAC;IAEO,OAAO,GAAA;QACb,OAAO;YACL,KAAK,EAAE,MAAM,CAAC,UAAU;YACxB,MAAM,EAAE,MAAM,CAAC,WAAW;SAC3B;IACH;IAEQ,kBAAkB,GAAA;AACxB,QAAA,MAAM,CAAC,gBAAgB,CAAC,QAAQ,EAAE,MAAK;YACrC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE;YACxC,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,KAAK,GAAG,MAAM;AACnC,YAAA,IAAI,CAAC,MAAM,CAAC,sBAAsB,EAAE;YACpC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC;AAEpC,YAAA,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAgC;AAChE,YAAA,QAAQ,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,GAAG,CAAC,EAAE,MAAM,GAAG,CAAC,CAAC;AAC/D,QAAA,CAAC,CAAC;IACJ;IAEQ,sBAAsB,GAAA;AAC5B,QAAA,QAAQ,CAAC,gBAAgB,CAAC,kBAAkB,EAAE,MAAK;AACjD,YAAA,IAAI,QAAQ,CAAC,MAAM,EAAE;gBACnB,IAAI,CAAC,IAAI,EAAE;YACb;iBAAO;gBACL,IAAI,CAAC,KAAK,EAAE;YACd;AACF,QAAA,CAAC,CAAC;IACJ;IAEA,KAAK,GAAA;QACH,IAAI,IAAI,CAAC,SAAS;YAAE;AACpB,QAAA,IAAI,CAAC,SAAS,GAAG,IAAI;AACrB,QAAA,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;AAClB,QAAA,qBAAqB,CAAC,IAAI,CAAC,OAAO,CAAC;IACrC;IAEA,IAAI,GAAA;AACF,QAAA,IAAI,CAAC,SAAS,GAAG,KAAK;AACtB,QAAA,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;IACnB;IAEA,OAAO,GAAA;QACL,IAAI,CAAC,IAAI,EAAE;AACX,QAAA,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,EAAE;AAChC,QAAA,IAAI,CAAC,SAAS,CAAC,QAA2B,CAAC,OAAO,EAAE;AACrD,QAAA,IAAI,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAO,EAAE;AAC5B,QAAA,IAAI,CAAC,KAAK,CAAC,QAA2B,CAAC,OAAO,EAAE;AACjD,QAAA,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE;AACvB,QAAA,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,WAAW,CAAC,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC;IAC7D;AACD;;MCvOY,kBAAkB,CAAA;AAC7B,IAAA,KAAK,GAAG,KAAK,CAAS,EAAE,iDAAC;AAEjB,IAAA,SAAS,GAAG,SAAS,CAAC,QAAQ,CAA6B,WAAW,CAAC;IACvE,cAAc,GAA+B,IAAI;IACjD,cAAc,GAAkB,IAAI;IAElC,cAAc,GAAG,wBAAwB;IACzC,WAAW,GAAG,KAAK;AAErB,IAAA,QAAQ,GAAG;QACjB,wBAAwB;QACxB,8BAA8B;QAC9B,6BAA6B;QAC7B,uBAAuB;QACvB,wBAAwB;QACxB,6BAA6B;QAC7B,uBAAuB;QACvB;KACD;IACO,YAAY,GAAG,CAAC;AAExB,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,mBAAmB,CAAC;AAC5C,gBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa;gBACzC,OAAO,EAAE,GAAG;AACZ,gBAAA,kBAAkB,EAAE,EAAE;AACvB,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;;AAG3B,YAAA,IAAI,CAAC,cAAc,GAAG,MAAM,CAAC,WAAW,CAAC,MAAM,IAAI,CAAC,aAAa,EAAE,EAAE,IAAI,CAAC;AAC5E,QAAA,CAAC,CAAC;IACJ;IAEQ,aAAa,GAAA;AACnB,QAAA,IAAI,CAAC,WAAW,GAAG,IAAI;AACvB,QAAA,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,CAAC,YAAY,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM;QAClE,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,YAAY,CAAC;QAEtD,UAAU,CAAC,MAAK;AACd,YAAA,IAAI,CAAC,WAAW,GAAG,KAAK;QAC1B,CAAC,EAAE,GAAG,CAAC;IACT;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE;AAC9B,QAAA,IAAI,IAAI,CAAC,cAAc,KAAK,IAAI,EAAE;AAChC,YAAA,aAAa,CAAC,IAAI,CAAC,cAAc,CAAC;QACpC;IACF;uGAnDW,kBAAkB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAlB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,kBAAkB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,KAAA,EAAA,EAAA,iBAAA,EAAA,OAAA,EAAA,UAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,UAAA,EAAA,KAAA,EAAA,iBAAA,EAAA,IAAA,EAAA,EAAA,EAAA,WAAA,EAAA,CAAA,EAAA,YAAA,EAAA,WAAA,EAAA,KAAA,EAAA,IAAA,EAAA,SAAA,EAAA,CAAA,WAAA,CAAA,EAAA,WAAA,EAAA,IAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EAzFnB;;;;;;;;;;;;;;AAcT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,m8BAAA,CAAA,EAAA,CAAA;;2FA2EU,kBAAkB,EAAA,UAAA,EAAA,CAAA;kBA5F9B,SAAS;+BACE,yBAAyB,EAAA,UAAA,EACvB,IAAI,EAAA,QAAA,EACN;;;;;;;;;;;;;;AAcT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,m8BAAA,CAAA,EAAA;2LA8EkE,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;MC9EnE,yBAAyB,CAAA;AAC5B,IAAA,SAAS,GAAG,SAAS,CAAC,QAAQ,CAA6B,WAAW,CAAC;IACvE,cAAc,GAA+B,IAAI;AAEzD,IAAA,WAAA,GAAA;QACE,eAAe,CAAC,MAAK;AACnB,YAAA,IAAI,CAAC,cAAc,GAAG,IAAI,mBAAmB,CAAC;AAC5C,gBAAA,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,aAAa;;AAE1C,aAAA,CAAC;AACF,YAAA,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE;AAC7B,QAAA,CAAC,CAAC;IACJ;IAEA,WAAW,GAAA;AACT,QAAA,IAAI,CAAC,cAAc,EAAE,OAAO,EAAE;IAChC;uGAhBW,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,gNAd1B,CAAA,sBAAA,CAAwB,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,0GAAA,CAAA,EAAA,CAAA;;2FAcvB,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBAjBrC,SAAS;+BACE,8BAA8B,EAAA,UAAA,EAC5B,IAAI,EAAA,QAAA,EACN,CAAA,sBAAA,CAAwB,EAAA,MAAA,EAAA,CAAA,0GAAA,CAAA,EAAA;iGAeiC,WAAW,EAAA,EAAA,QAAA,EAAA,IAAA,EAAA,CAAA,EAAA,CAAA,EAAA,EAAA,CAAA;;SCdhE,gCAAgC,GAAA;IAC9C,OAAO,gBAAgB,CAAC,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACnF;SAEgB,6BAA6B,GAAA;IAC3C,OAAO,gBAAgB,CAAC,uBAAuB,EAAE,MAAMA,kBAAyB,CAAC;AACnF;;ACbA;;AAEG;;;;"}
1
+ {"version":3,"file":"xxmachina-components-templates-background.mjs","sources":["../../../../../packages/@xxmachina/components/src/lib/templates/background/shaders/particle.vert.ts","../../../../../packages/@xxmachina/components/src/lib/templates/background/shaders/particle.frag.ts","../../../../../packages/@xxmachina/components/src/lib/templates/background/utils/webgl-particle-system.ts","../../../../../packages/@xxmachina/components/src/lib/templates/background/lain-background.template.ts","../../../../../packages/@xxmachina/components/src/lib/templates/background/background.template.ts","../../../../../packages/@xxmachina/components/src/lib/templates/background/index.ts","../../../../../packages/@xxmachina/components/src/lib/templates/background/xxmachina-components-templates-background.ts"],"sourcesContent":["export const particleVertexShader = /* glsl */ `\nattribute vec3 velocity;\nattribute float size;\n\nuniform float uTime;\nuniform vec2 uBounds;\n\nvarying vec3 vColor;\nvarying float vAlpha;\n\nvoid main() {\n vColor = color;\n vAlpha = 1.0;\n\n // GPU上で位置更新(時間ベース)\n vec3 pos = position;\n pos.x += velocity.x * uTime * 0.01;\n pos.y += velocity.y * uTime * 0.01;\n\n // 境界でラップアラウンド\n pos.x = mod(pos.x + uBounds.x, uBounds.x * 2.0) - uBounds.x;\n pos.y = mod(pos.y + uBounds.y, uBounds.y * 2.0) - uBounds.y;\n\n vec4 mvPosition = modelViewMatrix * vec4(pos, 1.0);\n gl_PointSize = size * (300.0 / -mvPosition.z);\n gl_Position = projectionMatrix * mvPosition;\n}\n`;\n","export const particleFragmentShader = /* glsl */ `\nvarying vec3 vColor;\nvarying float vAlpha;\n\nvoid main() {\n // 中心からの距離\n float dist = length(gl_PointCoord - vec2(0.5));\n\n // 円形にクリップ\n if (dist > 0.5) discard;\n\n // 強いグロー効果(Canvas版のshadowBlur=15を再現)\n float coreBrightness = exp(-dist * 8.0); // コア部分(非常に明るい)\n float glowBrightness = exp(-dist * 2.5) * 0.6; // 外側のソフトグロー\n float outerGlow = exp(-dist * 1.5) * 0.3; // さらに外側の淡いグロー\n float glow = coreBrightness + glowBrightness + outerGlow;\n\n // 色を強くブースト(黒背景で映える明るさに)\n vec3 boostedColor = vColor * 1.5;\n float alpha = min(glow * vAlpha, 1.0);\n\n gl_FragColor = vec4(boostedColor, alpha);\n}\n`;\n","import * as THREE from 'three';\nimport { particleVertexShader, particleFragmentShader } from '../shaders';\n\nexport interface ParticleSystemConfig {\n container: HTMLElement;\n particleCount?: number;\n connectionDistance?: number;\n /** 固定色相を使用する場合に指定(未指定で全色相ランダム) */\n baseHue?: number;\n /** 接続線のhue変化速度(デフォルト: 30) */\n hueSpeed?: number;\n}\n\nexport class WebGLParticleSystem {\n private scene: THREE.Scene;\n private camera: THREE.PerspectiveCamera;\n private renderer: THREE.WebGLRenderer;\n private particles: THREE.Points;\n private lines: THREE.LineSegments;\n private clock: THREE.Clock;\n private config: Required<ParticleSystemConfig>;\n private positions: Float32Array;\n private velocities: Float32Array;\n private isRunning = false;\n private frameCount = 0; // 接続線更新頻度制御用\n private readonly onResize = () => {\n const { width, height } = this.getSize();\n this.camera.aspect = width / height;\n this.camera.updateProjectionMatrix();\n this.renderer.setSize(width, height);\n const material = this.particles.material as THREE.ShaderMaterial;\n material.uniforms['uBounds'].value.set(width / 2, height / 2);\n };\n private readonly onVisibilityChange = () => {\n if (document.hidden) {\n this.stop();\n } else {\n this.start();\n }\n };\n\n constructor(config: ParticleSystemConfig) {\n this.config = {\n container: config.container,\n particleCount: config.particleCount ?? this.getOptimalParticleCount(),\n connectionDistance: config.connectionDistance ?? 100, // パフォーマンス優先で短縮\n baseHue: config.baseHue ?? -1, // -1 = 全色相ランダム\n hueSpeed: config.hueSpeed ?? 30,\n };\n\n this.scene = new THREE.Scene();\n this.scene.background = new THREE.Color(0x000000);\n this.clock = new THREE.Clock();\n this.positions = new Float32Array(this.config.particleCount * 3);\n this.velocities = new Float32Array(this.config.particleCount * 3);\n\n this.camera = this.createCamera();\n this.renderer = this.createRenderer();\n this.particles = this.createParticles();\n this.lines = this.createLines();\n\n this.scene.add(this.particles);\n this.scene.add(this.lines);\n\n this.setupResizeHandler();\n this.setupVisibilityHandler();\n }\n\n private getOptimalParticleCount(): number {\n const isMobile = /iPhone|iPad|Android/i.test(navigator.userAgent);\n // パフォーマンス優先:パーティクル数を削減\n return isMobile ? 60 : 100;\n }\n\n private createCamera(): THREE.PerspectiveCamera {\n const { width, height } = this.getSize();\n const camera = new THREE.PerspectiveCamera(75, width / height, 1, 2000);\n camera.position.z = 400;\n return camera;\n }\n\n private createRenderer(): THREE.WebGLRenderer {\n const { width, height } = this.getSize();\n const renderer = new THREE.WebGLRenderer({\n antialias: true,\n alpha: false, // 黒背景を強制(透明にしない)\n });\n renderer.setSize(width, height);\n renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2));\n renderer.setClearColor(0x000000, 1); // 明示的に黒背景を設定\n this.config.container.appendChild(renderer.domElement);\n\n // Canvas styling - コンテナ内に配置(position: absoluteに変更)\n renderer.domElement.style.position = 'absolute';\n renderer.domElement.style.top = '0';\n renderer.domElement.style.left = '0';\n renderer.domElement.style.width = '100%';\n renderer.domElement.style.height = '100%';\n\n return renderer;\n }\n\n private createParticles(): THREE.Points {\n const { particleCount, baseHue } = this.config;\n const { width, height } = this.getSize();\n\n const geometry = new THREE.BufferGeometry();\n const colors = new Float32Array(particleCount * 3);\n const sizes = new Float32Array(particleCount);\n\n for (let i = 0; i < particleCount; i++) {\n const i3 = i * 3;\n\n // ランダム位置\n this.positions[i3] = (Math.random() - 0.5) * width;\n this.positions[i3 + 1] = (Math.random() - 0.5) * height;\n this.positions[i3 + 2] = (Math.random() - 0.5) * 100;\n\n // ランダム速度\n this.velocities[i3] = (Math.random() - 0.5) * 50;\n this.velocities[i3 + 1] = (Math.random() - 0.5) * 50;\n this.velocities[i3 + 2] = 0;\n\n // HSLカラー(baseHue < 0 なら全色相ランダム)\n const hue = baseHue < 0\n ? Math.random() // 0-1 (全色相)\n : (baseHue + Math.random() * 60) / 360;\n // 彩度70%、明度60%で鮮やかに(Canvas版のshadowBlur効果を再現)\n const color = new THREE.Color().setHSL(hue, 0.7, 0.6);\n colors[i3] = color.r;\n colors[i3 + 1] = color.g;\n colors[i3 + 2] = color.b;\n\n sizes[i] = Math.random() * 2 + 2; // サイズ2-4(パフォーマンス優先)\n }\n\n geometry.setAttribute('position', new THREE.BufferAttribute(this.positions, 3));\n geometry.setAttribute('color', new THREE.BufferAttribute(colors, 3));\n geometry.setAttribute('velocity', new THREE.BufferAttribute(this.velocities, 3));\n geometry.setAttribute('size', new THREE.BufferAttribute(sizes, 1));\n\n const material = new THREE.ShaderMaterial({\n vertexShader: particleVertexShader,\n fragmentShader: particleFragmentShader,\n uniforms: {\n uTime: { value: 0 },\n uBounds: { value: new THREE.Vector2(width / 2, height / 2) },\n },\n transparent: true,\n vertexColors: true,\n blending: THREE.AdditiveBlending,\n depthWrite: false,\n });\n\n return new THREE.Points(geometry, material);\n }\n\n private createLines(): THREE.LineSegments {\n const geometry = new THREE.BufferGeometry();\n const material = new THREE.LineBasicMaterial({\n vertexColors: true,\n transparent: true,\n blending: THREE.AdditiveBlending,\n depthWrite: false,\n });\n return new THREE.LineSegments(geometry, material);\n }\n\n private updateConnections() {\n const { particleCount, connectionDistance, baseHue, hueSpeed } = this.config;\n const positions: number[] = [];\n const colors: number[] = [];\n\n // 空間分割グリッド\n const cellSize = connectionDistance;\n const grid = new Map<string, number[]>();\n\n // パーティクルをグリッドに配置\n for (let i = 0; i < particleCount; i++) {\n const x = this.positions[i * 3];\n const y = this.positions[i * 3 + 1];\n const cellX = Math.floor(x / cellSize);\n const cellY = Math.floor(y / cellSize);\n const key = `${cellX},${cellY}`;\n if (!grid.has(key)) grid.set(key, []);\n grid.get(key)!.push(i);\n }\n\n // 接続線のhue(全色相でゆっくり変化)\n const elapsed = this.clock.getElapsedTime();\n const lineHue = baseHue < 0\n ? ((elapsed * hueSpeed) % 360) / 360\n : (baseHue + (elapsed * hueSpeed) % 60) / 360;\n // 色計算をキャッシュ(パフォーマンス向上)\n const lineColor = new THREE.Color().setHSL(lineHue, 0.8, 0.65);\n\n // 近傍セルのみ探索\n for (const [key, indices] of grid.entries()) {\n const [cx, cy] = key.split(',').map(Number);\n\n for (let dx = -1; dx <= 1; dx++) {\n for (let dy = -1; dy <= 1; dy++) {\n const neighborKey = `${cx + dx},${cy + dy}`;\n const neighborIndices = grid.get(neighborKey);\n if (!neighborIndices) continue;\n\n for (const i of indices) {\n for (const j of neighborIndices) {\n if (i >= j) continue;\n\n const i3 = i * 3;\n const j3 = j * 3;\n const pdx = this.positions[i3] - this.positions[j3];\n const pdy = this.positions[i3 + 1] - this.positions[j3 + 1];\n const dist = Math.sqrt(pdx * pdx + pdy * pdy);\n\n if (dist < connectionDistance) {\n const alpha = (1 - dist / connectionDistance) * 0.7;\n\n positions.push(\n this.positions[i3], this.positions[i3 + 1], this.positions[i3 + 2],\n this.positions[j3], this.positions[j3 + 1], this.positions[j3 + 2]\n );\n // キャッシュした色を使用(パフォーマンス向上)\n colors.push(\n lineColor.r * alpha, lineColor.g * alpha, lineColor.b * alpha,\n lineColor.r * alpha, lineColor.g * alpha, lineColor.b * alpha\n );\n }\n }\n }\n }\n }\n }\n\n this.lines.geometry.dispose();\n this.lines.geometry = new THREE.BufferGeometry();\n if (positions.length > 0) {\n this.lines.geometry.setAttribute('position',\n new THREE.Float32BufferAttribute(positions, 3));\n this.lines.geometry.setAttribute('color',\n new THREE.Float32BufferAttribute(colors, 3));\n }\n }\n\n private updateParticlePositions(delta: number) {\n const { width, height } = this.getSize();\n const halfW = width / 2;\n const halfH = height / 2;\n\n for (let i = 0; i < this.config.particleCount; i++) {\n const i3 = i * 3;\n\n // 速度による移動\n this.positions[i3] += this.velocities[i3] * delta;\n this.positions[i3 + 1] += this.velocities[i3 + 1] * delta;\n\n // 境界でラップアラウンド\n if (this.positions[i3] > halfW) this.positions[i3] = -halfW;\n if (this.positions[i3] < -halfW) this.positions[i3] = halfW;\n if (this.positions[i3 + 1] > halfH) this.positions[i3 + 1] = -halfH;\n if (this.positions[i3 + 1] < -halfH) this.positions[i3 + 1] = halfH;\n }\n\n this.particles.geometry.attributes['position'].needsUpdate = true;\n }\n\n private animate = () => {\n if (!this.isRunning) return;\n\n const delta = this.clock.getDelta();\n const elapsed = this.clock.getElapsedTime();\n\n // パーティクル位置更新\n this.updateParticlePositions(delta);\n\n // シェーダーuniform更新\n const material = this.particles.material as THREE.ShaderMaterial;\n material.uniforms['uTime'].value = elapsed;\n\n // 接続線更新(3フレームに1回にしてパフォーマンス向上)\n this.frameCount++;\n if (this.frameCount % 3 === 0) {\n this.updateConnections();\n }\n\n // 描画\n this.renderer.render(this.scene, this.camera);\n requestAnimationFrame(this.animate);\n };\n\n private getSize() {\n return {\n width: window.innerWidth,\n height: window.innerHeight,\n };\n }\n\n private setupResizeHandler() {\n window.addEventListener('resize', this.onResize);\n }\n\n private setupVisibilityHandler() {\n document.addEventListener('visibilitychange', this.onVisibilityChange);\n }\n\n start() {\n if (this.isRunning) return;\n this.isRunning = true;\n this.clock.start();\n requestAnimationFrame(this.animate);\n }\n\n stop() {\n this.isRunning = false;\n this.clock.stop();\n }\n\n dispose() {\n this.stop();\n window.removeEventListener('resize', this.onResize);\n document.removeEventListener('visibilitychange', this.onVisibilityChange);\n this.particles.geometry.dispose();\n (this.particles.material as THREE.Material).dispose();\n this.lines.geometry.dispose();\n (this.lines.material as THREE.Material).dispose();\n this.renderer.dispose();\n this.config.container.removeChild(this.renderer.domElement);\n }\n}\n","import { Component, input, ElementRef, afterNextRender, OnDestroy, viewChild } from '@angular/core';\nimport { WebGLParticleSystem } from './utils';\n\n@Component({\n selector: 'app-background-template',\n standalone: true,\n template: `\n <div #container></div>\n <div class=\"overlay\">\n <div class=\"scanlines\"></div>\n <div class=\"glitch-text\" [class.glitch]=\"isGlitching\">\n {{ currentMessage }}\n </div>\n </div>\n <div class=\"content\">\n @if (title()) {\n <h1 class=\"title\">{{ title() }}</h1>\n }\n <ng-content></ng-content>\n </div>\n `,\n styles: `\n :host {\n display: block;\n position: fixed;\n width: 100%;\n height: 100vh;\n color: white;\n z-index: -1;\n }\n\n .overlay {\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n pointer-events: none;\n z-index: 0;\n }\n\n .scanlines {\n position: absolute;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n background: repeating-linear-gradient(\n 0deg,\n rgba(0, 0, 0, 0.1) 0px,\n rgba(0, 0, 0, 0.1) 1px,\n transparent 1px,\n transparent 2px\n );\n opacity: 0.3;\n }\n\n .glitch-text {\n position: absolute;\n top: 20px;\n left: 20px;\n font-family: \"Courier New\", monospace;\n font-size: 14px;\n color: rgba(0, 255, 255, 0.8);\n text-shadow: 0 0 10px rgba(0, 255, 255, 0.5);\n white-space: pre-line;\n transition: transform 0.1s;\n }\n\n .glitch-text.glitch {\n animation: glitch 0.3s ease-in-out;\n }\n\n @keyframes glitch {\n 0%, 100% { transform: translate(0); }\n 20% { transform: translate(-2px, 2px); }\n 40% { transform: translate(2px, -2px); }\n 60% { transform: translate(-1px, -1px); }\n 80% { transform: translate(1px, 1px); }\n }\n\n .content {\n position: relative;\n z-index: 1;\n padding: 2rem;\n }\n\n .title {\n font-size: 2rem;\n margin-bottom: 1rem;\n font-family: \"Courier New\", monospace;\n text-shadow: 0 0 10px rgba(0, 255, 255, 0.5);\n }\n `\n})\nexport class BackgroundTemplate implements OnDestroy {\n title = input<string>('');\n\n private container = viewChild.required<ElementRef<HTMLDivElement>>('container');\n private particleSystem: WebGLParticleSystem | null = null;\n private glitchInterval: number | null = null;\n\n protected currentMessage = '(x_x) PROTOCOL.7 (x_x)';\n protected isGlitching = false;\n\n private messages = [\n '(x_x) PROTOCOL.7 (x_x)',\n '[MACHINA:01] INITIALIZING...',\n '(>_<) SYSTEM OVERLOAD (>_<)',\n '▓▓▒▒░░W I R E D░░▒▒▓▓',\n '【=◈︿◈=】LAYER:13【=◈︿◈=】',\n '[▀▄▀▄▀▄] NAV¡GATOR [▄▀▄▀▄▀]',\n '(╥﹏╥) ERROR_404 (╥﹏╥)',\n '▌│█║▌║▌║ CONNECTING... ║▌║▌║█│▌'\n ];\n private messageIndex = 0;\n\n constructor() {\n afterNextRender(() => {\n this.particleSystem = new WebGLParticleSystem({\n container: this.container().nativeElement,\n baseHue: 180, // シアン〜グリーン系(Lainテーマ)\n connectionDistance: 80,\n });\n this.particleSystem.start();\n\n // グリッチエフェクト(5秒ごと)\n this.glitchInterval = window.setInterval(() => this.triggerGlitch(), 5000);\n });\n }\n\n private triggerGlitch() {\n this.isGlitching = true;\n this.messageIndex = (this.messageIndex + 1) % this.messages.length;\n this.currentMessage = this.messages[this.messageIndex];\n\n setTimeout(() => {\n this.isGlitching = false;\n }, 300);\n }\n\n ngOnDestroy() {\n this.particleSystem?.dispose();\n if (this.glitchInterval !== null) {\n clearInterval(this.glitchInterval);\n }\n }\n}\n","import { Component, ElementRef, afterNextRender, OnDestroy, viewChild } from '@angular/core';\nimport { WebGLParticleSystem } from './utils';\n\n@Component({\n selector: 'machina-templates-background',\n standalone: true,\n template: `<div #container></div>`,\n styles: `\n :host {\n display: block;\n position: fixed;\n top: 0;\n left: 0;\n width: 100%;\n height: 100%;\n z-index: -1;\n pointer-events: none;\n }\n `\n})\nexport class MachinaBackgroundTemplate implements OnDestroy {\n private container = viewChild.required<ElementRef<HTMLDivElement>>('container');\n private particleSystem: WebGLParticleSystem | null = null;\n\n constructor() {\n afterNextRender(() => {\n this.particleSystem = new WebGLParticleSystem({\n container: this.container().nativeElement,\n // baseHue未指定 = 全色相ランダム(元の実装と同じ)\n });\n this.particleSystem.start();\n });\n }\n\n ngOnDestroy() {\n this.particleSystem?.dispose();\n }\n}\n","import { provideComponent } from '@ng-atomic/core';\nimport { BackgroundTemplate as LainBapBackgroundTemplate } from './lain-background.template';\nimport { BackgroundTemplateStore } from '@ng-atomic/components/templates/background';\nimport { MachinaBackgroundTemplate } from './background.template';\n\nexport * from './background.template';\n\nexport function provideMachinaBackgroundTemplate() {\n return provideComponent(BackgroundTemplateStore, () => MachinaBackgroundTemplate);\n}\n\nexport function provideLainBackgroundTemplate() {\n return provideComponent(BackgroundTemplateStore, () => LainBapBackgroundTemplate);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './index';\n"],"names":["LainBapBackgroundTemplate"],"mappings":"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"}
@@ -234,7 +234,7 @@ class SessionNavigatorOrganism extends NgAtomicComponent {
234
234
  }
235
235
  </div>
236
236
  </mat-toolbar>
237
- `, isInline: true, styles: [":host{display:block;--text: #e0e0e0;--text-SCOPED-IN-session-navigator-Bcyk: var(--text);--sys: #888;--sys-SCOPED-IN-session-navigator-Bcyk: var(--sys);--border: rgba(51, 51, 51, .5);--border-SCOPED-IN-session-navigator-Bcyk: var(--border);--primary-color: #0f0f11;--primary-color-SCOPED-IN-session-navigator-Bcyk: var(--primary-color);--on-primary-color: #e0e0e0;--on-primary-color-SCOPED-IN-session-navigator-Bcyk: var(--on-primary-color);--secondary-color: #888;--secondary-color-SCOPED-IN-session-navigator-Bcyk: var(--secondary-color);--on-secondary-color: #f0f0f0;--on-secondary-color-SCOPED-IN-session-navigator-Bcyk: var(--on-secondary-color);--background-color: #0f0f11;--background-color-SCOPED-IN-session-navigator-Bcyk: var(--background-color);--on-background-color: #e0e0e0;--on-background-color-SCOPED-IN-session-navigator-Bcyk: var(--on-background-color)}:host{display:block;width:100%;height:56px}:host mat-toolbar{display:flex;width:100%;height:100%;padding:0!important;justify-content:space-between;align-items:center;overflow:hidden;transition:background .5s ease-in-out;background-color:var(--primary-color-SCOPED-IN-session-navigator-Bcyk);color:var(--on-primary-color-SCOPED-IN-session-navigator-Bcyk);border-bottom:1px solid var(--border-SCOPED-IN-session-navigator-Bcyk)!important;font-family:SF Mono,Monaco,monospace!important;font-size:12px!important;--mat-toolbar-title-text-size: 12px !important;--mat-sys-title-large-size: 12px !important}:host mat-toolbar>div:first-child,:host mat-toolbar>div:last-child{flex:0 0 auto}:host mat-toolbar>div:nth-child(2){flex:1 1 auto;display:flex;justify-content:flex-start;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}:host mat-toolbar *:not(.mat-icon){font-family:SF Mono,Monaco,monospace!important}:host mat-toolbar span,:host mat-toolbar div,:host mat-toolbar h1,:host mat-toolbar h2,:host mat-toolbar h3,:host mat-toolbar h4,:host mat-toolbar h5,:host mat-toolbar h6{font-size:12px!important;font-family:SF Mono,Monaco,monospace!important;color:var(--text-SCOPED-IN-session-navigator-Bcyk)!important}:host mat-toolbar .mat-button{color:var(--sys-SCOPED-IN-session-navigator-Bcyk)!important;font-family:SF Mono,Monaco,monospace!important}:host mat-toolbar .mat-button:hover{color:var(--text-SCOPED-IN-session-navigator-Bcyk)!important}:host mat-toolbar .mat-icon-button{color:var(--sys-SCOPED-IN-session-navigator-Bcyk)!important;opacity:.7}:host mat-toolbar .mat-icon-button:hover{color:var(--text-SCOPED-IN-session-navigator-Bcyk)!important;opacity:1}:host mat-toolbar .mat-icon-button .mat-icon{font-family:Material Icons!important;font-size:24px!important}:host div{display:flex;justify-content:center;align-items:center;line-height:1}:host atoms-menu-button{display:flex;align-items:center;line-height:1}@media(prefers-color-scheme:light){:host{--text: #333;--text-SCOPED-IN-session-navigator-Bcyk: var(--text);--sys: #666;--sys-SCOPED-IN-session-navigator-Bcyk: var(--sys);--border: #ddd;--border-SCOPED-IN-session-navigator-Bcyk: var(--border)}}@media(max-width:600px){:host mat-toolbar span{font-size:11px!important}}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i1$1.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: MenuButtonAtomStore, selector: "atoms-menu-button, atoms-smart-menu-button", inputs: ["actions", "type", "action"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
237
+ `, isInline: true, styles: [":host{display:block;--text: #e0e0e0;--text-SCOPED-IN-session-navigator-izvM: var(--text);--sys: #888;--sys-SCOPED-IN-session-navigator-izvM: var(--sys);--border: rgba(51, 51, 51, .5);--border-SCOPED-IN-session-navigator-izvM: var(--border);--primary-color: #0f0f11;--primary-color-SCOPED-IN-session-navigator-izvM: var(--primary-color);--on-primary-color: #e0e0e0;--on-primary-color-SCOPED-IN-session-navigator-izvM: var(--on-primary-color);--secondary-color: #888;--secondary-color-SCOPED-IN-session-navigator-izvM: var(--secondary-color);--on-secondary-color: #f0f0f0;--on-secondary-color-SCOPED-IN-session-navigator-izvM: var(--on-secondary-color);--background-color: #0f0f11;--background-color-SCOPED-IN-session-navigator-izvM: var(--background-color);--on-background-color: #e0e0e0;--on-background-color-SCOPED-IN-session-navigator-izvM: var(--on-background-color)}:host{display:block;width:100%;height:56px}:host mat-toolbar{display:flex;width:100%;height:100%;padding:0!important;justify-content:space-between;align-items:center;overflow:hidden;transition:background .5s ease-in-out;background-color:var(--primary-color-SCOPED-IN-session-navigator-izvM);color:var(--on-primary-color-SCOPED-IN-session-navigator-izvM);border-bottom:1px solid var(--border-SCOPED-IN-session-navigator-izvM)!important;font-family:SF Mono,Monaco,monospace!important;font-size:12px!important;--mat-toolbar-title-text-size: 12px !important;--mat-sys-title-large-size: 12px !important}:host mat-toolbar>div:first-child,:host mat-toolbar>div:last-child{flex:0 0 auto}:host mat-toolbar>div:nth-child(2){flex:1 1 auto;display:flex;justify-content:flex-start;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}:host mat-toolbar *:not(.mat-icon){font-family:SF Mono,Monaco,monospace!important}:host mat-toolbar span,:host mat-toolbar div,:host mat-toolbar h1,:host mat-toolbar h2,:host mat-toolbar h3,:host mat-toolbar h4,:host mat-toolbar h5,:host mat-toolbar h6{font-size:12px!important;font-family:SF Mono,Monaco,monospace!important;color:var(--text-SCOPED-IN-session-navigator-izvM)!important}:host mat-toolbar .mat-button{color:var(--sys-SCOPED-IN-session-navigator-izvM)!important;font-family:SF Mono,Monaco,monospace!important}:host mat-toolbar .mat-button:hover{color:var(--text-SCOPED-IN-session-navigator-izvM)!important}:host mat-toolbar .mat-icon-button{color:var(--sys-SCOPED-IN-session-navigator-izvM)!important;opacity:.7}:host mat-toolbar .mat-icon-button:hover{color:var(--text-SCOPED-IN-session-navigator-izvM)!important;opacity:1}:host mat-toolbar .mat-icon-button .mat-icon{font-family:Material Icons!important;font-size:24px!important}:host div{display:flex;justify-content:center;align-items:center;line-height:1}:host atoms-menu-button{display:flex;align-items:center;line-height:1}@media(prefers-color-scheme:light){:host{--text: #333;--text-SCOPED-IN-session-navigator-izvM: var(--text);--sys: #666;--sys-SCOPED-IN-session-navigator-izvM: var(--sys);--border: #ddd;--border-SCOPED-IN-session-navigator-izvM: var(--border)}}@media(max-width:600px){:host mat-toolbar span{font-size:11px!important}}\n"], dependencies: [{ kind: "ngmodule", type: MatButtonModule }, { kind: "ngmodule", type: MatIconModule }, { kind: "ngmodule", type: MatToolbarModule }, { kind: "component", type: i1$1.MatToolbar, selector: "mat-toolbar", inputs: ["color"], exportAs: ["matToolbar"] }, { kind: "directive", type: MenuButtonAtomStore, selector: "atoms-menu-button, atoms-smart-menu-button", inputs: ["actions", "type", "action"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
238
238
  }
239
239
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImport: i0, type: SessionNavigatorOrganism, decorators: [{
240
240
  type: Component,
@@ -268,7 +268,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.6", ngImpor
268
268
  directive: SessionNavigatorOrganismStore,
269
269
  inputs: ['startActions', 'endActions', 'title'],
270
270
  }
271
- ], styles: [":host{display:block;--text: #e0e0e0;--text-SCOPED-IN-session-navigator-Bcyk: var(--text);--sys: #888;--sys-SCOPED-IN-session-navigator-Bcyk: var(--sys);--border: rgba(51, 51, 51, .5);--border-SCOPED-IN-session-navigator-Bcyk: var(--border);--primary-color: #0f0f11;--primary-color-SCOPED-IN-session-navigator-Bcyk: var(--primary-color);--on-primary-color: #e0e0e0;--on-primary-color-SCOPED-IN-session-navigator-Bcyk: var(--on-primary-color);--secondary-color: #888;--secondary-color-SCOPED-IN-session-navigator-Bcyk: var(--secondary-color);--on-secondary-color: #f0f0f0;--on-secondary-color-SCOPED-IN-session-navigator-Bcyk: var(--on-secondary-color);--background-color: #0f0f11;--background-color-SCOPED-IN-session-navigator-Bcyk: var(--background-color);--on-background-color: #e0e0e0;--on-background-color-SCOPED-IN-session-navigator-Bcyk: var(--on-background-color)}:host{display:block;width:100%;height:56px}:host mat-toolbar{display:flex;width:100%;height:100%;padding:0!important;justify-content:space-between;align-items:center;overflow:hidden;transition:background .5s ease-in-out;background-color:var(--primary-color-SCOPED-IN-session-navigator-Bcyk);color:var(--on-primary-color-SCOPED-IN-session-navigator-Bcyk);border-bottom:1px solid var(--border-SCOPED-IN-session-navigator-Bcyk)!important;font-family:SF Mono,Monaco,monospace!important;font-size:12px!important;--mat-toolbar-title-text-size: 12px !important;--mat-sys-title-large-size: 12px !important}:host mat-toolbar>div:first-child,:host mat-toolbar>div:last-child{flex:0 0 auto}:host mat-toolbar>div:nth-child(2){flex:1 1 auto;display:flex;justify-content:flex-start;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}:host mat-toolbar *:not(.mat-icon){font-family:SF Mono,Monaco,monospace!important}:host mat-toolbar span,:host mat-toolbar div,:host mat-toolbar h1,:host mat-toolbar h2,:host mat-toolbar h3,:host mat-toolbar h4,:host mat-toolbar h5,:host mat-toolbar h6{font-size:12px!important;font-family:SF Mono,Monaco,monospace!important;color:var(--text-SCOPED-IN-session-navigator-Bcyk)!important}:host mat-toolbar .mat-button{color:var(--sys-SCOPED-IN-session-navigator-Bcyk)!important;font-family:SF Mono,Monaco,monospace!important}:host mat-toolbar .mat-button:hover{color:var(--text-SCOPED-IN-session-navigator-Bcyk)!important}:host mat-toolbar .mat-icon-button{color:var(--sys-SCOPED-IN-session-navigator-Bcyk)!important;opacity:.7}:host mat-toolbar .mat-icon-button:hover{color:var(--text-SCOPED-IN-session-navigator-Bcyk)!important;opacity:1}:host mat-toolbar .mat-icon-button .mat-icon{font-family:Material Icons!important;font-size:24px!important}:host div{display:flex;justify-content:center;align-items:center;line-height:1}:host atoms-menu-button{display:flex;align-items:center;line-height:1}@media(prefers-color-scheme:light){:host{--text: #333;--text-SCOPED-IN-session-navigator-Bcyk: var(--text);--sys: #666;--sys-SCOPED-IN-session-navigator-Bcyk: var(--sys);--border: #ddd;--border-SCOPED-IN-session-navigator-Bcyk: var(--border)}}@media(max-width:600px){:host mat-toolbar span{font-size:11px!important}}\n"] }]
271
+ ], styles: [":host{display:block;--text: #e0e0e0;--text-SCOPED-IN-session-navigator-izvM: var(--text);--sys: #888;--sys-SCOPED-IN-session-navigator-izvM: var(--sys);--border: rgba(51, 51, 51, .5);--border-SCOPED-IN-session-navigator-izvM: var(--border);--primary-color: #0f0f11;--primary-color-SCOPED-IN-session-navigator-izvM: var(--primary-color);--on-primary-color: #e0e0e0;--on-primary-color-SCOPED-IN-session-navigator-izvM: var(--on-primary-color);--secondary-color: #888;--secondary-color-SCOPED-IN-session-navigator-izvM: var(--secondary-color);--on-secondary-color: #f0f0f0;--on-secondary-color-SCOPED-IN-session-navigator-izvM: var(--on-secondary-color);--background-color: #0f0f11;--background-color-SCOPED-IN-session-navigator-izvM: var(--background-color);--on-background-color: #e0e0e0;--on-background-color-SCOPED-IN-session-navigator-izvM: var(--on-background-color)}:host{display:block;width:100%;height:56px}:host mat-toolbar{display:flex;width:100%;height:100%;padding:0!important;justify-content:space-between;align-items:center;overflow:hidden;transition:background .5s ease-in-out;background-color:var(--primary-color-SCOPED-IN-session-navigator-izvM);color:var(--on-primary-color-SCOPED-IN-session-navigator-izvM);border-bottom:1px solid var(--border-SCOPED-IN-session-navigator-izvM)!important;font-family:SF Mono,Monaco,monospace!important;font-size:12px!important;--mat-toolbar-title-text-size: 12px !important;--mat-sys-title-large-size: 12px !important}:host mat-toolbar>div:first-child,:host mat-toolbar>div:last-child{flex:0 0 auto}:host mat-toolbar>div:nth-child(2){flex:1 1 auto;display:flex;justify-content:flex-start;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}:host mat-toolbar *:not(.mat-icon){font-family:SF Mono,Monaco,monospace!important}:host mat-toolbar span,:host mat-toolbar div,:host mat-toolbar h1,:host mat-toolbar h2,:host mat-toolbar h3,:host mat-toolbar h4,:host mat-toolbar h5,:host mat-toolbar h6{font-size:12px!important;font-family:SF Mono,Monaco,monospace!important;color:var(--text-SCOPED-IN-session-navigator-izvM)!important}:host mat-toolbar .mat-button{color:var(--sys-SCOPED-IN-session-navigator-izvM)!important;font-family:SF Mono,Monaco,monospace!important}:host mat-toolbar .mat-button:hover{color:var(--text-SCOPED-IN-session-navigator-izvM)!important}:host mat-toolbar .mat-icon-button{color:var(--sys-SCOPED-IN-session-navigator-izvM)!important;opacity:.7}:host mat-toolbar .mat-icon-button:hover{color:var(--text-SCOPED-IN-session-navigator-izvM)!important;opacity:1}:host mat-toolbar .mat-icon-button .mat-icon{font-family:Material Icons!important;font-size:24px!important}:host div{display:flex;justify-content:center;align-items:center;line-height:1}:host atoms-menu-button{display:flex;align-items:center;line-height:1}@media(prefers-color-scheme:light){:host{--text: #333;--text-SCOPED-IN-session-navigator-izvM: var(--text);--sys: #666;--sys-SCOPED-IN-session-navigator-izvM: var(--sys);--border: #ddd;--border-SCOPED-IN-session-navigator-izvM: var(--border)}}@media(max-width:600px){:host mat-toolbar span{font-size:11px!important}}\n"] }]
272
272
  }] });
273
273
 
274
274
  var InvoiceAppActionId;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xxmachina/components",
3
- "version": "19.33.0",
3
+ "version": "19.34.0",
4
4
  "license": "MIT",
5
5
  "main": "./index.js",
6
6
  "types": "./index.d.ts",
@@ -142,12 +142,21 @@ declare class ReactFlowComponent extends NgAtomicComponent {
142
142
  private _prevNodePositions;
143
143
  private contentNodeTemplates;
144
144
  private _touchCleanup;
145
+ private _ancestorScrollCleanup;
145
146
  readonly enableTouchPassthrough: _angular_core.InputSignal<boolean>;
146
147
  constructor();
147
148
  ngOnInit(): void;
148
149
  ngOnDestroy(): void;
149
150
  private setupTouchPassthrough;
150
151
  private emitTapAsNodeClick;
152
+ /**
153
+ * 祖先要素のスクロールをロックする。
154
+ * overflow:clip は .react-flow 自体のスクロールを防ぐが、
155
+ * 祖先のスクロールコンテナ(例: ScrollFrame の .contents)には効かない。
156
+ * ノード内 input 入力時のブラウザ自動スクロールを防ぐため、
157
+ * 全祖先の scroll イベントを監視して即座にリセットする。
158
+ */
159
+ private lockAncestorScroll;
151
160
  private cleanupTouchPassthrough;
152
161
  readonly nodeTypes: _angular_core.Signal<any>;
153
162
  private applyTransitionClass;
@@ -1 +1 @@
1
- {"version":3,"file":"xxmachina-components-extras-flow.d.ts","sources":["../../../../../packages/@xxmachina/components/src/lib/extras/flow/react-flow/react-flow.store.ts","../../../../../packages/@xxmachina/components/src/lib/extras/flow/react-flow/react-flow.component.ts","../../../../../packages/@xxmachina/components/src/lib/extras/flow/nodes/group-node.tsx","../../../../../packages/@xxmachina/components/src/lib/extras/flow/nodes/node.component.ts","../../../../../packages/@xxmachina/components/src/lib/extras/flow/nodes/node.tsx","../../../../../packages/@xxmachina/components/src/lib/extras/flow/nodes/template-node.tsx","../../../../../packages/@xxmachina/components/src/lib/extras/flow/nodes/index.ts","../../../../../packages/@xxmachina/components/src/lib/extras/flow/flow-node.directive.ts"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":[],"mappings":";;;;;;;;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+HE;;;;AAA8F;;;AAC/F;;AC7HD;AA8CE;AACA;AACA;;;;;;;;;;;AAgCA;AAkCA;AAYA;;AA6BA;AAwBA;;;AAwBD;;;;;;;AC5MA;;;;;;ACDA;;ACCD;;ACHA;AACE;AACD;AAED;;;;;;ACNA;;;;;;;;;;ACDA;AAOqB;;AAAA;;;AACpB;;"}
1
+ {"version":3,"file":"xxmachina-components-extras-flow.d.ts","sources":["../../../../../packages/@xxmachina/components/src/lib/extras/flow/react-flow/react-flow.store.ts","../../../../../packages/@xxmachina/components/src/lib/extras/flow/react-flow/react-flow.component.ts","../../../../../packages/@xxmachina/components/src/lib/extras/flow/nodes/group-node.tsx","../../../../../packages/@xxmachina/components/src/lib/extras/flow/nodes/node.component.ts","../../../../../packages/@xxmachina/components/src/lib/extras/flow/nodes/node.tsx","../../../../../packages/@xxmachina/components/src/lib/extras/flow/nodes/template-node.tsx","../../../../../packages/@xxmachina/components/src/lib/extras/flow/nodes/index.ts","../../../../../packages/@xxmachina/components/src/lib/extras/flow/flow-node.directive.ts"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":[],"mappings":";;;;;;;;AAMA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+HE;;;;AAA8F;;;AAC/F;;AC7HD;AA8CE;AACA;AACA;;;;;;;;;;;;AAmCA;AAkCA;AAYA;;;;;;AAMG;AACH;AAaA;;AA6BA;AAwBA;;;AAwBD;;;;;;;ACnOA;;;;;;ACDA;;ACCD;;ACHA;AACE;AACD;AAED;;;;;;ACNA;;;;;;;;;;ACDA;AAOqB;;AAAA;;;AACpB;;"}
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { AfterViewInit, OnDestroy, ElementRef } from '@angular/core';
2
+ import { InjectionToken, AfterViewInit, OnDestroy, ElementRef } from '@angular/core';
3
3
  import { Terminal, ILinkProvider, ILink, ITerminalAddon } from '@xterm/xterm';
4
4
  import * as _ng_atomic_core from '@ng-atomic/core';
5
5
  import { InjectableComponent, NgAtomicComponent } from '@ng-atomic/core';
@@ -12,6 +12,8 @@ declare enum XtermActionId {
12
12
  FILE_LINK_CLICK = "xterm:file-link-click",
13
13
  FOCUS_INPUT_REQUEST = "xterm:focus-input-request"
14
14
  }
15
+ /** DI token for providing serverUUID getter to ProxyLinksAddon */
16
+ declare const XTERM_SERVER_UUID: InjectionToken<() => string | undefined>;
15
17
  declare class XtermOrganismStore extends InjectableComponent {
16
18
  static readonly DI: {
17
19
  provide: (typeOrComponent: Parameters<(typeOrFactory: _ng_atomic_core.TypeOrTypeFactory<any>) => {
@@ -34,7 +36,7 @@ declare class XtermOrganismStore extends InjectableComponent {
34
36
  useInteractiveTheme: boolean;
35
37
  }>;
36
38
  provideInitializer: <SI extends (store: XtermOrganismStore) => Promise<void> | void>(initializer: SI) => {
37
- provide: _angular_core.InjectionToken<(store: any) => Promise<void> | void>;
39
+ provide: InjectionToken<(store: any) => Promise<void> | void>;
38
40
  useValue: {
39
41
  key: new () => XtermOrganismStore;
40
42
  initializer: (store: XtermOrganismStore) => Promise<void> | void;
@@ -48,7 +50,7 @@ declare class XtermOrganismStore extends InjectableComponent {
48
50
  };
49
51
  Initializer: {
50
52
  provide<SI extends (store: XtermOrganismStore) => Promise<void> | void>(initializer: SI): {
51
- provide: _angular_core.InjectionToken<(store: any) => Promise<void> | void>;
53
+ provide: InjectionToken<(store: any) => Promise<void> | void>;
52
54
  useValue: {
53
55
  key: new () => XtermOrganismStore;
54
56
  initializer: (store: XtermOrganismStore) => Promise<void> | void;
@@ -82,10 +84,10 @@ declare class XtermOrganismStore extends InjectableComponent {
82
84
  readonly data: _angular_core.InputSignal<string>;
83
85
  readonly interactive: _angular_core.InputSignal<boolean>;
84
86
  readonly queryResult: _angular_core.InputSignal<string>;
85
- /** Use interactive theme even when not interactive (for display consistency) */
86
87
  readonly useInteractiveTheme: _angular_core.InputSignal<boolean>;
87
- /** Total bytes written to the buffer (for accurate diff detection when buffer overflows) */
88
88
  readonly totalWritten: _angular_core.InputSignal<number>;
89
+ /** Injected serverUUID getter for proxy links (optional) */
90
+ readonly getServerUUID: () => string | undefined;
89
91
  constructor();
90
92
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<XtermOrganismStore, never>;
91
93
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<XtermOrganismStore, "organisms-xterm", never, { "data": { "alias": "data"; "required": false; "isSignal": true; }; "interactive": { "alias": "interactive"; "required": false; "isSignal": true; }; "queryResult": { "alias": "queryResult"; "required": false; "isSignal": true; }; "useInteractiveTheme": { "alias": "useInteractiveTheme"; "required": false; "isSignal": true; }; "totalWritten": { "alias": "totalWritten"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -110,6 +112,12 @@ declare class XtermOrganism extends NgAtomicComponent implements AfterViewInit,
110
112
  private readonly terminalInitialized;
111
113
  /** Tracks if initialization was skipped due to container being too small */
112
114
  private initSkippedDueToSize;
115
+ /** IDisposable refs for explicit cleanup (prevents memory leaks on mobile) */
116
+ private readonly disposables;
117
+ /** Timer refs for cleanup in ngOnDestroy */
118
+ private stableTimer;
119
+ private resizeTimer;
120
+ private fallbackTimer;
113
121
  constructor();
114
122
  private writeDataToTerminal;
115
123
  /**
@@ -179,6 +187,7 @@ declare class GitHubLinksAddon implements ITerminalAddon {
179
187
  /**
180
188
  * Drop-in replacement for @xterm/addon-web-links that supports
181
189
  * URLs spanning wrapped terminal lines.
190
+ * localhost/127.0.0.1 URLs are skipped (handled by ProxyLinksAddon).
182
191
  */
183
192
  declare class WebLinksAddon implements ITerminalAddon {
184
193
  private readonly _handler?;
@@ -188,6 +197,34 @@ declare class WebLinksAddon implements ITerminalAddon {
188
197
  dispose(): void;
189
198
  }
190
199
 
200
+ type ServerUUIDGetter = () => string | undefined;
201
+ declare class ProxyLinkProvider implements ILinkProvider {
202
+ private readonly _terminal;
203
+ private readonly _getServerUUID;
204
+ private readonly _handler;
205
+ constructor(_terminal: Terminal, _getServerUUID: ServerUUIDGetter, _handler?: (event: MouseEvent, proxyUrl: string) => void);
206
+ provideLinks(bufferLineNumber: number, callback: (links: ILink[] | undefined) => void): void;
207
+ }
208
+ declare function toProxyUrl(serverUUID: string, localhostUrl: string): string | null;
209
+
210
+ /**
211
+ * xterm.js addon: localhost URLをmachina web proxyにリダイレクトするリンクを表示。
212
+ *
213
+ * Usage:
214
+ * ```typescript
215
+ * const addon = new ProxyLinksAddon(() => currentServerUUID);
216
+ * terminal.loadAddon(addon);
217
+ * ```
218
+ */
219
+ declare class ProxyLinksAddon implements ITerminalAddon {
220
+ private readonly _getServerUUID;
221
+ private readonly _handler?;
222
+ private _linkProvider?;
223
+ constructor(_getServerUUID: ServerUUIDGetter, _handler?: (event: MouseEvent, proxyUrl: string) => void);
224
+ activate(terminal: Terminal): void;
225
+ dispose(): void;
226
+ }
227
+
191
228
  /**
192
229
  * Utility functions for displaying images in xterm using SIXEL format
193
230
  */
@@ -218,6 +255,6 @@ declare function svgToSixel(svgString: string, options?: SvgToSixelOptions): Pro
218
255
  */
219
256
  declare function getMachinaAsciiArtSixel(options?: SvgToSixelOptions): Promise<string>;
220
257
 
221
- export { GitHubLinkProvider, GitHubLinksAddon, WebLinksAddon, XtermActionId, XtermOrganism, XtermOrganismStore, asciiArtToSvg, generateAsciiArt, getMachinaAsciiArtSixel, svgToSixel };
222
- export type { GitHubLinkActivateHandler, SvgToSixelOptions };
258
+ export { GitHubLinkProvider, GitHubLinksAddon, ProxyLinkProvider, ProxyLinksAddon, WebLinksAddon, XTERM_SERVER_UUID, XtermActionId, XtermOrganism, XtermOrganismStore, asciiArtToSvg, generateAsciiArt, getMachinaAsciiArtSixel, svgToSixel, toProxyUrl };
259
+ export type { GitHubLinkActivateHandler, ServerUUIDGetter, SvgToSixelOptions };
223
260
  //# sourceMappingURL=xxmachina-components-organisms-xterm.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"xxmachina-components-organisms-xterm.d.ts","sources":["../../../../../packages/@xxmachina/components/src/lib/organisms/xterm/xterm.organism.store.ts","../../../../../packages/@xxmachina/components/src/lib/organisms/xterm/xterm.organism.ts","../../../../../packages/@xxmachina/components/src/lib/organisms/xterm/github-link.provider.ts","../../../../../packages/@xxmachina/components/src/lib/organisms/xterm/github-links.addon.ts","../../../../../packages/@xxmachina/components/src/lib/organisms/xterm/web-links.addon.ts","../../../../../packages/@xxmachina/components/src/lib/organisms/xterm/image.utils.ts"],"sourcesContent":[null,null,null,null,null,null],"names":[],"mappings":";;;;;;;AAIA;AACE;AACA;AACA;AACA;AACA;AACD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAO4C;AAE1C;;;;;AAAuD;;;;;;;;;;;AAexD;;AC1BD;AAkDA;;AAcE;AACA;;;;;;;;;;;;AAcA;;;;AA+CA;AAsBA;;;;;;;AAOG;AACH;;AAqDA;;AAoGA;;AAmCO;AAIA;AAIA;AAIA;AAIA;AAIA;AAIA;;;;AAsBP;;;;AAIG;AACI;AACL;AACA;;;AAGD;AAuBD;;AAEG;;;;AAIJ;;;;ACnbA;AAED;;;AAEE;AAGmB;AAInB;AA0CA;AAyBD;;AC/ED;;;;AAKqB;AAGnB;AAOA;AAGD;;AClBD;;;AAGG;AACH;AAII;;;AAGF;AAMA;AAGD;;ACvBD;;AAEG;;;;;;AAOF;AAED;;;AAGG;AACH;AAmBA;;AAEG;AACH;;;AAEyD;AAgCzD;;AAEG;AACH;AA6KA;;AAEG;AACH;;;"}
1
+ {"version":3,"file":"xxmachina-components-organisms-xterm.d.ts","sources":["../../../../../packages/@xxmachina/components/src/lib/organisms/xterm/xterm.organism.store.ts","../../../../../packages/@xxmachina/components/src/lib/organisms/xterm/xterm.organism.ts","../../../../../packages/@xxmachina/components/src/lib/organisms/xterm/github-link.provider.ts","../../../../../packages/@xxmachina/components/src/lib/organisms/xterm/github-links.addon.ts","../../../../../packages/@xxmachina/components/src/lib/organisms/xterm/web-links.addon.ts","../../../../../packages/@xxmachina/components/src/lib/organisms/xterm/proxy-link.provider.ts","../../../../../packages/@xxmachina/components/src/lib/organisms/xterm/proxy-links.addon.ts","../../../../../packages/@xxmachina/components/src/lib/organisms/xterm/image.utils.ts"],"sourcesContent":[null,null,null,null,null,null,null,null],"names":[],"mappings":";;;;;;;AAIA;AACE;AACA;AACA;AACA;AACA;AACD;AAED;AACA;AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAO4C;AAE1C;;;;;AAAuD;;;;;;;AAQvD;;;;AAMD;;AC3BD;AAkDA;;AAcE;AACA;;;;;;;;;;;;AAcA;;;;AAIA;;;;;;AAiDA;AAsBA;;;;;;;AAOG;AACH;;AAqDA;;AAqHA;;AAmCO;AAIA;AAIA;AAIA;AAIA;AAIA;AAIA;;;;AAsBP;;;;AAIG;AACI;AACL;AACA;;;AAGD;AAuBD;;AAEG;;;;AAIJ;;;;AC3cA;AAED;;;AAEE;AAGmB;AAInB;AA0CA;AAyBD;;AC/ED;;;;AAKqB;AAGnB;AAOA;AAGD;;AClBD;;;;AAIG;AACH;AAII;;;AAGF;AAMA;AAGD;;;ACVD;;;;AAEqB;AAOnB;AA4CD;AAED;;AClEA;;;;;;;;AAQG;AACH;;AAKI;;AADiB;AAInB;AAMA;AAGD;;AC7BD;;AAEG;;;;;;AAOF;AAED;;;AAGG;AACH;AAmBA;;AAEG;AACH;;;AAEyD;AAgCzD;;AAEG;AACH;AA6KA;;AAEG;AACH;;;"}