@jjlmoya/utils-diy 1.11.0 → 1.13.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 (273) hide show
  1. package/package.json +1 -1
  2. package/src/category/index.ts +2 -1
  3. package/src/entries.ts +3 -1
  4. package/src/index.ts +2 -0
  5. package/src/pages/[locale]/[slug].astro +28 -12
  6. package/src/tests/locale_completeness.test.ts +7 -9
  7. package/src/tests/shared-test-helpers.ts +56 -0
  8. package/src/tests/tool_exports.test.ts +34 -0
  9. package/src/tests/tool_validation.test.ts +2 -2
  10. package/src/tool/balusterCalculator/bibliography.astro +2 -10
  11. package/src/tool/balusterCalculator/bibliography.ts +16 -0
  12. package/src/tool/balusterCalculator/i18n/de.ts +2 -15
  13. package/src/tool/balusterCalculator/i18n/en.ts +2 -15
  14. package/src/tool/balusterCalculator/i18n/es.ts +2 -15
  15. package/src/tool/balusterCalculator/i18n/fr.ts +2 -15
  16. package/src/tool/balusterCalculator/i18n/id.ts +2 -15
  17. package/src/tool/balusterCalculator/i18n/it.ts +2 -15
  18. package/src/tool/balusterCalculator/i18n/ja.ts +2 -15
  19. package/src/tool/balusterCalculator/i18n/ko.ts +2 -15
  20. package/src/tool/balusterCalculator/i18n/nl.ts +2 -15
  21. package/src/tool/balusterCalculator/i18n/pl.ts +2 -15
  22. package/src/tool/balusterCalculator/i18n/pt.ts +2 -15
  23. package/src/tool/balusterCalculator/i18n/ru.ts +2 -15
  24. package/src/tool/balusterCalculator/i18n/sv.ts +2 -15
  25. package/src/tool/balusterCalculator/i18n/tr.ts +2 -15
  26. package/src/tool/balusterCalculator/i18n/zh.ts +2 -15
  27. package/src/tool/balusterCalculator/seo.astro +1 -1
  28. package/src/tool/clayCalculator/bibliography.astro +2 -10
  29. package/src/tool/clayCalculator/bibliography.ts +12 -0
  30. package/src/tool/clayCalculator/i18n/de.ts +2 -11
  31. package/src/tool/clayCalculator/i18n/en.ts +2 -11
  32. package/src/tool/clayCalculator/i18n/es.ts +2 -11
  33. package/src/tool/clayCalculator/i18n/fr.ts +2 -11
  34. package/src/tool/clayCalculator/i18n/id.ts +2 -11
  35. package/src/tool/clayCalculator/i18n/it.ts +2 -11
  36. package/src/tool/clayCalculator/i18n/ja.ts +2 -11
  37. package/src/tool/clayCalculator/i18n/ko.ts +2 -11
  38. package/src/tool/clayCalculator/i18n/nl.ts +2 -11
  39. package/src/tool/clayCalculator/i18n/pl.ts +2 -11
  40. package/src/tool/clayCalculator/i18n/pt.ts +2 -11
  41. package/src/tool/clayCalculator/i18n/ru.ts +2 -11
  42. package/src/tool/clayCalculator/i18n/sv.ts +2 -11
  43. package/src/tool/clayCalculator/i18n/tr.ts +2 -11
  44. package/src/tool/clayCalculator/i18n/zh.ts +2 -11
  45. package/src/tool/clayCalculator/seo.astro +1 -1
  46. package/src/tool/concreteCalculator/bibliography.astro +2 -9
  47. package/src/tool/concreteCalculator/bibliography.ts +7 -0
  48. package/src/tool/concreteCalculator/i18n/de.ts +2 -15
  49. package/src/tool/concreteCalculator/i18n/en.ts +2 -15
  50. package/src/tool/concreteCalculator/i18n/es.ts +2 -15
  51. package/src/tool/concreteCalculator/i18n/fr.ts +2 -15
  52. package/src/tool/concreteCalculator/i18n/id.ts +2 -15
  53. package/src/tool/concreteCalculator/i18n/it.ts +2 -15
  54. package/src/tool/concreteCalculator/i18n/ja.ts +2 -15
  55. package/src/tool/concreteCalculator/i18n/ko.ts +2 -15
  56. package/src/tool/concreteCalculator/i18n/nl.ts +2 -15
  57. package/src/tool/concreteCalculator/i18n/pl.ts +2 -15
  58. package/src/tool/concreteCalculator/i18n/pt.ts +2 -15
  59. package/src/tool/concreteCalculator/i18n/ru.ts +2 -15
  60. package/src/tool/concreteCalculator/i18n/sv.ts +2 -15
  61. package/src/tool/concreteCalculator/i18n/tr.ts +2 -15
  62. package/src/tool/concreteCalculator/i18n/zh.ts +2 -15
  63. package/src/tool/concreteCalculator/seo.astro +2 -1
  64. package/src/tool/cutOptimizer/bibliography.astro +2 -9
  65. package/src/tool/cutOptimizer/bibliography.ts +12 -0
  66. package/src/tool/cutOptimizer/i18n/de.ts +2 -11
  67. package/src/tool/cutOptimizer/i18n/en.ts +2 -11
  68. package/src/tool/cutOptimizer/i18n/es.ts +2 -11
  69. package/src/tool/cutOptimizer/i18n/fr.ts +2 -11
  70. package/src/tool/cutOptimizer/i18n/id.ts +2 -11
  71. package/src/tool/cutOptimizer/i18n/it.ts +2 -11
  72. package/src/tool/cutOptimizer/i18n/ja.ts +2 -11
  73. package/src/tool/cutOptimizer/i18n/ko.ts +2 -11
  74. package/src/tool/cutOptimizer/i18n/nl.ts +2 -11
  75. package/src/tool/cutOptimizer/i18n/pl.ts +2 -11
  76. package/src/tool/cutOptimizer/i18n/pt.ts +2 -11
  77. package/src/tool/cutOptimizer/i18n/ru.ts +2 -11
  78. package/src/tool/cutOptimizer/i18n/sv.ts +2 -11
  79. package/src/tool/cutOptimizer/i18n/tr.ts +2 -11
  80. package/src/tool/cutOptimizer/i18n/zh.ts +2 -11
  81. package/src/tool/cutOptimizer/seo.astro +2 -1
  82. package/src/tool/drillCalculator/bibliography.astro +2 -9
  83. package/src/tool/drillCalculator/bibliography.ts +12 -0
  84. package/src/tool/drillCalculator/i18n/de.ts +2 -5
  85. package/src/tool/drillCalculator/i18n/en.ts +2 -5
  86. package/src/tool/drillCalculator/i18n/es.ts +2 -5
  87. package/src/tool/drillCalculator/i18n/fr.ts +2 -5
  88. package/src/tool/drillCalculator/i18n/id.ts +2 -5
  89. package/src/tool/drillCalculator/i18n/it.ts +2 -5
  90. package/src/tool/drillCalculator/i18n/ja.ts +2 -5
  91. package/src/tool/drillCalculator/i18n/ko.ts +2 -5
  92. package/src/tool/drillCalculator/i18n/nl.ts +2 -5
  93. package/src/tool/drillCalculator/i18n/pl.ts +2 -5
  94. package/src/tool/drillCalculator/i18n/pt.ts +2 -5
  95. package/src/tool/drillCalculator/i18n/ru.ts +2 -5
  96. package/src/tool/drillCalculator/i18n/sv.ts +2 -5
  97. package/src/tool/drillCalculator/i18n/tr.ts +2 -5
  98. package/src/tool/drillCalculator/i18n/zh.ts +2 -5
  99. package/src/tool/drillCalculator/seo.astro +2 -1
  100. package/src/tool/drillSharpener/bibliography.astro +2 -9
  101. package/src/tool/drillSharpener/bibliography.ts +16 -0
  102. package/src/tool/drillSharpener/i18n/de.ts +2 -5
  103. package/src/tool/drillSharpener/i18n/en.ts +2 -6
  104. package/src/tool/drillSharpener/i18n/es.ts +2 -6
  105. package/src/tool/drillSharpener/i18n/fr.ts +2 -6
  106. package/src/tool/drillSharpener/i18n/id.ts +2 -5
  107. package/src/tool/drillSharpener/i18n/it.ts +2 -5
  108. package/src/tool/drillSharpener/i18n/ja.ts +2 -5
  109. package/src/tool/drillSharpener/i18n/ko.ts +2 -5
  110. package/src/tool/drillSharpener/i18n/nl.ts +2 -5
  111. package/src/tool/drillSharpener/i18n/pl.ts +2 -5
  112. package/src/tool/drillSharpener/i18n/pt.ts +2 -5
  113. package/src/tool/drillSharpener/i18n/ru.ts +2 -5
  114. package/src/tool/drillSharpener/i18n/sv.ts +2 -5
  115. package/src/tool/drillSharpener/i18n/tr.ts +2 -5
  116. package/src/tool/drillSharpener/i18n/zh.ts +2 -5
  117. package/src/tool/drillSharpener/seo.astro +2 -1
  118. package/src/tool/epoxyCalculator/bibliography.astro +2 -10
  119. package/src/tool/epoxyCalculator/bibliography.ts +20 -0
  120. package/src/tool/epoxyCalculator/i18n/de.ts +2 -5
  121. package/src/tool/epoxyCalculator/i18n/en.ts +2 -19
  122. package/src/tool/epoxyCalculator/i18n/es.ts +2 -19
  123. package/src/tool/epoxyCalculator/i18n/fr.ts +2 -19
  124. package/src/tool/epoxyCalculator/i18n/id.ts +2 -5
  125. package/src/tool/epoxyCalculator/i18n/it.ts +2 -5
  126. package/src/tool/epoxyCalculator/i18n/ja.ts +2 -5
  127. package/src/tool/epoxyCalculator/i18n/ko.ts +2 -5
  128. package/src/tool/epoxyCalculator/i18n/nl.ts +2 -5
  129. package/src/tool/epoxyCalculator/i18n/pl.ts +2 -5
  130. package/src/tool/epoxyCalculator/i18n/pt.ts +2 -5
  131. package/src/tool/epoxyCalculator/i18n/ru.ts +2 -5
  132. package/src/tool/epoxyCalculator/i18n/sv.ts +2 -5
  133. package/src/tool/epoxyCalculator/i18n/tr.ts +2 -5
  134. package/src/tool/epoxyCalculator/i18n/zh.ts +2 -5
  135. package/src/tool/epoxyCalculator/seo.astro +1 -1
  136. package/src/tool/furnitureFit/bibliography.astro +2 -9
  137. package/src/tool/furnitureFit/bibliography.ts +12 -0
  138. package/src/tool/furnitureFit/i18n/de.ts +2 -5
  139. package/src/tool/furnitureFit/i18n/en.ts +2 -5
  140. package/src/tool/furnitureFit/i18n/es.ts +2 -5
  141. package/src/tool/furnitureFit/i18n/fr.ts +2 -5
  142. package/src/tool/furnitureFit/i18n/id.ts +2 -5
  143. package/src/tool/furnitureFit/i18n/it.ts +2 -5
  144. package/src/tool/furnitureFit/i18n/ja.ts +2 -5
  145. package/src/tool/furnitureFit/i18n/ko.ts +2 -5
  146. package/src/tool/furnitureFit/i18n/nl.ts +2 -5
  147. package/src/tool/furnitureFit/i18n/pl.ts +2 -5
  148. package/src/tool/furnitureFit/i18n/pt.ts +2 -5
  149. package/src/tool/furnitureFit/i18n/ru.ts +2 -5
  150. package/src/tool/furnitureFit/i18n/sv.ts +2 -5
  151. package/src/tool/furnitureFit/i18n/tr.ts +2 -5
  152. package/src/tool/furnitureFit/i18n/zh.ts +2 -5
  153. package/src/tool/furnitureFit/seo.astro +2 -1
  154. package/src/tool/mortarCalculator/bibliography.astro +2 -9
  155. package/src/tool/mortarCalculator/bibliography.ts +20 -0
  156. package/src/tool/mortarCalculator/i18n/de.ts +2 -5
  157. package/src/tool/mortarCalculator/i18n/en.ts +2 -19
  158. package/src/tool/mortarCalculator/i18n/es.ts +2 -19
  159. package/src/tool/mortarCalculator/i18n/fr.ts +2 -19
  160. package/src/tool/mortarCalculator/i18n/id.ts +2 -5
  161. package/src/tool/mortarCalculator/i18n/it.ts +2 -5
  162. package/src/tool/mortarCalculator/i18n/ja.ts +2 -5
  163. package/src/tool/mortarCalculator/i18n/ko.ts +2 -5
  164. package/src/tool/mortarCalculator/i18n/nl.ts +2 -5
  165. package/src/tool/mortarCalculator/i18n/pl.ts +2 -5
  166. package/src/tool/mortarCalculator/i18n/pt.ts +2 -5
  167. package/src/tool/mortarCalculator/i18n/ru.ts +2 -5
  168. package/src/tool/mortarCalculator/i18n/sv.ts +2 -5
  169. package/src/tool/mortarCalculator/i18n/tr.ts +2 -5
  170. package/src/tool/mortarCalculator/i18n/zh.ts +2 -5
  171. package/src/tool/mortarCalculator/seo.astro +2 -1
  172. package/src/tool/passepartoutCalculator/bibliography.astro +2 -9
  173. package/src/tool/passepartoutCalculator/bibliography.ts +16 -0
  174. package/src/tool/passepartoutCalculator/i18n/de.ts +2 -6
  175. package/src/tool/passepartoutCalculator/i18n/en.ts +2 -15
  176. package/src/tool/passepartoutCalculator/i18n/es.ts +2 -15
  177. package/src/tool/passepartoutCalculator/i18n/fr.ts +2 -15
  178. package/src/tool/passepartoutCalculator/i18n/id.ts +2 -6
  179. package/src/tool/passepartoutCalculator/i18n/it.ts +2 -6
  180. package/src/tool/passepartoutCalculator/i18n/ja.ts +2 -6
  181. package/src/tool/passepartoutCalculator/i18n/ko.ts +2 -6
  182. package/src/tool/passepartoutCalculator/i18n/nl.ts +2 -6
  183. package/src/tool/passepartoutCalculator/i18n/pl.ts +2 -6
  184. package/src/tool/passepartoutCalculator/i18n/pt.ts +2 -6
  185. package/src/tool/passepartoutCalculator/i18n/ru.ts +2 -6
  186. package/src/tool/passepartoutCalculator/i18n/sv.ts +2 -6
  187. package/src/tool/passepartoutCalculator/i18n/tr.ts +2 -6
  188. package/src/tool/passepartoutCalculator/i18n/zh.ts +2 -6
  189. package/src/tool/passepartoutCalculator/seo.astro +2 -1
  190. package/src/tool/stairCalculator/bibliography.astro +2 -9
  191. package/src/tool/stairCalculator/bibliography.ts +16 -0
  192. package/src/tool/stairCalculator/i18n/de.ts +2 -5
  193. package/src/tool/stairCalculator/i18n/en.ts +2 -6
  194. package/src/tool/stairCalculator/i18n/es.ts +2 -6
  195. package/src/tool/stairCalculator/i18n/fr.ts +2 -6
  196. package/src/tool/stairCalculator/i18n/id.ts +2 -5
  197. package/src/tool/stairCalculator/i18n/it.ts +2 -5
  198. package/src/tool/stairCalculator/i18n/ja.ts +2 -5
  199. package/src/tool/stairCalculator/i18n/ko.ts +2 -5
  200. package/src/tool/stairCalculator/i18n/nl.ts +2 -5
  201. package/src/tool/stairCalculator/i18n/pl.ts +2 -5
  202. package/src/tool/stairCalculator/i18n/pt.ts +2 -5
  203. package/src/tool/stairCalculator/i18n/ru.ts +2 -5
  204. package/src/tool/stairCalculator/i18n/sv.ts +2 -5
  205. package/src/tool/stairCalculator/i18n/tr.ts +2 -5
  206. package/src/tool/stairCalculator/i18n/zh.ts +2 -5
  207. package/src/tool/stairCalculator/seo.astro +2 -1
  208. package/src/tool/thermalExpansionCalculator/bibliography.astro +2 -9
  209. package/src/tool/thermalExpansionCalculator/bibliography.ts +16 -0
  210. package/src/tool/thermalExpansionCalculator/i18n/de.ts +2 -6
  211. package/src/tool/thermalExpansionCalculator/i18n/en.ts +2 -6
  212. package/src/tool/thermalExpansionCalculator/i18n/es.ts +2 -6
  213. package/src/tool/thermalExpansionCalculator/i18n/fr.ts +2 -6
  214. package/src/tool/thermalExpansionCalculator/i18n/id.ts +2 -6
  215. package/src/tool/thermalExpansionCalculator/i18n/it.ts +2 -6
  216. package/src/tool/thermalExpansionCalculator/i18n/ja.ts +2 -6
  217. package/src/tool/thermalExpansionCalculator/i18n/ko.ts +2 -6
  218. package/src/tool/thermalExpansionCalculator/i18n/nl.ts +2 -6
  219. package/src/tool/thermalExpansionCalculator/i18n/pl.ts +2 -6
  220. package/src/tool/thermalExpansionCalculator/i18n/pt.ts +2 -6
  221. package/src/tool/thermalExpansionCalculator/i18n/ru.ts +2 -6
  222. package/src/tool/thermalExpansionCalculator/i18n/sv.ts +2 -6
  223. package/src/tool/thermalExpansionCalculator/i18n/tr.ts +2 -6
  224. package/src/tool/thermalExpansionCalculator/i18n/zh.ts +2 -6
  225. package/src/tool/thermalExpansionCalculator/seo.astro +2 -1
  226. package/src/tool/voltageDropCalculator/bibliography.astro +2 -9
  227. package/src/tool/voltageDropCalculator/bibliography.ts +16 -0
  228. package/src/tool/voltageDropCalculator/i18n/de.ts +2 -5
  229. package/src/tool/voltageDropCalculator/i18n/en.ts +2 -6
  230. package/src/tool/voltageDropCalculator/i18n/es.ts +2 -6
  231. package/src/tool/voltageDropCalculator/i18n/fr.ts +2 -6
  232. package/src/tool/voltageDropCalculator/i18n/id.ts +2 -5
  233. package/src/tool/voltageDropCalculator/i18n/it.ts +2 -5
  234. package/src/tool/voltageDropCalculator/i18n/ja.ts +2 -5
  235. package/src/tool/voltageDropCalculator/i18n/ko.ts +2 -5
  236. package/src/tool/voltageDropCalculator/i18n/nl.ts +2 -5
  237. package/src/tool/voltageDropCalculator/i18n/pl.ts +2 -5
  238. package/src/tool/voltageDropCalculator/i18n/pt.ts +2 -5
  239. package/src/tool/voltageDropCalculator/i18n/ru.ts +2 -5
  240. package/src/tool/voltageDropCalculator/i18n/sv.ts +2 -5
  241. package/src/tool/voltageDropCalculator/i18n/tr.ts +2 -5
  242. package/src/tool/voltageDropCalculator/i18n/zh.ts +2 -5
  243. package/src/tool/voltageDropCalculator/seo.astro +2 -1
  244. package/src/tool/workshopFractionConverter/bibliography.astro +6 -0
  245. package/src/tool/workshopFractionConverter/bibliography.ts +12 -0
  246. package/src/tool/workshopFractionConverter/client.ts +183 -0
  247. package/src/tool/workshopFractionConverter/component.astro +226 -0
  248. package/src/tool/workshopFractionConverter/converter.ts +110 -0
  249. package/src/tool/workshopFractionConverter/engine.ts +223 -0
  250. package/src/tool/workshopFractionConverter/entry.ts +24 -0
  251. package/src/tool/workshopFractionConverter/i18n/de.ts +147 -0
  252. package/src/tool/workshopFractionConverter/i18n/en.ts +147 -0
  253. package/src/tool/workshopFractionConverter/i18n/es.ts +147 -0
  254. package/src/tool/workshopFractionConverter/i18n/fr.ts +147 -0
  255. package/src/tool/workshopFractionConverter/i18n/id.ts +147 -0
  256. package/src/tool/workshopFractionConverter/i18n/it.ts +147 -0
  257. package/src/tool/workshopFractionConverter/i18n/ja.ts +147 -0
  258. package/src/tool/workshopFractionConverter/i18n/ko.ts +147 -0
  259. package/src/tool/workshopFractionConverter/i18n/nl.ts +147 -0
  260. package/src/tool/workshopFractionConverter/i18n/pl.ts +147 -0
  261. package/src/tool/workshopFractionConverter/i18n/pt.ts +147 -0
  262. package/src/tool/workshopFractionConverter/i18n/ru.ts +147 -0
  263. package/src/tool/workshopFractionConverter/i18n/sv.ts +147 -0
  264. package/src/tool/workshopFractionConverter/i18n/tr.ts +147 -0
  265. package/src/tool/workshopFractionConverter/i18n/zh.ts +147 -0
  266. package/src/tool/workshopFractionConverter/index.ts +11 -0
  267. package/src/tool/workshopFractionConverter/seo.astro +15 -0
  268. package/src/tool/workshopFractionConverter/types-client.ts +89 -0
  269. package/src/tool/workshopFractionConverter/ui-updater.ts +94 -0
  270. package/src/tool/workshopFractionConverter/ui.ts +38 -0
  271. package/src/tool/workshopFractionConverter/workshop-fraction-converter.css +563 -0
  272. package/src/tools.ts +2 -1
  273. package/src/types.ts +1 -1
