diff --git a/public/cyber_agent.mp4 b/public/cyber_agent.mp4 new file mode 100644 index 0000000..8d1ebae Binary files /dev/null and b/public/cyber_agent.mp4 differ diff --git a/public/cyber_skull.mp4 b/public/cyber_skull.mp4 new file mode 100644 index 0000000..8746d32 Binary files /dev/null and b/public/cyber_skull.mp4 differ diff --git a/src/app/features/about-display/about-display.component.html b/src/app/features/about-display/about-display.component.html index 33e1b47..ff06b62 100644 --- a/src/app/features/about-display/about-display.component.html +++ b/src/app/features/about-display/about-display.component.html @@ -1,3 +1,19 @@ -
+
+ +
+ +
+ +
+ + + +
diff --git a/src/app/features/about-display/about-display.component.ts b/src/app/features/about-display/about-display.component.ts index 165bafe..2c419aa 100644 --- a/src/app/features/about-display/about-display.component.ts +++ b/src/app/features/about-display/about-display.component.ts @@ -1,9 +1,15 @@ import { Component } from '@angular/core'; -import {SectionTitleComponent} from "../../shared/ui/section-title/section-title.component"; +import { SectionTitleComponent } from '../../shared/ui/section-title/section-title.component'; +import { HoloVideoContainerComponent } from '../../shared/ui/holo-video-container/holo-video-container.component'; +import { NeuralProfileTreeComponent } from './neural-profile-tree/neural-profile-tree.component'; @Component({ selector: 'app-about-display', - imports: [SectionTitleComponent], + imports: [ + SectionTitleComponent, + HoloVideoContainerComponent, + NeuralProfileTreeComponent, + ], templateUrl: './about-display.component.html', styleUrl: './about-display.component.css', }) diff --git a/src/app/shared/ui/long-button-dark/long-button-dark.component.css b/src/app/features/about-display/neural-profile-tree/neural-profile-tree.component.css similarity index 100% rename from src/app/shared/ui/long-button-dark/long-button-dark.component.css rename to src/app/features/about-display/neural-profile-tree/neural-profile-tree.component.css diff --git a/src/app/features/about-display/neural-profile-tree/neural-profile-tree.component.html b/src/app/features/about-display/neural-profile-tree/neural-profile-tree.component.html new file mode 100644 index 0000000..a9c44aa --- /dev/null +++ b/src/app/features/about-display/neural-profile-tree/neural-profile-tree.component.html @@ -0,0 +1,47 @@ +
+ @for (node of treeData(); track node.id) { +
+
+ + @if (node.isSelected) { +
+ } + + + + @if (node.hasChildren) { + {{ node.isExpanded ? '▼' : '▶' }} + } @else { + @switch (node.level) { + @case (2) { ├ } + @case (3) { + @if (isLastChild(node)) { └ } @else { ├ } + } + @default { + } + } + } + + + + + {{ node.title }} + +
+
+ } +
diff --git a/src/app/features/about-display/neural-profile-tree/neural-profile-tree.component.ts b/src/app/features/about-display/neural-profile-tree/neural-profile-tree.component.ts new file mode 100644 index 0000000..e522a05 --- /dev/null +++ b/src/app/features/about-display/neural-profile-tree/neural-profile-tree.component.ts @@ -0,0 +1,304 @@ +import { Component, input, signal, computed } from '@angular/core'; +import { CommonModule } from '@angular/common'; + +export interface NeuralProfileNode { + id: string; + title: string; + isExpanded: boolean; + isSelected: boolean; + children?: NeuralProfileNode[]; + level: number; + hasChildren: boolean; + visible: boolean; +} + +@Component({ + selector: 'app-neural-profile-tree', + standalone: true, + imports: [CommonModule], + templateUrl: './neural-profile-tree.component.html', + styles: [], +}) +export class NeuralProfileTreeComponent { + // Input for external data (optional) + externalData = input([]); + + // Internal tree state + private treeState = signal(this.getInitialData()); + + // Computed flattened tree for rendering + treeData = computed(() => this.flattenTree(this.treeState())); + + private getInitialData(): NeuralProfileNode[] { + return [ + { + id: 'neuralProfile', + title: ':TECH_CORE ', + isExpanded: true, + isSelected: false, + level: 0, + hasChildren: true, + visible: true, + children: [ + { + id: 'tools', + title: 'Tools/', + isExpanded: true, + isSelected: false, + level: 1, + hasChildren: true, + visible: true, + children: [ + { + id: 'webstorm', + title: 'Webstorm/', + isExpanded: false, + isSelected: false, + level: 2, + hasChildren: false, + visible: true, + }, + { + id: 'git', + title: 'Git/', + isExpanded: false, + isSelected: false, + level: 2, + hasChildren: false, + visible: true, + }, + { + id: 'docker', + title: 'Docker/', + isExpanded: false, + isSelected: false, + level: 2, + hasChildren: false, + visible: true, + }, + ], + }, + { + id: 'dev', + title: 'Dev/', + isExpanded: true, + isSelected: false, + level: 1, + hasChildren: true, + visible: true, + children: [ + { + id: 'front', + title: 'Front/', + isExpanded: true, + isSelected: false, + level: 2, + hasChildren: true, + visible: true, + children: [ + { + id: 'angular', + title: 'Angular/', + isExpanded: false, + isSelected: false, + level: 3, + hasChildren: false, + visible: true, + }, + { + id: 'tailwind', + title: 'Tailwind/', + isExpanded: false, + isSelected: false, + level: 3, + hasChildren: false, + visible: true, + }, + { + id: 'html-css', + title: 'HTML_CSS/', + isExpanded: false, + isSelected: false, + level: 3, + hasChildren: false, + visible: true, + }, + ], + }, + { + id: 'back', + title: 'Back/', + isExpanded: true, + isSelected: false, + level: 2, + hasChildren: true, + visible: true, + children: [ + { + id: 'nodejs', + title: 'NodeJS_Express/', + isExpanded: false, + isSelected: false, + level: 3, + hasChildren: false, + visible: true, + }, + { + id: 'typescript', + title: 'Typescript/', + isExpanded: false, + isSelected: false, + level: 3, + hasChildren: false, + visible: true, + }, + { + id: 'php', + title: 'PHP/', + isExpanded: false, + isSelected: false, + level: 3, + hasChildren: false, + visible: true, + }, + { + id: 'python', + title: 'Python/', + isExpanded: false, + isSelected: false, + level: 3, + hasChildren: false, + visible: true, + }, + ], + }, + { + id: 'data', + title: 'Data/', + isExpanded: true, + isSelected: false, + level: 2, + hasChildren: true, + visible: true, + children: [ + { + id: 'postgresql', + title: 'PostgreSQL/', + isExpanded: false, + isSelected: false, + level: 3, + hasChildren: false, + visible: true, + }, + { + id: 'mongodb', + title: 'MongoDB/', + isExpanded: false, + isSelected: false, + level: 3, + hasChildren: false, + visible: true, + }, + ], + }, + ], + }, + ], + }, + ]; + } + + private flattenTree(nodes: NeuralProfileNode[]): NeuralProfileNode[] { + const result: NeuralProfileNode[] = []; + + const traverse = (nodes: NeuralProfileNode[]) => { + for (const node of nodes) { + result.push(node); + if (node.isExpanded && node.children) { + traverse(node.children); + } + } + }; + + traverse(nodes); + return result; + } + + toggleExpand(node: NeuralProfileNode): void { + if (node.hasChildren) { + this.treeState.update((state) => { + // Create a deep copy to avoid mutation issues + const newState = JSON.parse(JSON.stringify(state)); + + this.updateNodeInTree(newState, node.id, { + isExpanded: !node.isExpanded, + }); + + return newState; + }); + } + } + + selectNode(node: NeuralProfileNode): void { + // Simple selection - just update the selected state + this.treeState.update((state) => { + // Create a deep copy to avoid mutation issues + const newState = JSON.parse(JSON.stringify(state)); + + // Clear all selections + this.clearAllSelections(newState); + + // Set current node as selected + this.updateNodeInTree(newState, node.id, { isSelected: true }); + + return newState; + }); + } + + private updateNodeInTree( + nodes: NeuralProfileNode[], + id: string, + updates: Partial, + ): boolean { + for (const node of nodes) { + if (node.id === id) { + Object.assign(node, updates); + return true; + } + if (node.children && this.updateNodeInTree(node.children, id, updates)) { + return true; + } + } + return false; + } + + private clearAllSelections(nodes: NeuralProfileNode[]): void { + for (const node of nodes) { + node.isSelected = false; + if (node.children) { + this.clearAllSelections(node.children); + } + } + } + + getIndentPadding(level: number): string { + const paddingMap = { + 0: '0.5rem', + 1: '1.5rem', + 2: '2.5rem', + 3: '3.5rem', + }; + return paddingMap[level as keyof typeof paddingMap] || '0.5rem'; + } + + isLastChild(node: NeuralProfileNode): boolean { + // This would need parent context to determine if it's the last child + // For now, we'll use the node title as a simple heuristic + return ( + node.title.includes('MongoDB') || + node.title.includes('Docker') || + node.title.includes('HTML_CSS') || + node.title.includes('Python') + ); + } +} diff --git a/src/app/shared/ui/long-button-dark/long-button-dark.component.html b/src/app/shared/ui/long-button-dark/long-button-dark.component.html deleted file mode 100644 index c151d4b..0000000 --- a/src/app/shared/ui/long-button-dark/long-button-dark.component.html +++ /dev/null @@ -1 +0,0 @@ -

long-button-dark works!

diff --git a/src/app/shared/ui/long-button-dark/long-button-dark.component.ts b/src/app/shared/ui/long-button-dark/long-button-dark.component.ts deleted file mode 100644 index 9a8ca6b..0000000 --- a/src/app/shared/ui/long-button-dark/long-button-dark.component.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { Component } from '@angular/core'; - -@Component({ - selector: 'app-long-button-dark', - imports: [], - templateUrl: './long-button-dark.component.html', - styleUrl: './long-button-dark.component.css' -}) -export class LongButtonDarkComponent { - -} diff --git a/src/app/shared/ui/section-title/section-title.component.html b/src/app/shared/ui/section-title/section-title.component.html index fd9413c..edbcbe2 100644 --- a/src/app/shared/ui/section-title/section-title.component.html +++ b/src/app/shared/ui/section-title/section-title.component.html @@ -1,9 +1,9 @@ -

+

{{title()}}

@@ -12,7 +12,7 @@

{{title()}}