Guidelines.vue 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265
  1. <template>
  2. <div class="min-h-screen bg-white">
  3. <!-- Hero Section -->
  4. <header class="pt-32 pb-16 bg-gradient-to-b from-gray-50 to-white">
  5. <div class="container mx-auto px-4 text-center">
  6. <h1 class="text-4xl md:text-6xl font-display font-bold text-foreground mb-6">
  7. {{ t("nuances.title") }}
  8. </h1>
  9. <p class="text-xl text-foreground/60 max-w-2xl mx-auto">
  10. {{ t("nuances.subtitle") }}
  11. </p>
  12. </div>
  13. </header>
  14. <main class="container mx-auto px-4 pb-24">
  15. <!-- Intro Memo -->
  16. <section class="max-w-4xl mx-auto mb-20">
  17. <div class="bg-primary/5 rounded-3xl p-8 md:p-12 border border-primary/10">
  18. <div class="flex items-start gap-6">
  19. <div class="hidden md:flex w-12 h-12 bg-primary/10 text-primary rounded-full items-center justify-center flex-shrink-0">
  20. <InfoIcon class="w-6 h-6" />
  21. </div>
  22. <div>
  23. <h2 class="text-2xl font-display font-bold text-foreground mb-4">
  24. {{ t("nuances.disclaimer.title") }}
  25. </h2>
  26. <p class="text-lg text-foreground/70 leading-relaxed">
  27. {{ t("nuances.description") }}
  28. {{ t("nuances.disclaimer.text") }}
  29. </p>
  30. </div>
  31. </div>
  32. </div>
  33. </section>
  34. <!-- Nuances Visual Grid -->
  35. <section class="max-w-6xl mx-auto mb-32">
  36. <div class="grid md:grid-cols-2 lg:grid-cols-3 gap-8">
  37. <div
  38. v-for="(nuance, key) in nuances"
  39. :key="key"
  40. class="group bg-white rounded-2xl overflow-hidden border border-gray-100 hover:border-primary/20 hover:shadow-xl transition-all duration-300"
  41. >
  42. <div class="aspect-video bg-gray-50 overflow-hidden relative">
  43. <img
  44. v-if="nuance.image"
  45. :src="nuance.image"
  46. :alt="t(`nuances.items.${key}.title`)"
  47. class="w-full h-full object-cover group-hover:scale-105 transition-transform duration-500"
  48. />
  49. <div v-else class="w-full h-full flex items-center justify-center bg-primary/5 text-primary/40">
  50. <component :is="nuance.icon" class="w-12 h-12" />
  51. </div>
  52. </div>
  53. <div class="p-6">
  54. <h3 class="text-xl font-display font-bold text-foreground mb-2">
  55. {{ t(`nuances.items.${key}.title`) }}
  56. </h3>
  57. <p class="text-foreground/70 mb-4 text-sm leading-relaxed">
  58. {{ t(`nuances.items.${key}.description`) }}
  59. </p>
  60. <div class="pt-4 border-t border-gray-50">
  61. <p class="text-sm text-foreground/50">
  62. {{ t(`nuances.items.${key}.details`) }}
  63. </p>
  64. </div>
  65. </div>
  66. </div>
  67. </div>
  68. <div class="mt-6 text-center">
  69. <p class="text-sm text-foreground/50 italic flex items-center justify-center gap-2">
  70. <InfoIcon class="w-4 h-4" />
  71. {{ t("nuances.aiDisclaimer") }}
  72. </p>
  73. </div>
  74. </section>
  75. <!-- Materials Specs -->
  76. <section class="max-w-5xl mx-auto mb-32">
  77. <h2 class="text-3xl font-display font-bold text-foreground text-center mb-12">
  78. {{ t("guidelines.materialSelection.title") }}
  79. </h2>
  80. <div class="grid md:grid-cols-2 gap-6">
  81. <div
  82. v-for="material in materials"
  83. :key="material.key"
  84. class="p-6 rounded-2xl bg-gray-50 border border-transparent hover:bg-white hover:border-gray-100 hover:shadow-sm transition-all"
  85. >
  86. <div class="flex items-center gap-4 mb-4">
  87. <div class="w-10 h-10 bg-white rounded-lg flex items-center justify-center border border-gray-100 font-bold text-primary">
  88. {{ material.short }}
  89. </div>
  90. <h3 class="text-xl font-display font-bold text-foreground">
  91. {{ t(`guidelines.materialSelection.${material.key}.name`) }}
  92. </h3>
  93. </div>
  94. <div class="space-y-3">
  95. <div class="flex justify-between text-sm">
  96. <span class="text-foreground/50">{{ t("guidelines.materialSelection.table.bestFor") }}</span>
  97. <span class="font-medium text-foreground">{{ t(`guidelines.materialSelection.${material.key}.bestFor`) }}</span>
  98. </div>
  99. <div class="flex justify-between text-sm">
  100. <span class="text-foreground/50">{{ t("guidelines.materialSelection.table.considerations") }}</span>
  101. <span class="font-medium text-foreground">{{ t(`guidelines.materialSelection.${material.key}.considerations`) }}</span>
  102. </div>
  103. </div>
  104. </div>
  105. </div>
  106. </section>
  107. <!-- Requirements & Process -->
  108. <div class="grid lg:grid-cols-2 gap-12 max-w-6xl mx-auto">
  109. <!-- Process -->
  110. <section>
  111. <h2 class="text-2xl font-display font-bold text-foreground mb-8">
  112. {{ t("guidelines.orderingProcess.title") }}
  113. </h2>
  114. <div class="space-y-8">
  115. <div
  116. v-for="n in 4"
  117. :key="n"
  118. class="flex gap-6 items-start"
  119. >
  120. <div class="w-10 h-10 bg-primary/10 text-primary rounded-xl flex items-center justify-center font-bold flex-shrink-0">
  121. {{ n }}
  122. </div>
  123. <div>
  124. <h3 class="font-display font-bold text-foreground mb-1">
  125. {{ t(`guidelines.orderingProcess.step${n}.title`) }}
  126. </h3>
  127. <p class="text-foreground/60 text-sm">
  128. {{ t(`guidelines.orderingProcess.step${n}.description`) }}
  129. </p>
  130. </div>
  131. </div>
  132. </div>
  133. </section>
  134. <!-- Technical Requirements -->
  135. <section>
  136. <h2 class="text-2xl font-display font-bold text-foreground mb-8">
  137. {{ t("guidelines.filePreparation.requirements.title") }}
  138. </h2>
  139. <div class="bg-gray-50 rounded-3xl p-8">
  140. <ul class="space-y-4">
  141. <li
  142. v-for="req in ['watertight', 'normals', 'scale', 'wallThickness']"
  143. :key="req"
  144. class="flex items-center gap-4 text-foreground/70"
  145. >
  146. <CheckCircleIcon class="w-5 h-5 text-primary" />
  147. <span>{{ t(`guidelines.filePreparation.requirements.${req}`) }}</span>
  148. </li>
  149. </ul>
  150. <div class="mt-8 pt-8 border-t border-gray-200">
  151. <p class="text-sm font-bold text-foreground mb-4 uppercase tracking-wider">
  152. {{ t("guidelines.filePreparation.formats.title") }}
  153. </p>
  154. <div class="flex flex-wrap gap-2">
  155. <span
  156. v-for="fmt in ['stl', 'obj', 'step', '3mf']"
  157. :key="fmt"
  158. class="px-3 py-1 bg-white border border-gray-200 text-foreground/60 rounded-full text-sm font-medium"
  159. >
  160. .{{ fmt }}
  161. </span>
  162. </div>
  163. </div>
  164. </div>
  165. </section>
  166. </div>
  167. <!-- Footer CTA -->
  168. <section class="mt-32 bg-foreground text-white rounded-3xl p-12 text-center relative overflow-hidden">
  169. <div class="relative z-10">
  170. <h2 class="text-3xl font-display font-bold mb-6">
  171. {{ t("guidelines.help.title") }}
  172. </h2>
  173. <p class="text-white/60 mb-8 max-w-xl mx-auto">
  174. {{ t("guidelines.help.description") }}
  175. </p>
  176. <div class="flex flex-col sm:flex-row gap-4 justify-center">
  177. <router-link
  178. to="/contact"
  179. class="px-8 py-4 bg-white text-foreground font-bold rounded-xl hover:bg-white/90 transition-all flex items-center justify-center gap-2"
  180. >
  181. <MessageSquareIcon class="w-5 h-5" />
  182. {{ t("guidelines.help.contact") }}
  183. </router-link>
  184. </div>
  185. </div>
  186. <!-- Decorative elements -->
  187. <div class="absolute -top-12 -right-12 w-64 h-64 bg-primary/20 rounded-full blur-3xl"></div>
  188. <div class="absolute -bottom-12 -left-12 w-64 h-64 bg-primary/10 rounded-full blur-3xl"></div>
  189. </section>
  190. </main>
  191. </div>
  192. </template>
  193. <script setup lang="ts">
  194. import { useI18n } from "vue-i18n";
  195. import {
  196. InfoIcon,
  197. CheckCircleIcon,
  198. MessageSquareIcon,
  199. GridIcon,
  200. LayersIcon,
  201. ScalingIcon,
  202. PaletteIcon,
  203. SplineIcon,
  204. RulerIcon,
  205. TriangleIcon,
  206. ZapIcon
  207. } from "lucide-vue-next";
  208. const { t } = useI18n();
  209. const nuances = {
  210. layerStructure: {
  211. image: "/fdm_layer_lines_photo_1776031229473.png",
  212. icon: LayersIcon
  213. },
  214. supportMarks: {
  215. image: "/fdm_supports_photo_1776031246690.png",
  216. icon: ScalingIcon
  217. },
  218. zSeam: {
  219. image: "/fdm_zseam_photo_1776031258273.png",
  220. icon: SplineIcon
  221. },
  222. surfaceImperfections: {
  223. image: "/fdm_surface_photo_1776031404133.png",
  224. icon: GridIcon
  225. },
  226. overhangs: {
  227. image: "/fdm_overhangs_photo_v2_1776032258991.png",
  228. icon: TriangleIcon
  229. },
  230. dimensionalTolerances: {
  231. image: "/fdm_tolerances_photo_1776031451173.png",
  232. icon: RulerIcon
  233. },
  234. colorVariations: {
  235. image: "/fdm_color_photo_1776031463894.png",
  236. icon: PaletteIcon
  237. },
  238. stringing: {
  239. image: "/fdm_stringing_photo_1776031432344.png",
  240. icon: ZapIcon
  241. }
  242. };
  243. const materials = [
  244. { key: "pla", short: "PLA" },
  245. { key: "abs", short: "ABS" },
  246. { key: "petg", short: "PETG" },
  247. { key: "resin", short: "RESIN" }
  248. ];
  249. </script>
  250. <style scoped>
  251. .font-display {
  252. font-family: 'Outfit', sans-serif;
  253. }
  254. </style>