app/template/user_data/ngchold.twig line 1

Open in your IDE?
  1. {% extends 'default_frame.twig' %}
  2. {% block main %}
  3. <link rel="stylesheet" href="/css/ngc_sm.css" media="screen and (max-width:640px)" />
  4. <link rel="stylesheet" href="/css/ngc_pc.css" media="screen and (min-width:641px)" />
  5. <div class="kasowarap">
  6.       <div class="kaso_h1title">
  7.       <p>NGC Appraisal</p>
  8.       <h1>NGC鑑定</h1>
  9.     </div>
  10.     
  11.       <div class="nav_menu"><div class="nav_menu_wrap">
  12.       <ul>
  13.         <li>
  14.           <a href="/user_data/ngc"><p>鑑定代行と流れ</p></a>
  15.         </li>
  16.         <li class="on">
  17.           <a href="/user_data/ngchold"><p>NGC<br class="sm">スラブケース</p></a>
  18.         </li>
  19.         <li>
  20.           <a href="/user_data/ngcgrading"><p>グレーディング</p></a>
  21.         </li>
  22.         <li>
  23.           <a href="/user_data/ngc70"><p>70グレード表</p></a>
  24.         </li>
  25.       </ul>
  26.     </div></div> <!-- nav_menu -->
  27.     
  28. <div class="main_banner">
  29.     <p>NGCスラブケース<br><span>NGC Holders</span></p>
  30.     <style>
  31.       .main_banner {
  32.         background: center center / auto 100% url(/img/ngc_case.jpg) no-repeat;
  33.       }
  34.     </style>
  35.   </div> <!-- main_banner -->
  36.   <div class="infor">
  37.     <div class="infor_wrap">
  38.       <ul class="th_1">
  39.         <li><img src="/img/ngc_case_info.webp" alt=""></li>
  40.         <li>
  41.           <h4>コイン鑑定と格付けの分野で世界最高峰の評価を得る認証機関</h4>
  42.           <p>
  43.             NGCは業界の標準を築く存在として、厳密な基準と公正な評価を提供し、これまでに累計5000万点以上のコインを鑑定してきました。歴史的価値から市場での取引適正まで、多角的な視点での鑑定は、収集家や投資家から絶大な信頼を得ています。<br>
  44.             NGCの鑑定済みコインは、世界中のオークション市場で公式な価値基準とされ、その透明性と専門性は揺るぎないものです。コインの真価を見極め、未来の資産価値を確かなものにするために、グローバルスタンダードであるNGCの鑑定サービスをご利用ください。
  45.           </p>
  46.         </li>
  47.       </ul>
  48.       <ul class="th_2">
  49.         <li><img src="/img/ngc_case_holder.webp" alt=""></li>
  50.         <li>
  51.           <h4>業界最先端の保護ケース「NGCスラブケース」</h4>
  52.           <p>
  53.             NGCは、世界トップクラスのコイン鑑定機関として、コイン、トークン、メダルの長期保存と安全な展示を実現しています。研究開発には100万ドル以上を投じ、世界的な評価を受けるその技術は、スミソニアン博物館をはじめとする著名な美術館・博物館でも採用されています。
  54.           </p>
  55.           <p>
  56.             NGCスラブケースは、高品質な不活性素材を使用し、保護性能と視認性に優れた設計が特徴です。複数のセキュリティ機能が組み込まれ、コレクターやディーラーにとって不可欠な存在です。
  57.           </p>
  58.           <p>
  59.             NGCスラブケースは、美しさと安全性の両立を目指すコレクターにとって、最適なソリューションを提供します。市場での価値保存と展示の新しい基準として、信頼と評価を得ています。
  60.           </p>
  61.         </li>
  62.       </ul>
  63.       <ul class="chart">
  64.         <li>
  65.           <h4>世界最大規模の鑑定実績</h4>
  66.           <p>
  67.             NGC has graded more than<br>
  68.             <b>60,000,000 coins</b><br>
  69.             from virtually every past and present country
  70.           </p>
  71.           <p>
  72.             世界中のコイン鑑定業界において圧倒的な存在感を誇り、これまでに6,000万点以上のコインを鑑定してきました。過去から現在に至るまで、ほぼすべての国のコインを対象とし、その鑑定範囲は業界最大級です。この膨大な実績は、NGCの専門性と信頼性の高さを物語っています。
  73.           </p>
  74.         </li>
  75.         <li>
  76.           <div id="results__view"></div>
  77.           <!-- Include D3.js -->
  78.           <script src="https://d3js.org/d3.v7.min.js"></script>
  79.           
  80.           <script>
  81.             "use strict";
  82.             console.log(document.getElementById("results__view"));
  83.             let width, height, radius, transformX, transformY;
  84.             if (window.innerWidth > 640) {
  85.                 width = 700;
  86.                 height = 300;
  87.                 transformX = width / 2;
  88.                 transformY = height / 2;
  89.             } else {
  90.                 width = window.innerWidth * 0.95;
  91.                 height = window.innerWidth * 1.2;
  92.                 transformX = 0;
  93.                 transformY = 0;
  94.             }
  95.             radius = Math.min(width, height) / 2;
  96.             let svg = d3
  97.                 .select("#results__view")
  98.                 .append("svg")
  99.                 .attr("width", width)
  100.                 .attr("height", height)
  101.                 .append("g")
  102.                 .attr("transform", `translate(${transformX}, ${transformY})`);
  103.             /* GROUP */
  104.             svg.append("g").attr("id", "slices");
  105.             svg.append("g").attr("id", "responses");
  106.             svg.append("g").attr("id", "lines");
  107.             svg.append("g").attr("id", "legend");
  108.             let arc = d3
  109.                 .arc()
  110.                 .innerRadius(radius * 0.38)
  111.                 .outerRadius(radius * 0.72);
  112.             let outerArc = d3
  113.                 .arc()
  114.                 .innerRadius(radius * 0.8)
  115.                 .outerRadius(radius * 0.8);
  116.             /* DATA */
  117.             let percent = [
  118.                 { rep: "南アメリカ", percent: 3.53 },
  119.                 { rep: "アジア", percent: 17.69 },
  120.                 { rep: "オーストラリア", percent: 2.63 },
  121.                 { rep: "アフリカ", percent: 3.91 },
  122.                 { rep: "ヨーロッパ", percent: 27.01 },
  123.                 { rep: "北アメリカ", percent: 45.23 }
  124.             ];
  125.             let pie = d3.pie().value(d => d.percent).sort(null)(percent);
  126.             let colors = ["#e14956", "#fe912a", "#ffcd64", "#63d8be", "#34b2e4", "#07517e"];
  127.             let color = d3
  128.                 .scaleOrdinal()
  129.                 .domain(percent.map(d => d.rep))
  130.                 .range(colors);
  131.             /* VIEW */
  132.             // Slices
  133.             let slices = svg
  134.                 .select("#slices")
  135.                 .selectAll(".slice")
  136.                 .data(pie)
  137.                 .enter()
  138.                 .append("path")
  139.                 .attr("fill", d => color(d.data.rep))
  140.                 .attr("stroke", "#ffffff")
  141.                 .attr("stroke-width", "2px")
  142.                 .attr("d", arc({ startAngle: 0, endAngle: 0 }));
  143.             function animateSlices() {
  144.                 return new Promise(resolve => {
  145.                     slices
  146.                         .transition()
  147.                         .duration(1000)
  148.                         .attrTween("d", function (d) {
  149.                             this._current = this._current || { startAngle: 0, endAngle: 0 };
  150.                             let interpolate = d3.interpolate(this._current, d);
  151.                             this._current = interpolate(1);
  152.                             return t => arc(interpolate(t));
  153.                         })
  154.                         .on("end", resolve);
  155.                 });
  156.             }
  157.             // Lines
  158.             let lines = svg
  159.                 .select("#lines")
  160.                 .selectAll("polyline")
  161.                 .data(pie)
  162.                 .enter()
  163.                 .append("polyline")
  164.                 .style("fill", "none")
  165.                 .style("stroke", "#a1a1a1")
  166.                 .style("stroke-width", "1px")
  167.                 .style("opacity", 0);
  168.             function animateLines() {
  169.                 return new Promise(resolve => {
  170.                     lines
  171.                         .transition()
  172.                         .duration(800)
  173.                         .style("opacity", 1)
  174.                         .attr("points", d => {
  175.                             let pos = outerArc.centroid(d);
  176.                             pos[0] = radius * 0.95 * (midAngle(d) < Math.PI ? 1 : -1);
  177.                             return [arc.centroid(d), outerArc.centroid(d), pos];
  178.                         })
  179.                         .on("end", resolve);
  180.                 });
  181.             }
  182.             // Responses
  183.               let resp = svg
  184.                 .select("#responses")
  185.                 .selectAll("text")
  186.                 .data(pie)
  187.                 .enter()
  188.                 .append("text")
  189.                 .attr("fill", "#1c1c1c")
  190.                 .attr("dy", ".35em")
  191.                 .style("font-size", ".9em")
  192.                 .style("opacity", 0)
  193.                 .attr("transform", `translate(0, 0)`);
  194.                 
  195.                 resp
  196.                   .append("tspan")
  197.                   .style("font-weight", "700")
  198.                   .text(d => d.data.rep);
  199.                 resp
  200.                   .append("tspan")
  201.                   .style("font-weight", "400")
  202.                   .text(d => ` - ${d.data.percent.toFixed(2)}%`)
  203.                   .attr("dx", "5");
  204.                 function animateReps() {
  205.                   return new Promise(resolve => {
  206.                     resp
  207.                       .transition()
  208.                       .duration(800)
  209.                       .style("opacity", 1)
  210.                       .attrTween("transform", function (d) {
  211.                         let currentPos = this._current || { startAngle: 0, endAngle: 0 };
  212.                         let interpolate = d3.interpolate(currentPos, d);
  213.                         this._current = interpolate(1);
  214.                         return function (t) {
  215.                           let d2 = interpolate(t);
  216.                           let pos = outerArc.centroid(d2);
  217.                           pos[0] = radius * (midAngle(d2) < Math.PI ? 1 : -1);
  218.                           return `translate(${pos})`;
  219.                         };
  220.                       })
  221.                       .styleTween("text-anchor", function (d) {
  222.                         let currentPos = this._current || { startAngle: 0, endAngle: 0 };
  223.                         let interpolate = d3.interpolate(currentPos, d);
  224.                         this._current = interpolate(1);
  225.                         return function (t) {
  226.                           let d2 = interpolate(t);
  227.                           return midAngle(d2) < Math.PI ? "start" : "end";
  228.                         };
  229.                       })
  230.                       .on("end", resolve);
  231.                   });
  232.                 }
  233.             // Legend
  234.             let legendItems = svg
  235.                 .select("#legend")
  236.                 .selectAll(".legend-item")
  237.                 .data(percent)
  238.                 .enter()
  239.                 .append("g")
  240.                 .attr("class", "legend-item")
  241.                 .attr("transform", (d, i) => `translate(0, ${i * 24})`);
  242.             legendItems
  243.                 .append("rect")
  244.                 .attr("width", 18)
  245.                 .attr("height", 18)
  246.                 .style("fill", d => color(d.rep));
  247.             legendItems
  248.                 .append("text")
  249.                 .attr("x", 24)
  250.                 .attr("y", 13)
  251.                 .style("font-size", "12px")
  252.                 .text(d => `${d.rep} - ${d.percent.toFixed(2)}%`);
  253.             function animateLegend() {
  254.                 return new Promise(resolve => {
  255.                     svg
  256.                       .select("#legend")
  257.                       .transition()
  258.                       .duration(500)
  259.                       .style("opacity", 1)
  260.                       .on("end", resolve);
  261.                 });
  262.             }
  263.             // Intersection Observer
  264.             const observer = new IntersectionObserver((entries, observer) => {
  265.                 entries.forEach(entry => {
  266.                     if (entry.isIntersecting) {
  267.                         observer.unobserve(entry.target);
  268.                         animateSlices()
  269.                             .then(animateLines)
  270.                             .then(animateReps)
  271.                             .then(animateLegend);
  272.                     }
  273.                 });
  274.             }, { threshold: 0.5 });
  275.             observer.observe(document.querySelector("#results__view"));
  276.             function midAngle(d) {
  277.                 return d.startAngle + (d.endAngle - d.startAngle) / 2;
  278.             }
  279.           </script>
  280.         </li>
  281.       </ul>
  282.     </div>
  283.   </div>
  284.     
  285. </div><!--//kasowarap-->   
  286. {% endblock %}