Guidelines.vue 9.8 KB

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