-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathapp.js
More file actions
119 lines (108 loc) · 4.55 KB
/
app.js
File metadata and controls
119 lines (108 loc) · 4.55 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
(function() {
const app = angular.module('portfolioApp', []);
app.controller('MainController', function($timeout, $window, $scope) {
const vm = this;
const DARK_KEY = 'portfolio-dark-mode';
vm.darkMode = ($window.localStorage.getItem(DARK_KEY) === 'true');
vm.skillQuery = '';
vm.projectQuery = '';
vm.activeFilter = 'all';
vm.tags = ['Web App', 'UI', 'Mobile', 'API'];
vm.formSuccess = false;
vm.metrics = [
{ label: 'Progetti', value: '12+', detail: 'Dashboard, landing e micro-app' },
{ label: 'Ore di studio', value: '720+', detail: 'Angular, UX writing, API' },
{ label: 'Componenti', value: '30+', detail: 'Form, card, layout responsive' },
{ label: 'Certificazioni', value: '4+', detail: 'conoscenze secondarie' }
];
vm.skills = [
{ name: 'Angular', icon: 'bi-lightning-charge', level: 85, description: 'Componenti, RxJS light e change detection.' },
{ name: 'Bootstrap', icon: 'bi-bootstrap', level: 90, description: 'Layout responsive, utilities e design system.' },
{ name: 'TypeScript', icon: 'bi-code-slash', level: 80, description: 'Tipi chiari, interfacce e funzioni pure.' },
{ name: 'UI/UX', icon: 'bi-layout-text-window-reverse', level: 70, description: 'Wireframe, microcopy e accessibilità.' },
{ name: 'API REST', icon: 'bi-diagram-3', level: 75, description: 'Gestione fetch, error handling e caching.' },
{ name: 'Testing', icon: 'bi-bug', level: 65, description: 'Test unitari e mock dei servizi.' },
{ name: 'SCSS', icon: 'bi-palette', level: 78, description: 'Design token, mixin e component styling.' },
{ name: 'Git', icon: 'bi-git', level: 72, description: 'Workflow feature branch e changelog.' }
];
vm.projects = [
{
title: 'Dashboard studenti',
description: 'Cards riutilizzabili, filtri Angular e grafici custom.',
tag: 'Web App',
tech: ['AngularJS', 'Bootstrap', 'Chart.js'],
result: 'Riduzione tempo di ricerca info del 30%',
repo: 'https://github.com',
demo: 'https://example.com/demo'
},
{
title: 'Landing responsive',
description: 'Pattern hero + call-to-action con scroll fluido.',
tag: 'UI',
tech: ['Bootstrap', 'SCSS', 'Vanilla JS'],
result: 'Hero ottimizzato con CTR +12%',
repo: 'https://github.com'
},
{
title: 'Mini app to-do',
description: 'Gestione stato, filtri e persistenza locale.',
tag: 'Mobile',
tech: ['AngularJS', 'LocalStorage', 'ARIA'],
result: 'Accessibilità migliorata (score Lighthouse 95)',
repo: 'https://github.com'
},
{
title: 'API Explorer',
description: 'UI per testare endpoint REST con validazioni.',
tag: 'API',
tech: ['AngularJS', 'Fetch', 'Bootstrap'],
result: 'Workflow debug API più veloce del 20%',
repo: 'https://github.com'
}
];
vm.timeline = [
{ title: 'Corso Web & App Development', period: '2024', detail: 'Frontend, architetture SPA e prototipazione.' },
{ title: 'Progetti personali', period: '2023 - oggi', detail: 'Portfolio di componenti e pattern riutilizzabili.' },
{ title: 'Collaborazioni studentesche', period: '2022', detail: 'Team Agile, versioning e UI review.' }
];
vm.form = {
name: '',
email: '',
message: '',
privacy: false
};
vm.filteredSkills = function() {
if (!vm.skillQuery) return vm.skills;
const query = vm.skillQuery.toLowerCase();
return vm.skills.filter(skill => skill.name.toLowerCase().includes(query));
};
vm.setFilter = function(tag) {
vm.activeFilter = tag;
};
vm.filteredProjects = function() {
const query = vm.projectQuery.toLowerCase();
return vm.projects
.filter(project => vm.activeFilter === 'all' || project.tag === vm.activeFilter)
.filter(project => {
if (!query) return true;
const haystack = [project.title, project.description, ...(project.tech || [])]
.join(' ')
.toLowerCase();
return haystack.includes(query);
});
};
vm.submit = function(form) {
if (form.$invalid) return;
vm.formSuccess = true;
$timeout(() => {
vm.formSuccess = false;
vm.form = { name: '', email: '', message: '', privacy: false };
form.$setPristine();
form.$setUntouched();
}, 2000);
};
$scope.$watch(() => vm.darkMode, (value) => {
$window.localStorage.setItem(DARK_KEY, value);
});
});
})();