1+ {{/* Generate a unique ID for this instance */}}
2+ {{- $wrapperId := .Page.Scratch.Get "addCounter" | default 0 -}}
3+ {{- .Page.Scratch.Set "addCounter" (add $wrapperId 1) -}}
4+
5+ {{/* {{ $wrapperId := printf "calc_x%d" now.UnixNano }} */}}
6+
7+ < div class ="calc-wrapper " id ="{{ $wrapperId }} ">
8+ < div class ="calc-fields ">
9+ {{ .Inner | .Page.RenderString (dict "wrapperId" $wrapperId) }}
10+ </ div >
11+ < button class ="calc-btn " onclick ="calc_('{{$wrapperId}}') "> Calculate</ button >
12+ < div class ="calc-answer " id ="answer-{{ $wrapperId }} "> Result: </ div >
13+ </ div >
14+
15+ < script >
16+ function calc_ ( Id ) {
17+ // Use the wrapper ID to find the correct elements
18+ var wrapper = document . getElementById ( Id ) ;
19+ { { /* var wrapper = document.getElementById('{{ $wrapperId }}'); */ } }
20+ var inputs = wrapper . querySelectorAll ( 'input[data-calc-var]' ) ;
21+ var vars = { } ;
22+ inputs . forEach ( function ( input ) {
23+ var name = input . getAttribute ( 'data-calc-var' ) ;
24+ vars [ name ] = parseFloat ( input . value ) || 0 ;
25+ } ) ;
26+ var formulaInput = wrapper . querySelector ( 'input[data-calc-formula]' ) ;
27+ var answerDiv = wrapper . querySelector ( '.calc-answer' ) ;
28+ if ( ! formulaInput || ! answerDiv ) {
29+ answerDiv . textContent = "Result: Error (missing formula or answer)" ;
30+ return ;
31+ }
32+ var formula = formulaInput . value ;
33+ Object . keys ( vars ) . forEach ( function ( name ) {
34+ var re = new RegExp ( '\\b' + name + '\\b' , 'g' ) ;
35+ formula = formula . replace ( re , vars [ name ] ) ;
36+ } ) ;
37+ try {
38+ var result = eval ( formula ) ;
39+ answerDiv . textContent = "Result: " + result ;
40+ } catch ( e ) {
41+ answerDiv . textContent = "Result: Error" ;
42+ }
43+ }
44+ </ script >
45+ < style >
46+ .calc-wrapper {
47+ max-width : 350px ;
48+ margin : 2em auto;
49+ padding : 1.5em 2em ;
50+ border-radius : 12px ;
51+ background : # f9f9f9 ;
52+ box-shadow : 0 2px 12px rgba (0 , 0 , 0 , 0.08 );
53+ font-family : system-ui, sans-serif;
54+ transition : background 0.3s , color 0.3s ;
55+ }
56+ .calc-fields {
57+ display : flex;
58+ flex-direction : column;
59+ gap : 1em ;
60+ }
61+ .calc-label {
62+ font-weight : 500 ;
63+ margin-bottom : 0.3em ;
64+ }
65+ .calc-input , .calc-formula {
66+ width : 100% ;
67+ padding : 0.4em 0.6em ;
68+ border : 1px solid # ccc ;
69+ border-radius : 6px ;
70+ font-size : 1em ;
71+ background : # fff ;
72+ color : # 222 ;
73+ transition : border 0.2s ;
74+ }
75+ .calc-input : focus , .calc-formula : focus {
76+ border-color : # 0078d4 ;
77+ outline : none;
78+ }
79+ .calc-btn {
80+ width : 100% ;
81+ padding : 0.6em 0 ;
82+ background : # 0078d4 ;
83+ color : # fff ;
84+ border : none;
85+ border-radius : 6px ;
86+ font-size : 1.1em ;
87+ font-weight : 600 ;
88+ cursor : pointer;
89+ margin-top : 1em ;
90+ transition : background 0.2s ;
91+ }
92+ .calc-btn : hover {
93+ background : # 005fa3 ;
94+ }
95+ .calc-answer {
96+ margin-top : 1em ;
97+ font-size : 1.1em ;
98+ font-weight : 500 ;
99+ color : # 007800 ;
100+ min-height : 1.5em ;
101+ }
102+ @media (prefers-color-scheme : dark) {
103+ .calc-wrapper {
104+ background : # 23272f ;
105+ color : # f3f3f3 ;
106+ box-shadow : 0 2px 12px rgba (0 , 0 , 0 , 0.32 );
107+ }
108+ .calc-input , .calc-formula {
109+ background : # 181b20 ;
110+ color : # f3f3f3 ;
111+ border : 1px solid # 444 ;
112+ }
113+ .calc-input : focus , .calc-formula : focus {
114+ border-color : # 4fa3ff ;
115+ }
116+ .calc-btn {
117+ background : # 4fa3ff ;
118+ color : # 181b20 ;
119+ }
120+ .calc-btn : hover {
121+ background : # 0078d4 ;
122+ color : # fff ;
123+ }
124+ .calc-answer {
125+ color : # 7fff7f ;
126+ }
127+ }
128+ </ style >
0 commit comments