@jjlmoya/utils-home 1.16.0 → 1.23.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.
Files changed (174) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/de.ts +10 -10
  3. package/src/category/i18n/en.ts +8 -8
  4. package/src/category/i18n/es.ts +2 -2
  5. package/src/category/i18n/fr.ts +15 -15
  6. package/src/category/i18n/id.ts +8 -8
  7. package/src/category/i18n/it.ts +7 -7
  8. package/src/category/i18n/nl.ts +8 -8
  9. package/src/category/i18n/pl.ts +10 -10
  10. package/src/category/i18n/pt.ts +8 -8
  11. package/src/category/i18n/ru.ts +10 -10
  12. package/src/category/i18n/sv.ts +8 -8
  13. package/src/category/i18n/tr.ts +4 -4
  14. package/src/category/i18n/zh.ts +8 -8
  15. package/src/entries.ts +4 -1
  16. package/src/pages/[locale]/[slug].astro +28 -12
  17. package/src/tests/locale_completeness.test.ts +4 -22
  18. package/src/tests/no_en_dash.test.ts +70 -0
  19. package/src/tests/shared-test-helpers.ts +56 -0
  20. package/src/tests/tool_exports.test.ts +34 -0
  21. package/src/tests/tool_validation.test.ts +2 -2
  22. package/src/tool/dewPointCalculator/bibliography.ts +10 -0
  23. package/src/tool/dewPointCalculator/i18n/de.ts +7 -17
  24. package/src/tool/dewPointCalculator/i18n/en.ts +8 -18
  25. package/src/tool/dewPointCalculator/i18n/es.ts +7 -17
  26. package/src/tool/dewPointCalculator/i18n/fr.ts +8 -18
  27. package/src/tool/dewPointCalculator/i18n/id.ts +7 -17
  28. package/src/tool/dewPointCalculator/i18n/it.ts +7 -17
  29. package/src/tool/dewPointCalculator/i18n/ja.ts +6 -16
  30. package/src/tool/dewPointCalculator/i18n/ko.ts +6 -16
  31. package/src/tool/dewPointCalculator/i18n/nl.ts +7 -17
  32. package/src/tool/dewPointCalculator/i18n/pl.ts +7 -17
  33. package/src/tool/dewPointCalculator/i18n/pt.ts +7 -17
  34. package/src/tool/dewPointCalculator/i18n/ru.ts +13 -23
  35. package/src/tool/dewPointCalculator/i18n/sv.ts +7 -17
  36. package/src/tool/dewPointCalculator/i18n/tr.ts +6 -16
  37. package/src/tool/dewPointCalculator/i18n/zh.ts +7 -17
  38. package/src/tool/dewPointCalculator/seo.astro +2 -1
  39. package/src/tool/heatingComparator/bibliography.ts +14 -0
  40. package/src/tool/heatingComparator/i18n/de.ts +10 -24
  41. package/src/tool/heatingComparator/i18n/en.ts +3 -13
  42. package/src/tool/heatingComparator/i18n/es.ts +3 -17
  43. package/src/tool/heatingComparator/i18n/fr.ts +9 -19
  44. package/src/tool/heatingComparator/i18n/id.ts +3 -17
  45. package/src/tool/heatingComparator/i18n/it.ts +3 -17
  46. package/src/tool/heatingComparator/i18n/ja.ts +296 -310
  47. package/src/tool/heatingComparator/i18n/ko.ts +296 -306
  48. package/src/tool/heatingComparator/i18n/nl.ts +3 -17
  49. package/src/tool/heatingComparator/i18n/pl.ts +3 -17
  50. package/src/tool/heatingComparator/i18n/pt.ts +3 -17
  51. package/src/tool/heatingComparator/i18n/ru.ts +14 -24
  52. package/src/tool/heatingComparator/i18n/sv.ts +6 -20
  53. package/src/tool/heatingComparator/i18n/tr.ts +2 -16
  54. package/src/tool/heatingComparator/i18n/zh.ts +296 -306
  55. package/src/tool/heatingComparator/seo.astro +3 -3
  56. package/src/tool/ledSavingCalculator/bibliography.ts +14 -0
  57. package/src/tool/ledSavingCalculator/i18n/de.ts +6 -16
  58. package/src/tool/ledSavingCalculator/i18n/en.ts +6 -20
  59. package/src/tool/ledSavingCalculator/i18n/es.ts +6 -20
  60. package/src/tool/ledSavingCalculator/i18n/fr.ts +10 -24
  61. package/src/tool/ledSavingCalculator/i18n/id.ts +5 -15
  62. package/src/tool/ledSavingCalculator/i18n/it.ts +6 -16
  63. package/src/tool/ledSavingCalculator/i18n/ja.ts +5 -15
  64. package/src/tool/ledSavingCalculator/i18n/ko.ts +4 -14
  65. package/src/tool/ledSavingCalculator/i18n/nl.ts +5 -15
  66. package/src/tool/ledSavingCalculator/i18n/pl.ts +5 -15
  67. package/src/tool/ledSavingCalculator/i18n/pt.ts +5 -15
  68. package/src/tool/ledSavingCalculator/i18n/ru.ts +8 -18
  69. package/src/tool/ledSavingCalculator/i18n/sv.ts +5 -15
  70. package/src/tool/ledSavingCalculator/i18n/tr.ts +5 -15
  71. package/src/tool/ledSavingCalculator/i18n/zh.ts +6 -16
  72. package/src/tool/ledSavingCalculator/seo.astro +2 -1
  73. package/src/tool/projectorCalculator/bibliography.ts +5 -0
  74. package/src/tool/projectorCalculator/i18n/de.ts +4 -8
  75. package/src/tool/projectorCalculator/i18n/en.ts +3 -8
  76. package/src/tool/projectorCalculator/i18n/es.ts +4 -9
  77. package/src/tool/projectorCalculator/i18n/fr.ts +6 -11
  78. package/src/tool/projectorCalculator/i18n/id.ts +4 -9
  79. package/src/tool/projectorCalculator/i18n/it.ts +4 -8
  80. package/src/tool/projectorCalculator/i18n/ja.ts +175 -179
  81. package/src/tool/projectorCalculator/i18n/ko.ts +175 -179
  82. package/src/tool/projectorCalculator/i18n/nl.ts +4 -8
  83. package/src/tool/projectorCalculator/i18n/pl.ts +5 -9
  84. package/src/tool/projectorCalculator/i18n/pt.ts +4 -8
  85. package/src/tool/projectorCalculator/i18n/ru.ts +7 -11
  86. package/src/tool/projectorCalculator/i18n/sv.ts +4 -8
  87. package/src/tool/projectorCalculator/i18n/tr.ts +4 -8
  88. package/src/tool/projectorCalculator/i18n/zh.ts +175 -179
  89. package/src/tool/projectorCalculator/seo.astro +2 -1
  90. package/src/tool/qrGenerator/bibliography.ts +14 -0
  91. package/src/tool/qrGenerator/i18n/de.ts +192 -202
  92. package/src/tool/qrGenerator/i18n/en.ts +3 -17
  93. package/src/tool/qrGenerator/i18n/es.ts +2 -16
  94. package/src/tool/qrGenerator/i18n/fr.ts +3 -17
  95. package/src/tool/qrGenerator/i18n/id.ts +146 -150
  96. package/src/tool/qrGenerator/i18n/it.ts +169 -173
  97. package/src/tool/qrGenerator/i18n/ja.ts +146 -150
  98. package/src/tool/qrGenerator/i18n/ko.ts +146 -150
  99. package/src/tool/qrGenerator/i18n/nl.ts +146 -150
  100. package/src/tool/qrGenerator/i18n/pl.ts +146 -150
  101. package/src/tool/qrGenerator/i18n/pt.ts +146 -150
  102. package/src/tool/qrGenerator/i18n/ru.ts +146 -150
  103. package/src/tool/qrGenerator/i18n/sv.ts +146 -150
  104. package/src/tool/qrGenerator/i18n/tr.ts +146 -150
  105. package/src/tool/qrGenerator/i18n/zh.ts +146 -150
  106. package/src/tool/qrGenerator/seo.astro +2 -1
  107. package/src/tool/solarCalculator/bibliography.ts +5 -0
  108. package/src/tool/solarCalculator/i18n/de.ts +141 -145
  109. package/src/tool/solarCalculator/i18n/en.ts +7 -12
  110. package/src/tool/solarCalculator/i18n/es.ts +5 -10
  111. package/src/tool/solarCalculator/i18n/fr.ts +8 -13
  112. package/src/tool/solarCalculator/i18n/id.ts +4 -8
  113. package/src/tool/solarCalculator/i18n/it.ts +4 -8
  114. package/src/tool/solarCalculator/i18n/ja.ts +121 -125
  115. package/src/tool/solarCalculator/i18n/ko.ts +116 -120
  116. package/src/tool/solarCalculator/i18n/nl.ts +4 -7
  117. package/src/tool/solarCalculator/i18n/pl.ts +5 -9
  118. package/src/tool/solarCalculator/i18n/pt.ts +4 -8
  119. package/src/tool/solarCalculator/i18n/ru.ts +7 -10
  120. package/src/tool/solarCalculator/i18n/sv.ts +4 -7
  121. package/src/tool/solarCalculator/i18n/tr.ts +4 -7
  122. package/src/tool/solarCalculator/i18n/zh.ts +116 -120
  123. package/src/tool/solarCalculator/seo.astro +2 -1
  124. package/src/tool/tariffComparator/bibliography.ts +7 -0
  125. package/src/tool/tariffComparator/i18n/de.ts +129 -132
  126. package/src/tool/tariffComparator/i18n/en.ts +5 -12
  127. package/src/tool/tariffComparator/i18n/es.ts +5 -12
  128. package/src/tool/tariffComparator/i18n/fr.ts +8 -15
  129. package/src/tool/tariffComparator/i18n/id.ts +2 -5
  130. package/src/tool/tariffComparator/i18n/it.ts +2 -5
  131. package/src/tool/tariffComparator/i18n/ja.ts +129 -132
  132. package/src/tool/tariffComparator/i18n/ko.ts +129 -132
  133. package/src/tool/tariffComparator/i18n/nl.ts +2 -5
  134. package/src/tool/tariffComparator/i18n/pl.ts +3 -6
  135. package/src/tool/tariffComparator/i18n/pt.ts +2 -5
  136. package/src/tool/tariffComparator/i18n/ru.ts +2 -5
  137. package/src/tool/tariffComparator/i18n/sv.ts +2 -5
  138. package/src/tool/tariffComparator/i18n/tr.ts +2 -5
  139. package/src/tool/tariffComparator/i18n/zh.ts +129 -132
  140. package/src/tool/tariffComparator/seo.astro +2 -1
  141. package/src/tool/wifiRangeSimulator/bibliography.astro +14 -0
  142. package/src/tool/wifiRangeSimulator/bibliography.ts +14 -0
  143. package/src/tool/wifiRangeSimulator/component.astro +170 -0
  144. package/src/tool/wifiRangeSimulator/entry.ts +29 -0
  145. package/src/tool/wifiRangeSimulator/i18n/de.ts +477 -0
  146. package/src/tool/wifiRangeSimulator/i18n/en.ts +477 -0
  147. package/src/tool/wifiRangeSimulator/i18n/es.ts +477 -0
  148. package/src/tool/wifiRangeSimulator/i18n/fr.ts +477 -0
  149. package/src/tool/wifiRangeSimulator/i18n/id.ts +477 -0
  150. package/src/tool/wifiRangeSimulator/i18n/it.ts +477 -0
  151. package/src/tool/wifiRangeSimulator/i18n/ja.ts +477 -0
  152. package/src/tool/wifiRangeSimulator/i18n/ko.ts +477 -0
  153. package/src/tool/wifiRangeSimulator/i18n/nl.ts +477 -0
  154. package/src/tool/wifiRangeSimulator/i18n/pl.ts +477 -0
  155. package/src/tool/wifiRangeSimulator/i18n/pt.ts +477 -0
  156. package/src/tool/wifiRangeSimulator/i18n/ru.ts +477 -0
  157. package/src/tool/wifiRangeSimulator/i18n/sv.ts +477 -0
  158. package/src/tool/wifiRangeSimulator/i18n/tr.ts +477 -0
  159. package/src/tool/wifiRangeSimulator/i18n/zh.ts +477 -0
  160. package/src/tool/wifiRangeSimulator/i18n-utils.ts +14 -0
  161. package/src/tool/wifiRangeSimulator/index.ts +8 -0
  162. package/src/tool/wifiRangeSimulator/logic.ts +220 -0
  163. package/src/tool/wifiRangeSimulator/seo.astro +15 -0
  164. package/src/tool/wifiRangeSimulator/sketch-actions.ts +168 -0
  165. package/src/tool/wifiRangeSimulator/sketch-events.ts +138 -0
  166. package/src/tool/wifiRangeSimulator/sketch-render-dash.ts +170 -0
  167. package/src/tool/wifiRangeSimulator/sketch-render-device.ts +42 -0
  168. package/src/tool/wifiRangeSimulator/sketch-render.ts +155 -0
  169. package/src/tool/wifiRangeSimulator/sketch-state.ts +186 -0
  170. package/src/tool/wifiRangeSimulator/sketch.ts +100 -0
  171. package/src/tool/wifiRangeSimulator/ui.ts +69 -0
  172. package/src/tool/wifiRangeSimulator/wifi-range-simulator.css +583 -0
  173. package/src/tools.ts +2 -0
  174. package/src/types.ts +0 -2