@@ -0,0 +1,563 @@
1
+ :root {
2
+ --wfc-primary: #2563eb;
3
+ --wfc-primary-dark: #1d4ed8;
4
+ --wfc-primary-light: #3b82f6;
5
+ --wfc-success: #10b981;
6
+ --wfc-warning: #f59e0b;
7
+ --wfc-danger: #ef4444;
8
+ --wfc-neutral: #374151;
9
+ --wfc-border: #e5e7eb;
10
+ --wfc-bg-light: #f9fafb;
11
+ }
12
+
13
+ .theme-dark {
14
+ --wfc-primary: #3b82f6;
15
+ --wfc-primary-dark: #2563eb;
16
+ --wfc-success: #34d399;
17
+ --wfc-warning: #fbbf24;
18
+ --wfc-border: rgba(255, 255, 255, 0.1);
19
+ --wfc-bg-light: #1f2937;
20
+ }
21
+
22
+ .wfc-root {
23
+ width: 100%;
24
+ max-width: 1200px;
25
+ margin: 0 auto;
26
+ }
27
+
28
+ .wfc-card {
29
+ border: 1px solid var(--wfc-border);
30
+ border-radius: 24px;
31
+ overflow: hidden;
32
+ background: rgba(255, 255, 255, 0.5);
33
+ }
34
+
35
+ .theme-dark .wfc-card {
36
+ background: rgba(255, 255, 255, 0.02);
37
+ }
38
+
39
+ .wfc-grid {
40
+ display: grid;
41
+ grid-template-columns: 1.2fr 1fr;
42
+ min-height: 700px;
43
+ }
44
+
45
+ @media (max-width: 768px) {
46
+ .wfc-grid {
47
+ grid-template-columns: 1fr;
48
+ min-height: auto;
49
+ }
50
+ }
51
+
52
+ .wfc-sidebar {
53
+ padding: 2.5rem;
54
+ background: rgba(255, 255, 255, 0.7);
55
+ border-right: 1px solid var(--wfc-border);
56
+ display: flex;
57
+ flex-direction: column;
58
+ gap: 2rem;
59
+ overflow-y: auto;
60
+ }
61
+
62
+ @media (max-width: 768px) {
63
+ .wfc-sidebar {
64
+ border-right: none;
65
+ border-bottom: 1px solid var(--wfc-border);
66
+ }
67
+ }
68
+
69
+ .theme-dark .wfc-sidebar {
70
+ background: rgba(255, 255, 255, 0.03);
71
+ }
72
+
73
+ .wfc-main {
74
+ padding: 2.5rem;
75
+ display: flex;
76
+ flex-direction: column;
77
+ gap: 2rem;
78
+ background: rgba(255, 255, 255, 0.3);
79
+ overflow-y: auto;
80
+ }
81
+
82
+ .theme-dark .wfc-main {
83
+ background: rgba(255, 255, 255, 0.01);
84
+ }
85
+
86
+ .wfc-field {
87
+ display: flex;
88
+ flex-direction: column;
89
+ gap: 0.75rem;
90
+ }
91
+
92
+ .wfc-field-label {
93
+ font-size: 0.8rem;
94
+ font-weight: 700;
95
+ text-transform: uppercase;
96
+ letter-spacing: 0.1em;
97
+ color: #6b7280;
98
+ }
99
+
100
+ .theme-dark .wfc-field-label {
101
+ color: #9ca3af;
102
+ }
103
+
104
+ .wfc-fraction-input {
105
+ display: grid;
106
+ grid-template-columns: 1fr 1fr 1fr;
107
+ gap: 0.75rem;
108
+ align-items: flex-end;
109
+ }
110
+
111
+ .wfc-fraction-column {
112
+ display: flex;
113
+ flex-direction: column;
114
+ gap: 0.4rem;
115
+ }
116
+
117
+ .wfc-fraction-label {
118
+ font-size: 0.7rem;
119
+ font-weight: 600;
120
+ color: #6b7280;
121
+ text-transform: uppercase;
122
+ letter-spacing: 0.05em;
123
+ }
124
+
125
+ .wfc-input-number {
126
+ padding: 0.75rem;
127
+ border: 2px solid var(--wfc-border);
128
+ border-radius: 8px;
129
+ font-size: 1.2rem;
130
+ font-weight: 600;
131
+ text-align: center;
132
+ background: white;
133
+ cursor: text;
134
+ transition: border-color 0.2s;
135
+ }
136
+
137
+ .theme-dark .wfc-input-number {
138
+ background: rgba(255, 255, 255, 0.05);
139
+ color: #f3f4f6;
140
+ }
141
+
142
+ .wfc-input-number:focus {
143
+ outline: none;
144
+ border-color: var(--wfc-primary);
145
+ box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.1);
146
+ }
147
+
148
+ .wfc-fraction-slash {
149
+ font-size: 1.4rem;
150
+ font-weight: 600;
151
+ color: var(--wfc-primary);
152
+ text-align: center;
153
+ line-height: 1;
154
+ }
155
+
156
+ /* Number Stepper Buttons */
157
+ .wfc-stepper-group {
158
+ display: flex;
159
+ gap: 0.3rem;
160
+ margin-bottom: 0.4rem;
161
+ }
162
+
163
+ .wfc-stepper-btn {
164
+ flex: 1;
165
+ padding: 0.4rem;
166
+ border: 1px solid var(--wfc-border);
167
+ border-radius: 4px;
168
+ background: white;
169
+ font-size: 0.75rem;
170
+ font-weight: 600;
171
+ cursor: pointer;
172
+ transition: all 0.15s;
173
+ }
174
+
175
+ .theme-dark .wfc-stepper-btn {
176
+ background: rgba(255, 255, 255, 0.05);
177
+ color: #f3f4f6;
178
+ }
179
+
180
+ .wfc-stepper-btn:hover {
181
+ border-color: var(--wfc-primary);
182
+ background: rgba(37, 99, 235, 0.1);
183
+ }
184
+
185
+ .wfc-stepper-btn:active {
186
+ background: var(--wfc-primary);
187
+ color: white;
188
+ border-color: var(--wfc-primary);
189
+ }
190
+
191
+ /* Quick Preset Buttons */
192
+ .wfc-presets {
193
+ display: grid;
194
+ grid-template-columns: repeat(auto-fit, minmax(60px, 1fr));
195
+ gap: 0.5rem;
196
+ }
197
+
198
+ .wfc-preset-btn {
199
+ padding: 0.5rem;
200
+ border: 2px solid var(--wfc-border);
201
+ border-radius: 8px;
202
+ background: white;
203
+ font-size: 0.8rem;
204
+ font-weight: 600;
205
+ cursor: pointer;
206
+ transition: all 0.2s;
207
+ min-height: 44px;
208
+ display: flex;
209
+ align-items: center;
210
+ justify-content: center;
211
+ text-align: center;
212
+ }
213
+
214
+ .theme-dark .wfc-preset-btn {
215
+ background: rgba(255, 255, 255, 0.05);
216
+ color: #f3f4f6;
217
+ }
218
+
219
+ .wfc-preset-btn:hover {
220
+ border-color: var(--wfc-primary);
221
+ background: rgba(37, 99, 235, 0.1);
222
+ }
223
+
224
+ .wfc-preset-btn.active {
225
+ background: var(--wfc-primary);
226
+ color: white;
227
+ border-color: var(--wfc-primary);
228
+ }
229
+
230
+ /* Mode Toggle */
231
+ .wfc-mode-toggle {
232
+ display: flex;
233
+ gap: 0;
234
+ border: 2px solid var(--wfc-border);
235
+ border-radius: 8px;
236
+ background: white;
237
+ }
238
+
239
+ .theme-dark .wfc-mode-toggle {
240
+ background: rgba(255, 255, 255, 0.05);
241
+ }
242
+
243
+ .wfc-mode-btn {
244
+ flex: 1;
245
+ padding: 0.8rem;
246
+ border: none;
247
+ background: transparent;
248
+ cursor: pointer;
249
+ font-size: 0.9rem;
250
+ font-weight: 600;
251
+ transition: all 0.2s;
252
+ color: var(--wfc-neutral);
253
+ }
254
+
255
+ .theme-dark .wfc-mode-btn {
256
+ color: #d1d5db;
257
+ }
258
+
259
+ .wfc-mode-btn:first-child {
260
+ border-right: 2px solid var(--wfc-border);
261
+ }
262
+
263
+ .wfc-mode-btn.active {
264
+ background: var(--wfc-primary);
265
+ color: white;
266
+ }
267
+
268
+ /* Result Section */
269
+ .wfc-result-box {
270
+ padding: 1.5rem;
271
+ background: rgba(37, 99, 235, 0.05);
272
+ border: 2px solid var(--wfc-primary);
273
+ border-radius: 12px;
274
+ }
275
+
276
+ .theme-dark .wfc-result-box {
277
+ background: rgba(37, 99, 235, 0.1);
278
+ }
279
+
280
+ .wfc-result-title {
281
+ font-size: 0.8rem;
282
+ font-weight: 700;
283
+ text-transform: uppercase;
284
+ letter-spacing: 0.1em;
285
+ color: var(--wfc-primary);
286
+ margin-bottom: 1rem;
287
+ }
288
+
289
+ .wfc-result-row {
290
+ display: flex;
291
+ justify-content: space-between;
292
+ align-items: center;
293
+ margin-bottom: 0.75rem;
294
+ padding-bottom: 0.75rem;
295
+ border-bottom: 1px solid rgba(37, 99, 235, 0.2);
296
+ }
297
+
298
+ .wfc-result-row:last-child {
299
+ border-bottom: none;
300
+ margin-bottom: 0;
301
+ padding-bottom: 0;
302
+ }
303
+
304
+ .wfc-result-label {
305
+ font-size: 0.85rem;
306
+ font-weight: 600;
307
+ color: #6b7280;
308
+ }
309
+
310
+ .theme-dark .wfc-result-label {
311
+ color: #d1d5db;
312
+ }
313
+
314
+ .wfc-result-value {
315
+ font-size: 1.2rem;
316
+ font-weight: 700;
317
+ color: var(--wfc-primary);
318
+ }
319
+
320
+ .wfc-visual-scale {
321
+ margin: 2rem 0;
322
+ padding: 1.5rem;
323
+ background: var(--wfc-bg-light);
324
+ border-radius: 12px;
325
+ border: 1px dashed var(--wfc-border);
326
+ }
327
+
328
+ .theme-dark .wfc-visual-scale {
329
+ background: rgba(255, 255, 255, 0.03);
330
+ border-color: rgba(255, 255, 255, 0.2);
331
+ }
332
+
333
+ .wfc-scale-ruler {
334
+ position: relative;
335
+ height: 40px;
336
+ background: white;
337
+ border: 1px solid var(--wfc-border);
338
+ border-radius: 4px;
339
+ margin-bottom: 1rem;
340
+ }
341
+
342
+ .theme-dark .wfc-scale-ruler {
343
+ background: rgba(255, 255, 255, 0.05);
344
+ }
345
+
346
+ .wfc-scale-tick {
347
+ position: absolute;
348
+ top: 0;
349
+ width: 1px;
350
+ height: 50%;
351
+ background: var(--wfc-neutral);
352
+ }
353
+
354
+ .wfc-scale-indicator {
355
+ position: absolute;
356
+ top: 50%;
357
+ height: 20px;
358
+ background: var(--wfc-primary);
359
+ border-radius: 2px;
360
+ opacity: 0.8;
361
+ }
362
+
363
+ /* Fastener Match Cards */
364
+ .wfc-match-cards {
365
+ display: grid;
366
+ grid-template-columns: 1fr;
367
+ gap: 1rem;
368
+ margin-top: 1rem;
369
+ }
370
+
371
+ .wfc-match-card {
372
+ padding: 1rem;
373
+ border: 2px solid var(--wfc-border);
374
+ border-radius: 12px;
375
+ background: white;
376
+ }
377
+
378
+ .theme-dark .wfc-match-card {
379
+ background: rgba(255, 255, 255, 0.05);
380
+ }
381
+
382
+ .wfc-match-header {
383
+ display: flex;
384
+ justify-content: space-between;
385
+ align-items: center;
386
+ margin-bottom: 0.75rem;
387
+ }
388
+
389
+ .wfc-match-name {
390
+ font-size: 0.9rem;
391
+ font-weight: 700;
392
+ color: var(--wfc-neutral);
393
+ }
394
+
395
+ .theme-dark .wfc-match-name {
396
+ color: #f3f4f6;
397
+ }
398
+
399
+ .wfc-match-badge {
400
+ font-size: 0.75rem;
401
+ font-weight: 600;
402
+ padding: 0.25rem 0.6rem;
403
+ border-radius: 12px;
404
+ background: var(--wfc-primary);
405
+ color: white;
406
+ }
407
+
408
+ .wfc-match-badge.tight {
409
+ background: var(--wfc-success);
410
+ }
411
+
412
+ .wfc-match-badge.loose {
413
+ background: var(--wfc-warning);
414
+ color: #000;
415
+ }
416
+
417
+ .theme-dark .wfc-match-badge.loose {
418
+ color: #1f2937;
419
+ }
420
+
421
+ .wfc-match-details {
422
+ font-size: 0.8rem;
423
+ color: #6b7280;
424
+ line-height: 1.5;
425
+ }
426
+
427
+ .theme-dark .wfc-match-details {
428
+ color: #d1d5db;
429
+ }
430
+
431
+ /* Buttons */
432
+ .wfc-button-group {
433
+ display: grid;
434
+ grid-template-columns: 1fr 1fr;
435
+ gap: 0.75rem;
436
+ margin-top: 1.5rem;
437
+ }
438
+
439
+ .wfc-button {
440
+ padding: 0.9rem 1.2rem;
441
+ border: none;
442
+ border-radius: 8px;
443
+ font-size: 0.9rem;
444
+ font-weight: 600;
445
+ cursor: pointer;
446
+ transition: all 0.2s;
447
+ min-height: 44px;
448
+ }
449
+
450
+ .wfc-button-primary {
451
+ background: var(--wfc-primary);
452
+ color: white;
453
+ }
454
+
455
+ .wfc-button-primary:hover {
456
+ background: var(--wfc-primary-dark);
457
+ }
458
+
459
+ .wfc-button-secondary {
460
+ background: white;
461
+ color: var(--wfc-primary);
462
+ border: 2px solid var(--wfc-primary);
463
+ }
464
+
465
+ .theme-dark .wfc-button-secondary {
466
+ background: rgba(255, 255, 255, 0.05);
467
+ color: #3b82f6;
468
+ }
469
+
470
+ .wfc-button-secondary:hover {
471
+ background: rgba(37, 99, 235, 0.1);
472
+ }
473
+
474
+ /* History */
475
+ .wfc-history {
476
+ margin-top: 2rem;
477
+ padding-top: 2rem;
478
+ border-top: 1px solid var(--wfc-border);
479
+ }
480
+
481
+ .wfc-history-title {
482
+ font-size: 0.8rem;
483
+ font-weight: 700;
484
+ text-transform: uppercase;
485
+ letter-spacing: 0.1em;
486
+ color: #6b7280;
487
+ margin-bottom: 1rem;
488
+ }
489
+
490
+ .wfc-history-list {
491
+ display: flex;
492
+ flex-direction: column;
493
+ gap: 0.5rem;
494
+ max-height: 300px;
495
+ overflow-y: auto;
496
+ }
497
+
498
+ .wfc-history-item {
499
+ padding: 0.75rem;
500
+ background: var(--wfc-bg-light);
501
+ border-radius: 8px;
502
+ border: 1px solid var(--wfc-border);
503
+ display: flex;
504
+ justify-content: space-between;
505
+ align-items: center;
506
+ font-size: 0.85rem;
507
+ }
508
+
509
+ .theme-dark .wfc-history-item {
510
+ background: rgba(255, 255, 255, 0.05);
511
+ }
512
+
513
+ .wfc-history-item-fraction {
514
+ font-weight: 600;
515
+ color: var(--wfc-primary);
516
+ }
517
+
518
+ .wfc-history-remove {
519
+ background: none;
520
+ border: none;
521
+ color: #9ca3af;
522
+ cursor: pointer;
523
+ padding: 0;
524
+ font-size: 0.8rem;
525
+ font-weight: 600;
526
+ }
527
+
528
+ .wfc-history-remove:hover {
529
+ color: var(--wfc-danger);
530
+ }
531
+
532
+ /* Accessibility & Touch */
533
+ @media (hover: none) and (pointer: coarse) {
534
+ .wfc-button,
535
+ .wfc-preset-btn,
536
+ .wfc-stepper-btn,
537
+ .wfc-input-number {
538
+ min-height: 48px;
539
+ font-size: 1rem;
540
+ }
541
+
542
+ .wfc-grid {
543
+ min-height: auto;
544
+ }
545
+
546
+ .wfc-sidebar,
547
+ .wfc-main {
548
+ padding: 1.5rem;
549
+ }
550
+ }
551
+
552
+ /* Utilities */
553
+ .wfc-hidden {
554
+ display: none;
555
+ }
556
+
557
+ .wfc-text-center {
558
+ text-align: center;
559
+ }
560
+
561
+ .wfc-text-mono {
562
+ font-size: 0.9rem;
563
+ }
package/src/tools.ts CHANGED
@@ -13,6 +13,7 @@ import { THERMAL_EXPANSION_CALCULATOR_TOOL } from './tool/thermalExpansionCalcul
13
13
  import { DRILL_CALCULATOR_TOOL } from './tool/drillCalculator/index';
