1+ document . addEventListener ( 'DOMContentLoaded' , function ( ) {
2+ const links = document . querySelectorAll ( '.link-button' ) ;
3+
4+ links . forEach ( link => {
5+ link . addEventListener ( 'click' , function ( e ) {
6+ e . preventDefault ( ) ;
7+ const href = this . getAttribute ( 'href' ) ;
8+
9+ this . style . transform = 'scale(0.98)' ;
10+ this . style . background = 'var(--button-hover)' ;
11+
12+ setTimeout ( ( ) => {
13+ window . open ( href , '_blank' , 'noopener,noreferrer' ) ;
14+ } , 150 ) ;
15+
16+ setTimeout ( ( ) => {
17+ this . style . transform = '' ;
18+ this . style . background = '' ;
19+ } , 300 ) ;
20+ } ) ;
21+
22+ link . addEventListener ( 'touchstart' , function ( ) {
23+ this . style . background = 'var(--button-hover)' ;
24+ } ) ;
25+
26+ link . addEventListener ( 'touchend' , function ( ) {
27+ setTimeout ( ( ) => {
28+ this . style . background = '' ;
29+ } , 200 ) ;
30+ } ) ;
31+ } ) ;
32+
33+ document . addEventListener ( 'contextmenu' , function ( e ) {
34+ e . preventDefault ( ) ;
35+ return false ;
36+ } ) ;
37+
38+ document . addEventListener ( 'dragstart' , function ( e ) {
39+ if ( e . target . tagName === 'IMG' || e . target . tagName === 'A' ) {
40+ e . preventDefault ( ) ;
41+ return false ;
42+ }
43+ } ) ;
44+
45+ document . addEventListener ( 'selectstart' , function ( e ) {
46+ e . preventDefault ( ) ;
47+ return false ;
48+ } ) ;
49+
50+ document . addEventListener ( 'keydown' , function ( e ) {
51+ if ( e . ctrlKey && ( e . key === 'u' || e . key === 'U' || e . key === 's' || e . key === 'S' ) ) {
52+ e . preventDefault ( ) ;
53+ return false ;
54+ }
55+
56+ if ( e . key === 'F12' || ( e . ctrlKey && e . shiftKey && ( e . key === 'I' || e . key === 'i' ) ) ) {
57+ e . preventDefault ( ) ;
58+ return false ;
59+ }
60+ } ) ;
61+
62+ if ( 'serviceWorker' in navigator ) {
63+ window . addEventListener ( 'load' , function ( ) {
64+ navigator . serviceWorker . register ( '/sw.js' ) . then ( function ( registration ) {
65+ console . log ( 'ServiceWorker registration successful' ) ;
66+ } ) . catch ( function ( err ) {
67+ console . log ( 'ServiceWorker registration failed: ' , err ) ;
68+ } ) ;
69+ } ) ;
70+ }
71+
72+ window . addEventListener ( 'beforeinstallprompt' , ( e ) => {
73+ e . preventDefault ( ) ;
74+ } ) ;
75+
76+ window . addEventListener ( 'load' , function ( ) {
77+ setTimeout ( function ( ) {
78+ window . scrollTo ( 0 , 0 ) ;
79+ } , 0 ) ;
80+ } ) ;
81+
82+ if ( 'connection' in navigator ) {
83+ const connection = navigator . connection ;
84+ if ( connection && connection . saveData === true ) {
85+ document . body . classList . add ( 'save-data' ) ;
86+ }
87+ }
88+
89+ const originalAddEventListener = EventTarget . prototype . addEventListener ;
90+ EventTarget . prototype . addEventListener = function ( type , listener , options ) {
91+ if ( type === 'contextmenu' || type === 'rightclick' ) {
92+ return ;
93+ }
94+ originalAddEventListener . call ( this , type , listener , options ) ;
95+ } ;
96+
97+ Object . defineProperty ( navigator , 'webdriver' , {
98+ get : ( ) => undefined ,
99+ } ) ;
100+
101+ Object . defineProperty ( document , 'hidden' , {
102+ get : ( ) => false ,
103+ } ) ;
104+
105+ const style = document . createElement ( 'style' ) ;
106+ style . textContent = `
107+ * {
108+ -webkit-user-select: none !important;
109+ -moz-user-select: none !important;
110+ -ms-user-select: none !important;
111+ user-select: none !important;
112+ }
113+ ` ;
114+ document . head . appendChild ( style ) ;
115+ } ) ;
116+
117+ if ( 'serviceWorker' in navigator ) {
118+ navigator . serviceWorker . register ( '/sw.js' ) . catch ( console . error ) ;
119+ }
0 commit comments