@@ -0,0 +1,69 @@
1
+ export interface WifiRangeSimulatorUI extends Record<string, string> {
2
+ labelObstacles: string;
3
+ labelAddObstacle: string;
4
+ labelRemove: string;
5
+ labelSignalStrength: string;
6
+ labelEffectiveRange: string;
7
+ labelMeters: string;
8
+ labelPercent: string;
9
+ labelStreamingVerdict: string;
10
+ verdictPerfect: string;
11
+ verdictGood: string;
12
+ verdictFair: string;
13
+ verdictPoor: string;
14
+ verdictDead: string;
15
+ tipTitle: string;
16
+ label4kStreaming: string;
17
+ labelOnlineGaming: string;
18
+ labelVideoCalls: string;
19
+ labelBasicBrowsing: string;
20
+ statusPerfect: string;
21
+ statusGood: string;
22
+ statusFair: string;
23
+ statusPoor: string;
24
+ statusImpossible: string;
25
+ statusLowLatency: string;
26
+ statusLagWarning: string;
27
+ statusDisconnect: string;
28
+ statusStable: string;
29
+ statusPixelated: string;
30
+ statusDropped: string;
31
+ statusPass: string;
32
+ statusUnusable: string;
33
+ tipMoveRouter: string;
34
+ tipElevateRouter: string;
35
+ tipReduceObstacles: string;
36
+ tipFishTank: string;
37
+ tipMicrowave: string;
38
+ labelMove: string;
39
+ labelWalls: string;
40
+ labelDrywall: string;
41
+ labelBrick: string;
42
+ labelConcrete: string;
43
+ labelStone: string;
44
+ labelObjects: string;
45
+ labelWood: string;
46
+ labelMetal: string;
47
+ labelWindow: string;
48
+ labelFridge: string;
49
+ labelFish: string;
50
+ labelMicro: string;
51
+ labelMirror: string;
52
+ labelFurn: string;
53
+ labelActions: string;
54
+ labelUndo: string;
55
+ labelAddDevice: string;
56
+ labelClearWalls: string;
57
+ labelClearObjects: string;
58
+ labelClearAll: string;
59
+ labelZoomIn: string;
60
+ labelZoomOut: string;
61
+ labelRouter: string;
62
+ labelAverageSignal: string;
63
+ labelScaleMeters: string;
64
+ hintText: string;
65
+ labelMaxDevices: string;
66
+ labelDevicePrefix: string;
67
+ labelPerDevice: string;
68
+ labelDb: string;
69
+ }
@@ -0,0 +1,583 @@
1
+ .sketch-wrapper {
2
+ --sketch-accent: #0ea5e9;
3
+ --sketch-accent-dim: rgba(14,165,233,0.12);
4
+ --sketch-danger: #ef4444;
5
+ --sketch-success: #22c55e;
6
+ --sketch-warning: #f59e0b;
7
+ --sketch-surface: var(--bg-surface);
8
+ --sketch-border: var(--border-color);
9
+ --sketch-text: var(--text-main);
10
+ --sketch-muted: var(--text-muted);
11
+ --sketch-grid-color: rgba(14,165,233,0.12);
12
+
13
+ width: 100%;
14
+ padding: 1rem 0;
15
+ }
16
+
17
+ .sketch-card {
18
+ background: var(--sketch-surface);
19
+ width: calc(100% - 24px);
20
+ max-width: 1200px;
21
+ margin: 0 auto;
22
+ border-radius: 24px;
23
+ overflow: hidden;
24
+ border: 1px solid var(--sketch-border);
25
+ color: var(--sketch-text);
26
+ display: flex;
27
+ flex-direction: column;
28
+ }
29
+
30
+ .sketch-toolbar {
31
+ display: flex;
32
+ flex-wrap: wrap;
33
+ align-items: center;
34
+ gap: 10px;
35
+ padding: 10px 14px;
36
+ background: var(--bg-page);
37
+ border-bottom: 1px solid var(--sketch-border);
38
+ overflow-x: auto;
39
+ }
40
+
41
+ .sketch-tool-group {
42
+ display: flex;
43
+ align-items: center;
44
+ gap: 6px;
45
+ }
46
+
47
+ .sketch-tool-section-label {
48
+ font-size: 0.5625rem;
49
+ font-weight: 800;
50
+ text-transform: uppercase;
51
+ letter-spacing: 0.08em;
52
+ color: var(--sketch-muted);
53
+ margin-right: 2px;
54
+ }
55
+
56
+ .sketch-tool {
57
+ display: inline-flex;
58
+ align-items: center;
59
+ gap: 5px;
60
+ padding: 7px 10px;
61
+ border-radius: 10px;
62
+ border: 1px solid var(--sketch-border);
63
+ background: var(--sketch-surface);
64
+ color: var(--sketch-text);
65
+ font-size: 0.6875rem;
66
+ font-weight: 700;
67
+ cursor: pointer;
68
+ transition: all 0.15s cubic-bezier(0.34, 1.56, 0.64, 1);
69
+ white-space: nowrap;
70
+ flex-shrink: 0;
71
+ }
72
+
73
+ .sketch-tool:hover {
74
+ border-color: var(--sketch-accent);
75
+ transform: translateY(-1px);
76
+ box-shadow: 0 4px 12px var(--sketch-accent-dim);
77
+ }
78
+
79
+ .sketch-tool:active {
80
+ transform: scale(0.96);
81
+ }
82
+
83
+ .sketch-tool.active {
84
+ border-color: var(--sketch-accent);
85
+ background: var(--sketch-accent-dim);
86
+ color: var(--sketch-accent);
87
+ }
88
+
89
+ .sketch-tool-danger {
90
+ color: var(--sketch-danger);
91
+ }
92
+
93
+ .sketch-tool-danger:hover {
94
+ border-color: var(--sketch-danger);
95
+ box-shadow: 0 4px 12px rgba(239,68,68,0.12);
96
+ }
97
+
98
+ .sketch-tool-sep {
99
+ width: 1px;
100
+ height: 22px;
101
+ background: var(--sketch-border);
102
+ flex-shrink: 0;
103
+ }
104
+
105
+ .sketch-tool-swatch {
106
+ width: 12px;
107
+ height: 12px;
108
+ border-radius: 3px;
109
+ border: 1px solid rgba(0,0,0,0.1);
110
+ box-shadow: inset 0 1px 2px rgba(0,0,0,0.08);
111
+ }
112
+
113
+ .sketch-body {
114
+ display: flex;
115
+ flex-direction: column;
116
+ gap: 0;
117
+ min-height: 400px;
118
+ }
119
+
120
+ @media (min-width: 1024px) {
121
+ .sketch-body {
122
+ flex-direction: row;
123
+ min-height: 520px;
124
+ }
125
+ }
126
+
127
+ .sketch-canvas-wrap {
128
+ flex: 1;
129
+ position: relative;
130
+ background: var(--bg-page);
131
+ overflow: hidden;
132
+ cursor: crosshair;
133
+ min-height: 320px;
134
+ }
135
+
136
+ .sketch-world {
137
+ width: 800px;
138
+ height: 500px;
139
+ transform-origin: top left;
140
+ }
141
+
142
+ .sketch-svg {
143
+ display: block;
144
+ width: 800px;
145
+ height: 500px;
146
+ }
147
+
148
+ .sketch-zoom-controls {
149
+ position: absolute;
150
+ bottom: 12px;
151
+ right: 12px;
152
+ display: flex;
153
+ flex-direction: column;
154
+ z-index: 10;
155
+ border-radius: 10px;
156
+ border: 1px solid var(--sketch-border);
157
+ background: var(--sketch-surface);
158
+ box-shadow: 0 2px 10px rgba(0,0,0,0.1);
159
+ overflow: hidden;
160
+ }
161
+
162
+ .sketch-zoom-btn {
163
+ width: 34px;
164
+ height: 34px;
165
+ border: none;
166
+ background: transparent;
167
+ color: var(--sketch-text);
168
+ font-size: 1.25rem;
169
+ font-weight: 700;
170
+ cursor: pointer;
171
+ display: flex;
172
+ align-items: center;
173
+ justify-content: center;
174
+ transition: all 0.15s;
175
+ }
176
+
177
+ .sketch-zoom-btn:hover {
178
+ background: var(--sketch-accent-dim);
179
+ color: var(--sketch-accent);
180
+ }
181
+
182
+ .sketch-zoom-btn:active {
183
+ background: rgba(14,165,233,0.2);
184
+ }
185
+
186
+ .sketch-zoom-btn + .sketch-zoom-btn {
187
+ border-top: 1px solid var(--sketch-border);
188
+ }
189
+
190
+ .sketch-scale-bar {
191
+ position: absolute;
192
+ bottom: 12px;
193
+ left: 12px;
194
+ z-index: 10;
195
+ display: flex;
196
+ flex-direction: column;
197
+ gap: 3px;
198
+ align-items: flex-start;
199
+ }
200
+
201
+ .sketch-scale-track {
202
+ display: flex;
203
+ height: 14px;
204
+ border-radius: 3px;
205
+ overflow: hidden;
206
+ border: 1px solid rgba(0,0,0,0.2);
207
+ box-shadow: 0 1px 4px rgba(0,0,0,0.1);
208
+ }
209
+
210
+ .sketch-scale-segment {
211
+ height: 100%;
212
+ flex: 0 0 auto;
213
+ }
214
+
215
+ .sketch-scale-segment.dark {
216
+ background: #6b7280;
217
+ }
218
+
219
+ .sketch-scale-segment.light {
220
+ background: #e5e7eb;
221
+ }
222
+
223
+ .sketch-scale-labels {
224
+ display: flex;
225
+ justify-content: space-between;
226
+ width: 100%;
227
+ padding: 0 1px;
228
+ }
229
+
230
+ .sketch-scale-label {
231
+ font-size: 0.625rem;
232
+ font-weight: 700;
233
+ color: var(--sketch-muted);
234
+ }
235
+
236
+ .sketch-wall-line {
237
+ cursor: pointer;
238
+ transition: stroke-width 0.15s;
239
+ }
240
+
241
+ .sketch-wall-line:hover {
242
+ stroke-width: 9;
243
+ }
244
+
245
+ .sketch-obj-group {
246
+ cursor: pointer;
247
+ transition: opacity 0.15s;
248
+ }
249
+
250
+ .sketch-obj-group:hover {
251
+ opacity: 0.8;
252
+ }
253
+
254
+ .sketch-panel {
255
+ flex: 0 0 auto;
256
+ width: 100%;
257
+ padding: 20px;
258
+ border-top: 1px solid var(--sketch-border);
259
+ display: flex;
260
+ flex-direction: column;
261
+ gap: 14px;
262
+ align-items: center;
263
+ background: var(--sketch-surface);
264
+ }
265
+
266
+ @media (min-width: 1024px) {
267
+ .sketch-panel {
268
+ width: 220px;
269
+ border-top: none;
270
+ border-left: 1px solid var(--sketch-border);
271
+ }
272
+ }
273
+
274
+ .sketch-ring {
275
+ position: relative;
276
+ width: 120px;
277
+ height: 120px;
278
+ display: flex;
279
+ align-items: center;
280
+ justify-content: center;
281
+ }
282
+
283
+ .sketch-ring svg {
284
+ position: absolute;
285
+ inset: 0;
286
+ transform: rotate(-90deg);
287
+ }
288
+
289
+ .sketch-ring-bg {
290
+ fill: none;
291
+ stroke: var(--bg-muted);
292
+ stroke-width: 8;
293
+ }
294
+
295
+ .sketch-ring-fill {
296
+ fill: none;
297
+ stroke-width: 8;
298
+ stroke-linecap: round;
299
+ transition: stroke-dashoffset 0.5s cubic-bezier(0.34, 1.56, 0.64, 1), stroke 0.5s ease;
300
+ }
301
+
302
+ .sketch-ring-inner {
303
+ position: relative;
304
+ z-index: 2;
305
+ text-align: center;
306
+ }
307
+
308
+ .sketch-ring-pct {
309
+ font-size: 1.5rem;
310
+ font-weight: 900;
311
+ line-height: 1;
312
+ transition: color 0.5s ease;
313
+ }
314
+
315
+ .sketch-ring-label {
316
+ font-size: 0.625rem;
317
+ font-weight: 700;
318
+ text-transform: uppercase;
319
+ letter-spacing: 0.08em;
320
+ color: var(--sketch-muted);
321
+ margin-top: 4px;
322
+ }
323
+
324
+ .sketch-range {
325
+ padding: 7px 14px;
326
+ border-radius: 10px;
327
+ background: var(--bg-page);
328
+ border: 1px solid var(--sketch-border);
329
+ font-size: 0.8125rem;
330
+ font-weight: 700;
331
+ }
332
+
333
+ .sketch-streams {
334
+ width: 100%;
335
+ display: flex;
336
+ flex-direction: column;
337
+ gap: 6px;
338
+ }
339
+
340
+ .sketch-streams-title {
341
+ font-size: 0.625rem;
342
+ font-weight: 800;
343
+ text-transform: uppercase;
344
+ letter-spacing: 0.08em;
345
+ color: var(--sketch-muted);
346
+ }
347
+
348
+ .sketch-stream-row {
349
+ display: flex;
350
+ align-items: center;
351
+ justify-content: space-between;
352
+ padding: 7px 9px;
353
+ border-radius: 8px;
354
+ background: var(--bg-page);
355
+ border: 1px solid var(--sketch-border);
356
+ }
357
+
358
+ .sketch-stream-name {
359
+ font-size: 0.6875rem;
360
+ font-weight: 700;
361
+ color: var(--sketch-text);
362
+ }
363
+
364
+ .sketch-stream-badge {
365
+ font-size: 0.625rem;
366
+ font-weight: 800;
367
+ padding: 2px 6px;
368
+ border-radius: 5px;
369
+ transition: all 0.3s ease;
370
+ }
371
+
372
+ .sketch-tip-area {
373
+ width: 100%;
374
+ display: flex;
375
+ flex-direction: column;
376
+ gap: 6px;
377
+ }
378
+
379
+ .sketch-tip-card {
380
+ padding: 9px 11px;
381
+ border-radius: 10px;
382
+ background: var(--bg-page);
383
+ border: 1px solid var(--sketch-border);
384
+ display: flex;
385
+ align-items: flex-start;
386
+ gap: 8px;
387
+ animation: sketch-tip-in 0.4s cubic-bezier(0.34, 1.56, 0.64, 1);
388
+ }
389
+
390
+ @keyframes sketch-tip-in {
391
+ from {
392
+ opacity: 0;
393
+ transform: translateY(12px) scale(0.97);
394
+ }
395
+ to {
396
+ opacity: 1;
397
+ transform: translateY(0) scale(1);
398
+ }
399
+ }
400
+
401
+ .sketch-tip-icon {
402
+ width: 22px;
403
+ height: 22px;
404
+ border-radius: 6px;
405
+ background: rgba(14,165,233,0.1);
406
+ color: var(--sketch-accent);
407
+ display: flex;
408
+ align-items: center;
409
+ justify-content: center;
410
+ flex-shrink: 0;
411
+ }
412
+
413
+ .sketch-tip-text {
414
+ font-size: 0.6875rem;
415
+ line-height: 1.4;
416
+ color: var(--sketch-text);
417
+ font-weight: 500;
418
+ }
419
+
420
+ .sketch-particle {
421
+ position: absolute;
422
+ pointer-events: none;
423
+ font-size: 0.75rem;
424
+ font-weight: 800;
425
+ color: var(--sketch-accent);
426
+ text-shadow: 0 0 8px var(--sketch-accent-dim);
427
+ animation: sketch-particle-float 0.8s ease-out forwards;
428
+ z-index: 50;
429
+ }
430
+
431
+ @keyframes sketch-particle-float {
432
+ 0% {
433
+ opacity: 1;
434
+ transform: translateY(0) scale(1);
435
+ }
436
+ 100% {
437
+ opacity: 0;
438
+ transform: translateY(-32px) scale(1.3);
439
+ }
440
+ }
441
+
442
+ .sketch-peak-anim {
443
+ animation: sketch-peak-glow 1s ease-in-out;
444
+ }
445
+
446
+ @keyframes sketch-peak-glow {
447
+ 0% {
448
+ transform: scale(1);
449
+ }
450
+ 50% {
451
+ transform: scale(1.08) rotate(2deg);
452
+ filter: drop-shadow(0 0 24px var(--sketch-success));
453
+ }
454
+ 100% {
455
+ transform: scale(1);
456
+ }
457
+ }
458
+
459
+ .sketch-danger-anim {
460
+ animation: sketch-danger-shake 0.5s ease-in-out;
461
+ }
462
+
463
+ @keyframes sketch-danger-shake {
464
+ 0%, 100% {
465
+ transform: translateX(0);
466
+ }
467
+ 20% {
468
+ transform: translateX(-5px);
469
+ }
470
+ 40% {
471
+ transform: translateX(5px);
472
+ }
473
+ 60% {
474
+ transform: translateX(-3px);
475
+ }
476
+ 80% {
477
+ transform: translateX(3px);
478
+ }
479
+ }
480
+
481
+ .sketch-avg-label {
482
+ font-size: 0.625rem;
483
+ font-weight: 800;
484
+ text-transform: uppercase;
485
+ letter-spacing: 0.08em;
486
+ color: var(--sketch-accent);
487
+ text-align: center;
488
+ }
489
+
490
+ .sketch-device-panel {
491
+ width: 100%;
492
+ display: flex;
493
+ flex-direction: column;
494
+ gap: 6px;
495
+ border-top: 1px solid var(--sketch-border);
496
+ padding-top: 10px;
497
+ }
498
+
499
+ .sketch-device-section-title {
500
+ font-size: 0.625rem;
501
+ font-weight: 800;
502
+ text-transform: uppercase;
503
+ letter-spacing: 0.08em;
504
+ color: var(--sketch-muted);
505
+ }
506
+
507
+ .sketch-device-card {
508
+ padding: 8px 10px;
509
+ border-radius: 8px;
510
+ background: var(--bg-page);
511
+ border: 1px solid var(--sketch-border);
512
+ display: flex;
513
+ flex-direction: column;
514
+ gap: 2px;
515
+ }
516
+
517
+ .sketch-device-header {
518
+ display: flex;
519
+ align-items: center;
520
+ gap: 6px;
521
+ }
522
+
523
+ .sketch-device-dot {
524
+ width: 8px;
525
+ height: 8px;
526
+ border-radius: 50%;
527
+ flex-shrink: 0;
528
+ }
529
+
530
+ .sketch-device-name {
531
+ font-size: 0.6875rem;
532
+ font-weight: 700;
533
+ color: var(--sketch-text);
534
+ flex: 1;
535
+ }
536
+
537
+ .sketch-device-pct {
538
+ font-size: 0.75rem;
539
+ font-weight: 800;
540
+ }
541
+
542
+ .sketch-device-bar-row {
543
+ display: flex;
544
+ align-items: center;
545
+ gap: 8px;
546
+ padding-left: 14px;
547
+ }
548
+
549
+ .sketch-device-range {
550
+ font-size: 0.625rem;
551
+ color: var(--sketch-muted);
552
+ font-weight: 600;
553
+ }
554
+
555
+ .sketch-hint {
556
+ padding: 8px 14px;
557
+ background: var(--bg-page);
558
+ border-top: 1px solid var(--sketch-border);
559
+ font-size: 0.6875rem;
560
+ color: var(--sketch-muted);
561
+ text-align: center;
562
+ font-weight: 500;
563
+ }
564
+
565
+ @media (max-width: 639px) {
566
+ .sketch-toolbar {
567
+ padding: 8px 10px;
568
+ }
569
+
570
+ .sketch-tool {
571
+ padding: 6px 8px;
572
+ font-size: 0.625rem;
573
+ }
574
+
575
+ .sketch-tool svg {
576
+ width: 14px;
577
+ height: 14px;
578
+ }
579
+
580
+ .sketch-panel {
581
+ padding: 16px;
582
+ }
583
+ }
package/src/tools.ts CHANGED
@@ -7,6 +7,7 @@ import { DEW_POINT_CALCULATOR_TOOL } from './tool/dewPointCalculator/index';
7
7
  import { LED_SAVING_CALCULATOR_TOOL } from './tool/ledSavingCalculator/index';