14
14
  import { STAIR_CALCULATOR_TOOL } from './tool/stairCalculator/index';
15
15
  import { DRILL_SHARPENER_TOOL } from './tool/drillSharpener/index';
16
+ import { WORKSHOP_FRACTION_CONVERTER_TOOL } from './tool/workshopFractionConverter/index';
16
17
 
17
- export const ALL_TOOLS: ToolDefinition[] = [CLAY_CALCULATOR_TOOL, EPOXY_CALCULATOR_TOOL, BALUSTER_CALCULATOR_TOOL, MORTAR_CALCULATOR_TOOL, PASSEPARTOUT_CALCULATOR_TOOL, CONCRETE_CALCULATOR_TOOL, CUT_OPTIMIZER_TOOL, VOLTAGE_DROP_CALCULATOR_TOOL, FURNITURE_FIT_TOOL, THERMAL_EXPANSION_CALCULATOR_TOOL, DRILL_CALCULATOR_TOOL, STAIR_CALCULATOR_TOOL, DRILL_SHARPENER_TOOL];
18
+ export const ALL_TOOLS: ToolDefinition[] = [CLAY_CALCULATOR_TOOL, EPOXY_CALCULATOR_TOOL, BALUSTER_CALCULATOR_TOOL, MORTAR_CALCULATOR_TOOL, PASSEPARTOUT_CALCULATOR_TOOL, CONCRETE_CALCULATOR_TOOL, CUT_OPTIMIZER_TOOL, VOLTAGE_DROP_CALCULATOR_TOOL, FURNITURE_FIT_TOOL, THERMAL_EXPANSION_CALCULATOR_TOOL, DRILL_CALCULATOR_TOOL, STAIR_CALCULATOR_TOOL, DRILL_SHARPENER_TOOL, WORKSHOP_FRACTION_CONVERTER_TOOL];
18
19
 
package/src/types.ts CHANGED
@@ -32,7 +32,7 @@ export interface ToolLocaleContent<TUI extends Record<string, string> = Record<s
32
32
  faqTitle?: string;
33
33
  faq: FAQItem[];
34
34
  bibliographyTitle?: string;
35
- bibliography: BibliographyEntry[];
35
+ bibliography?: BibliographyEntry[];
36
36
  howTo: HowToStep[];
37
37
  schemas: WithContext<Thing>[];
38
38
  }