8
8
  import { TARIFF_COMPARATOR_TOOL } from './tool/tariffComparator/index';
9
9
  import { HEATING_COMPARATOR_TOOL } from './tool/heatingComparator/index';
10
+ import { WIFI_RANGE_SIMULATOR_TOOL } from './tool/wifiRangeSimulator/index';
10
11
 
11
12
  export const ALL_TOOLS: ToolDefinition[] = [
12
13
  QR_GENERATOR_TOOL,
@@ -16,5 +17,6 @@ export const ALL_TOOLS: ToolDefinition[] = [
16
17
  LED_SAVING_CALCULATOR_TOOL,
17
18
  TARIFF_COMPARATOR_TOOL,
18
19
  HEATING_COMPARATOR_TOOL,
20
+ WIFI_RANGE_SIMULATOR_TOOL,
19
21
  ];
20
22
 
package/src/types.ts CHANGED
@@ -29,9 +29,7 @@ export interface ToolLocaleContent<TUI extends Record<string, string> = Record<s
29
29
  description: string;
30
30
  ui: TUI;
31
31
  seo: SEOSection[];
32
- faqTitle?: string;
33
32
  faq: FAQItem[];
34
- bibliographyTitle?: string;
35
33
  bibliography: BibliographyEntry[];
36
34
  howTo: HowToStep[];
37
35
  schemas: WithContext<Thing>[];